在 MySQL Master/Slave 复制中,如果我写入 Slave 会发生什么?

kfm*_*e04 19 mysql replication

几个问题

  • Slave 条目是否会一直保留,直到对 Master 上的表进行可能影响 Slave 的插入/更新/删除操作?

  • 如果没有,我如何确保从站与主站同步(通过删除从站条目或手动将该条目复制到主站)?

  • 最重要的是,如何检测表不同步?

Rol*_*DBA 16

只要你不直接在 Slave 上执行任何 INSERT/UPDATE/DELETE 语句,你的 Slave 应该没问题。否则,如果您在 Slave 上的 mydb.mytable 中插入新行,并且通过复制,Slave 稍后检测到具有相同 PRIMARY KEY 的行插入到 mydb.mytable 中,则 MySQL 复制可能会中断。这会产生错误 1062(重复键)。

在不破坏 MySQL 复制的情况下写入 Slave 的唯一方法是:

  • Master有数据库db1,db2,db3
  • Slave 正在从 Master 复制数据库 db1,db2,db3
  • CREATE DATABASE db4;在奴隶上奔跑
  • 您只对 Slave 上的 db4 执行 INSERTs/UPDATEs/DELETEs
  • 你不会只对 Slave 上的 db1,db2,db3 执行 INSERTs/UPDATEs/DELETEs

要在不下载任何工具的情况下检测 Master 和 Slave 不同步,请选择任何表并针对 Master 上的表和同一表的 Slave 副本运行CHECKSUM TABLE

例子

如果您有 table mydb.mytable,请对其运行命令:

mysql> CHECKSUM TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)

如果返回的值不相同,则说明某些内容不同步。

如果你想批量检查一堆表格,你可以下载 Percona 的 MAATKIT。您将需要两个特定的工具(Percona 也有 Percona Toolkit,他们自己从 MAATKIT 分叉出来,现在正在推广更多)

或者

pt-table-checksum将对 Master 和 Slave 上的所有表执行 CHECKSUM TABLE。您可以将其配置为仅在特定数据库上执行所有数据库。

pt-table-sync可以在 Slave 上针对任何表运行。使用--print 和--sync-to-master 选项,您可以查看需要在Slave 上执行哪些SQL 语句才能使其与Master 完美匹配。此工具不适用于缺少 PRIMARY KEY 或 UNIQUE KEY 的表。

我已经使用 MAATKIT 多年了。我仍然。我还没有尝试过 Percona Toolkit,但我相信它应该与 MAATKIT 具有相同的质量。