MySQL 学习笔记(第五期):用户管理与权限控制

MySQL 学习笔记(第五期):用户管理与权限控制

本笔记承接第四期,进入用户管理与权限控制的核心内容。涵盖:用户账号的组成与创建/删除/重命名、密码管理(含忘记密码解决方案)、权限的分类与授权/回收、远程连接配置。所有代码均已加以整理和注释。


一、MySQL 用户账号概述

1.1 账号组成

MySQL 中的用户账号由 用户名主机 两部分组成,格式为 'username'@'host'用户名和主机组合才能唯一标识一个用户

  • 主机:限制该账号只能从指定主机或 IP 连接 MySQL 服务器。
  • 通配符% 表示任意长度的任意字符,_ 表示单个字符。
  • 示例:
    • 'qgd'@'localhost' --- 只能从本机连接
    • 'qgd'@'192.168.108.110' --- 只能从指定 IP 连接
    • 'qgd'@'10.0.0.%' --- 只能从 10.0.0.0/24 网段连接
    • 'qgd'@'%' --- 可从任意主机连接(不安全)

1.2 默认用户

MySQL 8.0 安装后默认创建以下用户(均只能从 localhost 连接):

Host User 说明
localhost root 超级管理员
localhost mysql.infoschema 系统账户
localhost mysql.session 系统账户
localhost mysql.sys 系统账户

注意:MySQL 8.0 中默认没有可远程登录的用户。


二、用户管理操作(DDL)

2.1 创建用户(CREATE USER)

语法

sql

复制代码
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];

范例

sql

复制代码
-- 创建只能从特定网段连接的用户
CREATE USER 'test'@'192.168.108.%' IDENTIFIED BY '123456';

-- 创建可从任意主机连接的用户(不建议)
CREATE USER 'test2'@'%' IDENTIFIED BY '123456';

-- 创建无需密码的用户(仅限测试环境)
CREATE USER 'test3'@'localhost';

注意 :MySQL 8.0 已不支持 GRANT 语句同时创建用户,必须先用 CREATE USER

2.2 重命名用户(RENAME USER)

sql

复制代码
RENAME USER 'old_user'@'old_host' TO 'new_user'@'new_host';

范例

sql

复制代码
RENAME USER 'test'@'192.168.108.%' TO 'tester'@'10.0.0.%';

2.3 删除用户(DROP USER)

sql

复制代码
DROP USER 'username'@'host';

范例

sql

复制代码
DROP USER 'test'@'192.168.108.%';
DROP USER 'test2'@'%';
DROP USER IF EXISTS 'test3'@'localhost';

三、密码管理

3.1 设置/修改密码(MySQL 8.0 方法)

MySQL 8.0 中密码存储在 mysql.user 表的 authentication_string 字段(已取消 PASSWORD() 函数)。

方法一:使用 ALTER USER(推荐)

sql

复制代码
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';

范例

sql

复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
方法二:使用 SET PASSWORD(MySQL 8.0 仍然支持)

sql

复制代码
SET PASSWORD FOR 'username'@'host' = 'new_password';
方法三:使用 mysqladmin 命令行工具

bash

复制代码
mysqladmin -u root -p'old_password' password 'new_password'

3.2 忘记 root 密码的解决方案

方案一:跳过授权表启动(保留数据)

步骤

  1. 编辑 MySQL 配置文件(如 /etc/my.cnf.d/mysql-server.cnf),在 [mysqld] 段添加:

    ini

    复制代码
    skip-grant-tables
    skip-networking      # MySQL 8.0 可能不需要
  2. 重启 MySQL 服务:

    bash

    复制代码
    systemctl restart mysqld
  3. 无密码登录 MySQL:

    bash

    复制代码
    mysql
  4. 清空 root 密码(设为空):

    sql

    复制代码
    UPDATE mysql.user SET authentication_string = '' WHERE user = 'root' AND host = 'localhost';
    FLUSH PRIVILEGES;
  5. 退出 MySQL,移除配置文件中的 skip-grant-tables,重启服务。

  6. 使用空密码登录,再设置新密码:

    sql

    复制代码
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
方案二:删除数据目录重新初始化(会清除所有数据,仅限测试)

bash

复制代码
systemctl stop mysqld
rm -rf /var/lib/mysql/*
systemctl start mysqld   # 自动重新初始化,root 密码为空

注意:方案二会丢失所有数据库,生产环境绝对禁止!


四、权限管理(DCL)

4.1 权限分类

MySQL 权限分为多个级别和类别:

类别 权限示例
管理类 CREATE USER, FILE, SUPER, SHOW DATABASES, RELOAD, SHUTDOWN, REPLICATION SLAVE, LOCK TABLES, PROCESS
程序类(函数/存储过程/触发器) CREATE, ALTER, DROP, EXECUTE
库/表级别 ALTER, CREATE, CREATE VIEW, DROP INDEX, SHOW VIEW, WITH GRANT OPTION
数据操作 SELECT, INSERT, DELETE, UPDATE
字段级别 SELECT(col1,col2...), UPDATE(col1,col2...), INSERT(col1,col2...)
所有权限 ALL PRIVILEGESALL

4.2 授权(GRANT)

语法

sql

复制代码
GRANT priv_type [(column_list)] ON [object_type] priv_level TO 'user'@'host' [WITH GRANT OPTION];
  • priv_level 格式:
    • * --- 所有数据库的所有对象
    • *.* --- 所有数据库的所有对象
    • db_name.* --- 指定数据库的所有对象
    • db_name.tbl_name --- 指定数据库的指定表
    • db_name.routine_name --- 指定存储过程/函数

范例

sql

复制代码
-- 授予指定库的所有权限
GRANT ALL ON wordpress.* TO 'wordpress'@'10.0.0.%';

-- 授予所有库的所有权限(超级管理员),并允许转授
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%' WITH GRANT OPTION;

-- 授予特定列的操作权限
GRANT SELECT (id, name), INSERT (id, name) ON mydb.users TO 'app'@'%';

-- 授予部分权限
GRANT SELECT, INSERT, UPDATE, DELETE ON db1.* TO 'user1'@'192.168.108.%';

注意 :MySQL 8.0 中,GRANT 不再支持同时创建用户,必须先 CREATE USER

4.3 查看权限

sql

复制代码
-- 查看指定用户的权限
SHOW GRANTS FOR 'username'@'host';

-- 查看当前登录用户的权限
SHOW GRANTS FOR CURRENT_USER();

范例

sql

复制代码
SHOW GRANTS FOR 'root'@'localhost';

4.4 撤销权限(REVOKE)

语法

sql

复制代码
REVOKE priv_type ON [object_type] priv_level FROM 'user'@'host';

范例

sql

复制代码
-- 撤销删除权限
REVOKE DELETE ON *.* FROM 'testuser'@'172.16.0.%';

-- 撤销所有权限
REVOKE ALL ON *.* FROM 'testuser'@'172.16.0.%';

4.5 权限生效

MySQL 服务进程启动时将授权表加载到内存。执行 GRANTREVOKE 后,通常会自动生效。如未自动生效,可手动刷新:

sql

复制代码
FLUSH PRIVILEGES;

五、远程连接配置

5.1 创建可远程连接的用户

sql

复制代码
-- 创建可从特定 IP 连接的 root 用户
CREATE USER 'root'@'192.168.108.1' IDENTIFIED BY '123456';

-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.108.1' WITH GRANT OPTION;

5.2 远程客户端连接

bash

复制代码
# 从客户端(如 Windows CMD)连接
mysql -u root -h 192.168.108.128 -p123456

5.3 连接验证与常见错误

  • 查看当前连接的用户信息:

    sql

    复制代码
    SELECT USER();          -- 显示当前用户
    SELECT CURRENT_USER();  -- 显示权限验证使用的用户
  • 查看连接线程:

    sql

    复制代码
    SHOW PROCESSLIST;

常见错误ERROR 1130 (HY000): Host 'xxx' is not allowed to connect to this MySQL server

原因:用户未授权从该主机连接。解决:创建或修改用户的主机部分。


六、完整权限管理实战流程

场景:为应用 blog_app 创建专用数据库和用户

sql

复制代码
-- 1. 创建数据库
CREATE DATABASE blog_db CHARACTER SET utf8mb4;

-- 2. 创建用户(允许从 192.168.108.% 网段连接)
CREATE USER 'blog_user'@'192.168.108.%' IDENTIFIED BY 'StrongP@ss123';

-- 3. 授予该用户对 blog_db 的所有权限
GRANT ALL ON blog_db.* TO 'blog_user'@'192.168.108.%';

-- 4. 刷新权限(可选,通常自动生效)
FLUSH PRIVILEGES;

-- 5. 验证权限
SHOW GRANTS FOR 'blog_user'@'192.168.108.%';

远程测试

bash

复制代码
# 在 192.168.108.x 网段的客户端执行
mysql -u blog_user -pStrongP@ss123 -h 192.168.108.128 -e "USE blog_db; SHOW TABLES;"

七、本期知识点归纳一览表

类别 知识点 关键语法/命令
账号组成 'username'@'host' 主机限制,% 通配符
创建用户 CREATE USER CREATE USER 'u'@'h' IDENTIFIED BY 'pwd';
重命名用户 RENAME USER RENAME USER 'old'@'h' TO 'new'@'h';
删除用户 DROP USER DROP USER 'u'@'h';
修改密码 ALTER USER ALTER USER 'u'@'h' IDENTIFIED BY 'new';
忘记 root 密码 跳过授权表 skip-grant-tables → 更新空密码 → 重新设置
权限分类 管理类、程序类、库表级、数据操作、字段级 见上表
授权 GRANT GRANT priv ON db.* TO 'u'@'h';
查看权限 SHOW GRANTS SHOW GRANTS FOR 'u'@'h';
撤销权限 REVOKE REVOKE priv ON db.* FROM 'u'@'h';
权限生效 FLUSH PRIVILEGES 通常自动生效,手动刷新
远程连接 创建带主机 % 或具体 IP 的用户 mysql -u user -h server_ip -p

下一期预告:MySQL 备份与恢复(冷备份、逻辑备份、增量备份与二进制日志恢复)。

相关推荐
YangYang9YangYan1 小时前
2026文科生报考大数据类专业学习数据分析的可行性分析
大数据·学习·数据分析
SPC的存折1 小时前
MySQL完整学习手册(视频精华版)
学习·mysql·音视频
花落yu1 小时前
AI学习:第5天
学习
kyle~1 小时前
ROS2---零拷贝
linux·c++·机器人·ros2
无限进步_1 小时前
Linux进程创建——fork与vfork深度解析
linux·运维·服务器
ysu_03141 小时前
leetcode数据结构与算法5~7:链表双指针与二级指针
数据结构·学习·算法·leetcode·链表
梦想的颜色1 小时前
Redis数据类型全解析:从底层原理到生产实战
运维·数据库·redis·缓存·高并发·分布式锁·数据类型
ouliten1 小时前
C++笔记:偏现代C++日志系统
c++·笔记
草莓熊Lotso1 小时前
【Linux网络】深入理解传输层 UDP 协议:从底层原理到实战应用
linux·运维·服务器·c语言·网络·c++·udp