2010-06-11 62 views
2

我正在開發從db1(Oracle)到db2(Sybase)的內部ETL解決方案。我們需要增量傳輸數據(更改數據捕獲?)到db2。如何找出哪些記錄已經以有效的方式被刪除?

我只能讀取表的訪問權限,所以我無法在Oracle db1中創建任何表或觸發器。

我面臨的挑戰是,如何檢測Oracle中的記錄刪除?

我能想到的解決方案是使用額外的獨立/嵌入式數據庫(例如derby,h2等)。這個db包含2個表,即old_data,new_data。

old_data包含來自Oracle中感興趣的主鍵字段。

每次ETL進程運行時,new_data表將填充來自Oracle表的主鍵字段。在那之後,我將運行以下SQL命令來獲取刪除行:

SELECT old_data.id FROM old_data WHERE old_data.id NOT IN (SELECT new_data.id FROM new_data) 

我認爲這將是一個非常昂貴的操作,當數據量變得非常大。你有更好的想法嗎?

謝謝。

回答

4

哪個版本的Oracle?如果您有Enterprise Edition,請查看Oracle Streams。 可以搶出刪除重做日誌,而不是數據庫本身

+1

+1流更改數據捕獲絕對是源數據庫中最輕的接觸,但您必須對錶進行一次性更改以添加補充記錄。 – dpbradley 2010-06-11 11:21:10

+0

我不允許修改/添加源表。源數據庫的所有權屬於另一家公司。 – janetsmith 2010-06-14 00:46:00

0

一種是使用Oracle閃回功能,你可以採取(如果你使用9i的版本或更高版本)的方法:

http://forums.oracle.com/forums/thread.jspa?messageID=2608773

這將允許您從以前的數據庫狀態中進行選擇。

  • 存儲一行每個查詢的迭代次數:

    如果有可能並不總是被刪除的記錄,你可以通過更有效率。

  • 將該行數與前一行數進行比較。
  • 如果它們不同,您知道您有一個刪除,並且您必須將當前集與來自閃回的歷史數據集進行比較。如果沒有,那麼不要打擾,你已經節省了很多週期。

您的解決方案快速注意如果閃回是不是一種選擇:我不認爲你的選擇查詢是一個大問題 - 這是所有那些插入填充,將真正採取了很多的時間的邊桌。爲什麼不在更新之前僅針對sybase生產服務器運行該查詢?

+0

服務器之間的通信方向只是從Oracle到Sybase的一種方式。這是由於我客戶公司的某種安全政策。 – janetsmith 2010-06-11 04:45:58