Отладка триггеров MySQL - PullRequest
       8

Отладка триггеров MySQL

14 голосов
/ 25 января 2012

Я люблю триггеры по одной причине - они просто работают. Я ненавижу триггеры по одной причине - когда они не работают, забудьте о попытке отладки. О сладкое разочарование.

По сути, я хочу увидеть, что был выполнен запрос на обновление, удаление, вставку и т. Д. Я хочу увидеть этот запрос ... где-нибудь, в моем терминале или журнале, как именно и когда MySQL выполняет его, и, возможно, любые соответствующие выходные данные / ошибки. Мысли / хаки?

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

DELIMITER |
CREATE TRIGGER ireallyhateyourightnow AFTER UPDATE ON watch_this_table
FOR EACH ROW BEGIN
 IF (OLD.my_value != NEW.my_value) THEN
  update 
   my_table
  set 
   my_column = NEW.my_value;
 END IF;
END|
DELIMITER ;

Вот еще один дополнительный контекст, который может помочь повлиять на предложение или ответ. Опять же, я менее заинтересован в семантике / синтаксисе и больше заинтересован в том, чтобы MySQL выполнял запрос, но во что бы то ни стало, я открыт для всего на данный момент.

  • Strace не работает / показывает запрос.
  • Среда без репликации, НО, если в журналах бина отображаются операторы триггера, я обязательно это настрою.
  • Показывает ли "полный список процессов" выполнение триггера и / или операторы, выполняемые внутри (я никогда не вижу их после запуска show full processlist так быстро, как это может выполнить perl, но я могу просто пропустить его)?
  • Общий журнал запросов не показывает эти запросы (конечно, не журнал ошибок).
  • Я больше не использую псевдонимы.
  • Нет синтаксических ошибок при создании триггера.
  • Оператор IF работает.
  • Когда я вставляю NEW значения в таблицу «test / temp» и вручную запускаю запрос на обновление, он работает (я даже дошел до того, что фактически вставил весь запрос на обновление)
  • Я не могу показать вам запрос, но, как я только что упомянул, он работает, когда я запускаю вручную, если это помогает.
  • Я удалил все ошибочные символы, вкладки, возврат каретки, новые строки и т. Д.
  • Сокет MySQL будет показывать только локальное соединение / данные, но не внутреннюю работу MySQL, я думаю.
  • MyISAM, поэтому журналы INNODB недоступны
  • Похоже, что больше ничего не было полезно.
  • Я использую MySQL 5.0.77 в CentOS 5.5.

Ответы [ 3 ]

6 голосов
/ 06 июля 2017

Существует альтернативный способ проверки его с помощью временной debug таблицы .В этом примере они создают ее в собственной базе данных debug.

Шаг 1: Создание таблицы

DROP TABLE IF EXISTS debug;
CREATE TABLE debug (
  proc_id varchar(100) default NULL,
  debug_output text,
  line_id int(11) NOT NULL auto_increment,
  PRIMARY KEY  (line_id)
)

Шаг 2: Создание SP отладки для заполнения таблицы отладки

DELIMITER $$

DROP PROCEDURE IF EXISTS `debug_insert` $$
CREATE PROCEDURE `debug_insert`(in p_proc_id varchar(100),in p_debug_info text)
begin
  insert into debug (proc_id,debug_output)
  values (p_proc_id,p_debug_info);
end $$

DROP PROCEDURE IF EXISTS `debug_on` $$
CREATE PROCEDURE `debug_on`(in p_proc_id varchar(100))
begin
  call debug_insert(p_proc_id,concat('Debug Started :',now()));
end $$

DROP PROCEDURE IF EXISTS `debug_off` $$
CREATE PROCEDURE `debug_off`(in p_proc_id varchar(100))
begin
  call debug_insert(p_proc_id,concat('Debug Ended :',now()));
  select debug_output from debug where proc_id = p_proc_id order by line_id;
  delete from debug where proc_id = p_proc_id;
end $$

Шаг 3: Вызов SP отладки в вашем триггере

Как это,

CREATE PROCEDURE test_debug()
begin
declare l_proc_id varchar(100) default 'test_debug';
  call debug_on(l_proc_id);
  call debug_insert(l_proc_id,'Testing Debug');
  call debug_off(l_proc_id);
end $$

В результате таблица отладки будет заполнена следующим образом:

+------------------------------------+
| debug_output                       |
+------------------------------------+
| Debug Started :2006-03-24 16:10:33 |
| Testing Debug                      |
| Debug Ended :2006-03-24 16:10:33   |
+------------------------------------+
3 голосов
/ 25 января 2012

Вы можете отладить триггеры , используя dbForge Studio for MySQL .Попробуйте пробную версию.

Подробное описание процесса отладки триггера приведено в документации: Отладка \ Отладка хранимых подпрограмм \ Практическое руководство. Отладка триггера.

0 голосов
/ 20 января 2017

MYSQL PROCEDURE => incron => tail -f 'mysql_dynamic.log'

Хранимая процедура может быть вызвана внутри триггера, но ничего не должна возвращать

CREATE PROCEDURE `DYN_LOG` (IN s VARCHAR(500))
BEGIN
SELECT s into outfile '/var/spool/incron/mysql_dynamic_spool/foo_file';
DO SLEEP(.1);   // create a gap beetween multiple shuts
END

Теперь в любом месте триггера вы можете вызвать

CREATE TRIGGER `trig_name` BEFORE UPDATE ON `tb_name` 
FOR EACH ROW
BEGIN
CALL DYN_LOG(concat_ws('\t',NEW.col1,NEW.col2));
... 
// rest of the code
END

для машин Linux apt-get install incron (руководство по Debian Incron)

Создать папку, в которую mysql будет вставлять foo_file

mkdir -m 777 /var/spool/incron/mysql_dynamic_spool
incrontab -e

и добавить следующее задание incron

/var/spool/incron/mysql_dynamic_spool IN_CREATE /path/foo_file_procesor $@/$#

Создать исполняемый скрипт "/ path / foo_file_procesor"

#!/bin/sh
# // $1 is the foo_file absolute addres
body="$( cat $1 )" // read file content
rm  $1
log=/var/log/mysql_dynamic.log    // message collector
echo "`date "+%y%m%d %H:%M:%S"`\t== dyn_log ==\t$body">>$log
exit 0

Теперь смотрите файл сборщика

tail -f /var/log/mysql_dynamic.log 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...