- Versi MySQL Master: 5.5.16-1
- Versi MySQL Slave: 5.5.18-1
Cuplikan master dibuat oleh:
mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql
File dump ini diimpor pada slave (yang dimulai dengan --skip-slave-start
opsi) tanpa kesalahan:
shell> pv dbname_`date +%F`.sql | mysql -u root -p
Tapi saya mendapat kesalahan berikut ketika menjalankan 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, ...
Hanya ada satu catatan dengan ID 115846 di master:
mysql> select count(*) from request_posted where id=115846;
Current database: db
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.01 sec)
Cobalah untuk melewatkan beberapa pertanyaan dengan:
mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> START SLAVE;
tidak membantu. Saya tidak ingin melewatkan kesalahan itu dengan menambahkan:
slave-skip-errors = 1062
ke my.cnf
file karena mungkin membawa budak tidak konsisten.
Apa yang mungkin menjadi alasan untuk kesalahan ini?
MEMPERBARUI
Ini bukan bagaimana saya biasanya mengatur replikasi mySQL
Langkah mana yang Anda pikir saya tidak ikuti dokumen?
Saya bertanya-tanya apakah Anda akan menghadapi masalah yang sama jika Anda harus mengatur seluruh konfigurasi daripada melewati perintah mysqldump.
Tidak, ini berfungsi seperti biasa jika saya juga mengubah master ke koordinat yang sesuai.
Saya akan mencoba menjatuhkan database pada slave, pastikan binlog sudah jelas, dan mulai lagi. Periksa juga tabel yang dimaksud pada master untuk memastikan indeks tidak memiliki kesalahan.
Apakah menghapus (memindahkan) semua datadir sudah cukup? Saya melakukan itu dan mendapatkan hasil yang sama.
Membalas @Dmytro Leonenko
'tampilkan status budak \ G' pada budak untuk memastikan bahwa itu dikonfigurasikan dengan benar, MASTER_LOG_POS adalah 0
Hanya 'tampilkan budak patung \ G' setelah impor tetapi sebelum 'mulai budak;' dapat memberi kita jawabannya
Saya mencadangkan datadir, menghapus semua dan menjalankan mysql_install_db
, mengimpor file dump, mengeksekusi change master to
dan inilah hasilnya:
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)
Saya bertanya-tanya mengapa Master_Log_Pos adalah 4?
--master-data
opsi sudah menulis koordinat log biner ke file dump. Saya hanya perlu mengubah master ke master_host, master_user, master_password.
--master-data
opsi ini saat membuat snapshot data? Jika masih terjadi ketika saya menggunakan --lock-all-tables
opsi dan change master to master_log_file='', master_log_pos='', ...
, apa penyebabnya?
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1
Apakah permintaan yang menyebabkan kesalahan berubah sedikit? Apakah pengaturan posisi slave binlog sudah benar?