Koristni nasveti za odpravljanje pogostih napak v MySQL


MySQL je široko uporabljen odprtokodni sistem za upravljanje relacijskih baz podatkov (RDMS) v lasti podjetja Oracle. Že leta je privzeta izbira za spletne aplikacije in je še vedno priljubljena v primerjavi z drugimi motorji baz podatkov.

MySQL je bil zasnovan in optimiziran za spletne aplikacije-je sestavni del večjih spletnih aplikacij, kot so Facebook, Twitter, Wikipedia, YouTube in mnoge druge.

Ali vaše spletno mesto ali spletno aplikacijo poganja MySQL? V tem podrobnem članku bomo razložili, kako odpraviti težave in pogoste napake v strežniku baz podatkov MySQL. Opisali bomo, kako ugotoviti vzroke težav in kaj storiti, da jih odpravimo.

1. Ne morem se povezati z lokalnim strežnikom MySQL

Ena najpogostejših napak pri povezovanju med odjemalcem in strežnikom v MySQL je "ERROR 2002 (HY000): Ne morem se povezati z lokalnim strežnikom MySQL prek vtičnice '/var/run/mysqld/mysqld.sock' (2)".

Ta napaka označuje, da v gostiteljskem sistemu ne deluje (mysqld) strežnika MySQL ali da ste pri poskusu vzpostavitve povezave s strežnikom podali napačno ime datoteke vtičnice Unix ali vrata TCP/IP.

Prepričajte se, da strežnik deluje, tako da skupaj z ukazom grep preverite postopek z imenom mysqld na gostitelju strežnika baz podatkov, kot je prikazano.

$ ps xa | grep mysqld | grep -v mysqld

Če zgornji ukazi ne prikazujejo izhodnih podatkov, strežnik zbirke podatkov ne deluje. Zato se odjemalec ne more povezati z njim. Če želite zagnati strežnik, zaženite naslednji ukaz systemctl.

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

Če želite preveriti stanje storitve MySQL, uporabite naslednji ukaz.

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

Iz rezultatov zgornjega ukaza storitev MySQL ni uspela. V tem primeru ga lahko poskusite znova zagnati in še enkrat preveriti njegovo stanje.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Če strežnik deluje, kot prikazuje naslednji ukaz, vendar še vedno vidite zgornjo napako, morate tudi preveriti, ali vrata TCP/IP blokira požarni zid ali katera koli storitev za blokiranje vrat.

$ ps xa | grep mysqld | grep -v mysqld

Za ukaz netstat, kot je prikazano.

$ sudo netstat -tlpn | grep "mysql"

2. Ne morem se povezati s strežnikom MySQL

Druga najpogostejša napaka pri povezavi je\"(2003) Ni mogoče vzpostaviti povezave s strežnikom MySQL na" strežniku "(10061)", kar pomeni, da je bila omrežna povezava zavrnjena.

Tukaj začnite s preverjanjem, ali v sistemu deluje strežnik MySQL, kot je prikazano zgoraj. Poskrbite tudi, da so na strežniku omogočene omrežne povezave in da so omrežna vrata, ki jih uporabljate za povezavo, tista, ki so konfigurirana na strežniku.

Druge pogoste napake, na katere boste verjetno naleteli, ko se poskušate povezati s strežnikom MySQL, so:

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 napake kažejo, da strežnik morda deluje, vendar se poskušate povezati z vrati TCP/IP, imenovano cevjo ali datoteko vtičnice Unix, ki je drugačna od tiste, na kateri strežnik posluša.

3. Dostop do zavrnjenih napak v MySQL

V MySQL je uporabniški račun definiran v smislu uporabniškega imena in gostiteljskega odjemalca ali gostiteljev, s katerih se lahko uporabnik poveže s strežnikom. Poleg tega lahko račun vsebuje tudi poverilnice za preverjanje pristnosti, kot je geslo.

Čeprav obstaja veliko različnih vzrokov za napake\"Dostop zavrnjen", je eden od pogostih vzrokov za račune MySQL, ki jih strežnik dovoljuje odjemalskim programom za uporabo pri povezovanju. To kaže, da uporabniško ime, navedeno v povezavi, nima pravic do dostopa zbirko podatkov.

MySQL omogoča ustvarjanje računov, ki uporabnikom odjemalcev omogočajo povezavo s strežnikom in dostop do podatkov, ki jih upravlja strežnik. V zvezi s tem, če naletite na napako pri zavrnitvi dostopa, preverite, ali se lahko uporabniški račun poveže s strežnikom prek odjemalskega programa, ki ga uporabljate, in morda gostitelja, s katerega prihaja povezava.

Katere privilegije ima določen račun, si lahko ogledate tako, da zaženete ukaz SHOW GRANTS , kot je prikazano.

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

Določite lahko privilegije določenemu uporabniku v določeni zbirki podatkov na oddaljenem naslovu ip z naslednjimi ukazi v lupini MySQL.

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

Poleg tega lahko napake pri zavrnitvi dostopa nastanejo tudi zaradi težav pri povezovanju z MySQL, glejte prej pojasnjene napake.

4. Izgubljena povezava s strežnikom MySQL

Do te napake lahko pride zaradi enega od naslednjih razlogov: slaba omrežna povezava, časovna omejitev povezave ali težava z vrednostmi BLOB, ki so večje od max_allowed_packet. V primeru težave z omrežno povezavo se prepričajte, da imate dobro omrežno povezavo, še posebej, če dostopate do oddaljenega strežnika baz podatkov.

Če gre za težavo s prekinitvijo povezave, zlasti ko MySQL poskuša uporabiti začetno povezavo s strežnikom, povečajte vrednost parametra connect_timeout. V primeru vrednosti BLOB, ki so večje od max_allowed_packet, morate nastaviti večjo vrednost za max_allowed_packet v konfiguracijski datoteki /etc/my.cnf pod [mysqld] ali [client] , kot je prikazano.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Če konfiguracijska datoteka MySQL za vas ni dostopna, lahko to vrednost nastavite z naslednjim ukazom v lupini MySQL.

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

5. Preveč povezav MySQL

Če odjemalec MySQL naleti na napako\"preveč povezav", to pomeni, da vse odjemalce uporabljajo vse razpoložljive povezave. Število povezav (privzeto je 151) nadzira sistem max_connections spremenljivko; težavo lahko odpravite tako, da povečate njeno vrednost, da omogočite več povezav v konfiguracijski datoteki /etc/my.cnf.

[mysqld]
max_connections=1000

6. Manjka pomnilnika MySQL

Če poizvedujete z odjemalskim programom MySQL in naletite na zadevno napako, to pomeni, da MySQL nima dovolj pomnilnika za shranjevanje celotnega rezultata poizvedbe.

Prvi korak je zagotoviti, da je poizvedba pravilna, če je, potem naredite naslednje:

  • če neposredno uporabljate odjemalca MySQL, ga zaženite z --quick switch , da onemogočite predpomnjene rezultate ali
  • če uporabljate gonilnik MyODBC, ima konfiguracijski uporabniški vmesnik (UI) napreden zavihek za zastavice. Potrdite polje »Ne predpomni rezultata«.

Drugo odlično orodje je MySQL Tuner - uporaben skript, ki se poveže z delujočim strežnikom MySQL in poda predloge, kako ga lahko konfigurirate za večjo zmogljivost.

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

Za nasvete o optimizaciji in nastavitvi zmogljivosti MySQL preberite naš članek: 15 koristnih nasvetov za prilagajanje in optimizacijo zmogljivosti MySQL/MariaDB.

7. MySQL se še naprej zruši

Če naletite na to težavo, poskusite ugotoviti, ali je težava v tem, da strežnik MySQL umre, ali je njegov odjemalec težava. Upoštevajte, da je veliko zrušitev strežnika posledica poškodovanih podatkovnih datotek ali indeksnih datotek.

Stanje strežnika lahko preverite, kako dolgo deluje in deluje.

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

Lahko pa zaženete naslednji ukaz mysqladmin, da poiščete čas delovanja strežnika MySQL.

$ sudo mysqladmin version -p 

Druge rešitve vključujejo, vendar ne omejeno na zaustavitev strežnika MySQL in omogočanje odpravljanja napak, nato pa znova zaženite storitev. Lahko poskusite narediti testni primer, s katerim lahko ponovite težavo. Poleg tega odprite dodatno terminalsko okno in zaženite naslednji ukaz za prikaz statistike procesa MySQL, medtem ko izvajate druge poizvedbe:

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

Čeprav smo preučili nekaj pogostih težav in napak MySQL ter zagotovili načine za njihovo odpravljanje in odpravljanje, je najpomembnejše pri diagnosticiranju napake razumeti, kaj to pomeni (v smislu, kaj jo povzroča).

Kako lahko torej to ugotovite? Naslednje točke vas bodo vodile, kako ugotoviti, kaj točno povzroča težavo:

  1. Prvi in najpomembnejši korak je pogled v dnevnike MySQL, ki so shranjeni v imeniku /var/log/mysql/. Za branje datotek dnevnika lahko uporabite pripomočke ukazne vrstice, na primer rep.
  2. Če se storitev MySQL ne zažene, preverite njeno stanje z uporabo systemctl ali uporabite ukaz journetctl (z zastavico -xe ) pod systemd, da preverite težavo.
  3. Prav tako lahko preverite datoteko sistemskega dnevnika, na primer /var/log/messages ali podobno, da ugotovite razloge za svojo težavo.
  4. Poskusite z orodji, kot je htop, preveriti, kateri program zaseda ves procesor ali zaklene napravo, ali pa preverite, ali vam zmanjkuje pomnilnika, prostora na disku, deskriptorjev datotek ali katerega drugega pomembnega vira.
  5. Ob predpostavki, da je težava nekakšen bežen proces, jo lahko vedno poskusite ubiti (z uporabo pripomočka pkill ali kill), da bo MySQL deloval normalno.
  6. Recimo, da strežnik mysqld povzroča težave, lahko zaženete ukaz: mysqladmin -u root ping ali mysqladmin -u root processlist , če želite od njega dobiti kakršen koli odgovor.
  7. Če je težava v odjemalskem programu, ko se poskušate povezati s strežnikom MySQL, preverite, zakaj ne deluje, poskusite iz njega odpraviti izhodne podatke za odpravljanje težav.

Morda bi radi prebrali tudi naslednje članke, povezane z MySQL:

  1. Naučite se MySQL/MariaDB za začetnike - 1. del
  2. Kako spremljati zbirke podatkov MySQL/MariaDB z uporabo Netdata na CentOS 7
  3. Kako prenesti vse baze podatkov MySQL s starega na nov strežnik
  4. Mytop - uporabno orodje za spremljanje zmogljivosti MySQL/MariaDB v Linuxu
  5. 12 najboljših praks varnosti MySQL/MariaDB za Linux

Za več informacij si oglejte referenčni priročnik MySQL o težavah in pogostih napakah, ki izčrpno navaja pogoste težave in sporočila o napakah, na katere lahko naletite med uporabo MySQL, vključno s tistimi, o katerih smo razpravljali zgoraj in še več.