Гид по технологиям

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

6 min read Базы данных Обновлено 27 Dec 2025
Экспорт CSV из MySQL — сервер, CLI, скрипт
Экспорт CSV из MySQL — сервер, CLI, скрипт

Инструкция: экспорт CSV из MySQL через командную строку

Быстрые ссылки

  • С сервера базы данных
  • Из командной строки 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) и корректность дат и чисел.

Мини‑методология: шаги для безопасного экспорта

  1. Определите объём и чувствительность данных.
  2. Выберите метод: SELECT INTO OUTFILE (сервер), CLI + преобразование (клиент) или программный скрипт.
  3. Настройте права и secure_file_priv при необходимости.
  4. Сгенерируйте тестовый файл и проверьте набор символов и экранирование.
  5. Проверяйте итоговый файл в целевой системе.
  6. Удаляйте временные файлы и логируйте операцию.

Безопасность и соответствие требованиям конфиденциальности

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

Конец статьи.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Настройка Wi‑Fi и Bluetooth на Raspberry Pi
Raspberry Pi

Настройка Wi‑Fi и Bluetooth на Raspberry Pi

Разрешения микрофона и камеры в Chrome — как изменить
браузер

Разрешения микрофона и камеры в Chrome — как изменить

Опасности USB: защита флешек и ПК
Кибербезопасность

Опасности USB: защита флешек и ПК

Автоматические бэкапы Windows 7: TrueSafe, ODIN, UrBackup
Резервное копирование

Автоматические бэкапы Windows 7: TrueSafe, ODIN, UrBackup

Изменить поисковую систему в Safari на Mac
Браузеры macOS

Изменить поисковую систему в Safari на Mac

Как настроить гитару через Amazon Echo
Гитара

Как настроить гитару через Amazon Echo