이번 글에서는 docker 관계없이 PostgreSQL에서 oracle_fdw를 설치 및 외부 테이블 생성하여 데이터를 조회해보는 작업까지를 진행하려고 한다.
설치전 확인 및 고지 사항
-
오라클 클라이언트 버전 확인 후 설치 필요(필수)
-
oracle fdw github에서 README 확인 필요(오라클 client 호환 버전 관련)
-
fdw나 dblink는 온라인 업무에는 권장하지 않음
-
보편적인 체크 사항들 목록
오라클 클라이언트 다운로드가 필요(zip 파일) - 오라클 계정 필요
오라클 서버와 버전이 맞는 버전을 사용하는 것이 좋음(이슈 관련)
32비트 오라클 서버와 64비트 PostgreSQL 서버는 동작 불가.(동일한 bit의 프로그램 필요)
#SELECT * FROM v$version; 로 oracle 버전 정보 확인
----------Oracle client version 11.2 or better is required.---------- oracle_fdw 2.3.0버전 기준
그 외 호환 버전 정보는 Matrix in support document 207303.1 문서 참조
호환 Matrix에서는 최신 버전이 아닌 oracle 버전의 호환성에 대해 확인해주지 않는다는 점은 감안하여야 한다.
oracle_fdw 2.2.0 버전 기준 oracle client 10.2버전은 지원하지 않는다.
- 오라클 부분 확인 내용
--SID값으로 Service_name값 확인하기, 확인한 Service_name값으로 foreign server 설정값에 넣어주면 된다.
select value from v$parameter where name='<sid값>';
-------------------------
ORCLCDB.localdomain
- PostgreSQL 서버에서 필요한 파일 download 후 extension 설치하기
# Oracle Client Download
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
instantclient-basic-linux.x64-11.2.0.4.0.zip
instantclient-sdk-linux.x64-11.2.0.4.0.zip
instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
# oracle fdw download
https://github.com/laurenz/oracle_fdw
oracle_fdw-ORACLE_FDW_2_2_0.zip
#unzip all zip files
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip
unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
unzip oracle_fdw-ORACLE_FDW_2_2_0.zip
#환경변수 추가
#LD_LIBRARY_PATH 변수 끝에 :<오라클 클라이언트 압축 해제 경로> 추가
예) export LD_LIBRARY_PATH=$PGLIB:/home/seandb/instantclient_11_2
#새로 추가 필요
export ORACLE_HOME=/home/seandb/instantclient_10_2
export TNS_ADMIN=/home/seandb/instantclient_10_2
#환경변수 적용 확인
source ~/.bashrc ~/.bash_profile
cd $ORACLE_HOME;pwd;cd -
cd $TNS_ADMIN;pwd;cd -
echo $LD_LIBRARY_PATH
## 라이브러리 파일 존재 여부 확인
ls -al $ORACLE_HOME/libclntsh*
# 오라클 클라이언트 디렉토리에 있는 so 파일 관련 링크 설정.
cd $ORACLE_HOME
ln -s libclntsh.so.11.1 libclntsh.so
#oracle pwd 빌드 및 설치
cd oracle_fdw-master
make&&make install
#PostgreSQL 재기동
pg_ctl stop
pg_ctl start
#oracle_fdw 익스텐션 설치
-- drop EXTENSION oracle_fdw;
CREATE EXTENSION oracle_fdw;
#외부 테이블 목록 조회
select * from pg_foreign_table;
- 서버 연결 및 확인 방법
--drop server oradb cascade;
--service name으로 외부(foreign) server 등록하기
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//192.168.56.222:1521/ORCLCDB.localdomain');
--하단의 명령어는 tnsnames.ora를 생성해준 뒤에 그 정의된 이름을 사용하는 방법이다.
vi tnsnames.ora
TESTDB =
( DESCRIPTION =
( ADDRESS_LIST =
( ADDRESS = ( PROTOCOL = TCP ) ( HOST = 192.168.56.222 ) ( PORT = 1521 ) )
)
( CONNECT_DATA =
( SID = ORCLCDB )
)
)
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'TESTDB');
--혹은 하단과 같이 옵션을 전부 명시해주어도 동작한다
CREATE SERVER pdspawn FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=myhost.com)(Port=1521))(CONNECT_DATA=(SID=FOREIGN_DATABASE)))');
-- 별도 유저 생성 및 권한 부여가 필요한 경우 값들 변경하여 사용
--CREATE USER oracon PASSWORD 'oracon' LOGIN ;
--GRANT usage ON FOREIGN SERVER oradb TO oracon ;
--GRANT usage ON SCHEMA public TO oracon ;
CREATE USER MAPPING FOR experdba SERVER oradb OPTIONS (user 'oracle', password 'orapass');
-- oracle_fdw 익스텐션에서 제공하는 함수로 설정이 정상적으로 되었는지 확인 가능하다.
select oracle_diag('oradb');
--drop foreign table fr_persons;
CREATE FOREIGN TABLE fr_persons(
PERSON_ID NUMERIC NOT NULL
, FIRST_NAME VARCHAR(50)
, LAST_NAME VARCHAR(50)
) SERVER oradb OPTIONS (SCHEMA 'ORACLE', TABLE 'PERSONS');
select * from fr_persons;
- oracle_fdw 관련 함수 목록
oracle_close_connections();
oracle_diag();
oracle_execute();
oracle_fdw_handler();
oracle_fdw_validator();
- 관련 오브젝트 목록 조회
seandb=> select * from pg_foreign_data_wrapper ;
oid | fdwname | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions
-------+------------+----------+------------+--------------+--------+------------
16495 | dblink_fdw | 16386 | 0 | 16494 | |
16601 | oracle_fdw | 10 | 16596 | 16597 | |
(2 rows)
seandb=> select * from pg_foreign_server
seandb-> ;
oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl
| srvoptions
-------+---------+----------+--------+---------+------------+-----------------------------
------------+------------------------------------------
16602 | oradb | 10 | 16601 | | | {seandba=U/seandba,oracon=
U/seandba} | {dbserver=//192.168.56.222:1521/orclcdb}
(1 row)
seandb=> select * from pg_foreign_table ;
ftrelid | ftserver | ftoptions
---------+----------+----------------------------------
16604 | 16602 | {schema=SYSTEM,table=TEST_TABLE}
16607 | 16602 | {schema=ORACLE,table=PERSONS}
(2 rows)
- 외부 테이블 생성 후 테이블에 대한 정보 조회방법
select * from information_schema.tables where lower(table_type) like 'foreign';
table_catalog | table_schema | table_name | table_type | self_referencing_column_name | reference_generation | user_defined_type_catalog | user_defined_type_schema | user_defined_type_name | is_insertable_into
| is_typed | commit_action
---------------+--------------+------------+------------+------------------------------+----------------------+---------------------------+--------------------------+------------------------+--------------------
+----------+---------------
seandb | seandba | fr_persons | FOREIGN | | | | | | YES
| NO |
(1 row)
reference list:
https://github.com/laurenz/oracle_fdw/wiki
https://www.postgresql.org/docs/12/sql-createserver.html
'PostgreSQL' 카테고리의 다른 글
oracle_fdw 내용정리 (0) | 2022.02.21 |
---|---|
bloat postgresql check query (0) | 2021.07.18 |
PostgreSQL에 oracle_fdw 설정하기- 1/2 (0) | 2021.01.20 |
PostgreSQL 13(1편 Index size) (0) | 2020.09.27 |