しばちょう先生の試して納得!DBAへの道 indexページ▶▶


みなさん、こんにちは。 “しばちょう”こと柴田長(しばた つかさ)です。

非常に暑い日が続いておりますが、いかがお過ごしでしょうか?ビアガーデンやBBQ等、ビール好きには堪らない季節なのではないでしょうか?私は良く冷えたソフトな炭酸飲料 が専門なのですけどね。

さて、今回からはRecovery Manager(RMAN)をご紹介していきます。「RMANは、Oracle Databaseと統合し、バックアップおよびリカバリ・アクティビティを実行するためのOracle Databaseユーティリティ(概要マニュアルから抜粋)」です。

データベース管理者として最も恐ろしいのは”データ損失”であり、もしも貴重なデータが消えてしまった場合には、お客様のビジネス機会の損失にも繋がってしまう為、何としてでも回避しなければなりません。とは言え、データ損失を引き起こすメディア障害(データファイルを格納しているハードディスク・ドライブの故障等)やユーザー・エラー(データベース管理者や利用者の誤操作等)が何時発生するかは誰にも分かりませんので、もしもの時の為に十分な準備、さらには復旧オペレーションの習得をしておくことがDBAには求められます。

この「十分な準備」の中で絶対的なものが「バックアップ」ですが、“必要最低限の時間とH/Wリソースの消費で取得することができる”、”いざと言う時に必ず復旧することができる”ことが要求されます。ちなみに、前回前々回で体験して頂いたFlashback Databaseでは論理障害からの復旧を高速化する非常に有効な機能ではありますが、メディア障害やデータファイルの削除からの復旧には対処することができないのです。

と言う前振りからも想像できるように、RMANを使用すれば上記2つの要求をクリアできるという事を複数回にわたりご紹介していきたいと考えています。今回は基礎編として、RMANによる差分増分バックアップを体験して頂きたいと思います。以下の演習をOracle Database 11g Release 2 Enterprise Editionのデータベースで試してみてください。

  • 【今回ご紹介するネタ一覧(逆引き)】
  • 増分バックアップのベースとなる Level0イメージ・コピー・バックアップの取得(演習3)
  • データファイルとバックアップ ファイルのサイズ比較(演習3)
  • RMANのI/O量の確認(演習 3)
  • Level1の差分増分バック アップの取得(演習5)
  • Level0とLevel1の増分更新バックアップ(演習6)

1. RMANで非一貫性バックアップを取得するターゲット・データベースに対し、アーカイブ・ログ・モード、および高速リカバリ領域を設定してください。

    $ sqlplus /nolog
    SQL> -- 設定
    connect / as sysdba
    select STATUS from V$INSTANCE ;
    
    STATUS
    ------------
    OPEN
    
    alter database archivelog ;
    alter system set DB_RECOVERY_FILE_DEST = '+FRA' ;
    alter system set DB_RECOVERY_FILE_DEST_SIZE = 10g ;
    
    
    SQL> -- 確認
    archive log list
    
    SQL> データベース・ログ・モード     アーカイブ・モード
    自動アーカイブ                 有効
    アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
    最も古いオンライン・ログ順序   2
    アーカイブする次のログ順序   4
    現行のログ順序             4
    
    
    show parameter db_recovery
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_recovery_file_dest                string      +FRA
    db_recovery_file_dest_size           big integer 10G
    

マニュアル「バックアップおよびリカバリ・ユーザーズ・ガイド」で使用されている単語に慣れて頂く目的で、少し堅い言葉で演習問題を記述させて頂きました。

非一貫性バックアップとはデータベースがオープンされているときに作成されたバックアップです。ホット・バックアップ、オンライン・バックアップとも呼ばれるものですね。バックアップ処理の中ではデータ・ブロックのコピーを作成しますが、数多くのデータ・ブロックをコピーするとなると一瞬で完了するものではなく数十秒、数分、数時間という単位の時間を要することになるので、バックアップ中にデータ・ブロックが更新されることもあるでしょう。よって、バックアップ開始直後にコピーされたデータ・ブロックと、バックアップ終了直前にコピーされたデータ・ブロックではズレが生じる(一貫性が無い)ことになるので、それらのデータ・ブロック(正確にはデータファイル)をリストアした後に、メディア・リカバリを実行し、REDOログ内の更新情報を適用して全てのブロックを同じ地点に揃える(一貫性のある状態)にロールフォワードする必要が生じます。また、その際に必要となるREDOレコードがオンラインREDOログ・ファイル内に存在しているとも限りません。ログスイッチを繰り返して上書きされて消えてしまっているかもしれませんので、アーカイブ・モードでない限り非一貫性バックアップを作成することができないのです。

ターゲット・データベースとは、RMANがバックアップおよびリカバリ操作を実行するデータベースですね。これは特に説明は不要かと思いますが、概要マニュアルでは図を用いて紹介してあるので、そちらも必要に応じて参照してみてください。

上記の解答例は、Flashback Databaseの演習でも体験して頂いた設定ですね。今回もさりげなく、ASMディスクグループ(上記では”FRA”という名前)を高速リカバリ領域に設定しています。ASMについても近いうちにご紹介していきたいと考えています。

2. 本演習での差分増分バックアップの動作を理解し易くする為、ターゲット・データベース上に1GBの表領域”TBS21″を新たに作成し、その表領域上に512MBの表”TAB21″(第一カラムが主キーでNUMBER型の列名COL1、第二カラムがCHAR(1000)型の列名COL2)を作成して下さい。

    sqlplus /nolog
    SQL> -- TBS21表領域と、この表領域をデフォルト表領域とするTRYユーザーの作成
    connect / as sysdba
    create tablespace TBS21 datafile '+DATA(DATAFILE)' size 1g uniform size 4m ;
    create user TRY identified by TRY default tablespace TBS21 ;
    grant connect, resource, dba to TRY ;
    
    SQL> -- TAB21表の作成とデータ・ローディング
    connect TRY/TRY
    create table TAB21 (COL1 number NOT NULL, COL2 char(1000)) pctfree 10 ;
    
    insert /*+append */ into TAB21
    select LEVEL, 'hoge'||to_char(LEVEL) 
    from DUAL connect by LEVEL <= 7 * 128 * 508 ;
    commit;
    
    create unique index IDX_TBL21_COL1 on TAB21(COL1) ;
    alter table TAB21 add primary key (COL1) using index ;
    
    SQL> -- TRYスキーマ内のセグメント・サイズを確認
    set linesize 150
    col SEGMENT_NAME for a24
    select SEGMENT_TYPE, SEGMENT_NAME, sum(BYTES)/1024/1024
      from USER_SEGMENTS
     group by rollup(SEGMENT_TYPE, SEGMENT_NAME) ;
    
    SEGMENT_TYPE       SEGMENT_NAME             SUM(BYTES)/1024/1024
    ------------------ ------------------------ --------------------
    INDEX              IDX_TBL21_COL1                              8
    INDEX                                                          8
    TABLE              TAB21                                     512
    TABLE                                                        512
                                                                 520
    

こちらも毎回の作業となりますね。演習問題で”512MBの表”と細かくサイズを指定させて頂きましたが、この辺りをスラスラと実装できるスキルはあらゆる検証作業で重宝します。

非常に細かい話なので、ご興味があれば読んで頂きたいのですが、TAB21の表定義より1レコードが約1KB。データ・ブロックのサイズは8KBで、かつPCTFREEを10%確保したので、一つのデータ・ブロックには7レコードを格納することができる。そのブロックが128個で1MBになるので、「7 * 128 * 512」個のレコードを挿入すれば512MBになりそうです。しかし、INSERT文を高速化する為にダイレクト・ロードを行う「APPENDヒント句」を付けているので、初期エクステントである4MB(表領域作成時にUNIFORMサイズを4MBに指定している為)にはレコードは挿入されません。つまり、512 – 4 = 508MBにレコードを挿入することになりますので、「7 * 128 * 508」個のレコードを挿入すれば良いということになります。

3. RMANを使用して、増分更新バックアップのベースとなる、全てデータファイルのレベル0のイメージ・コピー・バックアップを取得してください。

    $ rman target /
    ターゲット・データベース: ORCL (データベースID=1287039091)に接続されました
    RMAN> -- レベル0のバックアップ実行
    BACKUP
      INCREMENTAL LEVEL 1
      FOR RECOVER OF COPY WITH TAG 'incr_update'
      DATABASE ;
    
    backupが開始されました(開始時間: 13-08-21)
    リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
    チャネル: ORA_DISK_1が割り当てられました
    チャネルORA_DISK_1: SID=37 デバイス・タイプ=DISK
    データファイル1の親バックアップまたはコピーが見つかりません
    データファイル2の親バックアップまたはコピーが見つかりません
    データファイル3の親バックアップまたはコピーが見つかりません
    データファイル5の親バックアップまたはコピーが見つかりません
    データファイル4の親バックアップまたはコピーが見つかりません
    チャネルORA_DISK_1: データファイルのコピーを開始しています
    入力データファイル・ファイル番号=00001 名前=+DATA/orcl/datafile/system.258.820462945
    出力ファイル名=+FRA/orcl/datafile/system.269.824073717 タグ=INCR_UPDATE レコードID=48 スタンプ
    =824073733
    チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:25
    チャネルORA_DISK_1: データファイルのコピーを開始しています
    入力データファイル・ファイル番号=00002 名前=+DATA/orcl/datafile/sysaux.259.820462945
    出力ファイル名=+FRA/orcl/datafile/sysaux.279.824073741 タグ=INCR_UPDATE レコードID=49 スタンプ
    =824073758
    チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:25
    チャネルORA_DISK_1: データファイルのコピーを開始しています
    入力データファイル・ファイル番号=00003 名前=+DATA/orcl/datafile/undotbs1.267.820462947
    出力ファイル名=+FRA/orcl/datafile/undotbs1.291.824073767 タグ=INCR_UPDATE レコードID=50 スタンプ
    =824073783
    チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:26
    チャネルORA_DISK_1: データファイルのコピーを開始しています
    入力データファイル・ファイル番号=00005 名前=+DATA/orcl/datafile/tbs21.257.824073659
    出力ファイル名=+FRA/orcl/datafile/tbs21.282.824073793 タグ=INCR_UPDATE レコードID=51 スタンプ
    =824073808
    チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:25
    チャネルORA_DISK_1: データファイルのコピーを開始しています
    入力データファイル・ファイル番号=00004 名前=+DATA/orcl/datafile/users.264.820462947
    出力ファイル名=+FRA/orcl/datafile/users.276.824073817 タグ=INCR_UPDATE レコードID=52 スタンプ
    =824073819
    チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:03
    backupが完了しました(完了時間: 13-08-21)
    
    Control File and SPFILE Autobackupが開始されました(開始時間: 13-08-21)
    ピース・ハンドル=+FRA/orcl/autobackup/2013_08_21/s_824073820.284.824073821 コメント=NONE
    Control File and SPFILE Autobackupが完了しました(完了時間: 13-08-21)
    
    RMAN> 
    

演習問題を実現するRMANのバックアップ・コマンドを探すのには少々苦労したかと思います。バックアップおよびリカバリ・ユーザーズ・ガイドは非常に情報量が豊富であり様々なケースに対応したコマンドが掲載されていますが、それが逆にある程度の読み込み時間が必要となってしまうのかと想像しています。

ポイントは「増分更新バックアップのベースとなる」という部分です。とは言え、マニュアルには「増分」、「差分」、「累積」、「更新」と言った日本人的には紛らわしい単語が組み合わさったバックアップ名がRMAN初心者にとっては混乱させられてしまうポイントだと思います。ちょっと整理してみますね。

まず、これらはすべて増分バックアップにカテゴライズされます。増分ということなので、ベースの全体バックアップが存在していて、そこから変更の有ったデータ・ブロックだけ(増分)をバックアップしていくことを増分バックアップと呼びます。この前者がレベル0バックアップ、後者がレベル1バックアップと呼びます。

そして、この増分バックアップの方法として、差分増分バックアップと累積増分バックアップの2種類が存在します。前述の説明の通り、レベル0はどちらの増分バックアップでも親(ベース)となるバックアップですが、レベル1の違いを理解することが各増分バックアップの違いを理解する近道です

差分増分バックアップのレベル1バックアップとは、 レベル1またはレベル0の最新の増分バックアップ以降に変更されたすべてのブロックをバックアップします。

累積増分バックアップのreberu1バックアップとは、 レベル0の最新の増分バックアップ以降に変更されたすべてのブロックをバックアップします。

さらに、この増分バックアップで作成したレベル0バックアップ(イメージ・コピー・バックアップ=データファイルそのままのコピー)にレベル1バックアップ(増分部分のデータ・ブロックだけの集合なので、データファイルそのままのコピーではない=バックアップ・セット形式)を適用して、レベル0バックアップを最新化していくことを増分更新バックアップと呼びます。


 

各単語の違いを理解するのは難しいですね。と言うことで、コマンドと合わせてもう少し理解を進めてみましょう。

「イメージ・コピー・バックアップ」を作成するのであれば、もっとシンプルな構文(BACKUP AS COPY DATABASE ;)で実現できますが、増分バックアップのベースとなるレベル0バックアップを作成する場合には、INCREMENTAL LEVEL0句を付ける必要があります。さらに、増分更新バックアップの為には、FOR RECOVER COPY OF句を付ける必要があります。

ちなみに、演習問題では「レベル0」とも宣言していますが上記の私の解答例では「INCREMENTAL LEVEL 1」としています。これは誤りでは無く、これでも正解です。このコマンドを実行したタイミングでレベル0のイメージ・コピー・バックアップが存在しない場合、自動的にレベル0のイメージ・コピー・バックアップの作成になることを覚えておいてください。データベースを運用する上でバックアップ処理は、恐らくDBAが手動で実行するのではなく、定期的に自動実行されるようにジョブに組み込むことになるでしょう。そのような場合、状況に合わせてレベル0 or レベル1のどちらのコマンドを実行させるのかという判断ロジックをDBAが実装しなければならないと考えがちですが、RMANではレベル0もレベル1も同じコマンドで実行できるので、この判断ロジックの実装が不要になるというメリットがあるのですね。


 

さて、バックアップの実行結果の読み方を少しだけご紹介しておきますね。次はTBS21表領域のデータファイルのコピーを実行している部分を4行だけ抜き出して、左側に行番号を私が振ったものです。

    1. チャネルORA_DISK_1: データファイルのコピーを開始しています
    2. 入力データファイル・ファイル番号=00005 名前=+DATA/orcl/datafile/tbs21.257.824073659
    3. 出力ファイル名=+FRA/orcl/datafile/tbs21.282.824073793 タグ=INCR_UPDATE レコードID=51 スタンプ
    =824073808
    4. チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:25
    
    

1行目:データファイルのコピーを開始すると宣言している

2行目:コピー元のデータファイル名は、「+DATA/orcl/datafile/tbs21.257.824073659」である

3行目:コピー先のバックアップ・ファイル名は、「+FRA/orcl/datafile/tbs21.282.824073793」である

4行目:データファイルのコピーが25秒で完了した

この演習3だけでも非常に多くの解説となってしまい申し訳ないのですが、「データファイルとバックアップのサイズ比較」と「レベル0バックアップ取得時のI/O量を確認」する2つのSQLをご紹介しておきます。

    $ sqlplus /nolog
    SQL> -- レベル0バックアップとデータファイルのサイズ比較
    connect / as sysdba
    set linesize 150 pages 5000
    col DATAFILE_NAME for a48
    col BKUPFILE_NAME for a48
    select A.FILE#, 
           A.NAME as "DATAFILE_NAME", A.BYTES/1024/1024        as "DATAFILE_SIZE(MB)",
           B.NAME as "BKUPFILE_NAME", B.OUTPUT_BYTES/1024/1024 as "BKUPFILE_SIZE(MB)"
      from V$DATAFILE "A", V$BACKUP_COPY_DETAILS "B"
     where A.FILE# = B.FILE#
     order by 1 ;
    
    FILE# DATAFILE_NAME                               DATAFILE_SIZE(MB) BKUPFILE_NAME                               BKUPFILE_SIZE(MB)
    ----- ------------------------------------------- ----------------- ------------------------------------------- -----------------
        1 +DATA/orcl/datafile/system.258.820462945                 1024 +FRA/orcl/datafile/system.269.824073717            1024.00781
        2 +DATA/orcl/datafile/sysaux.259.820462945                 1024 +FRA/orcl/datafile/sysaux.279.824073741            1024.00781
        3 +DATA/orcl/datafile/undotbs1.267.820462947               1024 +FRA/orcl/datafile/undotbs1.291.824073767          1024.00781
        4 +DATA/orcl/datafile/users.264.820462947                 23.75 +FRA/orcl/datafile/users.276.824073817             23.7578125
        5 +DATA/orcl/datafile/tbs21.257.824073659                  1024 +FRA/orcl/datafile/tbs21.282.824073793             1024.00781
    
    
    SQL> -- レベル0バックアップ取得時のI/O量を確認
    set linesize 150 pages 5000
    select FILETYPE_NAME, SMALL_READ_MEGABYTES, LARGE_READ_MEGABYTES, SMALL_WRITE_MEGABYTES, LARGE_WRITE_MEGABYTES
      from V$IOSTAT_FUNCTION_DETAIL
     where FUNCTION_NAME = 'RMAN' ;
    
    FILETYPE_NAME                SMALL_READ_MEGABYTES LARGE_READ_MEGABYTES SMALL_WRITE_MEGABYTES LARGE_WRITE_MEGABYTES
    ---------------------------- -------------------- -------------------- --------------------- ---------------------
    Control File                                   10                   19                     2                     9
    Data File                                       0                 4120                     0                     0
    Other                                           0                    0                     0                     0
    Data File Copy                                  0                    0                     0                  4120
    Other                                           0                    0                     0                     0
    Other                                           0                    0                     0                    10
    

データファイルの名前とサイズはでV$DATAFILEビュー、バックアップのファイル名とサイズはV$BACKUP_COPY_DATAILSビューで確認することができるので、それら2つのビューをFILE#カラムでジョインすれば簡単にサイズを比較することができます。小数点の差は気になるところですが、ほぼ同じサイズになっていることからレベル0バックアップはデータファイルをそのままコピーしていると理解して頂けるかと思います

また、これはV$IOSTAT_FUNCTION_DETAILビューを確認しても同じく理解できます。RMANがレベル0の為にデータファイルを読んだ量が4120MB(FILETYPE_NAME列がData Fileの行のLARGE_READ_MEGABYTES)であり、バックアップ・ファイルを書き出した量も4120MB(FILETYPE_NAME列がData File Copyの行のLARGE_WRITE_MEGABYTES)ですよ。このビューはRMAN以外でも使用できるので是非覚えておいてくださいね。

4. TAB21表内の150MB分(TBS21表領域の約15%)のブロックをUPDATE文にて更新してください。

    $ sqlplus /nolog
    SQL> -- UPDATE対象量の確認
    connect TRY/TRY
    select count(distinct(dbms_rowid.rowid_block_number(ROWID))) * 8 / 1024 as "UPDATED_MB"
      from TAB21
     where COL1 < 7 * 128 * 150 ;
    
    UPDATED_MB
    ----------
           150
    
    SQL> -- 150MB分を更新
    update TAB21 set COL2='updated' where COL1 < 7 * 128 * 150 ;
    commit ;
    

次の演習5において差分増分バックアップでレベル1バックアップを作成するので、TAB21表のレコードをUPDATEすることでバックアップ対象のデータ・ブロックを作ることが目的です。演習2において表を作成する際に、レコード数を指定して表のサイズを制御した考え方を用いれば、ここで何行のレコードを更新すれば150MB分のデータ・ブロックをUPDATEできるのかは難しくはないと思います。

5. RMANを使用して、全てデータファイルのレベル0の差分増分バックアップを取得して下さい。 ただし、RMANのI/O量を確認し易くする為にV$IOSTAT_FUNCTION_DETAILを初期化する目的で、データベースを再起動してからバックアップを開始してください。

    $ rman target /
    RMAN> -- ターゲット・データベースの再起動(あくまで検証の為。本来の運用では不要)
    shutdown immediate ;
    startup ;
    
    RMAN> -- レベル1の差分増分バックアップ実行
    BACKUP
      INCREMENTAL LEVEL 1
      FOR RECOVER OF COPY WITH TAG 'incr_update'
      DATABASE ;
    
    backupが開始されました(開始時間: 13-08-21)
    チャネル: ORA_DISK_1が割り当てられました
    チャネルORA_DISK_1: SID=38 デバイス・タイプ=DISK
    チャネルORA_DISK_1: 増分レベル1のデータファイル・バックアップ・セットを開始しています
    チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
    入力データファイル・ファイル番号=00001 名前=+DATA/orcl/datafile/system.258.820462945
    入力データファイル・ファイル番号=00002 名前=+DATA/orcl/datafile/sysaux.259.820462945
    入力データファイル・ファイル番号=00003 名前=+DATA/orcl/datafile/undotbs1.267.820462947
    入力データファイル・ファイル番号=00005 名前=+DATA/orcl/datafile/tbs21.257.824073659
    入力データファイル・ファイル番号=00004 名前=+DATA/orcl/datafile/users.264.820462947
    チャネルORA_DISK_1: ピース1(13-08-21)を起動します
    チャネルORA_DISK_1: ピース1(13-08-21)が完了しました
    ピース・ハンドル=+FRA/orcl/backupset/2013_08_21/nnndn1_incr_update_0.288.824074119 タグ
    =INCR_UPDATE コメント=NONE
    チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:46
    backupが完了しました(完了時間: 13-08-21)
    
    Control File and SPFILE Autobackupが開始されました(開始時間: 13-08-21)
    ピース・ハンドル=+FRA/orcl/autobackup/2013_08_21/s_824074164.281.824074165 コメント=NONE
    Control File and SPFILE Autobackupが完了しました(完了時間: 13-08-21)
    
    RMAN>
    

いよいよ今回の演習の本丸である、差分増分バックアップですね。とは言え、意外にもあっさり実行できたのではないでしょうか?演習3の解説(長過ぎてポイントしづらいですが)で、「RMANではレベル0もレベル1も同じコマンドで実行できる」と説明させて頂いた通り、上記の解答例でのレベル1バックアップの実行コマンドは、演習3でのレベル0バックアップの実行コマンドと完全に同じですよね。

ちなみに、累積増分バックアップのレベル1バックアップを取得したい場合には、「INCREMENTAL LEVEL 1」の後ろにCUMULATIVE句を付けるだけ良いです。


 

さて、実行結果としては出力が変化していますね。入力データファイルはきちんと5つのデータファイルが対象となっていますが、データファイル毎にバックアップ・ファイルが作成されているようには読めません。これはレベル1バックアップ=レベル0のバックアップ取得以降に変更されたデータ・ブロックだけをバックアップした増分なので、データファイルそのままのイメージ・コピー形式ではなくバックアップ・セット形式で保存されています。何となく、この2つの形式の違いについては分かってきた感じですよね。

と言う事は、このレベル1バックアップのサイズは、小さくなっていなければいけないと思いませんか?を確認してみたいと思います。

    $ sqlplus /nolog
    SQL> -- データファイルとレベル1のバックアップのサイズを比較
    connect / as sysdba
    select FILE#, INCREMENTAL_LEVEL, COMPLETION_TIME, BLOCKS, DATAFILE_BLOCKS, BLOCKS / DATAFILE_BLOCKS
      from V$BACKUP_DATAFILE
     where INCREMENTAL_LEVEL > 0
       and BLOCKS / DATAFILE_BLOCKS > .1
    ORDER BY FILE#;
    
         FILE# INCREMENTAL_LEVEL COMPLETI     BLOCKS DATAFILE_BLOCKS BLOCKS/DATAFILE_BLOCKS
    ---------- ----------------- -------- ---------- --------------- ----------------------
             3                 1 13-08-21      31295          131072             .238761902
             5                 1 13-08-21      19203          131072             .146507263
    
    
    SQL> -- レベル1バックアップ取得時のI/O量を確認
    set linesize 150 pages 5000
    select FILETYPE_NAME, SMALL_READ_MEGABYTES, LARGE_READ_MEGABYTES, SMALL_WRITE_MEGABYTES, LARGE_WRITE_MEGABYTES
      from V$IOSTAT_FUNCTION_DETAIL
     where FUNCTION_NAME = 'RMAN' ;
    
    FILETYPE_NAME                SMALL_READ_MEGABYTES LARGE_READ_MEGABYTES SMALL_WRITE_MEGABYTES LARGE_WRITE_MEGABYTES
    ---------------------------- -------------------- -------------------- --------------------- ---------------------
    Control File                                    5                   19                     2                     9
    Data File                                       0                 4120                     0                     0
    Other                                           0                    0                     0                     0
    Data File Incremental Backup                    0                    0                     0                   395
    Other                                           0                    0                     0                     0
    Other                                           0                    0                     0                    10
    
    
    

まず、V$BACKUP_DATAFILEビューを参照してデータファイルとレベル1バックアップのサイズを比較してみましょう。如何でしょうか?150MB分更新したTAB21表が格納されているTBS21表領域(FILE#=5)のレベル1バックアップのブロック数は「19,293 」ですが、そのレベル1バックアップを作成した際に読み込んだデータファイルのブロック数は「131,072」となっています。その比率は約14.6%となっており、演習4で更新したTBS21表領域のサイズ1GB上のTAB21表を150MB分更新した比率(約15%=150MB/1024MB)とほぼ一致するかと思います。凄いですね。本当に変更されたデータ・ブロックのみをバックアップしていると言い切れそうです。

また、RMANがこのレベル1バックアップを作成する為に読み書きしたI/O量をV$IOSTATA_FUNCTION_DETAILビューで確認する限り、データファイルの読み込みは4120MBに対し、バックアップとしての書き出し(DATA File Incremental Backupの行)は395MBとなっていますね。レベル0バックアップを作成する際は読み込み量と書き出し量は同じ4120MBでしたから、ここからもレベル1バックアップのサイズが必要最低限のサイズであることが理解できます。


 

それでは最後の演習6として、レベル0バックアップに、レベル1バックアップを適用する増分更新の処理を実施してみましょう。



 

6. レベル1のバックアップ取得時のイメージ・コピー・バックアップを作成(レベル0のイメージ・コピー・バックアップをレベル1の増分が作成された時点にロールフォワード)してください。

    $ rman target /
    RMAN> LIST DATAFILECOPY ALL ;
    
    データファイル・コピーのリスト
    =======================
    Key     File S 終了時間 Ckp SCN    Ckp時間
    ------- ---- - -------- ---------- --------
    48      1    A 13-08-21 14782610   13-08-21
            名前: +FRA/orcl/datafile/system.269.824073717
                 タグ: INCR_UPDATE
    
    49      2    A 13-08-21 14782626   13-08-21
            名前: +FRA/orcl/datafile/sysaux.279.824073741
                 タグ: INCR_UPDATE
    
    50      3    A 13-08-21 14782638   13-08-21
            名前: +FRA/orcl/datafile/undotbs1.291.824073767
                 タグ: INCR_UPDATE
    
    52      4    A 13-08-21 14782663   13-08-21
            名前: +FRA/orcl/datafile/users.276.824073817
                 タグ: INCR_UPDATE
    
    51      5    A 13-08-21 14782654   13-08-21
            名前: +FRA/orcl/datafile/tbs21.282.824073793
                 タグ: INCR_UPDATE
    
    
    RMAN> LIST BACKUP OF DATABASE ;
    
    バックアップ・セットのリスト
    ===================
    BS Key  Type LV Size       Device Type Elapsed Time 終了時間
    ------- ---- -- ---------- ----------- ------------ --------
    67      Incr 1  395.25M    DISK        00:00:40     13-08-21
            BPキー: 67   ステータス: AVAILABLE  圧縮: NO  タグ: INCR_UPDATE
            ピース名: +FRA/orcl/backupset/2013_08_21/nnndn1_incr_update_0.288.824074119
      バックアップ・セット67のデータファイルのリスト
      File LV Type Ckp SCN    Ckp時間  Name
      ---- -- ---- ---------- -------- ----
      1    1  Incr 14825979   13-08-21 +DATA/orcl/datafile/system.258.820462945
      2    1  Incr 14825979   13-08-21 +DATA/orcl/datafile/sysaux.259.820462945
      3    1  Incr 14825979   13-08-21 +DATA/orcl/datafile/undotbs1.267.820462947
      4    1  Incr 14825979   13-08-21 +DATA/orcl/datafile/users.264.820462947
      5    1  Incr 14825979   13-08-21 +DATA/orcl/datafile/tbs21.257.824073659
    

まずは、増分更新を行う(レベル0のイメージ・コピー・バックアップをレベル1の増分が作成された時点にロールフォワード)前に、各バックアップのSCN(システム変更番号)を確認しておきましょう。簡単に行ってしまえば、SCNはデータベースでコミット処理が行われることでカウントアップしていくものなので、値が小さい方が古い、値が大きい方が新しいバックアップであることが理解できます。

ちなみに、RMANの「LIST DATAFILECOPY ALL;」コマンドでレベル0のイメージ・コピー・バックアップのSCNを確認すると、5つ全部覚えてられないのでTBS21表領域のデータファイルに限定すると「14782654 」となっていて、「LIST BACKUP OF DATABASE;」コマンドでレベル1のバックアップ・セットのSCNを確認すると「14825979」となっています。よって、これから行う増分更新処理により、レベル0のイメージ・コピー・バックアップのSCNがレベル1のバックアップ・セットのSCNに変化すれば、検証成功ということになることが予想できたかと思います。

    $ rman target /
    RMAN> -- 増分更新処理の実行
    RECOVER COPY OF DATABASE WITH TAG 'incr_update';
    
    recoverが開始されました(開始時間: 13-08-21)
    チャネル: ORA_DISK_1が割り当てられました
    チャネルORA_DISK_1: SID=37 デバイス・タイプ=DISK
    チャネルORA_DISK_1: 増分データファイル・バックアップ・セットのリストアを開始しています
    チャネルORA_DISK_1: リカバリするデータファイル・コピーを指定しています
    リカバリしているデータファイル・コピーのファイル番号=00001 名前=+FRA/orcl/datafile/system.269.824073717
    リカバリしているデータファイル・コピーのファイル番号=00002 名前=+FRA/orcl/datafile/sysaux.279.824073741
    リカバリしているデータファイル・コピーのファイル番号=00003 名前
    =+FRA/orcl/datafile/undotbs1.291.824073767
    リカバリしているデータファイル・コピーのファイル番号=00004 名前=+FRA/orcl/datafile/users.276.824073817
    リカバリしているデータファイル・コピーのファイル番号=00005 名前=+FRA/orcl/datafile/tbs21.282.824073793
    チャネルORA_DISK_1: バックアップ・ピース
    +FRA/orcl/backupset/2013_08_21/nnndn1_incr_update_0.288.824074119から読取り中です
    チャネルORA_DISK_1: ピース・ハンドル
    =+FRA/orcl/backupset/2013_08_21/nnndn1_incr_update_0.288.824074119 タグ=INCR_UPDATE
    チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
    チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:07
    recoverが完了しました(完了時間: 13-08-21)
    
    Control File and SPFILE Autobackupが開始されました(開始時間: 13-08-21)
    ピース・ハンドル=+FRA/orcl/autobackup/2013_08_21/s_824074426.259.824074427 コメント=NONE
    Control File and SPFILE Autobackupが完了しました(完了時間: 13-08-21)
    
    RMAN>
    

はい、RECOVER COPY OF DATABASEコマンドを実行することで、増分更新の処理を行っています。上記の解答例での出力結果を読む限り、「リカバリするデータファイル・コピー(増分更新する先)」として、レベル0のイメージ・コピー・バックアップの5つのデータファイルが指定されていることが理解できます。また、「リストアするバックアップ・ピース(増分更新する元)」として、レベル1のバックアップ・セットが読み込まれていることも理解できます。そして、この増分更新処理は7秒で完了しています。レベル0のバックアップでは5つのデータファイルで合計104秒(演習3を参照)要していたことと比較すると、非常に効率的に処理を行っているような感覚を覚えますよね。

    $ sqlplus /nolog
    SQL> -- 増分更新時のI/O量を確認
    connect / as sysdba
    set linesize 150 pages 5000
    select FILETYPE_NAME, SMALL_READ_MEGABYTES, LARGE_READ_MEGABYTES, SMALL_WRITE_MEGABYTES, LARGE_WRITE_MEGABYTES
      from V$IOSTAT_FUNCTION_DETAIL
     where FUNCTION_NAME = 'RMAN' ;
    
    FILETYPE_NAME                SMALL_READ_MEGABYTES LARGE_READ_MEGABYTES SMALL_WRITE_MEGABYTES LARGE_WRITE_MEGABYTES
    ---------------------------- -------------------- -------------------- --------------------- ---------------------
    Control File                                    8                   20                     2                     9
    Other                                           0                    0                     0                     0
    Data File Backup                                0                  395                     0                     0
    Data File Copy                                  0                    0                     2                   393
    Other                                           0                    0                     0                     0
    Other                                           0                    0                     0                    10
    

V$IOSTATA_FUNCTION_DETAILビューを参照する限り、読み込みと書き出しのI/O量は395MBで同じであることが確認できます。(読み込みはData File Backup行のLARGE_READ_MEGABYTES列、書き出しはData File Copy行のSMALL_WRITE_MEGABYTES + LARGE_WRITE_MEGABYTES)さらに、この395MBと言うのは、演習5で取得したレベル1の差分増分バックアップのサイズと完全に一致します。

これらの事実より、この演習6で実行した増分更新の処理は、レベル1の差分増分バックアップを読み込んで、(レベル0のイメージ・コピー・バックアップは読み込まずに)レベル0のイメージ・コピー・バックアップへ直接書き出していることが理解できますね。

    RMAN> LIST DATAFILECOPY ALL ;
    
    データファイル・コピーのリスト
    =======================
    Key     File S 終了時間 Ckp SCN    Ckp時間
    ------- ---- - -------- ---------- --------
    54      1    A 13-08-21 14825979   13-08-21
            名前: +FRA/orcl/datafile/system.269.824073717
                 タグ: INCR_UPDATE
    
    55      2    A 13-08-21 14825979   13-08-21
            名前: +FRA/orcl/datafile/sysaux.279.824073741
                 タグ: INCR_UPDATE
    
    56      3    A 13-08-21 14825979   13-08-21
            名前: +FRA/orcl/datafile/undotbs1.291.824073767
                 タグ: INCR_UPDATE
    
    53      4    A 13-08-21 14825979   13-08-21
            名前: +FRA/orcl/datafile/users.276.824073817
                 タグ: INCR_UPDATE
    
    57      5    A 13-08-21 14825979   13-08-21
            名前: +FRA/orcl/datafile/tbs21.282.824073793
                 タグ: INCR_UPDATE
    

最後になりましたが、上記の出力結果より、増分更新の処理によって、想定通りにレベル0のイメージ・コピー・バックアップのSCNがレベル1のバックアップのSCNまでロールフォワードされていることが確認できますね。RMAN、お見事です。


 

さて、いかがでしたでしょうか?

少々長い解説となってしまいましたが、RMANの増分バックアップについての理解を深めて頂けたかと思います。今回は基礎編ということで、まだRMANの魅力をご紹介し切ることはできておりませんが次回以降も頑張っていきたいと思います。もっと早くRMANの魅力を知りたいという方は、本ページの先頭にある「Oracle DBA & Developer Day 2012」の私のプレゼン資料をご参照頂ければ幸いです。

ちなみに、今回の演習ではレベル1の増分バックアップは、レベル0のバックアップ以降に変更のあったデータ・ブロックだけをバックアップするという必要最低限のサイズになる部分をフォーカスさせて頂きましたが、次回はこのレベル1バックアップを作成する際に、H/Wリソースの消費量を低減し、より高速化に寄与するブロック・チェンジ・トラッキングというブロックの変更履歴を管理する機能を体験して頂く予定です。次回もよろしくお願い致します。


ページトップへ戻る▲

 

しばちょう先生の試して納得!DBAへの道 indexページ▶▶