在postgresql中通过dblink查询oracle表报错:
postgres=# select * from t1; ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle |
这个问题需要通过strace才能发现,首先执行PG_BACKEND_PID()函数,可以返当前会话的服务器进程PID。
postgres=# select * from t1; ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle DETAIL: postgres=# postgres=# SELECT pg_backend_pid(); pg_backend_pid ---------------- 97376 |
通过strace另开启一个会话追踪97376。
epoll_wait(3, [{EPOLLIN, {u32=41936840, u64=41936840}}], 1, -1) = 1 recvfrom(10, "Q 26select * from t1; ", 8192, 0, NULL, NULL) = 23 openat(AT_FDCWD, "/app/instantclient/oracore/zoneinfo", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/app/instantclient/oracore/zoneinfo", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) get_mempolicy(NULL, NULL, 0, NULL, 0) = 0 open("/proc/self/status", O_RDONLY) = 65 fstat(65, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2acdea8c6000 read(65, "Name: postgres Umask: 0077 State"..., 1024) = 1024 read(65, ",00000000,00000000,00000000,0000"..., 1024) = 208 close(65) = 0 munmap(0x2acdea8c6000, 4096) = 0 getrlimit(RLIMIT_STACK, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 open("/proc/sys/kernel/shmmax", O_RDONLY) = 65 fstat(65, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2acdea8c6000 read(65, "2147483648 ", 1024) = 11 close(65) = 0 munmap(0x2acdea8c6000, 4096) = 0 get_mempolicy(NULL, NULL, 0, NULL, 0) = 0 open("/proc/self/status", O_RDONLY) = 65 fstat(65, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2acdea8c6000 read(65, "Name: postgres Umask: 0077 State"..., 1024) = 1024 read(65, ",00000000,00000000,00000000,0000"..., 1024) = 209 close(65) = 0 munmap(0x2acdea8c6000, 4096) = 0 open("/proc/meminfo", O_RDONLY) = 65 fstat(65, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2acdea8c6000 read(65, "MemTotal: 527439000 kB Mem"..., 1024) = 1024 read(65, "ages_Total: 0 HugePages_Fr"..., 1024) = 208 close(65) = 0 munmap(0x2acdea8c6000, 4096) = 0 open("/app/instantclient/rdbms/mesg/ocius.msb", O_RDONLY) = -1 ENOENT (No such file or directory) open("/app/instantclient/rdbms/mesg/ocius.msb", O_RDONLY) = -1 ENOENT (No such file or directory) mmap(NULL, 176128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ad6398e7000 brk(NULL) = 0x298c000 brk(0x29ad000) = 0x29ad000 times(NULL) = 524110648 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 write(2, " p1`|1 t2020-09-21 15:00:44.604"..., 377) = 377 sendto(10, "E 215SERROR VERROR CHV00N Merror"..., 142, 0, NULL, 0) = 142 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 sendto(9, "2 ( 275 1 "..., 40, 0, NULL, 0) = 40 sendto(10, "Z 5I", 6, 0, NULL, 0) = 6 recvfrom(10, 0xd21740, 8192, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) |
通过追踪发现,它需要读取文件。
/app/instantclient/rdbms/mesg/ocius.msb
查询安装的客户端,发现该Oracle客户端根本没有mesg等相关目录。
通过再次安装完整版的客户端解决,这里直接通过yum安装oracle18c rpm包。
yum -y localinstall compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm yum -y localinstall oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm yum -y localinstall oracle-database-ee-18c-1.0-1.x86_64.rpm |
安装完成客户端之后,一定要注意下列步骤
1.加载新的Oracle客户端环境变量,主要是ORACLE_HOME和LD_LIBRARY_PATH。
export ORACLE_HOME=/opt/oracle/product/18c/dbhome_1 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$POSTGRES_HOME/lib:$POSTGRES_HOME/lib/postgresql:$POSTGRES_HOME/plugin:$ORACLE_HOME/lib" |
2.重启Postgresql数据库,这一点很重要。
pg_ctl stop -D /app/xxx/data pg_ctl start -D /app/xxx/data |
3.使用正确的环境变量,再次安装oracle_fdw。
su - postgres unzip oracle_fdw-2.2.1.zip cd oracle_fdw-2.2.1 make make install psql create extension oracle_fdw |
上述三个步骤操作完成之后再次查询就能够使用dblink访问Oracle数据库。
该问题主要参考了oracle_fdw作者的github相关文章
https://github.com/laurenz/oracle_fdw/issues/307
而插件作者已指出,有很多可能的原因导致此问题。基本上都是Oracle配置问题。
Oracle环境变量的问题 https://github.com/laurenz/oracle_fdw/issues/305
Oracle安装混乱导致的问题
https://github.com/laurenz/oracle_fdw/issues/263
版本兼容性问题,在postgresql中使用了不兼容的oracle_fdw二进制文件
https://github.com/laurenz/oracle_fdw/issues/218
文件系统权限问题
https://github.com/laurenz/oracle_fdw/issues/133
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130132.html
摘要:阿里云,采用与模式类似的方案,解决了进程模式在高并发的情况下性能下降的问题。具体测试结果分析阿里云在高并发下,相比社区版本好很多,更加平稳。阿里云引入了机制后,响应延迟,抖动相比社区版本低了很多。 摘要: 背景 进程模型数据库,需要为每个会话指派独立的进程与之服务,在连接数非常多,且大都是活跃连接时,进程调度浪费或引入的开销甚至远远大于实际任务需要的开销(例如上下文切换,MEMCPY等...
摘要:摘要第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破迁移上云的壁垒为题的演讲。于是,阿里云给出了上面的解决方案。 摘要: 2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲。Oracle是指数据库管理系统,面对Oracle迁移上云的壁垒,阿里云如何能够打破它呢?本文提出了Oracle 到云数据库P...
摘要:移动易后台实现外部数据库连接要实现外置数据库,即上层开发人员不关心下层数据库的实现,在项目中需要针对不同数据库修改文件以及在项目中添加依赖包。本文主要介绍移动易后台如何实现同不同数据源的连接,数据源包括,。 1、移动易后台实现外部数据库连接 要实现外置数据库,即上层开发人员不关心下层数据库的实现,在Spring boot项目 中需要针对不同数据库修改application.proper...
摘要:文章目录前言从上下源码后运行报错不支援验证类型。解决办法就是去找到下载,注意选择源码版本下载,如下图。入门教程本地环境搭建和源码编译安装,献给编译失败的同学,教程不断优化附录 ...
阅读 1249·2023-01-11 13:20
阅读 1557·2023-01-11 13:20
阅读 1011·2023-01-11 13:20
阅读 1680·2023-01-11 13:20
阅读 3971·2023-01-11 13:20
阅读 2519·2023-01-11 13:20
阅读 1310·2023-01-11 13:20
阅读 3486·2023-01-11 13:20