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


MySQL široko je korišten sustav za upravljanje relacijskom bazom podataka otvorenog koda (RDMS) u vlasništvu Oracle. Tijekom godina bio je zadani izbor za aplikacije temeljene na webu i još uvijek je popularan u usporedbi s drugim motorima baze podataka.

Pročitajte također: Kako instalirati najnoviji MySQL na RHEL/CentOS i Fedora

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

Pokreće li vaše web mjesto ili web aplikaciju MySQL? U ovom detaljnom članku objasnit ćemo kako riješiti probleme i uobičajene pogreške u MySQL poslužitelju baze podataka. Opisat ćemo kako utvrditi uzroke problema i što učiniti da ih riješite.

1. Ne mogu se spojiti na lokalni MySQL poslužitelj

Jedna od uobičajenih pogrešaka povezivanja klijenta s poslužiteljem u MySQL-u je “GREŠKA 2002 (HY000): Ne mogu se povezati s lokalnim MySQL poslužiteljem putem utičnice '/var/run/mysqld/mysqld.sock' (2) ”.

Ova pogreška označava da na glavnom sustavu ne radi MySQL poslužitelj (mysqld) ili da ste naveli pogrešan naziv datoteke Unix utičnice ili TCP/IP< priključak kada se pokušavate spojiti na poslužitelj.

Osigurajte da poslužitelj radi provjerom procesa pod nazivom mysqld na hostu vašeg poslužitelja baze podataka koristeći naredbu ps i naredbu grep zajedno kao što je prikazano.

ps xa | grep mysqld | grep -v mysqld

Ako gornje naredbe ne pokazuju izlaz, tada poslužitelj baze podataka ne radi. Stoga se klijent ne može spojiti na njega. Za pokretanje poslužitelja pokrenite sljedeću naredbu systemctl.

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

Za provjeru statusa usluge MySQL koristite sljedeću naredbu.

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

Prema rezultatu gornje naredbe, usluga MySQL nije uspjela. U tom slučaju, možete ga pokušati ponovno pokrenuti i još jednom provjeriti njegov status.

sudo systemctl restart mysql
sudo systemctl status mysql

Nadalje, ako poslužitelj radi kao što je prikazano sljedećom naredbom, ali i dalje vidite gornju pogrešku, trebali biste također provjeriti je li TCP/IP port blokiran vatrozidom ili bilo kojom uslugom za blokiranje porta .

ps xa | grep mysqld | grep -v mysqld

Da biste pronašli port na kojem poslužitelj sluša, koristite naredbu netstat kao što je prikazano.

sudo netstat -tlpn | grep "mysql"

2. Ne mogu se spojiti na MySQL poslužitelj

Još jedna česta pogreška povezivanja je "(2003) Ne mogu se povezati s MySQL poslužiteljem na 'poslužitelju' (10061) ", što znači da je mrežna veza odbijena.

Ovdje započnite s provjerom radi li MySQL poslužitelj na sustavu kao što je prikazano gore. Također provjerite ima li poslužitelj omogućene mrežne veze i je li mrežni priključak koji koristite za povezivanje onaj koji je konfiguriran na poslužitelju.

Ostale uobičajene pogreške na koje ćete vjerojatno naići kada se pokušate spojiti na MySQL poslužitelj 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 pogreške ukazuju na to da poslužitelj možda radi, no vi se pokušavate spojiti pomoću TCP/IP porta, imenovane cijevi ili Unix socket datoteke koja se razlikuje od one koju poslužitelj sluša.

3. Pogreške odbijenog pristupa u MySQL-u

U MySQL, korisnički račun definiran je u smislu korisničkog imena i hosta klijenta ili hostova s kojih se korisnik može spojiti na poslužitelj. Osim toga, račun također može imati vjerodajnice za provjeru autentičnosti kao što je lozinka.

Iako postoji mnogo različitih uzroka pogreške "Pristup odbijen", jedan od uobičajenih uzroka povezan je s MySQL računima koje poslužitelj dopušta klijentskim programima da koriste prilikom povezivanja. Označava da korisničko ime navedeno u vezi nema privilegije za pristup bazi podataka.

MySQL omogućuje kreiranje računa koji korisnicima klijenta omogućuju povezivanje s poslužiteljem i pristup podacima kojima poslužitelj upravlja. U tom smislu, ako naiđete na pogrešku odbijenog pristupa, provjerite je li korisničkom računu dopušteno povezivanje s poslužiteljem putem klijentskog programa koji koristite, a možda i glavnog računala s kojeg dolazi veza .

Možete vidjeti koje privilegije određeni račun ima 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 udaljenu IP adresu pomoću sljedećih naredbi u MySQL ljusci.

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

Nadalje, pogreške odbijenog pristupa također mogu biti posljedica problema s povezivanjem na MySQL, pogledajte prethodno objašnjene pogreške.

4. Izgubljena veza s MySQL poslužiteljem

Možete naići na ovu pogrešku zbog jednog od sljedećih razloga: loša mrežna povezanost, prekid veze ili problem s BLOB vrijednostima koje su veće od max_allowed_packet. U slučaju problema s mrežnom vezom, provjerite imate li dobru mrežnu vezu, posebno ako pristupate udaljenom poslužitelju baze podataka.

Ako je problem s prekidom veze, osobito kada MySQL pokušava koristiti početnu vezu s poslužiteljem, povećajte vrijednost parametra connect_timeout . Ali u slučaju BLOB vrijednosti koje su veće od max_allowed_packet, trebate postaviti višu vrijednost za max_allowed_packet u vašem /etc /my.cnf konfiguracijsku datoteku u odjeljku [mysqld] ili [client] kao što je prikazano.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Ako konfiguracijska datoteka MySQL nije dostupna za vas, tada možete postaviti ovu vrijednost pomoću sljedeće naredbe 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 pogrešku “previše veza”, to znači da sve dostupne veze koriste drugi klijenti. Broj veza (zadano je 151) kontrolira sistemska varijabla max_connections; možete riješiti problem povećanjem njegove vrijednosti kako biste omogućili više veza u vašoj /etc/my.cnf konfiguracijskoj datoteci.

[mysqld]
max_connections=1000

6. Nedostatak memorije MySQL

U slučaju da pokrenete upit pomoću klijentskog programa MySQL i naiđete na dotičnu pogrešku, to znači da MySQL nema dovoljno memorije za pohranjivanje cijelog rezultata upita.

Prvi korak je provjeriti je li upit točan, ako jest, učinite sljedeće:

  • ako koristite MySQL klijent izravno, pokrenite ga s --quick switch, da onemogućite predmemorirane rezultate ili
  • ako koristite upravljački program MyODBC, konfiguracijsko korisničko sučelje (UI) ima naprednu karticu za oznake. Označite “Nemoj keširati rezultat“.

Još jedan izvrstan alat je MySQL Tuner – korisna skripta koja će se povezati s pokrenutim MySQL poslužiteljem i daje prijedloge kako se može konfigurirati za bolje 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 MySQL/MariaDB Performance Tuning and Optimization Tips.

7. MySQL se stalno ruši

Ako naiđete na ovaj problem, trebali biste pokušati otkriti je li problem u kvaru MySQL poslužitelja ili je problem u klijentu. Imajte na umu da mnoge padove poslužitelja uzrokuju oštećene podatkovne datoteke ili indeksne datoteke.

Možete provjeriti status poslužitelja kako biste utvrdili koliko dugo radi.

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 poslužitelja.

sudo mysqladmin version -p 

Ostala rješenja uključuju, ali nisu ograničena na zaustavljanje MySQL poslužitelja i omogućavanje otklanjanja pogrešaka, a zatim ponovno pokretanje usluge. Možete pokušati napraviti test 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 pokrećete druge upite:

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

Zaključak: Utvrđivanje što uzrokuje problem ili pogrešku

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

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

  1. Prvi i najvažniji korak je pregledati MySQL zapisnike koji su pohranjeni u direktoriju /var/log/mysql/. Možete koristiti pomoćne programe naredbenog retka kao što je tail za čitanje datoteka dnevnika.
  2. Ako se MySQL servis ne uspije pokrenuti, provjerite njegov status koristeći systemctl ili upotrijebite naredbu journetctl (s oznakom -xe) pod systemd da ispitate problem.
  3. Također možete provjeriti datoteku zapisnika sustava kao što je /var/log/messages ili slično da biste pronašli razloge za svoj problem.
  4. Pokušajte koristiti alate kao što su Mytop, glances, top, ps ili htop da provjerite koji program zauzima sav CPU ili zaključava stroj ili da provjerite ponestaje li vam memorije, prostora na disku, deskriptora datoteka ili nekog drugog važnog resursa .
  5. Pod pretpostavkom da je problem neki odbjegli proces, uvijek ga možete pokušati ubiti (koristeći pomoćni program pkill ili kill) tako da MySQL radi normalno.
  6. Pretpostavimo da mysqld poslužitelj uzrokuje probleme, možete pokrenuti naredbu: mysqladmin -u root ping ili mysqladmin -u root processlist da dobijete bilo koji odgovor od njega.
  7. Ako je problem u vašem klijentskom programu dok se pokušavate spojiti na MySQL poslužitelj, provjerite zašto ne radi dobro, pokušajte iz njega dobiti bilo kakav izlaz u svrhu rješavanja problema.

Također biste mogli pročitati sljedeće članke vezane uz MySQL:

  1. Naučite MySQL/MariaDB za početnike – 1. dio
  2. Kako nadzirati MySQL/MariaDB baze podataka koristeći Netdata na CentOS 7
  3. Kako prenijeti sve MySQL baze podataka sa starog na novi poslužitelj
  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, pogledajte MySQL referentni priručnik koji se odnosi na probleme i uobičajene pogreške, on iscrpno navodi uobičajene probleme i poruke o pogreškama na koje možete naići dok koristite MySQL, uključujući one o kojima smo raspravljali gore i više.