MySQL 数据库表合并问题

2014-05-29 17:46:27 +08:00
 flowyi
我们之前的某块业务是表是分开的,
比如一个业务用两个表存数据,T_a 和 T_b。
现在需要把他们合并,他们的表结构是
T_a:
c1 c2
1 1
2 2
3 3

T_b:
c1 c3
1 11
2 22

合并之后的表:
T_c:
c1 c2 c3
1 1 0
2 2 0
3 3 0
1 0 11
2 0 22
即理论上简单的从a和b表select出来插入c就可以了,原来没有的字段留空(一般是0)
但是问题是不能停机太久,我们的数据量比较大(1kw量级),上面的方法我在测试环境发现
插入的时候耗时太久。请问各位有什么更好的方法或建议吗?
5373 次点击
所在节点    MySQL
8 条回复
Mac
2014-05-29 22:31:35 +08:00
INSERT INTO T_a (c1,c2,c3) SELECT c1,c2,c3 FROM T_b

哪个数据多就做主表,数据少的做来源,这样起码你省一半时间了吧。KW级的数据在你的环境里要INSERT多久?
Mac
2014-05-29 22:32:58 +08:00
先在T_a中增加一列c3,默认值0
然后再T_b中加入一列c2,默认值0
自己调整好字段顺序,使得两个表结构是一样的
INSERT INTO T_a (c1,c2,c3) SELECT c1,c2,c3 FROM T_b
然后更改T_a表名为T_c

哪个数据多就做主表,数据少的做来源,这样起码你省一半时间了吧。
pubby
2014-05-29 22:44:32 +08:00
@Mac 旧表新增一列其实也是表复制,kw级的也得很久
pubby
2014-05-29 22:57:11 +08:00
一、如果T_a T_b可以有较长时间停止数据更新
1. 修改业务代码,暂时停掉会导致T_a T_b更新的功能
2. 构建T_c
3. 直接切换到新业务代码使用T_c

二、如果T_a/T_b不能长时间停止写入
1. 写个触发器,记录T_a/T_b上的更新
2. 构建T_c
3. 停掉业务,把触发器收集到的更新记录还原到T_c上(量应该不会太大吧)
4. 切换到新业务代码使用T_c


以上只是随便想象,还需专业DBA来分析下
xifangczy
2014-05-29 23:36:16 +08:00
我有个想法,如果你测试环境和业务环境交换数据很快的话。
业务环境里开始做记录然后测试环境开始合并,合并完成后停机,把记录的数据更新到刚刚合并好的数据库上,测试完成上线。
czheo
2014-05-29 23:53:37 +08:00
start a slave mysql server on a remote machine(if no another machine is available, just start another mysql on the local machine as a slave)
1. slave> create slave.T_a both with c1, c2, c3
2. slave> replicate master.T_a -> slave.T_a
3. client> get offline for a short while. (to avoid any writing to master.T_a after you've done step 4)
4. slave> rename slave.T_a -> slave.T_b
5. client> redirect operations of master.T_a -> slave.T_b and get online
6. slave> replicate master.T_b -> slave.T_b
7. client> redirect operations of master.T_b -> slave.T_b

slave.T_b will be what you referred as T_c
czheo
2014-05-29 23:55:23 +08:00
1. slave> create slave.T_a with column c1, c2, c3
flowyi
2014-05-30 17:06:00 +08:00
@Mac
@pubby
@xifangczy
@czheo

感谢各位的idea,都很有想法。
我目前的想法是分别把T_a和T_b用 "mysqldump --tab" 整个表dump出来,然后用
"mysqlimport --columns=column_list"的方式导入T_c,测试比insert快了很多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX