15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
15.10.2024

Как вывести список баз данных 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.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 или другой панелью управления менеджер баз данных панели является графической оболочкой над теми же 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 обычно сохраняется для совместимости.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать