Apakah ada restart yang anggun atau aman untuk mysql seperti untuk apache httpd?

29

Saya ingin memulai ulang mysql dengan anggun seperti httpd di mana utas disajikan sebelum memulai ulang. Saya tidak suka melanggar kueri.

giorgio79
sumber

Jawaban:

37

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_shutdownjika 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 TABLESpernyataan (dengan opsional LOCALkata 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 ...

  • Anda berubah pikiran tentang memulai ulang dan melepaskan kunci secara manual ( UNLOCK TABLES;)
  • Anda me-restart server, atau
  • Anda secara tidak sengaja atau sengaja memutuskan klien jalur perintah dari utas ini (jadi jangan lakukan itu). Tetap terhubung jendela ini dan duduk di prompt mysql:

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 shutdowndiikuti oleh restart manual.

Michael - sqlbot
sumber
Apakah menggunakan innodb_fast_shutdown = 1benar - benar memastikan bahwa MySQL dimulai lebih cepat? Melihat dokumen, tampaknya ini meningkatkan kecepatan shutdown (dengan biaya kecepatan startup?).
Chris
@ Chris idenya adalah membantu memastikan bahwa seluruh shutdown + startup secepat praktis, tetapi agak anekdot karena jumlah pekerjaan yang dilakukan secara teoritis sama - hanya pindah ke sisi lain dari urutan - namun untuk beberapa alasan, secara umum sepertinya selalu lebih cepat secara keseluruhan, seperti mungkin ada beberapa inefisiensi dalam hal ini terjadi pada saat shutdown yang tidak ada pada saat startup. Sulit untuk dikatakan.
Michael - sqlbot
2

Singkatnya, beberapa praktik terbaik yang harus dipertimbangkan sebelum mematikan MySQL adalah:

  1. Konfirmasikan instance yang akan Anda matikan untuk menghindari menghentikan instance lain karena kesalahan.
  2. Hentikan replikasi jika Anda akan mematikan seorang budak mysql> STOP SLAVE;.
  3. Siram halaman yang kotor terlebih dahulu untuk mengurangi waktu shutdown mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;.
  4. Periksa kueri yang sudah berjalan lama mysql> SHOW PROCESSLIST;, bunuh mysql> kill thread_id;atau tunggu sampai selesai.
  5. Buang buffer pool saat shutdown 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!

Perempuan jalang
sumber
Mengapa ini diturunkan? Saya tidak cukup tahu untuk mengenali perintah apa yang buruk, tetapi saya ingin tahu sehingga saya bisa menghindarinya.
Jon
Saya tidak tahu apa pun di atas adalah perintah yang buruk. Saya mengikuti langkah-langkah di atas dan banyak orang melakukannya. Hanya langkah 4 yang harus dengan hati-hati, Anda tidak boleh membunuh permintaan apa pun sampai Anda yakin dengan apa yang Anda lakukan, jika tidak, tunggu sampai kueri yang berjalan lama selesai. Cobalah dan jika itu membantu Anda, perbarui, jika sebaliknya, downvote!
Moll