MySQL çoğaltması: 'PRIMARY anahtarı için yinelenen giriş'


9

Tam bir yeniden senkronizasyondan sonra neden bir bağımlı sunucuda 'PRIMARY anahtarı için yinelenen giriş' aldığımı anlamama yardımcı olur musunuz?

Temelde 'mysqldump' neredeyse bütün gece koşuyordu ve daha sonra geri yükleme işlemi birkaç saat sürdü, bu yüzden köle başladığımda ustanın ~ 63874 saniye gerisindeydi.

Slave sunucu salt okunur (salt okunur) ve yeniden eşitleme işlemi sırasında herhangi bir yazma yoktu, bu yüzden neden yinelenen anahtarlar olduğunu anlamıyorum.

İkili kayıt formatı master üzerinde MIXED olarak ayarlanmıştır.

DB yedekleme için kullanılan komut:

mysqldump --opt --single-transaction -Q --master-data=2 db | bzip2 -cz > db.sql.bz2

Slave, master'dan (db -> db_backup) yalnızca bir veritabanını aşağıdaki seçeneklerle çoğaltır:

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

Yanıtlar:


11

GÖRÜNÜM 1: Çoğaltma

Ben öyle düşünmüyorum

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

birbirine ait.

Diğer insanlar da bunu merak etti

Sorun, sipariş çoğaltma kurallarının işlenmesinden kaynaklanıyor. Çoğaltma Kuralları ile ilgili MySQL Belgelerine göre :

Herhangi bir --replicate-rewrite-db seçeneği belirtilmişse, --replicate- * filtreleme kuralları test edilmeden önce uygulanır.

Replicate-rewrite-db ile ilgili MySQL Belgeleri bile şöyle diyor:

Veritabanı adı çevirisi --replicate- * kuralları test edilmeden önce yapılır.

Yeniden replicate-wild-do-tableyazma işleminden sonra uygulanır. Bu siparişin bir şekilde zaten verileri olan bir tabloya bir INSERT koyması şaşırtıcı değildir.

Muhtemelen veriler oraya nasıl geldi?

GÖRÜNÜM 2: mysqldump

Bunu yapmak mysqldump --single-transaction, verilerin zaman içindeki dökümlerini belirlemenin en iyi yolu gibi görünmektedir. Ne yazık ki, mysqldump --single-transactionAşil Topuğu var ALTER TABLE. Bir tablo, mysqldump'ın dökümü yapmaya çalıştığı işlemin bütünlüğünü bozabilecek ALTER TABLEbir DROP TABLEve gibi komutlara maruz kalırsa CREATE TABLE. aynı zamanda yıkıcı da olabilir.

Bununla ilgili daha fazla bilgiyi MySQL Performans Blogunun En iyi saklanan MySQLDump Sırrı'nda bulabilirsiniz . Aslında bu noktayı mysqldump'ın işleminin bütünlüğünü bozabilecek 12 komutu açıklayan geçmiş bir soruda ele aldım: MySQL backup InnoDB

UYARI

SONSÖZ

Yönlerden biri veya her ikisi de, yeniden yazma kuralları veya geçersiz kılınmış mysqldump'ın izolasyonu nedeniyle var olmaması gereken mysqldump sırasında bir satır kaymasına izin vermiş olabilir.

ÖNERİLER

Köle işleyecek tüm INSERT'leri görmek ve bu satırların Köle üzerinde zaten var olup olmadığını görmek için mysqldump başından beri tüm röle günlükleri bir mysqlbinlog dökümü yapmak istiyorum. Eğer yaparlarsa, muhtemelen iki şey yapabilirsiniz:

1: Yinelenen Anahtar hatalarının tümünü atla

Bunu Köle üzerindeki my.cnf dosyasına eklemeniz yeterli

[mysqld]
slave-skip-errors=1062
skip-slave-start

ve mysql'yi yeniden başlatın. O zaman koşSTART SLAVE;

tüm yinelenen anahtar hataları atlanır. Ne zaman Seconds_Behind_Master0'a alır, bu satırları ve yeniden başlatma mysql çıkarın.

2: Percona araçlarını indirin

İhtiyacınız olan araçlar

Slave'deki farklılıkları bulmak için bunları kullanın ve ardından düzeltin


0

Doğrudan slave'e eklenen kodda ekleme sorgusu olup olmadığını kontrol edin. Sadece köleden okuyabiliriz. Yazma sorguları master'a yönlendirilmelidir.


Soruya tekrar bakın. Slave salt okunurdur ve yeniden senkronizasyon sırasında yazma işlemi yoktur.
RolandoMySQLDBA
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.