2011-05-16 76 views
1

在我嘗試從不同的edb數據庫集合中提取數據(轉儲和選擇性讀取列)時,我遇到了一個基本問題。我有一個edb數據庫與幾個日誌文件。我知道數據庫中有什麼信息,但我只提取了一半。我擔心剩下的一半會睡在日誌文件的某個地方。我假設EDB引擎知道日誌文件的位置,並在連接數據庫時自動加載它們(JET_paramSystemPath,JET_paramLogFilePath和JET_paramBaseName已正確設置)。這是一個錯誤的假設?如果是這樣,我應該怎麼做日誌加載?edb數據庫中的事務日誌文件

另外,是否有可能簡單地提交事務到EDB文件並擺脫日誌?

回答

2

如果有未提交的交易,那麼數據庫將被標記爲「不一致」。您可以使用ESENTUTL/MH對數據庫進行檢查。針對不一致的數據庫調用JetAttachDatabase將始終失敗。

因此,如果您的程序能夠附加並打開數據庫,那麼它是一致的。有兩種方法可以使數據庫保持一致:

  1. 清除關閉ESENT。
  2. 在JetInit時間使用日誌文件運行恢復。

JetInit做的第一件事就是查找由JET_paramLogFilePath和JET_paramBaseName指定的日誌文件。日誌文件包含它們引用的數據庫的完整路徑,然後將日誌文件中的事務提交到數據庫。因此,如果您正確設置系統參數,則ESEN​​T將在連接數據庫時加載日誌。另一方面,如果您沒有正確設置參數,那麼您的程序實際上可以在不需要恢復的數據庫上工作。 JetInit不會找到任何日誌文件,所以它不會執行任何操作,因爲數據庫是一致的,所以連接會成功。

另一個難點是日誌文件包含數據庫的完整路徑。這意味着如果您已複製/移動數據庫,則恢復將不起作用。從Windows Server 2003開始,您可以通過將JET_paramAlternateDatabaseRecoveryPath設置爲包含數據庫的目錄來處理此問題。

重要提示:爲了安全起見,您應該始終使用只讀標誌附加並打開數據庫。這將避免由於日誌文件設置錯誤而導致的任何問題。一個常見的問題是,只讀應用程序最終會在不同的目錄中創建一組日誌文件,以防止數據庫被正確恢復。

+0

謝謝你勞裏安。這非常有幫助! – fmotis 2011-05-19 12:25:48