有人能解释一下 mysqldump--single-transaction
实际上是如何处理事务性表的吗?我读过官方文档,但还是没有读过。它是否像--lock-tables
那样执行每个表的锁而不是全局锁?另外,mysqldump将--opt
作为默认选项运行,它包含--lock-tables
。但它们与--single-transaction
互斥,如上面的文档链接所述。在单个 mysqldump 命令中使用--single-transaction
时,我应该使用--skip-opt
吗?
我需要转储InnoDB表的大小~700 Gb,我正在寻找正确的命令来实现这一点。目前我使用下面的一个:
mysqldump -B my_db --quick --single-transaction --max_allowed_packet=512M --compress --order-by-primary
先谢谢你。
2条答案
按热度按时间yi0zb3m41#
--single-transaction
表示“转储期间InnoDB表发生的任何更改都不会包含在转储中”。因此,转储实际上是转储 * 开始 * 时的数据库快照,而不管转储花费多长时间。由于锁的交互方式,这将减慢表的速度,甚至可能暂停写入。例如,在转储期间运行
ALTER TABLE
或DROP TABLE
,同时对同一个表执行其他操作。--lock-tables
对于MyISAM表很有用。--opt
通常是建议的,我认为它独立于上述选项。wpx232ag2#
--single-transaction
标志将在运行之前启动一个事务,而不是锁定整个数据库,这将使mysqldump在事务发生时以当前状态读取数据库,从而实现一致的数据转储。当
--single-transaction
转储正在进行时,为确保转储文件有效(正确得表内容与二进制日志坐标),任何其它连接都不应使用以下语句:ALTER TABLE、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE。一致读取与这些语句并不隔离,因此在要转储的表上使用这些语句可能会导致mysqldump执行的SELECT检索表内容时获得不正确的内容或失败。