Установка и настройка oracle_fdw на Linux (Debian 7)
By: Date: 06.10.2017 Categories: !RUS,PostgeSQL

How to install and configure oracle_fdw on Linux (Debian 7)

Установка и настройка oracle_fdw на Linux (Debian 7)

Сначала нужно установить — Установка Oracle Instant Client на Linux (Debian 7).

Предполагается что все будет делаться под пользователем progres. Захожу под ним и пробую соединиться с БД Oracle (здесь используется нестандартный порт 1522, если порт стандартный то его можно не указывать)

# su — postgres
$ sqlplus unro2015/unro2015@172.26.12.82:1522/db11g
bash: ./sqlplus: No such file or directory

Поэтому сначала настраиваю переменные окружения для пользователя postgres

1) Узнать домашнюю папку пользователя postgres

$ cd ~

$ pwd

/var/lib/postgresql

$ ls -al

total 24
drwxr-xr-x  3 postgres postgres 4096 Sep 28 13:18 .
drwxr-xr-x 39 root     root     4096 Sep 26 16:40 ..
drwxr-xr-x  3 postgres postgres 4096 Sep 26 16:40 9.6
-rw——-  1 postgres postgres  119 Sep 28 13:18 .bash_history
-rw-r—r—  1 postgres postgres   52 Sep 28 13:18 .bashrc
-rw——-  1 postgres postgres   86 Sep 27 14:03 .psql_history

2) Править файл .bashrc.

$ nano .bashrc

Было:

PATH=$PATH:/usr/lib/postgresql/9.6/bin
export PATH

Стало:

ВНИМАНИЕ:

— Переменную NLS_LANG устанавливайте под себя, например NLS_LANG=RUSSIAN_CIS.UTF8 или NLS_LANG=AMERICAN_CIS.UTF8

— Переменная ORACLE_HOME нужна для сборки дистрибутива из исходников

PATH=$PATH:/usr/lib/postgresql/9.6/bin:/opt/instantclient_11_2
export PATH
NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251
export NLS_LANG
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/instantclient_11_2
export LD_LIBRARY_PATH
ORACLE_HOME=/opt/instantclient_11_2
export ORACLE_HOME

После изменения .bashrc можно сделать

$ source .bashrc

но надежнее пользователем postgres или даже перезагрузить сервер если нужно чтобы измененные переменные применились в уже запущенных процессах.

После этого можно проверить.

Примечания:

— sqlplus unro2015/unro2015@172.26.12.82:1522/db11g. Здесь  unro2015/unro2015 = имя и пароль пользователя в Oracle, 172.26.12.82 = ip сервера Oracle, db11g = SID

— В команде DESCRIBE нужно указать имя таблицы в схеме пользователя, под которым вы соединяетесь с Oracle, в данном примере – пользователь palata а таблица analiz6.

$ sqlplus unro2015/unro2015@172.26.12.82:1522/db11g

SQL*Plus: Release 11.2.0.3.0 Production on Чт Окт 5 15:21:44 2017

Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Присоединен к:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 — 64bit Production

SQL> DESCRIBE analiz6
Имя                                    Пусто? Тип
—————————————— ——— —————————-
VID_KM_NAME                                        VARCHAR2(200)
TNODCAPTION                                        VARCHAR2(2000)
PLAN_ID                                   NOT NULL NUMBER(10)

Все работает.

3) Скачать исходники можно со страницы проекта — https://github.com/laurenz/oracle_fdw. Закладка Releases. А дальше ссылка Source code (tar.gz) соответствующая необходимой версии, обычно берется последний релиз (Latest release).

image

4) Установить средства для сборки (чтобы работал make)

# apt-get install gcc
# apt-get install build-essential

5) Скачать исходники (я скачиваю в домашнюю папку пользователя postgres)

# cd /tmp
# wget https://github.com/laurenz/oracle_fdw/archive/ORACLE_FDW_2_0_0.tar.gz
—2017-10-05 17:29:32—  https://github.com/laurenz/oracle_fdw/archive/ORACLE_FDW_2_0_0.tar.gz
Resolving github.com (github.com)… 192.30.253.113, 192.30.253.112
Connecting to github.com (github.com)|192.30.253.113|:443… connected.
HTTP request sent, awaiting response… 302 Found
Location: https://codeload.github.com/laurenz/oracle_fdw/tar.gz/ORACLE_FDW_2_0_0 [following]
—2017-10-05 17:29:38—  https://codeload.github.com/laurenz/oracle_fdw/tar.gz/ORACLE_FDW_2_0_0
Resolving codeload.github.com (codeload.github.com)… 192.30.253.121, 192.30.253.120
Connecting to codeload.github.com (codeload.github.com)|192.30.253.121|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: unspecified [application/x-gzip]
Saving to: `ORACLE_FDW_2_0_0.tar.gz’

[  <=>                                                                                                               ] 102,337      269K/s   in 0.4s

2017-10-05 17:29:45 (269 KB/s) — `ORACLE_FDW_2_0_0.tar.gz’ saved [102337]

6) Распаковать архив

# tar -zxvf ORACLE_FDW_2_0_0.tar.gz

7) Проверить что есть утилита pg_config. Она находиться там, где установлен PostgreSQL, в данном примере — /usr/lib/postgresql/9.6/bin

Если её нет – установить пакеты:

postgrespro-server-dev-9.6 – для PostgresPRO
postgresql-server-dev-9.1 – для PostgreSQL

# apt-get install postgrespro-server-dev-9.6

8) Собрать и установить дистрибутив

# cd oracle_fdw-ORACLE_FDW_2_0_0

# export ORACLE_HOME=/opt/instantclient_11_2


# make
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -g -O2 -fstack-protector —param=ssp-buffer-size=4 -Wformat -Werror=format-security -I/usr/include/mit-krb5 -fPIC -pie -fno-omit-frame-pointer -fPIC -I/opt/instantclient_11_2/sdk/include -I/opt/instantclient_11_2/oci/include -I/opt/instantclient_11_2/rdbms/public -I/usr/include/oracle/12.2/client -I/usr/include/oracle/12.2/client64 -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/usr/include/postgresql/9.6/server -I/usr/include/postgresql/internal -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2  -I/usr/include/tcl8.5  -c -o oracle_fdw.o oracle_fdw.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -g -O2 -fstack-protector —param=ssp-buffer-size=4 -Wformat -Werror=format-security -I/usr/include/mit-krb5 -fPIC -pie -fno-omit-frame-pointer -fPIC -I/opt/instantclient_11_2/sdk/include -I/opt/instantclient_11_2/oci/include -I/opt/instantclient_11_2/rdbms/public -I/usr/include/oracle/12.2/client -I/usr/include/oracle/12.2/client64 -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/usr/include/postgresql/9.6/server -I/usr/include/postgresql/internal -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2  -I/usr/include/tcl8.5  -c -o oracle_utils.o oracle_utils.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -g -O2 -fstack-protector —param=ssp-buffer-size=4 -Wformat -Werror=format-security -I/usr/include/mit-krb5 -fPIC -pie -fno-omit-frame-pointer -fPIC -I/opt/instantclient_11_2/sdk/include -I/opt/instantclient_11_2/oci/include -I/opt/instantclient_11_2/rdbms/public -I/usr/include/oracle/12.2/client -I/usr/include/oracle/12.2/client64 -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/usr/include/postgresql/9.6/server -I/usr/include/postgresql/internal -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2  -I/usr/include/tcl8.5  -c -o oracle_gis.o oracle_gis.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -g -O2 -fstack-protector —param=ssp-buffer-size=4 -Wformat -Werror=format-security -I/usr/include/mit-krb5 -fPIC -pie -fno-omit-frame-pointer -fPIC -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o oracle_gis.o -L/usr/lib/x86_64-linux-gnu -Wl,-z,relro -Wl,-z,now -Wl,—as-needed -L/usr/lib/mit-krb5 -L/usr/lib/x86_64-linux-gnu/mit-krb5 -L/usr/lib  -Wl,—as-needed  -L/opt/instantclient_11_2 -L/opt/instantclient_11_2/bin -L/opt/instantclient_11_2/lib -lclntsh -L/usr/lib/oracle/12.2/client/lib -L/usr/lib/oracle/12.2/client64/lib -L/usr/lib/oracle/12.1/client/lib -L/usr/lib/oracle/12.1/client64/lib -L/usr/lib/oracle/11.2/client/lib -L/usr/lib/oracle/11.2/client64/lib -L/usr/lib/oracle/11.1/client/lib -L/usr/lib/oracle/11.1/client64/lib -L/usr/lib/oracle/10.2.0.5/client/lib -L/usr/lib/oracle/10.2.0.5/client64/lib -L/usr/lib/oracle/10.2.0.4/client/lib -L/usr/lib/oracle/10.2.0.4/client64/lib -L/usr/lib/oracle/10.2.0.3/client/lib -L/usr/lib/oracle/10.2.0.3/client64/lib

# make install
/bin/mkdir -p ‘/usr/lib/postgresql/9.6/lib’
/bin/mkdir -p ‘/usr/share/postgresql/9.6/extension’
/bin/mkdir -p ‘/usr/share/postgresql/9.6/extension’
/bin/mkdir -p ‘/usr/share/doc/postgrespro-doc-9.6/extension’
/usr/bin/install -c -m 755  oracle_fdw.so ‘/usr/lib/postgresql/9.6/lib/oracle_fdw.so’
/usr/bin/install -c -m 644 .//oracle_fdw.control ‘/usr/share/postgresql/9.6/extension/’
/usr/bin/install -c -m 644 .//oracle_fdw—1.1.sql .//oracle_fdw—1.0—1.1.sql  ‘/usr/share/postgresql/9.6/extension/’
/usr/bin/install -c -m 644 .//README.oracle_fdw ‘/usr/share/doc/postgrespro-doc-9.6/extension/’

# chown -R postgres:postgres /usr/share/postgresql

9) Дополнительные настройки

Далее при попытке выполнить CREATE EXTENSION oracle_fdw; я получил ошибку:

ERROR:  could not load library «/usr/lib/postgresql/9.6/lib/oracle_fdw.so»: libclntsh.so.11.1: cannot open shared object file: No such file or directory

Чтобы избежать этой ошибки и ошибок с Oracle Client например таких:

sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory

нужно создать файл

# nano /etc/ld.so.conf.d/oracle.conf

содержимое файла — путь до папки где находятся разделяемые библиотеки Oracle Client

/opt/instantclient_11_2

# ldconfig

10) Настройка oracle_fdw

# su postgres

$ psql

psql (9.6.5)
Type «help» for help.

— Создаём EXTENSION

postgres=# CREATE EXTENSION oracle_fdw;

CREATE EXTENSION
— Создаём соединение к серверу Oracle

postgres=# CREATE SERVER db11g FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver ‘//172.26.12.82:1522/db11g’);

CREATE SERVER
— Назначаем права на созданный сервер пользователю postgres (можно другим пользователям и ролям)

postgres=# GRANT USAGE ON FOREIGN SERVER db11g TO postgres;

GRANT
— Создаём USER MAPPING

postgres=# CREATE USER MAPPING FOR postgres SERVER db11g OPTIONS (user ‘unro2015’, password ‘unro2015’);

CREATE USER MAPPING
— Создаём в БД postgres схему которая будет соответствовать схеме в Oracle

postgres=# CREATE SCHEMA unro2015;

CREATE SCHEMA
— Импортируем описания всех объектов схемы в oracle в схему в postgres

postgres=# IMPORT FOREIGN SCHEMA «UNRO2015» from SERVER db11g INTO unro2015;

IMPORT FOREIGN SCHEMA
— Проверяем что работает

postgres=# select * from unro2015.classificator;

id    |    name
———+————-
3637254 | Субъекты
(1 row)