Sfaturi utile pentru a depana erorile comune în MySQL


MySQL este un sistem de gestionare a bazelor de date relaționale cu sursă deschisă utilizat pe scară largă (RDMS) deținut de Oracle. De-a lungul anilor, a fost alegerea implicită pentru aplicațiile bazate pe web și rămâne în continuare populară în comparație cu alte motoare de baze de date.

MySQL a fost proiectat și optimizat pentru aplicații web – face parte integrantă din principalele aplicații bazate pe web, cum ar fi Facebook, Twitter, Wikipedia, YouTube și multe altele.

Site-ul sau aplicația dvs. web este alimentată de MySQL? În acest articol detaliat, vom explica cum să depanați problemele și erorile comune în serverul de baze de date MySQL. Vom descrie cum să determinăm cauzele problemelor și ce trebuie făcut pentru a le rezolva.

1. Nu se poate conecta la serverul MySQL local

Una dintre erorile comune de conectare client-server în MySQL este „EROAREA 2002 (HY000): Nu se poate conecta la serverul MySQL local prin socket-ul „/var/run/mysqld/mysqld.sock” (2)”.

Această eroare indică faptul că nu există niciun server MySQL (mysqld) care rulează pe sistemul gazdă sau că ați specificat un nume de fișier socket Unix sau TCP/IP< când încercați să vă conectați la server.

Asigurați-vă că serverul rulează verificând un proces numit mysqld pe gazda serverului dumneavoastră de bază de date folosind comanda grep împreună, așa cum se arată.

$ ps xa | grep mysqld | grep -v mysqld

Dacă comenzile de mai sus nu arată nicio ieșire, atunci serverul de baze de date nu rulează. Prin urmare, clientul nu se poate conecta la acesta. Pentru a porni serverul, rulați următoarea comandă systemctl.

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

Pentru a verifica starea serviciului MySQL, utilizați următoarea comandă.

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

Din rezultatul comenzii de mai sus, serviciul MySQL a eșuat. Într-un astfel de caz, puteți încerca să-l reporniți și să-i verificați încă o dată starea.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

În plus, dacă serverul rulează așa cum se arată în următoarea comandă, dar încă vedeți eroarea de mai sus, ar trebui să verificați și dacă portul TCP/IP este blocat de un firewall sau de orice serviciu de blocare a portului .

$ ps xa | grep mysqld | grep -v mysqld

La comanda netstat, așa cum se arată.

$ sudo netstat -tlpn | grep "mysql"

2. Nu se poate conecta la serverul MySQL

O altă eroare de conexiune întâlnită frecvent este „(2003) Nu se poate conecta la serverul MySQL pe „server” (10061)”, ceea ce înseamnă că conexiunea la rețea a fost refuzată.

Aici, începeți prin a verifica dacă există un server MySQL care rulează pe sistem, așa cum se arată mai sus. De asemenea, asigurați-vă că serverul are conexiunile de rețea activate și că portul de rețea pe care îl utilizați pentru a vă conecta este cel configurat pe server.

Alte erori frecvente pe care este posibil să le întâlniți atunci când încercați să vă conectați la serverul MySQL sunt:

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)

Aceste erori indică faptul că serverul ar putea rula, cu toate acestea, încercați să vă conectați utilizând un port TCP/IP, conductă numită sau fișier socket Unix diferit de cel pe care ascultă serverul.

3. Accesați erorile refuzate în MySQL

În MySQL, un cont de utilizator este definit în termeni de nume de utilizator și gazdă sau gazde client de la care utilizatorul se poate conecta la server. În plus, un cont poate avea și acreditări de autentificare, cum ar fi o parolă.

Deși există multe cauze diferite ale erorilor „Acces refuzat”, una dintre cauzele comune este legată de conturile MySQL pe care serverul le permite programelor client să le folosească atunci când se conectează. Indică faptul că nume de utilizator specificat în conexiune nu are privilegii de acces la baza de date.

MySQL permite crearea de conturi care permit utilizatorilor client să se conecteze la server și să acceseze datele gestionate de server. În acest sens, dacă întâmpinați o eroare de acces refuzat, verificați dacă contul de utilizator are permisiunea de a se conecta la server prin programul client pe care îl utilizați și, eventual, gazda de la care provine conexiunea .

Puteți vedea ce privilegii are un anumit cont rulând comanda SHOW GRANTS după cum se arată.

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

Puteți acorda privilegii unui anumit utilizator pe o anumită bază de date la adresa IP de la distanță folosind următoarele comenzi din shell-ul MySQL.

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

În plus, erorile de acces refuzat pot rezulta și din probleme de conectare la MySQL, consultați erorile explicate anterior.

4. Conexiunea pierdută la serverul MySQL

Este posibil să întâmpinați această eroare din unul dintre următoarele motive: conectivitate slabă la rețea, expirare a conexiunii sau o problemă cu valorile BLOB care sunt mai mari decât max_allowed_packet. În cazul unei probleme de conexiune la rețea, asigurați-vă că aveți o conexiune bună la rețea, mai ales dacă accesați un server de baze de date la distanță.

Dacă este o problemă de timeout conexiune, în special atunci când MySQL încearcă să folosească o conexiune inițială la server, măriți valoarea parametrului connect_timeout . Dar în cazul valorilor BLOB care sunt mai mari decât max_allowed_packet, trebuie să setați o valoare mai mare pentru max_allowed_packet în /etc. /my.cnf fișierul de configurare din secțiunea [mysqld] sau [client], după cum se arată.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Dacă fișierul de configurare MySQL nu este accesibil pentru dvs., atunci puteți seta această valoare folosind următoarea comandă din shell-ul MySQL.

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

5. Prea multe conexiuni MySQL

În cazul în care un client MySQL întâlnește eroarea „prea multe conexiuni”, înseamnă că toate conexiunile disponibile sunt utilizate de alți clienți. Numărul de conexiuni (implicit este 151) este controlată de variabila de sistem max_connections; puteți remedia problema prin creșterea valorii acesteia pentru a permite mai multe conexiuni în /etc/my.cnf > fișier de configurare.

[mysqld]
max_connections=1000

6. Nu există memorie MySQL

În cazul în care executați o interogare folosind programul client MySQL și întâmpinați eroarea în cauză, înseamnă că MySQL nu are suficientă memorie pentru a stoca întregul rezultat al interogării.

Primul pas este să vă asigurați că interogarea este corectă, dacă este, atunci faceți următoarele:

  • dacă utilizați clientul MySQL direct, porniți-l cu --commutare rapidă, pentru a dezactiva rezultatele stocate în cache sau
  • dacă utilizați driverul MyODBC, interfața de configurare cu utilizatorul (UI) are o filă avansată pentru semnalizatoare. Bifați „Nu stocați rezultatul în cache”.

Un alt instrument grozav este MySQL Tuner – un script util care se va conecta la un server MySQL care rulează și oferă sugestii despre cum poate fi configurat pentru performanțe mai mari.

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

Pentru sfaturi de optimizare și optimizare a performanței MySQL, citiți articolul nostru: 15 sfaturi utile de optimizare și optimizare a performanței MySQL/MariaDB.

7. MySQL continuă să se prăbușească

Dacă întâmpinați această problemă, ar trebui să încercați să aflați dacă problema este că serverul MySQL moare sau dacă este clientul cu o problemă. Rețineți că multe blocări ale serverului sunt cauzate de fișiere de date sau fișiere index corupte.

Puteți verifica starea serverului pentru a stabili cât timp a funcționat.

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

Alternativ, rulați următoarea comandă mysqladmin pentru a găsi timpul de funcționare al serverului MySQL.

$ sudo mysqladmin version -p 

Alte soluții includ, dar fără a se limita la, oprirea serverului MySQL și activarea depanării, apoi reporniți serviciul. Puteți încerca să faceți un caz de testare care să poată fi folosit pentru a repeta problema. În plus, deschideți o fereastră suplimentară de terminal și rulați următoarea comandă pentru a afișa statisticile procesului MySQL în timp ce rulați celelalte interogări:

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

Concluzia: determinarea cauzei unei probleme sau a unei erori

Deși am analizat câteva probleme și erori comune de MySQL și am oferit, de asemenea, modalități de a le depana și de a le rezolva, cel mai important lucru în diagnosticarea unei erori este să înțelegem ce înseamnă aceasta (în ceea ce privește ceea ce o cauzează) .

Deci, cum poți determina asta? Următoarele puncte vă vor ghida asupra modului de a afla ce anume cauzează o problemă:

  1. Primul și cel mai important pas este să cercetați jurnalele MySQL care sunt stocate în directorul /var/log/mysql/. Puteți utiliza utilitare de linie de comandă, cum ar fi tail, pentru a citi fișierele jurnal.
  2. Dacă serviciul MySQL nu reușește să pornească, verificați starea acestuia folosind systemctl sau utilizați comanda journetctl (cu marcatorul -xe) sub systemd pentru a examina problema.
  3. De asemenea, puteți examina fișierul jurnal de sistem, cum ar fi /var/log/messages sau similar pentru motivele problemei dvs.
  4. Încercați să utilizați instrumente precum htop pentru a verifica care program ia tot CPU-ul sau blochează mașina sau pentru a verifica dacă rămâneți fără memorie, spațiu pe disc, descriptori de fișiere sau alte resurse importante.
  5. Presupunând că problema este un proces eliberat, puteți încerca oricând să îl opriți (folosind utilitarul pkill sau kill), astfel încât MySQL să funcționeze normal.
  6. Presupunând că serverul mysqld cauzează probleme, puteți rula comanda: mysqladmin -u root ping sau mysqladmin -u root processlist pentru a obține orice răspuns de la acesta.
  7. Dacă problema este legată de programul dvs. client în timp ce încercați să vă conectați la serverul MySQL, verificați de ce nu funcționează bine, încercați să obțineți orice rezultat din acesta în scopul depanării.

De asemenea, v-ar putea dori să citiți următoarele articole legate de MySQL:

  1. Învățați MySQL/MariaDB pentru începători – Partea 1
  2. Cum să monitorizați bazele de date MySQL/MariaDB folosind Netdata pe CentOS 7
  3. Cum se transferă toate bazele de date MySQL de la serverul vechi pe cel nou
  4. Mytop – Un instrument util pentru monitorizarea performanței MySQL/MariaDB în Linux
  5. 12 Cele mai bune practici de securitate MySQL/MariaDB pentru Linux

Pentru mai multe informații, consultați manualul de referință MySQL referitor la Probleme și erori comune, acesta listează cuprinzător problemele comune și mesajele de eroare pe care le puteți întâlni în timp ce utilizați MySQL, inclusiv cele pe care le-am discutat mai sus și multe altele.