权限表
user 表
user表是MySQL中一个重要的权限表,记录允许连接服务器的账号信息,
user表有42个字段主要分为四类:
用户列
有 host,user, password 字段,连接时只有这三个值都匹配才能连接,修改密码其实就是修改password字段的值
权限列
类型为枚举:值为 Y 或 N
可以使用 grant 或 update 改变user表的字段来修改权限
安全列
其中两个是 和 ssl相关
用户可以使用 show variables like “have_openssl” 查看服务是否支持ssl功能
资源控制类
max_questions----> 用户每小时允许的查询操作次数
max_updates—被允许更新次数
max_connections—每小时连接次数
max_user_connections----用户同时建立的连接数量
db表 host表
db:存储了用户对db的操作权限
host:记录某个主机对DB的操作权限
两者相结合
注意:好像MySQL5.7版本后是没有host表
tables_priv && columns_priv 表
tables_priv 用来对标设置操作权限
columns_priv 用来对表的某一列设置权限
对表的权限包括:select update delete insert drop alter create grant references 等
proces_priv 表
对------ 存储过程,存储函数设置操作权限
proc_priv 表示拥有的权限 包括 ----- execute、alter routine、grant
账户管理
登录退出MySQL服务器
参数
- h 主机名或ip,默认是localhost
- u 用户名
- p 密码
- P 端口号
- 数据库名,在命令最后指定
新建用户
两种方式:1.使用 create user 或 grant语句 2.操作MySQL的授权表
但是一般我们都使用第一种方式
注意:新建的用户没有任何权限
# 第一种方式
# identified 用来设置用户密码
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
# 第一种方式 使用 grant 所有数据库都有select && update 权限
GRANT SELECT,UPDATE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testpwd';
# 第二种方式 修改user表
INSERT INTO user (Host,User,Password) VALUES('localhost','customer1',PASSWORD('customer1'));
删除用户
# 删除用户本地登录权限
drop user "user_name"@"localhost"
# 删除用户
delete from user where host=‘hostname’ and user='username'
root修改自己密码
1.修改MySQL数据库中的user表
UPDATE mysql.user set Password=password(“rootpwd2”)
WHERE User=“root” and Host=“localhost”;
2.使用MySQLadmin
mysqladmin -u username -p password “newpwd”
更改权限后,使用 flush privileges
3.使用 set password 设置密码
set password=password(“rootpwd”)
root用户修改 普通用户密码
- 使用set 语句
- set password for “user”@“host” = password(“somepwd”)
- 如果是普通用户修改则可以省略for
- set password = password(“somepwd”)
- 使用update语句修改用户密码
update mysql.user set password=password(“userpwd”) where user=“username” and host=“hostname” - 使用grant 修改密码
grant usage on *.* to 'username'@'password' identified by "userpassword"
- 一个普通用户修改自己密码
- set password = password(“userpwd”)
忘记root密码解决办法
- 使用 --skip-grant-tables 选项,MySQL服务启动时将不会加载权限判断
mysqld --skip-grant-tables
- 直接mysql -u root 就好了
musql -u root
此时应该直接连上MySQL了
- 登录成功设置root密码
update mysql.user set password=password(“userpwd”)
- 加载权限
flush privileges
权限管理
MySQL 的各种权限
账号的权限都存储在,user、db、host、tables_priv、columns_priv、proces_priv
授权
- 全局层级
grant all on . 和 revoke all on . 授予或撤销全局权限
- 数据库层级
- 表级别
- 列级别
示例演示
使用 grant 创建一个新用户 grantuser 密码为 grantpwd
grant select,insert on . to ‘grantuser’@‘localhost’ identified by ‘grantpwd’ with grant option
with 后面可以跟的参数
grant option :被授权的用户,可以讲这些权限赋予别的用户
收回权限
取消用户的update权限
revoke update on . from ‘testuser’@‘localhost’;
查看用户的权限信息
show grants for ‘user’@‘host’
select privileges from user where user=“username” ,host=“hostname”;
访问控制
连接核实阶段
当用户连接MySQL时,MySQL会去user表中验证 host user password ,这三个字段是否匹配上,若果匹配上则允许登录,否则拒绝访问
请求核实阶段
阶段2:
1.建立连接后,这个连接上的每个请求服务器都会检查用户要执行的操作,判断用户是否有足够的权限来执行,权限来自表,库级 db、用户级 user、表级别 tables_priv 、列级别 columns_priv。 2.确认权限时,先检查user表如果被授权,则检查db表如果被授权,则继续检查,tables_priv和columns_priv 表,如果所有权限检查过了则执行,否则error