SQLyog的架构同步工具的一个问题
在我们的日常开发中,经常需要将一个已有的数据库导到另一个数据库。通过SQLyog的同步工具可以很方便的完成这个操作。SQLyog是一款强大的MySQL客户端,类似于SQL SERVER的SSMS。SQLyog的同步有两个,架构同步和数据库同步。架构同步包括:表结构、视图、存储过程、函数、触发器、事件的同步,数据库同步则是同步所有表中的数据。一般的操作步骤是先将架构同步过去,然后再同步数据。
今天在工作中需要同步一个数据库,在同步架构的时候总是报错:
OPERATIO need to be executed set by ADMIN
一开始是没注意,忽略了该错误。后来才发现存储过程和触发器都没有同步过去。将同步的触发器和存储过程的SQL代码拷出来如下:
/* Create Trigger in target */
DELIMITER $$
CREATE
/*!50017 DEFINER = 'root'@'%' */
TRIGGER `insert_tasklog_trigger` BEFORE INSERT ON `task_status_log`
FOR EACH ROW BEGIN
INSERT INTO task_status_log_2 (
channelcode,
success,
createtime,
machine_id,
ip,
crawltime,
task_id,
proxy,
error
) VALUES (
new.channelcode,
new.success,
NOW(),
new.machine_id,
new.ip,
new.crawltime,
new.task_id,
new.proxy,
new.error
);
END;
$$
DELIMITER ;
/* Create Procedure in target */
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `clear_expired_log`()
BEGIN
DELETE FROM `log` WHERE expiretime< NOW() - INTERVAL 1 MINUTE;
END$$
DELIMITER ;
最终发现问题,这两条SQL中都有DEFINER
,DEFINER
是用于表示SQL在执行时候的权限,它的语法是:username%hostname
,hostname
可以使用%
通配符匹配所有主机。然后检查同步的那台数据库用户名,并不是root,于是将root替换成那台数据库的用户名,再次同步就OK了。