用户和权限管理
设置密码安全级别
# root 根用户 (超级管理员)
# 用户信息表:mysql.user
FLUSH PRIVILEGES;-- 刷新权限
INSTALL PLUGIN validate_password SONAME 'validate_password.so';-- 安装并激活密码规则插件
SHOW VARIABLES LIKE 'validate_password%';-- 进行查看密码强度
SET GLOBAL validate_password_policy = 0;-- 进行设值密码强度为低,但是密码至少8位
# 或者
SET GLOBAL validate_password_policy = LOW;
创建与删除用户
## 创建新用户
CREATE USER 用户名@地址 IDENTIFIED BY [PASSWORD] 密码(字符串) ;
## 增加本地用户
CREATE USER 'tom'@'localhost' IDENTIFIED BY '12345678'; -- 增加用户
## 增加远程用户
CREATE USER 'tom'@'%' IDENTIFIED BY '12345678';
-- 创建用户必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
-- CREATE USER语句只能创建用户,不能赋予权限。
-- 用户名,注意引号:如 'user_name'@'192.168.1.%'
-- 密码也需引号,纯数字密码也要加引号
-- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD
## 修改用户
RENAME USER old_user TO new_user;-- 重命名用户
RENAME USER tom TO tom2;
## 修改密码
## MySQL5版本修改密码
SET PASSWORD = PASSWORD ( '12345678' );-- 设置管理员密码(MySQL8.0之后删除了该语法)
SET PASSWORD FOR 用户名 = PASSWORD ( '密码' );-- 为指定用户设置密码
#### 例如
SET PASSWORD FOR 'tom' @'%' = PASSWORD ( '12345678' );
## mysql8.0之后版本修改密码
ALTER USER 'tom' @'%' IDENTIFIED BY '12345678';
## 删除用户
DROP USER 用户名;
### 例如:
DROP USER tom2;
用户权限设置
-- 分配权限/添加用户
GRANT 权限列表 ON 库名.表名 TO 用户名 [ IDENTIFIED BY [ PASSWORD ] 'password' ]
-- all privileges 表示所有权限可以简写成 all,它不包括GRANT OPTION (分配权限的权限);
-- *.* 表示所有库的所有表
-- 库名.表名 表示某库下面的某表
## 赋予tom所有权限
GRANT ALL PRIVILEGES ON school.* TO "tom" @"%";
## 赋予tom插入数据、查询数据的权限
GRANT INSERT, SELECT ON school.* TO "tom" @"%";
# 查看用户的权限
SHOW GRANTS FOR 用户名;-- 查看当前用户权限
SHOW GRANTS FOR root@localhost;-- 查看权限
SHOW GRANTS;-- 查询所有用户权限
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
## 删除权限
REVOKE 权限列表 ON 库名.表名 FROM 用户名; -- 撤消用户的某个权限
REVOKE ALL PRIVILEGES, GRANT OPTION ON 库名.表名 FROM 用户名; -- 撤销用户的所有权限
权限列表
-- 权限列表
ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限
ALTER -- 允许使用ALTER TABLE
ALTER ROUTINE -- 更改或取消已存储的子程序
CREATE -- 允许使用CREATE TABLE
CREATE ROUTINE -- 创建已存储的子程序
CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE
CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW -- 允许使用CREATE VIEW
DELETE -- 允许使用DELETE
DROP -- 允许使用DROP TABLE
EXECUTE -- 允许用户运行已存储的子程序
FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX -- 允许使用CREATE INDEX和DROP INDEX
INSERT -- 允许使用INSERT
LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS -- 允许使用SHOW FULL PROCESSLIST
REFERENCES -- 未被实施
RELOAD -- 允许使用FLUSH
REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT -- 允许使用SELECT
SHOW DATABASES -- 显示所有数据库
SHOW VIEW -- 允许使用SHOW CREATE VIEW
SHUTDOWN -- 允许使用mysqladmin shutdown
SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE -- 允许使用UPDATE
USAGE -- “无权限”的同义词
GRANT OPTION -- 允许授予权限
案例练习
1.添加用户:
快速创建用户:
格式:
create user 'username'@'ip地址' identified by '密码';
添加用户可能会出现密码验证强度过高的提示,解决方法为:
show variables like 'validate_password%'; -- 查看密码强度
set global validate_password_policy=LOW; -- 设值密码强度为低
( 注意:ip地址所选范围: %为所有ip localhost 只为本地连接 )
一般创建用户并赋予特定权限:
格式:
grant 权限 on 数据库.* to 用户名@登录的主机 identified by "密码"; -- 【 默认全部操作权限 】
例1:增加一个admin1用户,密码为123,可以在任何主机上登录,并对所有数据库有查询、增加、修改和删除的功能。需要在mysql的root用户下进行
create user "admin1"@"%" identified by "12345678";
grant select,insert,update,delete on *.* to "admin1"@"%";
flush privileges;
例2:增加一个admin2用户,密码为123,只能在192.168.8.1 上登录,并对数据库student有查询,增加,修改和删除的功能。需要在mysql的root用户下进行
create database student charset utf8mb4;
create user "admin2"@"192.168.8.1" identified by '12345678';
grant select,insert,update,delete on student.* to "admin2"@"192.168.8.1";
flush privileges;
查看所有的用户
use mysql
select user,host form user;
2.更新用户名或者ip:
rename user '旧的用户名'@'旧的ip地址' to '新的用户名'@'新的ip地址'
rename user 'admin1'@'%' to 'lily'@'192.168.8.%';
3.登录用户:
mysql -u用户名 -p -hIP地址
mysql -ulily -p12345678 -h192.168.8.100
( 注意:创建指定ip地址的用户,登录时需要指定对应的ip地址 )
4. 授权用户admin3拥有数据库student的所有权限
-- mysql5.7 即以下版本可以创建用户的同时赋予权限,在mysql8中默认无法使用,
grant all privileges on student.* to "admin3"@"localhost" identified by '12345678';
flush privileges;
-- mysql8.0 中创建用户和设置权限需要分开执行
create user "admin3"@"localhost" identified by '12345678';
grant all privileges on student.* to "admin3"@"localhost";
flush privileges;
5.修改用户密码
此方法是mysql5.x的方法,mysql8.x无法使用
update mysql.user set password=password('123456') where user='admin1' and host='localhost';
flush privileges;
6.删除用户
drop user 用户名@'%';
drop user 用户名@localhost;
# 或者
use mysql;
delete from user where user="用户名";
7.grant 普通数据用户,查询、插入、更新、删除数据库中所有表数据的权利
grant select on admindb.* to user1@'%';
grant insert on admindb.* to user1@'%';
grant update on admindb.* to user1@'%';
grant delete on admindb.* to user1@'%';
或者一条查询所有:
grant select, insert, update, delete on admindb.* to user1@'%';
8.grant 数据库开发人员,创建表、索引、视图、存储过程、函数等权限
-- grant 创建、修改、删除 MySQL 数据表结构权限
grant create on testdb.* to developer@'192.168.8.%';
grant alter on testdb.* to developer@'192.168.8.%';
grant drop on testdb.* to developer@'192.168.8.%';
-- grant 操作 MySQL 外键权限
grant references on testdb.* to developer@'192.168.8.%';
-- grant 操作 MySQL 临时表权限
grant create temporary tables on testdb.* to developer@'192.168.8.%';
-- grant 操作 MySQL 索引权限
grant index on testdb.* to developer@'192.168.8.%';
-- grant 操作 MySQL 视图、查看视图源代码 权限
grant create view on testdb.* to developer@'192.168.8.%';
grant show view on testdb.* to developer@'192.168.8.%';
-- grant 操作 MySQL 存储过程、函数 权限
grant create routine on testdb.* to developer@'192.168.8.%';
grant alter routine on testdb.* to developer@'192.168.8.%';
grant execute on testdb.* to developer@'192.168.8.%';
9.grant 普通 test1管理某个 MySQL 数据库的权限
grant all privileges on admindb to test1@'localhost'
-- 其中,关键字 “privileges” 可以省略。
10.grant 高级 test1管理 MySQL 中所有数据库的权限
grant all on *.* to test1@'localhost';
11.grant作用在整个服务器上:
grant select on *.* to admin1@localhost; -- admin1 可以查询 MySQL 中所有数据库中的表
grant all on *.* to admin1@localhost; -- admin1 可以管理 MySQL 中的所有数据库
12.grant 作用在单个数据库上:
grant select on admindb.* to admin@localhost; -- admin 可以查询 admindb中的表
grant select,insert,update,delete on admindb.orders to admin@localhost; -- admin 可以查询、添加、修改及删除 admindb中的表orders
13.grant 作用在表中的列上:
grant select(id, name, age) on admindb.goods_log to admin@localhost;
14.grant 作用在存储过程、函数上:
grant execute on procedure admindb.goods_log to admin@localhost
grant execute on function admindb.goods_log to admin@localhost
15.查看当前用户(自己)权限:
show grants;
16.查看其他 MySQL 用户权限:
show grants for admin@localhost;
17.撤销已经赋予给 MySQL 用户权限的权限;
revoke 跟 grant 的语法差不多,只需要把关键字 "to" 换成 "from" 即可:
-- grant all on *.* to admin@localhost;
revoke all on *.* from admin@localhost;