Экспорт CSV из MySQL — с сервера, из CLI и через скрипт

Быстрые ссылки
- С сервера базы данных
- Из командной строки MySQL
- Самостоятельно через язык программирования
CSV (Comma-Separated Values) — текстовый формат для обмена табличными данными. TSV (Tab-Separated Values) аналогичен, но использует табуляцию как разделитель. Оба формата поддерживают большинство таблиц и электронных таблиц, но у каждого есть нюансы с экранированием, пустыми и NULL-значениями.
С сервера базы данных
Если у вас есть доступ к серверу, на котором запущен MySQL, самый простой и быстрый способ — команда SELECT … INTO OUTFILE.
Пример базового запроса:
SELECT id, column1, column2 FROM table
INTO OUTFILE '/tmp/mysqlfiles/table.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';Что делает этот запрос:
- Выписывает результат SELECT в файл на сервере по указанному пути.
- FIELDS TERMINATED BY указывает разделитель (запятая для CSV).
- ENCLOSED BY задаёт символ обрамления полей (обычно двойная кавычка).
- LINES TERMINATED BY указывает разделитель строк.
Требования и распространённые проблемы:
- Права доступа: пользователь ОС, под которым запущен MySQL (обычно mysql или root), должен иметь права на запись в целевой каталог.
- secure_file_priv: параметр конфигурации MySQL может ограничивать доступ только к конкретной папке. Проверьте его значение и при необходимости измените конфиг.
Пример добавления whitelist-папки в /etc/my.cnf:
[mysqld]
secure-file-priv = "/tmp/mysqlfiles"Создайте папку и дайте нужные права:
sudo mkdir -p /tmp/mysqlfiles
sudo chown mysql:mysql /tmp/mysqlfiles
sudo chmod 750 /tmp/mysqlfilesЗамечания по содержимому CSV:
- В экспортируемом файле в стандартном варианте нет заголовка с именами колонок. Порядок столбцов соответствует SELECT.
- NULL экспортируется как N (в некоторых конфигурациях). Если нужно пустое поле вместо NULL, оберните поле в IFNULL(field, “”) в SELECT.
- ENCLOSED BY гарантирует, что поля с запятыми корректно обрамлены, например:
"3","Escape, this","also, this"
Из командной строки MySQL
Если у вас есть только доступ к клиентской машине (без доступа к файловой системе сервера), можно запускать запросы mysql и перенаправлять вывод в файл.
Пример базовой команды:
mysql -u root -e "select * from database;" > output.tsvПо умолчанию клиент MySQL выводит столбцы, разделённые табуляцией — это TSV. Многие программы (включая Excel и LibreOffice) умеют открывать TSV, но иногда нужен именно CSV.
Преобразование TSV → CSV
- Простая замена табуляций на запятые с помощью sed работает только если в данных нет запятых и кавычек.
sed "s/\t/,/g" output.tsv > output.csv- Если в данных есть запятые, нужно корректно экранировать поля двойными кавычками и обработать существующие кавычки. Один из вариантов (POSIX sed с буквальной табуляцией):
sed 's/\t/","/g; s/^/"/; s/$/"/; s/""/""""/g' output.tsv > output.csvПояснение:
- s/\t/“,”/g — заменяет табуляцию на “,” между полями.
- s/^/“/ и s/$/“/ — обрамляют каждую строку в кавычки.
- s/“”/“”””/g — предварительная защита двойных кавычек (в зависимости от окружения может требоваться иное экранирование).
Важно: поведение sed и интерпретация escape-последовательностей отличаются на macOS/BSD и GNU/Linux. На macOS часто проще вставить в команду буквальную табуляцию, а не \t. Всегда тестируйте на небольших выборках.
Когда простые приёмы не работают
- Если ваши данные содержат и табуляции, и кавычки, и запятые одновременно, корректнее генерировать файл в CSV на этапе приложения (см. следующий раздел), а не пытаться конвертировать постфактум.
- Очень большие файлы (гигабайты) неудобно и медленно обрабатывать через sed/awk на клиенте; лучше генерировать файл на сервере.
Самостоятельно через язык программирования (пример на Python)
Если вы контролируете приложение или можете подключиться к базе из скрипта, самый надёжный путь — генерировать CSV программно. Тогда вы корректно обрабатываете кавычки, NULL, кодировки и большие объёмы данных.
Ниже простой пример на Python с использованием модуля csv и mysql-connector-python:
import mysql.connector
import csv
cnx = mysql.connector.connect(user='user', password='pass', host='host', database='db')
cur = cnx.cursor()
cur.execute('SELECT id, column1, column2 FROM table')
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL)
# Если нужен заголовок:
writer.writerow([i[0] for i in cur.description])
for row in cur:
# Заменяем None на пустую строку, если нужно:
row = ["" if v is None else v for v in row]
writer.writerow(row)
cur.close()
cnx.close()Преимущества программного подхода:
- Корректное экранирование кавычек и разделителей.
- Вариативность: можно сжимать файл на лету, шифровать, добавлять заголовок, логировать прогресс.
- Лёгкая интеграция с очередями и отложенной обработкой для больших выгрузок.
Недостатки:
- Требует рабочего клиента и прав на соединение с БД.
- Нужны зависимости (драйверы).
Альтернативные подходы
- MySQL Workbench / phpMyAdmin: удобный GUI для экспорта в CSV (подходит при интерактивной работе).
- mysqldump — не для CSV напрямую, но для резервных копий.
- Инструменты ETL (Sqoop, Talend, Airbyte и др.) для регулярных и больших миграций.
Когда этот подход не сработает
- Ограничения secure_file_priv не позволяют записывать в нужную директорию и вы не имеете доступа к конфигу MySQL.
- Доступ только через управляемые сервисы (например, RDS) без возможности выдавать файлы на сервере. В таких случаях используйте клиентские или программные выгрузки.
- Данные содержат двоичные объекты/LOB, которые неправильно сериализуются в CSV.
Чек-листы по ролям
DBA
- Убедиться, что secure_file_priv настроен корректно.
- Проверить права на каталоги и политику SELinux/AppArmor.
- Настроить ротацию/очистку временных файлов.
- Логировать операции экспорта и мониторить нагрузку.
Разработчик
- Генерировать CSV через код, если данные сложные.
- Экранировать кавычки и заменять NULL по требованию.
- Писать юнит/интеграционные тесты на выгрузку.
Операторы/Аналитики
- Тестировать открытие CSV в целевой программе (Excel/Sheets).
- Проверить кодировку (UTF-8 vs CP1251) и корректность дат и чисел.
Мини‑методология: шаги для безопасного экспорта
- Определите объём и чувствительность данных.
- Выберите метод: SELECT INTO OUTFILE (сервер), CLI + преобразование (клиент) или программный скрипт.
- Настройте права и secure_file_priv при необходимости.
- Сгенерируйте тестовый файл и проверьте набор символов и экранирование.
- Проверяйте итоговый файл в целевой системе.
- Удаляйте временные файлы и логируйте операцию.
Безопасность и соответствие требованиям конфиденциальности
- Экспорт CSV создаёт плоские файлы с данными. Обращайтесь с ними как с потенциально чувствительной информацией.
- Храните файлы в защищённых каталогах и применяйте права доступа.
- При необходимости применяйте шифрование на диске или упаковку в зашифрованный архив (gpg, openssl).
- Для данных персонального характера учитывайте требования GDPR/локального законодательства: минимизация, шифрование, аудит и сроки хранения.
Краткий глоссарий (одно предложение на термин)
- CSV: текстовый формат, где поля разделяются запятой и часто обрамляются кавычками.
- TSV: текстовый формат с табуляцией как разделителем.
- secure_file_priv: настройка MySQL, ограничивающая доступ SQL-запросов к файловой системе.
Краткое резюме
- SELECT … INTO OUTFILE — самый быстрый способ при доступе к серверу.
- CLI-выгрузка даёт TSV; для CSV понадобится постобработка или скрипт.
- Генерация CSV в приложении даёт наибольшую гибкость и безопасность для сложных данных.
Важно: всегда тестируйте экспорт на образцах данных и обрабатывайте персональные данные согласно требованиям безопасности.
Критерии приёмки
- Файл открывается целевым приложением (Excel/Sheets) и содержит ожидаемые столбцы в правильном порядке.
- Нет повреждённых строк из-за некорректного экранирования.
- NULL-значения и кодировка соответствуют требованиям потребителя данных.
Полезные команды и сниппеты (чек-лист)
- Экспорт на сервере:
SELECT ... INTO OUTFILE '/path/file.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';- Быстрая CLI-выгрузка TSV:
mysql -u user -p -e "SELECT ..." dbname > output.tsv- Простейшее преобразование табов в запятые (только если в данных нет запятых):
sed "s/\t/,/g" output.tsv > output.csv- Сценарий на Python — см. пример выше.
Заметки
- На macOS/BSD поведение sed и эскейпы отличны от GNU sed — подбирайте команды осторожно.
- Для очень больших выгрузок предпочтительнее стримить результат и сжимать на лету.
Конец статьи.
Похожие материалы
Настройка Wi‑Fi и Bluetooth на Raspberry Pi
Разрешения микрофона и камеры в Chrome — как изменить
Опасности USB: защита флешек и ПК
Автоматические бэкапы Windows 7: TrueSafe, ODIN, UrBackup
Изменить поисковую систему в Safari на Mac