![MySQL 复制错误:Error_code:1032](https://linux22.com/image/629648/MySQL%20%E5%A4%8D%E5%88%B6%E9%94%99%E8%AF%AF%EF%BC%9AError_code%EF%BC%9A1032.png)
我设置了只读的 MySQL 只读副本。主服务器和从服务器都运行 MySQL 5.6。从服务器从未被直接写入,但我似乎无法使其同步超过一两个小时。运行一段时间后,我不断遇到这种类型的错误:
Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log
然后我必须从 MySQL 转储中重新创建从属服务器,但无论我做什么,我都会再次收到此错误。有人知道为什么会发生这种情况吗?
答案1
根据您使用的引擎、是否使用多个模式以及您在 mysqldump 中使用的选项,您可能无法获得一致的转储。
如果您有两个模式,假设一个名为 development,另一个名为 production,mysqldump 会分别锁定每个模式的表。这意味着当您备份 development 模式时,production 模式仍然可写且正在更新。
现在您已经转储了两个模式并启动了复制,这两个模式实际上位于不同的 binlog 位置。这意味着当您收到 Error_code 1032 时,您实际上没有该密钥。
如果全部您需要备份的表中有 InnoDB,您应该查看--single-transaction
mysqldump 选项。如果您混合使用 InnoDB 和 MyISAM,则只有 InnoDB 表才能保证一致。使用此选项仍将写入 MyISAM 表。
如果您混合使用 InnoDB 和 MyISAM 或仅使用纯 MyISAM,则最佳选择(使用 mysqldump)是使用--lock-all-tables
。正如其名称所示,在转储完成之前不会写入任何内容。这的主要缺点是,依赖于数据库的应用程序或网站也被锁定(因为它无法写入)。
我认为最好的选择是将所有内容移至 InnoDB(如果尚未移至)并使用Percona Xtrabackup。它仍可很好地处理 MyISAM 表,但通过与 InnoDB 表不同的工具(cp
或rsync
)。在复制 MyISAM 表时,它仍需要锁定表,但它会尽力缩短该时间。如果您使用此rsync
方法,则该工具将首先复制所有 MyISAM 表,然后锁定表,然后复制自第一次复制以来已更新的所有表。只需在第二次 rsync 期间保持锁定即可。