mysql 数据库用户管理与用户授权
mysql 数据库用户管理与授权
一 : mysql 用户管理与恢复root 密码
1 新建用户
create user '用户名'@‘登录地址' [ identitified by '密码' ];
select password('密码');
create user ’用户名'@‘登录地址’ identified by '加密密文';
用户名:指定将创建的用户名
登录地址:指新创建的用户可以从哪里登录数据库。可以适应 ip 地址,网段,主机名,本地用户为localhost,任意主机都可以登录为’%‘
密码:
(1)若使用明文面,则直接输入。如果要使用加密密码则下使用select password('密码') ;获取密文,再在语句中添加password '密文';
(2) 如果省略 'identified by' 部分,则用户的密码将为空
复制#显示当前登录用户与登录地点
select user();
#明文创建本地登录用户test ,并设置密码abc123
create user 'test'@'localhost' identified by 'abc123';
#密文创建用户
#先查看密码 abc123 的加密密码
select password('abc123');
#在使用加密后的密码,创建本地登录用户test2
create user 'test2'@'localhost' identified by password '*6691484EA6B50DDDE1926A220DA01FA9E575C18A';
2 查看用户信息与显示登录用户
select * from mysql.user \G
select User,Host,authentication_string from mysql.user;
mysql 数据库用户信息保存在mysql 库 的user表中,包括了用户名,用户登录地点,用户权限,用户密码加密密文等。其中 User 项保存了用户名,Host 项保存了用户登录地点,autentication_string 保存了用户密码加密密文
复制select user,host,authentication_string from mysql.user;
3 重命名用户
rename user '用户名'@‘登录地点’ to '新用户名'@'新登录地点';
'用户名'@'登录地点' 必须时存在的。
复制#将本地登录的用户test2 该文任意地点都可以登录的用户test
rename user 'test2'@'localhost' to 'test'@'%';
4 删除用户
drop user '用户名'@'客户端登录地址';
删除用户必须要有管理员权限才可以。
如果不加 @'客户端登录地址', 相当于删除 '用户名'@'%'\
并且,用户名和登录地址要对应
复制#删除任意主机登录的用户 ’test‘@'%'.相当于 drop user t 'test'@'%'
drop user 'test';
#删除本地登录的用户test
drop user 'test'@'localhost' ;
5 修改密码
- 修改当前用户密码
set password=password('新密码');
- root 用户修改其他用户密码
set password for '用户名'@'登录地点'=password('密码新');
- 通过修改mysql.user 表 修改用户密码
update mysql.user set authentication_string=password('新密码') where 条件表达式;
复制#设置当前登录用户密码为 123456
set password=password('123456');
#设置本地登录的root 用户密码为 abc123
set password for 'root'@'localhost'=password('abc123');
#修改mysql.user 表的 user字段值为 'user2' 的表记录,将它的authentication_string 字段值改为加密后的123456
#也就是修改 所有 用户名为 user2 的用户的密码为123456
update mysql.user set authentication_string=password('123456') where user='user2';
6 恢复root 密码
我们可以通过配置文件中myseld 设置的 skip-grant-table'项来跳过授权表,匿名登录。然后修改 mysql 库user表中root 的authentication 字段,来修改root密码。
6.1 修改配置文件,设置跳过密码项
复制vim /etc/my.conf
[mysqld]
skip-grant-tables #在[mysqd] 项中添加 skip-grant-table 跳过授表
6.2 重启mysql 服务,匿名进入mysql ,修改root 密码
复制systemctl restart mysqld #重启mysql的服务
mysql #匿名进入mysql
# 通过修改 mysql.usr 的authentication_string 字段,来修改 'root'@'locathost' 用户的密码
update mysql.user set authentication_string=password('abc123') where user='root' and host='localhost';
#刷新授权表
flush privileges;
#退出匿名登录
exit
6.3 删除配置文件中跳过授权表设置, 重启服务,使用root 用户登录数据库
复制vim /etc/my.cnf
[mysqld]
#将 skip-grant-tables 删除
#skip-grant-tables
#重启mysqld 服务
systemctl restart mysqld
#使用root 登录进入数据库
mysql -uroot -pabc123
#查看当前登录用户与登录地址
select user();
二: mysql 授权管理
我们使用create user 创建的用户,只能登录进入数据库,但是无法做任何事情。
所以还需要grant 命令进行 用户授权。同时,此命令,如果当用户不存在,也可以创建该用户。
1 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' identified by ‘密码’ with grant option;
权限列表:多个权限用逗号‘,’ 隔开,如 'select,update' 。 all 表示所有权限
数据库名.表名:用于指定授权操作的数据库名和表名,可以使用通配符' *' 表示所有。如 *.* 表示所有库,所有表
'用户名'@'来源地址' : 用户指定用户名和可以登录的客户端地址。可以使用百分号 % 来表示某个区域的所有地址。 'root'@'%' 表示任意主机都可以登录, 'root'@'192.168.23.%' 表示192.168.23.0 整个网段。'root'@'%.mynet.com' 表示所有以.mynet.com 结尾的主机
identified by :用于设置用户连数据库时候的密码。在新建用户时,如果省略此部分,则用户密码为空。但是我们在配置文件中设置了'NO_AUTO_CREATE_USER'项,所以时无法创建空密码用户
with grant option :让被授权的用户,可以将相同的权限授权给他人。
其他事项:grant 授权或者 revoke 撤销权限后,需要用户重新连接mysql 数据库,或者刷新授权表
1.1 普通授权
复制#授权 school库 的所有表的select权限给用户 test,登录密码是abc123,只能本地登录
grant select on school.* to 'test'@'localhost' identified by 'abc123';
exit #退出数据库
#使用用户 test ,密码abc123 本地登录nmysql
mysql -utest -pabc123
#查看数据库
show databases;
#切换到 school库
use school
#尝试向表中插入数据,结果为权限被拒绝
insert into class1 value(10,'test',1010110);
1.2 让被授权的用户可以将权限授予他人
注意,当被授权用户将权限授予他人时候,涉及到的权限,库,表,必须时本身拥有的权限。否则报错。
比如,当本身没有mysql 库的权限时,就不可以在授权给其他用户时加上密码。
复制#将school库的所有表的select,insert,update,delete 权限授权给使用密码 abc123本地登录的用户test,并且,该用户可以将这些权限授权给其他用户
grant select,insert,update,delete on school.* to 'lisi'@'localhost'
-> identified by 'abc123' with grant option;
#刷新授权表
flush privileges;
exit
复制#当将权限授权于给一个不存在的用于时,则报错,不可以使用grant 命令创建用户
grant select,update,insert,delete on school.* to 'wangwu'@'localhost' identified by 'abc123';
#当授权个一个存在的用户,但是后面跟了 identified by 项时,则报错,不可以对mysql 库操作。因为用户密码是保存在 mysql 库中,而当前用户没有mysql 库的权限,所以报错。
#可以授权时候,后面不跟密码,或者将mysql 库user表的相应权限授权给 当前用户
grant select,update,insert,delete on school.* to 'test'@'localhost' identified by 'abc123';
#当直接授权给存在的用户'test'@'localhost'时,则成功。
grant select,update,insert,delete on school.* to 'test'@'localhost' ;
复制#使用test 用户本地登录
mysql -utest -pabc123
use school;
#本来没有insert 权限的test用户,现在可以对class1 表进行增删改查操作
insert into class1 values(13,'test',13131113);
2 查看用户权限
用户显示自身的访问权限
show grants;
管理员查看已拥有授权用户权限
show grants for '用户名'@'登录地点'
复制#显示当前登录用户的权限
show grants;
#显示'test'@'localhost' 用户的权限
show grants for 'test'@'localhost';
3 撤销用户权限
revoke 权限 on 库名.表名 from '用户名'@'登录地点' ;
权限,库名.表名, '用户名'@'登录地点' 必须与授权表里对应
all 表示所有权限
复制revoke select on school.* from 'test'@'localhost';
revoke all on school.* from 'test'@'localhost';
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现