Koneksi MySQL setelah kesalahan 1040: terlalu banyak koneksi

Dan lagi KESALAHAN 1040 ...


Dukungan teknis menerima banyak keluhan tentang kesalahan terkenal ini: ERROR 1040: Too many connections - terlalu banyak koneksi. Masalahnya jelas: aplikasi atau pengguna membuat lebih banyak koneksi daripada yang diizinkan server, yaitu jumlah koneksi saat ini melebihi nilai variabel max_connections .



Situasi itu sendiri merupakan masalah bagi pengguna akhir, tetapi jika Anda masih tidak memiliki akses ke server untuk mendiagnosis dan memperbaiki penyebabnya, semuanya menjadi sangat buruk. Biasanya, Anda harus menyelesaikan instance dan memulai kembali untuk memulihkan.


Pengguna root juga tidak dapat terhubung! Kenapa?


Dalam lingkungan yang dikonfigurasikan dengan benar, pengguna dengan hak SUPER akan dapat mengakses instance dan mendiagnosis penyebab kesalahan 1040, karena tidak ada koneksi yang cukup. Ini dijelaskan dalam manual:


mysqld memungkinkan max_connections + 1 koneksi klien. Koneksi tambahan disediakan untuk akun dengan hak SUPER . Ketika hak istimewa ini diberikan kepada administrator, dan bukan pengguna biasa (yang tidak membutuhkannya), administrator yang juga memiliki hak istimewa PROCESS dapat terhubung ke server dan menggunakan SHOW PROCESSLIST untuk mendiagnosis masalah, bahkan jika jumlah maksimum klien tanpa hak istimewa terhubung.

Tetapi banyak orang memberikan hak SUPER kepada pengguna aplikasi atau skrip - karena persyaratan aplikasi (berbahaya!) Atau kurangnya pengetahuan tentang konsekuensinya, dan kemudian pengguna biasa menempati koneksi yang dipesan, dan pengguna administratif (biasanya root ) tidak dapat terhubung.


Bagaimana menjamin akses ke sebuah instance


Anda dapat menggunakan peretasan terkenal dengan GDB, yang disarankan Aurimas 100 tahun lalu untuk kesalahan 1040, tetapi sekarang ada solusi yang lebih baik. Benar, mereka harus dihidupkan terlebih dahulu.
Dengan Percona Server 5.5.29 dan lebih tinggi dan MySQL 8.0.14 dan lebih tinggi, Anda dapat mengonfigurasikan port lain dengan jumlah koneksi tambahan. Aplikasi tidak akan menggunakan antarmuka ini. Mereka hanya untuk administrator basis data dan agen pemantauan dan verifikasi kesehatan (lihat catatan di bawah).


Konfigurasikan Server Percona


Dimulai dengan Percona Server 5.5.29, Anda cukup menambahkan extra_port ke my.cnf , dan saat berikutnya Anda memulai ulang, port akan tersedia dan akan mengharapkan data pada bind_address sama dengan koneksi normal. Jika Anda tidak mengonfigurasi variabel extra_port , secara default tidak akan ada port tambahan.


Anda juga dapat mendefinisikan extra_max_connections untuk menentukan jumlah koneksi yang akan ditangani port ini. Angka standarnya adalah 1.


Misalnya, saya mengambil semua koneksi ke port pengguna biasa dari contoh di mana saya sudah menetapkan extra_port dan extra_max_connections di my.cnf :


hasil


By the way, extra_port dihapus di Percona Server 8.0.14 dan lebih tinggi, karena admin_port dengan fungsi yang sama diimplementasikan di Komunitas MySQL. Jadi edit my.cnf saat memutakhirkan ke Percona Server 8.0.14 atau lebih tinggi jika Anda sudah mendefinisikan extra_port.


Tuning di Komunitas MySQL


Seperti yang saya katakan, ini membutuhkan MySQL 8.0.14, di mana WorkLog 12138 digunakan .


Untuk mengaktifkan antarmuka admin, Anda perlu menentukan admin_addres , yang harus merupakan satu-satunya dan unik (tanpa wildcard) IPv4, IPv6, alamat yang dipetakan IPv4 atau nama host di mana antarmuka admin akan menunggu data dikirimkan. Jika variabel ini tidak ditentukan, antarmuka tidak diaktifkan.


Anda masih dapat menentukan port, tetapi ini tidak perlu. Secara default, ini adalah port 33062 . Jika port ini gratis, nilai ini tidak perlu dikonfigurasi. Jika Anda mengonfigurasi, masukkan kedua variabel di bagian [mysqld] di my.cnf .


Terakhir, Anda dapat mengonfigurasi create_admin_listener_thread (dinonaktifkan secara default), yang membuat utas terpisah untuk menangani koneksi yang masuk. Ini mungkin berguna dalam beberapa situasi.


Perbedaan lain adalah bahwa dokumentasi Oracle mengatakan bahwa:


Jumlah koneksi administratif tidak terbatas.

(Dan kami memiliki nilai default 1). Tidak yakin apa artinya itu, tetapi saya akan berhati-hati untuk tidak sengaja membuat 1 juta koneksi. Mereka, tentu saja, tidak terbatas, tetapi mereka masih mengkonsumsi sumber daya.


Gunakan untuk pemantauan dan pemeriksaan kesehatan


Mudahnya, tidak hanya orang yang dapat menggunakan antarmuka atau port tambahan dalam keadaan darurat ketika kami telah mencapai max_connections . Sistem pemantauan proxy penemuan / penyeimbang muatan / layanan dapat dihubungkan ke sana.


Skrip pemantauan akan dapat mengambil data untuk diagram, sehingga nantinya Anda mengetahui dari mana begitu banyak koneksi berasal. Dan skrip pemeriksaan kesehatan akan melaporkan kondisi server yang memburuk, dan kode tertentu mungkin mengindikasikan bahwa ada banyak koneksi, tetapi server sedang mengelola (yaitu, ia dapat mengetahuinya dan lebih baik menunggu sedikit lebih lama sebelum gagal).


Pastikan untuk menginstal hanya satu koneksi pada satu waktu untuk pemantauan dan pemeriksaan kesehatan, agar tidak menyumbat extra_max_connections di Percona Server dan tidak membuat sejuta utas di MySQL. Artinya, skrip tidak boleh dihubungkan lagi jika permintaan sebelumnya atau koneksi ke database masih aktif.


Berikut adalah contoh yang sama, tetapi dengan MySQL .


Untuk Percona Server 8.0.14 ke atas, prosesnya akan sama seperti untuk Komunitas MySQL.


Tolong! Saya harus masuk, tetapi semua port sibuk!


Jika ini adalah alasan Anda membaca posting ini, gunakan hack gila dengan GDB (jangan tersinggung, Aurimas, itu hanya terlihat berisiko :-D) atau menghentikan instance. Untungnya, sebuah instance hampir selalu dapat diakhiri dengan rapi dengan SIGTERM (-15) dan bukan SIGKILL (-9). Jadi server akan berhenti bersih, dan utas akan memiliki kesempatan untuk menutup secara normal. Cukup ikuti instruksi:


1) Dapatkan PID:


 marcos.albe in ~/ pgrep -x mysqld; 650 

2) Kirim SIGTERM ke PID ini:


 marcos.albe in ~/ kill -15 650; 

3) Periksa di log kesalahan bagaimana shutdown dilakukan. Akan terlihat seperti ini:


 2019-07-11T13:43:28.421244Z 0 [Note] Giving 0 client threads a chance to die gracefully 2019-07-11T13:43:28.521238Z 0 [Note] Shutting down slave threads 2019-07-11T13:43:28.521272Z 0 [Note] Forcefully disconnecting 0 remaining clients 

Ini menandai awal dari proses penyelesaian. Mesin virtual akan selesai ketika Anda melihat baris yang sama:


 2019-07-11T13:43:31.292836Z 0 [Note] /opt/percona_server/5.7.26/bin/mysqld: Shutdown complete 

Source: https://habr.com/ru/post/id468757/


All Articles