バックアップベースのデータベース複製(複製元に接続する場合)

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

タイトルの通りバックアップベースかつ複製元に接続する方法で行う。11gR2からは複製元に接続しない方法が選択できるため、実際のところあえてこの方法で行うメリットはあまり感じられない。

複製元に接続できるのであれば、アクティブデータベース複製の方が手動でのバックアップ取得や転送が不要となる等利便性が高く、そちらを選択することも検討したほうが良い。

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

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

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

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

cat <<EOF > $ORACLE_HOME/dbs/initcdb19.ora
db_name='cdb19'
EOF

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

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

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

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

リスナーの静的構成

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

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

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

lsnrctl reload

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

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

mkdir -p $ORACLE_BASE/admin/cdb19/adump
mkdir $ORACLE_BASE/fast_recovery_area

また、複製元からバックアップをコピーする先のディレクトリも合わせて作っておく。

mkdir /home/oracle/backup

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

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

export ORACLE_SID=cdb19
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 = cdb19)
    )
  )
EOF

複製元データベースのバックアップを取得する

バックアップ先は個別に指定することとする。RMANを起動し、以下のように実行。制御ファイル、アーカイブログ、SPFILEのバックアップを同時に取得している。

run {
    allocate channel c1 device type disk format '/home/oracle/backup/%U';
    backup database include current controlfile plus archivelog;
    backup spfile;
}

この時、アーカイブログのバックアップに関しては、どのログ順序番号までバックアップされたかを確認しておく必要がある(リストア時にログ順序番号を指定するため)。

backupを2022-07-03 21:29:49で開始しています
現在のログがアーカイブされました。
チャネルc1: アーカイブ・ログ・バックアップ・セットを開始しています
チャネルc1: バックアップ・セットにアーカイブ・ログを指定しています
入力アーカイブ・ログ・スレッド=1 順序=78 レコードID=66 スタンプ=1109107789
チャネルc1: ピース1 (2022-07-03 21:29:49)を起動します
チャネルc1: ピース1 (2022-07-03 21:29:50)が完了しました
ピース・ハンドル=/home/oracle/backup/2r11n92d_91_1_1 タグ=TAG20220703T212949 コメント=NONE
チャネルc1: バックアップ・セットが完了しました。経過時間: 00:00:01
backupを2022-07-03 21:29:50で終了しました

取得したバックアップを複製先に転送する

ネットワークで通信できるのであればscpコマンドなどを使って転送する。この時、複製元と複製先でバックアップを配置するディレクトリは同じでなければならない。

scp -r /home/oracle/backup/* oracle@oradbs2.dn.home:/home/oracle/backup

複製を実行する

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

rman target / auxiliary sys/oracle@target

そして、複製のコマンドを実行する。この時 until sequence に設定するシーケンス番号はバックアップに含まれているアーカイブログの順序番号+1にする必要がある。また、複製元と先でディレクトリ構成が同じの場合は、nofilenamecheck 句を指定しなければならない。

run {
    set until sequence = 79;
    duplicate target database to cdb19 nofilenamecheck spfile;
}

until sequence 句に不適切な順序番号を指定してしまうと、以下のエラーが発生する。

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Dbコマンドが07/03/2022 20:46:46で失敗しました
RMAN-05501: ターゲット・データベースのコピーを中止します
RMAN-03015: ストアド・スクリプトMemory Scriptにエラーが発生しました
RMAN-06026: 見つからないターゲットがあります – リストアを中止します
RMAN-06024: 制御ファイルをリストアするためのバックアップまたはコピーが見つかりません

また、until sequence 句を指定しなかった場合に、複製元のデータベースでバックアップ作成以降に新たなアーカイブログが出力されてしまうと、最新のアーカイブログまでリカバリしようとしてしまう。複製先にはこのアーカイブログが存在しないので、当然以下のエラーになる。

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Dbコマンドが07/03/2022 23:09:41で失敗しました
RMAN-05501: ターゲット・データベースのコピーを中止します
RMAN-03015: ストアド・スクリプトMemory Scriptにエラーが発生しました
RMAN-06053: ログが見つからないためメディア・リカバリが実行できません
RMAN-06025: スレッド1 (順序82)のアーカイブ・ログのバックアップがなく、リストアするための5896871の起動SCNが見つかりました
RMAN-06025: スレッド1 (順序81)のアーカイブ・ログのバックアップがなく、リストアするための5896484の起動SCNが見つかりました

この方法でデータベースを複製する場合は、until sequence 句の指定が実質必須と考えたほうが良い。

コメント