注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL 新特性之六 : mysql_fdw 实践  

2011-12-21 13:32:04|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  
  
        最近有个 MySql 项目需要转成 PG, 这段时间在做迁移联调, PostgreSQL 9.1 之后支持多种外部表,
可以打通与多类数据库的连接,例如 oracle, mysql, nosql 等,同时还可以打通与文本文件的连接,可以在
数据库里读文件内容,这里介绍下 PostgreSQL 打通与 Mysql 连接的方法,即 mysql_fdw 的应用。


一 硬件环境
笔记本虚拟机
PostgreSQL IP   192.168.1.26/1921
MysSQL     IP   192.168.1.25/3306

备注:PostgreSQL 版本  9.1 or later ,PostgreSQL 和 Mysql 安装本文省略。


二 mysql_fdw 下载
   下载  http://pgxn.org/dist/mysql_fdw/
   并解压到 /opt/soft_bak/mysql_fdw-1.0.0
  
  
三 MySQL 操作步骤 ( 创建数据库和表 )
mysql> create database skytf;
Query OK, 1 row affected (0.02 sec)

mysql> use skytf;
Database changed

mysql> create table test_1 (id integer,name varchar(32));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test_1 values (1,'a');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_1 values (2,'b');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_1 values (3,'c');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.00 sec)


mysql> grant select on skytf.* to 'skytf'@'192.168.%.%' identified by 'skytf';
Query OK, 0 rows affected (0.03 sec)

mysql>  flush privileges;
Query OK, 0 rows affected (0.00 sec)
  
 
 
四 PostgreSQL 配置部分

--4.1 增加 PostgreSQL 环境变量
export PGHOME=/opt/pgsql9.1
export MYSQLHOME=/opt/mysql

export LD_LIBRARY_PATH=$MYSQLHOME/lib:$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export PATH=$MYSQLHOME/bin:$PGHOME/bin:/opt/pgbouncer1.4.2/bin:$PATH:.

    备注: 修改好后, 执行 source .bash_profile。
 

--4.2 编译并安装
#cd /opt/soft_bak/mysql_fdw-1.0.0

--主要步骤
make USE_PGXS=1
make USE_PGXS=1 install


--详细信息
[root@pgb mysql_fdw-1.0.0]# make USE_PGXS=1
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic -I/opt/mysql/include -I. -I. -I/opt/pgsql9.1/include/server -I/opt/pgsql9.1/include/internal -D_GNU_SOURCE -I/usr/include/libxml2   -c -o mysql_fdw.o mysql_fdw.c
mysql_fdw.c: In function ‘mysqlPlanForeignScan’:
mysql_fdw.c:370: 警告:此函数中的 ‘rows’ 在使用前可能未初始化
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic -shared -o mysql_fdw.so mysql_fdw.o -L/opt/pgsql9.1/lib -L/usr/lib  -Wl,-rpath,'/opt/pgsql9.1/lib',--enable-new-dtags  -rdynamic -L/opt/mysql/lib -lmysqlclient -lz -lcrypt -lnsl -lm -lmygcc

[root@pgb mysql_fdw-1.0.0]# make USE_PGXS=1 install
/bin/mkdir -p '/opt/pgsql9.1/lib'
/bin/mkdir -p '/opt/pgsql9.1/share/extension'
/bin/sh /opt/pgsql9.1/lib/pgxs/src/makefiles/../../config/install-sh -c -m 755  mysql_fdw.so '/opt/pgsql9.1/lib/mysql_fdw.so'
/bin/sh /opt/pgsql9.1/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./mysql_fdw.control '/opt/pgsql9.1/share/extension/'
/bin/sh /opt/pgsql9.1/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./mysql_fdw--1.0.sql  '/opt/pgsql9.1/share/extension/'
[root@pgb mysql_fdw-1.0.0]# ll

    备注:安装成功后会在目录  /opt/pgsql9.1/share/extension/ 产生 mysql_fdw.so , mysql_fdw.control ,
             mysql_fdw--1.0.sql 文件。

--4.3 创建 extension mysql_fdw  
skytf=# CREATE EXTENSION mysql_fdw;
CREATE EXTENSION

--4.4 可能出现的ERROR
ERROR:  could not open extension control file "/opt/pgsql9.1/share/extension/mysql_mdw.control": No such file or directory
postgres=#

ERROR:  could not stat file "/opt/pgsql9.1/share/extension/mysql_mdw--1.0.sql": No such file or directory
postgres=# create extension mysql_mdw;

ERROR:  could not load library "/opt/pgsql9.1/lib/mysql_fdw.so": libmysqlclient.so.16: cannot open shared object file: No such file or directory

     备注:在创建 extension 时可能出现以上 ERROR, 这时只要将复制一份以上文件即可。
  

--4.5 创建  server 赋权给普通用户
skytf=# CREATE SERVER mysql_svr_25
skytf-#     FOREIGN DATA WRAPPER mysql_fdw
skytf-#     OPTIONS (address '192.168.1.25', port '3306');
CREATE SERVER

skytf=# grant usage on foreign server mysql_svr_25 to skytf;
GRANT

     备注:在赋权限后,普通用户 skytf 就可以使用 foreign server mysql_svr_25 创建外部表了。

skytf=# \c skytf skytf
You are now connected to database "skytf" as user "skytf".


skytf=> \des
            List of foreign servers
     Name     |  Owner   | Foreign-data wrapper
--------------+----------+----------------------
 mysql_svr_25 | postgres | mysql_fdw
 
 
--4.6 创建匹配用户 ( mapping user )
skytf=#     CREATE USER MAPPING FOR skytf
skytf-#     SERVER mysql_svr_25
skytf-#     OPTIONS (username 'skytf', password 'skytf');
CREATE USER MAPPING

      备注:如果不创建 mapping user , 会出现 ERROR:  user mapping not found for "skytf" 类似信息。
 
skytf=> \deu
  List of user mappings
    Server    | User name
--------------+-----------
 mysql_svr_25 | skytf
(1 row)


--4.7 创建外部表
skytf=> CREATE FOREIGN TABLE test_1 (
skytf(>     id     integer,
skytf(>     name     character varying(20) 
skytf(>      )  SERVER mysql_svr_25
skytf->     OPTIONS (database 'skytf', table 'test_1');
CREATE FOREIGN TABLE

   备注:到了这里就已经打通了 Mysql 和 PostgreSQL 的连接。
  

--4.8 查询
skytf=> select * from test_1;
 id | name
----+------
  1 | a
  2 | b
  3 | c
(3 rows)

   备注:果然可以查到了 Mysql 数据库的数据了。
  

五 总结
    1 利用 mysql_fdw 可以创建 PostgreSQL 与 Mysql 的连接,可以实现 PG 与 Mysql 的数据同步;
    2 在 Mysql 转 PG 项目中,mysql_fdw 是非常有效的方法,具体迁移效率之后再做测试。 

  评论这张
 
阅读(31919)| 评论(6)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016