~オラクルDB担当エンジニア直伝~

ユージ&ギョータの実践データベース講座

Oracle Database 12cを使ってみよう

マルチテナント・アーキテクチャ編 第3回 バックアップ&リカバリ

第2回では、プラガブル・データベース(以降PDB)上で表領域の作成や、ユーザー作成、表の作成を行いました。実行するSQL文や操作は今までのデータベースと同様に行えることが確認できたのではないでしょうか?

第3回では、マルチテナント・コンテナ・データベース(以降CDB)およびPDBのバックアップとリカバリを行ってみます。

マルチテナント・アーキテクチャでは、CDBおよびPDB単位でバックアップやリカバリを行えます。例えば、バックアップはCDB全体で取得しておいて、特定のPDBに問題が発生した時に、そのPDBだけリカバリするということもできます。

本ガイドに記載している内容は、Oracle Database 12c Release 1の機能評価を手早く行うことを目的としています。システムおよびパッケージの開発や実行環境で使用する際には、関連ドキュメントを参照の上、実施してください。 また、本ガイドは単に情報として提供されるものであり、内容に誤りがないことの保障や弊社サポート部門へのお問い合わせはできませんのでご理解ください。

1.CDBのバックアップとPDB単位のリカバリ

CDB全体のバックアップがある場合、CDB全体のリストア、リカバリは通常のデータベースと同様です。マルチテナント・アーキテクチャの場合に異なるのは、CDB全体のバックアップを使用して、特定のPDBをリストア、リカバリできる点になります。

ここでは、CDB全体のバックアップ取得し、pdb2の表を削除し、そこから過去の時点までバックアップから戻してみましょう。

まずは、CDB全体のバックアップを取得します。

バックアップやリカバリにはRecovery Manager(以降RMAN)を使用します。データベースがインストールされているサーバーにログインし、ORACLE_HOMEやORACLE_SIDなどの必要な環境変数をセットしてください。 (第一回で使用したインストール・ガイドにしたがってインストール、データベース作成を行った場合は、ORACLE_HOMEは” /u01/app/oracle/product/12.1.0/dbhome_1”、ORACLE_SIDは”orcl”になります/p>

また、今回はFast Recovery Areaにバックアップを保存します。Fast Recovery AreaはDB_RECOVERY_FILE_DEST初期化パラメータで指定した場所(ディレクトリ)になります。この領域のサイズは、DB_RECOVERY_FILE_DEST_SIZE初期化パラメータで指定します。このパラメータの値と実際の領域の空き容量が十分(今回は10G程度)あることを確認しておきます。

それではCDBのバックアップを行います。バックアップはRMANのBACKUP DATABASEコマンドを使用します。 以下はコマンドの例と、その出力例です


  
$ #環境変数の設定
$ export ORACLE_HOME=/u01/app/oracle_seone/product/12.1.0/dbhome_1
$ export ORACLE_SID=orcl
$
$ rman target /      # RMANの起動

Recovery Manager: Release 12.1.0.1.0 - Production on 木 12月 26 20:55:09 2013

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

ターゲット・データベース: ORCL (データベースID=1351557919)に接続されました

RMAN> backup database;

backupが開始されました(開始時間: 13-12-26)
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=362 デバイス・タイプ=DISK

…途中省略

backupが完了しました(完了時間: 13-12-26)

Control File and SPFILE Autobackupが開始されました(開始時間: 13-12-26)
ピース・ハンドル=/u01/app/oracle/recovery_area/ORCL/autobackup/2013_12_26/o1_mf_s_835218051_9csqtnf4_.bkp 
コメント=NONE
Control File and SPFILE Autobackupが完了しました(完了時間: 13-12-26)

 RMAN> 
 
 

これで、CDBのバックアップが取得できました。

次にpdb2のファイルのEMP表を削除します。 その前に、後で復旧の確認をするため、データを一件挿入し、現在時間を確認します。 リカバリの際に、その時間まで戻してデータを復旧します。


  
$ rm /u01/app/oracle/oradata/orcl/pdb2/users01.dbf            # データファイルの削除
$ sqlplus hr/oracle@localhost/pdb2              # SQL*PlusからHRユーザーでpdb2に接続

SQL*Plus: Release 12.1.0.1.0 Production on 木 12月 26 21:11:09 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

最終正常ログイン時間: 木 12月 26 2013 21:10:49 -05:00


Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。

SQL> -- データを挿入
SQL> insert into emp values (1, 'SCOTT'); 

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> -- データが挿入されていることを確認
SQL> select * from emp;

     EMPNO NAME
---------- --------------------
	 1 SCOTT

SQL> -- 現在時間を確認(後でこの時間までデータを戻します)
SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
13-12-26 21:16:36.141749 -05:00

SQL> -- 表を削除
SQL> drop table emp;

表が削除されました。

SQL> select * from emp;
select * from emp
              *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


SQL> 
 
 

それでは、RMANを使用してpdb2のEMP表をリカバリしましょう。 pdb2でPoint-in-Timeリカバリを実行し、過去のデータが削除される前に戻します。マルチテナント・アーキテクチャでは、個々PDBについて他のPDBに影響を与えずにリカバリできます。 (Oracle Database 12cでは表単位でバックアップから過去の任意の時間にデータを戻す新機能も実装されましたが、ここではPDB単位で戻します。)

通常、マルチテナント・アーキテクチャにおけるRMANでの操作は、多くの場合、PDBの管理者が自分の所有するPDBに接続してリストアやリカバリ操作を行うこともできますし、CDBの管理者がCDBに接続して特定のPDBを指定してリストアやリカバリを行うこともできます。複数のPDBを一度にリストアやリカバリする場合には、CDBに接続して実行する方が、操作や手間が少なくてすみます。 ただし、Point-in-Timeリカバリなどいくつかの操作についてはCDBに接続する必要があります。そのため、今回の例ではCDBに接続して、リストアおよびリカバリを行います。 (Oracle Database 12cのRMANでは、SQL文をRMANから実行できるようになり、SQL*Plusなどを切り替えて使用する手間を省けます。)


  
$ rman target admin/oracle@localhost/pdb2           # pdb2に接続

Recovery Manager: Release 12.1.0.1.0 - Production on 木 12月 26 21:19:41 2013

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

ターゲット・データベース: ORCL (データベースID=1351557919)に接続されました

RMAN> alter pluggable database pdb2 close; # pdb2をクローズ

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
文が処理されました


RMAN> restore pluggable database pdb2; # pdb2のリストアを実施

restoreが開始されました(開始時間: 13-12-26)
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=16 デバイス・タイプ=DISK

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています

…途中省略

チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:55
restoreが完了しました(完了時間: 13-12-26)

RMAN> recover pluggable database pdb2 until 
time "to_timestamp('13-12-26 21:16:36','YY-MM-DD HH24:MI:SS')"; # pdb2のデータが存在した時間までリカバリを実行

recoverが開始されました(開始時間: 13-12-26)
現在のログがアーカイブされました。
チャネルORA_DISK_1の使用
RMAN-05026: 警告: 次の表領域のセットは、指定したPoint-in-Timeへの適用が想定されています

UNDOセグメントがあると予測される表領域のリスト
表領域SYSTEM
表領域UNDOTBS1

自動インスタンスを作成しています(SID='bkgB')

自動インスタンスに使用される初期化パラメータ:
db_name=ORCL
db_unique_name=bkgB_pitr_pdb2_ORCL
compatible=12.1.0.0.0
db_block_size=8192
db_files=200
sga_target=1G
processes=80
diagnostic_dest=/u01/app/oracle
#No auxiliary destination in use
enable_pluggable_database=true
_clone_one_pdb_recovery=true
control_files=/u01/app/oracle/recovery_area/ORCL/controlfile/o1_mf_9css8kl2_.ctl
#No auxiliary parameter file used


自動インスタンスORCLを起動しています

Oracleインスタンスが起動しました

システム・グローバル領域の合計は、   1068937216バイトです。

Fixed Size                     2296576バイト
Variable Size                293602560バイト
Database Buffers             767557632バイト
Redo Buffers                   5480448バイト
自動インスタンスが作成されました

メモリー・スクリプトの内容:
{
# set requested point in time
set until  time "to_timestamp('13-12-26 21:16:36','YY-MM-DD HH24:MI:SS')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
}
メモリー・スクリプトを実行しています

…途中省略


メディア・リカバリを開始しています

スレッド1 (順序421)のアーカイブ・ログは、ファイル/u01/app/oracle/recovery_area/ORCL/archivelog/2013_12_26/
o1_mf_1_421_9css8j7h_.arcとしてディスクに存在します
アーカイブ・ログ・ファイル名=/u01/app/oracle/recovery_area/ORCL/archivelog/2013_12_26/
o1_mf_1_421_9css8j7h_.arc スレッド=1 順序=421
メディア・リカバリが完了しました。経過時間: 00:00:03
recoverが完了しました(完了時間: 13-12-26)

SQL文: alter database open read only



Oracleインスタンスがシャットダウンしました


自動インスタンスを削除しています
自動インスタンスが削除されました
補助インスタンス・ファイル/u01/app/oracle/recovery_area/ORCL/datafile/o1_mf_sysaux_9css950y_.dbfを削除しました
補助インスタンス・ファイル/u01/app/oracle/recovery_area/ORCL/controlfile/o1_mf_9css8kl2_.ctlを削除しました
recoverが完了しました(完了時間: 13-12-26)

RMAN> alter pluggable database pdb2 open resetlogs; # pdb2をオープン

文が処理されました
 
 

上記の様に、Point-in-Timeリカバリでは、補助インスタンスと呼ばれる、インスタンスを起動して、関連ファイル(PDB)をリカバリし、データをコピーして、リカバリが行われます。そのため、ストレージやメモリーなどを考慮する必要があります。

それでは、復旧が完了したので、HRユーザーで接続して、EMP表のデータを検索してみます。EMP表が存在し、データも復旧できたことが確認できると思います。


  
$ sqlplus hr/oracle@localhost/pdb2

SQL*Plus: Release 12.1.0.1.0 Production on 木 12月 26 21:30:18 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

最終正常ログイン時間: 木 12月 26 2013 21:11:09 -05:00


Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SQL> select * from emp;

     EMPNO NAME
---------- --------------------
	 1 SCOTT

SQL> 
 
 

2.個別のPDBのバックアップ

バックアップなどの操作は、PDB単位で何度も行うのでは無く、CDB単位行うことにより管理の手間を大きく減らすことができます。 しかし、アプリケーションの移行を行った直後など、個別にPDBのバックアップを取得したいケースもあります。その場合はPDB単位で個別にバックアップを取得することもできます。 ここでは、両方の方法についてRMANを使用してバックアップを取得してみます。

まずはPDBについて個別にバックアップを取得します。 個別のPDBのバックアップは、RMANの接続先をPDBにするだけで、あとは通常のデータベースと同じように行えます。

以下は、RMANでpdb2に接続し、pdb2のバックアップを取得しています。

$ rman target admin/oracle@localhost/pdb2 # RMANを起動し、pdb2に接続

Recovery Manager: Release 12.1.0.1.0 - Production on 金 9月 27 05:19:30 2013

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

ターゲット・データベース: ORCL (データベースID=1351557919)に接続されました

RMAN> backup database; #通常のバックアップと同じコマンドで、バックアップを取得

backupが開始されました(開始時間: 13-09-27)

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

チャネル: ORA_DISK_1が割り当てられました

チャネルORA_DISK_1: SID=129 デバイス・タイプ=DISK

チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています

チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています

入力データファイル・ファイル番号=00018 名前=/u01/app/oracle/oradata/orcl/pdb2/sysaux01.dbf

入力データファイル・ファイル番号=00017 名前=/u01/app/oracle/oradata/orcl/pdb2/system01.dbf

入力データファイル・ファイル番号=00020 名前=/u01/app/oracle/oradata/orcl/pdb2/users01.dbf チャネルORA_DISK_1: ピース1(13-09-27)を起動します

チャネルORA_DISK_1: ピース1(13-09-27)が完了しました

ピース・ハンドル=/u01/app/oracle/recovery_area/ORCL/E44518AB69F6645FE0435591B90AA534/backupset/2013_09_27/o1_mf_nnndf_TAG20130927T051942_94bmfhj8_.bkp タグ=TAG20130927T051942 コメント=NONE チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:55 backupが完了しました(完了時間: 13-09-27)

Control File and SPFILE Autobackupが開始されました(開始時間: 13-09-27) ピース・ハンドル=/u01/app/oracle/recovery_area/ORCL/autobackup/2013_09_27/o1_mf_s_827212839_94bmh8k1_.bkp コメント=NONE Control File and SPFILE Autobackupが完了しました(完了時間: 13-09-27)

この他に、CDBに接続して特定のPDBを指定してバックアップを取得できます。この場合は、複数のPDBを指定して一度にバックアップを取得できます。以下は、pdb1とpdb2を一度に取得している例です。

$ rman target / # RMANを起動しCDBに接続

Recovery Manager: Release 12.1.0.1.0 - Production on 金 9月 27 05:25:05 2013

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

ターゲット・データベース: ORCL (データベースID=1351557919)に接続されました

RMAN> backup pluggable database pdb1, pdb2; # pdb1、pdb2のバックアップを一度に取得

backupが開始されました(開始時間: 13-09-27)

チャネルORA_DISK_1の使用

チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています

チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています

入力データファイル・ファイル番号=00018 名前=/u01/app/oracle/oradata/orcl/pdb2/sysaux01.dbf

入力データファイル・ファイル番号=00017 名前=/u01/app/oracle/oradata/orcl/pdb2/system01.dbf

入力データファイル・ファイル番号=00020 名前=/u01/app/oracle/oradata/orcl/pdb2/users01.dbf

チャネルORA_DISK_1: ピース1(13-09-27)を起動します

チャネルORA_DISK_1: ピース1(13-09-27)が完了しました

ピース・ハンドル=/u01/app/oracle/recovery_area/ORCL/E44518AB69F6645FE0435591B90AA534/backupset/2013_09_27/o1_mf_nnndf_TAG20130927T053241_94bn5t

8c_.bkp タグ=TAG20130927T053241 コメント=NONE

チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:45

チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています

チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています

入力データファイル・ファイル番号=00009 名前=/u01/app/oracle/oradata/orcl/pdb1/sysaux01.dbf

入力データファイル・ファイル番号=00008 名前=/u01/app/oracle/oradata/orcl/pdb1/system01.dbf

入力データファイル・ファイル番号=00010 名前=/u01/app/oracle/oradata/orcl/pdb1/pdb1_users01.dbf

チャネルORA_DISK_1: ピース1(13-09-27)を起動します

チャネルORA_DISK_1: ピース1(13-09-27)が完了しました

ピース・ハンドル=/u01/app/oracle/recovery_area/ORCL/E43B5B3E90D5225DE0435591B90AA350/backupset/2013_09_27/o1_mf_nnndf_TAG20130927T053241_94bn77nm_.bkp タグ=TAG20130927T053241 コメント=NONE

チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:01:08

backupが完了しました(完了時間: 13-09-27)

Control File and SPFILE Autobackupが開始されました(開始時間: 13-09-27)

ピース・ハンドル=/u01/app/oracle/recovery_area/ORCL/autobackup/2013_09_27/o1_mf_s_827213680_94bn9pj7_.bkp コメント=NONE

Control File and SPFILE Autobackupが完了しました(完了時間: 13-09-27)

以上が、PDB単位のバックアップです。

PDB管理者は、必要に応じて使用しているPDBのバックアップを取得でき、リストア/リカバリすることも可能です。

3.まとめ

今回は、マルチテナント・アーキテクチャでのバックアップおよびリカバリを試してみました。

個々のPDBでは無くCDB全体についてバックアップを取得する場合は、たくさんのPDBがあってもバックアップの手間は1回ですみます。これにより、沢山のPDBがある場合は 手間を減らすことができ、またバックアップの取得漏れなども防ぐとこがができます。もちろんPDBの使用者が、個別の変更などをした後に自分の使用しているPDBのみをバックアップすることも可能です。 また、リストアやリカバリはPDBを含むCDB全体で行うこともできますし、個別のPDBについて行うこともできます。

このCDB全体でバックアックを取得して管理コストを下げられるという特徴と、ここのPDB単位でも操作できるという柔軟性が、マルチテナント・アーキテクチャの大きなバックアップ、リカバリの特徴です。

次回からは、PDBの複製(クローン)や移動など、PDB自体を管理する操作を試してみたいと思います。