FDW for MySQL

1. 准备 MySQL 环境

MySQL 环境:

Host: 127.0.0.1
Port: 3306
User: root
Database: test

现在,创建一张测试表:

mysql> CREATE TABLE test(c1 int primary key, c2 int);
Query OK, 0 rows affected (0.01 sec)

因为 MySQL 的 InnoDB 表必须有主键才能通过 mysql_fdw 写入,所以建表时指定了 c1 为主键。

然后,插入几条测试数据:

mysql> INSERT INTO test VALUES(0,0),(1,1),(2,2);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

2. 安装 mysqlclient 和共享库

2.1 安装 mysqlclient

注意
以下安装命令仅为示例,不同 yum 源安装的 RPM 包名称可能存在不同,MySQL 版本也需根据实际需要下载对应的版本。请勿直接复制执行。

注意
集群中的每台机器都需要进行安装配置。

在 sudo 权限下或使用 root 用户执行安装命令。

sudo yum install -y rh-mysql57-mysql

如果是离线环境,则需在 MySQL 官网下载 3 个 RPM 包(commonlibsclient)。参照以下命令执行安装即可:

sudo rpm -ivh mysql-community-client-8.0.11-1.el7.x86_64.rpm --nodeps
sudo rpm -ivh mysql-community-common-8.0.11-1.el7.x86_64.rpm --nodeps
sudo rpm -ivh mysql-community-libs-8.0.11-1.el7.x86_64.rpm --nodeps

2.2 设置共享库

libmysqlclient.so 软链接到 YMatrix 的 lib 目录下

ln -s  /lib64/mysql/libmysqlclient.so.18 /opt/ymatrix/matrixdb5/lib/libmysqlclient.so

追加 libmysqlclient.so 位置到配置文件

echo "/lib64/mysql/libmysqlclient.so.18" >> /etc/ld.so.conf

3. 在 YMatrix 中创建 FDW

下面登录 YMatrix,使用 mysql_fdw 连接刚才创建的 MySQL 数据表:

首先,创建 mysql_fdw 扩展:

mxadmin=# CREATE EXTENSION mysql_fdw;
CREATE EXTENSION

创建 MySQL 服务器定义:

mxadmin=# CREATE SERVER server_mysql FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '127.0.0.1', port '3306');
CREATE SERVER

创建用户映射:

mxadmin=# CREATE USER MAPPING FOR mxadmin SERVER server_mysql OPTIONS (username 'root',password '123456');
CREATE USER MAPPING

创建外部表:

mxadmin=# CREATE FOREIGN TABLE ext_mysql (c1 int, c2 int) SERVER server_mysql OPTIONS (dbname 'test', table_name 'test');
CREATE FOREIGN TABLE

4. 使用 mysql_fdw 读写数据表

外部表创建成功后,下面就可以通过直接读写外部表来实现对 MySQL 中的 test 表的操作。

4.1 查询数据

通过如下查询可以看到,外部表数据和原表相同:

mxadmin=# SELECT * FROM ext_mysql;
 c1 | c2
----+----
  0 |  0
  1 |  1
  2 |  2
(3 rows)

4.2 写入数据

向外部表插入数据:

mxadmin=# INSERT INTO ext_mysql VALUES(3,3);
INSERT 0 1

插入数据后,连接 MySQL 查看数据:

mysql> SELECT * FROM test;
+----+------+
| c1 | c2   |
+----+------+
|  0 |    0 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
4 rows in set (0.00 sec)

可以看到,数据已经写入到了 MySQL 的 test 表中。