MySQL innodb değişkeni 'innodb_log_file_size' değişkenini nasıl güvenle değiştirebilirim?


105

Bu yüzden InnoDB'yi ayarlamak için oldukça yeniyim. Tabloları yavaşça (gerektiğinde) MyIsam'dan InnoDB'ye değiştiriyorum. Innodb'da yaklaşık 100 MB'ım var, bu yüzden innodb_buffer_pool_sizedeğişkeni 128 MB'a yükselttim :

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

innodb_log_file_sizeDeğeri değiştirmeye gittiğimde (örneğin, mysql'in innodb yapılandırma sayfasındaki my.cnf) , günlük dosyasının boyutunu tampon boyutunun% 25'ine değiştirecek şekilde yorum yapıyor. Şimdi my.cnf şöyle görünüyor:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Sunucuyu yeniden başlattığımda, şu hatayı alıyorum:

110216 9:48:41 InnoDB: Tampon havuzunun başlatılması, boyut = 128.0M 110216
9:48:41 InnoDB: Tampon havuzunun başlatılması
InnoDB: Hata: log dosyası
. .cnf dosyası 0 33554432 bayt!
110216 9:48:41 [ERROR] Eklentisi 'InnoDB' init işlevi hata verdi.
110216 9:48:41 [ERROR] Plugin 'InnoDB' DEPOLAMA MOTORU olarak kayıt işlemi başarısız oldu.

Öyleyse sorum: Eski log_files silmek güvenli innodb_log_file_sizemidir , yoksa değişkeni değiştirmek için başka bir yöntem var mı?


1
Sadece my.ini içindeki innodb_log_file_size yorum yapın .....

5
hmm, neden varsayılan değerden değiştirmeye çalışırken varsayılan değeri kullanmak için yorum yapmak isteyeyim?
Derek Downey

Evet innodb_log_file_size hattına eserlerini yorumlayarak .. Teşekkürler.
muhammad umar farooq frank

2
@muhammadumarfarooqfrank Tabii ki işe yarıyor - çünkü artık değişkenin değerini değiştirmiyorsunuz, bu yüzden bütün noktayı tartışmak için kullanıyorsunuz. Yorumların azaltılması için bir yol olsaydı.
dr01

Yanıtlar:


83

Evet, mysqld kapatıldıktan sonra günlük dosyasını silmek güvenlidir

Bunun ışığında, aşağıdaki adımları uygulamanız yeterlidir:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Mysqld çalıştırılması baştan yaratacak ib_logfile0veib_logfile1

Bir şans ver !!!

GÜNCELLEME 2011-10-20 16:40 EDT

Günlük Dosyalarını yeniden düzenlemeden önce InnoDB Buffer Pool içindeki tüm verileri temiz bir şekilde sayfalandırır, kapatmadan 1 saat önce bu seçeneği ayarlamalısınız:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Varsayılan olarak, innodb_max_dirty_pages_pct 75 (MySQL 5.5+) veya 90'dır (MySQL 5.5'ten önce). Bunu sıfıra ayarlamak, kirli sayfa sayısını InnoDB Buffer Pool'un% 1'inin altında tutar. Sahne service mysql stopzaten bunu yapar. Ek olarak, bir kapatma işlemi yineleme günlüğünde kalan tüm öğeleri bitirir. Bu seçeneğe devam etmek için sadece / etc / my.cnf dosyasına ekleyin:

[mysqld]
innodb_max_dirty_pages_pct = 0

GÜNCELLEME 2013-04-19 16:16 EDT

Cevabımı innodb_fast_shutdown ile biraz daha güncelleştirdim çünkü mysql'yi yeniden başlatıp bunu yapmak için mysql'i durdurdum. Şimdi, bu bir adım hayati öneme sahiptir çünkü kabul edilmeyen her işlem InnoDB İşlem Günlükleri içinde ve dışında başka hareketli parçalara sahip olabilir ( Bkz. InnoDB Altyapısı ).

Lütfen, innodb_fast_shutdown öğesinin 2 olarak ayarlanmasının , günlükleri de temizleyeceğini, ancak daha fazla hareketli parçanın hala bulunduğunu ve MySQL'in başlangıcında Crash Recovery'de toplandığını unutmayın. 0 ayarı en iyisidir.


1
Güzel cevap ve güncelleme de harika. Tek önerim, bir şeyler ters gittiğinde ib_log dosyasını başka bir yere kopyalamak olacaktır. Bu, dosyaların nasıl boyutlandırılacağına dair bir fikir edinmenize yardımcı olacaktır: mysqlperformanceblog.com/2011/07/09/…
Justin Noel

5
Benim için çalıştı, BUT: linux konsol UI yanıltıcı olabilir - büyük bir günlük dosyası boyutu (birkaç yüz MB veya daha fazla) ayarlarsanız, mysqld başlatma çok zaman alır. Konsol UI size noktalar gösteriyor ve ardından "başarısız!" Gösteriyor, ancak aslında MySQL hala başlıyor. "Mysqld: bağlantılar için hazır" ifadesini görene kadar günlük dosyasını okumaya devam edin (veya günlük dosyasını "tail -f [log-file]" ile izleyin). ve her iki günlük dosyası diskte ayrılır.
f055

2
UYARI!! adim 3 benim için işe yaramadı ve InnoDB olmadan mysql yüklenirken gördüm kalbim neredeyse durdu, mysql durdurmak ve bunları el ile kaldırmak ve tekrar MySQL başlatmak zorunda kaldı. iki tavsiyede
bulunma

2
Peeyush doğru. MySQL belgeleri bile, bir şeyler ters gittiğinde günlük dosyalarınızı yedeklemenizi önerir
Greg

1
@Greg bu yüzden kullanıyorum SET GLOBAL innodb_fast_shutdown = 0;. MySQL kapandığında, yinelenen kayıtlar (ib_logfile0 ve ib_logfile1) de dahil olmak üzere tüm hareketli parçalardan işlem gerçekleştirilir. Biri onları tutabilir. Tamamen temizlenmiş tomruklarla ilgili sorunlara henüz rastlamadım.
RolandoMySQLDBA

31

Bunun yerine rahatlık için burada çoğaltacağım resmi yöntemi tavsiye ederim :

MySQL 5.6.7 veya önceki sürümlerde InnoDB günlük dosyalarının sayısını veya boyutunu değiştirmek için aşağıdaki yönergeleri kullanın. Kullanılacak prosedür, sistem tablo alanını kapatma işleminden önce tamamen güncelleyip güncellemeyeceğini belirleyen innodb_fast_shutdown değerine bağlıdır:

  • İnnodb_fast_shutdown 2 olarak ayarlanmamışsa: MySQL sunucusunu durdurun ve yineleme günlüğünde bekleyen işlemler için bilgi bulunmadığından emin olmak için hatasız kapandığından emin olun. Kapatma işlemi sırasında bir şeyler ters gittiğinde ve masa alanını kurtarmak için ihtiyaç duyduğunuzda, eski yineleme günlük dosyalarını güvenli bir yere kopyalayın. Eski günlük dosyalarını günlük dosyası dizininden silin, günlük dosyası yapılandırmasını değiştirmek için my.cnf dosyasını düzenleyin ve MySQL sunucusunu yeniden başlatın. mysqld, başlangıçta hiçbir InnoDB günlük dosyasının bulunmadığını fark eder ve yenilerini oluşturur.

  • İnnodb_fast_shutdown, 2 olarak ayarlandıysa: innodb_fast_shutdown değerini 1 olarak ayarlayın:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Ardından önceki öğedeki talimatları izleyin.

MySQL 5.6.8'den itibaren innodb_fast_shutdown ayarı, InnoDB günlük dosyalarının sayısını veya boyutunu değiştirirken artık geçerli değildir. Ek olarak, eski günlük dosyalarını yedeklemeniz gerekmemektedir, ancak eski günlük dosyalarını yedek olarak güvenli bir yere kopyalamak isteyebilirsiniz. InnoDB günlük dosyalarının sayısını veya boyutunu değiştirmek için aşağıdaki adımları izleyin:

  1. MySQL sunucusunu durdurun ve hatasız bir şekilde kapandığından emin olun.

  2. Günlük dosyası yapılandırmasını değiştirmek için my.cnf dosyasını düzenleyin. Günlük dosyasının boyutunu değiştirmek için innodb_log_file_size öğesini yapılandırın. Günlük dosyalarının sayısını artırmak için innodb_log_files_in_group öğesini yapılandırın.

  3. MySQL sunucusunu tekrar başlatın.

InnoDB, innodb_log_file_size öğesinin yineleme günlüğü dosyasının boyutundan farklı olduğunu tespit ederse, bir günlük denetim noktası yazar, eski günlük dosyalarını kapatır ve kaldırır, istenen boyutta yeni günlük dosyaları oluşturur ve yeni günlük dosyalarını açar.


Bu, bu sorunun bir güncellemesi olarak iyi bir cevap. +1 !!!
RolandoMySQLDBA

2
Bu bir "güncelleme" değildir. Bu manuel sayfalar uzun zamandır var. Tekerleği yeniden icat etmek ve bilgiyi kopyalamak yerine (DBA'nın en çok nefret ettiği şey), el kitabından ilk elden bilgileri (oradaki en iyi el kitaplarından biri) öneririm.
RandomSeed

Bu, MySQL 5.6 olarak tercih edilen yöntemdir. Hala 5.6'dan önceki bir sürümde çalışıyorsanız, bu işe yaramaz.
Derek Downey

20

innodb_buffer_pool_size- sadece change my.cnf( my.ini) ve mysqld'i yeniden başlatın.

innodb_log_file_sizedaha az kritik. Bir sebep olmadıkça değiştirmeyin. Roland adımları attı , ancak bir yönü beni endişelendiriyor ... İlk iki adımın önemli olup olmadığını bilmiyorum; onlar olabilir gibi görünüyor:

  1. set innodb_fast_shutdown = OFF
  2. MySQL'i yeniden başlat
  3. mysql durdur
  4. günlük dosyalarını kaldır
  5. mysql başlat

Günlük dosyaları bitmemiş işleri takip eder; " innodb_fast_shutdown" yeniden başlattıktan sonra bu şeylerle başa çıkmak için diyor . Yani dosyaları kaldırmak bilgi kaybedebilir?

Yeni sürümler işleri geliştirdi: (Yorumlar bölümünde daha fazla tartışma)

  • 5.6 innodb_log_file_size> 4GB için izin verir
  • 5.6 innodb_log_file_sizeilk önce iblog'u çıkarmadan değiştirilebilir *
  • 5.7 dinamik olarak yeniden boyutlandırmaya izin verir innodb_buffer_pool_size

Log_file_size değiştirmeli miyim?

GLOBAL STATUSGünlük çevrimlerinden önceki dakika sayısını hesaplamak için kullanın .

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

60 dakikadan (dakika) çok daha düşükse, log_file_size değerini arttırmaya yardımcı olabilir. Çok daha fazlaysa, günlük dosyaları disk alanını boşa harcar. Bu "1 saat" oldukça keyfi, bu nedenle eğer yakınsanız, log_file_size değerini değiştirmeyin.

innodb_log_files_in_groupVarsayılan 2'de bırakın .


+1 endişeniz dokümanlar
Jack Douglas

Bu cevaba bir göz attım ve ilk sırayı beğendim. Müşterilerime genellikle --skip-networkingson dakika değişikliklerini önleme yönünde bir önlem olarak MySQL'i aşağı indirdiler . İlk satırınız (set innodb_fast_shutdown = OFF) bunu ortadan kaldırır. +1 !!!
RolandoMySQLDBA

1
Olumlu oy için teşekkürler. Yeni okuyucuların buna ihtiyacı olmayabilir. In 5.6.8 , innodb_log_file_sizeiblog dosyaları çıkarmadan değiştirmeyi sağlamak için geliştirilmiştir.
Rick James

Dis yani "daha az kritik" değil "daha kritik" mi demek istiyorsun?
Igor

@Igor - Hayır. Log_file_size çok küçükse, içinden geçen fazladan G / Ç olacaktır. Bunu nadiren görüyorum. Eğer çok büyükse, sadece disk alanını boşa harcıyorsun. Ayarlamadaki amaç bir saat içinde geçiş yapmak. Fakat 10 dakikaya karşı 10 saat - ikisi de önemli değil. daha fazla ...
Rick James

1

Mysql'de oturum açtığınızda şu komutları yazın:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

İki sayı alacaksınız. Önce bir tane alırsın, sonra bir dakika beklersin. Başka bir tane alacaksın.

İlki 3.456.718.123 ve ikincisi 4.098.873.134

Şimdi (4.098.873.134-3.856.718.123) * 60/1024/1024

Sonuç = 13.856 MB

İki günlük dosyanız var. Bu yüzden ikie bölün ve 7.000 MB civarında bir sayı elde edersiniz. Emin olmak için, log dosya büyüklüğünüzü 8GB olarak ayarlayın.


1
(En azından benim için) bunun aslında soruyu yanıtladığı belli değil. Bu, günlük dosyasının boyutunu nasıl güvenli bir şekilde değiştireceğinizi değil, günlük dosyasının alternatif bir boyutu için bir öneri gibi görünüyor .
RDFozz

1
@RDFozz haklısın. Bu, günlük dosyasının boyutunu nasıl değiştireceğinizi cevaplamaz. Bu soru, innodb_log_file_size değerini belirleyen sayıyı bulma yolunda nasıl bir cevap verir. Zaten (alt pozisyon Bkz beş yıl önce böyle bir soru cevap Log File Sizehalinde dba.stackexchange.com/questions/23189/... )
RolandoMySQLDBA

Sadece yardım etmek istedim: / bunun kesin bir cevap olmadığını biliyorum.
Linux Newbie,

-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql ve& cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || hizmet mysql yeniden başlatma

Deneyin, çalışmayı garanti edin [Debian 6'da test edildi]


2
Bu, temiz bir kapanmayı garanti etmez. Yalnızca hafif yük olan bir sunucuda ortalama durumda çalışabilir, ancak veritabanı bütünlüğünü önemsiyorsanız önerilmez.
Emil Vikström
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.