浅谈Mysql权限控制

Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,由mysql_install_db脚本初始化。存储账户权限信息表主要有:user、db、host、tables_priv、columns_priv和procs_priv。
以下是对各表的简单说明:
user表:Mysql中最重要的一个权限表,记录允许连接到服务器的账号信息,里面的权限是全局级的。可以通过DESC mysql.user来查看表的结构信息,user表中字段分为4类,分别是用户列、权限列、安全列和资源控制列。表结构如下:
+————————+———————————–+——+—–+———+——-+
| 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 | |
+————————+———————————–+——+—–+———+——-+
42 rows in set (0.00 sec)
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.01 sec)
host表:存储了某个主机对数据库的操作权限,配合db权限表对给定主机上数据库级操作权限作更细致的控制。字段大致分两类,用户列和权限列,结构如下:
+———————–+—————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———————–+—————+——+—–+———+——-+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | 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 | |
| Trigger_priv | enum(‘N’,’Y’) | NO | | N | |
+———————–+—————+——+—–+———+——-+
20 rows in set (0.00 sec)
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.02 sec)
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.00 sec)
procs_priv表:对存储过程和存储函数设置操作权限。结构如下:
+————–+—————————————-+——+—–+——————-+—————————–+
| Field | Type | Null | Key | Default | Extra |
+————–+—————————————-+——+—–+——————-+—————————–+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Routine_name | char(64) | NO | PRI | | |
| Routine_type | enum(‘FUNCTION’,’PROCEDURE’) | NO | PRI | NULL | |
| Grantor | char(77) | NO | MUL | | |
| Proc_priv | set(‘Execute’,’Alter Routine’,’Grant’) | NO | | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+————–+—————————————-+——+—–+——————-+—————————–+
8 rows in set (0.00 sec)
而对于权限管理,可以用GRANT语句为用户授予权限,用REVOKE语句取消用户某些权限,这里不做说明。
最后注意的一点是,由于权限信息数据量比较小,访问比较频繁,Mysql在启动后会将权限表的信息缓存起来,所以手工修改权限信息之后,都需要执行”FLUSH PRIVILEGES”指令来重新刷新缓存中存储的权限信息。比如说通过mysql.user来设置远程访问权限,就需要执行”FLUSH PRIVILEGES”指令来刷新权限信息。值得注意的是,用户使用grant/revoke/drop user/create user命令修改用户权限的时候,也会更新缓存中的权限信息。比如说通过grant指令来设置远程访问权限,就不用手动刷新权限信息了。
好了,今天的分享就到这里了,由于是个人整理,难免会出错,欢迎大家批评指正,万般感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值