當前位置:首頁 » 存儲配置 » mysql執行存儲過程許可權

mysql執行存儲過程許可權

發布時間: 2025-09-06 09:33:40

⑴ mysql 存儲過程執行太慢怎麼優化

1.當我們請求mysql伺服器的時候,MySQL前端會有一個監聽,請求到了之後,伺服器得到相關的SQL語句,執行之前(虛線部分為執行),還會做許可權的判斷
2.通過許可權之後,SQL就到MySQL內部,他會在查詢緩存中,看該SQL有沒有執行過,如果有查詢過,則把緩存結果返回,說明在MySQL內部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啟的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因為查詢緩存要求SQL和參數都要一樣,所以這個命中率是非常低的(沒什麼卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對應的結果,那麼就到了解析器,解析器主要對SQL語法進行解析
4.解析結束後就變成一顆解析樹,這個解析樹其實在Hibernate裡面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因為在Hibernate裡面有HQL,它就是通過這個工具轉換成SQL的,我們編程語言之所以有很多規范、語法,其實就是為了便於這個解析器解析,這個學過編譯原理的應該知道.
5.得到解析樹之後,不能馬上執行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經過任何優化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什麼地方,如果有計算的東西,把計算的結果算出來等等...
6.預處理完畢之後,此時得到一棵比較規范的樹,這棵樹就是要拿去馬上做執行的樹,比起之前的那棵樹,這棵得到了一些優化
7.查詢優化器,是MySQL裡面最關鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎麼去執行?它是先執行username = toby還是password = 1?每一條SQL的執行順序查詢優化器就是根據MySQL對數據統計表的一些信息,比如索引,比如表一共有多少數據,MySQL都是有緩存起來的,在真正執行SQL之前,他會根據自己的這些數據,進行一個綜合的判定,判斷這一次在多種執行方式裡面,到底選哪一種執行方式,可能運行的最快.這一步是MySQL性能中,最關鍵的核心點,也是我們的優化原則.我們平時所講的優化SQL,其實說白了,就是想讓查詢優化器,按照我們的想法,幫我們選擇最優的執行方案,因為我們比MySQL更懂我們的數據.MySQL看數據,僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據這些信息選了一個它自認為最優的方案,但是這個方案可能和我們想像的不一樣.
8.這里的查詢執行計劃,也就是MySQL查詢中的執行計劃,比如要先執行username = toby還是password = 1
9.這個執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行這一份傳過來的計劃,到磁碟中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什麼?就是硬碟的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據這個時間的IO來確定的.那怎麼執行IO又是什麼來確定的?就是傳過來的這一份執行計劃.(優化就是制定一個我們認為最快的執行方案,最節省IO,和執行最快)
10.如果開了查詢緩存,則返回結果給客戶端,並且查詢緩存也放一份。

⑵ 為什麼MySQL不建議使用存儲過程mysql不建議存儲過程

為什麼MySQL不建議使用存儲過程?
存儲過程是一段可以被調用的SQL語句集合,可以實現復雜的業務邏輯和數據操作。然而,在MySQL中,存儲過程並不是一種被廣泛使用的數據處理方式,反而被建議避免使用。那麼,為什麼MySQL不建議使用存儲過程呢?
1.性能問題
存儲過程需要在資料庫中編寫和存儲,相比於應用程序的代碼,存儲過程的執行效率相對較低。這是因為存儲過程的執行需要經過多次判斷和查詢,而且每次執行都需要從資料庫中讀取存儲過程的定義。因此,如果存儲過程的執行非常頻繁,會給資料庫帶來較大的負擔和性能瓶頸。
另外,存儲過程的執行計劃也可能得不到優化。資料庫引擎在執行存儲過程時,無法像對待普通SQL語句那樣生成優化的查詢計劃,導致存儲過程的執行效率較低。而且在存儲過程中使用大量的代碼也會導致性能降低。
2.可維護性問題
存儲過程的代碼與應用程序代碼不同,它們通常是在資料庫端進行維護和升級。當業務邏輯發生變化時,需要修改存儲過程的代碼,並在資料庫中重新定義。與應用程序相比,這種操作比較繁瑣,可能導致維護困難。
此外,存儲過程的修改也會對資料庫的操作帶來影響。新的存儲過程可能需要重新編譯和執行計劃優化,這將佔用資料庫的大量資源,影響其它用戶的操作。如果存儲過程的代碼出現嚴重的錯誤,可能會導致資料庫服務的崩潰,影響應用程序的正常運行。
3.安全問題
存儲過程需要在資料庫中定義和存儲,這就意味著它們與資料庫的許可權和安全設置相關。如果存儲過程的許可權設置不當,可能會導致資料庫的安全風險。例如,存儲過程中可能包含敏感信息的讀取和修改操作,如果存儲過程的調用者許可權設置不當,可能會發生數據泄露或操作不當的情況。
另外,存儲過程也容易受到SQL注入的攻擊。因為存儲過程實際上是一種SQL語句集合,如果存儲過程中存在SQL注入漏洞,攻擊者可以直接調用存儲過程獲取或修改資料庫中的數據,破壞資料庫安全。
總結:
雖然存儲過程具有一些優點,如能夠減少網路傳輸、提高程序可重用性等,但在MySQL中,存儲過程的使用並不被建議。除非應用場景需要使用存儲過程,否則應該盡量避免使用。在實際開發過程中,可以通過其他方式來實現復雜的業務邏輯和數據操作,例如使用JOIN語句、視圖等。這樣既能保證程序的性能和可維護性,也能保障資料庫的安全。
相關代碼:
以下是一個簡單的MySQL存儲過程示例:
DELIMITER //
CREATE PROCEDURE GetCustomer(IN customerId INT, OUT customerName VARCHAR(50))
BEGIN
SELECT name INTO customerName FROM customers WHERE id = customerId;
END//
調用存儲過程:
SET @id = 1;
CALL GetCustomer(@id, @name);
SELECT @name;

⑶ 百度雲虛擬主機的MYSQL資料庫怎麼設置用戶許可權

第一步:管理員許可權賬號登陸phpMyAdmin,一般用root登錄。

第二步:設置用戶許可權。

⑷ MySQL存儲過程無法使用可能的原因和解決方案mysql不能用存儲過程

MySQL存儲過程無法使用:可能的原因和解決方案
MySQL存儲過程是一種存儲在資料庫中、可重復使用的SQL代碼塊。它們可以大大簡化應用程序的代碼,提高資料庫操作的效率,但是在使用存儲過程的過程中,有時會遇到一些問題。本文將介紹MySQL存儲過程無法使用的可能原因及相關解決方案。
一、可能的原因
1.許可權問題
MySQL存儲過程需要特定的許可權才能正常運行。如果用戶許可權不足,則無法執行存儲過程。如果您正在使用MySQL 8.0之前的版本,需要確保在創建存儲過程時使用了「DEFINER」選項並指定了超級用戶。例如:
CREATE PROCEDURE my_procere()
BEGIN
— 存儲過程的代碼
END
DEFINER = ‘root’@’localhost’
請注意,該語句中的「root」應替換為具有足夠許可權的用戶,並且「localhost」應替換為資料庫所在的主機名。
2.語法錯誤
存儲過程中的語法錯誤也會導致無法執行。在創建存儲過程之前,請仔細檢查語法是否正確。您還可以使用MySQL的「DELIMITER」命令指定語句分隔符,如下所示:
DELIMITER $$
CREATE PROCEDURE my_procere()
BEGIN
— 存儲過程的代碼
END $$
DELIMITER ;
在上面的示例中,語句分隔符由默認的「;」更改為「$$」,以確保正確處理存儲過程中的所有語句。
3.存儲過程已存在
如果嘗試重新創建已存在的存儲過程,將會導致錯誤。在創建存儲過程之前,請檢查在相同名稱下是否已經存在一個相同的存儲過程。
4.不正確的參數
存儲過程需要參數才能執行。如果提供的參數不正確,存儲過程將無法正常執行。請確保提供與存儲過程定義匹配的參數。
二、解決方案
1.檢查許可權
如果存儲過程無法運行,請檢查您是否有足夠的許可權。如果不是,請聯系資料庫管理員以獲取必要的許可權。確保在創建存儲過程時指定了超級用戶。
2.檢查語法
在創建存儲過程之前,請仔細檢查定義的語法是否正確,並使用「DELIMITER」命令指定正確的語句分隔符。
3.檢查存儲過程是否存在
在創建存儲過程之前,請檢查是否存在具有相同名稱的存儲過程。
4.檢查參數
檢查提供給存儲過程的參數是否正確。
5.使用MySQL的錯誤日誌文件
MySQL的錯誤日誌文件記錄了MySQL伺服器的所有錯誤消息。如果存儲過程無法運行,可以檢查錯誤日誌文件以查找有關錯誤的詳細信息。在MySQL配置文件中指定錯誤日誌文件的位置:
[mysqld]
log_error=/var/log/mysql/error.log
在上面的示例中,錯誤日誌文件位於「/var/log/mysql/error.log」位置。
總結
MySQL存儲過程無法運行的原因可能是多種多樣的,但是在檢查和解決問題時,注意一些常見的問題,包括許可權問題,語法錯誤,存儲過程已存在和不正確的參數。在需要幫助時,請查閱MySQL文檔或尋求專業資料庫管理員的幫助。

⑸ 如何修改mysql 存儲過程許可權

方法如下:

  1. 修改mysql 存儲過程的definer
    修改mysql.proc表 的definer欄位


update mysql.proc set definer='root@%' where db='servant_591up'; UPDATE `mysql`.`proc` SET `definer`='root00@%' WHERE `db`='test' AND `name`='jjjj' AND `type`='PROCEDURE'; UPDATE `mysql`.`proc` SET `definer`='wtc_678869@%' WHERE `db`='servant_591up' AND `type`='PROCEDURE';


2.修改sql security

ALTER PROCEDURE www SQL SECURITY INVOKER ; ALTER PROCEDURE www SQL SECURITY DEFINER ;



(1)MySQL存儲過程是通過指定SQL SECURITY子句指定執行存儲過程的實際用戶;

(2)如果SQL SECURITY子句指定為DEFINER,存儲過程將使用存儲過程的DEFINER執行存儲過程,驗證調用存儲過程的用戶是否具有存儲過程的execute許可權和DEFINER用戶是否具有存儲過程引用的相關對象的許可權;

(3)如果SQL SECURITY子句指定為INVOKER,那麼MySQL將使用當前調用存儲過程的用戶執行此過程,並驗證用戶是否具有存儲過程的execute許可權和存儲過程引用的相關對象的許可權;

(4)如果不顯示的指定SQL SECURITY子句,MySQL默認將以DEFINER執行存儲過程。

3.執行存儲過程授權

GRANT EXECUTE ON test.* TO 'wtc'@'%'; GRANT CREATE ROUTINE,ALTER ROUTINE, SELECT,CREATE, INSERT, UPDATE, DELETE, EXECUTE ON test.* TO 'wtc'@'%' IDENTIFIED BY '111111'


CREATE ROUTINE : 創建存儲過程的許可權
ALTER ROUTINE : 修改存儲過程的許可權

4.刪除用戶

REVOKE all ON test.* FROM wtc@'%'


DELETE FROM user WHERE User='user_name' and Host='host_name';

FLUSH PRIVILEGES;

好文要頂關注我

熱點內容
電腦版伺服器名字 發布:2025-09-06 12:29:07 瀏覽:347
mysql創建sql 發布:2025-09-06 12:17:09 瀏覽:655
c語言中lib 發布:2025-09-06 12:11:32 瀏覽:735
sqlserver2008復制 發布:2025-09-06 11:58:03 瀏覽:204
整蠱大師腳本 發布:2025-09-06 11:50:07 瀏覽:122
mc伺服器地址怎麼看 發布:2025-09-06 11:49:33 瀏覽:828
編程出錯 發布:2025-09-06 11:29:20 瀏覽:22
android設置layout 發布:2025-09-06 11:20:43 瀏覽:227
八字喜金三才五格怎麼配置 發布:2025-09-06 10:53:17 瀏覽:309
虛擬機怎麼成為伺服器 發布:2025-09-06 10:49:34 瀏覽:185