MySQL — избегайте блокировок таблиц во время резервного копирования

MySQL — избегайте блокировок таблиц во время резервного копирования

Я запускаю ночные резервные копии на моем сервере с помощью mysqldump. К сожалению, это практически убивает мой сайт на полчаса или около того каждую ночь, так как таблицы блокируются во время резервного копирования.

Согласно списку процессов, иногда даже кажется, что запросы к несвязанным таблицам блокируются, например, «INSERT INTO A» находится в состоянии блокировки в течение нескольких минут, в то время как единственный выполняющийся запрос затрагивает только таблицу B.

Есть ли лучший способ делать резервные копии?

решение1

У вас есть два варианта:

A. Используйте --skip-lock-tablesопцию mysqldump. Ваши таблицы не будут заблокированы, но резервная копия может быть не согласованной (зависит от вашей схемы: если транзакции вашей базы данных затрагивают несколько таблиц одновременно, и одна таблица уже скопирована, а другая — нет. Например: две таблицы: клиенты и заказы. Если сначала скопирована клиентская таблица, а затем вставлена ​​новая пара клиент/заказ, в резервной копии может оказаться заказ без клиента).

Эта проблема является основной причиной, по которой mysqldump блокирует все таблицы по умолчанию. Если эта проблема к вам не относится, то самым простым решением будет пропустить блокировку таблиц в mysql.

B. Используйте другой метод резервного копирования. Например: сбросьте таблицы с блокировкой чтения, создайте снимок LVM, разблокируйте таблицы, смонтируйте снимок LVM и сделайте резервную копию данных. Это быстро становится гораздо сложнее, чем простой mysqldump. Погуглите "mysql backups with LVM snapshots", есть много скриптов и руководств.

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

Связанный контент