1,MySQL權(quán)限體系
mysql 的權(quán)限體系大致分為5個層級:
全局層級:
全局權(quán)限適用于一個給定服務(wù)器中的所有數(shù)據(jù)庫。這些權(quán)限存儲在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授予和撤銷全局權(quán)限。
數(shù)據(jù)庫層級:
數(shù)據(jù)庫權(quán)限適用于一個給定數(shù)據(jù)庫中的所有目標(biāo)。這些權(quán)限存儲在mysql.db表中。GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤銷數(shù)據(jù)庫權(quán)限。
表層級:
表權(quán)限適用于一個給定表中的所有列。這些權(quán)限存儲在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權(quán)限。
列層級:
列權(quán)限適用于一個給定表中的單一列。這些權(quán)限存儲在mysql.columns_priv表中。當(dāng)使用REVOKE時,您必須指定與被授權(quán)列相同的列。
子程序?qū)蛹墸?/p>
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權(quán)限適用于已存儲的子程序。這些權(quán)限可以被授予為全局層級和數(shù)據(jù)庫層級。而且,除了CREATE ROUTINE外,這些權(quán)限可以被授予為子程序?qū)蛹墸⒋鎯υ趍ysql.procs_priv表中。
這些權(quán)限信息存儲在下面的系統(tǒng)表中:
mysql.user
mysql.db
mysql.host
mysql.table_priv
mysql.column_priv
mysql. procs_priv
當(dāng)用戶連接進來,mysqld會通過上面的這些表對用戶權(quán)限進行驗證!
2, 千里追蹤之5表
相對于oracle來說,mysql的特性是可以限制ip,用戶user、ip地址host、密碼passwd這3個是用戶管理的基礎(chǔ),權(quán)限的細節(jié)基本在mysql.user、mysql.db、mysql.host、mysql.table_priv、mysql.column_priv這幾張表就可以看到很多細節(jié),接下來仔細分析這些表就可以知道權(quán)限的奧秘。
<版權(quán)所有,文章允許轉(zhuǎn)載,但必須以鏈接方式注明源地址,否則追究法律責(zé)任!>
原博客地址: http://blog.csdn.net/mchdba/article/details/45921045
原作者:黃杉 (mchdba)
演示過程中需要建立用戶來演示,先簡單介紹下如何創(chuàng)建用戶:
GRANT priv_type ON database.table
TO user[IDENTIFIED BY [PASSWORD] ‘password’]
[,user [IDENTIFIED BY [PASSWORD] ‘password’]…]
示例:
GRANT SELECT, INSERT, UPDATE, DELETE ON d3307.* TO zengxiaoteng@’%’ IDENTIFIED BY ‘0523’;
2.1db表
2.1.1 表結(jié)構(gòu)如下:
mysql> desc mysql.db; +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | +-----------------------+---------------+------+-----+---------+-------+ 22 rows in set (0.02 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
2.1.2分析如下:
db表存儲了所有對一個數(shù)據(jù)庫的所有操作權(quán)限。創(chuàng)建用戶的時候,都會往Host字段,User字段,Password字段錄入用戶信息;
而當(dāng)執(zhí)行 GRANT SELECT,INSERT ON d3307.* TO u4@’%’ IDENTIFIED BY ‘u40523’;類似的授權(quán)語句的話,Select_priv和Insert_priv字段的值會變成Y其它字段仍然是N;
當(dāng)你執(zhí)行了GRANT ALL ON d3307.* TO u4@’%’ IDENTIFIED BY ‘u40523’;類似的復(fù)制語句的話,后面的字段都會變成Y的值;
2.1.3 創(chuàng)建單個select、insert授予權(quán)限
創(chuàng)建用戶:
GRANT SELECT,INSERT ON d3307.* TO user4@'192.168.52' IDENTIFIED BY 'user0523';
- 1
應(yīng)該除了Host、db、user字段有值,除了Select_priv、Insert_priv值為Y外,其它的都是N。
查看mysql.db表的記錄正是如此,如下所示:
mysql> SELECT * FROM mysql.db
where user='user4'\G; *************************** 1. row *************************** Host: 192.168.52 Db: d3307 User: user4 Select_priv: Y Insert_priv: Y Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Grant_priv: N References_priv: N Index_priv: N Alter_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Execute_priv: N Event_priv: N Trigger_priv: N 1 row in set (0.01 sec) ERROR: No query specified mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
2.1.4 授予ALL權(quán)限
執(zhí)行sql語句建立用戶:
GRANT ALL ON d3307.* TO dba5@'192.168.52.1' IDENTIFIED BY 'dba0523';
- 1
建立用戶的時候,如下所示,除了Host、db、user字段外,所有的_priv字段記錄都會變成Y值,(Grant_priv仍然是N值除非加了WITH GRANT OPTION執(zhí)行GRANT ALL ON d3307.* TO dba5@’192.168.52.1’ IDENTIFIED BY ‘dba0523’ WITH GRANT OPTION ;)
如下所示:
mysql> SELECT * FROM mysql.db
where user='dba5'\G; *************************** 1. row *************************** Host: 192.168.52.1 Db: d3307 User: dba5 Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Grant_priv: N References_priv: Y Index_priv: Y Alter_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Create_view_priv: Y Show_view_priv: Y Create_routine_priv: Y Alter_routine_priv: Y Execute_priv: Y Event_priv: Y Trigger_priv: Y 1 row in set (0.00 sec) ERROR: No query specified mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
2.2 user表
2.2.1 表結(jié)構(gòu):
mysql> desc mysql.user; +------------------------+-----------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+-----------------------------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Password | char(41) | NO | | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Reload_priv | enum('N','Y') | NO | | N | | | Shutdown_priv | enum('N','Y') | NO | | N | | | Process_priv | enum('N','Y') | NO | | N | | | File_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Show_db_priv | enum('N','Y') | NO | | N | | | Super_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Repl_slave_priv | enum('N','Y') | NO | | N | | | Repl_client_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Create_user_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | | Create_tablespace_priv | enum('N','Y') | NO | | N | | | ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | | | ssl_cipher | blob | NO | | NULL | | | x509_issuer | blob | NO | | NULL | | | x509_subject | blob | NO | | NULL | | | max_questions | int(11) unsigned | NO | | 0 | | | max_updates | int(11) unsigned | NO | | 0 | | | max_connections | int(11) unsigned | NO | | 0 | | | max_user_connections | int(11) unsigned | NO | | 0 | | | plugin | char(64) | YES | | | | | authentication_string | text | YES | | NULL | | | password_expired | enum('N','Y') | NO | | N | | +------------------------+-----------------------------------+------+-----+---------+-------+ 43 rows in set (0.10 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
2.2.2 分析
存儲用戶記錄的表,存儲了用戶的信息,每一次創(chuàng)建用戶的時候,都會往這個表里錄入記錄,當(dāng)你執(zhí)行了,都會往Host字段,User字段,Password字段錄入數(shù)據(jù),但是后面的Select_priv、Insert_priv、Update_priv等字段的值,只有賦予GRANT ALL ON . TO timdba@’192.%’ IDENTIFIED BY ‘timdba0523’;類似的對所有庫的操作權(quán)限的時候才會被記錄成Y,否則都記錄成N。
2.2.3 創(chuàng)建對庫所有表有操作權(quán)限的普通用戶
創(chuàng)建用戶:
GRANT SELECT,UPDATE ON d3307.* TO user6@'192.168.52.1' IDENTIFIED BY 'user0523';
- 1
分析結(jié)果:存儲在mysql.user表里面的記錄當(dāng)中,Host、User、Password是有值的,但是其它的Select_priv等*_priv字段值都是N。
驗證結(jié)果,去查看表里的存儲記錄,如下所示:
mysql> SELECT * FROM mysql.user where user='user6'\G; *************************** 1. row *************************** Host: 192.168.52.1 User: user6 Password: *A4D1F6ACEBC5D3EB0F6D33C7DCC629E8BE55B75A 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: password_expired: N 1 row in set (0.00 sec) ERROR: No query specified mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
2.2.4 創(chuàng)建對于所有表有操作權(quán)限的用戶
創(chuàng)建用戶:
mysql> GRANT SELECT,UPDATE ON . TO user7@'%' IDENTIFIED BY 'user0523'; Query OK, 0 rows affected (0.00 sec) mysql>
- 1
- 2
- 3
- 4
分析:
基本的Host、User、Password字段有記錄值,然后grant了select和update所以關(guān)于_priv字段中select和update字段有值為Y,其它_priv字段值應(yīng)該是N。
查看記錄結(jié)果,分享正確,如下所示:
mysql> SELECT * FROM mysql.user where user='user7'\G; *************************** 1. row *************************** Host: % User: user7 Password: *A4D1F6ACEBC5D3EB0F6D33C7DCC629E8BE55B75A Select_priv: Y Insert_priv: N Update_priv: Y 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: password_expired: N 1 row in set (0.00 sec) ERROR: No query specified mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
2.3 tables_priv表
2.3.1 查看表結(jié)構(gòu)
mysql> desc mysql.tables_priv; +-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Table_name | char(64) | NO | PRI | | | | Grantor | char(77) | NO | MUL | | | | Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | | | Column_priv | set('Select','Insert','Update','References') | NO | | | | +-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+ 8 rows in set (0.00 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
2.3.2 分析:
記錄了對一個表的單獨授權(quán)記錄,只有執(zhí)行g(shù)rant insert on dbname.tablename to user1@’%’identified by ‘pwd’;類似的授權(quán)記錄才會在這個表里錄入授權(quán)信息;其中各個字段涵義如下:
<colgroup><col style="width: 375px;"><col style="width: 375px;"></colgroup>
|
字段
|
存儲的數(shù)據(jù)
|
|
Host字段
|
用戶的登錄ip范圍
|
|
User字段
|
表所在的數(shù)據(jù)庫名稱
|
|
Table_name字段
|
授權(quán)的表的名稱
|
|
Grantor字段
|
執(zhí)行g(shù)rant建立用戶的授權(quán)者
|
|
Timestamp字段
|
0000-00-00 00:00:00
|
|
Table_priv字段
|
所授予的操作表的權(quán)限,比如select、udate、delete等
|
|
Column_priv字段
|
對這個表的某個字段單獨授予的權(quán)限
|
另外當(dāng)賦予all在某張表上的時候,Table_priv列會多處所有關(guān)于表的授權(quán)記錄,描述如下:
Select,Insert,Update,Delete,Create,Drop,References,Index,Alter,Create View,Show view,Trigger。
2.3.3 創(chuàng)建單獨操作這個表的用戶
創(chuàng)建用戶:
mysql> GRANT INSERT,SELECT,UPDATE ON d3307.t TO user8@'192.168.52.1' IDENTIFIED BY 'dba0523'; Query OK, 0 rows affected (0.00 sec) mysql>
- 1
- 2
- 3
- 4
分析結(jié)果:
應(yīng)該是Host、Db、User、Table_name、Grantor、Timestamp、Table_priv是有值的,但是Column_priv沒有值,因為沒有單獨對某一個列做了授權(quán)限制的。
查看權(quán)限,如下所示:
mysql> SELECT * FROM mysql.tables_priv where user='user8'\G; *************************** 1. row *************************** Host: 192.168.52.1 Db: d3307 User: user8 Table_name: t Grantor: root@localhost Timestamp: 0000-00-00 00:00:00 Table_priv: Select,Insert,Update Column_priv: 1 row in set (0.00 sec) ERROR: No query specified mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2.3.4 單獨為某個列授權(quán)
授權(quán)語句操作:
mysql> GRANT UPDATE(created_time) ON d3307.t TO user8@'192.168.52.1'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT SELECT(uname) ON d3307.t TO user8@'192.168.52.1'; Query OK, 0 rows affected (0.00 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
分析:
單獨為某個列授權(quán),會記錄在這個表的Column_priv字段里面,會記錄下對單個列的授權(quán)操作記錄
查看記錄:
mysql> SELECT * FROM mysql.tables_priv where user='user8'\G; *************************** 1. row *************************** Host: 192.168.52.1 Db: d3307 User: user8 Table_name: t Grantor: root@localhost Timestamp: 0000-00-00 00:00:00 Table_priv: Select,Insert,Update Column_priv: Select,Update 1 row in set (0.00 sec) ERROR: No query specified mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
而且還會在另外一個權(quán)限表mysql.columns_priv留下記錄單獨的授權(quán)記錄,如下所示:
mysql> SELECT * FROM mysql.columns_priv WHERE USER='user8'; +--------------+-------+-------+------------+--------------+---------------------+-------------+ | Host | Db | User | Table_name | Column_name | Timestamp | Column_priv | +--------------+-------+-------+------------+--------------+---------------------+-------------+ | 192.168.52.1 | d3307 | user8 | t | created_time | 0000-00-00 00:00:00 | Update | | 192.168.52.1 | d3307 | user8 | t | uname | 0000-00-00 00:00:00 | Select | +--------------+-------+-------+------------+--------------+---------------------+-------------+ 2 rows in set (0.00 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.4 columns_priv表
2.4.1 表結(jié)構(gòu)如下:
mysql> desc mysql.columns_priv; +-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Table_name | char(64) | NO | PRI | | | | Column_name | char(64) | NO | PRI | | | | Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | Column_priv | set('Select','Insert','Update','References') | NO | | | | +-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+ 7 rows in set (0.04 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2.4.2 分析
單獨對某一列有操作權(quán)限的時候,會將權(quán)限信息記錄在這個表里面,比如新建立一個賬號GRANT UPDATE(uname) ON d3307.t TO user9@’192.168.52.%’ IDENTIFIED BY ‘user0520’; 那么就會在這個表上錄入授權(quán)信息記錄,重點看Column_name字段和Column_priv字段的值。
2.4.3 實際操作
創(chuàng)建用戶操作:
mysql> GRANT UPDATE(uname) ON d3307.t TO user9@'192.168.52.%' IDENTIFIED BY 'user0520'; Query OK, 0 rows affected (0.00 sec) mysql>
- 1
- 2
- 3
- 4
查看結(jié)果,會在這個columns_priv表留下一條記錄:
mysql> SELECT * FROM mysql.columns_priv WHERE USER='user9'; +--------------+-------+-------+------------+-------------+---------------------+-------------+ | Host | Db | User | Table_name | Column_name | Timestamp | Column_priv | +--------------+-------+-------+------------+-------------+---------------------+-------------+ | 192.168.52.% | d3307 | user9 | t | uname | 0000-00-00 00:00:00 | Update | +--------------+-------+-------+------------+-------------+---------------------+-------------+ 1 row in set (0.00 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2.5 procs_priv表
2.5.1 表結(jié)構(gòu)
mysql> desc proxies_priv; +--------------+------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------+------+-----+-------------------+-----------------------------+ | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Proxied_host | char(60) | NO | PRI | | | | Proxied_user | char(16) | NO | PRI | | | | With_grant | tinyint(1) | NO | | 0 | | | Grantor | char(77) | NO | MUL | | | | Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +--------------+------------+------+-----+-------------------+-----------------------------+ 7 rows in set (0.04 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.6.2分析:
procs_priv表可以對存儲過程和存儲函數(shù)進行權(quán)限設(shè)置。主要字段:proc_priv。
3,創(chuàng)建用戶
3.1、CREATE USER創(chuàng)建用戶
使用CREATE USER語句創(chuàng)建用戶,必須要擁有CREATE USER權(quán)限。其格式如下:
CREATE USER user[IDENTIFIED BY [PASSWORD] 'password'], [user[IDENTIFIED BY [PASSWORD] 'password']]...
- 1
- 2
其中,user參數(shù)表示新建用戶的賬戶,user由用戶名(User)和主機名(Host)構(gòu)成;IDENTIFIED BY關(guān)鍵字用來設(shè)置用戶的密碼;password參數(shù)表示用戶的密碼;如果密碼是一個普通的字符串,就不需要使用PASSWORD關(guān)鍵字。可以沒有初始密碼。
例如
CREATE USER 'sys'@'%' IDENTIFIED BY 'sys';
- 1
執(zhí)行之后user表會增加一行記錄,但權(quán)限暫時全部為‘N’。
3.2、用INSERT語句新建普通用戶
可以使用INSERT語句直接將用戶的信息添加到mysql.user表。但必須擁有mysql.user表的INSERT權(quán)限。
另外,ssl_cipher、x509_issuer、x509_subject等必須要設(shè)置值,否則INSERT語句無法執(zhí)行。
示例:
INSERT INTO mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) VALUES(‘%’,’newuser1’,PASSWORD(‘123456’),”,”,”)
執(zhí)行INSERT之后,要使用命令:FLUSH PRIVILEGES;命令來使用戶生效。
3.3、用GRANT語句來新建普通用戶
用GRANT來創(chuàng)建新的用戶時,能夠在創(chuàng)建用戶時為用戶授權(quán)。但需要擁有GRANT權(quán)限。
語法如下:
GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIED BY [PASSWORD] 'password']...]
- 1
- 2
- 3
priv_type:參數(shù)表示新yoghurt的權(quán)限;
databse.table:參數(shù)表示新用戶的權(quán)限范圍;
user:參數(shù)新用戶的賬戶,由用戶名和主機構(gòu)成;
IDENTIFIED BY關(guān)鍵字用來設(shè)置密碼;
password:新用戶密碼;
PS:GRANT語句可以同時創(chuàng)建多個用戶。.與db.的區(qū)別在于。.對所有數(shù)據(jù)庫生效,所以user表的SELECT會變?yōu)閅。而db.user表為’N’,更改的是Db表。
4,刪除用戶
4.1 drop user刪除用戶
DROP USER語句刪除普通用戶,需要擁有DROP USER權(quán)限。
語法如下:
DROP USER user[,user]...
- 1
user是需要刪除的用戶,由用戶名(User)和主機名(Host)構(gòu)成。
4.2 DELETE語句刪除普通用戶
可以使用DELETE語句直接將用戶的信息從mysql.user表中刪除。但必須擁有對mysql.user表的DELETE權(quán)限。DELETE FROM mysql.user WHERE Host = ‘%’ AND User = ‘a(chǎn)dmin’; 刪除完成后,一樣要FLUSH PRIVILEGES才生效。
5,修改用戶密碼
5.1 使用mysqladmin命令來修改root用戶的密碼
語法:
mysqladmin -u -username -p password "new_password"
- 1
新密碼(new_password)必須用括號括起來,單引號會報錯。
示例,修改中要輸入舊的密碼來驗證:
[root@data02 ~]# mysqladmin -u timman -p password "tim" --socket=/usr/local/mysql3307/mysql.sock Enter password: [root@data02 ~]# [root@data02 ~]# mysql --socket=/usr/local/mysql3307/mysql.sock -utimman -ptim -e "select @@port"; +--------+ | @@port | +--------+ | 3307 | +--------+ [root@data02 ~]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
5.2 修改user表
UPDATE user表的passwor字段的值,也可以達到修改密碼的目的;
UPDATE user SET Password = PASSWORD('123') WHERE USER = 'myuser'; FLUSH PRIVILEGES;
- 1
- 2
刷新后生效。
5.3 使用SET語句來修改密碼
使用root用戶登錄到MySQL服務(wù)器后,可以使用SET語句來修改密碼:
修改自己的密碼,不需要用戶名
SET PASSWORD = PASSWORD("123");
- 1
修改其他用戶密碼:
SET PASSWORD FOR 'myuser'@'%'=PASSWORD("123456") FOR 用戶名@主機名
- 1
5.4 GRANT語句來修改普通用戶的密碼
使用GRANT語句修改普通用戶的密碼,必須擁有GRANT權(quán)限。
GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
- 1
示例:
GRANT SELECT ON . TO 'user10'@'%' IDENTIFIED BY '123'
- 1
5.5 忘記用戶密碼的解決辦法
普通用戶,直接用root超級管理員登錄進去修改密碼就可以了,但是如果root密碼丟失了,怎么辦呢?
5.5.1 msyqld_saft方式找回密碼
停止mysql:service mysqld stop;
安全模式啟動:mysqld_safe –skip-grant-tables &
無密碼回車鍵登錄:mysql -uroot –p
重置密碼:use mysql; update user set password=password(“”) where user=’root’ and host=’localhost’; flush privileges;
正常啟動:service mysql restart
再使用mysqladmin: mysqladmin password ‘123456’
5.5.2 使用普通賬號來找回密碼
–>(1):有一個修改test庫的用戶:grant create,delete,update,insert,select on d3307.* to test@’%’ identified by ‘t1’;
–>(2):復(fù)制user表文件到test庫下并且賦予mysql用戶訪問權(quán)限:
cp /home/data/mysql/data/mysql/user.* /home/data/mysql/data/test/;chown mysql.mysql /home/data/mysql/data/test/user.*
–>(3):mysql -utest -pt1登錄修改root密碼:
–>(4):將test庫的user表文件覆蓋 mysql庫的user表文件
cp /home/data/mysql/data/mysql/user.* /tmp/; mv /home/data/mysql/data/test/user.* /home/data/mysql/data/mysql/ ; chown mysql.mysql /home/data/mysql/data/mysql/user.*;
–>(5):查找mysql進程號,并且發(fā)送SIGHUP信號,重新加載權(quán)限表。
pgrep -n mysql; kill -SIGHUP 12234;
–>(6):無密碼登錄,再使用mysqladmin重新設(shè)置密碼。
PS:請參考第20課的視頻,那里有詳細的記錄整個過修改密碼的過程。
6,收回用戶權(quán)限
查看權(quán)限:
SHOW GRANTS; SHOW GRANTS FOR user10@'%';
- 1
或者直接執(zhí)行sql命令去mysql數(shù)據(jù)庫下的user表中查看存儲著用戶的基本權(quán)限:
SELECT * FROM mysql.user WHERE USER='user10' AND HOST='%';
- 1
使用revoke關(guān)鍵字來收回權(quán)限:
REVOKE priv_type[(column_list)] ON database.table FROM user[,user]
- 1
- 2
- 3
示例:
REVOKE EXECUTE ON d3307.* FROM user10@'%';
- 1
7,數(shù)據(jù)庫用戶劃分
7.1 普通數(shù)據(jù)管理用戶:
賦予對業(yè)務(wù)表的查詢維護權(quán)限即可,授權(quán)sql如下:
GRANT SELECT, INSERT, UPDATE, DELETE ON d3307.* TO zengxiaoteng@'%' IDENTIFIED BY '0523';
- 1
7.2 開發(fā)人員賬戶:
賦予增刪改查的權(quán)限,授權(quán)sql如下:
GRANT SELECT,INSERT,DELETE,UPDATE ON d3307.* TO huyan@'%' IDENTIFIED BY '0523';
- 1
授予創(chuàng)建、修改、刪除 MySQL 數(shù)據(jù)表結(jié)構(gòu)權(quán)限。
GRANT CREATE ON d3307.* TO huyan@’192.168.52.11’; GRANT ALTER ON d3307.* TO huyan@’192.168.52.11’; GRANT DROP ON d3307.* TO huyan@’192.168.52.11’;
- 1
- 2
- 3
授予操作 MySQL 外鍵權(quán)限:
GRANT REFERENCES ON d3307.* TO huyan@’192.168.52.11’;
- 1
授予操作 MySQL 臨時表權(quán)限:
GRANT CREATE TEMPORARY TABLES ON d3307.* TO huyan@’192.168.52.11’;
- 1
授予操作 MySQL 索引權(quán)限:
GRANT INDEX ON d3307.* TO huyan@’192.168.52.11’;
- 1
授予操作 MySQL 視圖、查看視圖源代碼 權(quán)限:
GRANT CREATE VIEW ON d3307.* TO huyan@’192.168.52.11’; GRANT SHOW VIEW ON d3307.* TO huyan@’192.168.52.11’;
- 1
- 2
授予操作 MySQL 存儲過程、函數(shù) 權(quán)限:
GRANT CREATE ROUTINE ON d3307.* TO huyan@’192.168.52.11’; GRANT ALTER ROUTINE ON d3307.* TO huyan@’192.168.52.11’; GRANT EXECUTE ON d3307.* TO huyan@’192.168.52.11’;
- 1
- 2
- 3
7.3 DBA人員賬戶
授予普通DBA管理某個MySQL數(shù)據(jù)庫(test)的權(quán)限:
GRANT ALL PRIVILEGES ON test TO sysdba@'192.168.52.%';
- 1
授予高級 DBA 管理 MySQL 中所有數(shù)據(jù)庫的權(quán)限:
GRANT ALL ON . TO sysdba@'192.168.52.%';
- 1
7.4 數(shù)據(jù)分析人員只讀賬號
只需要分配只讀的權(quán)限:
GRANT SELECT ON d3307.* TO dataquery@'192.168.52.129' IDENTIFIED BY '20150523';
- 1
甚至有些用戶,可以只分配讀取某些表列的權(quán)限,如下所示:
GRANT SELECT ON test.* TO dataquery@’192.168.52.%’ IDENTIFIED BY ‘20150523’;
GRANT SELECT(id,uname) ON d3307.t TO dataquery@’192.168.52.%’ ;
示列權(quán)限登錄操作:
[root@data02 ~]# mysql --socket=/usr/local/mysql3307/mysql.sock -u dataquery -p20150523 -h192.168.52.130 -P3307 Welcome TO the MySQL monitor. Commands END WITH ; OR \g. Your MySQL CONNECTION id IS 18 SERVER VERSION: 5.6.12-LOG Source distribution Copyright (c) 2000, 2013, Oracle AND/OR its affiliates. ALL rights reserved. Oracle IS a registered trademark of Oracle Corporation AND/OR its affiliates. Other NAMES may be trademarks of their respective owners. TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the current input statement. mysql> SELECT * FROM d3307.t; ERROR 1142 (42000): SELECT command denied TO USER 'dataquery'@'data02' FOR TABLE 't' mysql> mysql> SELECT id,uname FROM d3307.t; +----+-------+ | id | uname | +----+-------+ | 1 | a | +----+-------+ 1 ROW IN SET (0.00 sec) mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
8,權(quán)限劃分一般原則
數(shù)據(jù)庫一般劃分為線上庫,測試庫,開發(fā)庫。
8.1對于線上庫:
DBA:有所有權(quán)限,超級管理員權(quán)限
應(yīng)用程序:分配insert、delete、update、select、execute、events、jobs權(quán)限。
測試人員:select某些業(yè)務(wù)表權(quán)限
開發(fā)人員:select某些業(yè)務(wù)表權(quán)限
原則:所有對線上表的操作,除了應(yīng)用程序之外,都必須經(jīng)由DBA來決定是否執(zhí)行、已經(jīng)什么時候執(zhí)行等。
8.2 測試庫
DBA:所有權(quán)限。
測試人員:有insert、delete、update、select、execute、jobs權(quán)限。
數(shù)據(jù)分析人員:只有select查詢權(quán)限
開發(fā)人員:有select權(quán)限。
原則:DBA有所有權(quán)限,而且嚴(yán)格控制表結(jié)構(gòu)的變更,不允許除了dba之外的人對測試環(huán)境的庫環(huán)境進行修改,以免影響測試人員測試。所有對測試庫的表結(jié)構(gòu)進行的修改必須由測試人員和DBA一起審核過后才能操作。
8.3 開發(fā)庫
DBA:所有權(quán)限