我对同时使用 MyISAM 和 InnoDB 的 MySQL 数据库的逻辑备份有疑问。
该mysqldump
实用程序支持以下两个选项:
--single-transaction - 通过在单个事务中转储所有表来创建一致的快照。仅适用于存储在支持多版本控制的存储引擎中的表(目前只有 InnoDB 支持)[...] 选项自动关闭 --lock-tables。
-x, --lock-all-tables - 锁定所有数据库中的所有表。这是通过在整个转储期间获取全局读锁来实现的。自动关闭 --single-transaction 和 --lock-tables。
对于 InnoDB,我们需要
--single-transaction
对于 MyISAM,我们需要 - lock-tables 或 lock-all-tables(以防我们需要跨数据库一致性)。
那么,应该如何备份混合数据库(同时使用 MyISAM 和 InnoDB 引擎的数据库)?
编辑:
为了澄清,这个问题可以重新表述如下:
lock-[all-]tables 选项是否保证 InnoDB 表的一致备份?
使用 mysqldump 只有在所有表都是 InnoDB 时才能安全使用
--single-transaction
,否则备份不一致。如果您需要混合备份,则需要备份
lock-tables
中的所有表(默认),这对所有引擎都是安全的。还值得一提的是,默认选项将确保您的备份是安全的,您不需要打开任何特殊标志。注意:如果您确实有混合混合,也许看看 xtrabackup。它只会在备份的 MyISAM 阶段锁定。
作为针对您的情况的另一个想法,花一些想法来设置主从设置可能会有所帮助,其中您的备份是从从属设备进行的。
混合了 InnoDB 和 MyISAM 的 MySQL 数据库将始终(据我所知,在每个配置和每个备份工具中)在 MyISAM 备份阶段锁定 MyISAM 表。
要避免这种锁定,请使用以下设置:
所有写入和读取都转到服务器 A(主服务器)。Server B (Slave) 仅用于备份。在从站上,您安装您选择的备份工具或脚本,例如 MySQL Administrator。
配置您的备份,例如每天在夜间。锁在从属设备上,导致从属设备锁定时出现滞后,但是一旦备份结束并打开锁,此滞后就会被赶上。