Files
comun/utile/diag_actualizare.ps1
Marius Mutu 48f15c1da1 scripturi de diagnostic baza de date + script de livrare
- diag_actualizare.ps1: de ce s-a oprit actualizarea (UPD_ISTORIC, UPD_LOG,
  script_master.log prin UTL_FILE, versiuni per schema, spatiu tablespace, verdict)
- diag_spatiu.ps1: spatiu Oracle la clienti (tablespace, audit, ADR, FRA, disc server)
- livrare.ps1: git_sync + curatenie + verificari + commit/push
- curatenie.ps1: sterge si docs\propuneri_*.md
- docs: depanare-spatiu-oracle.md nou, depanare-pack-update.md completat cu cazul SIGMA

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014sNn6dmAimtyXkDU4frJrh
2026-08-03 12:11:42 +03:00

530 lines
23 KiB
PowerShell

# diag_actualizare.ps1 - depanare PACK_UPDATE (actualizare ROA) pe serverul unui client.
# Urmareste pasii din COMUN\docs\depanare-pack-update.md: test conexiune, UPD_ISTORIC, UPD_LOG,
# script_master.log/script_master2.log (UTL_FILE pe directorul Oracle DMPDIR), versiuni aplicate
# pe fiecare schema, spatiu tablespace (detaliu + cat mai poate creste + top segmente pe cele
# blocate), spatiu disc pe server (optional, -Disc), jobul UPDATEROA_ZILNIC.
# STRICT READ-ONLY: doar select si UTL_FILE in mod 'R'. Nu apeleaza IncheiereActualizare, nu
# relanseaza actualizarea, nu face DDL/DML. Comenzile de deblocare/marire sunt doar AFISATE ca
# sugestie. Singura exceptie e -Disc: scrie un .ps1 temporar in DMPDIR pe server (prin
# sys.ExecuteScriptOS) ca sa citeasca spatiul liber pe discuri, si il sterge la final.
# Parola implicita (ROMFASTSOFT) e cea de dezvoltare, aceeasi folosita si pe serverele de client.
#
# Utilizare:
# powershell -File COMUN\utile\diag_actualizare.ps1 -Alias ROA_SIGMA
# powershell -File COMUN\utile\diag_actualizare.ps1 -Alias ROA_ROMCONSTRUCT -Tail 120
# powershell -File COMUN\utile\diag_actualizare.ps1 -Alias ROA_SIGMA -User contafin_oracle -Password ...
# powershell -File COMUN\utile\diag_actualizare.ps1 -Alias ROA_SIGMA -DoarLog # doar script_master.log
# powershell -File COMUN\utile\diag_actualizare.ps1 -Alias ROA_SIGMA -Disc # + spatiu liber pe discurile serverului
param(
[Parameter(Mandatory=$true)][string]$Alias,
[string]$User = 'contafin_oracle',
[string]$Password = 'ROMFASTSOFT',
[int]$Tail = 60,
[string]$SqlPlus = 'D:\ROA\instantclient_19_18\sqlplus.exe',
[switch]$DoarLog,
[switch]$Disc
)
$ErrorActionPreference = 'Stop'
if (-not (Test-Path $SqlPlus)) {
Write-Output ('EROARE: nu gasesc sqlplus la ' + $SqlPlus)
exit 1
}
$env:TNS_ADMIN = Split-Path $SqlPlus -Parent
$ConnStr = $User + '/' + $Password + '@' + $Alias
$TempDir = Join-Path $env:TEMP ('diag_actualizare_' + [guid]::NewGuid().ToString('N'))
New-Item -ItemType Directory -Force -Path $TempDir | Out-Null
function Remove-TempDir {
if (Test-Path $TempDir) { Remove-Item -LiteralPath $TempDir -Recurse -Force -ErrorAction SilentlyContinue }
}
function Invoke-Sql {
param([string]$Sql)
$sqlFile = Join-Path $TempDir ('q_' + [guid]::NewGuid().ToString('N') + '.sql')
[System.IO.File]::WriteAllText($sqlFile, $Sql, [System.Text.Encoding]::ASCII)
try {
$out = & $SqlPlus -L -S $ConnStr ('@' + $sqlFile) 2>&1
$code = $LASTEXITCODE
} catch {
$out = 'EROARE lansare sqlplus: ' + $_.Exception.Message
$code = -1
}
Remove-Item -LiteralPath $sqlFile -Force -ErrorAction SilentlyContinue
[PSCustomObject]@{ Text = ($out -join "`n"); Code = $code }
}
function Show-Section {
param([string]$Title, [string]$Text)
Write-Output ''
Write-Output ('===== ' + $Title + ' =====')
Write-Output $Text
if ($Text -match 'ORA-00942|ORA-01031') {
Write-Output '[AVERTISMENT] lipsesc probabil drepturi de acces (ORA-00942/ORA-01031) - pasul de mai sus poate fi incomplet cu acest utilizator.'
}
}
function Wait-RemoteFile {
# asteapta aparitia unui fisier scris de sys.ExecuteScriptOS (asincron) - polling, nu instant
param([string]$Directory, [string]$FileName, [int]$TimeoutSec = 60)
$deadline = (Get-Date).AddSeconds($TimeoutSec)
while ((Get-Date) -lt $deadline) {
$r = Invoke-Sql -Sql @"
set pagesize 0 linesize 100 trimspool on feedback off heading off
select dbms_lob.fileexists(bfilename('$Directory','$FileName')) from dual;
exit
"@
if ($r.Text -match '1') { return $true }
Start-Sleep -Seconds 2
}
return $false
}
# ---------- 1. Test conexiune ----------
Write-Output '===== 1. TEST CONEXIUNE ====='
Write-Output ('Alias=' + $Alias + ' User=' + $User + ' TNS_ADMIN=' + $env:TNS_ADMIN)
$r1 = Invoke-Sql -Sql @"
set pagesize 0 linesize 250 trimspool on feedback off heading off
select 'CONEXIUNE_OK' from dual;
select 'VERSIUNE DB: ' || banner from v`$version where rownum = 1;
select 'SCHEMA CONECTATA: ' || sys_context('userenv','session_user') || ' DB: ' || sys_context('userenv','db_name') from dual;
exit
"@
Write-Output $r1.Text
if ($r1.Code -ne 0 -or $r1.Text -notmatch 'CONEXIUNE_OK') {
Write-Output ''
Write-Output 'EROARE: conexiunea a esuat. Verifica:'
Write-Output ' - tunelul SSH pe 1521 e deschis?'
Write-Output (' - aliasul TNS ' + $Alias + ' exista in ' + $env:TNS_ADMIN + '\tnsnames.ora si tinteste 127.0.0.1?')
Write-Output ' - user/parola corecte? (implicit contafin_oracle/ROMFASTSOFT)'
Remove-TempDir
exit 1
}
# ---------- 2. UPD_ISTORIC ----------
if (-not $DoarLog) {
$r2 = Invoke-Sql -Sql @"
set pagesize 200 linesize 200 trimspool on feedback off
column dataora_start format a19
column dataora_end format a30
column stare_text format a26
select * from (
select to_char(dataora_start,'yyyy-mm-dd hh24:mi:ss') dataora_start,
nvl(to_char(dataora_end,'yyyy-mm-dd hh24:mi:ss'), '<<< NEINCHEIATA >>>') dataora_end,
decode(stare, 0,'0-pornire', 1,'1-descarcare aplicatii', 2,'2-generare scripturi',
3,'3-aplicare scripturi', 4,'4-incheiat', 'necunoscuta(' || stare || ')') stare_text
from upd_istoric
order by dataora_start desc
) where rownum <= 10;
exit
"@
Show-Section -Title '2. UPD_ISTORIC (ultimele 10 rulari)' -Text $r2.Text
# ---------- 3. UPD_LOG (rularea curenta) ----------
$r3 = Invoke-Sql -Sql @"
set pagesize 0 linesize 250 trimspool on feedback off heading off long 32000 longchunksize 32000
select 'AVERTISMENT: UPD_LOG se goleste la fiecare rulare; erorile din etapa 3 (aplicare scripturi in SQL*Plus extern) NU ajung aici - vezi script_master.log mai jos.' from dual;
select '-------------------------------------------' from dual;
select 'SECV ' || secventa || ' SCHEMA=' || nvl(schema,'-') || ' SCRIPT=' || nvl(script,'-') ||
' ' || to_char(dataora,'yyyy-mm-dd hh24:mi:ss') || chr(10) ||
nvl(explicatie,'(fara explicatie)') || chr(10) || '-------------------------------------------'
from upd_log
where dataora_start = (select max(dataora_start) from upd_log)
order by secventa;
exit
"@
Show-Section -Title '3. UPD_LOG (rularea curenta)' -Text $r3.Text
}
# ---------- 4. script_master.log / script_master2.log (UTL_FILE pe DMPDIR) ----------
foreach ($logFile in @('script_master.log', 'script_master2.log')) {
$r4 = Invoke-Sql -Sql @"
set serveroutput on size 1000000
set feedback off
declare
ln_n pls_integer := $Tail;
la_buf dbms_sql.varchar2a;
ln_idx pls_integer := 0;
ln_cnt pls_integer := 0;
lc_line varchar2(32767);
lf utl_file.file_type;
lc_path all_directories.directory_path%type;
begin
begin
select directory_path into lc_path from all_directories where directory_name = 'DMPDIR';
exception when no_data_found then lc_path := '(directorul Oracle DMPDIR nu exista)';
end;
dbms_output.put_line('Director DMPDIR -> ' || lc_path || ' fisier: $logFile');
lf := utl_file.fopen('DMPDIR', '$logFile', 'R', 32767);
begin
loop
utl_file.get_line(lf, lc_line, 32767);
ln_idx := mod(ln_cnt, ln_n) + 1;
la_buf(ln_idx) := lc_line;
ln_cnt := ln_cnt + 1;
end loop;
exception when no_data_found then null;
end;
utl_file.fclose(lf);
dbms_output.put_line('total linii citite: ' || ln_cnt || ' (ultimele ' || ln_n || ' afisate mai jos)');
dbms_output.put_line('-------------------------------------------');
if ln_cnt <= ln_n then
for i in 1 .. ln_cnt loop dbms_output.put_line(la_buf(i)); end loop;
else
for i in 0 .. ln_n - 1 loop dbms_output.put_line(la_buf(mod(ln_cnt + i, ln_n) + 1)); end loop;
end if;
exception
when others then
if utl_file.is_open(lf) then utl_file.fclose(lf); end if;
if sqlcode = -29280 then
dbms_output.put_line('EROARE: directorul Oracle DMPDIR nu exista sau alias gresit (ORA-29280).');
elsif sqlcode = -29283 then
dbms_output.put_line('EROARE: fisierul $logFile nu exista in DMPDIR sau nu poate fi citit (ORA-29283). Normal daca actualizarea nu a ajuns inca la etapa 3, sau pentru script_master2.log daca rularea a picat inainte de pasii finali.');
else
dbms_output.put_line('EROARE: ' || sqlerrm);
end if;
end;
/
exit
"@
Show-Section -Title ('4. ' + $logFile) -Text $r4.Text
}
if ($DoarLog) { Remove-TempDir; exit 0 }
# ---------- 5. Versiuni per schema ----------
$rSchemas = Invoke-Sql -Sql @"
set pagesize 0 linesize 200 trimspool on feedback off heading off
select owner from all_tables where table_name = 'VERSIUNE' order by owner;
exit
"@
$schemas = @($rSchemas.Text -split "`r?`n" | ForEach-Object { $_.Trim() } | Where-Object { $_ -match '^[A-Z_][A-Z0-9_]*$' })
if ($schemas.Count -eq 0) {
Show-Section -Title '5. VERSIUNI PE SCHEMA' -Text ('Nu am gasit nicio schema cu tabela VERSIUNE (all_tables).' + "`n" + $rSchemas.Text)
} else {
$sb = New-Object System.Text.StringBuilder
[void]$sb.AppendLine('set pagesize 0 linesize 250 trimspool on feedback off heading off')
foreach ($sch in $schemas) {
$prefix = if ($sch -eq 'CONTAFIN_ORACLE') { 'CO' } else { 'FF' }
[void]$sb.AppendLine(@"
select 'ULTIMA [$sch] ' || tip_script || ' data=' || to_char(data_script,'yyyy-mm-dd') || ' seq=' || seq_script
from (select tip_script, data_script, seq_script from $sch.VERSIUNE order by data_script desc, seq_script desc)
where rownum = 1;
"@)
[void]$sb.AppendLine(@"
select 'CANDIDAT [$sch] ' || msg from (
select msg, ord from (
select script_name || ' (data=' || to_char(script_date,'yyyy-mm-dd') || ' seq=' || script_seq || ')' msg, 1 ord
from (
select d.script_name, d.script_date, d.script_seq
from upd_database d,
(select data_script mx_date, seq_script mx_seq from (
select data_script, seq_script from $sch.VERSIUNE order by data_script desc, seq_script desc
) where rownum = 1) w
where d.script_name like '$prefix\_%' escape '\'
and (d.script_date > w.mx_date or (d.script_date = w.mx_date and d.script_seq > w.mx_seq))
order by d.script_date, d.script_seq
) where rownum = 1
union all
select '(la zi - niciun script $prefix neaplicat gasit dupa ultima versiune)' msg, 2 ord from dual
) order by ord
) where rownum = 1;
"@)
}
[void]$sb.AppendLine('exit')
$r5 = Invoke-Sql -Sql $sb.ToString()
Show-Section -Title '5. VERSIUNI PE SCHEMA (ultima aplicata / prima neaplicata - candidat)' -Text $r5.Text
}
# ---------- 6. Spatiu tablespace: detaliu pe datafile + cat mai poate creste ----------
$r6 = Invoke-Sql -Sql @"
set pagesize 100 linesize 250 trimspool on feedback off
column tablespace_name format a15
column file_name format a55
column autoext format a4
select f.tablespace_name, f.file_name,
round(f.bytes/1048576) mb_curent,
round(f.maxbytes/1048576) mb_max,
f.autoextensible autoext,
round(f.increment_by * t.block_size / 1048576) mb_increment
from dba_data_files f, dba_tablespaces t
where f.tablespace_name = t.tablespace_name
order by f.tablespace_name, f.file_name;
column tablespace_name format a15
column stare format a26
with ts_free as (
select tablespace_name, sum(bytes) free_bytes from dba_free_space group by tablespace_name
), agg as (
select f.tablespace_name, sum(f.bytes) alocat_bytes, sum(f.maxbytes) max_bytes,
sum(greatest(f.maxbytes - f.bytes, 0)) creste_bytes
from dba_data_files f
group by f.tablespace_name
)
select a.tablespace_name,
round(a.alocat_bytes/1048576) mb_alocat,
round(a.max_bytes/1048576) mb_max,
round(nvl(tf.free_bytes,0)/1048576) mb_liber,
round((nvl(tf.free_bytes,0) + a.creste_bytes)/1048576) mb_poate_creste,
case when a.max_bytes > 0 and (nvl(tf.free_bytes,0) + a.creste_bytes) < 1048576
then 'ATENTIE: MAXBYTES ATINS' end stare
from agg a, ts_free tf
where a.tablespace_name = tf.tablespace_name(+)
order by a.tablespace_name;
exit
"@
Show-Section -Title '6. SPATIU TABLESPACE (detaliu pe datafile + cat mai poate creste)' -Text ('mb_poate_creste = liber curent + (maxbytes - alocat) - spatiul real disponibil inainte de ORA-01653, nu doar liberul de acum.' + "`n`n" + $r6.Text)
# tablespace-urile cu maxbytes efectiv atins - identificate separat, pentru top segmente mai jos
$r6m = Invoke-Sql -Sql @"
set pagesize 0 linesize 100 trimspool on feedback off heading off
with ts_free as (
select tablespace_name, sum(bytes) free_bytes from dba_free_space group by tablespace_name
), agg as (
select f.tablespace_name, sum(f.maxbytes) max_bytes, sum(greatest(f.maxbytes - f.bytes, 0)) creste_bytes
from dba_data_files f
group by f.tablespace_name
)
select 'TS_ATENTIE|' || a.tablespace_name
from agg a, ts_free tf
where a.tablespace_name = tf.tablespace_name(+)
and a.max_bytes > 0
and (nvl(tf.free_bytes,0) + a.creste_bytes) < 1048576;
exit
"@
$tsProblema = @($r6m.Text -split "`r?`n" | ForEach-Object { $_.Trim() } | Where-Object { $_.StartsWith('TS_ATENTIE|') } | ForEach-Object { $_.Substring(11) } | Where-Object { $_ -match '^[A-Z0-9_]+$' })
if ($tsProblema.Count -gt 0) {
$sbSeg = New-Object System.Text.StringBuilder
[void]$sbSeg.AppendLine('set pagesize 0 linesize 250 trimspool on feedback off heading off')
foreach ($ts in $tsProblema) {
[void]$sbSeg.AppendLine("select 'Tablespace $ts - top 15 segmente:' from dual;")
[void]$sbSeg.AppendLine(@"
select rpad(owner,20) || rpad(segment_name,35) || rpad(segment_type,18) || round(bytes/1048576) || ' MB'
from (select owner, segment_name, segment_type, bytes from dba_segments where tablespace_name = '$ts' order by bytes desc)
where rownum <= 15;
"@)
if ($ts -eq 'SYSTEM') {
[void]$sbSeg.AppendLine("select 'NOTA: privilegiile ANY (ex. DROP ANY TABLE/TRUNCATE ANY TABLE) nu se aplica pe obiecte din schema SYS cand O7_DICTIONARY_ACCESSIBILITY=FALSE - curatarea unui tabel din SYS cere conectare SYSDBA, nu contafin_oracle.' from dual;")
}
}
[void]$sbSeg.AppendLine('exit')
$r6s = Invoke-Sql -Sql $sbSeg.ToString()
Write-Output ''
Write-Output ('--- Top segmente pe tablespace-urile marcate ATENTIE (' + ($tsProblema -join ', ') + ') ---')
Write-Output $r6s.Text
}
# ---------- 7. Spatiu disc pe server (optional, scrie un .ps1 temporar in DMPDIR) ----------
Write-Output ''
Write-Output '===== 7. SPATIU DISC (server) ====='
if (-not $Disc) {
Write-Output 'Sarit implicit - ruleaza cu -Disc pentru spatiul liber pe discurile fizice ale serverului.'
Write-Output 'Este singura parte a scriptului care NU e strict read-only: scrie un .ps1 temporar in DMPDIR (prin sys.ExecuteScriptOS) si il sterge la final.'
} else {
$rPaths = Invoke-Sql -Sql @"
set pagesize 0 linesize 300 trimspool on feedback off heading off
select 'DATAFILE_PATH|' || file_name from dba_data_files order by file_name;
exit
"@
$datafilePaths = @($rPaths.Text -split "`r?`n" | ForEach-Object { $_.Trim() } | Where-Object { $_.StartsWith('DATAFILE_PATH|') } | ForEach-Object { $_.Substring(14) })
$psTemplate = @'
$dOut = 'C:\DMPDIR\diag_disc_out.txt'
Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
$pct = 0
if ($_.Size -gt 0) { $pct = [math]::Round($_.FreeSpace/$_.Size*100,1) }
"DISC {0} {1} {2} {3}" -f $_.DeviceID, [math]::Round($_.Size/1GB,2), [math]::Round($_.FreeSpace/1GB,2), $pct
} | Out-File -Encoding ascii $dOut
__DATAFILES__
'@
$fileLines = foreach ($p in $datafilePaths) {
$escaped = $p.Replace("'", "''")
'Get-Item ''' + $escaped + ''' -ErrorAction SilentlyContinue | ForEach-Object { "FISIER {0} {1}" -f $_.FullName, $_.Length } | Out-File -Encoding ascii -Append $dOut'
}
$psScript = $psTemplate.Replace('__DATAFILES__', ([string]::Join("`n", $fileLines)))
$psScriptSql = $psScript.Replace("'", "''")
$rLaunch = Invoke-Sql -Sql @"
set serveroutput on size 1000000
set feedback off
declare
lcPS server_info.value%type;
begin
select value into lcPS from server_info where upper(name) = 'POWERSHELLPATH';
begin pack_utils_file.filedelete('DMPDIR','diag_disc_out.txt'); exception when others then null; end;
begin pack_utils_file.filedelete('DMPDIR','diag_disc.ps1'); exception when others then null; end;
pack_utils_file.clob2fileX('$psScriptSql', 'DMPDIR', 'diag_disc.ps1');
sys.ExecuteScriptOS(lcPS, 'C:\DMPDIR\diag_disc.ps1');
dbms_output.put_line('Lansat pe server (' || lcPS || '), astept rezultatul...');
exception when others then
dbms_output.put_line('EROARE la lansare: ' || sqlerrm);
end;
/
exit
"@
Write-Output $rLaunch.Text
if ($rLaunch.Text -notmatch 'EROARE la lansare') {
$gata = Wait-RemoteFile -Directory 'DMPDIR' -FileName 'diag_disc_out.txt' -TimeoutSec 60
if (-not $gata) {
Write-Output 'EROARE: rezultatul nu a aparut in 60s. Posibile cauze: server_info.POWERSHELLPATH gresit, politica de executie PowerShell blocheaza scriptul, sau sys.ExecuteScriptOS nu are drept de executie. Verifica manual C:\DMPDIR\diag_disc.ps1 pe server.'
} else {
$rRead = Invoke-Sql -Sql @"
set serveroutput on size 1000000
set feedback off
declare
lf utl_file.file_type;
lc_line varchar2(32767);
begin
lf := utl_file.fopen('DMPDIR','diag_disc_out.txt','R',32767);
begin
loop
utl_file.get_line(lf, lc_line, 32767);
dbms_output.put_line(lc_line);
end loop;
exception when no_data_found then null;
end;
utl_file.fclose(lf);
begin pack_utils_file.filedelete('DMPDIR','diag_disc_out.txt'); exception when others then null; end;
begin pack_utils_file.filedelete('DMPDIR','diag_disc.ps1'); exception when others then null; end;
exception when others then
dbms_output.put_line('EROARE citire: ' || sqlerrm);
end;
/
exit
"@
$discLines = @()
$fileLinesOut = @()
foreach ($line in ($rRead.Text -split "`r?`n")) {
if ($line -match '^DISC\s+(\S+)\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)') {
$discLines += (' disc {0}: total {1} GB, liber {2} GB ({3}%)' -f $Matches[1], $Matches[2], $Matches[3], $Matches[4])
} elseif ($line -match '^FISIER\s+(\S+)\s+(\d+)') {
$mb = [math]::Round(([double]$Matches[2]) / 1048576, 1)
$fileLinesOut += (' {0}: {1} MB pe disc' -f $Matches[1], $mb)
} elseif ($line -match '\S') {
$discLines += (' ' + $line)
}
}
Write-Output 'Discuri fixe:'
Write-Output ($discLines -join "`n")
Write-Output 'Dimensiune reala pe disc a datafile-urilor:'
Write-Output ($fileLinesOut -join "`n")
}
}
}
# ---------- 8. Job UPDATEROA_ZILNIC ----------
$r8 = Invoke-Sql -Sql @"
set pagesize 100 linesize 250 trimspool on feedback off
column log_date format a20
column additional_info format a90 word_wrapped
select * from (
select to_char(log_date,'yyyy-mm-dd hh24:mi:ss') log_date, status, additional_info
from dba_scheduler_job_run_details
where job_name = 'UPDATEROA_ZILNIC'
order by log_date desc
) where rownum <= 10;
exit
"@
Show-Section -Title '8. JOB UPDATEROA_ZILNIC (ultimele 10 rulari)' -Text ('AVERTISMENT: additional_info e frecvent falsa - la orice esec se apeleaza EmailLog, iar daca SMTP-ul e picat ridica ORA-20000 care masca eroarea reala. Cauza adevarata e in UPD_LOG / script_master.log de mai sus.' + "`n`n" + $r8.Text)
# ---------- 9. Verdict ----------
$r9 = Invoke-Sql -Sql @"
set serveroutput on size 1000000
set feedback off
declare
ln_stare upd_istoric.stare%type;
ld_end upd_istoric.dataora_end%type;
ld_start upd_istoric.dataora_start%type;
lc_stare_text varchar2(50);
lc_line varchar2(32767);
lf utl_file.file_type;
lc_errs varchar2(4000);
ln_errcnt pls_integer := 0;
lb_spatiu boolean := false;
lc_tspatiu varchar2(100);
lc_match varchar2(200);
lc_datafile varchar2(400);
begin
select stare, dataora_end, dataora_start into ln_stare, ld_end, ld_start
from (select stare, dataora_end, dataora_start from upd_istoric order by dataora_start desc)
where rownum = 1;
lc_stare_text := case ln_stare
when 0 then '0-pornire' when 1 then '1-descarcare aplicatii' when 2 then '2-generare scripturi'
when 3 then '3-aplicare scripturi' when 4 then '4-incheiat cu succes'
else 'necunoscuta(' || ln_stare || ')' end;
dbms_output.put_line('Ultima rulare: ' || to_char(ld_start,'yyyy-mm-dd hh24:mi:ss') || ' stare=' || lc_stare_text ||
case when ld_end is null then ' <<< NEINCHEIATA >>>' else ' incheiata ' || to_char(ld_end,'yyyy-mm-dd hh24:mi:ss') end);
if ld_end is null and ln_stare = 3 then
dbms_output.put_line('Rularea a ramas la aplicarea scripturilor (etapa 3, SQL*Plus extern). Cauza reala e in script_master.log, NU in UPD_LOG.');
elsif ld_end is null then
dbms_output.put_line('Rularea nu s-a incheiat (stare ' || lc_stare_text || ').');
else
dbms_output.put_line('Ultima rulare s-a incheiat normal.');
end if;
begin
lf := utl_file.fopen('DMPDIR', 'script_master.log', 'R', 32767);
begin
loop
utl_file.get_line(lf, lc_line, 32767);
if instr(lc_line,'ORA-06512') = 0 and (instr(upper(lc_line), 'ORA-') > 0 or instr(lc_line, 'ERROR') > 0) then
ln_errcnt := ln_errcnt + 1;
lc_errs := lc_errs || chr(10) || lc_line;
if regexp_like(lc_line, 'ORA-016[0-9][0-9]|ORA-30036') then
lb_spatiu := true;
lc_match := regexp_substr(upper(lc_line), 'TABLESPACE [A-Z0-9_]+', 1, 1);
if lc_match is not null then lc_tspatiu := ltrim(substr(lc_match, 11)); end if;
end if;
end if;
end loop;
exception when no_data_found then null;
end;
utl_file.fclose(lf);
exception when others then
if utl_file.is_open(lf) then utl_file.fclose(lf); end if;
end;
if ln_errcnt > 0 then
dbms_output.put_line('script_master.log contine erori (' || ln_errcnt || '):' || lc_errs);
else
dbms_output.put_line('Nu s-a gasit "ORA-"/"ERROR" in script_master.log.');
end if;
if lb_spatiu then
dbms_output.put_line('=== PROBLEMA DE SPATIU, NU DE SQL === tablespace implicat: ' || nvl(lc_tspatiu,'necunoscut'));
if lc_tspatiu is not null then
begin
select file_name into lc_datafile
from (select file_name from dba_data_files where tablespace_name = lc_tspatiu order by file_name)
where rownum = 1;
dbms_output.put_line('Sugestie (NU se executa automat): ALTER DATABASE DATAFILE ''' || lc_datafile ||
''' AUTOEXTEND ON NEXT 50M MAXSIZE <valoare mai mare>;');
exception when no_data_found then null;
end;
end if;
dbms_output.put_line('Pe XE limita de 11GB e pe datele utilizator, nu pe SYSTEM - un maxbytes mic pe SYSTEM (sau alt tablespace de sistem) e o setare de instalare, se poate mari.');
end if;
dbms_output.put_line('Vezi sectiunea 4 pentru context complet in log, sectiunea 5 pentru scriptul candidat per schema, sectiunea 6 pentru spatiul pe tablespace/segmente.');
dbms_output.put_line('Daca rularea a ramas blocata (stare < 4 de peste o ora) si problema de mai sus e reparata, deblocarea (NU se executa automat de acest script):');
dbms_output.put_line(' exec contafin_oracle.pack_update.IncheiereActualizare;');
end;
/
exit
"@
Show-Section -Title '9. VERDICT' -Text $r9.Text
if ($r9.Text -match 'PROBLEMA DE SPATIU' -and -not $Disc) {
Write-Output 'Sugestie: reruleaza cu -Disc pentru spatiul liber pe discurile fizice ale serverului (poate lipsi spatiu pe disc pentru crestere, nu doar maxbytes).'
}
Remove-TempDir
exit 0