CDB環境でのデータファイル障害時のリカバリ手順

CDB/PDB(マルチテナント)

~PDB内の表領域を RESTORE TABLESPACE でリカバリする完全ガイド~

OracleのCDB(Container Database)環境では、PDB(Pluggable Database)ごとに表領域が構成されており、データファイル障害に個別対応することが可能です。この記事では、PDB内の表領域 TEST_TBS に障害が発生した場合を想定し、OFFLINE操作→RMANでのリカバリ→ONLINE化までの手順を詳しく解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


目次

  1. 想定シナリオ
  2. 表領域をOFFLINEにする手順
  3. RMANによる表領域のリカバリ手順
  4. 表領域のONLINE化
  5. テキスト図による構成イメージ
  6. まとめ

1. 想定シナリオ

  • CDB名:CDB1
  • PDB名:PDB01
  • 表領域:TEST_TBS
  • TEST_TBSに属するデータファイルが削除され、障害が発生
  • アーカイブログモード有効
  • RMANバックアップ取得済
SQL> select count(*) from USER1.TAB1;
select count(*) from TAB1
*
行1でエラーが発生しました。:
ORA-01578:
Oracleデータ・ブロックに障害が発生しました(ファイル番号13、ブロック番号140) ORA-01110: データファイル13:
'/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf' ★データファイルに障害が発生


SQL>


▼アラートログの出力
=====
2025-05-15T23:54:25.528627+09:00
PDB01(3):Hex dump of (file 13, block 140) in trace file /u01/app/oracle/diag/rdbms/v19m/V19M/trace/V19M_ora_4707.trc
PDB01(3):
PDB01(3):Corrupt block relative dba: 0x0340008c (file 13, block 140)
PDB01(3):Completely zero block found during multiblock buffer read
PDB01(3):
PDB01(3):Reading datafile '/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf' for corrupt data at rdba: 0x0340008c (file 13, block 140)
PDB01(3):Reread (file 13, block 140) found same corrupt data (no logical check)
2025-05-15T23:54:25.563327+09:00
Corrupt Block Found
TIME STAMP (GMT) = 05/15/2025 23:54:24
CONT = 3, TSN = 6, TSNAME = TEST_TBS
RFN = 13, BLK = 140, RDBA = 54526092
OBJN = 73951, OBJD = 73951, OBJECT = TAB1, SUBOBJECT =
SEGMENT OWNER = USER1, SEGMENT TYPE = Table Segment
Errors in file /u01/app/oracle/diag/rdbms/v19m/V19M/trace/V19M_ora_4707.trc (incident=12057) (PDBNAME=PDB01):
ORA-01578: Oracleデータ・ブロックに障害が発生しました(ファイル番号13、ブロック番号140)
ORA-01110: データファイル13: '/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf'
PDB01(3):Incident details in: /u01/app/oracle/diag/rdbms/v19m/V19M/incident/incdir_12057/V19M_ora_4707_i12057.trc
2025-05-15T23:54:27.503098+09:00
PDB01(3):*****************************************************************
PDB01(3):An internal routine has requested a dump of selected redo.
PDB01(3):This usually happens following a specific internal error, when
PDB01(3):analysis of the redo logs will help Oracle Support with the
PDB01(3):diagnosis.
PDB01(3):It is recommended that you retain all the redo logs generated (by
PDB01(3):all the instances) during the past 12 hours, in case additional
PDB01(3):redo dumps are required to help with the diagnosis.
PDB01(3):*****************************************************************
2025-05-15T23:54:30.084361+09:00
PDB01(3):
PDB01(3):Corrupt block relative dba: 0x0340008c (file 13, block 140)
PDB01(3):
PDB01(3):Completely zero block found during validation
PDB01(3):Reread of blocknum=140, file=/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf. found same corrupt data
PDB01(3):Reread of blocknum=140, file=/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf. found same corrupt data
PDB01(3):Reread of blocknum=140, file=/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf. found same corrupt data
PDB01(3):Reread of blocknum=140, file=/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf. found same corrupt data
PDB01(3):Reread of blocknum=140, file=/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbf. found same corrupt data
Checker run found 1 new persistent data failures

2. 表領域をOFFLINEにする手順

データファイルにアクセスできない状態では、自動でOFFLINEになることもありますが、手動で明示的にOFFLINEにすることが望ましいです。

手順① SQL*PlusでPDBに接続

$ sqlplus / as sysdba
ALTER SESSION SET CONTAINER = PDB01;

手順② 表領域をOFFLINEにする

ALTER TABLESPACE TEST_TBS OFFLINE IMMEDIATE;

IMMEDIATE オプションにより、現在使用中のセッションがあっても即座にOFFLINEにします。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


3. RMANによる表領域のリカバリ手順

手順① RMANにCDB$ROOTから接続

編集する$ rman target /

手順② 表領域をリカバリ

RUN {
RESTORE TABLESPACE PDB01:TEST_TBS;
RECOVER TABLESPACE PDB01:TEST_TBS;
}

PDB名:表領域名 の形式で表領域を指定するのがポイントです。
✅ RMANの接続はCDB$ROOTから行う必要があります


4. 表領域をONLINEに戻す

リカバリが完了したら、再びPDBに接続し表領域をONLINEに戻します。

ALTER SESSION SET CONTAINER = PDB01;
ALTER TABLESPACE TEST_TBS ONLINE;
SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT
SQL> ALTER SESSION SET CONTAINER = PDB01;

セッションが変更されました。

SQL> SET LIN 1000 PAGES 1000
SQL> COL TABLESPACE_NAME FOR A30
SQL> SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'TEST_TBS';

TABLESPACE_NAME STATUS
------------------------------ ---------------------------
TEST_TBS ONLINE

SQL> ALTER TABLESPACE TEST_TBS OFFLINE; ★オフラインに変更

表領域が変更されました。

SQL> SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'TEST_TBS';

TABLESPACE_NAME STATUS
------------------------------ ---------------------------
TEST_TBS OFFLINE ★

SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on 金 5月 16 00:07:35 2025
Version 19.21.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

ターゲット・データベース: V19M (DBID=1384470285)に接続されました

RMAN> RUN {
2> RESTORE TABLESPACE PDB01:TEST_TBS; ★リストア
3> RECOVER TABLESPACE PDB01:TEST_TBS; ★リカバリ
4> }

restoreを25-05-16で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=81 デバイス・タイプ=DISK

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00013を/u01/app/oracle/oradata/V19M/PDB01/test_tbs.dbfにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/023pi91k_2_1_1から読取り中です
チャネルORA_DISK_1: ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/023pi91k_2_1_1 タグ=TAG20250515T234956
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:01
restoreを25-05-16で終了しました

recoverを25-05-16で開始しています
チャネルORA_DISK_1の使用

メディア・リカバリを開始しています
メディア・リカバリが完了しました。経過時間: 00:00:01

recoverを25-05-16で終了しました

RMAN> exit


Recovery Managerが完了しました。
[oracle@v19single ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 金 5月 16 00:08:12 2025
Version 19.21.0.0.0

Copyright (c) 1982, 2022, Oracle. All rights reserved.



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> ALTER SESSION SET CONTAINER = PDB01;

セッションが変更されました。

SQL> ALTER TABLESPACE TEST_TBS ONLINE; ★オンラインに戻す

表領域が変更されました。

SQL> SET LIN 1000 PAGES 1000
SQL> COL TABLESPACE_NAME FOR A30
SQL> SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'TEST_TBS';

TABLESPACE_NAME STATUS
------------------------------ ---------------------------
TEST_TBS ONLINE ★

SQL> select count(*) from USER1.TAB1; ★select できる

COUNT(*)
----------
55552

5. テキスト図:CDB構成と表領域リカバリ

+----------------------------+
| CDB$ROOT |
| +----------------------+ |
| | SYSTEM, SYSAUX, ... | |
| +----------------------+ |
| ↓ ↓ |
| +------+--------+------+ |
| | PDB01 | |
| | +---------------+ | |
| | | TEST_TBS | | |
| | | (file missing)| | |
| | +---------------+ | |
| +---------------------+ |
+----------------------------+

↓ 操作の流れ:

1. ALTER TABLESPACE TEST_TBS OFFLINE IMMEDIATE;
2. RMANで RESTORE/RECOVER TABLESPACE PDB01:TEST_TBS;
3. ALTER TABLESPACE TEST_TBS ONLINE;

6. まとめ

ステップコマンド例備考
表領域OFFLINEALTER TABLESPACE TEST_TBS OFFLINE IMMEDIATE;PDB接続で実行
表領域リカバリRESTORE TABLESPACE PDB01:TEST_TBS;
RECOVER TABLESPACE PDB01:TEST_TBS;
CDB$ROOTからRMANで実行
表領域ONLINEALTER TABLESPACE TEST_TBS ONLINE;PDB接続で実行

補足:表領域単位でのリカバリができない場合

より大きな障害の場合は、以下のようにPDB全体をリカバリ対象にすることも検討してください:

RECOVER PLUGGABLE DATABASE PDB01;


[参考]
4 CDBの作成および構成

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました