6 DDLレプリケーションの使用
データ定義言語(DDL)文(操作)を使用して、MySQLデータベースの構造(スキーマ)を定義します。MySQLソース・データベースとターゲット・データベース間のデータ・レプリケーションに、このようなDDL文を使用できます。MySQL DDLの詳細は、https://dev.mysql.com/doc/でMySQLのドキュメントを参照してください。
MySQLのためのOracle GoldenGate 21cでは、MySQL 8.0のトランザクション・ログ・ベースのレプリケーション・ソリューションが導入されており、プラグイン・ベースのDDLレプリケーション方法に比べてパフォーマンスとユーザビリティが向上しています。
内容は次のとおりです。
6.1 トランザクション・ログ・ベースのDDL構成の前提条件と考慮事項
次に、トランザクション・ログ・ベースのDDLレプリケーションの構成の前提条件を示します。
-
Oracle GoldenGate 21c以上でMySQL 8.0以降にアップグレードした後は、完全なメタデータのロギングが必須です。完全なメタデータのロギングを有効にするには:
-
MySQLサーバー変数
binlog_row_metadataの値を、MySQL構成ファイル内ではFULL、Linuxではmy.cnf、Windowsではmy.iniに設定します。 -
設定を有効にするために、構成ファイルを変更した後、データベース・サーバーを再起動します。
-
-
DDLループを防ぐためにDDL操作をフィルタ処理する方法がないため、DDLレプリケーションはOracle GoldenGateの双方向構成ではサポートされていません。
-
リモート取得のDDLレプリケーションはMySQL 8.0以降ではサポートされていません。トランザクション・ログ・ベースのDDLレプリケーションは、リモート取得またはローカル取得の両方で動作します。これは、以前のOracle GoldenGateリリースの制限でした。たとえば、Oracle GoldenGate 19cのリモート取得ではDDLレプリケーションをサポートしていませんでした。
-
トランザクション・ログ・ベースのDDLレプリケーションでは、ストアド・プロシージャ内で発行されたDDLを処理できます。これは、プラグイン・ベースのDDLレプリケーションでは制限になります。
-
設計上、ハートビート表DDLはキャプチャによって無視されるため、ターゲットで手動でハートビート表を作成する必要があります。
親トピック: DDLレプリケーションの使用
6.2 プラグイン・ベースのDDL構成の前提条件と考慮事項
これは、DDLレプリケーションを実行するための古いアプローチです。次に、DDLレプリケーションの構成の前提条件を示します。
-
DDLレプリケーションはMySQL 5.7でサポートされます。
-
DDLループを防ぐためにDDL操作をフィルタ処理する方法がないため、DDLレプリケーションはOracle GoldenGateの双方向構成ではサポートされていません。
-
MySQL 5.7のリモート・キャプチャではDDLレプリケーションがサポートされていません。
-
Oracle GoldenGateのDDLレプリケーションでは、
ddl_rewriterとddl_metadataの2つのプラグインが共有ライブラリとして使用されるため、これらをMySQLサーバーにインストールしてから、Oracle GoldenGateレプリケーションを開始する必要があります。 -
スタンドアロン・アプリケーションであるOracle GoldenGate
metadata_serverが実行されていて、DDLメタデータをキャプチャしている必要があります。 -
新しい
oggddlデータベース配下にhistory表(oggddl.history)が必要です。このメタデータ履歴表を使用して、DDLメタデータ履歴が格納されて取得されます。履歴表レコードはバイナリ・ログには記録されないようにする必要があるため、my.cnfファイルでbinlog-ignore-db=oggddlを指定してください。 -
手動で
oggddlデータベースまたはhistory表をドロップしないでください。このイベント後に実行されるすべてのDDL文が失われます。 -
DDLキャプチャ中に
metadata_serverサーバーを停止しないでください。このイベント後に実行されるすべてのDDL文が失われます。 -
DDLキャプチャ中に
ddl_rewriterおよびddl_metadataプラグインを手動で削除しないでください。このイベント後に実行されるすべてのDDL文が失われます。 -
ストアド・プロシージャ内で実行されるDDLはサポートされません。たとえば、次のように実行されるDDLはサポートされません。
CREATE PROCEDURE atssrc.generate_data() BEGIN DECLARE i INT DEFAULT 0; WHILE i < 800 DO SET i = i + 1; IF (i = 100) then alter table atssrc.`ddl6` add col2 DATE after id; ELSEIF (i = 200) then alter table atssrc.`ddl6` add col3 DATETIME after datetime; ELSEIF (i = 300) then alter table atssrc.`ddl6` add `col4` timestamp NULL DEFAULT NULL after channel; ELSEIF (i = 400) then alter table atssrc.`ddl6` add col5 YEAR after value; END IF; END WHILE; END$$ DELIMITER ; call atssrc.generate_data();
-
設計上、ハートビート表DDLはキャプチャによって無視されるため、ターゲットで手動でハートビート表を作成する必要があります。
- DDLレプリケーションのインストール
- メタデータ・サーバーの使用
- プラグイン・ベースのDDLレプリケーションのトラブルシューティング
- プラグイン・ベースのDDLレプリケーションからトランザクション・ログ・ベースのDDLレプリケーションへのアップグレード
- プラグイン・ベースのDDLレプリケーションのアンインストール
親トピック: DDLレプリケーションの使用
6.2.1 DDLレプリケーションのインストール
DDLレプリケーションをインストールするには、Oracle GoldenGateが提供するインストール・スクリプトをレプリケーション・ユーザーとして実行します。このユーザーはCreate、Insert、Select、Delete、DropおよびTruncateデータベース権限を持つ必要があります。さらに、このユーザーは書込み権限を持ち、Oracle GoldenGateプラグインをMySQLプラグイン・ディレクトリにコピーする必要があります。たとえば、MySQLプラグインは通常は/usr/lib64/mysql/plugin/に置かれます。
インストール・スクリプトのオプションには、install、uninstall、start、stopおよびrestartがあります。
DDLレプリケーションをインストールするコマンドでは、それぞれ、インストール・オプション、ユーザーID、パスワード、ポート番号が使用されます。
bash-3.2$ ./ddl_install.sh install-option user-id password port-number次に例を示します。
bash-3.2$ ./ddl_install.sh install root welcome 3306DDLレプリケーションのインストール・スクリプトを使用して、次のタスクを行います。
- サポートされているMySQLサーバーのバージョンがインストールされていることを確認します。DDLレプリケーションはMySQL 5.7.10以上の場合にサポートされます。
- MySQLプラグイン・ディレクトリを見つけます。
ddl_rewriterプラグインとddl_metadataプラグイン、およびmetadata_serverファイルが存在することを確認します。これらのファイルが見つからない場合は、エラー・メッセージが表示されてインストールが終了します。- プラグインがすでにインストールされていることを確認します。インストールされている場合はスクリプトが終了してメッセージが表示され、最初にアンインストールしてから再インストールするよう求められます。
- 実行中の場合は、
metadata_serverを停止します。 - 存在する場合は、
oggddl.history表を削除します。 metadata_serverをデーモン・プロセスとして開始します。ddl_rewriterおよびddl_metadataプラグインがインストールされます。
親トピック: プラグイン・ベースのDDL構成の前提条件と考慮事項
6.2.2 メタデータ・サーバーの使用
メタデータ・サーバーに次のオプションを使用できます。
-
Oracle GoldenGateの
metadata_serverが実行されていなければ、DDLメタデータをキャプチャできません。 -
startオプションを指定してインストール・スクリプトを実行すると、メタデータ・サーバーが起動します。 -
stopオプションを指定してインストール・スクリプトを実行すると、メタデータ・サーバーが停止します。 -
restartオプションを指定してインストール・スクリプトを実行すると、実行中のメタデータ・サーバーが停止して再起動します。 -
Oracle GoldenGateのDDLレプリケーションでは、
ddl_rewriterとddl_metadataの2つのプラグインが共有ライブラリとして使用されるため、両方をMySQLサーバーにインストールしてから、Oracle GoldenGateレプリケーションを開始する必要があります。 -
oggddl.historyメタデータ履歴表を使用して、DDLメタデータ履歴が格納されて取得されます。
各MySQLサーバーに1つの履歴表とメタデータ・サーバーがあります。同じデータベース・サーバーの1つのExtractプロセスの複数のインスタンスから、同時にDDLを発行してキャプチャする場合、メタデータ履歴表へのアクセスと移入の間に競合が発生する可能性があります。同じMySQLサーバーの複数のExtractインスタンスを使用して、DDLの実行とキャプチャを行うことはお薦めできません。
親トピック: プラグイン・ベースのDDL構成の前提条件と考慮事項
6.2.3 プラグイン・ベースのDDLレプリケーションのトラブルシューティング
mysqldumpコマンドを使用し、次の例のいずれかに従って履歴表ダンプを生成できます。
mysqldump [options] database [tables] mysqldump [options] --databases [options] DB1 [DB2 DB3...] mysqldump [options] --all-databases [options]
例: bash-3.2$ mysqldump -uroot -pwelcome oggddl history > outfile
メタデータ・プラグインおよびサーバー・ログは、それぞれ、MySQLおよびOracle GoldenGateインストール・ディレクトリにあります。
ログ・ファイルにエラーが見つかった場合は、メタデータ・サーバーが実行中であることを確認する必要があります。
親トピック: プラグイン・ベースのDDL構成の前提条件と考慮事項
6.2.4 プラグイン・ベースのDDLレプリケーションからトランザクション・ログ・ベースのDDLレプリケーションへのアップグレード
MySQL 5.7でプラグイン・ベースのソリューションを使用しており、トランザクション・ログ・ベースのDDLレプリケーションを使用するMySQL 8.0へのアップグレードを計画している場合は、次のことを行う必要があります。
-
プラグイン・ベースのDDLレプリケーションのアンインストールの説明に従って、プラグイン・コンポーネントをアンインストールします。
-
データベースをアップグレードします。
-
トランザクション・ログ・ベースのDDL構成の前提条件と考慮事項に示されているステップに基づいてDDLレプリケーション・サポートを再度有効にし、前提条件と構成の考慮事項を確認します。
親トピック: プラグイン・ベースのDDL構成の前提条件と考慮事項
6.2.5 プラグイン・ベースのDDLレプリケーションのアンインストール
DDLイベントをキャプチャする必要がなくなった場合は、同じインストール・スクリプトを使用してuninstallオプションを選択し、DDL設定を無効にできます。また、DDLパラメータが指定されたExtractを削除するか無効にする必要があります。再度、DDLのキャプチャが必要になった場合は、インストール・スクリプトを再実行できます。MySQLサーバーの同じインスタンスで、キャプチャ・プロセスの複数のインスタンスが実行中の場合は注意が必要です。複数のキャプチャ・プロセスが実行中で、最大でも1つのキャプチャがDDL文をキャプチャするように設計されている場合は、DDL設定を妨げたり、アンインストールしないでください。
インストール・スクリプトを使用してuninstallオプションを指定し、DDLレプリケーションをアンインストールします。次に例を示します。
bash-3.2$ ./ddl_install.sh uninstall root welcome 3306このスクリプトは次のタスクを実行します。
ddl_rewriterおよびddl_metadataプラグインをアンインストールします。- 存在する場合は、
oggddl.history表を削除します。 - MySQLプラグイン・ディレクトリからプラグインを削除します。
- 実行中の場合は、
metadata_serverを停止します。
親トピック: プラグイン・ベースのDDL構成の前提条件と考慮事項
6.3 レプリケーションのためのDDLフィルタリングの使用
MySQLのDDLレプリケーションでは次のオプションがサポートされます。
| オプション | 説明 |
|---|---|
|
|
表の作成を含めます。 |
|
|
|
|
|
|
|
|
この文字列を含むDDLを含めます。 |
|
|
この文字列を含むDDLを除外します。 |
|
|
MySQL DDLではこのオプションが使用されます。Oracle GoldenGateのMySQL DDLレプリケーションのデフォルトとして使用する必要があります。 |
|
|
デフォルト・オプション。 |
すべてのオプションのリストは、『Oracle GoldenGateリファレンス』のDDLに関する項を参照してください。
DDL文とオプションの使用
-
INCLUDE(デフォルト)は、後続の記述に適合するすべてのオブジェクトを包含します。EXCLUDEは記述に適合する項目を除外します。除外ルールは包含ルールより優先されます。 -
OPTYPEは包含または除外する操作のタイプを指定します。CREATEおよびALTERを使用できます。カッコを使用して複数のOPTYPEを指定できます。たとえば、optype (create, alter)と指定します。アスタリスク(*)のワイルドカードを指定して、すべての操作タイプを指定できます(デフォルト)。 -
OBJTYPEは包含または除外するTABLE操作を指定します。ワイルドカードを指定して、すべてのオブジェクト・タイプを指定できます(デフォルト)。 -
OBJNAMEは包含または除外する実際のオブジェクト名を指定します。たとえば、eric.*と指定します。ワイルドカードは、複数の表を指定するその他の場合と同様に指定します。デフォルトは*です。 -
Stringは、stringspecの文字列が存在する場合はルールがtrueであることを示します(または、excludestringを指定すると、stringspecが存在する場合はfalseになります)。複数のstring項目を指定する場合は、各stringspecの少なくとも1つの項目が存在しなければ、ルールはtrueになりません。次に例を示します。ddlops string (“a”, “b”), string (“c”) evaluates true if string “a” OR “b” is present, AND string “c” is present -
localは、現在のExtract証跡のみにルールを適用する場合に指定します(ルールを適用するExtract証跡をこのddlops指定の前に記述する必要があります)。 -
パラメータ項目の終了を示すためにセミコロンが必要です。
次に例を示します。
ddl optype (create, drop), objname (eric.*); ddl exclude objname (eric.tab*); exttrail a; exttrail b; ddl optype (create), objname (joe.*), string (“abc”, “xyz”) local; ddl optype (alter), objtype (index);この例では、
exttrail aがericに属するすべてのオブジェクトに対するcreateおよびdropを取得しますが、tabで始まるオブジェクトは除外されます。さらに、exttrail aはすべてのalter index文を取得しますが、索引名がtabで始まる場合は除外されます(たとえ、exttrail bに含まれていてもルールはグローバルです)。exttrail bはaと同じオブジェクトを取得し、さらにjoeに属するオブジェクトに対するすべてのcreateを取得します(文字列abcまたはxyzがDDLテキストに存在する場合)。ddlops.cモジュールはすべてのDDL操作パラメータを格納し、関連するルールを実行します。
さらに、DDLOPTIONSパラメータでは、フィルタリングおよび文字列置換以外のDDL処理を構成します。DDLOPTIONS文は複数使用可能ですが、1つの文のみを使用することをお薦めします。複数のDDLOPTIONS文を使用する場合は、相互に上書きしないように、それぞれを一意の文にする必要があります。複数のDDLOPTIONS文は、パラメータ・ファイルに指定された順に実行されます。
DDLおよびDDLOPTIONSに関する項を参照してください。
親トピック: DDLレプリケーションの使用