Blocul de instalare/migrare Oracle 21c XE, terminat si validat pe VM 302. Kit de instalare (nou) scripts/build-client-kit.ps1 exporta CONTAFIN_ORACLE si FIRMANOUA de pe LXC 108 (PDB ROA2, nu ROA - ROA e productia ROA_CENTRAL), le aduce local prin cele trei hopuri container -> LXC -> host -> statie, le redenumeste la numele pe care le asteapta scripturile si le impacheteaza cu o copie a directorului roa-windows-setup. Citeste logul expdp si raporteaza cate firme are NOM_FIRME, ca sa nu plece din greseala datele unui client. roa-windows-setup/INSTALEAZA.cmd ruleaza pasii 01..08 fara "set /p", deci merge si prin SSH - RunAll.cmd nu poate fi rulat neinteractiv. Trateaza corect codul 5 de la pasul 03 si se opreste la prima eroare reala. Corectii 01-setup-database.ps1 nu mai scrie SQLNET.RECV_TIMEOUT / SEND_TIMEOUT in sqlnet.ora. Le hardcoda la 30 s, iar fisierul e citit si de impdp: in timpul unui import serverul poate lucra minute fara sa trimita un pachet, clientul murea cu ORA-12609 iar scriptul raporta esec pentru un import care se terminase cu bine pe server. Reprodus si reparat pe VM 302. 01-setup-database.ps1: Step 4c optional (-ResetSystemPassword) care curata EXPIRED(GRACE) pe SYSTEM in CDB root; ALTER PROFILE opreste expirarile viitoare dar nu reseteaza un cont deja intrat in gratie. uninstall-roa.sql: retry la DROP USER dupa KILL SESSION, plus un bloc final de verdict care numara ce a ramas si iese cu ORA-20900 daca baza nu e curata. Pana acum toate sectiunile prindeau exceptiile in WHEN OTHERS si scriptul tiparea "UNINSTALL COMPLETE" chiar si cand un user supravietuise, iar instalarea urmatoare dadea ORA-31684 in lant. 99-uninstall-roa.ps1 propaga codul de iesire. 08-post-install-config.ps1: Step 7b seteaza SMTP_OUT_SERVER si ACL-ul de retea pentru CONTAFIN_ORACLE. UTL_MAIL se instala si primea EXECUTE, adica destul cat sa compileze, dar nu si cat sa trimita. Privilegiul resolve nu accepta interval de porturi (ORA-24244), deci se acorda separat de connect. 07-verify-installation.ps1: sectiune noua care verifica prezenta lui FIRMANOUA.dmp in DMPDIR si o raporteaza ca eroare daca lipseste. Fara el, adaugarea unei firme noi pica in DBMS_DATAPUMP.ADD_FILE peste luni de la instalare, cand nimeni nu mai leaga eroarea de instalare. configure-profile.sql: antetul spune ca e unealta de remediere manuala, nu parte din flux; pas nou la final pentru CDB root. Documentatie README-ul roa-windows-setup descrie acum explicit cele doua scenarii - instalare pe curat si migrare - de unde se iau DMP-urile sablon, si capcana ORA-12609. Handoff-urile de sesiune au fost sterse; ce era durabil in ele a intrat in README-uri si in docs/diagnostic-spatiu-clienti.md. Validare pe VM 302: ciclu complet din kit, instalare pe curat, verificarea finala "[OK] All checks passed!". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
ROA Oracle Database Setup for Windows
Nu ești sigur că acesta e directorul potrivit? Vezi
../docs/instalare-si-migrare-oracle.md— compară acest director cumigration/șinew-roa-oracle-server/și conține arborele de decizie.
Status testare ediții Oracle 21c:
Ediție Status Mediu validat XE (CDB/PDB) OK VM 302 ( oracle-test-302, 10.0.20.130)Standard Edition (non-CDB) TODO — netestat în mediu de test În producție au apărut erori, neînregistrate. Vezi ../../vm302-oracle-test/docs/issues-se-prod.mdPlan testare dual-edition:
../../vm302-oracle-test/docs/dual-edition-test-plan.md. Mediul de test:../../vm302-oracle-test/README.md.
Overview
Scripts and documentation for setting up ROA Oracle Database on Windows servers:
| Scenario | Description |
|---|---|
| A. Instalare pe curat | Client nou, fără firme anterioare. Pornești din șabloanele contafin_oracle.dmp + FIRMANOUA.dmp |
| B. Migrare | Client cu Oracle XE 11 / 10g. Aduci contafin_oracle.dmp al clientului + câte un .dmp per firmă |
| Add Company | Firmă nouă pe un server deja instalat (normal din aplicație, prin SYS.NEWSCHEMA) |
Ambele instalări rulează aceleași scripturi în aceeași ordine — diferă doar ce pui în
C:\DMPDIR. Pașii detaliați: Cele două scenarii de instalare.
Prerequisites
- Windows Server 2016+ or Windows 10/11
- Oracle 21c Standard Edition or Express Edition installed
- Administrator privileges
- PowerShell 5.1+
- Minimum 8GB RAM (16GB recommended for SE)
- 50GB free disk space
Quick Start
Care fișiere
.dmpîți trebuie depinde de scenariu (A pe curat / B migrare) — vezi DMP Files Required.FIRMANOUA.dmptrebuie copiat în ambele cazuri, altfel clientul nu va putea adăuga firme noi.
Oracle 21c Express Edition (XE) - Gratuit
- Download și instalează Oracle 21c XE (see
docs/00-INSTALL-ORACLE-XE.md) - Copiază fișierele DMP în
C:\DMPDIR\ - Rulează instalarea:
RunAll.cmdRunAll.cmde interactiv — cere confirmare la tastatură. Pentru rulare automată, apelează scripturile în ordine (vezi scenariile A / B).
Oracle 21c Standard Edition (SE) - Licență
- Download și instalează Oracle 21c SE (see
docs/00-INSTALL-ORACLE-SE.md)- În wizard: "Create and configure a single instance database"
- Global database name:
ROA - Debifează "Create as Container database"
- Copiază fișierele DMP în
C:\DMPDIR\ - Rulează instalarea:
RunAll.cmd
Rulare script individual (dacă e necesar)
Run.cmd 01-setup-database.ps1
Run.cmd 07-verify-installation.ps1
Configuration
Copy config.example.ps1 to config.ps1 and edit:
| Parameter | XE Value | SE Value |
|---|---|---|
ORACLE_HOME |
C:\app\oracle\product\21c\dbhomeXE |
C:\app\oracle\product\21c\dbhome_1 |
SERVICE_NAME |
XEPDB1 |
ROA |
DATAFILE_DIR |
C:\app\oracle\oradata\XE\XEPDB1 |
C:\app\oracle\oradata\ROA |
Directory Structure
roa-windows-setup/
├── README.md # This file
├── config.example.ps1 # Configuration template
├── Run.cmd # Script runner (handles ExecutionPolicy)
├── RunAll.cmd # Complete installation runner
│
├── docs/ # Installation guides
│ ├── 00-INSTALL-ORACLE-XE.md # Oracle 21c XE installation
│ └── 00-INSTALL-ORACLE-SE.md # Oracle 21c SE installation
│
├── scripts/ # PowerShell setup scripts
│ ├── 01-setup-database.ps1 # Tablespace, profile, CONTAFIN_ORACLE user
│ ├── 02-create-sys-objects.ps1# SYS objects (AUTH_PACK, NEWSCHEMA, etc.)
│ ├── 03-import-contafin.ps1 # Import CONTAFIN_ORACLE schema
│ ├── 04-create-synonyms-grants.ps1 # Public synonyms, grants + sys-grants.sql
│ ├── 05-import-companies.ps1 # Batch import company schemas
│ ├── 06-add-company.ps1 # Add new company to existing server
│ ├── 07-verify-installation.ps1# Verify installation completeness
│ ├── 08-post-install-config.ps1# ROAUPDATE folders, SERVER_INFO, jobs
│ └── 99-uninstall-roa.ps1 # Uninstall/cleanup script
│
├── config/ # Configuration templates
│ └── sqlnet.ora # Compatibility for Instant Client 10/11
│
├── par/ # Data Pump parameter files
│ ├── import-contafin.par # CONTAFIN_ORACLE import parameters
│ └── import-company.par # Company schema import template
│
├── sql/ # SQL scripts
│ ├── create-tablespace.sql # ROA tablespace creation
│ ├── create-user-contafin.sql # CONTAFIN_ORACLE user creation
│ ├── create-user-company.sql # Company user template
│ ├── configure-profile.sql # Profile settings
│ ├── sys-objects.sql # SYS custom objects (AUTH_PACK, etc.)
│ ├── synonyms-public.sql # Public synonyms for CONTAFIN_ORACLE
│ ├── grants-public.sql # Public grants
│ ├── directories-roaupdate.sql # 54 DIRECTORY objects for PACK_UPDATE
│ ├── server-info-init.sql # SERVER_INFO configuration
│ ├── scheduler-jobs.sql # UPDATEROA_ZILNIC, UPDATERTVAI_ZILNIC
│ ├── auth-detalii-init.sql # Customer ID for licensing
│ ├── verify-objects.sql # Verification queries
│ └── uninstall-roa.sql # Cleanup script (removes all ROA objects)
│
└── test/ # Testing scripts
└── clone-vm300.sh # Proxmox VM cloning for testing
Scripts Overview
| Script | Purpose | Required |
|---|---|---|
01-setup-database.ps1 |
Create tablespace ROA, configure profile, create CONTAFIN_ORACLE user | Yes |
02-create-sys-objects.ps1 |
Install SYS objects: AUTH_PACK, NEWSCHEMA, EXECUTESCRIPTOS, UTL_MAIL | Yes |
03-import-contafin.ps1 |
Import CONTAFIN_ORACLE schema from DMP | Yes |
04-create-synonyms-grants.ps1 |
Public synonyms + grants for CONTAFIN_ORACLE, then sys-grants.sql (SYS grants, SYS synonyms, DMPDIR, data dictionary reads for PACK_DIAG_SPATIU) |
Yes |
05-import-companies.ps1 |
Batch import company schemas from DMP files | Yes |
06-add-company.ps1 |
Add new company to existing server | Optional |
07-verify-installation.ps1 |
Verify installation completeness (objects, grants, synonyms) | Yes |
08-post-install-config.ps1 |
ROAUPDATE directories, SERVER_INFO, scheduler jobs, licensing | Yes |
99-uninstall-roa.ps1 |
Remove all ROA objects (cleanup for re-testing) | Optional |
Architecture Differences
Oracle 21c Standard Edition (non-CDB) - RECOMANDAT pentru producție
Traditional single-database architecture (legacy compatibility).
| Feature | Value |
|---|---|
| Architecture | Single database (non-CDB) |
| Database Name | ROA |
| Service Name | ROA |
| SID | ROA |
| Connection | system/pass@ROA |
| Datafiles | C:\app\oracle\oradata\ROA\ |
La instalare:
- Selectezi "Create and configure a single instance database"
- Debifezi "Create as Container database"
- Global database name:
ROA - Wizard-ul creează baza de date automat (~30-45 min)
Avantaje:
- Fără limitări de resurse (RAM, CPU, spațiu)
- Administrare simplă
- Compatibil cu scripturi de migrare Oracle 10g
- Fără overhead PDB
Oracle 21c Express Edition (CDB/PDB) - Gratuit, pentru testare
Modern multitenant architecture with Container Database.
| Feature | Value |
|---|---|
| Architecture | Container + Pluggable Database |
| CDB Name | XE |
| PDB Name | XEPDB1 |
| Service Name | XEPDB1 (for applications) |
| Connection | system/pass@XEPDB1 |
| Datafiles | C:\app\oracle\oradata\XE\XEPDB1\ |
La instalare:
- Rulezi installer-ul XE
- Baza de date se creează automat (CDB: XE + PDB: XEPDB1)
- Nu ai opțiunea non-CDB (XE suportă doar CDB)
Avantaje:
- Licență gratuită
- Instalare rapidă
- Ideal pentru dezvoltare/testare
Limitări XE:
- Max 2 CPU threads
- Max 2 GB RAM
- Max 12 GB date utilizator
Connection Warning:
Conectează-te întotdeauna la XEPDB1 (PDB), NU la XE (CDB root) pentru operații ROA!
Standard Passwords
| User | Password | Notes |
|---|---|---|
| SYS | romfastsoft | SYSDBA |
| SYSTEM | romfastsoft | DBA |
| CONTAFIN_ORACLE | ROMFASTSOFT | Common schema |
| Company schemas | From NOM_FIRME.parola | See company-specific config |
Security Note: Change passwords in production environments!
DMP Files Required
Care fișiere îți trebuie depinde de scenariu. Alege întâi scenariul:
| Scenariu | Când | DMP-uri necesare |
|---|---|---|
| A. Instalare pe curat | Client nou, fără firme anterioare | contafin_oracle.dmp (șablon) + FIRMANOUA.dmp (șablon) |
| B. Migrare | Client cu Oracle XE mai vechi, are deja date | contafin_oracle.dmp al clientului + câte un .dmp per firmă + FIRMANOUA.dmp (șablon) |
| File | Description | Size |
|---|---|---|
contafin_oracle.dmp |
Schema comună (drepturi, actualizări, NOM_FIRME) |
~50-280 MB |
FIRMANOUA.dmp |
Șablon de firmă goală. Sursa din care SYS.NEWSCHEMA și 06-add-company.ps1 creează orice firmă nouă |
~24 MB |
[company].dmp |
Schema unei firme existente (doar la migrare, una per firmă) | ~100-500 MB fiecare |
FIRMANOUA.dmptrebuie să ajungă înC:\DMPDIRla ORICE instalare, și la A și la B. Nu e folosit de scripturile 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.ps1verifică prezența lui și raportează lipsa ca eroare.
De unde iei DMP-urile șablon
Ambele stau pe LXC 108 (central-oracle, 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, iar scp root@10.0.20.201:/tmp/... citește de pe
host, unde fișierul încă nu a ajuns — de aceea e nevoie și de pct pull.
# 1. container oracle-xe -> LXC 108 (fisierul ajunge in /tmp AL CONTAINERULUI 108)
ssh root@10.0.20.201 "pct exec 108 -- docker cp oracle-xe:/tmp/oracle-import-roa2/firmanoua.dmp /tmp/firmanoua.dmp"
# 2. LXC 108 -> host pvemini
ssh root@10.0.20.201 "pct pull 108 /tmp/firmanoua.dmp /tmp/firmanoua.dmp"
# 3. host -> statia ta
scp root@10.0.20.201:/tmp/firmanoua.dmp ./FIRMANOUA.dmp
Identic pentru contafin_oracle.dmp (înlocuiește numele în toți cei trei pași).
Apoi copiezi fișierele pe serverul clientului, în C:\DMPDIR:
scp ./FIRMANOUA.dmp <user>@<server-client>:C:/DMPDIR/FIRMANOUA.dmp
Numele fișierului pe destinație trebuie să fie
FIRMANOUA.dmp—SYS.NEWSCHEMAîl construiește calcSchemaSursa || '.dmp', culcSchemaSursa := 'FIRMANOUA'. În container fișierul e cu litere mici (firmanoua.dmp); pe Windows nu contează, dar redenumește-l oricum ca să fie clar.
Copie identică există și în /opt/oracle/admin/XE/dpdump/<GUID-PDB>/ din același container.
contafin_oracle.dmp de acolo este varianta curată: NOM_FIRME are doar rândul-sămânță
(FIRMA = 0, fără schemă) plus o firmă marcată ștearsă — deci
07-verify-installation.ps1 nu va raporta firme lipsă după instalare.
Obtaining DMP Files
Export from existing Oracle 18c server (for compatibility):
# From LXC 108 (Oracle 18c - port 1522)
docker exec oracle18-xe expdp system/romfastsoft@localhost:1521/XEPDB1 \
SCHEMAS=CONTAFIN_ORACLE DIRECTORY=DMPDIR DUMPFILE=contafin_oracle.dmp \
LOGFILE=export_contafin.log VERSION=11.2
Copy to Windows:
# Using SCP from WSL/Linux
scp root@10.0.20.201:/opt/oracle18/oradata/dmpdir/contafin_oracle.dmp C:\DMPDIR\
Workflow Examples
Cele două scenarii de instalare
Ambele rulează aceleași scripturi, în aceeași ordine. Diferența e doar în ce pui în
C:\DMPDIR înainte de a porni și ce faci după pasul 07.
Scenariul A — instalare pe curat (client nou, fără firme anterioare)
Pornești de la șabloanele de pe LXC 108. NOM_FIRME vine practic goală, deci pasul 05 nu are
ce importa — îl lași să ruleze, iese cu 0 și „No companies found in NOM_FIRME". Prima firmă o
creezi la final, din șablonul FIRMANOUA.dmp.
# 1. Instalezi Oracle 21c XE (vezi docs/00-INSTALL-ORACLE-XE.md)
# Parola SYS/SYSTEM la instalare: romfastsoft
# 2. Configurare
Copy-Item config.example.ps1 config.ps1
notepad config.ps1 # SERVICE_NAME=XEPDB1 pentru XE, ROA pentru SE
# 3. DMP-urile SABLON (vezi "De unde iei DMP-urile sablon")
mkdir C:\DMPDIR
Copy-Item \\server\sabloane\contafin_oracle.dmp C:\DMPDIR\
Copy-Item \\server\sabloane\FIRMANOUA.dmp C:\DMPDIR\
# 4. Instalarea propriu-zisa
Run.cmd 01-setup-database.ps1
Run.cmd 02-create-sys-objects.ps1
Run.cmd 03-import-contafin.ps1 # cod de iesire 5 = NORMAL, vezi mai jos
Run.cmd 04-create-synonyms-grants.ps1
Run.cmd 05-import-companies.ps1 # no-op: NOM_FIRME e goala
Run.cmd 08-post-install-config.ps1 -CustomerId "<id-client>" -EmailSmtp "mail.romfast.ro"
Run.cmd 07-verify-installation.ps1
Pasul 5 — prima firmă — se face din aplicația ROA, nu din scripturi. Aplicația inserează
firma în CONTAFIN_ORACLE.NOM_FIRME și apoi apelează SYS.NEWSCHEMA(schema, luna, an), care
creează userul și îi importă structura din FIRMANOUA.dmp (DMPDIR). De asta fișierul
rămâne în C:\DMPDIR după instalare — e folosit la fiecare firmă nouă, oricând.
06-add-company.ps1 este calea manuală, de depanare: creează schema și îi importă șablonul,
dar nu scrie în NOM_FIRME. Dacă îl folosești, firma nu apare în aplicație până nu o
înregistrezi tu, iar 07-verify-installation.ps1 o raportează ca „Orphan schema (not in
NOM_FIRME)".
# doar daca ai nevoie de calea manuala:
Run.cmd 06-add-company.ps1 -CompanyName "FIRMACLIENT" -TemplateDump "C:\DMPDIR\FIRMANOUA.dmp" -TemplateSchema "FIRMANOUA"
# ...urmat de inregistrarea firmei in CONTAFIN_ORACLE.NOM_FIRME
Scenariul B — migrare de pe un Oracle XE mai vechi
Ai contafin_oracle.dmp al clientului (cu NOM_FIRME populată) plus câte un .dmp per
firmă. Pasul 05 citește NOM_FIRME din schema deja importată la pasul 03 și potrivește
fiecare firmă cu fișierul ei din C:\DMPDIR.
# 0. Export de pe serverul VECHI - vezi "Migrare de la un server client existent" mai jos.
# Lista schemelor: SELECT schema FROM CONTAFIN_ORACLE.NOM_FIRME WHERE sters = 0;
# 1-2. Ca la scenariul A (instalare Oracle + config.ps1)
# 3. DMP-urile CLIENTULUI + sablonul de firma noua
mkdir C:\DMPDIR
Copy-Item D:\export-client\contafin_oracle.dmp C:\DMPDIR\
Copy-Item D:\export-client\*.dmp C:\DMPDIR\ # cate unul per firma
Copy-Item \\server\sabloane\FIRMANOUA.dmp C:\DMPDIR\ # NU vine de la client!
# 4. Aceeasi ordine, aceleasi scripturi
Run.cmd 01-setup-database.ps1
Run.cmd 02-create-sys-objects.ps1
Run.cmd 03-import-contafin.ps1 # aduce NOM_FIRME cu firmele clientului
Run.cmd 04-create-synonyms-grants.ps1
Run.cmd 05-import-companies.ps1 # importa toate firmele gasite in NOM_FIRME
Run.cmd 08-post-install-config.ps1 -CustomerId "<id-client>" -EmailSmtp "mail.romfast.ro"
Run.cmd 07-verify-installation.ps1
Verificare intermediară utilă înainte de import (nu modifică nimic):
Run.cmd 05-import-companies.ps1 -DryRun # arata ce firma se leaga de ce fisier
Numele fișierului nu trebuie să fie identic cu schema — pasul 05 potrivește NOM_FIRME.SCHEMA
cu fișierele din director, deci capidavatour_72001.dmp se leagă de schema CAPIDAVATOUR.
Ce e comun ambelor scenarii
03-import-contafin.ps1iese cu codul 5 și asta e normal — e codul Data Pump pentru „completed with errors":ORA-31684 ... already exists(userul e creat deja de pasul 01) șiORA-39082(warning-uri de compilare, rezolvate la pasul 04). Nu e eșec; citește logul.RunAll.cmdnu poate fi rulat neinteractiv (foloseșteset /p). Pe stdin redirecționat fie anulează instalarea ieșind cu codul 0, fie dă „The syntax of the command is incorrect". Pentru automatizare apelează scripturile în ordine, ca mai sus.- Conectarea se face la
XEPDB1, niciodată laXE(CDB root). - La final
07-verify-installation.ps1trebuie să iasă cu 0. Cod1→ citește lista de probleme din raport;FIRMANOUA.dmp missing from DMPDIRe eroare reală în ambele scenarii. - Dacă reiei instalarea de la zero,
99-uninstall-roa.ps1trebuie să iasă cu 0. Cod diferit de 0 înseamnă că au rămas obiecte (uzual o sesiune activă ținea userul ocupat) — nu porni instalarea, altfel pasul 05 dăORA-31684în lanț.
Kit de instalare pentru client (recomandat)
În loc să aduni manual DMP-urile și scripturile, construiește un kit gata de dus la client:
cd proxmox\lxc108-oracle\scripts
.\build-client-kit.ps1 -Zip
Scriptul exportă CONTAFIN_ORACLE și FIRMANOUA de pe LXC 108 (PDB ROA2, nu ROA — ROA e
producția ROA_CENTRAL), le aduce local prin cele trei hopuri, le redenumește la
contafin_oracle.dmp / FIRMANOUA.dmp și le pune lângă o copie a scripturilor de instalare.
Verifică și câte firme are NOM_FIRME în dump, citind logul expdp. Un șablon curat are 2
rânduri; dacă vezi zeci, ai prins din greșeală datele unei baze reale și nu ai voie s-o trimiți
mai departe.
Kitul are structura lui roa-windows-setup/ plus DMPDIR/, deci se dezarhivează pe serverul
clientului și se rulează direct:
INSTALEAZA.cmd curat 138 mail.romfast.ro
INSTALEAZA.cmd migrare 214
INSTALEAZA.cmd face ce face RunAll.cmd, dar fără set /p — deci merge și prin SSH, fără
tastatură. Copiază DMP-urile în C:\DMPDIR, dă drepturi contului NT SERVICE\OracleServiceXE,
rulează pașii în ordine, tratează corect codul 5 de la pasul 03 și se oprește la prima eroare
reală.
Opțiuni utile:
| Parametru | Ce face |
|---|---|
-SkipExport |
Refolosește ultimele arhive de pe LXC 108, fără export nou |
-Zip |
Produce și o arhivă .zip de trimis |
-PushTo "user@host:C:/kit" |
Trimite kitul direct pe serverul țintă, prin scp |
-OracleVersion 18 |
Exportă din oracle18-xe (VERSION=11.2), pentru baze mai vechi |
scpcopiază conținutul kitului direct în destinație dacă aceasta nu există, sau kitul ca subdirector dacă există deja. Verifică unde a ajuns înainte să ruleziINSTALEAZA.cmd.
Fluxul complet, kit → instalare pe curat → [OK] All checks passed!, e validat pe VM 302
(2026-08-25).
Post-Installation Configuration (08-post-install-config.ps1)
This script completes the ROA setup by configuring:
- ROAUPDATE Directories: Creates 54 physical folders and Oracle DIRECTORY objects
- SERVER_INFO: Encoded passwords, paths, email settings for PACK_UPDATE
- SMTP: setează
SMTP_OUT_SERVERși ACL-ul de rețea pentruCONTAFIN_ORACLE - Customer ID: Sets AUTH_DETALII for license verification
- Scheduler Jobs: UPDATEROA_ZILNIC and UPDATERTVAI_ZILNIC (disabled by default)
De ce e nevoie de pasul 3:
sys-objects.sqlinstaleazăUTL_MAILșisys-grants.sqldăEXECUTEpe el — atât cât să compileze codul care trimite mailuri. Ca să și funcționeze mai trebuie parametrulSMTP_OUT_SERVER(altfelORA-29278/29279) și un ACL de rețea către serverul SMTP (din 12c încoace orice acces de rețea din PL/SQL trece prin ACL, altfelORA-24247). Ambele se pun aici; sari peste cu-SkipSmtpConfig.
# Basic usage (defaults: D:\ROAUPDATE, no Customer ID)
.\08-post-install-config.ps1
# With custom ROAUPDATE path and Customer ID
.\08-post-install-config.ps1 -RoaUpdatePath "E:\ROAUPDATE" -CustomerId "138"
# With email configuration (seteaza si SMTP_OUT_SERVER + ACL)
.\08-post-install-config.ps1 -EmailTo "admin@company.ro" -EmailSmtp "mail.company.ro" -EmailPort 25
# Skip specific parts
.\08-post-install-config.ps1 -SkipSchedulerJobs -SkipServerInfo -SkipSmtpConfig
Enable automatic updates after verification:
-- Enable daily update job
EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATEROA_ZILNIC');
-- Run update manually for testing
EXEC DBMS_SCHEDULER.RUN_JOB('CONTAFIN_ORACLE.UPDATEROA_ZILNIC');
Add New Company
# Copy company DMP
Copy-Item \\server\dmp\NEWCOMPANY.dmp C:\DMPDIR\
# Run add company script
.\06-add-company.ps1 -CompanyName "NEWCOMPANY" -Password "ROMFASTSOFT"
Migrare de la un server client existent (Oracle XE 11 / 10g)
Exportul de pe sursă nu e automatizat aici — scripturile presupun DMP-urile deja în
C:\DMPDIR\ pe serverul nou.
Sursa Oracle XE 11.2. impdp din 21c acceptă direct seturile Data Pump produse de 11.2,
deci fără VERSION=:
REM pe serverul sursă, ca SYSTEM
sqlplus system/parola@XE
CREATE OR REPLACE DIRECTORY DMPDIR AS 'C:\DMPDIR';
GRANT READ, WRITE ON DIRECTORY DMPDIR TO SYSTEM;
expdp system/parola@XE SCHEMAS=CONTAFIN_ORACLE DIRECTORY=DMPDIR ^
DUMPFILE=contafin_oracle.dmp LOGFILE=export_contafin.log
expdp system/parola@XE SCHEMAS=FIRMA1,FIRMA2 DIRECTORY=DMPDIR ^
DUMPFILE=firme_%U.dmp LOGFILE=export_firme.log PARALLEL=2
REM ^ %U e substituția Data Pump; din interiorul unui fișier .bat se scrie %%U
Lista schemelor se ia din CONTAFIN_ORACLE.NOM_FIRME (WHERE sters = 0) — aceeași listă pe
care 07-verify-installation.ps1 o compară apoi cu schemele existente.
Sursa Oracle 10g cu exp clasic. Formatele exp/expdp nu sunt interschimbabile: un
fișier produs cu exp se importă cu imp, nu cu impdp.
# 1. Export de pe sursă (exp clasic)
exp system/password@ORCL file=C:\backup\COMPANY.dmp owner=COMPANY
# 2. Import
imp system/password@XEPDB1 file=C:\DMPDIR\COMPANY.dmp fromuser=COMPANY touser=COMPANY
Înainte de a porni: verifică plafonul XE (12 GB date de utilizator pe 21c XE, față de 11 GB pe 11.2 XE):
SELECT ROUND(SUM(bytes)/1024/1024/1024, 2) AS gb
FROM dba_segments
WHERE owner NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP','XDB','APEX_040000');
Scripturile sys_* la o migrare — capcana tabelei de versiuni
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 02-create-sys-objects.ps1 și 04-create-synonyms-grants.ps1, și nu se
așteaptă de la actualizator.
Ce e consolidat unde:
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ă.
07-verify-installation.ps1 raportează care dintre cele 18 lipsesc.
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.
Uninstall / Cleanup
To remove all ROA objects and start fresh (useful for testing):
# Interactive (with confirmation)
.\scripts\99-uninstall-roa.ps1 -SystemPassword "romfastsoft"
# Force (no confirmation)
.\scripts\99-uninstall-roa.ps1 -SystemPassword "romfastsoft" -Force
Or run the SQL script directly:
sqlplus sys/romfastsoft@localhost:1521/XEPDB1 as sysdba @sql/uninstall-roa.sql
This removes:
- All company user schemas (using ROA tablespace)
- CONTAFIN_ORACLE user and all objects
- Public synonyms pointing to CONTAFIN_ORACLE
- SYS custom objects (AUTH_PACK, AUTH_SERII, INFO, etc.)
- Application context SESIUNE
- Tablespace ROA (including datafile)
Warning: This permanently deletes all ROA data! Use only for testing or before reinstallation.
Verifică întotdeauna codul de ieșire. Fiecare secțiune a scriptului prinde excepțiile în
WHEN OTHERS ca să nu se oprească la primul obstacol, deci mesajele intermediare nu spun dacă
a reușit. Verdictul e dat de blocul final, care numără ce a rămas:
| Cod | Înseamnă |
|---|---|
0 |
Baza e curată. Poți relua instalarea. |
≠ 0 |
ORA-20900 — au rămas obiecte ROA. Nu porni instalarea. |
Cauza uzuală a unei dezinstalări incomplete e o sesiune activă care ține userul ocupat
(ORA-01940); scriptul mai încearcă o dată după KILL SESSION, dar dacă aplicația ROA e
pornită nu are ce face. Închide aplicația și sesiunile sqlplus, apoi rulează din nou.
Dacă ignori codul de ieșire și pornești instalarea peste o dezinstalare parțială, pasul 05 dă
ORA-31684 ... already exists în lanț.
Troubleshooting
ORA-28040: No matching authentication protocol
Problem: Old clients (Instant Client 10/11) cannot connect to Oracle 21c.
Solution: Configure sqlnet.ora for backward compatibility:
# Copy sqlnet.ora template
Copy-Item config\sqlnet.ora $env:ORACLE_HOME\network\admin\sqlnet.ora
# Restart listener
lsnrctl reload
ORA-01017: invalid username/password
After configuring sqlnet.ora for old clients, reset passwords:
ALTER USER CONTAFIN_ORACLE IDENTIFIED BY ROMFASTSOFT;
ALTER USER [COMPANY] IDENTIFIED BY [PASSWORD];
ORA-12514: TNS:listener does not currently know of service
Check listener status:
lsnrctl status
lsnrctl services
For XE, ensure PDB is open:
ALTER SESSION SET CONTAINER = XEPDB1;
ALTER PLUGGABLE DATABASE XEPDB1 OPEN;
ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE;
ORA-12609: TNS Receive timeout — importul „eșuează" deși a reușit
Simptom: 03-import-contafin.ps1 (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 în 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 Oracle 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.
Rezolvare: scoate SQLNET.RECV_TIMEOUT și SQLNET.SEND_TIMEOUT. 01-setup-database.ps1 nu
le mai scrie (le hardcoda pe amândouă la 30 s), dar o instalare mai veche le poate avea încă:
$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 de conectare.
Importul care „a eșuat" nu trebuie refăcut dacă logul spune completed; rulează doar
07-verify-installation.ps1 ca să confirmi.
Import Errors
ORA-00959: tablespace 'ROA' does not exist:
# Use REMAP_TABLESPACE in impdp
impdp ... REMAP_TABLESPACE=ROA:USERS
ORA-00959: tablespace 'USERS' does not exist (pe PDB nou):
REM PDB-ul nou din PDB$SEED nu are tablespace USERS. Remapeaza la ROA:
impdp "sys/pass@XEPDB1 AS SYSDBA" ... remap_tablespace=USERS:ROA
ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version newer:
Use DMP files exported from Oracle 18c (TSTZ 31) instead of Oracle 21c (TSTZ 35).
ORA-12954: Database exceeds 12 GB (XE only)
See ../clienti/oracle-xe-21c/depanare-ora-12954-spatiu.md for full troubleshooting guide.
Prevention (run on every new XE installation):
-- Connect to XEPDB1 as 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;
Service Not Starting
Check Windows Services:
OracleServiceXE(for XE)OracleServiceROA(for SE)OracleOraDB21Home1TNSListener
# Restart services
net stop OracleServiceXE
net start OracleServiceXE
net stop OracleOraDB21Home1TNSListener
net start OracleOraDB21Home1TNSListener
Connection Strings
SQL*Plus
# Oracle XE (connect to PDB)
sqlplus system/romfastsoft@localhost:1521/XEPDB1
sqlplus CONTAFIN_ORACLE/ROMFASTSOFT@localhost:1521/XEPDB1
# Oracle SE (connect to database)
sqlplus system/romfastsoft@localhost:1521/ROA
sqlplus CONTAFIN_ORACLE/ROMFASTSOFT@localhost:1521/ROA
JDBC
# Oracle XE
jdbc:oracle:thin:@localhost:1521/XEPDB1
# Oracle SE
jdbc:oracle:thin:@localhost:1521/ROA
ODBC (Instant Client)
| Parameter | XE Value | SE Value |
|---|---|---|
| Host | localhost | localhost |
| Port | 1521 | 1521 |
| Service Name | XEPDB1 | ROA |
| User | CONTAFIN_ORACLE | CONTAFIN_ORACLE |
| Password | ROMFASTSOFT | ROMFASTSOFT |
TNS Entry
# For Oracle XE
ROA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = XEPDB1))
)
# For Oracle SE
ROA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = ROA))
)
Testing
Mediul de test dedicat: VM 302 (oracle-test-302, 10.0.20.130, pvemini).
Vezi ../../vm302-oracle-test/ pentru:
- Quick start (start/stop/connect VM, RDP/SSH)
- Workflow snapshots și clonare pentru testare paralelă
- Plan testare dual-edition XE + SE:
docs/dual-edition-test-plan.md - Log erori producție SE (TODO):
docs/issues-se-prod.md
Pentru clonarea unui VM nou de test din template-ul 300:
# On Proxmox host (pvemini)
./test/clone-vm300.sh 301 # Creates VM 301 from template 300
See test/clone-vm300.sh for details.
Related Documentation
- Oracle LXC 108 (Docker):
../README.md - Migration Oracle 10g -> 21c:
../migration/README.md - SQL Migration Guidelines:
/system_instructions/system_prompt.md - Proxmox Infrastructure:
../../README.md
Last Updated: 2026-01-28 Author: Marius Mutu Project: ROMFASTSQL - ROA Oracle Database Windows Setup