数据库总共有
2T
数据,其他
1.8T
数据通过开并行等手段基本可以在
2
小时之内导
出完成,唯独此大字段表即使导出十几个小时也无法正常完成,所以首先我们要尝
试解决并行的问题,通过一定的手段使大字段表的导出能够并发进行。
既然并行参数
parallel
对大字段表是无效的,在不改变表结构及数据的情况下,我
们可以尝试将表从逻辑上拆分成一个一个的小单位,每个小单位拉起一个导出进程,
这样就可实现大字段表的并行导出操作。
那如何逻辑拆分大字段表呢?如果表上有日期字段,我们可以按日期字段拆分表,
再如表上有区域字段,我们也可以按区域字段做拆分,即使没有特别明显的可以区
分数据的字段,我们也可以按
rowid
去做拆分。
其实按
rowid
去做拆分是一个很好的方式,因为
oracle
做数据插入时是无序插入的
(
同一时刻多个进程对同一张表做插入,数据可能存放在不同的数据块上,并不是一
个数据块使用完之后,再插入新的数据块
)
,但了解
oracle
存储结构的会知道,如果
我们不管数据的组成,
rowid(rowid
是由对象编号
+
文件号
+
数据块编号
+
行号组成
)
其
实是有序的,我们如果按
rowid
有序的去做拆分,就可以尽量少读数据块
(
相较于索
引扫描及全表扫
)
,从而提升整个导出效率。
准备工作:首先我们创建一张中间表,将表数据的
rowid
按顺序记录下来
(
全表扫有
序读取相邻的数据块
)
,方便之后做拆分
create table t_test_split as select /*+parallel(4)*/rowid sou_rowid,rownum rn,(select current_scn from
v$database) scn from t_test;
虽然合并迁移过程中业务子库是停业务不再读写的,但为了保证数据的一致性,我
们还是选择把数据库的
scn
号记录下来。例如在数据库不停机的情况下,你在搭建
OGG
环境初始化大字段表时,这里保存的
scn
号就非常有用了。
正式执行导出导入:源库拉起导出主进程,通过
rowid
将表拆分成一个一个的小单
元,每个小单元拉起一个独立子进程单独导出一部分表数据,子进程导出完成生成
一个标记文件用来标记子进程已导出完成。目标库拉起导入的主进程,监控导出的
评论