it-swarm.asia

ما هي الطريقة الأكثر أمانًا لتبديل تنسيق binlog في وقت التشغيل؟

بسبب التحذير التالي في mysqld.log:

[تحذير] تم كتابة عبارة غير آمنة في السجل الثنائي باستخدام تنسيق البيان منذ BINLOG_FORMAT = STATEMENT. البيان غير آمن لأنه يستخدم عبارة LIMIT. هذا غير آمن لأنه لا يمكن توقع مجموعة الصفوف المضمنة.

أريد تبديل تنسيق النسخ المتماثل إلى MIXED.

ولكن وفقًا لوثيقة MySQL:

لا يوصى بتبديل تنسيق النسخ المتماثل في وقت التشغيل عند وجود أي جداول مؤقتة ، لأنه يتم تسجيل الجداول المؤقتة فقط عند استخدام النسخ المتماثل المستند إلى العبارة ، بينما في حالة النسخ المتماثل المستند إلى الصف ، لا يتم تسجيلها.

لذا ، فإن السؤال هو كيف يمكنني تحديد ما إذا كانت هناك جداول مؤقتة لتبديل تنسيق السجل الثنائي بأمان؟

25
quanta

نظرًا لأن binlog سيكون له تنسيق محدد في الوقت الذي تقوم فيه بذلك ، يمكنك أن تقرر عدم المقامرة مع التنسيقين معًا على الرغم من أن MySQL (eh Oracle [لا يزال لا يمكن أن يتدحرج لساني]) قد بنى هذه الميزة.

لتشغيله بشكل آمن تمامًا بدون إعادة تشغيل الخلية ، جرب ما يلي:

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

سيؤدي ذلك إلى ترك binlog الأخير بتنسيق "MIXED". إن binlogimize (بجوار الأخير) موجود فقط لإغلاق binlog الأخير الذي كان في التنسيق السابق.

جميع الجلسات الموجودة قبل أول FLUSH LOGS; سيبدأ الكتابة في binlog الأخير مرة واحدة UNLOCK TABLES; يتم تنفيذ.

جربها !!!

مذكرة قانونية

إعطاء الائتمان حيث يحين الائتمان ، جوابي هو حقا خنزير من @ إجابة جوناثان . أنا فقط أغلق وفتح binlogs فوق ذلك. حصل على +1 لإخراج هذا أولاً.

تحديث 2011-10-12 13:58 بتوقيت شرق الولايات المتحدة

إذا قمت بذلك إلى سيد نشط وكان هناك واحد أو أكثر من العبيد الذين يتم نسخهم من ذلك السيد ، يجب أن تكون قلقًا بشأن سجلات الترحيل الموجودة في التنسيق الجديد أيضًا. هنا هو ما يمكنك القيام به:

على العبد ، اركض STOP SLAVE;

على جهاز Master ، قم بتشغيل ما يلي:

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

على العبد ، اركض START SLAVE;

ادارة STOP SLAVE; و START SLAVE; يقوم بتدوير سجلات الترحيل ويؤدي إلى تكرار الإدخالات الجديدة أيًا كانت الصيغة. قد ترغب في تطبيق التغيير binlog_format في الرقيق أيضًا.

35
RolandoMySQLDBA

لتبديل binlog_format في وقت التشغيل ، يمكنك القيام بما يلي:

set global binlog_format = 'MIXED';

سيؤدي هذا إلى تعيين جميع الجلسات الجديدة على شكل binlog مختلط. ستكون جميع الجلسات الحالية كل ما تم تعيينه مسبقًا حتى انتهائها.

يمكنك أيضًا القيام بـ set session binlog_format = 'MIXED'; يدويًا لحل أية مشكلات في الجلسة تحديدًا.

6
Jonathan