fix(oracle): instanta citeste TNS_ADMIN-ul de masina, nu Oracle Home
Continuarea corectiei 3 din ec66377. Aceea rezolva doar jumatatea vizibila a
problemei; jumatatea ascunsa ar fi lovit la primul reboot al serverului, dupa
plecarea de la client. Gasit la VADECO, verificat pe loc.
1. ORA-12514 la toti clientii, cu baza perfect sanatoasa.
TNS_ADMIN de masina nu decide doar de unde se citeste sqlnet.ora: instanta
rezolva de acolo si aliasurile din tnsnames.ora. La Oracle XE LOCAL_LISTENER
e implicit aliasul LISTENER_XE, definit doar in tnsnames.ora din Oracle Home.
Cand serviciul reporneste dupa ce ROAClient a pus TNS_ADMIN pe folderul
instantclient-ului, aliasul nu se mai rezolva, instanta nu se mai
inregistreaza la listener, si atunci: v$instance OPEN, v$pdbs READ WRITE,
listener pornit pe 0.0.0.0:1521, lsnrctl arata doar CLRExtProc, si absolut
orice client primeste ORA-12514.
Capcana e de timp, nu de continut: o instanta pornita inainte ca TNS_ADMIN
sa existe nu il vede, deci instalarea pare impecabila si cade la primul
reboot. Reprodus la VADECO cu un simplu Restart-Service OracleServiceXE.
Pasul 01 scrie acum si tnsnames.ora in TNS_ADMIN (aliasul ROA pentru
ROAClient - sablonul livrat cu el arata spre HOST=SERVER_ROA, inexistent -
plus LISTENER_XE pentru instanta) si, mai important, fixeaza LOCAL_LISTENER
pe adresa literala. Doar asta din urma rezista si daca ROAClient se
instaleaza dupa kit, sau daca folderul instantclient se muta.
2. ORA-01017 desi parola e corecta.
Cu SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 serverul autentifica orice client
pre-12c pe baza verificatorului 10G. Un cont fara 10G in PASSWORD_VERSIONS
nu se mai poate conecta din Instant Client 10/11, si eroarea nu e ORA-28040,
ci ORA-01017 - fix cea care trimite pe pista parolei. Dupa o instalare 21c,
SYSTEM are doar 11G 12C; CONTAFIN_ORACLE scapa doar pentru ca pasul 01 ii
rescrie parola dupa ce a scris sqlnet.ora. Pasul 01 rescrie acum si parola
lui SYSTEM, din CDB$ROOT, cu aceeasi valoare.
Subtilitate: interogat din PDB, PASSWORD_VERSIONS al unui utilizator comun
ramane cel vechi si dupa reparatie, desi autentificarea foloseste definitia
din root si functioneaza. Coloana nu e o dovada pentru SYSTEM; conectarea e.
3. Pasul 07 verifica acum ce nu se vede pe hartie.
Toate cele trei erori trec de verificarile de pana acum: fisierul exista,
parametrul e setat, contul e OPEN, obiectele sunt valide. Sectiunea noua
"Conectivitate client vechi (Instant Client)" verifica unde se citeste
efectiv sqlnet.ora, daca tnsnames.ora din TNS_ADMIN mai e sablonul, daca
LOCAL_LISTENER e alias sau adresa, ce verificatoare de parola au conturile,
si - singurul lucru care le prinde pe toate - face o conectare adevarata cu
Instant Client-ul gasit pe masina. La esec, raportul spune si unde sa te
uiti. Parametri noi: -ContafinPassword, -InstantClientDir.
4. Get-ServerLanIPv4, in biblioteca.
Pe serverele la care intram prin Tailscale, un tnsnames.ora cu 100.x nu duce
nicaieri de pe o statie. Functia alege IP-ul din LAN sarind peste Tailscale
(100.64.0.0/10) si APIPA, dupa ruta implicita cand sunt mai multe placi.
Get-ListenerHost o foloseste si el la fallback-ul pe 0.0.0.0, unde inainte
lua prima adresa nefiltrata.
La VADECO a mai fost nevoie de o corectie manuala, in afara kitului: listener.ora
avea HOST = <nume>.ts.net, deci pornirea listenerului depindea de Tailscale.
Regula generala e in documentatie.
Detaliile, cu dovezi si comenzi de diagnostic: docs/lectii-conectare-client-oracle.md
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
This commit is contained in:
@@ -61,7 +61,7 @@ Ce se întâmplă, în ordine:
|
||||
| Pas | Script | Ce face |
|
||||
|---|---|---|
|
||||
| 1 | — | copiază DMP-urile în `C:\DMPDIR` + drepturi pentru serviciul Oracle |
|
||||
| 2 | `01-setup-database.ps1` | tablespace `ROA`, profil, user `CONTAFIN_ORACLE`, `sqlnet.ora` |
|
||||
| 2 | `01-setup-database.ps1` | tablespace `ROA`, profil, user `CONTAFIN_ORACLE`, `sqlnet.ora` + `tnsnames.ora` în `TNS_ADMIN`, `LOCAL_LISTENER` literal |
|
||||
| 3 | `02-create-sys-objects.ps1` | obiectele SYS: `AUTH_PACK`, `NEWSCHEMA`, `INFO`, `AUTH_SERII`… |
|
||||
| 4 | `03-import-contafin.ps1` | importă `CONTAFIN_ORACLE` **al clientului** |
|
||||
| 5 | `04-create-synonyms-grants.ps1` | sinonime publice, granturi, `sys-grants.sql` |
|
||||
@@ -175,13 +175,13 @@ Run.cmd 11-setup-backup-export.ps1
|
||||
|
||||
| Script | Ce face | Când |
|
||||
|---|---|---|
|
||||
| `01-setup-database.ps1` | tablespace `ROA`, profil, user `CONTAFIN_ORACLE`, `sqlnet.ora` | mereu |
|
||||
| `01-setup-database.ps1` | tablespace `ROA`, profil, user `CONTAFIN_ORACLE`, configurarea de rețea pentru clienți vechi | mereu |
|
||||
| `02-create-sys-objects.ps1` | `AUTH_PACK`, `NEWSCHEMA`, `EXECUTESCRIPTOS`, `INFO`, `UTL_MAIL` | mereu |
|
||||
| `03-import-contafin.ps1` | import `CONTAFIN_ORACLE` din DMP | mereu |
|
||||
| `04-create-synonyms-grants.ps1` | sinonime publice, granturi, `sys-grants.sql` | mereu |
|
||||
| `05-import-companies.ps1` | schemele de firmă, citind parolele din `NOM_FIRME` | migrare |
|
||||
| `06-add-company.ps1` | adaugă o firmă pe un server deja instalat | ocazional |
|
||||
| `07-verify-installation.ps1` | verificare completă; cod 0 = instalare bună | mereu |
|
||||
| `07-verify-installation.ps1` | verificare completă, inclusiv **probă de conectare cu Instant Client-ul vechi**; cod 0 = instalare bună | mereu |
|
||||
| `08-post-install-config.ps1` | `ROAUPDATE`, `SERVER_INFO`, joburi, SMTP, Id client | mereu |
|
||||
| `09-copy-licenses.ps1` | `AUTH_SERII` + `AUTH_DETALII` de pe serverul vechi | migrare |
|
||||
| `10-setup-roaupdate-iis.ps1` | directoare de modul + publicare `/roaupdate` în IIS | mereu |
|
||||
@@ -507,39 +507,71 @@ $f = "C:\app\romfast\product\21c\homes\OraDB21Home1\network\admin\sqlnet.ora"
|
||||
Importul care „a eșuat" nu trebuie refăcut dacă logul spune `completed`; rulează
|
||||
doar `07-verify-installation.ps1`.
|
||||
|
||||
### ORA-28040: No matching authentication protocol
|
||||
### ORA-28040 / ORA-01017 / ORA-12514 — cele trei erori de conectare
|
||||
|
||||
Clienții vechi (Instant Client 10/11) nu se pot conecta la 21c.
|
||||
Toate trei au fost întâlnite la VADECO și **niciuna nu arată spre cauza ei**.
|
||||
Ghidul complet, cu dovezile: [`../../../docs/lectii-conectare-client-oracle.md`](../../../docs/lectii-conectare-client-oracle.md).
|
||||
Rezumatul:
|
||||
|
||||
**Verifică întâi unde se citește `sqlnet.ora`.** Dacă `TNS_ADMIN` de mașină e
|
||||
setat (ROAClient îl pune pe folderul propriului Instant Client), acela câștigă —
|
||||
și pentru clienți, și pentru procesele bazei, de la următoarea pornire a
|
||||
serviciului Oracle. Fișierul din Oracle Home devine irelevant.
|
||||
|
||||
```powershell
|
||||
Copy-Item config\sqlnet.ora $env:ORACLE_HOME\network\admin\sqlnet.ora
|
||||
lsnrctl reload
|
||||
[Environment]::GetEnvironmentVariable('TNS_ADMIN','Machine')
|
||||
```
|
||||
|
||||
### ORA-28040: No matching authentication protocol
|
||||
|
||||
`sqlnet.ora` lipsește din locul de unde citește instanța, deci
|
||||
`ALLOWED_LOGON_VERSION_SERVER` cade pe implicitul 21c (`12`).
|
||||
|
||||
```powershell
|
||||
.\scripts\01-setup-database.ps1 # scrie sqlnet.ora in ambele locuri
|
||||
```
|
||||
|
||||
### ORA-01017: invalid username/password
|
||||
|
||||
După configurarea lui `sqlnet.ora` pentru clienți vechi, parolele trebuie rescrise
|
||||
ca să se genereze verificatorul vechi:
|
||||
Cu `ALLOWED_LOGON_VERSION_SERVER=8`, serverul autentifică orice client pre-12c pe
|
||||
baza verificatorului **10G**. Un cont fără `10G` în `PASSWORD_VERSIONS` primește
|
||||
`ORA-01017` — **parola e corectă**, lipsește verificatorul. Se repară rescriind
|
||||
aceeași parolă:
|
||||
|
||||
```sql
|
||||
ALTER USER CONTAFIN_ORACLE IDENTIFIED BY ROMFASTSOFT;
|
||||
ALTER USER <FIRMA> IDENTIFIED BY <parola>;
|
||||
-- utilizatori locali (din PDB)
|
||||
ALTER USER CONTAFIN_ORACLE IDENTIFIED BY "ROMFASTSOFT";
|
||||
ALTER USER <FIRMA> IDENTIFIED BY "<parola>";
|
||||
|
||||
-- utilizatori comuni (din CDB$ROOT)
|
||||
ALTER USER SYSTEM IDENTIFIED BY "romfastsoft" CONTAINER=ALL;
|
||||
```
|
||||
|
||||
Pentru `SYSTEM`, `PASSWORD_VERSIONS` citit din PDB rămâne `11G 12C` chiar și după
|
||||
reparație — rândul local nu se împrospătează. Singura verificare validă e o
|
||||
conectare adevărată.
|
||||
|
||||
### ORA-12514: listener does not know of service
|
||||
|
||||
```powershell
|
||||
lsnrctl status
|
||||
lsnrctl services
|
||||
```
|
||||
|
||||
Pentru XE, PDB-ul trebuie deschis:
|
||||
Întâi PDB-ul — pentru XE trebuie deschis și starea salvată:
|
||||
|
||||
```sql
|
||||
ALTER PLUGGABLE DATABASE XEPDB1 OPEN;
|
||||
ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE;
|
||||
```
|
||||
|
||||
Dacă baza e `OPEN`, listenerul e pornit și totuși `lsnrctl status` arată doar
|
||||
`CLRExtProc`, atunci **instanța nu s-a înregistrat**. La XE, `LOCAL_LISTENER` e
|
||||
implicit aliasul `LISTENER_XE`, care se rezolvă din `tnsnames.ora` — deci depinde
|
||||
de `TNS_ADMIN`. După un restart cu alt `TNS_ADMIN`, aliasul nu se mai rezolvă și
|
||||
**toți** clienții primesc `ORA-12514`.
|
||||
|
||||
```sql
|
||||
SELECT value FROM v$parameter WHERE name = 'local_listener'; -- alias = fragil
|
||||
ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=<ip_lan>)(PORT=1521))' SCOPE=BOTH;
|
||||
ALTER SYSTEM REGISTER;
|
||||
```
|
||||
|
||||
### Erori la import
|
||||
|
||||
| Eroare | Rezolvare |
|
||||
|
||||
Reference in New Issue
Block a user