Cara paling licin untuk mematikan mysql saat itu adalah menjalankannya
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Inilah alasannya:
File layanan mysql ( /etc/init.d/mysql
) bergantung pada keberadaan file socket. Secara historis, akan kembali ke MySQL 4.0, file socket kadang-kadang menghilang secara tidak dapat dijelaskan. Ini menghambat standar service mysql stop
untuk bekerja.
Itu tidak cukup untuk mengatakan
mysqladmin -uroot -p -h127.0.0.1 shutdown
karena mysqld akan rute pengguna yang datang sebagai [email protected]
untuk root@localhost
jika TCP / IP tidak secara eksplisit diaktifkan. Secara default, mysqld akan memilih jalur paling perlawanan dan terhubung [email protected]
ke root@localhost
melalui file socket. Namun, jika tidak ada file socket, root@localhost
tidak akan pernah terhubung.
Bahkan Dokumentasi MySQL di mysqladmin mengatakan ini:
Jika Anda mengeksekusi shutdown mysqladmin ketika menghubungkan ke server lokal menggunakan file socket Unix, mysqladmin menunggu sampai file ID proses server telah dihapus, untuk memastikan bahwa server telah berhenti dengan benar.
Itulah mengapa sangat penting untuk mengaktifkan TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Kembali pada 30 September 2011, saya menulis versi saya sendiri yang mysqld_multi
disebut mysqlservice
(Lihat posting saya: Menjalankan beberapa instance pada host yang sama ). Ini berfungsi sebagai mesin virtual untuk menghubungkan ke mysqld dari port yang berbeda. Anda hanya perlu membawa my.cnf
parameter Anda sendiri dengan parameter khusus. Dalam skrip itu, saya mengeluarkan shutdown seperti ini:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
Tapi apa itu ${MYSQLD_STOP}
?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Harap perhatikan saya menggunakan 127.0.0.1
dan port eksplisit. Dengan begitu, saya tidak mengandalkan file socket.
Saya selalu menggunakan mysqladmin --protocol=tcp shtudown
sebagai alternatif yang tepat untuk mematikan mysql jika service mysql stop
hang. Melakukan kill -9
pada mysqld
dan mysqld_safe
harus yang terakhir yang terakhir resor terakhir. (Ya, saya katakan tiga kali terakhir).
Banyak kali, mysqld telah menghapus mysql.sock tanpa peringatan. Orang lain juga mengalami masalah ini selama bertahun-tahun:
EPILOG
Rahasianya sama seperti yang saya nyatakan: Hubungkan ke mysql menggunakan mysqladmin melalui TCP / IP ( --protocol=tcp
) dan masalah shutdown
. Ini harus berfungsi karena hak istimewa shutdown adalah mysql.user
untuk tujuan eksklusif shutdown terotentikasi. Ini telah menyelamatkan hari kerja saya beberapa kali ketika saya dapat mengeluarkan shutdown jarak jauh dari mesin Windows saya ketika mematikan mysqld pada server Linux.
UPDATE 2013-03-06 22:48 EST
Jika Anda khawatir tentang apa yang terjadi selama shutdown, ada cara untuk memanipulasi waktu shutdown dan cara data dibilas ke disk, terutama jika Anda memiliki banyak data InnoDB di Buffer Pool
SARAN # 1
Jika Anda memiliki banyak halaman kotor, Anda dapat menurunkan innodb_max_dirty_pages_pct menjadi 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Atur ini sekitar 15-30 menit sebelum dimatikan. Ini akan memberikan mysqld jumlah halaman kotor paling tidak mungkin untuk ditulis ke disk.
SARAN # 2
Secara default, innodb_fast_shutdown adalah 1. Ada tiga nilai untuk opsi ini
- 0: InnoDB melakukan shutdown yang lambat, pembersihan penuh, dan penyangga buffer bergabung sebelum dimatikan.
- 1: InnoDB melewatkan operasi ini pada saat shutdown, sebuah proses yang dikenal sebagai shutdown cepat.
- 2: InnoDB membersihkan log-nya dan mati dingin, seolah-olah MySQL telah crash; tidak ada transaksi berkomitmen yang hilang, tetapi operasi pemulihan kerusakan membuat startup berikutnya lebih lama.
Dokumentasi lebih lanjut mengatakan ini:
Shutdown yang lambat bisa memakan waktu beberapa menit, atau bahkan berjam-jam dalam kasus ekstrim di mana sejumlah besar data masih buffer. Gunakan teknik shutdown lambat sebelum memutakhirkan atau menurunkan versi antara rilis utama MySQL, sehingga semua file data dipersiapkan sepenuhnya jika proses upgrade memperbarui format file.
Gunakan innodb_fast_shutdown = 2 dalam situasi darurat atau pemecahan masalah, untuk mendapatkan shutdown tercepat mutlak jika data beresiko korupsi.
Default untuk innodb_max_dirty_pages_pct dan innodb_fast_shutdown seharusnya baik-baik saja dalam kebanyakan kasus.
tmpwatch
menghapusnya, bersama dengan segala sesuatu/tmp
yang memiliki atime lebih lama dari ambang yang dikonfigurasi.mysql.user
untuk mengatasi sakit kepala seperti ini.mysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown
... file itu berisi kredensial untuk akun MySQL seperti root.Kedengarannya pertanyaan Anda kurang tentang "bagaimana" mematikan MySQL dan lebih banyak tentang mengapa Anda dimatikan dengan sangat lambat.
Dalam jawaban saya untuk pertanyaan serupa , saya menawarkan beberapa saran untuk memulai kembali dengan lancar, yang membantu dengan mengurangi jumlah aktivitas yang harus terjadi setelah Anda meminta agar MySQL memulai proses penutupan .
Jika Anda bukan pengguna yang sering
SHOW FULL PROCESSLIST;
menggunakan item # 1 itu, karena Anda perlu mengetahui apa yang terjadi di server Anda, ini membuat shutdown menjadi sangat lambat. Jika ada permintaan yang berjalan lama yang aman untuk diinterupsi, Anda dapat membunuhnyaKILL <thread-id>
.Mengembalikan saran lainnya:
Mengatur variabel global
innodb_fast_shutdown = 1
(default) akan mempercepat bagian InnoDB dari shutdown. Ini hanya aman, namun, jika Anda mematikan server karena alasan yang tidak terkait dengan melakukan peningkatan. Jika Anda dimatikan untuk peningkatan, ini harus diatur ke 0.Menggunakan dengan
FLUSH TABLES;
anggun menutup semua tabel terbuka. Mereka akan dibuka kembali jika direferensikan oleh pertanyaan berikutnya, tetapi tindakan ini harus tetap pada akhirnya mengurangi waktu yang berlalu antara saat Anda meminta shutdown dan waktu shutdown selesai, karena melakukan beberapa pembersihan awal dan lebih penting lagi mengatur panggung untuk langkah terakhir ...FLUSH TABLES WITH READ LOCK;
menutup semua tabel terbuka dan mendapatkan kunci eksklusif yang dimiliki oleh koneksi klien Anda saat ini yang mencegah koneksi lain dari menulis ke tabel apa pun di seluruh server. Anda tidak akan mendapatkanmysql>
konfirmasi kembali sampai Anda memiliki kunci ini, pada titik mana Anda dapat mengeluarkan permintaan penutupan - tetapi jangan terputus dari sesi ini.Pada server yang sibuk, langkah-langkah ini harus mengurangi tingkat aktivitas di server, harus membuat segalanya lebih tenang, dan harus membantu membuat shutdown atau restart berjalan lebih lancar.
sumber
Kemungkinan MySQL tidak dikunci sepenuhnya, tetapi sedang melakukan aktivitas pembersihan (rollbacks, dll.) Saat dimatikan. Jika Anda tidak membiarkannya melakukan semua itu saat mematikan, seringkali Anda harus menunggu saat memulai.
Berikut ini sesuatu untuk dilihat: Matikan mysql di satu jendela terminal sambil menonton log kesalahan (tail -f [yourerror.log]) di jendela terminal lain. Log kesalahan akan menunjukkan kepada Anda apa yang sedang dilakukan MySQL.
sumber
Saya menyesal mendengar tentang pengalaman Anda dan berharap pengalaman saya dengan skenario MySQL yang konyol, mirip dengan ini, dapat membantu Anda.
Alih-alih mencoba mencari cara untuk mematikan layanan MySQL dari server, dalam beberapa kasus, Anda perlu memeriksa kesehatan sistem Anda melalui yang berikut untuk menentukan apakah ada penyalahgunaan layanan ( asumsi didasarkan pada gagasan untuk Lingkungan CentOS / RHEL ):
Gunakan yang berikut ini untuk mengidentifikasi beban sistem rata-rata dan sumber daya yang paling banyak dikonsumsi dalam sistem.
Anda juga perlu menginstal
mytop
untuk mendapatkan tampilan keseluruhan pada pernyataan SQL yang sedang diproses oleh sistem.Untuk menginstal
mytop
, cukup lakukan hal berikut:(gunakan editor teks apa saja yang Anda sukai)
Cari untuk
"long|!" => \$config{long_nums}
,Komentari sebagai
#"long|!" => \$config{long_nums}
,Dan Anda baik untuk pergi dengan mytop . Gunakan untuk memeriksa pernyataan MySQL yang memonopoli layanan MySQL Anda dan menghentikannya.
Eksekusi instruksi di atas akan memberi Anda kemampuan berikut:
Setelah Anda menghilangkan penyebab kemacetan, Anda harus memiliki hari yang lebih mudah ketika Anda mencoba untuk me-restart layanan MySQL. Saya harap Anda akan menemukan informasi di atas bermanfaat.
Catatan:
mytop
kuno dan tidak terawat. Anda mungkin harus menggunakaninnotop
sistem modern.sumber
Implementasi standar dari init-script MySQL memberi sinyal MySQL dengan SIGTERM dan menunggu sejumlah waktu untuk MySQL dimatikan.
MySQL, setelah menerima SIGTERM, pertama-tama akan berhenti menerima koneksi baru, kemudian menyelesaikan mengeksekusi permintaan apa pun yang masih tertunda (ini bisa memakan waktu cukup lama, tergantung pada beban kerja Anda dan jumlah klien bersamaan), kemudian mulai menyiram data ke disk (ini dapat mengambil waktu yang lama, sekali lagi tergantung pada beban kerja Anda, konfigurasi, memori yang tersedia, dan pilihan mesin penyimpanan). Setelah semua pembilasan data dilakukan, MySQL kemudian akan membatalkan alokasi memori apa pun yang dialokasikan selama tahap inisialisasi (ini juga dapat memakan waktu cukup lama, tergantung pada jumlah memori yang dialokasikan oleh MySQL), tutup semua pegangan file yang masih terbuka, lalu panggil "keluar (0)".
Jika setelah permintaan Anda untuk mematikan MySQL membutuhkan waktu lama untuk dimatikan, sangat mungkin bahwa satu atau lebih tahapan ini membutuhkan waktu lama untuk diselesaikan. Jika Anda punya waktu, saya sangat menyarankan menunggu proses untuk menyelesaikan (ini akan menghindari kehilangan data atau proses pemulihan yang lama ketika Anda memulai contoh database Anda lagi).
Sayangnya tidak ada informasi yang cukup dalam pertanyaan Anda untuk memungkinkan saya menyarankan solusi yang tepat untuk masalah Anda. Saya harap ini membantu memahami masalah ini.
sumber