Znikające tabele w MySQLu

17 listopada, 2010 (22:49) | linux, windows | By: konrad

Koledzy z firmy wydłubali ostatnio jakiś super-hiper wyczesany portal dla klienta, który oparli na Liferay’u. Testowali to na jednym z Windowsowych serwerów (z zainstalowanym dla potrzeb testów MySQLem). Testy się udały, portal zaczął prawidłowo działać, więc nadszedł odpowiedni czas na przeniesienie tego na serwery produkcyjne: serwer bazodanowy (MySQL) oraz WWW (tomcat + dodatki). Oba działające pod kontrolą CentOSa. Sama platforma z portalem to jeden problem (bo wymaga dość mało popularnych interfejsów do SAPa), który – szczęśliwie – udało się w miarę szybko zwalczyć.

Ale natychmiast pojawiła się bardzo dziwna sytuacja. Pomimo tego, że mysqldump utworzył (wydawałoby się) poprawną kopię danych, a baza na serwerze produkcyjnym nie zgłosiła zastrzeżeń co do jego poprawności i ochoczo wessała wszystkie podstawione jej dane, to po konfiguracji tego wszystkiego okazało się, że owszem, portal wystartował, ale nie zawiera żadnych informacji używanych podczas testów. Baza jest, użytkownik jest, zalogować się 'z ręki’ można, tabele zawierają wszystko, co powinny, a portal nie działa.

Zajęło nam kilka dni, zanim udało się znaleźć przyczynę dziwnego zachowania. Okazało się, że w zależności od systemu, na jakim został zainstalowany, serwer MySQL nie zawsze bierze pod uwagę wielkość liter w nazwach baz/tabel. Dokładniej jest to opisane tutaj. Serwer źródłowy (czyli ten z Windowsem) jest case-insensitive (nieczuły? :-)) z punktu widzenia systemu plików (i mysqldump’a!), więc wyeksportował nazwy tabel małymi literami. I tak też wciągnął te nazwy Linux. Z tą różnicą, że zapytania z portalu zawierają literki o różnej wielkości (Windowsowi było i tak wszystko jedno, bo nie brał tego pod uwagę) – i to był nasz problem. Dane owszem, były na swoim miejscu, ale w tabelach, których nazwy składały się wyłącznie z małych liter (zgodnie z tym, co zawierało archiwum utworzone przez mysqldump’a). A Liferay szukał tabelek nazwanych dużymi literami…

Ponieważ docelowy serwer bazodanowy został specjalnie skonfigurowany dla potrzeb tego typu portali, to przełączenie bazy w tryb lower_case_table_names=1 (czyli case insensitive) nie ma dla mnie żadnych negatywnych skutków i tak też zrobiłem. Po restarcie bazy (i – na wszelki wypadek – ponownym imporcie jej zawartości) wszystko zaczęło działać poprawnie, a dane pojawiły się równie magicznie, jak wcześniej zniknęły :-)

Tak zupełnie szczerze, to nie wiem, ile czasu by mi zajęło szukanie, gdybym nie natknął się na ten wpis na forum Liferay’a.

Trackback URL: https://konrad.bechler.pl/2010/11/znikajace-tabele-w-mysqlu/trackback/

«

»

Write a comment





*