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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 5

Отладка хранимой процедуры MySQL.

Отладчик бедных мужчин:

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

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

  • Используйте эту процедуру:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
    
  • Поместите этот код в любом месте, где хотите записать сообщение в таблицу.

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

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

Ответ 6

Отладчик для 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;

Ответ 7

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

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?

Ответ 8

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

Ответ 9

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

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

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

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

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

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

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

Ответ 10

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

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

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

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

ocelot breakpoint stepping

Ответ 11

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.

Ответ 12

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

Ответ 13

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

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

Ответ 15

Ответ, соответствующий этому @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

Ответ 16

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