Как стать автором
Обновить

Генерируем «правильный» SQL дамп

Время на прочтение 3 мин
Количество просмотров 3.7K
В процессе разработки с использованием MySQL часто приходится делать дамп базы данных для сохранения ее в репозиторий (деплоя на сервер и т.д.).
Существуют разные клиенты для работы с MySQL:
— MySQL Front
— PHPMyAdmin
— Aqua Data Studio
— EMS SQL manager
и так далее.

Проблема


В каждом из перечисленных существует функция экспорта схемы базы и её данных в файл. Попросту говоря — создания дампа БД. Но вот незадача! Каждый из иструментов генерирует SQL код со своим форматированием. К примеру, некоторые даже не вставляют ENGINE=MyISAM DEFAULT CHARSET=… в выражении CREATE TABLE, то же самое и с DROP TABLE IF EXISTS. Одним словом, наблюдается эффект «лебедь, рак и щука».

Затруднения возникают, если в команде несколько разработчиков — вероятнее всего каждый из них привык пользоваться каким-то одним инструментом. Попытки заставить девелоперов применять какой-то определенный клиент могут привести к священным войнам («я к этому привык, я не хочу другое.., а это вообще отстой!»). Возможно, кому то проблема покажется надуманной, но в моей практике такое было. Да и что делать, если люди работают на разных операционных системах? SQL менеджеры у них тоже будут разные.

Итак, нужен способ генерации дампа в каком то унифицированном формате. Ожидаемая выгода:
  • возможность легко сравнивать изменения sql файлов в репозитории (если ревизии в одном формате, это проще. Не так ли?)
  • возможность дальнейшего парсинга SQL кода (например, в инсталляторе приложения)
  • автоматизация сего действия
  • независимость от ОС
  • указание кодировки
  • возможно что-то еще:)

Решение


Отказаться от каких либо сторонних инструментов для генерации дампа.
В дистрибутиве MySQL существует набор полезных утилит, в том числе и известная многим mysqldump. Ниже можно увидеть BAT-файл, который используя данную утилиту генерирует правильный SQL дамп.
Правильный — в данном контексте означает «соответствующий оговоренному формату». В любом случае, не хочу подвергать сомнению корректность работы родной утилиты от MySQL :)

@echo off
rem author afi
echo =========================================
echo SQL generator
echo Output files :
echo scheme.sql - Scheme of database
echo data.sql - Data for database
echo =========================================

rem по умолчанию UTF-8
set ENCODING=utf8

IF "%1" == "" goto ERROR
IF "%2" == "" goto ERROR
IF "%3" == "" goto ERROR
IF "%4" == "" goto ERROR
IF NOT "%5" == "" (
set ENCODING="%5"
)

goto get

:get
echo Generating scheme for DB: %1
mysqldump --host=%1 --password=%4 -u %3 --disable-keys --add-drop-table --default-character-set=%ENCODING% --no-data --result-file=scheme.sql %2

echo Generating data for DB: %1
mysqldump --host=%1 --password=%4 -u %3 --disable-keys --default-character-set=%ENCODING% --no-create-info --extended-insert=false --result-file=data.sql %2
goto END

:ERROR
echo Please, define parameters. Example:
echo gensql.bat host_name database_name mysql_user mysql_password [encoding]
goto END

:END
echo =========================================

@pause



Теперь все заботы сводятся к запуску скрипта с параметрами:
gensql.bat host_name database_name mysql_user mysql_password [encoding]

, где encoding — выходная кодировка данных. Необязательный параметр, по умолчанию utf8.

В результате, получаем 2 файла:
scheme.sql — содержит схему БД, т.е. скрипт создания таблиц, ограничений, вьюшек и пр.
data.sql — содержит дамп данных

Сделать bash-вариант скрипта, думаю не составит труда тем, кому он может понадобиться.
Теги:
Хабы:
+9
Комментарии 7
Комментарии Комментарии 7

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн