使用 python 将虚拟机连接到 Oracle 时出错(错误 DPY-4011)

问题描述 投票:0回答:3

我正在使用 oracledb 库将我的 python 应用程序连接到 oracle 数据库。我可以在我的计算机上使用 python 正常连接,但我有一个运行 Ubuntu 的虚拟机,它与计算机使用相同的网络,无法连接。这是我尝试时的输出:

Python:3.8.10
甲骨文:SE19
连接字符串:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=IP)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=NAME)(SERVER=dedicated)))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/arthur/.local/lib/python3.8/site-packages/oracledb/connection.py", line 995, in wrapped
    return conn_class(dsn=dsn, pool=pool, params=params, **kwargs)
  File "/home/arthur/.local/lib/python3.8/site-packages/oracledb/connection.py", line 124, in __init__
    impl.connect(params_impl)
  File "src/oracledb/impl/thin/connection.pyx", line 309, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 169, in oracledb.thin_impl.ThinConnImpl._connect_with_params
  File "src/oracledb/impl/thin/protocol.pyx", line 188, in oracledb.thin_impl.Protocol._connect
  File "src/oracledb/impl/thin/protocol.pyx", line 255, in oracledb.thin_impl.Protocol._process_message
  File "src/oracledb/impl/thin/protocol.pyx", line 233, in oracledb.thin_impl.Protocol._process_message
  File "src/oracledb/impl/thin/protocol.pyx", line 301, in oracledb.thin_impl.Protocol._receive_packet
  File "src/oracledb/impl/thin/buffer.pyx", line 1080, in oracledb.thin_impl.ReadBuffer.receive_packet
  File "src/oracledb/impl/thin/buffer.pyx", line 426, in oracledb.thin_impl.ReadBuffer._receive_packet_helper
  File "src/oracledb/impl/thin/buffer.pyx", line 293, in oracledb.thin_impl.ReadBuffer._get_data_from_socket
  File "/home/arthur/.local/lib/python3.8/site-packages/oracledb/errors.py", line 103, in _raise_err
    raise exc_type(_Error(message)) from cause
oracledb.exceptions.DatabaseError: DPY-4011: the database or network closed the connection

搜索这个错误,发现可能是防火墙问题,但是在VM中被停用了

我还能尝试什么?

编辑:设置 ENV 变量后,这里是输出(我隐藏了一些敏感数据)

2022-08-04 16:40:44.246 [socket: 3] Sending packet:
0000 : 01 10 00 00 01 00 00 00 |........|
0008 : 01 3E 01 2C 0C 01 20 00 |.>.,....|
0016 : FF FF 4F 98 00 00 00 01 |..O.....|
0024 : 00 C6 00 4A 00 00 00 00 |...J....|
0032 : 80 80 00 00 00 00 00 00 |........|
0040 : 00 00 00 00 00 00 00 00 |........|
0048 : 00 00 00 00 00 00 00 00 |........|
0056 : 00 00 00 00 20 00 00 00 |........|
0064 : FF FF 00 00 00 00 00 00 |........|
0072 : 00 01 28 44 45 53 43 52 |..(DESCR|
0080 : 49 50 54 49 4F 4E 3D 28 |IPTION=(|
0088 : 41 44 44 52 45 53 53 3D |ADDRESS=|
0096 : 28 50 52 4F 54 4F 43 4F |(PROTOCO|
0104 : 4C 3D 54 43 50 29 28 48 |L=TCP)(H|
0112 : 4F 53 54 3D 31 37 32 2E |OST=IPP.|
0120 : 32 30 2E 33 2E 32 35 34 |IP.I.IPP|
0128 : 29 28 50 4F 52 54 3D 31 |)(PORT=1|
0136 : 35 32 31 29 29 28 43 4F |521))(CO|
0144 : 4E 4E 45 43 54 5F 44 41 |NNECT_DA|
0152 : 54 41 3D 28 53 45 52 56 |TA=(SERV|
0160 : 49 43 45 5F 4E 41 4D 45 |ICE_NAME|
0168 : 3D 46 4F 52 54 45 53 45 |=SERVICE|
0176 : 43 29 28 53 45 52 56 45 |C)(SERVE|
0184 : 52 3D 64 65 64 69 63 61 |R=dedica|
0192 : 74 65 64 29 28 43 49 44 |ted)(CID|
0200 : 3D 28 50 52 4F 47 52 41 |=(PROGRA|
0208 : 4D 3D 2F 75 73 72 2F 62 |M=/usr/b|
0216 : 69 6E 2F 70 79 74 68 6F |in/pytho|
0224 : 6E 33 29 28 48 4F 53 54 |n3)(HOST|
0232 : 3D 61 72 74 68 75 72 2D |=arthur-|
0240 : 56 69 72 74 75 61 6C 2D |Virtual-|
0248 : 4D 61 63 68 69 6E 65 29 |Machine)|
0256 : 28 55 53 45 52 3D 61 72 |(USER=ar|
0264 : 74 68 75 72 29 29 29 29 |thur))))|

2022-08-04 16:40:44.391 [socket: 3] Receiving packet:
0000 : 00 08 00 00 0B 00 00 00 |........|

2022-08-04 16:40:44.391 [socket: 3] Sending packet:
0000 : 01 10 00 00 01 00 00 00 |........|
0008 : 01 3E 01 2C 0C 01 20 00 |.>.,....|
0016 : FF FF 4F 98 00 00 00 01 |..O.....|
0024 : 00 C6 00 4A 00 00 00 00 |...J....|
0032 : 80 80 00 00 00 00 00 00 |........|
0040 : 00 00 00 00 00 00 00 00 |........|
0048 : 00 00 00 00 00 00 00 00 |........|
0056 : 00 00 00 00 20 00 00 00 |........|
0064 : FF FF 00 00 00 00 00 00 |........|
0072 : 00 01 28 44 45 53 43 52 |..(DESCR|
0080 : 49 50 54 49 4F 4E 3D 28 |IPTION=(|
0088 : 41 44 44 52 45 53 53 3D |ADDRESS=|
0096 : 28 50 52 4F 54 4F 43 4F |(PROTOCO|
0104 : 4C 3D 54 43 50 29 28 48 |L=TCP)(H|
0112 : 4F 53 54 3D 31 37 32 2E |OST=IPP.|
0120 : 32 30 2E 33 2E 32 35 34 |IP.I.IPP|
0128 : 29 28 50 4F 52 54 3D 31 |)(PORT=1|
0136 : 35 32 31 29 29 28 43 4F |521))(CO|
0144 : 4E 4E 45 43 54 5F 44 41 |NNECT_DA|
0152 : 54 41 3D 28 53 45 52 56 |TA=(SERV|
0160 : 49 43 45 5F 4E 41 4D 45 |ICE_NAME|
0168 : 3D 46 4F 52 54 45 53 45 |=SERVICE|
0176 : 43 29 28 53 45 52 56 45 |C)(SERVE|
0184 : 52 3D 64 65 64 69 63 61 |R=dedica|
0192 : 74 65 64 29 28 43 49 44 |ted)(CID|
0200 : 3D 28 50 52 4F 47 52 41 |=(PROGRA|
0208 : 4D 3D 2F 75 73 72 2F 62 |M=/usr/b|
0216 : 69 6E 2F 70 79 74 68 6F |in/pytho|
0224 : 6E 33 29 28 48 4F 53 54 |n3)(HOST|
0232 : 3D 61 72 74 68 75 72 2D |=arthur-|
0240 : 56 69 72 74 75 61 6C 2D |Virtual-|
0248 : 4D 61 63 68 69 6E 65 29 |Machine)|
0256 : 28 55 53 45 52 3D 61 72 |(USER=ar|
0264 : 74 68 75 72 29 29 29 29 |thur))))|

2022-08-04 16:40:44.526 [socket: 3] Receiving packet:
0000 : 00 2D 00 00 02 00 00 00 |.-......|
0008 : 01 3E 0C 01 00 00 00 00 |.>......|
0016 : 01 00 00 00 00 2D C1 00 |.....-..|
0024 : 00 00 00 00 00 00 00 00 |........|
0032 : 00 00 20 00 00 00 FF FF |........|
0040 : 00 00 00 00 01          |.....   |

2022-08-04 16:40:44.526 [socket: 3] Sending packet:
0000 : 00 00 00 0B 0C 00 00 00 |........|
0008 : 01 00 02                |...     |

2022-08-04 16:40:44.526 [socket: 3] Sending packet:
0000 : 00 00 00 8F 06 00 00 00 |........|
0008 : 00 00 DE AD BE EF 00 85 |........|
0016 : 0B 20 02 00 00 04 00 00 |........|
0024 : 04 00 03 00 00 00 00 00 |........|
0032 : 04 00 05 0B 20 02 00 00 |........|
0040 : 08 00 01 00 00 10 1C 66 |.......f|
0048 : EC 28 EA 00 12 00 01 DE |.(......|
0056 : AD BE EF 00 03 00 00 00 |........|
0064 : 04 00 04 00 01 00 02 00 |........|
0072 : 03 00 01 00 03 00 00 00 |........|
0080 : 00 00 04 00 05 0B 20 02 |........|
0088 : 00 00 02 00 03 E0 E1 00 |........|
0096 : 02 00 06 FC FF 00 02 00 |........|
0104 : 02 00 00 00 00 00 04 00 |........|
0112 : 05 0B 20 02 00 00 01 00 |........|
0120 : 01 00 00 03 00 02 00 00 |........|
0128 : 00 00 00 04 00 05 0B 20 |........|
0136 : 02 00 00 01 00 01 00    |....... |

python oracle virtual-machine python-oracledb
3个回答
1
投票

按照 Anthony Tuininga 的建议,通过以下方式禁用 oob(带外中断):

disable_oob= True
解决了这个问题。谢谢。


1
投票

在我们的示例中,我们使用 Oracle 数据库本机网络加密(不是 TLS),但我们看到了同样的错误。 经过大量搜索,我们终于发现这是 python oracledb 包在“瘦模式”下运行时的一个已知限制。

来自 https://python-oracledb.readthedocs.io/en/latest/user_guide/appendix_b.html#native-network-encryption-and-checksumming

python-oracledb Thin 模式不支持使用 Oracle 数据库本机网络加密或校验和的连接。您可以启用 TLS,而不是使用本机网络加密。如果需要本机网络加密或校验和,请在厚模式下使用 python-oracledb。请参阅启用 python-oracledb 厚模式。

例如,如果您使用 python-oracledb Thin 模式并尝试连接到 Oracle Cloud Infrastructure (OCI) Oracle Base 数据库,其中默认情况下,在 OCI Oracle Base 数据库服务器的 sqlnet.ora 文件中将本机网络加密设置为 REQUIRED ,连接将失败并出现错误:

DPY-6000:无法连接到数据库。侦听器拒绝连接。 (类似于ORA-12660)

有趣的是,他们肯定已经更新了 oracledb 1.3.0 版本中的错误消息(DPY-6000 到 DPY-4011),但未能相应地更新文档。


0
投票

禁用 oob 并没有解决我的问题。相反,在创建连接之前调用 init_oracle_client() 对我来说可以启用厚模式。 (来源:https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.htmlhttps://github.com/oracle/python-oracledb/discussions/45)。

© www.soinside.com 2019 - 2024. All rights reserved.