docs: depanarea actualizarii ROA (PACK_UPDATE)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TM9Cxpzrn9wBSkyBNr22Qc
This commit is contained in:
96
docs/depanare-pack-update.md
Normal file
96
docs/depanare-pack-update.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# Depanare actualizare ROA (CONTAFIN_ORACLE.PACK_UPDATE)
|
||||||
|
|
||||||
|
Actualizarea automata a aplicatiilor si a bazei ruleaza din jobul `CONTAFIN_ORACLE.UPDATEROA_ZILNIC`
|
||||||
|
-> `PACK_UPDATE.UpdateROA`, in 3 etape secventiale: **UpdateApp** (descarca arhivele programelor) ->
|
||||||
|
**UpdateScripts** (umple `UPD_DATABASE`) -> **UpdateDatabaseSqlPlus** (aplica scripturile pe scheme).
|
||||||
|
O etapa esuata le opreste pe toate urmatoarele.
|
||||||
|
|
||||||
|
## Unde te uiti, in ordine
|
||||||
|
|
||||||
|
| Ce | Unde |
|
||||||
|
|---|---|
|
||||||
|
| pana unde a ajuns fiecare rulare | `UPD_ISTORIC` (`stare`: 0=start, 1=aplicatii, 2=scripturi, 3=aplicare, 4=incheiat; `dataora_end` gol = neincheiata) |
|
||||||
|
| cauza reala a esecului | `UPD_LOG` (`dataora_start` = rularea, `secventa`+`dataora` = ordinea; `explicatie` e CLOB) |
|
||||||
|
| ce a raportat jobul | `dba_scheduler_job_run_details` (`log_date`, `status`, `additional_info`) |
|
||||||
|
| ce versiuni s-au descarcat | `UPD_PROGRAME` |
|
||||||
|
| scripturi disponibile / aplicate | `UPD_DATABASE.script_date` vs `<schema>.VERSIUNE.data_script` |
|
||||||
|
|
||||||
|
Un sir de rulari oprite la aceeasi `stare` da direct etapa vinovata, iar prima zi din sir da data de
|
||||||
|
la care s-a schimbat ceva.
|
||||||
|
|
||||||
|
## Capcane
|
||||||
|
|
||||||
|
- **`UPD_LOG` se goleste la fiecare rulare.** Nu ai istoric: iei log-ul rularii curente, altfel
|
||||||
|
relansezi ca sa-l reproduci.
|
||||||
|
- **Eroarea din `additional_info` a jobului e de obicei falsa.** Pe orice esec se apeleaza `EmailLog`,
|
||||||
|
iar daca SMTP-ul e picat ridica `ORA-20000` care inlocuieste eroarea originala. Cauza adevarata e
|
||||||
|
in `UPD_LOG`.
|
||||||
|
- **`UpdateApp` abandoneaza tot la primul program nedescarcat** (`exit` din bucla, `CT_INSUCCES`) —
|
||||||
|
deci si programele de dupa el in lista, si ambele etape de baza de date. Un singur fisier
|
||||||
|
indisponibil blocheaza actualizarile la infinit, tacut.
|
||||||
|
- **`GetStare` refuza o rulare noua** cat timp precedenta e neincheiata si nu a trecut o ora.
|
||||||
|
Se deblocheaza cu `exec contafin_oracle.pack_update.IncheiereActualizare`.
|
||||||
|
- Programele `%USERREPORTS%` merg toate in directorul `UPD_USERREPORTS`, nu in `UPD_<nume_program>`.
|
||||||
|
|
||||||
|
## Descarcarea (UpdateApp)
|
||||||
|
|
||||||
|
Cu `server_info.POWERSHELLDOWNLOAD = '1'`, `PACK_UTILS.DownloadFileOS` scrie un `.ps1` cu `curl` in
|
||||||
|
`DMPDIR`, il lanseaza cu `sys.ExecuteScriptOS` si asteapta aparitia fisierului in directorul Oracle
|
||||||
|
`UPD_<PROGRAM>`. Daca **folderul de pe disc lipseste**, curl esueaza mut si in log apare doar
|
||||||
|
`Fisierul NU s-a salvat pe disc.` — verifica intai directorul, nu reteaua.
|
||||||
|
|
||||||
|
Verificari rapide (read-only, din `contafin_oracle`):
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- calea configurata
|
||||||
|
select directory_name, directory_path from all_directories where directory_name like 'UPD%';
|
||||||
|
-- fisierul chiar exista pe disc?
|
||||||
|
select dbms_lob.fileexists(bfilename('UPD_ROACONT','ROACONT-2.11.70.zip')) from dual;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- directorul exista si e scriibil? ORA-29283 = cale OS inexistenta sau fara drept de scriere
|
||||||
|
declare f utl_file.file_type; begin
|
||||||
|
f := utl_file.fopen('UPD_USERREPORTS','__probe.txt','W'); utl_file.fclose(f);
|
||||||
|
utl_file.fremove('UPD_USERREPORTS','__probe.txt');
|
||||||
|
end;
|
||||||
|
/
|
||||||
|
```
|
||||||
|
|
||||||
|
URL-ul se testeaza direct cu `curl` de pe orice masina (`optiuni.UPD_URL_APP`, cu `|CUSTOMERID|`
|
||||||
|
inlocuit din `sys.auth_detalii.detalii`); daca da 200, problema e local pe server.
|
||||||
|
|
||||||
|
## Comenzi OS pe serverul de baze de date
|
||||||
|
|
||||||
|
`sys.ExecuteScriptOS(<powershell>, <cale .ps1>)` creeaza un job scheduler `executable` — **asincron**,
|
||||||
|
deci rezultatul se verifica prin polling, nu imediat. Scriptul se scrie cu
|
||||||
|
`pack_utils_file.clob2fileX(<clob>, 'DMPDIR', '<nume>.ps1')`. Utila cand ai doar acces Oracle
|
||||||
|
(ex. tunel SSH), fara RDP:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
declare lcPS server_info.value%type; begin
|
||||||
|
select value into lcPS from server_info where upper(name)='POWERSHELLPATH';
|
||||||
|
pack_utils_file.filedelete('DMPDIR','x.ps1');
|
||||||
|
pack_utils_file.clob2fileX('New-Item -ItemType Directory -Force -Path ''D:\...'' | Out-Null',
|
||||||
|
'DMPDIR','x.ps1');
|
||||||
|
sys.ExecuteScriptOS(lcPS, 'C:\DMPDIR\x.ps1');
|
||||||
|
end;
|
||||||
|
/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configurare (CONTAFIN_ORACLE)
|
||||||
|
|
||||||
|
- `server_info`: `POWERSHELLDOWNLOAD`, `POWERSHELLPATH`, `POWERSHELLTIMEOUT`, `CURLPATH`,
|
||||||
|
`SQLPLUSPATH`, `EMAIL_METHOD`/`EMAIL_SMTP`/`EMAIL_PORT`/`EMAIL_USERNAME`/`EMAIL_PASSWORD`/
|
||||||
|
`EMAIL_FROM`/`EMAIL_TO`.
|
||||||
|
- `optiuni`: `UPD_URL_APP`, `UPD_URL_DATABASE`, `UPD_URL_BULETININF` (daca lipsesc, pachetul
|
||||||
|
foloseste URL-uri implicite din cod).
|
||||||
|
|
||||||
|
## Conectare la serverul unui client
|
||||||
|
|
||||||
|
Tunel SSH pe 1521 + alias TNS pe `127.0.0.1` in `D:\ROA\instantclient_19_18\tnsnames.ora`
|
||||||
|
(ex. `ROA_ROMCONSTRUCT`), utilizator `contafin_oracle`. Vezi `oracle_export.md` pentru client si
|
||||||
|
capcana de encoding; parolele stau in `docs/local/` al proiectului, neversionat.
|
||||||
|
|
||||||
|
Serverele de client pot fi Oracle 10g: unele coloane din `dba_scheduler_*` lipsesc
|
||||||
|
(`dba_scheduler_running_jobs.last_start_date`) — foloseste `dba_scheduler_job_run_details`.
|
||||||
@@ -65,6 +65,7 @@
|
|||||||
- testare UI / prin MCP -> `testare-ui-vfp.md`, `testare-vfp-mcp.md`;
|
- testare UI / prin MCP -> `testare-ui-vfp.md`, `testare-vfp-mcp.md`;
|
||||||
- garzi pe valori NULL din Oracle -> `conventie_null_vfp.md`;
|
- garzi pe valori NULL din Oracle -> `conventie_null_vfp.md`;
|
||||||
- export date din Oracle -> `oracle_export.md`;
|
- export date din Oracle -> `oracle_export.md`;
|
||||||
|
- actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> `depanare-pack-update.md`;
|
||||||
- modifici schema Oracle (tabele/view-uri/pachete) -> `scripturi-migrare-db.md`.
|
- modifici schema Oracle (tabele/view-uri/pachete) -> `scripturi-migrare-db.md`.
|
||||||
8. Eroare raportata de utilizator: nu analiza statica indelungata — scrie intai un test care o
|
8. Eroare raportata de utilizator: nu analiza statica indelungata — scrie intai un test care o
|
||||||
reproduce pe fluxul real; el da cauza si confirma remedierea. Analiza statica doar cat sa stii
|
reproduce pe fluxul real; el da cauza si confirma remedierea. Analiza statica doar cat sa stii
|
||||||
|
|||||||
Reference in New Issue
Block a user