আপনি কীভাবে মাইএসকিউএল সঞ্চিত প্রক্রিয়াগুলি ডিবাগ করবেন?


125

সঞ্চিত প্রক্রিয়া ডিবাগ করার জন্য আমার বর্তমান প্রক্রিয়াটি খুব সহজ। আমি "ডিবাগ" নামে একটি সারণী তৈরি করি যেখানে আমি সঞ্চয়ের পদ্ধতি থেকে চলক মানগুলি সন্নিবেশ করায় it এটি আমাকে স্ক্রিপ্টের একটি নির্দিষ্ট বিন্দুতে কোনও ভেরিয়েবলের মান দেখতে দেয়, তবে মাইএসকিউএল সংরক্ষিত পদ্ধতিগুলি ডিবাগ করার জন্য এর চেয়ে ভাল উপায় কি থাকতে পারে?


2
উইন্ডোজবিহীন ব্যবহারকারীদের জন্য কি কোনও জিইউআই বিকল্প রয়েছে? সঞ্চিত প্রক্রিয়াগুলি ডিবাগ করার জন্য উইন্ডোজের একটি অনুলিপি চালানো কিছুটা লাফাই। আপনি বেশিরভাগ সারণী সন্নিবেশ বিকল্পগুলি ব্যর্থ হয় যদি আপনি কোনও লেনদেনে চলে যাচ্ছেন যা আপনি রোলব্যাক করছেন to
কোড বিদ্বেষক

উত্তর:


44

আমি আপনার সাথে খুব অনুরূপ কিছু করি।

আমি সাধারণত একটি DEBUG পরম অন্তর্ভুক্ত করব যা মিথ্যাতে ডিফল্ট হয় এবং আমি রান সময় সত্যতে সেট করতে পারি। তারপরে ডিবাগের বিবৃতিগুলিকে একটি "যদি DEBUG" ব্লকে মুড়ে দিন।

আমি আমার অনেক কাজের সাথে একটি লগিং টেবিলও ব্যবহার করি যাতে আমি প্রক্রিয়া এবং সময় পর্যালোচনা করতে পারি। আমার ডিবাগ কোড পাশাপাশি আউটপুট পায়। আমি কলিং পরম নাম, একটি সংক্ষিপ্ত বিবরণ, সারি গণ্য প্রভাবিত (উপযুক্ত হলে), একটি মন্তব্য ক্ষেত্র এবং একটি সময় স্ট্যাম্প অন্তর্ভুক্ত।

ভাল ডিবাগিং সরঞ্জামগুলি সমস্ত এসকিউএল প্ল্যাটফর্মগুলির এক করুণ ব্যর্থতা।


3
সমস্ত প্ল্যাটফর্ম @ বিবি প্রবস্ট নয়, সিবাজ ডিবাগিং সরঞ্জামগুলি ট্রিগার এবং সঞ্চিত পদ্ধতিগুলির ব্রেক ব্রেকপয়েন্ট ডিবাগ সহ শান্ত শালীন নয়
অনুপ

69

নিম্নলিখিত debug_msgপ্রক্রিয়াটি কেবল কনসোলে একটি ডিবাগ বার্তা আউটপুট করতে বলা যেতে পারে:

DELIMITER $$

DROP PROCEDURE IF EXISTS `debug_msg`$$
DROP PROCEDURE IF EXISTS `test_procedure`$$

CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
  IF enabled THEN
    select concat('** ', msg) AS '** DEBUG:';
  END IF;
END $$

CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER)
BEGIN
  SET @enabled = TRUE;

  call debug_msg(@enabled, 'my first debug message');
  call debug_msg(@enabled, (select concat_ws('','arg1:', arg1)));
  call debug_msg(TRUE, 'This message always shows up');
  call debug_msg(FALSE, 'This message will never show up');
END $$

DELIMITER ;

তারপরে পরীক্ষাটি চালান:

CALL test_procedure(1,2)

এটি নিম্নলিখিত আউটপুট ফলাফল করবে:

** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up

8
এটি ফাংশনগুলির জন্য কাজ করে না বলে মনে হচ্ছে এবং কেন তা আমার কোনও ধারণা নেই। এটি সর্বদা "ত্রুটি কোড: 1415 দেয় a একটি ফাংশন থেকে ফলাফল সেট ফেরত দেওয়ার অনুমতি নেই"। কোন আশ্রয় আছে?
প্যাট্রিক এম

1
@ পেট্রিকএম ফাংশনগুলি সারিগুলি ("ফলাফল") ফিরিয়ে দিতে পারে না, যখন এই ডিবাগ পদ্ধতিটি তার উপর নির্ভর করে (ডিবাগ বার্তাগুলি পদ্ধতি কলগুলিতে প্রাপ্ত ফলাফলসেটগুলি হয়)। ফাংশনগুলিতে, INSERT INTO my_log_table (message) VALUES (msg)ফাংশন কলগুলি শেষ হয়ে গেলে আপনি কেবল এবং সম্ভবত সমস্ত ডিবাগ বার্তাগুলি পুনরুদ্ধার করতে পারেন (যেমন: আপনি পদ্ধতিতে ফিরে এসেছেন)
জেনোস

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

28

হ্যাঁ, এই ধরণের জিনিসটির জন্য একটি বিশেষ সরঞ্জাম রয়েছে - মাইএসকিউএল ডিবাগার
এখানে চিত্র বর্ণনা লিখুন


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

4
এটি নিখুঁত নয় তবে এটির সাথে আমার ট্রায়ালটি উপরের @ ক্যালগগুলি জানিয়েছে যে তার থেকে খুব আলাদা অভিজ্ঞতা হয়েছে। সরঞ্জামটি দুর্দান্ত এবং লাইটওয়েট এবং কোনও ফোলা ছাড়াই প্রয়োজন এমন কাজ করা বলে মনে হচ্ছে। এটি পরীক্ষিত অন্যান্য সরঞ্জামগুলির তুলনায় আমার চেয়ে অনেক ভাল অভিজ্ঞতা ছিল (যেমন ভিজ্যুয়াল স্টুডিও, টোড এবং ডিবিফর্স স্টুডিও, যার মধ্যে প্রধান ত্রুটি ছিল - এই সমস্তকে তুলনায় তুলনায় "মোট ধ্বংসস্তূপ" হিসাবে বর্ণনা করবে)। নিশ্চিত না যে এটি হ'ল কারণ ফাংশনটি ডিবাগ হওয়ার কারণে কোনও ত্রুটিযুক্ত নির্মাণকে অন্তর্ভুক্ত করা হয়নি বা সমস্যাগুলি স্থির হয়েছে কিনা।
স্টিভ চেম্বারস

2
আমার সঞ্চিত পদ্ধতিগুলি ডিবাগ করার জন্যও এই সরঞ্জামটি বেশ কার্যকর বলে মনে হয়েছিল।
ralfe

22

একটি মাইএসকিউএল সঞ্চিত পদ্ধতিটি কীভাবে ডিবাগ করবেন।

দরিদ্র মানস ডিবাগার:

  1. দুটি কলাম সহ লগটবেল নামে একটি সারণী তৈরি করুন id INTএবং log VARCHAR(255)

  2. আইডি কলামটি স্বতঃসংশোধন করুন।

  3. এই পদ্ধতিটি ব্যবহার করুন:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
  4. আপনি এই টেবিলে কোনও বার্তা লগ করতে চাইলে এই কোডটি রাখুন।

    call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));

কী চলছে তা নির্ধারণ করার জন্য এটি একটি দুর্দান্ত দ্রুত এবং নোংরা ছোট্ট লগার।


21

আছে সঞ্চিত পদ্ধতি ডিবাগ করার জন্য গুই সরঞ্জাম মাইএসকিউএল ইন / কার্যকারিতা ও স্ক্রিপ্ট। মাইএসকিউএল এর জন্য dbForge স্টুডিওতে একটি শালীন সরঞ্জামের রয়েছে সমৃদ্ধ কার্যকারিতা এবং স্থায়িত্ব।


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

10

মাইএসকিএলের জন্য ডিবাগারটি ভাল ছিল তবে এটি বিনামূল্যে নয়। আমি এখন এটি ব্যবহার করি:

DELIMITER GO$

DROP PROCEDURE IF EXISTS resetLog

GO$

Create Procedure resetLog() 
BEGIN   
    create table if not exists log (ts timestamp default current_timestamp, msg varchar(2048)) engine = myisam; 
    truncate table log;
END; 

GO$

DROP PROCEDURE IF EXISTS doLog 

GO$

Create Procedure doLog(in logMsg nvarchar(2048))
BEGIN  
  insert into log (msg) values(logMsg);
END;

GO$

সঞ্চিত পদ্ধতিতে ব্যবহার:

call dolog(concat_ws(': ','@simple_term_taxonomy_id',  @simple_term_taxonomy_id));

সঞ্চিত পদ্ধতি ব্যবহার:

call resetLog ();
call stored_proc();
select * from log;

8

আরেকটি উপায় এখানে উপস্থাপন করা হয়

http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html

কাস্টম ডিবাগ মাইএসকিএল পদ্ধতি এবং লগিং সারণী সহ।

আপনি নিজের কোডে একটি সাধারণ নির্বাচন করতে পারেন এবং এটি কার্যকর করা হয়েছে কিনা তা দেখতে পারেন।

SELECT 'Message Text' AS `Title`; 

আমি এই ধারণা পেয়েছিলাম

http://forums.mysql.com/read.php?99,78155,78225#msg-78225

এছাড়াও কেউ গিটহাবে কাস্টম ডিবাগ পদ্ধতির জন্য একটি টেম্পলেট তৈরি করেছেন।

এখানে দেখো

http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines

এখানে উল্লেখ করা হয়েছিল

মাইএসকিএল-এর জন্য ট্রিগার এবং স্টোর পদ্ধতিতে কোনও ব্যতিক্রম কীভাবে ধরা যায়?


7

ডেটা সেটগুলির বর্তমান স্থিতি পরীক্ষা করতে আমি কেবল সঞ্চিত পদ্ধতির মূল ক্ষেত্রগুলিতে কেবল নির্বাচিত বিবৃতি রাখি এবং তারপরে তাদের মন্তব্য (- নির্বাচন করুন ...) বা উত্পাদনের আগে তাদের অপসারণ করি।


7

আমি পার্টিতে দেরি করেছি, তবে আরও বিয়ার এনেছি:

http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ এবং https://github.com/ocelot-inc/ocelotgui

আমি চেষ্টা করেছিলাম, এবং এটি বেশ স্থিতিশীল বলে মনে হচ্ছে, ব্রেকপয়েন্টগুলি এবং পরিবর্তনশীল পরিদর্শনকে সমর্থন করে।

এটি একটি সম্পূর্ণ স্যুট নয় (মাত্র 4,1 এমবি) তবে আমাকে অনেক সাহায্য করেছে!

এটি কীভাবে কাজ করে: এটি আপনার মাইএসকিএল ক্লায়েন্টের সাথে সংহত করে (আমি উবুন্টু 14.04 ব্যবহার করছি), এবং আপনি মৃত্যুদণ্ড কার্যকর করার পরে:

$install
$setup yourFunctionName

এটি আপনার সার্ভারে একটি নতুন ডাটাবেস ইনস্টল করে, যা ডিবাগিং প্রক্রিয়াটিকে নিয়ন্ত্রণ করে। তাই:

$debug yourFunctionName('yourParameter')

আপনার কোডটি ধাপে ধাপে ধাপে ধাপে দেওয়ার সুযোগ দেবে এবং আপনার ভেরিয়েবলগুলি "রিফ্রেশ" করবে আপনি আপনার কোডের অভ্যন্তরে কী চলছে তা আরও ভালভাবে দেখতে পারবেন।

গুরুত্বপূর্ণ টিপ: ডিবাগ করার সময়, আপনি পরিবর্তন করতে পারেন (পদ্ধতিটি পুনরায় তৈরি করুন)। পুনরায় তৈরির পরে, এক্সিকিউট করুন: $ প্রস্থান এবং একটি নতুন $ ডিবাগের আগে সেটআপ

এটি "সন্নিবেশ" এবং "লগ" পদ্ধতির বিকল্প। আপনার কোড অতিরিক্ত "ডিবাগ" নির্দেশাবলীতে মুক্ত থাকে।

স্ক্রীনশট:

ocelot ব্রেকপয়েন্ট পদক্ষেপ


6

মাইএসকিউএল সংযোগকারী / নেট 6.6 এর সঞ্চিত পদ্ধতি এবং কার্যাদি ডিবাগ করার বৈশিষ্ট্য রয়েছে

ডিবাগার ইনস্টল করা হচ্ছে

সঞ্চিত পদ্ধতি ডিবাগার সক্ষম করতে:

  • সংযোগকারী / নেট 6.6 এর জন্য: সংযোগকারী / নেট 6.6 ইনস্টল করুন এবং সম্পূর্ণ বিকল্পটি চয়ন করুন।
  • সংযোগকারী / নেট 6.7 এবং তার পরে: ভিজুয়াল স্টুডিওর জন্য মাইএসকিউএল পণ্যটি ইনস্টল করুন, যার সাথে সঞ্চিত পদ্ধতি ডিবাগারটি অন্তর্ভুক্ত।

ডিবাগার শুরু হচ্ছে

ডিবাগারটি শুরু করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  • ভিজ্যুয়াল স্টুডিও সার্ভার এক্সপ্লোরারটিতে একটি সংযোগ চয়ন করুন।
  • সঞ্চিত পদ্ধতি ফোল্ডারটি প্রসারিত করুন। কেবলমাত্র সঞ্চিত প্রক্রিয়া সরাসরি ডিবাগ করা যায়। কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ডিবাগ করার জন্য, একটি সঞ্চিত
    প্রক্রিয়া তৈরি করুন যা ফাংশনটিকে কল করে।
  • সঞ্চিত পদ্ধতি নোডে ক্লিক করুন, তারপরে ডান ক্লিক করুন এবং প্রসঙ্গ মেনু থেকে ডিবাগ রুটিন নির্বাচন করুন।

5

মাইএসকিএল সংযোগকারী / নেট এছাড়াও সংস্করণ 6.6 হিসাবে ভিজ্যুয়াল স্টুডিওতে সংহত একটি স্টোরেজ পদ্ধতি ডিবাগার অন্তর্ভুক্ত করে, আপনি এখানে ইনস্টলার এবং উত্স পেতে পারেন: http://dev.mysql.com/downloads/connector/net/

কিছু ডকুমেন্টেশন / স্ক্রিনশট: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

আপনি এখানে ঘোষণাগুলি অনুসরণ করতে পারেন: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

আপডেট: ভিজ্যুয়াল স্টুডিওর জন্য মাইএসকিএল সংযোগকারী / নেট থেকে আলাদা পণ্য হিসাবে বিভক্ত করা হয়েছে, আপনি এটিকে এখানে (ডিবাগার সহ) বেছে নিতে পারেন https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (এখনও ফ্রি এবং ওপেন সোর্স)।

অস্বীকৃতি: আমি সেই বিকাশকারী যিনি ভিজুয়াল স্টুডিও পণ্যের জন্য মাইএসকিউএল এর জন্য সঞ্চিত পদ্ধতি ডিবাগার ইঞ্জিনটি রচনা করেছিলেন।


মাইএসকিউএল এবং সংযোগকারী। নেট ব্যবহার করার সময় মাল্টি-হোস্ট সংযোগ স্ট্রিংয়ের সাথে একটি সমস্যা রয়েছে। আমি বিষয়টি এখানে ব্যাখ্যা করেছি .. আমি ভাবছিলাম যে কেউ এই বিষয়টি খতিয়ে দেখছে কিনা? এটি আমাদের অনেকের জন্য বেশ খানিকটা সমস্যা সৃষ্টি করেছে। নেট বিকাশকারীরা যারা মাইএসকিউএল ব্যবহার করেন ...
হুমান বাহরিনী

1
শুনে শুনে দুঃখিত, আমি আরাকল-এ আর কাজ করি না এবং ফ্রি সময়ও বেশি পাই না, আমি মাইএসকিউএল সহায়তার সাথে যোগাযোগ করার পরামর্শ দিই।
ফার্নান্দো গঞ্জালেজ সানচেজ

4

মাইএসকিউএলের জন্য প্রথম এবং স্থিতিশীল ডিবাগারটি মাইএসকিউএল এর জন্য ডিবিফোরজ স্টুডিওতে রয়েছে


3

প্রক্রিয়া এবং ফাংশন ডিবাগ করতে আমার দুটি পৃথক সরঞ্জাম ব্যবহার হয়েছিল:

  1. dbForge - অনেকগুলি কার্যকরী mysql GUI।
  2. মাইডিবাগার - ডিবাগিংয়ের জন্য বিশেষায়িত সরঞ্জাম ... ডিবাগিংয়ের জন্য সহজ সরঞ্জাম। ভোট http://tinyurl.com/voteimg

3

মাইএসকিউএল ব্যবহারকারী সংজ্ঞায়িত ভেরিয়েবল (সেশনে ভাগ করা) লগিং আউটপুট হিসাবে ব্যবহার করা যেতে পারে:

DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
  SET @stmt = CONCAT('SELECT * FROM ', tableName);
  PREPARE pStmt FROM @stmt;
  EXECUTE pStmt;
  DEALLOCATE PREPARE pStmt;
  -- uncomment after debugging to cleanup
  -- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;

আউটপুট হবে:

SELECT * FROM foo

1

টুড মাইএসকিএল। এখানে একটি ফ্রিওয়্যার সংস্করণ রয়েছে http://www.quest.com/toad-for-mysql/


1
আমি কয়েক বছর ধরে টোড ব্যবহার করেছি তবে সচেতন ছিলাম না যে এটির স্প্রোকগুলি ডিবাগ করার জন্য কোনও বিশেষ বৈশিষ্ট্য রয়েছে। আপনি কীভাবে টডকে এটি করতে ব্যবহার করতে পারেন তা স্পষ্ট করে বলতে পারেন?
কোরি হাউস

এখনই মাইএসকিএলের জন্য টড 6.3 এ দেখে মনে হচ্ছে ব্রেকপয়েন্ট এবং সমস্ত কিছুর সাথে ডিবাগ বৈশিষ্ট্য রয়েছে। আপনার অর্থ কি ডিবাগ বৈশিষ্ট্যটি কাজ করছে না? অথবা হতে পারে আপনার সংস্করণটি পুরানো এবং ডিবাগ বৈশিষ্ট্যটি অন্তর্ভুক্ত নয়?
জয়েস

1

সংশ্লিষ্ট উত্তর এই @Brad পার্ক দ্বারা নিশ্চিত নন মাইএসকিউএল সংস্করণ সম্পর্কে, কিন্তু খনি 5.6, অত: পর একটি সামান্য বিট টোয়েকিং কাজ ছিল:

আমি একটি ফাংশন তৈরি করেছি debug_msgযা ফাংশন (প্রক্রিয়া নয়) এবং পাঠ্য (অক্ষরের সীমা নেই) ফেরত দেয় এবং তারপরে ফাংশনটিকে নীচে নির্বাচন করুন debug_msg(প্যারাম) এএস হিসাবে কল করুন my_res_set:

CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1
    READS SQL DATA
BEGIN
    IF enabled=1 THEN
    return concat('** DEBUG:', "** ", msg);
    END IF;
END

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`(
 IN RegionID VARCHAR(20),
 IN RepCurrency INT(11),
 IN MGID INT(11),
 IN VNC VARCHAR(255)
)
BEGIN
    SET @enabled = TRUE;
    SET @mainQuery = "SELECT * FROM Users u";
    SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`;
    SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30);
    SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`;
END $$
DELIMITER
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.