Relay MySQL v5.1.61 rusak ketika mesin tiba-tiba mati. Saya mencoba memperbaikinya tetapi tidak berhasil.
- Bagaimana saya memperbaikinya? Apakah saya melakukan sesuatu yang salah?
Sejauh yang saya baca, log relay MySQL yang rusak mudah diperbaiki:
change master to master_log_file='<Relay_Master_Log_File>',
master_log_pos=<Exec_Master_Log_Pos>;
di mana Relay_Master_Log_File
dan Exec_Master_Log_Pos
terdaftar oleh:
mysql> show slave status;
Namun ketika saya melakukannya change master status ...
, saya mendapat kesalahan pelanggaran kunci primer. Bagaimana mungkin? Apakah prosedur di atas tidak benar, atau apakah beberapa +1 hilang?
(Untuk saat ini saya baru saja mengimpor ulang mysqldump - master-data dari master ke slave, dan ini menyelesaikan masalah. Namun, di masa depan, melakukan hal itu mungkin tidak sesuai.)
Berikut ini rincian tentang masalah khusus saya:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: the-master-host
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000021
Read_Master_Log_Pos: 33639968
Relay_Log_File: mysql-relay-bin.000271
Relay_Log_Pos: 2031587
Relay_Master_Log_File: mysql-bin.000020
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: the_database
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1594
Last_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Skip_Counter: 0
Exec_Master_Log_Pos: 66395191
Relay_Log_Space: 36559177
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: 1594
Last_SQL_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Dan inilah yang saya lakukan:
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='the-master-host', master_user='replication', master_password='the-password', master_log_file='mysql-bin.000020', master_log_pos=66395191;
mysql> start slave;
Dan inilah yang terjadi, kesalahan PK:
131122 15:17:29 [Note] Slave I/O thread: connected to master 'replication@the-master-host:3306',replication started in log 'mysql-bin.000020' at position 66395191
131122 15:17:29 [ERROR] Slave SQL: Error 'Duplicate entry '71373' for key 'PRIMARY'' on query. Default database: 'the_database'. Query: 'insert into ... values ...', Error_code: 1062
131122 15:17:29 [Warning] Slave: Data truncated for column 'date' at row 1 Error_code: 1265
131122 15:17:29 [Warning] Slave: Duplicate entry '71373' for key 'PRIMARY' Error_code: 1062
Saya pikir saya mengikuti prosedur yang disarankan (lihat tautan di bawah), masih ada kesalahan PK :-(? Http://bugs.mysql.com/bug.php?id=26489 , cari "Penanganan Masalah". Http: //mhbarr.wordpress.com/2013/07/26/mysql-slave-corrupted-relay-log/ /programming//a/14438408
sumber
SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
dan melewatkan satu peristiwa pada budak, dan berharap itu membantu - apakah itu masuk akal? Jika tidak membantu (jika masih ada kesalahan PK), saya akan mengimpor dump--master-data
lagi.Jawaban:
Galat: Last_SQL_Errno: 1594 Last_SQL_Error: Kegagalan pembacaan log relai: Tidak dapat menguraikan entri log peristiwa relai.
Kesalahan ini berarti bahwa file log master rusak atau file log relai rusak.
Jalankan pertama "tampilkan status budak \ G" pada budak dan perhatikan:
Pertama-tama kita ingin memastikan bahwa file master log masih utuh, jadi lompat ke server master dan temukan Relay_Master_Log_File (centang / var / log / mysql) dan jalankan perintah berikut:
Log akan ditampilkan tetapi mudah-mudahan Anda tidak akan melihat pesan kesalahan. Jika Anda melihat pesan kesalahan maka master log rusak dan Anda mungkin harus melakukan gambar ulang.
Selanjutnya jalankan perintah yang sama pada log relai slave (sering di / var / lib / mysql)
Anda mungkin akan melihat beberapa kesalahan yang menunjukkan korupsi yang telah menghentikan replikasi, seperti ini:
Jika Anda melihat kesalahan maka log baik-baik saja pada master dan hanya log relay slave yang korup. Ini adalah berita baik, kita dapat mengatur ulang budak dan memberi tahu detail master dan dari mana harus melanjutkan. Jika Anda tidak melihat kesalahan apa pun kemudian berhenti membaca sekarang, Anda memiliki masalah yang berbeda.
Jika slave relay log memiliki kesalahan, jalankan perintah berikut untuk mereset slave dan log yang rusak terhubung kembali ke master, dapatkan log ok dan mulailah slaving lagi. Perhatikan bahwa MASTER_LOG_POS adalah
Exec_Master_Log_Pos
, dan MASTER_LOG_FILE adalahRelay_Master_Log_File
( BUKAN yang pertama, yang cocok dengan log relai yang telah diambil dan perlu dibuang) baik dari perintah pertama.sumber
mysqlbinlog
cara yang Anda sarankan, dan mengetahui bahwa log relai (bukan master log) telah rusak. Mengenai perbaikan yang Anda sarankan - jika Anda membaca pertanyaan dengan seksama, Anda akan melihat bahwa perbaikan yang Anda sarankan persis seperti yang telah kami coba. Tapi itu tidak berhasil, dan itulah pertanyaannya. - Tetapi jawaban Anda mungkin berguna untuk orang lain dengan masalah yang sama.MASTER_LOG_FILE
dalamCHANGE MASTER
harus diambil dariRelay_Master_Log_File
dan bukan dariMaster_Log_File
. Biasanya mereka akan sama tetapi mungkin tidak selalu demikian (lihat percona.com/blog/2008/07/07/… ).Relay_Master_Log_File
harus digunakan, bukanMaster_Log_File
. Lihat juga: percona.com/blog/2008/07/07/...reset slave all
karena pengaturan master tidak perlu diubah (mis. master_host, master_user, master_password), hanya MASTER_LOG_FILE dan MASTER_LOG_POS, makareset_slave
itu sudah cukup[Memperbaiki replikasi MySQL setelah log relay budak rusak]
sumber
Saya tahu ini sudah lebih dari setahun, tapi inilah yang mungkin terjadi pada masalah khusus ini.
Itu terlihat seperti yang seharusnya memperbaikinya karena menghapus log relay yang korup.
Lalu, Anda mendapat kesalahan PK 1062. Mengapa?
Ada bug yang luar biasa ( http://bugs.mysql.com/bug.php?id=60847 ) yang masih aktif di MySQL 5.5
Meskipun bug berhubungan dengan menggunakan mysql --single-transaction --flush-logs, ada kekhasan terkait.
Saya telah melihat kekhasan itu pada beberapa server EC2 berjalan sebagai Budak untuk klien minggu lalu di MySQL 5.5.15
Pada Master, ada beberapa baris aneh yang diperluas INSERT di mana setiap tuple yang dimasukkan adalah SELECT. Apa yang terjadi adalah bahwa LAST_INSERT_ID dalam log relai, yang membentuk kenaikan otomatis berikutnya untuk ditetapkan, sudah digunakan pada Slave karena sebelumnya memasukkan banyak baris.
SERI serial dalam log relai tampak seperti
Daftar kolom tidak menyertakan kunci primer numerik. Ketika kesalahan 1062 kembali, saya akan menggunakan kueri yang sama dengan yang gagal, jalankan kueri secara manual. Itu tidak mencapai kesalahan 1062. Kemudian, saya menjalankan perintah skip slave yang biasa:
Kemudian, replikasi menyusul.
Saran saya adalah membuat serial dengan benar INSERT Anda pada Master karena situasi seperti bug ini sebenarnya cukup dapat dihindari.
sumber
Anda telah melakukannya dengan benar (seperti yang sudah dikatakan oleh orang lain).
Satu-satunya masalah adalah dengan file master.info (berisi informasi tentang posisi di master mysql-bin.log) karena file ini tidak disinkronkan ke disk setelah setiap permintaan diproses.
Jadi info Anda tentang posisi dalam log master sudah usang dan Anda memproses kueri yang sudah diproses yang perlu dilewati
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
.Sayangnya, jika Anda menggunakan beberapa permintaan seperti
UPDATE table SET counter=counter+1 WHERE id = 12345
dan menggunakanbinlog_format=STATEMENT
basis data Anda mungkin tidak sinkron, saya kira.Anda dapat memberi tahu server MySQL untuk menyinkronkan master.info setelah setiap peristiwa dengan mengatur variabel sync_master_info tetapi mungkin akan memiliki konsekuensi kinerja yang sangat besar.
sumber