วิธีที่ปลอดภัยที่สุดในการเปลี่ยนรูปแบบ binlog คืออะไร


25

เนื่องจากคำเตือนต่อไปนี้ในmysqld.log:

[คำเตือน] คำสั่งที่ไม่ปลอดภัยเขียนลงในบันทึกแบบไบนารีโดยใช้รูปแบบคำสั่งตั้งแต่ BINLOG_FORMAT = STATEMENT คำสั่งไม่ปลอดภัยเนื่องจากใช้ส่วนคำสั่ง LIMIT สิ่งนี้ไม่ปลอดภัยเนื่องจากไม่สามารถทำนายชุดของแถวที่รวมไว้ได้

MIXEDฉันต้องการที่จะเปลี่ยนรูปแบบการจำลองแบบ

แต่ตามเอกสาร MySQL:

การสลับรูปแบบการจำลองแบบที่รันไทม์จะไม่แนะนำเมื่อมีตารางชั่วคราวใด ๆ อยู่เนื่องจากตารางชั่วคราวจะถูกบันทึกเมื่อใช้การจำลองแบบตามคำสั่งเท่านั้นในขณะที่มีการจำลองแบบแถวที่ใช้พวกเขาจะไม่ถูกบันทึกไว้

ดังนั้นคำถามคือฉันจะระบุได้อย่างไรว่ามีตารางชั่วคราวใด ๆ ที่มีอยู่เพื่อเปลี่ยนรูปแบบไฟล์บันทึกอย่างปลอดภัยหรือไม่


1
คำเตือนด่วน ระวังสิ่งนี้เมื่อไปจาก RBR-> SBR และใช้การอ่านที่มุ่งมั่น: bugs.mysql.com/bug.php?id=62493
Morgan Tocker

คำตอบ:


35

เนื่องจาก binlog จะมีรูปแบบเฉพาะในขณะที่คุณทำเช่นนี้คุณอาจตัดสินใจที่จะไม่เล่นการพนันกับทั้งสองรูปแบบด้วยกันแม้ว่า MySQL (eh Oracle (ยังไม่สามารถรีดลิ้นของฉัน]) ได้สร้างคุณลักษณะนี้ขึ้นมา

หากต้องการเล่นอย่างปลอดภัยโดยไม่ต้องรีสตาร์ท mysql ให้ลองทำดังนี้:

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

การดำเนินการนี้จะทำให้ binlog สุดท้ายอยู่ในรูปแบบ 'MIXED' binlog แบบย่อ (ถัดจากครั้งสุดท้าย) มีอยู่เพียงแค่นำการปิด binlog ล่าสุดที่อยู่ในรูปแบบก่อนหน้านี้

เซสชันที่มีอยู่ทั้งหมดก่อนหน้าแรกFLUSH LOGS;จะเริ่มเขียนใน binlog ล่าสุดเมื่อUNLOCK TABLES;มีการดำเนินการ

ให้มันลอง !!!

ข้อแม้

การให้เครดิตที่เป็นเครดิตเนื่องจากคำตอบของฉันเป็นจริง piggybacking ออกจาก@ คำตอบที่โจนาธาน ฉันเพิ่งปิดและเปิด binlogs ที่ด้านบนของที่ เขาได้รับ +1 สำหรับการนำสิ่งนี้ออกก่อน

อัพเดท 2011-10-12 13:58 EDT

หากคุณทำสิ่งนี้กับ Master ที่มีการใช้งานอยู่และมี Slaves หนึ่งตัวหรือมากกว่าเลียนแบบจาก Master นั้นคุณต้องกังวลเกี่ยวกับบันทึกการถ่ายทอดที่อยู่ในรูปแบบใหม่เช่นกัน นี่คือสิ่งที่คุณสามารถทำได้:

บน Slave ให้เรียกใช้ STOP SLAVE;

ที่อาจารย์ใช้สิ่งเหล่านี้:

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

บน Slave ให้เรียกใช้ START SLAVE;

การเรียกใช้STOP SLAVE;และSTART SLAVE;หมุนล็อกรีเลย์และทำให้รายการใหม่ถูกจำลองแบบไม่ว่าจะมาในรูปแบบใด คุณอาจต้องการใช้การเปลี่ยนแปลง binlog_format ในสลาฟเช่นกัน


3
สิ่งหนึ่งที่ต้องจำไว้คือการตั้งค่าการจำลองแบบ mysql จริงตั้งบนพื้นฐานต่อลูกค้าเซสชั่น การตั้งค่าส่วนกลาง binlog_format เพียงแค่เปลี่ยนค่าสำหรับเซสชันใหม่ ดังนั้นหากคุณใช้งานบนระบบที่เชื่อมต่อกับลูกค้าอย่างต่อเนื่องการเปลี่ยนแปลงใด ๆ ที่คุณทำกับการตั้งค่าจะไม่สามารถใช้งานได้ทันทีแม้ว่าคุณจะทำการฟลัชและล็อคตามที่ระบุไว้ที่นี่ - มันจะไม่มีผลจนกว่าไคลเอ็นต์ เชื่อมต่อใหม่ (หรือตั้งค่าในเซสชันของตนเอง แต่ในประสบการณ์ของฉันมีแนวโน้มมากกว่าเดิม)
Austin Mills

สำหรับผู้ที่อยากรู้อยากเห็นคุณสามารถใส่ "binlog_format = 'MIXED'; ใน my.cnf ของคุณ
คริสเตียน

2
FYI คำตอบนี้ไม่เห็นด้วยกับคำตอบที่นี่: dba.stackexchange.com/questions/58539/…
HTTP500

สถานะด้วยตนเอง : ซึ่งหมายความว่าการเปลี่ยนรูปแบบการบันทึกบนต้นแบบการจำลองแบบไม่ได้ทำให้ทาสเปลี่ยนรูปแบบการบันทึกให้ตรงกัน (..snip .. ) การเปลี่ยนรูปแบบการบันทึกแบบไบนารีบนต้นแบบในขณะที่การจำลองแบบต่อเนื่องหรือไม่มีการเปลี่ยนแปลงบนทาสอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดหรือแม้แต่การจำลองแบบล้มเหลวโดยสิ้นเชิง
Halfgaar

@Halfgaar เมื่อสัปดาห์ที่แล้วฉันเปลี่ยนทาสจาก MIXED ไปเป็น STATEMENT สามครั้งโดยไม่มีผลร้ายใด ๆ ฉันกำลังทำเช่นนั้นเพราะการจำลองแบบแตกเนื่องจากสภาพการแข่งขัน ตารางกลายเป็นไม่มีอยู่บนสลาฟก่อนที่การดำเนินการของเคียวรี ดังนั้นฉันเปลี่ยนเป็นสถานะมั่นคงเหมือนสถานการณ์นั้น แน่นอนว่าการเขียนทั้งหมดหยุดลงในขณะที่ฉันทำสิ่งนี้ BTW ฉันก็เป็นอาจารย์เช่นกัน
RolandoMySQLDBA

6

หากต้องการเปลี่ยน binlog_format เมื่อใช้งานจริงคุณสามารถทำได้:

set global binlog_format = 'MIXED';

การดำเนินการนี้จะกำหนดให้เซสชันใหม่ทั้งหมดเป็นรูปแบบ binlog แบบผสม เซสชันที่มีอยู่ทั้งหมดจะเป็นสิ่งที่ตั้งไว้ก่อนหน้านี้จนกว่าจะสิ้นสุด

คุณสามารถทำset session binlog_format = 'MIXED';ด้วยตนเองเพื่อแก้ไขปัญหาใด ๆ กับเซสชันโดยเฉพาะ


ฉันไม่ถามวิธีฉันถามวิธีที่ปลอดภัยที่สุดและฉันจะตรวจสอบได้อย่างไรว่ามีตารางชั่วคราวอยู่หรือไม่
quanta

3
การตั้งค่าตัวแปรโกลบอลก่อนและรอให้เซสชันที่เหลือเสร็จสิ้นเป็นวิธีที่ปลอดภัยที่สุด
Jonathan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.