mysql grant 使用者權限總結
說明一下Mysql的權限比對規則
當使用者從用戶端請求登陸時,MySQL将授權表中的條目與用戶端所提供的條目進行比較,包括使用者的使用者名,密碼和主機。授權表中的Host字段是可以使用通配符作為模式進行比對的,如test.example.com, %.example.com, %.com和%都可以比對test.example.com這個主機。授權表中的User字段不允許使用模式比對,但是可以有一個空字元的使用者名代表匿名使用者,并且空字元串可以比對所有的使用者名,就像通配符一樣。 當user表中的Host和User有多個值可以比對用戶端提供的主機和使用者名時,MySQL将user表讀入記憶體,并且按照一定規則排序,按照排序規則讀取到的第一個比對用戶端使用者名和主機名的條目對用戶端進行身份驗證。
排序規則:
1.對于Host字段,按照比對的精确程度進行排序,越精确的排序越前,例如當比對test.example.com這個主機時, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。 2.對于User字段,非空的字元串使用者名比空字元串比對的使用者名排序更靠前。 User和Host字段都有多個比對值,MySQL使用主機名排序最前的條目,在主機名字段相同時再選取使用者名排序更前的條目。是以,如果User和Host字段都有多個比對值,主機名最精确比對的條目被使用者對使用者進行認證。
使用者權限管理主要有以下作用: \1. 可以限制使用者通路哪些庫、哪些表 \2. 可以限制使用者對哪些表執行SELECT、CREATE、DELETE、DELETE、ALTER等操作 \3. 可以限制使用者登入的IP或域名 \4. 可以限制使用者自己的權限是否可以授權給别的使用者
一、使用者授權
mysql> grant all privileges on . to 'yangxin'@'%' identified by 'yangxin123456' with grant option;
添權重限(和已有權限合并,不會覆寫已有權限)
GRANT Insert ON
your database
.* TO
user
@
host
;
删除權限
REVOKE Delete ON
your database
.* FROM
user
@
host
;
DELETE FROM table_name [WHERE Clause]
all privileges:表示将所有權限授予給使用者。也可指定具體的權限,如:SELECT、CREATE、DROP等。 on:表示這些權限對哪些資料庫和表生效,格式:資料庫名.表名,這裡寫“*”表示所有資料庫,所有表。如果我要指定将權限應用到test庫的user表中,可以這麼寫:test.user to:将權限授予哪個使用者。格式:”使用者名”@”登入IP或域名”。%表示沒有限制,在任何主機都可以登入。比如:”yangxin”@”192.168.0.%”,表示yangxin這個使用者隻能在192.168.0IP段登入 identified by:指定使用者的登入密碼 with grant option:表示允許使用者将自己的權限授權給其它使用者 可以使用GRANT給使用者添權重限,權限會自動疊加,不會覆寫之前授予的權限,比如你先給使用者添加一個SELECT權限,後來又給使用者添加了一個INSERT權限,那麼該使用者就同時擁有了SELECT和INSERT權限。
使用者詳情的權限清單請參考MySQL官網說明:http://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

二、重新整理權限
對使用者做了權限變更之後,一定記得重新加載一下權限,将權限資訊從記憶體中寫入資料庫。
mysql> flush privileges;
三、檢視使用者權限
mysql> grant select,create,drop,update,alter on . to 'yangxin'@'localhost' identified by 'yangxin0917' with grant option; mysql> show grants for 'yangxin'@'localhost';
四、回收權限
删除yangxin這個使用者的create權限,該使用者将不能建立資料庫和表。
mysql> revoke create on . from '[email protected]'; mysql> flush privileges;
五、删除使用者
mysql> select host,user from user; +---------------+---------+ | host | user | +---------------+---------+ | % | root | | % | test3 | | % | yx | | 192.168.0.% | root | | 192.168.0.% | test2 | | 192.168.0.109 | test | | ::1 | yangxin | | localhost | yangxin | +---------------+---------+ 8 rows in set (0.00 sec) mysql> drop user 'yangxin'@'localhost';
六、使用者重命名 shell> rename user 'test3'@'%' to 'test1'@'%';
七、修改密碼 1> 更新mysql.user表 mysql> use mysql; # mysql5.7之前 mysql> update user set password=password('123456') where user='root'; # mysql5.7之後 mysql> update user set authentication_string=password('123456') where user='root'; mysql> flush privileges;
2> 用set password指令 文法:set password for ‘使用者名’@’登入位址’=password(‘密碼’)
mysql> set password for 'root'@'localhost'=password('123456');
3> mysqladmin 文法:mysqladmin -u使用者名 -p舊的密碼 password 新密碼
mysql> mysqladmin -uroot -p123456 password 1234abcd
注意:mysqladmin位于mysql安裝目錄的bin目錄下
八、忘記密碼 1> 添加登入跳過權限檢查配置 修改my.cnf,在mysqld配置節點添加skip-grant-tables配置
[mysqld] skip-grant-tables
2> 重新啟動mysql服務 shell> service mysqld restart
3> 修改密碼 此時在終端用mysql指令登入時不需要使用者密碼,然後按照修改密碼的第一種方式将密碼修改即可。
注意:mysql庫的user表,5.7以下版本密碼字段為password,5.7以上版本密碼字段為authentication_string
4> 還原登入權限跳過檢查配置 将my.cnf中mysqld節點的skip-grant-tables配置删除,然後重新啟動服務即可。
Mysql 有多個個權限?經常記不住,今天總結一下,看後都能牢牢的記在心裡啦!!
很明顯總共28個權限:下面是具體的權限介紹:轉載的,記錄一下:
一.權限表
mysql資料庫中的3個權限表:user 、db、 host
權限表的存取過程是:
1)先從user表中的host、 user、 password這3個字段中判斷連接配接的IP、使用者名、密碼是否存在表中,存在則通過身份驗證;
2)通過權限驗證,進行權限配置設定時,按照useràdbàtables_privàcolumns_priv的順序進行配置設定。即先檢查全局權限表user,如果user中對應的權限為Y,則此使用者對所有資料庫的權限都為Y,将不再檢查db, tables_priv,columns_priv;如果為N,則到db表中檢查此使用者對應的具體資料庫,并得到db中為Y的權限;如果db中為N,則檢查tables_priv中此資料庫對應的具體表,取得表中的權限Y,以此類推。
二.MySQL各種權限(共27個)
(以下操作都是以root身份登陸進行grant授權,以[email protected]身份登陸執行各種指令。)
\1. usage
連接配接(登陸)權限,建立一個使用者,就會自動授予其usage權限(預設授予)。
mysql> grant usage on . to ‘p1′@’localhost’ identified by ‘123′;
該權限隻能用于資料庫登陸,不能執行任何操作;且usage權限不能被回收,也即REVOKE使用者并不能删除使用者。
\2. select
必須有select的權限,才可以使用select table
mysql> grant select on pyt.* to ‘p1′@’localhost’;
mysql> select * from shop;
\3. create
必須有create的權限,才可以使用create table
mysql> grant create on pyt.* to ‘p1′@’localhost’;
\4. create routine
必須具有create routine的權限,才可以使用{create |alter|drop} {procedure|function}
mysql> grant create routine on pyt.* to ‘p1′@’localhost’;
當授予create routine時,自動授予EXECUTE, ALTER ROUTINE權限給它的建立者:
mysql> show grants for ‘p1′@’localhost’;
+—————————————————————————+
Grants for [email protected]
+————————————————————————–+
| GRANT USAGE ON . TO ‘p1′@’localhost’ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257′ |
| GRANT SELECT, CREATE, CREATE ROUTINE ON
pyt
.* TO ‘p1′@’localhost’|
| GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE
pyt
.
pro_shop1
TO ‘p1′@’localhost’ |
+————————————————————————————-+
\5. create temporary tables(注意這裡是tables,不是table)
必須有create temporary tables的權限,才可以使用create temporary tables.
mysql> grant create temporary tables on pyt.* to ‘p1′@’localhost’;
[[email protected] ~]$ mysql -h localhost -u p1 -p pyt
mysql> create temporary table tt1(id int);
\6. create view
必須有create view的權限,才可以使用create view
mysql> grant create view on pyt.* to ‘p1′@’localhost’;
mysql> create view v_shop as select price from shop;
\7. create user
要使用CREATE USER,必須擁有mysql資料庫的全局CREATE USER權限,或擁有INSERT權限。
mysql> grant create user on . to ‘p1′@’localhost’;
或:mysql> grant insert on . to [email protected];
\8. insert
必須有insert的權限,才可以使用insert into ….. values….
\9. alter
必須有alter的權限,才可以使用alter table
alter table shop modify dealer char(15);
\10. alter routine
必須具有alter routine的權限,才可以使用{alter |drop} {procedure|function}
mysql>grant alter routine on pyt.* to ‘p1′@’ localhost ‘;
mysql> drop procedure pro_shop;
Query OK, 0 rows affected (0.00 sec)
mysql> revoke alter routine on pyt.* from ‘p1′@’localhost’;
[[email protected] ~]$ mysql -h localhost -u p1 -p pyt
mysql> drop procedure pro_shop;
ERROR 1370 (42000): alter routine command denied to user ‘p1′@’localhost’ for routine ‘pyt.pro_shop’
\11. update
必須有update的權限,才可以使用update table
mysql> update shop set price=3.5 where article=0001 and dealer=’A';
\12. delete
必須有delete的權限,才可以使用delete from ….where….(删除表中的記錄)
\13. drop
必須有drop的權限,才可以使用drop database db_name; drop table tab_name;
drop view vi_name; drop index in_name;
\14. show database
通過show database隻能看到你擁有的某些權限的資料庫,除非你擁有全局SHOW DATABASES權限。
對于[email protected]使用者來說,沒有對mysql資料庫的權限,是以以此身份登陸查詢時,無法看到mysql資料庫:
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema|
| pyt |
| test |
+——————–+
\15. show view
必須擁有show view權限,才能執行show create view。
mysql> grant show view on pyt.* to [email protected];
mysql> show create view v_shop;
\16. index
必須擁有index權限,才能執行[create |drop] index
mysql> grant index on pyt.* to [email protected];
mysql> create index ix_shop on shop(article);
mysql> drop index ix_shop on shop;
\17. excute
執行存在的Functions,Procedures
mysql> call pro_shop1(0001,@a);
+———+
| article |
+———+
| 0001 |
| 0001 |
+———+
mysql> select @a;
+——+
| @a |
+——+
| 2 |
+——+
\18. lock tables
必須擁有lock tables權限,才可以使用lock tables
mysql> grant lock tables on pyt.* to [email protected];
mysql> lock tables a1 read;
mysql> unlock tables;
\19. references
有了REFERENCES權限,使用者就可以将其它表的一個字段作為某一個表的外鍵限制。
\20. reload
必須擁有reload權限,才可以執行flush [tables | logs | privileges]
mysql> grant reload on pyt.* to [email protected];
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant reload on . to ‘p1′@’localhost’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables;
\21. replication client
擁有此權限可以查詢master server、slave server狀态。
mysql> show master status;
ERROR 1227 (42000): Access denied; you need the SUPER,REPLICATION CLIENT privilege for this operation
mysql> grant Replication client on . to [email protected];
或:mysql> grant super on . to [email protected];
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000006 | 2111 | | |
+——————+———-+————–+——————+
mysql> show slave status;
\22. replication slave
擁有此權限可以檢視從伺服器,從主伺服器讀取二進制日志。
mysql> show slave hosts;
ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation
mysql> show binlog events;
ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation
mysql> grant replication slave on . to [email protected];
mysql> show slave hosts;
Empty set (0.00 sec)
mysql>show binlog events;
+—————+——-+—————-+———–+————-+————–+
| Log_name | Pos | Event_type | Server_id| End_log_pos|Info |
+—————+——-+————–+———–+————-+—————+
| mysql-bin.000005 | 4 | Format_desc | 1 | 98 | Server ver: 5.0.77-log, Binlog ver: 4 | |mysql-bin.000005|98|Query|1|197|use
mysql
; create table a1(i int)engine=myisam|
……………………………………
\23. Shutdown
關閉MySQL:
[[email protected] ~]$ mysqladmin shutdown
重新連接配接:
[[email protected] ~]$ mysql
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
[[email protected] ~]$ cd /u01/mysql/bin
[[email protected] bin]$ ./mysqld_safe &
[[email protected] bin]$ mysql
\24. grant option
擁有grant option,就可以将自己擁有的權限授予其他使用者(僅限于自己已經擁有的權限)
mysql> grant Grant option on pyt.* to [email protected];
mysql> grant select on pyt.* to [email protected];
\25. file
擁有file權限才可以執行 select ..into outfile和load data infile…操作,但是不要把file, process, super權限授予管理者以外的賬号,這樣存在嚴重的安全隐患。
mysql> grant file on . to [email protected];
mysql> load data infile ‘/home/mysql/pet.txt’ into table pet;
\26. super
這個權限允許使用者終止任何查詢;修改全局變量的SET語句;使用CHANGE MASTER,PURGE MASTER LOGS。
mysql> grant super on . to [email protected];
mysql> purge master logs before ‘mysql-bin.000006′;
\27. process
通過這個權限,使用者可以執行SHOW PROCESSLIST和KILL指令。預設情況下,每個使用者都可以執行SHOW PROCESSLIST指令,但是隻能查詢本使用者的程序。
mysql> show processlist;
+—-+——+———–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——+———+——+——-+——————+
| 12 | p1 | localhost | pyt | Query | 0 | NULL | show processlist |
+—-+——+———–+——+———+——+——-+——————+
另外,
管理權限(如 super, process, file等)不能夠指定某個資料庫,on後面必須跟.
mysql> grant super on pyt.* to [email protected];
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant super on . to [email protected];
Query OK, 0 rows affected (0.01 sec) --------------------- 作者:anzhen0429 來源:CSDN 原文:https://blog.csdn.net/anzhen0429/article/details/78296814 版權聲明:本文為部落客原創文章,轉載請附上博文連結!