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
This commit is contained in:
Marius
2026-08-25 18:05:56 +03:00
parent 3a7e751fc1
commit 7fce925349
17 changed files with 3329 additions and 1753 deletions

View File

@@ -21,9 +21,12 @@ Scripts and documentation for setting up ROA Oracle Database on Windows servers:
| Scenario | Description |
|----------|-------------|
| **New Server** | Oracle 21c SE (non-CDB) or XE (CDB/PDB) + CONTAFIN_ORACLE.dmp |
| **Migration** | Import existing DMP files (CONTAFIN_ORACLE + 30-50 companies), inclusiv de pe Oracle XE 11 / 10g |
| **Add Company** | Add new company schema to existing server |
| **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).
---
@@ -40,6 +43,10 @@ Scripts and documentation for setting up ROA Oracle Database on Windows servers:
## 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\`
@@ -47,6 +54,8 @@ Scripts and documentation for setting up ROA Oracle Database on Windows servers:
```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`)
@@ -223,12 +232,63 @@ Modern multitenant architecture with Container Database.
## DMP Files Required
### For New Installation
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` | Common schema (rights, updates, etc.) | ~50MB |
| `[company].dmp` | Company schema (one per company) | ~100-500MB each |
| `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 <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
@@ -251,37 +311,170 @@ scp root@10.0.20.201:/opt/oracle18/oradata/dmpdir/contafin_oracle.dmp C:\DMPDIR\
## Workflow Examples
### New Server Installation
### 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. Install Oracle 21c XE (see docs/00-INSTALL-ORACLE-XE.md)
# 1. Instalezi Oracle 21c XE (vezi docs/00-INSTALL-ORACLE-XE.md)
# Parola SYS/SYSTEM la instalare: romfastsoft
# 2. Configure
# 2. Configurare
Copy-Item config.example.ps1 config.ps1
notepad config.ps1 # Edit values
notepad config.ps1 # SERVICE_NAME=XEPDB1 pentru XE, ROA pentru SE
# 3. Copy DMP files
# 3. DMP-urile SABLON (vezi "De unde iei DMP-urile sablon")
mkdir C:\DMPDIR
Copy-Item \\server\dmp\*.dmp C:\DMPDIR\
Copy-Item \\server\sabloane\contafin_oracle.dmp C:\DMPDIR\
Copy-Item \\server\sabloane\FIRMANOUA.dmp C:\DMPDIR\
# 4. Run setup scripts
.\01-setup-database.ps1
.\02-create-sys-objects.ps1
.\03-import-contafin.ps1
.\04-create-synonyms-grants.ps1
.\05-import-companies.ps1
.\08-post-install-config.ps1
.\07-verify-installation.ps1
# 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)".
```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 "<id-client>" -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. **Customer ID**: Sets AUTH_DETALII for license verification
4. **Scheduler Jobs**: UPDATEROA_ZILNIC and UPDATERTVAI_ZILNIC (disabled by default)
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)
@@ -290,11 +483,11 @@ This script completes the ROA setup by configuring:
# With custom ROAUPDATE path and Customer ID
.\08-post-install-config.ps1 -RoaUpdatePath "E:\ROAUPDATE" -CustomerId "138"
# With email configuration
.\08-post-install-config.ps1 -EmailTo "admin@company.ro" -EmailSmtp "mail.company.ro"
# 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
.\08-post-install-config.ps1 -SkipSchedulerJobs -SkipServerInfo -SkipSmtpConfig
```
**Enable automatic updates after verification:**
@@ -424,6 +617,22 @@ sqlplus sys/romfastsoft@localhost:1521/XEPDB1 as sysdba @sql/uninstall-roa.sql
> **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
@@ -468,6 +677,35 @@ 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ă:
```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:**