Tranzakciós log ürítése és nem ürítése

Mostanság SQL DBA-t keresek, és szakmai tesztekkel és interjúkkal is töltöm rengeteg szabadidőmet. Alapvetően megerősítve látom azon véleményemet, hogy az informatika vallásközeli tudomány, és sokan transzcendens vonásokat találnak a szerverek működésében, és babonás eszközökkel közelítik meg őket. Az egyik ilyen misztikus terület a tranzakciós log szerepe és használata.
Mindenekelőtt szeretném leszögezni a következőt: a tranzakció teljesülését a diszkre fogja kiírni rögtön az SQL szerver, nem a memóriában írja a tranzakciós logot, mert annak ugye nem volna sok értelme, ha a commit tényét egy illékony tárban rögzítené. De ez részletkérdés pillanatnyi motivációm szempontjából, nézzük inkább meg, hogy mikor szabadítja fel az SQL a tranzakciós logot. Három feltételnek kell tejesülnie:

  1. Az adatbázis recovery modellje simple vagy (full és bulk-logged esetén) az adott naplórész le lett backupolva.
  2. A tranzakciós log szóban forgó része nem tartalmaz aktív tranzakciót, azaz minden olyan tranzakció, ami a log írásakor aktív volt, már véget ért (ha rollback lett ,akkor a rollback is véget ért).
  3. Az adatbázis nincs replikálva vagy ha igen, akkor a Log Reader Agent már elolvasta az adott részt

Ezeknek a feltételeknek egyszerre teljesülniük kell. Azaz ha leállítom a Log Reader Agentet, akkor elkezd nőni a tranlog az égig, hogy ne rontsa el a replikációt. Hasonlóan elkezd nőni a log, ha sikerült egy tranzakicónak nyitva maradnia az adatbázisban, és lassan az egész tranlog aktívvá válik miatta.
Tehát ha megnő a log, érdemes a fenti pontokat ellenőrizni, körülbelül ebben a sorrendben (recovery model/utolsó log backup; legrégebbi nyitott tranzakció; replikáció esetén LRA).
Ja, még egy utolsó: a TRUNCATE LOG parancsok margójára: ha valaki rendszeresen kiadja a truncate log parancsot, akkor gondolkozzon el azon, hogy miért van full recovery model beállítva, és gyorsan állítsa át simple-re. Köszi.

2 Comments

  1. Tonesz:

    Szia,

    nálunk van egy speciális eset, amikor a tranzakciós logot folyamatosan üríteni kell. Tükrözést használunk egy olyan adatbázison, ahova a frontend a session információkat teszi le. Tulképp az adatbázisban található adatok viszonylag rövid ideig élnek, azonban nagyon sokat változnak, így a trnlog egy nap alatt kb 2GB-ra tud nőni. Mivel az adatbázist nem kell menteni, viszont helyre azért szükség van, a trn logot minden este ürítjük. Persze a file-t nem shrinkeljük, mert szivatni azért mégsem akarjuk magunkat.:)

    Mirrorral kapcsolatban jutott eszembe…
    Ezzel kapcsolatban nincs esetleg ötleted?
    https://www.netacademia.net/tudastar/default.aspx?upid=24027
    lehet nem itt a helye, akkor töröld nyugodtan.:) Elfogyott minden ötletem. Érzésre jog hiány lesz, de sehol nem találtam info-t arról, hogy hol, kinek, milyen jogot kell adjak…

    Üdv.
    Tonesz

  2. erik:

    Oké, általánosítottam… Aláírom, van olyan eset, hogy van értelme a truncate-elős felállásnak, de lássuk be, h nem ez a gyakoribb :)

Leave a comment