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 等)--initialize-insecure)authentication_string、account_locked、password_expired)初始化后不可重复执行,否则会报错“data directory already exists”。
初始化仅提供最基础的 root 账户,需立即登录并加固:
mysql -u root -p(密码见错误日志中的 “A temporary password is generated…”)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.%';
直接 INSERT/UPDATE 权限表存在高风险:
plugin、authentication_string、password_last_changed 必须匹配)caching_sha2_password,老版本用 mysql_native_password)会导致登录失败FLUSH PRIVILEGES 不保
证全部生效,部分权限(如动态权限)需重启或特殊命令若权限表损坏(如误删 mysql.user 行、字段被清空),优先选择:
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),重新初始化,再导入业务数据