Symfoware

Symfowareについての考察blog

mysql_fdwで、PostgreSQLからMySQLのデータベースに接続する

PostgreSQLの拡張機能を使用して、Redisに接続してみました。
PostgreSQL拡張redis_fdwの使い方

今回は、MySQLに接続する拡張をインストールしてみます。
環境は

・Debian 8.2 + Postgresql 9.4.5
こちらでインストールしたものです。
Debian 8(Jessie)にPostgreSQL 9.4をインストールし、外部接続を許可する

・FreeBSD 10.2 + MySQL 5.6
こちらでインストールしたものです。
FreeBSD 10.2にMySQL 5.6をインストール&外部接続許可



MySQL Foreign Data Wrapper for PostgreSQL



gitから取得したソースからインストールすることにしました。
https://github.com/EnterpriseDB/mysql_fdw


※試行錯誤してインストールしたので、不要なものも含まれているかも。


ソースの取得とコンパイルに必要なものをインストール。


# apt-get install g++ make git




MySQLへの接続に必要なものをインストール。


# apt-get install mysql-client libmysqlclient-dev




PostgreSQL関連で必要なヘッダをインストール。


# apt-get install libpq-dev postgresql-server-dev-9.4





githubからソースを取得。


# cd /usr/local/src/
# git clone https://github.com/EnterpriseDB/mysql_fdw.git
# cd mysql_fdw/




makeしてインストールします。


# make USE_PGXS=1
# make USE_PGXS=1 install




念のため、ライブラリをロード。


# ldconfig



これでインストール完了です。





エラーになったら



make時にエラーメッセージが表示されることがあります。



make: mysql_config: コマンドが見つかりませんでした
make: mysql_config: コマンドが見つかりませんでした



この場合は、libmysqlclient-devが不足しています。


# apt-get install libmysqlclient-dev






You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
Makefile:52: *** PostgreSQL 9.3, 9.4, 9.5 or 9.6 is required to compile this extension. 中止.



これや、以下のエラーの場合。


Makefile:47: /usr/lib/postgresql/9.4/lib/pgxs/src/makefiles/pgxs.mk: そのようなファイルやディレクトリはありません
Makefile:52: *** PostgreSQL 9.3, 9.4, 9.5 or 9.6 is required to compile this extension. 中止.



PostgreSQLのライブラリ、ヘッダーが不足しています。


# apt-get install libpq-dev postgresql-server-dev-9.4








mysql_fdw拡張を使用する



下準備ができたので、mysql_fdw拡張を使用してみます。
以下、psqlコマンドでの実行結果です。

テスト用のデータベースを作成し、切り替え。


# create database fdw_test;
CREATE DATABASE

# \c fdw_test;




拡張機能を有効化。


# CREATE EXTENSION mysql_fdw;
CREATE EXTENSION




MySQLサーバーの情報を定義。


# CREATE SERVER mysql_server
# FOREIGN DATA WRAPPER mysql_fdw
# OPTIONS (host '192.168.1.102', port '3306');
CREATE SERVER




「mysql_server」の箇所は任意の名前を設定します。

PostgreSQLユーザーと、MySQLデータベースのユーザー情報の関連付けを行います。


PostgreSQLユーザー:pgadmin
MySQLユーザー:admin
MySQLパスワード:P@ssw0rd



上記情報で、先ほど作成した「mysql_server」の情報と関連付けます。


# CREATE USER MAPPING FOR pgadmin
# SERVER mysql_server
# OPTIONS (username 'admin', password 'P@ssw0rd');
CREATE USER MAPPING





テーブル名の関連付けを行います。
MySQL側のデータベース「test」は事前に作成しておきました。


# CREATE FOREIGN TABLE warehouse(
#     warehouse_id int,
#     warehouse_name text)
# SERVER mysql_server
#     OPTIONS (dbname 'test', table_name 'warehouse');
CREATE FOREIGN TABLE




インサートを試してみます。


fdw_test=# INSERT INTO warehouse values (1, 'UPS');
ERROR: failed to execute the MySQL query:
Table 'test.warehouse' doesn't exist




エラーになりました。
事前にMySQL側でテーブルを作成しておく必要がある模様。


mysql> CREATE TABLE warehouse(
    ->     warehouse_id int,
    ->     warehouse_name text);
Query OK, 0 rows affected (0.02 sec)




再度インサートを試すとエラーになりました。


fdw_test=# INSERT INTO warehouse values (1, 'UPS');
ERROR: first column of remote table must be unique for INSERT/UPDATE/DELETE operation




primary keyの指定が必要な模様。
MySQL側のテーブルを一旦ドロップ、作り直します。


mysql> CREATE TABLE warehouse(
    ->     warehouse_id int not null primary key,
    ->     warehouse_name text);
Query OK, 0 rows affected (0.02 sec)





これでインサートが成功しました。


fdw_test=# INSERT INTO warehouse values (1, 'UPS');
INSERT 0 1




PostgreSQL側でselect。


# select * from warehouse;
warehouse_id | warehouse_name
--------------+----------------
            1 | UPS
(1 行)




MySQL側でselect。


mysql> select * from warehouse;
+--------------+----------------+
| warehouse_id | warehouse_name |
+--------------+----------------+
|            1 | UPS            |
+--------------+----------------+
1 row in set (0.00 sec)




ちゃんと同じ内容が表示されます。


pgAdminからはテーブルとして認識されていないようです。

646_01.png


コマンドで確認すると、テーブルとして表示されました。


fdw_test=# \d
public | warehouse | 外部テーブル | pgadmin





関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2015/10/12(月) 19:02:32|
  2. PostgreSQL
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PostgreSQL + mysql_fdwでMySQLに仮想的なxml列を実現する | ホーム | ユーザーを変更せずに、psqlを使用してPostgreSQLに接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1798-4fdffa86
この記事にトラックバックする(FC2ブログユーザー)