1. 程式人生 > 其它 >Mysql DCL 使用者管理、許可權管理、禁止root使用者遠端登入、忘記root密碼的解決辦法

Mysql DCL 使用者管理、許可權管理、禁止root使用者遠端登入、忘記root密碼的解決辦法

技術標籤:Mysql資料庫mysql

我們知道,SQL語言按照功能用途分為4類,分別是DDL、DML、DQL和DCL。其中,DCL是資料控制語言,主要用於管理使用者和許可權。在企業中,這部分工作通常是由DBA完成,一般開發人員很少接觸。

DCL主要能做什麼?

  1. 建立使用者
  2. 刪除使用者
  3. 修改密碼
  4. 給使用者賦予許可權
  5. 撤銷使用者許可權

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使用者遠端登入,這是由於:

  1. root是Mysql資料庫的超級管理員,幾乎擁有所有許可權,一旦洩露後果非常嚴重;
  2. 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