设为首页 收藏本站
查看: 915|回复: 0

[经验分享] 利用perl脚本实现跨服务器的数据转移

[复制链接]

尚未签到

发表于 2017-5-19 10:46:48 | 显示全部楼层 |阅读模式
本人最近接到一个任务,要求利用perl脚本实现数据的转移。因为之前是利用Spring定时任务做的,虽然也能实现,但是所占内存难以释放,现在要求改进。刚接到这个要求的时候,确实感觉困难重重——从大致了解perl语言,到跟mysql进行jdbc交互,一路走来真是不易啊!好了,废话不多说,现在把过程大致展现出来。
1.新建一个以.pl结尾的perl脚本文件。
2.前期引入:
use Benchmark;
use threads;
use DBI;
use LWP::UserAgent;
use Cwd;
use POSIX qw( strftime );
use Encode;
use utf8;

3.涉及到两个服务器数据库的连接参数:
my $driver="DBI:mysql";
my $database_203="xxxx"; my $database_198="xxxx";
my $user_203="xxxx"; my $user_199="xxxx";
my $passwd_203="xxxx#"; my $passwd_198="xxxx#";
my $host_203="xxxx"; my $host_198="xxxx";
my $port_203="xxxx"; my $port_198="xxxx";
my $dbh_203; my $dbh_198;
my $sth_203; my $sth_198;

4.动态表名
my $curMonth=strftime("%Y%m", localtime);my $tableName="mm_mo_sms_".$curMonth;

5.添加主线程和工作函数
sub main{
my $workThread = threads->create('work');
if(defined($workThread)) {
print("The app stops, id:".$workThread->tid()."\n");
$workThread->join;
}else{
print("The app start fail");
}
}
sub work{
#DB connection
#连接203数据库
$dbh_203=DBI->connect("$driver:database=$database_203;host=$host_203;port=$port_203;user=$user_203;password=$passwd_203")
or die "Connect failed……".DBI->errstr;

#这三行必须添加,否则在跨服务器的数据转移中,中文会出现乱码哦!
$dbh_203->do("SET character_set_client = 'utf8'");
$dbh_203->do("SET character_set_connection = 'utf8'");
$dbh_203->do("SET character_set_results= 'utf8'");
$dbh_198=DBI->connect("$driver:database=$database_198;host=$host_198;port=$port_198;user=$user_198;password=$passwd_199")
or die "Connect failed……".DBI->errstr;
$dbh_198->do("SET character_set_client = 'utf8'");
$dbh_198->do("SET character_set_connection = 'utf8'");
$dbh_198->do("SET character_set_results= 'utf8'");
doMo($dbh_198,$dbh_199,$dbh_203);
$dbh_198->disconnect();
$dbh_203->disconnect();
}

6.实现数据的转移(即把198服务器上面的数据select出来之后插入到203服务器的数据库上面):
my $sql_198;
sub doMo{
#198->203
my $select_198=$dbh_198->prepare("SELECT
msg_id msgId,tran_id tranId,mo_from moFrom,mo_to moTo,access_mode accessMode,sp_id spId,msg_fmt msgFmt,msg_content msgContent,link_id linkedId,
ip_address ipAddress,service_id serviceId,prov,city,cp_idcpId,cat_id catId,fee_id feeId,fee_cp feeCp,pd_id pdId,sub_id subId,
task_status taskStatus,mo_type moType,sync_status syncStatus,status,sync_time syncTime,sync_times syncTimes,sync_result syncResult,create_time createTime
FROM
mm.mm_mo_sms
WHERE create_time like '%2014-10-06%' ORDER BY create_time ASC");
$select_198->execute();
while(my $row=$select_198->fetchrow_hashref()) {
$sql_198="insert into ".$tableName."
(msg_id,tran_id,mo_from,mo_to,access_mode,sp_id,msg_fmt,msg_content,link_id,ip_address,service_id,prov,city,cp_id,cat_id,
fee_id,fee_cp,pd_id,sub_id,task_status,mo_type,sync_status,status,sync_time,sync_times,sync_result,create_time)
values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$sth_203=$dbh_203->prepare_cached($sql_198);
$sth_203->bind_param(1,$row->{'msgId'});
$sth_203->bind_param(2,$row->{'tranId'});
$sth_203->bind_param(3,$row->{'moFrom'});
$sth_203->bind_param(4,$row->{'moTo'});
$sth_203->bind_param(5,$row->{'accessMode'});
$sth_203->bind_param(6,$row->{'spId'});
$sth_203->bind_param(7,$row->{'msgFmt'});
$sth_203->bind_param(8,$row->{'msgContent'});
$sth_203->bind_param(9,$row->{'linkedId'});
$sth_203->bind_param(10,$row->{'ipAddress'});
$sth_203->bind_param(11,$row->{'serviceId'});
$sth_203->bind_param(12,$row->{'prov'});
$sth_203->bind_param(13,$row->{'city'});
$sth_203->bind_param(14,$row->{'cpId'});
$sth_203->bind_param(15,$row->{'catId'});
$sth_203->bind_param(16,$row->{'feeId'});
$sth_203->bind_param(17,$row->{'feeCp'});
$sth_203->bind_param(18,$row->{'pdId'});
$sth_203->bind_param(19,$row->{'subId'});
$sth_203->bind_param(20,$row->{'taskStatus'});
$sth_203->bind_param(21,$row->{'moType'});
$sth_203->bind_param(22,$row->{'syncStatus'});
$sth_203->bind_param(23,$row->{'status'});
$sth_203->bind_param(24,$row->{'syncTime'});
$sth_203->bind_param(25,$row->{'syncTimes'});
$sth_203->bind_param(26,$row->{'syncResult'});
$sth_203->bind_param(27,$row->{'createTime'});
$sth_203->execute();
$sth_203->finish();

}
}

注:这种写法有点类似于jdbc,不过它又具有自己的优势。比之jdbc更为灵活和简洁。
其中的要点有:
(1)DBI连接数据库;
(2)DBI的sql参数设置;
(3)遍历查询结果的语法

至此,执行该脚本,就可以实现数据的跨服务器转移了.可以进一步把它放在Linux定时任务中定时执行.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379022-1-1.html 上篇帖子: [Perl]向syslog写入自定义日志(Sys::Syslog) 下篇帖子: perl 处理 两个和两个以上list 模块 List-Compare
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表