インスタンス化SCNを使ってお手軽初期移行

こんにちは、kurouuuronです。
このエントリは Oracle Database or GoldenGate Advent Calendar 2018 の Day 12 の記事です。(日をまたぎました、すみません...)

>    Oracle Database or GoldenGate Advent Calendar 2018
>    https://adventar.org/calendars/3525

昨日Day 11は、ora_gonsuke777さんの『[SDW(SQL Developer Web) on DBCS をお試ししてみる](https://gonsuke777.hatenablog.com/entry/2018/12/11/230110)』という記事でした。
SQL Developerがクラウド環境でも使用できるのは便利ですよね。

今回のめもは、**インスタンス化SCN(instantiation scn)**というGoldenGate 12.2.0.1 新機能について。

# 1. インスタンス化SCNとは

Oracle Datapump との連携を強化した、GoldenGateの初期移行用の機能。
一言でいえば、Datapumpを使用したシステム無停止の初期移行が簡単にできる、という機能。
もう少し言えば、Flashback_scnやHandlecollisionsなどの初期移行で考慮すべきポイントを考慮せずによくしてくれた機能。

実際の挙動としては、
Datapumpでexpdpした際に、その表はどのSCNまで反映し終わっているか、というデータを内部的に付与してくれて、impdpしたらReplicatがそのSCN以降のデータから自動で当ててくれる、というもの。

# 2. これまでのシステム無停止の初期移行方法との違い

どれだけ楽になったのか、を比較。

### ▽これまでのシステム無停止の初期移行(インスタンス化SCNなし)
システム要件にあわせて、下記方式から選択および組み合わせ

 - Flashback_scnでのexpdp
 - Handlecollesionsを使用したRepliclat適用
 - クローンDBの構築

### ▽GG12.2以降のシステム無停止の初期移行(インスタンス化SCNあり)
 - datapumpを使用して、対象表をexpdp, impdp
 - instance csnを使用したReplicat適用

# 3. 有効化するためには
この機能を使うための制限。
- GoldenGate 12.2.0.1 以上を使用
- 対象表をadd trandata で登録 (preparecsnオプションはデフォルトで付与されるはず)
- ReplicatのパラメータでDBOPTIONS ENABLE_INSTANTIATION_FILTERING オプションを付与

# 4. 検証してみた

### ▽検証環境
[Source/Target]
Linux 5.6
GoldenGate 12.2.0.1.170221
Oracle Database 11.2.0.4 /RAC
対象表 kurodbスキーマのtest02表

### ▽手順
[Source]
1 . ADD TRANDATA/SCHEMATRANDATAで表の自動インスタンス化の準備(PREPARECSNオプションは不要)

ADD TRANDATAしたあと、ALL_CAPTURE_PREPARED_TABLESを確認すると、インスタンス化の準備が完了していることがわかる。
※ALL_CAPTURE_PREPARED_TABLESには、インスタンス化の準備が完了されたオブジェクトが挿入される

```ruby
cd $GG_HOME
./ggsci
ggsci > DBLOGIN USERID gguser122, PASSWORD XXXX
ggsci > add trandata kurodb.test02
ggsci > exit
sqlplus / as sysdba
sqlplus > select TABLE_NAME,TIMESTAMP from ALL_CAPTURE_PREPARED_TABLES
where table_owner = 'KURODB';

TABLE_NAME         TIMESTAMP
------------------ --------------------------------
TEST02             18-04-18
```

2 . (Target側の)Replicatを停止

```ruby
cd $GG_HOME
./ggsci
ggsci > stop rep01
ggsci > exit
```

 3 .  Extractを起動

```ruby
./ggsci
ggsci > start cap01
ggsci > exit
```

4 . Datapumpで対象表をexpdp

```ruby
expdp kurodb/XXXX directory=kurodir tables=TEST02
```

[Target]
5 . Datapumpで対象表をimpdp
impdpした後、DBA_APPLY_INSTANTIATED_OBJECTS を確認すると、対象表とReplicatが適用開始するSCNがわかる。

```ruby
impdp kurodb/XXXX directory=kurodir DUMPFILE=expdat.dmp tables=TEST02 exclude=PROCACT_INSTANCE
sqlplus / as sysdba
sqlplus > select SOURCE_OBJECT_NAME,INSTANTIATION_SCN from DBA_APPLY_INSTANTIATED_OBJECTS where SOURCE_OBJECT_OWNER = 'KURODB';

SOURCE_OBJECT_NAME     INSTANTIATION_SCN
---------------------- ---------------------------
TEST02                 29427246
```

6 . ReplicatをDBOPTIONS ENABLE_INSTANTIATION_FILTERING オプション付与した状態で起動

```ruby
./ggsci
ggsci > view param rep01
REPLICAT REP01
USERID gguser122, PASSWORD XXXX
--ASSUMETARGETDEFS
DISCARDFILE ./dirrpt/REP01.dsc ,APPEND ,MEGABYTES 100
DISCARDROLLOVER AT 2:00
REPORTROLLOVER AT 2:00
--ALLOWNOOPUPDATES
--BATCHSQL
DBOPTIONS ENABLE_INSTANTIATION_FILTERING ☆これ
GETTRUNCATES
MAP KURODB.TEST02, TARGET KURODB.TEST02;

ggsci > start rep01
ggsci > exit
```
以上の手順で、expdpしたタイミング以降のデータからReplicatが適用してくれます。便利～。

# 5. サマリ

インスタンス化SCNでらくらくシステム無停止の初期移行。
インスタンス化SCNとは、
Oracle Datapump との連携を強化した、GoldenGateの初期移行用の機能。
一言でいえば、Datapumpを使用したシステム無停止の初期移行が簡単にできる、という機能。

12月中はまだまだOracle Database or GoldenGate Advent Calendar 2018 続きます。
お楽しみに！