15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
15.10.2024

Как да изброим MySQL бази данни чрез командния ред на Linux

Изброяването на всички MySQL бази данни от командния ред се извършва с един SQL израз — SHOW DATABASES; — изпълнен след удостоверяване на самоличността към MySQL сървъра с помощта на клиента mysql. Това работи на всяка Linux дистрибуция, работеща с MySQL 5.7, MySQL 8.x или съвместим MariaDB сървър, и изисква или привилегията SHOW DATABASES, или достъп като суперпотребител.

Това ръководство надхвърля основната команда. То обхваща опции за удостоверяване, видимост според обхвата на привилегиите, шаблони за неинтерактивно скриптиране, филтриране на performance schema и често срещани грешки, които затрудняват дори опитни администратори.

Предварителни изисквания

Преди да продължите, потвърдете следното:

  • MySQL Server или MariaDB е инсталиран и услугата е активна.
  • Имате потребителски акаунт с поне привилегията SHOW DATABASES, или се удостоверявате като root.
  • Бинарният файл на клиента mysql е наличен в PATH на вашата обвивка (проверете с which mysql).

Ако управлявате отдалечен сървър — например среда за VPS Хостинг — уверете се също, че MySQL портът (по подразбиране 3306) е достъпен или че се свързвате чрез SSH.

Стъпка 1: Проверете дали MySQL услугата работи

Преди да се опитате да се свържете, потвърдете, че демонът е активен:

sudo systemctl status mysql

При инсталации на MariaDB името на услугата е различно:

sudo systemctl status mariadb

Ако услугата е спряна, стартирайте я:

sudo systemctl start mysql

Неуспешното стартиране почти винаги се обяснява в journalctl -xe или в /var/log/mysql/error.log. Проверете тези файлове първо, преди да приемете, че има проблем с конфигурацията.

Стъпка 2: Удостоверете самоличността си към MySQL сървъра

Стандартно интерактивно влизане

mysql -u root -p
  • -u root — указва потребителското име за MySQL. Заменете root с всеки валиден акаунт.
  • -p — подканва за парола интерактивно. Никога не предавайте паролата директно в командния ред в производствена среда (напр. -pMyPassword), тъй като тя е видима в списъците с процеси и историята на обвивката.

След въвеждане на правилна парола се появява подканата на MySQL:

mysql>

Свързване към отдалечен хост или нестандартен порт

mysql -u root -p -h 192.168.1.100 -P 3307
  • -h — указва IP адреса или хостнейма на отдалечения хост.
  • -P — указва нестандартен номер на порт.

Използване на файл с опции за автоматизация

За скриптове и cron задачи, съхранявайте идентификационните данни в защитен файл с опции, вместо да ги вграждате в командата:

# ~/.my.cnf
[client]
user=root
password=YourSecurePassword

Ограничете правата веднага след създаването на файла:

chmod 600 ~/.my.cnf

С наличието на този файл, mysql се удостоверява без никакви флагове:

mysql

Стъпка 3: Изброите всички бази данни

Веднъж в MySQL обвивката, изпълнете:

SHOW DATABASES;

Примерен изход при прясно инсталиран MySQL 8 екземпляр:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

Тези четири системни схеми присъстват при всяка стандартна инсталация на MySQL:

СхемаПредназначение
`information_schema`Виртуална схема само за четене, която излага метаданни за всички останали схеми, таблици, колони и привилегии
`mysql`Основни таблици за привилегии, данни за часовите зони и конфигурация на сървъра
`performance_schema`Данни за инструментиране на ниско ниво за профилиране на заявки и диагностика
`sys`Четими от хора изгледи, изградени върху `performance_schema`

Създадените от потребителя бази данни се появяват заедно с тези системни схеми.

Стъпка 4: Филтрирайте списъка с бази данни

Филтриране по шаблон на името

SHOW DATABASES приема клауза LIKE, което е полезно, когато сървърът хоства десетки бази данни:

SHOW DATABASES LIKE 'wp_%';

Това връща само бази данни, чиито имена започват с wp_ — обща конвенция за именуване при инсталации на WordPress.

Заявка към information_schema за разширено филтриране

За по-прецизно филтриране, правете заявка директно към таблицата information_schema.SCHEMATA:

SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.SCHEMATA
WHERE schema_name NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY schema_name;

Този подход ви позволява да филтрирате по набор от символи, съпоставяне или всяка друга колона с метаданни — нещо, което SHOW DATABASES не може да направи.

Стъпка 5: Прегледайте конкретна база данни

За да прегледате съдържанието на конкретна база данни, превключете контекста с USE и след това изброите нейните таблици:

USE database_name;
SHOW TABLES;

За да видите размерите на таблиците, броя на редовете и механизмите за съхранение в една заявка:

SELECT
  table_name,
  engine,
  table_rows,
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = 'database_name'
ORDER BY (data_length + index_length) DESC;

Това е значително по-полезно от самостоятелното SHOW TABLES и е видът заявка, която DBA изпълнява преди планиране на миграция или стратегия за архивиране.

Стъпка 6: Излезте от MySQL обвивката

EXIT;

Или използвайте клавишната комбинация Ctrl+D.

Неинтерактивна употреба: Изброяване на бази данни от обвивката

В автоматизирани конвейери — скриптове за архивиране, агенти за наблюдение, deployment куки — трябва да извлечете списъка с бази данни, без да влизате в интерактивна сесия.

Едноредова команда с флага -e

mysql -u root -p -e "SHOW DATABASES;"

Потискане на заглавния ред за скриптиране

mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null

Флагът --skip-column-names премахва заглавието Database, произвеждайки чист изход, подходящ за итерация в цикъл на обвивката:

for db in $(mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null); do
  echo "Processing: $db"
done

Използване на mysqlshow като алтернатива

Помощната програма mysqlshow предоставя бърз преглед, без да влизате в MySQL обвивката:

mysqlshow -u root -p

Тя изброява всички бази данни, които удостовереният потребител може да вижда, и приема аргумент с името на база данни за детайлен преглед на ниво таблица:

mysqlshow -u root -p database_name

Обхват на привилегиите: Защо някои бази данни са скрити

Това е едно от най-неразбраните поведения в MySQL. Когато потребителят няма глобалната привилегия SHOW DATABASES, SHOW DATABASES връща само бази данни, за които този потребител притежава поне една привилегия. Това е по замисъл — това е граница на сигурността, а не грешка.

Практическо значение: Ограничен потребител на приложение може да изпълни SHOW DATABASES; и да види само една или две бази данни, дори ако сървърът хоства петдесет. Това е правилно поведение. Ако потребителят трябва да вижда пълния списък, предоставете привилегията изрично:

GRANT SHOW DATABASES ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

Използвайте това предоставяне пестеливо. В среди с множество наематели — като настройка за Споделен Уеб Хостинг или внедряване на Dedicated Сървъри с множество клиенти — излагането на пълния списък с бази данни на потребителите на приложения е риск за сигурността.

MySQL срещу MariaDB: Поведенчески разлики

И MySQL, и MariaDB поддържат SHOW DATABASES; и information_schema.SCHEMATA, но има фини разлики, които си струва да знаете:

ФункцияMySQL 8.xMariaDB 10.x
Синтаксис `SHOW DATABASES`ПоддържанПоддържан
`information_schema.SCHEMATA`НаличенНаличен
По подразбиране `performance_schema`АктивиранАктивиран (10.5+)
Схема `sys`Включена по подразбиранеПо избор, не винаги присъства
`SHOW DATABASES LIKE`ПоддържанПоддържан
Модел на привилегии, базиран на ролиВграден (8.0+)Вграден (10.0.5+)
Бинарен файл на клиента `mysql``mysql``mysql` или `mariadb`

При по-нови инсталации на MariaDB, каноничният бинарен файл може да е mariadb вместо mysql, въпреки че символна връзка обикновено запазва обратната съвместимост.

Чести грешки и как да ги поправите

ERROR 1045 (28000): Access denied for user

Това означава, че удостоверяването е неуспешно. Проверете отново потребителското име, паролата и хоста. За root в MySQL 8, приставката за удостоверяване по подразбиране е caching_sha2_password. Ако вашият клиент не я поддържа, свържете се чрез сокет:

sudo mysql -u root

Това заобикаля удостоверяването с парола при работа като Linux потребителя root, разчитайки вместо това на приставката auth_socket или unix_socket.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket

MySQL демонът не работи или пътят до файла на сокета е грешен. Проверете:

sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sock

ERROR 1044 (42000): Access denied for user to database

Потребителят е удостоверен, но няма привилегии върху целевата база данни. Прегледайте привилегиите с:

SHOW GRANTS FOR 'username'@'host';

Практическа матрица за вземане на решения

Използвайте тази справка, за да изберете правилния подход за вашата ситуация:

СценарийПрепоръчана команда
Интерактивно изследване`SHOW DATABASES;` в обвивката `mysql`
Филтриране по префикс на името`SHOW DATABASES LIKE 'prefix_%';`
Изброяване с богати метаданниЗаявка към `information_schema.SCHEMATA`
Скриптиране на обвивката / автоматизация`mysql -e "SHOW DATABASES;" –skip-column-names`
Бърз преглед без обвивка`mysqlshow -u root -p`
Отдалечен сървър, нестандартен порт`mysql -u root -p -h host -P port`
Автоматизация без паролаФайл с опции `~/.my.cnf` с `chmod 600`
Отстраняване на проблеми с достъпа`SHOW GRANTS FOR 'user'@'host';`

Ключови технически изводи

  • SHOW DATABASES; е ограничен от привилегии. Потребител без глобална привилегия SHOW DATABASES вижда само бази данни, до които има изричен достъп — това е функция за сигурност, а не неправилна конфигурация.
  • Никога не предавайте пароли като аргументи на командния ред в производствена среда. Използвайте -p за интерактивни сесии и ~/.my.cnf за автоматизация.
  • information_schema.SCHEMATA е строго по-мощен от SHOW DATABASES за скриптирани или филтрирани заявки.
  • Помощната програма mysqlshow е недостатъчно използвана и осигурява бърза, неинтерактивна инспекция на бази данни и таблици.
  • При MySQL 8, удостоверяването чрез сокет (sudo mysql) е често най-бързият път до root достъп на локален сървър.
  • При управление на множество бази данни на VPS с cPanel или друг контролен панел, мениджърът на бази данни на панела е GUI обвивка около същите тези SQL команди — разбирането на основните заявки ви дава пълен контрол, когато GUI не е достатъчен.
  • За среди, където достъпът до базата данни е свързан със SSL Сертификати и криптирани връзки, добавете --ssl-mode=REQUIRED към извикванията на вашия клиент mysql, за да наложите TLS при пренос.

ЧЗВ

В: Защо SHOW DATABASES не показва всички бази данни на моя сървър?

О: Потребителският акаунт, с който сте удостоверени, няма глобалната привилегия SHOW DATABASES. MySQL връща само бази данни, за които този потребител притежава поне една привилегия. Удостоверете се като root или предоставете привилегията SHOW DATABASES, за да видите пълния списък.

В: Каква е разликата между SHOW DATABASES и заявка към information_schema.SCHEMATA?

О: И двете връщат списъка с достъпни схеми, но information_schema.SCHEMATA излага допълнителни колони с метаданни — набор от символи по подразбиране, съпоставяне по подразбиране — и поддържа пълно SQL филтриране с WHERE, ORDER BY и JOIN. Използвайте SHOW DATABASES за бързи интерактивни проверки и information_schema.SCHEMATA за скриптирани или аналитични заявки.

В: Как да изброя бази данни на отдалечен MySQL сървър, без да отварям интерактивна сесия?

О: Използвайте флага -e в комбинация с опции за хост и порт:

mysql -u root -p -h remote-host -P 3306 -e "SHOW DATABASES;" --skip-column-names

В: Мога ли да изброя MySQL бази данни, без да знам root паролата?

О: На локален сървър, където имате Linux root достъп, да. Приставката auth_socket на MySQL (или unix_socket при MariaDB) удостоверява въз основа на Linux OS потребителя. Изпълнете sudo mysql и ще получите достъп като MySQL потребителя root без подкана за парола.

В: Работи ли SHOW DATABASES по същия начин при MariaDB, както при MySQL?

О: Синтаксисът е идентичен и правилата за обхват на привилегиите са същите. Основната практическа разлика е, че MariaDB може да не включва схемата sys по подразбиране, а при по-нови версии на MariaDB предпочитаният бинарен файл на клиента е mariadb вместо mysql, въпреки че псевдонимът mysql обикновено се запазва за съвместимост.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало