「基本からわかる!高性能×高可用性データベースシステムの作り方」indexページ▶▶
第6回ではオンライン・バックアップ/リカバリの仕組みと、ユーザー管理バックアップについて説明しました。今回は、物理バックアップのもう1つの選択肢であるRMAN(Recovery Manager)について解説します。RMANはOracle Databaseの構造を理解しているバックアップ・ツールであり、物理バックアップの第1選択肢です。データ・リカバリ・アドバイザを使用すると、障害個所の特定と復旧方法を自動生成することができます。
1 RMAN概要
RMANはOracle8で導入された物理バックアップ・ツールです。RMANでバックアップ/リストアを行うには、rmanコマンドでOracleインスタンスに接続します。rmanコマンドはアプリケーションからの接続と同様に、Oracleサーバー・プロセスを介してOracleインスタンスに接続します。Oracleサーバー・プロセスがOracleデータベースのファイルにアクセスする仕組みを使って、バックアップ/リストア/リカバリの操作を行います。

そのため、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はサポートしていないなど、必ずしもすべての構成で使用できるわけではないのですが、通常ならば人間の判断を必要とする障害個所の特定と復旧方法の決定を自動化できる非常に強力なツールです。

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でのバックアップ/リストア/リカバリの時間を短縮する機能について説明する予定です。
