
備份這件事,就算你平時做得再勤快,要是不去做「演練和驗收」的話,很多時候往往僅僅只是個心理安慰罷了:
你以為你能恢復。那咱們做維運交付,真正能拿得出手的東西,到底應該是什麼呢?其實應該是一套能複製、能落地的閉環:
要是失敗了的話該怎麼回滾或者重新來過(這些在預案裡面得寫得清清楚楚),這篇文章是《備份與復原實戰》系列的最後一篇,那麼我會直接給大家拿出一套「拿來就能用」的模板:包含演練劇本、驗收清單、處置流程圖還有常見問題排查,你可以把它當成演練腳本來用,或者說當成維運交付的架構支撐也是沒問題的。 
@[toc]
做演練的時候,最怕的就是有兩件事沒說清楚:
所以這部分,我就直接給出一個標準模板了(大家可以直接複製過去填空):
項目值(示例)演練對象backup_lab演練方式恢復到新資料庫 backup_lab_drill事故類型誤刪表(DROP TABLE backup_demo.t_order)恢復策略歸檔格式邏輯備份 + sys_restore 精準恢復目標指標RPO ≤ 24h,RTO ≤ 30min(示例)驗收標準物件齊全、列數一致、關鍵彙總一致回滾策略演練在新資料庫,不影響原庫;失敗可重做#### 1.1 角色分工(把「誰來做」寫清楚,預案才可交付)
角色主要職責交付物DBA/資料庫維運執行恢復、分析日誌、給出恢復點建議恢復操作記錄、恢復耗時、問題清單系統維運服務啟停、目錄權限、磁碟空間、排程系統側日誌、磁碟/權限確認業務方/測試業務驗收、關鍵報表/介面驗證驗收結果、異常描述、簽字確認### 二、演練流程圖

那麼為了讓演練可以重複去做,還能重用,通常來說建議把「造資料—製造事故—驗收」這一套拆成腳本清單:
01_prepare_env.sql
02_business_increment.sql
03_incident_drop_table.sql
DROP TABLE backup_demo.t_order;04_acceptance_check.sql
05_cleanup.sql
backup_lab_drill 清理掉(這樣下次演練的時候還能接著用)演練做完以後,你「憑感覺說恢復用了 20 分鐘」,這其實沒什麼說服力。那更可靠一點的做法是什麼呢?也就是說,我們得邊演練邊做記錄。
時間點動作負責人證據(日誌/截圖)備註T0確認事故與恢復目標T1確認備份檔與可讀性sys_restore -l 輸出T2建立演練資料庫(隔離)SQL 執行記錄T3執行恢復恢復日誌檔T4執行驗收 SQL查詢結果截圖/日誌T5業務驗收通過業務簽字/記錄T6輸出演練報告與改進項報告文件### 四、演練劇本(按時間線寫,照做即可)
1)先確認備份檔是不是存在,而且大小合不合理(看個示例):
D:\KB_LAB\backup\logical\YYYYMMDD_HHMM_backup_lab_full.dump2)接著要先「列出歸檔內容」,確認一下這個備份集中,是不是真的包含了你要的目標物件:
cmd 體驗AI代碼助手 代碼解讀複製代碼cd /d D:\Tools\Kingbase\ES\Server\bin
sys_restore -l D:\KB_LAB\backup\logical\<dump>.dump > D:\KB_LAB\logs\<dump>.list.txt
3)準備一下演練的目標資料庫(建立一個新資料庫隔離開來):
cmd 體驗AI代碼助手 代碼解讀複製代碼cd /d D:\Tools\Kingbase\ES\Server\bin
ksql -U system -d kingbase -h 127.0.0.1 -p 54321
sql 體驗AI代碼助手 代碼解讀複製代碼DROP DATABASE IF EXISTS backup_lab_drill;
CREATE DATABASE backup_lab_drill WITH TEMPLATE = template0 ENCODING = 'UTF8';
4)把「演練的目標指標」(也就是 RPO/RTO)先定下來,並且記到本子上:
RPO/RTO 這兩個東西可不是喊喊口號就行的,它們得能被「備份頻率 + 實際恢復耗時 + 驗收結果」給撐得住才行。
接著用 sys_restore 把備份恢復到演練資料庫裡去:
cmd 體驗AI代碼助手 代碼解讀複製代碼sys_restore -h 127.0.0.1 -p 54321 -U system -d backup_lab_drill D:\KB_LAB\backup\logical\<dump>.dump
連上演練資料庫,然後我們去製造一個「誤刪表」的事故出來:
cmd 體驗AI代碼助手 代碼解讀複製代碼ksql -U system -d backup_lab_drill -h 127.0.0.1 -p 54321
sql 體驗AI代碼助手 代碼解讀複製代碼DROP TABLE backup_demo.t_order;
\dt backup_demo.*
從同一份備份集中,我們僅僅只恢復 t_order 這張表:
cmd 體驗AI代碼助手 代碼解讀複製代碼sys_restore -h 127.0.0.1 -p 54321 -U system -d backup_lab_drill -t backup_demo.t_order D:\KB_LAB\backup\logical\<dump>.dump
在 ksql 裡面執行下面的驗收項(這是個示例):
sql 體驗AI代碼助手 代碼解讀複製代碼\dt backup_demo.*
SELECT COUNT(*) AS account_cnt FROM backup_demo.t_account;
SELECT COUNT(*) AS order_cnt FROM backup_demo.t_order;
SELECT SUM(balance) AS total_balance FROM backup_demo.t_account;
如果你想讓驗收變得更「維運化」一點的話,我通常來說建議把驗收拆成三層來做:
那應該有什麼呢?其實是這些:
1)一份恢復操作的記錄(裡面有命令、路徑、耗時還有日誌)
2)一份驗收記錄(包含 SQL 結果、業務校驗、通過標準這些)
3)一份改進清單(比如自動化、監控、保留策略、權限規範這些東西)
驗收項驗收方法通過標準備份集可讀sys_restore -l能列出物件清單,無報錯目標資料庫可連線ksql -d backup_lab_drill連線成功資料表物件存在\dt backup_demo.*目標表存在列數一致COUNT(*)列數與預期一致關鍵彙總一致SUM/COUNT彙總結果一致恢復過程可追溯日誌檔/排程記錄有開始/結束時間與結果### 六、驗收的「高頻漏項」
很多時候恢復失敗,往往不只是因為「表沒回來」,而是「表雖然回來了,但是用起來感覺不對勁」。這裡就有 4 個常見的漏項:
1)索引還在不在(這會影響效能還有業務體驗)
2)約束或者外鍵還在不在(這會影響資料一致性)
3)序列對不對(這會影響自增主鍵寫入)
4)權限對不對(這會影響應用帳號去存取)
對應的最小檢查動作(看個示例):
sql 體驗AI代碼助手 代碼解讀複製代碼\di+ backup_demo.*
\d backup_demo.t_order
處理建議:
system)處理建議:
處理建議:
sys_restore -l,做個快速的可讀性檢查處理建議:
寫到這一篇的時候,其實你已經把「備份復原」從單純的操作層面,提升成「可交付能力」了:
回顧的時候也把問題的自動化還有監測部分包含進去了。這樣的話,《備份與復原實戰》這個系列的 7 篇文章,也就算是完成了一個大循環了。我們聊的東西,涉及到了入門級的邏輯備份、精確復原、物理備份、PITR、自動化,還有操作演練驗證這些方面。這幾乎就是維運場景裡面最常被用到,也是非常重要的一套能力集合了。要是大家還有什麼別的問題,其實可以在我這裡留言,或者私訊我也行。