Как отлаживать хранимые процедуры MySQL?

Мой текущий процесс отладки хранимых процедур очень прост. Я создаю таблицу под названием «отладка», в которую вставляю значения переменных из хранимой процедуры по мере ее выполнения. Это позволяет мне видеть значение любой переменной в заданном месте сценария, но есть ли лучший способ отладки хранимых процедур MySQL?

Есть ли варианты графического интерфейса для пользователей, отличных от Windows? Необходимость запускать копию Windows только для отладки хранимых процедур - это своего рода скачок. И большинство параметров вставки таблицы не работают, если вы находитесь в транзакции, которую вы собираетесь откатить.

Code Abominator 13.03.2015 05:02
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
132
1
186 343
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Я просто помещаю операторы выбора в ключевые области хранимой процедуры, чтобы проверить текущее состояние наборов данных, а затем закомментировать их (--select ...) или удалить их перед производством.

Да, я поступаю точно так же. Я помещаю оператор выбора и проверяю состояние таблиц и связанных значений. Иногда я использую временную таблицу для вставки значений в таблицы, и как только решение найдено, я удаляю временные таблицы и эти операторы выбора.

user1710989 06.11.2020 13:14
Ответ принят как подходящий

Я делаю что-то очень похожее на тебя.

Обычно я включаю параметр DEBUG, который по умолчанию имеет значение false, и я могу установить значение true во время выполнения. Затем оберните операторы отладки в блок «If DEBUG».

Я также использую таблицу регистрации для многих своих заданий, чтобы я мог просматривать процессы и сроки. Там же выводится мой код отладки. Я включаю имя вызывающего параметра, краткое описание, количество затронутых строк (при необходимости), поле комментариев и отметку времени.

Хорошие инструменты отладки - один из печальных недостатков всех платформ SQL.

Не все платформы @Bob Probst, инструменты отладки sybase вполне приличны с отладкой точки останова для триггера и хранимых процедур.

Anup 10.06.2015 14:03

Да, для этого есть специализированные инструменты - Отладчик MySQL.

я так хотел попробовать. К сожалению, это полный обломки. Я получаю сообщение об ошибке «функция объединения не существует» предположительно от mysql, в результате чего графический интерфейс неправильно разветвляется через код SP (хотя MySQL выполняет его правильно). Не говоря уже о локальных переменных "DECLARE var DEFAULT value". Они просто отображаются как NULL, когда это явно не так. Да, а также «Необъявленный идентификатор: 'FETCH_RADIUS_DISTSORT'», где это был скомпилированный оператор. Не рекомендуется.

kellogs 08.10.2013 06:26

Это не идеально, но мое испытание с этим было совсем другим, чем описанное выше @kellogs. Инструмент красивый и легкий, и кажется, что он выполняет всю необходимую работу без лишних усилий. Для меня это был гораздо лучший опыт, чем любой другой протестированный инструмент (например, Visual Studio, Toad и dbForge Studio, у всех из которых были серьезные недостатки - в сравнении все это можно было бы охарактеризовать как «полный мусор»). Не уверен, связано ли это с тем, что отлаживаемая функция не включала ни одну из ошибочных конструкций, или проблемы были исправлены.

Steve Chambers 04.08.2016 12:28

Я также нашел этот инструмент весьма полезным для отладки моих хранимых процедур.

ralfe 07.06.2017 12:42

Я не мог найти способ использовать его в качестве триггера. Не уверен, что есть способ его использовать.

Smruti R Tripathy 17.03.2021 22:17

В MySQL есть Инструменты графического интерфейса для отладки хранимых процедур / функции и скрипты. Достойный инструмент dbForge Studio for MySQL, обладающий богатой функциональностью и стабильностью.

Трудно найти, на каких платформах работает этот инструмент отладки. Кажется, работает в Windows. Что-нибудь еще?

Guy 14.07.2016 20:20

Первый и стабильный отладчик для MySQL находится в dbForge Studio for MySQL.

Жаба mysql. Есть бесплатная версия http://www.quest.com/toad-for-mysql/

Я использовал Toad в течение многих лет, но не знал, что у него есть какие-либо специальные функции для отладки sprocs. Не могли бы вы пояснить, как вы для этого используете Toad?

Cory House 05.06.2012 15:54

Только что посмотрел на Toad 6.3 для mysql, похоже, есть функция отладки с точками останова и всем остальным. Вы имеете в виду, что функция отладки не работает? Или, может быть, ваша версия старше и не включает функцию отладки?

Joyce 05.06.2012 20:26

Мне приходилось использовать два разных инструмента для отладки процедур и функций:

  1. dbForge - много функциональный графический интерфейс mysql.
  2. MyDebugger - специализированный инструмент для отладки ... удобный инструмент для отладки.голосование http://tinyurl.com/voteimg

Другой способ представлен здесь

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

с настраиваемыми процедурами отладки mySql и таблицами журналов.

Вы также можете просто поместить простой выбор в свой код и посмотреть, будет ли он выполнен.

SELECT 'Message Text' AS `Title`; 

Я получил эту идею от

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

Также кто-то создал шаблон для пользовательских процедур отладки на GitHub.

Глянь сюда

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

Здесь упоминалось

Как отловить любое исключение в триггерах и процедурах хранения для mysql?

MySql Connector / NET также включает отладчик хранимых процедур, интегрированный в Visual Studio с версии 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

ОБНОВЛЕНИЕ: MySql для Visual Studio был выделен из Connector / NET в отдельный продукт, вы можете выбрать его (включая отладчик) здесь https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (все еще бесплатно и с открытым исходным кодом).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я был разработчиком, создавшим механизм отладчика хранимых процедур для продукта MySQL для Visual Studio.

При использовании MySQL и Connector .NET возникает проблема со строкой подключения с несколькими хостами. Я объяснил проблему здесь ... Мне было интересно, собирается ли кто-нибудь разбираться в этом? Это вызвало немало проблем для многих из нас .Net-разработчиков, использующих MySQL ...

Hooman Bahreini 18.12.2019 05:27

Сожалеем, что я больше не работаю в Oracle, и у меня нет много свободного времени, я предлагаю связаться со службой поддержки MySQL.

Fernando Gonzalez Sanchez 19.12.2019 00:51

Следующая процедура 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

Похоже, это не работает для FUNCTIONS, и я понятия не имею, почему. Он всегда выдает «Код ошибки: 1415. Не разрешено возвращать набор результатов из функции». Есть ли выход?

Patrick M 29.07.2015 00:29

Функции @PatrickM не могут возвращать строки ("результат"), пока эта процедура отладки полагается на него (сообщения отладки - это наборы результатов, возвращаемые при вызове процедуры). В функциях вы можете только INSERT INTO my_log_table (message) VALUES (msg) и, возможно, получить все отладочные сообщения после завершения вызовов функций (то есть: вы вернулись в процедуру)

Xenos 06.07.2017 11:42

Этот подход хорош, но запись в консоль неэффективна в MySQL Workbench, как IDE. потому что каждый оператор «select» открывает новую панель результатов. Я думаю, что лучше создать временную таблицу журнала для регистрации сообщений об ошибках с отметкой времени и именем процедуры.

mustafa kemal tuna 14.06.2020 08:46

Как отлаживать хранимую процедуру MySQL.

Бедный отладчик:

  1. Создайте таблицу с именем logtable с двумя столбцами, id INT и log VARCHAR(255).

  2. Сделайте автоинкремент столбца id.

  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));
    

Это хороший быстрый и грязный регистратор, чтобы выяснить, что происходит.

Отладчик для mysql был хорош, но не бесплатным. Вот что я использую сейчас:

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;

MySQL Connector / Net 6.6 имеет функцию Отладка хранимых процедур и функций

Installing the Debugger

To enable the stored procedure debugger:

  • For Connector/Net 6.6: Install Connector/Net 6.6 and choose the Complete option.
  • For Connector/Net 6.7 and later: Install the product MySQL for Visual Studio, to which the stored procedure debugger belongs.

Starting the Debugger

To start the debugger, follow these steps:

  • Choose a connection in the Visual Studio Server Explorer.
  • Expand the Stored Procedures folder. Only stored procedures can be debugged directly. To debug a user-defined function, create a stored
    procedure that calls the function.
  • Click on a stored procedure node, then right-click and from the context menu choose Debug Routine.

Я опоздала на вечеринку, но принесла еще пива:

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

Я пробовал, и он кажется довольно стабильным, поддерживая точки останова и проверку переменных.

Это не полный набор (всего 4,1 Мб), но мне очень помог!

Как это работает: Он интегрируется с вашим клиентом mysql (я использую Ubuntu 14.04), и после выполнения:

$install
$setup yourFunctionName

Он устанавливает новую базу данных на вашем сервере, которая контролирует процесс отладки. Так:

$debug yourFunctionName('yourParameter')

даст вам возможность шаг за шагом пройтись по вашему коду, и «обновив» ваши переменные, вы сможете лучше видеть, что происходит внутри вашего кода.

Важный совет: возможно, при отладке вы измените (заново создадите процедуру). После повторного создания выполните: $ exit и $ setup перед новым $ debug

Это альтернатива методам "вставки" и "журнала". Ваш код не содержит дополнительных инструкций по отладке.

Снимок экрана:

ocelot breakpoint stepping

Ответ, соответствующий это от @Brad Parks Не уверен насчет версии MySQL, но моя была 5.6, поэтому немного поработал:

Я создал функцию debug_msg, которая является функцией (а не процедурой) и возвращает текст (без ограничения символов), а затем вызываю функцию как SELECT debug_msg (params) AS 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

Пользовательская переменная MySQL (совместно используемая в сеансе) может использоваться в качестве вывода журнала:

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

Другие вопросы по теме