海量数据迁移方案

21
1 海量数据迁移方案 徐进挺 新浪围脖: tb 丁原 Mail:[email protected] 日期: 201104

Upload: orczhou

Post on 08-Jul-2015

2.519 views

Category:

Technology


4 download

DESCRIPTION

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

TRANSCRIPT

Page 1: 海量数据迁移方案

1

海量数据迁移方案

徐进挺新浪围脖: tb丁原Mail:[email protected]日期: 201104

Page 2: 海量数据迁移方案

1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例

大纲

Page 3: 海量数据迁移方案

场景:

表太“大”

业务架构调整,数据需要重新分布

场景是什么

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

Page 4: 海量数据迁移方案

目标:

确保数据的完整性。

尽量减少对业务的影响,尽量控制停机时间。

业务可接受的时间, 0分钟, 1分钟, 10分钟, 1小时,1天?

数据量大小, 10G, 50G, 100G, 200G, 1T?

注:

把迁移分成全量迁移,增量迁移两个步骤。

目标是什么

Page 5: 海量数据迁移方案

1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例

大纲

Page 6: 海量数据迁移方案

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数据层

全量迁移

Page 7: 海量数据迁移方案

使用过哪些方案

选择简单,高效,高可靠性的方案

Page 8: 海量数据迁移方案

场景:

2.Insert into table select * from [email protected]风险点:

1.ora-01555错误2. 迁移过程出错,回滚会非常缓慢

全量迁移的风险点

全量迁移:建议化整为零分片迁移

Page 9: 海量数据迁移方案

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

Page 10: 海量数据迁移方案

抽取每个分区: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方案

Page 11: 海量数据迁移方案

根据分区同步数据: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方案

Page 12: 海量数据迁移方案

1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例

大纲

Page 13: 海量数据迁移方案

1.created_date,modified_date字段设计2. Mv refresh3. Trigger/procedure4.Dbsync复制中心: redo log, binlog解析5.Tddl复制中心6.Perl

增量迁移

备注:每个表必须要有创建时间和修改时间两个字段

问题:如果迁移过程中,需要加上业务处理逻辑,哪种方式更容易满足呢?

Page 14: 海量数据迁移方案

trigger/procedure

Page 15: 海量数据迁移方案

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

Page 16: 海量数据迁移方案

Tddl复制中心

Page 17: 海量数据迁移方案

1.数据迁移的场景,目标是什么2.全量迁移常见方案3.增量迁移常见方案4.oracle->mysql简单案例

大纲

Page 18: 海量数据迁移方案

场景:

1.Oracle的某一张迁移到mysql对应的表中2.Oracle的某一张表迁移到mysql对应的多张表(mysql分表)

常见思路:

1.sqluldr/load data2.Perl3.Tddl数据层复制

Oracle-my(no)sql

Page 19: 海量数据迁移方案

使用 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

Page 20: 海量数据迁移方案

1.迁移的场景、目标决定方案了方案的选择2.全量,增量迁移常用方案可选方案很多,灵活使用,选择最简单,高效,可靠性

3.海量数据下全量迁移更倾向于 extent切分 +手动并行,增量主要采用 gmt_modified字段来判断,跨平台迁移主要通过 perl/tddl/sqluldr/dbsync来处理

小结

Page 21: 海量数据迁移方案