Jawaban:
Setiap urutan shutdown "yang diminta" dalam MySQL (singkat kill -9
) agak anggun , karena transaksi yang sedang berjalan (pada tabel transaksional) dibatalkan, tetapi di sini ada beberapa cara untuk membuat restart sebersih mungkin.
Catatan: jika Anda mematikan server untuk peningkatan, maka jangan gunakan proses ini; sebagai gantinya, ikuti proses yang dirinci dalam jawaban ini .
Jika tidak, jika Anda hanya me-restart server yang dinyatakan sehat sehingga Anda dapat mengubah variabel global read-only atau yang serupa, berikut ini jalan yang bagus:
Pertama, aktifkan innodb_fast_shutdown
jika belum. Ini tidak secara langsung terkait dengan keanggunan dari shutdown, tetapi seharusnya mengembalikan server Anda lebih cepat.
mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)
Selanjutnya, perintahkan server untuk menutup semua tabel terbuka segera setelah tidak ada permintaan yang sedang berjalan merujuk mereka. Langkah ini juga tidak ada hubungannya dengan shutdown anggun, tetapi itu akan membuat langkah selanjutnya lebih cepat:
mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)
The FLUSH TABLES
pernyataan (dengan opsional LOCAL
kata kunci, yang menghindari flush yang tidak perlu tetapi sebaliknya tidak berbahaya dari setiap budak) akan memblokir dan kemauan prompt tidak kembali sampai semua tabel dapat ditutup. Setelah setiap tabel telah "memerah" (ditutup), jika kueri selanjutnya mereferensikan tabel, itu akan dibuka kembali secara otomatis, tetapi tidak apa-apa. Apa yang kami capai dengan langkah ini adalah membuat lebih sedikit pekerjaan untuk langkah terakhir:
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)
mysql>
Pernyataan ini membersihkan semua tabel (karenanya keuntungan mendapatkan beberapa dari itu dengan cara yang tidak terlalu mengganggu dengan langkah sebelumnya) dan memperoleh kunci read-only global (di seluruh server).
Anda tidak dapat memiliki kunci baca global sampai setiap permintaan "tulis" yang sedang berjalan (yaitu, tetapi hampir semuanya SELECT
) dilakukan. Mengeluarkan permintaan kunci akan memungkinkan kueri yang ada selesai tetapi tidak mengizinkan yang baru untuk memulai.
Prompt Anda tidak kembali sampai Anda memegang kunci global ini, jadi setiap permintaan yang sedang berlangsung ketika Anda meminta kunci dapat selesai, dan Anda tahu mereka selesai, karena Anda mendapatkan prompt kembali. Setiap pertanyaan berikutnya yang mencoba menulis apa pun ke meja apa pun hanya akan berhenti, tidak mengubah data, menunggu kunci tanpa batas, sampai ...
UNLOCK TABLES;
)Tahan godaan untuk menutup ini.
mysql>
Prompt ini menganggur siaga adalah apa yang memegang kunci global untuk Anda. Kalah ini, kehilangan kunci.
Dari jendela konsol lain, mulai ulang MySQL seperti biasanya, baik dengan skrip init (mis., Varian lokal Anda service mysql.server restart
) atau dengan mysqladmin shutdown
diikuti oleh restart manual.
Singkatnya, beberapa praktik terbaik yang harus dipertimbangkan sebelum mematikan MySQL adalah:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, bunuh mysql> kill thread_id;
atau tunggu sampai selesai.mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;
dan muat ulang saat startup
# vi /etc/my.cnf
innodb_buffer_pool_load_at_startup = ON
untuk memanaskan pool buffer.Kemudian setelah mengkonfirmasi poin sebelumnya, Anda dapat me-restart MySQL dengan aman shell$ service mysql restart
Untuk lebih jelasnya, lihat posting saya Periksa ini sebelum mematikan MySQL!
innodb_fast_shutdown = 1
benar - benar memastikan bahwa MySQL dimulai lebih cepat? Melihat dokumen, tampaknya ini meningkatkan kecepatan shutdown (dengan biaya kecepatan startup?).