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 root@127.0.0.1
untuk root@localhost
jika TCP / IP tidak secara eksplisit diaktifkan. Secara default, mysqld akan memilih jalur paling perlawanan dan terhubung root@127.0.0.1
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.