Как вывести список баз данных MySQL через командную строку на Linux
Вывод списка всех баз данных MySQL из командной строки выполняется с помощью одного SQL-оператора — SHOW DATABASES; — после аутентификации на сервере MySQL с использованием клиента mysql. Это работает на любом дистрибутиве Linux с MySQL 5.7, MySQL 8.x или совместимым сервером MariaDB и требует наличия привилегии SHOW DATABASES либо доступа суперпользователя.
Данное руководство выходит за рамки базовой команды. В нём рассматриваются параметры аутентификации, видимость в зависимости от привилегий, шаблоны неинтерактивного скриптинга, фильтрация схемы производительности и распространённые ошибки, с которыми сталкиваются даже опытные администраторы.
Предварительные требования
Перед началом работы убедитесь в следующем:
- 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 в отдельности, и именно такой запрос администратор баз данных выполняет перед планированием миграции или стратегии резервного копирования.
Шаг 6: Выход из оболочки MySQL
EXIT;Или используйте сочетание клавиш Ctrl+D.
Неинтерактивное использование: вывод списка баз данных из оболочки
В автоматизированных конвейерах — скриптах резервного копирования, агентах мониторинга, хуках развёртывания — необходимо получать список баз данных без входа в интерактивный сеанс.
Однострочная команда с флагом -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;Используйте это разрешение осторожно. В многопользовательских средах — таких как Общий веб-хостинг или развёртывание на Выделенных серверах для нескольких клиентов — предоставление пользователям приложений доступа к полному списку баз данных является угрозой безопасности.
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 или другой панелью управления менеджер баз данных панели является графической оболочкой над теми же 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, — да. Плагин MySQL auth_socket (или unix_socket в MariaDB) выполняет аутентификацию на основе пользователя ОС Linux. Выполните sudo mysql, и вам будет предоставлен доступ от имени пользователя MySQL root без запроса пароля.
В: Работает ли SHOW DATABASES в MariaDB так же, как в MySQL?
О: Синтаксис идентичен, и правила области действия привилегий одинаковы. Основное практическое отличие состоит в том, что MariaDB может не включать схему sys по умолчанию, а в новых версиях MariaDB предпочтительным бинарным файлом клиента является mariadb, а не mysql, хотя псевдоним mysql обычно сохраняется для совместимости.
