MySQL: Модификация хранимой процедуры/функции
Если вы используете репликацию, то может случаться, что она отваливается, когда на мастер сервере производите модификации в хранимых процедурах/функциях.
Например в известной программе для управления базами данных Adminer под функцией с названием “Alter procedure” скрывается выполнение атомарных операций DROP и CREATE. При этом, если модифицируемая процедура/функция активно используются в триггерах, то возможна ситуация, когда триггер будет вызывать процедуру, которой уже нет, а это в свою очередь повлечёт отключение репликации.
Кроме того DROP может выполниться, а CREATE нет, например если забыть указать [NOT] DETERMINISTIC для функции, или просто допустили ошибку в теле процедуры/функции. В такой ситуации можно избежать проблем, повесив блокировки на таблицы в которых “дёргается” триггер использующий процедуру или можно воспользоваться следующим подходом:
DELIMITER ;;
CREATE PROCEDURE `proc_name_new`(...)
BEGIN
...
END;;
DELIMITER ;
BEGIN
UPDATE `mysql`.`proc`
SET name = `proc_name_timestamp`, specific_name = 'proc_name_timestamp'
WHERE db = 'dbname' AND name = 'proc_name';
UPDATE `mysql`.`proc`
SET name = 'proc_name_new', specific_name = 'proc_name'
WHERE db = 'dbname' AND name = 'proc_name_new';
UPDATE `mysql`.`procs_priv`
SET Routine_name = 'proc_name_timestamp'
WHERE Db = 'dbname' AND Routine_name = 'proc_name';
UPDATE `mysql`.`procs_priv`
SET Routine_name = 'proc_name'
WHERE Db = 'dbname' AND Routine_name = 'proc_name_new';
COMMIT;
FLUSH PRIVILEGES;
Have a fun!
blog comments powered by Disqus