Рубріки: HighloadТеория

Как делать mysqldump на продакшне

Ігор Грегорченко

Mysqldump остается одним из популярных решений для выполнения бекапов. Если на данном этапе развития проекта более продвинутые средства создания бекапов не используются, стоит использовать mysqldump с правильным параметрами.

Наиболее критичное влияние, которое mysqldump оказывает в продакшне, это блокировка таблиц:

root@webminer-manager-1:~# mysql -e "show processlist"
+-------+------+-----------------+-----------+---------+------+---------------------------------+------------------------------+
| Id    | User | Host            | db | Command | Time | State                           | Info                                |
+-------+------+-----------------+-----------+---------+------+---------------------------------+------------------------------+
|   416 | user | localhost:52102 | db | Query   |  632 | Waiting for table metadata lock | INSERT INTO products SET url = '... |
|   417 | user | localhost:52104 | db | Query   |  633 | Waiting for table metadata lock | INSERT INTO products SET url = '... |
|   418 | user | localhost:52106 | db | Query   |  633 | Waiting for table metadata lock | INSERT INTO products SET url = '... |
...

# блокировка таблицы во время выполнения дампа

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

-l, --lock-tables   Lock all tables for read.
                      (Defaults to on; use --skip-lock-tables to disable.)
  --single-transaction 
                      Creates a consistent snapshot by dumping all tables in a
                      single transaction. Works ONLY for tables stored in
                      storage engines which support multiversioning (currently
                      only InnoDB does); the dump is NOT guaranteed to be
                      consistent for other storage engines. While a
                      --single-transaction dump is in process, to ensure a
                      valid dump file (correct table contents and binary log
                      position), no other connection should use the following
                      statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
                      TRUNCATE TABLE, as consistent snapshot is not isolated
                      from them. Option automatically turns off --lock-tables.

# выключение блокировки во время дампа

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

Кроме этого, полезно включить опцию --insert-ignore, чтобы избежать ошибок при последующем восстановлении (например, если изменились ключи).

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

Финальная команда дампа для выполнения на продакшне может выглядеть так:
mysqldump -v --insert-ignore --skip-lock-tables --single-transaction=TRUE db products | gzip > /root/products.sql.gz

Такой дамп не будет блокировать таблицы и минимизирует влияние на основное приложение:

mysql> show processlist;
+-------+------+-----------------+----+---------+------+-------------------+------------------------------------------------------------------------------------------------------+
| Id    | User | Host            | db | Command | Time | State             | Info                                                                                                 |
+-------+------+-----------------+----+---------+------+-------------------+------------------------------------------------------------------------------------------------------+
| 15655 | user | localhost:39430 | db | Query   |    0 | query end         | INSERT INTO products SET url = '... 
| 15656 | user | localhost:39450 | db | Sleep   |  614 |                   | NULL                                                                                                 |
| 15661 | root | localhost       | db | Query   |  589 | Sending to client | SELECT /*!40001 SQL_NO_CACHE */ * FROM `products`
| 15682 | user | localhost:39504 | db | Sleep   |    0 |                   | NULL                                                                                           
...

# Отсутствие блокировки при дампе

TL;DR

Mysqldump можно использовать на продакшне, но при этом стоит отключать блокировку таблиц. Если же размер базы данных переваливает за несколько десятков Гб, запланируйте использование горячих бекапов.

Останні статті

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

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

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024