編寫出這些指令碼的需求是把慢查日誌寫入資料庫中,方便檢視。
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 ;
MySQL儲存過程 批量為使用者授權
編寫出這些指令碼的需求是把慢查日誌寫入資料庫中,方便檢視。1.由於預設的mysql.slow log表使用的是csv資料引擎,不支援對資料進行索引,所以需要將其修改為myisam引擎,並對query time欄位進行索引以優化查尋效率。2.需要對所有的使用者進行授權,讓大家要可通過呼叫 pub ge...
mysql 儲存過程批量更新
最近做乙個批量更新的操作,由於是臨時需求,就想著在資料庫直接操作,不在 裡動手了,結合網上的一些資料,做如下處理 1.先建立乙個臨時表,匯入需要變動的資料 drop table if exists t barcode create table t barcode barcode varchar 32...
mysql 新增使用者 mysql建立使用者與授權
一 建立使用者 create user username host identified by password 說明username 你將建立的使用者名稱 host 指定該使用者在哪個主機上可以登陸,如果是本地使用者可用localhost,如果想讓該使用者可以從任意遠端主機登陸,可以使用萬用字元 ...