我有一个系统需要两个数据库才能工作。 我需要一个脚本来备份两个数据库在给定的时间点。 我需要数据库同步,所以我需要确保备份不会允许其中一个数据库的更改备份时。
mysqldump db1 db2 > db1_db2.sql
上面的代码是否适合这个。 它会locking两个数据库的备份时间,所以我会得到同步备份? 什么是实现这一目标的正确方法? 我将如何做到这一点,但每个数据库的分离文件?
编辑:
大多数表使用InnoDB引擎,但使用归档引擎的重要表less有几个。
你最好的select是以下几点
mysqldump --single-transaction --databases db1 db2 > db1_db2.sql
选项–single-transaction将为转储中的所有数据创build一个时间点窗口。 唯一的限制是你不执行任何DDL
ALTER TABLE CREATE TABLE DROP TABLE RENAME TABLE TRUNCATE TABLE row locking within ACID transaction innodb DBA StackExchange row locking within ACID transaction innodb ,查看可能间歇性地损害事务的所有语句。 只要你在mysqldump的持续时间内不执行任何这些操作,从mysqldump开始的那一刻起,db1和db2将是一个完美的快照。
你的非InnoDB表应该是没问题的,只要你不做任何事情:没有DDL,没有插入,没有更新,没有删除。
你问
单事务和全locking表是相互排斥的吗? 其中一个是默认的\默认?
从MySQL文档 – 单一事务
–single-transaction选项和–lock-tables选项是相互排斥的,因为LOCK TABLES会导致任何挂起的事务被隐式提交。
是的,他们是互相排斥的。
从MySQL文档–lock-all-tables
locking所有数据库的所有表。 这是通过获取整个转储期间的全局读锁来实现的。 该选项自动closures – 单事务和 – 锁表。
因此, lock-all-tables将禁用 – --single-transaction
CAVEAT:请记住, FLUSH TABLES WITH READ LOCK; 而所有其他的强制(全有或全无)locking机制不会完全阻止InnoDB写入系统表空间。 我之前在DBA StackExchange中写过 。
下面是一个InnoDB的地图,供您查看InnoDB的其他移动部分:

请阅读Innodb Tables(MySQL性能博客)如何使用READ LOCK的FLUSH TAB与 InnoDB表(InnoDB Tables)locking所有表对InnoDB的其他不良影响。
查看这个URL来了解MySQL备份的概述。
http://www.iheavy.com/2012/08/09/5-things-you-overlooked-with-mysql-dumps/
你需要添加下面的参数来locking这两个数据库。
–lock-all-tables,-x
“locking所有数据库中的所有表,这是通过在整个转储期间获取全局读取锁来实现的”。
你的命令应该如下所示。
mysqldump -x –databases db1 db2
您也可以考虑将您的MySQL数据库复制到从服务器,并从从服务器进行备份。