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),重新初始化,再导入业务数据
