Хайде малко по работа.
Имам си аз една стара мечта – да си дебъгвам процедурите (т.н. store procedure) в базата данни. И това от поне 4-5 години. И като говорим за дебъгване – търсех нещо съвсем просто и тривиално – докато се изпълнява процедурата с цялата околна логика (apache,php,mysql) – да мога да отпечатвам някъде (файл,конзола, друго) желана от мен информация. Тъй като използвам MySQL (а напоследък MariaDB), то официална удобна възможност определено липсва.
При търсене в мрежата излизаха два типа решения.Първите съветваха да се ползва временна таблица в която да се инсъртват записи с необходимата информация за дебъгването. Вторите рекламираха комерсиални продукти, които (уж) имат вградени дебъгери за процедурите, работещи по класическия тип (breakpoint, GoInto,…), но не това търсех.
И така до вчера, когато за пореден път седях и гледах една процедура като черна кутия – кво й се случва. И спасението дойде. Благодарение на моя добър приятел и колега Жоро „George“ Кодинов – получих този линк. Хората са направили логичното – написали lib_mysqludf_log. Това e малко C код, който може да се компилира като UDF и прави точно това което искам – викаш функция с един параметър насред процедурата и тя печати в error лог-а на mysql.
select log_error(‘I am here …’);
Захванах се да тествам. Разбира се – веднага се оказа, че е рано да се радвам – точно този UDF го няма наготово компилиран. Има само сорс. За щастие хората са написали много добро описание как да си го компилира сам човек под Windows и Linux. Естествено, под Linux е 1 ред, а под Windows … не питай – прочети
Но какво да се прави – удобството изисква жертви – захванах се и след 2-3 часа имах готов компилиран dll. (Антон имаше след 5 мин … под Linux и MariaDB)
Последваха следващите изненади – dll-a се зарежда нормално, функцията се изпълнява нормално, но … няма никой в error лог-а. Още 30 минути за четене и установяване, че UDF-a ползва т.н. stderr, който при работа на MySQL като Windows Service не може да пише в error лога. Греда. Решенията са две. Или редактиране на C код-а така че да пише директно във файл, което не ми е по силите, или пускане на MySQL в конзола вместо като service. Второто отне точно 10 секунди и всичко тръгна.
Така че вече си имам работещо решение за лесно дебъгване на store procedure в MySQL/MariaDB и мислите да убия тях или себе си намаляха 🙂
Ето и малко ресурси наготово
- Компилиран lib_mysqludf_log.dll за WinXP/MySQL5.x
- Сорс – lib_mysqludf_log.c – с малки добавки за да може да се компилира под Windows
- Компилиран lib_mysqludf_log.so – под Ubunto 10.4
А вие как дебъгвате процедурите си за MySQL ?
Бате, бате,
где ти е линка „I like it“ и сподели във facebook? 😛
Аре влачи.
Ма какъв номер ми свиха от хелпа на фейсбук-а.
Който не може да помни – да си пише като мен
1. MySQL-а се пуска в конзола под Windows най-просто като копираш реда с който го пуска в Services.
В общия случай е : C:\Documents and Settings\user>“C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt“ –defaults-file=“C:\Program Files\MySQL\MySQL Server 5.0\my.ini“
2. След като се стартира – резултатите от select log_error(‘I am here …’); да се търсят в
C:\Program Files\MySQL\MySQL Server 5.0\data\{pc_hostname}.err лог файла
3. Ако при използването на select log_error() в store procedure получите грешка от типа
SQL Error:2014 Commands out of sync; you can’t run this command now
то проблемът се решава като се изхитрите така;
DECLARE t INT;
select log_error(„I am here“) into t;