Çalışma zamanında binlog formatını değiştirmenin en güvenli yolu nedir?


25

Aşağıdaki uyarıdan dolayı mysqld.log:

[Uyarı] BINLOG_FORMAT = STATEMENT'den beri deyim biçimini kullanarak ikili günlük defterine yazılmış güvenli olmayan ifade. Bir LIMIT deyimi kullandığı için ifade güvensizdir. Bu güvenli değildir çünkü içerdiği satır kümesi tahmin edilemez.

Çoğaltma biçimini değiştirmek istiyorum MIXED.

Ancak MySQL belgesine göre:

Herhangi bir geçici tablo bulunduğunda çalışma zamanındaki çoğaltma biçimini değiştirmek önerilmez, çünkü geçici tablolar yalnızca ifade tabanlı çoğaltma kullanılırken günlüğe kaydedilir, oysa satır tabanlı çoğaltma ile günlüğe kaydedilmez.

Öyleyse, ikili günlük formatını güvenli bir şekilde değiştirmek için geçici tablolar olup olmadığını nasıl anlayabilirim?


1
Hızlı uyarı. RBR-> SBR'den giderken ve okumaya karar vermişken bunu
Morgan Tocker 13:11

Yanıtlar:


35

Bunu yaptığınız anda bir binlog belirli bir formata sahip olacağı için, MySQL (eh Oracle [hala dilimi açamıyor]) bu özelliği oluşturmuş olmasına rağmen, iki formatla birlikte kumar oynamaya karar verebilirsiniz.

MySQL yeniden başlatmadan tamamen güvenli oynamak için aşağıdakileri deneyin:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Bu son binlog 'MIXED' formatında bırakacaktır. Penultimiate (sonuncusu yanındaki) binlog yalnızca önceki formattaki son binlog'un kapatılmasını sağlar.

FLUSH LOGS;Birinciden önceki mevcut tüm oturumlar bir kez UNLOCK TABLES;çalıştırıldığında son binlogda yazmaya başlar .

Bir şans ver !!!

UYARI

Kredinin verildiği yerde kredi vermek, benim cevabım @ Jonathan'ın cevabını gerçekten engelliyor . Bunun üzerine binlogları kapatıp açıyorum. Önce bunu ortaya çıkardığı için +1 alır.

GÜNCELLEME 2011-10-12 13:58 EDT

Bunu aktif bir Master'a yaparsanız ve bu Master'dan kopyalayan bir veya daha fazla Slave varsa, röle günlüklerinin de yeni formatta olmasından endişe duymanız gerekir. İşte yapabilecekleriniz:

Slave'de koş STOP SLAVE;

Master'da bunları çalıştırın:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Slave'de koş START SLAVE;

Çalıştırma STOP SLAVE;ve START SLAVE;röle günlüğe kaydeder ve yeni girdilerin hangi formatta olursa olsun çoğaltılmasını sağlar. Ayrıca köle de binlog_format değişikliğini uygulamak isteyebilirsiniz.


3
Akılda tutulması gereken bir şey, mysql çoğaltma ayarlarının aslında her bir istemci oturumuna göre ayarlanmış olmasıdır. Genel binlog_format'ın ayarlanması yalnızca YENİ oturumların değerini değiştirir. Bu nedenle, istemcileri sürekli olarak bağlı bir sistemde kullanıyorsanız, ayarlarda yaptığınız değişiklikler burada belirtilen şekilde temizleme ve kilitleme yapsanız bile hemen geçerli olmaz - istemciler bulana kadar etkili olmazlar yeniden bağlanın (veya değeri kendi oturumunda ayarlayın, ancak benim deneyimimde eskisi daha büyüktür).
Austin Mills

Merak edenler için, şunu da ekleyebilirsiniz "binlog_format = 'MIXED';" senin cnf içine.
Hristiyan

2
Bilginize, bu cevap burada bir cevap ile uyuşmuyor
HTTP500

El ile belirtilenler : Bu, bir çoğaltma yöneticisinde günlük biçimini değiştirmenin bir kölenin günlük biçimini eşleşmesi için değiştirmesine neden olmadığı anlamına gelir. Çoğaltma devam ederken usta ikili kayıt formatı değiştirme (.. ..snip), ya da köle üzerine değiştirmeden böylece beklenmedik sonuçlara neden, hatta çoğaltma neden tamamen başarısız olabilir.
Halfgaar

@Halfgaar Geçtiğimiz hafta, bir köleyi MIXED'den STATEMENT 'e üç kez rahatsızlık vermeden değiştirdim. Bunu yapıyordum çünkü çoğaltma bir yarış durumu nedeniyle kopuyordu. Tablo, sorgunun yürütülmesinden önce bir köle üzerinde bulunmuyordu. Böylece, böyle bir durum için istikrarlı duruma geldim. Tabii ki, ben bunu yaparken tüm yazarlar durduruldu. Btw Ben de usta yaptım.
RolandoMySQLDBA

6

Çalışma zamanında binlog_format değiştirmek için şunları yapabilirsiniz:

set global binlog_format = 'MIXED';

Bu, tüm YENİ oturumları karma binlog formatında olacak şekilde ayarlayacaktır. Tüm mevcut oturumlar, sona erene kadar önceden ayarlanmış olan herhangi bir şey olacaktır.

set session binlog_format = 'MIXED';Özel olarak oturum ile ilgili herhangi bir sorunu çözmek için el ile de yapabilirsiniz .


Yolu sormuyorum, en güvenli yolu soruyorum ve geçici bir tablo olup olmadığını nasıl kontrol edebilirim.
27.09.2011

3
İlk önce global değişkeni ayarlamak ve kalan oturumların bitmesini beklemek en güvenli yoldur.
Jonathan,
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.