Files
ROMFASTSQL/proxmox/lxc108-oracle/roa-windows-setup/README.md
Marius 7fce925349 feat(oracle): kit de instalare la client + corectarea lipsurilor din instalare
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
2026-08-25 18:05:56 +03:00

33 KiB

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 cu migration/ și new-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.md

Plan 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.dmp trebuie copiat în ambele cazuri, altfel clientul nu va putea adăuga firme noi.

Oracle 21c Express Edition (XE) - Gratuit

  1. Download și instalează Oracle 21c XE (see docs/00-INSTALL-ORACLE-XE.md)
  2. Copiază fișierele DMP în C:\DMPDIR\
  3. Rulează instalarea:
    RunAll.cmd
    
    RunAll.cmd e interactiv — cere confirmare la tastatură. Pentru rulare automată, apelează scripturile în ordine (vezi scenariile A / B).

Oracle 21c Standard Edition (SE) - Licență

  1. 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"
  2. Copiază fișierele DMP în C:\DMPDIR\
  3. 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.dmp trebuie să ajungă în C:\DMPDIR la 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 Oracle DMPDIR (sql/sys-objects.sql, lcSchemaSursa := 'FIRMANOUA'). Dacă lipsește, adăugarea firmei pică în DBMS_DATAPUMP.ADD_FILE — peste luni de la instalare, când nimeni nu mai leagă eroarea de instalare. 07-verify-installation.ps1 verifică 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 ca lcSchemaSursa || '.dmp', cu lcSchemaSursa := '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.ps1 iese 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) și ORA-39082 (warning-uri de compilare, rezolvate la pasul 04). Nu e eșec; citește logul.
  • RunAll.cmd nu poate fi rulat neinteractiv (folosește set /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ă la XE (CDB root).
  • La final 07-verify-installation.ps1 trebuie să iasă cu 0. Cod 1 → citește lista de probleme din raport; FIRMANOUA.dmp missing from DMPDIR e eroare reală în ambele scenarii.
  • Dacă reiei instalarea de la zero, 99-uninstall-roa.ps1 trebuie 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

scp copiază conținutul kitului direct în destinație dacă aceasta nu există, sau kitul ca subdirector dacă există deja. Verifică unde a ajuns înainte să rulezi INSTALEAZA.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:

  1. ROAUPDATE Directories: Creates 54 physical folders and Oracle DIRECTORY objects
  2. SERVER_INFO: Encoded passwords, paths, email settings for PACK_UPDATE
  3. SMTP: setează SMTP_OUT_SERVER și ACL-ul de rețea pentru CONTAFIN_ORACLE
  4. Customer ID: Sets AUTH_DETALII for license verification
  5. Scheduler Jobs: UPDATEROA_ZILNIC and UPDATERTVAI_ZILNIC (disabled by default)

De ce e nevoie de pasul 3: sys-objects.sql instalează UTL_MAIL și sys-grants.sql dă EXECUTE pe el — atât cât să compileze codul care trimite mailuri. Ca să și funcționeze mai trebuie parametrul SMTP_OUT_SERVER (altfel ORA-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, altfel ORA-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:

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.


  • 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