海量数据迁移方案
DESCRIPTION
徐进挺(淘宝丁原)分享:海量数据迁移方案TRANSCRIPT
1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例
大纲
场景:
表太“大”
业务架构调整,数据需要重新分布
场景是什么
enq: HW - contentionenq: TX - row lock contentionenq: TX - index contention
需求:表需要从 1个库迁移到另外的库中迁移对应关系可能是 1->1, 1->N, N->1,N->M源,目标端环境可能是: Oracle <-> oracle, Oracle <-> mysql, Oracle <-> nosql
目标:
确保数据的完整性。
尽量减少对业务的影响,尽量控制停机时间。
业务可接受的时间, 0分钟, 1分钟, 10分钟, 1小时,1天?
数据量大小, 10G, 50G, 100G, 200G, 1T?
注:
把迁移分成全量迁移,增量迁移两个步骤。
目标是什么
1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例
大纲
1.Exp/imp/expdp/impdp2.Insert into table select * from [email protected] * from table into outfile/load data(mysql)4.Extent->rowid5.Mv refresh6.Sqluldr/load data( http://www.anysql.net/software/sqluldr.zip)
7.Rowid(pkid)/procedure8.Perl9.Tddl数据层
全量迁移
使用过哪些方案
选择简单,高效,高可靠性的方案
场景:
2.Insert into table select * from [email protected]风险点:
1.ora-01555错误2. 迁移过程出错,回滚会非常缓慢
全量迁移的风险点
全量迁移:建议化整为零分片迁移
Rowid:8i之前 rowid结构:
8i之后 rowid结构:
Segment:
通过 extent为粒度来迁移,来手动并行迁移?
化整为零之 extent方案
File# Block# Row#
data_object_id# File# Block# Row#
1 Segment N extent N*N Block N*N*N rowid
抽取每个分区:insert into my_rowid(id,rowid_min,rowid_max,has_deal)select rownum,dbms_rowid.rowid_create(1,o.data_object_id,e.relative_fno,e.block_id,0),dbms_rowid.rowid_create(1,o.data_object_id,e.relative_fno,e.block_id+e.blocks-1
,10000),0from dba_extents e,dba_objects owhere e.segment_name=upper('test_table') and e.owner='db1' and o.object_name = upper('test_table') and o.owner='db1';
化整为零之 extent方案
根据分区同步数据:for c in (select id, rowid_min, rowid_max from my_rowid where has_deal = 0
and mod(id, p_number) = p_now)loopinsert into test_table select /*+ rowid(t) */* from test_table@dblink_db1 twhere rowid >= chartorowid(c.rowid_min) and rowid <=
chartorowid(c.rowid_max);
化整为零之 extent方案
1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例
大纲
1.created_date,modified_date字段设计2. Mv refresh3. Trigger/procedure4.Dbsync复制中心: redo log, binlog解析5.Tddl复制中心6.Perl
增量迁移
备注:每个表必须要有创建时间和修改时间两个字段
问题:如果迁移过程中,需要加上业务处理逻辑,哪种方式更容易满足呢?
trigger/procedure
dbsync
HDFS
Dbsync client/server
Oracle server(备库)/Dbsync client
Oracle server 主库
1. Rowid and other info
2.Query data
3.DFS Write
HDFS
Dbsync client/server
mysql server
2.Query data
3.DFS Write
1.get binlog event
Tddl复制中心
1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例
大纲
场景:
1.Oracle的某一张迁移到mysql对应的表中2.Oracle的某一张表迁移到mysql对应的多张表(mysql分表)
常见思路:
1.sqluldr/load data2.Perl3.Tddl数据层复制
Oracle-my(no)sql
使用 sqluldr从 oracle导出数据 :Sqluldr user=${userpwd} query="${v_dw_sql}" quote='"' text=mysql file=$
{exp_file}
load data导入到mysql中 :LOAD DATA INFILE "${exp_file}"IGNOREINTO TABLE ${v_lake_tab}FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'${v_lake_col};
Sqluldr/load data
1.迁移的场景、目标决定方案了方案的选择2.全量,增量迁移常用方案可选方案很多,灵活使用,选择最简单,高效,可靠性
3.海量数据下全量迁移更倾向于 extent切分 +手动并行,增量主要采用 gmt_modified字段来判断,跨平台迁移主要通过 perl/tddl/sqluldr/dbsync来处理
小结