php - ora-03113-end-of-file-on-communication-channel 错误来自 Windows 10 上 docker 中的 php
问题描述
当运行一个在 PHP 中使用 OCI8 库连接到 Oracle 服务器并循环通过一个大约需要 10 分钟的 oracle 游标的 php 程序时,我们在 php_cli_error.log 中收到 ORA-03113 错误
但是,完全相同的 docker 映像在 linux 上的 docker 上运行时完成相同的程序而不会出错,连接到同一个 Oracle 服务器。
在 linux 和 windows 10 上的 docker 上运行 oracle 客户端和 php 之间有什么已知的区别吗?
我们使用的是 Instantclient_19_6 和 php 7.4、windows 10 build 2004、docker 桌面。
所有机器都在同一个内部网络上,所以不是网络问题。
我检查了 Oracle alert.log 文件,那里没有错误,因此 Oracle 服务器似乎没有触发错误。看起来更像是某些东西正在终止客户端上的连接。
这是 dockerfile oracle 安装部分
# Install Oracle Connector Client
# Refer Here - https://gist.github.com/Yukibashiri/cebaeaccbe531665a5704b1b34a3498e
RUN mkdir /opt/oracle && \
cd /opt/oracle && \
mv /tmp/instantclient-* /opt/oracle/ && \
unzip instantclient-basiclite-linux.x64-19.6.0.0.0dbru.zip && \
unzip instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip && \
echo /opt/oracle/instantclient_19_6 > /etc/ld.so.conf.d/oracle-instantclient.conf && \
ldconfig && \
apt-get -y install php7.4-dev php-pear build-essential libaio1 && \
pecl channel-update pecl.php.net && \
echo 'instantclient,/opt/oracle/instantclient_19_6' | pecl install oci8 && \
echo "extension = oci8.so" >> /etc/php/7.4/cli/php.ini && \
echo "extension = oci8.so" >> /etc/php/7.4/apache2/php.ini && \
echo "export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_6" >> /etc/apache2/envvars && \
echo "export ORACLE_HOME=/opt/oracle/instantclient_19_6" >> /etc/apache2/envvars && \
echo "LD_LIBRARY_PATH=/opt/oracle/instantclient_19_6:$LD_LIBRARY_PATH" >> /etc/environment && \
rm -v /opt/oracle/instantclient-* && \
apt-get -y remove --purge php7.4-dev build-essential && \
apt-get -y autoremove
任何想法可能导致oracle连接终止?
ps 我也尝试过使用 nohup 运行 php 程序以确保它不是信号中断,但仍然会发生错误。
更多信息 - 我已在 docker 实例中为 instaclient 启用 ADR 跟踪,这就是跟踪文件中发生的内容
2020-06-30 20:02:10.452 : ntt2err:entry
2020-06-30 20:02:10.452 : ntt2err:Read unexpected EOF ERROR on 7
2020-06-30 20:02:10.453 : ntt2err:exit
2020-06-30 20:02:10.453 : nttfprd:exit
2020-06-30 20:02:10.453 : nserror:nsres: id=0, op=68, ns=12537, ns2=12560; nt[0]=507, nt[1]=0, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0
2020-06-30 20:02:10.453 : nioqer:entry
2020-06-30 20:02:10.453 : nioqce:entry
2020-06-30 20:02:10.453 : nioqce:exit
2020-06-30 20:02:10.453 : nioqer:exit
2020-06-30 20:02:10.453 : nioqrc:exit
2020-06-30 20:02:10.453 : nioqds:entry
2020-06-30 20:02:10.453 : nioqds: disconnecting...
2020-06-30 20:02:10.453 : nsvntx_dei:entry
2020-06-30 20:02:10.453 : nsvntx_dei:exit
2020-06-30 20:02:10.453 : nstimarmed:no timer allocated
2020-06-30 20:02:10.453 : nttctl:entry
2020-06-30 20:02:10.453 : nttctl:entry
2020-06-30 20:02:10.453 : nsfull_cls:cid=0, opcode=65, *bl=0, *what=0, uflgs=0x0, cflgs=0x0
2020-06-30 20:02:10.453 : nsfull_cls:nsctx: state=1, flg=0x4009, mvd=117
2020-06-30 20:02:10.453 : nsdo:cid=0, opcode=67, *bl=0, *what=1, uflgs=0x0, cflgs=0x1
2020-06-30 20:02:10.453 : nsdo:nsctx: state=1, flg=0x4009, mvd=117
2020-06-30 20:02:10.453 : nsclose:closing transport
2020-06-30 20:02:10.453 : nttdisc:entry
2020-06-30 20:02:10.453 : nttdisc:Closed socket 7
2020-06-30 20:02:10.453 : nttdisc:exit
2020-06-30 20:02:10.453 : nsclose:global context check-out (from slot 0) complete
2020-06-30 20:02:10.453 : nadisc:entry
2020-06-30 20:02:10.453 : nacomtm:entry
2020-06-30 20:02:10.453 : nacompd:entry
2020-06-30 20:02:10.453 : nacompd:exit
2020-06-30 20:02:10.453 : nacompd:entry
2020-06-30 20:02:10.453 : nacompd:exit
2020-06-30 20:02:10.453 : nacomtm:exit
2020-06-30 20:02:10.453 : nas_dis:entry
2020-06-30 20:02:10.453 : nas_dis:exit
2020-06-30 20:02:10.453 : nau_dis:entry
2020-06-30 20:02:10.453 : nau_dis:exit
2020-06-30 20:02:10.453 : naeetrm:entry
2020-06-30 20:02:10.453 : naeetrm:exit
2020-06-30 20:02:10.453 : naectrm:entry
2020-06-30 20:02:10.453 : naectrm:exit
2020-06-30 20:02:10.453 : nagbltrm:entry
2020-06-30 20:02:10.453 : nau_gtm:entry
2020-06-30 20:02:10.453 : nau_gtm:exit
2020-06-30 20:02:10.453 : nagbltrm:exit
2020-06-30 20:02:10.453 : nadisc:exit
2020-06-30 20:02:10.453 : nsvntx_dei:entry
2020-06-30 20:02:10.453 : nsvntx_dei:exit
2020-06-30 20:02:10.453 : nsmfr:3368 bytes at 0x55dbab934a30
2020-06-30 20:02:10.453 : nsmfr:150 bytes at 0x55dbab761b20
2020-06-30 20:02:10.453 : nsmfr:288 bytes at 0x55dbab932a50
2020-06-30 20:02:10.453 : nladtrm:entry
2020-06-30 20:02:10.453 : nladtrm:exit
2020-06-30 20:02:10.453 : nsmfr:1952 bytes at 0x55dbab934280
2020-06-30 20:02:10.453 : nigcui:entry
2020-06-30 20:02:10.453 : nigcui:Clr User Interrupt: hdl=0, prc=0x573b4510, ctx=0xab920500.
2020-06-30 20:02:10.453 : nioqds:exit
2020-06-30 20:02:10.453 : nigtrm:Count in the NI global area is now 2
2020-06-30 20:02:10.453 : nsbrfr:nsbfs at 0xab93c560, data at 0xab935970.
2020-06-30 20:02:10.453 : nsbrfr:nsbfs at 0xab93e700, data at 0xab93e7b0.
2020-06-30 20:02:10.453 : nsbrfr:nsbfs at 0xab933f60, data at 0xab93c610.
2020-06-30 20:02:10.453 : nsbrfr:nsbfs at 0xab9408a0, data at 0xab940b40.
2020-06-30 20:02:10.453 : nsbrfr:nsbfs at 0xab933e00, data at 0xab942c30.
2020-06-30 20:02:10.453 : nigtrm:Count in the NL global area is now 2
还尝试在客户端上增加 sqlnet.ora 中的超时。
TRACE_LEVEL_CLIENT=admin
DIAG_ADR_ENABLED=on
ADR_BASE=/tmp/mydiag
DEFAULT_SDU_SIZE=1024
SQLNET.INBOUND_CONNECT_TIMEOUT=100
SQLNET.OUTBOUND_CONNECT_TIMEOUT=100
SQLNET.RECV_TIMEOUT=1000
SQLNET.SEND_TIMEOUT=100
TCP.CONNECT_TIMEOUT=100
BEQUEATH_DETACH=yes
DISABLE_OOB=on
谢谢彼得
解决方案
几点注意事项:
- 不要使用 Instant Client 设置 ORACLE_HOME
- 因为你已经运行了 ldconfig,你不需要在任何地方设置 LD_LIBRARY_PATH
- https://blogs.oracle.com/opal/docker-for-oracle-database-applications-in-nodejs-and-python-part-1中有一些 Dockerfile 示例,展示了设置 Instant Client 的不同方法。
- 在https://github.com/oracle/docker-images/tree/master/OracleLinuxDevelopers/oraclelinux7/php上有一些 PHP 特定的 Dockerfile
关于您的实际错误,最好在数据库和容器中查找 Oracle 跟踪文件。oradiag_*
容器中有目录吗?如果找不到,请/opt/oracle/instantclient_19_6/network/admin/sqlnet.ora
使用类似的条目创建,ADR_BASE=/tmp/mydiag
然后mkdir /tmp/mydiag
在启动应用程序之前运行。
推荐阅读
- angular - 如何获取对角度结构指令容器内元素的引用
- macros - 如何将调试消息传递给 SystemVerilog 中的宏
- android - 离子:在Android中初始加载后未获取数据在浏览器中正常工作
- android-management-api - 当 kioskCustomLauncherEnabled 开启时,清除 FORCE_INSTALLED 应用上的应用数据和缓存
- amazon-web-services - AWS Lambda Container Image for Ruby Code -- 如何使用 docker run 在本地进行测试
- vue.js - VueJS 导入和解析 CSV(仅限前端)
- css - 高度为 100% 的 div 未扩展以匹配父 div
- c# - 有没有更好的方法来用泛型类型实现这个 IEquatable 接口
- tfs - 取消发布并开始新的发布后,无法创建发布工件目录错误
- javascript - ES6 速记会影响抽象吗?