如果需要查看MySQL用户权限,应该如何实现呢?
一、GRANT授权
> mysql -u root -p "xxx"
> grant usage on *.* to 'root'@'localhost' identified by 'XXX';
> grant all privileges on `temp`.* to 'root'@'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 'test'@'localhost'
> show grants for test;
> show grants for 'test'@'%'
三、例子
- 创建一个表,并授权特定用户(列:test用户)
> CREATE DATABASE IF NOT EXISTS test_user DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> grant all privileges on test_user.* to 'test'@'%' IDENTIFIED BY 'test123';
> flush privileges;
ON 子句中test.* 说明符的意思是“test数据库所有的表”
部分高版本mysql不适用于上述第二部授权的语句,会出现本地可以连接,但是其他ip连接此数据库的时候会报cashing_sha2_password无法加载的错误,此时需要如下授权():
> grant all privileges on test.* to 'test_user'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'test123';
- 授予root用户远程权限
> grant all privileges on *.* to 'root'@'%' indentified by '123456' with grant option;
> flush privileges;
ON 子句中*.* 说明符的意思是“所有数据库,所有的表”
with grant option允许你把你自己拥有的那些权限授给其他的用户
- 增加一个用户test密码为test123,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限:
> grant select,insert,update,delete on *.* to 'test'@'%' Identified by "test123";
> flush privileges;
- 增加一个用户test密码为test123,让他只可以在localhost上登录,并可以对数据库testdb进行查询、插入、修改、删除的操作
> grant select,insert,update,delete on testdb.* to test@localhostidentified by "test123";
> flush privileges;
- MySQL创建只读账号
> GRANT SElECT ON *.* TO 'reader'@'%' IDENTIFIED BY "reader456";
> flush privileges;
- MySQL赋权与权限回收(grant&revoke))
- 给用户cacti赋予所有库的所有权限
> GRANT ALL PRIVILEGES ON *.* TO 'cacti'@'%' IDENTIFIED BY 'cacti789' 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 "user000";
> grant all on db.* to 'user'@'localhost' identified by "123456";
> flush privileges;