看到很多網友提出關於mysql登入不上伺服器的問題,包括有的是在php中呼叫mysql時發生的不能登入mysql資料庫伺服器的問題,以為是php出了問題。其實是mysql許可權的問題。 mysql的許可權系統在mysql的手冊中是很長的一章,我把它列印出來足足印了20多頁!這裡就將
看到很多網友提出關於mysql登入不上伺服器的問題,包括有的是在php中呼叫mysql時發生的不能登入mysql資料庫伺服器的問題,以為是php出了問題。其實是mysql許可權的問題。
mysql的許可權系統在mysql的手冊中是很長的一章,我把它列印出來足足印了20多頁!這裡就將我對它的理解簡要地寫出來,希望能對剛剛接觸mysql的同志有點幫助;有說得不對的地方,也請同志們指出。
在我了解了mysql的許可權機制後,不由得不讚嘆它的嚴密與巧妙;也許所有的資料庫系統都是如此罷,只是別的大型資料庫把許可權做得不需超級管理員親自干預資料表而已。
mysql的許可權儲存在名為mysql的資料庫中,有user、db、host、tables_priv、columns_priv 等五個表。
首先,限制使用者的登入的,只有 user 表,其中最常用的是 user、host、password這三個字段。其他的select_priv、update_priv、…… 這些字段分別表示該使用者是否有select、update、……等許可權,這些字段設定為'y'表示該使用者擁有對應的許可權,'n'表示使用者沒有對應的許可權。注意,,這裡指定的許可權是全域性的,一旦你在user表中給了乙個使用者select或update許可權,他就對這台伺服器上任何資料庫、任何表擁有上述許可權!其中當然包括mysql資料庫!!這意味著他可以通過更改user表裡的資料非法地獲取更大的許可權!!!這是非常可怕的,所以建議除了給root使用者外,不要在user表中分配許可權。特別的,你可以建立乙個幾乎跟root擁有同樣許可權的使用者(密碼可不要告訴別人喲!)在忘記了root密碼時就用得到了。在新增乙個使用者時,如果不指定許可權欄位的值,它們的預設值都是'n',——也就是這個使用者什麼許可權也沒有——你可以放心的在user表中新增使用者,因為即使他能登入進來,卻什麼也幹不了。
還有乙個應該注意的問題就是user表中的password欄位。試想,既然root使用者可以瀏覽mysql資料庫,可以看到user表的password欄位,是不是就是看到了其他使用者的密碼呢?不是的!user表的password欄位儲存的是用password()函式加密了的使用者密碼,當使用者登入時,伺服器將收到的使用者輸入的密碼用password()函式加密,加密得到的字串與user表password欄位如能匹配,則認為密碼正確。password()沒有逆運算,所以任何人無法從乙個加密的字串得到密碼的明文。同時,如果你手工修改user表,別忘了在更新password欄位時一定要用password()函式加密。例如,你要允許一位名為 bill 的使用者登入你的伺服器,你給他設定乙個 12345 的密碼,則應該:
insert into user (user,host,password) values ('bill','%',password('12345'));
如果你直接
insert into user (user,host,password) values ('bill','%','12345');
的話,恐怕他登不上你的伺服器,也會到奧索網上發帖子問的。
注意,每當手工操作了跟許可權有關的資料表以後,要執行一條 flush privileges 命令才能使其生效。
下面的問題就是如何給使用者分配許可權了。如果你要給乙個使用者開乙個資料庫,並把有關這個資料庫的所有或部分許可權開放給他,這就用到了db表。db表的意義在於,當乙個使用者請求乙個查詢時,檢測該使用者對於他的查詢所針對的資料庫是否擁有進行該查詢操作的許可權,有,則允許查詢;沒有,則進一步諮詢tables_priv表。db表的最常用字段是 user、db、和那一大堆有關許可權的字段。user,不用說了,就是那個使用者的使用者名稱,跟user表中的對應;db,就是要分給他的資料庫名。然後就把要給他的許可權相對應的許可權欄位設為'y'。同樣,這些欄位的值在不指定的時候預設是'n'。你也可以用grant/revoke命令給使用者分配許可權,可以是這樣的:
grant select,update,insert,delete,creater,alter,drop,index on bill.* to bill;
這樣就把針對bill這個資料庫的幾乎所有的許可權給了使用者bill。這裡沒有給的只是grant許可權,關於這個許可權,建議不要輕易給人,因為使用者有了grant許可權,也就可以將許可權分配給其他使用者。值得慶幸的是,擁有grant許可權的使用者能而且只能將他自己已經擁有的許可權分配給別人。
使用grant/revoke命令更改了許可權後,不須執行 flush privileges 命令就可以使更改生效。
上面討論的是給乙個使用者完全開放乙個資料庫的問題,如果只想給乙個使用者乙個特定的表的許可權,就是 tables_priv 表發揮作用的時候啦。這裡的關鍵性欄位是user、db、table_name 。顯而易見的,要給乙個使用者指定乙個特定的資料庫中特定表的許可權,三個關鍵要素就是:哪個使用者(user)、哪個資料庫(db)、哪個表(table_name)。它的機理跟db表是類似的,我不必再重複。唯一不同的是這裡用了乙個set型別的字段 table_priv 來指定使用者對這個表許可權,set的成員有 select, update, insert, delete, alter, create, drop, grant, index, reference 等,你可以選擇其中任意乙個或幾個分配給使用者。
在上述提及的幾個許可權表中以及未提及的host表中,都有乙個host欄位,它用來區分來自不同主機的、使用者名稱可能相同的人,或者是給同乙個使用者從不同的主機連線時給予不同的許可權。這種用法不很常用,但為了安全起見,建議root使用者,如果不需要從遠端連線,請將他的host設為 localhost,其他的則可以設為 % ,即任何主機。
對我有用(3) 對我沒用(3)
mysql 訪問 MySQL的訪問許可權系統
看到很多提出關於mysql登入不上伺服器的問題,包括有的是在php中呼叫mysql時發生的不能登入mysql資料庫伺服器的問題,以為是php出了問題。其實是mysql許可權的問題。mysql的許可權系統在mysql的手冊中是很長的一章,我把它列印出來足足印了20多頁 這裡就將 看到很多提出關於mys...
mysql禁止訪問 mysql禁止外部訪問解決方案
本文主要講述了當mysql禁止外部訪問的解決方案,具有一定的收藏價值,有需要的朋友了解一下吧。1.在埠已經開放的情況下,ubuntu mysql 3306允許遠端訪問 vim etc mysql mysql.conf.d mysqld.cnf 注釋 bind address 127.0.0.1 2....
mysql 訪問審計 mysql實現訪問審計
mysql的連線首先都是通過init connect初始化,然後連線到例項。我們利用這一點,通過在init connect的時候記錄下使用者的thread id,使用者名稱和使用者位址實現db的訪問審計功能。首先我們先建立審計用的庫表 為了不與業務的庫衝突,單獨建立自己的庫 create datab...