এর ঘোষণায় ডিজিটারমিনিস্টিক, কোনও এসকিউএল, বা এসকিউএল ডেটা পড়েনি এবং বাইনারি লগিং সক্ষম করা হয়েছে


120

মাইএসকিএলে ডাটাবেস আমদানি করার সময়, আমি নিম্নলিখিত ত্রুটি পেয়েছি:

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)

আমার কোন জিনিসগুলি বদলাতে হবে তা আমি জানি না। কীভাবে কেউ আমাকে সমাধান করতে সাহায্য করতে পারেন?

উত্তর:


259

এটি ঠিক করার দুটি উপায় রয়েছে:

  1. মাইএসকিউএল কনসোলে নিম্নলিখিতটি সম্পাদন করুন:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Mysql.ini কনফিগারেশন ফাইলে নিম্নলিখিতটি যুক্ত করুন:

    log_bin_trust_function_creators = 1;

সেটিংটি অ-নিষেধাজ্ঞামূলক ফাংশনগুলির জন্য চেকিং শিথিল করে। অ-নিরোধক ফাংশন হ'ল ফাংশন যা ডেটা সংশোধন করে (যেমন আপডেট আছে, সন্নিবেশ করানো বা বিবৃতি (গুলি) মুছুন)। আরও তথ্যের জন্য, এখানে দেখুন

দয়া করে নোট করুন, বাইনারি লগিং সক্ষম না করা থাকলে এই সেটিংটি প্রয়োগ হয় না।

সঞ্চিত প্রোগ্রামগুলির বাইনারি লগিং

যদি বাইনারি লগিং সক্ষম না হয় তবে লগ_বিন_স্রোত_ফাংশন_স্রষ্টাকর প্রয়োগ হয় না।

লগ_বিন_টাস্ট_ফাংশন_ক্রিটর

বাইনারি লগিং সক্ষম থাকলে এই পরিবর্তনশীল প্রযোজ্য।

সর্বাধিক পদ্ধতি হ'ল সঞ্চিত ফাংশনগুলির জন্য নির্ধারিত ঘোষণাগুলির আরও ভাল বোঝা এবং ব্যবহার। এই ঘোষণাগুলি মাইএসকিউএল দ্বারা প্রতিলিপিটি অনুকূলকরণ করতে ব্যবহৃত হয়েছে এবং স্বাস্থ্যকর প্রতিরূপ ধারণ করার জন্য এগুলি সাবধানতার সাথে বেছে নেওয়া ভাল জিনিস।

বিশিষ্টতা একটি রুটিনকে " নিয়ামবাদী " হিসাবে বিবেচনা করা হয় যদি এটি সর্বদা একই ইনপুট পরামিতিগুলির জন্য একই ফলাফল তৈরি করে এবং অন্যথায় নির্ধারণ করে না। এটি বেশিরভাগ ক্ষেত্রে স্ট্রিং বা ম্যাথ প্রসেসিংয়ের সাথে ব্যবহৃত হয় তবে এটি সীমাবদ্ধ নয়।

"ডিটার্মিনিস্টিক" এর বিপরীতে ডিটার্মিনস্টিক নয় । " তন্ন তন্ন নির্ণায়ক কিংবা না নির্ণায়ক রুটিন সংজ্ঞা দেওয়া হয়, ডিফল্ট সেটি নিয়ামক নয়। ডিক্লেয়ার, আপনি নির্ণায়ক স্পষ্টভাবে উল্লেখ করতে হবে একটি ফাংশন নিয়ন্ত্রণবাদী হয়। "। সুতরাং দেখে মনে হচ্ছে যদি কোনও বিবৃতি না দেওয়া হয়, মাইএসকিউএলটি ফাংশনটিকে "নট ডিটার্মিনিস্টিক" হিসাবে বিবেচনা করবে। ম্যানুয়াল থেকে এই বিবৃতিটি ম্যানুয়ালটির অন্য একটি ক্ষেত্রের অন্যান্য বিবৃতিটির সাথে বিরোধী যা এটি বলে যে: "আপনি যখন কোনও সঞ্চিত ফাংশন তৈরি করেন, আপনাকে অবশ্যই তা ঘোষণা করতে হবে যে এটি নির্বিচারক বা এটি ডেটা পরিবর্তন করে না ify অন্যথায়, এটি তথ্য পুনরুদ্ধার বা প্রতিরূপের জন্য অনিরাপদ হতে পারে। ডিফল্টরূপে, একটি ক্রিয়েট ফাংশনটি স্বীকার করার জন্য, অন্তত একটি ডিজিটরমিস্টিক, কোনও এসকিউএল, বা রিড এসকিউএল ডেটা অবশ্যই স্পষ্টভাবে নির্দিষ্ট করতে হবে। অন্যথায় একটি ত্রুটি ঘটে "

মাইএসকিউএল 5.5 এ আমি ব্যক্তিগতভাবে ত্রুটি পেয়েছি যদি কোনও ঘোষণা না থাকে, তাই আমি সর্বদা কমপক্ষে একটি বিবরণ "ডিটার্মিনিস্টিক", "ডিজিটারমিনিস্টিক নয়", "ন এসকিউএল" বা "রিড এস এসকিউএল ডেটা" রাখি না কেন, আমার অন্যান্য ঘোষণাগুলি নির্বিশেষে।

এসকিউএল ডেটা পড়া

পরিবর্তিত এসকিউএল ডেটা এটি নির্দেশ করে যে রুটিনে স্টেটমেন্ট থাকে যা ডেটা লিখতে পারে (উদাহরণস্বরূপ, এটি আপডেট, INSERT, মোছা বা ALTER নির্দেশাবলী ধারণ করে)।

কোন এসকিউএল এটি নির্দেশ করে যে রুটিনে কোনও এসকিউএল বিবৃতি নেই।

এসকিউএল কনটেন করুন এটি নির্দেশ করে যে রুটিনে এসকিউএল নির্দেশাবলী রয়েছে তবে এতে ডেটা পড়তে বা লেখার বিবৃতি থাকে না। এই বৈশিষ্ট্যগুলির কোনও একটিও স্পষ্টভাবে না দেওয়া থাকলে এটি ডিফল্ট। এ জাতীয় বিবৃতিগুলির উদাহরণগুলি হ'ল নির্বাচন করুন এখন (), নির্বাচন করুন 10 + @ বি, SET @ x = 1 বা ডিও রিলিজ_লোক ('অ্যাবসি'), যা এক্সিকিউট করে কিন্তু ডেটা পড়তে বা লিখতে পারে না।

নোট করুন যে মাইএসকিউএল ফাংশনগুলি ডিটারমিনিস্টিক নিরাপদ নয়, যেমন: NOW (), ইউআইডি (), ইত্যাদি, যা বিভিন্ন মেশিনে বিভিন্ন ফলাফল আনার সম্ভাবনা রয়েছে, সুতরাং এই জাতীয় নির্দেশাবলীর সাথে একটি ব্যবহারকারীর ফাংশন অবশ্যই বিশদ নয় বলে ঘোষণা করা উচিত । এছাড়াও, এমন একটি ফাংশন যা একটি অনিবন্ধিত স্কিমা থেকে ডেটা পাঠ করে তা স্পষ্টভাবে NONDETERMINISTIC। *

রুটিনের প্রকৃতির মূল্যায়ন নির্মাতার "সততা" এর উপর ভিত্তি করে: মাইএসকিউএল পরীক্ষা করে না যে একটি রুটিন ঘোষিত একটি রুটিন বিবৃতিমুক্ত, যা নির্ধারিত ফলাফল প্রকাশ করে results তবে একটি রুটিনকে ভুলভাবে ঘোষণা করা ফলাফলগুলিকে প্রভাবিত করতে পারে বা কার্য সম্পাদনকে প্রভাবিত করতে পারে। DETERMINISTIC হিসাবে একটি অ-সংজ্ঞাবিরোধী রুটিন ঘোষণার ফলে অপ্টিমাইজারকে ভুল কার্যকর প্রয়োগ পরিকল্পনার পছন্দগুলি তৈরি করার কারণে অপ্রত্যাশিত ফলাফল হতে পারে। NONDETERMINISTIC হিসাবে একটি নিয়ন্ত্রক রুটিন ঘোষণার ফলে উপলব্ধ অপ্টিমাইজেশন ব্যবহার না করার কারণে কর্মক্ষমতা হ্রাস পেতে পারে।


আপনি কি আমাকে ব্যাখ্যা করতে পারেন যে ব্যাকগ্রাউন্ডে কি হয়েছিল?
এএসআর

4
আমার সন্দেহ হয় যে ডাটাবেসের একটি ফাংশন রয়েছে যা ডেটা সংশোধন করে (এতে একটি আপডেট রয়েছে, এতে বিবৃতি সন্নিবেশ করুন বা মুছুন)। আরও তথ্যের জন্য, এখানে দেখুন: dev.mysql.com/doc/refman/5.0/en/stored-program-logging.html
ডোনাল

4
আপনার সর্বদা ব্যাকআপ নেওয়া উচিত
ডোনাল

এটি সুপার সুবিধাগুলি প্রয়োজন!
ফিলিপ

এটি চেষ্টা করেও তবুও নন ডিস্ট্রিমেন্টিক সমস্যা, অন্য কোনও পরামর্শ? ধন্যবাদ
এডউইন বার্মেজো

48
  • আপনি যখন কোনও সঞ্চিত ফাংশন তৈরি করেন, আপনাকে অবশ্যই তা ঘোষণা করতে হবে যে এটি নির্বিচারক বা এটি ডেটা পরিবর্তন করে না ify অন্যথায়, এটি তথ্য পুনরুদ্ধার বা প্রতিরূপের জন্য অনিরাপদ হতে পারে।

  • ডিফল্টরূপে, একটি ক্রিয়েট ফাংশনটি স্বীকার করার জন্য, অন্তত একটি ডিটার্মমিনিস্টিক, কোনও এসকিউএল, বা রিড এসকিউএল ডেটা অবশ্যই স্পষ্টভাবে নির্দিষ্ট করতে হবে। অন্যথায় একটি ত্রুটি ঘটে:

এই সমস্যাটি সমাধানের জন্য নীচের রেখাগুলি যুক্ত করুন রিটার্নের পরে এবং বিবৃতি শুরুর আগে:

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ভুল ফলাফল পেতে পারেন।
জোনাথন

: @ SunnyS.M, রাউন্ডআপ মতো জট্টিল ব্যাখ্যা এসকিউএল ডেটা DETERMINISTIC.To এই সমস্যাটি অ্যাড লাইন ফেরার পর নিম্নলিখিত সংশোধন এবং করার আগে বিবৃতি শুরু করুন
মোঃ হায়দার আলী খান

লক্ষ্য করুন মাইএসকিউএল ম্যানুয়াল রাজ্যের "। একটি ফাংশন প্রকৃতির অ্যাসেসমেন্ট স্রষ্টা সততা উপর ভিত্তি করে তৈরি মাইএসকিউএল পরীক্ষা না একটি ফাংশন ঘোষণা করে যে নিয়ন্ত্রণবাদী বিবৃতি যে nondeterministic ফল থেকে মুক্ত হল"
BadHorsie

5

আপনার ফাংশন যখন ডিটারমিনিস্টিক হয় তখন আপনি এটিকে নির্বিচারবাদী হিসাবে ঘোষণা করতে নিরাপদ হন। নিম্নলিখিত হিসাবে "DETERMINISTIC" কীওয়ার্ডের অবস্থান।

এখানে চিত্র বর্ণনা লিখুন


4

ডোনাল্ড এর মন্তব্য নিম্নলিখিত:

বাইনারি লগিং সক্ষম থাকলে এই পরিবর্তনশীল প্রযোজ্য।

আমাকে যা করতে হয়েছিল তা হ'ল:

  1. my.cnf (# লগ_বিন) এ লগ_বিন অক্ষম
  2. মাইএসকিএল পুনরায় আরম্ভ করুন
  3. আমদানি ডিবি
  4. লগ_বিন সক্ষম করুন
  5. মাইএসকিএল পুনরায় আরম্ভ করুন

যে আমদানি সমস্যা আউট পদক্ষেপ।

(তারপরে আমি উন্নতির পরামর্শ দেওয়ার জন্য প্রোগ্রামার কোডটি পর্যালোচনা করব)


3

উইন্ডোজ 10 এ,

আমি কেবল নিম্নলিখিতটি করে এই সমস্যাটি সমাধান করেছি।

  1. My.ini এ যান এবং [মাইএসকিএলডি] এর অধীনে এই 2 লাইন যুক্ত করুন

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  2. মাইএসকিউএল পরিষেবাটি পুনরায় চালু করুন


এটি করার পরে, আমি দাসের উপর ত্রুটি পেয়েছি -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

যদি ব্যবহারকারী প্রোডাকমিনের ফাংশন / পদ্ধতি তৈরির অধিকার থাকে তবে এটি কাজ করা উচিত ।

আমার ক্ষেত্রে ফাংশনটি যখন মাইএসকিউএল ওয়ার্কবেঞ্চের মাধ্যমে উত্পন্ন হয়েছিল তখন কাজ করেছিল তবে সরাসরি এসকিউএল স্ক্রিপ্ট হিসাবে চালানোর সময় কাজ করেনি। উপরে পরিবর্তনগুলি করা সমস্যার সমাধান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.