DB2 7 min read

Db2「SQL0290N」表スペースにアクセスできない原因を切り分ける

夜間の LOAD が終わった翌朝、あるいは表スペース単位のリストアを流した直後に、その表スペース上の表へ触ろうとすると返ってくることがあります。データベースには接続できるのに、特定の表スペースの表だけが触れなくなります(更新は必ず止まります)。

SQL0290N  Table space access is not allowed.  SQLSTATE=55039

SQL0290N表スペースが通常状態でないために閉じられている状態です。表単位の SQL0668N と症状が似ていますが、別のエラーです。この記事ではまず見る値と、症状からの逆引きを最短でまとめます。状態別の抜け方と実機での確認ログは末尾のZenn記事にあります。

まず見る(結論)

SQL0290N には理由コードが付きません。分岐は表スペースの状態(state)でしか分からないので、最初にやることは状態を取ることです。SQLが通るなら状態は文字列で読めます。接続できない場合は db2pd で16進の値を見ます。

# 表スペースの状態を一覧する(正常なら NORMAL)
db2 "SELECT VARCHAR(TBSP_NAME,20), VARCHAR(TBSP_STATE,24) FROM TABLE(MON_GET_TABLESPACE(NULL,-2)) AS T"

# 接続できないときは db2pd の State 列(8桁の16進)を見る
db2pd -d <DB名> -tablespaces

症状 → 原因 → 対処(逆引き)

症状 よくある原因 まず打つ手
LOADの翌日から、その表スペース上の表が触れない(更新が必ず止まる) アーカイブログ運用で LOAD ... COPY NO を実行し、表スペースがバックアップ保留(0x0020)になった 表スペース単位のオンラインバックアップを取る(BACKUP DATABASE ... TABLESPACE (...) ONLINE
表スペース単位のリストア後、その表スペースだけ触れない ロールフォワード保留(0x0080)のまま残っている ROLLFORWARD DATABASE ... TO END OF LOGS AND STOP TABLESPACE (...) ONLINE
ロールフォワードを流したのに解除されない AND STOP(または AND COMPLETE)を付けずに終えた=ロールフォワード進行中(0x0040 AND STOP 付きで再実行して完了させる
リストアが途中で失敗し、以後ずっと触れない リストア保留(0x0100)/リストア進行中(0x2000)で止まっている 同じイメージからリストアをやり直して完走させる
ディスク/マウントを触った後から触れない コンテナに到達できず表スペースがオフライン(0x4000 マウントと権限(インスタンスユーザーの読み書き)を戻し、ALTER TABLESPACE ... SWITCH ONLINE
誰も使っていないのに触れない QUIESCE を掛けたセッションが異常終了し、解除されずに残った(0x00010x00020x0004 db2pdNQuiescers を確認し、QUIESCE TABLESPACES FOR TABLE <スキーマ>.<表> RESET
リダイレクトリストアの途中から先に進めない SET TABLESPACE CONTAINERS の後、RESTORE ... CONTINUE が未実行(ストレージ定義待ち 0x1000 RESTORE DATABASE ... CONTINUE を実行する
特定の1表だけが触れない(同じ表スペースの他の表は通る) 表スペースではなく表の制限状態=別エラー(SQL0668N SYSCAT.TABLESSTATUSACCESS_MODE を見る
SET INTEGRITYREORG も効かない 表単位の対処を、表スペース単位の状態に対して打っている MON_GET_TABLESPACETBSP_STATE を先に確認する

状態を確定させてから手を打ちます。SQL0668N のつもりで SET INTEGRITYREORG を打っても、表スペース側の状態は変わりません。なお状態が読める列は限られていて、SYSCAT.TABLESPACESSYSIBMADM.SNAPTBSP には状態列がありません(後者で TBSP_STATE を指定すると SQL0206N になります)。使えるのは MON_GET_TABLESPACESYSIBMADM.TBSP_UTILIZATION です。

いちばん多い真因:アーカイブログ運用での LOAD ... COPY NO

LOAD はデータページを直接書くため、その内容はトランザクションログに残りません。アーカイブログ運用でリカバリ可能性を保てなくなるので、Db2は対象の表スペースをバックアップ保留にして閉じます。ロード手順を変えていないのに、LOGARCHMETH1 を有効化した時点から急に出るようになるのがこの経路です。対処はバックアップ、予防は LOAD 側で COPY YES TO <path>NONRECOVERABLE を明示することです。

それでも切り分からないとき(実機ログつきの詳解)

状態を表す16進値の全一覧、db2tbst で16進を状態名に直す手順(引数が常に16進として解釈される点を含む)、状態別の抜け方と SQL0668N との切り分けまで含めた詳しい解説は、Zennのフル記事にまとめています。

▶ Zennで続きを読む(無料)

Db2の「SQL0290N 表スペース・アクセスは許可されません」を状態から特定して抜ける ― LOAD後・リストア後に表が触れないとき


実機ログつきの詳解を読む →

関連: SQL0668N 操作は許可されません(表の制限状態)SQL0289N 表スペースに新しいページを割り当てられませんSQL0964C トランザクションログがいっぱいです

いざという時に迷わないためのバックアップ方式の選定とリカバリの手順を、本書 第4章「バックアップ・リカバリの鉄則」で体系化しています。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集

Zennで読む(¥2,000)→