# ROA Oracle Database Setup for Windows > **Nu ești sigur că acesta e directorul potrivit?** > Vezi [`../docs/instalare-si-migrare-oracle.md`](../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`](../../vm302-oracle-test/docs/issues-se-prod.md) | > > Plan testare dual-edition: [`../../vm302-oracle-test/docs/dual-edition-test-plan.md`](../../vm302-oracle-test/docs/dual-edition-test-plan.md). > Mediul de test: [`../../vm302-oracle-test/README.md`](../../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](#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](#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: ```cmd 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: ```cmd RunAll.cmd ``` ### Rulare script individual (dacă e necesar) ```cmd 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`](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`. ```bash # 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`: ```bash scp ./FIRMANOUA.dmp @: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//` 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): ```bash # 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: ```powershell # 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`. ```powershell # 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 "" -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)". ```powershell # 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`. ```powershell # 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 "" -EmailSmtp "mail.romfast.ro" Run.cmd 07-verify-installation.ps1 ``` Verificare intermediară utilă înainte de import (nu modifică nimic): ```powershell 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: ```powershell 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: ```cmd 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`. ```powershell # 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:** ```sql -- 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 ```powershell # 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=`: ```bat 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`. ```powershell # 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): ```sql 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/`](sql/sys-updates/README.md) ca patch post-instalare. --- ## Uninstall / Cleanup To remove all ROA objects and start fresh (useful for testing): ```powershell # 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: ```sql 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: ```powershell # 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:** ```sql 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:** ```powershell lsnrctl status lsnrctl services ``` **For XE, ensure PDB is open:** ```sql 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\\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ă: ```powershell $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:** ```powershell # Use REMAP_TABLESPACE in impdp impdp ... REMAP_TABLESPACE=ROA:USERS ``` **ORA-00959: tablespace 'USERS' does not exist (pe PDB nou):** ```cmd 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):** ```sql -- 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` ```powershell # Restart services net stop OracleServiceXE net start OracleServiceXE net stop OracleOraDB21Home1TNSListener net start OracleOraDB21Home1TNSListener ``` --- ## Connection Strings ### SQL*Plus ```bash # 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/`](../../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`](../../vm302-oracle-test/docs/dual-edition-test-plan.md) - Log erori producție SE (TODO): [`docs/issues-se-prod.md`](../../vm302-oracle-test/docs/issues-se-prod.md) Pentru clonarea unui VM nou de test din template-ul 300: ```bash # 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