AnalyticDB for PostgreSQLを使用すると、mysql_fdw拡張機能を使用して、データをAnalyticDB for PostgreSQLに書き込むことなく、MySQLサーバー上のデータにアクセス、追加、削除、変更、クエリを実行できます。
使用上の注意
MySQL外部テーブルに対してUPDATE、DELETE、INSERTなどのDML操作を実行する場合、ソーステーブルは最初の列を一意の主キー列または複合主キーの一部として使用する必要があります。 主キー制約制限はSELECT操作には適用されません。
前提条件
mysql_fdw拡張子がインストールされています。 詳細については、「拡張機能のインストール、更新、およびアンインストール」をご参照ください。
AnalyticDB for PostgreSQLインスタンス用にデータベースアカウントが作成されます。 詳細については、「データベースアカウントの作成」をご参照ください。
入門ガイド
mysql_fdw拡張機能を使用してリモートMySQLデータベース上のデータにアクセスするには、次の手順を実行します。
AnalyticDB for PostgreSQLコンソールにログインします。 管理するAnalyticDB for PostgreSQLインスタンスを見つけ、インスタンスIDをクリックして、インスタンスの [基本情報] ページに移動します。
ページの右上隅にある [データベースにログイン] をクリックします。 [データベースインスタンスへのログイン] ダイアログボックスで、[データベースアカウント] と [データベースパスワード] パラメーターを設定し、[ログイン] をクリックします。
データベースを入力し、CREATE SERVERステートメントを実行して、アクセスするMySQLデータベースとして外部サーバーを作成します。 サンプル文:
-- Create a foreign server named mysql_svr. CREATE SERVER mysql_svr FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '127.0.0.1', port '3306'); -- Create a user mapping for the mysql_svr server by specifying the username and the password that are used to access the MySQL database. CREATE USER MAPPING FOR public SERVER mysql_svr OPTIONS (username '$MYSQL_USER_NAME', password '$MYSQL_PASS'); -- Use the mysql_svr server to create a foreign table. CREATE FOREIGN TABLE test_foreign_table( c1 INT, c2 INT, c3 TEXT, c4 TEXT) SERVER mysql_svr OPTIONS(dbname 'mysql_fdw_database', table_name 'test_foreign_table');
パラメーター:
CREATE SERVER: 外部サーバーを作成します。 外部サーバーは、アクセスするMySQLデータベースを指定します。
CREATE USER MAPPING: ユーザーマッピングを作成します。 MySQLデータベースへのアクセスに使用するユーザー名とパスワードを指定する必要があります。
CREATE FOREIGN TABLE: 外部テーブルを作成します。 外部テーブルの列名は、アクセスするリモートテーブルの列名と一致する必要があります。 また、IMPORT FOREIGN SCHEMAステートメントを実行して、mysql_fdw拡張子が、アクセスするMySQLテーブルのAnalyticDB for PostgreSQLインスタンスに外部テーブルを自動的に作成できるようにすることもできます。
MySQLデータベースのデータに対して、クエリ、挿入、追加、および削除の操作を実行します。 上記の操作のみがサポートされています。
構文
サーバーの作成
外部サーバーを作成します。
CREATE SERVER [IF NOT EXISTS] server_name [TYPE 'server_type'] [VERSION 'server_version']
FOREIGN DATA WRAPPER fdw_name
[OPTIONS([mpp_execute 'any | master | all segments' ], option 'value' [, ... ])]
オプション 'value' パラメーターのサポートされている値
オプション | 説明 | デフォルト値 |
host | アクセスするMySQLデータベースのIPアドレス。 | 127.0.0.1 |
port | アクセスするMySQLデータベースのポート番号。 | 3306 |
init_command | アクセスするMySQLデータベースとの接続を確立するために使用されるSQL文。 | Empty |
secure_auth | V5.7.5以前は、MySQLはpassword() 関数を使用して平文パスワードを暗号化パスワードに変換します。 secure_authオプションは、前述の暗号化方法を外部サーバーで使用するかどうかを指定します。 | true |
use_remote_estimate | EXPLAINステートメントを実行して、実行計画を生成するためにMySQLからテーブル統計を取得するかどうかを指定します。 | false |
reconnect | 自動再接続を許可するかどうかを指定します。 | false |
character_set | 接続に使用される文字セット。 デフォルト値はautoで、MySQLクライアントがデプロイされているOSの文字セットを指定します。 | auto |
sql_mode | MySQLのSQLモード。これは、SQL構文とデータ検証チェックに影響を与えるために使用されます。 詳細については、次をご参照ください: | ANSI_QUOTES |
ssl_key | MySQLクライアント上の秘密鍵ファイルのパス名。 | Empty |
ssl_cert | MySQLクライアントの公開キー証明書のパス名。 | Empty |
ssl_ca | 認証局 (CA) によって発行された証明書のパス名。 このオプションを指定すると、外部サーバーは同じ証明書を使用します。 | Empty |
ssl_capath | 信頼できるSSL CA証明書が格納されているディレクトリのパス名。 | Empty |
ssl_cipher | SSL暗号化に使用できるパスワード。 | <none> |
fetch_size | mysql_fdw拡張子の各実行によって取得される行数。 外部テーブルにfetch_sizeオプションを指定すると、外部サーバーに指定したfetch_sizeオプションの値が上書きされます。 | 100 |
CREATE USER MAPPING
CREATE USER MAPPINGステートメントを実行して、ユーザーマッピングを作成します。
CREATE USER MAPPING [ IF NOT EXISTS ] FOR { user_name | USER | CURRENT_USER | PUBLIC }
SERVER server_name
[ OPTIONS ( option 'value' [ , ... ] ) ]
オプション 'value' パラメーターのサポートされている値
オプション | 説明 | デフォルト値 |
username | MySQLデータベースへのアクセスに使用されるユーザー名。 | Empty |
password | MySQLデータベースへのアクセスに使用されるパスワード。 | Empty |
FOREIGNテーブルの作成
データベース管理システムで外部テーブルを作成します。
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
SERVER server_name
[ OPTIONS ( [ mpp_execute 'any | master | all segments' ], option 'value' [, ... ] ) ]
オプション 'value' パラメーターのサポートされている値
オプション | 説明 | デフォルト値 |
dbname | 作成した外部データベースの名前。 | Empty |
table_name | 作成する外部テーブルの名前。 | カスタム名AnalyticDB for PostgreSQL |
fetch_size | mysql_fdw拡張子の各実行によって取得される行数。 外部テーブルにfetch_sizeオプションを指定すると、外部サーバーに指定したfetch_sizeオプションの値が上書きされます。 | 100 |
IMPORT FOREIGN SCHEMA
MySQLテーブルに関する情報をAnalyticDB for PostgreSQLにインポートして、情報を外部テーブルとして保存します。
IMPORT FOREIGN SCHEMA remote_schema
[ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ]
FROM SERVER server_name
INTO local_schema
[ OPTIONS ( option 'value' [, ... ] ) ]
オプション 'value' パラメーターのサポートされている値
オプション | 説明 | デフォルト値 |
import_default | 外部テーブルスキーマを同期するときに、既定の式をインポートするかどうかを指定します。 | FALSE |
import_not_null | 外部テーブルスキーマを同期するときにNULL以外の式をインポートするかどうかを指定します。 | TRUE |
import_enum_as_text | ENUMタイプのMySQLデータをTEXTタイプにマップするかどうかを指定します。 import_enum_as_textオプションをFALSEに設定すると、TEXTタイプのデータを作成するように求められます。 | FALSE |
互換性
AnalyticDB for PostgreSQLのmysql_fdw拡張機能は、次のMySQLインスタンスおよびデータベースと互換性があります。
ApsaraDB RDS for MySQL
バージョン番号 | 互換性 |
5.5 | 継続する |
5.6 | 継続する |
5.7 | 継続する |
8.0 | 継続する |
自己管理MySQLデータベース
V5.7より前のMySQLバージョンは維持されなくなりました。 ほとんどの場合、MySQL V5.7以降が使用されます。
バージョン番号 | 互換性 |
5.7 | 継続する |
8.0 (主に使用される) | 継続する |
PolarDB for MySQL
バージョン番号 | 互換性 |
8.0.2 | 継続する |
8.0.1 | 継続する |
5.7 | 継続する |
5.6 | 継続する |
機能とデータ型
機能
接続プール
同じセッション内のすべてのクエリは、新しいMySQL接続の代わりに同じMySQLデータベース接続を使用します。
プッシュダウンの場所
外部テーブルのWHERE句がMySQLにプッシュされます。 このようにして、外部テーブルに関連するWHERE条件がMySQLで実行され、AnalyticDB for PostgreSQLインスタンスに送信されるデータの行が少なくなります。
投影プッシュダウン
MySQLテーブルのすべてのデータが照会され、AnalyticDB for PostgreSQLインスタンスに送信されるわけではありません。 mysql_fdw拡張子は、SELECTステートメントを実行して照会するテーブル内の列のみを返します。 これにより、AnalyticDB for PostgreSQLインスタンスに送信されるデータが少なくなり、パフォーマンスが向上します。
準備されたステートメント
SELECTクエリは、単純なSELECTステートメントの代わりに準備済みステートメントを使用して実行されます。
プッシュダウンに参加
同じMySQLデータベース内の2つの外部テーブル間の結合操作は、実行のためにリモートMySQLデータベースにプッシュダウンされます。 これにより、2つのテーブルのすべての行を取得し、AnalyticDB for PostgreSQLインスタンスで結合操作を実行する方法と比較して、パフォーマンスが向上します。
潜在的な接続障害の問題を防ぐために、リレーショナル演算子と算術演算子を含むJOIN句のみをプッシュダウンできます。
INNER JOIN、LEFT OUTER JOIN、およびRIGHT OUTER JOIN句のみがサポートされています。 FULL OUTER JOIN、SEMI JOIN、またはANTI JOIN句はサポートされていません。
集約プッシュダウン
集計関数は、実行のためにリモートMySQLデータベースにプッシュダウンされます。 これにより、すべての行を取得し、AnalyticDB for PostgreSQLインスタンスで集計操作を実行する方法と比較して、パフォーマンスが向上します。
集約プッシュダウンは、MIN() 、MAX() 、SUM() 、AVG() 、およびCOUNT() 関数のみをサポートする。
pushdownによる注文
ORDER BY句は、MySQLから順序付けられた結果セットを取得するために実行するためにリモートMySQLデータベースにプッシュダウンされます。 MySQLデータベースは、AnalyticDB for PostgreSQLとは逆の方法でNULL関連の操作を実行します。 AnalyticDB for PostgreSQLの結果と同じ結果を取得するには、各ORDER BY句の先頭に式is NULL述語を追加します。 このように、MySQLは、昇順でソートされた結果セットの後にNULL値を配置します。
LIMITおよびOFFSETプッシュダウン
LIMIT句とOFFSET句は、実行のためにリモートMySQLデータベースにプッシュダウンされます。 これにより、すべてのデータをAnalyticDB for PostgreSQLインスタンスに送信する方法と比較して、AnalyticDB for PostgreSQLインスタンスとMySQLデータベース間で送信されるデータ量が削減されます。
データ型
いいえ | MySQLデータ型 | AnalyticDB for PostgreSQLデータ型 |
1 | ビット (N) | ビット (N) |
2 | TINYINT | SMALLINT |
3 | TINYINT UNSIGNED | SMALLINT |
4 | SMALLINT | SMALLINT |
5 | SMALLINT未確認 | BIGINT |
6 | MEDIUMINT | INT |
7 | MEDIUMINT UNSIGNED | INT |
8 | INT | INT |
9 | INT UNSIGNED | BIGINT |
10 | BIGINT | BIGINT |
11 | 署名されていないBIGINT | NUMERIC |
12 | デシマル (M、N) | NUMERIC |
13 | FLOAT | REAL |
14 | ダブル (M、N) | DOUBLE PRECISION |
15 | 日付 | 日付 |
16 | 日付時刻 | TIMEゾーンなしのDATETIME |
17 | TIMESTAMP | TIMEゾーンなしのDATETIME |
18 | 時間 | TIMEゾーンなしのTIME |
19 | 年 [4] | 非対応 |
20 | CHAR[N] | CHAR[N] |
21 | VARCHAR[N] | キャラクターVARYING(N) |
22 | バイナリ [N] | BYTEA |
23 | VARBINARY[N] | BYTEA |
24 | TINYBLOB | 非対応 |
25 | TINYTEXT | TEXT |
26 | BLOB | bytea |
27 | TEXT | TEXT |
28 | MEDIUMBLOB | BYTEA |
29 | MEDIUMTEXT | TEXT |
30 | LONGBLOB | BYTEA |
31 | LONGTEXT | TEXT |
32 | ENUM(",") | ENUM型のデータを手動で作成するように促す |
33 | セット ('','') | 非対応 |
34 | GEOMETRY | 非対応 |
35 | ポイント | ポイント |
36 | LINESTRING | 非対応 |
37 | ポリゴン | ポリゴン |
38 | マルチポイント | 非対応 |
39 | MULTILINESTRING | 非対応 |
40 | マルチポリゴン | 非対応 |
41 | GEOMETRCOLLECTION | 非対応 |
42 | JSON | JSON |