इसकी घोषणा और द्विआधारी लॉगिंग में DETERMINISTIC, NO SQL, या READS SQL DATA सक्षम है


107

Mysql में डेटाबेस आयात करते समय, मुझे निम्नलिखित त्रुटि मिली है:

1418 (HY000) at line 10185: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

मुझे नहीं पता कि मुझे किन चीजों को बदलने की जरूरत है। किसी को भी मेरी मदद कर सकते हैं यह कैसे हल करने के लिए?

जवाबों:


236

इसे ठीक करने के दो तरीके हैं:

  1. MySQL कंसोल में निम्नलिखित को निष्पादित करें:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Mysql.ini कॉन्फ़िगरेशन फ़ाइल में निम्न जोड़ें:

    log_bin_trust_function_creators = 1;

सेटिंग गैर-नियतात्मक कार्यों के लिए जाँच को आराम देती है। गैर-नियतात्मक कार्य ऐसे फ़ंक्शन हैं जो डेटा को संशोधित करते हैं (अर्थात स्टेटमेंट अपडेट करें, सम्मिलित करें या हटाएं)। अधिक जानकारी के लिए, यहां देखें ।

कृपया ध्यान दें, यदि बाइनरी लॉगिंग सक्षम नहीं है, तो यह सेटिंग लागू नहीं होती है।

संग्रहीत कार्यक्रमों के बाइनरी लॉगिंग

यदि बाइनरी लॉगिंग सक्षम नहीं है, तो log_bin_trust_function_creators लागू नहीं होता है।

log_bin_trust_function_creators

बाइनरी लॉगिंग सक्षम होने पर यह चर लागू होता है।

सबसे अच्छा दृष्टिकोण संग्रहीत कार्यों के लिए एक बेहतर समझ और नियतात्मक घोषणाओं का उपयोग है। इन घोषणाओं का उपयोग MySQL द्वारा प्रतिकृति को अनुकूलित करने के लिए किया जाता है और स्वस्थ प्रतिकृति के लिए उन्हें सावधानी से चुनना एक अच्छी बात है।

DETERMINISTIC एक रूटीन "नियतात्मक" माना जाता है, अगर यह हमेशा समान इनपुट मापदंडों के लिए समान परिणाम उत्पन्न करता है और DETERMINISTIC अन्यथा नहीं। यह ज्यादातर स्ट्रिंग या गणित प्रसंस्करण के साथ प्रयोग किया जाता है, लेकिन यह तक सीमित नहीं है।

"DETERMINISTIC" के विपरीत नहीं । " यदि नियमित परिभाषा में न तो DETERMINISTIC और न ही DETERMINISTIC दिया गया है, तो डिफ़ॉल्ट नहीं है DETININISTIC। यह घोषित करने के लिए कि एक फ़ंक्शन नियतात्मक है, आपको DETERMINISTIC को स्पष्ट रूप से निर्दिष्ट करना होगा। " इसलिए ऐसा लगता है कि यदि कोई बयान नहीं दिया जाता है, तो MySQl फ़ंक्शन को "NOT DETERMINISTIC" के रूप में मानेगा। मैनुअल का यह कथन मैनुअल के किसी अन्य क्षेत्र से अन्य कथन के विपरीत है जो बताता है कि: "जब आप एक संग्रहीत कार्य बनाते हैं, तो आपको यह घोषित करना होगा कि यह नियतात्मक है या यह डेटा को संशोधित नहीं करता है। अन्यथा, यह डेटा रिकवरी या प्रतिकृति के लिए असुरक्षित हो सकता है। डिफ़ॉल्ट रूप से, क्रिएट फंक्शन स्टेटमेंट को स्वीकार किए जाने के लिए, कम से कम DETERMINISTIC, NO SQL, या READS SQL DATA को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। अन्यथा एक त्रुटि होती है "

मुझे व्यक्तिगत रूप से MySQL 5.5 में त्रुटि मिली है अगर कोई घोषणा नहीं है, तो मैं हमेशा "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" या "READS SQL DATA" की कम से कम एक घोषणा को ध्यान में रखते हुए घोषणा कर सकता हूं, चाहे मेरी कोई भी घोषणा हो।

READS SQL DATA यह स्पष्ट रूप से MySQL को बताता है कि फ़ंक्शन केवल डेटाबेस से डेटा को पढ़ेगा, इस प्रकार, इसमें ऐसे निर्देश नहीं हैं जो डेटा को संशोधित करते हैं, लेकिन इसमें SQL निर्देश हैं जो डेटा को पढ़ते हैं (eq SELECT)।

SQL SQL डेटा यह इंगित करता है कि दिनचर्या में ऐसे कथन होते हैं जो डेटा लिख ​​सकते हैं (उदाहरण के लिए, इसमें UPDATE, INSERT, DELETE या अन्य निर्देश शामिल हैं)।

NO SQL यह इंगित करता है कि दिनचर्या में SQL कथन नहीं हैं।

CONTAINS SQL यह इंगित करता है कि रूटीन में SQL निर्देश हैं, लेकिन डेटा को पढ़ने या लिखने वाले कथन शामिल नहीं हैं। यह डिफ़ॉल्ट है यदि इनमें से कोई भी विशेषता स्पष्ट रूप से नहीं दी गई है। ऐसे कथनों के उदाहरण अभी सेलेक्ट हैं (), सिलेक्ट 10 + @ b, SET @x = 1 या DO RELEASE_LOCK ('abc'), जो निष्पादित करते हैं लेकिन न तो डेटा पढ़ते हैं और न ही लिखते हैं।

ध्यान दें कि वहाँ MySQL फ़ंक्शंस हैं जो नियतात्मक सुरक्षित नहीं हैं, जैसे: अब (), यूयूआईडी (), आदि, जो विभिन्न मशीनों पर अलग-अलग परिणाम उत्पन्न करने की संभावना रखते हैं, इसलिए एक उपयोगकर्ता फ़ंक्शन जिसमें ऐसे निर्देश शामिल हैं, उन्हें डीईएफ़टीआरआईएसआईसी नहीं घोषित किया जाना चाहिए। । इसके अलावा, एक फ़ंक्शन जो एक अप्रकाशित स्कीमा से डेटा पढ़ता है वह स्पष्ट रूप से NONDETERMINISTIC है। *

एक दिनचर्या की प्रकृति का आकलन निर्माता की "ईमानदारी" पर आधारित है: MySQL यह जाँच नहीं करता है कि एक नियमित घोषित DETERMINISTIC उन बयानों से मुक्त है जो nondeterministic परिणाम उत्पन्न करते हैं। हालाँकि, किसी दिनचर्या को गलत बताने से परिणाम प्रभावित हो सकते हैं या प्रदर्शन प्रभावित हो सकते हैं। एक नॉनडेटेर्मिनिस्टिक रूट को डीटेल्टिमिंटिक के रूप में घोषित करने से ऑप्टिमाइज़र को गलत निष्पादन विकल्प चुनने में अप्रत्याशित परिणाम हो सकते हैं। NONDETERMINISTIC के रूप में एक नियतात्मक दिनचर्या की घोषणा उपलब्ध उपयोग नहीं होने के कारण उपलब्ध प्रदर्शन के कारण प्रदर्शन को कम कर सकता है।


क्या आप मुझे समझा सकते हैं कि पृष्ठभूमि में क्या हुआ?
ASR

2
मुझे संदेह है कि डेटाबेस में एक फ़ंक्शन है जो डेटा को संशोधित करता है (इसमें अपडेट है, स्टेटमेंट डालें या डिलीट करें)। अधिक जानकारी के लिए, यहां देखें: dev.mysql.com/doc/refman/5.0/en/stored-programs-log.html
डोनल

1
आपको हमेशा बैकअप लेना चाहिए
डोनाल्ड

यह सुपर विशेषाधिकार की जरूरत है!
फेलिप मोरालेस

यह कोशिश की, लेकिन अभी भी गैर नियतात्मक समस्या, किसी अन्य सुझाव मिला है? धन्यवाद
एडविन बर्मेज़ो

40
  • जब आप एक संग्रहीत कार्य बनाते हैं, तो आपको यह घोषित करना होगा कि यह नियतात्मक है या यह डेटा को संशोधित नहीं करता है। अन्यथा, यह डेटा रिकवरी या प्रतिकृति के लिए असुरक्षित हो सकता है।

  • डिफ़ॉल्ट रूप से, क्रिएट फंक्शन स्टेटमेंट को स्वीकार करने के लिए, कम से कम एक डीएटीएमआईएनआईएसआईसी, नो एसक्यूएल, या रीड एसक्यूएल डेटा को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। अन्यथा एक त्रुटि होती है:

इस समस्या को ठीक करने के लिए रिटर्न और बिफोर स्टेटमेंट के बाद निम्नलिखित पंक्तियों को जोड़ें:

READS SQL DATA
DETERMINISTIC

उदाहरण के लिए :

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN

इस मुद्दे के बारे में अधिक जानकारी के लिए कृपया यहाँ पढ़ें


यह काम करता है क्योंकि सेटिंग READS SQL DATAतीनों में से सबसे कम प्रतिबंधात्मक है। यदि आपका फ़ंक्शन NO SQLया DETERMINISTICश्रेणी में आता है, तो आप अपने कार्यों को संशोधित करके प्रदर्शन में सुधार कर सकते हैं। दूसरी ओर, सेटिंग READS SQL DATAभी कम से कम त्रुटि प्रवण है। इसलिए यदि आप गलत तरीके से उपयोग करते हैं NO SQLया DETERMINISTICआपको गलत परिणाम मिल सकते हैं।
जोनाथन 21

@ SunnyS.M, READS SQL DATA DETERMINISTIC के रूप में बहुत बढ़िया व्याख्या। इस समस्या को ठीक करने के बाद रिटर्न और बिफोर स्टेटमेंट के बाद निम्न पंक्तियों को जोड़ें:
Md हैदर अली खान

4

डोनाल्ड की टिप्पणी के बाद:

बाइनरी लॉगिंग सक्षम होने पर यह चर लागू होता है।

मुझे बस इतना करना था:

  1. my.cnf में निष्क्रिय log_bin (#log_bin)
  2. mysql को पुनरारंभ करें
  3. आयात DB
  4. log_bin सक्षम करें
  5. mysql को पुनरारंभ करें

उस कदम से समस्या का समाधान हुआ।

(मैं सुधार के सुझाव देने के लिए प्रोग्रामर के कोड की समीक्षा करूँगा)


3

जब आपका कार्य नियतात्मक होता है, तो आप इसे निर्धारक घोषित करने के लिए सुरक्षित होते हैं। "DETERMINISTIC" कीवर्ड का स्थान निम्नानुसार है।

यहां छवि विवरण दर्ज करें


2

विंडोज 10 पर,

मैंने बस निम्नलिखित करके इस मुद्दे को हल किया।

  1. गोटो my.ini और इन 2 लाइनों को [mysqld] के तहत जोड़ें

    skip-log-bin
    log_bin_trust_function_creators = 1
  2. MySQL सेवा को पुनरारंभ करें


ऐसा करने के बाद, मुझे गुलाम पर त्रुटि मिली -Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
रामरतन गुप्ता

0

फ़ंक्शन के लिए निश्चित सेट करने का प्रयास करें!

इसलिए इसके बजाय

CREATE FUNCTION get_pet_owner

आप को कुछ लिखेंगे

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

जो करता है, तो उपयोगकर्ता काम करने के लिए चाहिए prodacmin कार्य / प्रक्रियाओं बनाने के लिए अधिकार है।

मेरे मामले में MySQL कार्यक्षेत्र के माध्यम से उत्पन्न होने पर फ़ंक्शन ने काम किया लेकिन SQL स्क्रिप्ट के रूप में सीधे चलाने पर काम नहीं किया। ऊपर दिए गए बदलाव समस्या को तय करते हैं।

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