Если вы используете репликацию, то может случаться, что она отваливается, когда на мастер сервере производите модификации в хранимых процедурах/функциях.

Например в известной программе для управления базами данных 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

Published

03 November 2011

Category

howto

Tags

SHARE THIS ARTICLE