Невозможно создать расширение oracle_fdw на Postgres

Я следую приведенным здесь инструкциям, чтобы установить оболочку внешних данных Oracle, oracle_fdw, на сервер PostgreSQL.

Версия Oracle: Oracle Database 12c Enterprise Edition, выпуск 12.1.0.2.0 - 64-разрядная версия, работающая в Red Hat Linux 7.2

Версия PostgreSQL: PostgreSQL 9.4.4 для x86_64-unknown-linux-gnu, скомпилированный gcc (Debian 4.7.2-5) 4.7.2, 64-битный, работает на Debian 7 (wheezy).

Я смог установить sqlplus и подключиться с сервера PostgreSQL к серверу Oracle, используя sqlplus, поэтому подключение не является проблемой.

Но когда я пытаюсь создать расширение, я получаю следующую ошибку:

postgres=# create extension oracle_fdw;
server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.

Затем я взял подсказки с https://github.com/dalibo/pg_qualstats/issues/1 и добавил oracle_fdw к shared_preload_libraries в postgresql.conf следующим образом:

shared_preload_libraries = 'oracle_fdw'

но теперь я не могу перезапустить Postgres:

# service postgresql restart
[....] Restarting PostgreSQL 9.4 database server: main[....] The PostgreSQL server failed to start. Please check the log output: t=2016-09-15 11:05:42 PDT d= h= p=23300 a=FATAL: XX000: invalid cache ID[FAILt=2016-09-15 11:05:42 PDT d= h= p=23300 a=LOCATION: SearchSysCacheList, syscache.c:1219 ... failed!
 failed!

Заглядывая в /var/log/postgresql/postgresql-9.4-main.log, я вижу только эти две строки:

t=2016-09-15 11:05:42 PDT d= h= p=23300 a=FATAL:  XX000: invalid cache ID: 41
t=2016-09-15 11:05:42 PDT d= h= p=23300 a=LOCATION:  SearchSysCacheList, syscache.c:1219

Удаление oracle_fdw из shared_preload_libraries позволяет перезапускать postgres, так что это вызывает сбой перезапуска. Поэтому я удалил oracle_fdw из shared_preload_libraries и сохранил его так же, как это в postgresql.conf:

shared_preload_libraries = ''

Тогда я смог перезапустить Postgres.


Вот точные шаги:

Версия ОС для сервера PostgreSQL

# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="http://bugs.debian.org/"
root@app-4:/# cat /etc/debian_version
7.8
root@app-4:/# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.8 (wheezy)
Release:    7.8
Codename:   wheezy

Установка Oracle Instant Client

Устанавливается с использованием инструкций, приведенных здесь: https://help.ubuntu.com/community/Oracle%20Instant%20Client

Я загрузил следующие rpm-файлы с http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html:

  • Оракул-instantclient основного-10.2.0.3-1.x86_64.rpm
  • Оракул-instantclient-разви-10.2.0.3-1.x86_64.rpm
  • Оракул-instantclient-SQLPLUS-10.2.0.3-1.x86_64.rpm

и установил их на сервере PostgreSQL с помощью следующих команд:

# apt-get install alien
# alien -i oracle-instantclient-basic-10.2.0.3-1.x86_64.rpm
# alien -i oracle-instantclient-devel-10.2.0.3-1.x86_64.rpm
# alien -i oracle-instantclient-sqlplus-10.2.0.3-1.x86_64.rpm

Подтверждение установки:

# dpkg --list | grep -i oracle
ii  oracle-instantclient-basic         10.2.0.3-2                    amd64        Instant Client for Oracle Database 11g
ii  oracle-instantclient-devel         10.2.0.3-2                    amd64        Development headers for Instant Client.
ii  oracle-instantclient-sqlplus       10.2.0.3-2                    amd64        SQL*Plus for Instant Client.

Подключение к серверу Oracle с использованием sqlplus

# su - postgres
postgres@app-4:~$ sqlplus <ORACLE_USER>/<ORACLE_PASS>@//<ORACLE_HOST>:<ORACLE_PORT>/<SID>

SQL*Plus: Release 10.2.0.3.0 - Production on Fri Sep 16 09:55:02 2016

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select count(*) from <TEST_TABLE>;

  COUNT(*)
----------
    937530

SQL> 

Так что это работает отлично.

Установка oracle_fdw

Скачанная версия oracle_fdw 1.4.0, т.е. файл oracle_fdw-1.4.0.zip с http://pgxn.org/dist/oracle_fdw/

Затем разархивировали и установили так:

root@app-4:/home/arun/oracle_fdw-1.4.0# ls
CHANGELOG  LICENSE   META.json             oracle_fdw--1.1.sql  oracle_fdw.control  oracle_fdw.o   oracle_gis.c  oracle_utils.c  README.oracle_fdw  TODO
expected   Makefile  oracle_fdw--1.0--1.1.sql  oracle_fdw.c     oracle_fdw.h    oracle_fdw.so  oracle_gis.o  oracle_utils.o  sql
root@app-4:/home/arun/oracle_fdw-1.4.0# make
...
root@app-4:/home/arun/oracle_fdw-1.4.0# make install
/bin/mkdir -p '/usr/lib/postgresql/9.4/lib'
/bin/mkdir -p '/usr/share/postgresql/9.4/extension'
/bin/mkdir -p '/usr/share/postgresql/9.4/extension'
/bin/mkdir -p '/usr/share/doc/postgresql-doc-9.4/extension'
/usr/bin/install -c -m 755  oracle_fdw.so '/usr/lib/postgresql/9.4/lib/oracle_fdw.so'
/usr/bin/install -c -m 644 oracle_fdw.control '/usr/share/postgresql/9.4/extension/'
/usr/bin/install -c -m 644 oracle_fdw--1.1.sql oracle_fdw--1.0--1.1.sql '/usr/share/postgresql/9.4/extension/'
/usr/bin/install -c -m 644 README.oracle_fdw '/usr/share/doc/postgresql-doc-9.4/extension/'

Создание расширения в Postgres

root@app-4:/# su - postgres
postgres@app-4:~$ psql
psql (9.4.4)
Type "help" for help.

postgres=# create extension oracle_fdw;
server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!> \q

Трассировки стека

Я установил отладчик GNU (gdb) в соответствии с рекомендацией Лоренца Альба в его ответе и получил следующую трассировку стека (без символов отладки на данный момент):

Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
#0  0x0000000000000000 in ?? ()
#1  0x00007ff657dfcc99 in DirectFunctionCall1Coll ()
#2  0x00007ff657de19a9 in ?? ()
#3  0x00007ff657de3037 in SearchCatCacheList ()
#4  0x00007ff4c5fcce7d in _PG_init () at oracle_fdw.c:648
#5  0x00007ff657dfb717 in ?? ()
#6  0x00007ff657dfc051 in load_external_function ()
#7  0x00007ff657b6b486 in fmgr_c_validator ()
#8  0x00007ff657dfdeba in OidFunctionCall1Coll ()
#9  0x00007ff657b6aedc in ProcedureCreate ()
#10 0x00007ff657bcf645 in CreateFunction ()
#11 0x00007ff657d14e73 in ?? ()
#12 0x00007ff657d140c7 in standard_ProcessUtility ()
#13 0x00007ff657bc89ed in ?? ()
#14 0x00007ff657bc98de in CreateExtension ()
#15 0x00007ff657d154c1 in ?? ()
#16 0x00007ff657d140c7 in standard_ProcessUtility ()
#17 0x00007ff657d11243 in ?? ()
#18 0x00007ff657d11e96 in ?? ()
#19 0x00007ff657d12b3d in PortalRun ()
#20 0x00007ff657d0fb1a in PostgresMain ()
#21 0x00007ff657acbdad in ?? ()
#22 0x00007ff657caf351 in PostmasterMain ()
#23 0x00007ff657acccba in main ()
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

ОБНОВЛЕНИЕ: Мне удалось установить расширение на Postgres 9.4.9, работающем на Debian 8 (8.6, Джесси). Я использовал Oracle Instant Client версии 12.1.0.2.0-1 и oracle_fdw версии 1.5.

2 ответа

Решение

Вы должны действительно открыть для этого проблему Github, это правильное место для сообщения об ошибке.

Ответ на следующие вопросы поможет:

  • Какая версия oracle_fdw ты используешь?

  • Какие именно шаги вы использовали для его создания? Вы построили его в системе, где вы его запускаете?

  • Как выглядит трассировка стека сбоя (с символами отладки)?

Два общих замечания:

  • Вы должны следовать README для строительства oracle_fdw и нет другого веб-сайта.

  • Добавление его в shared_preload_libraries это просто неправильно.

Почему вы используете мгновенный оракул 10.2.0.3 против базы данных Oracle 12.1.0.2? Я бы порекомендовал использовать последнюю версию мгновенного клиента.

"SQL * Plus: выпуск 10.2.0.3.0 - производство в пятницу, 16 сентября, 09:55:02 2016"

Когда вы используете систему на основе Debian, не используйте мгновенные клиентские rpms и не конвертируйте их в пакет deb, используйте версии zip и соответственно настройте свою среду.

Я посмотрю, найду ли я время, чтобы проверить ваши настройки

Ура, Даниэль

Другие вопросы по тегам