Зняття та встановлення дампа в MySQL (mysqldump)

Теоретично все просто - MySQL з коробки має утиліту mysqldump, яка дозволяє зняти копію бази у вигляді набору SQL інструкцій.

Насправді все набагато гірше. Справа в тому, що mysqldump криво працює з кодуванням, відмінним від Latin1. Тобто експортувати базу в UTF8 за офіційною документацією (man mysqldump), тобто із зазначенням --default-character-set=utf8, і імпортувати її потім назад — неможливо. Кодування буде бите внаслідок «подвійного перетворення», що виконується утилітою mysqldump - пруфлінк

Власне, на посилання вище є і рецеп. Суть його в тому, що потрібно експортувати базу і потім імпортувати її в Latin1 незалежно від того, яке реальне кодування використовується. При цьому звичайно потрібно відняти з *.sql файл інструкції SET NAMES…

Ще один важливий момент, який слід врахувати. Як правило, ми знімаємо дамп бази з ім'ям A і намагаємося накотити його на базу з ім'ям B. Відповідно, можливі колізії через те, що у створеному після експорту файлі в SQL запитах і командах СУБД буде присутня згадка A. Потрібно замінити всі входження A на B, нижче під катом буде приклад, як це зробити засобами VIM.

І насамкінець, перед завантаженням дампа стару базу краще повністю відчистити. Зробити це можна по-різному, я ж знайшов для себе зручним маленький shell-скрипт (drop_all.sh), який автоматизує для мене цю роботу:

Отже, алгоритм

Послідовність кроків така:

2) Відкриваємо файл, що вийшов у результаті, і здійснюємо заміну. Зберігаємо зміни.