在公司有一個項目,使用SQL2000作為中轉站,從來源資料庫伺服器(SQL2000) 更新資料到 目標資料庫伺服器(oracle 10g),使用連結資料庫,通過預存程序實現。使用作業定時執行預存程序,在運行了N久之後,突然發現一個作業無法正常執行,另一個則正常運行。很莫名。。。。
錯誤現象:執行時有時好,有時出錯,一般運行數次後就會出錯
錯誤提示多為:
執行使用者: sa。OLE DB 提供者 'SQLOLEDB' 報錯。提供者已用盡記憶體。 [SQLSTATE 42000](錯誤 7399) OLE DB 錯誤跟蹤[OLE/DB Provider 'SQLOLEDB' IRowset::GetNextRows returned 0x8007000e: 提供者已用盡記憶體。]。 [SQLSTATE 01000](錯誤 7300). 步驟失敗。
執行使用者: sa。OLE DB 提供者 'MSDAORA' 報錯。 [SQLSTATE 42000](錯誤 7399) [SQLSTATE 01000](錯誤 7312) OLE DB 錯誤跟蹤[OLE/DB Provider 'MSDAORA' IDBInitialize::Initialize returned 0x80004005: ]。 [SQLSTATE 01000](錯誤 7300). 步驟失敗。
在網上查詢了N久,只見問問題的,也偶爾見答問題的,但也許使用該方法的實屬少數,沒有一個立竿見影的解決方案。
因為找不到相關文檔,在嘗試了N久,N種方法來測試之後,都一一失敗
其中包括,修改註冊表使用不同的dll,修改查詢語句最佳化資料查詢,建VIEW,增加表主鍵等偏門的方法,均無效。
最後,在觀察預存程序運行過程,及比較兩個作業實現上的區別,
其中正常啟動並執行作業因為需要插入資料時做比較更新,使用暫存資料表,結合觸發器實現。
而另一個作業由於比較簡單,使用直接表資料插入。
然而,正是由於它的簡單,導致了莫名錯誤的出現。
目標表資料量巨大是罪魁禍首,使用批量查詢語句是否為幫凶,沒有經過測試,但即使插入空資料,使用批量插入語句也會使SQL載入海量資料,不知道原因。
解決方案:在oracle中使用暫存資料表,通過觸發器轉存資料,而後清空暫存資料表,沒有出現SQL伺服器載入海量資料,大量消耗記憶體的情況。