ArpeOracle — Troubleshooting
Common failures and their fixes, grouped by where they show up: connecting, encryption/TLS, authenticating, the licence gate, and querying/ingesting. For the option details referenced here, see Connection.
Connection
Connect hangs, then fails. Every candidate address was unreachable within
login_timeout — usually a firewall, a wrong port, or the listener not running.
Verify with nc -vz <host> 1521. Lower login_timeout to fail faster while
diagnosing.
"specify either 'SID' or 'Service Name', not both". A sid and a
service_name select different CONNECT_DATA forms on the wire, so they cannot
be combined. Pick one. In a uri, that also means a path segment (service name)
plus ?sid= is rejected.
EZConnect with an IPv6 address is rejected. A bare IPv6 literal in a Server
descriptor has ambiguous colons. Give the host and Port as separate keywords,
or use the bracketed [::1] form in a uri.
Connecting to ADB hangs / the listener drops the connection. ADB's connect
descriptor is long and needs v0.2.0 or later — upgrade. Also confirm you are
using a wallet service name (<svc>_low.adb.oraclecloud.com) on port 1522
with ssl_mode=verify-full.
"… (Oracle 11g or older), which ArpeOracle does not support; a server running Oracle 12.1 or later is required". ArpeOracle speaks the 12c+ protocol layout, so Oracle 11g and older are refused at connect. There is no workaround — use Oracle 12.1 or later. See Compatibility.
Queries fail on describe against Oracle 21c / 23ai / 26ai. Upgrade to v0.2.10 or later: 12c through 26ai are all validated on current releases — see Compatibility.
TNS alias 'X' not found in <file>. A bare Server / Data Source name
with no service name or SID is looked up in tnsnames.ora (since v0.3.11), and
the file that was found has no such entry. Check the name (including any domain
suffix, e.g. SALESDB.WORLD: sqlnet.ora's NAMES.DEFAULT_DOMAIN is not
applied) and which file was read: adbc.arpeoracle.tns_admin, else
$TNS_ADMIN, else $ORACLE_HOME/network/admin. See
TNS alias.
Windows: parallel exports fail with cannot resolve '<host>': WSANOTINITIALISED.
Opening many AdbcDatabase handles at once (FastBCP's parallel methods, one per
chunk) could race Winsock startup. Fixed in v0.3.10: upgrade. Serial
connections were not affected.
TLS / wallets
"unable to get local issuer certificate" on RHEL 8 or Windows. On these
platforms the driver does not find the operating system's CA certificates by
itself, so verify-ca / verify-full fail unless a CA is given. Set
ssl_root_cert to the PEM CA bundle (or use a wallet), or set the
SSL_CERT_FILE environment variable — on RHEL 8:
/etc/pki/tls/certs/ca-bundle.crt.
The connection is plaintext when I expected encryption. ssl_mode defaults
to disable, and the default NNE stance accepted only encrypts when the server
asks for it (REQUESTED/REQUIRED). Set ssl_mode=require/verify-ca/verify-full,
or encryption=requested/required for
Native Network Encryption. O5LOGON keeps the
password off the wire either way, but SQL text and data are in clear until you
encrypt.
"wallet_location/ssl_root_cert were given but ssl_mode is 'disable'". A
wallet or CA bundle does not turn TLS on by itself. Set ssl_mode to require,
verify-ca or verify-full as well.
"certificate verify failed" / hostname mismatch. With verify-ca/verify-full
the certificate chain (and, for verify-full, the hostname) is checked against
ssl_root_cert, else the wallet's CAs, else OpenSSL's default locations (see Authentication → TLS). Point ssl_root_cert at the right CA
bundle, or use a wallet.
The wallet won't load. ArpeOracle reads ewallet.pem (client key + cert +
CAs in one PEM), the python-oracledb-thin layout — not Oracle's cwallet.sso.
Convert an SSO wallet with orapki wallet pkcs12_to_pem -wallet <dir>. An
encrypted key needs wallet_password.
Windows: the DLL fails to load. The released arpeoracle_adbc_driver-win-x64.dll is
self-contained — OpenSSL and the C runtime are included, so no extra DLLs are
needed. It is a 64-bit (x64) library: the host process must be 64-bit too.
Native Network Encryption
"server requires Oracle native network encryption … are 'rejected'". The
server is set to REQUIRED and the client opted out with encryption=rejected /
data_integrity=rejected. Leave them unset (accepted, the default, negotiates
whatever the server asks for), or use TCPS.
"server requires Oracle native network encryption / data integrity on top of
TCPS". Over TCPS an accepted stance is not advertised (the transport is
already encrypted), but this server still requires NNE. Set
encryption=requested/required (or data_integrity) to negotiate it inside
TLS.
"… but its ACCEPT disables advanced negotiation". The server says it requires NNE yet its answer blocks the negotiation — typically a Connection Manager or proxy rewriting the connect flags. The driver refuses to continue in plaintext; fix the intermediary's configuration or connect to the listener directly.
ORA-12660 (parameters incompatible). One side requires a service the other
rejects — e.g. encryption=required against a REJECTED server, or
encryption=rejected against a REQUIRED server. Align the stances.
encryption=required fails the connect / ORA-12650. The server declined to
negotiate a cipher ArpeOracle offers. ArpeOracle offers only AES-256 with SHA-256/SHA-1
integrity; a server that requires DES/3DES/RC4 or MD5 will not connect. Adjust
SQLNET.ENCRYPTION_TYPES_SERVER / CRYPTO_CHECKSUM_TYPES_SERVER to include
AES256 / SHA256 (or SHA1).
"server requires Oracle native network encryption" with default options.
Before v0.3.8 the default accepted stance did not advertise NNE at all, so a
server set to REQUIRED refused a default client. Since v0.3.8 accepted
advertises encryption and integrity and lets the server decide, like ODP.NET and
OCI — upgrade, or set encryption=required explicitly. See the client × server
matrix in Connection.
Connects are slower, or bulk exports lost throughput, after upgrading to
v0.3.8. With the default accepted stance every plain-TCP connection now makes
one extra ANO round trip at connect, and a server set to REQUESTED now gets an
AES-256 + checksum session. If you do not want NNE, set both
encryption=rejected and data_integrity=rejected to restore the plain
handshake with no extra round trip.
Data decodes as garbage / the stream desyncs mid-result over NNE. Fixed in
v0.1.7 (SHA-1 integrity); since v0.1.6 DISABLE_OOB=ON is no longer
required. Upgrade to v0.1.7 or later.
Authentication
"ORA-01017: invalid username/password". Credentials are wrong, or — for token
auth on ADB — the server-side setup is off. For OAuth2/Entra, the Application ID
URI must be a domain-qualified https:// URI; the Azure default api://<appId>
makes ADB reject otherwise-valid tokens with a generic ORA-01017.
OCI IAM / OAuth2 token: "login failed" though the token is valid. The Oracle
identity must be mapped to a schema — IDENTIFIED GLOBALLY AS 'IAM_PRINCIPAL_NAME=…'
(OCI) or the Entra global-user mapping. Tokens also expire (~1 h); re-mint with
oci iam db-token get or refresh the Entra token. ADB requires the wallet
(mutual TLS) alongside the token.
Proxy auth fails with ORA-01017. Either the authenticating account's
password is wrong, or the target has not granted the proxy:
ALTER USER target GRANT CONNECT THROUGH proxyacct;. Inside the session
SESSION_USER is the target and PROXY_USER the authenticating account.
Licence
Connection fails with an ARROW_LIC_* error. The licence gate is always
enforced — a driver with no valid token refuses to connect. Supply one via
arpeio.adbc.license_file (a .lic path), arpeio.adbc.license (the blob
inline), the ARPEIO_ADBC_LICENCE[_FILE] environment variable, or an
arpeio_adbc.lic file next to the driver library. Full detail — including how to
read the current licence state with arpeio.adbc.license.status — is in
Licensing.
Query & ingest
adbc_ingest(mode="create") fails "already exists". The target table exists.
Use append, replace, or create_append.
An ingested table "does not exist" when queried. Ingest quotes the table
and column names exactly as given, so my_table becomes the case-sensitive
"my_table". Query it quoted, or ingest with an upper-case name. See
Data types.
A query fails with "… is not supported by this driver yet". The result has
a column type ArpeOracle does not decode (e.g. BFILE, or an object type other
than SDO_GEOMETRY). Leave it out of the select list, or convert it in SQL. See
Data types.
Ingest into a different catalog is rejected. An Oracle session reaches one
catalog only; adbc.ingest.target_catalog must be the connected service (or
unset). Use target_db_schema to target a schema.
A NUMBER column comes back as strings. That is the lossless default —
unconstrained NUMBER maps to utf8. For float64 or a fixed decimal, set
number_mapping=double or decimal:P,S. See
Data types.
Cancelling a long query. Statement.Cancel / Connection.Cancel send an
in-band TNS break from another thread and work over plaintext, Native Network
Encryption, and TCPS (TLS was closed in v0.2.1). The session is poisoned after
a cancel and transparently reconnects on the next statement.
See also
- Connection · Authentication · Licensing
- Compatibility — is your target actually supported?