MySQL权限表由初始化命令自动创建,严禁手动修改;应使用CREATE USER、GRANT等SQL语句管理权限;初始化后须立即修改root密码、创建业务用户并授权。

MySQL 权限表(如 mysql.user、mysql.db、mysql.tables_priv 等)在初始化安装时由 mysqld --initialize 或安装脚本自动创建并填充基础数据,**不建议手动配置或直接修改权限表**。正确做法是使用标准 SQL 语句(CREATE USER、GRANT、REVOKE)来管理权限,MySQL 会自动同步更新底层权限表。
权限表初始化发生在安装/首次启动阶段
MySQL 8.0+ 使用 mysqld --initialize(或 --initialize-insecure)命令初始化数据目录,该过程会:
- 自动生成
mysql系统数据库及所有权限表(user、db、tables_priv、columns_priv等) - 创建 root 用户记录(密码写入日志或为空,取决于是否加
--initialize-insecure) - 设置默认权限字段值(如
authentication_string、account_locked、password_expired)
初始化后不可重复执行,否则会报错“data directory already exists”。
初始化后必须完成的权限配置步骤
初始化仅提供最基础的 root 账户,需立即登录并加固:
- 用临时密码登录:
mysql -u root -p(密码见错误日志中的 “A temporary password is generated…”) - 修改 root 密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!'; - 刷新权限缓存:
FLUSH PRIVILEGES;(仅在直接修改表后才需要;用GRANT则自动生效) - 创建业务用户并授权:
CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'AppPass456!'; GRANT SELECT,INSERT ON mydb.* TO 'appuser'@'192.168.1.%';
不要手动操作 mysql.user 等权限表
直接 INSERT/UPDATE 权限表存在高风险:
- 字段逻辑复杂(如
plugin、authentication_string、password_last_changed必须匹配) - 忽略加密方式(MySQL 8.0 默认
caching_sha2_password,老版本用mysql_native_password)会导致登录失败 - 未调用内部验证逻辑,可能造成权限不生效或认证绕过
-
FLUSH PRIVILEGES不保证全部生效,部分权限(如动态权限)需重启或特殊命令
权限表异常时的修复方法
若权限表损坏(如误删 mysql.user 行、字段被清空),优先选择:
- 从同版本 MySQL 实例导出干净的
mysql库结构:mysqldump --no-data --skip-triggers mysql > mysql_schema.sql,再导入修复 - 使用
mysql_upgrade(MySQL 5.7 及以前)或mysqld --upgrade=FORCE(MySQL 8.0+)校验并修复系统表 - 极端情况可重装:备份业务库(
mysqldump --all-databases --skip-lock-tables),重新初始化,再导入业务数据










