Windows MySQL 8.4 配置指南、用户创建、权限管理

128 阅读22分钟

Windows MySQL 8.4 配置完整指南

目录


一、创建不限 IP 访问的账号

1.1 核心概念

不限制 IP = 使用 '%' 作为 host

在 MySQL 中,'%' 表示允许来自任何 IP 地址的连接。

1.2 操作步骤

步骤 1:登录 MySQL(使用 root 账号)
mysql -u root -p
步骤 2:创建用户(允许任意 IP 连接)
CREATE USER 'dzm'@'%' IDENTIFIED BY '123123';

参数说明:

  • 'dzm':用户名
  • '%':host,表示允许任何 IP 地址连接
  • '123123':用户密码
步骤 3:授权

开发阶段常用(全部数据库权限):

GRANT ALL PRIVILEGES ON *.* TO 'dzm'@'%' WITH GRANT OPTION;

生产环境推荐(仅某个数据库权限):

GRANT ALL PRIVILEGES ON test_db.* TO 'dzm'@'%';

参数说明:

  • ALL PRIVILEGES:所有权限
  • *.*:所有数据库的所有表
  • test_db.*:仅 test_db 数据库的所有表
  • WITH GRANT OPTION:允许该用户授权给其他用户(开发阶段常用,生产环境慎用)
步骤 4:刷新权限
FLUSH PRIVILEGES;

注意:MySQL 8.x 中此命令实际可省略,但建议执行以确保权限立即生效。

步骤 5:验证用户是否创建成功
SELECT user, host FROM mysql.user WHERE user = 'dzm';

预期结果:

+------+------+
| user | host |
+------+------+
| dzm  | %    |
+------+------+

看到 host% 即表示不限制 IP。

1.3 修改 root 账户放开 IP 限制(不创建新账户)

如果不想创建新账户,而是直接修改 root 账户允许远程访问,可以按照以下步骤操作。

⚠️ 安全提示

强烈建议:

  • 生产环境不推荐直接开放 root 账户远程访问
  • 建议创建专用账户并授予最小权限
  • 如果必须开放 root,请使用强密码并限制访问 IP

适用场景:

  • 开发/测试环境
  • 临时调试
  • 内网环境
步骤 1:查看 root 账户当前状态

登录 MySQL 后执行:

SELECT user, host FROM mysql.user WHERE user = 'root';

常见输出:

+------+-----------+
| user | host      |
+------+-----------+
| root | localhost |
+------+-----------+

如果只看到 localhost,说明 root 账户只能本地连接。

步骤 2:创建 root@'%' 用户(推荐方法)

MySQL 8.x 中,需要创建一个新的 root 用户记录,而不是直接修改现有的。

-- 创建允许任意 IP 连接的 root 用户
CREATE USER 'root'@'%' IDENTIFIED BY '你的root密码';

注意:这里的密码应该与现有的 root@'localhost' 密码一致,或者设置新的强密码。

步骤 3:授予权限
-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
步骤 4:刷新权限
FLUSH PRIVILEGES;
步骤 5:验证修改结果
SELECT user, host FROM mysql.user WHERE user = 'root';

预期结果:

+------+-----------+
| user | host      |
+------+-----------+
| root | localhost |
| root | %         |
+------+-----------+

现在 root 账户有两个记录:

  • root@'localhost':本地连接
  • root@'%':远程连接
方法二:直接修改现有 root 用户(不推荐)

如果确实需要修改现有的 root@'localhost',可以使用以下方法:

-- 方法 1:使用 RENAME USER(MySQL 8.0+)
RENAME USER 'root'@'localhost' TO 'root'@'%';

-- 方法 2:直接更新 mysql.user 表(需要谨慎)
UPDATE mysql.user SET host='%' WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;

⚠️ 警告:直接修改可能导致本地无法连接,建议使用方法一(创建新的 root@'%' 记录)。

步骤 6:测试远程连接

在另一台机器或本机模拟远程连接:

mysql -u root -p -h 服务器IP -P 3306
完整操作示例
-- 1. 查看当前 root 账户
SELECT user, host FROM mysql.user WHERE user = 'root';

-- 2. 创建 root@'%' 用户(使用与 root@'localhost' 相同的密码)
CREATE USER 'root'@'%' IDENTIFIED BY 'your_root_password';

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

-- 4. 刷新权限
FLUSH PRIVILEGES;

-- 5. 验证
SELECT user, host FROM mysql.user WHERE user = 'root';

-- 6. 查看权限详情
SHOW GRANTS FOR 'root'@'%';
撤销 root 远程访问(如果需要)

如果后续需要撤销 root 的远程访问权限:

-- 删除 root@'%' 用户
DROP USER 'root'@'%';

-- 刷新权限
FLUSH PRIVILEGES;
安全建议
  1. 使用强密码

    ALTER USER 'root'@'%' IDENTIFIED BY 'Strong_Password_123!@#';
    
  2. 限制访问 IP(如果可能):

    -- 删除 root@'%'
    DROP USER 'root'@'%';
    
    -- 创建仅允许特定 IP 的 root 用户
    CREATE USER 'root'@'192.168.1.100' IDENTIFIED BY 'your_password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.100' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  3. 定期检查用户列表

    SELECT user, host FROM mysql.user WHERE user = 'root';
    
  4. 生产环境最佳实践

    • ✅ 创建专用管理员账户(如 admindba
    • ✅ root 账户仅允许 localhost 连接
    • ✅ 使用最小权限原则
    • ✅ 启用 SSL 连接(如果可能)

二、配置文件位置与创建

2.1 查找 MySQL 配置文件位置

方法 1:查询 MySQL 变量(推荐)

登录 MySQL 后执行:

SHOW VARIABLES LIKE 'basedir';
SHOW VARIABLES LIKE 'datadir';

示例输出:

basedir = C:\Program Files\MySQL\MySQL Server 8.4\
datadir = C:\Program Files\MySQL\MySQL Server 8.4\data\
方法 2:查看配置文件查找顺序(最准确)

管理员 CMD 中执行:

mysqld --verbose --help | findstr my.ini

实际测试结果(基于 winget / 官方 MSI 默认安装):

C:\WINDOWS\my.ini
C:\WINDOWS\my.cnf
C:\my.ini
C:\my.cnf
C:\Program Files\MySQL\MySQL Server 8.4\my.ini
C:\Program Files\MySQL\MySQL Server 8.4\my.cnf

重要:此查找顺序不包含 C:\ProgramData\MySQL\MySQL Server 8.4\my.ini

2.2 正确的配置文件位置

✅ 生效位置(基于实际测试):

C:\Program Files\MySQL\MySQL Server 8.4\my.ini

说明:

  • 这是基于 basedir 的默认查找位置
  • 官方支持,完全合法
  • 适用于 winget / 官方 MSI 默认安装方式

2.3 创建配置文件

步骤 1:创建 my.ini 文件

在以下路径创建文件:

C:\Program Files\MySQL\MySQL Server 8.4\my.ini

注意:如果文件已存在,直接编辑即可。

步骤 2:写入配置内容

参考 三、配置文件内容详解 章节。

步骤 3:重启 MySQL 服务(必须)

查找 MySQL 服务名:

sc query | findstr MySQL

停止服务:

net stop MySQL80

启动服务:

net start MySQL80

注意:如果服务名不是 MySQL80,请使用 sc query 查询到的实际服务名。


三、配置文件内容详解

3.1 最小可用配置(支持远程访问)

[mysqld]
# 字符集配置(必须)
character-set-server = utf8mb4
collation-server     = utf8mb4_0900_ai_ci

# 远程访问配置(如需远程访问,必须添加)
# port=3306                    # 端口号,默认 3306,可不写
# bind-address=0.0.0.0         # 允许远程连接,默认仅本地,如需远程必须设置

[client]
# 客户端默认字符集(推荐)
default-character-set = utf8mb4

[mysql]
# mysql 命令行客户端字符集(可选,会覆盖 [client] 段)
default-character-set = utf8mb4

[mysqldump]
# mysqldump 备份工具字符集(推荐,确保备份文件编码正确)
default-character-set = utf8mb4

3.2 配置项说明

[mysqld] 段(服务器配置)

# MySQL 字符集与排序规则总结

说明: [mysqld] 段是 MySQL 服务器端的配置,影响 MySQL 服务的行为。

配置项必要性含义与作用详细说明
character-set-serverutf8mb4⭐⭐⭐ 强烈推荐服务器默认字符集含义:设置 MySQL 服务器创建新数据库、新表时的默认字符集。
作用
- 新建数据库时,如果不指定字符集,使用此值
- 新建表时,如果不指定字符集,继承数据库的字符集(最终来源是此配置)
- 影响字符串比较、排序等操作
为什么选 utf8mb4
- 支持完整的 Unicode(包括 emoji、特殊符号)
- MySQL 8.x 默认值,未来标准
不配置的后果
- 可能使用系统默认字符集(可能是 latin1 或 utf8mb3)
- 导致中文、emoji 存储异常
collation-serverutf8mb4_0900_ai_ci⭐⭐⭐ 强烈推荐服务器默认排序规则含义:设置字符集的默认排序规则(collation)。
作用
- 决定字符串比较、排序的方式
- 影响 ORDER BYWHERE 等查询的排序结果
- 影响索引的排序方式
组成解析
- utf8mb4:字符集
- 0900:Unicode 9.0 版本(新版算法)
- ai:accent-insensitive(不区分重音,如 é = e)
- ci:case-insensitive(不区分大小写,如 A = a)
为什么选 0900_ai_ci
- MySQL 8.x 默认值,性能更好
- 中文排序更准确
- 比 unicode_ci 更新、更快
不配置的后果
- 可能使用系统默认排序规则
- 排序结果可能不符合预期

其他常用 [mysqld] 配置项(最小配置中未包含,但常用):

配置项必要性含义与作用详细说明
port3306可选MySQL 服务监听端口含义:MySQL 服务监听的端口号。
作用:客户端连接时需要指定此端口
默认值:3306
何时需要修改
- 端口被占用
- 安全考虑(隐藏默认端口)
不配置:使用默认 3306
bind-address0.0.0.0⭐⭐ 远程访问必需监听地址含义:MySQL 服务监听哪个网络接口的 IP 地址。
作用
- 127.0.0.1localhost:仅允许本机连接
- 0.0.0.0*:监听所有 IPv4 网卡,允许远程连接
详细说明:详见 bind_address 详解
不配置的后果
- 默认可能是 127.0.0.1,无法远程连接
[client] 段(客户端配置)

说明: [client] 段是所有客户端程序的通用配置,包括 mysqlmysqladminmysqldump 等。

配置项必要性含义与作用详细说明
default-character-setutf8mb4⭐⭐ 推荐客户端默认字符集含义:客户端连接 MySQL 时使用的默认字符集。
作用
- 客户端发送 SQL 语句时使用的字符编码
- 客户端接收查询结果时使用的字符编码
- 影响客户端显示的中文、emoji 是否正确
适用程序
- mysql 命令行客户端
- mysqladmin 管理工具
- mysqldump 备份工具
- 其他使用 [client] 段的程序
不配置的后果
- 客户端可能使用系统默认字符集(可能是 latin1)
- 导致中文、emoji 显示乱码
注意:如果设置了 skip-character-set-client-handshake = 1,此配置的作用会被服务器配置覆盖,但仍建议设置以保持一致性
[mysql] 段(mysql 命令行客户端专用配置)

说明: [mysql] 段是 mysql 命令行客户端的专用配置,优先级高于 [client] 段。

配置项必要性含义与作用详细说明
default-character-setutf8mb4可选mysql 客户端字符集含义:专门为 mysql 命令行客户端设置的字符集。
作用
- 覆盖 [client] 段的设置(如果存在)
- 仅影响 mysql 命令行的字符集
为什么单独配置
- mysql 是最常用的客户端工具
- 可以针对性地设置,不影响其他工具
不配置的后果
- 使用 [client] 段的配置(如果存在)
- 或使用系统默认字符集
注意:如果 [client] 段已设置,且 mysql 客户端不需要特殊配置,可以不设置此段
[mysqldump] 段(mysqldump 备份工具专用配置)

说明: [mysqldump] 段是 mysqldump 备份工具的专用配置,优先级高于 [client] 段。

配置项必要性含义与作用详细说明
default-character-setutf8mb4⭐⭐ 推荐mysqldump 字符集含义:专门为 mysqldump 备份工具设置的字符集。
作用
- 备份 SQL 文件时使用的字符编码
- 影响备份文件中的中文、emoji 是否正确保存
- 恢复数据时,确保字符集一致
为什么重要
- 备份文件如果字符集错误,恢复时会出现乱码
- 备份是数据安全的重要环节
不配置的后果
- 备份文件可能使用错误的字符集
- 恢复数据时可能出现乱码
注意:此配置影响备份文件的编码,建议与服务器字符集保持一致

3.3 配置项关系与优先级

配置段优先级(从高到低)
  1. 专用段(如 [mysql][mysqldump])> 通用段(如 [client])> 系统默认
  2. 服务器配置[mysqld])> 客户端配置[client]
字符集配置的完整流程
客户端连接请求字符集
    ↓
[client] default-character-set(如果设置)
    ↓
[mysql] default-character-set(如果设置,覆盖 [client])
    ↓
服务器接收
    ↓
skip-character-set-client-handshake = 1?
    ├─ 是:强制使用 character-set-server
    └─ 否:使用客户端请求的字符集
配置建议总结
配置项必要性推荐值不配置的影响
[mysqld] character-set-server⭐⭐⭐ 必须utf8mb4可能使用错误字符集,导致数据乱码
[mysqld] collation-server⭐⭐⭐ 必须utf8mb4_0900_ai_ci排序规则可能不正确
[mysqld] skip-character-set-client-handshake⭐⭐ 推荐1客户端可能使用错误字符集
[client] default-character-set⭐⭐ 推荐utf8mb4客户端可能显示乱码
[mysql] default-character-set可选utf8mb4使用 [client] 段配置
[mysqldump] default-character-set⭐⭐ 推荐utf8mb4备份文件可能乱码

3.3 配置文件编码要求

  • 必须使用:ANSI 或 UTF-8 无 BOM
  • 禁止使用:UTF-16

提示:使用 Windows 记事本保存时,选择"另存为",编码选择"UTF-8"。


四、验证配置文件是否生效

4.1 方法一:查看 MySQL 读取的配置文件(最权威)

管理员 CMD 中执行:

mysqld --verbose --help | findstr /i "Default options"

预期输出:

Default options are read from the following files:
C:\Program Files\MySQL\MySQL Server 8.4\my.ini

如果看到你创建的 my.ini 路径,说明配置文件 100% 生效

4.2 方法二:通过配置项反向验证(最常用)

登录 MySQL 后执行:

SHOW VARIABLES LIKE 'bind_address';
SHOW VARIABLES LIKE 'character_set_server';

预期结果:

bind_address = 0.0.0.0  (或显示为 *,等价于 0.0.0.0character_set_server = utf8mb4

如果返回的值与你配置的值一致,说明配置文件已生效。

4.3 方法三:修改明显配置项测试(工程师常用)

  1. my.ini 中临时修改端口:

    [mysqld]
    port=3307
    
  2. 重启 MySQL 服务

  3. 验证端口:

    SHOW VARIABLES LIKE 'port';
    

    如果看到 3307,说明配置文件一定生效了。

  4. 测试完成后改回 3306

4.4 方法四:查看错误日志(高级)

  1. 查询日志位置:

    SHOW VARIABLES LIKE 'log_error';
    
  2. 打开日志文件,查找启动时的信息:

    Reading option file 'C:\Program Files\MySQL\MySQL Server 8.4\my.ini'
    

    如果看到此信息,说明 my.ini 被加载。

4.5 常见问题排查

问题原因解决方法
配置不生效忘记重启服务执行 net stop MySQL80net start MySQL80
配置不生效文件位置错误使用 mysqld --verbose --help 确认查找顺序
配置不生效文件编码错误确保使用 ANSI 或 UTF-8 无 BOM

五、关键配置字段详解

5.1 bind_address 详解

核心概念

bind_address 决定 MySQL 服务监听哪个本地 IP 地址

重要区分:

  • bind_address:控制 MySQL 监听哪(服务层)
  • user@host:控制 谁能连(权限层)
常见值及含义
含义适用场景
127.0.0.1localhost只监听本机单机开发、本地测试
0.0.0.0监听所有 IPv4 网卡开发/服务器最常用
*等价于 0.0.0.0MySQL 显示值,配置文件建议写 0.0.0.0
192.168.1.100只监听指定 IP生产环境,更安全
为什么 SHOW VARIABLES 显示 *

MySQL 内部将"任意地址"显示为 *,实际效果与 0.0.0.0 相同。

验证命令:

SHOW VARIABLES LIKE 'bind_address';

结果说明:

  • 显示 *0.0.0.0:已允许远程连接(服务层)
  • 显示 127.0.0.1:仅允许本机连接
配置文件写法(最佳实践)
[mysqld]
bind-address=0.0.0.0

不推荐在配置文件中写 *(可读性差)。

5.2 用户权限相关字段

CREATE USER 语法
CREATE USER 'username'@'host' IDENTIFIED BY 'password';

host 字段说明:

host 值含义示例
'%'允许任何 IP 连接'dzm'@'%'
'localhost'仅允许本机连接'dzm'@'localhost'
'192.168.1.%'允许指定网段'dzm'@'192.168.1.%'
'192.168.1.100'仅允许指定 IP'dzm'@'192.168.1.100'
GRANT 权限说明

重要说明:

  • CREATE USER 只创建用户账号,不授予任何权限
  • 权限范围是在 GRANT 命令中指定的,不是在 CREATE USER 时指定
  • 创建用户后必须使用 GRANT 授予权限,用户才能访问数据库
  • 可以在创建用户后立即使用 GRANT 授权,形成一个完整的流程

权限级别:

权限范围语法说明
所有数据库*.*所有数据库的所有表
单个数据库database_name.*指定数据库的所有表
单个表database_name.table_name指定数据库的指定表

常用权限:

权限说明
ALL PRIVILEGES所有权限(开发阶段常用)
SELECT查询权限
INSERT插入权限
UPDATE更新权限
DELETE删除权限
CREATE创建表/数据库权限
DROP删除表/数据库权限
创建用户并授权完整案例

以下案例展示如何创建用户并授予不同级别的权限:

案例 1:创建用户并授予所有数据库权限(开发环境)

-- 步骤 1:创建用户
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'dev123456';

-- 步骤 2:授予所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'dev_user'@'%' WITH GRANT OPTION;

-- 步骤 3:刷新权限
FLUSH PRIVILEGES;

说明:

  • *.* 表示所有数据库的所有表
  • WITH GRANT OPTION 允许该用户授权给其他用户
  • 适用于开发、测试环境

案例 2:创建用户并授予单个数据库权限(生产环境推荐)

-- 步骤 1:创建用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'strong_password_123';

-- 步骤 2:授予单个数据库的所有权限
GRANT ALL PRIVILEGES ON myapp_db.* TO 'app_user'@'%';

-- 步骤 3:刷新权限
FLUSH PRIVILEGES;

说明:

  • myapp_db.* 表示仅 myapp_db 数据库的所有表
  • 用户无法访问其他数据库,更安全
  • 适用于生产环境

验证权限:

-- 查看用户权限
SHOW GRANTS FOR 'app_user'@'%';

预期输出:

+----------------------------------------------------------+
| Grants for app_user@%                                    |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`%`                    |
| GRANT ALL PRIVILEGES ON `myapp_db`.* TO `app_user`@`%`  |
+----------------------------------------------------------+

案例 3:创建用户并授予单个表权限(最小权限原则)

-- 步骤 1:创建用户
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'readonly_pass';

-- 步骤 2:授予单个表的只读权限
GRANT SELECT ON myapp_db.users TO 'readonly_user'@'%';

-- 步骤 3:刷新权限
FLUSH PRIVILEGES;

说明:

  • myapp_db.users 表示仅 myapp_db 数据库的 users
  • 只授予 SELECT 权限,用户只能查询,不能修改
  • 适用于报表、数据分析等只读场景

验证权限:

-- 查看用户权限
SHOW GRANTS FOR 'readonly_user'@'%';

预期输出:

+----------------------------------------------------------+
| Grants for readonly_user@%                               |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `readonly_user`@`%`               |
| GRANT SELECT ON `myapp_db`.`users` TO `readonly_user`@`%`|
+----------------------------------------------------------+

案例 4:创建用户并授予多个数据库权限

-- 步骤 1:创建用户
CREATE USER 'multi_db_user'@'%' IDENTIFIED BY 'multi_pass';

-- 步骤 2:授予多个数据库的权限
GRANT ALL PRIVILEGES ON db1.* TO 'multi_db_user'@'%';
GRANT SELECT, INSERT, UPDATE ON db2.* TO 'multi_db_user'@'%';
GRANT SELECT ON db3.* TO 'multi_db_user'@'%';

-- 步骤 3:刷新权限
FLUSH PRIVILEGES;

说明:

  • 可以为同一用户授予多个数据库的不同权限
  • db1.* 获得所有权限
  • db2.* 仅获得查询、插入、更新权限
  • db3.* 仅获得查询权限

案例 5:创建用户并授予特定权限组合(生产环境常用)

-- 步骤 1:创建用户
CREATE USER 'api_user'@'%' IDENTIFIED BY 'api_secure_pass';

-- 步骤 2:授予特定权限(不包括 DROP、CREATE 等危险权限)
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'api_user'@'%';

-- 步骤 3:刷新权限
FLUSH PRIVILEGES;

说明:

  • 授予常用的 CRUD 权限(SELECT、INSERT、UPDATE、DELETE)
  • 不授予 CREATE、DROP、ALTER 等结构修改权限
  • 适用于应用程序连接,防止误操作删除表或数据库

权限验证命令汇总:

-- 查看用户基本信息
SELECT user, host FROM mysql.user WHERE user = 'your_username';

-- 查看用户权限详情
SHOW GRANTS FOR 'your_username'@'%';

-- 查看当前用户权限
SHOW GRANTS;

-- 查看数据库权限
SELECT * FROM mysql.db WHERE User = 'your_username';

-- 查看表权限
SELECT * FROM mysql.tables_priv WHERE User = 'your_username';

5.3 字符集相关字段

character-set-server
  • 作用:服务器默认字符集
  • 推荐值utf8mb4(支持 emoji 和 4 字节字符)
  • 查看命令SHOW VARIABLES LIKE 'character_set_server';
collation-server
  • 作用:服务器默认排序规则
  • 推荐值utf8mb4_general_ci(不区分大小写)
  • 查看命令SHOW VARIABLES LIKE 'collation_server';
字符集选择建议
字符集说明适用场景
utf8mb4完整 UTF-8,支持 emoji推荐,现代应用首选
utf8MySQL 的"伪 UTF-8"(3 字节)不推荐,已过时
latin1单字节字符集仅英文场景

六、远程连接检查清单

6.1 检查项列表

✅ 1. 用户 host 为 %
SELECT user, host FROM mysql.user WHERE user='dzm';

预期结果:

+------+------+
| user | host |
+------+------+
| dzm  | %    |
+------+------+
✅ 2. MySQL 监听地址为 0.0.0.0*
SHOW VARIABLES LIKE 'bind_address';

预期结果:

bind_address = 0.0.0.0  (或 *)
✅ 3. Windows 防火墙放行 3306 端口

管理员 CMD 中执行:

netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306

验证防火墙规则:

netsh advfirewall firewall show rule name="MySQL 3306"

6.2 测试远程连接

在另一台机器或本机模拟远程连接:

mysql -u dzm -p -h 服务器IP -P 3306

参数说明:

  • -u dzm:用户名
  • -p:提示输入密码
  • -h 服务器IP:服务器 IP 地址
  • -P 3306:端口号(大写 P)

6.3 开发阶段 vs 生产环境

开发阶段标准做法
  • ✅ 用户 host:'%'
  • ✅ 密码:简单 OK
  • ✅ 权限:ALL PRIVILEGES
  • ✅ 防火墙:放行 3306
生产环境标准做法
  • ✅ 用户 host:固定 IP 或 IP 段
  • ✅ 密码:强密码
  • ✅ 权限:最小权限原则
  • ✅ 防火墙:仅放行必要 IP

七、扩展内容

7.1 关于 ProgramData 路径的说明

⚠️ 错误配置路径(不会生效)
C:\ProgramData\MySQL\MySQL Server 8.4\my.ini

为什么不会生效?

通过实际测试发现,使用 winget / 官方 MSI 默认安装的 MySQL 8.4,其配置文件查找顺序不包含 ProgramData 路径。

验证方法:

mysqld --verbose --help | findstr my.ini

实际查找顺序(基于测试):

  1. C:\WINDOWS\my.ini
  2. C:\WINDOWS\my.cnf
  3. C:\my.ini
  4. C:\my.cnf
  5. C:\Program Files\MySQL\MySQL Server 8.4\my.ini
  6. C:\Program Files\MySQL\MySQL Server 8.4\my.cnf

注意:此查找顺序不包含 C:\ProgramData\MySQL\MySQL Server 8.4\my.ini

为什么很多教程推荐 ProgramData?

不同安装方式会导致不同的配置文件查找顺序:

  1. 情况 1(默认安装,如本测试):

    • 安装器未指定自定义配置
    • 不会创建 ProgramData\MySQL 目录
    • 配置文件查找顺序不包含 ProgramData
  2. 情况 2(自定义安装):

    • 安装时勾选了自定义配置或设置了 datadir
    • 安装器显式指定了 --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.x\my.ini"
    • 此时 ProgramData 路径才会生效
  3. 情况 3(老版本 MySQL 5.x):

    • 几乎一定有 my.ini(历史原因)
    • 通常位于 ProgramData
如何让 ProgramData 路径生效?

如果需要使用 ProgramData 路径(更符合 Windows 规范),可以显式指定配置文件路径:

  1. 查看当前服务配置:

    sc qc MySQL80
    
  2. 修改服务启动参数(管理员 CMD):

    sc config MySQL80 binPath= "\"C:\Program Files\MySQL\MySQL Server 8.4\bin\mysqld.exe\" --defaults-file=\"C:\ProgramData\MySQL\MySQL Server 8.4\my.ini\" --service"
    

    注意binPath= 后面必须有空格,引号必须严格。

  3. 重启服务:

    net stop MySQL80
    net start MySQL80
    
  4. 验证:

    mysqld --verbose --help | findstr ProgramData
    

7.2 查找 MySQL 服务名

如果不知道 MySQL 服务名,使用以下命令查询:

sc query | findstr MySQL

常见服务名:

  • MySQL80(MySQL 8.0+)
  • MySQL(老版本)
  • MySQL57(MySQL 5.7)

7.3 配置文件查找顺序说明

MySQL 在 Windows 下的配置文件查找顺序是编译时决定的,不同安装方式会有不同的查找顺序。

通用查找顺序(理论):

  1. C:\Windows\my.ini
  2. C:\Windows\my.cnf
  3. C:\my.ini
  4. C:\my.cnf
  5. basedir\my.ini(如:C:\Program Files\MySQL\MySQL Server 8.4\my.ini
  6. basedir\my.cnf
  7. 通过 --defaults-file 显式指定的路径

重要:实际查找顺序请使用 mysqld --verbose --help 命令确认。

7.4 常见问题 FAQ

Q1: 为什么修改了 my.ini 但配置不生效?

A: 最常见原因是忘记重启 MySQL 服务。修改配置文件后必须重启服务:

net stop MySQL80
net start MySQL80
Q2: 配置文件放在哪里最合适?

A: 基于实际测试,对于默认安装的 MySQL 8.4,推荐放在:

C:\Program Files\MySQL\MySQL Server 8.4\my.ini
Q3: bind_address 显示 * 是什么意思?

A: * 等价于 0.0.0.0,表示监听所有 IPv4 网卡,允许远程连接。配置文件建议写 0.0.0.0(可读性更好)。

Q4: 创建了用户但远程连不上?

A: 检查以下 3 项:

  1. 用户 host 是否为 %SELECT user, host FROM mysql.user WHERE user='dzm';
  2. bind_address 是否为 0.0.0.0*SHOW VARIABLES LIKE 'bind_address';
  3. Windows 防火墙是否放行 3306 端口
Q5: 如何确认 MySQL 读取了哪个配置文件?

A: 使用以下命令(管理员 CMD):

mysqld --verbose --help | findstr /i "Default options"

总结

快速参考

创建不限 IP 账号:

CREATE USER 'dzm'@'%' IDENTIFIED BY '123123';
GRANT ALL PRIVILEGES ON *.* TO 'dzm'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

配置文件位置(基于实际测试):

C:\Program Files\MySQL\MySQL Server 8.4\my.ini

最小配置内容:

[mysqld]
# 字符集配置(必须)
character-set-server = utf8mb4
collation-server     = utf8mb4_0900_ai_ci

# 远程访问配置(如需远程访问,必须添加)
# port=3306                    # 端口号,默认 3306,可不写
# bind-address=0.0.0.0         # 允许远程连接,默认仅本地,如需远程必须设置

[client]
# 客户端默认字符集(推荐)
default-character-set = utf8mb4

[mysql]
# mysql 命令行客户端字符集(可选,会覆盖 [client] 段)
default-character-set = utf8mb4

[mysqldump]
# mysqldump 备份工具字符集(推荐,确保备份文件编码正确)
default-character-set = utf8mb4

配置说明:

  • # MySQL 字符集与排序规则总结
  • 必须配置character-set-servercollation-server(防止字符集问题)
  • 推荐配置skip-character-set-client-handshake[client][mysqldump] 段(统一字符集)
  • 远程访问:如需远程连接,取消 bind-address 的注释并设置为 0.0.0.0
  • 端口配置:默认 3306,如无特殊需求可不写

验证配置文件生效:

SHOW VARIABLES LIKE 'bind_address';  -- 应显示 0.0.0.0 或 *

远程连接检查:

  1. 用户 host = %
  2. bind_address = 0.0.0.0*
  3. 防火墙放行 3306 ✅

本文档基于 Windows MySQL 8.4 实际测试结果整理,确保所有配置路径和验证方法均经过实际验证。