一、MySQL权限如下表
权限名字 权限说明 Context CREATE 允许创建新的数据库和表 Databases, tables, or indexes DROP 允许删除现有数据库、表和视图 Databases, tables, or views GRANT OPTION 能够把自己获得的权限转赠给其他用户一个副本 Databases, tables, or stored routines LOCK TABLES 允许使用显式锁表的语句锁表,前提是你必须有SELECT权限 Databases REFERENCES MySQL 5.7.6之前引用特权是未使用的。5.7.6,创建一个外键约束需要引用父表的特权。 Databases or tables EVENT The EVENT privilege is required to create, alter, drop, or see events for the Event Scheduler. Databases ALTER 允许修改权限或重命名表 Tables DELETE 允许从表中或数据库中删除行 Tables INDEX 允许创建或删除索引 Tables INSERT 允许在表和数据库中插入行 Tables or columns SELECT 允许在表和数据库这查询行 Tables or columns UPDATE 允许在表和数据空中更新行 Tables or columns CREATE TEMPORARY TABLES 允许创建和使用临时表 Tables TRIGGER 允许使用触发器相关,前提是你必须拥有这个表的CREATE、DROP、EXECUTE或者Display权限 Tables CREATE VIEW 允许使用CREATE VIEW语句 Views SHOW VIEW 允许使用SHOW VIEW语句 Views ALTER ROUTINE ALTER ROUTINE允许你修改存储过程(过程或函数)前提是你需要在存储过程上拥有ALTER或DROP权限 Stored routines CREATE ROUTINE ALTER ROUTINE允许你创建存储过程(过程或函数)前提是你需要在存储过程上拥有ALTER或DROP权限 Stored routines EXECUTE 允许你执行存储过程(过程或函数) Stored routines FILE 文件读写权限允许你文件在服务器主机上使用LOAD DATA INFILE and SELECT 语句以及LOAD DATA()函数 File access on server host CREATE TABLESPACE 允许创建表空间,前提是你需要CREATE、ALTER OR DROP tablespaces 以及属于log file 组 Server administration CREATE USER 允许使用ALTER USER, CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES 语句 Server administration PROCESS 允许使用SHOW PROCESSLIST or mysqladmin processlist看到线程属于其他账户,你总能看到自己的线程。PROCESS权限还允许使用SHOW ENGINE语句 Server administration PROXY Server administration RELOAD 允许使用FLUSH语句,以及mysqladmin命令中对于FLUSH的操作例如:flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, and reload. Server administration REPLICATION CLIENT 是否有权限去请求复制相关主数据库产生的事件的,允许显示的使用SHOW MASTER STATUS, SHOW SLAVE STATUS, and SHOW BINARY LOGS语句 Server administration REPLICATION SLAVE 是否能够创建连接以复制的方式,连接至数据库服务器端 Server administration SHOW DATABASES 允许使用SHOW DATABASES来查看所有数据库列表,如果没有这个权限则只能查看规定数据库 Server administration SHUTDOWN 允许使用SHUTDOWN语句,mysqladmin shutdown命令,以及mysql_shutdown()API函数 Server administration SUPER 超级特权可以用于终止其他会话或改变服务器运行。属于特别高级别的一类权限 Server administration USAGE 无权限,当您想要创建一个没有权限的用户时,可以指定USAGE Server administration ALL PRIVILEGES 所有权限: ALL PRIVILEGES,可以简写为ALL Server administration
二、授权示例
1.1 登陆MYSQL,创建用户并授权
#mysql -uroot -p123456
mysql>grant all on *.* to 'demo'@'localhost' identified by 'demo' ; ##创建一个用户"demo"并对“localhost”上的所有 ##管有最高权限
1.2 创建用户对指定数据库的权限(ALTER, DELETE, INDEX, INSERT, SELECT, UPDATE,DROP .... )
mysql>grant all on demo.* to 'demo'@'127.0.0.1' identified by 'demo' ; ##demo用户对demo数据库有最高权限
mysql>grant select on demo.* to 'demo'@'127.0.0.1' identified by 'demo'; ##demo用户对demo数据库有select权限
mysql>grant delete on demo.* to 'demo'@'127.0.0.1' identified by 'demo'; ##demo用户对demo数据库有delete权限
mysql>grant update on demo.* to 'demo'@'127.0.0.1' identified by 'demo'; ##demo用户对demo数据库有update权限
mysql>grant create on demo.* to 'demo'@'127.0.0.1' identified by 'demo'; ##demo用户对demo数据库有create权限
mysql>grant drop on demo.* to 'demo'@'127.0.0.1' identified by 'demo'; ##demo用户对demo数据库有drop权限
mysql>grant drop on demo.* to 'demo'@'%' identified by 'demo'; ##demo用户对所有主机授权,可以在任何主机登陆
mysql>grant references on testdb.* to developer@'192.168.0.%'; ##允许developer对192.168.0.x有操作外键权限
mysql>grant create temporary tables on testdb.* to developer@'192.168.0.%'; ##允许developer对192.168.0.x有临时表权限
mysql>grant create index tables on testdb.* to developer@'192.168.0.%'; ##允许developer对192.168.0.x有索引权限
mysql>grant create view tables on testdb.* to developer@'192.168.0.%'; ##允许developer对192.168.0.x,创建视图权限
mysql>grant show view tables on testdb.* to developer@'192.168.0.%'; ##允许developer对192.168.0.x,查看视图权限
grant 操作 MySQL 存储过程、函数 权限。
mysql>grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status
mysql>grant alter routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure
mysql>grant execute on testdb.* to developer@'192.168.0.%';
grant 普通 DBA 管理某个 MySQL 数据库的权限。
mysql>grant all privileges on testdb to dba@'localhost' ; ##其中,关键字 “privileges” 可以省略。
grant 高级 DBA 管理 MySQL 中所有数据库的权限。
mysql>grant all on *.* to dba@'localhost' ;
grant 作用在整个 MySQL 服务器上:
mysql>grant select on *.* to dba@localhost; ##dba 可以查询 MySQL 中所有数据库中的表。
mysql>grant all on *.* to dba@localhost; ##dba 可以管理 MySQL 中的所有数据库
grant 作用在单个数据库上:
mysql>grant select on testdb.* to dba@localhost; ##dba 可以查询 testdb 中的表。
grant 作用在单个数据表上:
grant select, insert, update, delete on testdb.orders to dba@localhost ;
这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345';
grant select on smp.mo_sms to mo_user@'%' identified by '123345';
grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
grant 作用在存储过程、函数上:
grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'
三、 查看用户及权限
mysql>show grants; ##查看当前用户权限
mysql>show grants for 'zabbix'@'localhost' ##查看zabbix@'localhost'的权限
四、撤消已赋予Mysql的用户权限
mysql>grant all on *.* to dba@localhost;
mysql>revoke all on *.* from dba@localhost;
四、 删除账户及权限
mysql>drop user 用户名@‘localhost’
mysql>drop user 用户名@‘127.0.0.1’
MySQL grant、revoke 用户权限注意事项
1. grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。
2. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“
mysql>grant select on testdb.* to dba@localhost with grant option;
这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。
mysql授权表共有5个表:user、db、host、tables_priv和columns_priv。
授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。
五、修改用户密码:
1、5.7.6之前修改密码
mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost";
mysql>flush privileges;
以上的方法,在MySQL 5.7早期版本时,还是很好用的,但在MySQL 5.7.6以后的版本,最后一点重置密码总是无法生效,会出来下面的错误。
2、5.7.6之后修改密码
在my.conf中[mysqld]下新增一行添加skip-grant-tables
> vim /etc/my.cnf
重启mysql
> service mysqld restart
登录root账号
> mysql -uroot
如果当前root用户authentication_string字段下有内容,先将其置空,否则直接跳过本步骤
mysql> use mysql;
mysql> update user set authentication_string='' where user='root';
使用ALTER修改root密码(密码需包含大写字母,小写字母,数字,特殊符号),方法为:
mysql> ALTER user 'root'@'localhost' IDENTIFIED BY 'Root1#';
重新编辑my.conf,去掉skip-grant-tables,重启mysql,用密码登录即可