Handige tips om veelvoorkomende fouten in MySQL op te lossen


MySQL is een veelgebruikt open source relationeel databasebeheersysteem (RDMS) dat eigendom is van Oracle. Het is door de jaren heen de standaardkeuze geweest voor webgebaseerde applicaties en blijft nog steeds populair in vergelijking met andere database-engines.

MySQL is ontworpen en geoptimaliseerd voor webapplicaties - het vormt een integraal onderdeel van grote webgebaseerde applicaties zoals Facebook, Twitter, Wikipedia, YouTube en vele anderen.

Wordt uw site of webapplicatie aangedreven door MySQL? In dit gedetailleerde artikel leggen we uit hoe u problemen en veelvoorkomende fouten in de MySQL-databaseserver oplost. We zullen beschrijven hoe u de oorzaken van de problemen kunt achterhalen en wat u kunt doen om ze op te lossen.

1. Kan geen verbinding maken met lokale MySQL-server

Een van de meest voorkomende verbindingsfouten tussen client en server in MySQL is "ERROR 2002 (HY000): Kan geen verbinding maken met de lokale MySQL-server via socket‘ /var/run/mysqld/mysqld.sock ’(2)”.

Deze fout geeft aan dat er geen MySQL-server (mysqld) actief is op het hostsysteem of dat u een verkeerde Unix-socketbestandsnaam of TCP/IP-poort hebt opgegeven wanneer u probeert verbinding te maken met de server.

Zorg ervoor dat de server draait door een proces met de naam mysqld op de host van uw databaseserver te controleren door de opdracht ps en grep samen te gebruiken, zoals weergegeven.

$ ps xa | grep mysqld | grep -v mysqld

Als de bovenstaande opdrachten geen uitvoer laten zien, is de databaseserver niet actief. Daarom kan de klant er geen verbinding mee maken. Voer de volgende systemctl-opdracht uit om de server te starten.

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

Gebruik de volgende opdracht om de MySQL-servicestatus te controleren.

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

Van de uitvoer van het bovenstaande commando is de MySQL-service mislukt. In dat geval kunt u proberen het apparaat opnieuw op te starten en de status nogmaals te controleren.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Als de server draait zoals aangegeven door de volgende opdracht, maar u nog steeds de bovenstaande fout ziet, moet u ook controleren of de TCP/IP-poort wordt geblokkeerd door een firewall of een andere poortblokkerende service.

$ ps xa | grep mysqld | grep -v mysqld

Om de poort te vinden waar de server naar luistert, gebruik je het netstat commando zoals getoond.

$ sudo netstat -tlpn | grep "mysql"

2. Kan geen verbinding maken met MySQL Server

Een andere veel voorkomende verbindingsfout is "(2003) Can't connect to MySQL server on‘ server ’(10061)", wat betekent dat de netwerkverbinding is geweigerd.

Begin hier door te controleren of er een MySQL-server op het systeem draait, zoals hierboven weergegeven. Zorg er ook voor dat de server netwerkverbindingen heeft ingeschakeld en dat de netwerkpoort die u gebruikt om verbinding te maken, de poort is die op de server is geconfigureerd.

Andere veelvoorkomende fouten die u waarschijnlijk zult tegenkomen wanneer u probeert verbinding te maken met de MySQL-server zijn:

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)

Deze fouten geven aan dat de server mogelijk actief is, maar u probeert verbinding te maken via een TCP/IP-poort, genaamd pipe of Unix-socketbestand dat verschilt van het bestand waarop de server luistert.

3. Toegang geweigerde fouten in MySQL

In MySQL wordt een gebruikersaccount gedefinieerd in termen van een gebruikersnaam en de clienthost of -hosts van waaruit de gebruiker verbinding kan maken met de server. Bovendien kan een account ook authenticatiegegevens hebben, zoals een wachtwoord.

Hoewel er veel verschillende oorzaken zijn van "Toegang geweigerd" -fouten, heeft een van de meest voorkomende oorzaken betrekking op de MySQL-accounts die de server toestaat dat clientprogramma's gebruiken wanneer ze verbinding maken. Het geeft aan dat de gebruikersnaam die in de verbinding is opgegeven, geen rechten heeft om toegang te krijgen tot de database.

MySQL maakt het mogelijk om accounts aan te maken waarmee clientgebruikers verbinding kunnen maken met de server en toegang kunnen krijgen tot gegevens die door de server worden beheerd. Als u in dit verband een foutmelding krijgt dat de toegang geweigerd is, controleer dan of het gebruikersaccount toestemming heeft om verbinding te maken met de server via het clientprogramma dat u gebruikt, en mogelijk de host waarvan de verbinding afkomstig is.

U kunt zien welke privileges een bepaald account heeft door het commando SHOW GRANTS uit te voeren, zoals weergegeven.

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

U kunt privileges toekennen aan een bepaalde gebruiker op een specifieke database aan het externe IP-adres met behulp van de volgende opdrachten in de MySQL-shell.

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

Bovendien kunnen fouten met toegang geweigerd ook het gevolg zijn van problemen bij het verbinden met MySQL, zie de eerder toegelichte fouten.

4. Verbinding met MySQL Server verbroken

U kunt deze fout tegenkomen vanwege een van de volgende redenen: slechte netwerkverbinding, time-out van de verbinding of een probleem met BLOB-waarden die groter zijn dan max_allowed_packet. Zorg er bij een netwerkverbindingsprobleem voor dat u een goede netwerkverbinding hebt, vooral als u verbinding maakt met een externe databaseserver.

Als het een probleem is met de time-out van de verbinding, met name wanneer MySQL een initiële verbinding met de server probeert te gebruiken, verhoog dan de waarde van de parameter connect_timeout. Maar in het geval van BLOB-waarden die groter zijn dan max_allowed_packet, moet je een hogere waarde instellen voor het max_allowed_packet in je /etc/my.cnf configuratiebestand onder [mysqld] of [client] sectie zoals weergegeven.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Als het MySQL-configuratiebestand niet voor u toegankelijk is, kunt u deze waarde instellen met het volgende commando in de MySQL-shell.

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

5. Te veel MySQL-verbindingen

In het geval dat een MySQL-client de fout "te veel verbindingen" tegenkomt, betekent dit dat alle beschikbare verbindingen in gebruik zijn door andere clients. Het aantal verbindingen (standaard is 151) wordt bepaald door de systeemvariabele max_connections ; u kunt het probleem verhelpen door de waarde ervan te verhogen om meer verbindingen toe te staan u200bu200bin uw /etc/my.cnf configuratiebestand.

[mysqld]
max_connections=1000

6. Geen geheugen MySQL

Als u een query uitvoert met behulp van het MySQL-clientprogramma en de fout in kwestie tegenkomt, betekent dit dat MySQL niet genoeg geheugen heeft om het volledige queryresultaat op te slaan.

De eerste stap is om ervoor te zorgen dat de vraag correct is, als dit het geval is, doe dan het volgende:

  • if you are using MySQL client directly, start it with --quick switch, to disable cached results or
  • if you are using the MyODBC driver, the configuration user interface (UI) has an advanced tab for flags. Check “Do not cache result“.

Een andere geweldige tool is MySQL Tuner - een handig script dat verbinding maakt met een actieve MySQL-server en suggesties geeft voor hoe het kan worden geconfigureerd voor betere prestaties.

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

Lees ons artikel voor MySQL-optimalisatie en tips voor het afstemmen van prestaties: 15 nuttige MySQL/MariaDB-tips voor het afstemmen en optimaliseren van prestaties.

7. MySQL blijft crashen

Als u dit probleem tegenkomt, moet u proberen uit te zoeken of het probleem is dat de MySQL-server doodgaat of dat het de client is met een probleem. Merk op dat veel servercrashes worden veroorzaakt door beschadigde gegevensbestanden of indexbestanden.

U kunt de serverstatus controleren om vast te stellen hoe lang deze actief is.

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

U kunt ook de volgende opdracht mysqladmin uitvoeren om de uptime van de MySQL-server te vinden.

$ sudo mysqladmin version -p 

Andere oplossingen omvatten maar zijn niet beperkt tot het stoppen van de MySQL-server en het inschakelen van foutopsporing, en vervolgens de service opnieuw starten. U kunt proberen een testcase te maken waarmee u het probleem kunt herhalen. Open bovendien een extra terminalvenster en voer de volgende opdracht uit om MySQL-processtatistieken weer te geven terwijl u uw andere zoekopdrachten uitvoert:

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

Hoewel we naar enkele veelvoorkomende MySQL-problemen en -fouten hebben gekeken en ook manieren hebben geboden om problemen op te lossen en op te lossen, is het belangrijkste bij het diagnosticeren van een fout te begrijpen wat het betekent (in termen van de oorzaak).

Dus hoe kun je dit bepalen? De volgende punten zullen u helpen om erachter te komen wat precies een probleem veroorzaakt:

  1. The first and most important step is to look into the MySQL logs which are stored in the directory /var/log/mysql/. You can use command line utilities such as tail to read through the log files.
  2. If MySQL service fails to start, check its status using systemctl or use the journetctl (with the -xe flag) command under systemd to examine the problem.
  3. You can also examine system log file such as /var/log/messages or similar for reasons for your problem.
  4. Try using tools such as Mytop, glances, top, ps, or htop to check which program is taking all CPU or is locking the machine or to inspect whether you are running out of memory, disk space, file descriptors, or some other important resource.
  5. Assuming that problem is some runaway process, you can always try to kill it (using the pkill or kill utility) so that MySQL works normally.
  6. Supposing that the mysqld server is causing problems, you can run the command: mysqladmin -u root ping or mysqladmin -u root processlist to get any response from it.
  7. If the problem is with your client program while trying to connect to the MySQL server, check why it is not working fine, try to get any output from it for troubleshooting purposes.

Misschien wilt u ook deze volgende MySQL-gerelateerde artikelen lezen:

  1. Learn MySQL / MariaDB for Beginners – Part 1
  2. How to Monitor MySQL/MariaDB Databases using Netdata on CentOS 7
  3. How to Transfer All MySQL Databases From Old to New Server
  4. Mytop – A Useful Tool for Monitoring MySQL/MariaDB Performance in Linux
  5. 12 MySQL/MariaDB Security Best Practices for Linux

Raadpleeg voor meer informatie de MySQL-referentiehandleiding over problemen en veelvoorkomende fouten, deze bevat een uitgebreide lijst met veelvoorkomende problemen en foutmeldingen die u kunt tegenkomen tijdens het gebruik van MySQL, inclusief degene die we hierboven hebben besproken en meer.