我们的Mysql(MariaDb)数据库中有两个非常大的表。 Table_1拥有多对多地图。它具有一个自动递增的主键和一个两列的复合键。 表_2引用表_1的主键。我们不会通过以下方式解决设计中的明显错误
这些表有约300M行,表的大小约为10GB。我们需要在约6小时的服务时段内进行这些更新。 我正在研究如何有效地执行此操作,并在副本数据库上进行试用。到目前为止,我还没有尝试使用实际数据运行任何操作,因为普通脚本将不足。 我不是经验丰富的数据库管理员。所以我需要一些光才能完成这项工作。 我的问题是有效执行此操作的最佳方法/技巧是什么?
我了解了新的instant add column功能,但是我们的生产数据库使用的是MariaDb 10.0版本,该版本较旧。
我遵循了this answer中的建议,并在具有即时添加列支持(最新表为即时)的最新数据库版本下运行了脚本。该表有约5000万行(原始记录的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
答案 0 :(得分:1)
方案A:使用Percona的工具:pt-online-schema-change
。
方案B:使用竞争产品:gh-ost
。
计划C:不要使用UPDATE
,这是杀手.。而是直接重建表,然后使用RENAME TABLE
将新版本交换到位。
分区不可能以任何方式提供帮助。 Daniel的链接有助于完成冗长的UPDATE
,但要权衡时间(需要更长的时间)和侵入性(这不是问题,因为您有维护窗口)。
计划C中有更多详细信息(对于这种情况,我更喜欢):
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;