Linux-MySQL权限管理

1.MySQL服务器登录方式

1.1本地登录MySQL服务器

复制代码
mysql -uroot -p'Root@123'

1.2MySQL免交互访问

mysql -h <IP或主机名> -P <端口> -u <用户名> -p <密码> -D <指定数据库> -e "<SQL语句>"

复制代码
mysql -uroot -p'Root@123' -h localhost -P 3306 -e"SELECT * FROM user.user1;"

2.创建用户

2.1使用CREATE USER语句创建用户

CREATE USER <用户名>@<IP/主机名> IDENTIFIED BY "用户密码";
注意:服务端与客户端都需要关闭防火墙,启动MySQL服务

|-----------------------|--------------|
| localhost | 只允许本地登录 |
| % | 允许任意主机登录(默认) |
| 192.168.189.% | 允许任意指定网段登录 |
| 192.168.189.137(固定IP) | 允许固定IP登录 |
[地址常用选项]

服务端创建用户
复制代码
-创建jack用户,指定由任意IP登录服务端MySQL
注意:不写默认%
CREATE USER jack@'%' IDENTIFIED BY 'Jack@123'; 

-创建tom用户,指定由192.168.189网段登录服务端MySQL
CREATE USER tom@'192.168.189.%' IDENTIFIED BY 'Tom@1234';    

-创建tony用户,指定由192.168.189.137固定IP登录服务端MySQL
CREATE USER tony@'192.168.189.137' IDENTIFIED BY 'Tony@123';

SELECT user,host FROM mysql.user;    -查看已创建用户信息
客户端登录
复制代码
-使用jack用户登录服务端MySQL
mysql -ujack -p'Jack@123' -h 192.168.189.138

-使用tom用户登录服务端MySQL
mysql -utom -p'Tom@1234' -h 192.168.189.138

-使用tony用户登录服务端MySQL
mysql -utony -p'Tont@1234' -h 192.168.189.138

3.权限操作

3.1权限级别

|--------------|-------------------|-----------------------------|
| 级别 | 权限说明 | 示例 |
| *.* | 任何数据库下的任何数据表 | *.* |
| 数据库名.* | 指定数据库下的任何数据表 | user.* |
| 数据库名.表名 | 指定数据库下的指定表 | user.student |
| 数据库名.表名(字段名) | 指定数据库下的指定表下的指定字段名 | SELECT (id) ON user.stduent |
[权限级别]

3.2授予权限-GRANT

GRANT <权限名> ON <数据库名.表名> TO <用户名@'IP/主机名'>

GRANT ALL ON <数据库名.表名> TO <用户名@'IP/主机名'> -授予所有权限

GRANT <权限名> ON <数据库名.表名> TO <用户名@'IP/主机名'> WITH GRANT OPTION -授予授权权限
注意:<用户>@<IP/主机名>必须与创建时的一致

复制代码
GRANT SELECT ON *.* TO jack@'%';    -授予jack用户任意库下任意表的查找权限

GRANT SELECT ON mysql.* TO tom@'192.168.189.%';    -授予tom用户mysql库下的所有表的查询权限

GRANT SELECT(user,host) ON mysql.user TO tony@'192.168.189.137';    -授予tony用户mysql库下user表下的user,host字段查找权限

GRANT SELECT ON *.* TO jack@'%' WITH GRANT OPTION;    -授予jack授予权限权限

3.3查看权限-SHOW GRANTS

SHOW GRANTS\G -查看当前用户权限

SHOW GRANT FOR <用户名>@<IP/主机名>\G 查看其他用户权限

3.4回收权限-REVOKE

REVOKE <权限名> ON <数据库.表名> FROM <用户名@'IP/主机名'>

REVOKE ALL ON <数据库.表名> FROM <用户名@'IP/主机名'> -回收所有权限

REVOKE GRANT OPTION ON <数据库.表名> FROM <用户名@'IP/主机名'> -回收授予权限权限(需单独回收,不包含在ALL中)

4.权限控制机制(了解)

|--------------------|-----------|
| mysql.user | 用户账户和全局权限 |
| mysql.db | 数据库级别权限 |
| mysql.tables_priv | 表级权限 |
| mysql.columns_priv | 列级权限 |
[MySQL权限表]

jack用户具有全局的SELECT权限
tom用户不具备全局SELECT权限,但具有对mysql库下所有表的SELECT权限

4.1权限验证流程

|-------------------------------------------------------------------------------------------------------------------------|
| 1.检查mysql.user全局表 * 如果 Select_priv = 'Y':拥有所有库所有表的 SELECT 权限,不再检查其他表 * 如果 Select_priv = 'N':继续检查 db 表 |
| 2.检查mysql.db库级别表 * 如果找到对应记录且 Select_priv = 'Y':拥有指定数据库的所有表 SELECT 权限 * 如果没有找到或 Select_priv = 'N':继续检查 tables_priv 表 |
| 3.检查mysql.tables_priv表级别表 * 如果 Table_priv 包含 'Select':拥有该表所有列的 SELECT 权限 * 如果不包含:继续检查 columns_priv 表 |
| 4.检查mysql.colimns_priv表 * 如果 Column_priv 包含 'Select':拥有指定列的 SELECT 权限 * 如果不包含:没有 SELECT 权限 |
[权限验证流程-以SELECT为例]

5.密码管理-ALTER USER

5.1修改当前用户密码

ALTER USER USER() IDENTIFIED BY '新密码'

5.2修改其他用户密码

ALTER USER <用户名>@<IP/主机名> IDENTIFIED BY '新密码'

5.3密码策略级别(了解)略

5.4破解MySQL密码-skip-grant-tables模式

复制代码
# 1. 停止MySQL服务
sudo systemctl stop mysql

# 2. 以安全模式启动MySQL(跳过权限验证)
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 3. 无需密码登录MySQL
mysql -u root

# 4. 在MySQL命令行中执行以下命令
# MySQL 5.7.6+ 版本:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

# MySQL 5.7.5及以下版本:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

# 5. 退出MySQL
EXIT;

# 6. 重启MySQL服务
sudo systemctl restart mysql

6.删除用户-DROP USER

DROP USER <用户名>@<IP/主机名>

7.使用角色管理用户权限

7.1创建角色

CREATE ROLE '角色1','角色2','角色3'

7.2给角色权限

GRANT <权限名> ON <数据库名.表名> TO <'角色'>

7.3将角色分配给用户

GRANT <'角色'> TO <用户名>@<IP/主机名>

7.4设置默认登录角色

SET DEFAULT ROLE <'角色'> TO <用户名>@<IP/主机名>

7.5登录查看当前用户所扮演的角色

SELECT CURRENT_ROLE()

7.6撤销ROLE和权限

7.6.1角色移除用户

REVOKE <'角色名'> FROM <用户名>@<IP/主机名>

7.6.2移除角色权限

REVOKE <权限名> ON <数据库名.数据表名> FROM <'角色名'>

7.6.3删除角色

DROP ROLE <'角色名'>

8.以上操作如果刷新不出来可以使用以下命令

复制代码
flush privileges;    -刷新
相关推荐
生活很暖很治愈3 分钟前
Linux——基础IO&软硬链接
linux·ubuntu
2401_8589368816 分钟前
【Linux C 编程】标准 IO 详解与实战:从基础接口到文件操作实战
linux·c语言
Roc.Chang28 分钟前
Ubuntu 下 VLC 无法启动(Segmentation fault)终极解决方案
linux·ubuntu·vlc·媒体播放
松涛和鸣1 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
简单中的复杂1 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
wVelpro2 小时前
如何在Pycharm 2025.3 版本实现虚拟环境“Make available to all projects”
linux·ide·pycharm
程序员老舅2 小时前
C++高并发精髓:无锁队列深度解析
linux·c++·内存管理·c/c++·原子操作·无锁队列
雨中风华3 小时前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
Yeats_Liao3 小时前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql