Zakład Usług Informatycznych "GM"

Z bazy FireBird™ zginęły (zniknęły) dane jednego użytkownika


FireBird™ jest darmowym serwerem bazy danych typu SQL, możliwym do zainstalowania także w środowisku LINUX.
W swojej wieloletniej pracy z FireBird™ spotkałem się z przypadkiem zniknięcia danych wprowadzonych przez jednego z użytkowników podczas gdy dane wprowadzane przez innego użytkownika w bazie danych były. Użytkownik w czasie pracy stwierdził, że nie widzi danych wprowadzanych przez innego użytkownika, a dane wprowadzane przez niego nie są widoczne dla innych użytkowników. Użytkownik ten zamknął aplikację i uruchomił ją ponownie. Od tego momentu widział dane innych użytkowników, a te wprowadzone przez niego zniknęły.

Analiza zawartości bazy danych pokazała, że dane tego użytkownika nigdy nie były do niej wprowadzone (była zachowana ciągłość wygenerowanych kluczy). Udało się powtórzyć w sposób kontrolowany zaistniałą sytuację. Przyczyną zaginięcia danych była pewna właściwość systemu LINUX, ale po kolei ...
W godzinach nocnych na serwerze był wykonywany automatycznie skrypt, który kolejno: zamykał dostęp użytkownikom (blokowanie w IPTABLES); wykonywał backup; usuwał starą bazę; wykonywał odtworzenie; włączał użytkownikom dostęp. Wszystko działało dobrze do momentu awarii. Próba wprowadzania jakichkolwiek zmian w bazie, gdy był zablokowany dostęp kończyła się błedem. Jak więc doszło do utraty danych ?
Okazało się, że zostawiając działającą aplikację i nie robiąc żadnej operacji bazodanowej w czasie procesu backup/restore, aplikacja utrzymuje połączenie z bazą, a dokładniej z jej skasowaną starą wersją. Póki nie zakończy się działania aplikacji, ta utrzymuje połączenie z procesem FireBird na serwerze, a ten utrzymuje działającą starą bazę pomimo tego, że system operacyjny LINUX skasował już ją i utworzył nowy plik o takiej samej nazwie, bo LINUX nie zwolnił przydzielonej bazie pamięci dyskowej, dopóki proces FireBird jej używa. W konsekwencji użytkownik, który nie wyłączył aplikacji przed procesem backup/restore mógł nadal pracować z nieistniejącą już bazą i dokonywać w niej operacji (łącznie z COMMIT). Nie mógł widzieć danych wprowadzanych przez innych użytkowników, bo te były rejestrowane już w nowej bazie. W chwili, gdy wyłączył program (rozłaczył się z FireBird), a następnie uruchomił go ponownie, program połaczył się już z nową bazą, gdzie nie było danych wprowadzonych przez tego użytkownika. Oczywiście były w niej wszystkie dane wprowadzone przez tego użytkownika przed wykonaniem backup/restore.
Jak w takim razie zabezpieczyć się przed takim problemem, a zarazem zachować automatyczny backup/restore, który zapewnia pełną przebudowę indeksów i czyści wiszące transakcje?
1. Można po udanym backup'ie zamknąć wszystkie procesy FireBird - to zwolni przydzieloną pamięć dla starej bazy i zarazem przerwie komunikację aplikacji z serwerem.
2. Można przed backupem wprowadzić do prostej jednowierszowej tabeli znacznik blokady dostępu, a po udanym restore go usunąć. Dodatkowo aplikacja musi okresowo sprawdzać ten znacznik. Jeżeli zostawiona na noc przez użytkownika aplikacja dokona sprawdzenia znacznika w czasie trwania backup/restore, to zakończy się to błedem bo serwer będzie niedostępny, a gdy zrobi to po zakończeniu procesu backup/restore to odczyta znacznik blokady i też powinna zakończyć swoje działanie.


Strona główna


Kontakt: Zakład Usług Informatycznych "GM",  Skr. Poczt. 662,   30-960 Kraków            gmozejko@interia.pl   tel.: 602-658-215