Mysql 使用pt online架构更改在从属数据库中添加列导致删除行

Mysql 使用pt online架构更改在从属数据库中添加列导致删除行,mysql,database,percona,Mysql,Database,Percona,我们希望在从属数据库中添加额外的列,以便在很少停机的情况下报告数据。因此,我们使用pt online schema change在从机上运行alter语句。在整个过程中,主数据库上有许多活动需要复制到从数据库 但是,这会中断复制,因为复制正在尝试更新从属服务器中不存在的行。然后我发现,对于一个表,在pt在线模式更改期间,大约50%的行没有从主服务器复制到从服务器。行的删除是随机的。在此操作之前,复制工作正常 从属进程中的另一个表比主进程多了一行,因为我猜一个delete事件没有在从属进程上正确持

我们希望在从属数据库中添加额外的列,以便在很少停机的情况下报告数据。因此,我们使用pt online schema change在从机上运行alter语句。在整个过程中,主数据库上有许多活动需要复制到从数据库

但是,这会中断复制,因为复制正在尝试更新从属服务器中不存在的行。然后我发现,对于一个表,在pt在线模式更改期间,大约50%的行没有从主服务器复制到从服务器。行的删除是随机的。在此操作之前,复制工作正常

从属进程中的另一个表比主进程多了一行,因为我猜一个delete事件没有在从属进程上正确持久化

我试图理解为什么在从机上运行pt在线模式更改不起作用。理论上应该如此。我需要设置哪些配置才能使其正常工作?或者只是不可能做到。令人惊讶的是,mysql复制会删除行而不会引发错误,直到对不存在的行进行更新

其他信息: 需要注意的是,我使用了一个非常高的临界负载值。当我没有指定该值时,pt online模式更改会由于线程\u偶尔运行高而终止

pt-online-schema-change --critical-load "Threads_running=1000" 

我还没有听说过pt online schema change无法复制50%的行的情况。与丢失数据相关的唯一错误是:这涉及到向包含重复值的列添加主键约束

无论如何,我不建议在从属服务器上的表中添加更多的列。如果语句或行事件的列数不相同,则可能导致复制以多种方式中断


我将在复制副本上创建第二个表,该表与复制表中的行进行1:1映射。将报告数据存储在第二个表中。

我认为如果从属数据库在表的末尾有额外的列,复制仍然可以工作。我知道列顺序很重要。如果我在slave上创建第二个表,我仍然需要将数据从一个表复制到另一个表,这就违背了首先创建slave的目的。从属服务器纯粹用于在每一行上存储额外的值。@benzhang,这是正确的,从属服务器上的额外列(或缺少的列,一个或另一个)在MySQL中是有效的配置,只要差异严格地位于表的右侧,并且,如果额外列,额外列可以为空。。。没有唯一键或外键是不同的,也没有在额外的列中涉及。@Michael sqlbot,但如果使用基于语句的复制,并且执行
插入到表值(…)
,或
插入到其他表选择*从表中选择,则仍然会导致问题,如果是这样的话。我应该提到这一点。基于语句的复制,糟糕。我们正在进行基于行的复制。我的主要问题是关于pt在线模式更改导致随机行被删除。我的高临界负载选项会让事情变得更糟吗?