>> 連載トップページに戻る

 

基本からわかる!高性能×高可用性データベースシステムの作り方

第7回 バックアップ/リカバリ(2)RMANの基本


著者紹介


日下部 明 (くさかべ あきら)

日本オラクル Oracle Database担当。Oracle GRID Centerのラインマネージャとしてオラクルの持つ最新技術をパートナー各社と共同で検証し、多くのホワイトペーパーを執筆・レビューしてきました。以後、Oracle Databaseのセキュリティ製品のリリースマネージャを担当。これらの経験を元にミッションクリティカルな案件のソリューションデザインの提案などを担当しています。著書に「これは使えるOracle新機能活用術」(翔泳社)。


第7回 バックアップ/リカバリ(2)RMANの基本


第6回ではオンライン・バックアップ/リカバリの仕組みと、ユーザー管理バックアップについて説明しました。今回は、物理バックアップのもう1つの選択肢であるRMAN(Recovery Manager)について解説します。RMANはOracle Databaseの構造を理解しているバックアップ・ツールであり、物理バックアップの第1選択肢です。データ・リカバリ・アドバイザを使用すると、障害個所の特定と復旧方法を自動生成することができます。


1 RMAN概要

RMANはOracle8で導入された物理バックアップ・ツールです。RMANでバックアップ/リストアを行うには、rmanコマンドでOracleインスタンスに接続します。rmanコマンドはアプリケーションからの接続と同様に、Oracleサーバー・プロセスを介してOracleインスタンスに接続します。Oracleサーバー・プロセスがOracleデータベースのファイルにアクセスする仕組みを使って、バックアップ/リストア/リカバリの操作を行います。

img-1

そのため、RMANはOracleデータベースの構造を理解しており、ユーザー管理バックアップではできなかったいくつかのことができるようになっています。

ASMファイルのバックアップ ASMはOracle Database専用のボリューム・マネージャ兼ファイルシステムであり、ASMファイルのバックアップにはRMANが必要です。
バックアップ中のファイルの検査 RMANはデータベース・ファイルの内部構造を理解しており、バックアップ中にファイルの破損を検出します。
増分バックアップ 前回のバックアップから更新されたデータブロックの増分をバックアップすることができます。
増分更新バックアップ フルバックアップにあらかじめ増分バックアップを適用しておくことができます。

RMANでのバックアップ/リストア/リカバリの時間を短縮するための機能は次回以降で解説する予定です。今回はまず基本のフルバックアップと、それを使用したリカバリを見ていきます。

2 RMANでバックアップ

RMANでバックアップを取得してみましょう。まずはその前提の準備です。Oracle Databaseでは、オンライン・バックアップを取得するためにはアーカイブログ・モードである必要があります。また、バックアップ先として初期化パラメータDB_RECOVERY_FILE_DESTとDB_RECOVERY_FILE_DEST_SIZEが設定されているかを確認します。

$ sqlplus / as sysdba

SQL> archive log list
データベース・ログ・モード     アーカイブ・モード
自動アーカイブ                 有効
アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
最も古いオンライン・ログ順序   657
アーカイブする次のログ順序    659
現行のログ順序               659

SQL> select name,value from v$parameter where name like 'db_recovery_file%';

NAME                           VALUE
------------------------------ --------------------------------------------------
db_recovery_file_dest          /u01/app/oracle/fast_recovery_area/SIDB18A
db_recovery_file_dest_size     107374182400

rmanコマンドでログインするにはsqlplusコマンドと同様に、Oracleインスタンスが稼働しているOSに端末ログインしOS認証で接続する方法と、Oracleリスナー経由で接続する方法があります。

OS認証でログイン
$ rman target /

Oracleリスナー経由でログイン
$ rman target sys/password@net_alias

ここで、targetキーワードはバックアップ対象のデータベースにログインするという意味です。RMANでログインできたら、データベース全体をバックアップするbackup databaseコマンドを実行します。

$ rman target /

Recovery Manager: Release 18.0.0.0.0 - Production on 金 9月 14 14:32:29 2018
Version 18.3.0.0.0

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

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

RMAN> backup database;

backupを18-09-14で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=491 デバイス・タイプ=DISK
チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています
チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
入力データファイル ファイル番号=00003 名前=/u01/app/oracle/oradata/SIDB18A/sysaux01.dbf
入力データファイル ファイル番号=00001 名前=/u01/app/oracle/oradata/SIDB18A/system01.dbf
入力データファイル ファイル番号=00005 名前=/u01/app/oracle/oradata/SIDB18A/undotbs01.dbf
入力データファイル ファイル番号=00007 名前=/u01/app/oracle/oradata/SIDB18A/users01.dbf
チャネルORA_DISK_1: ピース1 (18-09-14)を起動します
チャネルORA_DISK_1: ピース1 (18-09-14)が完了しました
ピース・ハンドル=/u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspkznlr_.bkp タグ=TAG20180914T143236 コメント=NONE
チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:25
チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています
チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
入力データファイル ファイル番号=00009 名前=/u01/app/oracle/oradata/SIDB18A/pdb/sysaux01.dbf
入力データファイル ファイル番号=00011 名前=/u01/app/oracle/oradata/SIDB18A/pdb/users01.dbf
入力データファイル ファイル番号=00012 名前=/u01/app/oracle/oradata/SIDB18A/pdb/users201.dbf
入力データファイル ファイル番号=00010 名前=/u01/app/oracle/oradata/SIDB18A/pdb/undotbs01.dbf
入力データファイル ファイル番号=00008 名前=/u01/app/oracle/oradata/SIDB18A/pdb/system01.dbf
チャネルORA_DISK_1: ピース1 (18-09-14)を起動します
チャネルORA_DISK_1: ピース1 (18-09-14)が完了しました
ピース・ハンドル=/u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/6BC0721F0F147426E0532E97B90AEFA0/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspl0fs4_.bkp タグ=TAG20180914T143236 コメント=NONE
チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:25
チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています
チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
入力データファイル ファイル番号=00006 名前=/u01/app/oracle/oradata/SIDB18A/pdbseed/undotbs01.dbf
入力データファイル ファイル番号=00004 名前=/u01/app/oracle/oradata/SIDB18A/pdbseed/sysaux01.dbf
入力データファイル ファイル番号=00002 名前=/u01/app/oracle/oradata/SIDB18A/pdbseed/system01.dbf
チャネルORA_DISK_1: ピース1 (18-09-14)を起動します
チャネルORA_DISK_1: ピース1 (18-09-14)が完了しました
ピース・ハンドル=/u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/6BBF79E8C8F75FCAE0532E97B90A997A/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspl16yl_.bkp タグ=TAG20180914T143236 コメント=NONE
チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:03
backupを18-09-14で終了しました

Control File and SPFILE Autobackupを18-09-14で開始しています
ピース・ハンドル=/u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/autobackup/2018_09_14/o1_mf_s_986826810_fspl1bgv_.bkp コメント=NONE
Control File and SPFILE Autobackupを18-09-14で終了しました

RMAN> 

backup databaseコマンドは、このコンテナ・データベースを構成するすべてのデータファイルのバックアップを取得します。RMANではbackupコマンドを発行したときにデータベースを構成するファイルが評価されるため、取り漏らしが発生しません。RMANで取得したバックアップの情報は、list backupコマンドで調べることができます。

RMAN> list backup;


バックアップ・セットのリスト
===================


BS Key  Type LV Size       Device Type Elapsed Time 終了時間
------- ---- -- ---------- ----------- ------------ --------
258     Full    2.38G      DISK        00:00:05     18-09-14
        BPキー: 258   ステータス: AVAILABLE  圧縮: NO  タグ: TAG20180914T143236
        ピース名: /u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspkznlr_.bkp
  バックアップ・セット258のデータファイルのリスト
  File LV Type Ckp SCN    Ckp時間 Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- -------- ----------- ------ ----
  1       Full 19281773   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/system01.dbf
  3       Full 19281773   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/sysaux01.dbf
  5       Full 19281773   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/undotbs01.dbf
  7       Full 19281773   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/users01.dbf

BS Key  Type LV Size       Device Type Elapsed Time 終了時間
------- ---- -- ---------- ----------- ------------ --------
259     Full    1.81G      DISK        00:00:04     18-09-14
        BPキー: 259   ステータス: AVAILABLE  圧縮: NO  タグ: TAG20180914T143236
        ピース名: /u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/6BC0721F0F147426E0532E97B90AEFA0/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspl0fs4_.bkp
  バックアップ・セット259のデータファイルのリスト
  コンテナID: 3、PDB名: PDB
  File LV Type Ckp SCN    Ckp時間 Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- -------- ----------- ------ ----
  8       Full 19281783   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/pdb/system01.dbf
  9       Full 19281783   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/pdb/sysaux01.dbf
  10      Full 19281783   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/pdb/undotbs01.dbf
  11      Full 19281783   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/pdb/users01.dbf
  12      Full 19281783   18-09-14              NO    /u01/app/oracle/oradata/SIDB18A/pdb/users201.dbf

BS Key  Type LV Size       Device Type Elapsed Time 終了時間
------- ---- -- ---------- ----------- ------------ --------
260     Full    878.02M    DISK        00:00:02     18-09-14
        BPキー: 260   ステータス: AVAILABLE  圧縮: NO  タグ: TAG20180914T143236
        ピース名: /u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/6BBF79E8C8F75FCAE0532E97B90A997A/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspl16yl_.bkp
  バックアップ・セット260のデータファイルのリスト
  コンテナID: 2、PDB名: PDB$SEED
  File LV Type Ckp SCN    Ckp時間 Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- -------- ----------- ------ ----
  2       Full 14114869   18-08-08              NO    /u01/app/oracle/oradata/SIDB18A/pdbseed/system01.dbf
  4       Full 14114869   18-08-08              NO    /u01/app/oracle/oradata/SIDB18A/pdbseed/sysaux01.dbf
  6       Full 14114869   18-08-08              NO    /u01/app/oracle/oradata/SIDB18A/pdbseed/undotbs01.dbf

BS Key  Type LV Size       Device Type Elapsed Time 終了時間
------- ---- -- ---------- ----------- ------------ --------
261     Full    18.89M     DISK        00:00:00     18-09-14
        BPキー: 261   ステータス: AVAILABLE  圧縮: NO  タグ: TAG20180914T143330
        ピース名: /u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/autobackup/2018_09_14/o1_mf_s_986826810_fspl1bgv_.bkp
  SPFILEも含まれます: 修正時間: 18-09-08
  SPFILE db_unique_name: SIDB18A
  含まれている制御ファイル: Ckp SCN: 19281806     Ckp時間: 18-09-14

3 データファイル破損からのリストア/リカバリ

第6回のユーザー管理バックアップの時と同様に、データファイルを破損させ、RMANでリストア/リカバリしてみましょう。ファイルを破損させるのは、そのファイルのバックアップを取得した後であることに注意してください。

3.1 行の位置の特定とデータファイルの破壊

プラガブル・データベースのtab2という表にアクセスするSQLを想定します。

SQL> select col1 from tab2 where col1=1;

      COL1
----------
         1

このtab2表のcol1=1を含む行のデータブロックを特定し、そこを破壊します。まず、ファイル番号とデータブロック番号を調べます。

SQL> select col1,
  2         DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) fno,
  3         DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) bno
  4  from tab2 where col1=1;

      COL1        FNO        BNO
---------- ---------- ----------
         1         12        131

ファイル番号12のデータファイルの名前を調べます。

SQL> select file#,name from v$datafile where file#=12;

     FILE# NAME
---------- ------------------------------------------------------------
        12 /u01/app/oracle/oradata/SIDB18A/pdb/users201.dbf

このデータファイルをddコマンドで上書きし、破壊します。

$ dd if=/dev/zero of=/u01/app/oracle/oradata/SIDB18A/pdb/users201.dbf bs=8k count=1 seek=131
1+0 レコード入力
1+0 レコード出力
8192 バイト (8.2 kB) コピーされました、 0.000641312 秒、 12.8 MB/秒

障害が検出されるのは、Oracleのプロセスが破損した領域にアクセスしたときです。該当データブロックがデータベース・バッファキャッシュにあると、SQLの実行はデータファイルにはアクセスしません。そのため、データベース・バッファキャッシュをフラッシュしてからこのデータブロックにアクセスするSQLを実行します。

SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;

システムが変更されました。
SQL> select col1 from tab2 where col1=1;
select col1 from tab2 where col1=1
                 *
行1でエラーが発生しました。:
ORA-01115: ファイル(ブロック番号)からの読取りI/Oエラーが発生しました。 ORA-01110:
データファイル12: '/u01/app/oracle/oradata/SIDB18A/pdb/users201.dbf'
ORA-27072: ファイルI/Oエラーが発生しました。 Additional
information: 3
Additional information: 65664

tab2表のcol1=1にアクセスするSQLがデータファイルの破損を検出しました。この障害をRMANを使用してリストア/リカバリします。

3.2 RMANのデータ・リカバリ・アドバイザでリストア/リカバリ

RMANでもユーザー管理バックアップの場合と同様に、破損したデータファイルを管理者が特定し、リストアとリカバリの操作を個別に発行します。しかし、RMANにはこれらの一連の操作を自動化するデータ・リカバリ・アドバイザという機能があります。RACはサポートしていないなど、必ずしもすべての構成で使用できるわけではないのですが、通常ならば人間の判断を必要とする障害個所の特定と復旧方法の決定を自動化できる非常に強力なツールです。

img-1

3.2.1 認識された障害の表示

RMANのlist failureコマンドで、認識されている障害の一覧が表示されます。

RMAN> list failure;

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
データベース・ロール: PRIMARY

データベース障害のリスト
=========================

障害ID 優先度ステータス    検出時間 サマリー
------ -------- --------- -------- -------
5902   HIGH     OPEN      18-09-14 SYSTEM以外のデータファイルが1つ以上破損しています

3.2.2 修復オプションの決定

RMANのadvise failureコマンドで修復方法を分析してくれます。

 

RMAN> advise failure;

データベース・ロール: PRIMARY

データベース障害のリスト
=========================

障害ID 優先度ステータス    検出時間 サマリー
------ -------- --------- -------- -------
5902   HIGH     OPEN      18-09-14 SYSTEM以外のデータファイルが1つ以上破損しています

自動修復オプションを分析中です。これには少し時間がかかる場合があります
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=491 デバイス・タイプ=DISK
自動修復オプションの分析が完了しました

必須の手動アクション
========================
使用可能な手動アクションがありません

オプションの手動アクション
=======================
使用可能な手動アクションがありません

自動修復オプション
========================
オプション 修復 説明
------------------------
1      データファイル12をリストアおよびリカバリします
  計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
  修復スクリプト: /u01/app/oracle/diag/rdbms/sidb18a/sidb18a/hm/reco_2307471035.hm

障害の内容によっては、自動修復するためのスクリプトが生成されます。このスクリプトの中身を見てみましょう。

$ cat /u01/app/oracle/diag/rdbms/sidb18a/sidb18a/hm/reco_2307471035.hm
   # restore and recover datafile
   sql 'PDB' 'alter database datafile 12 offline';
   restore ( datafile 12 );
   recover datafile 12;
   sql 'PDB' 'alter database datafile 12 online';

データファイルのリストアとリカバリの個別の手順はユーザー管理バックアップの場合と同様ですが、データ・リカバリ・アドバイザはこの一連の手順を自動生成してくれます。

3.2.3 障害の修復

advise failureコマンドで生成された自動復旧手段をrepair failureコマンドで実行します。

RMAN> repair failure;

計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
修復スクリプト: /u01/app/oracle/diag/rdbms/sidb18a/sidb18a/hm/reco_2307471035.hm

修復スクリプトの内容:
   # restore and recover datafile
   sql 'PDB' 'alter database datafile 12 offline';
   restore ( datafile 12 );
   recover datafile 12;
   sql 'PDB' 'alter database datafile 12 online';

この修復を実行しますか(YESまたはNOを入力してください)。 YES
修復スクリプトを実行しています

SQL文: alter database datafile 12 offline

restoreを18-09-14で開始しています
チャネルORA_DISK_1の使用

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00012を/u01/app/oracle/oradata/SIDB18A/pdb/users201.dbfにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/6BC0721F0F147426E0532E97B90AEFA0/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspl0fs4_.bkpから読取り中です
チャネルORA_DISK_1: ピース・ハンドル=/u01/app/oracle/fast_recovery_area/SIDB18A/SIDB18A/6BC0721F0F147426E0532E97B90AEFA0/backupset/2018_09_14/o1_mf_nnndf_TAG20180914T143236_fspl0fs4_.bkp タグ=TAG20180914T143236
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:07
restoreを18-09-14で終了しました

recoverを18-09-14で開始しています
チャネルORA_DISK_1の使用

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

recoverを18-09-14で終了しました

SQL文: alter database datafile 12 online
障害の修復が完了しました

RMAN>

障害から復旧すると、該当データブロックにアクセスするSQLは実行可能です。

SQL> select col1 from tab2 where col1=1;

      COL1
----------
         1

4 データファイル以外のファイルのバックアップ

前述したRMANのbackupコマンドでは、データファイル以外にも制御ファイルとSPFILEのバックアップも取得されていました。これはRMANのconfigure controlfile autobackupコマンドの設定によるもので、デフォルトでは制御ファイルとSPFILEのバックアップも取得されます。

RMAN> show all;

db_unique_name SIDB18AのデータベースにおけるRMAN構成パラメータ:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/18/dbhome_1/dbs/snapcf_sidb18a.f'; # default

また、アーカイブREDOログのバックアップを取得することもできます。

RMAN> backup archivelog all;

しかし、アーカイブREDOログだけのバックアップを取得するということはあまりありません。第6回で説明したように、データファイルのオンライン・バックアップを取得するのはその間に生成されたREDOログ情報でリカバリすることが前提です。そのため、データファイルとREDOログのバックアップはセットで考慮すべきです。RMANにはデータファイルとREDOログをセットでバックアップするコマンドが用意されています。

RMAN> backup database plus archivelog;

このコマンドでバックアップを取得すると、データファイルのバックアップの後にオンラインREDOログがアーカイブされ、そのアーカイブREDOログもバックアップされます。

今回はRMANの最も基本的な使い方であるフルバックアップと、復旧方法を自動生成するデータ・リカバリ・アドバイザについて説明しました。次回はRMANでのバックアップ/リストア/リカバリの時間を短縮する機能について説明する予定です。