2013-03-19 237 views
3

有沒有辦法在應用程序啓動H2數據庫之前檢查數據庫損壞?如果我發現數據已損壞,我想在應用程序啓動時從備份zip文件運行自動恢復。H2數據庫損壞

我不能通過連接數據庫來檢查它,因爲如果數據庫文件存在,即使它是空的,我仍然可以連接並生成默認表。

我也在考慮對數據庫中的每個表做一個select語句以確保它的工作。我沒有在H2數據庫中找到任何內置的sql函數來檢查數據損壞。

+0

還要考慮檢查'DatabaseMetaData'。 – trashgod 2013-03-19 16:58:30

+0

我發現那裏allTablesAreSelectable()應該可以檢查是否可以查詢所有表:) – Lubos 2013-03-19 23:04:18

回答

2

要檢查數據庫文件是否存在,如果該文件存在,你可以使用

if (new java.io.File(databaseFileName).exists()) { ... } 

,但數據庫已損壞,那麼通常你將無法連接到它(嘗試連接就會拋出一個例外)。這是我知道驗證它的最快方式。

數據庫文件存在,但沒有完全初始化的風險很小。如果是這樣的話,那麼一些表格就不存在了。驗證所有表的標準方法是使用DatabaseMetaData.getTables

但是,除非您使用某些危險功能(例如禁用事務日誌或禁用數據庫文件鎖定),否則如果使用最新版本的H2,數據庫不應該損壞。如果數據庫確實損壞,那麼這可能是您如何使用H2的一個問題,或者可能是H2本身的錯誤。向H2 Google Group發送包含詳細信息的郵件可能很有意義。

+0

實際上,有一個例外:如果我手動刪除數據庫文件的全部內容,不會拋出異常,但在下一個初始化新的空數據庫被創建 - 可能它的目的是這樣做...我的觀點是檢查數據庫結構是否正常。但總的來說,你是對的 - 通常會有數據庫損壞的異常。 – Lubos 2013-03-19 20:26:59

+0

只需提醒您,硬件也可能導致內存損壞或存儲空間不足。對數據庫進行完整性檢查非常有價值。 – 2015-07-03 16:48:23

+0

是的,H2確實使用校驗和。 – 2015-07-05 05:33:17