acces email Thunderbird + tabela de provenienta la top segmente in diagnosticul de spatiu
This commit is contained in:
@@ -22,6 +22,16 @@ cu `diag_spatiu.ps1`; **email doar la prag depasit**, tacere completa altfel. Su
|
|||||||
Sectiunile informative (recyclebin, UNDO, TEMP, istoric statistici/scheduler, top segmente, audit
|
Sectiunile informative (recyclebin, UNDO, TEMP, istoric statistici/scheduler, top segmente, audit
|
||||||
SYS, disc) se scriu doar cand exista deja o alerta — dau context, nu alerteaza singure.
|
SYS, disc) se scriu doar cand exista deja o alerta — dau context, nu alerteaza singure.
|
||||||
|
|
||||||
|
`co_2026_08_06_08_DIAG_SPATIU_PACK` + `sys_2026_08_06_07_DIAG_SPATIU_GRANT3` (06.08.2026) scriu la
|
||||||
|
top segmente si **tabela/coloana din care provine segmentul** (`DetaliuSegment`: `DBA_LOBS`,
|
||||||
|
`DBA_LOB_PARTITIONS`, `DBA_INDEXES`; segmentele temporare se marcheaza ca atare) — fara asta un
|
||||||
|
`SYS_LOB0000630560C00017$$` de 4 GB in email nu spune nimic, iar serverul clientului nu e accesibil
|
||||||
|
direct. Atentie: pentru `LOB PARTITION`, `dba_segments.segment_name` e `lob_name`, nu
|
||||||
|
`lob_partition_name`.
|
||||||
|
|
||||||
|
Emailurile ajung pe `marius.mutu@romfast.ro`, cate un expeditor per client
|
||||||
|
(`roaupdate_<client>@romfast.ro`); citirea lor: `email-thunderbird.md`.
|
||||||
|
|
||||||
`co_2026_08_06_01_DIAG_SPATIU_PACK` (06.08.2026) corecteaza doua lucruri vazute pe primele rulari:
|
`co_2026_08_06_01_DIAG_SPATIU_PACK` (06.08.2026) corecteaza doua lucruri vazute pe primele rulari:
|
||||||
|
|
||||||
- **pragul absolut (2048 MB) nu se mai aplica tablespace-urilor al caror maxim e sub el** — orice
|
- **pragul absolut (2048 MB) nu se mai aplica tablespace-urilor al caror maxim e sub el** — orice
|
||||||
@@ -80,6 +90,15 @@ SYS, disc) se scriu doar cand exista deja o alerta — dau context, nu alerteaza
|
|||||||
|
|
||||||
## Capcane
|
## Capcane
|
||||||
|
|
||||||
|
- **Segmentele `TEMPORARY` dintr-un tablespace permanent nu dispar intotdeauna la restart** (ACN,
|
||||||
|
06.08.2026: 1.3 GB ramasi si dupa repornirea serviciului). Daca `v$sort_usage` e gol, sunt orfane
|
||||||
|
si se curata fortat, ca `SYS`: `alter session set events 'immediate trace name DROP_SEGMENTS level
|
||||||
|
<ts#+1>'` (`ts#` din `v$tablespace`) — la ACN au disparut instantaneu, cu tot spatiul recuperat.
|
||||||
|
Daca nici asa nu pleaca, apartin unui DDL neterminat — cauta `SYS_JOURNAL%` (index online) sau
|
||||||
|
obiecte `INVALID/UNUSABLE` in schema respectiva.
|
||||||
|
- **`shrink space` pe un LOB cere ASSM**; pe un tablespace MSSM da `ORA-10635` (cazul `ROA` la ACN).
|
||||||
|
Echivalentul care merge: `alter table t move lob (col) store as (tablespace <ts>)` — reconstruieste
|
||||||
|
segmentul, tine tabela blocata cat dureaza si cere spatiu liber cat segmentul mutat.
|
||||||
- **Privilegiile `ANY` nu se aplica pe obiectele din schema `SYS`** cat timp
|
- **Privilegiile `ANY` nu se aplica pe obiectele din schema `SYS`** cat timp
|
||||||
`O7_DICTIONARY_ACCESSIBILITY=FALSE` — orice curatare acolo cere `SYSDBA`.
|
`O7_DICTIONARY_ACCESSIBILITY=FALSE` — orice curatare acolo cere `SYSDBA`.
|
||||||
- Parola `SYS` e de obicei cea generica (vezi `COMUN\docs\local\oracle.md`), dar **nu la toti
|
- Parola `SYS` e de obicei cea generica (vezi `COMUN\docs\local\oracle.md`), dar **nu la toti
|
||||||
|
|||||||
41
docs/email-thunderbird.md
Normal file
41
docs/email-thunderbird.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Citirea emailurilor (Thunderbird Portable)
|
||||||
|
|
||||||
|
Conectorul Gmail din Claude vede **doar** `mmarius28@gmail.com`. Conturile de lucru
|
||||||
|
(`marius.mutu@romfast.ro` etc.) nu sunt acolo — se citesc local, din mbox-urile Thunderbird:
|
||||||
|
|
||||||
|
```
|
||||||
|
D:\UTIL\portable\PortableApps\ThunderbirdPortable\Data\profile\ImapMail\<cont>\INBOX
|
||||||
|
```
|
||||||
|
|
||||||
|
Conturi active (dupa `LastWriteTime`): `mail.romfast.ro` (~36 MB, contul principal) si
|
||||||
|
`mail.romfast-1.ro` (~108 MB). Restul (`seanet.ro`, `romfast-4.ro`, `imap.googlemail.com`, …)
|
||||||
|
sunt vechi de ani.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
powershell -File COMUN\utile\citeste_email.ps1 -Cauta 'Diagnostic spatiu' -Ultimele 10
|
||||||
|
powershell -File COMUN\utile\citeste_email.ps1 -Nr <linie> [-Linii 200]
|
||||||
|
```
|
||||||
|
|
||||||
|
Prima forma listeaza `Cont / Linie / Data / De_la / Subiect` (filtru `-Cauta` pe subiect **sau**
|
||||||
|
expeditor, `-Cont mail.romfast.ro` restrange la un cont); a doua tipareste mesajul care incepe la
|
||||||
|
linia respectiva, pana la urmatorul separator mbox.
|
||||||
|
|
||||||
|
## Capcane
|
||||||
|
|
||||||
|
- **Nu da `Grep`/ripgrep pe folder**: `INBOX.sbd\Sent` are ~2.5 GB si cautarea expira.
|
||||||
|
- **Numerotarea liniilor difera intre unelte** (`Select-String` vs `Get-Content` vs `StreamReader`)
|
||||||
|
— mbox-ul are linii cu `\r` singur. Foloseste numarul dat de `citeste_email.ps1`, pentru ca
|
||||||
|
`-Nr` citeste cu acelasi cititor; daca linia ceruta nu e inceput de mesaj, scriptul trece la
|
||||||
|
contul urmator (`-Nr` fara `-Cont` cauta in toate).
|
||||||
|
- Thunderbird tine fisierul deschis → citire doar cu `FileShare::ReadWrite` (scriptul o face).
|
||||||
|
- Mesajele sunt in ordine cronologica, **cel mai nou la sfarsitul fisierului**; separatorul e
|
||||||
|
`From - <data>`. Corpurile HTML/base64 se tipar brut — pentru ele ia doar `Content-Type` si
|
||||||
|
primele linii, nu tot mesajul.
|
||||||
|
|
||||||
|
## Emailuri automate ROA
|
||||||
|
|
||||||
|
| Expeditor | Ce e |
|
||||||
|
|---|---|
|
||||||
|
| `roaupdate_acn@`, `roaupdate-sigma@`, `roaupdate-clever@`, `roaupdate-automotive@` … | jobul `DIAGSPATIU_ZILNIC`, subiect `Diagnostic spatiu Oracle <BAZA> <data> <ora>`, cate un expeditor per client. Vezi `depanare-spatiu-oracle.md` |
|
||||||
|
|
||||||
|
Emailul vine **doar la prag depasit**; tacere = totul in regula.
|
||||||
@@ -14,6 +14,7 @@ a doua oara — daca a doua oara e nevoie de acelasi lucru, scrie scriptul.
|
|||||||
| spatiu plin la un client | `COMUN\utile\diag_spatiu.ps1 -Alias <TNS> [-Disc] [-SysPassword]` | tablespace, audit, ADR, FRA, disc server, top segmente. Vezi `depanare-spatiu-oracle.md` |
|
| spatiu plin la un client | `COMUN\utile\diag_spatiu.ps1 -Alias <TNS> [-Disc] [-SysPassword]` | tablespace, audit, ADR, FRA, disc server, top segmente. Vezi `depanare-spatiu-oracle.md` |
|
||||||
| publicare scripturi de baza de date | `COMUN\utile\publicare_scripturi.ps1 [-Luna YYYY-MM] [-Fisier ...] [-DryRun]` | import in `UPD_DATABASE` → arhiva lunara `database[n]_*.zip` + indexi in `_UPDATE`, cu verificare octet cu octet. Vezi `publicare-scripturi-db.md` |
|
| publicare scripturi de baza de date | `COMUN\utile\publicare_scripturi.ps1 [-Luna YYYY-MM] [-Fisier ...] [-DryRun]` | import in `UPD_DATABASE` → arhiva lunara `database[n]_*.zip` + indexi in `_UPDATE`, cu verificare octet cu octet. Vezi `publicare-scripturi-db.md` |
|
||||||
| teste UI VFP | harness din `COMUN\utile\Teste` | vezi `testare-ui-vfp.md` |
|
| teste UI VFP | harness din `COMUN\utile\Teste` | vezi `testare-ui-vfp.md` |
|
||||||
|
| citirea emailurilor de pe conturile romfast | `COMUN\utile\citeste_email.ps1 [-Cauta ...] [-Nr <linie>]` | listeaza/extrage mesaje din mbox-urile Thunderbird Portable (conectorul Gmail nu vede conturile romfast). Vezi `email-thunderbird.md` |
|
||||||
|
|
||||||
Documentatia **nu** se genereaza automat si nu exista niciun hook care s-o scrie — `livrare.ps1`
|
Documentatia **nu** se genereaza automat si nu exista niciun hook care s-o scrie — `livrare.ps1`
|
||||||
doar semnaleaza ce lipseste (changelog neatins, binar VFP fara textul lui sincronizat).
|
doar semnaleaza ce lipseste (changelog neatins, binar VFP fara textul lui sincronizat).
|
||||||
|
|||||||
103
utile/citeste_email.ps1
Normal file
103
utile/citeste_email.ps1
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
# Citeste emailurile din mbox-urile Thunderbird Portable (fara conectorul Gmail).
|
||||||
|
# citeste_email.ps1 [-Cauta <text>] [-Cont <nume>] [-Ultimele <n>] -> lista mesaje
|
||||||
|
# citeste_email.ps1 -Nr <linie> [-Linii <n>] -> corpul unui mesaj
|
||||||
|
param(
|
||||||
|
[string]$Cauta = '',
|
||||||
|
[string]$Cont = '',
|
||||||
|
[int]$Ultimele = 20,
|
||||||
|
[int]$Nr = 0,
|
||||||
|
[int]$Linii = 200,
|
||||||
|
[string]$Radacina = 'D:\UTIL\portable\PortableApps\ThunderbirdPortable\Data\profile\ImapMail'
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
function Get-Mboxuri {
|
||||||
|
param([string]$Cont)
|
||||||
|
$c = if ($Cont) { $Cont } else { '*' }
|
||||||
|
Get-ChildItem $Radacina -Directory -Filter $c |
|
||||||
|
ForEach-Object { Join-Path $_.FullName 'INBOX' } |
|
||||||
|
Where-Object { Test-Path $_ } |
|
||||||
|
Where-Object { (Get-Item $_).LastWriteTime -gt (Get-Date).AddYears(-2) }
|
||||||
|
}
|
||||||
|
|
||||||
|
function Deschide-Fisier {
|
||||||
|
param([string]$Cale)
|
||||||
|
# Thunderbird tine fisierul deschis -> FileShare ReadWrite obligatoriu
|
||||||
|
$fs = New-Object IO.FileStream($Cale, [IO.FileMode]::Open, [IO.FileAccess]::Read, [IO.FileShare]::ReadWrite)
|
||||||
|
New-Object IO.StreamReader($fs, [Text.Encoding]::GetEncoding(28591))
|
||||||
|
}
|
||||||
|
|
||||||
|
function Decodeaza-Subiect {
|
||||||
|
param([string]$S)
|
||||||
|
$rx = [regex]'=\?([^?]+)\?([BbQq])\?([^?]*)\?='
|
||||||
|
$rx.Replace($S, {
|
||||||
|
param($m)
|
||||||
|
$enc = [Text.Encoding]::GetEncoding($m.Groups[1].Value)
|
||||||
|
$txt = $m.Groups[3].Value
|
||||||
|
if ($m.Groups[2].Value -match '[Bb]') {
|
||||||
|
$enc.GetString([Convert]::FromBase64String($txt))
|
||||||
|
} else {
|
||||||
|
$b = New-Object Collections.Generic.List[byte]
|
||||||
|
for ($i = 0; $i -lt $txt.Length; $i++) {
|
||||||
|
if ($txt[$i] -eq '=') { $b.Add([Convert]::ToByte($txt.Substring($i + 1, 2), 16)); $i += 2 }
|
||||||
|
elseif ($txt[$i] -eq '_') { $b.Add(32) }
|
||||||
|
else { $b.Add([byte][char]$txt[$i]) }
|
||||||
|
}
|
||||||
|
$enc.GetString($b.ToArray())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---- corpul unui mesaj: de la linia data pana la urmatorul separator mbox ----
|
||||||
|
if ($Nr -gt 0) {
|
||||||
|
foreach ($f in Get-Mboxuri -Cont $Cont) {
|
||||||
|
$r = Deschide-Fisier $f
|
||||||
|
try {
|
||||||
|
$i = 0; $scris = 0; $pornit = $false
|
||||||
|
while ($null -ne ($l = $r.ReadLine())) {
|
||||||
|
$i++
|
||||||
|
if ($i -lt $Nr) { continue }
|
||||||
|
# linia ceruta trebuie sa fie inceput de mesaj, altfel e alt cont
|
||||||
|
if ($i -eq $Nr -and $l -notmatch '^From - \w\w\w \w\w\w ') { break }
|
||||||
|
if ($pornit -and $l -match '^From - \w\w\w \w\w\w ') { break }
|
||||||
|
$pornit = $true
|
||||||
|
$l
|
||||||
|
if (++$scris -ge $Linii) { "... (taiat la $Linii linii, mareste cu -Linii)"; break }
|
||||||
|
}
|
||||||
|
if ($pornit) { return }
|
||||||
|
} finally { $r.Dispose() }
|
||||||
|
}
|
||||||
|
Write-Warning "Linia $Nr nu exista in mbox-urile cautate."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---- lista de mesaje ----
|
||||||
|
$mesaje = @()
|
||||||
|
foreach ($f in Get-Mboxuri -Cont $Cont) {
|
||||||
|
$cont = Split-Path (Split-Path $f -Parent) -Leaf
|
||||||
|
$r = Deschide-Fisier $f
|
||||||
|
try {
|
||||||
|
$i = 0; $inAntet = $false; $m = $null
|
||||||
|
while ($null -ne ($l = $r.ReadLine())) {
|
||||||
|
$i++
|
||||||
|
if ($l -match '^From - \w\w\w \w\w\w ') {
|
||||||
|
if ($m) { $mesaje += $m }
|
||||||
|
$m = [pscustomobject]@{ Cont = $cont; Linie = $i; Data = ''; De_la = ''; Subiect = '' }
|
||||||
|
$inAntet = $true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (-not $inAntet -or -not $m) { continue }
|
||||||
|
if ($l -eq '') { $inAntet = $false; continue }
|
||||||
|
if ($l -like 'Date: *' -and -not $m.Data) { $m.Data = $l.Substring(6).Trim() }
|
||||||
|
elseif ($l -like 'From: *' -and -not $m.De_la) { $m.De_la = $l.Substring(6).Trim() }
|
||||||
|
elseif ($l -like 'Subject: *' -and -not $m.Subiect) { $m.Subiect = Decodeaza-Subiect $l.Substring(9).Trim() }
|
||||||
|
}
|
||||||
|
if ($m) { $mesaje += $m }
|
||||||
|
} finally { $r.Dispose() }
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Cauta) {
|
||||||
|
$mesaje = $mesaje | Where-Object { $_.Subiect -like "*$Cauta*" -or $_.De_la -like "*$Cauta*" }
|
||||||
|
}
|
||||||
|
$mesaje | Select-Object -Last $Ultimele | Format-Table -AutoSize -Wrap
|
||||||
Reference in New Issue
Block a user