Hyödyllisiä vinkkejä yleisten virheiden vianmääritykseen MySQL: ssä


MySQL on laajalti käytetty Oraclen omistama avoimen lähdekoodin relaatiotietokantojen hallintajärjestelmä (RDMS). Se on vuosien varrella ollut oletusvalinta verkkopohjaisille sovelluksille ja on edelleen suosittu muihin tietokantamoottoreihin verrattuna.

MySQL on suunniteltu ja optimoitu verkkosovelluksia varten - se on olennainen osa suuria verkkopohjaisia sovelluksia, kuten Facebook, Twitter, Wikipedia, YouTube ja monet muut.

Onko sivustosi tai verkkosovelluksesi powered by MySQL? Tässä yksityiskohtaisessa artikkelissa kerromme, kuinka voit ratkaista MySQL-tietokantapalvelimen ongelmien ja yleisten virheiden vianmäärityksen. Kuvailemme, kuinka selvittää ongelmien syyt ja mitä tehdä niiden ratkaisemiseksi.

1. Ei voida muodostaa yhteyttä paikalliseen MySQL-palvelimeen

Yksi yleisimmistä asiakas-palvelin-yhteysvirheistä MySQL: ssä on\"ERROR 2002 (HY000): Ei voida muodostaa yhteyttä paikalliseen MySQL-palvelimeen pistorasian '/var/run/mysqld/mysqld.sock' '(2) kautta.

Tämä virhe osoittaa, että MySQL-palvelin (mysqld) ei ole käynnissä isäntäjärjestelmässä tai että olet määrittänyt väärän Unix-socket-tiedoston nimen tai TCP/IP-portin yrittäessäsi muodostaa yhteyttä palvelimeen.

Varmista, että palvelin on käynnissä tarkistamalla tietokantapalvelimen isännässä prosessi nimeltä mysqld käyttämällä grep-komentoa yhdessä kuvan osoittamalla tavalla.

$ ps xa | grep mysqld | grep -v mysqld

Jos yllä olevat komennot eivät näytä tulostetta, tietokantapalvelin ei ole käynnissä. Siksi asiakas ei voi muodostaa yhteyttä siihen. Käynnistä palvelin suorittamalla seuraava systemctl-komento.

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

Voit varmistaa MySQL-palvelun tilan seuraavalla komennolla.

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

Yllä olevan komennon tulosten perusteella MySQL-palvelu on epäonnistunut. Tällöin voit yrittää käynnistää sen uudelleen ja tarkistaa sen tilan vielä kerran.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Jos palvelin on käynnissä seuraavan komennon osoittamalla tavalla, mutta näet edelleen yllä olevan virheen, sinun on myös varmistettava, että palomuuri tai mikä tahansa porttien estopalvelu estää TCP/IP-portin.

$ ps xa | grep mysqld | grep -v mysqld

Netstat-komentoon kuvan osoittamalla tavalla.

$ sudo netstat -tlpn | grep "mysql"

2. Ei voi muodostaa yhteyttä MySQL-palvelimeen

Toinen yleisesti havaittu yhteysvirhe on\"(2003) Ei voi muodostaa yhteyttä MySQL-palvelimeen palvelimella (10061)", mikä tarkoittaa, että verkkoyhteys on evätty.

Aloita tarkistamalla, että järjestelmässä on MySQL-palvelin, kuten yllä on esitetty. Varmista myös, että palvelimella on verkkoyhteydet käytössä ja että yhteyden muodostamiseen käytettävä verkkoportti on palvelimelle määritetty.

Muita yleisiä virheitä, joita todennäköisesti kohtaat yrittäessäsi muodostaa yhteyttä MySQL-palvelimeen, ovat:

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)

Nämä virheet osoittavat, että palvelin saattaa olla käynnissä, mutta yrität muodostaa yhteyden käyttämällä TCP/IP-porttia, nimeltään pipe tai Unix-pistorasiatiedostoa, joka on erilainen kuin se, jota palvelin kuuntelee.

3. Pääsy estettyihin virheisiin MySQL: ssä

MySQL: ssä käyttäjätili määritetään käyttäjänimen ja asiakaspalvelimen tai isäntien perusteella, joista käyttäjä voi muodostaa yhteyden palvelimeen. Lisäksi tilillä voi olla myös todennustiedot, kuten salasana.

Vaikka\"Pääsy estetty" -virheisiin on monia eri syitä, yksi yleisimmistä syistä liittyy MySQL-tileihin, joita palvelin sallii asiakasohjelmien käyttää muodostaessaan yhteyden. Se osoittaa, että yhteydessä määritetyllä käyttäjänimellä ei ole käyttöoikeuksia tietokantaan.

MySQL mahdollistaa sellaisten tilien luomisen, joiden avulla asiakkaan käyttäjät voivat muodostaa yhteyden palvelimeen ja käyttää palvelimen hallinnoimia tietoja. Tältä osin, jos kohtaat pääsyn estämisen virheen, tarkista, onko käyttäjätilillä oikeus muodostaa yhteys palvelimeen käyttämäsi asiakasohjelman ja mahdollisesti isännän kautta, josta yhteys tulee.

Voit nähdä, mitkä tietyn tilin käyttöoikeudet suoritetaan suorittamalla NÄYTÄ GRANTIT -komento kuvan mukaisesti.

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

Voit myöntää etuoikeuksia tietylle tietyn tietokannan käyttäjälle etä-ip-osoitteeseen seuraavien komentojen avulla MySQL-kuoressa.

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

Lisäksi pääsyn estetyt virheet voivat johtua myös ongelmista yhdistettäessä MySQL: ään, katso aiemmin selitetyt virheet.

4. Yhteys katkesi MySQL-palvelimeen

Saatat kohdata tämän virheen jostakin seuraavista syistä: heikko verkkoyhteys, yhteyden aikakatkaisu tai ongelma BLOB-arvoissa, jotka ovat suurempia kuin max_allowed_packet. Verkkoyhteysongelman sattuessa varmista, että sinulla on hyvä verkkoyhteys, varsinkin jos käytät etätietokantapalvelinta.

Jos kyseessä on yhteyden aikakatkaisuongelma, varsinkin kun MySQL yrittää käyttää alustavaa yhteyttä palvelimeen, lisää parametrin connect_timeout arvoa. Mutta jos BLOB-arvot ovat suurempia kuin max_allowed_packet, sinun on asetettava suurempi arvo max_allowed_packet -asetukselle /etc/my.cnf -asetustiedostossa kohdassa [mysqld] tai [client] -osio kuvan mukaisesti.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Jos MySQL-määritystiedosto ei ole käytettävissäsi, voit asettaa tämän arvon käyttämällä seuraavaa komentoa MySQL-kuoressa.

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

5. Liian monta MySQL-yhteyttä

Jos MySQL-asiakas havaitsee\"liian monta yhteyttä" -virheen, se tarkoittaa, että kaikki asiakkaat käyttävät kaikkia käytettävissä olevia yhteyksiä. Yhteyksien määrää (oletus on 151) ohjaa järjestelmä max_connections muuttuja; voit korjata ongelman lisäämällä sen arvoa sallimaan lisää yhteyksiä /etc/my.cnf -määritystiedostossa.

[mysqld]
max_connections=1000

6. Muisti loppunut MySQL

Jos suoritat kyselyn MySQL-asiakasohjelmalla ja kohtaat kyseessä olevan virheen, se tarkoittaa, että MySQL: llä ei ole tarpeeksi muistia koko kyselytuloksen tallentamiseen.

Ensimmäinen askel on varmistaa, että kysely on oikea, jos se on oikein, toimi seuraavasti:

  • jos käytät MySQL-asiakasta suoraan, aloita se valitsemalla --quick switch , poistaaksesi välimuistissa olevat tulokset tai
  • jos käytät MyODBC-ohjainta, määrityskäyttöliittymässä (UI) on edistynyt välilehti lippuja varten. Valitse Älä tallenna välimuistitulosta.

Toinen hieno työkalu on MySQL Tuner - hyödyllinen komentosarja, joka muodostaa yhteyden käynnissä olevaan MySQL-palvelimeen ja antaa ehdotuksia siitä, miten se voidaan määrittää korkeamman suorituskyvyn saavuttamiseksi.

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

Lue MySQL-optimointi- ja suorituskyvyn säätövinkkejä artikkelistamme: 15 hyödyllistä MySQL/MariaDB-suorituskyvyn viritys- ja optimointivinkkiä.

7. MySQL pitää kaatumisen

Jos kohtaat tämän ongelman, sinun on yritettävä selvittää, onko ongelma, että MySQL-palvelin kuolee, vai onko asiakkaalla ongelma. Huomaa, että monet palvelinten kaatumiset johtuvat vioittuneista datatiedostoista tai hakemistotiedostoista.

Voit tarkistaa palvelimen tilan ja selvittää, kuinka kauan se on ollut toiminnassa.

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

Vaihtoehtoisesti voit suorittaa seuraavan mysqladmin-komennon löytääksesi MySQL-palvelimen käyttöajan.

$ sudo mysqladmin version -p 

Muita ratkaisuja ovat muun muassa MySQL-palvelimen pysäyttäminen ja virheenkorjauksen mahdollistaminen, ja käynnistä palvelu sitten uudelleen. Voit yrittää tehdä testitapauksen, jota voidaan käyttää ongelman toistamiseen. Lisäksi avaa ylimääräinen pääteikkuna ja suorita seuraava komento näyttääksesi MySQL-prosessitilastot, kun suoritat muita kyselyitäsi:

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

Vaikka olemme tarkastelleet joitain yleisiä MySQL-ongelmia ja virheitä sekä tarjonneet tapoja vianmääritykseen ja ratkaisemiseen, tärkein asia virheen diagnosoinnissa on sen ymmärtäminen (mitä se aiheuttaa).

Joten miten voit selvittää tämän? Seuraavat kohdat auttavat sinua selvittämään, mikä aiheuttaa ongelman:

  1. Ensimmäinen ja tärkein vaihe on tutkia MySQL-lokeja, jotka on tallennettu hakemistoon /var/log/mysql/. Voit lukea lokitiedostot komentorivin apuohjelmien, kuten tail, avulla.
  2. Jos MySQL-palvelu ei käynnisty, tarkista sen tila systemctl: n avulla tai tarkista ongelma käyttämällä systemd-komentoa journetctl ( -xe -merkinnällä).
  3. Voit myös tutkia järjestelmän lokitiedostoa, kuten /var/log/messages tai vastaavaa ongelman syistä.
  4. Kokeile esimerkiksi htopin kaltaisia työkaluja tarkistaaksesi, mikä ohjelma vie kaikki suorittimet tai lukitsee koneen, tai tarkista, onko muistisi, levytila, tiedostojen kuvaajat vai jokin muu tärkeä resurssi loppumassa.
  5. Olettaen, että ongelma on jokin pakeneva prosessi, voit aina yrittää tappaa sen (pkill tai kill -apuohjelman avulla), jotta MySQL toimii normaalisti.
  6. Oletetaan, että mysqld-palvelin aiheuttaa ongelmia, voit suorittaa komennon: mysqladmin -u root ping tai mysqladmin -u root processlist saadaksesi vastauksen siihen.
  7. Jos ongelma liittyy asiakasohjelmaasi yrittäessäsi muodostaa yhteyttä MySQL-palvelimeen, tarkista miksi se ei toimi kunnolla, yritä saada siitä mitään vianmääritystarkoituksia varten.

Haluat ehkä myös lukea nämä seuraavat MySQL-artikkelit:

  1. Opi MySQL/MariaDB aloittelijoille - osa 1
  2. Kuinka seurata MySQL/MariaDB-tietokantoja Netdatan avulla CentOS 7: ssä
  3. Kaikkien MySQL-tietokantojen siirtäminen vanhasta palvelimeen
  4. Mytop - hyödyllinen työkalu MySQL/MariaDB-suorituskyvyn seuraamiseen Linuxissa
  5. 12 MySQL/MariaDB-tietoturvan parhaita käytäntöjä Linuxille

Lisätietoja on MySQL-käyttöoppaassa ongelmista ja yleisistä virheistä. Siinä luetellaan kattavasti yleiset ongelmat ja virheilmoitukset, joita saatat kohdata MySQL: n käytön aikana, mukaan lukien ne, joista olemme keskustelleet edellä ja enemmän.