Mysql的許可權 mysql中存在4個控制許可權的表,分別為user表,db表,tables_priv表,columns_priv表。 mysql許可權表的驗證過程為: 先從user表中的Host,User,Password這3個欄位中判斷連接的ip、用戶名、密碼是否存在,存在則通過驗證。 通過身份認證 ...
Mysql的許可權
mysql中存在4個控制許可權的表,分別為user表,db表,tables_priv表,columns_priv表。
mysql許可權表的驗證過程為:
- 先從user表中的Host,User,Password這3個欄位中判斷連接的ip、用戶名、密碼是否存在,存在則通過驗證。
- 通過身份認證後,進行許可權分配,按照user,db,tables_priv,columns_priv的順序進行驗證。
即先檢查全局許可權表user,如果user中對應的許可權為Y,則此用戶對所有資料庫的許可權都為Y,將不再檢查db, tables_priv,columns_priv;
如果為N,則到db表中檢查此用戶對應的具體資料庫,並得到db中為Y的許可權;
如果db中為N,則檢查tables_priv中此資料庫對應的具體表,取得表中的許可權Y,以此類推。
1.查詢資料庫的用戶名,主機,密碼
mysql>select user,host,password from mysql.user;
2.顯示某個用戶的授權命令
mysql>show grants for rep@'%';
3.賦予某個用戶對庫test進行select,insert,update,delete的許可權的命令如下
mysql>grant select,insert,update,delete on test.* to user01@'10.200.20.%' identified by '123';
4.賦予備份整個實例許可權的命令
mysql>grant lock tables,reload,super,select,show view,trigger,process on *.* to backup@'localhost' identified by '123';
5.賦予遠程備份各個庫許可權的命令
mysql>grant lock tables,select,show view,trigger,process on *.* to backup@'10.200.20.18' identified by '123';
主從複製時,需要replication slave許可權,
查看複製的狀態,需要replication client許可權。
6.給用戶superuser賦予所有許可權,並允許superuser用戶也能將這些許可權賦予其他用戶
mysql>grant all privileges on *.* to 'superuser'@'%' identified by '123' with grant option;
7.回收許可權(不包括賦權許可權)
mysql> revoke all privileges on *.* from superuser; #superuser在修改後的下一次請求時,新許可權才生效
8.回收賦權許可權
mysql>revoke grant option on *.* from superuser ;
9.刪除mysql用戶
mysql>drop user 'zhang'@'%'; 或 mysql>delete from mysql.user where user='zhang' and host='%'; mysql>flush privileges;
Mysql的密碼
9.修改用戶密碼(使用mysqladmin命令修改)
#mysqladmin -u root password 123456 #在root沒有密碼的情況下 #mysqladmin -u root -p123456 password abcdef #root有密碼,(-p和密碼要連在一起) #mysqladmin -u superuser -p123456 -h172.23.216.86 password abcdef #superuser的host為%,不是localhost
10.修改用戶密碼(使用set password命令修改)
mysql>set password for user01@'10.200.20.%'=password('123456');
11.修改用戶密碼(使用grant命令重新賦予用戶連接密碼)
mysql>grant usage on test.* to user01@'10.200.20.%' identified by '123456';
12.修改用戶密碼(使用命令直接修改系統表)
mysql>update mysql.user set password=password('12345678') where user='user01' and host='10.200.20.%' mysql>flush privileges;
授權小結:1.當mysqld啟動時,所有的授權表被讀到記憶體,並開始生效。當伺服器註意到授權表被改變時,現存的客戶端連接會收到如下影響。
-
- 表和列的許可權在客戶端的下一次請求時生效。
- 資料庫的許可權改變在下一個 USE db_name 命令時生效。
- 全局許可權的改變和密碼的改變在下一次客戶端連接時生效。
2.grant,revoke或set password 命令對授權表進行修改,伺服器會自動將授權表重新載入到記憶體。
如果手動修改授權表(insert,update,delete),需要手動flush privileges。
3.mysql的主機通配符‘%’不包括‘localhost’,‘localhost’和ip‘127.0.0.1’並不等同,如果使用“mysql -uroot -h localhost”,則預設會連接socket文件,
如果使用“mysql -uroot -h 127.0.01”,則會連接 TCP埠。
---------------------------------------------------------------------------補充-------------------------------------------------------------------------
一、創建用戶時用grant和create user的區別
mysql創建用戶也有三種方法,上面只介紹到了grant,但是還可以用insert user表,create user的方法。
create user 'zhangsan'@'10.200.20.%' identified by '123456';
用戶與@後主機分開 創建出來的用戶:
mysql>create user 'zhang@%' identified by '123456';
用戶與@後主機一致創建出來的用戶: (證明這種方法不可行,網上有的說用這種方法)
為了確認用create user創建的許可權,那麼我們來show grant一下。
mysql>show grants for 'zhang'@'%';
usage表示只能連接登錄,並沒有實際其他許可權。
所有說create user這種方式創建出來的用戶,只能連接一下資料庫,還需繼續用grant給用戶進行授權。
二、mysql的root密碼忘記,找回
1.先把mysql服務停掉
#service mysqld stop
2.用mysqld_safe加參數--skip-grant-tables 啟動,表示跳過授權表啟動msyql
#mysqld_safe --skip-grant-tables &
3.登錄mysql,這時候賬號密碼為空都可以登錄
#mysql -uroot
4.修改root用戶密碼,退出。
mysql> update mysql.user set password=password('today123') where user='root'; mysql> flush privileges; #其實這一步執行完之後,許可權表已經載入到內從中,quit之後,再登錄就已經需要密碼了。
#為了嚴禁,還是要關閉mysql,再啟動
mysql> quit;
5.退出mysql,重啟mysql,再用新密碼登錄
# mysqladmin -uroot -ptoday123 shutdown #這種關閉的方法比較安全, #ps -ef|grep mysqld #檢查mysql進程,實在殺不掉的話,用killall mysqld #service mysqld start #將mysql啟動
#mysql -uroot -ptoday123 #用新密碼登錄