mysql> create database db_kenyon; Query OK, 1 row affected (0.01 sec) mysql> create table tbl_kenyon(id int,vname varchar(48)); Query OK, 0 rows affected (0.00 sec) mysql> insert into tbl_kenyon values(1,'test'); Query OK, 1 row affected (0.00 sec) mysql> insert into tbl_kenyon values(2,'kenyon'); Query OK, 1 row affected (0.00 sec) mysql> insert into tbl_kenyon values(null,'it\'s null'); Query OK, 1 row affected (0.00 sec) mysql> insert into tbl_kenyon values(4,null); Query OK, 1 row affected (0.01 sec) mysql> select * from tbl_kenyon; +------+-----------+ | id | vname | +------+-----------+ | 1 | test | | 2 | kenyon | | NULL | it's null | | 4 | NULL | +------+-----------+ 4 rows in set (0.00 sec) mysql> grant select on db_kenyon.tbl_kenyon to 'usr_kenyon'@'%' identified by '123456'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> select host,user,password from mysql.user; +-----------+------------+-------------------------------------------+ | host | user | password | +-----------+------------+-------------------------------------------+ | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | db1 | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 127.0.0.1 | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | ::1 | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | % | usr_kenyon | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-----------+------------+-------------------------------------------+ 5 rows in set (0.00 sec)三、 安装使用 mysql_fdw
postgres=# create extension mysql_fdw ; CREATE EXTENSION2.创建server
postgres=# CREATE SERVER mysql_svr FOREIGN DATA WRAPPER mysql_fdw OPTIONS (address '10.1.11.73', port '3306'); CREATE SERVER3.创建一个或多个外部表(foreign table)
postgres=# CREATE FOREIGN TABLE pg_mysql_tbl1 (id integer, name text) SERVER mysql_svr OPTIONS (table 'db_kenyon.tbl_kenyon'); CREATE FOREIGN TABLE postgres=# CREATE FOREIGN TABLE pg_mysql_tbl2 ( id integer, vname text) SERVER mysql_svr OPTIONS (query 'SELECT id, vname FROM db_kenyon.tbl_kenyon WHERE id<>2;'); CREATE FOREIGN TABLE4.创建PostgreSQL的fdw查询用户,pg_hba配置略
postgres=# create user u_select ENCRYPTED PASSWORD '123456'; CREATE ROLE
CREATE USER MAPPING FOR u_select SERVER mysql_svr OPTIONS (username 'usr_kenyon', password '123456');6.查询数据,需要u_select登录,不然会报user mapping not found
postgres=> select * from pg_mysql_tbl1 ; id | name ----+----------- 1 | test 2 | kenyon | it's null 4 | (4 rows) postgres=> select * from pg_mysql_tbl2; id | vname ----+------- 1 | test 4 | (2 rows)四、删除扩展
postgres=# drop foreign table pg_mysql_tbl1; DROP FOREIGN TABLE postgres=# drop foreign table pg_mysql_tbl2; DROP FOREIGN TABLE postgres=# drop user mapping for u_select server mysql_svr ; DROP USER MAPPING postgres=# drop server mysql_svr ; DROP SERVER postgres=# drop extension mysql_fdw ; DROP EXTENSION
五、总结
1.这个工具在ETL迁移Mysql到postgresql时比较有用,跨平台,跨数据库,而且简单方便
2.目前该工具还不是内置版本,引起的风险要注意,比如mysql和pg库端表字段后类型不一样,会产生乱码
六、参考:
1.http://pgxn.org/dist/mysql_fdw/
2.http://francs3.blog.163.com/blog/static/40576727201111211324599/?suggestedreading