Для многих системных администраторов и разработчиков работа с 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Продвинутый уровень: 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) крайне не рекомендуется на продакшн-серверах.
Почему? Любой пользователь системы, запустивший команду ps aux или просмотревший .bash_history, увидит ваш пароль открытым текстом.
Решение: Конфигурационный файл .my.cnf Создайте в домашней директории пользователя файл настроек:
nano ~/.my.cnfДобавьте туда данные для входа:
[client]
user=root
password=ваш_сложный_парольИ установите права доступа 600 (только для владельца):
chmod 600 ~/.my.cnfТеперь вы можете запускать команды просто как mysql -e "..." — клиент сам подхватит пароль, и он не будет виден в списке процессов.

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