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

125

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

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

Ответы:

44

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

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

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

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

Боб Пробст
источник
3
Не все платформы @Bob Probst, инструменты отладки sybase вполне приличны с отладкой точки останова для триггера и хранимых процедур
Anup
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
Похоже, это не работает для FUNCTIONS, и я понятия не имею, почему. Он всегда выдает «Код ошибки: 1415. Не разрешено возвращать набор результатов из функции». Есть ли выход?
Patrick M
1
Функции @PatrickM не могут возвращать строки ("результат"), пока эта процедура отладки полагается на него (сообщения отладки - это наборы результатов, возвращаемые при вызове процедуры). В функциях вы можете INSERT INTO my_log_table (message) VALUES (msg)получить все отладочные сообщения только после завершения вызовов функций (т.е. вы вернетесь к процедуре)
Xenos
Этот подход хорош, но запись в консоль не эффективна в MySQL Workbench, как IDE. потому что каждый оператор «select» открывает новую панель результатов. Я думаю, что лучше создать временную таблицу журнала для регистрации сообщений об ошибках с отметкой времени и именем процедуры
mustafa kemal tuna
28

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

Джордж
источник
5
Я так хотел попробовать. К сожалению, это полный обломок. Я получаю сообщение об ошибке «функция объединения не существует» предположительно от mysql, в результате чего графический интерфейс неправильно разветвляется через код SP (хотя MySQL выполняет его правильно). Не говоря уже о локальных переменных "DECLARE var DEFAULT value". Они просто отображаются как NULL, когда это явно не так. Да, а также «Необъявленный идентификатор: 'FETCH_RADIUS_DISTSORT'», где это был скомпилированный оператор. Не рекомендуется.
kellogs
4
Это не идеально, но мое испытание с этим было совершенно другим опытом, чем описанное выше @kellogs. Инструмент красивый и легкий, и кажется, что он делает только нужную работу без лишних усилий. Для меня это был гораздо лучший опыт, чем любой из других испытанных инструментов (например, Visual Studio, Toad и dbForge Studio, у всех из которых были серьезные недостатки - в сравнении все это можно было бы охарактеризовать как «полный мусор»). Не уверен, связано ли это с тем, что отлаживаемая функция не включала ни одну из ошибочных конструкций, или проблемы были исправлены.
Стив Чемберс,
2
Я также нашел этот инструмент весьма полезным для отладки моих хранимых процедур.
ralfe 07
22

Как отлаживать хранимую процедуру 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));

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

Эрик Лещинский
источник
21

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

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

Отладчик для 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;
Тон Škoda
источник
8

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

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?

Джереми С.
источник
7

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

Машина золы
источник
7

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

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

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

Скриншот:

шаговая точка останова оцелота

Марсело Аморим
источник
6

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

Установка отладчика

Чтобы включить отладчик хранимых процедур:

  • Для Connector / Net 6.6: установите Connector / Net 6.6 и выберите опцию Complete.
  • Для Connector / Net 6.7 и новее: установите продукт MySQL для Visual Studio, которому принадлежит отладчик хранимых процедур.

Запуск отладчика

Чтобы запустить отладчик, выполните следующие действия:

  • Выберите соединение в Visual Studio Server Explorer.
  • Разверните папку хранимых процедур. Непосредственно отлаживать можно только хранимые процедуры. Чтобы отладить пользовательскую функцию, создайте сохраненный
    процедуру, которая вызывает эту функцию.
  • Щелкните узел хранимой процедуры, затем щелкните правой кнопкой мыши и в контекстном меню выберите «Debug Routine».
Рахул Трипати
источник
5

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 ...
Хуман Бахрейни
1
Сожалеем, что я больше не работаю в Oracle, и у меня мало свободного времени, я предлагаю обратиться в службу поддержки MySQL.
Фернандо Гонсалес Санчес
4

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

Zoitc2014
источник
3

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

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

Пользовательская переменная 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
clarkttfu
источник
1

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

Джойс
источник
1
Я использовал Toad в течение многих лет, но не знал, что у него есть какие-либо специальные функции для отладки sprocs. Не могли бы вы пояснить, как вы для этого используете Toad?
Cory House
Только что посмотрел Toad 6.3 для mysql, похоже, есть функция отладки с точками останова и всем остальным. Вы имеете в виду, что функция отладки не работает? Или, может быть, ваша версия старше и не включает функцию отладки?
Joyce
1

Ответ, соответствующий этому, от @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
Анируддха
источник