Add Oracle 18c sqlnet.ora config for old ODBC/Instant Client 11g compatibility

- Add config/sqlnet.ora with ALLOWED_LOGON_VERSION=8 for old client support
- Add scripts/fix-sqlnet.sh startup script to persist config across container restarts
- Update README with ORA-28040 troubleshooting, ODBC connection params, and deployment instructions
- Fix SID description: Oracle 18c has PDB (XEPDB1), not non-CDB
- Update container recreation instructions with startup scripts volume

Resolves ORA-28040: No matching authentication protocol when connecting
from Windows ODBC with Oracle Instant Client 11.2

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Marius
2026-01-28 00:22:03 +02:00
parent fb474c3726
commit 665c2b5d37
3 changed files with 146 additions and 6 deletions

View File

@@ -116,7 +116,7 @@ ssh root@10.0.20.201 "pct exec 108 -- docker stop oracle-xe oracle18-xe; pct sto
- **Port Extern:** 1522 (mapează la 1521 intern)
- **Port EM Express:** 5502 (mapează la 5500 intern)
- **TSTZ Version:** 31 (compatibil cu 11g/18c/19c)
- **SID:** XE (non-CDB, nu are PDB-uri)
- **SID:** XE (CDB cu PDB implicit: XEPDB1)
- **Character Set:** WE8MSWIN1252
### Scheme Importate
@@ -130,6 +130,13 @@ ssh root@10.0.20.201 "pct exec 108 -- docker stop oracle-xe oracle18-xe; pct sto
|----------------|--------------|-----------|
| /opt/oracle/oradata | /opt/oracle18/oradata | Date Oracle 18c (datafiles, redo) |
| /opt/oracle/oradata/dmpdir | /opt/oracle18/oradata/dmpdir | Export/Import DMP |
| /opt/oracle/scripts/startup | /opt/oracle18/oradata/startup | Scripturi executate la pornire |
**Fișiere configurare persistente (în /opt/oracle18/oradata/):**
| Fișier | Descriere |
|--------|-----------|
| dbconfig/sqlnet.ora | Configurare autentificare (suport clienți vechi 11g) |
| startup/*.sh | Scripturi executate automat la pornirea containerului |
> **Notă:** Oracle 18c folosește un volum **separat** (`/opt/oracle18/`) pentru a evita
> conflicte cu Oracle 21c. Directorul DMPDIR este în volumul 18c.
@@ -183,6 +190,19 @@ jdbc:oracle:thin:@10.0.20.121:1522/XE
jdbc:oracle:thin:@10.0.20.121:1522/XEPDB1
```
**ODBC Windows (Instant Client 11.2 sau mai vechi):**
| Parametru | Valoare |
|-----------|---------|
| Host | 10.0.20.121 |
| Port | 1522 |
| Service Name | XEPDB1 |
| User | CONTAFIN_ORACLE sau FIRMANOUA |
| Password | ROMFASTSOFT |
> **Notă:** Pentru clienți ODBC vechi (Instant Client 11g), serverul Oracle 18c trebuie configurat
> cu `SQLNET.ALLOWED_LOGON_VERSION_SERVER=8` în `sqlnet.ora`. Vezi secțiunea Troubleshooting.
**TNS Entries:**
```
# PDB XEPDB1 (pentru aplicații - RECOMANDAT)
@@ -252,11 +272,20 @@ docker exec oracle18-xe impdp system/romfastsoft@localhost:1521/XE \
docker stop oracle18-xe 2>/dev/null
docker rm oracle18-xe 2>/dev/null
# 2. Creează directorul volum (prima dată)
# 2. Creează directoarele volum (prima dată)
mkdir -p /opt/oracle18/oradata
mkdir -p /opt/oracle18/oradata/dbconfig
mkdir -p /opt/oracle18/oradata/startup
chmod 777 /opt/oracle18/oradata
# 3. Creează container
# 3. Creează sqlnet.ora pentru compatibilitate cu clienți vechi (Instant Client 11g)
cat > /opt/oracle18/oradata/dbconfig/sqlnet.ora << 'EOF'
NAMES.DIRECTORY_PATH = (EZCONNECT, TNSNAMES)
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
EOF
# 4. Creează container cu volume pentru persistență config
docker run -d --name oracle18-xe \
--restart unless-stopped \
-p 1522:1521 \
@@ -264,6 +293,7 @@ docker run -d --name oracle18-xe \
-e ORACLE_PASSWORD=romfastsoft \
-e ORACLE_CHARACTERSET=WE8MSWIN1252 \
-v /opt/oracle18/oradata:/opt/oracle/oradata \
-v /opt/oracle18/oradata/startup:/opt/oracle/scripts/startup \
--shm-size=1g \
gvenzl/oracle-xe:18
@@ -287,6 +317,49 @@ EOF"
### Troubleshooting Oracle 18c
#### ORA-28040: No matching authentication protocol (ODBC/Instant Client vechi)
**Problemă:** Conectarea din Windows cu Oracle Instant Client 11.2 (sau mai vechi) la Oracle 18c eșuează cu eroarea:
```
ORA-28040: No matching authentication protocol
```
**Cauză:** Oracle 18c folosește implicit protocolul de autentificare versiunea 12, incompatibil cu clienții vechi (11g și anterior).
**Soluție:** Configurează `sqlnet.ora` să accepte protocoale vechi de autentificare.
```bash
# Verifică configurația curentă
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'cat /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora'"
# Adaugă suport pentru clienți vechi (dacă nu există deja)
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'echo \"SQLNET.ALLOWED_LOGON_VERSION_SERVER=8\" >> /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora'"
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'echo \"SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8\" >> /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora'"
# Reîncarcă listener-ul
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'lsnrctl reload'"
```
**După modificare - resetează parolele utilizatorilor:**
Parolele sunt stocate cu versiunea de protocol activă la momentul setării. După modificarea `sqlnet.ora`, trebuie resetate:
```bash
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'sqlplus -s / as sysdba <<EOF
ALTER SESSION SET CONTAINER = XEPDB1;
ALTER USER CONTAFIN_ORACLE IDENTIFIED BY ROMFASTSOFT;
ALTER USER FIRMANOUA IDENTIFIED BY ROMFASTSOFT;
EXIT;
EOF'"
```
**Persistență la restart container:**
Configurația `sqlnet.ora` este salvată în volumul persistent `/opt/oracle18/oradata/dbconfig/`. Containerul este configurat cu volum pentru startup scripts care restaurează automat configurația.
> **Notă:** Containerul oracle18-xe a fost recreat cu volum adițional pentru persistența configurației:
> ```bash
> -v /opt/oracle18/oradata/startup:/opt/oracle/scripts/startup
> ```
#### Verificare Status
```bash
# Status container
@@ -785,14 +858,40 @@ SQL-uri și packages Oracle:
- `sql/roa/` - SQL-uri compatibilitate Oracle 10g (scrie_jc_2007.sql, etc.)
- `sql/roa-romconstruct/` - Package PACK_CONTAFIN.pck
### config/
Fișiere configurare Oracle 18c:
- `sqlnet.ora` - Configurare autentificare pentru clienți vechi (rezolvă ORA-28040)
### scripts/
Scripturi operaționale pentru export:
Scripturi operaționale:
- `export-roa2.sh` - Export din Oracle 18c sau 21c (bash)
- `./export-roa2.sh 18` - Export compatibil 11g/18c/19c din Oracle 18c
- `./export-roa2.sh 21` - Export din Oracle 21c PDB roa2
- `export-roa2.ps1` - Export pentru Windows (PowerShell, meniu interactiv)
- `fix-sqlnet.sh` - Script startup pentru Oracle 18c (copiază sqlnet.ora la pornire container)
**Copiere manuală a scriptului pe LXC 108:**
**Copiere config și scripturi pe LXC 108 (Oracle 18c):**
```bash
# Din WSL/Linux local - copiază toate fișierele necesare:
cd /mnt/e/proiecte/ROMFASTSQL
# 1. Copiază sqlnet.ora în volumul persistent dbconfig
scp proxmox/lxc108-oracle/config/sqlnet.ora root@10.0.20.201:/tmp/ && \
ssh root@10.0.20.201 "pct exec 108 -- mkdir -p /opt/oracle18/oradata/dbconfig && \
pct push 108 /tmp/sqlnet.ora /opt/oracle18/oradata/dbconfig/sqlnet.ora"
# 2. Copiază fix-sqlnet.sh în volumul startup scripts
scp proxmox/lxc108-oracle/scripts/fix-sqlnet.sh root@10.0.20.201:/tmp/ && \
ssh root@10.0.20.201 "pct exec 108 -- mkdir -p /opt/oracle18/oradata/startup && \
pct push 108 /tmp/fix-sqlnet.sh /opt/oracle18/oradata/startup/fix-sqlnet.sh && \
pct exec 108 -- chmod +x /opt/oracle18/oradata/startup/fix-sqlnet.sh"
# 3. Aplică imediat sqlnet.ora (fără restart container)
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c \
'cp /opt/oracle/oradata/dbconfig/sqlnet.ora /opt/oracle/product/18c/dbhomeXE/network/admin/ && lsnrctl reload'"
```
**Copiere export-roa2.sh pe LXC 108:**
```bash
# Din WSL/Linux local:
scp proxmox/lxc108-oracle/scripts/export-roa2.sh root@10.0.20.201:/tmp/
@@ -827,6 +926,6 @@ http://10.0.20.121:5500/em
---
**Data ultimei actualizări:** 2026-01-27
**Data ultimei actualizări:** 2026-01-28
**Autor:** Marius Mutu
**Proiect:** ROMFASTSQL - Oracle XE 18c/21c în Proxmox LXC

View File

@@ -0,0 +1,18 @@
# =============================================================================
# sqlnet.ora - Configurare Oracle 18c XE pentru clienți vechi
# =============================================================================
# Locație în container: /opt/oracle/oradata/dbconfig/sqlnet.ora
# Copiat automat în: /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora
# de către fix-sqlnet.sh la pornirea containerului
#
# Problema rezolvată: ORA-28040: No matching authentication protocol
# Permite conexiuni de la Oracle Instant Client 11g și ODBC vechi
# =============================================================================
NAMES.DIRECTORY_PATH = (EZCONNECT, TNSNAMES)
# Suport pentru clienți vechi (Oracle 11g, Instant Client 11.2, ODBC vechi)
# Valori posibile: 8, 10, 11, 12 (default în Oracle 18c este 12)
# Versiunea 8 permite cele mai vechi clienți
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

View File

@@ -0,0 +1,23 @@
#!/bin/bash
# =============================================================================
# fix-sqlnet.sh - Startup script pentru Oracle 18c XE
# =============================================================================
# Scop: Restaurează sqlnet.ora cu suport pentru clienți vechi (Instant Client 11g)
# la fiecare pornire a containerului Docker.
#
# Locație în container: /opt/oracle/scripts/startup/fix-sqlnet.sh
# Executat automat de: gvenzl/oracle-xe la pornirea containerului
#
# Problema rezolvată: ORA-28040: No matching authentication protocol
# Cauză: Oracle 18c implicit nu acceptă autentificare de la clienți 11g
# =============================================================================
CONFIG_SOURCE="/opt/oracle/oradata/dbconfig/sqlnet.ora"
CONFIG_DEST="/opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora"
if [ -f "$CONFIG_SOURCE" ]; then
cp "$CONFIG_SOURCE" "$CONFIG_DEST"
echo "[fix-sqlnet.sh] Copied custom sqlnet.ora with old auth protocol support"
else
echo "[fix-sqlnet.sh] WARNING: $CONFIG_SOURCE not found, using default sqlnet.ora"
fi