Назад | Перейти на главную страницу

Синхронизированное резервное копирование двух баз данных

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

mysqldump db1 db2 > db1_db2.sql

Подходит ли для этого приведенный выше код. Будет ли он заблокировать обе базы данных на время резервного копирования, чтобы я получил синхронизированную резервную копию? Как правильно этого добиться? Как мне это сделать, но с отдельным файлом для каждой базы данных?

РЕДАКТИРОВАТЬ:

Большинство таблиц используют механизм InnoDB, но есть несколько менее важных таблиц, которые используют механизм архивирования.

Взгляните на этот URL-адрес для обзора резервных копий MySQL.

http://www.iheavy.com/2012/08/09/5-things-you-overlooked-with-mysql-dumps/

Вам нужно добавить следующий аргумент, чтобы заблокировать оба db.

--lock-все-таблицы, -x

«Заблокируйте все таблицы во всех базах данных. Это достигается установкой глобальной блокировки чтения на время всего дампа».

Ваша команда должна быть такой, как показано ниже.

mysqldump -x --databases db1 db2

Вы также можете рассмотреть возможность репликации баз данных MySQL на подчиненный сервер и для резервного копирования с подчиненного.

Ваш лучший вариант следующий

mysqldump --single-transaction --databases db1 db2 > db1_db2.sql

Опция - single-transaction создает временное окно для всех данных в дампе. Единственное ограничение - вы не выполняете DDL.

Пока вы не выполняете ни одно из этих действий во время mysqldump, db1 и db2 будут идеальным моментальным снимком с момента запуска mysqldump.

Ваши таблицы, не относящиеся к InnoDB, должны быть в порядке, при условии, что вы ничего с ними не делаете: без DDL, без INSERT, без UPDATE, без DELETE.

ОБНОВЛЕНИЕ 2014-06-26 19:43 EDT

Ты спрашивал

Являются ли одинарная транзакция и блокировка всех таблиц взаимоисключающими? Один из них подразумевается \ дефолт?

Прямо из документации MySQL на - single-transaction

Опции --single-transaction и --lock-tables являются взаимоисключающими, поскольку LOCK TABLES заставляет любые ожидающие транзакции неявно фиксироваться.

Да, они исключают друг друга.

Прямо из документации MySQL на --lock-all-tables

Заблокируйте все таблицы во всех базах данных. Это достигается установкой глобальной блокировки чтения на время всего дампа. Эта опция автоматически отключает --single-transaction и --lock-tables.

Таким образом, lock-all-tables отключит --single-transaction

CAVEAT: Имейте в виду, что FLUSH TABLES WITH READ LOCK; и все другие жесткие (по принципу «все или ничего») механизмы блокировки не полностью остановят InnoDB от выполнения записи в системное табличное пространство. Я уже писал об этом ранее в DBA StackExchange.

Вот карта InnoDB, чтобы вы могли визуализировать другие движущиеся части InnoDB:

Пожалуйста прочти Как FLUSH TABLES WITH READ LOCK работает с таблицами Innodb (блог о производительности MySQL) о других побочных эффектах блокировки всех таблиц от InnoDB.