トップ > DBA上級 マルチテナント > 6章
6章 CDBでのバックアップリカバリ
本章ではCDBのバックアップリカバリについてご紹介していきます。しっかりと理解して行きましょう。

CDBでのバックアップリカバリ概要


本章ではPDBでのバックアップリカバリについてご紹介していきます。
CDBではCDB,PDB全体の取得や、CDBのみ、PDBのみの取得が可能です。
バックアップを取得し障害に備えて行きましょう。


CDBのバックアップ



バックアップの取得方法は通常データベースと変わりはありません。
RMANでの取得ももちろん可能です。そのほかにユーザ管理のバックアップはCDB上で使用が可能です。


CDBのリカバリ


CDB,PDBの完全リカバリは各DB単位で実行できますが、不完全リカバリはDB全体(CDB,すべてのPDB)でのリカバリとなります。

それではPDB1のUSERS表領域のデータファイルを削除し、PDB1の復旧を行ってみます。
直前リカバリが実施できていることを確認する為に、TESTテーブルを作成し、TESTテーブルが復旧できるかまで確認します。

  SQL> conn ora/ora@pdb1
  SQL> show con_name

  CON_NAME
  ------------------------------
  PDB1

  SQL> create table test (id number(10),name varchar2(10));

  Table created.

  SQL> insert into test values (10,'TEST1');

  1 row created.

  SQL> insert into test values (20,'TEST2');

  1 row created.

  SQL> insert into test values (30,'TEST3');

  1 row created.

  SQL> commit;

  Commit complete.

  SQL> select * from test;

          ID NAME
  ---------- ----------
          10 TEST1
          20 TEST2
          30 TEST3

  SQL> exit

  $ cd $ORACLE_BASE/oradata/ORCL/pdb1
  $ ls -l
  
  合計 1617756
  -rw-r----- 1 oracle dba 559947776  2月 14 15:00 2017 pdbseed_temp01.dbf
  -rw-r----- 1 oracle dba 734011392  2月 14 20:05 2017 sysaux01.dbf
  -rw-r----- 1 oracle dba 293609472  2月 14 20:09 2017 system01.dbf
  -rw-r----- 1 oracle dba 104865792  2月 14 17:06 2017 user01.dbf

  $ rm -f user01.dbf


PDB1のUSERS表領域のデータファイルを削除したので、PDB1はメディア障害の状態となりました。

  SQL> alter session set container = pdb1;

  Session altered.

  SQL> alter system flush buffer_cache;

  System altered.

  SQL> select * from ora.test;
  select * from ora.test
                   *
  ERROR at line 1:
  ORA-01116: error in opening database file 25
  ORA-01110: data file 25: '/u01/app/oracle/oradata/ORCL/pdb1/user01.dbf'
  ORA-27041: unable to open file
  Linux-x86_64 Error: 2: No such file or directory
  Additional information: 3


「alter system flush buffer_cache」はDBキャッシュをクリアするコマンドです。
一度キャッシュをクリアした為、TSETテーブルへのSELECTはディスクアクセスとなります。
既にUSERS表領域のデータファイルを削除しているので、エラーとなります。
ちなみにUSERS表領域以外のデータはどうでしょうか。

  SQL> select username from dba_users;

  USERNAME
  ------------------------------------
  ORACLE_OCM
  OJVMSYS
  SYSKM
  XS$NULL
  ・・・


データを取得できています。PDBの場合、メディア障害時はDBは停止しないようです。
アラートログには「Checker run found 1 new persistent data failures」のメッセージが
でています。

では次にPDB1をクローズしてみましょう。

  SQL> show con_name

  CON_NAME
  ------------------------------
  CDB$ROOT

  SQL> alter pluggable database pdb1 close;
  alter pluggable database pdb1 close
  *
  ERROR at line 1:
  ORA-01116: error in opening database file 25
  ORA-01110: data file 25: '/u01/app/oracle/oradata/ORCL/pdb1/user01.dbf'
  ORA-27041: unable to open file
  Linux-x86_64 Error: 2: No such file or directory
  Additional information: 3


停止処理はエラーとなりました。PDBのリカバリはDB停止は不要で対象のデータファイルのみオフラインにします。

  SQL> alter database datafile
    2  '/u01/app/oracle/oradata/ORCL/pdb1/user01.dbf' offline;

  Database altered.


それではPDB1のUSERS表領域をリカバリしていきます。
リカバリのコマンドは以下のとおりです。

では実行してみます。

  $ rman target /

  RMAN> RESTORE TABLESPACE  pdb1:USERS;

  Starting restore at 14-FEB-17
  using target database control file instead of recovery catalog
  allocated channel: ORA_DISK_1
  channel ORA_DISK_1: SID=518 device type=DISK
  allocated channel: ORA_DISK_2
  channel ORA_DISK_2: SID=511 device type=DISK
  ・・・
  channel ORA_DISK_1: restored backup piece 1
  channel ORA_DISK_1: restore complete, elapsed time: 00:00:08
  Finished restore at 14-FEB-17


  RMAN> RECOVER TABLESPACE pdb1:USERS;

  Starting recover at 14-FEB-17
  using channel ORA_DISK_1
  using channel ORA_DISK_2

  starting media recovery

  archived log for thread 1 with sequence 552 is already on disk 
  as file /u01/app/oracle/oradata/flash_recovery_area/ORCL/archivelog/2017_02_10/
  o1_mf_1_552_d9v68tlg_.arc
  archived log for thread 1 with sequence 553 is already on disk 
  as file /u01/app/oracle/oradata/flash_recovery_area/ORCL/archivelog/2017_02_10/
  o1_mf_1_553_d9vgfrqy_.arc
  ・・・
  media recovery complete, elapsed time: 00:00:51
  Finished recover at 14-FEB-17

  RMAN> exit


これでリカバリは完了です。最後にUSERS表領域のデータファイルをオンラインにしてみましょう。

  SQL> show con_name

  CON_NAME
  ------------------------------
  PDB1


  SQL> SELECT file_name,online_status FROM dba_data_files
    2  WHERE tablespace_name = 'USERS';

  FILE_NAME                                    ONLINE_
  -------------------------------------------- -------
  /u01/app/oracle/oradata/ORCL/pdb1/user01.dbf OFFLINE

  SQL> ALTER DATABASE DATAFILE
    2  '/u01/app/oracle/oradata/ORCL/pdb1/user01.dbf' ONLINE;

  Database altered.

  SQL> SELECT file_name,online_status FROM dba_data_files
    2  WHERE tablespace_name = 'USERS';

  FILE_NAME                                    ONLINE_
  -------------------------------------------- -------
  /u01/app/oracle/oradata/ORCL/pdb1/user01.dbf ONLINE


  SQL> SELECT * FROM ora.test;

          ID NAME
  ---------- ----------
          10 TEST1
          20 TEST2
          30 TEST3


TESTテーブルが復旧されていることを確認しました。
PDBのリカバリの場合はデータファイルのOFFLINEでリカバリを実施する点のみで
大きくリカバリの方法は変わりません。
CDBに関してはいつもどおりのリカバリですので、こちらは省略します。


以上がリカバリの方法についてのご紹介となります。