Для многих системных администраторов и разработчиков работа с MySQL (или MariaDB) привычна через интерактивную оболочку консоли — тот самый режим, когда вы вводите mysql -u root -p, получаете приглашение mysql> и начинаете писать запросы.
Однако, когда дело доходит до автоматизации, написания скриптов резервного копирования, мониторинга или ETL-процессов, интерактивный режим становится бесполезным. Вам нужно уметь отправлять команды базе данных прямо из терминала Linux (Shell) и получать «сырой» ответ, который можно обработать средствами Bash, Python или Perl.
В этой статье разберем все способы выполнения SQL-команд напрямую из командной строки, научимся управлять выводом данных и обсудим вопросы безопасности.
Основа основ: Флаг -e (Execute)
Самый быстрый и распространенный способ выполнить запрос без входа в консоль MySQL — использование флага -e (от англ. execute).
Синтаксис
mysql -u [пользователь] -p [пароль] -e "ВАШ SQL ЗАПРОС" [имя_базы_данных]Пример 1: Просмотр баз данных
Вместо того чтобы заходить в консоль, вы можете просто вывести список баз одной командой:
mysql -u root -p -e "SHOW DATABASES;"После ввода этой команды система запросит пароль (если вы не настроили вход без пароля, о чем ниже).

Пример 2: Запрос к конкретной таблице
Чтобы не писать USE db_name; внутри SQL-строки, укажите имя базы данных аргументом в конце команды:
mysql -u root -p -e "SELECT * FROM users LIMIT 5;" db_appЗдесь db_app — это имя базы данных.
Использование перенаправления ввода (Pipes и Input Redirection)
В Linux философия «Everything is a file» позволяет нам передавать текст в клиент MySQL через стандартный ввод (STDIN). Это особенно полезно при генерации сложных запросов на лету.
Метод А: Передача через Pipe (|)
Вы можете использовать команду echo или cat для передачи запроса:
echo "SHOW TABLES;" | mysql -u root -p db_appМетод Б: Загрузка из файла
Если у вас есть подготовленный файл .sql (например, дамп или сложная миграция), его не нужно копировать. Просто «скормите» его клиенту:
mysql -u root -p db_app < update_schema.sql
Многострочные запросы в скриптах
Если вы пишете Bash-скрипт и вам нужно выполнить сложный запрос на 10-20 строк, писать его в одну строку с флагом -e неудобно и нечитаемо. Используйте конструкцию Here Document (<<EOF).
Пример скрипта:
#!/bin/bash
DB_USER="root"
DB_PASS="ваш_пароль"
DB_NAME="db_app"
mysql -u $DB_USER -p$DB_PASS $DB_NAME <<EOF
UPDATE settings
SET value = '1'
WHERE name = 'maintenance_mode';
INSERT INTO logs (message, created_at)
VALUES ('Maintenance mode enabled via CLI', NOW());
EOF
echo "Технические работы включены."Обратите внимание: EOF может быть любым словом, но оно должно совпадать в начале и в конце блока.
Оптимизация вывода для парсинга
По умолчанию MySQL выводит данные в красивой ASCII-таблице. Это хорошо для глаз, но ужасно для обработки утилитами вроде grep, awk или sed.
Флаг -N (No headers): Убирает заголовки столбцов.
Флаг -s (Silent/Raw): Убирает графические рамки таблицы, разделяя поля табуляцией.
Практический пример: Получение чистого значения
Допустим, нам нужно получить только количество пользователей, чтобы использовать это число в условии Bash.
Плохой вариант:
mysql -u root -p -e "SELECT count(*) FROM users" db_app
# Вывод:
# +----------+
# | count(*) |
# +----------+
# | 152 |
# +----------+Хороший вариант:
count=$(mysql -u root -p -N -s -e "SELECT count(*) FROM users" db_app)
echo "Всего пользователей: $count"
# Вывод:
# Всего пользователей: 152Вертикальный вывод длинных строк
При изучении структуры таблицы или поиске конкретной записи бывает удобно вывести данные построчно, особенно если столбцов много и они не умещаются по ширине экрана. Для этого вместо точки с запятой завершите запрос директивой \G:
SELECT * FROM users LIMIT 1\GКаждое поле будет представлено на отдельной строке в формате имя_столбца: значение. Этот приём работает как в интерактивном, так и в пакетном режиме.
Произвольный разделитель полей
Если вы готовите данные для импорта в другую программу, вместо табуляции можно задать свой разделитель, например запятую для CSV:
mysql --batch --delimiter=',' -e "SELECT id, name FROM accounts" > export.csvТакой CSV-файл сразу откроется в электронных таблицах без дополнительных преобразований.
Продвинутый уровень: Bash-переменные внутри SQL
Частая ошибка новичков — использование одинарных кавычек ' для SQL-запроса в Bash. Одинарные кавычки в Bash запрещают подстановку переменных.
Неправильно:
ID=5
mysql -e 'SELECT * FROM items WHERE id = $ID' # $ID не будет замененоПравильно (Двойные кавычки):
ID=5
mysql -e "SELECT * FROM items WHERE id = $ID"Если внутри SQL-запроса тоже нужны кавычки (для строк), их нужно экранировать или комбинировать:
USER_NAME="admin"
mysql -e "SELECT * FROM users WHERE login = '$USER_NAME'"Важное о безопасности
Использование пароля прямо в командной строке (например, -pSuperSecretPassword) крайне не рекомендуется на продакшн-серверах.
Почему? Пароль в таком виде виден в истории команд, может быть перехвачен через /proc и случайно сохранён в скриптах. Для безопасного подключения используйте один из двух проверенных методов.

1. Шифрованное хранилище mysql_config_editor
Утилита mysql_config_editor (входит в стандартную поставку MySQL) создаёт зашифрованный файл ~/.mylogin.cnf, из которого клиент сам считывает учётные данные. Вы просто задаёте логин и пароль один раз:
mysql_config_editor set --login-path=local --host=localhost --user=root --passwordПосле ввода пароля подключиться можно без указания -u и -p:
mysql --login-path=local2. Конфигурационный файл ~/.my.cnf
Создайте файл ~/.my.cnf с правами только для владельца:
touch ~/.my.cnf && chmod 600 ~/.my.cnfЗапишите в него учётные данные:
[client]
user = root
password = MyStrongPassword
host = localhostТеперь mysql и mysqldump будут автоматически подхватывать эти настройки, и вы сможете выполнять запросы просто по команде mysql.
Важно: никогда не используйте переменную окружения
MYSQL_PWDв продакшене — пароль через неё виден всем процессам системы. Два метода выше полностью закрывают эту проблему.
Полезные инструменты и расширение кругозора
Современный клиент mycli
Для повседневной работы гораздо удобнее использовать улучшенный клиент mycli. Он поддерживает автодополнение имён таблиц и столбцов «на лету», подсветку синтаксиса и более интеллектуальное форматирование вывода. Установка элементарна:
# Debian/Ubuntu
sudo apt install mycli
# Или через pip
pip install mycliПодключение выглядит так же, как и к стандартному клиенту:
mycli -u root -pС mycli вы будете быстрее писать запросы и реже ошибаться.

Пара слов о PostgreSQL и NoSQL
Если в будущем вам понадобится работать с PostgreSQL, вы обнаружите, что практически все описанные подходы применимы и там. Утилита psql принимает SQL-команды через флаг -c, а CSV-вывод включается опцией --csv. Изучив один инструмент, вы быстро освоите другой.
И последнее: MySQL — это реляционная (SQL) база данных, идеально подходящая для строго структурированных данных и сложных связей. Если же вы храните слабоструктурированные JSON-документы, логи или прототипируете проект с часто меняющейся схемой, возможно, вам стоит присмотреться к NoSQL-решениям вроде MongoDB. Но это уже тема для отдельного разговора.
Заключение
Умение работать с MySQL из командной строки — это очень полезно для автоматизации. Теперь вы можете:
- Создавать быстрые бэкапы конкретных таблиц.
- Мониторить состояние репликации через Cron.
- Интегрировать проверки БД в CI/CD пайплайны.
Используйте флаги -s и -N для скриптов и не забывайте про безопасность ваших паролей!
Читайте также
- Bash (Bourne Again Shell). Обзор.
- Погружение в командную строку
- Управление процессами Linux.
- Математические операции в shell-скриптах: Фибоначчи, двоичная арифметика и преобразования чисел.
Было ли это полезно?
0 / 0