淘宝海量数据快速迁移实践


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

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 4 人已下载

下载pdf

pdf贡献者

prince_zyb

贡献于2012-02-27

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf