MySQL adalah database terkenal kedua di dunia menurut situs DB Engine di belakang Oracle. Apa yang membuat MySQL terkenal mungkin karena merupakan Sistem Manajemen Basis Data yang sangat cepat, andal, dan fleksibel. MySQL juga merupakan salah satu database yang didukung di ClusterControl. Anda dapat dengan mudah menerapkan, menskalakan, memantau, dan melakukan banyak hal dengan ClusterControl.
Hari ini kita tidak akan membicarakan salah satu dari itu, tetapi kita akan membahas salah satu kesalahan umum untuk MySQL dan kemungkinan tip pemecahan masalah. Saat bekerja dengan tiket, sering kali ketika kami memeriksa laporan atau log kesalahan, kami cukup sering melihat baris ini “Mendapat kesalahan saat membaca paket komunikasi”. Kami pikir akan bermanfaat jika kami menulis blog yang terkait dengan kesalahan ini tidak hanya untuk pelanggan kami tetapi juga untuk pembaca lainnya. Tunggu apa lagi, saatnya menyelam lebih jauh!
Protokol Klien/Server MySQL
Pertama-tama, kita perlu memahami cara MySQL berkomunikasi antara klien dan server. Baik client maupun server menggunakan protokol MySQL yang diimplementasikan oleh Connectors, MySQL Proxy dan juga komunikasi antara server replikasi master dan slave. Protokol MySQL mendukung fitur-fitur seperti enkripsi transparan melalui SSL, kompresi transparan, fase koneksi, dan juga fase perintah.
Baik integer dan string adalah tipe data dasar yang digunakan di seluruh protokol MySQL. Setiap kali klien dan server MySQL ingin berkomunikasi satu sama lain atau mengirim data, itu akan membagi data menjadi paket-paket dengan ukuran maksimum 16MB dan juga akan menambahkan header paket ke setiap potongan. Di dalam setiap paket, akan ada payload dimana tipe data (integer/string) memainkan perannya.
Mengingat CLIENT_PROTOCOL_41 diaktifkan, untuk hampir setiap perintah yang dikirim klien ke server, server akan membalas paket berikut sebagai respons:
OK_Packet | Ini adalah sinyal untuk setiap perintah yang berhasil. |
ERR_Packet | Sinyal menunjukkan kesalahan untuk paket. |
EOF_Packet | Paket ini berisi peringatan atau bendera status. |
Cara Mendiagnosis Masalah
Biasanya, ada dua jenis masalah koneksi yaitu kesalahan komunikasi atau koneksi yang dibatalkan. Kapan pun salah satu dari masalah koneksi ini terjadi, sumber informasi berikut adalah titik awal yang baik untuk pemecahan masalah dan analisis:
-
Log kesalahan
-
Log kueri umum
-
Variabel status Aborted_xxx dan Connection_errors_xxx
-
Cache host
Kesalahan Koneksi Dan Kemungkinan Penyebabnya
Jika terjadi kesalahan koneksi dan tergantung pada kesalahannya, penghitung status akan bertambah baik untuk Aborted_clients atau Aborted_connects dalam variabel status. Seperti yang diambil dari dokumentasi MySQL, Aborted_clients berarti jumlah koneksi yang dibatalkan karena klien mati tanpa menutup koneksi dengan benar. Sedangkan untuk Aborted_connects, artinya jumlah percobaan yang gagal untuk terhubung ke server MySQL.
Jika Anda memulai server MySQL dengan opsi --log-warnings, kemungkinan Anda akan melihat contoh pesan berikut di log kesalahan Anda. Seperti yang Anda perhatikan, pesan tersebut dengan jelas mengatakan bahwa itu terkait dengan koneksi yang dibatalkan, oleh karena itu penghitung status Aborted_connects akan bertambah dalam variabel status:
[Peringatan] Sambungan dibatalkan 154669 ke db:pengguna 'wordpress':'wpuser' Host:'hostname' (Ada kesalahan saat membaca paket komunikasi)
Biasanya, upaya koneksi yang gagal dapat terjadi karena alasan berikut. Saat Anda menyadarinya, ini mungkin menunjukkan bahwa orang yang tidak berwenang akan melanggar database dan Anda mungkin ingin melihatnya secepat mungkin:
-
Klien tidak memiliki hak istimewa untuk mengakses database.
-
Kredensial yang salah telah digunakan.
-
Paket koneksi yang memiliki informasi yang salah.
-
Karena batas yang dicapai untuk connect_timeout untuk terhubung.
Variabel status untuk Aborted_clients akan bertambah oleh server jika klien berhasil terhubung tetapi terputus atau dihentikan dengan cara yang tidak benar. Selain itu, server juga akan mencatat pesan Aborted connection ke log kesalahan. Untuk jenis kesalahan ini, biasanya karena alasan berikut:
-
Klien tidak menutup koneksi dengan benar sebelum keluar (tidak memanggil mysql_close()).
-
Klien telah melampaui waktu tunggu atau waktu habis interaktif.
-
Program atau aplikasi klien tiba-tiba berhenti di tengah transfer data.
Selain alasan sebelumnya, kemungkinan alasan lain untuk koneksi yang dibatalkan dan masalah klien yang dibatalkan dapat terkait dengan salah satu dari berikut ini:
-
Konfigurasi TCP/IP kacau.
-
Nilai variabel terlalu kecil untuk max_allowed_packet.
-
Alokasi memori tidak cukup untuk kueri.
-
Perangkat keras yang rusak seperti ethernet, sakelar, kabel, dll.
-
Masalah dengan pustaka utas.
-
Masalah sindrom dupleks di mana transfer berjalan dalam mode burst-pause-burst-pause (jika Anda menggunakan protokol ethernet dengan Linux, baik half duplex maupun full duplex).
Cara Memperbaiki Kesalahan Komunikasi MySQL
Sekarang kita telah mempelajari banyak potensi yang menyebabkan kesalahan koneksi MySQL. Berdasarkan pengalaman kami, sebagian besar waktu masalah ini terkait dengan firewall atau masalah jaringan. Juga adil untuk mengatakan bahwa tidak mudah untuk mendiagnosis masalah semacam ini. Meskipun demikian, solusi berikut mungkin dapat membantu Anda mengatasi kesalahan ini:
-
Jika aplikasi Anda mengandalkan wait_timeout untuk menutup koneksi, ada baiknya mengubah logika aplikasi sehingga ditutup dengan benar di akhir operasi apa pun.
-
Memastikan nilai untuk max_allowed_packet berada dalam kisaran yang dapat diterima sehingga klien tidak menerima kesalahan apa pun yang terkait dengan "paket terlalu besar".
-
Untuk masalah keterlambatan koneksi yang mungkin disebabkan oleh DNS, ada baiknya memeriksa apakah Anda memiliki skip-name- penyelesaian diaktifkan.
-
Jika Anda menggunakan aplikasi PHP atau pemrograman lain, yang terbaik adalah memastikannya tidak dibatalkan koneksi yang biasanya disetel pada max_execution_time.
-
Jika Anda melihat banyak pemberitahuan TIME_WAIT dari netstat, perlu dipastikan bahwa koneksi dikelola dengan baik di aplikasi berakhir.
-
Jika Anda menggunakan Linux dan menduga masalahnya adalah karena jaringan, sebaiknya periksa antarmuka jaringan dengan menggunakan perintah ifconfig-a dan periksa output pada server MySQL untuk menemukan kesalahan.
-
Untuk pengguna ClusterControl, Anda dapat mengaktifkan Log Audit dari Cluster -> Keamanan -> Log Audit. Dengan mengaktifkan fitur ini, ini dapat membantu Anda mempersempit menemukan kueri mana yang menjadi penyebabnya.
-
Alat jaringan seperti tcpdump dan Wireshark dapat berguna dalam mengidentifikasi potensi masalah jaringan, batas waktu, dan masalah sumber daya untuk MySQL.
-
Secara berkala periksa perangkat keras dengan memastikan tidak ada perangkat yang rusak terutama untuk ethernet, hub, sakelar, kabel dll. Sebaiknya ganti alat yang rusak untuk memastikan sambungan selalu baik.
Kesimpulan
Ada banyak alasan yang mungkin menyebabkan masalah paket koneksi MySQL. Setiap kali masalah ini terjadi, itu pasti akan mempengaruhi bisnis dan operasi sehari-hari. Meskipun jenis masalah ini tidak mudah didiagnosis dan sebagian besar disebabkan oleh jaringan atau firewall, ada baiknya mempertimbangkan semua langkah yang telah disarankan sebelumnya untuk memperbaiki masalah. Kami sangat berharap posting blog ini dapat membantu Anda dalam beberapa hal terutama ketika Anda menghadapi masalah ini.