MySQL的权限内容
1、概述
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的各种权限,一般生产环境中 的程序账号只需要SELECT、INSERT、UPDATE和DELETE权限即可。 MySQL根据访问控制列表(ACL)对所有连接、查询和用户尝试执行的其他操作进行安全管理。MySQL将验证用户的3项 信息:用户名、密码、主机来源。对通过验证的用户再确认其他的访问权限,以进行访问控制。
权限可以分为两类:系统权限和对象选项。 系统权限允许执行一些特定的功能,如关闭数据库、终止进程、显示数据库列表、查看当前执行的查询等。对象权限是指 对一些特殊的对象(表、列、视图、数据库)的访问权限,例如是否允许访问某张表,是否允许在某个库中创建表。
GRANT和REVOKE语句允许系统管理员创建MySQL用户账户、授予权限和撤销权限。授予的权限可以分为多个级别:服 务器级别(全局)、数据库级别、表级别、列级别、子程序级别。撤销权限即回收已经存在的权限。
语法如下:
GRANT [privileges] ON [objects] TO [user]
GRANT [privileges] ON [objects] TO [user] IDENTIFIED BY [password]
REVOKE [privileges] ON [objects] FROM [user]
MySQL为有SUPER权限的用户专门保留了一个额外的连接,因此即使是所有的普通连接都被占用,MySQL root用户仍可以 登录并检查服务器的活动。如果想要限制单个账户允许的连接数量,可以通过设置max_user_connections变量来完成。
注意:
1)当在GRANT语句中指定数据库名称时,允许使用“_”和“%”通配符。这意味着,如果想要使用“_”字符作为一个数据库名称 的一部分,则应该在GRANT语句中指定它为“\_”,例如,“GRANT…ON‘foo\_bar’.* TO…。”;
2)show tables 命令不会显示用户没有权限访问的表;
3)不用采用相同的用户名(但来自于不同的主机)赋予不同权限的方式,这样容易造成混淆,导致维护困难;
2、权限更改何时生效
当mysqld启动时,所有授权表的内容将被读进内存并且从此时开始生效。当服务器注意到授权表被改变了时,现存的客户 端连接将会受到如下影响。
表和列的权限在客户端的下一次请求时生效;
数据库的权限改变在下一个use db_name命令生效;
全局权限的改变和密码改变在下一次客户端连接时生效;
如果使用GRANT、REVOKE或SET PASSWORD命令对授权表进行修改,那么服务器会注意到更改并立即将授权表重新载 入内存。如果手动地修改授权表(使用INSERT、UPDATE或DELETE等),则应该执行mysqladmin flush-privileges或mysqladmin reload告 诉服务器再重新装载授权表,否则手动的更改将不会生效,除非重启服务器。
3、常用的权限
show privileges命令可以显示MySQL所支持的权限,如下是一些常用的权限。
mysql> show privileges;
Select_priv:确定用户是否可以通过SELECT命令选择数据
Insert_priv:确定用户是否可以通过INSERT命令插入数据
Update_priv:确定用户是否可以通过UPDATE命令修改现有数据
Delete_priv:确定用户是否可以通过DELETE命令删除现有数据
Create_priv:确定用户是否可以创建新的数据库和表
Drop_priv:确定用户是否可以删除现有数据库和表
Reload_priv:确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表
Shutdown_priv:确定用户是否可以关闭MySQL服务器,将此权限提供给root账户之外的任何用户时,都应当非常谨慎
Process_priv:确定用户是否可以通过SHOW
File_priv:确定用户是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令
Grant_priv:确定用户是否可以将已经授予给该用户自己的权限再授予其他用户,例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户
References_priv:目前只是某些未来功能的占位符,现在没有作用
Index_priv:确定用户是否可以创建和删除表索引
Alter_priv:确定用户是否可以重命名和修改表结构
Show_db_priv:确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库,可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因
Super_priv:确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令
Create_tmp_table_priv:确定用户是否可以创建临时表
Lock_tables_priv:确定用户是否可以使用LOCK
Execute_priv:确定用户是否可以执行存储过程,此权限只在MySQL 5.0及更高版本中有意义
Repl_slave_priv:确定用户是否可以读取用于维护复制数据库环境的二进制日志文件,此用户位于主系统中,有利于主机和客户机之间的通信
Repl_client_priv:确定用户是否可以确定复制从服务器和主服务器的位置
Create_view_priv:确定用户是否可以创建视图,此权限只在MySQL 5.0及更高版本中有意义
Show_view_priv:确定用户是否可以查看视图或了解视图如何执行,此权限只在MySQL 5.0及更高版本中有意义 Create_routine_priv:确定用户是否可以更改或放弃存储过程和函数,此权限是在MySQL 5.0中引入的 Alter_routine_priv:确定用户是否可以修改或删除存储函数及函数,此权限是在MySQL 5.0中引入的 Create_user_priv:确定用户是否可以执行CREATE
Event_priv:确定用户能否创建、修改和删除事件,这个权限是MySQL 5.1.6新增的
Trigger_priv:确定用户能否创建和删除触发器,这个权限是MySQL 5.1.6新增的
Create_tablespace_priv: 创建表的空间
常用的权限:
1)SELECT、INSERT、UPDATE和DELETE权限允许用户在一个数据库现有的表上实施读取、插入、更新和删除记录的操 作。这也是一般程序账号所需要的权限;
2)SHOW VIEW权限允许用户查看已经创建了的视图;
3)ALTER权限允许用户使用ALTERTABLE命令来修改现有数据表的结构;
4)CREATE和DROP权限允许用户创建新的数据库和表,或者删除现存的数据库和表。生产环境中一般不赋予程序账号DROP 的权限;
5)GRANT权限允许用户把自己拥有的权限授予其他的用户;
6)FILE权限允许被授予该权限的用户都能读或写MySQL服务器能读写的任何文件;
7)SHUTDOWN权限允许用户使用SHUTDOWN命令关掉服务器。可以创建一个用户专门用来关闭服务器;
8)PROCESS权限允许用户使用PROCESSLIST命令显示在服务器内执行的进程的信息;使用KILL命令终止服务器进程。用户总是能显示或终止自己的进程,但是,显示或终止其他用户启动的进程则需要PROCESS权限。一些监控工具需要PROCESS权 限查看正在执行的命令;
4、设置mysql用户资源限制
• 通过设置全局变量max_user_connections可以限制所有用户在同一时间连接MySQL实例的数量,但此参数无法对每个用户区别对待,所以 MySQL提供了对每个用户的资源限制管理
• MAX_QUERIES_PER_HOUR:一个用户在一个小时内可以执行查询的次数(基本包含所有语句)
• MAX_UPDATES_PER_HOUR:一个用户在一个小时内可以执行修改的次数(仅包含修改数据库或表的语句)
• MAX_CONNECTIONS_PER_HOUR:一个用户在一个小时内可以连接MySQL的时间
• MAX_USER_CONNECTIONS:一个用户可以在同一时间连接MySQL实例的数量
• 通过执行create user/alter user设置/修改用户的资源限制
mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank' WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;
mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
• 取消某项资源限制既是把原先的值修改成0
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
• 当针对某个用户的max_user_connections非0时,则忽略全局系统参数 max_user_connections,反之则全局系统参数生效
5、设置mysql用户的密码
1)执行create user 创建用户和密码
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
2)修改用户密码的方式包括:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
shell> mysqladmin -u user_name -h host_name password "new_password";
3)修改本身用户密码的方式包括:
mysql> ALTER USER USER() IDENTIFIED BY 'mypass';
mysql> SET PASSWORD = PASSWORD('mypass');
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的各种权限,一般生产环境中 的程序账号只需要SELECT、INSERT、UPDATE和DELETE权限即可。 MySQL根据访问控制列表(ACL)对所有连接、查询和用户尝试执行的其他操作进行安全管理。MySQL将验证用户的3项 信息:用户名、密码、主机来源。对通过验证的用户再确认其他的访问权限,以进行访问控制。
权限可以分为两类:系统权限和对象选项。 系统权限允许执行一些特定的功能,如关闭数据库、终止进程、显示数据库列表、查看当前执行的查询等。对象权限是指 对一些特殊的对象(表、列、视图、数据库)的访问权限,例如是否允许访问某张表,是否允许在某个库中创建表。
GRANT和REVOKE语句允许系统管理员创建MySQL用户账户、授予权限和撤销权限。授予的权限可以分为多个级别:服 务器级别(全局)、数据库级别、表级别、列级别、子程序级别。撤销权限即回收已经存在的权限。
语法如下:
GRANT [privileges] ON [objects] TO [user]
GRANT [privileges] ON [objects] TO [user] IDENTIFIED BY [password]
REVOKE [privileges] ON [objects] FROM [user]
MySQL为有SUPER权限的用户专门保留了一个额外的连接,因此即使是所有的普通连接都被占用,MySQL root用户仍可以 登录并检查服务器的活动。如果想要限制单个账户允许的连接数量,可以通过设置max_user_connections变量来完成。
注意:
1)当在GRANT语句中指定数据库名称时,允许使用“_”和“%”通配符。这意味着,如果想要使用“_”字符作为一个数据库名称 的一部分,则应该在GRANT语句中指定它为“\_”,例如,“GRANT…ON‘foo\_bar’.* TO…。”;
2)show tables 命令不会显示用户没有权限访问的表;
3)不用采用相同的用户名(但来自于不同的主机)赋予不同权限的方式,这样容易造成混淆,导致维护困难;
2、权限更改何时生效
当mysqld启动时,所有授权表的内容将被读进内存并且从此时开始生效。当服务器注意到授权表被改变了时,现存的客户 端连接将会受到如下影响。
表和列的权限在客户端的下一次请求时生效;
数据库的权限改变在下一个use db_name命令生效;
全局权限的改变和密码改变在下一次客户端连接时生效;
如果使用GRANT、REVOKE或SET PASSWORD命令对授权表进行修改,那么服务器会注意到更改并立即将授权表重新载 入内存。如果手动地修改授权表(使用INSERT、UPDATE或DELETE等),则应该执行mysqladmin flush-privileges或mysqladmin reload告 诉服务器再重新装载授权表,否则手动的更改将不会生效,除非重启服务器。
3、常用的权限
show privileges命令可以显示MySQL所支持的权限,如下是一些常用的权限。
mysql> show privileges;
Select_priv:确定用户是否可以通过SELECT命令选择数据
Insert_priv:确定用户是否可以通过INSERT命令插入数据
Update_priv:确定用户是否可以通过UPDATE命令修改现有数据
Delete_priv:确定用户是否可以通过DELETE命令删除现有数据
Create_priv:确定用户是否可以创建新的数据库和表
Drop_priv:确定用户是否可以删除现有数据库和表
Reload_priv:确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表
Shutdown_priv:确定用户是否可以关闭MySQL服务器,将此权限提供给root账户之外的任何用户时,都应当非常谨慎
Process_priv:确定用户是否可以通过SHOW
File_priv:确定用户是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令
Grant_priv:确定用户是否可以将已经授予给该用户自己的权限再授予其他用户,例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户
References_priv:目前只是某些未来功能的占位符,现在没有作用
Index_priv:确定用户是否可以创建和删除表索引
Alter_priv:确定用户是否可以重命名和修改表结构
Show_db_priv:确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库,可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因
Super_priv:确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令
Create_tmp_table_priv:确定用户是否可以创建临时表
Lock_tables_priv:确定用户是否可以使用LOCK
Execute_priv:确定用户是否可以执行存储过程,此权限只在MySQL 5.0及更高版本中有意义
Repl_slave_priv:确定用户是否可以读取用于维护复制数据库环境的二进制日志文件,此用户位于主系统中,有利于主机和客户机之间的通信
Repl_client_priv:确定用户是否可以确定复制从服务器和主服务器的位置
Create_view_priv:确定用户是否可以创建视图,此权限只在MySQL 5.0及更高版本中有意义
Show_view_priv:确定用户是否可以查看视图或了解视图如何执行,此权限只在MySQL 5.0及更高版本中有意义 Create_routine_priv:确定用户是否可以更改或放弃存储过程和函数,此权限是在MySQL 5.0中引入的 Alter_routine_priv:确定用户是否可以修改或删除存储函数及函数,此权限是在MySQL 5.0中引入的 Create_user_priv:确定用户是否可以执行CREATE
Event_priv:确定用户能否创建、修改和删除事件,这个权限是MySQL 5.1.6新增的
Trigger_priv:确定用户能否创建和删除触发器,这个权限是MySQL 5.1.6新增的
Create_tablespace_priv: 创建表的空间
常用的权限:
1)SELECT、INSERT、UPDATE和DELETE权限允许用户在一个数据库现有的表上实施读取、插入、更新和删除记录的操 作。这也是一般程序账号所需要的权限;
2)SHOW VIEW权限允许用户查看已经创建了的视图;
3)ALTER权限允许用户使用ALTERTABLE命令来修改现有数据表的结构;
4)CREATE和DROP权限允许用户创建新的数据库和表,或者删除现存的数据库和表。生产环境中一般不赋予程序账号DROP 的权限;
5)GRANT权限允许用户把自己拥有的权限授予其他的用户;
6)FILE权限允许被授予该权限的用户都能读或写MySQL服务器能读写的任何文件;
7)SHUTDOWN权限允许用户使用SHUTDOWN命令关掉服务器。可以创建一个用户专门用来关闭服务器;
8)PROCESS权限允许用户使用PROCESSLIST命令显示在服务器内执行的进程的信息;使用KILL命令终止服务器进程。用户总是能显示或终止自己的进程,但是,显示或终止其他用户启动的进程则需要PROCESS权限。一些监控工具需要PROCESS权 限查看正在执行的命令;
4、设置mysql用户资源限制
• 通过设置全局变量max_user_connections可以限制所有用户在同一时间连接MySQL实例的数量,但此参数无法对每个用户区别对待,所以 MySQL提供了对每个用户的资源限制管理
• MAX_QUERIES_PER_HOUR:一个用户在一个小时内可以执行查询的次数(基本包含所有语句)
• MAX_UPDATES_PER_HOUR:一个用户在一个小时内可以执行修改的次数(仅包含修改数据库或表的语句)
• MAX_CONNECTIONS_PER_HOUR:一个用户在一个小时内可以连接MySQL的时间
• MAX_USER_CONNECTIONS:一个用户可以在同一时间连接MySQL实例的数量
• 通过执行create user/alter user设置/修改用户的资源限制
mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank' WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;
mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
• 取消某项资源限制既是把原先的值修改成0
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
• 当针对某个用户的max_user_connections非0时,则忽略全局系统参数 max_user_connections,反之则全局系统参数生效
5、设置mysql用户的密码
1)执行create user 创建用户和密码
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
2)修改用户密码的方式包括:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
shell> mysqladmin -u user_name -h host_name password "new_password";
3)修改本身用户密码的方式包括:
mysql> ALTER USER USER() IDENTIFIED BY 'mypass';
mysql> SET PASSWORD = PASSWORD('mypass');