2014-09-02 57 views
-4

我有一个Perl代码,它连接数据库并扫描不同表中的数据。如果我失去连接,我会面临一个问题:它会回滚所有事务。我怎样才能使Perl脚本恢复连接,并从中断发生的地方开始进程?我可以使用Perl恢复连接或任何其他技术来启动中断发生的进程,如果可以的话,任何人都可以引导我执行这些步骤。我们如何才能使数据库在Perl脚本中可恢复

它实际上是需要的,因为我们有大量的数据,需要1周的时间来扫描所有的数据并插入到特定的表中,如果我们运行数据库离线备份,它会断开所有连接,并且无论发生什么事情都会回滚并需要从头开始再次运行。

我们可以提交交易,但是我们可以从中断发生的地方开始处理,所以我们不需要从头开始运行。

+1

数据库和perl本身不能做到这一点,你需要某种sql代理,它将为你保存sql会话。 – 2014-09-02 08:56:34

+3

也许我没有处理足够大小的数据,但是运行一个交易的一周,在此期间没有提交,听起来很疯狂。但也许别人会告诉我,这是正常的 – 2014-09-02 09:03:35

+0

@mpapec嘿谢谢你的回应如何我可以让SQL代理。请帮帮我。 – 2014-09-02 09:22:32

回答

0

依靠一个数据库连接持续打开一天是错误的方法。

一种可能的解决方案涉及:

1)连接到DB要建立DB句柄。使用无限循环和睡眠等待,直到你有一个好的数据库句柄。把它放到一个子程序中。

2)把为单个表的各个请求中的数据结构等的阵列 执行在分开的语句单独的查询在一个循环中( 检查是否DBH是每个单独的请求之前失效。清洁并且如果重新创建所述手柄使用子例程1)

使用“重做”语句处理EVAL块中的请求期间的故障以确保没有语句被跳过。

3)保持在内存或任何非SQL存储就像一个键/值存储(Redis的请求之间的数据)

4)计算任何需要计算 5)当你拥有所有数据的提交交易,做。

此解决方案假定您不关心阅读和提交之间的更改。如果这样做,则需要首先锁定受影响的表格。尽管如此,你可能不想锁定表格一周。

+0

任何人都可以告诉我,我应该使用检查点重新启动在这种情况下,如果是的话,请建议我如何能够实现... ..事先预先 – 2014-09-04 13:25:31

+0

其实我们插入巨大的数据的方法之一的问题。假设我已经提交了所有数据直到程序终止。因此,任何人都可以告诉我有什么方法可以确定我的程序在什么地方终止,以及如何从剩下的地方再次插入数据。 – 2014-09-04 17:09:21

相关问题