免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4011 | 回复: 11
打印 上一主题 下一主题

从DB2向MYSQL导数的脚本。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 13:38 |只看该作者 |倒序浏览
#!/usr/bin/perl
#############################################################################
use                strict;
use         DBI;
use         DBD::mysql;
use                DBD::DB2;
use                DBD::DB2::Constants;
####################
#建立连接
####################
my ($dsn,$dbh1,$dbh2);
my ($sth1, $sth2, $table1, $table2);
my $count;
########源机的
my $host = '10.28.24.22';
my $dbn = "EMDB";
my $user = "db2inst1";
my $pd = "db2inst1";
##DB2
$dsn = "dbi:DB2:$dbn";
while(!($dbh1=DBI->connect($dsn, $user, $pd))){};
$dbh1->{LongReadLen} = 1024 * 1024;
########目的机的(到2009-02-27日)
$host = '222.34.43.2';
$dbn = "ycdata";
$user = "zheng";
$pd = "44444";
##MySQL5
$dsn = "DBI:mysql:$dbn:$host";
while(!($dbh2=DBI->connect($dsn, $user, $pd))){};
$dbh2->do("SET NAMES gbk");        #能解决表类型为utf8的汉字问题(其实是标识SQL字集符集)
###################################################################################
###################################################################################
##        #库存表(业务)
$table1 = "EM.T_WH_BUSINESSINVENTORY";
$table2 = "t_em_businessinventory";
##找出 #1
$sth1 = $dbh1->prepare("SELECT * FROM $table1");
$sth1->execute || die "$DBI::errstr\n";
##删除 #2
$sth2 = $dbh2->prepare("TRUNCATE TABLE $table2");
$sth2->execute || die "$DBI::errstr\n";
##
eval {
$count=0;
while (my $refhash = $sth1->fetchrow_hashref())  {
if ($@) {
        next;
}
        $sth2 = $dbh2->prepare("INSERT INTO $table2 (ID,
                                                                                                WHID,
                                                                                                PRODUCTID,
                                                                                                PRODUCTCODE,
                                                                                                QUANT,
                                                                                                AMOUNT,
                                                                                                QUANTALLOCATED,
                                                                                                TAGRESERVED,
                                                                                                BUSINESSMONTH)
                                                                                VALUES (?,?,?,?,?,
                                                                                                ?,?,?,?)")
                                        || die $dbh2->errstr;
########
        $sth2->bind_param(1, $refhash->{'ID'} ,4);
        $sth2->bind_param(2, $refhash->{'WHID'} ,4);
        $sth2->bind_param(3, $refhash->{'PRODUCTID'} ,4);
        $sth2->bind_param(4, $refhash->{'PRODUCTCODE'} ,12);
        $sth2->bind_param(5, $refhash->{'QUANT'} ,4);
        $sth2->bind_param(6, $refhash->{'AMOUNT'} ,3);
        $sth2->bind_param(7, $refhash->{'QUANTALLOCATED'} ,4);
        $sth2->bind_param(8, $refhash->{'TAGRESERVED'} ,4);
        $sth2->bind_param(9, $refhash->{'BUSINESSMONTH'} ,9);
        if($sth2->execute)  {
                $sth2->finish();
                $count++;
        } else {
                print "表:$table2 插入KEY=$refhash->{'ID'}的行时失败\n";
                exit;
        }        #end if
}        #end while
};
print "表:$table2 已完成,成功导入:$count 条记录\n";
$sth1->finish();
###################################################################################
###################################################################################
$dbh1->disconnect();
$dbh2->disconnect();
print "全部完成\n";
sleep (5);
exit;


这样是可以导,但就是速度太慢,每条记录都要insert一下。有没有批量insert的优化方案?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-03-12 13:53 |只看该作者
原帖由 mohanmode 于 2009-3-12 13:38 发表
这样是可以导,但就是速度太慢,每条记录都要insert一下。有没有批量insert的优化方案?

这个要看数据库,和 Perl 无关。

论坛徽章:
0
3 [报告]
发表于 2009-03-12 14:41 |只看该作者
你看啊。现在是个循环,每条记录都是做一个insert,这个效率肯定就是不行。
我就是想能不能把每个记录一下子取出来一下子insert。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2009-03-12 14:46 |只看该作者
mysql 的 insert 语句支持一次性 insert 好几条记录的。
试试看,也许效率会高一些。
我以前搞 sybase 的时候,会用 bcp。

论坛徽章:
0
5 [报告]
发表于 2009-03-12 14:54 |只看该作者
对呀。就是楼上的意思。可是那个perl脚本怎么写呀。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-03-12 15:10 |只看该作者
原帖由 mohanmode 于 2009-3-12 14:54 发表
对呀。就是楼上的意思。可是那个perl脚本怎么写呀。

你需要啥 SQL 语句就生成啥语句呗。例如说 MySQL 支持一次 insert  N 条记录,那你就先 fetch N 条记录,生成对应的 SQL 语句,执行就完了。

论坛徽章:
0
7 [报告]
发表于 2009-03-12 16:21 |只看该作者

回复 #6 MMMIX 的帖子

最重要的是,在我顶楼的贴子的脚本上怎么修改呢?

论坛徽章:
0
8 [报告]
发表于 2009-03-12 16:21 |只看该作者
用那个什么 。。。 Transactions?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2009-03-12 16:22 |只看该作者
原帖由 mohanmode 于 2009-3-12 16:21 发表
最重要的是,在我顶楼的贴子的脚本上怎么修改呢?

敢情你是不会 Perl 呀?这我可帮不了你。或者说你是不知道对应的 SQL 要怎么写?这我同样帮不了你。

论坛徽章:
0
10 [报告]
发表于 2009-03-12 20:03 |只看该作者

回复 #7 mohanmode 的帖子

mysql supports multiple insert like this SQL query:

INSERT INTO <table> VALUES (<values 1>), (<values 2>), ..., (<values N>);

read whole values from DB2 and convert it to above SQL statement and last do insert only once.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP