2014-10-24 10 views
7

Nie jestem ekspertem MySQL.Czy istnieje dobry sposób na wykrycie, że MySQL jest "gotowy"?

Mam skrypt, który instaluje MySQL, uruchamia mysqld, a następnie używa mysql do wykonania inicjalizacji.

Obecnie, aby mieć tę pracę, to wchodzi w pętlę, że (przepraszam za pseudocode mieszania wielu języków): (!)

mysqld_safe /* ... */ & /* ampersand to start in background so we can continue */ 
while(fileDoesNotExist("/tmp/mysql.sock")) { 
    sleepFor100ms(); 
} 
mysql -u root /* and so forth */ initialize.sql 

to wydaje się działać, ale ma kilka problemów:

  • odpytywania pachnie zabawny,
  • nie jestem wystarczająco inteligentny, aby o MySQL wiem, czy patrząc na tej zakodowanej ścieżki /tmp/mysql.sock jest mądry w ogóle.

A jednak jest to dużo łatwiejsze niż próby (na przykład) zużywają i analizowania stdout (czy jest to stderr?) Z mysqld_safe aby dowiedzieć się, czy serwer został uruchomiony.

Moje wąskie pytanie brzmi, czy istnieje sposób na wydanie blokującego początku mysqld: czy mogę wydać polecenie blokujące do momentu uruchomienia bazy danych, a następnie wyjść (i odłącza, być może pozostawiając plik PID) i ma polecenie zatrzymania towarzysza? (A może pozwala mi odczytać plik PID i wydać własne SIGTERM?)

Moje ogólne pytanie brzmi, czy jestem na dobrej drodze, czy jest tam coś zupełnie innego i łatwiejszego (dla mnie "łatwiej" to dla mnie musiałbym być lekki, nie jestem zainteresowany instalowaniem zestawu narzędzi takich jak Puppet czy DbMaintain/Liquibase czy jakikolwiek inny) podejście do rozwiązania problemu, który wypowiedziałem? To znaczy, począwszy od pliku .gz zawierającego MySQL, zainstalować MySQL użytkownika i zainicjować bazę danych?

+0

Nie trzeba być albo nie być ekspertem, aby zadać pytanie tutaj. – tadman

+0

Dzięki za powitalną myśl.Po prostu pomyślałem, że będzie to pomocne w kontekście, więc ludzie nie będą mówić za mną. :) –

+0

Czy [sondowanie, aby sprawdzić, czy plik istnieje] (http://stackoverflow.com/questions/2379829/while-loop-to-test-if-a-file-exists-in-bash) być krokiem w właściwy kierunek? – tadman

Odpowiedz

5

Sprawdź skrypt powłoki init dla mysqld. Przeprowadzają sondowanie w funkcji wait_for_pid().

Ta funkcja sprawdza istnienie pliku pid, a jeśli jeszcze nie istnieje, śpi na 1 sekundę, a następnie próbuje ponownie. Istnieje limit czasu, który domyślnie wynosi 900 sekund, w którym to momencie rezygnuje z oczekiwania i stwierdza, że ​​się nie uruchomi (i wyświetli całkowicie niepomocny komunikat "Serwer zakończył działanie bez aktualizacji pliku PID").

Nie musisz zgadywać, gdzie znajduje się plik pid. Jeśli uruchamiasz mysqld_safe, powinieneś powiedzieć, gdzie powinien utworzyć plik pid, używając opcji --pid-file.

Jedną z trudnych części jest to, że plik pid nie jest tworzony do momentu zainicjowania mysqld. Może to trochę potrwać, jeśli musi wykonać odzyskiwanie po awarii przy użyciu plików dziennika InnoDB, a pliki dzienników są duże. Może się zdarzyć, że limit czasu wynoszący 900 sekund będzie niewystarczający i pojawi się fałszywy błąd, mimo że mysqld pomyślnie rozpocznie się chwilę po przekroczeniu limitu czasu.

Możesz także przeczytać dziennik błędów lub wyjście konsoli mysqld. Powinien ostatecznie wyprowadzić linię, która mówi "gotowe do połączenia".

Aby odczytać aż pojawi się ten wiersz, a następnie przerwać lektury, można użyć:

tail -f | sed -e '/ready for connections/q' 
+0

Dzięki. Myślę, że moja droga była bliższa najlepszej drodze, niż myślałem, ale doceniam poradę dotyczącą pliku PID. Dwie rzeczy wolę od tego rozwiązania: (1) nawet jeśli zdecyduję się "zgadnąć" lokalizację (mysqld_safe wydaje się wybierać domyślną ścieżkę, która pochodzi z katalogu instalacyjnego), oznacza to, że jeśli mam wiele instalacji, wygrałem ". t mylę się jeden za drugiego, (2) jak wspomniałeś, mogę wyraźnie określić ścieżkę dla jasności lub solidności. Dzięki! –

+0

Tak, plik PID ma domyślną lokalizację w katalogu danych. Ta wartość domyślna może być nadpisana w jednym lub kilku plikach my.cnf. Zgadywanie jest trudne. Lepiej określić lokalizację, która zastąpi jakiekolwiek ustawienie w my.cnf lub wbudowanym domyślnym. –

+0

Dla mojego przypadku użycia, robię instalację, więc niektóre z przytaczanych przez ciebie niebezpieczeństw są mniej ważne dla mnie i mogę zdecydować, że prostota DRY jest lepsza; w moim przypadku, dbam tylko * raz *, gdzie jest plik PID, i to jest podczas mojego skryptu instalacyjnego, kiedy inicjuję bazę danych. Tak długo, jak * moje * wykonanie mysqld_safe umieszcza je w przewidywalnej lokalizacji, będę wiedział, jaki plik PID wykryć (zamiast powtarzać go w wierszu poleceń i pętli odpytywania), dzięki czemu skrypt będzie tak mały jak to możliwe. –

Powiązane problemy