しばちょう先生の試して納得!DBAへの道 indexページ▶▶
みなさん、こんにちは。”しばちょう”こと柴田長(しばた つかさ)です。
連載再開の第二弾としてお届けさせて頂くのは、本番環境には手を加えられないので、一時的にデータベースを複製したい。なんて、最近ご相談を受けることが多い気がする、同一サーバー上でのデータベースの複製方法です。そして、単純に全ての表領域を複製するのではなく、テストで利用したい特定の表領域だけを含む(コマンドによっては、特定の表領域を含まない)データベースを複製してみたいと思います。私が思う限り、可能な限りシンプルな条件とコマンドをご紹介したいと考えておりますので、ご興味のある方は、是非、以下の演習をOracle Database 19c Enterprise Editionのデータベースで試してみてください。私は、DBRU19.8.0上の非CDBのRACデータベースにおいて、データファイル格納用の+DATA01と、バックアップ関連ファイル格納用の+RECO01という、2つのASMディスク・グループがある環境で、動作確認を行っています。

今回ご紹介する複製方法は、RMANユーティリティのDUPLICATEコマンド(まさに”複製”!分かり易い!)を使います。このDUPLICATEコマンドには実行するシチュエーションに応じて様々なオプションが存在します。過去、それらを全てクリアに理解するのは、正直辛かった印象を持っていましたが、最近改めて19cのマニュアルを見返してみると、綺麗に整理されているではないですか!!元々整理されていたのであれば、会社に謝らなければなりませんので、取り急ぎ、ココで謝っておきます。ごめんなさい。。
でも、やっぱり、数か月後、数年後の自分の為にも、私の現在の理解をココで整理しておきます(笑)ので、参考にしてみてくださいね。
DUPLICATEコマンドを理解する上で、最も大切なことは、複製するデータベースのタイプと、実行方法の二つを分けて理解することだと思います。
- DUPLICATEコマンドで複製(作成)するデータベースのタイプ
- (Type1) ソース(複製元)データベースのコピー・データベース
- (Type2) ソース(複製元)データベースをプライマリ・データベースとするData Guard環境におけるスタンバイ・データベース
- DUPLICATEコマンドの実行方式
- (A) Active duplication
- 主な特徴
- DUPLICATE … FROM ACTIVE DATABASEコマンド
- マウント or オープン状態のソース(複製元)データベースに、TARGETとして接続が必須
- 複製先データベース(補助インスタンス)に、AUXILIARYとして接続が必須
- (A-1) イメージ・コピーを使用
- コマンド実行時にソース(複製元)データベース上から必要なデータファイルを読み、イメージ・コピー形式で、複製先の補助データベースへ転送されるプッシュベースの方法
- (A-2) バックアップ・セットを使用
- コマンド実行時にソース(複製元)データベース上から必要なデータファイルを読み、バックアップ・セット形式で、複製先の補助データベースが取得するプルベースの方法
※ 次のいずれかの条件を満たす場合のみ(A-2)の動作となり、それ以外は(A-1)の動作が自動選択される。
・DUPLICATE … FROM ACTIVE DATABASEコマンドにUSING BACKUPSET, USING COMPRESSED BACKUPSET句またはSECTION SIZE句が含む
・割り当てられた補助チャネルの数が、割り当てられたターゲット・チャネルの数と同じか、それ以上の場合
- コマンド実行時にソース(複製元)データベース上から必要なデータファイルを読み、バックアップ・セット形式で、複製先の補助データベースが取得するプルベースの方法
- 主な特徴
- (B) Backup-based duplication
- 主な特徴
- DUPLICATE … FROM ACTIVE DATABASEコマンドではない
- 取得済みバックアップを使ってデータベースを複製する方式であり、TARGET接続やカタログ接続は、あくまでバックアップの情報を把握する目的
- 複製先データベース(補助インスタンス)に、AUXILIARYとして接続が必須
- (B-1) ソース(複製元)データベースにTARGETとして接続(TARGET接続有り + CATALOG接続は任意)
- (B-2) ターゲット接続を行わない(TARGET接続無し + CATALOG接続有り)
- (B-3) ターゲット・データベースを持たず、リカバリ・カタログ接続も行わない(TARGET接続無し + CATALOG接続無し)
- 主な特徴
- (A) Active duplication
今回の連載では、条件が一番少ない、上記の(B-3)の実行方式を使って、(Type1)のタイプのデータベースを複製(作成)にトライしますが、私がDBRU19.8において遭遇した注意点等を先に掲載しておきますね。
【TARGET接続無し + CATALOG接続無しで、取得済みバックアップを使ってデータベースを複製する際の注意点】
- BACKUP LOCATION句で指定するバックアップが存在する場所は、一か所しか指定できない
- 制御ファイルのバックアップは、BACKUP LOCATION句で指定したパスの直下に配置しなければならない
- アーカイブログ・バックアップやイメージ・コピー・バックアップも同様かは不明だが、検証時はパスの直下に配置した
- BACKUP LOCACION句を使用した場合のUNTIL句では、UNTIL TIMEオプションしか組み合わせて使えない
- UNTIL SCNオプションは使用不可
- ソースデータベースで拡張データ型機能を有効化されている場合は、補助インスタンスにも同じ指定が必須
- 初期化パラメータMAX_STRING_SIZE=EXTENDEDを設定
- TARGET接続が無く、CATALOG接続も無い場合の補助インスタンスには、UNDO_TABLESPACE初期化パラメータの設定が必須
- 最終的な複製データベースは、補助インスタンスに設定したDB_NAME、DB_UNIQ_NAMEパラメータの値を引き継ぐ
- 事前にソース・データベースでバックアップを取得する際には、複数チャネルでのバックアップを推奨
演習1. 複製元データベース上の表領域、スキーマ及びセグメントの作成と確認してください。
$ export ORACLE_SID=dbm01s1
$ sqlplus / as sysdba
SQL>
-- 作成済み表領域の確認
set lines 200 pages 5000 tab off
col FILE_NAME for a60
select FILE_ID, TABLESPACE_NAME, BYTES/1024/1024, FILE_NAME from DBA_DATA_FILES order by 1 ;
FILE_ID TABLESPACE_NAME BYTES/1024/1024 FILE_NAME
---------- ------------------------------ --------------- ------------------------------------------------------------
1 SYSTEM 1030 +DATA01/DBM01S/DATAFILE/system.707.1058786161
2 TBS56 8192 +DATA01/DBM01S/DATAFILE/tbs56.696.1067352299
3 SYSAUX 21640 +DATA01/DBM01S/DATAFILE/sysaux.1420.1058786197
4 UNDOTBS1 10005 +DATA01/DBM01S/DATAFILE/undotbs1.1450.1058786221
5 UNDOTBS2 75 +DATA01/DBM01S/DATAFILE/undotbs2.1459.1058786773
7 USERS 41.25 +DATA01/DBM01S/DATAFILE/users.1451.1058786223
8 TBS0 1024 +DATA01/DBM01S/DATAFILE/tbs0.1347.1069172625
-- SYSAUXとユーザー表領域TBS0にまたがるパーティション表を作成
create table TEST_TABLE (COL1 number, COL2 number) tablespace SYSAUX
partition by range (COL1) (partition PART1 values less than (1000) tablespace SYSAUX,
partition PART2 values less than (2000) tablespace TBS0,
partition PARTN values less than (MAXVALUE) tablespace TBS0) ;
-- 各パーティションにレコードをINSERT
insert into TEST_TABLE values(1,1) ;
insert into TEST_TABLE values(1001,2) ;
insert into TEST_TABLE values(2001,3) ;
commit ;
-- パーティション毎にレコードがINSERTされていることを確認
select * from TEST_TABLE partition(PART1) ;
select * from TEST_TABLE partition(PART2) ;
select * from TEST_TABLE partition(PARTN) ;
COL1 COL2
---------- ----------
1 1
---------- ----------
1001 2
---------- ----------
1001 2
-- リストアしない表領域を使っているスキーマとセグメントを確認
connect TRY/TRY123456
set lines 200 pages 5000 tab off
col SEGMENT_NAME for a12
select SEGMENT_NAME, TABLESPACE_NAME from USER_SEGMENTS ;
SEGMENT_NAME TABLESPACE_NAME
------------ ------------------------------
TAB56F TBS56
TAB56N TBS56
いつもと同様の準備体操と言うことで、問題無くご理解頂けたかと思いますが、念のために、各操作とその目的について解説させて頂きますね。
まず、ソース(複製元)データベースの表領域とデータファイルのパスをDBA_DATA_FILESで確認しています。今回は全てのユーザー表領域を複製するのではなく、特定のユーザー表領域を省略した部分データベースを複製(作成)する予定なので、一度目を通しておいて頂く必要がありました。SYSTEM、SYSAUX、UNDO表領域はデータベースを構成する為に必要な表領域なので、これらはそのまま複製されますが、その他のTBS56、USERS、TBS0表領域に関しては、ユーザーが作成した表領域なので、今回はTBS56表領域だけを複製先データベース上に複製したいと考えています。また、各データファイルのパスは、ASMディスク・グループ”+DATA01″のディレクトリ”DBM01S”配下に配置されていることも把握しておいてください。
次に、SYSAUXとユーザー表領域TBS0にまたがるパーティション表を作成し、各パーティションに1件ずつレコードをINSERTしています。最終的に、複製先データベース上にも、これと同じパーティション表が作成されていれば、表領域にまたがって構成されている表に関しても、複製が成功していることの一つの証拠にもなるかと思い、作成しています。
最後に、ソース(複製元)データベース上のTRYスキーマ内の2つのセグメントが、複製先データベース上にリストアしないTBS56表領域上に存在していることを確認しています。最終的な複製先データベース上で、これらの表やスキーマがどのような状態になるのか、とても楽しみですね。
演習2. ソース(複製元)データベースにおいて、RMANバックアップを実行してください。
### 今回のテスト目的として、ASMディスク・グループ"+DATA01"直下に"BKUP"ディレクトリの作成 # ASMインスタンス名を確認 $ ps -efH|grep ASM | grep smon oracle 110720 1 0 Feb09 ? 00:02:30 asm_smon_+ASM1 # ASMインスタンスへ接続するための環境変数を設定 $ export ORACLE_SID=+ASM1 $ export ORACLE_BASE=/u01/app/oracle $ export ORACLE_HOME=/u01/app/19.0.0.0/grid $ export PATH=$PATH:$ORACLE_HOME/bin # asmcmdユーティリティを起動して、バックアップを格納するディレクトリを作成 $ asmcmd ASMCMD> cd +DATA01 ASMCMD> mkdir BKUP ### ソース・データベースにおいて、RMANバックアップの実行 $ export ORACLE_SID=dbm01s1 $ export ORACLE_BASE=/u01/app/oracle $ export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1 $ export PATH=$ORACLE_HOME/bin:$PATH $ export NLS_DATE_FORMAT="YYYY/MM/DD HH24:MI:SS" $ rman target / connected to target database: DBM01S (DBID=3804380840) RMAN> # (掲載するか悩みましたが)duplicate中にORA-03113エラーが発生することを抑止する目的として、複数チャネル(2以上)を設定 CONFIGURE DEVICE TYPE DISK PARALLELISM 2 ; # 検証目的のために、一旦、全バックアップを削除(本番環境では不用意に実行しないでください) delete noprompt force backup of archivelog all ; delete noprompt force backup of database ; delete noprompt force backup of controlfile ; delete noprompt force datafilecopy all ; # いざ、全データファイルのオンライン・バックアップを実行 BACKUP DEVICE TYPE DISK FORMAT '+DATA01/BKUP/%U' INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update' DATABASE ; # データファイルのバックアップ後に、制御ファイルのバックアップを個別に取得する BACKUP DEVICE TYPE DISK FORMAT '+DATA01/BKUP/%U' TAG 'controlfile' CURRENT CONTROLFILE ; # オンライン・バックアップをリストアする時に、絶対必要なアーカイブログもバックアップしておく BACKUP DEVICE TYPE DISK FORMAT '+DATA01/BKUP/%U' ARCHIVELOG ALL ;
RMANでソース(複製元)データベースのバックアップを行う手順ですが、覚えていましたでしょうか?RMANバックアップには様々なコマンドが存在しますので、上記と全く一緒では無くても構いません。少し自身が無いよーという方は、是非、第21回、第22回の記事で復習して頂けると良いかと思います。
私が実行したコマンドを解説しておきますね。
まずは、RMANユーティリティを実行する前に、バックアップ出力先として、ASMディスク・グループ”+DATA01″直下に”BKUP”ディレクトリの作成を行っています。適切な環境変数を設定してASMCMDユーティリティさえ起動出来れば、特に難しいことは無いと思っています。
私のソース(複製元)データベースのインスタンス名は、環境変数ORACLE_SIDに設定している通り、”dbm01s1″です。そして、このインスタンスが稼働しているDBサーバー上でRMANユーティリティを起動して、このインスタンスをTARGETとして接続しています。
その後、幾つかのdeleteコマンドを実行していますが、これはあくまで今回の検証結果を分かり易くお見せする為に、既存のバックアップを全て削除しているので、皆さんの本番環境での安易な実行はお薦めしませんのでご注意ください。
いざ、RMANバックアップを実行するわけですが、
一つ目のBACKUPコマンドでデータベースの全データファイルの差分増分バックアップを実行しています。Level1バックアップが存在しない場合は、Level0のイメージ・コピー・バックアップが自動取得されるコマンドですので、とても便利ですね。バックアップ先として、’+DATA01/BKUP/%U’のパスを指定してみていますが、ちょっと期待通りにならなかったのは、次の演習以降でコメントさせてください。
二つ目のBCKUPコマンドでは、制御ファイルのバックアップを行っています。バックアップ先として、’+DATA01/BKUP/%U’のパスを指定しています。
三つ目のBACKUPコマンドでは、全てのアーカイブログのバックアップを行っています。DUPLICATEコマンドのUNTIL TIME句に指定する日時は、制御ファイルのバックアップが完成した日時以降、かつ、リストアするデータファイルのバックアップの中で一番新しいものよりも後の日時を指定する必要があります。それらをリストア後にある程度のリカバリを行う必要があるためです。少し分かり辛いかもですが、この最適な状況を簡単に作り出すために最後の最後にアーカイブログをバックアップしているので、バックアップの順番を守ることだけを意識してください。
演習3. 作成されたアーカイブ・ログのバックアップと制御ファイルのバックアップを確認してください。
RMAN> list backup summary ; List of Backups =============== Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag ------- -- -- - ----------- ------------------- ------- ------- ---------- --- 113 B F A DISK 2021/05/19-12:32:35 1 1 NO TAG20210519T123235 114 B F A DISK 2021/05/19-12:32:38 1 1 NO CONTROLFILE 115 B F A DISK 2021/05/19-12:32:39 1 1 NO TAG20210519T123239 116 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 117 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 118 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 119 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 120 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 121 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 122 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 123 B A A DISK 2021/05/19-12:32:44 1 1 NO TAG20210519T123244 124 B F A DISK 2021/05/19-12:32:45 1 1 NO TAG20210519T123244 RMAN> list backupset 114 ; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ ------------------- 114 Full 32.98M DISK 00:00:01 2021/05/19-12:32:38 BP Key: 114 Status: AVAILABLE Compressed: NO Tag: CONTROLFILE Piece Name: +DATA01/BKUP/6evv84r5_1_1 Control File Included: Ckp SCN: 385040370 Ckp time: 2021/05/19-12:32:37 RMAN> list backup of archivelog all by file ; List of Archived Log Backups ============================ Thrd Seq Low SCN Low Time BS Key S #Pieces #Copies Compressed Tag ---- ------- ---------- ------------------- ------- - ------- ------- ---------- --- 1 9003 385013969 2021/05/19-11:13:30 116 A 1 1 NO TAG20210519T123244 1 9004 385036202 2021/05/19-12:19:50 117 A 1 1 NO TAG20210519T123244 1 9005 385040030 2021/05/19-12:31:43 122 A 1 1 NO TAG20210519T123244 1 9006 385040093 2021/05/19-12:31:55 120 A 1 1 NO TAG20210519T123244 2 319 385013980 2021/05/19-11:13:32 119 A 1 1 NO TAG20210519T123244 2 320 385036205 2021/05/19-12:19:50 118 A 1 1 NO TAG20210519T123244 2 321 385040033 2021/05/19-12:31:43 123 A 1 1 NO TAG20210519T123244 2 322 385040096 2021/05/19-12:31:55 121 A 1 1 NO TAG20210519T123244 RMAN> list backupset 120 ; List of Backup Sets =================== BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 120 49.50K DISK 00:00:00 2021/05/19-12:32:44 BP Key: 120 Status: AVAILABLE Compressed: NO Tag: TAG20210519T123244 Piece Name: +DATA01/BKUP/6kvv84rc_1_1 List of Archived Logs in backup set 120 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 9006 385040093 2021/05/19-12:31:55 385040463 2021/05/19-12:32:43 RMAN> list backupset 121 ; List of Backup Sets =================== BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 121 29.00K DISK 00:00:00 2021/05/19-12:32:44 BP Key: 121 Status: AVAILABLE Compressed: NO Tag: TAG20210519T123244 Piece Name: +DATA01/BKUP/6lvv84rc_1_1 List of Archived Logs in backup set 121 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 2 322 385040096 2021/05/19-12:31:55 385040466 2021/05/19-12:32:43
まずは、アーカイブログのバックアップと制御ファイルのバックアップはバックアップ・セット形式なので、”list backup summary“コマンドを実行して全てのバックアップ・セットを確認します。”list backupset“コマンドでも同様の内容を確認することが可能ですが、正直見辛くてRMANは難しい!嫌い!という印象を受けてしまうのではないかと個人的には思っているので、是非、”list backup summary“コマンドを積極的に広めてください。
“Tag”列を見て頂くと、制御ファイルをバックアップした際に指定したタグ名”CONTROLEFILE”が記録されているので、Key=114のバックアップ・セットの詳細を”list backupset 114″コマンドで確認します。すると、沢山の情報が出力されますが、”Control File Included”と記載があるので、制御ファイルのバックアップが含まれていると認識することが出来ます。そして、そのバックアップ・ピースの名前”+DATA01/BKUP/6evv84r5_1_1″からも、指定した通りのパスに作成されています。また、ここで重要な値が、”Completion Time”列の日時です。この制御ファイルのバックアップの作成が完了した日時を示しており、この日時(2021/05/19-12:32:38)以降をDUPLICATEコマンドのUNTIL TIME句に指定する必要があるので、メモを取っておきましょう。
ちなみに、”list backup summary”コマンドの出力結果に”LV”列がありますが、この列が”A”となっているバックアップがアーカイブログのバックアップを示しています。”F”となっているものもありますが、Fullバックアップを意味しているようですが、前述のように、制御ファイルのバックアップだったりするので、正直確実ではありません。なので、あくまで、”A”=”Archive Log”とだけ覚えて使っています。
さて、次にそのアーカイブログのバックアップを確認していきます。
一つずつ詳細を見ていくのは面倒なので、”list backup of archivelog all by file”コマンドを実行しています。私の検証環境は2ノードRACなので、スレッド番号(Thrd列の値)が1と2の二種類存在することに注意してください。各スレッドで”Low Time”列の日付が一番新しいバックアップ・セットを特定すると、BS Key=120と121であることが分かりるので、これらのバックアップ・セットの詳細を確認してみましょう。
いずれのバックアップ・セットに含まれるバックアップ・ピースの名前から、期待通りのパス”+DATA01/BKUP/”に作成されていることが分かります。また、含まれているアーカイブログの情報から、次のアーカイブログが開始された日時(Next Time列)を把握出来るので、この日時(2021/05/19-12:32:43)よりも手前の日時までは、今回取得したアーカイブログのバックアップがあればリカバリ出来ることが理解出来ます。これも重要!
よって、制御ファイルのバックアップの作成が完了した日時(2021/05/19-12:32:38)以降で、かつ、アーカイブログのバックアップの範囲の日時(2021/05/19-12:32:43)より前を満たす日時(私の場合は、”2021/05/19-12:32:42″を選択します)を、DUPLICATEコマンドのUNTIL TIME句に指定することになります。と言うことで、アーカイブログのバックアップと制御ファイルのバックアップが、目的通りのパス”+DATA01/BKUP”の直下に作成されていることが確認出来ましたね。続いて、データファイルのバックアップを確認してみましょう。
演習4. 作成されたデータファイルのバックアップを確認してください。
RMAN> list datafilecopy all ; List of Datafile Copies ======================= Key File S Completion Time Ckp SCN Ckp Time Sparse ------- ---- - ------------------- ---------- ------------------- ------ 66 1 A 2021/05/19-12:32:14 385040217 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/system.749.1072960331 Tag: INCR_UPDATE 68 2 A 2021/05/19-12:32:25 385040214 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/tbs56.257.1072960331 Tag: INCR_UPDATE 70 3 A 2021/05/19-12:32:32 385040210 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/sysaux.747.1072960331 Tag: INCR_UPDATE 69 4 A 2021/05/19-12:32:25 385040212 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/undotbs1.319.1072960331 Tag: INCR_UPDATE 64 5 A 2021/05/19-12:32:10 385040222 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/undotbs2.751.1072960331 Tag: INCR_UPDATE 65 7 A 2021/05/19-12:32:13 385040225 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/users.731.1072960331 Tag: INCR_UPDATE 67 8 A 2021/05/19-12:32:14 385040219 2021/05/19-12:32:09 NO Name: +RECO01/DBM01S/DATAFILE/tbs0.256.1072960331 Tag: INCR_UPDATE
今回は事前に全てのバックアップを削除してからバックアップを実行したので、全てのデータファイルのバックアップはLevel0イメージ・コピー・バックアップとなっています。よって、これらを確認するためには、”list datafilecopy all”コマンドを実行します。
繰り返しになりますが、DUPLICATEコマンドのUNTIL TIME句に指定する日時は、「制御ファイルのバックアップが完成した日時以降、かつ、リストアするデータファイルのバックアップの中で一番新しいものよりも後の日時」を指定する必要があります。つまり、ココで確認しておくべきは、一番最後にバックアップされたイメージ・コピー・バックアップの作成完了時間”Completion Time”が、先の演習4で決めたUNTIL TIME句に指定予定の日時(2021/05/19-12:32:42)よりも古いことですね。今回は”2021/05/19-12:32:32″が最後のCompletion Timeなので、問題なさそうですね!
しかーし・・・いずれのデータファイル・コピーが作成されたパスは、高速リカバリ領域配下のディレクトリ”+RECO01/DBM01S”になっているではないですか!仕様なのか、何かオプションを指定し忘れたような気がしますが、ごめんなさい。調査はまたの機会にやるとして、折角なので、ASMCMDユーティリティを使って、これらのデータファイル・コピーを”+DATA01/BKUP”ディレクトリ配下へコピーする手順をご紹介したいと思います。
と、その前にコメントしておきます。
色々と準備を進めてきましたが、皆様が複製データベースを作らなければならない環境においては、既にRMANバックアップが日々の運用の中で取得されていることを想定していますので、実は、ここまでの手順はほとんど必要ないのかもしれません。もちろん、DUPLICATEコマンドで利用する各種バックアップの情報を確認する必要はあると思いますがね。と言うことで、既存のバックアップを利用したDUPLICATEコマンドの実行であれば、次の演習からが参考になると思っています!
演習5. 複製で使用するデータファイル・コピーをASMCMDユーティリティでBackup Location(+DATA01/BKUP/)直下へコピーしてください。
$ export ORACLE_SID=+ASM1 $ export ORACLE_BASE=/u01/app/oracle $ export ORACLE_HOME=/u01/app/19.0.0.0/grid $ export PATH=$PATH:$ORACLE_HOME/bin $ asmcmd ASMCMD> cp +RECO01/DBM01S/DATAFILE/system.749.1072960331 +DATA01/BKUP/system.bk cp +RECO01/DBM01S/DATAFILE/sysaux.747.1072960331 +DATA01/BKUP/sysaux.bk cp +RECO01/DBM01S/DATAFILE/undotbs1.319.1072960331 +DATA01/BKUP/undo1.bk cp +RECO01/DBM01S/DATAFILE/undotbs2.751.1072960331 +DATA01/BKUP/undo2.bk cp +RECO01/DBM01S/DATAFILE/tbs0.256.1072960331 +DATA01/BKUP/tbs0.bk
はい、いかがでしょうか?とてもシンプルで簡単そうに見えますよね。正直、簡単そうにみえるものの、とても制約が多いのがASMCMDユーティリティだったりするのでご注意ください。私はかなり多く失敗を経験した結果として上記のコマンドに辿り着いたのです!とか大袈裟に伝えておきましょう(笑)
例えば、コピー元のファイル名がOMF(Oracle Managed Files)で生成されている場合、それと同じファイル名(所謂、OMF形式の名前)をコピー先には付けることは出来ないです。
ASMCMD> cp +RECO01/DBM01S/DATAFILE/system.749.1072960331 +DATA01/BKUP/ copying +RECO01/DBM01S/DATAFILE/system.749.1072960331 -> +DATA01/BKUP/system.749.1072960331 ASMCMD-8016: copy source '+RECO01/DBM01S/DATAFILE/system.749.1072960331' and target '+DATA01/BKUP/system.749.1072960331' failed ORA-15056: additional error message ORA-15046: ASM file name '+DATA01/BKUP/system.749.1072960331' is not in single-file creation form ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 617 ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)
また、前述したコピーが成功した例に関してですが、実は、+DATA01/BKUP配下にファイルがコピーされていないのも特徴です。例えば次のように、ASMエイリアスと言うシンボリックのようなものが目的のディレクトリに作成されており、実態のファイルは別のディレクトリにコピーされています。
ASMCMD> cp +RECO01/DBM01S/DATAFILE/system.749.1072960331 +DATA01/BKUP/system.bk ASMCMD> ls -lt +DATA01/BKUP/system.bk Type Redund Striped Time Sys Name DATAFILE HIGH COARSE MAY 19 12:00:00 N system.bk => +DATA01/ASM/DATAFILE/system.bk.1013.1072952437
いつものように脱線してしまいましたが、演習問題5の回答例に戻りますと、私は全ての表領域のイメージ・コピー・バックアップをコピーしていません。その理由は、この後実行するのDUPLICATEコマンドにおいて、TBS56表領域とUSERS表領域を複製先データベース上にリストアしたくないので、それらのイメージ・コピー・バックアップも必要としないからですね。
ちなみに、もしも複数PDBを含むCDBデータベースを複製したい場合には、各PDBのデータファイルのバックアップを+DATA01/BKUP直下にコピーして配置する(PDB毎にディレクトリを作らない)ことで、同じ手順で複製できることは確認していますので、参考にしてみてください。(PDB毎にディレクトリを作った場合にも同じように動作するか否かは確認していません)
演習6. 複製先データベース用の初期化パラメータファイルを準備し、補助インスタンスとしてマウントしてください。(非CDB用)
$ cat /tmp/pfile_aux.ora ===== db_name=aux db_unique_name=aux compatible=19.0.0 db_block_size=8192 db_files=200 diagnostic_dest=/u01/app/oracle sga_target=2g processes=200 db_create_file_dest=+DATA01 db_create_online_log_dest_1=+DATA01 REMOTE_LOGIN_PASSWORDFILE='EXCLUSIVE' max_string_size=EXTENDED undo_tablespace=UNDOTBS1 ===== $ export ORACLE_SID=aux $ sqlplus / as sysdba SQL> startup nomount pfile='/tmp/pfile_aux.ora'
先にコメントしておくと、こちらの初期化パラメータ群の例は、あくまで、非CDBなデータべースを複製する際に有効であり、もしも、複数のPDBを含むCDB環境を複製したい場合には、初期化パラメータ「enable_pluggable_database=TRUE」を更に追加しておくことで、この後のDuplicateコマンドが正常に完了することは別途確認済みです。
(ということで、演習の解説に戻りますが)これもまたとても簡単に見えますよね。否定はしません。しかーし、正直、この初期化パラメータファイルの作成には、何度も戻って来る必要がありました(残念)
ここの設定に不備があった場合には、DUPLICATEコマンドが成功しませんので、ご注意ください。本記事の冒頭にも掲載していますが、改めて、私が遭遇したポイントをご紹介しておきますので、是非とも参考にして頂ければ幸いです。
- ソースデータベースで拡張データ型機能を有効化(初期化パラメータMAX_STRING_SIZE=EXTENDEDを設定)されている場合は、補助インスタンスにも同じ指定が必須
- TARGET接続が無く、CATALOG接続も無い場合の補助インスタンスには、UNDO_TABLESPACE初期化パラメータの設定が必須
- 最終的な複製データベースは、補助インスタンスに設定したDB_NAME、DB_UNIQ_NAMEパラメータの値を引き継ぐ
また、3点目にも記載したように、ここで複製後のデータベースの名前を決めることが出来るので、DB_NAME や DB_UNIQ_NAMEパラメータを適切に変更してください。ちなみに、私は”aux”と言う名前にしていますが、これは補助”AUXILIARY”の略ですね。
注意!!!) 同一サーバー上で、かつ同一のASMディスク・グループ上に複製する場合は、DB_UNIQ_NAMEパラメータの値を、必ず、ソースデータベースと異なる値に変更してください!(ソースデータベースのデータファイルを上書きして壊してしまう可能性があります)また、複製前には必ず、メモリ容量やディスク容量が充分に足りていることを確認することで、ソースデータベースの安定稼働を損なうようなことにならないよう、細心の注意を払ってください。(初めてのDUPLICATEの場合は、必ずテスト環境で試してください)
演習7. RMANユーティリティにおいて、ターゲット接続無し、カタログ接続無しで、補助インスタンスへ接続し、バックアップ・ファイルだけを用いたデータベースの複製を実行してください。ただし、全ての表領域をリストアするのではなく、表領域TBS56とUSERSはリストアせず、複製されたデータベースがオープンされない状態を維持してください。
$ export ORACLE_SID=aux
$ rman auxiliary /
RMAN>
duplicate database 'DBM01S' DBID 3804380840 to 'aux' noopen
backup location '+DATA01/BKUP/'
until time "to_date('2021/05/19-12:32:42', 'YYYY/MM/DD-HH24:MI:SS')"
pfile /tmp/pfile_aux.ora
skip tablespace 'TBS56', 'USERS'
logfile
group 1 ('+DATA01(ONLINELOG)') size 1g,
group 2 ('+DATA01(ONLINELOG)') size 1g,
group 3 ('+DATA01(ONLINELOG)') size 1g ;
はい、無事にDUPLICATEコマンドの実行が完了できた方、おめでとうございます!作成されたデータベースの中身を未だ確認はしてはいませんが、コマンドが正常終了しているので問題無く作成されていることでしょう。もし失敗してしまった方、慌てる必要はありませんよ。なぜならば、本番データベースには接続していませんので。
ココでは、私のDUPLICATEコマンドについて解説しておきます。
$ export ORACLE_SID=aux
$ rman auxiliary /
- RMANユーティリティを起動していますが、TARGET句によるTARGET接続無し、CATALOG接続も無く、あくまで、環境変数ORACLE_SIDに設定した補助インスタンスauxへの接続しかしていません。
RMAN>
duplicate database ‘DBM01S’ DBID 3804380840 to ‘aux’ noopen
- ソース(複製元)データベース名とDBID、さらに、複製先データベース名を指定します。ソース・データベースのDBIDは、演習2でRMANユーティリティを起動した際に出力されているものをメモしておくと便利でしょう。もちろん、ソース・データベースへ接続して、V$DATABASEビューで確認しても良いです。
- また、今回は、”noopen”オプションを使用しており、複製先データベースがRESETLOGS OPENされない状態とDUPLICATEコマンドが正常終了する動作となります。必要に応じて、手動で、”alter database OPEN RESETLOGS” を実行すれば良いだけですが、面倒だと思う方は、”noopen”オプションを外してください。
backup location ‘+DATA01/BKUP/’
- この句で、バックアップが配置されている場所を指定します。今回は、’+DATA01/BKUP/’直下に、バックアップ一式を配置しておきましたよね。
until time “to_date(‘2021/05/19-12:32:32’, ‘YYYY/MM/DD-HH24:MI:SS’)”
- UNTIL句で、完成する複製するデータベースが、いつ時点のソース(複製元)データベースの状態とするのかを指定します。UNTIL SCNオプションは使えません。もしUNTIL SCNオプションを指定した場合は、DUPLICATEコマンドが(確か)構文エラーになったはずです。
- 今回は、実際に指定する日時は、演習4と5で確認した日時です。制御ファイルやデータファイルのバックアップの完了日時よりも新しく、アーカイブログのバックアップが保持しているRedoの最大日時未満の範囲内に収めてください。
pfile /tmp/pfile_aux.ora
- 演習6において補助インスタンス用に作成した初期化パラメータファイルを指定します。
- DUPLICATE完了時には更新されています。
- DUPLICATEコマンドが途中で失敗したタイミング次第ですが、更新済みのことがありますのでご注意ください。
skip tablespace ‘TBS56’, ‘USERS’
- この句がとても興味深いですね。この句で指定された表領域は、複製先データベース上には複製されません。
- 逆に、指定した表領域だけを複製したい場合には、TABLESPACE句を利用します。
- その場合、SYSTEM、SYSAUX、UNDO表領域は指定しなくても自動的に含まれます。
- もちろん、これらの句を指定しなければ、全ての表領域が複製されます。
logfile
group 1 (‘+DATA01(ONLINELOG)’) size 1g,
group 2 (‘+DATA01(ONLINELOG)’) size 1g,
group 3 (‘+DATA01(ONLINELOG)’) size 1g ;
- オンラインREDOログのグループ数、メンバーのサイズを指定します。
- 複製後にも変更することが出来るので、とりあえず、1GBで3グループを指定しています。
- ‘+DATA01(ONLINELOG)’の意味は、ASMディスク・グループ”+DATA01″上に、デフォルトのテンプレート”ONLINELOG”を使って、オンラインREDOログを作成して。という事です。この場合、実際のオンラインREDOログは”+DATA01/<DB_UNIQUE_NAME>/ONLINELOG/”配下にOMF管理の名称で作成されます。
ちなみに、私のDUPLICATEコマンドには含めていませんが、db_file_name_convert句を使うことで、複製されるデータファイルのパスを変更することが可能です。
ただし、この句では、ASMディスク・グループ名しか変換出来ず、そのディレクトリ名は変換することは不可能で、例えば db_file_name_convert(‘+DATA01/DBM01S/’, ‘+DATA01/AUX/’) と指定した場合は無効となり変換が行われません。もしも、これを今回指定した場合には、DUPLICATE実行中に次の警告メッセージが出力される場合があります。
RMAN-05529: warning: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to disk group only.
なお、今回のDUPLICATEコマンド実行中は補助インスタンスに対するオペレーションしか実行されませんので、とても安心感がありますね。また、その過程において、SPFILEを作成したり、制御ファイルをリストアして再起動したり、データファイルをリストアしてリカバリが自動的に行われていきます。これらのRMANの出力を見ていると、実際に実行されるコマンドを確認出来るので、おおよその流れは把握することが出来ますので、興味のある方は、是非ともRMANの出力メッセージを追ってみてください。
演習8. 複製されたデータベースの名前、インスタンス名を確認してください。
$ ORACLE_SID=aux $ sqlplus / as sysdba SQL> set linesize 200 pages 5000 tab off select DBID, NAME, DATABASE_ROLE, PRIOR_RESETLOGS_TIME, OPEN_RESETLOGS, OPEN_MODE from V$DATABASE ; DBID NAME DATABASE_ROLE PRIOR_RESETLOGS_TIM OPEN_RESETL OPEN_MODE ---------- --------- ---------------- ------------------- ----------- -------------------- 1926218092 AUX PRIMARY 2019/04/17-00:55:59 REQUIRED MOUNTED select instance_name from v$instance ; INSTANCE_NAME ----------------- aux
同一DBサーバー上でのデータベースの複製ですから、インスタンス名はもちろん、データベース名も変更したい要望が多いと思いましたので、今回の連載では変更してみたわけですが、見事に、こちらも、変更されていることが確認出来ましたね。複製後のDBIDも変化している事実も知っておくと便利でしょう。これにより、もしも、ソース(複製元)データベースがリカバリ・カタログを利用している環境だとしたら、その同一のリカバリ・カタログに対して、複製したデータベースのバックアップも独立して管理することが出来そうですね!
演習9. 複製されたデータベースをオープンしてください。
$ ORACLE_SID=aux $ sqlplus / as sysdba SQL> shutdown abort ; $ vi /tmp/pfile_aux.ora $ sqlplus / as sysdba SQL> create spfile from pfile='/tmp/pfile_aux.ora' ; startup mount ; alter database open resetlogs ;
まあここまで来たら、後はいつも通り、初期化パラメータを適切に設定したり、SPFILEを作成し直したりを頑張りましょう。
今回のDUPLICATEコマンドでは、”noopen”オプションを指定しているので、複製されたデータベースをオープンするためには、”resetlogs”オプション付きでオープンさせる必要がある点にご注意くださいね。
演習10. 複製されたデータベース上において、演習1で確認した表領域やスキーマ・セグメントを改めて確認してください。
$ ORACLE_SID=aux $ sqlplus / as sysdba SQL> set lines 200 pages 5000 tab off col TABLESPACE_NAME for a10 col FILE_NAME for a60 select FILE_ID, TABLESPACE_NAME, BYTES/1024/1024 "MB", FILE_NAME from DBA_DATA_FILES order by 1 ; FILE_ID TABLESPACE MB FILE_NAME ---------- ---------- ---------- ------------------------------------------------------------ 1 SYSTEM 1030 +DATA01/AUX/DATAFILE/system.970.1072961687 2 TBS56 /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/MISSING00002 3 SYSAUX 21640 +DATA01/AUX/DATAFILE/sysaux.644.1072961687 4 UNDOTBS1 10005 +DATA01/AUX/DATAFILE/undotbs1.827.1072961687 5 UNDOTBS2 125 +DATA01/AUX/DATAFILE/undotbs2.1137.1072961687 7 USERS /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/MISSING00007 8 TBS0 1024 +DATA01/AUX/DATAFILE/tbs0.1023.1072961687 alter database default tablespace system ; drop tablespace "USERS" including contents cascade constraints ; drop tablespace "TBS56" including contents cascade constraints ; select FILE_ID, TABLESPACE_NAME, BYTES/1024/1024 "MB", FILE_NAME from DBA_DATA_FILES order by 1 ; FILE_ID TABLESPACE MB FILE_NAME ---------- ---------- ---------- ------------------------------------------------------------ 1 SYSTEM 1030 +DATA01/AUX/DATAFILE/system.970.1072961687 3 SYSAUX 21640 +DATA01/AUX/DATAFILE/sysaux.644.1072961687 4 UNDOTBS1 10005 +DATA01/AUX/DATAFILE/undotbs1.827.1072961687 5 UNDOTBS2 125 +DATA01/AUX/DATAFILE/undotbs2.1137.1072961687 8 TBS0 1024 +DATA01/AUX/DATAFILE/tbs0.1023.1072961687 SQL> select * from TEST_TABLE ; COL1 COL2 ---------- ---------- 1 1 1001 2 2001 3 SQL> connect TRY/TRY123456 set lines 200 pages 5000 tab off col SEGMENT_NAME for a12 select SEGMENT_NAME, TABLESPACE_NAME from USER_SEGMENTS ; no rows selected
はい、こちらは問題無いでしょう!
目的通り、TBS56、USERS表領域が複製されていませんね!しかし、制御ファイルにはエントリが残ってしまっていたので、手動にて表領域の削除を行っています。ちなみに、DUPLICATEコマンドでNOOPENオプションを指定しなかった場合は、この作業はRESETLOGS OPENと同様に、こちらの表領域の削除も不要なのでご安心ください。(今となっては、NOOPENの意味が無かったですね)
複製された表領域のデータファイルのパスも”+DATA01/AUX”ディレクトリ配下に配置されていることが確認出来ています。
事前に作成しておいた、SYSAUXと、TBS0にまたがるパーティション表は存在していて、全てのレコードを参照することが出来ています。素晴らしい。そりゃそうですけどね。見てみたかったですよね。部分データベースとして複製しているので。さらには、複製しなかったTBS56表領域上に存在していたセグメントはもちろん存在していません。しかし、そのセグメントを保有していたTRYユーザーはきちんと存在して接続も可能な状況となっていた事実も、念のために確認しておきたかったところですね。
これにて、一件落着!
既存のRMANバックアップを用いて、ソース・データベースに影響を与えることなく、同一サーバー上に、一部の表領域を省いた部分データベースを複製することが出来ましたね。今回の演習は以上となりますが、いかがでしたでしょうか?既存のデータベースを複製する要件はたまに出てくることがあると思いますので、知っておいて損は無いと思います。RMANのバックアップ・リカバリにも一段詳しくなれると思いますしね。と言うことで、最後までお付き合い頂きまして大変ありがとうございました。少しでも皆様のデータベース管理作業の参考になれば大変嬉しいです。
次回も楽しみにしていてくださいね!それでは、また次回お会いしましょう!
