GoldenGate布教活動③　～GoldenGateを使ってみよう 事前準備編～

このエントリは [Oracle Database or GoldenGate Advent Calendar 2018](https://adventar.org/calendars/3525?fbclid=IwAR1A4aG_vfRoHXzeH1YSoKu2kllZDFSMA3RebDMO4LgzYANokSCt5k7x2G0#list-2018-12-10) Day 7 の記事です！

今回のエントリでは[OracleR Fusion Middleware Oracle DatabaseのためのOracle GoldenGateの使用](https://docs.oracle.com/cd/E92689_01/gg-winux/GGODB/toc.htm)にそって、GoldenGateを使用する上での事前準備を行っていきたいと思います

また今回は統合Capture、Datapump、統合Replicatの構成について記載します


##GoldenGateのためのデータベースの準備
###１．統合プロセス接続用の接続エントリ追加
マニュアルには下記のように記載があります

>2.1 統合プロセスの接続の構成
>統合キャプチャおよび統合Replicatを使用する場合、専用のサーバー接続がtnsnames.oraファイルにそれぞれ必要です。

なのでGoldenGateの統合プロセスが使用する接続エントリをtnsnames.oraに追加していきましょう

今回は別の検証用に作成していた"unoki"、"import"というDBを使用していきたいと思います

```
[oracle@test01 admin]$ cd /u01/app/oracle/product/12.2.0/dbhome_1/network/admin
[oracle@test01 admin]$ vi tnsnames.ora

-下記を追加-
UNOKI_GG =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX.XXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = unoki.jp.test.com)
    )
  )

IMPORT_GG =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX.XXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = import.jp.test.com)
    )
  )
--
```

今回は上記のエントリを追加しました
ここでSERVICE_NAMEにはリスナーが認識しているサービス名を指定する必要があります
データベースを作成した場合ローカルリスナーが構成されているはずなので下記のコマンドで確認してみましょう

```
[oracle@test01 admin]$ lsnrctl status LISTENR

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 07-DEC-2018 10:33:15

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

TNS-01101: Could not find listener name or service name LISTENR
[oracle@test01 admin]$ lsnrctl status

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 07-DEC-2018 10:33:20

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                03-DEC-2018 13:36:35
Uptime                    3 days 20 hr. 56 min. 45 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/12.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/12.2.0/diag/tnslsnr/test01/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=XXX.XXX.XXX.XXX)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "+ASM_DATA" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "+ASM_RECO" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "test" has 1 instance(s).
  Instance "test", status UNKNOWN, has 1 handler(s) for this service...
```

さて上記を見ると追加したエントリで指定しているunoki.jp.test.comとimport.jp.test.comのサービスを認識していませんよね
こういう場合はリスナーにきちんとサービスを認識させてあげないといけません
listener.oraで静的登録してもよいのですが、今回はサクッと行きたいのでDBの初期パラであるlocal_listenerにデフォルトリスナーを登録して、サービスを動的登録させてしまいましょう

```SQL:unoki
[oracle@test01 admin]$ echo $ORACLE_SID
unoki
[oracle@test01 admin]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri Dec 7 10:36:40 2018

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      LISTENER_UNOKI

SQL> alter system set local_listener='(ADDRESS = (PROTOCOL=TCP)(HOST=XXX.XXX.XXX.XXX)(PORT=1521))';

SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      (ADDRESS = (PROTOCOL=TCP)(HOST
                                                 =XXX.XXX.XXX.XXX)(PORT=1521))

SQL> alter system register;

System altered.

```

```SQL:import
[oracle@test01 ~]$ . ./import.env
[oracle@test01 ~]$ echo $ORACLE_SID
import
[oracle@test01 ~]$ sqlplus / as  sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri Dec 7 10:41:09 2018

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      LISTENER_IMPORT
SQL> alter system set local_listener='(ADDRESS = (PROTOCOL=TCP)(HOST=XXX.XXX.XXX.XXX)(PORT=1521))';

System altered.

SQL> SQL> show parameter local_li

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      (ADDRESS = (PROTOCOL=TCP)(HOST
                                                 =XXX.XXX.XXX.XXX)(PORT=1521))

SQL> alter system register;

System altered.

```

local_listenerパラメータに先程lsnrctl statusで表示させたデフォルトリスナーのIPとPORTを指定して設定します
確認する部分はlsnrctl statuコマンドで表示させた下記の部分です

```
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=XXX.XXX.XXX.XXX)(PORT=1521)))
```

alter system registerコマンドを実行することで、local_listenerで指定したリスナーにサービス登録に行きます
上記のコマンドを実行しなくても何秒か経てば動的登録に行きます

ではリスナーの状態を見てみましょう

```
[oracle@test01 ~]$ lsnrctl status

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 07-DEC-2018 10:46:59

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                03-DEC-2018 13:36:35
Uptime                    3 days 21 hr. 10 min. 24 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/12.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/12.2.0/diag/tnslsnr/test01/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=XXX.XXX.XXX.XXX)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "+ASM_DATA" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "+ASM_RECO" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "import.jp.test.com" has 1 instance(s).
  Instance "import", status READY, has 1 handler(s) for this service...
Service "test" has 1 instance(s).
  Instance "test", status UNKNOWN, has 1 handler(s) for this service...
Service "unoki.jp.test.com" has 1 instance(s).
  Instance "unoki", status READY, has 1 handler(s) for this service...
The command completed successfully
```

見事登録されてREADYの状態になっていますね
ちなみにtestのサービスがUNKNOWNになっているのは静的登録されているからです

では念の為SQL*PLUSで接続確認してみましょう！

```
[oracle@test01 ~]$ sqlplus system/welcome1@UNOKI_GG

SQL*Plus: Release 12.2.0.1.0 Production on Fri Dec 7 10:48:54 2018

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

Last Successful login time: Mon Dec 03 2018 14:35:39 +09:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@test01 ~]$ sqlplus system/welcome1@UNOKI_GG

SQL*Plus: Release 12.2.0.1.0 Production on Fri Dec 7 10:49:00 2018

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

Last Successful login time: Fri Dec 07 2018 10:48:54 +09:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show parameter unique

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_unique_name                       string      unoki
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@test01 ~]$ sqlplus system/welcome1@IMPORT_GG

SQL*Plus: Release 12.2.0.1.0 Production on Fri Dec 7 10:49:20 2018

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

Last Successful login time: Mon Dec 03 2018 14:39:33 +09:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show parameter unique

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_unique_name                       string      import
```

行けましたね！
ここまでで統合プロセス用の接続設定は完了です

###２．ロギング・プロパティの構成
データベースレベルでの準備としては、ソースデータベース(移行元)で強制ロギング・モードの設定と最小のデータベース・レベルのサプリメンタル・ロギングの設定が必要です

詳しくは2.2 ロギング・プロパティの構成を御覧ください

では設定していきましょう！

まず現在の状態を確認します

```
SQL> SELECT supplemental_log_data_min, force_logging FROM v$database;

SUPPLEME FORCE_LOGGING
-------- ---------------------------------------
NO       NO
```

思わずイエスマンのイエス信者から「NOメーン　NOメーン」と言われてしまいそうな状況ですね
それでは有効化していきます

```
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

SQL> ALTER DATABASE FORCE LOGGING;

Database altered.

SQL> SELECT supplemental_log_data_min, force_logging FROM v$database;

SUPPLEME FORCE_LOGGING
-------- ---------------------------------------
YES      YES

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.
```

これでこのDBもイエスマンとして成功への道を歩めることに鳴りました
きっと将来MTAへと進化してズーイーみたいな素敵なインスタンスを伴侶としてプラグインできると思います
誓いを立てた証として必ずLOGSWITCHしておきましょう

マニュアルの一覧にあるスキーマ・レベルのサプリメンタルロギングなどは後ほど解説するので飛ばします

###３．データベースでのGoldenGateの有効化
11.2.0.4以上で明示的にGoldenGate使いますよ！というパラメータを有効化しないといけなくなりました
こちらはExtract、Replicatどちらも必要なので、ソースデータベース、ターゲットデータベースの両方で有効化します

```
SQL> show parameter ENABLE_GOLDENGATE_REPLICATION

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
enable_goldengate_replication        boolean     FALSE
SQL> alter system set ENABLE_GOLDENGATE_REPLICATION=true;

System altered.

SQL> show parameter ENABLE_GOLDENGATE_REPLICATION

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
enable_goldengate_replication        boolean     TRUE
```

必ずソース、ターゲットどちらも有効化してくださいね

###４．フラッシュバック問い合わせの設定
GoldenGateは基本的にCaptureプロセスREDOやアーカイブから更新を取得するのですが、一部のデータについてはソースデータベースに直接問い合わせにいって取得するデータがあります
その場合にフラッシュバック問い合わせの機能を使用するためUNDOの保持期間などについて考慮が必要です

今回はフェッチするようなデータは使用しないので割愛します♪

###５．サーバーリソースの管理
統合Captureを使用する場合ソースデータベースにてSTREAMSの機能を使用します
そのためSTREAMS_POOL_SIZEの見積もりをしっかしする必要があります
>1つの統合キャプチャExtractで、ログマイニング・サーバーが1GBのMAX_SGA_SIZEを使用して実行されるよう要求されます。
>ベスト・プラクティスとしては、Streamsプールの25パーセントが使用可能であるようにします。

こちらもしっかりと見積もりを行ってください！
今回は割愛します

###６．GoldenGateユーザーの作成
統合Capture、統合Replicatの各プロセスにて、データベースから更新を取得したり適用するために使用する専用ユーザーを作成します
作成したユーザーには適切な権限を付与する必要があります
詳細は3.1.4.1 Oracle 11.2.0.4以上のデータベース権限をご参照ください！
今回は動作確認のみなのでDBA権限とdbms_goldengate_auth.grant_admin_privilegeで権限を付与します
本番環境で使用する場合などは、しっかりと権限を確認して付与してくださいね！

```
SQL> create user ggs identified by ggs;

User created.

SQL> exec dbms_goldengate_auth.grant_admin_privilege('ggs');

PL/SQL procedure successfully completed.

SQL> grant dba to ggs;

Grant succeeded.
```

GoldenGate管理ユーザーのデフォルトテーブルスペースは別にしたほうが良いですが、今回は動作を見るだけなので割愛しました
こちらも必ずソースとターゲットで実施してください！

###７．アーカイブログモードへの変更
統合Captureプロセスを使用する場合、アーカイブログモードでDatabaseを運用する必要があります

アーカイブログモードに変更していない場合、CaptureプロセスのREGISTERを行うときに下記のようなエラーが発生します

```
2018-12-09 18:01:05  ERROR   OGG-02058  The Oracle source database is not configured properly to support integrated capture. The following configuration error must be fixed:  ARCHIVELOG mode must be enabled on this Oracle database.
```

では変更していきましょう

```
[oracle@slogi01 gghome_1]$ echo $ORACLE_SID
unoki
[oracle@slogi01 gghome_1]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Sun Dec 9 18:03:40 2018

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>  select log_mode from v$database;

LOG_MODE
------------
NOARCHIVELOG

SQL> startup mount
ORACLE instance started.

Total System Global Area 1795162112 bytes
Fixed Size                  8621760 bytes
Variable Size             553648448 bytes
Database Buffers         1224736768 bytes
Redo Buffers                8155136 bytes
Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

```

ここまでで事前作業はすべて完了となります♪

###まとめ
さくっとGoldenGateに必要な事前作業をマニュアルに沿って実施してみました
次回はいよいよGoldenGateプロセスを作成してデータ伝播する様子を見ていきたいと思います！！