使用mysql_fdw访问MySQL数据
云原生数据仓库AnalyticDB PostgreSQL版支持通过mysql_fdw插件直接访问和对MySQL服务器上的数据进行增删改查,无需将这些数据写入到云原生数据仓库AnalyticDB PostgreSQL版中。
注意事项
对MySQL外表执行DML操作时(UPDATE、DELETE、INSERT),源数据库表结构必须以首列作为单一主键,或作为构成复合主键的一部分。执行数据查询(SELECT操作)不受此主键约束限制。
前提条件
-
已安装mysql_fdw插件。具体操作,请参见安装、升级与卸载插件。
-
已创建云原生数据仓库 AnalyticDB PostgreSQL 版数据库账号。具体操作,请参见创建和管理用户。
快速入门
使用mysql_fdw插件来访问远程MySQL上的数据,操作步骤如下:
-
登录云原生数据仓库AnalyticDB PostgreSQL版控制台。单击目标实例ID,进入目标实例基本信息页面。
-
单击右上角登录数据库,在弹出框登录实例页面填写数据库账号和数据库密码,单击登录。
-
进入数据库,使用CREATE SERVER命令创建一个外部服务器,这个外部服务器表示需要访问的MySQL数据库。如下所示是一个简单的使用示例。
-- 创建foreign server CREATE SERVER mysql_svr FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '127.0.0.1', port '3306'); -- 给刚刚创建的mysql_svr赋予一个user mapping(指定用户名密码) CREATE USER MAPPING FOR public SERVER mysql_svr OPTIONS (username '$MySQL_USER_NAME', password '$MySQL_PASS'); -- 使用mysql_svr这个foreign server创建外表 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自动在云原生数据仓库 AnalyticDB PostgreSQL 版实例上创建需要访问的MySQL表的外表。
-
-
对MySQL数据库进行查询数据、插入数据、新增数据和删除数据的操作(仅支持这些操作)。
语法
CREATE SERVER
创建一个外部服务器。
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' [, ... ])]
option 'value' 中支持的参数列表
|
options |
含义 |
默认值 |
|
host |
MySQL数据库的IP地址(或者host)。 |
127.0.0.1 |
|
port |
MySQL数据库的端口。 |
3306 |
|
init_command |
和MySQL创建连接时执行的SQL命令。 |
空 |
|
secure_auth |
v5.7.5版本以前,MySQL使用password()函数将明文密码转换为加密密码,这里设置为true,标志密码在服务端采用这种加密方式。 |
true |
|
use_remote_estimate |
在生成计划时,使用EXPLAIN方式,向MySQL获取表的统计信息。 |
false |
|
reconnect |
是否允许连接中断时自动重连。 |
false |
|
character_set |
连接使用的字符集,默认值是auto(获取MySQL客户端所在的OS的字符集)。 |
auto |
|
sql_mode |
设置MySQL的sql mode,用于影响SQL与数据的合法性校验等问题。具体的取值可以参考文档: |
ANSI_QUOTES |
|
ssl_key |
客户端私钥文件的路径名。 |
空 |
|
ssl_cert |
客户端公钥证书文件的路径名。 |
空 |
|
ssl_ca |
证书颁发机构(CA)颁发的证书文件的路径名。如果使用此选项,必须指定服务器使用相同的证书。 |
空 |
|
ssl_capath |
包含受信任SSL CA证书文件的目录的路径名。 |
空 |
|
ssl_cipher |
用于SSL加密的允许密码列表。 |
<none> |
|
fetch_size |
此选项指定mysql_fdw每次获取数据时应该获取的行数。如果在外表上设置了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' [ , ... ] ) ]
option 'value' 中支持的参数列表
|
options |
含义 |
默认值 |
|
username |
需要访问的MySQL的用户名。 |
空 |
|
password |
需要访问的MySQL的用户的密码。 |
空 |
CREATE FOREIGN TABLE
在数据库管理系统中创建一个外表。
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' [, ... ] ) ]
option 'value' 中支持的参数列表
|
options |
含义 |
默认值 |
|
dbname |
创建的外部数据库名字。 |
空 |
|
table_name |
创建的外表的名字。 |
在自定义名称。 |
|
fetch_size |
此选项指定mysql_fdw每次获取数据时应该获取的行数。在外表上设定,会覆盖在服务器上设定的值。 |
100 |
IMPORT FOREIGN SCHEMA
将MySQL端的表信息导入到云原生数据仓库 AnalyticDB PostgreSQL 版端(创建成外表)。
IMPORT FOREIGN SCHEMA remote_schema
[ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ]
FROM SERVER server_name
INTO local_schema
[ OPTIONS ( option 'value' [, ... ] ) ]
option 'value' 中支持的参数列表
|
options |
含义 |
默认值 |
|
import_default |
同步外表结构时是否导入默认表达式。 |
FALSE |
|
import_not_null |
同步外表结构时是否导入非空表达式。 |
TRUE |
|
import_enum_as_text |
同步外表结构时是否将MySQL ENUM类型映射为TEXT类型,否则会发出警告表示需要创建类型。 |
FALSE |
兼容性
云原生数据仓库 AnalyticDB PostgreSQL 版的mysql_fdw插件兼容如下MySQL实例。
公有云RDS MySQL
|
版本号 |
是否兼容 |
|
5.5 |
是 |
|
5.6 |
是 |
|
5.7 |
是 |
|
8.0 |
是 |
自建MySQL
社区v5.7以下的版本不再维护,以v5.7及以上为主要版本。
|
版本号 |
是否兼容 |
|
5.7 |
是 |
|
8.0(主要版本) |
是 |
PolarDB MySQL
|
版本号 |
是否兼容 |
|
8.0.2 |
是 |
|
8.0.1 |
是 |
|
5.7 |
是 |
|
5.6 |
是 |
功能特性和数据类型
功能特性
连接池
在同一会话中的所有查询都使用相同的MySQL数据库连接,而不是去创建一个新的MySQL连接。
WHERE从句下推
把外表的WHERE从句下推到MySQL上,把与外表相关的WHERE条件加在MySQL上执行,因此需要传输到云原生数据仓库 AnalyticDB PostgreSQL 版实例的行数会更少。
投影下推
不同于将一个表的所有数据都从MySQL中查询到云原生数据仓库 AnalyticDB PostgreSQL 版实例中,mysql_fdw只返回那些属于 SELECT目标表的列,这样可以降低传输到云原生数据仓库 AnalyticDB PostgreSQL 版实例的数据流量,提升性能。
PREPARED STATEMENT
SELECT查询使用PREPARED STATEMENT查询而不是简单的查询协议。
JOIN下推
同一MySQL数据库的两个外表之间的连接操作被下推到远端的MySQL数据库上执行,而不是先获取两个表的所有行并在云原生数据仓库 AnalyticDB PostgreSQL 版实例本地执行连接操作,从而提升了性能。
-
目前仅将包含关系和算术运算符的JOIN子句下推,以避免任何潜在的连接失败问题。
-
目前只支持INNER和LEFT或RIGHT OUTER连接,而不支持FULL OUTER、SEMI 和ANTI连接。
AGGREGATE下推
将聚合操作(AGGREGATE)下推到远端的MySQL数据库上执行,而不是获取所有行并在云原生数据仓库 AnalyticDB PostgreSQL 版实例本地进行聚合。这样做可以显著提升性能。
目前下推仅限于聚合函数MIN、MAX、SUM、AVG和COUNT。
ORDER BY下推
将ORDER BY子句下推到远端的MySQL数据库上执行,可以从MySQL获得有序的结果集。在MySQL数据库对于NULL的行为与云原生数据仓库 AnalyticDB PostgreSQL 版相反。为了获得等效的结果,在每个ORDER BY表达式的开头添加“expression IS NULL”子句,MySQL执行正向排序后会把NULL放到最后一个,和云原生数据仓库 AnalyticDB PostgreSQL 版的行为保持一致。
LIMIT OFFSET下推
在远端的MySQL数据库上执行LIMIT和OFFSET操作,不需要把所有数据拿到云原生数据仓库 AnalyticDB PostgreSQL 版数据库,减少了云原生数据仓库 AnalyticDB PostgreSQL 版数据库和MySQL数据库之间的数据流量。
数据类型
|
编号 |
MySQL 数据类型 |
映射AnalyticDB PostgreSQL版数据类型 |
|
1 |
BIT(N) |
BIT(N) |
|
2 |
TINYINT |
SMALLINT |
|
3 |
TINYINT UNSIGNED |
SMALLINT |
|
4 |
SMALLINT |
SMALLINT |
|
5 |
SMALLINT UNSIGNED |
BIGINT |
|
6 |
MEDIUMINT |
INT |
|
7 |
MEDIUMINT UNSIGNED |
INT |
|
8 |
INT |
INT |
|
9 |
INT UNSIGNED |
BIGINT |
|
10 |
BIGINT |
BIGINT |
|
11 |
BIGINT UNSIGNED |
NUMERIC |
|
12 |
DECIMAL(M,N) |
NUMERIC |
|
13 |
FLOAT |
REAL |
|
14 |
DOUBLE(M,N) |
DOUBLE PRECISION |
|
15 |
DATE |
DATE |
|
16 |
DATETIME |
DATETIME without TIME zone |
|
17 |
TIMESTAMP |
DATETIME without TIME zone |
|
18 |
TIME |
TIME without TIME zone |
|
19 |
YEAR[4] |
不支持 |
|
20 |
CHAR[N] |
CHAR[N] |
|
21 |
VARCHAR[N] |
CHARACTER VARYING(N) |
|
22 |
BINARY[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 |
SET('','') |
不支持 |
|
34 |
GEOMETRY |
不支持 |
|
35 |
POINT |
POINT |
|
36 |
LINESTRING |
不支持 |
|
37 |
POLYGON |
POLYGON |
|
38 |
MULTIPOINT |
不支持 |
|
39 |
MULTILINESTRING |
不支持 |
|
40 |
MULTIPOLYGON |
不支持 |
|
41 |
GEOMETRCOLLECTION |
不支持 |
|
42 |
JSON |
JSON |