如果需要查看MySQL用户权限,应该如何实现呢?
一、GRANT授权
# mysql -u root -p"xxx"
> grant usage on *.* to 'discuz'@'localhost' identified by 'XXX';
> grant all privileges on `discuz`.* to 'discuz'@'localhost';
创建一个只可以在本地登陆的 不能操作的用用户名 discuz 密码为 XXX,给这个discuz用户操作discuz数据库的所有权限。
GRANT命令用来建立新用户,指定用户口令并增加用户权限,其格式如下:
> GRANT ON
-> TO [IDENTIFIED BY ""]
-> [WITH GRANT OPTION];
正如你看到的,在这个命令中有许多待填的内容。
我们逐一地对它们进行介绍,并最终给出一些例子以让你对它们的协同工作有一个了解。
你可以指定的权限可以分为三种类型:
数据库/数据表/数据列权限
alter: 修改已存在的数据表(例如增加/删除列)和索引
create: 建立新的数据库或数据表
delete: 删除表的记录
drop: 删除数据表或数据库
index: 建立或删除索引
insert: 增加表的记录
select: 显示/搜索表的记录
update: 修改表中已存在的记录
全局管理MySQL用户权限
file: 在MySQL服务器上读写文件
PROCESS: 显示或杀死属于其它用户的服务线程
RELOAD: 重载访问控制表,刷新日志等
SHUTDOWN: 关闭MySQL服务
特别的权限
ALL: 允许做任何事(和root一样)
USAGE: 只允许登录--其它什么也不允许做
二、查看用户权限
> show grants for 'user'@'localhost'
> show grants for user;
> show grants for 'user'@'%'
三、例子
1.创建一个表,并授权特定用户
> CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> grant all privileges on test* to 'test_user'@'%' IDENTIFIED BY 'Test@123';
> flush privileges;
ON 子句中test.* 说明符的意思是“test数据库所有的表”
2. 授予root用户远程权限
> grant all privileges on *.* to 'root'@'%' indentified by 'Root@123' with grant option;
> flush privileges;
ON 子句中*.* 说明符的意思是“所有数据库,所有的表”
with grant option允许你把你自己拥有的那些权限授给其他的用户
3.增加一个用户test密码为Test@123,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限
> grant select,insert,update,delete on *.* to test@"%" Identified by "Test@123";
> flush privileges;
4.增加一个用户test密码为Test@123,, 让他只可以在localhost上登录,并可以对数据库testdb进行查询、插入、修改、删除的操作
> grant select,insert,update,delete on testdb.* to test@localhostidentified by "Test@123";
> flush privileges;
5.MySQL创建只读账号
> GRANT SElECT ON *.* TO 'reader'@'%' IDENTIFIED BY "passwd";
> flush privileges;
6.MySQL赋权与权限回收(grant&revoke)
给用户cacti赋予所有库的所有权限
> GRANT ALL PRIVILEGES ON *.* TO 'cacti'@'%' IDENTIFIED BY 'cacti' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
权限回收(不包含赋权权限)
> REVOKE ALL PRIVILEGES ON *.* FROM cacti;
> REVOKE ALL PRIVILEGES ON cacti.* FROM cacti;
收回赋权权限
> REVOKE GRANT OPTION ON *.* FROM cacti;
> FLUSH PRIVILEGES;
为什么使用了grant all on db.* to user identified by "passwd"后,在主机上访问数据库还会出现ERROR 1045 (28000): Access denied for user'user'@'localhost'(using password: YES) 的错误提示?
运行命令 grant all on db.* to'user'@'localhost'identified by "pass"
当不加@选项时,效果与加@'%'是一样的,'%'从名义上包括任何主机,(%必须加上引号,不然与@放在一起可能不会被辨认出)
不过有些时候(有些版本)'%'不包括localhost,要单独对@'localhost'进行赋值!
正确的操作是:
> grant all on db.* to 'user'@'%' identified by "passwd";
> grant all on db.* to 'user'@'localhost' identified by "passwd";
> flush privileges;