13 Oracle GoldenGateのためのシステムの準備および構成

Oracle GoldenGateを実行するためにシステムを準備する方法、およびMySQLデータベースを使用して構成する方法を説明します。

内容は次のとおりです。

データ使用可能性の確保

十分なバイナリ・ログ・データを保持し、Extractを停止した場合、または計画外の停止が発生した場合に、Extractをチェックポイントから再開できるようにします。Extractには、コミットされていない最も古い作業単位の開始点を含むバイナリ・ログ、およびそれ以降のすべてのバイナリ・ログへのアクセス権が必要です。推奨される保存期間は、少なくとも24時間は対応可能な、アクティブな情報とアーカイブされた情報の両方を含むトランザクション・データです。データ量とビジネス要件を考慮して最適な保存時間を決定するためにテストを実行しなければならない場合があります。

処理中にExtractで必要とされる、アクティブまたはバックアップ・ログのデータが保存されていない場合、次のいずれかの修正処理が必要になる場合があります。

  • バイナリ・ログ・データが使用可能な最新の時点からキャプチャを行う(およびターゲットで発生した可能性のあるデータ損失を受け入れる)ようにExtractを修正します。

  • ソース表とターゲット表を再同期してから、Oracle GoldenGate環境を再開します。

Extractのチェックポイントの位置を決定するには、INFO EXTRACTコマンドを使用します。詳細は、Oracle GoldenGateリファレンスINFO EXTRACTを参照してください

ログ・パラメータの設定

MySQLのトランザクション・ログからキャプチャするには、Oracle GoldenGate Extractプロセスが索引ファイルを検索できる必要があります。その索引ファイルにはすべてのバイナリ・ログ・ファイルのパスが含まれます。

注意:

Extractは、すべての表列がバイナリ・ログに存在するものと想定します。その結果、fullと設定されているbinlog_row_imageのみがサポートされ、これがデフォルトになります。他の値のbinlog_row_imageはサポートされません。

Extractは次のパラメータ設定を確認してこの索引ファイル・パスを取得します。

  1. ALTLOGDESTオプションを指定したExtract TRANLOGOPTIONSパラメータ: このパラメータでログ索引ファイルの場所が指定されている場合、Extractは、MySQLサーバー構成ファイルで指定されたデフォルトよりこの場所を優先します。ALTLOGDESTが使用される場合、バイナリ・ログ索引ファイルも指定されたディレクトリに格納される必要があります。このパラメータは、MySQL構成ファイルで索引ファイルのフル・パス名が指定されていないか、間違った場所が指定されている場合、または同じマシンに複数のMySQLのインストールがある場合に使用されます。

    索引ファイル・パスをTRANLOGICOPTIONSALTLOGDESTとともに指定するには、次のコマンド形式をWindowsで使用します。

    TRANLOGOPTIONS ALTLOGDEST "C:\\Program Files\\MySQL\\logs\\binlog.index"
    

    Linuxでは次の形式を使用します。

    TRANLOGOPTIONS ALTLOGDEST "/mnt/rdbms/mysql/data/logs/binlog.index" 
    
  2. MySQLサーバー構成ファイル: 構成ファイルには、MySQLのサーバーとクライアントのデフォルト起動オプションが格納されます。Windowsでは、構成ファイルの名前はmy.iniです。他のプラットフォームでは、my.cnfです。ALTLOGDESTを指定したTRANLOGOPTIONSがない場合、Extractは構成ファイルからログ・ファイルの場所に関する情報を取得します。ただし、ALTLOGDESTが指定されている場合でも、これらのExtractパラメータを正しく設定する必要があります。
    • binlog-ignore-db=oggddl: DDLログ履歴表がbinlogに入力されないようにします。これはmy.cnfまたはmy.iniファイルで設定されます。DDLレプリケーションが有効化されている場合にのみ、これが必要です。

    • log-bin: このパラメータは、バイナリ・ロギングの有効化に使用されます。このパラメータはバイナリ・ログ索引ファイルの場所も指定します。ALTLOGDESTが使用される場合でもOracle GoldenGateの必須パラメータです。log-binが指定されていないと、バイナリ・ロギングが無効になり、Extractからエラーが返されます。

    • log-bin-index: このパラメータでは、バイナリ・ログ索引の場所を指定します。使用されていない場合、Extractは索引ファイルがログ・ファイルと同じ場所にあるとみなします。このパラメータが使用され、バイナリ・ログが含まれるディレクトリとは異なるディレクトリが指定されている場合、Extractの起動後、バイナリ・ログは移動できません。

    • binlog_format: このパラメータでは、ログの形式を設定します。ROWという値に設定する必要があります。これによって、DML文をバイナリ形式で記録するようデータベースに指示されます。その他のログ形式(MIXEDまたはSTATEMENT)を使用すると、Extractは異常終了します。

      注意:

      MySQLのバイナリ・ロギングでは、特定の表についてロギングを有効または無効にすることはできません。データベースのすべての表にグローバルに適用されます。

    構成ファイルを検出するために、ExtractはMYSQL_HOME環境変数を確認します。MYSQL_HOMEが設定されている場合、Extractは指定されたディレクトリの構成ファイルを使用します。MYSQL_HOMEが設定されていない場合、Extractはinformation_schema.global_variables表に問い合せてMySQLのインストール・ディレクトリを決定します。構成ファイルがそのディレクトリにある場合、Extractはそれを使用します。

ホスト名の追加

Oracle GoldenGateは、接続先のデータベースの名前をSOURCEDBパラメータから取得します。接続の成功は、システム・ホスト・ファイルで適切に構成されているlocalhostエントリに依存します。不適切なローカル・ホスト構成によって問題が生じないようにするには、SOURCEDBを次のように使用します。

SOURCEDB database_name@host_name

説明: database_nameはMySQLインスタンスの名前、host_nameはローカル・ホストの名前またはIPアドレスです。修飾されていないホスト名を使用する場合、名前はDNSデータベースに適切に構成されている必要があります。そうでない場合、完全修飾されたホスト名(myhost.company.comなど)を使用します。

セッション・キャラクタ・セットの設定

GGSCI、ExtractおよびReplicatプロセスは、データベースへの接続時にセッション・キャラクタ・セットを使用します。MySQLでは、セッション・キャラクタ・セットは、SOURCEDBおよびTARGETDBSESSIONCHARSETオプションから取得されます。Oracle GoldenGateを構成する際、これらのいずれかでセッション・キャラクタ・セットを必ず指定してください。

処理のための表の準備

この項では、処理のための表の準備方法について説明します。表の準備では次のタスクが必要です。

行識別子の割当て

Oracle GoldenGateでは、レプリケートされた更新および削除に対して正しいターゲット行を見つけるために、ソース表とターゲット表にある形式の一意の行識別子が必要です。

Oracle GoldenGateで使用する行識別子の種類を判別する方法

TABLEまたはMAP文でKEYCOLS句が使用されないかぎり、Oracle GoldenGateは、使用する行識別子を次の優先順位に従って選択します。

  1. 主キー
  2. タイムスタンプまたはマテリアライズされていない計算結果列を含まない英数字順で最初の一意キー。
  3. 前述のキー・タイプのいずれも存在しない場合(その他の種類のキーが表に定義されている場合でも)、Oracle GoldenGateは、データベースで一意キーでの使用を許可されているすべての列(キー内での使用がOracle GoldenGateでサポートされていない列やOracle GoldenGate構成から除外されている列は除く)で疑似キーを作成します。

    注意:

    表に使用可能な他のキーがない場合や、表にキーがまったくない場合、Oracle GoldenGateは該当するメッセージをレポート・ファイルに記録します。すべての列からキーを作成すると、ソース・システムのOracle GoldenGateのパフォーマンスが低下します。ターゲットでは、このキーはReplicatであまり効率的でないより大きいWHERE句が使用される原因となります。

一意索引から導出される主キーを持つ表

表に主キーがなく、索引付けされた列がNOT NULLである場合、MySQLでは一意索引が主キーにプロモートされます。これらのNOT NULL索引が複数ある場合、最初に作成された索引が主キーになります。Replicatでエラーが発生しないようにするには、ソース表とターゲット表でこれらの索引を同じ順序で作成します。

たとえば、ggvam.empという名前のソース表とターゲット表のそれぞれにfirst、middle、lastという列があり、それらすべてがNOT NULLとして定義されているとします。次の順序で一意索引を作成した場合、表定義が一致しないため、Oracle GoldenGateはターゲットで異常終了します。

ソース:

mysql> create unique index uq1 on ggvam.emp(first); 
mysql> create unique index uq2 on ggvam.emp(middle); 
mysql> create unique index uq3 on ggvam.emp(last); 

ターゲット:

mysql> create unique index uq1 on ggvam.emp(last); 
mysql> create unique index uq2 on ggvam.emp(first); 
mysql> create unique index uq3 on ggvam.emp(middle); 

この順序の結果、MySQLでは、ソースの"first"列の索引と、ターゲットの"last"列の索引が主キーにプロモートされます。Oracle GoldenGateでは、メタデータ・レコードの作成時に主キーが識別子として選択されるため、メタデータが一致しなくなります。このエラーを回避するには、主キーにプロモートする列を決定し、ソースおよびターゲットでその索引を最初に作成します。

Oracle GoldenGateで使用する独自キーを指定する方法

前述のキー・タイプの行識別子が表に存在しないか、または、それらの識別子を使用しない場合は、常に一意の値が含まれている列が表にあれば、代替キーを定義できます。ExtractのTABLEパラメータおよびReplicatのMAPパラメータ内にKEYCOLS句を含めることで、この代替キーを定義します。指定したキーにより、Oracle GoldenGateで検出される既存の主キーまたは一意キーはオーバーライドされます。

キーのない表での行の変更の制限

ターゲット表に主キーまたは一意のキーがない場合、重複する行が存在する可能性があります。この場合、Oracle GoldenGateで更新または削除されるターゲット表の行数が多くなりすぎ、ソース・データとターゲット・データの同期がとれなくなる可能性があります。警告するエラー・メッセージは表示されません。更新される行数を制限するには、Replicatパラメータ・ファイルでDBOPTIONSパラメータにLIMITROWSオプションを使用します。LIMITROWSを使用すると1行しか処理されないため、ターゲット・システムにおけるOracle GoldenGateのパフォーマンスが向上する可能性があります。

トリガーおよびカスケード制約の無効化

ターゲット表のトリガー、カスケード削除制約、カスケード更新制約を無効にするか、これらを変更してOracle GoldenGateデータベース・ユーザーによる変更が無視されるようにします。Oracle GoldenGateでは、トリガーまたはカスケード制約の結果として生成されるDMLがレプリケートされます。同じトリガーや制約がターゲット表でアクティブになった場合、レプリケートされたバージョンのために重複となり、データベースでエラーが返されます。ソース表にemp_srcsalary_src、ターゲット表にemp_targsalary_targを使用している次の例について考えます。

  1. emp_srcに対して削除が発行されます。

  2. それによって、削除がsalary_srcにカスケードされます。

  3. Oracle GoldenGateが、両方の削除をターゲットに送信します。

  4. まず親削除が到着し、emp_targに適用されます。

  5. 親削除によって、削除がsalary_targにカスケードされます。

  6. salary_srcのカスケードされた削除が、salary_targに適用されます。

  7. 行は、すでに手順5で削除されているため、見つかりません。

log-binの場所の変更

log-bin変数をMySQL構成ファイルで使用してバイナリ・ログの場所を変更すると、索引ファイル内に2つの異なるパス・エントリが生じることになり、エラーが発生する場合があります。エラーの可能性を避けるため、次の操作を行ってlog-binの場所を変更します。

  1. あらゆる新規のDML操作を停止します。
  2. Extractで既存バイナリ・ログのすべての処理を終了します。これは、チェックポイント位置が最終ログのオフセットに達した時間を注記することで確認できます。
  3. Extractがデータの処理を終了したら、Extractグループを停止して、必要ならばバイナリ・ログのバックアップを取ります。
  4. MySQLデータベースを停止します。
  5. 新しい場所のlog-binパスを変更します。
  6. MySQLデータベースを起動します。
  7. 索引ファイルから古いログ名エントリを消去するには、flush masterまたはreset masterを(MySQLのバージョンに応じて)使用します。
  8. Extractを起動します。

双方向レプリケーションの構成

双方向構成では、各システムのトランザクション変更をもう一方のシステムにレプリケーションすることをサポートするために、ソースおよびターゲットの両方のシステムにExtractおよびReplicatプロセスがあります。この構成をサポートするには、適用されたトランザクションが再キャプチャされてソースに送られることが繰り返されることのないよう、各ExtractがローカルのReplicatで適用されたトランザクションをフィルタできる必要があります。さらに、各システムで値の不整合が起こらないようにAUTO_INCREMENT列も設定する必要があります。

  1. 『Oracle DatabaseのためのOracle GoldenGateの使用』アクティブ-アクティブ(双方向)構成でのDDLの伝播に関する項の手順に従って、Oracle GoldenGateを高可用性またはアクティブ-アクティブ・レプリケーション用に構成します。
  2. 適用された操作がキャプチャされてソースに再度ループバックされないように、双方向構成のReplicat操作をフィルタの対象外にするには、各MySQLデータベースで次のステップを実行します。
    • チェックポイント表を使用するように各Replicatプロセスを構成します。Replicatでは、各トランザクションの最後にチェックポイントをこの表に書き込みます。1つのグローバル・チェックポイント表またはReplicatプロセスごとに1つを使用できます。『Oracle GoldenGateの理解』Replicatの概要に関する項を参照してください。

    • Extractパラメータ・ファイルに含まれるTRANLOGOPTIONSパラメータのFILTERTABLEオプションを使用して、チェックポイント表の名前を指定します。Extractプロセスでは、指定された表に対する操作(Replicat操作のみ)で終了するトランザクションは無視されます。

      注意:

      チェックポイント表の使用は、サポートされている他のデータベースではリカバリを拡張するためのオプションですが、MySQLで双方向レプリケーションを使用する際には必須です(同様にリカバリも拡張されます)。

  3. 双方向操作で発生する可能性のある不一致を回避するよう、MySQLサーバー構成ファイルを編集して、auto_increment_incrementおよびauto_increment_offsetパラメータを設定します。ServerAServerBの2つのサーバーを例として、これらのパラメータを次に示します。

    ServerA:

    auto-increment-increment = 2
    auto-increment-offset = 1
    

    ServerB:

    auto-increment-increment = 2
    auto-increment-offset = 2

MySQLレプリケーション・スレーブを使用した取得

MySQLレプリケーション・スレーブを構成して、マスターのバイナリ・ログ・イベントをスレーブから取得できます。

通常、スレーブによって適用されるトランザクションは、スレーブのbinlogではなくリレー・ログに記録されます。スレーブがマスターから受け取るトランザクションをbinlogに書き込むには、Oracle GoldenGateの他のバイナリ・ログ・パラメータとともに、my.cnflog-slave-updatesオプションを1に指定して、レプリケーション・スレーブを起動する必要があります。マスターのトランザクションがスレーブのbinlogに書き込まれた後で、通常のOracle GoldenGateキャプチャをスレーブに対して設定すると、スレーブのbinlogを取得して処理できます。

AWS Aurora MySQLへのセキュアなデータベース接続の確立

Oracle GoldenGateは、SSHトンネリングを使用し、.pemファイルを使用してAWS Auroraインスタンスに接続し、オンプレミスからOracle GoldenGateのMySQL配信を実行します。

AWS Aurora MySQLへのセキュアなデータベース接続のためのSSHトンネリングを設定するには、次のタスクを実行します。

タスク1: SSHトンネリングの構成

SSHトンネリングを構成するには、次の手順を実行します。
ssh -i your_key.pem -v -f -L local port number:cluster end point:end 
point port number ec2 host name  > mysql_remote_forward.log 2>&1 

次の例では、ローカルにインストールされているMySQLでポート番号3306が使用される可能性があるため、ローカル・ポート番号は3308に設定されています。


bash-4.1$ ssh -i "test.pem" -v -N -f -L 
3308:test-cluster.cluster-copyxiqzdjjl.us-west-2.rds.amazonaws.com:3306 
ec2-user@ec2-52-11-244-17.us-west-2.compute.amazonaws.com > 
mysql_remote_forward.log 2>&1 
Oracle GoldenGateがプロキシの背後で実行されている場合は、次の構成を実行します。
ssh -i your_key.pem -v -f -L local port number:cluster end point:end point 
port number ec2 host name -o command to bypass proxy in double quotes> > 
mysql_remote_forward.log 2>&1 
次に例を示します。
bash-4.1$ ssh -i "test.pem" -v -N -f -L 3308:test-cluster.cluster-copyxiqzdjjl.us-west-2.rds.amazonaws.com:3306 
ec2-user@ec2-52-11-244-17.us-west-2.compute.amazonaws.com -o "ProxyCommand=nc 
-X connect -x www-proxy.us.oracle.com:80 %h %p" > mysql_remote_forward.log 2>&1

タスク2: Extractパラメータ・ファイルの接続文字列の指定

リモート・ユーザーにはすべての権限が必要です。次の接続文字列はソース・データベースとターゲット・データベースの両方で使用します。
remotedb@127.0.0.1:3308  userid 
remote-user, password 
remote-user-password
また、接続タイムアウトを防止するには、次の変数を~/.ssh/configファイルに追加します。これは、アクティビティがない場合にAWSが60秒後に接続を自動的に切断するためです。
bash-4.1$ cat ~/.ssh/config 
ServerAliveInterval 50 

MySQLに関するその他のOracle GoldenGateパラメータ

MySQLインストールで次のパラメータを使用できます。デフォルト以外の設定がMySQLデータベースに対して使用される場合、必須です。ビジネス要件や構成によっては、これら以外のOracle GoldenGateパラメータも必要です。

表13-1 MySQLに関するその他のOracle GoldenGateパラメータ

パラメータ 説明

CONNECTIONPORT port_numberを使用したDBOPTIONS

MySQLがデフォルトである3306で実行されない場合、Oracle GoldenGateプロセスの接続先のMySQLインスタンスのTCP/IP接続ポート番号をVAMに指定するために必要です。

DBOPTIONS CONNECTIONPORT 3307 

HOST host_idを使用したDBOPTIONS

Replicatの接続先のシステムをホストしているMySQLのDNS名またはIPアドレスを指定します。

ALLOWLOBDATATRUNCATEを使用したDBOPTIONS

レプリケートするLOBデータがターゲットMySQLのCHARVARCHARBINARYまたはVARBINARY列に対して大きすぎる場合にReplicatが異常終了することを防ぎます。

USERIDおよびPASSWORDを使用したSOURCEDB

MySQLデータベースに接続するOracle GoldenGateプロセスによって使用されるデータベース、ユーザー名およびパスワードで構成されるデータベース接続情報を指定します。MySQLがデフォルト・ポートである3306で実行されていない場合、SOURCEDB dbname@hostname:port, USERID user, PASSWORD passwordのようにポート番号を含む完全な接続文字列を指定する必要があります。.次に例を示します。

SOURCEDB mydb@mymachine:3307, USERID myuser, PASSWORD mypassword

MySQLデータベースをポート3306で実行中ではない場合、GGSCI経由でデータベースに影響するコマンドを発行する際に、DBLOGINコマンドでMySQLデータベースの接続ポートも指定する必要があります。

DBLOGIN SOURCEDB dbname@hostname:port, USERID user, PASSWORD password

次に例を示します。

GGSCI> DBLOGIN SOURCEDB mydb@mymachine:3307, USERID myuser, PASSWORD mypassword 

SQLEXEC

ReplicatでMySQLの接続タイムアウトを回避できるようにするため、Replicatパラメータ・ファイルのSQLEXEC文で次のコマンドを構成します。

SQLEXEC "select CURRENT_TIME();" EVERY n MINUTES

説明: nは、Replicatで再接続を行うまでの最大間隔です。推奨される接続タイムアウトは31536000秒(365日)です。

特定の開始ポイントへのExtractの設定

次のコマンドを使用して、トランザクション・ログの特定の開始ポイントにADD EXTRACTおよびALTER EXTRACTコマンドを配置できます。

{ADD | ALTER EXTRACT} group, VAM, LOGNUM log_num, LOGPOS log_pos

  • groupは、開始ポイントが必要なOracle GoldenGate Extractのグループ名です。

  • log_numはログ・ファイル番号です。たとえば、必要なログ・ファイルの名前がtest.000034である場合、この値は34です。Extractでは、このログ・ファイルが検索されます。

  • log_posは、特定のトランザクション・レコードを識別する、ログ・ファイル内のイベント・オフセット値です。イベント・オフセット値は、ログ・レコードのヘッダー・セクションに格納されます。binlogファイルの先頭に配置するには、log_posを4に設定します。log_posの0または1は、読取りと処理を開始するための有効なオフセットではありません。

MySQLログでは、イベント・オフセット値は所定のバイナリ・ファイル内でのみ一意にできます。位置の値とログ番号の組合せにより、トランザクション・レコードが一意に識別されますが、この組合せの長さは37文字を超えることはできません。指定したログ内でこの位置の後に使用可能なトランザクション・レコードが、Extractによってキャプチャされます。また、タイムスタンプを使用してExtractを配置することもできます。