我们希望在从属数据库中添加额外的列,以实现数据报告目的,同时减少停机时间。因此,我们使用 pt-online-schema-change 在从属设备上运行 alter 语句。在整个过程中,主数据库上有很多事件应该复制到从数据库。
但是,这会破坏复制,因为复制正在尝试更新从属中不存在的行。然后我发现,对于一张表,在 pt-online-schema-change 期间,大约 50% 的行没有从 master 复制到从属。行的丢弃是随机的。在此操作之前,复制工作正常。
从属表中的另一个表也经历了该过程,它比主表多了一行,因为我猜删除事件在从属表上没有正确保留。
我试图理解为什么在从属设备上运行 pt-online-schema-change 不起作用。理论上应该如此。我需要设置哪些配置才能使其正常工作吗?或者只是不可能做到这一点。令人惊讶的是,mysql 复制会删除行而不会引发错误,直到对不存在的行进行更新为止。
其他信息: 需要注意的是,我使用了非常高的临界负载值。当我没有指定时,pt-online-schema-change会由于threads_running偶尔运行得很高而死掉。
pt-online-schema-change --critical-load "Threads_running=1000"
最佳答案
我还没有听说过 pt-online-schema-change 无法复制 50% 行的情况。与丢失数据相关的唯一错误是:https://bugs.launchpad.net/percona-toolkit/+bug/1246754这涉及到向包含重复值的列添加主键约束。
恕我直言,我不建议在从站上的表中添加更多列。如果语句或行事件没有相同的列数,可能会导致复制以多种方式中断。
我将在副本上创建第二个表,并与复制表中的行进行一对一映射。将您的报告数据存储在第二个表中。
关于mysql - 使用 pt-online-schema-change 在从属数据库中添加列导致删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25556551/