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 备份与恢复(冷备份、逻辑备份、增量备份与二进制日志恢复)。

相关推荐
AlfredZhao11 小时前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
唐青枫13 小时前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩13 小时前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
小满87813 小时前
5.Mysql事务隔离级别与锁机制
mysql
笃行3501 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3501 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3501 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
元Y亨H1 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
戴为沐2 天前
Linux内存扩容指南
linux