Kesalahan MySQL: tidak mungkin menulis ke log biner

8

Saya memiliki sistem (diwarisi dari perusahaan pengembang lain) dan saya belum tahu semua fitur-fiturnya. Konstruksi:
- klien / aplikasi web (symfony 1.4)
- DB - MySQL.

Proyek dikerahkan pada 2 server:
1-st: nginx server + PHP + DB Master;
2-st: DB Slave.

Ketika data dimodifikasi oleh klien-web di DB Master, DB Slave berfungsi dengan baik dan data memiliki proses replikasi yang normal. Ketika data dimodifikasi oleh Klien Manajemen MySQL, saya memiliki pemberitahuan:

Tidak dapat menjalankan pernyataan: tidak mungkin menulis ke log biner karena BINLOG_FORMAT = PERNYATAAN dan setidaknya satu tabel menggunakan mesin penyimpanan terbatas pada pencatatan berbasis baris. InnoDB terbatas pada pencatatan baris ketika tingkat isolasi transaksi DIBACA KOMITMEN atau BACA TIDAK DIKETAHUI

Dan kemudian, DB Slave jatuh dan proses replikasi rusak (kesalahan memasukkan ... entri duplikat ...).

Pemberitahuan serupa terjadi (pada situasi ini - kesalahan) dengan teks yang sama, ketika saya mencoba untuk memasukkan data dengan aplikasi java / modul (ini berjalan di dalam transaksi) dan setelah pengecualian, transaksi berputar kembali dan tidak ada modifikasi terjadi.

Bagaimana saya bisa mengatasi masalah ini dan membuat sistem bekerja dan memungkinkan data modifikasi pada DB Master dan DB Slave bekerja dalam mode normal?

Chaki_Black
sumber

Jawaban:

18

Ada 3 metode yang dapat digunakan MySQL untuk menulis ke log biner:

  1. PERNYATAAN

    Ini berarti bahwa setiap pernyataan SQL pada master dicatat dalam log, dan dieksekusi pada slave. Ini dapat menyebabkan masalah jika pernyataan SQL berisi pernyataan seperti "SEKARANG ()", "RAND ()" dan apa pun yang non-deterministik. Ini juga membutuhkan dukungan dari mesin penyimpanan yang digunakan.

  2. BARIS

    Ini berarti bahwa setiap baris yang diubah oleh pernyataan secara individual dicatat dalam log biner. Ini memberikan log biner yang lebih besar (umumnya) daripada logging berbasis pernyataan, tetapi hampir selalu dijamin untuk memberikan replikasi yang dibutuhkan.

  3. CAMPURAN

    Ini memungkinkan MySQL untuk memilih antara pencatatan berbasis biner dan baris sesuai kebutuhan.

Jika Anda mendapatkan kesalahan ini, satu saran adalah mengubah variabel BINLOG_FORMAT menjadi MIXED. Hal ini memungkinkan MySQL untuk secara otomatis beralih antara ROW dan pencatatan berdasarkan STATEMENT sebagaimana diperlukan.

Phil Sumner
sumber
Baik! Luar biasa!
Chaki_Black
4
Saran yang bagus, tetapi BAGAIMANA Anda mengubah BINLOG_FORMAT?
Trebor Rude
2
Mungkin sangat terlambat, tetapi, ini dapat membantu bagi semua orang yang ingin tahu cara mengubah BINLOG_FORMAT dba.stackexchange.com/questions/6150/…
Vivek Dhayalan
Trebor Rude: Anda harus membaca dokumentasi mysql, yang menjelaskan ini secara detail! dev.mysql.com/doc/refman/5.6/en/…
Lifeboy
Jawaban ini membantu saya menyelesaikan masalah. Terima kasih!
Tung