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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X9Sa54oFKpE2XhD6A7NTch
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user