執行 H2 資料庫的匯出和備份
1. 概述
儘管 H2 資料庫最初是為記憶體環境設計的,但現在該引擎已支援輔助儲存甚至伺服器模式。因此,其應用場景也隨之增加,並催生了兩個密切相關的需求:創建可靠的備份以進行恢復,以及匯出資料以供檢查或重複使用。雖然兩者都涉及將資料移出資料庫,但它們的目的不同,依賴的機制也不同。不過,H2 可以直接在引擎內部透過 SQL 指令來滿足這些需求。這樣,即使進行維護,資料庫也能持續運作。
本教學將說明 H2 的備份和匯出機制。首先,我們將介紹備份和匯出操作的基本概念。之後,我們將了解備份方法,解釋為什麼複製資料庫檔案不可靠,以及內建命令在資料庫線上運行時如何運作。最後,我們將介紹基於 CSV 和 SQL 的導出方式,並簡要提及其他一些能夠自然融入 H2 工作流程的輔助技術。
2. H2備份與匯出概念
在深入探討細節之前,了解H2的備份和匯出有何不同至關重要。我們也會考慮環境和運作條件。
2.1. 備份和匯出
通常,備份會保留整個實例以供後續還原。以 H2 為例,這意味著建立一個包含所有資料表、所有已建立的索引和元資料的備份包。備份與特定時間點相關,主要用於資料遺失或環境重建等復原場景。
另一方面,導出通常側重於資料可攜性而非恢復。匯出的檔案通常採用文字格式,例如 CSV 檔案或 SQL 腳本。關鍵在於,匯出的資料通常僅包含特定的表或查詢結果。雖然我們可以利用匯出資料進行分析和部分遷移,但它們在內容方面很少能提供與完整備份相同的保障。例如,匯出資料可能僅包含部分錶,不包含元數據,或有其他限制。
2.2 在線運營
許多 H2 資料庫作為應用程式的一部分,以嵌入式模式持續運作。在這種情況下,即使資料正在讀寫,備份和匯出操作也應該能夠成功完成。
為此, H2引擎推薦的方法依賴透過常規資料庫連線執行的SQL命令。這樣,引擎本身就能確保資料一致性,而無需依賴無法感知內部狀態的外部文件操作。
3. 備份線上 H2 資料庫
對於可以接受停機時間的離線場景,乾淨地關閉資料庫然後複製檔案不失為一個可行的選擇。然而,這種方法通常僅適用於受控的維護窗口期,並不能真正取代持續運行系統中的線上備份。
由於不間斷運作在許多情況下至關重要,因此為目前正在使用的 H2 資料庫提供備份解決方案至關重要。
3.1. 資料庫檔案複製(不安全)
與其他資料庫引擎一樣,H2 通常將資料儲存在檔案中,因此複製這些檔案看似是一種簡單的備份方案。然而,當資料庫運行時,頁面可能正在更新。因此,在任何給定時刻複製文件都可能導致內部不一致,例如部分寫入的行或不匹配的表,具體取決於查詢。
另一個問題是長期可靠性。與標準化的語言和格式不同,H2引擎資料庫檔案可能會隨版本變化。因此,升級後資料庫檔案的單獨副本可能無法打開,這限制了其作為可靠備份的用途。
3.2. 使用BACKUP TO進行線上備份
為了避免離線備份並解決與資料庫檔案相關的問題,H2 提供了一個特殊命令。具體來說, BACKUP TO SQL 語句會建立一個 ZIP 歸檔文件,其中包含資料庫在給定時間點的一致快照,即使資料庫正在運行也是如此:
// JDBC-based online backup
String backupFile =
"backup-" + java.time.LocalDateTime.now()
.format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss"))
+ ".zip";
try (Connection con = DriverManager.getConnection(
"jdbc:h2:./db/mydb", "user", "password");
PreparedStatement ps =
con.prepareStatement("BACKUP TO '" + backupFile + "'")) {
ps.executeUpdate();
}
由於備份是由資料庫引擎執行的,因此避免了複製檔案系統物件所帶來的資料一致性風險。此外,我們既可以透過純 JDBC 執行此類命令,也可以使用 Spring Data 等框架透過原生查詢執行此類命令,從而使備份邏輯更接近應用程式程式碼。
4. 從 H2 匯出數據
反之,出口業務則更為靈活,因為它們通常沒有像備份那樣嚴格的要求。
4.1. 使用CSVWRITE匯出 CSV 文件
為了方便資料檢視或分享,H2 引擎支援CSVWRITE函數。它將 SQL 查詢結果直接寫入 CSV 文件,從而可以輕鬆地以廣泛支援的格式提取資料:
CALL CSVWRITE(
'<BACKUP_FILE_PATH>',
'SELECT * FROM <TABLE_NAME>'
);
在這種情況下,由於匯出語句是SELECT語句,因此它還可以包含篩選器、連接和排序。這使得CSVWRITE在報表產生、調試以及將資料子集傳輸到其他工具(例如電子表格或分析系統)方面特別有用。
重要的是,這種導出方式相當簡單,因為它主要處理數據,而沒有深入處理元數據。
4.2. 使用SCRIPT進行邏輯匯出
當需要同時取得模式和資料時,可以使用 H2 引擎指令SCRIPT將邏輯匯出為 SQL 語句。與其他產生 SQL 語句的工具一樣,這些輸出腳本可以在稍後執行時重新建立表格並插入資料:
SCRIPT SIMPLE TO '<BACKUP_SQL_SCRIPT_PATH>'
TABLE PUBLIC.<TABLE_NAME>;
與 CSV 匯出不同,SQL 腳本會保留結構資訊。因此,這種匯出方法通常有助於進行資料庫遷移、建立可複現的測試環境以及建立版本控制的資料庫狀態快照。例如,可以使用RUNSCRIPT還原由SCRIPT產生的 SQL 腳本,從而為開發或測試環境提供一個簡單的邏輯備份和復原循環。
5. 總結
在本文中,我們探討了備份或匯出 H2 資料庫中資料的方法。
總而言之,線上備份依賴BACKUP TO命令來產生一致且可恢復的歸檔文件,而無需停止資料庫。另一方面,資料匯出依賴CSVWRITE產生可移植的、查詢驅動的 CSV 文件,以及SCRIPT產生感知模式的 SQL 輸出。這些工具共同滿足了恢復、可移植性和檢查方面的需求,同時避免了直接複製文件帶來的風險。
總之,H2 為備份和匯出提供了內建的、引擎管理的機制。