アクティブデータベース複製

RMANのDuplicateコマンドを使用して、同一ディレクトリ構成の別筐体にデータベースを複製する。

タイトルの通りアクティブデータベース複製機能を用いて、別途バックアップなどを取得せず、
稼働中のデータベースを直接複製する。

なお、複製するデータベースのSIDは「db19」としており、複製元と複製先で同じ名前を使う。

複製先データベースでの作業

補助インスタンスの初期化パラメータファイル(PFILE)を作成

最低限、DB_NAME を設定したパラメータファイルが必要。以下のように作成する。

cat <<EOF > $ORACLE_HOME/dbs/initdb19.ora
db_name='db19'
EOF

マルチテナントなデータベースを複製する場合は、以下も設定が必要。

enable_pluggable_database=true

パスワードファイルの作成

複製元からコピーしてもいいが、ここではあえて新規に作成することにする。

cd $ORACLE_HOME/dbs
orapwd FILE=orapwdb19 FORMAT=12

SYSのパスワードを聞かれるので適宜設定する。

リスナーの静的構成

複製元からの接続を受け付けるため、事前にNETCAなどでリスナーを作成しておき、listener.ora に静的構成のための設定を追加する。

cat <<EOF >> $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = db19)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = db19)
    )
  )
EOF

リスナーが起動していない場合は起動し、すでに起動済みの場合は設定をリロードする。

lsnrctl reload

必要なディレクトリの作成

監査ファイルの出力先ディレクトリや、複製元で設定している場合は高速リカバリ領域のディレクトリを作成しておく。

mkdir -p $ORACLE_BASE/admin/db19/adump
mkdir $ORACLE_BASE/fast_recovery_area
mkdir $ORACLE_BASE/oradata/DB19

マルチテナントなデータベースでCDB全体を複製する場合は、PDBの格納先ディレクトリも含めて作成しておく必要がある。

PDBの格納先が作成されていないと、Duplicateコマンド実行時に以下のエラーが発生する。

ORA-17628: Oracleエラー19505がリモートOracleサーバーから返されました
ORA-19505: ファイル""の識別に失敗しました。

補助インスタンスを起動する

ORACLE_SIDを設定した上で、NOMOUNTモードで起動する。

export ORACLE_SID=db19
sqlplus / as sysdba
startup nomount

複製元データベースでの作業

複製先につなげるためのクライアント設定を行う

tnsnames.ora に 複製先の補助インスタンスに接続するための設定を追加する。

ここでは、接続識別子(ネットサービス名)を 「TARGET」としている。

cat <<EOF >> $ORACLE_HOME/network/admin/tnsnames.ora
TARGET =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradbs2.dn.home)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = db19)
    )
  )
EOF

複製を実行する

再度RMANを起動する。「auxiliary」に複製先データベースを指定すること。

rman target sys/oracle auxiliary sys/oracle@target
duplicate target database to db19 from active database
nofilenamecheck spfile;

マルチテナントなデータベースでは一部のPDBのみ指定して複製することもできる。

duplicate target database to cdb19 pluggable database cdb19p1
from active database nofilenamecheck spfile;

エラーなく実行できれば完了。

コメント