MySQL-də ümumi səhvləri aradan qaldırmaq üçün faydalı məsləhətlər


MySQL, Oracle-a məxsus geniş istifadə olunan açıq mənbəli əlaqəli verilənlər bazası idarəetmə sistemidir (RDMS). Bu illər ərzində veb-əsaslı proqramlar üçün standart seçim olmuşdur və digər verilənlər bazası mühərrikləri ilə müqayisədə hələ də populyar olaraq qalır.

MySQL veb proqramlar üçün nəzərdə tutulmuş və optimallaşdırılmışdır – o, Facebook, Twitter, Wikipedia, YouTube və bir çox başqaları kimi əsas veb əsaslı proqramların tərkib hissəsini təşkil edir.

Saytınız və ya veb tətbiqiniz MySQL ilə işləyir? Bu ətraflı məqalədə MySQL verilənlər bazası serverindəki problemləri və ümumi səhvləri necə aradan qaldıracağımızı izah edəcəyik. Problemlərin səbəblərini necə müəyyənləşdirmək və onları həll etmək üçün nə etmək lazım olduğunu təsvir edəcəyik.

1. Yerli MySQL Serverinə qoşulmaq mümkün deyil

MySQL-də ümumi müştəri ilə serverə qoşulma xətalarından biri \ERROR 2002 (HY000): '/var/run/mysqld/mysqld.sock' (2) yuvası vasitəsilə yerli MySQL serverinə qoşulmaq mümkün deyil.

Bu xəta host sistemində çalışan MySQL serverinin (mysqld) olmadığını və ya serverə qoşulmağa çalışarkən səhv Unix soket fayl adını və ya TCP/IP portunu göstərdiyinizi göstərir.

Şəkildə göstərildiyi kimi grep əmrindən istifadə edərək verilənlər bazası serverinizin hostunda mysqld adlı prosesi yoxlayaraq serverin işlədiyinə əmin olun.

$ ps xa | grep mysqld | grep -v mysqld

Yuxarıdakı əmrlər heç bir çıxış göstərmirsə, verilənlər bazası serveri işləmir. Buna görə də müştəri ona qoşula bilmir. Serveri işə salmaq üçün aşağıdakı systemctl əmrini işlədin.

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

MySQL xidmət statusunu yoxlamaq üçün aşağıdakı əmrdən istifadə edin.

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

Yuxarıdakı əmrin çıxışından MySQL xidməti uğursuz oldu. Bu vəziyyətdə, onu yenidən başlatmağa və vəziyyətini bir daha yoxlamağa cəhd edə bilərsiniz.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Bundan əlavə, əgər server aşağıdakı əmrdə göstərildiyi kimi işləyirsə, lakin siz hələ də yuxarıda göstərilən xətanı görürsünüzsə, siz həmçinin TCP/IP portunun firewall və ya hər hansı port bloklama xidməti tərəfindən bloklandığını yoxlamalısınız.

$ ps xa | grep mysqld | grep -v mysqld

Şəkildə göstərildiyi kimi netstat əmrinə.

$ sudo netstat -tlpn | grep "mysql"

2. MySQL Serverinə qoşulmaq mümkün deyil

Digər tez-tez rast gəlinən əlaqə xətası \(2003) 'server' (10061) üzərindəki MySQL serverinə qoşula bilmir, yəni şəbəkəyə qoşulmaqdan imtina edilib.

Burada yuxarıda göstərildiyi kimi sistemdə işləyən MySQL serverinin olub olmadığını yoxlamaqla başlayın. Həmçinin serverdə şəbəkə bağlantılarının aktiv olduğundan və qoşulmaq üçün istifadə etdiyiniz şəbəkə portunun serverdə konfiqurasiya edilmiş port olduğundan əmin olun.

MySQL serverinə qoşulmağa çalışdığınız zaman qarşılaşa biləcəyiniz digər ümumi səhvlər bunlardı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)

Bu xətalar serverin işlədiyini göstərir, lakin siz TCP/IP portu, adlı boru və ya serverin dinlədiyi fayldan fərqli Unix yuva faylından istifadə edərək qoşulmağa çalışırsınız.

3. MySQL-də rədd edilən səhvlərə giriş

MySQL-də istifadəçi hesabı istifadəçi adı və istifadəçinin serverə qoşula biləcəyi müştəri host və ya hostlar baxımından müəyyən edilir. Bundan əlavə, hesabda parol kimi autentifikasiya etimadnaməsi də ola bilər.

\Giriş rədd edildi xətalarının bir çox müxtəlif səbəbləri olsa da, ümumi səbəblərdən biri serverin qoşulma zamanı müştəri proqramlarının istifadəsinə icazə verdiyi MySQL hesabları ilə bağlıdır. Bu, əlaqədə göstərilən istifadəçi adının daxil olmaq üçün imtiyazlara malik olmadığını göstərir. verilənlər bazası.

MySQL müştəri istifadəçilərinə serverə qoşulmağa və server tərəfindən idarə olunan məlumatlara daxil olmağa imkan verən hesabların yaradılmasına imkan verir. Bununla əlaqədar olaraq, girişin rədd edilməsi xətası ilə qarşılaşsanız, istifadəçi hesabının istifadə etdiyiniz müştəri proqramı və ola bilsin ki, əlaqənin gəldiyi host vasitəsilə serverə qoşulmasına icazə verilib-verilmədiyini yoxlayın.

Siz SHOW GRANTS əmrini göstərildiyi kimi işlətməklə verilmiş hesabın hansı imtiyazlara malik olduğunu görə bilərsiniz.

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

MySQL qabığında aşağıdakı əmrlərdən istifadə edərək, müəyyən verilənlər bazasında müəyyən istifadəçiyə uzaq IP ünvanına imtiyazlar verə bilərsiniz.

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

Bundan əlavə, girişin rədd edilməsi səhvləri MySQL-ə qoşulma problemlərindən də yarana bilər, əvvəllər izah edilmiş xətalara baxın.

4. MySQL Server ilə əlaqə itdi

Siz bu xəta ilə aşağıdakı səbəblərdən biri ilə qarşılaşa bilərsiniz: zəif şəbəkə bağlantısı, əlaqənin fasiləsi və ya max_allowed_packet-dən böyük olan BLOB dəyərlərində problem. Şəbəkə bağlantısı problemi halında, xüsusən də uzaq verilənlər bazası serverinə daxil olursunuzsa, yaxşı şəbəkə bağlantınız olduğundan əmin olun.

Əgər bu, əlaqənin fasiləsi problemidirsə, xüsusən MySQL serverə ilkin bağlantıdan istifadə etməyə çalışdıqda, connect_timeout parametrinin dəyərini artırın. Lakin BLOB dəyərlərinin max_allowed_packet-dən böyük olduğu halda, [mysqld] və ya [client] altında /etc/my.cnf konfiqurasiya faylınızda max_allowed_packet üçün daha yüksək dəyər təyin etməlisiniz. bölməsində göstərildiyi kimi.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

MySQL konfiqurasiya faylı sizin üçün əlçatan deyilsə, MySQL qabığında aşağıdakı əmrdən istifadə edərək bu dəyəri təyin edə bilərsiniz.

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

5. Çoxlu MySQL Əlaqələri

MySQL müştərisi \çox çox əlaqə xətası ilə qarşılaşarsa, bu o deməkdir ki, bütün mövcud bağlantılar digər müştərilər tərəfindən istifadə olunur. Əlaqələrin sayı (defolt olaraq 151-dir) max_connections sistemi tərəfindən idarə olunur. dəyişən; /etc/my.cnf konfiqurasiya faylınızda daha çox əlaqəyə icazə vermək üçün dəyərini artırmaqla problemi həll edə bilərsiniz.

[mysqld]
max_connections=1000

6. Yaddaş tükənmiş MySQL

MySQL müştəri proqramından istifadə edərək sorğu işlətdiyiniz və sözügedən xəta ilə qarşılaşdığınız halda, MySQL-in bütün sorğu nəticəsini saxlamaq üçün kifayət qədər yaddaşı yoxdur.

İlk addım sorğunun düzgün olduğundan əmin olmaqdır, əgər doğrudursa, aşağıdakıları edin:

  • Əgər siz MySQL müştərisini birbaşa istifadə edirsinizsə, onu --sürətli keçid ilə başlayın, keşləşdirilmiş nəticələri söndürün və ya
  • Əgər siz MyODBC sürücüsündən istifadə edirsinizsə, konfiqurasiya istifadəçi interfeysində (UI) bayraqlar üçün təkmil tab var. “Nəticəni keşləmə”ni yoxlayın.

Başqa bir əla vasitədir MySQL Tuner – işləyən MySQL serverinə qoşulacaq və onun daha yüksək performans üçün necə konfiqurasiya olunacağına dair təkliflər verən faydalı skriptdir.

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

MySQL-in optimallaşdırılması və performansın tənzimlənməsi ilə bağlı məsləhətlər üçün məqaləmizi oxuyun: 15 Faydalı MySQL/MariaDB Performans Sazlama və Optimallaşdırma Məsləhətləri.

7. MySQL çökməyə davam edir

Bu problemlə qarşılaşsanız, problemin MySQL serverinin ölməsi və ya müştərinin problemi olub-olmadığını öyrənməyə çalışmalısınız. Qeyd edək ki, bir çox server qəzaları zədələnmiş məlumat faylları və ya indeks faylları səbəbindən baş verir.

Serverin nə qədər müddətdir işlədiyini müəyyən etmək üçün onun statusunu yoxlaya bilərsiniz.

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

Alternativ olaraq, MySQL serverinin işləmə vaxtını tapmaq üçün aşağıdakı mysqladmin əmrini işə salın.

$ sudo mysqladmin version -p 

Digər həllər arasında MySQL serverinin dayandırılması və sazlamanın aktivləşdirilməsi daxildir, lakin bununla məhdudlaşmır, sonra xidməti yenidən işə salın. Problemi təkrarlamaq üçün istifadə edilə bilən bir sınaq işi yaratmağa cəhd edə bilərsiniz. Bundan əlavə, əlavə terminal pəncərəsi açın və digər sorğularınızı icra edərkən MySQL proses statistikasını göstərmək üçün aşağıdakı əmri işlədin:

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

Bəzi ümumi MySQL problemlərinə və səhvlərinə nəzər salsaq da, onları aradan qaldırmaq və həll etmək yollarını təqdim etsək də, xətanın diaqnostikasında ən vacib şey onun nə demək olduğunu anlamaqdır (nəyin səbəb olduğu baxımından).

Beləliklə, bunu necə müəyyən edə bilərsiniz? Problemin tam olaraq nəyə səbəb olduğunu müəyyən etmək üçün aşağıdakı məqamlar sizə kömək edəcək:

  1. İlk və ən vacib addım /var/log/mysql/ kataloqunda saxlanılan MySQL qeydlərinə baxmaqdır. Günlük faylları oxumaq üçün tail kimi komanda xətti utilitlərindən istifadə edə bilərsiniz.
  2. MySQL xidməti başlamazsa, systemctl istifadə edərək onun statusunu yoxlayın və ya problemi araşdırmaq üçün systemd altında journetctl (-xe bayrağı ilə) əmrindən istifadə edin.
  3. Probleminizin səbəbləri üçün /var/log/messages və ya oxşar sistem jurnalı faylını da yoxlaya bilərsiniz.
  4. Hansı proqramın bütün CPU-nu götürdüyünü və ya maşını kilidlədiyini yoxlamaq və ya yaddaşınızın, disk sahəsinin, fayl deskriptorlarının və ya başqa vacib resursun tükəndiyini yoxlamaq üçün htop kimi alətlərdən istifadə etməyə çalışın.
  5. Bu problemin hansısa qaçaq proses olduğunu fərz etsək, siz həmişə MySQL-in normal işləməsi üçün onu öldürməyə cəhd edə bilərsiniz (pkill və ya kill yardım proqramından istifadə etməklə).
  6. Fərz edək ki, mysqld serveri problemlər yaradır, siz ondan istənilən cavab almaq üçün mysqladmin -u root ping və ya mysqladmin -u root processlist əmrini yerinə yetirə bilərsiniz.
  7. Əgər problem MySQL serverinə qoşulmaq istəyərkən müştəri proqramındadırsa, onun niyə yaxşı işləmədiyini yoxlayın, problemlərin həlli üçün ondan hər hansı nəticə əldə etməyə çalışın.

Siz həmçinin MySQL ilə əlaqəli aşağıdakı məqalələri oxumaq istəyə bilərsiniz:

  1. Başlayanlar üçün MySQL/MariaDB öyrənin – 1-ci hissə
  2. CentOS 7-də Netdata istifadə edərək MySQL/MariaDB verilənlər bazasına necə nəzarət etmək olar
  3. Bütün MySQL verilənlər bazalarını köhnə serverdən yeni serverə necə köçürmək olar
  4. Mytop – Linux-da MySQL/MariaDB Performansının Monitorinqi üçün Faydalı Alət
  5. Linux üçün 12 MySQL/MariaDB Təhlükəsizlik Ən Yaxşı Təcrübəsi

Əlavə məlumat üçün Problemlər və Ümumi Səhvlər haqqında MySQL İstinad kitabçasına müraciət edin, o, MySQL-dən istifadə edərkən qarşılaşa biləcəyiniz ümumi problemləri və səhv mesajlarını, o cümlədən yuxarıda müzakirə etdiyimiz və daha çoxunu əhatə edir.