Wyszukiwanie w witrynie

Przydatne wskazówki dotyczące rozwiązywania typowych błędów w MySQL


MySQL to szeroko stosowany system zarządzania relacyjnymi bazami danych typu open source (RDMS), którego właścicielem jest Oracle. Przez lata był to domyślny wybór dla aplikacji internetowych i nadal pozostaje popularny w porównaniu do innych silników baz danych.

Przeczytaj także: Jak zainstalować najnowszą wersję MySQL na RHEL/CentOS i Fedorze

MySQL został zaprojektowany i zoptymalizowany pod kątem aplikacji internetowych – stanowi integralną część głównych aplikacji internetowych, takich jak Facebook, Twitter, Wikipedia, YouTube i wiele innych.

Czy Twoja witryna lub aplikacja internetowa jest obsługiwana przez MySQL? W tym szczegółowym artykule wyjaśnimy, jak rozwiązywać problemy i typowe błędy na serwerze bazy danych MySQL. Opiszemy, jak ustalić przyczyny problemów i co zrobić, aby je rozwiązać.

1. Nie można połączyć się z lokalnym serwerem MySQL

Jednym z typowych błędów połączenia klienta z serwerem w MySQL jest „BŁĄD 2002 (HY000): Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo „/var/run/mysqld/mysqld.sock” (2) ”.

Ten błąd oznacza, że w systemie hosta nie działa serwer MySQL (mysqld) lub że określono nieprawidłową nazwę pliku gniazda Unix lub TCP/IP< port podczas próby połączenia z serwerem.

Upewnij się, że serwer działa, sprawdzając proces o nazwie mysqld na hoście serwera bazy danych, używając jednocześnie poleceń ps i grep, jak pokazano.

ps xa | grep mysqld | grep -v mysqld

Jeśli powyższe polecenia nie wyświetlają żadnych danych wyjściowych, oznacza to, że serwer bazy danych nie działa. Dlatego klient nie może się z nim połączyć. Aby uruchomić serwer, uruchom następującą komendę systemctl.

sudo systemctl start mysql        #Debian/Ubuntu
sudo systemctl start mysqld       #RHEL/CentOS/Fedora

Aby sprawdzić stan usługi MySQL, użyj poniższego polecenia.

sudo systemctl status mysql       #Debian/Ubuntu
sudo systemctl status mysqld      #RHEL/CentOS/Fedora

Z wyniku powyższego polecenia wynika, że usługa MySQL nie powiodła się. W takiej sytuacji możesz spróbować uruchomić go ponownie i jeszcze raz sprawdzić jego stan.

sudo systemctl restart mysql
sudo systemctl status mysql

Ponadto, jeśli serwer działa zgodnie z poniższym poleceniem, ale nadal widzisz powyższy błąd, powinieneś również sprawdzić, czy port TCP/IP jest blokowany przez zaporę ogniową lub jakąkolwiek usługę blokującą porty .

ps xa | grep mysqld | grep -v mysqld

Aby znaleźć port, na którym nasłuchuje serwer, użyj polecenia netstat, jak pokazano.

sudo netstat -tlpn | grep "mysql"

2. Nie można połączyć się z serwerem MySQL

Innym często spotykanym błędem połączenia jest „(2003) Nie można połączyć się z serwerem MySQL na serwerze (10061)”, co oznacza, że połączenie sieciowe zostało odrzucone.

Zacznij od sprawdzenia, czy w systemie działa serwer MySQL, jak pokazano powyżej. Upewnij się także, że serwer ma włączone połączenia sieciowe i że port sieciowy, którego używasz do połączenia, jest portem skonfigurowanym na serwerze.

Inne częste błędy, które możesz napotkać podczas próby połączenia się z serwerem MySQL to:

ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)

Te błędy wskazują, że serwer może działać, jednak próbujesz się połączyć przy użyciu portu TCP/IP, nazwanego potoku lub pliku gniazda Unix innego niż ten, na którym nasłuchuje serwer.

3. Błędy odmowy dostępu w MySQL

W MySQL konto użytkownika jest definiowane w oparciu o nazwę użytkownika oraz host lub hosty klienta, z których użytkownik może połączyć się z serwerem. Ponadto konto może również zawierać dane uwierzytelniające, takie jak hasło.

Chociaż istnieje wiele różnych przyczyn błędów „Odmowa dostępu”, jedna z najczęstszych przyczyn jest związana z kontami MySQL, na które serwer pozwala programom klienckim używać podczas łączenia. Wskazuje, że nazwa użytkownika podana w połączeniu nie ma uprawnień dostępu do bazy danych.

MySQL umożliwia tworzenie kont, które umożliwiają użytkownikom klienckim łączenie się z serwerem i dostęp do danych zarządzanych przez serwer. W związku z tym, jeśli napotkasz błąd odmowy dostępu, sprawdź, czy konto użytkownika może łączyć się z serwerem za pośrednictwem używanego programu klienckiego i ewentualnie host, z którego pochodzi połączenie .

Możesz zobaczyć, jakie uprawnienia ma dane konto, uruchamiając komendę SHOW GRANTS, jak pokazano.

> SHOW GRANTS FOR 'tecmint'@'localhost';

Możesz nadać uprawnienia konkretnemu użytkownikowi w określonej bazie danych na zdalny adres IP za pomocą następujących poleceń w powłoce MySQL.

> grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
> flush privileges;

Ponadto błędy odmowy dostępu mogą również wynikać z problemów z połączeniem się z MySQL, patrz wcześniej wyjaśnione błędy.

4. Utracono połączenie z serwerem MySQL

Ten błąd może wystąpić z jednego z następujących powodów: słaba łączność sieciowa, przekroczenie limitu czasu połączenia lub problem z wartościami BLOB większymi niż max_allowed_pakiet. W przypadku problemów z połączeniem sieciowym upewnij się, że masz dobre połączenie sieciowe, zwłaszcza jeśli uzyskujesz dostęp do zdalnego serwera bazy danych.

Jeśli jest to problem związany z przekroczeniem limitu czasu połączenia, zwłaszcza gdy MySQL próbuje użyć początkowego połączenia z serwerem, zwiększ wartość parametru connect_timeout . Ale w przypadku wartości BLOB większych niż max_allowed_packet, musisz ustawić wyższą wartość dla max_allowed_packet w pliku /etc /my.cnf plik konfiguracyjny w sekcji [mysqld] lub [client], jak pokazano.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Jeśli plik konfiguracyjny MySQL nie jest dla Ciebie dostępny, możesz ustawić tę wartość za pomocą następującego polecenia w powłoce MySQL.

> SET GLOBAL connect_timeout=100;
> SET GLOBAL max_allowed_packet=524288000;

5. Zbyt wiele połączeń MySQL

Jeśli klient MySQL napotka błąd „zbyt wiele połączeń”, oznacza to, że wszystkie dostępne połączenia są używane przez innych klientów. Liczba połączeń (domyślnie 151) jest kontrolowana przez zmienną systemową max_connections; możesz rozwiązać problem, zwiększając jego wartość, aby umożliwić więcej połączeń w pliku konfiguracyjnym /etc/my.cnf.

[mysqld]
max_connections=1000

6. Brak pamięci MySQL

Jeśli uruchomisz zapytanie za pomocą programu klienckiego MySQL i napotkasz błąd, o którym mowa, oznacza to, że MySQL nie ma wystarczającej ilości pamięci, aby zapisać cały wynik zapytania.

Pierwszym krokiem jest upewnienie się, że zapytanie jest poprawne, jeśli tak, wykonaj następujące czynności:

  • jeśli używasz bezpośrednio klienta MySQL, uruchom go za pomocą --quick switch, aby wyłączyć buforowane wyniki lub
  • jeśli używasz sterownika MyODBC, interfejs użytkownika konfiguracji (UI) zawiera zaawansowaną kartę flag. Zaznacz opcję „Nie buforuj wyników”.

Kolejnym świetnym narzędziem jest MySQL Tuner – przydatny skrypt, który połączy się z działającym serwerem MySQL i wyświetli sugestie dotyczące jego konfiguracji w celu uzyskania wyższej wydajności.

sudo apt-get install mysqltuner     #Debian/Ubuntu
sudo yum install mysqltuner         #RHEL/CentOS/Fedora
mysqltuner

Aby poznać wskazówki dotyczące optymalizacji i dostrajania wydajności MySQL, przeczytaj nasz artykuł: 15 przydatnych wskazówek dotyczących dostrajania i optymalizacji wydajności MySQL/MariaDB.

7. MySQL ciągle się zawiesza

Jeśli napotkasz ten problem, powinieneś spróbować dowiedzieć się, czy przyczyną problemu jest śmierć serwera MySQL, czy też problem leży po stronie klienta. Należy pamiętać, że wiele awarii serwerów jest spowodowanych uszkodzonymi plikami danych lub plikami indeksu.

Możesz sprawdzić status serwera, aby ustalić, jak długo działa.

sudo systemctl status mysql       #Debian/Ubuntu
sudo systemctl status mysqld      #RHEL/CentOS/Fedora

Alternatywnie uruchom następującą komendę mysqladmin, aby sprawdzić czas pracy serwera MySQL.

sudo mysqladmin version -p 

Inne rozwiązania obejmują między innymi zatrzymanie serwera MySQL i włączenie debugowania, a następnie ponowne uruchomienie usługi. Możesz spróbować stworzyć przypadek testowy, którego można użyć do powtórzenia problemu. Ponadto otwórz dodatkowe okno terminala i uruchom następujące polecenie, aby wyświetlić statystyki procesu MySQL podczas uruchamiania innych zapytań:

sudo mysqladmin -i 5 status
OR
sudo mysqladmin -i 5 -r status 

Konkluzja: ustalenie, co jest przyczyną problemu lub błędu

Chociaż przyjrzeliśmy się niektórym typowym problemom i błędom MySQL, a także przedstawiliśmy sposoby ich rozwiązywania, najważniejszą rzeczą w diagnozowaniu błędu jest zrozumienie, co on oznacza (w sensie przyczyny). .

Jak więc to ustalić? Poniższe punkty pomogą Ci ustalić, co dokładnie jest przyczyną problemu:

  1. Pierwszym i najważniejszym krokiem jest przejrzenie logów MySQL, które są przechowywane w katalogu /var/log/mysql/. Do przeglądania plików dziennika można używać narzędzi wiersza poleceń, takich jak tail.
  2. Jeśli usługa MySQL nie uruchomi się, sprawdź jej status za pomocą systemctl lub użyj polecenia journetctl (z flagą -xe) w obszarze systemd, aby zbadać problem.
  3. Możesz także sprawdzić plik dziennika systemowego, taki jak /var/log/messages lub podobny, w celu znalezienia przyczyny problemu.
  4. Spróbuj użyć narzędzi takich jak Mytop, spojrzenie, top, ps lub htop, aby sprawdzić, który program zajmuje cały procesor lub blokuje maszynę, albo sprawdzić, czy brakuje Ci pamięci, miejsca na dysku, deskryptorów plików lub innego ważnego zasobu .
  5. Zakładając, że problemem jest jakiś niekontrolowany proces, zawsze możesz spróbować go zabić (używając narzędzia pkill lub kill), aby MySQL działał normalnie.
  6. Zakładając, że serwer mysqld powoduje problemy, możesz uruchomić polecenie: mysqladmin -u root ping lub mysqladmin -u root lista procesów, aby uzyskać dowolny odpowiedź z niego.
  7. Jeśli problem dotyczy programu klienckiego podczas próby połączenia się z serwerem MySQL, sprawdź, dlaczego nie działa poprawnie i spróbuj uzyskać z niego jakiekolwiek dane wyjściowe w celu rozwiązania problemu.

Możesz także przeczytać następujące artykuły dotyczące MySQL:

  1. Naucz się MySQL/MariaDB dla początkujących – część 1
  2. Jak monitorować bazy danych MySQL/MariaDB za pomocą Netdata w CentOS 7
  3. Jak przenieść wszystkie bazy danych MySQL ze starego na nowy serwer
  4. Mytop – przydatne narzędzie do monitorowania wydajności MySQL/MariaDB w systemie Linux
  5. 12 najlepszych praktyk dotyczących bezpieczeństwa MySQL/MariaDB dla systemu Linux

Aby uzyskać więcej informacji, zapoznaj się z podręcznikiem MySQL Reference dotyczącym problemów i typowych błędów. Zawiera on obszerną listę typowych problemów i komunikatów o błędach, które możesz napotkać podczas korzystania z MySQL, w tym te, które omówiliśmy powyżej i nie tylko.