Mapuslanon nga Mga Tip sa Pag-troubleshoot sa Kasagarang Mga Sayop sa MySQL


Ang MySQL kay kaylap nga gigamit nga open source relational database management system (RDMS) nga gipanag-iya sa Oracle. Kini sa daghang mga tuig mao ang default nga kapilian alang sa mga aplikasyon nga nakabase sa web ug nagpabilin nga popular kung itandi sa ubang mga makina sa database.

Ang MySQL gidesinyo ug gi-optimize alang sa mga aplikasyon sa web - kini usa ka hinungdanon nga bahin sa mga nag-unang aplikasyon nga nakabase sa web sama sa Facebook, Twitter, Wikipedia, YouTube, ug daghan pa.

Ang imong site o web application ba gipadagan sa MySQL? Niini nga detalyado nga artikulo, among ipasabut kung giunsa ang pag-troubleshoot sa mga problema ug sagad nga mga sayup sa MySQL database server. Atong ihulagway kung giunsa pagtino ang mga hinungdan sa mga problema ug kung unsa ang buhaton aron masulbad kini.

1. Dili Makakonekta sa Lokal nga MySQL Server

Usa sa kasagarang kliyente sa mga sayop sa koneksyon sa server sa MySQL mao ang \ERROR 2002 (HY000): Dili makakonektar sa lokal nga MySQL server pinaagi sa socket '/var/run/mysqld/mysqld.sock' (2).

Kini nga sayop nagpakita nga walay MySQL server (mysqld) nga nagdagan sa host system o nga imong gipiho ang usa ka sayop nga Unix socket file name o TCP/IP port sa dihang mosulay sa pagkonektar sa server.

Siguruha nga ang server nagdagan pinaagi sa pagsusi sa usa ka proseso nga ginganlag mysqld sa imong database server host gamit ang grep command nga dungan sama sa gipakita.

$ ps xa | grep mysqld | grep -v mysqld

Kung ang mga sugo sa ibabaw wala magpakita nga output, nan ang database server wala magdagan. Busa ang kliyente dili makakonektar niini. Aron masugdan ang server, padagana ang mosunod nga command systemctl.

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

Aron mapamatud-an ang status sa serbisyo sa MySQL, gamita ang mosunod nga sugo.

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

Gikan sa output sa sugo sa ibabaw, ang MySQL nga serbisyo napakyas. Sa ingon nga kaso, mahimo nimong sulayan nga i-restart kini ug susihon pag-usab ang kahimtang niini.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Dugang pa, kung ang server nagdagan sama sa gipakita sa mosunod nga sugo, apan makita gihapon nimo ang sayup sa ibabaw, kinahanglan nimo usab nga pamatud-an nga ang TCP/IP port gibabagan sa usa ka firewall o bisan unsang serbisyo sa pag-block sa port.

$ ps xa | grep mysqld | grep -v mysqld

Sa netstat nga sugo sama sa gipakita.

$ sudo netstat -tlpn | grep "mysql"

2. Dili Makakonekta sa MySQL Server

Ang laing kasagarang nasugatan nga sayop sa koneksyon mao ang \(2003) Dili makakonektar sa MySQL server sa 'server' (10061), nga nagpasabot nga ang koneksyon sa network gibalibaran.

Dinhi, sugdi pinaagi sa pagsusi nga adunay MySQL server nga nagdagan sa sistema sama sa gipakita sa ibabaw. Siguruha usab nga ang server adunay mga koneksyon sa network nga gipagana ug nga ang network port nga imong gigamit sa pagkonektar mao ang gi-configure sa server.

Ang ubang kasagarang mga sayop nga lagmit imong masugatan sa dihang mosulay ka sa pagkonektar sa MySQL server mao ang:

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)

Kini nga mga kasaypanan nagpakita nga ang server mahimong nagdagan, bisan pa, ikaw naningkamot sa pagkonektar gamit ang usa ka TCP/IP port, nga ginganlan og pipe, o Unix socket file nga lahi sa usa diin ang server nagpaminaw.

3. Pag-access sa mga Gidili nga Kasaypanan sa MySQL

Sa MySQL, ang usa ka account sa gumagamit gihubit sa termino sa usa ka username ug ang host sa kliyente o mga host diin ang tiggamit makakonekta sa server. Dugang pa, ang usa ka account mahimo usab nga adunay mga kredensyal sa panghimatuud sama sa usa ka password.

Bisan kung adunay daghang lainlaing mga hinungdan sa mga sayup nga \Access denied, usa sa kasagarang mga hinungdan mao ang kalabutan sa mga MySQL account nga gitugotan sa server nga gamiton ang mga programa sa kliyente kung magkonektar. ang database.

Gitugotan sa MySQL ang paghimo og mga account nga makapahimo sa mga tiggamit sa kliyente nga makonektar sa server ug maka-access sa datos nga gidumala sa server. Niining bahina, kung makasugat ka og sayup nga gibalibaran sa pag-access, susiha kung gitugotan ba ang user account nga makonektar sa server pinaagi sa programa sa kliyente nga imong gigamit, ug posible ang host diin gikan ang koneksyon.

Makita nimo kung unsa nga mga pribilehiyo ang naa sa gihatag nga account pinaagi sa pagpadagan sa command nga SHOW GRANTS sama sa gipakita.

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

Makahatag ka ug mga pribilehiyo sa usa ka partikular nga user sa espesipikong database sa hilit nga ip address gamit ang mosunod nga mga sugo sa MySQL shell.

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

Dugang pa, ang pag-access nga gipanghimakak nga mga sayup mahimo usab nga resulta sa mga problema sa pagkonektar sa MySQL, pag-refer sa gipasabut kaniadto nga mga sayup.

4. Nawala nga Koneksyon sa MySQL Server

Mahimo nimong masugatan kini nga sayup tungod sa usa sa mosunod nga mga hinungdan: dili maayo nga koneksyon sa network, oras sa koneksyon o usa ka problema sa mga kantidad sa BLOB nga mas dako kaysa max_allowed_packet. Sa kaso sa usa ka problema sa koneksyon sa network, siguroha nga ikaw adunay maayo nga koneksyon sa network ilabi na kung ikaw nag-access sa usa ka hilit nga database server.

Kung kini usa ka problema sa timeout sa koneksyon, labi na kung ang MySQL naningkamot nga mogamit usa ka inisyal nga koneksyon sa server, dugangi ang kantidad sa parameter nga connect_timeout. Apan sa kaso sa BLOB values nga mas dako kay sa max_allowed_packet, kinahanglan nimo nga magbutang ug mas taas nga value para sa max_allowed_packet sa imong /etc/my.cnf configuration file ubos sa [mysqld] o [client] nga seksyon sama sa gipakita.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Kung ang MySQL configuration file dili ma-access alang kanimo, nan mahimo nimong itakda kini nga bili gamit ang mosunod nga command sa MySQL shell.

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

5. Daghan kaayong MySQL Connections

Sa kaso nga ang MySQL client makasugat sa \sobra ka daghan nga koneksyon error, kini nagpasabot nga ang tanan nga anaa koneksyon gigamit sa ubang mga kliyente. Ang gidaghanon sa mga koneksyon (default mao ang 151) kontrolado sa max_connections sistema variable; mahimo nimong sulbaron ang problema pinaagi sa pagdugang sa kantidad niini aron tugutan ang daghang koneksyon sa imong /etc/my.cnf configuration file.

[mysqld]
max_connections=1000

6. Gawas sa Memorya MySQL

Kung magpadagan ka usa ka pangutana gamit ang MySQL client program ug masugatan ang sayup nga pangutana, kini nagpasabut nga ang MySQL walay igong memorya aron matipigan ang tibuuk nga resulta sa pangutana.

Ang una nga lakang mao ang pagsiguro nga ang pangutana husto, kung mao, dayon buhata ang mosunod:

  • kon direkta ka nga naggamit sa MySQL client, sugdi kini gamit ang --quick switch, aron ma-disable ang mga naka-cache nga resulta o
  • kon imong gigamit ang MyODBC driver, ang configuration user interface (UI) adunay advanced tab para sa mga flag. Susiha ang Ayaw pag-cache ang resulta.

Laing maayo nga himan mao ang, MySQL Tuner - usa ka mapuslanon nga script nga magkonektar sa usa ka nagdagan nga MySQL server ug naghatag mga sugyot kung giunsa kini ma-configure alang sa mas taas nga pasundayag.

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

Para sa MySQL optimization ug performance tuning tips, basaha ang among artikulo: 15 Useful MySQL/MariaDB Performance Tuning and Optimization Tips.

7. Ang MySQL Nagpadayon sa Pag-crash

Kung makasugat ka niini nga problema, kinahanglan nimong sulayan nga mahibal-an kung ang problema mao nga ang MySQL server namatay o kung ang kliyente nga adunay isyu. Timan-i nga daghang mga pag-crash sa server ang gipahinabo sa mga dunot nga mga file sa datos o mga file sa indeks.

Mahimo nimong susihon ang kahimtang sa server aron ma-establisar kung unsa ka dugay kini nagdagan ug nagdagan.

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

Sa laing paagi, pagdagan ang mosunod nga mysqladmin nga sugo aron makit-an ang oras sa MySQL server.

$ sudo mysqladmin version -p 

Ang ubang mga solusyon naglakip apan dili limitado sa pagpahunong sa MySQL server ug pagpagana sa pag-debug, unya pagsugod pag-usab sa serbisyo. Mahimo nimong sulayan ang paghimo og usa ka pagsulay nga kaso nga magamit aron masubli ang problema. Dugang pa, ablihi ang dugang nga terminal window ug padagana ang mosunod nga sugo aron ipakita ang mga istatistika sa proseso sa MySQL samtang imong gipadagan ang imong ubang mga pangutana:

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

Bisan kung among gitan-aw ang pipila ka sagad nga mga problema sa MySQL ug mga sayup ug naghatag usab mga paagi aron masulbad ug masulbad kini, ang labing hinungdanon nga butang sa pag-diagnose sa usa ka sayup mao ang pagsabut kung unsa ang gipasabut niini (sa mga termino kung unsa ang hinungdan niini).

Busa unsaon nimo pagtino niini? Ang mosunud nga mga punto mogiya kanimo kung giunsa pagtino kung unsa gyud ang hinungdan sa usa ka problema:

  1. Ang una ug pinakaimportante nga lakang mao ang pagtan-aw sa MySQL logs nga gitipigan sa direktoryo /var/log/mysql/. Mahimo nimong gamiton ang command line utilities sama sa tail aron mabasa ang mga log files.
  2. Kon ang MySQL service mapakyas sa pagsugod, susiha ang status niini gamit ang systemctl o gamita ang journetctl (uban ang -xe flag) nga sugo ubos sa systemd aron masusi ang problema.
  3. Mahimo usab nimong susihon ang file sa log sa sistema sama sa /var/log/messages o parehas alang sa mga hinungdan sa imong problema.
  4. Sulayi ang paggamit sa mga himan sama sa htop aron susihon kung unsang programa ang nagkuha sa tanan nga CPU o nag-lock sa makina o sa pagsusi kung nahutdan ka sa memorya, espasyo sa disk, mga deskriptor sa file, o uban pang hinungdanon nga kapanguhaan.
  5. Sa paghuna-huna nga kana nga problema usa ka proseso sa pagdagan, mahimo nimong sulayan nga patyon kini (gamit ang pkill o kill utility) aron ang MySQL molihok nga normal.
  6. Sa paghuna-huna nga ang mysqld server maoy hinungdan sa mga problema, mahimo nimong ipadagan ang command: mysqladmin -u root ping o mysqladmin -u root processlist aron makakuha og bisan unsang tubag gikan niini.
  7. Kon ang problema kay sa imong kliyente nga programa samtang naningkamot sa pagkonektar sa MySQL server, susiha kon nganong dili kini maayo, sulayi nga makakuha og bisan unsang output gikan niini alang sa mga katuyoan sa pag-troubleshoot.

Mahimo usab nimo nga basahon kining mosunod nga mga artikulo nga may kalabutan sa MySQL:

  1. Pagkat-on sa MySQL/MariaDB para sa mga Nagsugod – Bahin 1
  2. Unsaon Pag-monitor sa MySQL/MariaDB Database gamit ang Netdata sa CentOS 7
  3. Unsaon Pagbalhin sa Tanang MySQL Databases Gikan sa Karaan ngadto sa Bag-ong Server
  4. Mytop – Usa ka Mapuslanon nga Himan sa Pag-monitor sa MySQL/MariaDB Performance sa Linux
  5. 12 MySQL/MariaDB Security Best Practices para sa Linux

Para sa dugang nga impormasyon, konsultaha ang MySQL Reference manual mahitungod sa Problems and Common Errors, kini komprehensibo nga naglista sa komon nga mga problema ug mga mensahe sa sayop nga imong masugatan samtang naggamit sa MySQL, lakip na ang atong gihisgutan sa ibabaw ug uban pa.