最小限の設定でスタンバイデータベースの差分同期を試す（Oracle Database 19c)

# 差分同期を使ったデータベースの移行方法
　データベースの移行方法にはいくつか選択肢があります。差分適用が必要な場合には GoldenGate のようなツールを使う場合や、同一バージョンの環境では Data Guard 環境を構築して新しい環境にスイッチオーバー（またはフェイルオーバー）することもあります。本記事ではスタンバイ・データベースを使いながら、RMAN の RECOVER STANDBY DATABASE FROM SERVICE コマンドを使って Data Guard 設定を使わずに差分適用を行う方法について記載しています。

# スタンバイ・データベースの作成
　スタンバイ・データベースの作成方法は Data Guard 環境と同じです。スタンバイ・データベースは制御ファイルがスタンバイ用になっている以外は元となるデータベースの物理コピーです。ここでは RMAN の DUPLICATE コマンドで稼働中のデータベース・インスタンスからスタンバイ・データベースを作成しています。tnsnames.ora ファイルには以下の設定が記載されています。

|名前|説明|
|:---|:---|
|SRCDB|コピー元となるデータベース|
|DSTDB|コピー先（移行先）データベース|

　NOLOGGING 操作でもREDOログが出力されるように元データベースで ALTER DATABASE FORCE LOGGING 文を実行しています。コピー元となるデータベースに必要な変更はこれだけです。

```SQL:
$ sqlplus SYS/<<password>>@SRCDB as sysdba
SQL> ALTER DATABASE FORCE LOGGING;

データベースが変更されました。

SQL> EXIT
$ 
$ rman target SYS/<<password>>@SRCDB auxiliary SYS/<<password>>@DSTDB
Recovery Manager: Release 19.0.0.0.0 - Production on 月 1月 30 11:35:55 2023
Version 19.14.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: O19X (DBID=377954733)に接続されました
補助データベース: O19Xに接続されました(マウントされていません)

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER NOFILENAMECHECK;
Duplicate Dbを23-01-30で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用していま す
チャネル: ORA_AUX_DISK_1が割り当てられました

... <<途中省略>> ...

5オブジェクトを削除しました

Duplicate Dbを23-01-30で終了しました

RMAN> EXIT
$
```

　DUPLICATE コマンドが正常に終了したらスタンバイ・データベースの完成です。インスタンスは MOUNT 状態で起動しています。


# 差分適用
　Data Guard 設定を行っているわけではないので元データベースの更新処理はスタンバイ・データベースに伝播しません。RMAN で移行先データベースに接続し、RECOVER STANDBY DATABASE FROM SERVICE コマンドを実行します。移行元データベースを指すサービス（下記の例では SRCDB）を指定します。

```SQL:
$ rman target  SYS/<<password>>@DSTDB

Recovery Manager: Release 19.0.0.0.0 - Production on 月 1月 30 12:48:20 2023
Version 19.14.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: O19X (DBID=377954733、未オープン)に接続されました

RMAN> RECOVER STANDBY DATABASE FROM SERVICE SRCDB;

recoverを23-01-30で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用していま す
Oracleインスタンスが起動しました
... <<途中省略>> ...

メディア・リカバリを開始しています

メディア・リカバリが完了しました。経過時間: 00:00:00
recoverを23-01-30で終了しました

RMAN> EXIT
$ 
```

差分の適用が完了しました。

# フェイルオーバー
差分適用が完了したらスタンバイ・データベースをプライマリ・データベースに移行します。下記の例では状態を確認し、フェイルオーバーを実行しています。ALTER DATABASE FAILOVER 文は失敗しているので、ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE 文を実行して強制的に昇格処理を実行しています。その後、データベースをオープンして移行完了です。

```SQL:
$ sqlplus SYS/<<password>>@DSTDB as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 火 1月 31 10:58:36 2023
Version 19.14.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
に接続されました。
SQL> SELECT name, open_mode, database_role FROM v$database;

NAME      OPEN_MODE            DATABASE_ROLE
--------- -------------------- ----------------
O19X      MOUNTED              PHYSICAL STANDBY

SQL> ALTER DATABASE FAILOVER TO O19U;
ALTER DATABASE FAILOVER TO O19U
*
行1でエラーが発生しました。:
ORA-00283: recovery session canceled due to errors
ORA-16436: ALTER DATABASE ... RECOVER FINISH could not start

SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;

データベースが変更されました。

SQL> ALTER DATABASE OPEN;

データベースが変更されました。
```

Author: Noriyoshi Shinoda / Date: February 3, 2023