MySQL用戶管理


  MySQL分為普通用戶與root用戶。這兩種用戶的權限不一樣。

一、權限表

  安裝MySQL時會自動安裝一個名為mysql的數據庫。mysql數據庫里面存儲的都是權限表。

  1、User表

  user表有39個字段。這些字段可以分為4類:

  • 用戶列;
  • 權限列;
  • 安全列;
  • 資源控制列;

  1、用戶列

  用戶列包括Host、User、Password,分別表示主機名、用戶名和密碼。登錄用的就是這個用戶名與密碼;

  2、權限列

  user表的權限列包括Select_priv、Insert_priv等以priv結尾的字段。

  這些字段的值只有Y和N。Y表示該權限可以用到所有數據庫上;N表示該權限不能用到所有數據庫上;

  通常,可以使用GRANT語句Wie用戶賦予一些權限,也可以通過Update語句更新user表的方式來設置權限;

  不過,修改user表之后,一定要執行一下FLUSH PRIVILEGES,否則可能會出現如下錯誤:

  Error (1133): Can’t find any matching row in the user table

說明
Select_priv 確定用戶是否可以通過SELECT命令選擇數據
Insert_priv 確定用戶是否可以通過INSERT命令插入數據
Update_priv 確定用戶是否可以通過UPDATE命令修改現有數據
Delete_priv 確定用戶是否可以通過DELETE命令刪除現有數據
Create_priv 確定用戶是否可以創建新的數據庫和表
Drop_priv 確定用戶是否可以刪除現有數據庫和表
Reload_priv 確定用戶是否可以執行刷新和重新加載MySQL所用各種內部緩存的特定命令,包括日志、權限、主機、查詢和表
Shutdown_priv 確定用戶是否可以關閉MySQL服務器。在將此權限提供給root賬戶之外的任何用戶時,都應當非常謹慎
Process_priv 確定用戶是否可以通過SHOW PROCESSLIST命令查看其他用戶的進程
File_priv 確定用戶是否可以執行SELECT INTO OUTFILE和LOAD DATA INFILE命令
Grant_priv 確定用戶是否可以將已經授予給該用戶自己的權限再授予其他用戶
References_priv 目前只是某些未來功能的占位符;現在沒有作用
Index_priv 確定用戶是否可以創建和刪除表索引
Alter_priv 確定用戶是否可以重命名和修改表結構
Show_db_priv 確定用戶是否可以查看服務器上所有數據庫的名字,包括用戶擁有足夠訪問權限的數據庫
Super_priv

確定用戶是否可以執行某些強大的管理功能,例如通過KILL命令刪除用戶進程,使用SET GLOBAL修改全局MySQL變量,執行關於復制和日志的各種命令

Create_tmp_table_priv 確定用戶是否可以創建臨時表
Lock_tables_priv 確定用戶是否可以使用LOCK TABLES命令阻止對表的訪問/修改
Execute_priv 確定用戶是否可以執行存儲過程
Repl_slave_priv 確定用戶是否可以讀取用於維護復制數據庫環境的二進制日志文件。此用戶位於主系統中,有利於主機和客戶機之間的通信
Repl_client_priv 確定用戶是否可以確定復制從服務器和主服務器的位置
Create_view_priv 確定用戶是否可以創建視圖
Show_view_priv 確定用戶是否可以查看視圖或了解視圖如何執行
Create_routine_priv 確定用戶是否可以更改或放棄存儲過程和函數
Alter_routine_priv 確定用戶是否可以修改或刪除存儲函數及函數
Create_user_priv 確定用戶是否可以執行CREATE USER命令,這個命令用於創建新的MySQL賬戶
Event_priv 確定用戶能否創建、修改和刪除事件
Trigger_priv 確定用戶能否創建和刪除觸發器

  Update修改權限:

UPDATE user SET Select_priv = 'N'
WHERE Host = '%'

  GRANT賦予權限

  3、安全列

  user表的安全列有4個字段:

  • ssl_type;
  • ssl_cipher;
  • x509_issuer;
  • x509_subject;

  ssl用於加密;x509標准可以用來標識用戶。普通的發行版都沒有加密功能。可以使用SHOW VARIABLES LIKE 'have_openssl'語句來查看是否具有ssl功能。如果取值為DISABLED,那么則沒有ssl加密功能。

  4、資源控制列

  user表的4個資源控制列是:

  • max_questions:每小時可以允許執行多少次查詢;
  • max_updates:每小時可以允許執行多少次更新;
  • max_connections:每小時可以建立多少連接;
  • max_user_connections:單個用戶可以同時具有的連接數。

  默認值為0,表示無限制。

  2、db表和host表

  db表存儲了某個用戶對一個數據庫的權限。

  host表中存儲了某個主機對數據庫的操作權限,配合db表對給定主機上數據庫級操作權限做更細致的控制;但是很少用,新版本已經取消了host表;

  1、用戶列

  db表的用戶列有3個字段:

  • Host:主機名;
  • Db:數據庫名;
  • User:用戶名;

  2、權限列

  db表:

  • Create_routine_priv:是否具有創建存儲過程權限;
  • Alter_routine_priv:是否具有修改存儲過程權限;

  user表中的權限是針對所有數據庫的,如果user表中的Select_priv字段取值為Y,那么該用戶可以查詢所有數據庫中的表;

  如果為某個用戶值設置了查詢test表的權限,那么user表的Select_priv字段的取值為N。而這個SELECT權限則記錄在db表中。db表中的Select_priv字段的取值將會是Y。

  用戶先根據user表的內容獲取權限,然后再根據db表的內容獲取權限。

  3、tables_priv表和columns_priv表

   tables_priv:可以對單個表進行權限設置:

  • tables_priv表包含8個字段:
  • Host:主機名;
  • DB:數據庫名;
  • User:用戶名;
  • Table_name:表名
  • Table_priv:對表進行操作的權限(Select,Insert,Update,Delete,Create,Drop,Grant,References,Index,Alter)
  • Column_priv:對表中的數據列進行操作的權限(Select,Insert,Update,Rederences);
  • Timestamp:修改權限的事件
  • Grantor:權限的設置者

  columns_priv:可以對單個數據列進行權限設置,有7個列,作用同上:

   Host、Db、User、Table_name、Column_name、Column_priv、Timestamp。

  MySQL權限分配是按照user表-> db表 -> table_priv表 -> columns_priv表的順序進行分配的。

  在數據庫系統中,先判斷user表中的值是否為'Y',如果user表中的值是'Y',就不需要檢查后面的表。如果user表為N,則一次檢查后面的表。

  4、procs_priv表

  • procs_priv表可以對存儲過程和存儲函數進行權限設置。
  • procs_priv表包含8個字段,分別是:
  • Host:主機名;
  • Db:數據庫名;
  • User:用戶名;
  • Routine_name:存儲過程或函數名稱;
  • Routine_type:類型(取值有:FUNCTION或PROCEDURE);
  • Proc_priv:擁有的權限(Execute:執行;Alter Routine:修改;Grant:權限賦予);
  • Timestamp:字段存儲更新的時間;
  • Grantor:字段設置者;

二、賬戶管理

  賬戶管理是MySQL用戶管理最基本的內容。包括登錄,退出MySQL服務器、創建用戶、刪除用戶、密碼管理和權限管理等內容。

  其中登錄方式非常簡單,在這個地址有:http://www.cnblogs.com/kissdodog/p/4154068.html

  1、新建普通用戶

  在MySQL數據庫中,建立用戶有3種方式:

  • 使用CREATE USER語句來創建新的用戶;
  • 直接在mysql.user表中INSERT用戶;
  • 使用GRANT語句來新建用戶;

  1、CREATE USER

  使用CREATE USER語句創建用戶,必須要擁有CREATE USER權限。其格式如下:

CREATE USER user[IDENTIFIED BY [PASSWORD] 'password'],
[user[IDENTIFIED BY [PASSWORD] 'password']]...

  其中,user參數表示新建用戶的賬戶,user由用戶名(User)和主機名(Host)構成;IDENTIFIED BY關鍵字用來設置用戶的密碼;password參數表示用戶的密碼;如果密碼是一個普通的字符串,就不需要使用PASSWORD關鍵字。可以沒有初始密碼。

  示例:

CREATE USER 'admin'@'%' IDENTIFIED BY 'admin'

  執行之后user表會增加一行記錄,但權限暫時全部為‘N’。

  2、用INSERT語句新建普通用戶

  可以使用INSERT語句直接將用戶的信息添加到mysql.user表。但必須擁有mysql.user表的INSERT權限。

  另外,ssl_cipher、x509_issuer、x509_subject沒有值,必須要設置值,否則INSERT語句無法執行。

  示例:

INSERT INTO mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) VALUES('%','newuser1',PASSWORD('123456'),'','','')

  執行INSERT之后,要使用命令:

FLUSH PRIVILEGES

  命令來使用戶生效。

  3、用GRANT語句來新建普通用戶

  用GRANT來創建新的用戶時,能夠在創建用戶時為用戶授權。但需要擁有GRANT權限。

  語法如下:

GRANT priv_type ON database.table
TO user[IDENTIFIED BY [PASSWORD] 'password']
[,user [IDENTIFIED BY [PASSWORD] 'password']...]
  • priv_type:參數表示新yoghurt的權限;
  • databse.table:參數表示新用戶的權限范圍;
  • user:參數新用戶的賬戶,由用戶名和主機構成;
  • IDENTIFIED BY關鍵字用來設置密碼;
  • password:新用戶密碼;

  GRANT語句可以同時創建多個用戶。

GRANT SELECT ON *.* TO netUser@'%'

  *.*與db.*的區別在於。*.*對所有數據庫生效,所以user表的SELECT會變為Y。而db.*user表為'N',更改的是Db表。

  2、刪除普通用戶

  1、DROP USER語句刪除普通用戶

  需要擁有DROP USER權限。語法如下:

DROP USER user[,user]...

  user是需要刪除的用戶,由用戶名(User)和主機名(Host)構成。

DROP USER 'newuser1'@'%'

  2、DELETE語句刪除普通用戶

  可以使用DELETE語句直接將用戶的信息從mysql.user表中刪除。但必須擁有對mysql.user表的DELETE權限。

DELETE FROM mysql.user WHERE Host = '%' AND User = 'admin'

  刪除完成后,一樣要FLUSH PRIVILEGES才生效。

  3、修改密碼

  1、使用mysqladmin命令來修改root用戶的密碼

  語法:

mysqladmin -u -username -p password "new_password"

  新密碼(new_password)必須用括號括起來,單引號會報錯。

  示例:

  (注:這個待驗證,我怎么執行都不成功!)

  2、修改user表

  UPDATE user表的passwor字段的值,也可以達到修改密碼的目的;

UPDATE user SET Password = PASSWORD('123') WHERE USER = 'myuser'

  FLUSH PRIVILEGES后生效。

  3、使用SET語句來修改密碼

  使用root用戶登錄到MySQL服務器后,可以使用SET語句來修改密碼:

  修改自己的密碼,不需要用戶名

SET PASSWORD = PASSWORD("123");

  修改其他用戶密碼:

SET PASSWORD FOR 'myuser'@'%'=PASSWORD("123456")

  FOR 用戶名@主機名

  4、GRANT語句來修改普通用戶的密碼

  使用GRANT語句修改普通用戶的密碼,必須擁有GRANT權限。

GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']

  示例:

GRANT SELECT ON *.* TO 'test3'@'%' IDENTIFIED BY '123'

  4、忘記密碼的解決方案

  如果root用戶密碼丟失了,會給用戶造成很大的麻煩。但是,可以通過某種特殊方法登錄到root用戶下,然后修改密碼。

  1、使用--skip-grant-tables選項啟動MySQL服務

  該選項將使MySQL服務器停止權限判斷,任何用戶都能夠訪問數據庫。

  在Windows操作系統下,使用mysqlid或mysqlid-nt來啟動MySQL服務。

  mysqld命令:

  mysqld --skip-grant-tables

  mysqld-nt命令:

  mysqld-nt --skip-grant-tables

  net start mysql命令:

  net start mysql --skip-grant-tables

  2、登錄root用戶,並且設置新密碼

  mysql -u root

  必須使用UPDATE語句更新mysql數據庫下的user表,而不能使用SET語句,因為--skip-grant-tables不能使用SET語句。

  修改完密碼以后,FLUSH PRIVILEGES語句加載權限表,新密碼即生效。

三、權限管理

  1、MySQL的各種權限

權限名稱 對應user表中的列 權限的范圍
CREATE Create_priv 數據庫、表或索引
DROP Drop_priv 數據庫或表
GRANT OPTION Grant_priv 數據庫、表、存儲過程或函數
REFERENCES References_priv 數據庫或表
ALTER Alter_priv 修改表
DELETE Delete_priv 刪除表
INDEX Index_priv 用索引查詢表
INSERT Insert_priv 插入表
SELECT Select_priv 查詢表
UPDATE Update_priv 更新表
CREATE VIEW Create_view_priv 創建視圖
SHOW VIEW Show_view_priv 查看視圖
ALTER ROUTINE Alter_routine 修改存儲過程或存儲函數
CREATE ROUTINE Create_routine_priv 創建存儲過程或存儲函數
EXECUTE Execute_priv 執行存儲過程或存儲函數
FILE File_priv 加載服務器主機上的文件
CREATE TEMPORARY TABLES Create_temp_table_priv 創建臨時表
LOCK TABLES Lock_tables_priv 鎖定表
CREATE USER Create_user_priv 創建用戶
PROCESS Process_priv 服務器管理
RELOAD Reload_priv 重新加載權限表
REPLICATION CLIENT Repl_client_priv 服務器管理
REPLICATION SLAVE Repl_slave_priv 服務器管理
SHOW DATABASES Show_db_priv 查看數據庫
SHUTDOWN Shutdown_priv 關閉服務器
SUPER Super_priv 超級權限

 

  2、授權

  GRANT語法如下:

GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[,user [IDENTIFIED BY [PASSWORD] 'password']]...
WITH with_option[with_option]
  • priv_type參數表示權限類型;
  • column_list:參數表示權限作用於哪些列上,沒設置則位於整個表上;
  • user參數由用戶名和主機名構成;形式是"'username'@'hostname'";
  • IDENTIFIED BY參數用於為用戶設置密碼;
  • password:用戶新密碼;

  WITH關鍵字后面帶有一個或多個with_option參數。有5個選項:

  • GRANT OPTION:被授權的用戶可以將這些權限賦予給別的用戶;
  • MAX_QUERIES_PER_HOUR count:設置沒消失可以允許執行count次查詢;
  • MAX_UPDATES_PER_HOUR count:設置每個消失可以允許執行count次更新;
  • MAX_CONNECTIONS_PER_HOUR count:設置每小時可以建立count個連接;
  • MAX_USER_CONNECTIONS count:設置單個用戶可以同時具有的count個連接數;

  示例:

GRANT SELECT,UPDATE ON *.*
    TO 'myuser'@'%'
WITH GRANT OPTION;

  3、收回權限

  收回權限,就是取消某個用戶的某些權限。MySQL中使用REVOKE關鍵字來為用戶設置權限。

  語法如下:

REVOKE priv_type[(column_list)]
ON database.table
FROM user[,user]

  收回全部權限的REVOKE語句的基本語法如下:

REVOKE ALL PRIVILEGES,GRANT OPTION FROM user[,user]...

  示例:回收用戶myuser的SELECT權限

REVOKE SELECT ON *.*FROM 'myuser'@'%'

  收回myuser的所有權限:

REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'myuser'@'%'

  4、查看權限

  SHOW GRANTS語句用於查看權限。同時mysql數據庫下的user表中存儲着用戶的基本權限。

SELECT * FROM mysql.user

SHOW GRANTS

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM