我有一个需要两个数据库才能运行的系统。我需要一个脚本来在给定的时间点备份两个数据库。我需要数据库同步,所以我需要确保备份不允许在备份另一个数据库时更改其中一个数据库。
mysqldump db1 db2 > db1_db2.sql
上述代码是否适合这种情况?备份时会锁定两个数据库吗,这样我就能获得同步备份?实现此目的的正确方法是什么?我该如何做,但每个数据库都有单独的文件?
编辑:
大部分表采用InnoDB引擎,但也有少数不太重要的表采用存档引擎。
答案1
您最好的选择是
mysqldump --single-transaction --databases db1 db2 > db1_db2.sql
选项--单笔交易为转储中的所有数据创建一个时间点窗口。唯一的限制是您不执行任何 DDL
ALTER TABLE
CREATE TABLE
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
- 请参见我的 DBA StackExchange 帖子
row locking within ACID transaction innodb
查看所有可能间歇性损害交易的声明。
只要您在 mysqldump 运行期间不执行任何这些操作,从 mysqldump 启动的那一刻起,db1 和 db2 就会是一个完美的快照。
您的非 InnoDB 表应该没问题,只要您不对它们执行任何操作:没有 DDL、没有 INSERT、没有 UPDATE、没有 DELETE。
更新时间 2014-06-26 19:43 EDT
你问
单事务和锁定所有表是否互斥?其中一个是隐含的\默认的吗?
直接来自 MySQL 文档--单笔交易
--single-transaction 选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会导致任何待处理的事务被隐式提交。
是的,它们是互相排斥的。
直接来自 MySQL 文档--lock-all-tables
锁定所有数据库中的所有表。这是通过在整个转储期间获取全局读取锁定来实现的。此选项会自动关闭 --single-transaction 和 --lock-tables。
因此lock-all-tables
将禁用--single-transaction
警告:请记住,FLUSH TABLES WITH READ LOCK;
所有其他严厉的(全有或全无)锁定机制都不会完全阻止 InnoDB 对系统表空间进行写入。我之前在 DBA StackExchange 上写过。
下面是 InnoDB 的地图,可以帮助您直观地了解 InnoDB 的其他活动部分:
请阅读FLUSH TABLES WITH READ LOCK 如何与 Innodb 表配合使用(MySQL 性能博客)关于锁定所有表以防止 InnoDB 带来的其他不良影响。
答案2
查看此 URL 以了解 MySQL 备份的概述。
http://www.iheavy.com/2012/08/09/5-things-you-overlooked-with-mysql-dumps/
您需要添加以下参数来锁定两个数据库。
–lock-all-tables,-x
“锁定所有数据库中的所有表。这是通过在整个转储期间获取全局读取锁定来实现的”。
您的命令应如下所示。
mysqldump -x --数据库 db1 db2
您还可以考虑将 MySQL 数据库复制到从属服务器并从从属服务器进行备份。