RSS Feed

Posts Tagged ‘firebird’

  1. Firebird, restore bazy i błąd „gbak: ERROR: could not find table/procedure for GRANT”

    Styczeń 22, 2014 by 0verlord

    Jeżeli przy odtwarzaniu bazy Firebirda dostajemy taki błąd jak w temacie, oznacza to, że nastąpiła korupcja 😉 . A dokładniej skorumpowała nam się baza security2.fdb.
    Jeżeli nie robiliście backupu, to trzeba sobie taką wypakować z instalatora i następnie dodać odpowiednich userów przy pomocy polecenia gsec.

    Log z próby
    gbak: restoring privilege for user SYSDBA
    gbak: ERROR:action cancelled by trigger (0) to preserve data integrity
    gbak: ERROR: could not find table/procedure for GRANT
    gbak: Exiting before completion due to errors


  2. Firebird fb_shash 1.0 – ściągnij stąd.

    Październik 21, 2013 by 0verlord

    Jest taki UDF do Firebirda, nazywa się jak w temacie, shash. Ale ostatnio zniknął z sajta producenta. Dlatego też możesz go ściągnąć stąd. Jest poczyszczony z objectów i binarek na tyle, ile miałem mocy przerobowych. Na zdrowie zatem.


  3. Diagnozowanie podstawowych problemów z wydajnością bazy Firebird

    Marzec 26, 2013 by 0verlord

    firebird logo

    O bazie Firebird już pisałem, konkretnie w tym poście, gdzie to jest wyjaśnione, po co należy robić gbak i odgbak (tj restore). A dzisiaj będzie o przypadku z życia i o tym, jak taki przypadek wyeliminować.

    Baza po jakimś czasie zaczęła zamulać. Proste zapytanie trwały nawet i kilkadziesiąt sekund. Przy okazji podstroiłem Apacha pod kątem wydajności, bo najpierw miałem niecne podejrzenie, że to właśnie tutaj jest problem. Po poprawkach w konfigu, firebird zaczął chodzić jakieś 30% szybciej, ale zamuła dalej była odczuwalna.

    Po konsultacji z mistrzami wymiataczami, został zarządzony gbak/restore bazy. Dla porządku, baza to Firebird SuperServer, w wersji 2.5.1, a wirtualizacja jest na LXC.

    Po restore, poprzednia prędkość bazy wróciła do normy, co kazało mi odświeżyć sobie info o poście, który wspominałem na początku wpisu. Jeżeli baza wróciła do siebie po restore, to znaczy, że nie zadziałało czyszczenie.

    W cronie regułka była – ale na wszelki wypadek ją odpaliłem z konsoli. Zapytała o usera i hasło do bazy… #fail.
    A to znaczyło, że sweep się nie wykonał, i baza nabrała rozmaitego śmiecia. Te śmieci wyczyścił gbak/restore. Co ciekawe, na innym serwerze mam dokładnie taką samą regułkę – i tam to działa (tak, sprawdziłem dzisiaj). Różnica jest tylko taka, że tam jest Classic, a na wirtualce SuperServer. Kocham takie niespójności…

    Przy okazji, taki problem można zdiagnozować szybciej, przy pomocy polecenia ‚gstat’.
    Na customowej instalacji z tarballa w Debianie, gstat jest tu: /opt/firebird/bin/gstat.
    Uruchamiamy go z parametrem -h i ścieżką do pliku bazy, np. tak:

    /opt/firebird/bin/gstat -h /var/db/bla.fdb

    Powinien pokazać coś podobnego do tego:


    Database "/var/db/bla.fdb"
    Database header page information:
    Flags 0
    Checksum 12345
    Generation 51183
    Page size 4096
    ODS version 11.2
    Oldest transaction 51141
    Oldest active 51142
    Oldest snapshot 51142
    Next transaction 51143
    Bumped transaction 1
    Sequence number 0
    Next attachment ID 104
    Implementation ID 19
    Shadow count 0
    Page buffers 21480
    Next header page 0
    Database dialect 3
    Creation date Mar 26, 2013 21:50:48
    Attributes

    Variable header data:
    Sweep interval: 0
    *END*

    Co nas interesuje z tej listy? Sweep interval – tutaj ustawiony na 0, czyli jak się można domyślić – jest wyłączony. Interesuje nas jeszcze ODS version (czyli on-disk structure), bo to pokazuje, która wersja bazy danych odczyta nasz plik z bazą. Na szczęście w przypadku pomylenia wersji, dostaniemy odpowiedni komunikat, że ODS jest niezgodny.
    Interesuje nas też konkretnie ta sekcja:
    Oldest transaction 51141
    Oldest active 51142
    Oldest snapshot 51142
    Next transaction 51143

    Tutaj mamy numerki, a żeby baza dobrze chodziła, różnica pomiędzy nimi nie może być większa niż 100, lub w innych manualach 200.
    Można to bardzo prosto sprawdzić – wystarczy przez jakiś czas nie włączać sweepa, potem go włączyć i zobaczyć.
    Z punktu wydajnościowego interesuje nas jeszcze parametr „Page buffers” – dla superservera z 4 GB ramu powinien być właśnie na takim poziomie jak u mnie. Ale np. w wersji Firebird Classic, wartość 5000 jest sensowna.

    Podsumowując,


  4. Firebird, gfix shutdown full, online i database shutdown

    Luty 9, 2013 by 0verlord

    Bardziej pisze tego posta ku pamięci własnej, a sytuację z Firebirdem miałem następującą:

    Firebird to taka baza, której od czasu do czasu trzeba zrobić backup i odtworzenie z niego bazy z kilku powodów:
    1. garbage collector przy backupie czyści fizycznie plik bazy ze zwolnionych stron, i z nieużywanego śmietnika – wtedy baza robi się mniejsza.
    2. jeżeli na bazie zachodzi sporo poprawek, może się okazać, że np. baza sobie chodzi, ale przy próbie jej odtworzenie dostaniemy konflikt np. na kluczach obcych, i może się okazać, że trzeba poprawiać ręcznie backup, żeby cokolwiek odtworzyć
    3. z jakiegoś dziwnego powodu, baza chodzi wydajniej po backupie/restore.

    Stąd też u klienta zaszła konieczność backup/restore bazy.
    Baza Firebirda na 4 tryby działania: normal, multi, single i full.
    Przełączanie się między nimi robi się przy pomocy gfixa i opcji -online i -shutdown. Żeby można było bez zgrzytu przegrywać sobie plik bazy, trzeba bazę przełączyć z tryb shutdown. I tak zrobiłem.
    gfix -shut fill -force 0 /plik/bazy.fdb
    Baza się zamknęła, połączenia teoretycznie zostały zakończone. Ubiłem fb_inet_servery (Firebird jest w wersji classic) i zdownowałem xinetd’a. Plik wrzuciłem na storage w stanie jakim był i chciałem zrobić gbaka. Baza po
    gfix -online normal /plik/bazy.fdb powiedziała, że baza jest shutdown. Que pasa? No więc po serii strace’ów okazało się, że wisi mi jeden proces fb_inet_server, który oparł się killallowi. Ubiłem go i baza wróciła.

    Potem znalazłem jeden post na serverfaulcie, z którego wynika, że takie rzeczy potrafią się dziać, jeżeli nie została zakończona jakaś transakcja. Ale dlaczego ta transakcja nie zareagowała na -online single a potem na -shut full ? Kto to wie.

    Czy ja już wspominałem, jak nie lubię firebirda? 😉