Nasıl düzgün MySQL öldürmek için?


28

CPANEL yüklü CentOS 64bit ve kullanıyorum:

service mysql stop

Sadece gıdıklama dönemlerine devam eder ve asla durmadığı gibi görünür. Günlüklerde sadece çok fazla yazı gönderir:

130303 17:42:38 [Warning] /usr/sbin/mysqld: Forcing close of thread

Gelen err.logdosyanın, bunlardan bir sürü bakın:

[Warning] /usr/sbin/mysqld: Forcing close of thread

Anında olmuştu. Bunu neden yaptığı ve nasıl düzeltileceği hakkında fikrin var mı?

Şimdi yapmam gerek killall -9 mysqlama daha iyi bir yolu var mı?

Sunucu da çok aktif.

Bu bir yapılandırma sorunu mu? Not ayarlarım çok mu yüksek?

[mysqld]
default-storage-engine=MyISAM
local-infile=0
symbolic-links=0
skip-networking
max_connections = 500
max_user_connections = 20
key_buffer = 512M
myisam_sort_buffer_size = 64M
join_buffer_size = 64M
read_buffer_size = 12M
sort_buffer_size = 12M
read_rnd_buffer_size = 12M
table_cache = 2048
thread_cache_size = 16K
wait_timeout = 30
connect_timeout = 15
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 64M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 64M
query_cache_type = 1
low_priority_updates=1
concurrent_insert=ALWAYS
log-error=/var/log/mysql/error.log
tmpdir=/home/mysqltmp
myisam_repair_threads=4
[mysqld_safe]
open_files_limit = 8192
log-error=/var/log/mysql/error.log

[mysqldump]
quick
max_allowed_packet = 512M

[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

Yanıtlar:


37

Bunu yapmak zaman mysql kapatmanın en kolay yolu

mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown

İşte nedeni:

MySQL hizmet dosyası ( /etc/init.d/mysql), soket dosyasının varlığına dayanır. Tarihsel olarak konuşursak, MySQL 4.0'a geri dönersek, soket dosyası bazen açıklanamayan bir şekilde kaybolur. Bu service mysql stop, çalışmanın bir standardını engellemektedir .

Söylemek yeterli değil

mysqladmin -uroot -p -h127.0.0.1 shutdown

mysqld'nin irade güzergahı nedeniyle gelen bir kullanıcı olarak root@127.0.0.1için root@localhostTCP / IP açıkça etkin değilse. Varsayılan olarak, Mysqld direncinin az yolunu seçecek ve bağlamak root@127.0.0.1için root@localhostsoket dosyası üzerinden. Ancak, soket dosyası yoksa, root@localhostasla bağlanamayacaktır.

MySQL Belgeleri bile mysqladmin hakkında şunları söylüyor:

Bir Unix soket dosyası kullanarak yerel bir sunucuya bağlanırken mysqladmin kapatma işlemini gerçekleştirirseniz, sunucunun düzgün durduğundan emin olmak için mysqladmin, sunucunun işlem kimliği dosyası kaldırılıncaya kadar bekler.

Bu nedenle TCP / IP'yi etkinleştirmek zorunludur:

mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown

Geri Eylül 30, 2011 tarihinde, ben benim kendi versiyonunu senaryolu mysqld_multidenilen mysqlservice(: Gönderimimi bakınız aynı ana bilgisayarda birden çok örneği Running ). Farklı portlardan mysqld'e bağlanmak için sanal bir motor görevi görür. my.cnfÖzel parametrelerle kendinize getirmek zorundasınız . Bu komut dosyasında, şu şekilde kapanmalar yapıyorum:

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
}

Fakat nedir ${MYSQLD_STOP}?

MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"

Lütfen kullandığımı 127.0.0.1ve açık bir bağlantı noktası olduğuna dikkat edin. Bu şekilde, bir soket dosyasına güvenmiyorum.

Her zaman takılırsa mysqladmin --protocol=tcp shtudown, mysql kapanmalarına uygun bir alternatif olarak kullandım service mysql stop. Yapma kill -9üzerinde mysqldve mysqld_safeson tatil sonuncusunun gerektiği son. (Evet, son üç kez söyledim).

Çoğu zaman, mysqld mysql.sock u uyarmadan siler. Diğer insanlar da bu sorunu yıllar içinde yaşadı:

SONSÖZ

Sırrı tam da söylediğim gibi: TCP / IP ( ) yoluyla mysqladmin kullanarak mysql'e bağlanın --protocol=tcpve sorun shutdown. Bunun çalışması gerekiyor çünkü kapatma ayrıcalığı , mysql.userkimliği doğrulanmış kapatmalar için özel bir amaç için var. İş günlerimi birkaç kez Linux sunucumda mysqld'ünü kapatırken Windows makinemden uzaktan kapatma işlemi yapabildiğimde tasarruf sağladı.

GÜNCELLEME 2013-03-06 22:48 EST

Kapatma sırasında neler olup bittiğinden endişeleniyorsanız, özellikle de Tampon Havuzunda InnoDB verileriniz varsa, kapanma süresini ve verilerin diske atılma şeklini değiştirmenin bir yolu vardır.

ÖNERİ # 1

Çok fazla kirli sayfanız varsa innodb_max_dirty_pages_pct değerini 0'a indirebilirsiniz :

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Kapatmadan önce yaklaşık 15-30 dakika ayarlayın. Bu, MySQL'e diske yazması en az kirli sayfa miktarını verecektir.

ÖNERİ # 2

Varsayılan olarak, innodb_fast_shutdown 1'dir. Bu seçenek için üç değer vardır

  • 0: InnoDB kapatmadan önce yavaş bir kapatma, tam bir temizleme ve bir ekleme tamponu birleştiriyor.
  • 1: InnoDB bu işlemleri kapatma sırasında atlar; bu işlem hızlı kapatma olarak bilinen bir işlemdir.
  • 2: InnoDB günlüklerini temizliyor ve sanki MySQL düşmüş gibi soğuyor; taahhüt edilen işlemlerin hiçbiri kaybolmaz, ancak kilitlenme kurtarma işlemi bir sonraki başlangıcın daha uzun sürmesini sağlar.

Belgeler ayrıca şunu söylüyor:

Yavaş kapatma, önemli miktarda verinin halen arabelleğe alındığı aşırı durumlarda dakikalar, hatta saatler sürebilir. MySQL ana sürümleri arasında yükseltme yapmadan veya düşürmeden önce yavaş kapatma tekniğini kullanın; böylece yükseltme işleminin dosya biçimini güncellemesi durumunda tüm veri dosyalarının tam olarak hazırlanmasını sağlar.

Veriler bozulma riski taşıyorsa mutlak en hızlı şekilde kapanması için, acil durum veya sorun giderme durumlarında innodb_fast_shutdown = 2 kullanın.

İnnodb_max_dirty_pages_pct ve innodb_fast_shutdown varsayılanları çoğu durumda iyi olmalıdır.


2
Soket dosyası Red Hat türevlerinde kaybolur, çünkü tmpwatchonu siler, içindeki her şeyin /tmpkonfigüre edilmiş eşiğinden daha eski bir atime sahip olmasıyla birlikte siler .
Michael - sqlbot

Teşekkürler, @ Michael-sqlbot Sonunda bunu birinden duymam gerekiyordu. Sanırım bu yüzden MySQL AB’de (Oracle öncesi, Sun öncesi) mysql.userböyle baş ağrılarından kurtulmak için SHUTDOWN ayrıcalıklarını eklemeye karar verdim .
RolandoMySQLDBA 19.03

Debian veya Ubuntu'da mysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown... bu dosya root benzeri MySQL hesabı için bilgiler içeriyor.
0xC0000022L

Her zamanki gibi, @RolandoMySQLDBA, Stack Exchange sitelerinde en iyi DBA kaynaklarından birisiniz. Burada 6 + yıl sonra bana yardımcı oldu harika bir iş.
JakeGould

5

Sorunuz MySQL'in kapatılması "nasıl" hakkında daha az ve sizinkilerin neden bu kadar yavaş kapatıldığı hakkında daha fazla.

Gelen benzer bir soruya cevabım , ben düzgün bir yeniden başlatma, MySQL başlaması istedikten sonra gerçekleşmesi gereken aktivitenin miktarını azaltarak yardım bazı öneriler sundu kapatma işlemini .

Eğer SHOW FULL PROCESSLIST;bu 1 numaralı öğenin sık kullanıcısı değilseniz, sunucunuzda ne olup bittiğini yavaşlatan bir şeyler olup olmadığına dair bir fikriniz olması gerekir. Kesilmesi güvenli olan uzun süredir devam eden sorgular varsa, onları öldürebilirsiniz KILL <thread-id>.

Diğer önerileri geri almak:

Genel değişkeni ayarlamak innodb_fast_shutdown = 1(varsayılan) InnoDB'nin kapanma bölümünü hızlandırır. Bu sadece size yükseltmesini yapmadan ilgisiz nedenlerle sunucuyu kapatmadan eğer Ancak, kasa. Bir yükseltme için kapatıyorlar, bu olmalıdır 0'a ayarlanmalıdır.

FLUSH TABLES;İncelikle kullanarak tüm açık masaları kapatır. Daha sonraki sorgular tarafından başvuruda bulunulursa, bunlar yeniden açılacaktır, ancak bu işlem, kapatma işlemini istediğiniz zaman ile kapatma işleminin tamamlandığı zamanı arasında geçen süreyi kısaltacaktır; son adım için ...

FLUSH TABLES WITH READ LOCK;tüm açık masaları kapatır ve mevcut müşteri bağlantınıza ait özel bir kilit elde eder ve bu da başka bir bağlantının tüm sunucudaki herhangi bir masaya yazmasını önler. mysql>Bu kilidini alana kadar isteminizi geri alamazsınız; bu noktada kapatma isteğini düzenleyebilirsiniz - ancak bu oturumun bağlantısını kesmeyin.

Meşgul bir sunucuda, bu adımlar sunucudaki etkinlik düzeyini azaltmalı, işleri daha sessiz hale getirmeli ve kapatma veya yeniden başlatmanın daha sorunsuz ilerlemesine yardımcı olmalıdır.


2

Muhtemelen MySQL tamamen kilitlenmemiş, ancak kapanırken temizlik faaliyetleri (geri alma işlemleri vb.) Yapıyor. Tüm bunları kapatırken yapmasına izin vermezseniz, genellikle başlangıçta beklemeniz gerekir.

İşte dikkat etmeniz gerekenler: Başka bir terminal penceresinde hata günlüğünü (tail -f [yourerror.log]) izlerken bir terminal penceresinde mysql'i kapatın. Hata günlüğü size MySQL'in ne yaptığını gösterecektir.


1

Deneyiminizi duyduğuma üzüldüm ve bunun gibi aptal MySQL senaryolarındaki deneyimimin size yardımcı olabileceğini umuyorum.

MySQL hizmetini sunucudan nasıl öldüreceğinizi bulmak yerine, bazı durumlarda, bir hizmet kötüye olup olmadığını belirlemek için sistem sağlığınızı aşağıdakiler yoluyla kontrol etmeniz gerekir ( varsayımlar, CentOS / RHEL ortamı ):

 /usr/bin/iostat
 /usr/bin/uptime
 top -c

Ortalama sistem yükünü ve sistemdeki en fazla tüketen kaynakları tanımlamak için aşağıdakileri kullanın.

Ayrıca mytop, sistem tarafından işlenen SQL ifadeleri hakkında genel bir fikir edinmek için yüklemeniz gerekir .

Yüklemek mytopiçin aşağıdakileri yapmanız yeterlidir:

 cd /root
 wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
 tar -zxvf /root/mytop-1.6.tar.gz
 cd /root/mytop-1.6
 perl Makefile.pl
 make
 make install
 chmod 644 /usr/local/bin/mytop
 vi /usr/local/bin/mytop 

(tercih ettiğiniz herhangi bir metin düzenleyiciyi kullanın)

Ara "long|!" => \$config{long_nums},

Olarak dışarı Comment #"long|!" => \$config{long_nums},

chmod 555 /usr/local/bin/mytop

Ve sen de en iyilerime gitmek için iyisin . MySQL hizmetinizi bekleten MySQL deyimlerini incelemek ve durdurmak için kullanın.

Yukarıdaki talimatların yerine getirilmesi size aşağıdaki yeteneği sağlayacaktır:

  • Sunucunuzun durumunun / sağlığının teşhisi
  • Darboğaz nedeninin teşhisi

Darboğazın nedenini ortadan kaldırdıktan sonra, MySQL hizmetini yeniden başlatmaya çalışırken daha kolay bir gün geçirmelisiniz. Yukarıdaki bilgileri faydalı bulacağınızı umuyorum.

Not: mytop Eski ve bakımsız. Muhtemelen innotopmodern bir sistemde kullanmalısınız .


0

MySQL'in init-script'inin standart uygulaması MySQL'e SIGTERM ile işaret verir ve MySQL'in kapanması için belirli bir süre bekler.

Bir SIGTERM aldıktan sonra MySQL ilk önce yeni bağlantılar almayı durduracak, daha sonra hala beklemede olan soruları yerine getirmeyi tamamlayacaktır (bu, iş yükünüze ve eşzamanlı istemcilerin sayısına bağlı olarak biraz zaman alabilir), daha sonra verileri diske temizlemeye başlayabilir (bu sürebilir. iş yükünüze, yapılandırmalara, kullanılabilir belleğe ve depolama motoru seçeneklerine bağlı olarak tekrar Tüm veri temizleme işlemi tamamlandıktan sonra, MySQL daha sonra başlatma aşamasında tahsis edilen hafızayı boşaltacaktır (bu, MySQL tarafından ayrılan hafıza miktarına bağlı olarak da biraz zaman alabilir), hala açık olan tüm dosya tutamaçlarını kapatın ve ardından çağrı yapın. "çıkış (0)".

Kapatma isteğinizin ardından MySQL'in kapatılması uzun sürüyorsa, bu aşamalardan birinin veya birkaçının tamamlanması uzun zaman alıyor olabilir. Zamanınız varsa, işlemin tamamlanmasını beklemenizi şiddetle tavsiye ederim (bu, veri tabanı vakanıza yeniden başladığınızda veri kaybını veya uzun kurtarma işlemlerini önleyecektir).

Maalesef, sorunuzda probleminiz için uygun bir çözüm önermeme izin verecek kadar bilgi yok. Umarım bu konunun anlaşılmasına yardımcı olur.

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.