रनटाइम पर बिनलॉग फॉर्मेट को स्विच करने का सबसे सुरक्षित तरीका क्या है?


25

निम्नलिखित चेतावनी के कारण mysqld.log:

[चेतावनी] BINLOG_FORMAT = स्थिति के बाद से स्टेटमेंट फॉर्मेट का उपयोग करते हुए द्विआधारी लॉग को लिखा असुरक्षित बयान। यह कथन असुरक्षित है क्योंकि यह एक LIMIT खंड का उपयोग करता है। यह असुरक्षित है क्योंकि इसमें शामिल पंक्तियों के सेट की भविष्यवाणी नहीं की जा सकती है।

मैं प्रतिकृति प्रारूप को स्विच करना चाहता हूं MIXED

लेकिन MySQL दस्तावेज़ के अनुसार:

अस्थायी समय पर मौजूद प्रतिकृति तालिकाओं को बदलने की अनुशंसा नहीं की जाती है, क्योंकि अस्थायी तालिकाएं केवल स्टेटमेंट-आधारित प्रतिकृति का उपयोग करते समय लॉग की जाती हैं, जबकि पंक्ति-आधारित प्रतिकृति के साथ वे लॉग नहीं होते हैं।

तो, सवाल यह है कि बाइनरी लॉग फॉर्मेट को सुरक्षित रूप से स्विच करने के लिए कोई अस्थायी टेबल मौजूद है तो मैं कैसे पहचान सकता हूं?


1
त्वरित चेतावनी। RBR-> SBR से जाने और रीड- कमिटेड
Morgan Tocker

जवाबों:


35

चूंकि एक बिनलॉग आपके द्वारा ऐसा करने के लिए एक विशिष्ट प्रारूप होगा, आप दो स्वरूपों के साथ एक साथ जुआ न करने का फैसला कर सकते हैं, हालांकि MySQL (एह ओरेकल [अभी भी मेरी जीभ को रोल नहीं कर सकता है]) ने इस सुविधा का निर्माण किया।

Mysql पुनरारंभ के बिना इसे पूरी तरह से सुरक्षित खेलने के लिए, निम्नलिखित प्रयास करें:

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

यह अंतिम बिनलॉग को 'MIXED' प्रारूप में छोड़ देगा। पेनल्टीमीट (अगले से अंतिम) बिनलॉग मौजूद है, पिछले प्रारूप में बंद किए गए अंतिम बनलॉग को बंद करें।

पहले से पहले के सभी मौजूदा सत्रों FLUSH LOGS;को अंतिम बिनॉलेज में लिखना शुरू कर दिया जाएगा UNLOCK TABLES;

कोशिश तो करो !!!

चेतावनी

क्रेडिट देना जहां क्रेडिट के कारण है, मेरा जवाब वास्तव में @ जोनाथन के जवाब से दूर है । मैं उस के शीर्ष पर केवल क्लोज और बिनलॉग खोलता हूं। इसे पहले लाने के लिए उसे +1 मिलता है।

UPDATE 2011-10-12 13:58 EDT

यदि आप एक सक्रिय मास्टर के लिए ऐसा करते हैं और उस मास्टर से नकल करने वाले एक या अधिक दास हैं, तो आपको रिले लॉग के नए प्रारूप में होने के बारे में चिंतित होने की आवश्यकता है। यहाँ आप क्या कर सकते हैं:

दास पर, भागो STOP SLAVE;

मास्टर इन पर चलाएँ:

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

दास पर, भागो START SLAVE;

चल रहा है STOP SLAVE;और START SLAVE;रिले लॉग को घुमाता है और नई प्रविष्टियों को दोहराता है जो भी प्रारूप में आता है। आप दास में भी binlog_format परिवर्तन लागू कर सकते हैं।


3
एक बात का ध्यान रखें कि mysql प्रतिकृति सेटिंग्स वास्तव में प्रति ग्राहक-सत्र के आधार पर निर्धारित की जाती हैं। वैश्विक binlog_format को सेट करने से नए सत्रों के लिए केवल मूल्य बदल जाता है। इस प्रकार, यदि आप इसे ग्राहकों से जुड़े सिस्टम पर लगातार चला रहे हैं, तो सेटिंग में किए गए किसी भी परिवर्तन को तुरंत लागू नहीं किया जाएगा, भले ही आप यहां बताए अनुसार फ्लशिंग और लॉकिंग करते हों - वे तब तक प्रभावी नहीं होंगे, जब तक कि क्लाइंट्स पर इसका असर न पड़े। फिर से कनेक्ट करें (या अपने स्वयं के सत्र में मूल्य निर्धारित करें लेकिन मेरे अनुभव में पूर्व की संभावना अधिक है)।
ऑस्टिन मिल्स

उन उत्सुक लोगों के लिए, आप इसे "binlog_format = 'MIXED' भी डाल सकते हैं;" अपने my.cnf में।
क्रिश्चियन

2
FYI करें, यह उत्तर यहां एक उत्तर के अनुरूप
HTTP500

मैनुअल कहता है : इसका मतलब यह है कि प्रतिकृति मास्टर पर लॉगिंग प्रारूप को बदलने से दास को मिलान करने के लिए अपने लॉगिंग प्रारूप को बदलने का कारण नहीं बनता है। (..snip ..) प्रतिकृति को चालू करते समय मास्टर पर बाइनरी लॉगिंग प्रारूप को बदलना, या दास पर भी इसे बदलने के बिना इस प्रकार अप्रत्याशित परिणाम हो सकते हैं, या यहां तक ​​कि प्रतिकृति पूरी तरह से विफल हो सकती है।
हाफगॉपर

@ हेलफगर पिछले सप्ताह के अंत में, मैंने बिना किसी प्रभाव के तीन बार MIXED से STATEMENT में एक गुलाम को स्विच किया। मैं ऐसा कर रहा था, क्योंकि दौड़ की स्थिति के कारण प्रतिकृति टूट रही थी। क्वेरी के निष्पादन से पहले एक दास पर तालिका कुछ भी नहीं बन गई। तो, मैं स्थिति की तरह स्थिर करने के लिए स्विच किया। बेशक, मैंने ऐसा करते समय सभी लिखना बंद कर दिया था। BTW मैंने मास्टर भी किया।
रोलैंडमाइसीडीडीबीए

6

Binlog_format को रनटाइम पर स्विच करने के लिए आप कर सकते हैं:

set global binlog_format = 'MIXED';

यह सभी नए सत्रों को मिश्रित द्विआधारी प्रारूप में सेट करेगा। सभी मौजूदा सत्र वे होंगे जो पहले समाप्त हो चुके थे।

आप set session binlog_format = 'MIXED';विशेष रूप से सत्र के साथ किसी भी समस्या को हल करने के लिए मैन्युअल रूप से भी कर सकते हैं ।


मैं रास्ता नहीं पूछता, मैं सबसे सुरक्षित रास्ता पूछता हूं और अगर कोई अस्थायी टेबल मौजूद है तो मैं कैसे जांच सकता हूं।
क्वांटा

3
पहले वैश्विक वैरिएबल को सेट करना और शेष सत्रों के समाप्त होने की प्रतीक्षा करना, सबसे सुरक्षित तरीका है।
जोनाथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.