H2 數據庫中的備份恢復進階與鎖機制關鍵字

在 H2 數據庫的運維和併發控制場景中,備份恢復進階關鍵字提供了更靈活的數據安全保障方案,鎖機制關鍵字則能精準控制併發操作,避免數據衝突。這兩類關鍵字覆蓋了數據安全進階需求和高併發場景下的一致性保障,讓數據庫運行更可靠、可控。

一、備份恢復進階關鍵字

除了基礎的BACKUP和RESTORE,H2 還提供了增量備份、定時備份相關的關鍵字,以及SCRIPT、RUNSCRIPT等靈活的備份恢復方式,適配不同的運維場景。

1. 腳本備份與恢復(SCRIPT + RUNSCRIPT)

SCRIPT關鍵字能將數據庫結構和數據導出為 SQL 腳本,支持篩選表、指定導出範圍,比BACKUP更靈活,便於手動修改或跨數據庫遷移:

-- 導出所有表的結構和數據到SQL腳本
SCRIPT TO 'D:/h2/backup/full_backup.sql';

-- 僅導出users和orders表的結構(不含數據)
SCRIPT DROP TABLE, CREATE TABLE TO 'D:/h2/backup/structure_backup.sql' 
FROM users, orders;

-- 導出2024年之後的訂單數據(僅數據,不含表結構)
SCRIPT INSERT TO 'D:/h2/backup/orders_2024_data.sql'
FROM orders WHERE YEAR(order_time) >= 2024;

恢復時使用RUNSCRIPT執行 SQL 腳本,支持指定編碼和執行順序:

-- 執行SQL腳本恢復數據(指定UTF-8編碼)
RUNSCRIPT FROM 'D:/h2/backup/full_backup.sql' CHARSET 'UTF-8';

-- 先執行結構腳本,再執行數據腳本
RUNSCRIPT FROM 'D:/h2/backup/structure_backup.sql' THEN
FROM 'D:/h2/backup/orders_2024_data.sql';

2. 增量備份(BACKUP WITH DIFFERENTIAL)

WITH DIFFERENTIAL關鍵字實現增量備份,僅備份上次完整備份後變更的數據,減少備份時間和存儲佔用:

-- 先執行完整備份(基礎備份)
BACKUP DATABASE TO 'D:/h2/backup/full_backup.zip';

-- 後續執行增量備份(僅備份變更數據)
BACKUP DATABASE TO 'D:/h2/backup/incremental_backup_1.zip' WITH DIFFERENTIAL;
BACKUP DATABASE TO 'D:/h2/backup/incremental_backup_2.zip' WITH DIFFERENTIAL;

恢復時需先恢復完整備份,再按順序恢復增量備份:

-- 恢復基礎完整備份
RESTORE DATABASE FROM 'D:/h2/backup/full_backup.zip';
-- 恢復第一個增量備份
RESTORE DATABASE FROM 'D:/h2/backup/incremental_backup_1.zip';
-- 恢復第二個增量備份
RESTORE DATABASE FROM 'D:/h2/backup/incremental_backup_2.zip';

3. 定時備份(結合 SCHEDULE)

H2 支持通過SCHEDULE關鍵字設置定時備份任務,自動執行備份操作,無需手動觸發:

-- 每天凌晨2點執行完整備份
SCHEDULE BACKUP DATABASE TO 'D:/h2/backup/daily_full_backup_${TIMESTAMP}.zip'
EVERY 1 DAY STARTS '2024-01-01 02:00:00';

-- 每6小時執行一次增量備份
SCHEDULE BACKUP DATABASE TO 'D:/h2/backup/hourly_inc_backup_${TIMESTAMP}.zip'
WITH DIFFERENTIAL
EVERY 6 HOURS STARTS '2024-01-01 08:00:00';

${TIMESTAMP}會自動替換為備份時間戳,避免文件名衝突。查看定時任務用:

SELECT * FROM INFORMATION_SCHEMA.SCHEDULED_JOBS;

刪除定時任務用:

-- 根據任務ID刪除(從SCHEDULED_JOBS表查詢ID)
DROP SCHEDULE 1;

二、鎖機制相關關鍵字

H2 通過鎖機制控制併發操作,FOR UPDATE、SHARE MODE、LOCK TABLE等關鍵字能手動控制鎖的類型和範圍,避免併發更新衝突,保障數據一致性。

1. 行級鎖(FOR UPDATE)

FOR UPDATE在查詢時對符合條件的行加排他鎖,其他事務無法修改這些行,直到當前事務提交或回滾,適合 “查詢 - 修改” 的原子操作場景:

-- 開啓事務,查詢並鎖定用户ID=1的記錄
BEGIN;
SELECT * FROM users WHERE user_id = 1 FOR UPDATE;
-- 執行修改操作(其他事務修改該用户時會被阻塞)
UPDATE users SET balance = balance - 100 WHERE user_id = 1;
COMMIT;

若需鎖定所有符合條件的行(包括未提交的新增行),可加NOWAIT避免阻塞:

-- 鎖定時若無法獲取鎖,直接拋出異常,不阻塞
SELECT * FROM users WHERE user_id = 1 FOR UPDATE NOWAIT;

2. 共享鎖(SHARE MODE)

SHARE MODE加共享鎖,允許其他事務加共享鎖,但禁止加排他鎖(即其他事務可查詢,不可修改),適合只讀場景的併發控制:

-- 加共享鎖查詢訂單數據,其他事務可查詢但不可修改
BEGIN;
SELECT * FROM orders WHERE order_id = 1001 SHARE MODE;
-- 執行只讀操作(統計、展示等)
COMMIT;

3. 表級鎖(LOCK TABLE)

LOCK TABLE對整個表加鎖,分為排他鎖(EXCLUSIVE)和共享鎖(SHARE),適合批量操作或表結構修改場景:

-- 對orders表加排他鎖,禁止其他事務讀寫
LOCK TABLE orders IN EXCLUSIVE MODE;
-- 執行批量更新操作
UPDATE orders SET status = '已過期' WHERE order_time < '2023-01-01';
-- 釋放鎖(事務提交或回滾後自動釋放)
COMMIT;

-- 對products表加共享鎖,允許其他事務查詢,禁止修改
LOCK TABLE products IN SHARE MODE;
-- 執行統計操作
SELECT category_id, COUNT(*) FROM products GROUP BY category_id;
COMMIT;

4. 鎖超時設置(SET LOCK_TIMEOUT)

通過SET LOCK_TIMEOUT設置獲取鎖的超時時間,避免事務無限期阻塞:

-- 設置鎖超時時間為5秒,超時未獲取鎖則拋出異常
SET LOCK_TIMEOUT 5000;

BEGIN;
-- 若5秒內未獲取鎖,會拋出“鎖超時”異常
SELECT * FROM users WHERE user_id = 1 FOR UPDATE;
UPDATE users SET balance = balance + 200 WHERE user_id = 1;
COMMIT;

這些備份恢復進階關鍵字和鎖機制關鍵字,前者讓數據安全保障更靈活、自動化,適配不同的運維需求;後者讓併發控制更精準,避免數據衝突。在實際應用中,定時備份保障數據不丟失,增量備份提升運維效率,鎖機制則在高併發場景(如秒殺、轉賬)中守護數據一致性,讓 H2 數據庫在複雜運維和高併發場景中更可靠、更可控。