it-swarm.asia

Apa cara teraman untuk mengganti format binlog saat runtime?

Karena peringatan berikut di mysqld.log:

[Peringatan] Pernyataan tidak aman yang ditulis ke log biner menggunakan format pernyataan sejak BINLOG_FORMAT = PERNYATAAN. Pernyataan ini tidak aman karena menggunakan klausa LIMIT. Ini tidak aman karena rangkaian baris yang disertakan tidak dapat diprediksi.

Saya ingin mengganti format replikasi ke MIXED.

Tetapi menurut dokumen MySQL:

Mengalihkan format replikasi saat runtime tidak disarankan bila ada tabel sementara, karena tabel sementara dicatat hanya saat menggunakan replikasi berbasis pernyataan, sedangkan dengan replikasi berbasis baris mereka tidak dicatat.

Jadi, pertanyaannya adalah bagaimana saya bisa mengidentifikasi jika ada tabel sementara yang ada untuk mengganti format log biner dengan aman?

25
quanta

Karena sebuah binlog akan memiliki format spesifik pada saat Anda melakukan ini, Anda dapat memutuskan untuk tidak bertaruh dengan dua format tersebut secara bersamaan walaupun MySQL (eh Oracle [masih tidak dapat berbicara]] membangun fitur ini.

Untuk memainkannya sepenuhnya aman tanpa me-restart mysql, coba yang berikut ini:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Ini akan meninggalkan binlog terakhir dalam format 'MIXED'. Binlog penultimiate (di sebelah terakhir) ada hanya membawa penutupan binlog terakhir yang ada dalam format sebelumnya.

Semua sesi yang ada sebelum yang pertama FLUSH LOGS; akan mulai menulis di binlog terakhir sekali UNLOCK TABLES; dieksekusi.

Cobalah !!!

CAVEAT

Memberi kredit di mana kredit jatuh tempo, jawaban saya benar-benar mendukung @ jawaban Jonathan . Saya hanya menutup dan membuka binlog di atas itu. Dia mendapat +1 karena membawa ini dulu.

UPDATE 2011-10-12 13:58 EDT

Jika Anda melakukan ini pada Master yang aktif dan ada satu atau lebih Budak yang mereplikasi dari Master itu, Anda perlu khawatir tentang log relai yang berada dalam format baru juga. Inilah yang dapat Anda lakukan:

Pada Budak, jalankan STOP SLAVE;

Pada Master jalankan ini:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Pada Budak, jalankan START SLAVE;

Lari STOP SLAVE; dan START SLAVE; memutar log relai dan menyebabkan entri baru direplikasi dalam format apa pun. Anda mungkin ingin menerapkan perubahan binlog_format di dalam slave juga.

35
RolandoMySQLDBA

Untuk mengganti binlog_format saat runtime dapat Anda lakukan:

set global binlog_format = 'MIXED';

Ini akan mengatur semua sesi BARU menjadi format binlog campuran. Semua sesi yang ada akan menjadi apa pun yang ditetapkan sebelumnya sampai berakhir.

Anda juga dapat melakukan set session binlog_format = 'MIXED'; secara manual untuk menyelesaikan masalah dengan sesi khusus.

6
Jonathan