`
Everyday都不同
  • 浏览: 725228 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

利用perl脚本实现跨服务器的数据转移

    博客分类:
  • perl
阅读更多
本人最近接到一个任务,要求利用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数据库
[color=red]$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;[/color]
#这三行必须添加,否则在跨服务器的数据转移中,中文会出现乱码哦!
$dbh_203->do("SET character_set_client = 'utf8'");
$dbh_203->do("SET character_set_connection = 'utf8'");
$dbh_203->do("SET character_set_results= 'utf8'");

[color=red]$dbh_198=DBI->connect("$driver:database=$database_198;host=$host_198;port=$port_198;user=$user_198;password=$passwd_199")[/color]
	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
	[color=red]my $select_198=$dbh_198->prepare[/color]("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_id	cpId,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");
	[color=blue]$select_198->execute();[/color]
	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(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		
		[color=blue]$sth_203=$dbh_203->prepare_cached($sql_198);[/color]
		[color=brown]$sth_203->bind_param(1,$row->{'msgId'});[/color]
		$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'});
		
		[color=blue]$sth_203->execute();
		$sth_203->finish();[/color]
	}
}


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


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

相关推荐

    机器监控脚本q.s

    3. **Perl脚本**:擅长文本处理,适用于日志文件分析等场景。 4. **Cron作业**:用于定时执行脚本,是实现自动化监控的关键技术之一。 5. **Keepalived**:根据提供的部分内容链接,可以推测该脚本可能涉及使用...

    查看linux下dhcp服务器分配出去的IP地址及剩余IP地址.docx

    在使用这些方法时,需要注意的是,如果你的DHCP服务器配置了故障转移(DHCP Failover)或者使用了Omshell管理,那么分析可能更为复杂,因为这些特性会在`dhcpd.leases`文件中写入额外的数据。如果没有这些设置,一般...

    MySQL 5.7 MHA一主一从

    - **故障转移脚本**:通过指定的脚本来实现自动故障转移逻辑。 #### 4. 总结 MHA是实现MySQL高可用性的强大工具之一。它不仅提供了快速且可靠的方式来进行故障转移,还能保持数据一致性,同时具备易于部署和维护的...

    Solaris 10中文技术资料

    - **使用安全套接字层协议的Web服务器**:为了确保数据传输的安全性,可以利用 SSL/TLS 协议加密 Web 服务器与客户端之间的通信。 - **管理Web高速缓存服务器(任务列表)**: - **规划NCA**:在规划 Web 高速缓存...

    FTP to DB-开源

    FTP to DB利用Perl的文件处理和网络通信能力,实现与FTP服务器的连接、文件下载以及数据的读取和解析。 接下来,我们关注的是FTP to DB对数据库的支持。该工具支持两种广泛使用的开源数据库系统:PostgreSQL和MySQL...

    MySQL数据库集群+负载均衡(LVS)

    - 主LVS服务器、备用LVS服务器、Keepalived服务器以及MySQL Cluster的数据节点和SQL节点。 - 每个节点都应具有足够的硬件资源来支撑其任务。 2. **网络拓扑图** - 显示了所有服务器之间的连接方式和网络布局。 ...

    基于PHP的物流管理系统的设计与实现 (2005年)

    PHP是一种广泛使用的开源服务器端脚本语言,其语法借鉴了C、Java和Perl等语言,具有丰富的数据库支持功能,特别适合与MySQL等数据库系统的结合使用。PHP还具有良好的跨平台性,可以在多种操作系统上运行。文章提到了...

    mysql2pg-开源

    该工具由Perl编程语言编写,提供了一种高效且灵活的方法来处理这种迁移任务,使得在不同数据库系统间的数据转移变得更加便捷。 在MySQL与PostgreSQL之间进行数据迁移时,`mysql2pg`扮演了关键角色。MySQL是一种广泛...

    CuteFTP9简易汉化版

    了OpenPGP加密和Decryption-CuteFTP使用开源加密了OpenPGP技术加密数据之前发送到服务器或解密从服务器检索数据。了OpenPGP使用公钥和私钥。这允许您给别人你的公钥,它们可以使用加密一个文件。只有你能与你的私钥...

    Apache::AppSamurai-开源

    在Web服务器领域,Apache是最广泛使用的HTTP服务器之一,而mod_perl是Apache的一个模块,它允许Perl脚本直接在服务器端运行,提高了性能和灵活性。Apache::AppSamurai 利用mod_perl的强大功能,构建了一种机制,可以...

    liushuideng.zip_单片机开发_PHP-PERL_

    8. **PERL或PHP在单片机开发中的应用**:尽管这两个语言主要用于服务器端编程,但可能在这个项目中用于数据处理、测试脚本或者与单片机通信,如通过串口发送控制指令。 9. **串行通信**:如果涉及到PHP或PERL与51...

    Solaris系统管理指南:网络服务

    1. **Perl 5支持**:Solaris 10版本中包含了Perl 5语言,这为系统管理员提供了强大的脚本编写能力,可以用来自动化复杂的系统管理任务。Perl 5的引入不仅丰富了Solaris的编程环境,也解决了之前版本中可能存在的兼容...

    Link Monitor-开源

    LinkMon利用Perl的灵活性和强大的文本处理能力,实现了对网络链接状态的高效监测。 二、多链路监控 LinkMon的核心功能是对多条网络链路进行实时监控,它可以检测链路的连通性、速度、丢包率等关键性能指标。这种...

    mod_epp for Apache 2-开源

    `mod_epp`模块使得Apache 2服务器能够处理EPP协议的请求,这意味着你可以利用Apache 2的CGI(Common Gateway Interface)机制来实现一个EPP服务器。CGI是一种通用接口,允许Web服务器调用外部程序来生成动态内容。...

    MYSQL 5.7 MHA(GTID+ROW)部署

    MHA是由日本MySQL专家Yoshinori Matsunobu用Perl编写的管理工具,旨在确保主库的高可用性,并提供自动故障转移和从库提升的功能。 ### MHA的基本概念 MHA的主要目标是维护MySQL复制环境中主库的高可用性。当主库...

    apache免安装版本

    Apache HTTP Server是一款广泛应用的开源Web服务器,以其稳定性、可扩展性和灵活性著称。"apache免安装版本"是指不需要经过传统安装...理解其基本结构、配置方法及管理技巧,将有助于更高效地利用这一强大的Web服务器。

    asterisk AMI programs

    在Asterisk AMI中,开发者通常会使用Python、Perl或C等语言通过socket连接到Asterisk服务器,实现对Asterisk的远程控制。 3. **Event处理**:Asterisk的Event机制允许系统广播其状态变化。例如,当有新呼叫到来时,...

    基于负载均衡的在线OJ实战项目

    这涉及到测试数据的生成、执行和结果分析,通常会用到脚本语言如Python或Perl来编写自动化测试脚本。 7. **安全性考虑**:为了防止恶意攻击,如DDoS或SQL注入,需要在负载均衡器和服务器端都设置相应的防护机制。...

    核心JSP (英文)

    最早的Web应用使用的是通用网关接口(CGI)机制及一系列服务器端脚本,这些脚本通常用Perl编写,有时也会用C、Python、PHP或其他语言。然而,这种方法存在多个问题: 1. **可扩展性差**:每接收到一次Web请求就会...

Global site tag (gtag.js) - Google Analytics