oracle怎么连接pg的端口,PG用oracle_fdw连接oracle报错

近日做一个POC测试的时候遇到的问题,记录一下。

通过oracle_fdw连接oracle环境,前期创建extension,创建fdw server和user mapping均正常,但是在尝试查询外部表的时候,报了这个错误:

[antdb@db104 ~]$ psql -p 5432

psql (12.3)

Type "help" for help.

antdb=# select * from guqi_test_ftb ;

ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle

DETAIL:

antdb=# select pg_backend_pid();

pg_backend_pid

----------------

40562

(1 row)

antdb=# select * from guqi_test_ftb ;

ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle

DETAIL:

从错误消息的本身看,像是环境变量有问题,但是在外部通过sqlplus是能够正常访问Oracle server的。于是打算strace看下报错时的系统调用情况

[root@db104 lib]# strace -p 40562

strace: Process 40562 attached

epoll_wait(3, [{EPOLLIN, {u32=0, u64=0}}], 1, -1) = 1

recvfrom(10, "Q\0\0\0\"select * from guqi_test_ftb"..., 8192, 0, NULL, NULL) = 35

openat(AT_FDCWD, "/home/antdb/oracle/instantclient_12_2/oracore/zoneinfo", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

openat(AT_FDCWD, "/home/antdb/oracle/instantclient_12_2/oracore/zoneinfo", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=10240*1024}) = 0

...

close(63) = 0

munmap(0x7f9370637000, 4096) = 0

getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=10240*1024}) = 0

open("/home/antdb/oracle/instantclient_12_2/rdbms/mesg/ocius.msb", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/home/antdb/oracle/instantclient_12_2/rdbms/mesg/ocius.msb", O_RDONLY) = -1 ENOENT (No such file or directory)

brk(NULL) = 0x23a7000

brk(0x23cc000) = 0x23cc000

times({tms_utime=1, tms_stime=1, tms_cutime=0, tms_cstime=0}) = 2884253683

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

write(2, "\0\0\376\0r\236\0\0T2021-03-22 19:05:27.716"..., 263) = 263

sendto(10, "E\0\0\0\215SERROR\0VERROR\0CHV00N\0Merror"..., 142, 0, NULL, 0) = 142

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

sendto(9, "\2\0\0\0(\0\0\0\10@\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 40, 0, NULL, 0) = 40

sendto(10, "Z\0\0\0\5I", 6, 0, NULL, 0) = 6

recvfrom(10, 0xdf20a0, 8192, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)

epoll_wait(3, ^Cstrace: Process 40562 detached

看了这个问题大概就清楚了,oracle客户端的安装路径里面似乎少了一些东西:zoneinfo和ocius.msb。

这个客户端环境是我直接拷贝的现成的环境,并没有从头开始安装,偷了个懒。

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

解压到指定路径,然后配好.bashrc里的ORACLE_HOME环境变量,重启数据库,问题得解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在PostgreSQL中连接Oracle数据库,你可以使用Oracle Foreign Data Wrapper (oracle_fdw)扩展。首先,确保你已经安装了oracle_fdw扩展。然后,按照以下步骤进行操作: 1. 下载并解压oracle_fdw扩展的zip包。 2. 复制oracle_fdw.dll文件到PostgreSQL安装目录下的lib文件夹中。\[1\] 3. 复制oracle_fdw.control、oracle_fdw--1.0.sql和oracle_fdw--unpackaged--1.0.sql这三个文件到PostgreSQL安装目录下的share/extension目录中。\[1\] 4. 在PostgreSQL中创建一个新的扩展,使用CREATE EXTENSION命令。例如,执行以下命令创建oracle_fdw扩展: ``` CREATE EXTENSION oracle_fdw; ``` 5. 创建一个服务器对象,使用CREATE SERVER命令。指定Oracle数据库的连接信息,例如: ``` CREATE SERVER oracle_server FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//localhost:1521/orcl'); ``` 这里的dbserver参数指定了Oracle数据库的连接地址和SID。 6. 创建一个用户映射,使用CREATE USER MAPPING命令。指定PostgreSQL用户和Oracle用户的对应关系,例如: ``` CREATE USER MAPPING FOR postgres SERVER oracle_server OPTIONS (user 'oracle_user', password 'oracle_password'); ``` 这里的postgres是PostgreSQL的用户名,oracle_user是Oracle的用户名,oracle_password是Oracle的密码。 7. 创建外部表,使用CREATE FOREIGN TABLE命令。指定外部表的结构和数据来源,例如: ``` CREATE FOREIGN TABLE oracle_table (column1 datatype, column2 datatype, ...) SERVER oracle_server OPTIONS (table 'oracle_table'); ``` 这里的oracle_table是Oracle数据库中的表名,column1、column2等是表的列名和数据类型。 通过以上步骤,你就可以在PostgreSQL中成功连接Oracle数据库,并且可以通过外部表的方式访问Oracle数据库中的数据了。请根据你的实际情况修改相应的参数。 #### 引用[.reference_title] - *1* [pg连接oracle.sql](https://blog.csdn.net/weixin_30611317/article/details/116328124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值