在MySQL 5.7.24中,關於用戶及用戶權限的相關信息,都保存在了mysql庫中的user表中,能夠將user表中大體分爲用戶列、權限列、安全列、資源控制列這幾種。mysql
一、用戶列
user表的用戶列包括 Host、 User、password,分別表示主機名、用戶名和密碼。其中 user和 Host爲user表的聯合主踺。當用戶與服務器之間創建鏈接時,輸入的帳戶信息中的用戶名稱、主機名和密碼必須匹配user表中對應的字段,只有3個值都匹配的時候,才容許鏈接的創建。這3 個字段的值就是建立帳戶時保存的帳戶信息。修改用戶密碼時,實際就是修改user表的password字段值。sql
二、權限列
權限列的字段決定了用戶的權限,描述了在全局範圍內容許對數據和數據庫進行的操做。包括查詢權限、修改權限等普通權限,還包括了關閉服務器、超級權限和加載用戶等高級權限。普通權限用於操做數據庫;高級權限用於數據庫管理。 user表中對應的權限是針對全部用戶數據庫的。這些字段值的類型爲 ENUM,能夠取的值只能爲 Y和 N, Y表示該用戶有對應的權限; N表示用戶沒有對應的權限。查看user表的結構能夠看到,這些字段的值默認都是 N。若是要修改權限,可使用 GRANT語句或 UPDATE語句更改 user表的這些字段來修改用戶對應的權限。數據庫
三、安全列
安全列只有6個字段,其中兩個是 SSI相關的,2個是 x509相關的,另外2個是受權插件相關的。SSI用於加密; X509標準可用於標識用戶: Plugin字段標識能夠用於驗證用戶身份的插件,若是該字段爲空,服務器使用內建受權驗證機制驗證用戶身份。能夠經過 SHOW VARIABLES LIKE ' have_openssl'語句來查詢服務器是否支持 SSI功能。
四、資源控制列安全
資源控制列的字段用來限制用戶使用的資源,包含4個字段,分別爲:
1)Max_questions—用戶每小時容許執行的查詢操做次數。
2)Max_updates一用戶每小時容許執行的更新操做次數。
3)Max_connections—用戶每小時容許執行的鏈接操做次數。
4)Max_user_connections—用戶容許同時創建的鏈接次數。服務器
一個小時內用戶查詢或者鏈接數量超過資源控制限制,用戶將被鎖定,直到下一個小時,才能夠在此執行對應的操做。可使用GRANT語句更新這些字段的值。
注:若新建的用戶沒法登陸到數據庫,排除權限錯誤的前提下,能夠嘗試刷新權限,命令以下:ide
mysql> flush privileges;
在使用grant給用戶受權時,可使用下面的指令查看有哪些權限能夠受權給用戶:加密
mysql> SHOW PRIVILEGES;
一、使用create user語句建立新用戶
1)方法1:spa
mysql> create user 'tom'@'localhost' identified by '123.com';
上面的語句是建立了一個tom用戶,只容許本機登陸,而且密碼爲123.com。插件
可是上面這種方式,密碼是以明文的方式寫下來的(雖然存儲進去後是密文的方式),但有些不安全,上述指令會在mysq.user這個表中產生tom這個用戶的信息,以下:命令行
mysql> select * from user where User='tom'\G # 查詢User字段爲tom的列 *************************** 1. row *************************** Host: localhost # 容許從哪一個主機登陸 User: tom # 用戶名 # 如下是權限,「N」表示沒有對應的權限,「Y」表示擁有對應的權限 Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N Shutdown_priv: N Process_priv: N File_priv: N Grant_priv: N References_priv: N Index_priv: N Alter_priv: N Show_db_priv: N Super_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Execute_priv: N Repl_slave_priv: N Repl_client_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Create_user_priv: N Event_priv: N Trigger_priv: N Create_tablespace_priv: N ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0 plugin: mysql_native_password authentication_string: *AC241830FFDDC8943AB31CBD47D758E79F7953EA # 此行是123.com通過哈希加密過的密碼 password_expired: N password_last_changed: 2020-05-16 22:05:58 password_lifetime: NULL account_locked: N 1 row in set (0.00 sec)
2)方法2:
mysql> select password('123.com'); # 將123.com 進行加密 +-------------------------------------------+ | password('123.com') | +-------------------------------------------+ | *AC241830FFDDC8943AB31CBD47D758E79F7953EA | +-------------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> create user 'zhangyi'@'localhost' # 建立用戶時使用加密後的密碼就能夠 -> identified by password '*AC241830FFDDC8943AB31CBD47D758E79F7953EA';
上述命令是先將123.com字符串進行加密,而後建立用戶的時候,直接寫入加密後的密碼便可,可是須要添加password關鍵字
建立後,zhangyi用戶在本機使用123.com這個密碼就能夠登陸到數據庫了。
二、使用grant語句建立新用戶
mysql> grant select on test1.* to 'zhanger'@'localhost' identified by '123.com'; Query OK, 0 rows affected, 1 warning (0.00 sec)
上述指令在建立用戶zhanger的同時,指定其只容許本機登陸,密碼爲123.com,而且該用戶對test01這個庫的全部表具備select權限。
驗證:
[root@mysql~]# mysql -u zhanger -p123.com mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | test1 | +--------------------+ 2 rows in set (0.00 sec) mysql> use test1; # 切入到有權限的庫 Database changed mysql> show tables; # 查看全部表 +-----------------+ | Tables_in_test1 | +-----------------+ | tb1 | +-----------------+ 1 row in set (0.00 sec) mysql> select * from tb1; # 查看某個表內容 +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> update tb1 set id=2 ; # 試着更新表內容,可是因爲只有select權限,因此會被拒絕 ERROR 1142 (42000): UPDATE command denied to user 'zhanger'@'localhost' for table 'tb1'
一、使用DROP USER語句刪除
mysql> drop user zhangyi@localhost;
二、使用delete語句刪除用戶
mysql> delete from mysql.user where Host='localhost' and user='tom';
一、在命令行使用mysqladmin命令修改用戶密碼
[root@mysql ~]# mysqladmin -uroot -p password '2020.com' # 將root用戶的密碼修改成2008.com Enter password: # 注意,此處填寫舊密碼 [root@mysql ~]# mysql -u root -p123 # 此時舊密碼已經沒法登陸了 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) [root@mysql ~]# mysql -u root -p2020.com # 使用新密碼登陸便可
二、修改MySQL數據庫的user表
# 修改root密碼爲123.com mysql> update mysql.user set authentication_string=password('123.com') where User='root' and Host='localhost'; mysql> flush privileges;
三、使用set語句修改當前用戶的密碼
mysql> set password=password('2020.com');
四、Root用戶修改普通用戶密碼
1)使用set語句來修改普通用戶
# 修改zhanger用戶密碼爲123456 mysql> set password for 'zhanger'@'localhost'=password('123456');
2)使用update語句修改普通用戶
#修改zhanger用戶密碼爲123.com mysql> update mysql.user set authentication_string=password('123.com') -> where User='zhanger' and Host='localhost'; mysql> flush privileges; # 須要刷新一下才能夠生效
3)使用grant語句修改普通用戶密碼
#修改zhanger用戶的密碼爲123123,並賦予select權限 mysql> grant select on *.* to 'zhanger'@'localhost' identified by '123123';
五、普通用戶修改本身的密碼
[root@mysql ~]# mysql -uzhanger -p123123 # 登陸 mysql> set password=password('123.com'); # 修改密碼爲123.com
六、撤銷普通用戶的權限
在上面已經寫下了如何爲用戶受權,那麼這裏將寫下如何將用戶的已有權限撤銷。以下:
mysql> show grants for zhanger@localhost\G # 查看用戶擁有的權限 mysql> revoke select on *.* from 'zhanger'@'localhost'; #將用戶的select權限撤銷 mysql> flush privileges; # 刷新權限