KingbaseES V8R6備份恢復案例之---sys_waldump解析wal日誌PITR恢復
案例說明:
復現使用者刪除表(drop table)誤操作,通過wal日誌解析找到誤操作時間點,執行基於時間點的恢復(PITR)。
適用版本: KingbaseES V8R6
一、模擬業務現場操作
1、檢視當前物件資訊
prod=# \d List of relations Schema | Name | Type | Owner --------+---------------------+-------+-------- public | dual | view | system public | sys_stat_statements | view | system public | t_centerprises | table | system public | t1 | table | system public | TB1 | table | system public | tb2 | table | system public | tbl_test | table | system (7 rows)
2、執行事務操作
prod=# select count(*) from t1; count ------- 10000 (1 row) prod=# insert into t1 values(generate_series(1001,2000),'usr'||generate_series(1001,2000)); INSERT 0 1000 prod=# select count(*) from t1; count ------- 11000 (1 row) # 當前wal對應lsn prod=# select sys_current_wal_lsn(); sys_current_wal_lsn --------------------- 0/3D000058 (1 row) prod=# insert into t1 values(generate_series(11001,20000),'usr'||generate_series(11001,20000)); INSERT 0 9000 prod=# select count(*) from t1; count ------- 20000 (1 row) # 檢視資料庫當前wal日誌檔案 prod=# select pg_current_wal_lsn(),pg_walfile_name(pg_current_wal_lsn()),pg_walfile_name_offset(pg_current_wal_lsn()); pg_current_wal_lsn | pg_walfile_name | pg_walfile_name_offset --------------------+--------------------------+----------------------------------- 0/3D0A5090 | 00000001000000000000003D | (00000001000000000000003D,675984) (1 row) # 使用者誤刪除表 prod=# drop table t1; DROP TABLE
二、檢視當前資料庫的物理備份
如下圖所示:以下是使用者誤操作時間點之前的物理備份。
三、sys_waldump解析wal日誌(檢視誤操作準確時間點)
Tips:
對於使用者的誤操作,要執行PITR的恢復,需要找到誤操作的準確時間點,在生產環境中,可以根據誤操作大概的時間點,對時間點前後的歸檔及線上日誌進行解析,本案例為了簡化操作,只解析了一個wal日誌。[kingbase@node102 sys_wal]$ /opt/Kingbase/ES/V8R6_C6/Server/bin/sys_waldump 00000001000000000000003D -s '0/3D000058'
1、Insert操作日誌解析
prod=# select oid,relname from sys_class where oid=16500; oid | relname -------+--------- 16500 | t1 (1 row)
2、更新pg_statistic系統表日誌
prod=# select oid,relname from sys_class where oid=2696 or oid=2619;
oid | relname
------+----------------------------------
2619 | pg_statistic
2696 | pg_statistic_relid_att_inh_index
(2 rows)
3、drop table日誌解析
# drop table 將清理系統表中物件的資訊
prod=# select oid,relname from sys_class where oid=2608;
oid | relname
------+-----------
2608 | pg_depend
(1 row)
=如上圖所示,從wal日誌中可以解析到‘drop table’事務commit的時間點,“COMMIT 2022-09-27 11:09:45.005736 CST”,可以以此時間點作為PITR恢復的時間點,來恢復使用者誤刪除的表。=
四、執行基於時間點(PITR)恢復
Tips:
對於生產環境可以異地恢復,在另外的例項執行PITR的恢復,將恢復出的資料,再匯入到生產例項中。本案例是從本例項恢復,需要將資料庫服務關閉。
1、關閉資料庫服務並備份資料庫檔案
[kingbase@node102 bin]$ ./sys_ctl stop -D /data/kingbase/v8r6_c6/data
[kingbase@node102 v8r6_c6]$ mv data data.bk
2、執行PIRT恢復
[kingbase@node102 bin]$ /opt/Kingbase/ES/V8R6_C6/Server/bin/sys_rman --config=/home/kingbase/kbbr7_repo/sys_rman.conf --stanza=king --type=time --target='2022-09-27 11:09:45' restore
.......
2022-09-27 13:34:05.234 P00 INFO: Restore Process: FILE: 2605 / 2605 100% SZIE: 105160230 bytes / 105160230 bytes 100.3MB / 100.3MB 100%
2022-09-27 13:34:05.239 P00 INFO: write updated /data/kingbase/v8r6_c6/data/kingbase.auto.conf
2022-09-27 13:34:05.244 P00 INFO: restore global/sys_control (performed last to ensure aborted restores cannot be started)
2022-09-27 13:34:05.245 P00 INFO: restore size = 100.3MB, file total = 2605
2022-09-27 13:34:05.246 P00 INFO: restore command end: completed successfully (2308ms)
3、檢視恢復後的資料
1)檢視kingbase.auto.conf配置
[kingbase@node102 data]$ cat kingbase.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
# Recovery settings generated by sys_rman restore on 2022-09-27 13:39:58
restore_command = '/opt/Kingbase/ES/V8R6_C6/KESRealPro/V008R006C006B0013/Server/bin/sys_rman --config=/home/kingbase/kbbr7_repo/sys_rman.conf --stanza=king archive-get %f "%p"'
recovery_target_time = '2022-09-27 11:09:45'
2)啟動資料庫服務[kingbase@node102 bin]$ ./sys_ctl start -D /data/kingbase/v8r6_c6/data
3)檢視sys_log日誌
4)檢視恢復後的資料
5)清理kingbase.auto.conf檔案後重啟資料庫
[kingbase@node102 bin]$ ./sys_ctl restart -D /data/kingbase/v8r6_c6/data
四、總結
對於歸檔模式的資料庫在資料庫備份及wal日誌(歸檔和線上)儲存完整的情況下,可以通過基於時間點的恢復操作,恢復使用者的誤操作丟失的資料。對於使用者誤操作的時間點,可以藉助wal日誌的解析獲取到準確的事務操作的時間點。