直接用 mysqldump 备份 mysql 系统库易失败,因权限不足或表结构版本不匹配(如 5.7 客户端连 8.0 实例时 role_edges 表不可见);应使用同版本客户端、高权限账户,仅导出 user、db、tables_priv 等核心权限表,并加 --skip-triggers --skip-routines --no-create-info 参数。

mysqldump 备份 mysql 系统库会失败?
直接用 mysqldump 备份 mysql 库,常遇到 Access denied for user 'xxx'@'localhost' (using password: YES) 或 Table 'mysql.role_edges' doesn't exist 这类报错。不是权限不够,就是表结构版本不匹配——5.7 和 8.0 的 mysql 库表差异很大,mysqldump 默认会尝试读取所有表,而像 role_edges、password_history 这些 8.0+ 新增表,在旧版本客户端或低权限账户下根本不可见。
实操建议:
- 必须用
root或拥有SELECT权限且能访问mysql库所有表的账户执行备份 - 避免用低版本
mysqldump(比如 MySQL 5.7 的 dump 工具)去连 MySQL 8.0 实例;优先用服务端同版本的客户端 - 加
--skip-lock-tables,否则mysqldump对mysql库加锁时可能卡住系统权限变更 - 不推荐全量导出:
mysqldump --databases mysql—— 它会包含user、db、tables_priv等核心表,但也混入help_topic、time_zone这类无关数据,恢复时易出错
只备份真正影响权限的那几张表
权限生效只依赖少数几张表:用户账号、全局权限、数据库级权限、表级权限、列级权限、存储过程权限,以及 8.0+ 的角色相关表。其他如 columns_priv、procs_priv 如果你没显式设过列或过程权限,实际为空,可跳过。
实操建议:
- 明确要备份的表清单(MySQL 8.0):
user、db、tables_priv、columns_priv、procs_priv、proxies_priv、roles_mapping、role_edges - 用
mysqldump mysql user db tables_priv ...指定表名,不带--databases,避免自动加CREATE DATABASE语句干扰恢复 - 加上
--skip-triggers --skip-routines --no-create-info:权限表不含触发器和存储过程,--no-create-info能省掉CREATE TABLE语句,防止恢复时因表结构不一致报错 - 如果只做账号快照,甚至可以只 dump
user和db:mysqldump mysql user db > priv_backup.sql
恢复权限表前必须停写 + 清空目标表
直接 mysql mysql 很危险:dump 文件里是 <code>INSERT INTO user VALUES ...,但 MySQL 8.0 的 user 表有自增主键和默认值约束,重复插入会导致主键冲突或字段被覆盖成 NULL,最终登录失败。
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
实操建议:
- 恢复前先停业务,确保无连接在修改权限(尤其避免其他 DBA 同时执行
GRANT) - 不能用
DROP TABLE或TRUNCATE清空系统表——MySQL 不允许对mysql库表执行这些操作 - 正确做法是用
DELETE FROM user、DELETE FROM db等逐表清空,再 source dump 文件 - 恢复后必须执行
FLUSH PRIVILEGES,否则内存缓存不会更新,新权限不生效 - 如果是跨版本恢复(比如从 8.0 dump 恢复到 5.7),绝对不可行——表结构不兼容,
role_edges在 5.7 根本不存在
用 SELECT INTO OUTFILE 备份更轻量、更可控
当只需要快速抓取当前账号和权限状态(比如故障前快照),SELECT INTO OUTFILE 比 mysqldump 更干净:它不生成 SQL 语句,只导出纯数据,也绕开了表结构校验和锁机制。
实操建议:
- 确保
secure_file_priv允许写入路径,比如设为/var/lib/mysql-files/ - 导出用户和权限数据:
SELECT * FROM mysql.user INTO OUTFILE '/var/lib/mysql-files/user.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; - 导出时加
WHERE account_locked = 'N'或WHERE plugin != 'auth_socket'可过滤掉本地 socket 登录账户,避免恢复时误覆盖 - 这种 CSV 文件不能直接恢复进表,但可配合
LOAD DATA INFILE或脚本转成 INSERT,适合做审计比对或人工核查
权限系统备份最麻烦的从来不是命令怎么写,而是搞不清哪几张表真正在起作用、哪个版本对应哪些表、以及恢复时要不要清空——这三个点漏掉任何一个,备份就等于白做。









