しばちょう先生の試して納得!DBAへの道 indexページ▶▶
みなさん、こんにちは。”しばちょう”こと柴田長(しばた つかさ)です。
先日開催されたOracle Database Connect 2016 に足を運んで頂いた方、本当にありがとうございました!予定していたデモを全てお見せすることが出来ずに申し訳なかったですが、少しでもOracle Maximum Availability Architectureの有効性を感じて頂けたのであれば嬉しい限りです。当日のセッションの動画と資料を公開させて頂きますので、当日ご来場出来なかった方も是非とも参考にして頂ければ幸いです。

今回は前回に引き続き、Recovery Manager(以降、RMAN)の機能をご紹介させて頂きます。これまで何度もRMANを扱う記事を書いてきましたが、何故かSWITCHコマンドが書いていないではないか?と言う事に、Oracle Database Connect 2016のセッション資料を作成している際に、今更ながら気付きました。
年々、DBAの皆様が扱うデータベースのサイズは大きくなって来ていますよね?その皆様のデータベース全体をリストアするとしたら何時間を要すると思いますか?もちろん、ストレージ構成に依存する部分でもありますので、一概には言えませんが、テラバイト級のデータベースであれば数時間という単位になると推測されます。と言う事で、今回は、このリストア時間をゼロにすることが可能なRMANのSWITCHコマンドを体験して頂きたいと考えております。RMANバックアップの復習も兼ねて、是非チャレンジしてみて下さいね。
以下の演習をOracle Database 12c Release 1のデータベースで試してみてください。
なお、Oracle Database 12c Release 1 (12.1.0.2) の単一インスタンス・データベースのインストレーション・ガイド 及び、Oracle VM VirtualBoxを用いたOracle Database 12c Release 1 環境の構築ガイドが、Oracle Technology Networkのこちらのページに公開されておりますので、参考にしてみてください。
- 【今回ご紹介するネタ一覧(逆引き)】
- ✓ RMANの高速増分バックアップを取得可能な環境設定(演習1)
- ✓ RMANの表領域単位でレベル0のイメージ・コピー・バックアップを取得する方法(演習3)
- ✓ RMANのSWITCHコマンドでレベル0のイメージ・コピー・バックアップをデータファイルとして認識させる方法(演習6)
1. 高速増分バックアップで非一貫性バックアップを取得可能な設定をデータベースに施して下さい。
$ sqlplus / as sysdba SQL> shutdown immediate startup mount -- SPFILEのバックアップ create pfile='/tmp/pfile.ora' from SPFILE ; -- 高速リカバリ領域の設定 alter system set db_recovery_file_dest_size=8000m scope=both sid='*' ; alter system set db_recovery_file_dest='+FRA' scope=both sid='*' ; -- アーカイブ・ログ・モードで運用 alter database archivelog ; archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 438 Next log sequence to archive 440 Current log sequence 440 -- ブロック・チェンジ・トラキングの有効化 alter database enable block change tracking using file '+FRA(CHANGETRACKING)' reuse ; set linesize 100 col FILENAME for a42 select * from V$BLOCK_CHANGE_TRACKING ; STATUS FILENAME BYTES CON_ID ---------- ------------------------------------------ ---------- ---------- ENABLED +FRA/ORCL/CHANGETRACKING/ctf.264.907940933 11599872 0 alter database open ; -- オマジナイ alter system checkpoint ; alter system switch logfile ;
こちらはRecovery Managerの記事でほぼ毎回実行して頂いている内容ですから、かっこ良く、スラスラとコマンドを打てるようになっていると思います。
2. 500MBの表領域”TBS45″を作成し、その表領域上に約250MBの表”TAB45″を作成して下さい。ただし、以降の検証の目的のため、表領域”TBS45″を構成するデータファイルはASMディスク・グループ上ではなく、ファイルシステム上に配置して下さい。
$ sqlplus / as sysdba
SQL>
-- TBS45表領域の作成
! mkdir -p /u01/app/oracle/oradata/orcl
create tablespace TBS45
datafile '/u01/app/oracle/oradata/orcl/tbs45.dbf' size 500m uniform size 1m ;
set linesize 100
col TABLESPACE_NAME for a6
col FILE_NAME for a40
select TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES/1024/1024
from DBA_DATA_FILES
where TABLESPACE_NAME='TBS45' ;
TABLES FILE_ID FILE_NAME BYTES/1024/1024
------ ---------- ---------------------------------------- ---------------
TBS45 5 /u01/app/oracle/oradata/orcl/tbs45.dbf 500
-- TBS24表領域をデフォルト表領域とするTRYユーザーの作成
create user TRY identified by TRY default tablespace TBS45 ;
grant connect, resource, dba to TRY ;
-- TAB45表の作成とデータ・ローディング
connect TRY/TRY
create table TAB45 (COL1 number NOT NULL, COL2 char(1000)) pctfree 10 ;
insert /*+append */ into TAB45
select LEVEL, 'hoge'||to_char(LEVEL)
from DUAL connect by LEVEL <= 7 * 128 * 250 ;
commit;
-- TRYスキーマ内のセグメント・サイズを確認
set linesize 150
col SEGMENT_NAME for a8
col TABLESPACE_NAME for a8
select SEGMENT_TYPE, SEGMENT_NAME, TABLESPACE_NAME, BYTES/1024/1024
from USER_SEGMENTS ;
SEGMENT_TYPE SEGMENT_ TABLESPA BYTES/1024/1024
------------------ -------- -------- ---------------
TABLE TAB45 TBS45 252
こちらも問題無いと思います。
以降の検証でデータファイルを削除する為、そのデータファイルをファイルシステム上に作成して頂いております。
3. RMANを使用して、表領域”TBS45″を構成するデータファイルのレベル0のイメージ・コピー・バックアップ(=datafilecopy)を取得してください。
$ export NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS' $ rman target / RMAN> BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'INCR_UPDATE' TABLESPACE TBS45 ; Starting backup at 2016/06/02 02:17:56 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=262 device type=DISK allocated channel: ORA_DISK_2 channel ORA_DISK_2: SID=24 device type=DISK no parent backup or copy of datafile 5 found channel ORA_DISK_1: starting datafile copy input datafile file number=00005 name=/u01/app/oracle/oradata/orcl/tbs45.dbf output file name=+FRA/ORCL/DATAFILE/tbs45.284.913429079 tag=INCR_UPDATE RECID=45 STAMP=913429090 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15 Finished backup at 2016/06/02 02:18:13 $ sqlplus / as sysdba SQL> set linesize 100 col DATAFILE_NAME for a40 col DATAFILECOPY_NAME for a40 select A.FILE#, A.NAME as "DATAFILE_NAME", B.NAME as "DATAFILECOPY_NAME" from V$DATAFILE "A", V$BACKUP_COPY_DETAILS "B" where A.FILE# = B.FILE# order by 1 ; F# DATAFILE_NAME DATAFILECOPY_NAME -- -------------------------------------- -------------------------------------- 5 /u01/app/oracle/oradata/orcl/tbs45.dbf +FRA/ORCL/DATAFILE/tbs45.284.913429079
データファイルのイメージ・コピー・バックアップを取得するコマンドは幾つか存在しますが、上の回答例では高速増分バックアップで使用するコマンドを使用させて頂いております。これも大切なコマンドですからシッカリと復習しておいてくださいね。
一点、覚えておいておいた方が良いこととして、バックアップ元のデータファイル名とバックアップファイル名の把握の仕方です。RMANでバックアップを取得した際に、標準出力として赤文字で表した2行(「input datafile …」と「output file name …」)が正にそれであり、input側がバックアップ元のデータファイル名、output側がバックアップファイル名です。RMANの標準出力でなくても、v$datafileとv$backup_copy_detailsを参照することで確認することが可能です。今回の例では、ファイルシステム上のデータファイルをASMディスク・グループFRA上へバックアップしていますね。(あくまで検証目的の構成ですよ)
4. 検証の目的の為、演習2で作成したデータファイルをOS上から削除して下さい。削除後、”おまじない”としてデータベースに対してCheckpointを明示的に実行して下さい。
$ rm -rf /u01/app/oracle/oradata/orcl/tbs45.dbf $ sqlplus / as sysdba SQL> alter system checkpoint ;
一般に知られていることだと思いますが、Linux OSにおいてファイルシステム上のデータファイルは、データベース・インスタンスが稼働中であっても「rm」コマンドで削除することが可能です。オペレーションミスという事故が起きそうな臭いがしますね。一方、ASMディスク・グループ上のデータファイルはデータベース・インスタンスが稼働中は消せませんので安心です。
5. 表”TAB45″に対するクエリを実行し、ORAエラーが発生することを確認して下さい。
$ sqlplus TRY/TRY
SQL> select count(*) from TAB45 ;
select count(*) from TAB45
*
ERROR at line 1:
ORA-01116: error in opening database file 5
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/tbs45.dbf'
さて、如何でしょうか?そうですよね・・・データファイルが消えちゃったんですから、そのデータファイルに格納されてた表データを読みとれるはずがありませんね。と言う事で少し長かったですが準備が完了しました。
次の演習で、RMANのSWITCHコマンドを体験して頂く前に、ちょっと脱線して復習してみましょう。
今回の障害が発生した際の復旧コマンドは直ぐに分かりますか?分からない場合にはどうしますか? 頑張って思い出して下さい。そう、そうですね。そうですよ!!Recovery Managerの「Data Recovery Advisor」を使えば、アドバイスしてくれましたね。忘れてしまっている方は、是非、第24回の連載を読み直してみて下さい。
実際に、この演習5の後に、Data Recovery Advisorを実行してみると、残念ながらSWITCHコマンドをアドバイスしてくれる事は有りませんでしたが、通常の復旧手順がアドバイスされることを私の環境で確認済みです。とは言え、記事が長くなってしまうので割愛させて頂きますので、ご興味のある方は、是非試してみて下さいね。
6. RMANのSwitchコマンドを使用して、演習3で取得したdatafilecopyを表領域”TBS45″のデータファイルとして認識させて下さい。
$ rman target /
RMAN> sql 'alter database datafile 5 offline';
RMAN> SWITCH DATAFILE 5 TO COPY ;
datafile 5 switched to datafile copy "+FRA/ORCL/DATAFILE/tbs45.284.913429079"
RMAN> RECOVER DATAFILE 5 ;
Starting recover at 2016/06/02 02:43:24
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=271 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=262 device type=DISK
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 2016/06/02 02:43:26
RMAN> sql 'alter database datafile 5 online';
まず、対象のデータファイルをOFFLINE化して下さい。これはSQL*Plusからでも実行できますが、今回はRMANユーティリティからSQL文を実行する例を示したかったので、上記回答例のように「sql」コマンドを使ってみました。
そして、SWITCHコマンドの登場です。わずか「SWITCH DATAFILE <DataFIle#> TO COPY」と実行するだけOKです。これが何をしているかを私なりの言葉で解説させて頂きます。そもそも、データベース・インスタンスがどのデータファイ ルを読み込むのかは制御ファイルで「XXX表領域を構成するデータファイルはYYYです」と言うように管理されています。さらに、制御ファイ ルではRMANバックアップの情報も保持していますので「XXX表領域のイメージ・コピー・バックアップはZZZです」も理解しています。
RMANのSWITCHコマンドではこの2つの情報を元に「XXX表領域を構成するデータファイルはZZZです」に書き直してくれてしまうのですね。つまり、管理情報を書き換えているだけで、通常のリストア作業にように、バックアップファイルを読み込んでデータファイルとして書き込むディスクI/Oがゼロで済む = リストア時間ゼロを実現出来るのですね。素敵ですね。
ただし、SWITCHコマンドを使うには、レベル0のバックアップがイメージ・コピーである必要がある点にご注意ください。RMANのバックアップはイメージ・コピーの形式だけではなく、バックアップ・セット形式もありますので。とは言え、RMANによる高速増分バックアップ & 増分更新バックアップでバックアップ運用をされるケースでは、レベル0のバックアップはイメージ・コピー形式しか選択できませんでしたよね?(第21回で解説してあります)
もう一つの注意点は、本番データファイルを配置しておくストレージはI/O性能が高いものを使用し、バックアップ先のストレージは安価でストレージI/O性能が前者よりも劣るものを使用されるシステムもあるかと思いますので、SWITCHコマンドで切り替わった先の新データファイルが配置されているストレージのI/O性能はきちんと考慮しておいてくださいね。
でもって、SWITCHしたデータファイルに対してリカバリを実行し、最後にOFFLINE状態のデータファイルをONLINE化して完了です!!
7. 最後に、演習5で実行したTAB45に対するクエリが正常に実行されることを確認して下さい。
$ sqlplus TRY/TRY
SQL> select count(*) from TAB45 ;
COUNT(*)
----------
224000
念のために、きちんと表データが読みこめることを確認しておきましょう。演習にする必要も有りませんね・・・失礼しました!
さて、今更ながらのRMANのSWITCHコマンドを試して頂きましたが、如何でしたでしょうか?
万が一の障害時の復旧時間を最小化する目的として、リストア時間をゼロに出来る点は非常に気持ちが良い解決策ですよね。ストレージ側のコピー機能でバックアップを取得しているケースでは逆方向の同期により一瞬でリストア出来ると言われますが、RMANのSWITCHコマンドも負けていないことを感じて頂けたのであれば嬉しい限りです。また、以前の連載でも紹介させて頂いておりますが、RMANバックアップはブロック破損をチェックしながらバックアップしてくれていますし、取得したバックアップに対してもブロック破損のチェックを行えます。つまり、確実に復旧できるバックアップを保持できている点は、ストレージ側のコピー機能よりも優れていると言えるのではと個人的には思います。
- RMANは、高速増分バックアップで更新ブロックのみをバックアップ可能
- RMANは、データベース・レベルでのブロック破損をチェックしながらバックアップ可能
- RMANは、取得したバックアップの正常性を検証可能
- RMANは、SWITCHコマンドでリストア時間ゼロを実現可能
今回も最後までお付き合い頂きましてありがとうございました。是非、感想や質問をお待ちしておりますね。次回以降もどうぞよろしくお願い致します。
