Replikasi MySQL: 'Entri duplikat untuk kunci PRIMARY'

9

Bisakah Anda membantu saya untuk memahami mengapa saya menerima 'Entri duplikat untuk kunci PRIMARY' pada server slave setelah sinkronisasi ulang penuh.

Pada dasarnya 'mysqldump' berjalan hampir sepanjang malam dan kemudian proses pemulihan memakan waktu beberapa jam sehingga ketika saya memulai budak itu ~ 63874 detik di belakang tuan.

Server slave hanya baca (read_only) dan tidak ada tulisan selama proses sinkronisasi jadi saya tidak mengerti mengapa ada kunci duplikat.

Format log biner diatur ke MIXED pada master.

Perintah yang digunakan untuk membuat cadangan DB:

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

Budak mereplikasi hanya satu database dari master (db -> db_backup) dengan opsi berikut:

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

Jawaban:

11

ASPEK # 1: Replikasi

Saya tidak berpikir begitu

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

milik bersama.

Orang lain juga bertanya-tanya tentang hal ini

Masalahnya berasal dari aturan replikasi pesanan diproses. Menurut Dokumentasi MySQL tentang Aturan Replikasi :

Jika ada opsi --replicate-rewrite-db yang ditentukan, mereka diterapkan sebelum aturan --replicate- * filtering diuji.

Bahkan Dokumentasi MySQL pada replicate-rewrite-db mengatakan:

Terjemahan nama database dilakukan sebelum aturan --replicate- * diuji.

The replicate-wild-do-tablediberlakukan setelah menulis ulang. Tidak akan mengejutkan jika pemesanan ini entah bagaimana memaksakan INSERT ke dalam tabel yang sudah memiliki data.

Anda mungkin bertanya bagaimana data sampai di sana?

ASPEK # 2: mysqldump

Melakukan hal mysqldump --single-transactionitu tampaknya merupakan cara terbaik untuk melakukan dump data secara point-in-time. Sayangnya, mysqldump --single-transactionmemiliki Heel Achilles': ALTER TABLE. Jika tabel tunduk pada ALTER TABLEperintah apa pun , seperti a DROP TABLEdan CREATE TABLE, yang dapat merusak integritas transaksi, mysqldump mencoba melakukan dump. Memotong tabel (yang merupakan DDL di MySQL Universe) dan menjatuhkan dan menambahkan indeks dapat juga mengganggu.

Anda dapat menemukan informasi lebih lanjut tentang hal itu dari Best MySQLDump Secret disimpan Blog Kinerja MySQL . Saya benar-benar membahas hal ini dalam pertanyaan terakhir yang menggambarkan 12 perintah yang dapat merusak integritas transaksi mysqldump: cadangan MySQL InnoDB

CAVEAT

EPILOG

Salah satu atau kedua aspek mungkin telah berkontribusi membiarkan baris tergelincir selama mysqldump yang seharusnya tidak ada karena aturan penulisan ulang atau isolasi mysqldump ditimpa.

SARAN

Saya akan melakukan dump mysqlbinlog dari semua log relai sejak awal mysqldump untuk melihat semua INSERT yang akan diproses oleh Slave dan lihat apakah baris-baris itu sudah ada pada Slave. Jika ya, Anda mungkin dapat melakukan dua hal:

1: Lewati semua kesalahan Duplikat Kunci

Cukup tambahkan ini ke my.cnf di Slave

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

dan mulai kembali mysql. Lalu lariSTART SLAVE;

semua kesalahan kunci duplikat akan dilewati. Ketika Seconds_Behind_Mastersampai ke 0, hapus baris-baris itu dan restart mysql.

2: Unduh alat percona

Alat yang Anda butuhkan adalah

Gunakan ini untuk menemukan perbedaan dalam Budak, dan kemudian memperbaikinya

RolandoMySQLDBA
sumber
0

Periksa untuk memasukkan kueri dalam kode yang memasukkan langsung ke dalam slave. Kami hanya bisa membaca dari budak. Kueri tulis harus diarahkan ke master.

Umair Anwar
sumber
Lihat kembali pertanyaannya. Slave hanya-baca dan tidak ada penulisan selama sinkronisasi ulang.
RolandoMySQLDBA