我们的Mysql(MariaDb)数据库中有两个非常大的表。Table_1对许多地图有很多支持。它有一个自动递增的主键和一个由两列组成的复合键。Table_2指的是Table_1的主键。我们不想在设计中修正这个明显的错误,
这些表有大约300米的行,表的大小范围是10 in。我们需要在大约6小时的服务窗口内进行这些更新。我正在研究如何有效地完成这个任务,并在一个复制数据库上进行试验。到目前为止,我还没有尝试用实际的数据运行任何东西,因为普通的脚本是不够的。我不是一个有经验的DB管理员。所以我需要一些光脱落来完成这件事。我的问题是,有效率地做这件事最好的方法/技巧是什么?
我已经尝试过的事情
我读过关于新的即时添加列特性的文章,但是我们的产品DB是在MariaDb版本10.0上的,这个版本更老了。
我遵循了这个答案中的建议,并在具有即时添加列支持的最新DB版本上运行了下面的脚本(Alter是即时的)。这张桌子有大约50m行(原表的六分之一)。它花了大约两个小时,这也排除了创建新的指数。因此,这是不够的。
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
发布于 2019-01-26 22:29:52
计划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;https://stackoverflow.com/questions/54322773
复制相似问题