MySQL5.7用户即权限管理
MySQL5.7修改了很多新特性, 特别是在用户管理方面, 已经截然不同.
注释:
部分新特性
# mysql_native_password详解
mysql.user表新增plugin列,且若某账户该字段值为空则账户不能使用。从低版本MySQL升级至MySQL5.7时要注意该问题,且建议DBA将使用mysql_old_password插件的账户替换为使用 mysql_native_password插件。
意为者设置账户后,要用update user set plugin="mysql_native_password"; 来设置一下.
特别提醒注意的一点是,新版的mysql数据库下的user表中已经没有Password字段了
而是将加密后的用户密码存储于 authentication_string 字段,这就意味着,设置密码时要用这个字段来指定密码.
每次创建新用户必须刷新权限表:
flush privileges;
mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问,还有一种方法,就是重新启动mysql服务器,来使新设置生效
user: 登录的用户名
host: 指定可以访问的地址 %为任意地址
authentication_string: 登录密码
privileges: 权限,可指定,SELECT, INSERT, UPDATE,CREATE....之类的.对库或表的权限,ALL代表所有权限.
databasename.tablename: 指定权限针对XX库下的XX表; databasename.*代表整个库; *.*代表整个MySQL.
use mysql
进入系统资源库.
该库存储着MySQL系统配置,函数,用户权限等等.
该库中的user表, 存储着管理员.
SELECT 字段 FROM user WHERE 条件
如:
SELECT user,host,authentication_string FROM mysql.user WHERE user='root';
# 如果在修改时提示
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令。
1、show variables like 'SQL_SAFE_UPDATES';查看开关状态。
2、执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式即可
# 这里的password()是一个MySQL的函数select password("字符串");可以对字符串进行不可逆的加密.
# 用这种方式的话,必须配合password()函数进行加密操作
UPDATE mysql.user SET authentication_string=password('MyPassword') WHERE user='userName';
# MySQL5.7新特性
update mysql.user set plugin="mysql_native_password";
# 刷新新的权限表
flush privileges;
如:
#此处的where条件后面不是必须同时指定USER和host.如果非必要的话, 不用同时指定两个.
update mysql.user set authentication_string=password('sss') where user='root';
#将root用户修改为允许任意来源的连接,这里必须用%,用0.0.0.0不生效
UPDATE mysql.user SET host='%' where user='root';
update mysql.user set plugin="mysql_native_password";
flush privileges;
# 5.7以后推荐下面这两种方式,下面两种执行后即可生效,不用执行flush privileges什么的.
# 这种的@前后都不能省去,不知道些什么可select一下user表,'用户'名@'作用域的HOST'host为%代表不限制
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
MySQL修改用户的密码主要有两种方法:ALTER USER 和SET PASSWORD
ALTER USER 基本使用
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sss';
修改当前登录用户
ALTER USER USER() IDENTIFIED BY 'sss';
使密码过期
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sss' PASSWORD EXPIRE;
使密码从不过期
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sss' PASSWORD EXPIRE NEVER;
按默认设置过期时间
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sss' PASSWORD EXPIRE DEFAULT;
指定过期间隔
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sss' PASSWORD EXPIRE INTERVAL 90 DAY;
在MySQL文档里,推荐使用ALTER USER修改用户密码
SET PASSWORD 使用SET PASSWORD的password有两种:
使用默认加密
SET PASSWORD FOR 'root'@'localhost' = 'sss';
使用PASSWORD()函数加密
SET PASSWORD FOR 'root'@'localhost' = PASSWORD("sss");
注意:使用PASSWORD('auth_string')的方式已经被废弃,在以后的版本会把它移除,所以不建议使用它来修改密码。
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
flush privileges;
如:
CREATE USER 'liuhao'@'%' IDENTIFIED BY 'password';
flush privileges;
每次创建新用户必须刷新权限表:
flush privileges;
否则登录时提示:ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES )
DROP USER 'Name'@'HOST'
如:
DROP USER 'liuhao'@'localhost';
SHOW GRANTS FOR 'Name'@'Host';
如:
SHOW GRANTS FOR 'root'@'localhost';
GRANT privileges ON databasename.tablename TO 'UserName'@'Host'
GRANT SELECT, INSERT, UPDATE ON test.user TO 'liuhao'@'localhost';
注释:
权限: ALL代表所有权限
库表选择: *.*代表整个MySQL
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
用法和授权相同
如:
REVOKE SELECT ON test.user FROM 'liuhao'@'localhost';
将该用户的权限设置为只查.基本上就是用来连库, 啥也干不了.
注释:
搜来搜去只能这个干.
如果要彻底清掉, 可以直接删除该用户.
grant 权限 privileges on 库名.表名 to 用户名@域名 identified by '密码';
如:
GRANT all privileges on *.* to 'liuhao'@'localhost' identified by 'password';
# 必须执行, 刷新权限表.
flush privileges;