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
26 KiB
Instalarea ROA pe Oracle 21c / Windows
Kit de instalare și migrare a sistemului ROA pe un server Windows cu Oracle 21c (Express Edition sau Standard Edition). Se rulează pe serverul clientului.
Oracle nu se instalează de aici — vezi întâi docs/00-INSTALL-ORACLE-XE.md
sau docs/00-INSTALL-ORACLE-SE.md.
Cerințe
- Windows Server 2016+ / Windows 10-11 Pro, cu drepturi de administrator
- Oracle 21c XE sau SE deja instalat, cu parola SYS/SYSTEM
romfastsoft - PowerShell 5.1+
- Spațiu: minimum 20 GB liberi (XE e limitat oricum la 12 GB date utilizator)
- Fișierele DMP șablon (vezi Fișierele DMP)
Alege scenariul
| # | Situația | Ce rulezi | Downtime |
|---|---|---|---|
| A | Migrare de pe un server vechi, cu utilizatori care lucrează | FAZA1.cmd ziua, FAZA2.cmd seara |
minute |
| B | Client nou, fără date anterioare | FAZA1.cmd <Id> /faralicente |
irelevant |
| C | Migrare, dar downtime-ul nu contează | INSTALEAZA.cmd migrare <Id> + 3 pași manuali |
ore |
Dacă eziți: A. E fluxul complet și cel mai bine acoperit de verificări.
A. Migrarea în două faze
De ce merge așa
Pe CONTAFIN_ORACLE nu se lucrează activ — e schema comună, cu drepturi,
nomenclatoare, NOM_FIRME și tabela de actualizări. Se schimbă rar. Schemele
de firmă sunt cele în care se scrie tot timpul.
Deci contafin-ul poate fi exportat de pe serverul vechi în timpul programului,
iar tot ce depinde de el — obiecte SYS, sinonime, granturi, SERVER_INFO,
directoare, joburi, IIS, licențe — se poate face ziua, cu utilizatorii pe
serverul vechi. Seara rămâne doar importul firmelor.
Faza 1 — în timpul programului
REM 1. Exporta DOAR contafin_oracle de pe serverul vechi
expdp system/parola@XE SCHEMAS=CONTAFIN_ORACLE DIRECTORY=DMPDIR ^
DUMPFILE=contafin_oracle.dmp LOGFILE=exp_contafin.log
REM 2. Pune-l in DMPDIR\ din kit, peste sablon. Lasa FIRMANOUA.dmp pe loc.
REM 3. Ruleaza faza 1
FAZA1.cmd 138 /vechi:10.0.0.5 /parolavechi:parola-SYS-veche /serviciuvechi:XE
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 + 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 |
| 6 | 09-copy-licenses.ps1 |
licențele de pe serverul vechi |
| 7 | 08-post-install-config.ps1 |
ROAUPDATE, SERVER_INFO, joburi, SMTP, Id client |
| 8 | 10 + 11 |
publicarea în IIS, exportul zilnic |
| 9 | 07-verify-installation.ps1 |
verificare |
La final, verificarea va spune „N company schemas are missing". E normal — firmele vin abia în faza 2.
Opțiuni FAZA1.cmd:
| Opțiune | Efect |
|---|---|
/smtp:<server> |
server SMTP (implicit mail.romfast.ro) |
/vechi:<gazda> |
serverul vechi, pentru licențe |
/serviciuvechi:<nume> |
serviciul de pe serverul vechi (implicit XE) |
/parolavechi:<parola> |
parola SYS de pe serverul vechi |
/licente:<fișier.sql> |
licențe dintr-un fișier, în loc de rețea |
/roaupdate:<cale> |
rădăcina oglinzii (implicit D:\ROAUPDATE) |
/export:<cale> |
director export (implicit D:\ROA\EXPORT_ORADMP) |
/faralicente /faraiis /farabackup |
sar peste pasul 09 / 10 / 11 |
Între faze
- Utilizatorii lucrează mai departe pe serverul vechi.
- Nu porni joburile de actualizare pe serverul nou.
- Poți testa aplicația pe serverul nou — merge, doar că fără date de firmă.
- Dacă se adaugă o firmă nouă sau se modifică nomenclatoare pe serverul
vechi, faza 2 trebuie rulată cu
/reimportcontafin, altfelNOM_FIRMErămâne în urmă și firma nouă nu se importă.
Faza 2 — după program
REM 1. Exporta schemele de firma de pe serverul vechi
expdp system/parola@XE SCHEMAS=FIRMA1,FIRMA2,FIRMA3 DIRECTORY=DMPDIR ^
DUMPFILE=%U_firme.dmp LOGFILE=exp_firme.log
REM Lista schemelor:
REM SELECT schema FROM CONTAFIN_ORACLE.NOM_FIRME WHERE sters = 0;
REM 2. Pune DMP-urile in C:\DMPDIR (sau da /dmp:<cale>)
REM 3. Ruleaza faza 2
FAZA2.cmd 138
| Pas | Ce face |
|---|---|
| 1 | copiază DMP-urile firmelor în C:\DMPDIR |
| 2 | opțional /reimportcontafin: drop-contafin.ps1 → 01 → 03 → 04 |
| 3 | 05-import-companies.ps1 — schemele de firmă |
| 4 | 08-post-install-config.ps1 din nou |
| 5 | 11-setup-backup-export.ps1 -SchemaOnly — regenerează schema.txt |
| 6 | 07-verify-installation.ps1 |
De ce se reia pasul 08: SERVER_INFO este o tabelă în CONTAFIN_ORACLE,
nu în SYS. Când vine contafin-ul clientului peste, aduce cu el SERVER_INFO
de pe serverul vechi — căi vechi, parole vechi, SMTP vechi. Fără reluare,
actualizările ar căuta fișiere pe calea serverului vechi.
Din același motiv se pierd joburile UPDATEROA_ZILNIC / UPDATERTVAI_ZILNIC
la /reimportcontafin — sunt owned de CONTAFIN_ORACLE. Pasul 08 le recreează,
dezactivate. Dacă trebuie să meargă, activează-le manual la final.
Licențele nu se pierd: SYS.AUTH_SERII și SYS.AUTH_DETALII trăiesc în SYS.
B. Client nou
FAZA1.cmd 138 /faralicente
DMPDIR conține doar șabloanele: contafin_oracle.dmp (cu NOM_FIRME goală) și
FIRMANOUA.dmp. Nu există fază 2.
Prima firmă se creează DIN APLICAȚIA ROA, nu din scripturi. Aplicația scrie
firma în CONTAFIN_ORACLE.NOM_FIRME și apelează SYS.NEWSCHEMA, care îi importă
structura din C:\DMPDIR\FIRMANOUA.dmp.
Echivalentul mai vechi, fără IIS și fără export zilnic:
INSTALEAZA.cmd curat 138
C. Migrare într-o singură rulare
INSTALEAZA.cmd migrare 138 mail.romfast.ro
Toate DMP-urile (contafin-ul clientului + firmele + FIRMANOUA.dmp) trebuie să
fie în DMPDIR\ înainte.
INSTALEAZA.cmd nu copiază licențele, nu publică în IIS și nu
configurează exportul zilnic. După el, manual:
Run.cmd 09-copy-licenses.ps1 -OldHost 10.0.0.5 -OldSysPassword parola -Replace
Run.cmd 10-setup-roaupdate-iis.ps1
Run.cmd 11-setup-backup-export.ps1
Scripturile
| Script | Ce face | Când |
|---|---|---|
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ă, 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 |
11-setup-backup-export.ps1 |
EXPORT_ORADMP, backupora.exe, task zilnic |
mereu |
drop-contafin.ps1 |
șterge CONTAFIN_ORACLE (doar pentru /reimportcontafin) |
faza 2 |
99-uninstall-roa.ps1 |
curăță tot, pentru re-testare | testare |
Run.cmd <script> [parametri] rulează unul singur, rezolvând ExecutionPolicy.
Structura kitului
roa-windows-setup/
├── FAZA1.cmd # faza 1 - in timpul programului
├── FAZA2.cmd # faza 2 - dupa program
├── INSTALEAZA.cmd # instalare intr-o singura rulare
├── Run.cmd # ruleaza un singur script
├── RunAll.cmd # varianta interactiva a lui INSTALEAZA
├── config.example.ps1 # sablon de configurare (copiaza ca config.ps1)
│
├── DMPDIR/ # doar in kitul construit, nu in repo
│ ├── contafin_oracle.dmp
│ └── FIRMANOUA.dmp
│
├── backup/
│ ├── backupora.exe # exportatorul VFP, 49 KB, versionat aici
│ └── setari.ini.template # sablon cu marcaje {{...}}
│
├── docs/
│ ├── 00-INSTALL-ORACLE-XE.md
│ └── 00-INSTALL-ORACLE-SE.md
│
├── scripts/
│ ├── 01..11, 99, drop-contafin.ps1
│ └── lib/
│ ├── logging-functions.ps1
│ └── oracle-functions.ps1
│
├── sql/
│ ├── create-tablespace.sql, create-user-*.sql, configure-profile.sql
│ ├── sys-objects.sql # obiectele SYS
│ ├── sys-grants.sql # granturi SYS + dictionar pentru PACK_DIAG_SPATIU
│ ├── synonyms-public.sql, grants-public.sql
│ ├── directories-roaupdate.sql, server-info-init.sql, scheduler-jobs.sql
│ ├── auth-detalii-init.sql, export-licente.sql
│ ├── verify-objects.sql, uninstall-roa.sql, run-all-sys.sql
│ ├── ExecuteScriptOS.prc, UpdateSQLPLUS.prc
│ └── sys-updates/ # patch-uri sys_* post-instalare
│
├── config/sqlnet.ora # compatibilitate Instant Client 10/11
├── par/ # fisiere de parametri Data Pump
├── logs/ # logurile fiecarui pas
└── test/clone-vm300.sh # clonare VM de test pe Proxmox
Fișierele DMP
| Fișier | Ce e | Mărime |
|---|---|---|
contafin_oracle.dmp |
schema comună: drepturi, actualizări, NOM_FIRME |
50–280 MB |
FIRMANOUA.dmp |
șablon de firmă goală | ~24 MB |
<FIRMA>.dmp |
o schemă de firmă existentă (doar la migrare) | 100–500 MB |
FIRMANOUA.dmptrebuie să ajungă înC:\DMPDIRla ORICE instalare. Nu e folosit de pașii 01–08, ci mult mai târziu: când clientul adaugă o firmă nouă din aplicație,SYS.NEWSCHEMAîl caută în directorul OracleDMPDIR(sql/sys-objects.sql,lcSchemaSursa := 'FIRMANOUA'). Dacă lipsește, adăugarea firmei pică înDBMS_DATAPUMP.ADD_FILE— peste luni de la instalare, când nimeni nu mai leagă eroarea de instalare.07-verify-installation.ps1raportează lipsa ca eroare.
De unde iei șabloanele
Ambele stau pe LXC 108 (10.0.20.121), în containerul oracle-xe. Sunt trei
niveluri de scos, nu unul: container Docker → LXC 108 → host pvemini → stația ta.
docker cp te scoate doar din container, de aceea e nevoie și de pct pull.
ssh root@10.0.20.201 "pct exec 108 -- docker cp oracle-xe:/tmp/oracle-import-roa2/firmanoua.dmp /tmp/firmanoua.dmp"
ssh root@10.0.20.201 "pct pull 108 /tmp/firmanoua.dmp /tmp/firmanoua.dmp"
scp root@10.0.20.201:/tmp/firmanoua.dmp ./FIRMANOUA.dmp
Identic pentru contafin_oracle.dmp. Numele pe destinație trebuie să fie exact
FIRMANOUA.dmp — SYS.NEWSCHEMA îl construiește ca lcSchemaSursa || '.dmp'.
Mai simplu: ../scripts/build-client-kit.ps1
face exportul, aduce arhivele, redenumește DMP-urile și împachetează tot kitul.
Licențele
Licențele nu vin din DMP-uri. Stau în SYS.AUTH_SERII (seriile, RAW(128),
decriptate de AUTH_PACK) și SYS.AUTH_DETALII (Id-ul de client). Obiectele SYS
nu călătoresc în DMP-ul de schemă.
Fără ele, aplicația pornește și apoi refuză fiecare modul cu „Nu aveti licenta pentru …".
# Prin retea, de pe serverul vechi (doar SELECT - serverul vechi nu se modifica)
Run.cmd 09-copy-licenses.ps1 -OldHost 10.0.0.5 -OldSysPassword parola -Replace
# Daca serverul vechi nu e accesibil din cel nou: ruleaza PE SERVERUL VECHI
sqlplus -S "sys/parola@localhost:1521/XE as sysdba" @sql\export-licente.sql > licente.sql
# apoi, pe serverul nou:
Run.cmd 09-copy-licenses.ps1 -FromFile licente.sql -Replace
Scriptul salvează licențele curente de pe serverul nou în
logs\licente-backup-server-nou_<data>.sql, în același format — se re-importă
cu -FromFile dacă ceva merge prost. După import recreează SEQ_AUTH_SERII
peste MAX(ID_SERIE)+1, altfel prima licență adăugată ulterior ar încălca
PK_AUTH_SERII.
08-post-install-config.ps1 scrie doar AUTH_DETALII (Id-ul de client). O bază
cu Id de client dar fără serii e cazul tipic de migrare făcută pe jumătate —
07-verify-installation.ps1 îl raportează.
Actualizarea aplicațiilor
Mecanismul are două etaje:
- Serverul clientului trage de la ROMFAST. Jobul
CONTAFIN_ORACLE.UPDATEROA_ZILNICapeleazăPACK_UPDATE.UPDATEROA, care descarcă de laSERVER_INFO.UPD_URL_APP(https://update.romfast.ro/roa/) înD:\ROAUPDATE. - Stațiile trag de la serverul clientului, prin HTTP. Pentru asta
D:\ROAUPDATEtrebuie publicat în IIS lahttp://localhost/roaupdate/.
Fără etajul 2, etajul 1 funcționează și nu se vede nimic: stațiile rămân pe versiunile vechi la nesfârșit.
Run.cmd 10-setup-roaupdate-iis.ps1
Scriptul instalează rolul IIS dacă lipsește (Install-WindowsFeature pe Server,
Enable-WindowsOptionalFeature pe Windows Pro — poate cere restart), creează
aplicația /roaupdate în Default Web Site, activează directory browsing,
adaugă tipurile MIME pentru .zip/.xml, dă IIS_IUSRS drept de citire și
verifică la final că URL-ul răspunde 200.
Structura D:\ROAUPDATE:
| Element | Conținut |
|---|---|
<CLIENT>.xml |
manifest cu modulele și versiunile pentru clientul respectiv |
_ARHIVE/<MODUL>/ |
ZIP-urile per versiune (ROACONT-2.11.49.ZIP) |
<MODUL>/ |
binarele curente ale modulului |
_UPDATE/ |
buffer de pregătire |
08-post-install-config.ps1 creează cele 55 de obiecte Oracle DIRECTORY
(UPD_*) care arată în _ARHIVE\<MODUL>. 10-setup-roaupdate-iis.ps1 creează
directoarele fizice de modul de la nivelul de sus. Dacă adaugi un modul, adaugă-l
în ambele scripturi.
Joburile se creează dezactivate. Ca să meargă:
EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATEROA_ZILNIC');
EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATERTVAI_ZILNIC');
Serverul ROMFAST de update e documentat în
../../vm201-windows/docs/vm201-roa-update-server.md.
Exportul zilnic
Run.cmd 11-setup-backup-export.ps1
Pregătește D:\ROA\EXPORT_ORADMP:
- copiază
backupora.exedinbackup\(fără el, pasul se oprește cu eroare); - generează
setari.inidinbackup\setari.ini.template, înlocuind marcajele{{...}}cu valorile reale; - generează
schema.txt:CONTAFIN_ORACLE+ firmele active dinNOM_FIRME(sau îl copiază de pe serverul vechi cu-SchemaFromPath); - creează obiectul Oracle
DIRECTORY BACKUP_ORACLEși dă drepturi serviciului Oracle pe folder; - înregistrează task-ul zilnic ROA Export Oracle în Windows Task Scheduler.
Formatul lui
setari.ininu e cimentat în cod — șablonul e un fișier de date, iar scriptul doar substituie marcajele. Când ai unsetari.inireal care merge, îl pui peste șablon și înlocuiești valorile cu marcajele. Nu modifica PowerShell-ul.
Reluare după faza 2, când firmele există (nu atinge setari.ini sau task-ul):
Run.cmd 11-setup-backup-export.ps1 -SchemaOnly
Verifică prima rulare înainte să pleci de la client:
Start-ScheduledTask -TaskName "ROA Export Oracle"
Get-ScheduledTaskInfo -TaskName "ROA Export Oracle"
Parole standard
| Utilizator | Parolă | Observații |
|---|---|---|
SYS |
romfastsoft |
SYSDBA |
SYSTEM |
romfastsoft |
DBA |
CONTAFIN_ORACLE |
ROMFASTSOFT |
schema comună |
| schemele de firmă | din NOM_FIRME.parola |
citite automat de pasul 05 |
Se schimbă cu config.ps1 (copiază config.example.ps1) sau cu parametri pe
fiecare script. config.ps1 nu se comite — poate conține parolele altui client.
XE față de SE
| XE (gratuit) | SE (licențiat) | |
|---|---|---|
| Arhitectură | CDB + PDB | non-CDB |
| Serviciu | XEPDB1 |
ROA |
| Datafiles | C:\app\oracle\oradata\XE\XEPDB1\ |
C:\app\oracle\oradata\ROA\ |
| Limite | 2 threads, 2 GB RAM, 12 GB date | fără limite |
| Potrivit pentru | testare, clienți mici | producție |
La XE conectează-te întotdeauna la
XEPDB1, niciodată laXE(CDB root).
La instalarea SE: „Create and configure a single instance database", debifezi
„Create as Container database", global database name ROA.
Capcana scripturilor sys_* la migrare
Obiectele deținute de SYS nu călătoresc în DMP-ul de schemă. În schimb,
tabela de versiuni a lui PACK_MIGRARE trăiește în CONTAFIN_ORACLE și vine
cu DMP-ul — iar scripturile sys_* își înregistrează acolo aplicarea
(pack_migrare.UpdateVersiune(..., 'SYS')).
Consecința: pe baza nouă, ROAACTUALIZARI vede scripturile sys_* drept deja
aplicate și le sare, deși în SYS nu există nimic. De aceea obiectele și
granturile SYS se pun la instalare, prin pașii 02 și 04, și nu se așteaptă
de la actualizator.
Script sursă (D:\roa\database\SCRIPTURI_CLAR\) |
Unde e aici |
|---|---|
sys_2026_01_14_01_AUTH_PACK |
sql/sys-objects.sql |
sys_2026_08_08_02_SYS_INFO_TABLESPACE_PURJARE |
sql/sys-objects.sql + sql/scheduler-jobs.sql |
sys_2026_08_03_05_DIAG_SPATIU_GRANT |
sql/sys-grants.sql, secțiunea [5/5] |
sys_2026_08_03_07_DIAG_SPATIU_GRANT2 |
sql/sys-grants.sql, secțiunea [5/5] |
sys_2026_08_06_07_DIAG_SPATIU_GRANT3 |
sql/sys-grants.sql, secțiunea [5/5] |
Secțiunea [5/5] acordă SELECT direct pe 18 vederi de dicționar către
CONTAFIN_ORACLE. Grantul prin rolul DBA nu ajunge: rolurile nu se aplică în
pachetele cu drepturi de definitor, iar CONTAFIN_ORACLE.PACK_DIAG_SPATIU este
exact așa. Fără ele pachetul rămâne INVALID și jobul DIAGSPATIU_ZILNIC nu
rulează.
Un sys_* nou fie se consolidează în sys-objects.sql / sys-grants.sql /
scheduler-jobs.sql, fie se pune în sql/sys-updates/
ca patch post-instalare.
Dezinstalare
Run.cmd 99-uninstall-roa.ps1 -Force
Ciclul de re-testare: 99-uninstall-roa.ps1 -Force → FAZA1.cmd → 07-verify-installation.ps1.
99-uninstall-roa.ps1trebuie să iasă cu codul 0. Orice alt cod înseamnă că au rămas obiecte în bază — uzual o sesiune activă ținea userul ocupat. Nu porni instalarea peste ele.
Depanare
Pasul 03 iese cu codul 5
Normal. E codul Data Pump pentru „completed with errors", din ORA-31684
(userul există deja, creat de pasul 01) și ORA-39082 (warning-uri de compilare,
rezolvate la pasul 04). FAZA1.cmd, FAZA2.cmd și INSTALEAZA.cmd îl tratează
corect.
ORA-12609: importul „eșuează" deși a reușit
Simptom: pasul 03 sau 05 se termină cu UDI-12609 / ORA-12609: TNS: Receive timeout occurred, raportează Objects imported: 0 și iese cu cod nenul. Dar în
logul Data Pump din C:\DMPDIR scrie Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" completed.
Cauză: SQLNET.RECV_TIMEOUT din sqlnet.ora. Fișierul e citit și de clienții
de pe aceeași mașină (impdp, expdp, sqlplus), iar în timpul unui import
serverul poate lucra minute întregi fără să trimită vreun pachet — creare de
indecși, constrângeri. Clientul impdp moare, jobul de pe server continuă și se
termină cu bine, iar scriptul numără obiectele imediat după moartea clientului și
găsește 0.
Pe 21c fișierul care contează e cel din read-only home:
C:\app\<user>\product\21c\homes\OraDB21Home1\network\admin\sqlnet.ora, nu cel
din dbhomeXE.
$f = "C:\app\romfast\product\21c\homes\OraDB21Home1\network\admin\sqlnet.ora"
(Get-Content $f) | Where-Object { $_ -notmatch 'SQLNET\.(RECV|SEND)_TIMEOUT' } | Set-Content $f
SQLNET.INBOUND_CONNECT_TIMEOUT poate rămâne — limitează doar handshake-ul.
Importul care „a eșuat" nu trebuie refăcut dacă logul spune completed; rulează
doar 07-verify-installation.ps1.
ORA-28040 / ORA-01017 / ORA-12514 — cele trei erori de conectare
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.
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.
[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).
.\scripts\01-setup-database.ps1 # scrie sqlnet.ora in ambele locuri
ORA-01017: invalid username/password
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ă:
-- 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
Întâi PDB-ul — pentru XE trebuie deschis și starea salvată:
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.
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 |
|---|---|
ORA-00959: tablespace 'ROA' does not exist |
impdp … REMAP_TABLESPACE=ROA:USERS |
ORA-00959: tablespace 'USERS' does not exist (PDB nou) |
impdp … REMAP_TABLESPACE=USERS:ROA |
ORA-39405: … TSTZ version newer |
folosește DMP-uri exportate din Oracle 18c (TSTZ 31), nu 21c (TSTZ 35) |
ORA-39002 / eroare la deschiderea fișierului |
serviciul Oracle nu are drepturi pe C:\DMPDIR — icacls C:\DMPDIR /grant "NT SERVICE\OracleServiceXE:(OI)(CI)F" /T |
ORA-12954: baza depășește 12 GB (doar XE)
Ghid complet: ../clienti/oracle-xe-21c/depanare-ora-12954-spatiu.md.
Prevenție, la orice instalare XE nouă (conectat la XEPDB1 ca SYS):
EXEC DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);
EXEC DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto space advisor', operation => NULL, window_name => NULL);
NOAUDIT POLICY ORA_SECURECONFIG;
NOAUDIT POLICY ORA_LOGON_FAILURES;
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 8*24*60, interval => 60);
EXEC DBMS_STATS.ALTER_STATS_HISTORY_RETENTION(7);
GRANT EXECUTE ON SYS.DBMS_LOCK TO CONTAFIN_ORACLE;
Serviciile nu pornesc
net stop OracleServiceXE ; net start OracleServiceXE
net stop OracleOraDB21Home1TNSListener ; net start OracleOraDB21Home1TNSListener
Servicii relevante: OracleServiceXE (XE) sau OracleServiceROA (SE), și
OracleOraDB21Home1TNSListener.
drop-contafin.ps1 dă ORA-01940
Userul are sesiuni deschise. Oprește aplicațiile sau reia cu -KillSessions
(FAZA2.cmd /reimportcontafin îl dă deja).
Conectare
# XE - la PDB, niciodata la CDB root
sqlplus system/romfastsoft@localhost:1521/XEPDB1
sqlplus "sys/romfastsoft@localhost:1521/XEPDB1 as sysdba"
# SE
sqlplus system/romfastsoft@localhost:1521/ROA
TNS, pentru clienții care au nevoie de tnsnames.ora:
ROA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <server>)(PORT = 1521))
(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = XEPDB1))
)
Logurile fiecărui pas: logs\<script>_<data>.log.
Documente legate
| Subiect | Fișier |
|---|---|
| Care director se folosește la instalare/migrare | ../docs/instalare-si-migrare-oracle.md |
| Construirea kitului pentru client | ../scripts/build-client-kit.ps1 |
| Serverul ROMFAST de update | ../../vm201-windows/docs/vm201-roa-update-server.md |
| VM 302 — mediul de test pentru acest kit | ../../vm302-oracle-test/README.md |
| Cazuri clienți (depanare DB) | ../clienti/README.md |
| Diagnostic spațiu la clienți | ../../../docs/diagnostic-spatiu-clienti.md |
| Reguli de scris SQL de migrare | ../../../system_instructions/system_prompt.md |