编写出这些脚本的需求是把慢查日志写入数据库中,方便查看。
1. 由于默认的mysql.slow_log表使用的是csv数据引擎,不支持对数据进行索引,所以需要将其修改为myisam引擎,并对query_time字段进行索引以优化查寻效率。
2. 需要对所有的用户进行授权,让大家要可通过调用 pub_getslowquery( limit ) 存储过程获取一天的慢查记录数据。
3. 存储过程命名约定:priv_ 起头的为私有存储过程,不需要对用户授权,以pub_起头的存储过程对所有的会员进行授权,只允许运行,不可修改和删除。
-- 修改慢查日志表结构,添加索引优化查寻速度drop procedure if exists `mysql`.`priv_setslowlogengine`;delimiter $$create procedure `mysql`.`priv_setslowlogengine`() comment '修改慢查设置'begin /** 关闭慢查记录 */ set global slow_query_log=0; /** 修改存储方式 */ set global log_output='table'; /** 记录日志的执行时间 */ set global long_query_time=3; /** 修改表引擎 */ alter table `mysql`.`slow_log` engine=myisam; /** 添加索引 */ alter table `mysql`.`slow_log` add index `query_time`(`query_time`); /** 开启慢查记录 */ set global slow_query_log=1;end$$delimiter ;-- 获取慢查寻句子列表drop procedure if exists `mysql`.`pub_getslowquery`;delimiter $$create procedure `mysql`.`pub_getslowquery`(in top int) comment '获取慢查记录'begin /** * 昨天凌晨一点的时间 * 业务需求是每天凌晨时间执行,所以是取昨天凌晨到当前时间的所有慢查日志 */ declare yesterday datetime; select concat_ws(' ', date_sub(curdate(),interval 1 day), '00:00:00') into yesterday; set @sql=concat(select * from `mysql`.`slow_log` where `query_time`>0 order by `query_time` desc limit 0,top); /** 使用预处理执行sql句子 */ prepare m from @sql; execute m; deallocate prepare m;end$$delimiter ;-- 授权操作drop procedure if exists `mysql`.`priv_granttoprocedure`;delimiter $$create procedure `mysql`.`priv_granttoprocedure`( in procedurename varchar(30) ) comment '对存储过程授权'begin declare not_found_data int default 0; declare username varchar(20) default ''; declare hostname varchar(20) default ''; /** * 将用户列表读入游标 */ declare users cursor for select `user`,`host` from mysql.user where `user`!='csc86'; declare continue handler for not found set not_found_data=1; open users; while not_found_data=0 do fetch users into username,hostname; set @sql=concat('grant execute on procedure `mysql`.`',procedurename,'` to `',username,'`@`',hostname,'`'); /** 使用预处理执行sql句子 */ prepare m from @sql; execute m; deallocate prepare m; end while; close users;end$$delimiter ;-- 将mysql库中以pub_开头的存储过程对所有用户授权drop procedure if exists `mysql`.`priv_setprivileges`;delimiter $$create procedure `mysql`.`priv_setprivileges`() comment '设置调用存储过程权限'begin /** * 游标 */ declare not_found_data int default 0; /** * 存储过程名称 */ declare proc_name varchar(30) default ''; /** * 读取所有公开的存储过程 */ declare procedures cursor for select `name` from `mysql`.`proc` where `db`='mysql' and `type`='procedure' and `name` regexp '^pub_'; /** * 到达游标尾部时,设置not_found_data为1 */ declare continue handler for not found set not_found_data = 1; /** * 打开游标进入循环 */ -- priv_granttoprocedure open procedures; truncate table mysql.`procs_priv`; while not_found_data=0 do fetch procedures into proc_name; call priv_granttoprocedure( proc_name ); end while; /** 关闭游标 */ close procedures; /** 刷新权限 */ flush privileges;end$$delimiter ;