如何在 MySQL 中从基于语句的复制转换为基于行的复制

Jon*_*tte 2 mysql replication

我有一个生产系统,如果主数据库死亡,它使用基于 MySQL 语句的复制进行热故障转移。运行版本 5.5 Percona。出于这个问题的目的,我必须使用基于语句的复制,原因是不可变的。

现在,我想查看相同数据的基于行的复制流,目的是尝试将其调整为基于 HBase 的数据存储。

是否可以使用基于语句的复制将 MySQL 服务器设置为从属(读取),但同时使用基于行的复制成为复制主服务器(写入其他从属)?如果是这样,我该如何设置?我查看了文档,但没有找到。

Mic*_*bot 6

出于这个问题的目的,我必须使用基于语句的复制,原因是不可变的。

出于这个问题的目的,我认为使用基于语句的日志记录可能确实有令人信服的理由¹,但通常不建议这样做,因为基于语句的日志记录相对脆弱。在您可以灵活地使用基于语句的日志记录的任何系统上,不要使用它——使用MIXEDROW

MySQL Server(和兼容系统,如 Percona Server、MariaDB 和 Aurora for MySQL)根据每个单独服务器的配置自动从一种格式“转换”到另一种格式。

每个 MySQL 服务器都可以设置自己的二进制日志格式,并且只能设置自己的二进制日志格式(无论binlog_format是设置全局范围还是会话范围都为true )。这意味着更改复制主服务器上的日志格式不会导致从服务器更改其日志格式以匹配。

https://dev.mysql.com/doc/refman/5.6/en/binary-log-setting.html

用一些额外的含义重申这一点,你想要做的“只是有效”,因为binlog_format从站上的设置没有指定从站期望什么 它只设置从站将生成的内容

配置从站binlog_format=ROWlog_slave_updates在从站上启用my.cnf(这会导致传入事件被重写到从站的二进制日志)。

......你就完成了。

尽管 master 是 binlog 格式,slave 会将其所有 DML 记录为基于行的事件。你真的不需要做任何其他事情来使从站也成为主站,因为每个启用二进制日志记录的 MySQL 服务器本质上已经是一个主站——它可能恰好是一个没有任何实际从站的主站。

除了配置为的主站和配置为的从站(与您在此处所做的相反)之外,主站和从站的任何组合binlog_format都是有效的,因为 while 语句可以转换为行事件(毕竟它们会影响从站上的行) ),反之则不然——如果您只知道实际更改的数据,则您不一定能确定更改行的具体语句。但是对于您所询问的应用程序,上述内容应该完全符合您的意图。ROWSTATEMENT

我还在dba.stackexchange.com上详细讨论了主从二进制日志格式的可能组合的交互。


¹在这里使用日志记录而不是“复制”,因为它更准确地描述了实际配置的内容,尽管可以说其含义没有改变。

²STATEMENT记录进行更改的实际查询;ROW记录查询插入/更新/删除的行的“行图像”。对于更新,旧值和新值都被记录。 MIXED模式允许服务器为每个查询选择格式,ROW当查询对基于语句的复制可能不安全的数据库影响时总是使用,因为副本可能会以一种可能导致副本的数据与 master 不同,因为查询不是确定性的。示例可能包括无序UPDATE ... LIMIT,其中副本可能根据其索引选择更新一组不同的行,以及使用非确定性函数的语句,例如UUID(). 其他看似不确定的函数,例如NOW()RAND()与基于语句的复制兼容,因为在语句日志中写入了提示,以指示执行查询时主节点的系统时间和主节点的随机种子。