PostgreSQLでFDWを利用する方法

CentOS7にPostgreSQLをインストールし、FDW(SQLServer・Mysql用)を構成しましたので、備忘録を残したいと思います。

1、FDWとは


FDWとは、SELECT文やUPDATE文などのSQL文を使用して、外部にあるデータにアクセスできるようにするための、PostgreSQLの拡張機能です。詳しくは以下のリンクを参照してください。

外部データとの連携 ~FDWで様々なデータソースとつなぐ~

その為、初めにPostgreSQLをサーバにインストールする必要があります。RDSでも一部のFDWに対応していますが、自身で必要なFDWをインストールすることはできません。(マネージドサービスだからしょうがない)

Amazon RDS for PostgreSQL のバージョンと拡張機能

各FDWの詳細は、以下のリンクを参照してください。

・MySQL参照用FDW

 Git mysql_fdw

・SQLServer参照用FDW

Git tds_fdw

なお、現時点で「tds_fdw」はSQLServerの参照のみできます。

2、PostgreSQLのインストール


ここではCentOS7にPostgreSQLをインストールする手順を記述します。既にPostgreSQLをインストールしている場合はスキップします。インストール先はEC2上のCentOS7にインストールすることを想定しています。

1、管理者権限昇格
sudo -i

2、アップデート
yum update
reboot

3、リポジトリ追加 ※ログイン後、管理者権限に昇格
rpm -ivh --nodeps https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

4、インストール
yum -y install postgresql12-server postgresql12-contrib

5、インストール確認
ls -l /usr/pgsql-12/
※「bin  doc  lib  share」
があること

6、自動起動有効化
systemctl enable postgresql-12.service

7、DBデータ保存先変更※必要な場合
vi /usr/lib/systemd/system/postgresql-12.service
==================================================
変更前)
Environment=PGDATA=/var/lib/pgsql/12/data/
変更後)
Environment=PGDATA=/data/
==================================================

8、変更適用
systemctl daemon-reload

9、初期DB作成
PGSETUP_INITDB_OPTIONS="-E UTF8 --no-locale" /usr/pgsql-12/bin/postgresql-12-setup initdb

10、作成確認
cat /data/PG_VERSION 
※「/data」は「7、」で変更したパスを入力
※「12」が表示されること

11、「postgres」ユーザーへ切り替え
su - postgres

12、パスの追加
※/var/lib/pgsql/.pgsql_profileにパスを追加します。
vi /var/lib/pgsql/.pgsql_profile
==================================================
PATH=/usr/pgsql-12/bin:$PATH
export PATH
==================================================

※PGDATAを修正します。
vi /var/lib/pgsql/.bash_profile
==================================================
#PGDATA=/var/lib/pgsql/12/data
PGDATA=/data
==================================================
※「/data」は「7、」で変更したパスを入力

13、設定反映
source ~/.bash_profile

14、DB起動
pg_ctl start

15、バージョン確認
psql -V

16、データベース確認
psql -l

17、外部接続許可
vi /data/postgresql.conf
==================================================
変更前)
#listen_addresses = 'localhost'
変更後)
listen_addresses = '*'
==================================================
※セキュリティグループでインバウンドルールが許可されていることも確認

18、postgresユーザーを抜ける
exit

3、FDWのインストール


3-1、Mysql用FDWの設定

1、管理者権限昇格
sudo -i

2、mysql用リポジトリ追加
rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

3、「mysql-community-devel」インストール
yum -y install mysql-community-devel

4、FDWインストールに必要なパッケージインストール
yum -y install epel-release centos-release-scl
yum -y install git gcc wget postgresql12-devel

5、mysql用FDWのソースコードをダウンロード
cd /tmp
git clone https://github.com/EnterpriseDB/mysql_fdw.git
cd /tmp/mysql_fdw/

6、パス設定
export PATH=/usr/pgsql-12/bin/:$PATH
export PATH=/usr/bin/:$PATH

7、FDWインストール
make USE_PGXS=1
make USE_PGXS=1 install

3-2、SQLServer用FDWの設定

1、管理者権限昇格
sudo -i

2、FreeTDSダウンロード
cd /tmp
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-X.X.X.tar.gz
※最新バージョンは以下を確認する。
https://www.freetds.org/

3、圧縮ファイル解凍
tar xvzf freetds-X.X.X.tar.gz

4、FreeTDSインストール
cd freetds-X.X.X/
./configure --with-openssl=/bin/openssl --with-tdsver=7.4

make 
make install

5、パス設定
vi /root/.bash_profile
最終行に以下を追加する
export PATH=${PATH}:/usr/local/bin

6、パス有効化
source ~/.bash_profile

7、FreeTDSインストール確認
tsql -C
※以下の様な出力があること
================================
Compile-time settings (established with the "configure" script)
                            Version: freetds vX.X.X
             freetds.conf directory: /usr/local/etc
     MS db-lib source compatibility: no
        Sybase binary compatibility: no
                      Thread safety: yes
                      iconv library: yes
                        TDS version: 7.4
                              iODBC: no
                           unixodbc: no
              SSPI "trusted" logins: no
                           Kerberos: no
                            OpenSSL: yes
                             GnuTLS: no
                               MARS: yes
================================

8、SqlServer用FDWのソースコードをダウンロード
cd /tmp
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw

9、FDWインストール
make USE_PGXS=1 PG_CONFIG=/usr/pgsql-12/bin/pg_config
make USE_PGXS=1 PG_CONFIG=/usr/pgsql-12/bin/pg_config install

10、パス設定
cd /usr/lib64
ln /usr/local/lib/libsybdb.so.5.1.0 libsybdb.so.5

11、確認
ls -l  libsybdb.so.5

4、DB設定など


1、ユーザー切り替え
su - postgres

2、DBユーザー作成
createuser --login --pwprompt username
Enter password for new role: <任意のパスワード>
Enter it again: <任意のパスワード>

3、DB作成
createdb --owner=username dbname 

4、接続設定変更
vi /data/pg_hba.conf
==================================================
# "local" is for Unix domain socket connections only
local   dbname          username                                md5
→ローカルからdbnameへusernameでmd5接続できるように1行追加。※最上位行に記載

host    all             all             0.0.0.0/0               trust
→全ホストから接続できる様にする

local   all             all                                     peer
# IPv4 local connections:
host    all             all             192.168.10.0/24         md5
→192.168.10.0/24から接続できるように1行追加。
host    all             all             127.0.0.1/32            ident
==================================================

5、設定読み込み
pg_ctl reload

6、DBへログイン
psql -U postgres

7、権限変更
ALTER ROLE username SUPERUSER;
quit

8、FDW設定先DBへ切り替え
psql dbname username

9、FDW有効化
CREATE EXTENSION mysql_fdw;
CREATE EXTENSION tds_fdw;

10、FDW MySql設定
※詳細な利用方法は以下のGitを参照する。
「https://github.com/EnterpriseDB/mysql_fdw」
CREATE SERVER <サーバ名>
     FOREIGN DATA WRAPPER mysql_fdw
     OPTIONS (host '<エンドポイント>', port '3306');

CREATE USER MAPPING FOR <ユーザー名>
    SERVER <サーバ名>
    OPTIONS (username '<参照先DBのユーザー名>', password '<参照先DBのパスワード>');

CREATE FOREIGN TABLE <テーブル名>(
    <カラム設定>
    ※カラム設定は参照先テーブルと同様の状態にする。
    )
    SERVER <サーバ名>
    OPTIONS (dbname '<参照先DBのDB名>', table_name '<参照先DBのテーブル名>');

11、FDW SQLServer設定
※詳細な利用方法は以下のGitを参照する。
「https://github.com/tds-fdw/tds_fdw」
※AWS
CREATE SERVER <サーバ名>
    FOREIGN DATA WRAPPER tds_fdw
    OPTIONS (servername '<エンドポイント>', port '1433', database '<参照先DBのDB名>', tds_version '7.4');

CREATE USER MAPPING FOR <ユーザー名>
    SERVER <サーバ名>
    OPTIONS (username '<参照先DBのユーザー名>', password '<参照先DBのパスワード>');

CREATE FOREIGN TABLE <テーブル名> (
    <カラム設定>
    ※カラム設定は参照先テーブルと同様の状態にする。
    )
    SERVER <サーバ名>
    OPTIONS (table_name '<参照先DBのテーブル名>');

※Azure
CREATE SERVER azure_svr
    FOREIGN DATA WRAPPER tds_fdw
    OPTIONS (servername 'IPアドレス', port '1433', database '<参照先DBのDB名>', tds_version '7.4');

CREATE USER MAPPING FOR <ユーザー名>
    SERVER <サーバ名>
    OPTIONS (username '<参照先DBのユーザー名>@<参照先DBのサーバ名>', password '<参照先DBのパスワード>');

CREATE FOREIGN TABLE <テーブル名> (
    <カラム設定>
    ※カラム設定は参照先テーブルと同様の状態にする。
    )
    SERVER <サーバ名>
    OPTIONS (table_name '<参照先DBのテーブル名>');

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)