Korisni savjeti za rješavanje uobičajenih grešaka u MySQL-u


MySQL je široko korišćen sistem za upravljanje relacionim bazama podataka otvorenog koda (RDMS) u vlasništvu Oraclea. Tokom godina je bio podrazumevani izbor za veb-bazirane aplikacije i još uvek je popularan u poređenju sa drugim mašinama za baze podataka.

MySQL je dizajniran i optimiziran za web aplikacije – čini sastavni dio velikih web aplikacija kao što su Facebook, Twitter, Wikipedia, YouTube i mnoge druge.

Da li vaša stranica ili web aplikacija pokreće MySQL? U ovom detaljnom članku ćemo objasniti kako riješiti probleme i uobičajene greške u MySQL serveru baze podataka. Opisat ćemo kako utvrditi uzroke problema i što učiniti da ih riješimo.

1. Ne mogu se povezati na lokalni MySQL server

Jedna od uobičajenih grešaka u povezivanju između klijenta i servera u MySQL-u je \ERROR 2002 (HY000): Ne mogu se povezati na lokalni MySQL server preko utičnice '/var/run/mysqld/mysqld.sock' (2).

Ova greška ukazuje da ne postoji MySQL server (mysqld) koji radi na host sistemu ili da ste naveli pogrešno ime datoteke Unix socketa ili TCP/IP port kada pokušavate da se povežete sa serverom.

Uvjerite se da server radi tako što ćete provjeriti proces pod nazivom mysqld na vašem host serveru baze podataka koristeći naredbu grep zajedno kao što je prikazano.

$ ps xa | grep mysqld | grep -v mysqld

Ako gornje naredbe ne pokazuju nikakav izlaz, onda poslužitelj baze podataka ne radi. Stoga se klijent ne može povezati s njim. Da pokrenete server, pokrenite sljedeću systemctl naredbu.

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

Da biste provjerili status MySQL usluge, koristite sljedeću naredbu.

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

Iz izlaza gornje naredbe, MySQL servis nije uspio. U tom slučaju možete ga pokušati ponovo pokrenuti i još jednom provjeriti njegov status.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Osim toga, ako server radi kao što je prikazano sljedećom naredbom, ali i dalje vidite gornju grešku, također biste trebali provjeriti da li je TCP/IP port blokiran od strane firewall-a ili bilo koje usluge za blokiranje portova.

$ ps xa | grep mysqld | grep -v mysqld

Za netstat komandu kao što je prikazano.

$ sudo netstat -tlpn | grep "mysql"

2. Ne mogu se povezati na MySQL server

Još jedna česta greška u vezi je \(2003) Ne mogu se spojiti na MySQL server na 'serveru' (10061), što znači da je mrežna veza odbijena.

Ovdje počnite tako što ćete provjeriti postoji li MySQL server koji radi na sistemu kao što je prikazano iznad. Također osigurajte da server ima omogućene mrežne veze i da je mrežni port koji koristite za povezivanje onaj koji je konfiguriran na serveru.

Ostale uobičajene greške na koje ćete vjerovatno naići kada pokušate da se povežete na MySQL server su:

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)

Ove greške ukazuju na to da server možda radi, međutim, pokušavate da se povežete koristeći TCP/IP port, imenovanu cev ili Unix socket datoteku koja se razlikuje od one koju server sluša.

3. Pristup odbijenim greškama u MySQL

U MySQL-u, korisnički račun je definiran u smislu korisničkog imena i klijentskog hosta ili hostova sa kojih se korisnik može povezati na server. Osim toga, nalog može imati i vjerodajnice za autentifikaciju kao što je lozinka.

Iako postoji mnogo različitih uzroka grešaka \Pristup odbijen, jedan od uobičajenih uzroka se odnosi na MySQL naloge koje server dozvoljava klijentskim programima da koriste prilikom povezivanja. To ukazuje da korisničko ime navedeno u vezi nema privilegije za pristup bazu podataka.

MySQL omogućava kreiranje naloga koji omogućavaju korisnicima klijenta da se povežu na server i pristupe podacima kojima upravlja server. S tim u vezi, ako naiđete na grešku odbijenog pristupa, provjerite da li je korisničkom računu dozvoljeno da se poveže sa serverom preko klijentskog programa koji koristite, a moguće i hosta s kojeg dolazi konekcija.

Možete vidjeti koje privilegije ima dati račun pokretanjem naredbe SHOW GRANTS kao što je prikazano.

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

Možete dodijeliti privilegije određenom korisniku na određenoj bazi podataka na udaljenoj IP adresi koristeći sljedeće naredbe u MySQL ljusci.

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

Nadalje, greške u pristupu odbijene mogu također biti rezultat problema s povezivanjem na MySQL, pogledajte prethodno objašnjene greške.

4. Izgubljena veza sa MySQL serverom

Možete naići na ovu grešku zbog jednog od sljedećih razloga: slaba mrežna povezanost, vremensko ograničenje veze ili problem sa BLOB vrijednostima koje su veće od max_allowed_packet. U slučaju problema sa mrežnom vezom, uvjerite se da imate dobru mrežnu vezu, posebno ako pristupate udaljenom poslužitelju baze podataka.

Ako se radi o problemu vremenskog ograničenja veze, posebno kada MySQL pokušava da koristi početnu vezu sa serverom, povećajte vrednost parametra connect_timeout. Ali u slučaju BLOB vrijednosti koje su veće od max_allowed_packet, morate postaviti višu vrijednost za max_allowed_packet u vašoj /etc/my.cnf konfiguracijskoj datoteci pod [mysqld] ili [client] odjeljak kao što je prikazano.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Ako vam MySQL konfiguracijska datoteka nije dostupna, tada možete postaviti ovu vrijednost koristeći sljedeću naredbu u MySQL ljusci.

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

5. Previše MySQL veza

U slučaju da MySQL klijent naiđe na grešku \previše veza, to znači da sve dostupne veze koriste drugi klijenti. Broj konekcija (podrazumevano je 151) kontroliše sistem max_connections varijabla; problem možete riješiti povećanjem njegove vrijednosti da biste omogućili više veza u vašoj /etc/my.cnf konfiguracijskoj datoteci.

[mysqld]
max_connections=1000

6. Out of Memory MySQL

U slučaju da pokrenete upit koristeći MySQL klijentski program i naiđete na dotičnu grešku, to znači da MySQL nema dovoljno memorije da pohrani cijeli rezultat upita.

Prvi korak je osigurati da je upit ispravan, ako jeste, onda učinite sljedeće:

  • ako koristite MySQL klijent direktno, pokrenite ga sa --quick switch, da onemogućite keširane rezultate ili
  • ako koristite MyODBC drajver, konfiguracijski korisnički interfejs (UI) ima naprednu karticu za zastavice. Označite „Ne keširaj rezultat“.

Još jedan sjajan alat je MySQL Tuner – korisna skripta koja će se povezati na MySQL server koji radi i daje prijedloge kako se može konfigurirati za veće performanse.

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

Za MySQL optimizaciju i savjete za podešavanje performansi, pročitajte naš članak: 15 korisnih savjeta za podešavanje i optimizaciju performansi MySQL/MariaDB.

7. MySQL se stalno ruši

Ako naiđete na ovaj problem, trebali biste pokušati otkriti da li je problem u tome što MySQL server umire ili je problem kod klijenta. Imajte na umu da su mnogi padovi servera uzrokovani oštećenim datotekama podataka ili indeksnim datotekama.

Možete provjeriti status servera da utvrdite koliko dugo je on bio u funkciji.

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

Alternativno, pokrenite sljedeću naredbu mysqladmin da pronađete vrijeme rada MySQL servera.

$ sudo mysqladmin version -p 

Ostala rješenja uključuju, ali nisu ograničena na zaustavljanje MySQL servera i omogućavanje otklanjanja grešaka, a zatim ponovno pokretanje usluge. Možete pokušati napraviti probni slučaj koji se može koristiti za ponavljanje problema. Osim toga, otvorite dodatni prozor terminala i pokrenite sljedeću naredbu za prikaz statistike MySQL procesa dok izvršavate druge upite:

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

Iako smo pogledali neke uobičajene MySQL probleme i greške i pružili načine za njihovo otklanjanje i rješavanje, najvažnija stvar u dijagnosticiranju greške je razumijevanje šta ona znači (u smislu onoga što je uzrokuje).

Pa kako to možete odrediti? Sljedeće tačke će vas voditi kako da utvrdite šta tačno uzrokuje problem:

  1. Prvi i najvažniji korak je da pogledate MySQL dnevnike koji su pohranjeni u direktoriju /var/log/mysql/. Možete koristiti uslužne programe komandne linije kao što je tail za čitanje datoteka dnevnika.
  2. Ako MySQL servis ne uspije da se pokrene, provjerite njegov status koristeći systemctl ili koristite naredbu journetctl (sa -xe zastavicom) pod systemd da biste ispitali problem.
  3. Također možete ispitati sistemsku datoteku dnevnika kao što je /var/log/messages ili slično za razloge vašeg problema.
  4. Pokušajte koristiti alate kao što je htop da provjerite koji program zauzima sav CPU ili zaključava mašinu ili da provjerite da li vam ponestaje memorije, prostora na disku, deskriptora datoteka ili nekog drugog važnog resursa.
  5. Pod pretpostavkom da je problem neki proces koji je u bijegu, uvijek možete pokušati da ga ubijete (koristeći pkill ili uslužni program) kako bi MySQL radio normalno.
  6. Pod pretpostavkom da mysqld server uzrokuje probleme, možete pokrenuti naredbu: mysqladmin -u root ping ili mysqladmin -u root processlist da dobijete bilo kakav odgovor od njega.
  7. Ako je problem sa vašim klijentskim programom dok pokušavate da se povežete na MySQL server, proverite zašto ne radi dobro, pokušajte da dobijete bilo kakav izlaz iz njega u svrhu rešavanja problema.

Možda biste željeli pročitati i ove sljedeće članke vezane za MySQL:

  1. Naučite MySQL/MariaDB za početnike – 1. dio
  2. Kako pratiti MySQL/MariaDB baze podataka koristeći Netdata na CentOS 7
  3. Kako prenijeti sve MySQL baze podataka sa starog na novi server
  4. Mytop – Koristan alat za praćenje performansi MySQL/MariaDB u Linuxu
  5. 12 MySQL/MariaDB sigurnosnih najboljih praksi za Linux

Za više informacija, konsultujte MySQL Referentni priručnik o problemima i uobičajenim greškama, on sveobuhvatno navodi uobičajene probleme i poruke o greškama na koje možete naići dok koristite MySQL, uključujući one o kojima smo raspravljali gore i još mnogo toga.