Nyttige tips for å feilsøke vanlige feil i MySQL


MySQL er et mye brukt åpen kildekode relasjonsdatabasehåndteringssystem (RDMS) eid av Oracle. Det har gjennom årene vært standardvalget for nettbaserte applikasjoner og er fortsatt populært sammenlignet med andre databasemotorer.

MySQL ble designet og optimalisert for nettapplikasjoner – det utgjør en integrert del av store nettbaserte applikasjoner som Facebook, Twitter, Wikipedia, YouTube og mange andre.

Er nettstedet eller nettapplikasjonen din drevet av MySQL? I denne detaljerte artikkelen vil vi forklare hvordan du feilsøker problemer og vanlige feil i MySQL-databaseserveren. Vi vil beskrive hvordan man kan finne årsakene til problemene og hva man skal gjøre for å løse dem.

1. Kan ikke koble til lokal MySQL-server

En av de vanlige klient-til-server-tilkoblingsfeilene i MySQL er \FEIL 2002 (HY000): Kan ikke koble til lokal MySQL-server gjennom socket '/var/run/mysqld/mysqld.sock' (2).

Denne feilen indikerer at det ikke er noen MySQL-server (mysqld) som kjører på vertssystemet eller at du har spesifisert feil Unix-socket-filnavn eller TCP/IP-port når du prøver å koble til serveren.

Sørg for at serveren kjører ved å sjekke en prosess kalt mysqld på databaseserververten ved å bruke grep-kommandoen sammen som vist.

$ ps xa | grep mysqld | grep -v mysqld

Hvis kommandoene ovenfor ikke viser utdata, kjører ikke databaseserveren. Derfor kan ikke klienten koble seg til den. For å starte serveren, kjør følgende systemctl-kommando.

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

For å bekrefte MySQL-tjenestestatusen, bruk følgende kommando.

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

Fra utdataene fra kommandoen ovenfor har MySQL-tjenesten mislyktes. I slike tilfeller kan du prøve å starte den på nytt og sjekke statusen en gang til.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

I tillegg, hvis serveren kjører som vist av følgende kommando, men du fortsatt ser feilen ovenfor, bør du også bekrefte at TCP/IP-porten er blokkert av en brannmur eller en hvilken som helst portblokkeringstjeneste.

$ ps xa | grep mysqld | grep -v mysqld

Til netstat-kommando som vist.

$ sudo netstat -tlpn | grep "mysql"

2. Kan ikke koble til MySQL Server

En annen vanlig tilkoblingsfeil er (2003) Kan ikke koble til MySQL-server på 'server' (10061), som betyr at nettverkstilkoblingen har blitt nektet.

Her starter du med å sjekke at det er en MySQL-server som kjører på systemet som vist ovenfor. Sørg også for at serveren har nettverkstilkoblinger aktivert og at nettverksporten du bruker for å koble til er den som er konfigurert på serveren.

Andre vanlige feil du sannsynligvis vil støte på når du prøver å koble til MySQL-serveren er:

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)

Disse feilene indikerer at serveren kan kjøre, men du prøver å koble til ved hjelp av en TCP/IP-port, navngitt pipe eller Unix-socket-fil som er forskjellig fra den serveren lytter til.

3. Tilgang nektet feil i MySQL

I MySQL er en brukerkonto definert i form av et brukernavn og klientverten eller -vertene som brukeren kan koble til serveren fra. I tillegg kan en konto også ha autentiseringslegitimasjon som et passord.

Selv om det er mange forskjellige årsaker til «Access denied»-feil, er en av de vanlige årsakene knyttet til MySQL-kontoene som serveren tillater klientprogrammer å bruke ved tilkobling. Det indikerer at brukernavnet som er spesifisert i tilkoblingen ikke har tilgangsprivilegier databasen.

MySQL tillater opprettelse av kontoer som gjør det mulig for klientbrukere å koble seg til serveren og få tilgang til data som administreres av serveren. I denne forbindelse, hvis du støter på en tilgang nektet-feil, sjekk om brukerkontoen har lov til å koble til serveren via klientprogrammet du bruker, og muligens verten som tilkoblingen kommer fra.

Du kan se hvilke privilegier en gitt konto har ved å kjøre kommandoen SHOW GRANTS som vist.

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

Du kan gi privilegier til en bestemt bruker på en spesifikk database til den eksterne ip-adressen ved å bruke følgende kommandoer i MySQL-skallet.

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

Videre kan tilgang nektet feil også skyldes problemer med å koble til MySQL, se de tidligere forklarte feilene.

4. Mistet forbindelsen til MySQL Server

Du kan støte på denne feilen på grunn av en av følgende årsaker: dårlig nettverkstilkobling, tidsavbrudd for tilkobling eller et problem med BLOB-verdier som er større enn max_allowed_packet. I tilfelle et nettverkstilkoblingsproblem, sørg for at du har en god nettverkstilkobling, spesielt hvis du har tilgang til en ekstern databaseserver.

Hvis det er et tidsavbruddsproblem for tilkoblingen, spesielt når MySQL prøver å bruke en første tilkobling til serveren, øker du verdien til parameteren connect_timeout. Men i tilfelle BLOB-verdier som er større enn max_allowed_packet, må du angi en høyere verdi for max_allowed_packet i /etc/my.cnf-konfigurasjonsfilen din under [mysqld] eller [klient] -delen som vist.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Hvis MySQL-konfigurasjonsfilen ikke er tilgjengelig for deg, kan du angi denne verdien ved å bruke følgende kommando i MySQL-skallet.

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

5. For mange MySQL-tilkoblinger

I tilfelle en MySQL-klient støter på feilen \for mange tilkoblinger, betyr det at alle tilgjengelige tilkoblinger er i bruk av andre klienter. Antall tilkoblinger (standard er 151) kontrolleres av max_connections-systemet variabel; du kan løse problemet ved å øke verdien for å tillate flere tilkoblinger i /etc/my.cnf-konfigurasjonsfilen.

[mysqld]
max_connections=1000

6. Tomt minne MySQL

I tilfelle du kjører en spørring ved hjelp av MySQL-klientprogrammet og støter på den aktuelle feilen, betyr det at MySQL ikke har nok minne til å lagre hele spørringsresultatet.

Det første trinnet er å sikre at søket er riktig, hvis det er det, gjør du følgende:

  • hvis du bruker MySQL-klienten direkte, start den med --quick switch, for å deaktivere bufrede resultater eller
  • hvis du bruker MyODBC-driveren, har konfigurasjonsbrukergrensesnittet (UI) en avansert fane for flagg. Kryss av for «Ikke bufre resultat».

Et annet flott verktøy er MySQL Tuner – et nyttig skript som kobles til en kjørende MySQL-server og gir forslag til hvordan den kan konfigureres for høyere ytelse.

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

For tips om MySQL-optimalisering og ytelsesjustering, les artikkelen vår: 15 nyttige tips for MySQL/MariaDB ytelsesjustering og -optimalisering.

7. MySQL krasjer stadig

Hvis du støter på dette problemet, bør du prøve å finne ut om problemet er at MySQL-serveren dør eller om det er klienten som har et problem. Merk at mange serverkrasj er forårsaket av ødelagte datafiler eller indeksfiler.

Du kan sjekke serverstatusen for å fastslå hvor lenge den har vært oppe og kjørt.

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

Alternativt kan du kjøre følgende mysqladmin-kommando for å finne oppetiden til MySQL-serveren.

$ sudo mysqladmin version -p 

Andre løsninger inkluderer, men ikke begrenset til, å stoppe MySQL-serveren og aktivere feilsøking, og deretter starte tjenesten på nytt. Du kan prøve å lage en testcase som kan brukes til å gjenta problemet. I tillegg åpner du et ekstra terminalvindu og kjør følgende kommando for å vise MySQL-prosessstatistikk mens du kjører de andre spørringene dine:

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

Selv om vi har sett på noen vanlige MySQL-problemer og feil og også gitt måter å feilsøke og løse dem på, er det viktigste med å diagnostisere en feil å forstå hva den betyr (med tanke på hva som forårsaker den).

Så hvordan kan du bestemme dette? Følgende punkter vil veilede deg om hvordan du finner ut hva som nøyaktig forårsaker et problem:

  1. Det første og viktigste trinnet er å se på MySQL-loggene som er lagret i katalogen /var/log/mysql/. Du kan bruke kommandolinjeverktøy som tail for å lese gjennom loggfilene.
  2. Hvis MySQL-tjenesten ikke starter, sjekk statusen ved hjelp av systemctl eller bruk journetctl-kommandoen (med -xe-flagget) under systemd for å undersøke problemet.
  3. Du kan også undersøke systemloggfilen som /var/log/messages eller lignende for årsaker til problemet ditt.
  4. Prøv å bruke verktøy som htop for å sjekke hvilket program som tar all CPU eller låser maskinen eller for å inspisere om du går tom for minne, diskplass, filbeskrivelser eller en annen viktig ressurs.
  5. Forutsatt at problemet er en løpsk prosess, kan du alltid prøve å drepe det (ved å bruke pkill eller kill-verktøyet) slik at MySQL fungerer normalt.
  6. Forutsatt at mysqld-serveren forårsaker problemer, kan du kjøre kommandoen: mysqladmin -u root ping eller mysqladmin -u root processlist for å få svar fra den.
  7. Hvis problemet er med klientprogrammet ditt mens du prøver å koble til MySQL-serveren, sjekk hvorfor det ikke fungerer bra, prøv å få utdata fra det for feilsøkingsformål.

Du vil kanskje også lese disse følgende MySQL-relaterte artiklene:

  1. Lær MySQL/MariaDB for nybegynnere – del 1
  2. Hvordan overvåke MySQL/MariaDB-databaser ved hjelp av Netdata på CentOS 7
  3. Hvordan overføre alle MySQL-databaser fra gammel til ny server
  4. Mytop – Et nyttig verktøy for å overvåke MySQL/MariaDB-ytelse i Linux
  5. 12 MySQL/MariaDB-sikkerhetsbestemmelser for Linux

For mer informasjon, se MySQL-referansehåndboken angående problemer og vanlige feil, den viser en omfattende liste over vanlige problemer og feilmeldinger som du kan støte på mens du bruker MySQL, inkludert de vi har diskutert ovenfor og mer.