İnnodb_flush_log_at_trx_commit olarak dinamik değişiklik


11

Bu, bu soru ile ilgilidir . InnoDB tabloları için daha iyi performans elde edilmesine yardımcı olur.

Göre MySQL kılavuzunda , innodb_flush_log_at_trx_commitküresel dinamik bir değişkendir. Böylece, SET GLOBAL komutunu kullanarak değiştirebilirim ve çalışıyor gibi görünüyor.

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

Ancak, gerçek MySQL ayarını değiştirmedi. My.cnf dosyasını güncellediğimde ve MySQL sunucusunu yeniden başlattığımda işe yaradı. Peki, global değişkeni çalışma zamanında değiştiremiyorum?

Ben varsayılan değeri tercih innodb_flush_log_at_trx_commit=1, ama daha hızlı almak için büyük bir veritabanı için bir geri yükleme işlemi çalıştırmadan önce 2 olarak değiştirmek gerekir. Ancak işlem tamamlandığında, değeri 1 olarak değiştirmek istiyorum. Çalışma zamanında bunu yapmak mümkün müdür?

Paylaşılan barındırma sunucumdaki my.cnf dosyasına erişimim yok .

Yanıtlar:


12

Rolando'nun değişiklik önerisine katılırken innodb_flush_method, ne demek istediğini% 100 net değildim:

gerçek MySQL ayarını değiştirmedi

Ben işaret etmek istiyorum ihtar KÜRESEL değişkene bir değişiklik yaparak yeni bağlantıları etkiler, ancak mevcut oturumu (vurgu benim) modifiye etmediğini:

Genel değişken değişikliği, o anda bağlı olan herhangi bir istemci için oturum değişkenini etkilemez ( SET GLOBAL deyimini yayınlayan istemcinin bile ).

Bunu kontrol etmek için:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
Bu cevap mantıklı. Dokümantasyon ( dev.mysql.com/doc/refman/5.5/en/… ) oturum seviyesindeki değişkenin sadece global seviyede değiştirilebileceğini söylemez. Ben max_connections ile defalarca değişen SET GLOBAL max_connections = 1000;ve ben SHOW VARIABLES LIKE 'max_connections';eski değeri görmek için çalıştığımda ben çıkış ve tekrar giriş kadar ortalama fındık sürücü olacağını deneyimli .
RolandoMySQLDBA

@Rolando beni de! Ayrıca, 'bağlanabileceğimi' bulduğumda memnun oldum; oturumu kapatmak ve yeniden girmek yerine. Zaman kazandırır!
Derek Downey

Bu koşu kavramı connectMySQL'de benim için yeni. Bunu PostgreSQL ve Oracle'da milyonlarca kez yaptım. Bir zamanlar MySQL'in buna izin vermediğini hiç düşünmemiştim
RolandoMySQLDBA

@Dest, Cevabınız için teşekkürler. Derin testime göre, dinamik olarak çalıştı. Yerel ana bilgisayarımda, oturum değişkeni connect çalıştırılmadan değiştirildi (sorun olduğunda hata aldım connect). 2 değeriyle, 2.241.319 kaydı içe aktarma 27 dakika 43 saniye sürdü, oysa 1 değeriyle yaklaşık 1 gün sürdü. Ayar geçerli oturumda çalışıyor gibi görünüyor, ancak my.cnfyeniden başlatıldıktan sonra orijinal ayarı (itibaren ) geri yükledi .
Sithu

@DerekDowney, Bu sadece belirli ayarlar için innodb_flush_log_at_trx_commitmi? Yoksa tüm ayarlar için, globalgeçerli oturumu ayarlamak geçerli oturumu etkilemez mi?
Pacerier

7

İnnodb_flush_log_at_trx_commit ayarlayarak , mysqld / OS birlikte çalışabilirliği ile karışıklık riskiyle karşı karşıya kalırsınız . Bunu söylüyorum çünkü işletim sistemine sifonu yapmak için güveniliyor.

MySQL Belgelerindeki uyarıya dikkat edin

Birçok işletim sistemi ve bazı disk donanımı, diskten diske işlemi kandırır. MySQL'e, olmasa da, floşun gerçekleştiğini söyleyebilirler. O zaman ayar 1 ile bile işlemlerin dayanıklılığı garanti edilmez ve en kötü durumda elektrik kesintisi InnoDB veritabanını bile bozabilir. SCSI disk denetleyicisinde veya diskin kendisinde pil destekli bir disk önbelleği kullanmak, dosyanın temizlenmesini hızlandırır ve işlemi daha güvenli hale getirir. Disk önbelleklerinde disk yazma işlemlerinin önbelleğe alınmasını devre dışı bırakmak için Unix komutu hdparm'ı kullanmayı veya donanım satıcısına özgü başka bir komutu kullanmayı da deneyebilirsiniz.

Bunun söylediği şudur: OS hile yapan bir koca gibi uzanabilir. İşletim sistemi diske akacağını ve bunu yapamayacağını söylüyor. Bu nedenle, innodb_flush_log_at_trx_commit ayarlamış olsanız bile, işletim sistemi diski diskten mysqld'in diski temizlemesinden boşaltmanız gerekir.

Henüz yapmadıysanız innodb_flush_method ayarını O_DIRECT olarak ayarlamayı deneyin . Floş yöntemi farklıdır ölçüde (benim Bkz çünkü bir fark görebilirsiniz Mar 04, 2011sonrası MySQL innodb_flush_method değişkeni Açıklama Yaklaşımı ).

UYARI

Bahsettiğiniz gibi, erişiminiz yok my.cnf. Lütfen sağlayıcınızdan SysAdmin ile iletişime geçin ve innodb_flush_method'un değiştirilmesini sağlayın .

GÜNCELLEME 2012-12-10 12:45 EDT

Şu anda PC'mde MySQL 5.5.12 çalıştırıyorum. Ben bağlayıp çalıştırdığınızda show variables like 'innodb_flush_method';alıyorum

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

Boş olduğundan, yalnızca varsayılan ayarın kullanıldığını gösterir. MySQL innodb_flush_method değişkenindeki Açıklama için lütfen 04 Mar 2011 yazımı okuyun


Önce localhost'umda test ettim. Ben bulamadım innodb_flush_methodiçinde my.ini(değil my.cnf). Sunucu bilgileri - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu

Sunucu sürümü veya ini / cnf ne olursa olsun, yapılandırma dosyasının innodb_flush_methodayarının SHOW VARIABLESolmadığını ve bunu göstermediğini fark ettim.
Sithu

UPDATE'iniz için teşekkürler, ben de anladım, neden değerini göremediğimizi merak ettim. Onu bulamadım my.iniveya my.cnfdinamik bir değişken olmadığından, onu nasıl yapılandırabileceğimden emin değilim.
Sithu
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.