2012-03-30 12 views
5

Pracuję nad projektem, dla którego musimy używać "księgowania transakcji" w naszym DBMS (MySQL). Zmieniliśmy już sposób korzystania z InnoDB w celu korzystania z transakcji na inne wymagania. Próbuję zrozumieć, co to jest księgowanie transakcji. Szukałem od ponad dnia, włączając w to czytanie dokumentacji MySQL. Może po prostu nie szukam właściwych słów kluczowych, nie jestem pewien. A może "księgowanie transakcji" to niewłaściwa terminologia.Księgowanie transakcji MySQL

Z tego co rozumiem, księgowanie transakcji bazy danych jest podobne do kronikowania w systemie plików, w którym zmiany są wprowadzane do kroniki, zanim zostaną zatwierdzone w systemie plików. Z tego, co przeczytałem, wynika, że ​​silnik InnoDB przechowuje transakcje w jakimś dzienniku, zanim zostaną zatwierdzone na dysku. Czy to brzmi dokładnie? Jeśli tak, gdzie jest dziennik transakcji? Czy to jest plik ib_logfile0 i ib_logfile1?

Odpowiedz

9

Jesteś zdecydowanie na dobrej drodze.

Ilekroć InnoDB wykonuje transakcję, która ma zostać zatwierdzona, wykonuje się ją jako zatwierdzenie dwufazowe. Transakcja jest zapisywana w tych dziennikach jako pierwsza. Następnie są zobowiązani stamtąd.

To bardzo pomaga w przypadku awarii serwera MySQL lub awarii serwera.

Po ponownym uruchomieniu MySQL, wszystkie niezatwierdzone Wpisy w ib_logfile0 i ib_logfile1 są odtwarzane w ramach odzyskiwania katastrofy InnoDB doprowadzenia InnoDB do harmonijnego stanu (Jest to spójne i trwałe części ACID Compliance)

Jeśli usuniesz ib_logfile0 i ib_logfile1 i uruchomić mysql, dowolną niezatwierdzoną transakcję, że te pliki zostały utracone. Podczas cyklu odzyskiwania po awarii, jeśli brakuje plików dziennika, są one regenerowane na podstawie ustawienia innodb_log_file_size.

Patrz: MySQL Documentation for a detailed explanation of InnoDB.

@karatedog Część MVCC InnoDB dzieje się w obrębie obszaru tabel systemu, lepiej znanego jako ibdata1. Wszystkie dane, które wydają się znajdować przed rozpoczęciem transakcji, są rejestrowane, aby umożliwić innym osobom, które uzyskują dostęp do wymaganych wierszy, podgląd danych przed wprowadzeniem jakichkolwiek aktualizacji. Pozwala to na tzw. REPEATABLE-READ. Jest to zgodne z I zgodnością ACID, co oznacza Izolację. Pisałem posty na ten temat w DBA StackExchange w odniesieniu do różnych scenariuszy, w których izolacja transakcji jest dobra, zła lub brzydka.

chodzi o MyISAM, crash recovery is not automatic. It crashes rather easily. Dlatego istnieje polecenie SQL REPAIR TABLE. Właśnie dlatego narzędzie MySQL myisamchk ma opcję -r do wykonania REPAIR TABLE dla tabel MyISAM, które nie są online.

MariaDB and Aria były próbami stworzenia bezpiecznego silnika odpornego na awarie w celu zastąpienia MyISAM.

+0

Rozumiem, że te pliki dzienników służą do odzyskiwania po awarii, ale czy mechanizm MVCC nie odpowiada za "transakcję", która nastąpi prawidłowo, gdy nie nastąpi awaria? MyISAM ma pewien stopień odzyskiwania po awarii, podczas gdy w ogóle nie ma transakcji. – karatedog

+0

Dziękujemy za szczegółową i terminową odpowiedź. Jestem nieco zdezorientowany, jeśli chodzi o odtwarzanie wpisów w dziennikach.Jeśli wystąpił błąd w trakcie transakcji, zanim zatwierdzenie zostało wydane, myślę, że nie chcesz odtwarzać wpisów, ponieważ transakcje są "wszystko albo nic" (nie chciałbyś, aby część transakcji być zobowiązanym). Czy możesz powiedzieć, że będą odtwarzane tylko wtedy, gdy istnieje zatwierdzenie, ale niepowodzenie nastąpiło przed zatwierdzeniem transakcji w bazie danych, ale po tym, jak została zapisana w plikach dziennika? – alfredough