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/docs/raport-client-vadeco-migrare.md b/docs/raport-client-vadeco-migrare.md new file mode 100644 index 0000000..464186e --- /dev/null +++ b/docs/raport-client-vadeco-migrare.md @@ -0,0 +1,62 @@ +# Raport client VADECO — migrare bază de date + +## Text pentru factură + +- Am instalat și configurat de la zero un server nou, dedicat bazelor de date ale companiei. +- Am mutat pe el bazele de date ale celor cinci firme — VADECO SRL, VADECO VR, DANUBE, LACERTA, + SPACE — plus baza centrală comună, consolidând pe un singur server datele aflate până acum pe + două servere separate. Transferul s-a făcut după programul de lucru, pe date complete. +- Am recreat conturile de utilizator și drepturile de acces, pe fiecare firmă, identice cu cele + dinainte. +- Am configurat calculatoarele din firmă pentru conectarea la noul server, inclusiv cele cu + versiuni mai vechi ale programului, care au cerut setări suplimentare de compatibilitate. +- Am oprit serviciile de baze de date de pe serverele vechi, după confirmarea că noul server + funcționează corect, ca să nu se lucreze din greșeală pe date vechi. +- Am aplicat cea mai recentă versiune a programului ROA pe toate bazele migrate și am configurat + actualizarea automată zilnică. +- Am configurat două salvări automate independente, în fiecare noapte: o copie completă a bazei, + care permite revenirea la orice moment din ultimele două zile, și o salvare separată pe firme. +- Am testat restaurarea din aceste copii — datele se pot efectiv reface, nu doar salva. +- Am configurat baza să păstreze mai multe copii ale fișierelor sale critice, în locații diferite, + ca pierderea unui singur fișier să nu oprească baza. +- Am verificat final fiecare firmă, comparând datele cu cele de pe serverele vechi. Toate + verificările au fost trecute. + +--- + +## Note interne + +**Două puncte din text sunt pe răspunderea ta — nu au acoperire în documentația proiectului.** +Dacă nu le-ai făcut, șterge paragrafele corespunzătoare din textul de factură: + +- **„Configurarea calculatoarelor din firmă"** — în documente există doar o probă de conectare cu + Instant Client 11.2 rulată *pe server*, ca simulare a unei stații vechi. Nu există nicio urmă că + s-a umblat efectiv pe calculatoarele clientului. Partea despre setările de compatibilitate **pe + server** e însă reală și documentată (`docs/lectii-conectare-client-oracle.md`). +- **„Scoaterea din uz a serverelor vechi"** — nu apare nicăieri. Documentele descriu doar ștergerea + fișierelor temporare de transfer de pe serverele vechi, ca curățenie după export, nu oprirea sau + dezactivarea serviciilor Oracle ori a aplicației de acolo. + +**Restul textului e acoperit integral**, inclusiv părțile adăugate pe 28.08.2026: + +- **Salvările automate — ambele funcționează și sunt testate.** Copia completă a bazei (RMAN, task + zilnic la 02:00, retenție 2 zile) a rulat cu succes, iar validarea restaurării a trecut fără + erori. Exportul pe firme (`backupora.exe`, 22:30) a fost reparat și verificat prin rulare reală: + 6 fișiere, 968 MB. +- **Măsurile de siguranță la nivelul bazei** — 3 copii ale fișierului de control și 2 copii ale + fiecărui jurnal de tranzacții, toate mutate pe volumul `D:`. + +**De ținut minte, dacă întreabă clientul:** + +- **Exportul zilnic nu a produs niciun fișier între 25 și 28.08.2026** — aliasul TNS lipsea, iar + task-ul raporta succes cu directorul gol. Reparat pe 28.08. Prima salvare reală e cea din 28.08; + pentru zilele acelea **nu există** copii. +- **Copiile nu au plecat încă de pe server.** Totul stă pe același disc fizic. Până nu se pune + utilitarul de sincronizare în cloud, e protecție împotriva ștergerii accidentale, **nu** disaster + recovery. Directoarele de sincronizat: `D:\app\Administrator\fast_recovery_area` și + `D:\BACKUP_ORACLE_FILES`. +- **CUSTOMERID 134** — identificatorul de client folosit la actualizarea ROA nu e confirmat cu + certitudine ca fiind cel corect pentru VADECO (au apărut în descărcări arhive ale altui client, + posibil moștenite din șablon). +- **Notificările pe email la erori de actualizare nu funcționează** (problemă SMTP la furnizor). + Nu afectează aplicarea actualizării, dar înseamnă că un eșec viitor nu va fi semnalat automat. 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