【问题标题】:add column in slave db using pt-online-schema-change caused dropped rows使用 pt-online-schema-change 在从属数据库中添加列导致删除的行
【发布时间】:2014-08-28 19:27:35
【问题描述】:

我们想在从属数据库中添加额外的列,以实现数据报告的目的,同时减少停机时间。所以我们使用 pt-online-schema-change 在从站上运行 alter 语句。在整个过程中,主数据库上有很多活动应该复制到从数据库。

但是,这破坏了复制,因为复制试图更新从属服务器中不存在的行。然后我发现对于一个表,在 pt-online-schema-change 期间,大约 50% 的行没有从 master 复制到 slave。行的删除是随机的。在此操作之前,复制工作正常。

slave 中的另一个表也经历了这个过程,比 master 多了一个行,因为我猜一个删除事件没有在 slave 上正确持久化。

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

附加信息: 需要注意的是,我使用了非常高的临界负载值。当我没有指定时,pt-online-schema-change 由于threads_running 偶尔运行高而死。

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

【问题讨论】:

    标签: mysql database percona


    【解决方案1】:

    我还没有听说过 pt-online-schema-change 无法复制 50% 的行的情况。与丢失数据相关的唯一错误是:https://bugs.launchpad.net/percona-toolkit/+bug/1246754,它涉及向包含重复值的列添加主键约束。

    恕我直言,无论如何我都不建议在从属上的表中添加更多列。如果语句或行事件的列数不同,它可能会导致复制以多种方式中断。

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

    【讨论】:

    • 我认为如果从数据库在表的末尾有额外的列,复制仍然可以工作。我知道列顺序很重要。如果我在从站上创建第二个表,我仍然需要将数据从一个表复制到另一个表,这首先破坏了拥有从站的目的。从站纯粹用于在每一行上存储额外的值。
    • @benzhang,没错,slave 上的额外列(或缺失列,一个或另一个)是 MySQL 中的有效配置,只要差异严格在表的右侧,并且,如果有额外的列,则额外的列可以为空......并且没有唯一或外键不同,或涉及额外的列。
    • @Michael-sqlbot,但是如果您使用基于语句的复制并且执行INSERT INTO table VALUES (...)INSERT INTO othertable SELECT * FROM table 之类的操作,这仍然会导致问题
    • @BillKarwin,真的。我应该提到这一点。基于语句的复制,太糟糕了。
    • 我们正在进行基于行的复制。我的主要问题是关于 pt-online-schema-change 导致随机行被丢弃。我的非常高的临界负载选项会让事情变得更糟吗?
    猜你喜欢
    • 2020-02-13
    • 2014-06-15
    • 2012-01-15
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多