У меня есть система, для работы которой нужны две базы данных. Мне нужен сценарий для резервного копирования обеих баз данных в определенный момент времени. Мне нужно, чтобы базы данных синхронизировались, поэтому мне нужно быть уверенным, что резервное копирование не допускает изменений в одной из баз данных, когда выполняется резервное копирование другой.
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.
ALTER TABLE
CREATE TABLE
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
row locking within ACID transaction innodb
чтобы увидеть все утверждения, которые периодически могут повредить транзакции.Пока вы не выполняете ни одно из этих действий во время mysqldump, db1 и db2 будут идеальным моментальным снимком с момента запуска mysqldump.
Ваши таблицы, не относящиеся к InnoDB, должны быть в порядке, при условии, что вы ничего с ними не делаете: без DDL, без INSERT, без UPDATE, без DELETE.
Ты спрашивал
Являются ли одинарная транзакция и блокировка всех таблиц взаимоисключающими? Один из них подразумевается \ дефолт?
Прямо из документации 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.