首页 > 解决方案 > 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

谢谢彼得

标签: phporacledocker

解决方案


几点注意事项:

关于您的实际错误,最好在数据库和容器中查找 Oracle 跟踪文件。oradiag_*容器中有目录吗?如果找不到,请/opt/oracle/instantclient_19_6/network/admin/sqlnet.ora使用类似的条目创建,ADR_BASE=/tmp/mydiag然后mkdir /tmp/mydiag在启动应用程序之前运行。


推荐阅读