2012-09-05 41 views
7

मैं फ़ाइल में चेतावनी/त्रुटियों को लिखने के लिए लॉग-त्रुटि का उपयोग कर रहा हूं। जब मैं INSERT IGNORE..SELECT स्टेटमेंट करता हूं, तो यह केवल इस चेतावनी संदेश लिखते रहें।टर्नऑफ mysql असुरक्षित कथन चेतावनी

120905 3:01:23 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave. 

मैं अपने myqql logwriter को ऊपर और ऊपर त्रुटि लिखना बंद करना चाहता हूं। (मैं अन्य लॉग नहीं देख सकता क्योंकि वे पूरे लॉगफाइल भरते हैं ...)

सबसे पहले, मैं एक तालिका में (ए, बी, सी) डालता हूं। सी तालिका में अद्वितीय होना चाहिए, और ए, बी का चयन करने के लिए उपयोग किया जाता है। क्वेरी इस

SELECT c FROM table WHERE a=value1 AND value2<b AND b<value3 

तरह होगा और मेरे डालने क्वेरी

INSERT IGNORE INTO table VALUES (,,),(,,)...(,,) 

मैंने सोचा कि मैं क्वेरी नहीं बदल चेतावनी निर्माण करने के लिए कर सकता है, लेकिन मेरे डेटा अद्वितीय क्षेत्र होते हैं और मैं गारंटी नहीं है कि दायर की जरूरत है मेज में अद्वितीय है। और 500 ~ 2000 पंक्तियों को हर कुछ सेकंड में डाला जाना चाहिए, इसलिए मुझे थोक सम्मिलन करने की आवश्यकता है।

यदि पहले से ही लाखों पंक्तियों में से दर्जन पंक्तियां डाली गई हैं, और मुझे कुछ सेकंड में एक और 2000 पंक्तियां डालने की आवश्यकता है। चेतावनियों के साथ लॉगफाइल भरने के बिना मैं उन्हें तालिका में सुरक्षित रूप से कैसे सम्मिलित कर सकता हूं?

(मैं क्योंकि मैं mysql प्रतिकृति उपयोग करने की आवश्यकता द्विआधारी लॉग बंद कर सकते हैं नहीं।)

+0

क्या आप टेबल को दोहराना चाहते हैं - क्योंकि यदि आप यह त्रुटि महत्वपूर्ण हैं। –

+0

हां, मैं बैकअप के लिए mysql प्रतिकृति का उपयोग कर रहा हूं, स्केलबिलिटी कारण – user1640242

+0

तो क्या आपने त्रुटि संदेश तब पढ़ा है? – zerkms

उत्तर

13

आप लॉगिंग बंद करने के लिए

SET GLOBAL LOG_WARNINGS = 0 

उपयोग कर सकते हैं और

SET GLOBAL LOG_WARNINGS = 1 

को इसे वापस चालू करें। मेरा व्यक्तिगत सुझाव यह है कि आप इसे वैश्विक स्तर पर स्थापित करने के बजाय अपमानजनक क्वेरी को लपेटें ताकि आप ट्रैक कर सकें कि अन्य प्रश्न समस्या का कारण बनते हैं।

ध्यान दें कि MySQL के पुराने संस्करण इसका समर्थन नहीं करते हैं।

+2

एक वैश्विक चर के रूप में, यह डेटाबेस से जुड़े सभी सत्रों के लिए चेतावनी बंद कर देगा, है ना? – rjh

+0

MySQL 5.6.4 के बाद से यह चर केवल ग्लोबल के रूप में परिभाषित किया गया है। – BoraMa

0

मुझे लगता है कि यह प्रश्न अभी भी खुला है। उपयोग set max_error_count=0; your unsafe queries; set max_error_count=64;

प्रश्नों आप इसे एक सत्र चर रहा है चलाना चाहते हैं इससे पहले कि

है, तो आप का उपयोग करने के सुपर उपयोगकर्ता होने की जरूरत नहीं है। न केवल, जब आप शो चेतावनी सीमा 5 कॉल करते हैं तो कोई चेतावनी जारी नहीं की जाएगी; लेकिन ऐसी चेतावनियां mysql लॉग फ़ाइलों में रिपोर्ट नहीं कर रही हैं। आप इसे संग्रहीत प्रक्रियाओं में भी उपयोग कर सकते हैं। आपके प्रश्नों के बाद आप जानते हैं कि असुरक्षित हैं, आप इस चर को अपने मूल मूल्य पर वापस रख सकते हैं।