いざ復旧という場面で、履歴に載っているはずのバックアップから戻せないことがあります。
SQL2542N No match for a database image file was found based on the source
database alias "SAMPLE" and timestamp "20260731105649" provided.
SQL2542N は指定したタイムスタンプのイメージがその場所に無いという意味です。db2 list history にエントリが残っていても、Db2はファイルの所在を追いません。この記事では履歴のどこを見れば実際に戻せるかが分かるかを最短でまとめます。
まず見る(結論)
履歴のエントリ数を数えても意味がありません。見るのは「成功したか」と「実体があるか」の2つで、どちらも list history の Status 欄では分かりません。
# 成功したDBバックアップで、期限切れになっていないものだけを出す
db2 connect to sample
db2 "SELECT EID, SUBSTR(CHAR(START_TIME),1,14) AS ST, SUBSTR(LOCATION,1,40) AS LOC
FROM SYSIBMADM.DB_HISTORY
WHERE OPERATION='B' AND OBJECTTYPE='D'
AND SQLCODE IS NULL AND ENTRY_STATUS='A'"
# そのイメージが実際に読めるか(0=正常 / 10=ファイルが無い)
db2ckbkp -h /path/to/SAMPLE.0.db2inst1.DBPART000.<タイムスタンプ>.001
症状 → 原因 → 対処(逆引き)
| 症状 | 原因 | まず打つ手 |
|---|---|---|
SQL2542N でRESTOREできない |
履歴にはあるがイメージが消えている | db2ckbkp で全世代を点検し、生きている世代を探す |
履歴の Status が全部 A |
A は「まだ期限切れでない」の意味。実体の有無とは無関係 |
ENTRY_STATUS ではなく db2ckbkp で判定する |
| 失敗したバックアップが成功に見える | 失敗した実行も同じ形式で履歴に残る | DB_HISTORY.SQLCODE IS NULL で絞る |
| 履歴が何百行も減らない | REC_HIS_RETENTN の日数が先に効く |
日数を確認。NUM_DB_BACKUPS だけでは減らない |
PRUNE ... AND DELETE でディスクが空かない |
AUTO_DEL_REC_OBJ が OFF |
ON にしてから実行する(DB20000I は成否の判定に使えない) |
| 履歴を消したらイメージが消せなくなった | 削除は履歴を辿って行われる | 手で rm するしかない。順序を逆にしない |
上の3行は復旧できるかの判定、下の3行は容量を空けるときの話です。混ぜて考えると、消したいものが残って残したいものが消えます。
履歴は実行された操作の記録であって、資産の一覧ではありません。保存先のディレクトリを消しても、テスト用に /dev/null へ取っても、エントリは容量つきで残ります。世代数を数えて安心する運用は、復旧の当日に崩れます。
それでも切り分からないとき(実機ログつきの詳解)
履歴30世代のうち実体が3件しか残っていなかった実例、自動プルーニングで A が E に変わる様子、PRUNE HISTORY が履歴を0行にするまでの実測は、Zennのフル記事にまとめています。
関連: Db2のデータベースに接続できない ― バックアップ保留・ロールフォワード保留を解除する逆引き / SQL0290N 表スペースにアクセスできない
いざという時に迷わないためのバックアップ方式の選定とリカバリの手順を、本書 第4章「バックアップ・リカバリの鉄則」で体系化しています。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。