我正在尝试运行一个 Python 脚本,将一些数据从 docker 映像插入到 Oracle 表中。
我得到了以下连接字符串:
jdbc:oracle:thin:@(DESCRIPTION=(CONNECT_TIMEOUT=3)(RETRY_COUNT=2)(FAILOVER=ON)(LOAD_BALANCE=NO) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_1)(PORT=1521))) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_2)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=service_name)))
我正在尝试使用cx_Oracle
包进行连接:
try:
# establish a new connection
with cx_Oracle.connect(self.oracle_user,
self.oracle_pwd,
self.oracle_dsn) as connection:
logger.info('ElasticsearchFinder.oracle_write : connexion established with DB')
oracle_dsn
是连接字符串(减去jdbc:oracle:thin:@
部分(
我也尝试过这样的事情
cx_Oracle.connect(self.oracle_user+'/'+self.oracle_pwd+'@'+self.oracle_dsn)
如某些示例所示,但我总是收到以下超时错误:
cx_Oracle.DatabaseError: ORA-12170: TNS:Connect timeout occurred
telnet host 1521
工作正常,我还尝试更改CONNECT_TIMEOUT
值。
我也试过
dsn_tns = cx_Oracle.makedsn(self.oracle_host, self.oracle_port, service_name = self.oracle_service_name)
cx_Oracle.connect(self.oracle_user,self.oracle_pwd,dsn_tns)
正如这里建议的那样,但后来我得到了
cx_Oracle.DatabaseError: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
我正在使用Dockerfile从Docker镜像构建运行我的脚本:
FROM oraclelinux:7.8
RUN yum -y install oracle-release-el7 &&
yum-config-manager --enable ol7_oracle_instantclient &&
yum -y install oracle-instantclient18.3-basic &&
rm -rf /var/cache/yum
COPY ./fetch_session_iptv.py /opt/
COPY ./conf/fetch_session_iptv.conf /opt/conf/
#COPY ./conf/certs/* /opt/conf/certs/
COPY ./logs /opt/logs
RUN yum install -y
#https://yum.oracle.com/repo/OracleLinux/OL7/developer/x86_64/getPackage/oracle-instantclient18.3-basic-18.3.0.0.0-2.x86_64.rpm
https://yum.oracle.com/repo/OracleLinux/OL7/developer/x86_64/getPackage/python-cx_Oracle-7.3-1.el7.x86_64.rpm
https://yum.oracle.com/repo/OracleLinux/OL7/developer/x86_64/getPackage/python36-pytz-2016.10-2.0.1.el7.noarch.rpm
COPY ./python_requirements/elasticsearch-7.8.0-py2.py3-none-any.whl .
COPY ./python_requirements/certifi-2020.4.5.2-py2.py3-none-any.whl .
COPY ./python_requirements/urllib3-1.25.9-py2.py3-none-any.whl .
RUN pip3 install --user
certifi-2020.4.5.2-py2.py3-none-any.whl
urllib3-1.25.9-py2.py3-none-any.whl
elasticsearch-7.8.0-py2.py3-none-any.whl
cx_Oracle
RUN sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
RUN ldconfig
RUN export ORACLE_HOME=/usr/lib/oracle/18.3/client64/
RUN yum -y install telnet
#CMD ["/bin/bash"]
CMD [ "python3", "/opt/fetch_session_iptv.py" ]
我不明白出了什么问题?
[更新] 我已经设置
ORACLE_HOME=/usr/lib/oracle/18.3/client64/bin
TNS_ADMIN=$ORACLE_HOME/admin
LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib
PATH=$PATH:$ORACLE_HOME
我在目录中添加了一个tnsnames.ora
文件TNS_ADMIN
CNX=(DESCRIPTION=(CONNECT_TIMEOUT=3)(RETRY_COUNT=2)(FAILOVER=ON)(LOAD_BALANCE=NO) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_1)(PORT=1521))) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_2)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=service_name)))
现在,当我尝试sqlplus MY_USER@CNX
时,我得到相同的结果:
ORA-12170: TNS:Connect timeout occured
但至少它似乎接受了连接字符串和用户。在正确设置所有环境变量之前,我只收到有关TNS: listener does not currently know of service requested in connect descriptor
或网络服务名称不正确的不同TNS错误消息。
[更新2] 我已经与给我所有连接信息的人核实过:用户、密码和连接字符串是否正确。他们运行的是Oracle数据库12c(12.1.0.2.0(,根据此页面,它与我正在使用的18c客户端兼容。
我不知道此超时错误的可能原因是什么?
首先在 cx_Oracle 中使用等效的连接字符串:
self.oracle_dsn = "(DESCRIPTION=(CONNECT_TIMEOUT=3)(RETRY_COUNT=2)(FAILOVER=ON)(LOAD_BALANCE=NO) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_1)(PORT=1521))) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_2)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=service_name)))"
try:
# establish a new connection
with cx_Oracle.connect(self.oracle_user,
self.oracle_pwd,
self.oracle_dsn) as connection:
logger.info('ElasticsearchFinder.oracle_write : connexion established with DB')
关于连接和连接字符串的cx_Oracle手册在这里。
就个人而言,我会使用 19c 即时客户端,它将连接到与 18c 相同的数据库版本 - 并且不需要运行ldconfig
。 请参阅 Node.js 和 Python 中的 Docker for Oracle Database Applications 。
用信息更新您的问题,我也可以同样更新此答案。