fix(oracle): calea DMPDIR devine parametru; sqlnet.ora ajunge unde e citit
Gasite la instalarea de productie VADECO (Oracle 21c XE, Windows Server 2019). 1. Pe serverul VADECO procesul Oracle nu poate atinge nicio cale de pe C:, nici macar C:\Windows\Temp, desi ACL-urile sunt corecte si serviciul ruleaza ca NT SERVICE\OracleServiceXE. D: merge cu exact acelasi grant. Calea DMP era insa hardcodata "C:\DMPDIR" in 01, 02, 05, 06 si in biblioteca, deci instalarea nu se putea muta. Acum e parametrul -DmpDir, expus ca /dmpdest: in FAZA1.cmd si FAZA2.cmd si transmis tuturor pasilor. Cel mai perfid era pasul 02: recrea DIRECTORY DMPDIR pe 'C:\DMPDIR' peste valoarea pusa de 01. Chiar cu restul instalarii mutata, SYS.NEWSCHEMA ar fi cautat FIRMANOUA.dmp in alta parte, iar adaugarea unei firme noi ar fi picat peste luni, fara legatura vizibila cu instalarea. 2. New-OracleDirectory compara doar siruri de caractere: verifica ce scrie in dba_directories, nu daca baza chiar poate scrie acolo. Acum face un UTL_FILE round-trip si esueaza pe loc, cu explicatia cauzei. Inainte, directorul inutilizabil trecea drept bun si importul cadea abia in impdp cu ORA-29283, la zeci de linii distanta. Valoarea de retur nici nu era verificata in 01/03/06 - de aici si "True" ratacit in log. 3. Instalarea ROAClient seteaza TNS_ADMIN de masina spre instantclient-ul ei. Serviciul Oracle mosteneste variabilele de masina, deci citea sqlnet.ora de acolo - unde nu exista niciunul - si nu din Oracle Home, unde il scria pasul 01. Compatibilitatea pentru clienti vechi nu se aplica, iar statiile ar fi primit ORA-28040 cu fisierul scris corect, in locul gresit. Pasul 01 scrie acum sqlnet.ora si in TNS_ADMIN cand difera. 4. Pasul 05 lega schemele de DMP-uri cu "^$schema[_\.]", deci schema DANUBE putea primi DANUBE_20200914.dmp - datele altei firme, fara avertisment. Numele exact are acum intaietate, prefixul se accepta doar daca e unic, iar ambiguitatea se raporteaza. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
This commit is contained in:
@@ -87,7 +87,13 @@ param(
|
||||
[switch]$SkipSqlnetConfig,
|
||||
|
||||
[Parameter(Mandatory = $false)]
|
||||
[switch]$ResetSystemPassword
|
||||
[switch]$ResetSystemPassword,
|
||||
|
||||
# Calea fizica a directorului Oracle DMPDIR. Aceeasi valoare trebuie data
|
||||
# tuturor pasilor care ating DMPDIR (01, 02, 03, 05, 06), altfel ultimul
|
||||
# care ruleaza repozitioneaza obiectul si ceilalti citesc din alta parte.
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$DmpDir = "C:\DMPDIR"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
@@ -355,6 +361,31 @@ NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
|
||||
Write-LogSuccess "sqlnet.ora configured at $sqlnetOra"
|
||||
Write-Log "Old client compatibility enabled (SQLNET.ALLOWED_LOGON_VERSION=8)"
|
||||
|
||||
# Daca exista TNS_ADMIN la nivel de masina, ACELA castiga - si pentru
|
||||
# clienti, si pentru serviciul Oracle, care mosteneste variabilele de
|
||||
# masina. Instalarea ROAClient il pune sa arate spre instantclient-ul
|
||||
# ei (D:\ROA\instantclient_11_2_0_2), unde de obicei nu exista niciun
|
||||
# sqlnet.ora: atunci serverul cade pe valorile implicite, adica
|
||||
# ALLOWED_LOGON_VERSION_SERVER=12, si clientii vechi primesc ORA-28040
|
||||
# desi fisierul de mai sus a fost scris corect. Scriem acelasi continut
|
||||
# si acolo, altfel toata configurarea de compatibilitate e degeaba.
|
||||
$tnsAdmin = [Environment]::GetEnvironmentVariable('TNS_ADMIN', 'Machine')
|
||||
if ($tnsAdmin) {
|
||||
$tnsAdminFull = [IO.Path]::GetFullPath($tnsAdmin.TrimEnd('\'))
|
||||
if ($tnsAdminFull -ne [IO.Path]::GetFullPath($networkAdmin.TrimEnd('\'))) {
|
||||
Write-LogWarning "TNS_ADMIN de masina arata spre $tnsAdminFull - acolo se citeste sqlnet.ora, nu din Oracle Home."
|
||||
if (-not (Test-Path $tnsAdminFull)) {
|
||||
New-Item -ItemType Directory -Path $tnsAdminFull -Force | Out-Null
|
||||
}
|
||||
$tnsSqlnet = Join-Path $tnsAdminFull "sqlnet.ora"
|
||||
if (Test-Path $tnsSqlnet) {
|
||||
Copy-Item $tnsSqlnet "$tnsSqlnet.bak_$(Get-Date -Format 'yyyyMMdd_HHmmss')" -Force
|
||||
}
|
||||
Set-Content -Path $tnsSqlnet -Value $sqlnetContent -Encoding ASCII
|
||||
Write-LogSuccess "sqlnet.ora scris si in TNS_ADMIN: $tnsSqlnet"
|
||||
}
|
||||
}
|
||||
|
||||
# Restart listener to apply changes
|
||||
Write-Log "Restarting listener to apply sqlnet.ora changes..."
|
||||
$lsnrctl = Join-Path $oraHome "bin\lsnrctl.exe"
|
||||
@@ -536,11 +567,12 @@ EXIT;
|
||||
# Step 9: Create DMPDIR directory for Data Pump
|
||||
Write-LogSection "Creating Data Pump Directory"
|
||||
|
||||
$dmpDir = "C:\DMPDIR"
|
||||
New-OracleDirectory -OracleHome $oraHome -ServiceName $ServiceName `
|
||||
-Password $SystemPassword -DirectoryName "DMPDIR" -DirectoryPath $dmpDir
|
||||
if (-not (New-OracleDirectory -OracleHome $oraHome -ServiceName $ServiceName `
|
||||
-Password $SystemPassword -DirectoryName "DMPDIR" -DirectoryPath $DmpDir)) {
|
||||
throw "Directorul Data Pump DMPDIR ($DmpDir) nu e utilizabil de catre baza. Vezi mesajele de mai sus."
|
||||
}
|
||||
|
||||
Write-LogSuccess "Data Pump directory DMPDIR created: $dmpDir"
|
||||
Write-LogSuccess "Data Pump directory DMPDIR created: $DmpDir"
|
||||
|
||||
# Step 10: Reset passwords with 10G verifier (required for old client auth)
|
||||
# After sqlnet.ora is configured, passwords must be reset to generate 10G hash
|
||||
|
||||
Reference in New Issue
Block a user