小编1st*_*job的帖子

使用perl dbi处理长时间运行的大型事务

我有一个大型事务,包括从数据库A获取大量数据,对这些数据进行一些操作,然后将操纵数据插入数据库B.我只有在数据库A中选择的权限,但我可以创建表和在数据库B中插入/更新等

操作和插入部分用perl编写,并且已经用于从其他数据源将数据加载到数据库B中,因此所需要的只是从数据库A获取必要的数据并使用它来初始化perl类.

我怎样才能这样做,以便在操作或插入过程中发生任何错误(数据库断开,由于无效值导致的类初始化问题,硬盘故障等)时,我可以轻松跟踪并从错误发生的位置进行检索. .)?一次性完成事务似乎不是一个好的选择,因为来自数据库A的数据量意味着数据操作和插入数据库B需要至少一天或2天.

来自数据库A的数据可以使用唯一键分组到大约1000个组中,每个键包含1000个行.我认为我能做的一种方法是编写一个每组提交的脚本,这意味着我必须跟踪哪个组已经插入到数据库B中.我能想到的唯一方法是跟踪哪些组的进度是否处理过或者是在日志文件中还是在数据库B中的表中.我认为可以工作的第二种方法是转储加载类以进行操作和插入到flatfile所需的所有必要字段,读取文件以进行初始化这些类并插入到数据库B中.这也意味着我必须进行一些日志记录,但如果发生任何错误,应将其缩小到flatfile中的确切行.该脚本将如下所示:

use strict;
use warnings;
use DBI;

#connect to database A
my $dbh = DBI->connect('dbi:oracle:my_db', $user, $password, { RaiseError => 1, AutoCommit => 0 });

#statement to get data based on group unique key
my $sth = $dbh->prepare($my_sql);

my @groups; #I have a list of this already

open my $fh, '>>', 'my_logfile' or die "can't open logfile $!";

eval {
    foreach my $g (@groups){
        #subroutine to check if group has already been processed, either from log …
Run Code Online (Sandbox Code Playgroud)

sql database perl dbi

5
推荐指数
1
解决办法
511
查看次数

标签 统计

database ×1

dbi ×1

perl ×1

sql ×1