首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改和更新大型表以将组合键列添加到另一个表中

如何修改和更新大型表以将组合键列添加到另一个表中
EN

Stack Overflow用户
提问于 2019-01-23 08:21:23
回答 1查看 290关注 0票数 2

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

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

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

我已经尝试过的事情

我读过关于新的即时添加列特性的文章,但是我们的产品DB是在MariaDb版本10.0上的,这个版本更老了。

我遵循了这个答案中的建议,并在具有即时添加列支持的最新DB版本上运行了下面的脚本(Alter是即时的)。这张桌子有大约50m行(原表的六分之一)。它花了大约两个小时,这也排除了创建新的指数。因此,这是不够的。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-26 22:29:52

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

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

C计划:不要使用UPDATE,那才是杀手。相反,以一种简单的方式重新构建表,然后使用RENAME TABLE将新版本替换到位。

分区在任何方面都不太可能有所帮助。Daniel的链接有助于执行冗长的UPDATE,但与入侵(这不是问题,因为您有一个维护窗口)相比,交换时间(它需要更长的时间)。

关于C计划的更多细节(我更喜欢这种情况):

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54322773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档