MySQL資料庫許可權體系入門(1)---工作原理

junsansi發表於2010-08-31

ORACLE等大型資料庫的許可權驗證,一般都是XX擁有ZZ的許可權,而MySQL資料庫的許可權驗證在設計階段就體現的有所不同,它在這中間又加了一級緯度,變成YY來的那個XX擁有ZZ的許可權,如果換一個角度來描述,也可以說是:XX只有從YY連線過來,才能夠訪問ZZ。這樣理解的話,就跟ORACLE這類資料庫的身份驗證機制相同了,只不過ORACLE這類資料庫中,預設是不加YY這一層的(如果想加當然也可以支援),而在MYSQL中,YY成了一個必選項。

 

在本文正式開始前先描述這樣一段,並不是想說MySQL有多麼高階或先進,只是想表達這樣一種看法,MySQL確實有所不同。Ok,接下來,跟隨三思一起,進入Mysql的許可權世界吧~~~~

 

一、工作原理

 

所有許可權認證的根本目地,都是為了保證使用者只能做允許它做的事情,MySQL也不例外,大家(範指資料庫產品)實現的原理也都差不多,只不過機制上稍有差異,在許可權粒度控制上有所不同。

 

MySQL資料庫對許可權的驗證有兩個層面:

 

能不能連線:主要由mysql.user,mysql.db,mysql.host三個字典表控制(事實上截止到5.1版本,Host表也基本沒啥用,主要由user,db兩表控制)

能不能執行操作:這個複雜一點點,除了上面三個字典表外,另外還有mysql.tables_privmysql.columns_privmysql.proc_priv三個字典表做更細粒度的控制。

 

由上可以看出,MySQL資料庫主要是通過這六個字典表,來實現不同粒度的許可權需求,關於這幾個檢視後面會有章節詳細描述,這裡簡要介紹其處理邏輯。

 

MySQL啟動時將這幾個表中的內容讀到記憶體裡,當有使用者連線或執行操作時,根據記憶體中的資料來檢查使用者是否有許可權執行相應的操作。

 

注意,如果你讀的足夠認真並且大腦持續在進行思考,這會兒應該會產生這樣的一個疑問:如果使用者連線上資料庫後,又有其它人對其許可權進行了修改操作,是否會即時生效呢?這個問題的答案是:看情況!

如果是通過grantrevokeset passwordrename user等命令執行的修改,那麼會馬上生效,這些命令將觸發系統重新載入授權表(grant tables)

如果是手動修改字典表方式(insert,update,delete),那麼許可權並不會馬上生效,除非重啟伺服器,或管理使用者顯式的重新裝載了授權表。

 

授權表被重新裝載後,對當前已連線的客戶端影響如下:

表或列的許可權將在客戶端下次執行操作時生效;

資料庫的許可權將在客戶端執行use db_name語句時生效;

全域性許可權和密碼修改對已連線的客戶端無效,下次連線時才會生效。

 

提示:關於許可權級別將在後面章節介紹!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-672261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章