merge: aliasul TNS lipsa rupea exportul zilnic + raport client VADECO
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X9Sa54oFKpE2XhD6A7NTch
This commit is contained in:
272
CLAUDE.md
272
CLAUDE.md
@@ -1,136 +1,136 @@
|
|||||||
# CLAUDE.md
|
# CLAUDE.md
|
||||||
|
|
||||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|
||||||
ROMFASTSQL is an infrastructure and database management project for ROMFAST, featuring:
|
ROMFASTSQL is an infrastructure and database management project for ROMFAST, featuring:
|
||||||
- Proxmox virtualization cluster (3 nodes: pve1, pvemini, pveelite)
|
- Proxmox virtualization cluster (3 nodes: pve1, pvemini, pveelite)
|
||||||
- Oracle Database XE 21c with migration support from Oracle 10g
|
- Oracle Database XE 21c with migration support from Oracle 10g
|
||||||
- AI chatbot system (Flowise + Claude)
|
- AI chatbot system (Flowise + Claude)
|
||||||
- Disaster recovery infrastructure
|
- Disaster recovery infrastructure
|
||||||
|
|
||||||
## Repository Structure
|
## Repository Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
proxmox/ # Main infrastructure documentation
|
proxmox/ # Main infrastructure documentation
|
||||||
├── README.md # Master index - START HERE
|
├── README.md # Master index - START HERE
|
||||||
├── cluster/ # Proxmox cluster, UPS, storage management
|
├── cluster/ # Proxmox cluster, UPS, storage management
|
||||||
├── lxc102-docker/ # Docker + Portainer + Docker Sandboxes (sbx)
|
├── lxc102-docker/ # Docker + Portainer + Docker Sandboxes (sbx)
|
||||||
├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000)
|
├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000)
|
||||||
├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522)
|
├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522)
|
||||||
├── lxc110-moltbot/ # MoltBot AI Telegram Bot
|
├── lxc110-moltbot/ # MoltBot AI Telegram Bot
|
||||||
├── lxc171-claude-agent/ # Claude Code development environment
|
├── lxc171-claude-agent/ # Claude Code development environment
|
||||||
├── vm109-windows-dr/ # Windows Disaster Recovery VM
|
├── vm109-windows-dr/ # Windows Disaster Recovery VM
|
||||||
├── vm201-windows/ # Windows 11 (IIS reverse proxy)
|
├── vm201-windows/ # Windows 11 (IIS reverse proxy)
|
||||||
└── vm302-oracle-test/ # Windows 11 + Oracle 21c test VM (ROA setup validation)
|
└── vm302-oracle-test/ # Windows 11 + Oracle 21c test VM (ROA setup validation)
|
||||||
|
|
||||||
system_instructions/ # SQL migration guidelines and knowledge base
|
system_instructions/ # SQL migration guidelines and knowledge base
|
||||||
├── system_prompt.md # SQL migration rules - READ BEFORE WRITING SQL
|
├── system_prompt.md # SQL migration rules - READ BEFORE WRITING SQL
|
||||||
└── knowledge_base/ # Example scripts and PACK_MIGRARE.pck
|
└── knowledge_base/ # Example scripts and PACK_MIGRARE.pck
|
||||||
|
|
||||||
scripts/ # Utilities
|
scripts/ # Utilities
|
||||||
├── generare_proces_verbal.py # Generate assembly minutes (DOCX)
|
├── generare_proces_verbal.py # Generate assembly minutes (DOCX)
|
||||||
├── verificare_voturi_AG.py # Verify assembly votes
|
├── verificare_voturi_AG.py # Verify assembly votes
|
||||||
└── ups-monitor/ # UPS monitoring for production Oracle server 10.0.20.36
|
└── ups-monitor/ # UPS monitoring for production Oracle server 10.0.20.36
|
||||||
|
|
||||||
input/ # Oracle DMP files for import
|
input/ # Oracle DMP files for import
|
||||||
```
|
```
|
||||||
|
|
||||||
## Key Documentation Entry Points
|
## Key Documentation Entry Points
|
||||||
|
|
||||||
- **Infrastructure overview**: `proxmox/README.md`
|
- **Infrastructure overview**: `proxmox/README.md`
|
||||||
- **Oprire planificată a clusterului (lucrări electrice) — fără failover HA / fence**: `proxmox/cluster/docs/oprire-planificata-cluster.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)
|
- **SQL migration guidelines**: `system_instructions/system_prompt.md` (always read before generating migration SQL)
|
||||||
- **Oracle database setup**: `proxmox/lxc108-oracle/README.md`
|
- **Oracle database setup**: `proxmox/lxc108-oracle/README.md`
|
||||||
- **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh`
|
- **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh`
|
||||||
- **Chatbot architecture**: `proxmox/lxc104-flowise/docs/prd.md`
|
- **Chatbot architecture**: `proxmox/lxc104-flowise/docs/prd.md`
|
||||||
- **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.md`
|
- **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.md`
|
||||||
- **Disaster recovery**: `proxmox/vm109-windows-dr/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`
|
- **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`
|
- **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`
|
- **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`
|
- **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`
|
- **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`
|
- **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`
|
- **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`
|
- **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 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`
|
- **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`
|
- **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`
|
- **ROMPETROL ENERGY — recreare PDB Oracle XE 21c după ORA-12954**: `proxmox/lxc108-oracle/clienti/oracle-xe-21c/README.md`
|
||||||
|
|
||||||
## Infrastructure Commands
|
## Infrastructure Commands
|
||||||
|
|
||||||
### Proxmox Cluster
|
### Proxmox Cluster
|
||||||
```bash
|
```bash
|
||||||
ssh root@10.0.20.201 "pvecm status" # Cluster status
|
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 "pct list" # List LXC containers
|
||||||
ssh root@10.0.20.201 "qm list" # List VMs
|
ssh root@10.0.20.201 "qm list" # List VMs
|
||||||
```
|
```
|
||||||
|
|
||||||
### Oracle Database (LXC 108)
|
### Oracle Database (LXC 108)
|
||||||
```bash
|
```bash
|
||||||
pct exec 108 -- docker exec -it oracle-xe sqlplus / as sysdba
|
pct exec 108 -- docker exec -it oracle-xe sqlplus / as sysdba
|
||||||
pct exec 108 -- docker restart oracle-xe
|
pct exec 108 -- docker restart oracle-xe
|
||||||
```
|
```
|
||||||
|
|
||||||
### Flowise Chatbot (LXC 104)
|
### Flowise Chatbot (LXC 104)
|
||||||
```bash
|
```bash
|
||||||
pct exec 104 -- systemctl status flowise
|
pct exec 104 -- systemctl status flowise
|
||||||
pct exec 104 -- systemctl restart flowise
|
pct exec 104 -- systemctl restart flowise
|
||||||
pct exec 104 -- journalctl -u flowise -f
|
pct exec 104 -- journalctl -u flowise -f
|
||||||
```
|
```
|
||||||
|
|
||||||
### Validation Scripts
|
### Validation Scripts
|
||||||
```bash
|
```bash
|
||||||
# UPS monthly test
|
# UPS monthly test
|
||||||
proxmox/cluster/ups/scripts/ups-monthly-test.sh
|
proxmox/cluster/ups/scripts/ups-monthly-test.sh
|
||||||
|
|
||||||
# SSL certificate monitoring
|
# SSL certificate monitoring
|
||||||
proxmox/vm201-windows/scripts/monitor-ssl-certificates.sh
|
proxmox/vm201-windows/scripts/monitor-ssl-certificates.sh
|
||||||
|
|
||||||
# Oracle backup monitoring
|
# Oracle backup monitoring
|
||||||
proxmox/vm109-windows-dr/scripts/oracle-backup-monitor-proxmox.sh
|
proxmox/vm109-windows-dr/scripts/oracle-backup-monitor-proxmox.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Network Layout
|
## Network Layout
|
||||||
|
|
||||||
| Service | IP Address | Port | Purpose |
|
| Service | IP Address | Port | Purpose |
|
||||||
|---------|-----------|------|---------|
|
|---------|-----------|------|---------|
|
||||||
| pvemini (main host) | 10.0.20.201 | 8006 | Proxmox GUI |
|
| pvemini (main host) | 10.0.20.201 | 8006 | Proxmox GUI |
|
||||||
| Oracle XE 21c | 10.0.20.121 | 1521 | Production database |
|
| Oracle XE 21c | 10.0.20.121 | 1521 | Production database |
|
||||||
| Oracle XE 18c | 10.0.20.121 | 1522 | Export compatibility (TSTZ 31) |
|
| Oracle XE 18c | 10.0.20.121 | 1522 | Export compatibility (TSTZ 31) |
|
||||||
| Flowise | 10.0.20.161 | 3000 | Chatbot UI |
|
| Flowise | 10.0.20.161 | 3000 | Chatbot UI |
|
||||||
| Gitea | 10.0.20.165 | 3000 | Git server |
|
| Gitea | 10.0.20.165 | 3000 | Git server |
|
||||||
| Docker + Portainer + sbx | 10.0.20.113 | 9000/9443 | Docker host, sandbox-uri agenți AI |
|
| 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) |
|
| 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) |
|
| 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 |
|
| Primary Oracle | 10.0.20.36 | 1521 | Windows production |
|
||||||
| DR Oracle | 10.0.20.37 | 1521 | Disaster recovery |
|
| DR Oracle | 10.0.20.37 | 1521 | Disaster recovery |
|
||||||
|
|
||||||
## SQL Migration Conventions
|
## SQL Migration Conventions
|
||||||
|
|
||||||
When writing Oracle migration scripts, follow the naming convention:
|
When writing Oracle migration scripts, follow the naming convention:
|
||||||
```
|
```
|
||||||
ff_YYYY_MM_DD_##_TYPE.sql
|
ff_YYYY_MM_DD_##_TYPE.sql
|
||||||
```
|
```
|
||||||
Where TYPE is: DDL, DML, VIEW, PACK, TRIG, etc.
|
Where TYPE is: DDL, DML, VIEW, PACK, TRIG, etc.
|
||||||
|
|
||||||
Always reference `system_instructions/system_prompt.md` for:
|
Always reference `system_instructions/system_prompt.md` for:
|
||||||
- Oracle 10g compatibility requirements
|
- Oracle 10g compatibility requirements
|
||||||
- PACK_MIGRARE package usage
|
- PACK_MIGRARE package usage
|
||||||
- Migration script patterns and examples
|
- Migration script patterns and examples
|
||||||
|
|
||||||
## Custom Claude Code Commands
|
## Custom Claude Code Commands
|
||||||
|
|
||||||
- `/ultimate_validate_command` - Generate comprehensive validation commands
|
- `/ultimate_validate_command` - Generate comprehensive validation commands
|
||||||
- `/plan-handover` - Save implementation plan for session handover
|
- `/plan-handover` - Save implementation plan for session handover
|
||||||
- `/branch-plan-handover` - Create branch and save plan
|
- `/branch-plan-handover` - Create branch and save plan
|
||||||
- `/context-handover` - Save context for next session
|
- `/context-handover` - Save context for next session
|
||||||
|
|
||||||
## Git Workflow
|
## Git Workflow
|
||||||
|
|
||||||
- Remote: `http://gitea:3000/romfast/ROMFASTSQL.git`
|
- Remote: `http://gitea:3000/romfast/ROMFASTSQL.git`
|
||||||
- Main branch: `master`
|
- Main branch: `master`
|
||||||
- Feature branches merged directly to master
|
- Feature branches merged directly to master
|
||||||
|
|||||||
@@ -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
|
- Un `stare=2` rămas deschis blochează rularea următoare — de aceea `IncheiereActualizare` e primul
|
||||||
pas după orice eșec.
|
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
|
## Legături
|
||||||
|
|
||||||
- Lecții de conectare a clienților vechi (`ORA-28040` / `ORA-01017` / `ORA-12514`):
|
- Lecții de conectare a clienților vechi (`ORA-28040` / `ORA-01017` / `ORA-12514`):
|
||||||
|
|||||||
62
docs/raport-client-vadeco-migrare.md
Normal file
62
docs/raport-client-vadeco-migrare.md
Normal file
@@ -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.
|
||||||
@@ -103,3 +103,23 @@ NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
|
|||||||
# sqlplus CONTAFIN_ORACLE/ROMFASTSOFT@//host:1521/SERVICE
|
# 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 <cont> /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)
|
||||||
|
|||||||
@@ -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."
|
Write-LogWarning "Nu am putut determina IP-ul din LAN; folosesc numele masinii ($gazdaTns) in tnsnames.ora."
|
||||||
}
|
}
|
||||||
|
|
||||||
$roaAliasBlock = @"
|
# Doua aliasuri, nu unul, pentru ca doua consumatoare diferite cer
|
||||||
# Aliasul ROA - necesar si serverului, nu doar statiilor. Vezi comentariul din
|
# 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.
|
# 01-setup-database.ps1 si docs/lectii-actualizare-roa-alias-tns.md.
|
||||||
ROA =
|
$_ =
|
||||||
(DESCRIPTION =
|
(DESCRIPTION =
|
||||||
(ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port))
|
(ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port))
|
||||||
(CONNECT_DATA =
|
(CONNECT_DATA =
|
||||||
@@ -383,7 +405,7 @@ ROA =
|
|||||||
(SERVICE_NAME = $ServiceName)
|
(SERVICE_NAME = $ServiceName)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
"@
|
"@ }) -join "`r`n"
|
||||||
|
|
||||||
# Aliasul ROA trebuie sa existe SI in tnsnames.ora al Oracle Home-ului,
|
# Aliasul ROA trebuie sa existe SI in tnsnames.ora al Oracle Home-ului,
|
||||||
# nu doar in cel din TNS_ADMIN (instantclient).
|
# nu doar in cel din TNS_ADMIN (instantclient).
|
||||||
@@ -418,14 +440,21 @@ ROA =
|
|||||||
# rand gol intre): sunt antetul blocului nostru si, altfel, s-ar
|
# rand gol intre): sunt antetul blocului nostru si, altfel, s-ar
|
||||||
# acumula cate o copie la fiecare rulare. Un rand gol opreste
|
# acumula cate o copie la fiecare rulare. Un rand gol opreste
|
||||||
# potrivirea, deci antetul fisierului ramane intact.
|
# potrivirea, deci antetul fisierului ramane intact.
|
||||||
$continutTns = [regex]::Replace((Get-Content $homeTnsNames -Raw),
|
# Curat FIECARE alias pe care il scriem noi, nu doar ROA: altfel
|
||||||
'(?ms)(^[ \t]*#[^\r\n]*\r?\n)*^[ \t]*ROA[ \t]*=.*?(?=^[ \t]*[A-Za-z0-9_\.]+[ \t]*=|\z)', '')
|
# 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
|
$continutTns = $continutTns.TrimEnd() + "`r`n`r`n" + $roaAliasBlock
|
||||||
} else {
|
} else {
|
||||||
$continutTns = "# tnsnames.ora - generat de 01-setup-database.ps1`r`n`r`n" + $roaAliasBlock
|
$continutTns = "# tnsnames.ora - generat de 01-setup-database.ps1`r`n`r`n" + $roaAliasBlock
|
||||||
}
|
}
|
||||||
Set-Content -Path $homeTnsNames -Value $continutTns -Encoding ASCII
|
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
|
# Daca exista TNS_ADMIN la nivel de masina, ACELA castiga - si pentru
|
||||||
# clienti, si pentru procesele bazei, care mostenesc variabilele de
|
# 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"
|
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 = @"
|
$tnsContent = @"
|
||||||
# tnsnames.ora - generat de 01-setup-database.ps1 pe $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
|
# 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
|
# HOST e IP-ul serverului din LAN, nu localhost: acelasi fisier trebuie sa
|
||||||
# functioneze si copiat pe statiile de lucru.
|
# functioneze si copiat pe statiile de lucru.
|
||||||
|
|
||||||
ROA =
|
$roaAliasBlock
|
||||||
(DESCRIPTION =
|
|
||||||
(ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port))
|
|
||||||
(CONNECT_DATA =
|
|
||||||
(SERVER = DEDICATED)
|
|
||||||
(SERVICE_NAME = $ServiceName)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Folosit de instanta pentru LOCAL_LISTENER. Fara el, o instanta care
|
# Folosit de instanta pentru LOCAL_LISTENER. Fara el, o instanta care
|
||||||
# porneste cu TNS_ADMIN aici nu se mai inregistreaza la listener.
|
# porneste cu TNS_ADMIN aici nu se mai inregistreaza la listener.
|
||||||
@@ -499,7 +523,7 @@ LISTENER_XE =
|
|||||||
(ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port))
|
(ADDRESS = (PROTOCOL = TCP)(HOST = $gazdaTns)(PORT = $Port))
|
||||||
"@
|
"@
|
||||||
Set-Content -Path $tnsNames -Value $tnsContent -Encoding ASCII
|
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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -197,6 +197,31 @@ function New-SchemaFile {
|
|||||||
|
|
||||||
Write-LogSection "schema.txt"
|
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 ($SourcePath) {
|
||||||
if (Test-Path $SourcePath) {
|
if (Test-Path $SourcePath) {
|
||||||
Copy-Item -Path $SourcePath -Destination $SchemaFile -Force
|
Copy-Item -Path $SourcePath -Destination $SchemaFile -Force
|
||||||
|
|||||||
Reference in New Issue
Block a user