Ранее мы рассматривали возможность подключения СУБД Oracle к другим платформам – MySQL и MS SQL. Пришла очередь научить Oracle напрямую общаться с PostgreSQL. Это также возможно через DBLink и ODBC. Настраиваем гетерогенное соединение на Oracle Linux 7.3.
🧰 Что понадобится
- Oracle 12.2
- PostgreSQL с сетевым доступом
- unixODBC (уже есть в системе)
- драйвер PostgreSQL версии 13 (или выше)
🔧 Установка ODBC-драйвера PostgreSQL
Первым шагом на всякий случай удаляем уже установленные библиотеки (если были установлены более старые версии – до 13). Добавляем репозиторий PostgreSQL и устанавливаем пакет.
yum remove postgresql-odbc yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install -y postgresql13-odbc
📂 Настройка odbcinst.ini
Далее, по аналогии с MySQL, добавляем в /etc/odbcinst.ini конфигурацию для PostgreSQL:
[PostgreSQL] Description=ODBC for PostgreSQL (Unicode) Driver=/usr/pgsql-13/lib/psqlodbcw.so Setup=/usr/lib64/libodbcpsqlS.so FileUsage=1
📂 Настройка odbc.ini
Следующий файл настройки непосредственно подключения к БД:
[pgodbc] Driver = PostgreSQL Servername = pg-srv Port = 5432 Database = mypgdb SSLmode = disable
🧪 Проверка соединения
isql -v pgodbc username password
⚙️ Настройка Oracle Gateway (initpgodbc.ora)
Файл с параметрами инициализации подключения из Oracle. Расположение: $ORACLE_HOME/hs/admin/. Имя файла должно иметь вид init<sid>.ora, где <sid> – имя DSN для ODBC с учётом регистра (в нашем случае pgodbc).
HS_FDS_CONNECT_INFO = pgodbc HS_FDS_SHAREABLE_NAME = /usr/pgsql-13/lib/psqlodbcw.so HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8 HS_FDS_TRACE_LEVEL = OFF set ODBCINI=/etc/odbc.ini set ODBCSYSINI=/etc
📡 Настройка listener.ora
Добавлем настройки в прослушиватель для обработки входящих запросов на подключение. Расположение: $ORACLE_HOME/network/admin/.
(SID_DESC = (SID_NAME = pgodbc) (PROGRAM = dg4odbc) (ENVS = "LD_LIBRARY_PATH=/usr/lib64:/usr/pgsql-13/lib") (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1) )
После обновления конфигурации перезапускаем прослушиватель.
lsnrctl reload
📫 Настройка tnsnames.ora
И добавляем описание имени подключения. Расположение: $ORACLE_HOME/network/admin/.
pgodbc = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID = pgodbc)) (HS = OK) )
🔗 Создание DBLink в Oracle
В самой БД остаётся создать ссылку на внешнюю БД для использования в запросах.
CREATE DATABASE LINK pg_link CONNECT TO username IDENTIFIED BY "password" USING 'PGODBC';
✅ Проверка подключения
SELECT * FROM your_table@pg_link;
Соединение прекрасно работает и с кириллическими именами таблиц! Для обращения к такой таблице необходимо имя заключать в двойные кавычки с точным соблюдением регистра. Например так:
SELECT * FROM "ИмяТаблицы"@pg_link;
Аналогично обращение к полям с кириллическими именами.
🎉 Всё готово!
Теперь Oracle работает с PostgreSQL через DBLink. Но при работе необходимо помнить об ограничениях ODBC-драйвера. Это касается длинных текстовых полей (более 255 символов) и нестандартных типов данных, которые будет необходимо преобразовывать вручную для получения данных. Но это уже другая история.