From 91e822eb53dae6d2bc9a8749df48bfa37e66138b Mon Sep 17 00:00:00 2001 From: Marius Date: Fri, 28 Aug 2026 17:12:41 +0300 Subject: [PATCH] fix(export): aliasul TNS lipsa facea exportul zilnic sa esueze tacut La VADECO, backupora.exe rula in fiecare noapte, se termina cu cod 0 si scria "DONE" pentru fiecare schema - dar directorul zilei ramanea gol. Intre 25 si 28.08.2026 nu a existat niciun export. Cauza: schema.txt cere "@XEPDB1", iar 01-setup-database.ps1 scria in tnsnames.ora doar aliasul ROA. expdp cadea instant cu ORA-12154, iar backupora.exe nu-i verifica codul de iesire. Doua scripturi din acelasi kit nu erau de acord asupra numelui bazei, si nimic nu tipa. Indiciul din log, daca reapare: fiecare schema dura exact 16 secunde, indiferent de marime. Timp uniform = expdp moare la conectare, nu exporta. Reparatii, ca sa nu se repete la alt client: - 01-setup-database.ps1 scrie acum doua aliasuri, ROA si numele serviciului, in ambele tnsnames.ora. Curatarea dinaintea rescrierii parcurge fiecare alias gestionat de noi, altfel al doilea s-ar dubla la fiecare rulare. Aliasurile generate de Oracle (XE, LISTENER_XE, ORACLR_CONNECTION_DATA) raman neatinse. - 11-setup-backup-export.ps1 face tnsping inainte de a scrie schema.txt si opreste instalarea daca aliasul nu se rezolva. Mai bine o instalare care se plange decat un backup care nu exista. - lectii-actualizare-roa-alias-tns.md capata sectiunea despre a doua victima a aceleiasi cauze. Lectia generala: unde un script lanseaza un proces extern Oracle, verifica efectul, nu raportul procesului care l-a lansat. Include si blocul NTS din config/sqlnet.ora, ramas necomis: autentificarea OS cere si apartenenta la ORA_OraDB21Home1_DBA, si setarea din sqlnet.ora. Nota: CLAUDE.md apare ca modificat integral - blob-ul din git avea CRLF, iar core.autocrlf=true il normalizeaza la LF. Modificarea reala e o singura linie. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X9Sa54oFKpE2XhD6A7NTch --- CLAUDE.md | 272 +++++++++--------- docs/lectii-actualizare-roa-alias-tns.md | 74 +++++ .../roa-windows-setup/config/sqlnet.ora | 20 ++ .../scripts/01-setup-database.ps1 | 56 ++-- .../scripts/11-setup-backup-export.ps1 | 25 ++ 5 files changed, 295 insertions(+), 152 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7fab2d3..3c4380a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,136 +1,136 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Project Overview - -ROMFASTSQL is an infrastructure and database management project for ROMFAST, featuring: -- Proxmox virtualization cluster (3 nodes: pve1, pvemini, pveelite) -- Oracle Database XE 21c with migration support from Oracle 10g -- AI chatbot system (Flowise + Claude) -- Disaster recovery infrastructure - -## Repository Structure - -``` -proxmox/ # Main infrastructure documentation -├── README.md # Master index - START HERE -├── cluster/ # Proxmox cluster, UPS, storage management -├── lxc102-docker/ # Docker + Portainer + Docker Sandboxes (sbx) -├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000) -├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522) -├── lxc110-moltbot/ # MoltBot AI Telegram Bot -├── lxc171-claude-agent/ # Claude Code development environment -├── vm109-windows-dr/ # Windows Disaster Recovery VM -├── vm201-windows/ # Windows 11 (IIS reverse proxy) -└── vm302-oracle-test/ # Windows 11 + Oracle 21c test VM (ROA setup validation) - -system_instructions/ # SQL migration guidelines and knowledge base -├── system_prompt.md # SQL migration rules - READ BEFORE WRITING SQL -└── knowledge_base/ # Example scripts and PACK_MIGRARE.pck - -scripts/ # Utilities -├── generare_proces_verbal.py # Generate assembly minutes (DOCX) -├── verificare_voturi_AG.py # Verify assembly votes -└── ups-monitor/ # UPS monitoring for production Oracle server 10.0.20.36 - -input/ # Oracle DMP files for import -``` - -## Key Documentation Entry Points - -- **Infrastructure overview**: `proxmox/README.md` -- **Oprire planificată a clusterului (lucrări electrice) — fără failover HA / fence**: `proxmox/cluster/docs/oprire-planificata-cluster.md` -- **SQL migration guidelines**: `system_instructions/system_prompt.md` (always read before generating migration SQL) -- **Oracle database setup**: `proxmox/lxc108-oracle/README.md` -- **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh` -- **Chatbot architecture**: `proxmox/lxc104-flowise/docs/prd.md` -- **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.md` -- **Disaster recovery**: `proxmox/vm109-windows-dr/README.md` -- **Instalare/migrare Oracle — care director se folosește**: `proxmox/lxc108-oracle/docs/instalare-si-migrare-oracle.md` -- **ROA Windows setup scripts (XE/SE 21c)**: `proxmox/lxc108-oracle/roa-windows-setup/README.md` -- **Conectarea clienților vechi (Instant Client 10/11) la 21c — ORA-28040 / ORA-01017 / ORA-12514**: `docs/lectii-conectare-client-oracle.md` -- **Actualizarea ROA eșuează tăcut fără aliasul TNS pe server (jobul zice SUCCEEDED, dar nu aplică nimic)**: `docs/lectii-actualizare-roa-alias-tns.md` -- **Kit de instalare pentru client (DMP-uri șablon + scripturi, gata de dus la client)**: `proxmox/lxc108-oracle/scripts/build-client-kit.ps1` -- **VM 302 test environment for ROA setup**: `proxmox/vm302-oracle-test/README.md` -- **Diagnostic spațiu Oracle la clienți (job zilnic + emailuri)**: `docs/diagnostic-spatiu-clienti.md` -- **Monitorizare UPS pe serverul Oracle de producție 10.0.20.36 (înlocuiește ViewPower)**: `docs/ups-server36-monitorizare.md` -- **Acces SSH la clienți cu chei publice (angajați noi)**: `docs/acces-ssh-chei-angajati.md` -- **Acces administrativ la server client prin Tailscale + SSH (fără forward pe router)**: `docs/acces-client-tailscale-ssh.md` -- **Cazuri clienți (depanare DB)**: `proxmox/lxc108-oracle/clienti/README.md` - - **ROMPETROL ENERGY — recreare PDB Oracle XE 21c după ORA-12954**: `proxmox/lxc108-oracle/clienti/oracle-xe-21c/README.md` - -## Infrastructure Commands - -### Proxmox Cluster -```bash -ssh root@10.0.20.201 "pvecm status" # Cluster status -ssh root@10.0.20.201 "pct list" # List LXC containers -ssh root@10.0.20.201 "qm list" # List VMs -``` - -### Oracle Database (LXC 108) -```bash -pct exec 108 -- docker exec -it oracle-xe sqlplus / as sysdba -pct exec 108 -- docker restart oracle-xe -``` - -### Flowise Chatbot (LXC 104) -```bash -pct exec 104 -- systemctl status flowise -pct exec 104 -- systemctl restart flowise -pct exec 104 -- journalctl -u flowise -f -``` - -### Validation Scripts -```bash -# UPS monthly test -proxmox/cluster/ups/scripts/ups-monthly-test.sh - -# SSL certificate monitoring -proxmox/vm201-windows/scripts/monitor-ssl-certificates.sh - -# Oracle backup monitoring -proxmox/vm109-windows-dr/scripts/oracle-backup-monitor-proxmox.sh -``` - -## Network Layout - -| Service | IP Address | Port | Purpose | -|---------|-----------|------|---------| -| pvemini (main host) | 10.0.20.201 | 8006 | Proxmox GUI | -| Oracle XE 21c | 10.0.20.121 | 1521 | Production database | -| Oracle XE 18c | 10.0.20.121 | 1522 | Export compatibility (TSTZ 31) | -| Flowise | 10.0.20.161 | 3000 | Chatbot UI | -| Gitea | 10.0.20.165 | 3000 | Git server | -| Docker + Portainer + sbx | 10.0.20.113 | 9000/9443 | Docker host, sandbox-uri agenți AI | -| Claude Agent | 10.0.20.171 | 22 | Development (also via Tailscale: 100.95.55.51) | -| MoltBot | 10.0.20.173 | 22 | AI Telegram Bot (also via Tailscale: 100.120.119.70) | -| Primary Oracle | 10.0.20.36 | 1521 | Windows production | -| DR Oracle | 10.0.20.37 | 1521 | Disaster recovery | - -## SQL Migration Conventions - -When writing Oracle migration scripts, follow the naming convention: -``` -ff_YYYY_MM_DD_##_TYPE.sql -``` -Where TYPE is: DDL, DML, VIEW, PACK, TRIG, etc. - -Always reference `system_instructions/system_prompt.md` for: -- Oracle 10g compatibility requirements -- PACK_MIGRARE package usage -- Migration script patterns and examples - -## Custom Claude Code Commands - -- `/ultimate_validate_command` - Generate comprehensive validation commands -- `/plan-handover` - Save implementation plan for session handover -- `/branch-plan-handover` - Create branch and save plan -- `/context-handover` - Save context for next session - -## Git Workflow - -- Remote: `http://gitea:3000/romfast/ROMFASTSQL.git` -- Main branch: `master` -- Feature branches merged directly to master +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +ROMFASTSQL is an infrastructure and database management project for ROMFAST, featuring: +- Proxmox virtualization cluster (3 nodes: pve1, pvemini, pveelite) +- Oracle Database XE 21c with migration support from Oracle 10g +- AI chatbot system (Flowise + Claude) +- Disaster recovery infrastructure + +## Repository Structure + +``` +proxmox/ # Main infrastructure documentation +├── README.md # Master index - START HERE +├── cluster/ # Proxmox cluster, UPS, storage management +├── lxc102-docker/ # Docker + Portainer + Docker Sandboxes (sbx) +├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000) +├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522) +├── lxc110-moltbot/ # MoltBot AI Telegram Bot +├── lxc171-claude-agent/ # Claude Code development environment +├── vm109-windows-dr/ # Windows Disaster Recovery VM +├── vm201-windows/ # Windows 11 (IIS reverse proxy) +└── vm302-oracle-test/ # Windows 11 + Oracle 21c test VM (ROA setup validation) + +system_instructions/ # SQL migration guidelines and knowledge base +├── system_prompt.md # SQL migration rules - READ BEFORE WRITING SQL +└── knowledge_base/ # Example scripts and PACK_MIGRARE.pck + +scripts/ # Utilities +├── generare_proces_verbal.py # Generate assembly minutes (DOCX) +├── verificare_voturi_AG.py # Verify assembly votes +└── ups-monitor/ # UPS monitoring for production Oracle server 10.0.20.36 + +input/ # Oracle DMP files for import +``` + +## Key Documentation Entry Points + +- **Infrastructure overview**: `proxmox/README.md` +- **Oprire planificată a clusterului (lucrări electrice) — fără failover HA / fence**: `proxmox/cluster/docs/oprire-planificata-cluster.md` +- **SQL migration guidelines**: `system_instructions/system_prompt.md` (always read before generating migration SQL) +- **Oracle database setup**: `proxmox/lxc108-oracle/README.md` +- **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh` +- **Chatbot architecture**: `proxmox/lxc104-flowise/docs/prd.md` +- **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.md` +- **Disaster recovery**: `proxmox/vm109-windows-dr/README.md` +- **Instalare/migrare Oracle — care director se folosește**: `proxmox/lxc108-oracle/docs/instalare-si-migrare-oracle.md` +- **ROA Windows setup scripts (XE/SE 21c)**: `proxmox/lxc108-oracle/roa-windows-setup/README.md` +- **Conectarea clienților vechi (Instant Client 10/11) la 21c — ORA-28040 / ORA-01017 / ORA-12514**: `docs/lectii-conectare-client-oracle.md` +- **Aliasul TNS lipsă pe server — eșecuri tăcute (actualizarea ROA „SUCCEEDED" fără să aplice nimic; exportul zilnic `backupora.exe` scrie „DONE" cu directorul gol)**: `docs/lectii-actualizare-roa-alias-tns.md` +- **Kit de instalare pentru client (DMP-uri șablon + scripturi, gata de dus la client)**: `proxmox/lxc108-oracle/scripts/build-client-kit.ps1` +- **VM 302 test environment for ROA setup**: `proxmox/vm302-oracle-test/README.md` +- **Diagnostic spațiu Oracle la clienți (job zilnic + emailuri)**: `docs/diagnostic-spatiu-clienti.md` +- **Monitorizare UPS pe serverul Oracle de producție 10.0.20.36 (înlocuiește ViewPower)**: `docs/ups-server36-monitorizare.md` +- **Acces SSH la clienți cu chei publice (angajați noi)**: `docs/acces-ssh-chei-angajati.md` +- **Acces administrativ la server client prin Tailscale + SSH (fără forward pe router)**: `docs/acces-client-tailscale-ssh.md` +- **Cazuri clienți (depanare DB)**: `proxmox/lxc108-oracle/clienti/README.md` + - **ROMPETROL ENERGY — recreare PDB Oracle XE 21c după ORA-12954**: `proxmox/lxc108-oracle/clienti/oracle-xe-21c/README.md` + +## Infrastructure Commands + +### Proxmox Cluster +```bash +ssh root@10.0.20.201 "pvecm status" # Cluster status +ssh root@10.0.20.201 "pct list" # List LXC containers +ssh root@10.0.20.201 "qm list" # List VMs +``` + +### Oracle Database (LXC 108) +```bash +pct exec 108 -- docker exec -it oracle-xe sqlplus / as sysdba +pct exec 108 -- docker restart oracle-xe +``` + +### Flowise Chatbot (LXC 104) +```bash +pct exec 104 -- systemctl status flowise +pct exec 104 -- systemctl restart flowise +pct exec 104 -- journalctl -u flowise -f +``` + +### Validation Scripts +```bash +# UPS monthly test +proxmox/cluster/ups/scripts/ups-monthly-test.sh + +# SSL certificate monitoring +proxmox/vm201-windows/scripts/monitor-ssl-certificates.sh + +# Oracle backup monitoring +proxmox/vm109-windows-dr/scripts/oracle-backup-monitor-proxmox.sh +``` + +## Network Layout + +| Service | IP Address | Port | Purpose | +|---------|-----------|------|---------| +| pvemini (main host) | 10.0.20.201 | 8006 | Proxmox GUI | +| Oracle XE 21c | 10.0.20.121 | 1521 | Production database | +| Oracle XE 18c | 10.0.20.121 | 1522 | Export compatibility (TSTZ 31) | +| Flowise | 10.0.20.161 | 3000 | Chatbot UI | +| Gitea | 10.0.20.165 | 3000 | Git server | +| Docker + Portainer + sbx | 10.0.20.113 | 9000/9443 | Docker host, sandbox-uri agenți AI | +| Claude Agent | 10.0.20.171 | 22 | Development (also via Tailscale: 100.95.55.51) | +| MoltBot | 10.0.20.173 | 22 | AI Telegram Bot (also via Tailscale: 100.120.119.70) | +| Primary Oracle | 10.0.20.36 | 1521 | Windows production | +| DR Oracle | 10.0.20.37 | 1521 | Disaster recovery | + +## SQL Migration Conventions + +When writing Oracle migration scripts, follow the naming convention: +``` +ff_YYYY_MM_DD_##_TYPE.sql +``` +Where TYPE is: DDL, DML, VIEW, PACK, TRIG, etc. + +Always reference `system_instructions/system_prompt.md` for: +- Oracle 10g compatibility requirements +- PACK_MIGRARE package usage +- Migration script patterns and examples + +## Custom Claude Code Commands + +- `/ultimate_validate_command` - Generate comprehensive validation commands +- `/plan-handover` - Save implementation plan for session handover +- `/branch-plan-handover` - Create branch and save plan +- `/context-handover` - Save context for next session + +## Git Workflow + +- Remote: `http://gitea:3000/romfast/ROMFASTSQL.git` +- Main branch: `master` +- Feature branches merged directly to master diff --git a/docs/lectii-actualizare-roa-alias-tns.md b/docs/lectii-actualizare-roa-alias-tns.md index bcf602b..a231fd7 100644 --- a/docs/lectii-actualizare-roa-alias-tns.md +++ b/docs/lectii-actualizare-roa-alias-tns.md @@ -150,6 +150,80 @@ select count(*) from CONTAFIN_ORACLE.UPD_ISTORIC where stare = 2; -- trebuie 0 - Un `stare=2` rămas deschis blochează rularea următoare — de aceea `IncheiereActualizare` e primul pas după orice eșec. +## A doua victimă a aceleiași cauze: exportul zilnic `backupora.exe` + +**Constatat tot la VADECO, 2026-08-28**, la câteva ore după cazul de mai sus. Aceeași cauză — +un alias TNS care nu se rezolvă — dar alt consumator, alt simptom și, din nou, **eșec complet tăcut**. + +### Simptomul + +Task-ul `ROA Export Oracle` rulează, se termină cu **cod 0**, își creează directorul zilei +(`D:\BACKUP_ORACLE_FILES\AAAALLZZ\`) și scrie în log câte un **`DONE`** pentru fiecare schemă. +Directorul rămâne **gol**. Singura urmă e o linie discretă între `RUN` și `DONE`: + +``` +RUN d:\...\bin\expdp.exe CONTAFIN_ORACLE/******@XEPDB1 directory=dmpdir dumpfile=CONTAFIN_ORACLE_54325.dmp +Copiere DATAPUMPFILE d:\dmpdir\CONTAFIN_ORACLE_54325.dmp in d:\backup_oracle_files\20260828\... +Eroare la copiere DATAPUMPFILE: File 'd:\dmpdir\contafin_oracle_54325.dmp' does not exist. +DONE d:\backup_oracle_files\20260828\CONTAFIN_ORACLE_54325.dmp +``` + +`backupora.exe` **nu verifică codul de ieșire al lui `expdp`** și scrie `DONE` chiar și după ce +eroarea de copiere a fost logată. Deci exportul „reușește" în fiecare zi, la ora lui, fără să +producă nimic. + +### Cauza + +`schema.txt` conține linii `SCHEMA;PAROLA@XEPDB1`. Aliasul **`XEPDB1` nu exista** în `tnsnames.ora`: +`01-setup-database.ps1` scria doar aliasul `ROA` (plus `LISTENER_XE`), iar +`11-setup-backup-export.ps1` are `-ServiceName` implicit **`XEPDB1`**. Cele două scripturi din +același kit nu erau de acord asupra numelui. + +Rulat manual, `expdp` spune limpede ce nu merge: + +``` +UDE-12154: operation generated ORACLE error 12154 +ORA-12154: TNS:could not resolve the connect identifier specified +``` + +**Indiciul din log care trădează cazul:** fiecare schemă durează **exact același timp**, ~16 secunde, +indiferent de mărime. O bază de 775 MB și una de 45 MB nu se exportă în același timp. Timp uniform += `expdp` nu exportă, ci moare la conectare. + +### Reparația + +Aliasul cu numele serviciului trebuie să existe, pe lângă `ROA`, în **ambele** `tnsnames.ora` +(cel din `TNS_ADMIN` și cel din Oracle Home — vezi mai sus de ce contează amândouă). În kit: + +- `01-setup-database.ps1` scrie acum **două** aliasuri: `ROA` și unul numit ca `$ServiceName`, + ambele către același `SERVICE_NAME`. Nu atinge aliasurile generate de Oracle + (`XE`, `LISTENER_XE`, `ORACLR_CONNECTION_DATA`). +- `11-setup-backup-export.ps1` face `tnsping $ServiceName` **înainte** de a scrie `schema.txt` și + **oprește instalarea** dacă aliasul nu se rezolvă. Mai bine o instalare care se plânge decât un + backup care nu există. + +### Verificarea, la orice client + +Nu te uita la codul de ieșire al task-ului și nici la `DONE` din log. Uită-te la **fișiere**: + +```powershell +# Directorul zilei trebuie sa contina cate un .dmp de dimensiune plauzibila +Get-ChildItem "D:\BACKUP_ORACLE_FILES\$(Get-Date -Format 'yyyyMMdd')" | + Select-Object Name, @{n='MB';e={[math]::Round($_.Length/1MB,1)}} + +# Si logul zilei sa nu contina esecuri de copiere +Select-String -Path "D:\ROA\EXPORT_ORADMP\LOG\$(Get-Date -Format 'yyyyMMdd').log" -Pattern 'Eroare' +``` + +Un `.dmp` de 0 octeți sau lipsa lui înseamnă export inexistent, oricât de verde ar fi task-ul. + +### Lecția generală + +De două ori în aceeași zi, pe același server, aceeași formă: **un alias TNS lipsă nu dă eroare +vizibilă, pentru că procesul care cade e lansat de altcineva, iar cel care raportează nu-i verifică +rezultatul.** Peste tot unde un script lansează un proces extern Oracle, verifică **efectul** +(fișier scris, rând apărut), nu **raportul** procesului care l-a lansat. + ## Legături - Lecții de conectare a clienților vechi (`ORA-28040` / `ORA-01017` / `ORA-12514`): diff --git a/proxmox/lxc108-oracle/roa-windows-setup/config/sqlnet.ora b/proxmox/lxc108-oracle/roa-windows-setup/config/sqlnet.ora index f0d3fd9..872b6e9 100644 --- a/proxmox/lxc108-oracle/roa-windows-setup/config/sqlnet.ora +++ b/proxmox/lxc108-oracle/roa-windows-setup/config/sqlnet.ora @@ -103,3 +103,23 @@ NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT) # sqlplus CONTAFIN_ORACLE/ROMFASTSOFT@//host:1521/SERVICE # # ============================================================================= + +# ----------------------------------------------------------------------------- +# Autentificare OS (NTS) - Windows +# ----------------------------------------------------------------------------- + +# Permite "sqlplus / as sysdba" si "rman target /" de pe server, FARA parola. +# Necesar pentru task-ul de backup RMAN: altfel ar trebui tinuta parola SYS +# in clar intr-un fisier de pe disc. +# +# ATENTIE - sunt necesare AMANDOUA, una fara alta da ORA-01017: +# 1. linia de mai jos, si +# 2. contul Windows sa fie membru al grupului DBA al ACESTUI Oracle Home +# (ORA_OraDB21Home1_DBA, nu ORA_DBA generic): +# net localgroup ORA_OraDB21Home1_DBA /add +# Apartenenta se activeaza abia la o sesiune de logon noua. +# +# Verificat pe VADECO 2026-08-28: cu grupul corect dar FARA linia asta, +# "/ as sysdba" tot da ORA-01017. Nu afecteaza conectarile cu parola si nici +# clientii vechi Instant Client (ambele testate dupa modificare). +SQLNET.AUTHENTICATION_SERVICES = (NTS) diff --git a/proxmox/lxc108-oracle/roa-windows-setup/scripts/01-setup-database.ps1 b/proxmox/lxc108-oracle/roa-windows-setup/scripts/01-setup-database.ps1 index 6a17eb4..d24b432 100644 --- a/proxmox/lxc108-oracle/roa-windows-setup/scripts/01-setup-database.ps1 +++ b/proxmox/lxc108-oracle/roa-windows-setup/scripts/01-setup-database.ps1 @@ -372,10 +372,32 @@ NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT) Write-LogWarning "Nu am putut determina IP-ul din LAN; folosesc numele masinii ($gazdaTns) in tnsnames.ora." } - $roaAliasBlock = @" -# Aliasul ROA - necesar si serverului, nu doar statiilor. Vezi comentariul din + # Doua aliasuri, nu unul, pentru ca doua consumatoare diferite cer + # nume diferite pentru ACEEASI baza: + # + # ROA - aplicatia (NOM_FIRME.NUME_SERVER) si PACK_UPDATE. + # XEPDB1 - numele serviciului. 11-setup-backup-export.ps1 scrie in + # schema.txt linii de forma SCHEMA;PAROLA@$ServiceName, iar + # backupora.exe le da mai departe lui expdp. + # + # Daca al doilea lipseste, expdp cade instant cu ORA-12154, nu scrie + # niciun DMP, iar backupora.exe logheaza TOTUSI "DONE" pentru fiecare + # schema: exportul zilnic nu exista, si nimic nu tipa. + # Constatat la VADECO pe 2026-08-28 - patru zile de directoare goale. + # + # Nu atingem aliasurile generate de Oracle (XE, LISTENER_XE, + # ORACLR_CONNECTION_DATA): daca $ServiceName e chiar unul dintre ele, + # exista deja si e corect. + $aliasuriOracle = @('XE', 'LISTENER_XE', 'ORACLR_CONNECTION_DATA') + $aliasuriNoastre = @('ROA') + if ($ServiceName -and $ServiceName -ne 'ROA' -and $aliasuriOracle -notcontains $ServiceName) { + $aliasuriNoastre += $ServiceName + } + + $roaAliasBlock = ($aliasuriNoastre | ForEach-Object { @" +# Alias $_ - necesar si serverului, nu doar statiilor. Vezi comentariul din # 01-setup-database.ps1 si docs/lectii-actualizare-roa-alias-tns.md. -ROA = +$_ = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port)) (CONNECT_DATA = @@ -383,7 +405,7 @@ ROA = (SERVICE_NAME = $ServiceName) ) ) -"@ +"@ }) -join "`r`n" # Aliasul ROA trebuie sa existe SI in tnsnames.ora al Oracle Home-ului, # nu doar in cel din TNS_ADMIN (instantclient). @@ -418,14 +440,21 @@ ROA = # rand gol intre): sunt antetul blocului nostru si, altfel, s-ar # acumula cate o copie la fiecare rulare. Un rand gol opreste # potrivirea, deci antetul fisierului ramane intact. - $continutTns = [regex]::Replace((Get-Content $homeTnsNames -Raw), - '(?ms)(^[ \t]*#[^\r\n]*\r?\n)*^[ \t]*ROA[ \t]*=.*?(?=^[ \t]*[A-Za-z0-9_\.]+[ \t]*=|\z)', '') + # Curat FIECARE alias pe care il scriem noi, nu doar ROA: altfel + # cel de-al doilea (numele serviciului) s-ar dubla la fiecare + # rulare, pentru ca regexul lui ROA se opreste exact la el. + $continutTns = Get-Content $homeTnsNames -Raw + foreach ($alias in $aliasuriNoastre) { + $continutTns = [regex]::Replace($continutTns, + '(?ms)(^[ \t]*#[^\r\n]*\r?\n)*^[ \t]*' + [regex]::Escape($alias) + + '[ \t]*=.*?(?=^[ \t]*[A-Za-z0-9_\.]+[ \t]*=|\z)', '') + } $continutTns = $continutTns.TrimEnd() + "`r`n`r`n" + $roaAliasBlock } else { $continutTns = "# tnsnames.ora - generat de 01-setup-database.ps1`r`n`r`n" + $roaAliasBlock } Set-Content -Path $homeTnsNames -Value $continutTns -Encoding ASCII - Write-LogSuccess "tnsnames.ora (Oracle Home): alias ROA -> ${gazdaTns}:$Port/$ServiceName" + Write-LogSuccess "tnsnames.ora (Oracle Home): aliasuri $($aliasuriNoastre -join ', ') -> ${gazdaTns}:$Port/$ServiceName" # Daca exista TNS_ADMIN la nivel de masina, ACELA castiga - si pentru # clienti, si pentru procesele bazei, care mostenesc variabilele de @@ -478,20 +507,15 @@ ROA = Write-LogWarning "Rescriu $tnsNames (aliasuri existente: $($aliasuriVechi -join ', ')). Copia veche: tnsnames.ora.bak_$stampTns" } + # Acelasi $roaAliasBlock ca in Oracle Home: o singura sursa + # pentru aliasuri, ca cele doua fisiere sa nu poata diverge. $tnsContent = @" # tnsnames.ora - generat de 01-setup-database.ps1 pe $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') # # HOST e IP-ul serverului din LAN, nu localhost: acelasi fisier trebuie sa # functioneze si copiat pe statiile de lucru. -ROA = - (DESCRIPTION = - (ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port)) - (CONNECT_DATA = - (SERVER = DEDICATED) - (SERVICE_NAME = $ServiceName) - ) - ) +$roaAliasBlock # Folosit de instanta pentru LOCAL_LISTENER. Fara el, o instanta care # porneste cu TNS_ADMIN aici nu se mai inregistreaza la listener. @@ -499,7 +523,7 @@ LISTENER_XE = (ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port)) "@ Set-Content -Path $tnsNames -Value $tnsContent -Encoding ASCII - Write-LogSuccess "tnsnames.ora scris in TNS_ADMIN: alias ROA -> ${gazdaTns}:$Port/$ServiceName" + Write-LogSuccess "tnsnames.ora scris in TNS_ADMIN: aliasuri $($aliasuriNoastre -join ', ') -> ${gazdaTns}:$Port/$ServiceName" } } diff --git a/proxmox/lxc108-oracle/roa-windows-setup/scripts/11-setup-backup-export.ps1 b/proxmox/lxc108-oracle/roa-windows-setup/scripts/11-setup-backup-export.ps1 index f503761..06b2718 100644 --- a/proxmox/lxc108-oracle/roa-windows-setup/scripts/11-setup-backup-export.ps1 +++ b/proxmox/lxc108-oracle/roa-windows-setup/scripts/11-setup-backup-export.ps1 @@ -197,6 +197,31 @@ function New-SchemaFile { Write-LogSection "schema.txt" + # Verificarea care lipsea si care a costat, la VADECO, patru zile de export + # gol (28.08.2026): sirul de conectare scris in schema.txt trebuie sa se + # REZOLVE. Daca aliasul nu exista in tnsnames.ora, expdp cade instant cu + # ORA-12154, nu scrie niciun DMP - dar backupora.exe logheaza TOTUSI "DONE" + # pentru fiecare schema si creeaza directorul zilei, gol. Esecul e complet + # tacut: nicio alarma, doar backup-uri care nu exista. + # De aceea aici oprim zgomotos, inainte ca fisierul sa apuce sa fie folosit. + $tnsping = Join-Path $OraHome "bin\tnsping.exe" + if (Test-Path $tnsping) { + $iesireTns = & $tnsping $Service 2>&1 | Out-String + if ($LASTEXITCODE -ne 0 -or $iesireTns -match 'TNS-\d') { + Write-LogError "Aliasul TNS '$Service' NU se rezolva." + Write-LogError "schema.txt cere '@$Service', deci expdp ar cadea cu ORA-12154 la fiecare" + Write-LogError "rulare, iar backupora.exe ar raporta oricum 'DONE'. Exportul zilnic ar fi gol." + Write-LogError "Repara: ruleaza 01-setup-database.ps1 (scrie aliasul in tnsnames.ora)" + Write-LogError "sau da un -ServiceName care se rezolva." + throw "Aliasul TNS '$Service' nu se rezolva - schema.txt ar produce un export gol." + } + Write-LogSuccess "Aliasul TNS '$Service' se rezolva - expdp se va putea conecta." + } + else { + Write-LogWarning "Nu gasesc tnsping.exe in $OraHome\bin; sar peste verificarea aliasului '$Service'." + Write-LogWarning "Verifica manual ca '@$Service' se rezolva, altfel exportul zilnic va fi gol." + } + if ($SourcePath) { if (Test-Path $SourcePath) { Copy-Item -Path $SourcePath -Destination $SchemaFile -Force