【问题标题】:How to fix: cx_Oracle.DatabaseError: ORA-12578: TNS:wallet open failed如何修复:cx_Oracle.DatabaseError: ORA-12578: TNS:wallet open failed
【发布时间】:2021-09-10 06:39:03
【问题描述】:

我正在使用 cx_Oracle 在 Python 中建立与 Oracle 数据库的连接。我正在使用钱包连接到数据库。并且代码在虚拟环境中运行。 当我激活虚拟环境并手动运行脚本时,它运行良好。但是在运行表单 crontab 或 Tidal(调度程序)时会引发以下错误:

cx_Oracle.DatabaseError: ORA-12578: TNS:wallet open failed

以前我遇到过另一个类似的问题:

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so"

- 手动运行正常,但 crontab 出错,已通过包含来自 this answer 的建议行解决。

下面是 cronjob:

0 6 * * * cd /path/to/the/code && /path/to/the/venv/myEnv/bin/python /path/script.py 

下面是代码:

#!/usr/bin/env python3

import os
import cx_Oracle

os.environ["ORACLE_HOME"]="/u01/app/oracle/product/12.2.0/client64"

def fetch_data():
    #connection = cx_Oracle.connect("user", "pwd", "conn")
    connection = cx_Oracle.connect(dsn="WALLET_NAME", encoding="UTF-8")
    cursor = connection.cursor()
    with open('rtp_query.sql') as f:
        sql = f.read()
    cursor.execute(sql)
    result = cursor.fetchall()
    cursor.close()
    connection.close()

请注意,用户名/密码连接在命令行和 crontab 中都有效, 但是使用 Wallet 字符串,它只能从命令行工作,并且会为 crontab 抛出以下错误:

cx_Oracle.DatabaseError: ORA-12578: TNS:wallet open failed

【问题讨论】:

  • 检查文件权限以及 cron 进程的运行身份。在调用 Python 的 shell 脚本中设置 Oracle 环境变量(如 ORACLE_HOME 和 LD_LIBRARY_PATH)会更好(即更安全) - 避免在 Python 中设置变量。事实上,Linux 需要在进程启动之前设置 LD_LIBRARY_PATH。
  • 感谢@ChristopherJones 的评论。我在调度程序中更改为更合适的用户,现在它工作正常。现在甚至不必在脚本中设置像 ORACLE_HOME 这样的 Oracle 环境变量。我还有一项从 crontab 运行的工作也有同样的问题,我也会检查并更新。
  • 嗨,所以对于 cron 作业,问题仍然存在。我已授予所有相关文件的完全权限。文件是使用超级用户创建的,该用户也是运行 crontab 的用户。还尝试在包装器 shell 脚本中设置 Oracle 环境变量并调用 python 脚本。仍然收到相同的钱包打开错误。有什么建议吗?

标签: python python-3.x cx-oracle oracle-wallet


【解决方案1】:

帮助我们扩大了对预言机钱包文件的权限。找到您的 oracle 钱包文件并执行 'chmod 750 *wallet*' 以便同一用户组的其他用户可以读取这些文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多