2014-09-02 58 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

相關問題