Oracle Database 12c R2には非常に多くの新機能があります。これまでに存在しなかった純粋な意味での新機能もありますし、従来から存在している機能を改善した位置づけの新機能もあります。これらの新機能すべてをチェックすることは非常に大変な作業です。本連載では、Oracle Databaseを日々愛用(≒酷使!)するコーソルのOracleスペシャリストがチェックし、特に有用と思われる12c R2新機能をご紹介します。
是非本連載の記事をご覧いただき、現場で活用できそうな機能がありましたら、ぜひその新機能を使っていただきたいと思います。
本連載が、みなさまのお役にたてば幸いです。
株式会社コーソル 守田 典男(もりた のりお)
コーソルに中途入社後、Oracle製品サポート業務や、データべース導入・構築業務の経験を積む。ORACLE MASTER Platinum Oracle Database 12c一番乗り。
「楽しく仕事をし、お客様と共に課題を解決する」をモットーに日々活動中。
オラクル社のノベルティグッズが大好きで、机のまわりにはノベルティグッズがいっぱい。
[会社紹介]
株式会社コーソル
Oracleを中心にデータベースの設計、導入・構築、運用管理、保守・サポート、コンサルティング等、「Oracle Database技術」の強みを活かしたビジネスを展開。エンジニア社員の「ORACLE MASTER」の保有率は98%に及び、その内の約40%はORACLE MASTER Platinumを取得している。技術者を数多く育成した企業に贈られる「Oracle Certification Award」を5年連続で受賞。2016年現在、企業別ORACLE MASTER 11g/12c Platinum取得者数ランキングで国内No.1。「CO - Solutions=共に解決する」の理念のもと、「データベース技術」×「サービス」を軸とし、高いDB技術をもとにお客様へ"心あるサービス"を提供し続けることにこだわっている。
Oracle Databaseでは、誤ってデータを削除したなど、論理障害がおこった場合にデータを過去の時点に戻す方法として、「フラッシュバック・データベース」と「Point-in-Timeリカバリ(不完全リカバリ)」の2つが用意されています。ただ、フラッシュバック・データベースの方が処理をより高速に実行できるため、一般にフラッシュバック・データベースの使用が推奨されています。
しかし、Oracle Database 12c Release 1(以下 12c R1)では、PDBを過去の時点に戻すために、フラッシュバック・データベースを使用できず、Point-in-Timeリカバリを使用するしかありませんでした。この問題点がOracle Database 12c Release 2(以下 12c R2)で解消されています。
表:PDBを過去の時点に戻す方法(12c R1、12c R2)
バージョン | PDBを過去の時点に戻す方法 |
12c R1 | Point-in-Timeリカバリ |
12c R2 | Point-in-Timeリカバリ |
フラッシュバック・データベース New!! |
本記事では、12c R2のPDBフラッシュバック・データベース機能について説明します。
12c R1では、PDBに対してフラッシュバック・データベースは実行できません。そのため、PDBを過去の時点に戻したい場合は、RMANによるPoint-in-Timeリカバリ(不完全リカバリ)を使用します。RMANでバックアップセットおよびアーカイブREDOログファイルからUNDO、SYSTEMおよびSYSAUXの各表領域を補助データベース上のCDBにリカバリし、そのデータを用いてターゲットデータベース上のPDBを目標時点にリカバリします。
図:RMAN Point-in-Timeリカバリを用いてPDBを過去の時点に戻す
なお、復旧する目標地点の指定として使用できる「リストアポイント」について、12c R1では対象のPDBのみ参照・使用できるリストアポイントを作成することはできません。12c R1では、CDB全体またはCDB内の複数のPDBに対して、特定の時点にリカバリすることができる「CDBリストアポイント」のみ作成できます。CDBリストアポイントは、どのPDBからでもリストアポイントの存在を確認することができます。これは、仮に利用者ごとにPDBを割り当てた場合、他の利用者が作成したリストアポイントの内容が見えてしまうことを意味します。
12c R2からマルチテナント環境でのUNDOモード「ローカルUNDOモード」が追加されたことにより、PDBにもフラッシュバック・データベースが実行できるようになりました。ローカルUNDOモードは、PDBごとにUNDO表領域をもつデータベースの構成です。12c R2ではデフォルトでローカルUNDOモードになっています。
PDBフラッシュバック・データベース機能を使うことで、RMANによるPoint-in-Timeリカバリで必要だった補助データベースを使用してバックアップからデータをリストア・リカバリする処理を行う必要がなくなります。バックアップファイルに頼ることなく、更新前のデータブロック・イメージが格納されているフラッシュバック・ログを使用してデータを過去の時点に巻き戻すことができるため、RMANのPoint-in-Timeリカバリに比べて短い時間でデータを戻すことが可能です。
図:PDBフラッシュバック・データベースを用いてPDBを過去の時点に戻す
それでは、PDBフラッシュバック・データベースの実際の動作を確認していきます。まず、CDBでフラッシュバックをONに設定します。個々のPDBに対してフラッシュバックの有効/無効を設定することはできませんので、ご注意ください。
[oracle@lc201rae1 ~]$ sqlplus / as sysdba
-- フラッシュバックを有効化
SQL> alter database flashback on;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
次に、フラッシュバック動作をデモするためにテスト用データを用意します。PDBに接続したあと、テストユーザとして「flbtest」を作成します。次にflbtestユーザでPDBに再接続し、4件ほどデータを登録していきます。
SQL> alter session set container=orclpdb;
Session altered.
-- flbtestユーザ作成
SQL> grant connect, resource, unlimited tablespace to flbtest identified by test;
Grant succeeded.
-- flbtestユーザで再接続
SQL> conn flbtest/test@orclpdb
Connected.
SQL> create table flbtbl(col1 number, col2 varchar(10));
Table created.
SQL> insert into flbtbl values(10,'a');
1 row created.
SQL> insert into flbtbl values(20,'b');
1 row created.
SQL> insert into flbtbl values(30,'c');
1 row created.
SQL> insert into flbtbl values(40,'d');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
30 c
40 d
SQL> conn system/oracle@orclpdb
Connected.
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1450255
この時点で、SCNは1450255となっています。今からテストデータを更新し、SCNを進めます。
ダミーデータを更新します。2件ほど削除しましょう。
SQL> conn flbtest/test@orclpdb
Connected.
SQL> delete from flbtbl where col1 in (30,40);
2 rows deleted.
SQL> commit;
Commit complete.
SQL> select * From flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
SQL> conn system/oracle@orclpdb
Connected.
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1450279
SCNが1450279に進みました。ここから、PDB「orclpdb」に対してフラッシュバック・データベースを実行し、SCN1450255の時点に戻してみます。フラッシュバック・データベースを実行するためには、SYSDBA権限またはSYSBACKUP権限を持つユーザで実行します。
SQL> conn / as sysdba
Connected.
SQL> alter session set container=orclpdb;
Session altered.
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
-- PDBをクローズ
SQL> alter pluggable database orclpdb close;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 ORCLPDB MOUNTED
SQL> flashback pluggable database orclpdb to scn 1450255;
Flashback complete.
PDBでフラッシュバック・データベースを実行できました。OPENするときは、resetlogsを指定することを忘れないようにしてください。
SQL> alter pluggable database orclpdb open resetlogs;
Pluggable database altered.
SQL> conn flbtest/test@orclpdb
Connected.
SQL> select * from flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
30 c
40 d
データが削除前に戻っていることが確認できました。補助データベースにデータをコピーしリストア・リカバリ、といった処理は行われません。RMANによるPoint-in-Timeリカバリと比べると、大幅に復旧時間を短縮できます。
さらにローカルUNDOモードでは、作成したPDBのみで参照・使用することができる「PDBリストアポイント」を作成できます。PDBを利用者に対して割り当てた場合、他のPDBの利用者が作成したリストアポイントの内容を参照・使用されることがありません。
リストアポイントを作成したいPDBに接続してから、create restore pointコマンドを実行すると、PDBリストアポイントを作成できます。作成したPDBリストアポイントは、v$restore_pointから確認できます。
-- PDB:orclpdbにて、PDBリストアポイント作成
SQL> conn / as sysdba
Connected.
SQL> alter session set container=orclpdb;
Session altered.
SQL> create restore point before_update;
Restore point created.
SQL> set line 200
SQL> col name for a20
SQL> col guarantee_flashback_database for a10
SQL> col pdb_restore_point for a17
SQL> col clean_pdb_restore_point for a25
SQL> SELECT name, guarantee_flashback_database, pdb_restore_point, clean_pdb_restore_point, pdb_incarnation#, storage_size FROM v$restore_point;
NAME GUARANTEE_ PDB_RESTORE_POINT CLE PDB_INCARNATION# STORAGE_SIZE
-------------------- ---------- ----------------- --- ---------------- ------------
BEFORE_UPDATE NO YES NO 1 0
別のPDB「testpdb」に接続し、作成したPDBリストアポイントが、testpdbからでは参照できないことを確認してみましょう。orclpdbでは、『BEFORE_UPDATE』というPDBリストアポイントでしたが、testpdbでは参照できません。testpdb内で作成したPDBリストアポイントのみが参照できます。
-- 別のPDB「testpdb」にて、PDBリストアポイント作成
SQL> set line 200
SQL> col name for a20
SQL> col guarantee_flashback_database for a10
SQL> col pdb_restore_point for a17
SQL> SELECT name, guarantee_flashback_database, pdb_restore_point, clean_pdb_restore_point, pdb_incarnation#, storage_size FROM v$restore_point;
no rows selected
SQL> create restore point before_test;
Restore point created.
SQL> SELECT name, guarantee_flashback_database, pdb_restore_point, clean_pdb_restore_point, pdb_incarnation#, storage_size FROM v$restore_point;
NAME GUARANTEE_ PDB_RESTORE_POINT CLE PDB_INCARNATION# STORAGE_SIZE
-------------------- ---------- ----------------- --- ---------------- ------------
BEFORE_TEST NO YES NO 0 0
PDBにフラッシュバック・データベースを実行するつもりでflashback pluggable databaseコマンドを実行しても、実際にはフラッシュバック・データベース相当の処理が実行されず、Point-in-Timeリカバリ相当の処理が内部的に実行される例外ケースが存在します。それは「共有UNDOモード」を使用している場合です。
共有UNDOモードは、CDBにあるUNDO表領域に全てのPDBのUNDOデータが格納されるモードです。12c R2でPDBごとにUNDO表領域をもつローカルUNDOモードが追加されましたが、12c R1の時点では、そもそもローカルUNDOモードが存在しなかったため、常に共有UNDOモードが使用されていました。
共有UNDOモードでflashback pluggable databaseコマンドを実行すると、Point-in-Timeリカバリ相当の処理が内部的に実行されます。バックアップをもとに補助データベースが作成され、補助データベースから過去の状態のPDBを復元します。
図:共有UNDOモードでflashback pluggable databaseコマンドを実行した場合
実際に実行時の様子をみていきましょう。UNDOモードは共有UNDOモードであることを確認してください。
CDBでフラッシュバックをONに設定します。
[oracle@lc201rae1 ~]$ sqlplus / as sysdba
-- UNDOモードの確認(TRUE:ローカルUNDO FALSE:共有UNDO)
SQL> select property_value from database_properties where property_name='LOCAL_UNDO_ENABLED';
PROPERTY_VALUE
-----------------
FALSE
-- フラッシュバックを有効化
SQL> alter database flashback on;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
フラッシュバック・データベースの実行前に、バックアップを取得しておきましょう。このバックアップからがスタートとなります。そして、ローカルUNDOモードのときと同様に、ダミーデータを登録していきます。PDBに接続し、テスト用にflbtestユーザを作成します。flbtestユーザでPDBに再接続した後、4件ほどデータを登録していきます。
SQL> alter session set container=orclpdb;
Session altered.
-- flbtestユーザ作成
SQL> grant connect, resource, unlimited tablespace to flbtest identified by test;
Grant succeeded.
-- flbtestユーザで再接続
SQL> conn flbtest/test@orclpdb
Connected.
SQL> create table flbtbl(col1 number, col2 varchar(10));
Table created.
SQL> insert into flbtbl values(10,'a');
1 row created.
SQL> insert into flbtbl values(20,'b');
1 row created.
SQL> insert into flbtbl values(30,'c');
1 row created.
SQL> insert into flbtbl values(40,'d');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
30 c
40 d
SQL> conn system/oracle@orclpdb
Connected.
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1883746
続いて、誤ってデータを消してしまったことを想定して、データを削除します。
SQL> conn flbtest/test@orclpdb
Connected.
SQL> delete from flbtbl where col1 in (30,40);
2 rows deleted.
SQL> commit;
Commit complete.
SQL> select * from flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
SQL> conn system/oracle@orclpdb
Connected.
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1884043
それでは、flashback pluggable databaseコマンドを実行します。"auxiliary instance"などの表記から、コマンドの実行中に補助データベースが作成されていることが確認できます。
[oracle@lc201rae1 oracle]$ rman target /
Recovery Manager: Release 12.2.0.1.0 - Production on Sun Mar 5 13:59:18 2017
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCL (DBID=1465614401)
RMAN> alter pluggable database orclpdb close;
using target database control file instead of recovery catalog
Statement processed
RMAN> flashback pluggable database orclpdb to scn 1883746;
Starting flashback at 05-MAR-17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=42 device type=DISK
current log archived
using channel ORA_DISK_1
RMAN-05026: warning: presuming following set of tablespaces applies to specified point-in-time
List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1
:
:
(中略)
:
:
Oracle instance shut down
Removing automatic instance
Automatic instance removed
auxiliary instance file /u01/app/oracle/fast_recovery_area/orcl/ORCL/datafile/o1_mf_sysaux_dcq6t60f_.dbf deleted
auxiliary instance file /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile/o1_mf_dcq6st56_.ctl deleted
Finished flashback at 05-MAR-17
RMAN> alter pluggable database orclpdb open resetlogs;
Statement processed
これで復旧できました。実際のデータをのぞいてみましょう。
[oracle@lc201rae1 ~]$ sqlplus flbtest/test@orclpdb
SQL> select * from flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
30 c
40 d
これまで説明したように、共有UNDOモードでflashback pluggable databaseコマンドを実行すると、コマンド名に反して、内部的にはPoint-in-Timeリカバリが実行されます。このため、事前にバックアップを取得しておく必要がありますし、補助データベース用の領域を確保しておく必要もあります。
ただし、共有UNDOモードでもインプレースでPDBフラッシュバック・データベースを使用することができる方法があります。それは、リカバリする地点として「クリーンPDBリストアポイント」を指定した場合です。クリーンPDBリストアポイントとは、12c R2から追加された機能であり、データの読み取り一貫性がとれた時点のリストアポイントです。PDBがクローズされており、未処理のトランザクションが存在しない場合に作成することができます。
-- クリーンPDBリストアポイントの作成
SQL> conn / as sysdba
Connected.
SQL> alter pluggable database orclpdb close;
Pluggable database altered.
SQL> alter session set container=orclpdb;
Session altered.
SQL> create clean restore point clean_before_update;
Restore point created.
SQL> set line 200
SQL> col name for a20
SQL> col guarantee_flashback_database for a10
SQL> col pdb_restore_point for a17
SQL> col clean_pdb_restore_point for a25
SQL>
SQL> SELECT name, guarantee_flashback_database, pdb_restore_point, clean_pdb_restore_point, pdb_incarnation#, storage_size FROM v$restore_point;
NAME GUARANTEE_ PDB_RESTORE_POINT CLEAN_PDB_RESTORE_POINT PDB_INCARNATION# STORAGE_SIZE
-------------------- ---------- ----------------- ------------------------- ---------------- ------------
BEFORE_UPDATE NO YES NO 1 0
CLEAN_BEFORE_UPDATE NO YES YES 2 0
-- クリーンPDBリストアポイントによるフラッシュバック・データベース
SQL> conn / as sysdba
Connected.
SQL> alter session set container=orclpdb;
Session altered.
SQL> alter pluggable database orclpdb close;
Pluggable database altered.
SQL> flashback pluggable database orclpdb to restore point CLEAN_BEFORE_UPDATE;
Flashback complete.
SQL> alter pluggable database orclpdb open resetlogs;
Pluggable database altered.
SQL> conn flbtest/test@orclpdb
Connected.
SQL> select * from flbtbl;
COL1 COL2
---------- ----------
10 a
20 b
30 c
40 d
クリーンPDBリストアポイントの時点に戻した場合、補助データベースの作成やバックアップのリストア・リカバリは行われません。これは未処理のトランザクションがないことが確定しているため、UNDO表領域を目標時点の状態に戻す必要がないからと思われます。これにより、クリーンPDBリストアポイント以外を指定した場合に比べ、大幅に復旧時間を短縮することができます。
なんらかの理由でローカルUNDOモードを構成することができないが、PDBのクローズを通常の運用に組み込めるような状況では、PDBフラッシュバックを高速に実行できるため、有効な機能であるといえます。
12c R2において、PDBを過去の時点に戻すお勧めの方法は、ローカルUNDOモードでのPDBフラッシュバック・データベースです。データのリストアや補助データベースの作成が不要なため、Point-in-Timeリカバリに比べ、短時間でPDBを過去の時点に戻すことができます。ローカルUNDOモードであれば、他のPDBからは参照・使用されないPDBリストアポイントを作成できます。
「12c R1のときとPDBの構成を同じにしたい」「PDBごとにUNDO表領域を持ちたくない」といった理由で共有UNDOモードを選択される場合は、クリーンPDBリストアポイントを使用してのPDBフラッシュバック・データベースの使用も検討してください。クリーンPDBリストアポイントを設定するたびにPDBを停止させる必要はありますが、Point-in-Timeリカバリに比べ、短時間でPDBを過去の時点に戻すことができます。