# Oracle Database XE - LXC 108 (Proxmox) ## 📌 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) ```bash # 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) ```bash # 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 ```bash # 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 ```bash # 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) ```powershell # 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):** ```bash # 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):** ```bash # 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 ```bash # 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 ```bash # 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` ### Import în Oracle 18c ```bash # 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) ```bash # 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 <> /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: ```bash ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle18-xe sh -c 'sqlplus -s / as sysdba < **Notă:** Containerul oracle18-xe a fost recreat cu volum adițional pentru persistența configurației: > ```bash > -v /opt/oracle18/oradata/startup:/opt/oracle/scripts/startup > ``` #### Verificare Status ```bash # 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 ```bash # 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 ```bash # 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 < **IMPORTANT:** Nu ai nevoie de user/parolă pentru LXC 108! > Accesul se face prin Proxmox folosind comenzile `pct`. ### Metoda 1: Intrare în LXC 108 ```bash # 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 ```bash # 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 ```bash # 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) ```bash # Rulează din LXC 108 pct exec 108 -- bash /opt/oracle/oradata/export-roa2.sh ``` Rezultat: `/opt/oracle/oradata/dmpdir/roa2_export_YYYYMMDD_HHMMSS.zip` ### Export Individual ```bash 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 ```bash 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 ```bash scp root@10.0.20.201:/opt/oracle/oradata/dmpdir/firmanoua.dmp /mnt/e/backups/ ``` ### Recreare DMPDIR (dacă e necesar) ```bash # 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 < 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 ### 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):** ```bash # 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:** ```bash # 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:** - **URL:** http://10.0.20.121:9000 - **User:** admin - **Parola:** parola281234 --- **Data ultimei actualizări:** 2026-01-28 **Autor:** Marius Mutu **Proiect:** ROMFASTSQL - Oracle XE 18c/21c în Proxmox LXC