Как да изброим 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.x | MariaDB 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.sockERROR 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 обикновено се запазва за съвместимост.
