Oracle Golden Gate 19 環境をローカルに作ってみる STEP3 Oracle Golden Gate セットアップ

#### 目的
以下のような Oracle Golden Gate 環境をローカルに作っていきます。
![oracle_gg.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/aa9e3264-d950-8401-74f9-816be0dce310.png)

[STEP１．Oracle Database CUI インストール](https://qiita.com/blueskyarea/items/629cdb62d68881b5cc3b)
[STEP２．Oracle Golden Gate インストール](https://qiita.com/blueskyarea/items/629cdb62d68881b5cc3b)
###### STEP３．Oracle Golden Gate セットアップ (この記事)
STEP４．Oracle Golden Gate を使ってみる

#### バージョンなど

|  対象  |  バージョン  |
| ---- | ---- |
|  Host OS |  Windows10  |
|  Client OS1 (name: myora1) |  Centos-7.8 on virtual box |
|  Client OS2 (name: myora2) |  Centos-7.8 on virtual box |
|  Virtual Box |  Version 6.1.26 |
|  Vagrant |  Version 2.2.5 |
|  Ansible (ansible_local) |  Version 2.9 |
|  Oracle DB |  19c |
|  Oracle Golden Gate | 19.1.0.0 |

#### Oracle Golden Gate セットアップ手順
１．Oracle Golden Gate Config 設計
２．Oracle Golden Gate Config セットアップ

##### １．Oracle Golden Gate コンフィグ 設計
厳密には多くのパラメータがあると思われますが、自分が環境構築した時に最低限必要だったものを元に設計していきます。
データの同期元（ソース）と同期先（ターゲット）で設定はほとんど同じですが、若干違いがあるところがあります。違いが分かるように併記していきます。
注意点として、CDBにGolden Gate 用の共通ユーザを作成するので、ユーザ名の頭に「c##」を入れる必要があります。

|  パラメータ  |  ソースDB  | ターゲットDB |
| ---- | ---- | ---- |
| Golden Gate Version | 19.1.0.0 | 19.1.0.0 |
| Golden Gate ホームディレクトリ | /gg | /gg |
| Golden Gate 用 Oracle DB ユーザ | c##gguser | c##gguser |
| Trail ファイルディレクトリ | /gg/dirdat/capture1/lt<br>/gg/dirdat/pump1/rt | - |
| Manager port 番号 | 7809 | 7809 |
| Capture プロセス名 | capture1 | - |
| Capture プロセスモード | Integrated Capture | - |
| Data Pump プロセス名 | pump1 | - |
| Replicat プロセス名 | - | repli2 |
| Replicat プロセスモード | - | Integrated Replicat |

##### ２．Oracle Golden Gate コンフィグ セットアップ
データの同期元（ソース）と同期先（ターゲット）でセットアップはほとんど同じですが、若干違いがあるところがあります。違いが分かるように併記していきます。

基本的に以下の操作は全て oracle ユーザーで実行しますので、oracle ユーザーにスイッチしておきます。

```
$ sudo su - oracle
```

<b>Golden Gate 初期設定</b>
Golden Gate の設定は主に ggsci を通して行います。
まずは、設定ファイル保管用のサブディレクトリの作成と、Manager の設定を行っていきます。

|No|  操作 | ソースDB | ターゲットDB |
|----| ---- | ---- | ---- |
|1| ggsci 起動 | /gg/ggsci | ソースと同じ |
|2| サブディレクトリ作成 | GGSCI (xxx) 1> create subdirs | ソースと同じ |
|3| Manager port 設定 | GGSCI (xxx) 1> EDIT PARAMS MGR<br>※以下の値を記入<br>PORT 7809 | ソースと同じ |
|4| ggsci 終了 | GGSCI (xxx) 1> exit | ソースと同じ |
|5| captureディレクトリ作成 | mkdir -p /gg/dirdat/capture1 | 不要 |
|6| data pumpディレクトリ作成 | mkdir -p /gg/dirdat/pump1 | 不要 |

```:実行例
[oracle@myora1 ~]$ /gg/ggsci

Oracle GoldenGate Command Interpreter for Oracle
Version 19.1.0.0.4 OGGCORE_19.1.0.0.0_PLATFORMS_191017.1054_FBO
Linux, x64, 64bit (optimized), Oracle 19c on xxx
Operating system character set identified as UTF-8.

Copyright (C) 1995, 2019, Oracle and/or its affiliates. All rights reserved.

GGSCI (myora1) 1> create subdirs

Creating subdirectories under current directory /gg

Parameter file                 /gg/dirprm: created.
Report file                    /gg/dirrpt: created.
Checkpoint file                /gg/dirchk: created.
Process status files           /gg/dirpcs: created.
SQL script files               /gg/dirsql: created.
Database definitions files     /gg/dirdef: created.
Extract data files             /gg/dirdat: created.
Temporary files                /gg/dirtmp: created.
Credential store files         /gg/dircrd: created.
Masterkey wallet files         /gg/dirwlt: created.
Dump files                     /gg/dirdmp: created.

GGSCI (myora1) 2> EDIT PARAMS MGR

GGSCI (myora1) 3> exit
```

<b>Oracle DB インスタンス起動など</b>

|No|  操作 | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- |
|1| tnsname.ora にPDB情報追加 | vi /opt/oracle/product/19c/dbhome_1/network/admin/tnsnames.ora<br>※この表の下に記載しているtnsnames.ora追記の内容を追記する | ソースと同じ |
|2| Listener起動 | lsnrctl start LISTENER | ソースと同じ |
|3| SQLcl 起動 | sql / as sysdba | ソースと同じ |
|4| Oracleインスタンス 起動 | SQL> startup | ソースと同じ |
|5| PDB open | SQL> alter pluggable database all open; | ソースと同じ |
|6| SQLcl 終了 | exit | ソースと同じ |

```ソースDB側tnsnames.ora追記
ORCLPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = myora1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLPDB1)
    )
  )
```

```ターゲットDB側tnsnames.ora追記
ORCLPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = myora2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLPDB1)
    )
  )
```

```:実行例
[oracle@myora1 ~]$ lsnrctl start LISTENER

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on xx-xxx-2021 15:33:26

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Starting /opt/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/myora1/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myora1)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myora1)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                xx-xxx-2021 15:33:26
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/myora1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myora1)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

[oracle@myora1 ~]$ sql / as sysdba

SQLcl: Release 19.1 Production on xxx xxx xx 15:34:56 2021

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

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area   771749224 bytes
Fixed Size                   9139560 bytes
Variable Size              515899392 bytes
Database Buffers           239075328 bytes
Redo Buffers                 7634944 bytes
Database mounted.
Database opened.

SQL> alter pluggable database all open;

Pluggable database altered.

SQL> exit
```

<b>Golden Gate 用 Oracle DB ユーザ作成</b>

|No|  操作 | ソース | ターゲット |
| ----| ---- | ---- | ---- | ---- |
|1| SQLcl 起動 | sql / as sysdba | ソースと同じ |
|2| CDBに接続 | SQL> alter session set container=cdb$root; | ソースと同じ |
|3| ユーザー作成 | SQL> create user c##gguser identified by oracle; | ソースと同じ |
|4| 権限設定 | SQL> grant dba to c##gguser container=all; | ソースと同じ |
|5| 権限設定 | SQL> exec dbms_goldengate_auth.grant_admin_privilege('c##gguser'); | ソースと同じ |
|6| SQLcl 終了 | exit | ソースと同じ |

```:実行例
[oracle@myora1 ~]$ sql / as sysdba

SQLcl: Release 19.1 Production on xxx xxx xx 15:39:37 2021

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

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> alter session set container=cdb$root;

Session altered.

SQL> create user c##gguser identified by oracle;

User created.

SQL> grant dba to c##gguser;

Grant succeeded.

SQL> exec dbms_goldengate_auth.grant_admin_privilege('c##gguser');

PL/SQL procedure successfully completed.
```

<b>Golden Gate 有効化</b>

|No| 操作 | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- |
|1| SQLcl 起動 | sql / as sysdba | ソースと同じ |
|2| Golden Gate有効化 | SQL> alter system set enable_goldengate_replication=true scope=both; | ソースと同じ |
|3| stream_pool_size設定 | SQL> alter system set streams_pool_size=128M scope=both SID='*'; | ソースと同じ |
|4| supplemental logging 設定 | SQL> alter database add supplemental log data; | ソースと同じ |
|5| supplemental logging 設定 | SQL> alter system switch logfile; | ソースと同じ |
|6| Golden Gate有効化確認 | SQL> show parameter enable_goldengate_replication; | ソースと同じ |
|7| supplemental logging 設定確認 | SQL> select name,supplemental_log_data_min from v$database; | ソースと同じ |
※stream_pool_size設定は本番環境の非機能要件に合わせて見積するべき(個人PCなので仕方なく128Mという少ない値で設定)

```:実行例
[oracle@myora1 ~]$ sql / as sysdba
SQLcl: Release 19.1 Production on xxx xxx xx 16:00:10 2021

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

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> alter system set enable_goldengate_replication=true scope=both;

System altered.

SQL> alter system set streams_pool_size=128M scope=both SID='*';

System altered.

SQL> alter database add supplemental log data;

Database altered.

SQL> show parameter enable_goldengate_replication;
NAME                          TYPE    VALUE
----------------------------- ------- -----
enable_goldengate_replication boolean TRUE
SQL> select name,supplemental_log_data_min from v$database;

NAME      SUPPLEME
--------- --------
ORCLCDB   YES
```

<b>Oracle ログモード変更</b>

|No|  操作 | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- |
|1| ログモード変更（DBシャットダウン）| SQL> shutdown immediate; | ソースと同じ |
|2| ログモード変更（インスタンス開始）| SQL> startup mount; | ソースと同じ |
|3| ログモード変更（archivelog有効） | SQL> alter database archivelog; | ソースと同じ |
|4| ログモード変更（DB open）| SQL> alter database open; | ソースと同じ |
|5| ログモード確認 | SQL> select log_mode from v$database; | ソースと同じ |
|6| SQLcl終了 | SQL > exit | ソースと同じ |

```:実行例
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area   771749224 bytes
Fixed Size                   9139560 bytes
Variable Size              629145600 bytes
Database Buffers           125829120 bytes
Redo Buffers                 7634944 bytes
Database mounted.
SQL> alter database archivelog;
alter database archivelog
SQL> alter database open;

Database altered.

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG
```

<b>Capture パラメータ設定</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- | ---- |
|1| ggsci 起動 | oracle | /gg/ggsci | 不要 |
|2| Capture パラメータ設定 | oracle | GGSCI (xxx) 1> edit params capture1<br>※以下の値を記入<br>EXTRACT capture1<br>USERID c##gguser@ORCLCDB, PASSWORD oracle<br>EXTTRAIL /gg/dirdat/capture1/lt<br>TABLE ORCLPDB1.c##gguser.*; | 設定なし |

<b>Capture プロセス追加</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- | ---- |
|1| CDBへログイン | oracle | dblogin userid c##gguser@ORCLCDB password oracle | 不要 |
|2| Capture登録 | oracle | REGISTER EXTRACT capture1 DATABASE CONTAINER(ORCLPDB1) | 不要 |
|3| Capture追加 | oracle | ADD EXTRACT capture1, integrated tranlog, begin now | 不要 |
|4| Exttrail追加 | oracle | ADD EXTTRAIL /gg/dirdat/capture1/lt, extract CAPTURE1, megabytes 500 | 不要 |
|5| Capture登録確認 | oracle | info all | 不要 |

```:実行例
GGSCI (myora1) 2> dblogin userid c##gguser@ORCLCDB password oracle
Successfully logged into database CDB$ROOT.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 3> REGISTER EXTRACT capture1 DATABASE CONTAINER(ORCLPDB1)

2021-xx-xx xx:xx:xx  INFO    OGG-02003  Extract CAPTURE1 successfully registered with database at SCN 2330023.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 5> ADD EXTRACT capture1, integrated tranlog, begin now
EXTRACT (Integrated) added.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 7> ADD EXTTRAIL /gg/dirdat/capture1/lt, extract CAPTURE1, megabytes 500
EXTTRAIL added.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 10> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     STOPPED
EXTRACT     STOPPED     CAPTURE1    00:00:00      00:05:16
```

<b>Data Pump パラメータ設定</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
|----| ---- | ---- | ---- | ---- |
|1| Data Pump パラメータ設定 | oracle | edit params pump1<br>※以下の値を記入<br>EXTRACT pump1<br>RMTHOST 192.168.56.60,MGRPORT 7809,PARAMS "-f"<br>RMTTRAIL /gg/dirdat/pump1/rt<br>TABLE ORCLPDB1.c##gguser.*; | 不要 |

<b>Data Pump プロセス追加</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- | ---- |
|1| CDBへログイン | oracle | dblogin userid c##gguser@ORCLCDB password oracle | 不要 |
|2| Data Pump追加 | oracle | ADD EXTRACT PUMP1, exttrailsource /gg/dirdat/capture1/lt | 不要 |
|3| Rmttrail追加 | oracle | ADD RMTTRAIL /gg/dirdat/pump1/rt, extract PUMP1 | 不要 |
|4| Data Pump登録確認 | oracle | info all | 不要 |

```:実行例
GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 11> edit params pump1

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 12> dblogin userid c##gguser@ORCLCDB password oracle
Successfully logged into database CDB$ROOT.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 14> ADD EXTRACT PUMP1, exttrailsource /gg/dirdat/capture1/lt
EXTRACT added.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 15> ADD RMTTRAIL /gg/dirdat/pump1/rt, extract PUMP1
RMTTRAIL added.

GGSCI (myora1 as c##gguser@ORCLCDB/CDB$ROOT) 16> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     STOPPED
EXTRACT     STOPPED     CAPTURE1    00:00:00      00:42:23
EXTRACT     STOPPED     PUMP1       00:00:00      00:00:14
```

<b>Replicat パラメータ設定</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- | ---- |
|1| ggsci 起動 | oracle | 不要 | /gg/ggsci |
|2| CDBへログイン | oracle | 不要 | dblogin userid c##gguser@ORCLCDB password oracle |
|3| Replicat パラメータ設定 | oracle | 不要 | edit params repli2<br>※以下の値を記入<br>REPLICAT repli2<br>USERID c##gguser@ORCLPDB1, PASSWORD oracle<br>MAP ORCLPDB1.c##gguser.\*, TARGET ORCLPDB1.c##gguser.*; |

<b>Replicat プロセス追加</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- | ---- |
|1| CDBへログイン | oracle | 不要 | dblogin userid c##gguser@ORCLCDB password oracle |
|2| Replicat 追加 | oracle | 不要 | ADD REPLICAT repli2, INTEGRATED, EXTTRAIL /gg/dirdat/pump1/rt |
|3| Replicat 登録確認 | oracle | 不要 | info all |

```:実行例
[oracle@myora2 ~]$ /gg/ggsci

GGSCI (myora2) 1> dblogin userid c##gguser@ORCLCDB password oracle
Successfully logged into database CDB$ROOT.

GGSCI (myora2 as c##gguser@ORCLCDB/CDB$ROOT) 2> edit params repli2

GGSCI (myora2) 4> dblogin userid c##gguser@ORCLCDB password oracle
Successfully logged into database CDB$ROOT.

GGSCI (myora2 as c##gguser@ORCLCDB/CDB$ROOT) 5> ADD REPLICAT repli2, INTEGRATED, EXTTRAIL /gg/dirdat/pump1/rt
REPLICAT (Integrated) added.

GGSCI (myora2 as c##gguser@ORCLCDB/CDB$ROOT) 6> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     STOPPED
REPLICAT    STOPPED     REPLI2      00:00:00      00:00:07
```

<b>サプリメンタルロギング設定</b>

|No|  操作 |  ユーザー  | ソースDB | ターゲットDB |
| ----| ---- | ---- | ---- | ---- |
|1| ggsci 起動 | oracle | /gg/ggsci | 不要 |
|2| CDBへログイン | oracle | dblogin userid c##gguser@ORCLPDB1 password oracle | 不要 |
|3| SCHEMATRANDATA追加 | oracle | ADD SCHEMATRANDATA c##gguser | 不要 |

```:実行例
GGSCI (myora1) 1> dblogin userid c##gguser@ORCLPDB1 password oracle
Successfully logged into database ORCLPDB1.

GGSCI (myora1 as c##gguser@ORCLCDB/ORCLPDB1) 2> ADD SCHEMATRANDATA c##gguser

2021-xx-xx 05:31:02  INFO    OGG-01788  SCHEMATRANDATA has been added on schema "c##gguser".

2021-xx-xx 05:31:02  INFO    OGG-01976  SCHEMATRANDATA for scheduling columns has been added on schema "c##gguser".

2021-xx-xx 05:31:02  INFO    OGG-10154  Schema level PREPARECSN set to mode NOWAIT on schema "c##gguser".
```

以上