posrgresql默認的dblink只能聯通posrgresql的不同數據庫,不能進行異構數據庫的聯通,本文將介紹使用mysql_fdw聯通posrgresql和mysql。mysql_fdw官網爲:http://pgxn.org/dist/mysql_fdw/1.0.0/
前期準備:
安裝posrgresql9.1或以上版本
安裝mysql
下載mysql_fdw
(postgresql和mysql安裝過程參見其他文章)
安裝mysql_fdw:
設置環境變量:
vi ~/.bash_profile
export PATH=/usr/local/bin:/usr/local/mysql/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mysql/lib
source ~/.bash_profile
編譯安裝:
解壓下載的mysql_fdw,並進入解壓的目錄
make USE_PGXS=1 make USE_PGXS=1 install
注意:安裝的使用使用root用戶安裝
dblink測試使用:
在mysql端創建用戶和數據庫:
mysql> create user vince; Query OK, 0 rows affected (0.00 sec) mysql> create database vince_db ; Query OK, 1 row affected (0.00 sec) mysql> grant all privileges on vince_db.* to 'vince'@'localhost' with grant option; Query OK, 0 rows affected (0.00 sec) mysql> grant all privileges on vince_db.* to 'vince'@'%' with grant option; Query OK, 0 rows affected (0.00 sec) mysql> use vince_db; Database changed mysql> show tables; Empty set (0.00 sec) mysql> create table test(a integer ,b text); Query OK, 0 rows affected (0.00 sec) mysql> insert into test(a,b)values (1,'a'); Query OK, 1 row affected (0.00 sec) mysql> insert into test(a,b)values (2,'b'); Query OK, 1 row affected (0.00 sec)
在postgresql端創建dblink鏈接:
-- Create the require functions for the FDW. CREATE FUNCTION mysql_fdw_handler() RETURNS fdw_handler AS '$libdir/mysql_fdw' LANGUAGE C STRICT; CREATE FUNCTION mysql_fdw_validator(text[], oid) RETURNS void AS '$libdir/mysql_fdw' LANGUAGE C STRICT; -- Create the data wrapper or "transport". CREATE FOREIGN DATA WRAPPER mysql_fdw HANDLER mysql_fdw_handler VALIDATOR mysql_fdw_validator; -- Create the foreign server, a pointer to the MySQL server. CREATE SERVER mysql_svr FOREIGN DATA WRAPPER mysql_fdw OPTIONS (address '127.0.0.1', port '3306');
CREATE USER MAPPING FOR PUBLIC SERVER mysql_svr OPTIONS(username 'vince',password '');
create foreign table test ( a integer,b text) server mysql_svr options(table 'vince_db.test');
測試:查詢:
pgdb1=# select * from test; a | b ---+--- 1 | a 2 | b (2 rows)
關聯:
pgdb1=# create table mysql_test(a integer,b text); CREATE TABLE pgdb1=# insert into mysql_test(a,b) values(1,'a'); INSERT 0 1 pgdb1=# select * from test t1,mysql_test t2 where t1.a=t2.a; a | b | a | b ---+---+---+--- 1 | a | 1 | a (1 row)
插入:
pgdb1=# insert into test(a,b) values (3,'c'); ERROR: cannot change foreign table "test"
更新:
pgdb1=# update test set b='c' where a=1; ERROR: cannot change foreign table "test"
結論:
mysql_fdw可以很好的使postgresql聯通mysql,進行查詢,關聯等操作,但是外表是不能進行添加和更新操作。