Page tree
Skip to end of metadata
Go to start of metadata

Časové rezy v archíve

Od verzie D2000 V8.0 je v procese D2000 Archiv implementovaná podpora časových rezov.

Od verzie D2000 V10.1.39 (patche z 22.6.2016 a novšie) je v procese D2000 Archiv implementovaná podpora časových rezov iba pre štruktúrované archívy (t.j. jednoduché archívy fungujú pôvodným spôsobom).
Poznámka: tento mód bol implementovaný kvôli vlastnostiam Oracle a PostgreSQL databáz. Veľké množstvo malých tabuliek spôsobuje v prípade Oracle 11g výraznú spotrebu pamäte (a prípadne výskyt ORA-600 chýb) a v prípade PostgreSQL veľké množstvo malých súborov na disku.

Pokiaľ sa neaktivujú časové rezy, tak archív pracuje pôvodným spôsobom:

  • dáta každého archívneho objektu (jednoduchého archívu, stĺpca štruktúry aj celej štruktúry) sú ukladané do jedinej tabuľky (napr. pre jednoduchý archív s HOBJ=155 to bola tabuľka DT0000155, resp. pre stĺpec štruktúry DT0000155R, resp. pre celú štruktúru DT0000155RC),
  • z archívnej tabuľky sa periodicky mažú dáta za hĺbkou archivácie a prípadne sa vykonáva následná automatická reorganizácia tabuľky.

Problém s výkonnosťou nastával najmä pri štruktúrovaných archívoch, ktorých tabuľky mohli dosahovať značné veľkosti (až niekoľko GB na produkčných systémoch) a reorganizácia takýchto tabuliek trvala až desiatky minút a výrazne zaťažovala procesor aj disky.
Riešením týchto problémov je "narezanie" tabuliek na časové rezy (zatiaľ s konštantnou veľkosťou 30 dní). T.j. každých 30 dní sa vytvorí pre každý archívny objekt nová tabuľka v databáze (napr. pre jednoduchý archív s HOBJ=155 vzniknú tabuľky DT0000155_1, DT0000155_2, DT0000155_3, atď). Pôvodná tabuľka (napr. DT0000155) sa použije pre ukladanie dát starších ako je čas konverzie archívnej databázy a nazýva sa nulový rez.

Implementácia časových rezov umožnila:

  • Vynechať periodické mazanie (implementované SQL príkazom DELETE) a namiesto toho vyprázdniť celý časový rez, keď už je za hĺbkou archivácie (SQL príkazom TRUNCATE TABLE, ktorý je podstatne rýchlejší).
    Poznámka: Mazanie je stále možné voliteľne zapnúť parametrom archívu DeleteInSlices.
  • Zmenšiť počet reorganizácií tabuliek - odbúrajú sa reorganizácie, spôsobené vymazaním riadkov pri periodickom mazaní dát za hĺbkou archivácie, a zostanú iba reorganizácie spôsobené vymazaním dát pri prepočte vypočítaných alebo štatistických archívov (automaticky po zmene dát primárnych archívov alebo ako dôsledok tell príkazu RECALC).
  • Zmenšiť dobu potrebnú na reorganizáciu - keďže sa reorganizujú jednotlivé časové rezy (dáta za 30 dní) a nie tabuľky s dátami za celú hĺbku archivácie.

Zapnutie časových rezov a konverzia archívnej databázy


Prechod na archív s časovými rezmi spôsobí nastavenie parametra DataTableSlices na hodnotu 1 (časové rezy pre všetky archívne objekty) resp. na hodnotu 2 (časové rezy pre štruktúrované archívne objekty).
Pri konverzii archívnej databázy robí archív nasledovné činnosti:

  • Do tabuľky LOG_DATA sa zapíše hodnota 'DATA_TABLE_SLICES' s aktuálnym časom (ak DataTableSlices=1) resp. hodnota 'DATA_TS_STRUCT' (ak DataTableSlices=2) .
  • V archíve sa vytvorí tabuľka ARC_SLICE, v ktorej sú informácie o časových rezoch. Tabuľka obsahuje stĺpce:
    • ID - HOBJ objektu
    • TAB_TYPE - typ objektu (jednoduchý, stĺpec štruktúry, štruktúrovaná premenná)
    • SLICE_ID - číslo časového rezu
    • FROM_TIME - čas začiatku časového rezu
    • TO_TIME - čas konca časového rezu
    • REORG_TIME - čas poslednej reorganizácie časového rezu (pre reorganizáciu)
    • DELETED_ROWS - množstvo vymazaných riadkov (pre reorganizáciu)
  • Pre každý archívny objekt (resp. pre každý štruktúrovaný archívny objekt, ak DataTableSlices=2) sa vytvorí časový rez č. 1, napr. DT0000155_1 (jednoduchý archív) alebo DT0000155R_1 (stĺpec štruktúry) alebo DT0000155RC_1 (štruktúrovaná premenná). Časový rez sa vytvára pre najbližší budúci čas (násobok 30 dní od 1.1.1972).
  • Do tabuľky ARC_SLICE sa vloží informácia o časových rezoch 0 (nulový rez) a 1. Pre nulový rez sa vloží čas poslednej reorganizácie archívneho rezu a množstvo vymazaných riadkov z tabuľky DELETED_ROWS, takže tieto hodnoty sa pri konverzii nestratia.
  • Pokiaľ je archívny objekt skladom hodnôt (archív plnený skriptom), všetky dáta z nulového rezu, ktoré sú novšie ako čas začiatku 1. rezu, sa presunú do 1. rezu. Pokiaľ sú dáta novšie ako čas konca 1. rezu, dynamicky sa vytvorí aj rez č. 2 a prípadne ďalšie a informácia o nich sa vloží do tabuľky ARC_SLICE.
  • Po skončení konverzie sa do tabuľky LOG_DATA zapíše hodnota 'SLICES_CONVERTED' s aktuálnym časom.

Poznámka: Konverzia archívnej databázy je nevratná!
Preto odporúčame zálohovanie archívnej databázy pred zmenou parametra DataTableSlices. Záloha databázy + dáta z konvertovanej databázy (s pomocou arcsynchro) môžu byť použité na návrat k archívu bez časových rezov.

Správanie sa archívu v režime časových rezov


Po zapnutí časových rezov archív ešte nejaký čas (<= 30 dní) zapisuje dáta do nulových rezov, keďže časový rez č. 1 sa vytvoril s časom v budúcnosti. Následne začnú chodiť dáta s časmi, ktoré sú vo vnútri časového rezu č. 1 a budú archivované v reze č. 1. V čase rovnajúcom sa stredu časového rezu (t.j. čas začiatku časového rezu + 15 dní) sa vygenerujú požiadavky na vytvorenie ďalších časových rezov. Tieto požiadavky vykonáva archív na nízkej priorite, pričom časový rez pre archívny objekt vytvorí iba vtedy, pokiaľ bola počas behu archívu pre tento objekt archivovaná aspoň jedna hodnota.
Pokiaľ príde do archívu hodnota pre čas, pre ktorý neexistuje ešte časový rez, tento sa vytvorí hneď a hodnota sa doňho vloží.

Pri periodickom mazaní dát je možné zvlášť riadiť mazanie v pôvodnej tabuľke - nulovom reze (parameter DeleteInSlice0) a v ostatných časových rezoch (parameter DeleteInSlices). Odporúčané je ponechanie prednastavených hodnôt, t.j. DeleteInSlice0=1 (dáta v nulovom reze sa mažú) a DeleteInSlices=0 (dáta v ostatných rezoch sa nemažú, ale rez je vyprázdnený pomocou TRUNCATE TABLE, keď sa ocitne za hĺbkou archivácie).
Časový rez, ktorý je vyprázdnený, sa následne označí ako voľný (čas začiatku sa nastaví na "1.1.1972") a archív ho recykluje, keď bude potrebovať ďalší časový rez pre archívny objekt, ku ktorému rez patrí.

Poznámka: Archív podporuje iba jeden voľný časový rez pre každý archívny objekt. Pokiaľ by vzniklo viac voľných časových rezov (napr. po zmenšení hĺbky archivácie objektu), budú všetky voľné časové rezy okrem prvého vymazané (z tabuľky ARC_SLICE aj ako príslušné databázové tabuľky), takže nedôjde k tomu, že archívna databáza bude obsahovať zbytočné prázdne tabuľky časových rezov.
Nulový rez je výnimkou z tohto pravidla a bude vždy zachovaný.

Pri čítaní archívnych hodnôt z databázy sa číta z jedného alebo viacerých časových rezov (podobne ako pri čítaní z trezorov sa číta z jedného alebo viacerých trezorov).

Zoznam a podrobnosti o časových rezoch objektu sa dá získať tell príkazom SHOW_DYN_INFO.
Rozšírené informácie o časových rezoch (o vytváraní, mazaní, recyklovaní) vypisuje archív pri zapnutej ladiacej kategórii DBG.ARCHIV.SLICES štartovacím parametrom /E+DBG.ARCHIV.SLICES alebo pomocou procesu D2000 System Console v okne Debug info.

Tell príkaz REORGANIZE je rozšírený o podporu časových rezov a umožňuje reorganizáciu vybraného časového rezu, všetkých časových rezov alebo časového rezu pre aktuálny čas.

Utilita arcsynchro je rozšírená o podporu čítania a zápisu časových rezov ako aj o podporu vytvárania časových rezov pri synchronizácii archívnych databáz. Dokáže čítať z databázy bez aj s časovými rezmi a následne plátať databázu bez aj s časovými rezmi.

Write a comment…