Slave başlatılırken MySQL hatası 1062 - yinelenen girişe ne sebep olur?


11
  • MySQL Master sürümü: 5.5.16-1
  • MySQL Slave sürümü: 5.5.18-1

Master'ın anlık görüntüsü:

mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql

Bu döküm dosyası, slave'e ( --skip-slave-startseçenekle başlatılan ) hatasız olarak içe aktarılır :

shell> pv dbname_`date +%F`.sql | mysql -u root -p

Ama yürütürken aşağıdaki hatayı aldım mysql> start slave;:

    Last_SQL_Errno: 1062
    Last_SQL_Error: Error 'Duplicate entry '115846' for key
'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO
request_posted (id, user_id, channel, message, link, picture, name, ...

Master'da sadece 115846 numaralı bir kayıt var:

mysql> select count(*) from request_posted where id=115846;
Current database: db

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)

Şununla bazı sorguları atlamaya çalışın:

mysql> STOP SLAVE; 
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE;

yardım etmedi. Bu hataları ekleyerek atlamak istemiyorum:

slave-skip-errors = 1062

my.cnfköle tutarsız olabileceği için dosyalamak.

Bu hatanın nedeni ne olabilir?


GÜNCELLEME

Bu genellikle mySQL çoğaltmasını ayarlamam

Belgeyi takip etmediğimi düşündüğünüz hangi adımlar?

Mysqldump komutunu iletmek yerine tüm yapılandırmayı ayarlayacaksanız aynı sorunla karşılaşıp karşılaşmayacağınızı merak ediyorum.

Hayır, master'ı karşılık gelen koordinatlarla değiştirirsem normal şekilde çalışır.

Ben köle veritabanı bırakarak denemek istiyorsunuz, binlogs açık olduğundan emin olun ve tekrar başlayın. Ayrıca, dizinlerde hata olmadığından emin olmak için ana tablodaki söz konusu tabloyu kontrol edin.

Tüm veri dizinini silme (taşıma) yeterli mi? Bunu yaptım ve aynı sonucu elde ettim.


@Dmytro Leonenko için yanıt

düzgün yapılandırıldığından emin olmak için slave'de 'slave durumunu göster \ G', MASTER_LOG_POS 0

Yalnızca 'içe aktarma işleminden sonra' köle statüsü göster \ G 'ancak' köle başlat '; bize cevap verebilir

Datadir'i yedekledim, hepsini sildim ve çalıştırdım mysql_install_db, döküm dosyasını içe aktarın, yürütün change master tove sonuçlar burada:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: x.x.x.x
                  Master_User: xx
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 106
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)

Master_Log_Pos'un neden 4 olduğunu merak ediyorum?


1
Bu kimliğe sahip yalnızca bir kayıt olabilir, bu nedenle hata, asla yazılmaz. Verdiğinizde SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1Hataya neden olan sorgu en azından değişiyor mu? Bağımlı binlog konumu doğru ayarlandı mı?
incele

Sayacı her atladığımda, başka bir kimliğe dönüşür. --master-dataSeçenek zaten döküm dosyasına ikili günlük koordinatları yazma. Sadece master_host, master_user, master_password olarak değiştirmem gerekiyor.
quanta

Bu genellikle mySQL çoğaltma kurulum değil (Ben genellikle burada URL başına çoğaltma kurulum: dev.mysql.com/doc/refman/5.0/en/replication-howto.html ) Ancak, mysqldump seçenekleri okumak, hiçbir nedeni yoktur neden işe yaramıyor. Mysqldump komutunu iletmek yerine tüm yapılandırmayı ayarlayacaksanız aynı sorunla karşılaşıp karşılaşmayacağınızı merak ediyorum.
Rilindo

--master-dataVeri anlık görüntüsü oluştururken bu seçeneği kullanmamam gerektiği anlamına mı geliyor ? --lock-all-tablesSeçeneği kullandığımda hala olursa ve change master to master_log_file='', master_log_pos='', ...bunun nedenleri neler olabilir?
quanta

Hayır, ben bunu söylemiyorum. Bahsettiğim gibi, yaptığınız şey amaçlandığı gibi çalışmalıdır - görebildiğim kadarıyla, bu seçenekte mevcut bir hata yoktur. Ancak, bu olmadığı anlamına gelmez, bu yüzden bir izolasyon adımı olarak, mySQL tarafından ilk olarak bu URL aracılığıyla sağlanan kuralı izlerdim. t. Bu işe yararsa, en azından sorun gidermeye başlama yönünüz vardır. Bu olmazsa, farklı bir sorunumuz var. :)
Rilindo

Yanıtlar:


7

Sorununuzu düzeltmek için ne yapmalısınız?

  1. Önce slave üzerindeki master.info dosyasını kaldırmalı ve mysql'yi yeniden başlatmalısınız.
  2. sorunu MASTER TO MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'repl', MASTER_PASSWORD = 'slavepass';
  3. master'da '--flush-logs' seçeneğiyle mysqldump yapın
  4. köle üzerinde 'mysql -u kullanıcı -p <dump.sql'
  5. düzgün yapılandırıldığından emin olmak için slave'de 'slave durumunu göster \ G', MASTER_LOG_POS 0
  6. 'köle başlat;' köle.

Ayrıca kontrol edilmesi gerekenler:

  • Binlog biçimi: KARIŞIK
  • server_ids, master ve slave üzerinde farklı

Tüm değişiklik ana dizesini (günlük adı ve konum numarası dahil) vermek aslında bunu düzeltir, ancak bu noktada temel soru, Quanta'nın zaten döküm dosyası.
Rilindo

Yalnızca 'içe aktarma işleminden sonra' köle statüsü göster \ G ', ancak' köle başlat '; bize cevap verebilir
Dmytro Leonenko

istenen bilgiyi orijinal yazıma ekledi.
quanta

"Master_Host: xxxx Master_User: xx" ile "MASANG CHANGE MASTER ..." komutunu vermeden nasıl sonuçlandınız? Yoksa cevapta bahsetmedin mi? Binlog biçimini kontrol ettiniz ve mysqldump için komut satırı neydi?
Dmytro Leonenko

Zaten yazımdachange master to " döküm dosyasını içe aktar, yürüt " den bahsetmiştim . MIXED tabanlı günlük kullanıyorum. MySQL 5.0.77 (ifade tabanlı) ile test ettim, ayrıca bu hataya neden oluyor. Tam mysqldumpmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
quanta

3

Sorunun nedeni, dökümü yapmadan ÖNCE çalışan bir üretim sunucusunda master ayarlanmasıdır (anlayabildiğim kadarıyla). Bu nedenle, master_log içinde, slave üzerinde bulunan veriler üzerinde yürütülmüş olan sorgular vardır. Aslında mysql web sitesinde veya posta listesinde bir çözüm görmedim. Böylece, sorunumu çözen aşağıdaki çözümü buldum.

köle üzerinde:

mysql> STOP SLAVE;
mysql> FLUSH PRIVILEGES;  # dump likly included users too

master'da:

mysql> RESET MASTER;

köle üzerinde:

mysql> RESET SLAVE;
mysql> START SLAVE;

Bu arada, dökümü köle üzerinde aşağıdakilerle çalıştırdım:

mysqldump -uROOTUSER -pROOTPASSWORD -hMYSQLMASTER.EXAMPLE.COM --all-databases --delete-master-logs | mysql -uROOTUSER -pROOTPASSWORD

Umarım bunun bir başkasına yardımı olur.

http://dev.mysql.com/doc/refman/5.0/en/reset-master.html

http://dev.mysql.com/doc/refman/5.0/en/reset-slave.html


FLUSH PRIVILEGES'i içerecek şekilde düzenlendi; Kullanıcılarımın dökümle içe aktarılmasından sonra bile ayrıcalıklarının henüz aktif olmadığını başka bir hatadan sonra fark ettim.
BroknDodge

RESET MASTER efendide
Jon

1

Tam prosedürü REDO istemiyorsanız, iyi bir düzeltme kullanmak olacaktır

STOP SLAVE;    
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

Böyle çok fazla hata varsa, bunu bir bash betiği kullanarak otomatikleştirmek iyi bir fikir olacaktır.

Ref: Yinelenen Giriş Hatası Düzeltme


1

Ben tam bir sorun vardı ve Ut xd bağlantı yardımcı oldu. ancak bu bağlantıdaki komutun sözdizimi hatası vardı ve işte benim için çalışan sürüm:

while [ 1 ]; do if [ `mysql -uroot -ppassword -e"show slave status \G;" | grep "Duplicate entry" | wc -l` -eq 2 ] ; then mysql -uroot -ppassword -e"stop slave; set global sql_slave_skip_counter=1; start slave;"; fi; sleep 1; mysql -uroot -ppassword -e"show slave status\G"; done

Temel olarak yinelenen giriş hatası olup olmadığını kontrol eder ve bu olayı master'dan atlar. ve bir döngü içinde yapın.


1
Bu kodun ne yaptığını açıklar ve kodu daha okunabilir olacak şekilde biçimlendirirseniz, bu çok daha iyi bir yanıt olacaktır.
kasperd

0

Benim durumumda sorun aşağıdaki komutlarla çözüldü

aşağıdaki adımlarla

STOP SLAVE;
RESET SLAVE;
START SLAVE;
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.