在我们的日常开发中,经常需要将一个已有的数据库导到另一个数据库。通过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中都有DEFINERDEFINER是用于表示SQL在执行时候的权限,它的语法是:username%hostnamehostname可以使用%通配符匹配所有主机。然后检查同步的那台数据库用户名,并不是root,于是将root替换成那台数据库的用户名,再次同步就OK了。

扫描二维码,在手机上阅读!