MySQL 8.0全量备份必须加--single-transaction和--column-statistics=0:前者保障InnoDB无锁一致性快照,后者避免因权限不足访问COLUMN_STATISTICS表报错。

mysqldump 在 MySQL 8.0 上做全量备份,必须加 --single-transaction 和 --column-statistics=0,否则大概率失败或产生不一致备份。这不是可选项,是硬性前提。
为什么直接运行 mysqldump 会报错?
MySQL 8.0.19+ 默认尝试读取 information_schema.COLUMN_STATISTICS 表——但普通备份账号没权限,或只读实例压根不暴露该表,就会卡在:mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM,'$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS': Access denied for user
这不是密码错了,也不是账号没权限查表,而是 mysqldump 主动去查这个新字段导致的。
解决方式只有一条:命令行显式带上 --column-statistics=0(注意是数字 0,不是 false 或 off)。
--single-transaction 不加会怎样?
对 InnoDB 表来说,--single-transaction 是实现无锁热备的唯一安全方式。不加它:
• mysqldump 可能退化为 --lock-tables,导致写入阻塞;
• 跨库备份时尤其容易触发锁表;
• 即使加了 --skip-lock-tables,也不等于事务一致性——它只是跳过显式锁表,但无法保证备份期间数据不被修改;
• 该参数仅对 InnoDB 生效;如果库中混有 MyISAM 表,仍会锁表,需提前确认存储引擎类型。
最小可用且安全的备份命令长什么样?
以下命令已通过 MySQL 8.0.26–8.4.8 实测可用,覆盖日常全量备份核心需求:mysqldump --single-transaction --column-statistics=0 -u backup -p --routines --triggers --events mydb > mydb_$(date +%F).sql
关键点说明:
• --routines:导出存储过程和函数;
• --triggers:导出触发器;
• --events:导出定时事件;
• 不推荐用 root 直接备份,应创建专用账号并赋予 SELECT、SHOW VIEW、TRIGGER、EVENT 权限;
• 若需压缩,建议用管道接 gzip,而不是让 mysqldump 自己处理(避免内存溢出):mysqldump ... | gzip > mydb_$(date +%F).sql.gz
备份后最容易被忽略的验证动作
备份文件生成成功 ≠ 备份可用。真正要检查的是:
• 文件大小非零(空文件常见于权限/网络中断);
• 文件末尾是否包含 -- Dump completed on 行;
• 随机抽几行看是否含 CREATE TABLE 和 INSERT 语句,而非全是报错堆栈;
• 如果用于后续恢复,务必确认备份里有没有 CREATE DATABASE 语句——用 --databases 参数才会带,单库名模式(如 mydb)默认不带建库语句,恢复前得手动 CREATE DATABASE。


















