Pull to refresh

Умный бэкап MySQL

Reading time4 min
Views2.4K
Думаю, у многих в жизни возникала ситуация, когда есть полный бэкап базы MySQL, и нужно восстановить только несколько таблиц из него. Или, еще хуже, нужно восстановить старые записи в этих таблицах, не затерев при этом новых. А в случае если дамп занимает сотни мегабайт, процесс не очень вдохновляет.

В этой статье я опишу концепцию умного бэкапа, реализованную в Sypex Dumper. А также приведу примеры использования.

Вступление


В процессе разработки Sypex Dumper 2 были проанализированы многие решения для бэкапа MySQL. И в первую очередь, естественно, исходники комплектного mysqldump.

В mysqldump создается файл с набором SQL-запросов, которые при восстановлении просто разбиваются по разделителю и «скармливаются» MySQL. Такая схема, в принципе, давно работает и, по сути, она стала стандартом. Но у такой схемы есть следующие недостатки:
  1. Все настройки делаются в mysqldump, который вынужден тратить лишнее время на проверку всех этих опций (некоторые опции проверяются для каждой строки данных).
  2. Из первого пункта следует один из основных недостатков — если вам нужно восстановить дамп с другими опциями, то нужно заново делать бэкап с этими опциями либо вручную «ковыряться» в дампе.
  3. Несмотря на множество настроек в mysqldump, ввиду его консольности, усложнен или даже не возможен сложный выбор объектов для бэкапа (например, чтобы не дампились таблицы с кэшем, а в дамп попадала только их структура).
  4. Mysqldump работает с каждым объектом независимо, из-за чего в дампе зачастую появляется дополнительный мусор (например, включение/отключение индексов для пустых таблиц, добавление «фейковых» таблиц из-за неумения расставить Представления в правильном порядке).
  5. При восстановлении используется программа, которая рассчитана, не на дампы, а на любые SQL-запросы, из-за этого тратится время на более тщательный парсинг.
  6. Проблема всех импортных софтин — корявая работа с кодировками. Это особо чувствуется в рунете.

В общем, решил поэкспериментировать с новой концепцией бэкапа.

Умный бэкап в теории


Были определены следующие принципы:
  1. Дамп делается в формате, содержащем только необходимый минимум информации.
  2. Минимум опций бэкапа, для максимальной скорости выполнения.
  3. Все вспомогательные SQL-запросы (DROP TABLE и т.п.) убрать из дампа и добавлять их автоматически в процессе восстановления.
  4. Добавление расширенных настроек при восстановлении дампа.
  5. Парсер SQL заточенный исключительно на дампы, и умеющий разбивать длинные INSERT-запросы на более короткие.
  6. Добавление в сам файл метаинформации.
  7. Автоматическая и главное корректная работа с кодировками.

А дальше — дело техники. Данная концепция реализована в Sypex Dumper 2. Также был разработан специальный формат дампа, в котором используются разделители и метки со спецсимволами. Что позволило значительно ускорить парсинг SQL-файла.

Например, скорость парсинга проверялась на RAM-диске, файл 860 МБ проглатывался за 0,5 секунды, у phpMyAdmin на аналогичный файл уходили десятки минут (выполнение запросов в обоих случаях было выключено).

Умный бэкап на практике


Одна из приятных функций умного бэкапа — возможность восстанавливать отдельные таблицы (и другие объекты) из дампа. Причем еще и восстанавливать их можно по-разному. Самое простое, классическое восстановление, когда удаляется таблица, потом создается новая и заливаются данные, но возможны и более сложные варианты.

Например, если удалена или изменена часть данных в таблице, и их нужно восстановить, но при этом с момента последнего бэкапа в таблицу были добавлены новые строки, и нужно, чтобы они не пострадали. В таком случае достаточно в дампере выбрать нужную таблицу и режим восстановления REPLACE. В результате дампер восстановит только те строки, которые есть в дампе, а новые строки останутся нетронутыми. Если же нужно восстановить только удаленные строки, то можно воспользоваться режимом INSERT IGNORE.



Также дампер может восстанавливать данные в таблицу, в которой была изменена структура (добавлены столбцы или изменен их порядок). Во всех режимах восстановления проверяется, существует ли таблица, и если она отсутствует, то будет автоматически создана.

Еще одна полезная фишка — возможность восстановления таблиц с заменой префикса в названиях.
Все настройки восстановления (как и бэкапа) можно сохранить, и потом выполнять в пару кликов либо по крону (удобно для демо-сайтов).

Кодировки


Отдельный абзац посвящу кодировкам, так как довольно много людей обращается с проблемами.
Sypex Dumper имеет довольно развитые функции работы с кодировками. Он спокойно в автоматическом режиме «переваривает» таблицы с разными кодировками в одном дампе, при этом не конвертирует все данные в UTF-8. Также в нем предусмотрены функции по коррекции кодировок.

Удивляет, что очень много софта, в том числе известных коммерческих скриптов до сих пор не умеют толком работать с кодировками (например, тот же vBulletin 4). Да, они делают таблицы в кодировке UTF-8, делают кодировку в заголовках и шаблонах UTF-8, но при этом забывают устанавливать кодировку соединения к MySQL в UTF-8. В итоге MySQL думает, что данные пришли в latin1, и пытается их конвертировать из latin1 в UTF-8. И самое плохое в таких «косяках», что их не сразу и заметишь, так как внешне форум выглядит нормально, разве что поиск и сортировка по тексту, не очень правильно работают.

C помощью дампера можно эти проблемы довольно просто решать. Но, это уже тема для отдельной статьи.

Бонус


В качестве бонуса для самых быстрых несколько промокодов для получения бесплатных лицензий Sypex Dumper Pro:

SX-1ADN-ZXJN
SX-ZIPE-4K4G
SX-TXFE-ZZUF
SX-TGGS-TR8F
SX-OJUS-A9YL
SX-RGL5-HROR
SX-L9A5-BK2R
SX-MNOW-ZOSP
SX-FLFJ-GWIV
SX-6B3I-WMWU
SX-SVZY-TG1K
SX-AUOR-1FGD
SX-VJEQ-9FV5
SX-YTHD-OE9P
SX-LXXB-PRBQ
SX-LRYB-3IHV
SX-C89A-UPPI
SX-PXOI-3SFN
SX-EUF2-IQWH
SX-RWJA-JCZ8
SX-Y4BS-C038
SX-SSFS-KYV0
SX-FUJ0-7AZY
SX-GHLR-8N1Z
SX-PK15-HRIE
SX-I3HJ-9JYR
SX-JPKK-WLBP
SX-6RNH-XY3Q
SX-FV4W-WBKV
SX-7DK9-L9BP
SX-UFNH-MWDG
SX-V2Q8-NI6H
SX-PQT8-TLLN
SX-VSYE-NZOM
SX-0YM6-PGFS
SX-L0TD-WILK
SX-7X9P-LT04
SX-8LOQ-YWQC


Да уж, не ожидал, что вечером первая десятка кодов улетит за 9 минут, так что буду выкладывать порциями по 4 штуки.

И последняя четверка
SX-IUPV-UUSO
SX-JBBN-9MD9
SX-PFCT-QQ4F
SX-DZZN-9DT1


Отписывайтесь о взятых кодах, позже еще добавлю.
Tags:
Hubs:
Total votes 77: ↑63 and ↓14+49
Comments76

Articles