本人最近接到一个任务,要求利用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定时任务中定时执行.
分享到:
相关推荐
3. **Perl脚本**:擅长文本处理,适用于日志文件分析等场景。 4. **Cron作业**:用于定时执行脚本,是实现自动化监控的关键技术之一。 5. **Keepalived**:根据提供的部分内容链接,可以推测该脚本可能涉及使用...
在使用这些方法时,需要注意的是,如果你的DHCP服务器配置了故障转移(DHCP Failover)或者使用了Omshell管理,那么分析可能更为复杂,因为这些特性会在`dhcpd.leases`文件中写入额外的数据。如果没有这些设置,一般...
- **故障转移脚本**:通过指定的脚本来实现自动故障转移逻辑。 #### 4. 总结 MHA是实现MySQL高可用性的强大工具之一。它不仅提供了快速且可靠的方式来进行故障转移,还能保持数据一致性,同时具备易于部署和维护的...
- **使用安全套接字层协议的Web服务器**:为了确保数据传输的安全性,可以利用 SSL/TLS 协议加密 Web 服务器与客户端之间的通信。 - **管理Web高速缓存服务器(任务列表)**: - **规划NCA**:在规划 Web 高速缓存...
FTP to DB利用Perl的文件处理和网络通信能力,实现与FTP服务器的连接、文件下载以及数据的读取和解析。 接下来,我们关注的是FTP to DB对数据库的支持。该工具支持两种广泛使用的开源数据库系统:PostgreSQL和MySQL...
- 主LVS服务器、备用LVS服务器、Keepalived服务器以及MySQL Cluster的数据节点和SQL节点。 - 每个节点都应具有足够的硬件资源来支撑其任务。 2. **网络拓扑图** - 显示了所有服务器之间的连接方式和网络布局。 ...
PHP是一种广泛使用的开源服务器端脚本语言,其语法借鉴了C、Java和Perl等语言,具有丰富的数据库支持功能,特别适合与MySQL等数据库系统的结合使用。PHP还具有良好的跨平台性,可以在多种操作系统上运行。文章提到了...
该工具由Perl编程语言编写,提供了一种高效且灵活的方法来处理这种迁移任务,使得在不同数据库系统间的数据转移变得更加便捷。 在MySQL与PostgreSQL之间进行数据迁移时,`mysql2pg`扮演了关键角色。MySQL是一种广泛...
了OpenPGP加密和Decryption-CuteFTP使用开源加密了OpenPGP技术加密数据之前发送到服务器或解密从服务器检索数据。了OpenPGP使用公钥和私钥。这允许您给别人你的公钥,它们可以使用加密一个文件。只有你能与你的私钥...
在Web服务器领域,Apache是最广泛使用的HTTP服务器之一,而mod_perl是Apache的一个模块,它允许Perl脚本直接在服务器端运行,提高了性能和灵活性。Apache::AppSamurai 利用mod_perl的强大功能,构建了一种机制,可以...
8. **PERL或PHP在单片机开发中的应用**:尽管这两个语言主要用于服务器端编程,但可能在这个项目中用于数据处理、测试脚本或者与单片机通信,如通过串口发送控制指令。 9. **串行通信**:如果涉及到PHP或PERL与51...
1. **Perl 5支持**:Solaris 10版本中包含了Perl 5语言,这为系统管理员提供了强大的脚本编写能力,可以用来自动化复杂的系统管理任务。Perl 5的引入不仅丰富了Solaris的编程环境,也解决了之前版本中可能存在的兼容...
LinkMon利用Perl的灵活性和强大的文本处理能力,实现了对网络链接状态的高效监测。 二、多链路监控 LinkMon的核心功能是对多条网络链路进行实时监控,它可以检测链路的连通性、速度、丢包率等关键性能指标。这种...
`mod_epp`模块使得Apache 2服务器能够处理EPP协议的请求,这意味着你可以利用Apache 2的CGI(Common Gateway Interface)机制来实现一个EPP服务器。CGI是一种通用接口,允许Web服务器调用外部程序来生成动态内容。...
MHA是由日本MySQL专家Yoshinori Matsunobu用Perl编写的管理工具,旨在确保主库的高可用性,并提供自动故障转移和从库提升的功能。 ### MHA的基本概念 MHA的主要目标是维护MySQL复制环境中主库的高可用性。当主库...
Apache HTTP Server是一款广泛应用的开源Web服务器,以其稳定性、可扩展性和灵活性著称。"apache免安装版本"是指不需要经过传统安装...理解其基本结构、配置方法及管理技巧,将有助于更高效地利用这一强大的Web服务器。
在Asterisk AMI中,开发者通常会使用Python、Perl或C等语言通过socket连接到Asterisk服务器,实现对Asterisk的远程控制。 3. **Event处理**:Asterisk的Event机制允许系统广播其状态变化。例如,当有新呼叫到来时,...
这涉及到测试数据的生成、执行和结果分析,通常会用到脚本语言如Python或Perl来编写自动化测试脚本。 7. **安全性考虑**:为了防止恶意攻击,如DDoS或SQL注入,需要在负载均衡器和服务器端都设置相应的防护机制。...
最早的Web应用使用的是通用网关接口(CGI)机制及一系列服务器端脚本,这些脚本通常用Perl编写,有时也会用C、Python、PHP或其他语言。然而,这种方法存在多个问题: 1. **可扩展性差**:每接收到一次Web请求就会...