Files
ROMFASTSQL/proxmox/lxc108-oracle
Marius ec66377e0f fix(oracle): calea DMPDIR devine parametru; sqlnet.ora ajunge unde e citit
Gasite la instalarea de productie VADECO (Oracle 21c XE, Windows Server 2019).

1. Pe serverul VADECO procesul Oracle nu poate atinge nicio cale de pe C:,
   nici macar C:\Windows\Temp, desi ACL-urile sunt corecte si serviciul ruleaza
   ca NT SERVICE\OracleServiceXE. D: merge cu exact acelasi grant. Calea DMP
   era insa hardcodata "C:\DMPDIR" in 01, 02, 05, 06 si in biblioteca, deci
   instalarea nu se putea muta. Acum e parametrul -DmpDir, expus ca /dmpdest:
   in FAZA1.cmd si FAZA2.cmd si transmis tuturor pasilor.

   Cel mai perfid era pasul 02: recrea DIRECTORY DMPDIR pe 'C:\DMPDIR' peste
   valoarea pusa de 01. Chiar cu restul instalarii mutata, SYS.NEWSCHEMA ar fi
   cautat FIRMANOUA.dmp in alta parte, iar adaugarea unei firme noi ar fi picat
   peste luni, fara legatura vizibila cu instalarea.

2. New-OracleDirectory compara doar siruri de caractere: verifica ce scrie in
   dba_directories, nu daca baza chiar poate scrie acolo. Acum face un
   UTL_FILE round-trip si esueaza pe loc, cu explicatia cauzei. Inainte,
   directorul inutilizabil trecea drept bun si importul cadea abia in impdp cu
   ORA-29283, la zeci de linii distanta. Valoarea de retur nici nu era
   verificata in 01/03/06 - de aici si "True" ratacit in log.

3. Instalarea ROAClient seteaza TNS_ADMIN de masina spre instantclient-ul ei.
   Serviciul Oracle mosteneste variabilele de masina, deci citea sqlnet.ora de
   acolo - unde nu exista niciunul - si nu din Oracle Home, unde il scria pasul
   01. Compatibilitatea pentru clienti vechi nu se aplica, iar statiile ar fi
   primit ORA-28040 cu fisierul scris corect, in locul gresit. Pasul 01 scrie
   acum sqlnet.ora si in TNS_ADMIN cand difera.

4. Pasul 05 lega schemele de DMP-uri cu "^$schema[_\.]", deci schema DANUBE
   putea primi DANUBE_20200914.dmp - datele altei firme, fara avertisment.
   Numele exact are acum intaietate, prefixul se accepta doar daca e unic, iar
   ambiguitatea se raporteaza.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
2026-08-25 21:18:43 +03:00
..

Oracle Database XE - LXC 108 (Proxmox)

Scripturi de instalare / migrare Oracle pentru ROA — trei directoare, ghid de rutare în docs/instalare-si-migrare-oracle.md: roa-windows-setup/ (client pe Windows), migration/ (Oracle în Docker pe acest LXC), new-roa-oracle-server/ (arhivă istorică, nu se rulează).

📌 Informații Container LXC

  • VMID: 108
  • Nume: central-oracle
  • IP: 10.0.20.121
  • Host Proxmox: 10.0.20.201 (pvemini)
  • CPU: 2 cores
  • RAM: 8 GB (+ 2GB swap)
  • Storage: 50 GB (local-zfs)
  • Status: Stopped (pornire manuală la nevoie)
  • OS: Ubuntu/Debian (LXC)
  • Docker Containers: oracle-xe (21c), oracle18-xe (18c) - oprite implicit

📋 Sumar Containere Docker

Container Port Versiune TSTZ Utilizare
oracle-xe 1521 21c 35 Dezvoltare, ROA, ROA2
oracle18-xe 1522 18c 31 Export compatibil 11g/18c/19c

Notă: Containerele Docker sunt oprite implicit pentru a economisi resurse. Pornește-le manual când ai nevoie (vezi secțiunea Pornire/Oprire).


🚀 Pornire și Oprire LXC + Oracle

Pornire completă (LXC + Oracle 21c)

# De pe Proxmox (10.0.20.201):
pct start 108
sleep 10
pct exec 108 -- docker start oracle-xe

# Sau dintr-o singură comandă SSH:
ssh root@10.0.20.201 "pct start 108 && sleep 10 && pct exec 108 -- docker start oracle-xe"

# Verificare:
ssh root@10.0.20.201 "pct exec 108 -- docker ps"

Pornire Oracle 18c (pentru export compatibil)

# Presupune că LXC 108 rulează deja
ssh root@10.0.20.201 "pct exec 108 -- docker start oracle18-xe"

# Așteaptă ~60s pentru startup, apoi verifică:
ssh root@10.0.20.201 "pct exec 108 -- docker logs oracle18-xe --tail 5"

Oprire containere Oracle

# Oprește ambele containere:
ssh root@10.0.20.201 "pct exec 108 -- docker stop oracle-xe oracle18-xe"

# Sau doar unul:
ssh root@10.0.20.201 "pct exec 108 -- docker stop oracle18-xe"

Oprire completă LXC

# Oprește containerele Docker apoi LXC:
ssh root@10.0.20.201 "pct exec 108 -- docker stop oracle-xe oracle18-xe 2>/dev/null; pct stop 108"

Script rapid PowerShell (pentru Windows)

# Pornire LXC + Oracle 21c
ssh root@10.0.20.201 "pct start 108; sleep 15; pct exec 108 -- docker start oracle-xe"

# Oprire
ssh root@10.0.20.201 "pct exec 108 -- docker stop oracle-xe oracle18-xe; pct stop 108"

🐳 Oracle XE 21c în Docker

Informații Container Docker

  • Container Name: oracle-xe
  • Image: container-registry.oracle.com/database/express:21.3.0-xe
  • Versiune: Oracle Database 21c Express Edition
  • Status: Pornire manuală (docker start oracle-xe)
  • Portainer: http://10.0.20.121:9000 (admin / parola281234)

Porturi Expuse

Port Serviciu Descriere
1521 Oracle Listener Conexiuni SQL*Plus, JDBC
5500 Oracle EM Express Enterprise Manager Web Interface

Volume Docker Montate (oracle-xe)

Container Path LXC 108 Path Descriere
/opt/oracle/oradata /opt/oracle/oradata Date Oracle, tablespaces
/opt/oracle/oradata/dmpdir /opt/oracle/oradata/dmpdir Export/Import DMP (DMPDIR)
/opt/oracle/scripts/setup /opt/oracle/scripts/setup Scripturi setup
/opt/oracle/scripts/startup /opt/oracle/scripts/startup Scripturi startup

🐳 Oracle XE 18c în Docker (Export Compatibil)

Scop: Export DMP compatibil cu Oracle 11g, 18c, 19c (TSTZ version 31)

De ce Oracle 18c separat? Oracle 21c are TSTZ version 35, iar clienții cu Oracle 11g/18c/19c nu pot importa DMP-uri exportate din 21c (eroare ORA-39405). Containerul oracle18-xe permite export cu VERSION=11.2 compatibil cu versiunile vechi.

Informații Container Docker

  • Container Name: oracle18-xe
  • Image: gvenzl/oracle-xe:18
  • Versiune: Oracle Database 18c Express Edition (18.4.0.0.0)
  • Port Extern: 1522 (mapează la 1521 intern)
  • Port EM Express: 5502 (mapează la 5500 intern)
  • TSTZ Version: 31 (compatibil cu 11g/18c/19c)
  • SID: XE (CDB cu PDB implicit: XEPDB1)
  • Character Set: WE8MSWIN1252

Scheme Importate

Schema Parola Obiecte Utilizare
CONTAFIN_ORACLE ROMFASTSOFT ~330 Schema common (drepturi, update, etc.)
FIRMANOUA ROMFASTSOFT ~3400 Schema client template (gestiune, contab, salarii)

Volume Docker Montate (oracle18-xe)

Container Path LXC 108 Path Descriere
/opt/oracle/oradata /opt/oracle18/oradata Date Oracle 18c (datafiles, redo)
/opt/oracle/oradata/dmpdir /opt/oracle18/oradata/dmpdir Export/Import DMP
/opt/oracle/scripts/startup /opt/oracle18/oradata/startup Scripturi executate la pornire

Fișiere configurare persistente (în /opt/oracle18/oradata/):

Fișier Descriere
dbconfig/sqlnet.ora Configurare autentificare (suport clienți vechi 11g)
startup/*.sh Scripturi executate automat la pornirea containerului

Notă: Oracle 18c folosește un volum separat (/opt/oracle18/) pentru a evita conflicte cu Oracle 21c. Directorul DMPDIR este în volumul 18c.

Arhitectură CDB/PDB Oracle 18c

Oracle 18c XE folosește arhitectura multitenant (la fel ca 21c):

Container Tip Descriere
CDB$ROOT CDB Container root (admin, SYS objects)
PDB$SEED PDB Template read-only pentru creare PDB-uri noi
XEPDB1 PDB PDB implicit pentru aplicații și date

Diferență față de Oracle 21c:

  • Oracle 21c are PDB-uri custom: ROA, ROA2
  • Oracle 18c are PDB-ul implicit: XEPDB1
  • Schemele CONTAFIN_ORACLE și FIRMANOUA sunt în XEPDB1 (nu în CDB!)

IMPORTANT: Conectează-te la XEPDB1, nu la XE!

Conexiune Oracle 18c

Conectare la CDB (admin):

# SYS la CDB root
sqlplus sys/romfastsoft@10.0.20.121:1522/XE as sysdba

# SYSTEM la CDB root
sqlplus system/romfastsoft@10.0.20.121:1522/XE

Conectare la PDB XEPDB1 (aplicații):

# SYS la PDB
sqlplus sys/romfastsoft@10.0.20.121:1522/XEPDB1 as sysdba

# Schema FIRMANOUA (pentru aplicații)
sqlplus FIRMANOUA/ROMFASTSOFT@10.0.20.121:1522/XEPDB1

# Schema CONTAFIN_ORACLE
sqlplus CONTAFIN_ORACLE/ROMFASTSOFT@10.0.20.121:1522/XEPDB1

JDBC:

# Conectare la CDB (admin)
jdbc:oracle:thin:@10.0.20.121:1522/XE

# Conectare la PDB XEPDB1 (aplicații - recomandat)
jdbc:oracle:thin:@10.0.20.121:1522/XEPDB1

ODBC Windows (Instant Client 11.2 sau mai vechi):

Parametru Valoare
Host 10.0.20.121
Port 1522
Service Name XEPDB1
User CONTAFIN_ORACLE sau FIRMANOUA
Password ROMFASTSOFT

Notă: Pentru clienți ODBC vechi (Instant Client 11g), serverul Oracle 18c trebuie configurat cu SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 în sqlnet.ora. Vezi secțiunea Troubleshooting.

TNS Entries:

# PDB XEPDB1 (pentru aplicații - RECOMANDAT)
ROA_CENTRAL3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.121)(PORT = 1522))
    (CONNECT_DATA = (SERVICE_NAME = XEPDB1))
  )

# Alias alternativ
XEPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.121)(PORT = 1522))
    (CONNECT_DATA = (SERVICE_NAME = XEPDB1))
  )

# CDB root (doar pentru admin)
XE18 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.121)(PORT = 1522))
    (CONNECT_DATA = (SERVICE_NAME = XE))
  )

Atenție: Folosește SERVICE_NAME = XEPDB1 pentru aplicații, NU SID = XE!

Export Compatibil din Oracle 18c

# Export FIRMANOUA (compatibil Oracle 11g, 18c, 19c)
docker exec oracle18-xe expdp system/romfastsoft@localhost:1521/XE \
  SCHEMAS=FIRMANOUA DIRECTORY=DMPDIR DUMPFILE=firmanoua_v11.2.dmp \
  LOGFILE=export_firmanoua.log VERSION=11.2

# Export CONTAFIN_ORACLE (compatibil Oracle 11g, 18c, 19c)
docker exec oracle18-xe expdp system/romfastsoft@localhost:1521/XE \
  SCHEMAS=CONTAFIN_ORACLE DIRECTORY=DMPDIR DUMPFILE=contafin_v11.2.dmp \
  LOGFILE=export_contafin.log VERSION=11.2

# Export ambele scheme
docker exec oracle18-xe expdp system/romfastsoft@localhost:1521/XE \
  SCHEMAS=CONTAFIN_ORACLE,FIRMANOUA DIRECTORY=DMPDIR \
  DUMPFILE=roa_export_v11.2.dmp LOGFILE=export_roa.log VERSION=11.2

Scripturi Export Automatizate

Nu există cron/job automat - exportul se rulează manual, la cerere (crontab -l în LXC 108 e gol).

# Din LXC 108 sau remote
./export-roa2.sh 18    # Export din Oracle 18c (port 1522)
./export-roa2.sh 21    # Export din Oracle 21c PDB roa2 (port 1521)

# Din PowerShell Windows
.\export-roa2.ps1      # Meniu interactiv

Locații scripturi: proxmox/lxc108-oracle/scripts/export-roa2.sh, proxmox/lxc108-oracle/scripts/export-roa2.ps1

Ce face export-roa2.sh: pentru fiecare din CONTAFIN_ORACLE și FIRMANOUA rulează expdp (EXCLUDE=STATISTICS, VERSION=11.2 pe 18c / VERSION=19 pe 21c), apoi arhivează separat <SCHEMA>_<suffix>_<timestamp>.tar.gz (dmp + log) și șterge .dmp/.log-ul brut.

Unde ajung arhivele:

Sursă Director pe LXC 108 Nume arhivă
Oracle 18c (XEPDB1, port 1522) /opt/oracle18/oradata/dmpdir/ FIRMANOUA_v11.2_<timestamp>.tar.gz
Oracle 21c (PDB roa2, port 1521) /opt/oracle/oradata/dmpdir/ FIRMANOUA_v19_<timestamp>.tar.gz

export-roa2.ps1 copiază apoi arhivele pe Windows în E:\backups\oracle\ (pct pull + scp), de unde sunt dezarhivate manual în subfolderele oracle18\ / oracle10\.

Atenție: arhivele sunt incluse în backupul/replicarea LXC 108 doar cât timp rămân în dmpdir. După copierea pe Windows + curățare (opțiunea 3 din meniul PS), singura copie rămâne cea de pe E:.

Import în Oracle 18c

# Import schema cu remap tablespace (dacă nu există tablespace ROA)
docker exec oracle18-xe impdp system/romfastsoft@localhost:1521/XE \
  SCHEMAS=FIRMANOUA DIRECTORY=DMPDIR DUMPFILE=firmanoua.dmp \
  LOGFILE=import.log REMAP_TABLESPACE=ROA:USERS,ROA2:USERS

Recreare Container Oracle 18c (dacă e necesar)

# 1. Stop și remove container vechi
docker stop oracle18-xe 2>/dev/null
docker rm oracle18-xe 2>/dev/null

# 2. Creează directoarele volum (prima dată)
mkdir -p /opt/oracle18/oradata
mkdir -p /opt/oracle18/oradata/dbconfig
mkdir -p /opt/oracle18/oradata/startup
chmod 777 /opt/oracle18/oradata

# 3. Creează sqlnet.ora pentru compatibilitate cu clienți vechi (Instant Client 11g)
cat > /opt/oracle18/oradata/dbconfig/sqlnet.ora << 'EOF'
NAMES.DIRECTORY_PATH = (EZCONNECT, TNSNAMES)
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
EOF

# 4. Creează container cu volume pentru persistență config
docker run -d --name oracle18-xe \
  --restart unless-stopped \
  -p 1522:1521 \
  -p 5502:5500 \
  -e ORACLE_PASSWORD=romfastsoft \
  -e ORACLE_CHARACTERSET=WE8MSWIN1252 \
  -v /opt/oracle18/oradata:/opt/oracle/oradata \
  -v /opt/oracle18/oradata/startup:/opt/oracle/scripts/startup \
  --shm-size=1g \
  gvenzl/oracle-xe:18

# 4. Așteaptă pornirea (primele 2-3 minute)
docker logs -f oracle18-xe
# Așteptă mesajul: "DATABASE IS READY TO USE!"

# 5. Creare DMPDIR
docker exec oracle18-xe bash -c "sqlplus -s / as sysdba <<EOF
CREATE OR REPLACE DIRECTORY DMPDIR AS '/opt/oracle/oradata/dmpdir';
GRANT READ, WRITE ON DIRECTORY DMPDIR TO PUBLIC;
EOF"

# 6. Creare useri (dacă importi DMP-uri existente)
docker exec oracle18-xe bash -c "sqlplus -s / as sysdba <<EOF
CREATE USER CONTAFIN_ORACLE IDENTIFIED BY ROMFASTSOFT DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
CREATE USER FIRMANOUA IDENTIFIED BY ROMFASTSOFT DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
GRANT CONNECT, RESOURCE, DBA TO CONTAFIN_ORACLE, FIRMANOUA;
EOF"

Troubleshooting Oracle 18c

ORA-28040: No matching authentication protocol (ODBC/Instant Client vechi)

Problemă: Conectarea din Windows cu Oracle Instant Client 11.2 (sau mai vechi) la Oracle 18c eșuează cu eroarea:

ORA-28040: No matching authentication protocol

Cauză: Oracle 18c folosește implicit protocolul de autentificare versiunea 12, incompatibil cu clienții vechi (11g și anterior).

Soluție: Configurează sqlnet.ora să accepte protocoale vechi de autentificare.

# Verifică configurația curentă
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'cat /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora'"

# Adaugă suport pentru clienți vechi (dacă nu există deja)
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'echo \"SQLNET.ALLOWED_LOGON_VERSION_SERVER=8\" >> /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora'"
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'echo \"SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8\" >> /opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora'"

# Reîncarcă listener-ul
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'lsnrctl reload'"

După modificare - resetează parolele utilizatorilor: Parolele sunt stocate cu versiunea de protocol activă la momentul setării. După modificarea sqlnet.ora, trebuie resetate:

ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'sqlplus -s / as sysdba <<EOF
ALTER SESSION SET CONTAINER = XEPDB1;
ALTER USER CONTAFIN_ORACLE IDENTIFIED BY ROMFASTSOFT;
ALTER USER FIRMANOUA IDENTIFIED BY ROMFASTSOFT;
EXIT;
EOF'"

Persistență la restart container: Configurația sqlnet.ora este salvată în volumul persistent /opt/oracle18/oradata/dbconfig/. Containerul este configurat cu volum pentru startup scripts care restaurează automat configurația.

Notă: Containerul oracle18-xe a fost recreat cu volum adițional pentru persistența configurației:

-v /opt/oracle18/oradata/startup:/opt/oracle/scripts/startup

Verificare Status

# Status container
docker ps | grep oracle18

# Loguri container
docker logs oracle18-xe --tail 50

# Verificare bază de date
docker exec oracle18-xe bash -c "echo 'SELECT status FROM v\$instance;' | sqlplus -s / as sysdba"

Container nu pornește

# Verifică memorie (necesită min 1GB RAM + 1GB shm)
free -m

# Verifică permisiuni director
ls -la /opt/oracle18/oradata

# Șterge și recreează
docker rm -f oracle18-xe
rm -rf /opt/oracle18/oradata/*
# Apoi reia pașii de creare

ORA-01034: ORACLE not available

# Repornește containerul
docker restart oracle18-xe

# Sau verifică dacă baza de date s-a oprit
docker exec oracle18-xe bash -c "sqlplus / as sysdba <<EOF
STARTUP;
EOF"

Eroare la import: ORA-00959 tablespace does not exist

# Folosește REMAP_TABLESPACE
impdp ... REMAP_TABLESPACE=ROA:USERS,ROA2:USERS

🔗 Conexiuni Oracle Database (21c)

Container Database (CDB)

  • CDB Name: XE
  • User SYS: sys / romfastsoft (CONTAINER=ALL)
  • User SYSTEM: system / romfastsoft (CONTAINER=ALL)

Conexiune la CDB

# SQL*Plus
sqlplus sys/romfastsoft@10.0.20.121:1521/XE as sysdba
sqlplus system/romfastsoft@10.0.20.121:1521/XE

# JDBC
jdbc:oracle:thin:@10.0.20.121:1521/XE

📊 Pluggable Databases (PDB-uri)

1. PDB: ROA (Producție)

Informații Generale:

  • Service Name: roa
  • Scop: Bază de date producție pentru aplicații ROMFAST

Useri și Parole:

User Password Rol
sys romfastsoft SYSDBA
system romfastsoft SYSTEM
CONTAFIN_ORACLE OraclePass123 Application schema
MARIUSM_AUTO OraclePass123 Application schema

SQL*Plus:

sqlplus sys/romfastsoft@10.0.20.121:1521/roa as sysdba
sqlplus system/romfastsoft@10.0.20.121:1521/roa
sqlplus CONTAFIN_ORACLE/OraclePass123@10.0.20.121:1521/roa
sqlplus MARIUSM_AUTO/OraclePass123@10.0.20.121:1521/roa

JDBC:

jdbc:oracle:thin:@10.0.20.121:1521/roa

TNS Entry:

ROA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.121)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = roa)
    )
  )

2. PDB: ROA2 (Template pentru Export DMP)

Informații Generale:

  • Service Name: roa2
  • Scop: Template pentru scheme noi, export DMP pentru clienți noi

Useri și Parole:

User Password Rol
sys romfastsoft SYSDBA
system romfastsoft SYSTEM
CONTAFIN_ORACLE ROMFASTSOFT Template schema
FIRMANOUA ROMFASTSOFT Template schema (client nou)

SQL*Plus:

sqlplus sys/romfastsoft@10.0.20.121:1521/roa2 as sysdba
sqlplus system/romfastsoft@10.0.20.121:1521/roa2
sqlplus CONTAFIN_ORACLE/ROMFASTSOFT@10.0.20.121:1521/roa2
sqlplus FIRMANOUA/ROMFASTSOFT@10.0.20.121:1521/roa2

JDBC:

jdbc:oracle:thin:@10.0.20.121:1521/roa2

TNS Entry:

ROA2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.121)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = roa2)
    )
  )

Caracteristici ROA2:

  • Tablespace ROA: 2GB (pentru teste/template)
  • Profil DEFAULT: parole nelimitate (PASSWORD_LIFE_TIME UNLIMITED)
  • Obiecte SYS custom: AUTH_PACK, UPDATESQLPLUS, EXECUTESCRIPTOS, UTL_MAIL
  • 232 sinonime publice CONTAFIN_ORACLE
  • 149 grant-uri către PUBLIC

🔧 Acces la Oracle prin LXC

IMPORTANT: Nu ai nevoie de user/parolă pentru LXC 108! Accesul se face prin Proxmox folosind comenzile pct.

Metoda 1: Intrare în LXC 108

# SSH în Proxmox
ssh root@10.0.20.201

# Intrare în LXC 108
pct enter 108

# Acum poți folosi comenzi Docker direct
docker ps
docker logs oracle-xe --tail 50

Metoda 2: Execuție Directă din Proxmox

# Verificare PDB-uri
ssh root@10.0.20.201 'pct exec 108 -- docker exec oracle-xe bash -c "echo \"SELECT name, open_mode FROM v\\\$pdbs;\" | sqlplus -s sys/romfastsoft@localhost:1521/XE as sysdba"'

# Restart Oracle container
ssh root@10.0.20.201 "pct exec 108 -- docker restart oracle-xe"

Metoda 3: SQL*Plus Direct în Container

# Intrare în container Oracle
pct exec 108 -- docker exec -it oracle-xe bash

# SQL*Plus din container
docker exec oracle-xe sqlplus sys/romfastsoft@localhost:1521/roa as sysdba

📦 Export și Import Data Pump

DMPDIR - Director Oracle montat direct pe LXC 108: /opt/oracle/oradata/dmpdir Fișierele DMP sunt accesibile direct, fără docker cp.

Export Complet ROA2 (Script)

# Rulează din LXC 108 (implicit 21c; adaugă `18` pentru Oracle 18c)
pct exec 108 -- bash /opt/oracle/oradata/export-roa2.sh 21

Rezultat: două arhive separate în dmpdir (una per schemă), nu un singur zip: CONTAFIN_ORACLE_v19_YYYYMMDD_HHMMSS.tar.gz și FIRMANOUA_v19_YYYYMMDD_HHMMSS.tar.gz. Detalii și destinație finală: secțiunea Scripturi Export Automatizate.

Export Individual

docker exec oracle-xe expdp system/romfastsoft@localhost:1521/roa2 \
  SCHEMAS=FIRMANOUA DIRECTORY=DMPDIR DUMPFILE=firmanoua.dmp COMPRESSION=ALL

docker exec oracle-xe expdp system/romfastsoft@localhost:1521/roa2 \
  SCHEMAS=CONTAFIN_ORACLE DIRECTORY=DMPDIR DUMPFILE=contafin.dmp COMPRESSION=ALL

Import în PDB

docker exec oracle-xe impdp system/romfastsoft@localhost:1521/roa \
  SCHEMAS=FIRMANOUA DIRECTORY=DMPDIR DUMPFILE=firmanoua.dmp LOGFILE=firmanoua_import.log

Copiere DMP din LXC 108 în WSL

scp root@10.0.20.201:/opt/oracle/oradata/dmpdir/firmanoua.dmp /mnt/e/backups/

Recreare DMPDIR (dacă e necesar)

# 1. Creează folder pe LXC 108
pct exec 108 -- mkdir -p /opt/oracle/oradata/dmpdir
pct exec 108 -- chmod 777 /opt/oracle/oradata/dmpdir

# 2. Creează DIRECTORY Oracle în fiecare PDB
for pdb in XE roa roa2; do
  pct exec 108 -- docker exec oracle-xe bash -c "sqlplus -s sys/romfastsoft@localhost:1521/$pdb as sysdba <<EOF
CREATE OR REPLACE DIRECTORY DMPDIR AS '/opt/oracle/oradata/dmpdir';
GRANT READ, WRITE ON DIRECTORY DMPDIR TO PUBLIC;
EOF"
done

🔍 Verificări și Comenzi SQL Utile

Status PDB-uri

-- Verificare status PDB-uri
SELECT name, open_mode, restricted FROM v$pdbs;

-- Deschidere PDB (dacă e MOUNTED)
ALTER PLUGGABLE DATABASE roa OPEN;
ALTER PLUGGABLE DATABASE roa2 OPEN;
ALTER PLUGGABLE DATABASE ALL SAVE STATE;

Verificare Tablespace-uri

-- Tablespace-uri și utilizare în ROA2
SELECT
  tablespace_name,
  ROUND(bytes/1024/1024, 2) as MB,
  ROUND(maxbytes/1024/1024, 2) as MAX_MB,
  autoextensible
FROM dba_data_files
WHERE tablespace_name='ROA';

-- Spațiu liber
SELECT
  tablespace_name,
  ROUND(SUM(bytes)/1024/1024, 2) as FREE_MB
FROM dba_free_space
GROUP BY tablespace_name;

Status Obiecte și Scheme

-- Număr obiecte per schema în ROA2
SELECT
  owner,
  COUNT(*) total_objects,
  SUM(CASE WHEN status='VALID' THEN 1 ELSE 0 END) valid_objects,
  SUM(CASE WHEN status='INVALID' THEN 1 ELSE 0 END) invalid_objects
FROM dba_objects
WHERE owner IN ('CONTAFIN_ORACLE', 'FIRMANOUA')
GROUP BY owner;

-- Tipuri obiecte
SELECT owner, object_type, COUNT(*)
FROM dba_objects
WHERE owner IN ('CONTAFIN_ORACLE', 'FIRMANOUA')
GROUP BY owner, object_type
ORDER BY owner, COUNT(*) DESC;

Useri și Profiluri

-- Verificare useri și profile în PDB
SELECT username, account_status, profile, created
FROM dba_users
WHERE username IN ('CONTAFIN_ORACLE', 'FIRMANOUA', 'MARIUSM_AUTO')
ORDER BY created DESC;

-- Verificare limită parole (PASSWORD_LIFE_TIME)
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE resource_name = 'PASSWORD_LIFE_TIME'
ORDER BY profile;

Sinonime Publice

-- Verificare sinonime publice CONTAFIN_ORACLE
SELECT COUNT(*) as total_synonyms
FROM dba_synonyms
WHERE owner = 'PUBLIC'
AND table_owner = 'CONTAFIN_ORACLE';

-- Detalii sinonime
SELECT synonym_name, table_owner, table_name
FROM dba_synonyms
WHERE owner = 'PUBLIC'
AND table_owner = 'CONTAFIN_ORACLE'
ORDER BY synonym_name;

Grant-uri către PUBLIC

-- Număr grant-uri către PUBLIC
SELECT COUNT(*) as total_grants
FROM dba_tab_privs
WHERE grantee = 'PUBLIC'
AND owner IN ('CONTAFIN_ORACLE', 'SYS');

-- Detalii grant-uri
SELECT owner, table_name, privilege, grantee
FROM dba_tab_privs
WHERE grantee = 'PUBLIC'
AND owner IN ('CONTAFIN_ORACLE', 'SYS')
ORDER BY owner, table_name;

🚨 Troubleshooting Oracle

Verificare Conexiune Oracle

# Test ping LXC 108
ping -c 3 10.0.20.121

# Test port Oracle listener
nc -zv 10.0.20.121 1521

# Test SQL*Plus conexiune
sqlplus sys/romfastsoft@10.0.20.121:1521/roa as sysdba

Restart Oracle Database

# Opțiunea 1: Restart container Docker (RAPID)
ssh root@10.0.20.201 "pct exec 108 -- docker restart oracle-xe"

# Opțiunea 2: Restart LXC complet
ssh root@10.0.20.201 "pct restart 108"

# Verificare după restart
ssh root@10.0.20.201 "pct exec 108 -- docker ps"

Verificare Status Container

# Status Docker container
ssh root@10.0.20.201 "pct exec 108 -- docker ps"

# Healthcheck Oracle
ssh root@10.0.20.201 "pct exec 108 -- docker inspect oracle-xe | grep -A 10 Health"

# Loguri Oracle
ssh root@10.0.20.201 "pct exec 108 -- docker logs oracle-xe --tail 100"

PDB nu se deschide (MOUNTED)

# Deschidere manuală PDB
ssh root@10.0.20.201 'pct exec 108 -- docker exec oracle-xe bash -c "echo \"ALTER PLUGGABLE DATABASE ALL OPEN; ALTER PLUGGABLE DATABASE ALL SAVE STATE;\" | sqlplus -s sys/romfastsoft@localhost:1521/XE as sysdba"'

Probleme Maximum Open Cursors

-- Verificare valoare curentă
SELECT name, value FROM v$parameter WHERE name = 'open_cursors';

-- Creștere limită cursoare (dacă apar erori ORA-01000)
ALTER SYSTEM SET OPEN_CURSORS=1000 SCOPE=BOTH SID='*';

Verificare Alert Log Oracle

# Alert log location în container
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle-xe tail -100 /opt/oracle/diag/rdbms/xe/XE/trace/alert_XE.log"

📝 Notițe Importante

Ce este CDB/PDB? (Arhitectura Multitenant)

Începând cu Oracle 12c, Oracle folosește arhitectura multitenant:

┌─────────────────────────────────────────────┐
│              CDB (Container DB)             │
│  ┌─────────────────────────────────────┐    │
│  │  CDB$ROOT - Dicționar date, SYS     │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │  PDB$SEED - Template (read-only)    │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │  PDB1 (ex: ROA) - Date aplicație    │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │  PDB2 (ex: ROA2) - Date aplicație   │    │
│  └─────────────────────────────────────┘    │
└─────────────────────────────────────────────┘
Termen Descriere
CDB Container Database - baza de date principală care conține PDB-uri
PDB Pluggable Database - bază de date "portabilă" cu propriile scheme și date
CDB$ROOT Container root - conține dicționarul de date și obiectele SYS
PDB$SEED Template read-only pentru crearea de noi PDB-uri

De ce contează:

  • Conectare la CDB (XE): vezi toate PDB-urile, operații admin
  • Conectare la PDB (ROA, XEPDB1): vezi doar schemele din acel PDB
  • Export/Import: specifică PDB-ul corect în connection string

Exemplu practic:

# Conectare la CDB - vezi toate PDB-urile
sqlplus sys/romfastsoft@10.0.20.121:1521/XE as sysdba
SQL> SELECT name FROM v$pdbs;  -- arată: ROA, ROA2

# Conectare la PDB ROA - vezi doar schemele din ROA
sqlplus sys/romfastsoft@10.0.20.121:1521/ROA as sysdba
SQL> SELECT username FROM dba_users;  -- arată userii din ROA

Compatibilitate TSTZ (Time Zone)

Versiune TSTZ Compatibilitate Import
Oracle 21c 35 Doar 21c+
Oracle 18c 31 11g, 18c, 19c, 21c
Oracle 19c 32 11g, 18c, 19c, 21c

Important: Pentru export compatibil cu clienți Oracle 11g/18c/19c, folosește oracle18-xe (port 1522).

Diferențe Oracle 10g vs 21c

  • Oracle 10g folosește SID (ORCL) - sistem vechi, decommissioned
  • Oracle 21c folosește SERVICE_NAME (roa, roa2) - sistem actual
  • Migrare: Export DMP Oracle 10g → Import Data Pump Oracle 21c (impdp)

Profile Parole

  • ROA: Parolele pot expira (setări default Oracle)
  • ROA2: Parolele NU expiră (PASSWORD_LIFE_TIME UNLIMITED)

VM 201 - Windows 11 (Client Aplicații)

  • VMID: 201
  • Nume: roacentral
  • Host: 10.0.20.201 (Proxmox pvemini)
  • OS: Windows 11 (24H2)
  • Rol: Client pentru aplicații Windows, SQL*Plus client
  • NU rulează Oracle Database (migrat în LXC 108 Docker)

📂 Subdirectoare

clienti/

Cazuri concrete de depanare / migrare bază de date la clienți, cu scripturi reutilizabile generate din fiecare incident.

Caz Director Scop
ROMPETROL ENERGY (schemă ROMPETROLE) clienti/oracle-xe-21c/ Recreare PDB Oracle XE 21c după ORA-12954 (12 GB depășiți) — diagnostic SYSAUX, drop+recreate PDB din PDB$SEED, reimport scheme

Documentație: clienti/README.md (index general) și clienti/oracle-xe-21c/README.md (cazul ROMPETROL).

migration/

Scripturi pentru migrarea Oracle 10g → 21c XE:

  • 00-MASTER-MIGRATION.sh - Script master orchestrare migrare
  • 01-setup-oracle21c.sh - Setup tablespace ROA + useri
  • 02-export-source.sh - Export universal (AUTO/MANUAL/LOCAL)
  • 03-transfer-to-oracle21c.sh - Transfer fișiere DMP
  • 04-import-to-oracle21c.sh - Import scheme + SYS objects
  • 05-create-synonyms-grants.sh - Creare sinonime + grant-uri
  • 06-finalize-migration.sh - Recompilare + verificare finală

Documentație: migration/README.md

sql/

SQL-uri și packages Oracle:

  • sql/roa/ - SQL-uri compatibilitate Oracle 10g (scrie_jc_2007.sql, etc.)
  • sql/roa-romconstruct/ - Package PACK_CONTAFIN.pck

config/

Fișiere configurare Oracle 18c:

  • sqlnet.ora - Configurare autentificare pentru clienți vechi (rezolvă ORA-28040)

scripts/

Scripturi operaționale:

  • export-roa2.sh - Export din Oracle 18c sau 21c (bash)
    • ./export-roa2.sh 18 - Export compatibil 11g/18c/19c din Oracle 18c
    • ./export-roa2.sh 21 - Export din Oracle 21c PDB roa2
  • export-roa2.ps1 - Export pentru Windows (PowerShell, meniu interactiv)
  • fix-sqlnet.sh - Script startup pentru Oracle 18c (copiază sqlnet.ora la pornire container)

Copiere config și scripturi pe LXC 108 (Oracle 18c):

# Din WSL/Linux local - copiază toate fișierele necesare:
cd /mnt/e/proiecte/ROMFASTSQL

# 1. Copiază sqlnet.ora în volumul persistent dbconfig
scp proxmox/lxc108-oracle/config/sqlnet.ora root@10.0.20.201:/tmp/ && \
ssh root@10.0.20.201 "pct exec 108 -- mkdir -p /opt/oracle18/oradata/dbconfig && \
pct push 108 /tmp/sqlnet.ora /opt/oracle18/oradata/dbconfig/sqlnet.ora"

# 2. Copiază fix-sqlnet.sh în volumul startup scripts
scp proxmox/lxc108-oracle/scripts/fix-sqlnet.sh root@10.0.20.201:/tmp/ && \
ssh root@10.0.20.201 "pct exec 108 -- mkdir -p /opt/oracle18/oradata/startup && \
pct push 108 /tmp/fix-sqlnet.sh /opt/oracle18/oradata/startup/fix-sqlnet.sh && \
pct exec 108 -- chmod +x /opt/oracle18/oradata/startup/fix-sqlnet.sh"

# 3. Aplică imediat sqlnet.ora (fără restart container)
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c \
'cp /opt/oracle/oradata/dbconfig/sqlnet.ora /opt/oracle/product/18c/dbhomeXE/network/admin/ && lsnrctl reload'"

Copiere export-roa2.sh pe LXC 108:

# Din WSL/Linux local:
scp proxmox/lxc108-oracle/scripts/export-roa2.sh root@10.0.20.201:/tmp/

# Pe Proxmox (10.0.20.201):
pct push 108 /tmp/export-roa2.sh /opt/oracle/oradata/export-roa2.sh
pct exec 108 -- chmod +x /opt/oracle/oradata/export-roa2.sh

# Sau într-o singură comandă din WSL:
scp proxmox/lxc108-oracle/scripts/export-roa2.sh root@10.0.20.201:/tmp/ && \
ssh root@10.0.20.201 "pct push 108 /tmp/export-roa2.sh /opt/oracle/oradata/export-roa2.sh && \
pct exec 108 -- chmod +x /opt/oracle/oradata/export-roa2.sh"

Notă warning-uri export: La export vor apărea warning-uri ORA-31642: DBMS_CUBE_EXP - acestea sunt inofensive (Oracle XE nu include modulul OLAP). Exportul se finalizează corect.


🔗 Legături Utile

Pentru detalii Proxmox generale (cluster, toate LXC-uri/VM-uri): Vezi fișierul: ../cluster/README.md

Oracle Enterprise Manager Express: http://10.0.20.121:5500/em

Portainer Docker Management:


Data ultimei actualizări: 2026-01-28 Autor: Marius Mutu Proiect: ROMFASTSQL - Oracle XE 18c/21c în Proxmox LXC