sql >> Databasteknik >  >> RDS >> Mysql

Användbara tips för att felsöka vanliga fel i MySQL

MySQL är ett allmänt använt hanteringssystem för relationsdatabas med öppen källkod (RDMS ) som ägs av Oracle . Det har under åren varit standardvalet för webbaserade applikationer och är fortfarande populärt i jämförelse med andra databasmotorer.

MySQL designades och optimerades för webbapplikationer – den utgör en integrerad del av stora webbaserade applikationer som Facebook , Twitter , Wikipedia , YouTube , och många andra.

Drivs din webbplats eller webbapplikation av MySQL ? I den här detaljerade artikeln kommer vi att förklara hur du felsöker problem och vanliga fel i MySQL databasserver. Vi kommer att beskriva hur man bestämmer orsakerna till problemen och vad man ska göra för att lösa dem.

1. Kan inte ansluta till lokal MySQL-server

Ett av de vanligaste klient-till-server-anslutningsfelen i MySQL är "ERROR 2002 (HY000):Kan inte ansluta till lokal MySQL-server via socket '/var/run/mysqld/mysqld.sock' (2) ”.

Det här felet indikerar att det inte finns någon MySQL server (mysqld) körs på värdsystemet eller att du har angett fel Unix-socket-filnamn eller TCP/IP port när du försöker ansluta till servern.

Se till att servern körs genom att kontrollera en process som heter mysqld på din databasservervärd genom att använda kommandot ps och grep tillsammans som visas.

$ ps xa | grep mysqld | grep -v mysqld

Om kommandona ovan inte visar någon utdata, körs inte databasservern. Därför kan klienten inte ansluta till den. För att starta servern, kör följande systemctl-kommando.

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

För att verifiera MySQL tjänststatus, använd följande kommando.

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

Från utgången av kommandot ovan, MySQL tjänsten har misslyckats. I så fall kan du försöka starta om den och kontrollera dess status en gång till.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Dessutom, om servern körs som visas av följande kommando, men du fortfarande ser ovanstående fel, bör du också verifiera att TCP/IP porten blockeras av en brandvägg eller någon portblockerande tjänst.

$ ps xa | grep mysqld | grep -v mysqld

För att hitta porten som servern lyssnar på, använd kommandot netstat som visas.

$ sudo netstat -tlpn | grep "mysql"

2. Kan inte ansluta till MySQL Server

Ett annat vanligt förekommande anslutningsfel är "(2003) Kan inte ansluta till MySQL-server på 'server' (10061) ”, vilket betyder att nätverksanslutningen har nekats.

Börja här med att kontrollera att det finns en MySQL server som körs på systemet som visas ovan. Se också till att servern har nätverksanslutningar aktiverade och att nätverksporten du använder för att ansluta är den som är konfigurerad på servern.

Andra vanliga fel som du sannolikt kommer att stöta på när du försöker ansluta till MySQL-servern är:

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)

Dessa fel indikerar att servern kan vara igång, men du försöker ansluta med en TCP/IP port, namngiven pipe eller Unix-socket-fil som skiljer sig från den som servern lyssnar på.

3. Åtkomst nekad fel i MySQL

I MySQL , ett användarkonto definieras i termer av ett användarnamn och klientvärden eller -värdarna från vilka användaren kan ansluta till servern. Dessutom kan ett konto också ha autentiseringsuppgifter som ett lösenord.

Även om det finns många olika orsaker till "Åtkomst nekad ”-fel, är en av de vanligaste orsakerna relaterad till MySQL-kontona som servern tillåter klientprogram att använda vid anslutning. Det indikerar att användarnamn som anges i anslutningen har inte behörighet att komma åt databasen.

MySQL tillåter skapandet av konton som gör det möjligt för klientanvändare att ansluta till servern och komma åt data som hanteras av servern. I detta avseende, om du stöter på ett åtkomst nekad fel , kontrollera om användarkontot har tillåtelse att ansluta till servern via klientprogrammet du använder, och eventuellt värden som anslutningen kommer ifrån.

Du kan se vilka privilegier ett visst konto har genom att köra SHOW GRANTS kommando som visas.

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

Du kan ge privilegier till en viss användare på en specifik databas till fjärr-ip-adressen med hjälp av följande kommandon i MySQL-skalet.

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

Dessutom åtkomst nekad fel kan också bero på problem med att ansluta till MySQL, se de tidigare förklarade felen.

4. Förlorad anslutning till MySQL Server

Du kan stöta på det här felet på grund av en av följande orsaker:dålig nätverksanslutning , timeout för anslutning eller ett problem med BLOB värden som är större än max_allowed_packet . Om du har problem med nätverksanslutningen, se till att du har en bra nätverksanslutning, särskilt om du använder en fjärrdatabasserver.

Om det är en timeout för anslutningen problem, särskilt när MySQL försöker använda en första anslutning till servern, öka värdet på connect_timeout parameter. Men vid BLOB-värden som är större än max_allowed_packet måste du ställa in ett högre värde för max_allowed_packet i din /etc/my.cnf konfigurationsfil under [mysqld] eller [client] avsnitt som visas.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Om MySQL konfigurationsfilen inte är tillgänglig för dig, då kan du ställa in detta värde med följande kommando i MySQL-skalet.

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

5. För många MySQL-anslutningar

Om en MySQL klienten stöter på "för många anslutningar ”-fel betyder det att alla tillgängliga anslutningar används av andra klienter. Antalet anslutningar (standard är 151). ) styrs av max_connections systemvariabel; du kan åtgärda problemet genom att öka dess värde för att tillåta fler anslutningar i din /etc/my.cnf konfigurationsfil.

[mysqld]
max_connections=1000

6. Minnet är slut MySQL

Om du kör en fråga med MySQL klientprogram och stöter på felet i fråga, betyder det att MySQL inte har tillräckligt med minne för att lagra hela frågeresultatet.

Det första steget är att se till att frågan är korrekt, om den är det, gör sedan följande:

  • om du använder MySQL-klienten direkt, starta den med --quick switch , för att inaktivera cachade resultat eller
  • om du använder MyODBC drivrutinen, konfigureringsanvändargränssnittet (UI) har en avancerad flik för flaggor. Markera "Cachelagra inte resultatet ".

Ett annat bra verktyg är MySQL Tuner – ett användbart skript som ansluter till en körande MySQL-server och ger förslag på hur den kan konfigureras för högre prestanda.

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

För tips om MySQL-optimering och prestandajustering, läs vår artikel:15 användbara tips för MySQL/MariaDB-prestandajustering och optimering.

7. MySQL fortsätter att krascha

Om du stöter på det här problemet bör du försöka ta reda på om problemet är att MySQL servern dör eller om det är klienten med ett problem. Observera att många serverkrascher orsakas av skadade datafiler eller indexfiler.

Du kan kontrollera serverstatusen för att fastställa hur länge den har varit igång.

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

Alternativt, kör följande mysqladmin-kommando för att hitta upptid för MySQL-servern.

$ sudo mysqladmin version -p 

Andra lösningar inkluderar men inte begränsat till att stoppa MySQL server och aktiverar felsökning, starta sedan tjänsten igen. Du kan försöka göra ett testfall som kan användas för att upprepa problemet. Öppna dessutom ett extra terminalfönster och kör följande kommando för att visa MySQL-processtatistik medan du kör dina andra frågor:

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

Slutet:Avgöra vad som orsakar ett problem eller ett fel

Även om vi har tittat på några vanliga MySQL problem och fel och även tillhandahållit sätt att felsöka och lösa dem, det viktigaste med att diagnostisera ett fel är att förstå vad det betyder (i termer av vad som orsakar det).

Så hur kan du avgöra detta? Följande punkter hjälper dig att ta reda på vad som exakt orsakar ett problem:

  1. Det första och viktigaste steget är att titta på MySQL-loggarna som finns lagrade i katalogen /var/log/mysql/ . Du kan använda kommandoradsverktyg som tail för att läsa igenom loggfilerna.
  2. Om MySQL-tjänsten inte startar, kontrollera dess status med systemctl eller använd journetctl (med -xe flagga) kommandot under systemd för att undersöka problemet.
  3. Du kan också granska systemloggfilen som /var/log/messages eller liknande av anledningar till ditt problem.
  4. Försök att använda verktyg som Mytop, glances, top, ps eller htop för att kontrollera vilket program som tar all CPU eller låser maskinen eller för att kontrollera om du får ont om minne, diskutrymme, filbeskrivningar eller några annan viktig resurs.
  5. Förutsatt att problemet är en skenande process kan du alltid försöka döda det (med hjälp av verktyget pkill eller kill) så att MySQL fungerar normalt.
  6. Anta att mysqld servern orsakar problem kan du köra kommandot:mysqladmin -u root ping eller mysqladmin -u root processlist för att få något svar från den.
  7. Om problemet är med ditt klientprogram när du försöker ansluta till MySQL-servern, kontrollera varför det inte fungerar bra, försök att få någon utdata från det för felsökningsändamål.

Du kanske också vill läsa följande MySQL-relaterade artiklar:

  1. Lär dig MySQL / MariaDB för nybörjare – del 1
  2. Hur man övervakar MySQL/MariaDB-databaser med Netdata på CentOS 7
  3. Hur man överför alla MySQL-databaser från gammal till ny server
  4. Mytop – Ett användbart verktyg för att övervaka MySQL/MariaDB-prestanda i Linux
  5. 12 MySQL/MariaDB säkerhetsmetoder för Linux

För mer information, se MySQL-referensmanualen om problem och vanliga fel, den listar utförligt vanliga problem och felmeddelanden som du kan stöta på när du använder MySQL, inklusive de vi har diskuterat ovan och mer.


  1. Prestandatestmetoder:Upptäcka ett nytt sätt

  2. Hur man får en lista över datum mellan två datum i mysql select query

  3. Ansluter till SQL Server 2012 med sqlalchemy och pyodbc

  4. PERIOD_DIFF() Exempel – MySQL