Apache httpd gibi mysql için zarif veya güvenli bir yeniden başlatma var mı?


29

MySQL'i incelikle yeniden başlatmak istiyorum, tıpkı yeniden başlatmadan önce iş parçacıklarının sunulduğu httpd. Sorguların kırılmasını istemem.

Yanıtlar:


37

MySQL'deki herhangi bir "talep edilen" kapatma dizisi (kısa devre kill -9 ) 'dir biraz zarif (işlemsel tabloları) Devam eden işlemler geri alınır, ama burada mümkün olduğunca temiz bir yeniden başlatma yapmak için birkaç yol olduğundan,.

Not: Yükseltme için sunucuyu kapatıyorsanız, bu işlemi kullanmayın; bunun yerine, işlemi izleyin bu cevapta ayrıntılı olarak .

Aksi takdirde, salt sağlıklı bir sunucuyu yeniden başlatıyorsanız, salt okunur bir genel değişkeni veya benzer bir şeyi değiştirebilmeniz için, işte size zarif bir yol:

İlk önce, innodb_fast_shutdownzaten değilse etkinleştirin . Bu, kapatmanın zarafeti ile doğrudan ilişkili değildir, ancak sunucunuzu daha hızlı geri getirmelidir.

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)

Ardından, sunucuya şu anda çalışan hiçbir sorguya başvurmadığı anda tüm açık tabloları kapatması talimatını verin. Bu adımın ayrıca zarif kapanma ile ilgisi yoktur, ancak sonraki adımı daha hızlı ilerletir:

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

FLUSH TABLES(Opsiyonel ile deyimi LOCALherhangi köle gereksiz zararsız ancak floş önler anahtar kelime,) engeller ve tabloların tamamı kapatılabilir kadar istemi irade döndürmez. Her tablo "temizlendi" (kapalı) olduktan sonra, bir sorgu daha sonra tabloya atıfta bulunursa, otomatik olarak yeniden açılır, ancak sorun olmaz. Bu adımla gerçekleştirdiğimiz şey, son adım için daha az iş yapmak:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

Bu ifade tüm tabloları temizler (bu nedenle bir önceki adımdan daha az bozulmadan çıkarmanın avantajı) ve bunlar üzerinde global (sunucu çapında) salt okunur bir kilit elde eder.

Şu anda çalışan her "yazma" sorgusuna (yani hemen hemen her şey hariç) kadar genel bir okuma kilidine sahip olamazsınız SELECT ) yapılmadan . Kilitleme isteğinin yapılması mevcut sorguların bitmesine izin verecektir, ancak yenilerinin başlamasına izin vermeyecektir.

Edene kadar istemi dönmez sen bu küresel kiliti kilit bitirmek yapabiliyor istediğinde devam her sorgu böylece, ve istemi geri almak çünkü, onlar bitmiş biliyorum. Herhangi bir tabloya herhangi bir şey yazmaya çalışan herhangi bir sorgu, sadece duraklayacak, veri değiştirmeyecek, kilitlenme için süresiz olarak bekleyecektir.

  • yeniden başlatma hakkındaki fikrinizi değiştirir ve kilidi manuel olarak serbest bırakırsınız (UNLOCK TABLES; ).
  • sunucuyu yeniden başlattınız veya
  • yanlışlıkla veya isteyerek komut satırı istemcisini bu iş parçacığından çıkarın (bu yüzden bunu yapmayın). Bu pencereyi bağlı tutun ve mysql komut isteminde oturun:

Bunu kapatmak için günaha karşı.

mysql>

Bu boşta konsol istemi sizin için global kilidi tutan şeydir. Bunu kaybet, kilidi kaybet.

Başka bir konsol penceresinden, MySQL'i normalde yaptığınız gibi, initscripts (örneğin, yerel varyantınızla service mysql.server restart) veya mysqladmin shutdownardından manuel yeniden başlatma ile yeniden başlatın.


Gerçekten kullanmak innodb_fast_shutdown = 1MySQL'in daha hızlı başlamasını sağlıyor mu? Dokümanlara baktığımızda, bu kapatma hızını artırıyor gibi görünüyor (başlangıç ​​hızı pahasına?).
Chris,

@Chris fikri, kapatma + başlatma işleminin mümkün olduğu kadar hızlı olmasını sağlamaya yardımcı olduğu, ancak yapılan işin miktarı teorik olarak aynı olduğu için biraz feci bir durumdur - çünkü dizilimin diğer tarafına taşındı - henüz nedense, genel olarak her zaman daha hızlı gözüküyordu, sanki belki başlangıçta orada olmayan bir kapanışta olduğu gibi bazı verimsizlikler var. Söylemesi zor.
Michael - sqlbot

2

Kısacası, MySQL'in kapatılmasından önce göz önünde bulundurulması gereken en iyi uygulamalardan bazıları şunlardır:

  1. Yanlışlıkla başka bir örneği durdurmaktan kaçınmak için kapatılacağınız örneği onaylayın.
  2. Bir köleyi kapatacaksanız çoğaltmayı durdurun mysql> STOP SLAVE; .
  3. Kapanma süresini azaltmak için kirli sayfaları önceden yıkayın mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0; .
  4. Uzun süredir devam eden sorguları kontrol et mysql> SHOW PROCESSLIST;, öldürmysql> kill thread_id; ya da bitirene kadar bekle.
  5. Arabellek havuzunu kapattıktan sonra boşaltın ve mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;başlangıçta yeniden başlangıç # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ONhavuzunu ısıtmak için yeniden yükleyin .

Ardından önceki noktaları onayladıktan sonra, MySQL’i güvenle başlatabilirsiniz. shell$ service mysql restart

Daha fazla ayrıntı için gönderime bakın MySQL!


Bu neden indirildi? Hangi komutların kötü olduğunu fark edecek kadar bilgim yok, ama bilmek istiyorum ki onlardan kaçınabileyim.
Jon,

Yukarıdakilerin hiçbirinin kötü bir komut olduğunu bilmiyorum. Yukarıdaki adımları takip ediyorum ve birçok insan bunu yapıyor. Yalnızca 4. adım dikkatli olmalı, ne yaptığınızdan emin olmadan hiçbir sorguyu öldürmemelisiniz, aksi halde uzun süre çalışan sorgular bitinceye kadar bekleyin. Bir deneyin ve size yardımcı olduysa, reddedin, aksi takdirde reddedin!
Moll
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.