Mysql DCL 使用者管理、許可權管理、禁止root使用者遠端登入、忘記root密碼的解決辦法
我們知道,SQL語言按照功能用途分為4類,分別是DDL、DML、DQL和DCL。其中,DCL是資料控制語言,主要用於管理使用者和許可權。在企業中,這部分工作通常是由DBA完成,一般開發人員很少接觸。
DCL主要能做什麼?
- 建立使用者
- 刪除使用者
- 修改密碼
- 給使用者賦予許可權
- 撤銷使用者許可權
Mysql的許可權體系大致分為5個層級,全域性層級、資料庫層級、表層級、列層級和子程式層級
層級 | 描述 |
---|---|
全域性層級 | 適用於一個給定伺服器中的所有資料庫。這些許可權儲存在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤銷全域性許可權。 |
資料庫層級 | 適用於一個給定資料庫中的所有目標。這些許可權儲存在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷資料庫許可權。 |
表層級 | 適用於一個給定表中的所有列。這些許可權儲存在mysql.tables_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表許可權。 |
列層級 | 適用於一個給定表中的單一列。這些許可權儲存在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。 |
子程式層級 | CREATE ROUTINE,ALTER ROUTINE,EXECUTE和GRANT許可權適用於已儲存的子程式。這些許可權可以被授予為全域性層級和資料庫層級。而且,除了CREATE ROUTINE外,這些許可權可以被授予為子程式層級,並存儲在mysql.procs_priv表中。 |
Mysql的許可權資訊主要儲存在以下幾張表中,當用戶連線資料庫時,Mysql會根據這些表對使用者進行許可權驗證。
表名 | 描述 |
---|---|
user | 使用者許可權表,記錄賬號、密碼及全域性性許可權資訊 |
db | 記錄資料庫相關許可權 |
table_priv | 使用者對某個表擁有的許可權 |
column_priv | 使用者對某表的某個列所擁有的許可權 |
procs_priv | 使用者對儲存過程及儲存函式的操作許可權 |
使用者管理
在Mysql中,使用CREATE USER來建立使用者,使用者建立後沒有任何許可權。
建立使用者
CREATE USER '使用者名稱' [@'主機名'][IDENTIFIED BY '密碼'];
注意:Mysql的使用者賬號由兩部分組成:使用者名稱和主機名,即使用者名稱@主機名,主機名可以是IP或機器名稱,主機名為%表示允許任何地址的主機遠端登入Mysql資料庫。
刪除使用者
DROP USER '使用者名稱'[@'主機名'];
修改密碼
ALTER USER '使用者名稱'@'主機名' IDENTIFIED BY '新密碼';
示例:
#格式化輸出
select * from user\G;
create user 'Lau'@'%' identified by 'root';
create user 'ls'@'192.168.0.222' identified by 'root';
#檢視當前主機
ipconfig
許可權管理
在Mysql資料庫中,使用grant命令授權、revoke命令撤銷授權。
授權
grant all privileges on databaseName.tableName to '使用者名稱'[@'主機名'];
撤銷授權
revoke all privileges on databaseName.tableName from '使用者名稱'[@'主機名'];
重新整理許可權
flush privileges;
檢視許可權
show grant for '使用者名稱'[@'主機名'];
Mysql許可權列表
使用grant和revoke進行授權、撤銷授權時,需要指定具體是哪些許可權,這些許可權大體可以分為3類,資料類、結構類和管理類。
資料 | SELECT INSERT UPDATE DELETEFILE |
---|---|
結構 | CREATE ALTER INDEX DROP Create temporary tables Show view Create routine Alter routine EXECUTE Create view EVENT TRIGGER |
管理 | USAGE GRANT SUPER PROCESS RELOAD SHUTDOWN Show databases Lock tables REFERENCES Repucation cuent Repucation slave Create user |
說明:命令由多個單片語成的,以大寫字母開頭,小寫字母結束;由一個單片語成的,均為大寫字母
**#檢視使用者許可權**
show grants for '使用者名稱'@'%';
#授予許可權(mydb資料庫所有表的select許可權)
grant select on mydb.* to 'Lau'@'%';
#撤銷許可權
revoke select on mydb.* from 'Lau'@'%';
#重新整理許可權
flush privileges;
禁止使用者遠端登入
在實際工作中,公司的DBA都會設定禁止root使用者遠端登入,這是由於:
- root是Mysql資料庫的超級管理員,幾乎擁有所有許可權,一旦洩露後果非常嚴重;
- root是Mysql資料庫的預設使用者,所有人都知道,如果不禁止遠端登入,可以針對root使用者暴力破解密碼。
#許可權管理都在mysql資料庫中
use mysql;
#檢視user表
select user,host from user;
#如果root使用者只能在localhost上進行操作,那麼root不能進行遠端登入
#修改user表
update user set host='localhost' where user='Lau';
root使用者忘記密碼的解決辦法
在Mysql中,如果只是忘記普通使用者的密碼很好解決,只需要使用root登入後重置其密碼即可。但是,如果忘記了root使用者的密碼,該怎麼解決
四個步驟:關閉MYSQL服務、重啟MYSQL時關閉許可權驗證、修改root密碼、正常啟動MYSQL服務
重啟MYSQL時關閉許可權驗證
#關閉許可權驗證
Mysql8.0版本
mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --console --skip-grant-tables --shared-memory
Mysql5.7版本
mysqld --skip-grant-tables
說明:引數–defaults-file的值為配置檔案my.ini的完整路徑
#查詢my.ini的地址
show variables like '%datadir%';
修改root使用者密碼
Mysql關閉許可權驗證後,直接通過mysql命令即可連線到資料庫,並可正常執行各類操作。
#重新整理許可權
flush privileges;
#修改root使用者的密碼
alter user 'root'@'localhost' identified by 'root';
Tips:Mysql57版本忘記root密碼,重啟MYSQL時關閉許可權驗證時,遇到坑,待續…
Afterglow–Ed Sheeran