MySQL儲存過程 批量為使用者授權

2021-06-25 19:26:18 字數 3528 閱讀 1617

編寫出這些指令碼的需求是把慢查日誌寫入資料庫中,方便檢視。

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,如果想讓該使用者可以從任意遠端主機登陸,可以使用萬用字元 ...