Petua Berguna untuk Menyelesaikan Masalah Ralat Biasa dalam MySQL


MySQL ialah sistem pengurusan pangkalan data hubungan sumber terbuka yang digunakan secara meluas (RDMS) yang dimiliki oleh Oracle. Ia telah menjadi pilihan lalai selama bertahun-tahun untuk aplikasi berasaskan web dan masih kekal popular berbanding dengan enjin pangkalan data lain.

Baca Juga: Cara Memasang MySQL Terkini pada RHEL/CentOS dan Fedora

MySQL telah direka bentuk dan dioptimumkan untuk aplikasi web – ia membentuk bahagian penting dalam aplikasi berasaskan web utama seperti Facebook, Twitter, Wikipedia, YouTube dan banyak lagi.

Adakah tapak atau aplikasi web anda dikuasakan oleh MySQL? Dalam artikel terperinci ini, kami akan menerangkan cara menyelesaikan masalah dan ralat biasa dalam pelayan pangkalan data MySQL. Kami akan menerangkan bagaimana untuk menentukan punca masalah dan apa yang perlu dilakukan untuk menyelesaikannya.

1. Tidak Dapat Menyambung ke Pelayan MySQL Tempatan

Salah satu ralat sambungan klien ke pelayan biasa dalam MySQL ialah “ERROR 2002 (HY000): Tidak dapat menyambung ke pelayan MySQL tempatan melalui soket '/var/run/mysqld/mysqld.sock' (2) ”.

Ralat ini menunjukkan bahawa tiada pelayan MySQL (mysqld) berjalan pada sistem hos atau anda telah menetapkan nama fail soket Unix atau TCP/IP< yang salah. port apabila cuba menyambung ke pelayan.

Pastikan pelayan berjalan dengan menyemak proses bernama mysqld pada hos pelayan pangkalan data anda menggunakan perintah ps dan perintah grep bersama-sama seperti yang ditunjukkan.

ps xa | grep mysqld | grep -v mysqld

Jika arahan di atas tidak menunjukkan output, maka pelayan pangkalan data tidak berjalan. Oleh itu pelanggan tidak boleh menyambung kepadanya. Untuk memulakan pelayan, jalankan arahan systemctl berikut.

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

Untuk mengesahkan status perkhidmatan MySQL, gunakan arahan berikut.

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

Daripada output arahan di atas, perkhidmatan MySQL telah gagal. Dalam kes sedemikian, anda boleh cuba memulakan semula dan menyemak statusnya sekali lagi.

sudo systemctl restart mysql
sudo systemctl status mysql

Di samping itu, jika pelayan berjalan seperti yang ditunjukkan oleh arahan berikut, tetapi anda masih melihat ralat di atas, anda juga harus mengesahkan bahawa port TCP/IP disekat oleh tembok api atau mana-mana perkhidmatan menyekat port .

ps xa | grep mysqld | grep -v mysqld

Untuk mencari port yang sedang didengari oleh pelayan, gunakan arahan netstat seperti yang ditunjukkan.

sudo netstat -tlpn | grep "mysql"

2. Tidak Dapat Menyambung ke Pelayan MySQL

Satu lagi ralat sambungan yang biasa ditemui ialah “(2003) Tidak dapat menyambung ke pelayan MySQL pada ‘pelayan’ (10061) ”, yang bermaksud sambungan rangkaian telah ditolak.

Di sini, mulakan dengan menyemak bahawa terdapat pelayan MySQL yang berjalan pada sistem seperti yang ditunjukkan di atas. Juga pastikan bahawa pelayan mempunyai sambungan rangkaian yang didayakan dan port rangkaian yang anda gunakan untuk menyambung adalah yang dikonfigurasikan pada pelayan.

Ralat biasa lain yang mungkin anda hadapi apabila anda cuba menyambung ke pelayan MySQL ialah:

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)

Ralat ini menunjukkan bahawa pelayan mungkin sedang berjalan, namun, anda cuba menyambung menggunakan port TCP/IP, paip bernama atau fail soket Unix yang berbeza daripada yang pelayan sedang mendengar.

3. Akses Ralat Dinafikan dalam MySQL

Dalam MySQL, akaun pengguna ditakrifkan dari segi nama pengguna dan hos klien atau hos yang pengguna boleh menyambung ke pelayan. Selain itu, akaun juga mungkin mempunyai kelayakan pengesahan seperti kata laluan.

Walaupun terdapat banyak punca ralat "Akses ditolak ", salah satu punca biasa adalah berkaitan dengan akaun MySQL yang pelayan membenarkan atur cara klien digunakan semasa menyambung. Ia menunjukkan bahawa nama pengguna yang dinyatakan dalam sambungan tidak mempunyai keistimewaan untuk mengakses pangkalan data.

MySQL membenarkan penciptaan akaun yang membolehkan pengguna pelanggan menyambung ke pelayan dan mengakses data yang diuruskan oleh pelayan. Dalam hal ini, jika anda menghadapi ralat dinafikan akses, semak sama ada akaun pengguna dibenarkan untuk menyambung ke pelayan melalui program klien yang anda gunakan dan mungkin hos dari mana sambungan itu datang. .

Anda boleh melihat keistimewaan yang dimiliki oleh akaun tertentu dengan menjalankan perintah SHOW GRANTS seperti yang ditunjukkan.

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

Anda boleh memberikan keistimewaan kepada pengguna tertentu pada pangkalan data khusus kepada alamat ip jauh menggunakan arahan berikut dalam shell MySQL.

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

Tambahan pula, ralat ditolak akses juga boleh disebabkan oleh masalah dengan menyambung ke MySQL, rujuk kepada ralat yang dijelaskan sebelum ini.

4. Sambungan Terputus ke Pelayan MySQL

Anda mungkin menghadapi ralat ini disebabkan oleh salah satu daripada sebab berikut: sambungan rangkaian yang lemah, masa sambungan atau masalah dengan nilai BLOB yang lebih besar daripada paket_maks_dibenarkan. Sekiranya berlaku masalah sambungan rangkaian, pastikan anda mempunyai sambungan rangkaian yang baik terutamanya jika anda mengakses pelayan pangkalan data jauh.

Jika ia adalah masalah masa sambungan, terutamanya apabila MySQL cuba menggunakan sambungan awal ke pelayan, tingkatkan nilai parameter connect_timeout . Tetapi dalam kes nilai BLOB yang lebih besar daripada paket_maks_dibenarkan, anda perlu menetapkan nilai yang lebih tinggi untuk paket_maks_dibenarkan dalam /etc anda /my.cnf fail konfigurasi di bawah bahagian [mysqld] atau [client] seperti yang ditunjukkan.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Jika fail konfigurasi MySQL tidak boleh diakses untuk anda, maka anda boleh menetapkan nilai ini menggunakan arahan berikut dalam shell MySQL.

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

5. Terlalu Banyak Sambungan MySQL

Sekiranya klien MySQL menghadapi ralat "terlalu banyak sambungan ", ini bermakna semua sambungan yang tersedia sedang digunakan oleh klien lain. Bilangan sambungan (lalai ialah 151) dikawal oleh pembolehubah sistem max_connections; anda boleh membetulkan masalah dengan meningkatkan nilainya untuk membenarkan lebih banyak sambungan dalam fail konfigurasi /etc/my.cnf anda.

[mysqld]
max_connections=1000

6. Kehabisan Memori MySQL

Sekiranya anda menjalankan pertanyaan menggunakan program klien MySQL dan menghadapi ralat yang dipersoalkan, ini bermakna MySQL tidak mempunyai memori yang mencukupi untuk menyimpan keseluruhan hasil pertanyaan.

Langkah pertama adalah untuk memastikan bahawa pertanyaan itu betul, jika ya, kemudian lakukan perkara berikut:

  • jika anda menggunakan klien MySQL secara langsung, mulakannya dengan --suis cepat, untuk melumpuhkan hasil cache atau
  • jika anda menggunakan pemacu MyODBC, antara muka pengguna konfigurasi (UI) mempunyai tab lanjutan untuk bendera. Tandai “Jangan cache hasil“.

Satu lagi alat yang hebat ialah, MySQL Tuner – skrip berguna yang akan menyambung ke pelayan MySQL yang sedang berjalan dan memberikan cadangan tentang cara ia boleh dikonfigurasikan untuk prestasi yang lebih tinggi.

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

Untuk pengoptimuman MySQL dan petua penalaan prestasi, baca artikel kami: 15 Petua Penalaan Prestasi dan Pengoptimuman MySQL/MariaDB yang Berguna.

7. MySQL Terus Ranap

Jika anda menghadapi masalah ini, anda harus cuba untuk mengetahui sama ada masalahnya ialah pelayan MySQL mati atau sama ada klien itu mempunyai masalah. Ambil perhatian bahawa banyak ranap pelayan disebabkan oleh fail data atau fail indeks yang rosak.

Anda boleh menyemak status pelayan untuk menentukan berapa lama ia telah tersedia dan berjalan.

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

Sebagai alternatif, jalankan arahan mysqladmin berikut untuk mencari masa aktif pelayan MySQL.

sudo mysqladmin version -p 

Penyelesaian lain termasuk tetapi tidak terhad kepada menghentikan pelayan MySQL dan mendayakan penyahpepijatan, kemudian mulakan perkhidmatan itu semula. Anda boleh cuba membuat kes ujian yang boleh digunakan untuk mengulangi masalah tersebut. Di samping itu, buka tetingkap terminal tambahan dan jalankan arahan berikut untuk memaparkan statistik proses MySQL semasa anda menjalankan pertanyaan anda yang lain:

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

Intinya: Menentukan Apa yang Menyebabkan Masalah atau Ralat

Walaupun kami telah melihat beberapa masalah dan ralat MySQL biasa dan juga menyediakan cara untuk menyelesaikan masalah dan menyelesaikannya, perkara yang paling penting dengan mendiagnosis ralat ialah memahami maksudnya (dari segi apa yang menyebabkannya) .

Jadi bagaimana anda boleh menentukan ini? Perkara berikut akan membimbing anda tentang cara untuk memastikan apa sebenarnya yang menyebabkan masalah:

  1. Langkah pertama dan paling penting ialah melihat ke dalam log MySQL yang disimpan dalam direktori /var/log/mysql/. Anda boleh menggunakan utiliti baris arahan seperti ekor untuk membaca fail log.
  2. Jika perkhidmatan MySQL gagal dimulakan, semak statusnya menggunakan systemctl atau gunakan perintah journetctl (dengan bendera -xe) di bawah systemd untuk memeriksa masalah.
  3. Anda juga boleh memeriksa fail log sistem seperti /var/log/messages atau yang serupa atas sebab masalah anda.
  4. Cuba gunakan alatan seperti Mytop, glances, top, ps, atau htop untuk menyemak program yang mengambil semua CPU atau sedang mengunci mesin atau untuk memeriksa sama ada anda kehabisan memori, ruang cakera, deskriptor fail atau beberapa sumber penting lain .
  5. Dengan mengandaikan masalah itu adalah beberapa proses lari, anda sentiasa boleh cuba untuk membunuhnya (menggunakan utiliti pkill atau kill) supaya MySQL berfungsi dengan normal.
  6. Dengan mengandaikan pelayan mysqld menyebabkan masalah, anda boleh menjalankan arahan: mysqladmin -u root ping atau mysqladmin -u root processlist untuk mendapatkan sebarang tindak balas daripadanya.
  7. Jika masalah adalah dengan program klien anda semasa cuba menyambung ke pelayan MySQL, semak mengapa ia tidak berfungsi dengan baik, cuba dapatkan sebarang output daripadanya untuk tujuan penyelesaian masalah.

Anda juga mungkin ingin membaca artikel berkaitan MySQL berikut:

  1. Belajar MySQL/MariaDB untuk Pemula – Bahagian 1
  2. Cara Memantau Pangkalan Data MySQL/MariaDB menggunakan Netdata pada CentOS 7
  3. Cara Memindahkan Semua Pangkalan Data MySQL Dari Pelayan Lama ke Baru
  4. Mytop – Alat Berguna untuk Memantau Prestasi MySQL/MariaDB dalam Linux
  5. 12 Amalan Terbaik Keselamatan MySQL/MariaDB untuk Linux

Untuk maklumat lanjut, rujuk manual Rujukan MySQL berkenaan Masalah dan Ralat Biasa, ia menyenaraikan secara menyeluruh masalah biasa dan mesej ralat yang mungkin anda hadapi semasa menggunakan MySQL, termasuk yang telah kami bincangkan di atas dan banyak lagi.