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に関してはいつもどおりのリカバリですので、こちらは省略します。
以上がリカバリの方法についてのご紹介となります。