注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

lazydba

hello

 
 
 

日志

 
 

perl dbi table copy oracle to mysql  

2010-05-21 21:26:33|  分类: all about databa |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
并行是一个加快导数据速度的好方法,可以充分利用机器的处理能力。
1. select from ora_table可以用extents方式切割,一个进程处理一部分extent,多个进程可以同时运行。

2. 处理数据的进程可以充分利用多个cpu,字符串转义的处理和拼接mysql的批量insert语句需要不少cpu资源。
?? perl可以用fork生成多个进程, $degree是并行度:

??? for (my $t = 0; $t < $degree; $t ++) {
??????? if ($pid = fork()) {
??????????? #parent,
??????????? $slaves[$t] = $pid;
??????? } elsif (defined $pid) {
????????? ? #child 数据库连接要在每个子进程生成.
????????
??????? ??? my $from_db = &get_oracle_connection("tns", "user", "passwd");
??????????? my $to_db = &get_mysql_connection("ip", 3306, "user", "passwd");
???????????
??????????? my $start = int($t / $degree * $num_of_extents) + 1;
??????????? my $end = int(($t+1) / $degree * $num_of_extents) ;
???????????
??????????? my $extents = &get_extents_by_range($to_db, $start, $end);

??????????? for my $ext (@$extents) {
??????????????? my $rowid_min = $ext->[1];
??????????????? my $rowid_max = $ext->[2];

??????????????? &do_copy_by_extent($from_db, $to_db,
??????????????????? $from_owner, $table_name,
??????????????????? $to_owner, $to_table,
??????????????????? $str_sql_select, $str_sql_insert,
??????????????????? $rowid_min, $rowid_max);
??????????? }
??????????? $from_db->disconnect();
??????????? $to_db->disconnect();
??????????? exit;
??????? } else {
??????????? print "fork failed: $!\n";
??????? }

3. 写入mysql时可以多个进程并行写入。


附带一个取extents的语句,可以处理分区表和非分区表

select rownum rn,
??? dbms_rowid.rowid_create(1, data_object_id, relative_fno, block_id, 0) s,???????
??? dbms_rowid.rowid_create(1, data_object_id, relative_fno, block_id + blocks - 1, 10000) e?
from (
??? select extent_id,? relative_fno, block_id, blocks, nvl(partition_name, 'default') partition_name
??? from dba_extents where owner = upper(?)and segment_name = upper(?)) a,
??? (select nvl(subobject_name, 'default') subobject_name, data_object_id
??????? from dba_objects where? owner=upper(?)
??????? and? object_name = upper(?)) b
where a.partition_name = b.subobject_name.

查询的时候加上rowid hint

select /*+ rowid(t) */ * from ora_tab t where rowid >= chartorowid(?) and rowid <= chartorowid(?).


  评论这张
 
阅读(102)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017