海量数据迁移方案

2,848 views
2,648 views

Published on

徐进挺(淘宝丁原)分享:海量数据迁移方案

Published in: Technology
2 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
2,848
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
81
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide

海量数据迁移方案

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

×