【问题标题】:How to alter and update large table to add composite key columns form another table如何更改和更新大表以从另一个表中添加复合键列
【发布时间】:2019-01-23 08:21:23
【问题描述】:

我们的 Mysql(MariaDb) 数据库中有两个非常大的表。 Table_1 包含多对多映射。它有一个自动递增的主键和一个由两列组成的复合键。 Table_2 是指 Table_1 的主键。我们不想修复这个明显的设计错误,

  1. 在 Table_1 上使用复合主键
  2. 将两列添加到 Table_2
  3. 通过从 Table_1 复制数据来填充 Table_2 中的复合键,并在其上创建索引。
  4. 最好从两个表中删除自动递增的键列。

这些表有 ~300M 行,表的大小约为 10GB。我们需要在约 6 小时的服务窗口内进行这些更新。 我正在研究如何有效地做到这一点并在副本数据库上进行试验。到目前为止,我还没有尝试使用实际数据运行任何东西,因为普通脚本是不够的。 我不是经验丰富的数据库管理员。所以我需要一些光来完成这件事。 我的问题是什么是有效地做到这一点的最佳方法/技巧?

到目前为止我尝试过的事情

我了解了新的instant add column 功能,但我们的生产数据库使用的是较旧的 MariaDb 版本 10.0。

我已遵循this answer 中的建议,并在具有即时添加列支持的最新数据库版本上运行以下脚本(Alter 表是即时的)。该表有约 50M 行(原始的 1/6)。大约花了两个小时,这还不包括创建新索引。因此,这还不够。

SET join_buffer_size = 4 * 50 * 1024 * 1024; -- 50M keys of 4 bytes each
SET optimizer_switch='mrr=on,mrr_cost_based=off,mrr_sort_keys=on,optimize_join_buffer_size=on';
SET join_cache_level = 8;

UPDATE TABLE_2
        JOIN  TABLE_1 ON TABLE_1_Id = TABLE_2_FKT1_Id 
SET 
    TABLE_2_KeyPart_1 = TABLE_1_KeyPart_1,
    TABLE_2_KeyPart_2 = TABLE_1_KeyPart_2

也在考虑评估这个工具 https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html

【问题讨论】:

标签: mysql mariadb alter-table


【解决方案1】:

A 计划:使用 Percona 的工具:pt-online-schema-change

B 计划:使用竞争产品:gh-ost

C 计划:不要使用UPDATE,那是杀手锏。相反,以直接的方式重建表,然后使用RENAME TABLE 将新版本交换到位。

分区不太可能有任何帮助。 Daniel 的链接有助于完成冗长的 UPDATE,但需要权衡时间(需要更长的时间)与侵入性(这不是问题,因为您有维护窗口)。

计划 C 的更多细节(我更喜欢 this 案例):

CREATE TABLE(s) ... -- with new names, and all the new features except secondary indexes
INSERT INTO new SELECT ... FROM old table(s)
RENAME TABLE real1 TO old1,
             new1 TO real1,
             real2 TO old2,
             new2 TO real2;
test -- you still undo the RENAME if necessary
DROP TABLE old1, old2;

【讨论】:

  • 感谢您的建议!是的,如果可能的话,我们希望在没有外部工具的情况下做到这一点。所以我将从 C 计划开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多