Dzisiejszy post to odpowiedź na jedno z zapytań z Google. Czy da się skonfigurować replikację tak, aby masterem był serwer MySQL w wersji 5.1 a slave MySQL w wersji 5.0? Zgodnie z dokumentacją, replikacja z nowszej wersji do starszej nie jest wspierana, ale w niektórych przypadkach da się to zrobić. Przyznam, że osobiście tego typu potrzeby nie miałem, ciężko z resztą autorytatywnie stwierdzić, że tego typu konfiguracja jest możliwa, bądź nie. Zbyt dużo tu zależy od konkretnych zapytań, które mają się replikować. Co wiemy na pewno?

Na pewno wiemy tyle, że MySQL 5.1 trzeba przestawić w tryb STATEMENT – replikacja rekordów została wprowadzona dopiero w MySQL 5.1.5, tak więc nie ma szans aby dało się z jej udogodnień skorzystać. W efekcie trzeba się liczyć z ograniczeniami, takimi jak podczas replikacji 5.0 -> 5.0. Zapytania, których wynik nie jest przewidywalny (bazujące na USER(), CURRENT_USER(), UUID(), RAND(), VERSION(), LOAD_FILE() ) mogą wygenerować inny wynik na serwerze slave niż było to na masterze. Podobnie jest z zapytaniami wykorzystującymi funkcje NOW(), ROW_COUNT() czy FOUND_ROWS(). Zapytania te nie współpracują zbyt dobrze z replikacją w trybie STATEMENT.

Wiemy także tyle, że w MySQL 5.0.3 zmienił się znacznie format binlogów, przez co replikacja z MySQL w wersji 5.0.3 lub nowszej do MySQL 5.0.2 lub starszej nie będzie działać. Oczywiście, jeśli ktoś stosuje jeszcze MySQL 5.0.2, albo starsze wersje (czyli po prostu prehistorię), to ma znacznie poważniejsze problemy niż tylko konfiguracja replikacji.

Cała reszta to kwestia dokładnego przeglądnięcia changelogów pomiędzy zastosowanymi wersjami MySQL, przeanalizowanie ich pod kontem zapytań, które idą do bazy danych – możliwe jest że w co bardziej skomplikowanych i nietypowych zapytaniach pojawiły się zmiany w działaniu czy składni, które skutkować będą błędem na starszej wersji serwera. Trzeba po prostu dokładnie sprawdzać co się dzieje z bazami, czy dane się poprawnie replikują, czy nie pojawiają się błędy (SHOW SLAVE STATUS i kolumna Last_Error).

Cóż, wiem że nie jest do końca oczekiwana odpowiedź. Niestety, jeśli chce się zastosować niewspieraną funkcjonalność, to trzeba trochę czasu poświęcić na sprawdzenie, czy to będzie funkcjonować. Tak jak pisałem, wszystko zależy od tego jakie zapytania będą się replikować. Proste INSERTy praktycznie na pewno nie będą sprawiały kłopotu. Bardziej skomplikowane rozwiązania – nie da się przewidzieć i trzeba po prostu sprawdzić. Na szczęście, w drugą stronę replikacja działa bez problemu i z 5.0 do 5.1 możemy replikować co tylko chcemy. I dobrze, bo to bardzo przyjemny sposób na przetestowanie działania serwera po upgrade – z produkcyjnej bazy replikujemy sobie kopię na nową wersję serwera MySQL, sprawdzamy jak się zachowują zapytania, a po upewnieniu się że wszystko jest ok, przekierowujemy ruch produkcyjny na serwer z nową wersją bazy.