Active Database Duplicateで静的リスナーが不要になっていた件


RMAN Database Duplicateは、バックアップや稼働中データベースからクローンデータベースを作成するRMANの機能ですが、このうちActive Database Duplicateは、稼働中のデータベースを別の場所に直接クローンできるためとても重宝する機能となっています。12cでは、11gでは必須だった静的リスナーの設定が不要になりました。ちょっとしたエンハンスメントですけど、余計なこと考えずどこにでもすぐにコピーを作れるので地道に便利です。マニュアルの記載も以下のように微妙にかわってます。

> Prerequisites Specific to Active Database Duplication
> <11.2>
> When you connect RMAN to the auxiliary instance, you must provide a net service name. This requirement applies even if the auxiliary instance is on the local host.
> <12.1>
> When running RMAN on the same host as the auxiliary instance, you can connect locally without a net service name, provided that you connect using a user name and password, and provided that your DUPLICATE command does not include the PASSWORD FILE clause. The connecting user must have the SYSDBA or SYSBACKUP privilege.

ということで、12cのActive Database Duplicateがどれだけ簡単かというと、こんなかんじ。ホントにお手軽コピーです。

- コピー先にパスワードファイルを作る
- コピー先をNOMOUNT起動する
- Duplicateコマンドでコピーする

以下の設定で、実際にやってみます。ここでは別名でクローンを作成していますが、**同じ名前でコピーするのも問題ありません。**

| 対象 | データベース |
|:-:|:-:|
| コピー元   | TESTDB@serverA  |
| コピー先   | COPYDB@serverX  |


### Step 1

コピー先のサーバ(serverX)に移動します。

まず、稼働中のコピー元にSYSDBA接続できるか確認します。もしエラーが出る場合は、コピー元でパスワードファイルが正しく作られているか確認しましょう。正しく接続でき、ARCHIVELOGモードであることを確認したら次に進みます。(ARCHIVELOGでない場合、コピー元はMOUNT起動が必須になります)

```
$ sqlplus sys/mysystem@serverA:1521/TESTDB as sysdba    <--- コピー元SYSDBA接続確認

SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
```

次にコピー先のデータベース名でパスワードファイルを作ります。コピー先のSYS(SYSDBA)パスワードはコピー元と同じでなければならないので、上記のSYSパスワードを使用します。

```
$ export ORACLE_SID=COPYDB
$ export ORACLE_HOME=/u01/app/COPYDB

$ cd $ORACLE_HOME/dbs
$ orapwd file=orapw${ORACLE_SID}
Enter password for SYS:         <--- コピー元SYSパスワード
```

### Step 2

RMANを起動します。コピー元、コピー先の各接続は以下のようになりますので、混乱しないようにしましょう。11gでは、AUXILIARY側はローカルであってもTNS接続でなければなりませんでしたが、12cでは不要です。したがって静的リスナーも不要です。

| 対象 | RMAN接続 |
|:-:|:-:|
|コピー元   | TARGET  |
|コピー先   | AUXILIARY |

```
$ rman target sys/mysystem@serverA:1521/TESTDB auxiliary sys/mysystem nocatalog

connected to target database: TESTDB (DBID=2759592170)
using target database control file instead of recovery catalog
connected to auxiliary database (not started)
```

コピー先をNOMOUNTで起動します。RMANのダミーDB起動だとSPFILE/PFILEは不要です。ただし事前にパラメータをいろいろ設定しておきたい場合は、SPFILE/PFILEを作っておく方がよいかもしれません。

```
RMAN> startup clone nomount

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/..../initCOPYDB.ora'
starting Oracle instance without parameter file for retrieval of spfile
Oracle instance started

Total System Global Area    2147483648 bytes

Fixed Size                     8622776 bytes
Variable Size               1073745224 bytes
Database Buffers            1006632960 bytes
Redo Buffers                  58482688 bytes
```

### Step 3

Duplicateコマンドを発行します。SPFILEオプションでコピー元から追加でSPFILEをコピーします。これによりコピー元のパラメータの変更をコピー先に反映することができます。SPFILEオプションに続く``PARAMETER_VALUE_CONVERT``や``SET``などでパラメータ値を変更できます(詳しくはマニュアル参照)。すでにSPFILE起動をしている場合はSPFILEオプションは使えません。

```
RMAN> duplicate target database to COPYDB from active database 
spfile
PARAMETER_VALUE_CONVERT 'TESTDB','COPYDB'
set diagnostic_dest '/u01/app/COPYDB'
set db_recovery_file_dest '/u01/app/COPYDB/arch'
set db_create_file_dest '/u01/app/COPYDB/oradata'
set control_files='/u01/app/COPYDB/oradata/control.dbf'
NOFILENAMECHECK;
```

SPFILEのコピーが不要であれば、もっとシンプルですね。

```
RMAN> duplicate target database to COPYDB from active database NOFILENAMECHECK;
```

あとは、RMANが全自動でコピー先にデータファイルをコピーして、指定した名前でデータベースを作ってくれます。

### おわりに

稼働中のデータベースを簡単にコピーできるActive Database Duplicateが更にお手軽になったというお話でした。まぁ、静的リスナーの設定も一手間増えるだけで特に難しいものではないですが、楽ができるというのは常に良いことです(^^)。

> 追記：マニュアル記載のとおりPASSWORD FILEオプションを使用してパスワードファイルをコピーする場合は静的リスナー登録が未だ必要です。またDATAGUARDのスタンドバイインスタンスを作成するためのFOR STANDBYオプションもパスワードファイルを自動的にコピーするため静的リスナー登録が必須となっています。
> その他RMAN DUPLICATEの詳細については以下を参照してください
> cf. [4種類のRMAN DUPLICATEでそれぞれ実際にデータベースをコピーする](https://qiita.com/tlokweng/items/a041394e1011434eca06)