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

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

我有一个生产系统,当主数据库崩溃时,它使用基于 MySQL 语句的复制进行热故障转移。运行版本 5.5 Percona。我必须使用基于语句的复制,原因是对于这个问题而言是不可变的。

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

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

答案1

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

出于这个问题的目的,我假设确实有令人信服的理由使用基于语句的日志记录¹,但通常不建议这样做,因为基于语句的日志记录相对脆弱。在任何具有灵活性的系统上不是要使用基于语句的日志记录,请不要使用它 - 使用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=ROW并启用log_slave_updatesmy.cnf从属服务器上(这会导致传入事件被重写到从属服务器的 binlog 中)。

...您就完成了。

无论主服务器的二进制日志格式如何,从服务器都会将其所有 DML 记录为基于行的事件。您实际上无需执行任何其他操作即可使从服务器也成为主服务器,因为每个启用二进制日志记录的 MySQL 服务器本质上都已经是主服务器 —— 它可能只是碰巧是主服务器而没有任何实际的从服务器。

主从任意组合均binlog_format有效除了对于配置为的主服务器ROW和配置为的从服务器STATEMENT(与您在此处执行的操作相反),因为虽然语句可以转换为行事件(毕竟它们会影响从服务器上的行),但反之则不然——如果您唯一知道的是实际更改的数据,则您无法确定更改行的特定语句。但对于您询问的应用程序,上述操作应该完全符合您的意图。

我还讨论了主从 binlog 格式的可能组合之间的相互作用这里,在 dba.stackexchange.com还有一些额外的细节。


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

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

相关内容