mysql 8.0 日常备份首选 mysqldump,但必须加 --single-transaction 和 --column-statistics=0,并配置 select、show view、trigger、event 权限;因 8.0.19+ 默认读取 column_statistics 表导致报错,该参数可安全跳过统计信息导出。

直接结论:对 MySQL 8.0 做日常备份,mysqldump 仍是最稳妥的选择,但必须加 --single-transaction,且不能忽略 --column-statistics=0 和权限配置这两个关键点。
为什么 mysqldump 在 MySQL 8.0 上默认会报错?
MySQL 8.0.19+ 默认启用了列统计信息(COLUMN_STATISTICS),而 mysqldump 尝试读取 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 ... (errno: 1045)
这不是权限缺失本身的问题,而是 mysqldump 主动去查这个新字段导致的。解决方式极简单:
- 始终在命令中显式加上
--column-statistics=0(注意是数字 0,不是 false) - 不要依赖
my.cnf全局配置——不同版本行为不一致,命令行参数最可靠 - 该参数不影响备份内容完整性,只是跳过统计信息导出
备份命令必须带 --single-transaction 吗?
必须。MySQL 8.0 默认存储引擎是 InnoDB,--single-transaction 是实现“无锁热备”的唯一安全方式。不加它,mysqldump 可能触发 --lock-tables(尤其跨库备份时),导致写入阻塞。
常见误区:
-
--skip-lock-tables≠--single-transaction:前者只是跳过显式锁表,但无法保证事务一致性 -
--single-transaction仅对 InnoDB 表生效;如果库中混有 MyISAM 表,仍会锁表,需提前清理或隔离 - 该参数要求事务隔离级别为
REPEATABLE READ(MySQL 默认),不可手动改高
推荐最小安全命令模板:
mysqldump --single-transaction --column-statistics=0 -u backup -p --routines --triggers --events mydb > mydb_$(date +%F).sql
备份账号权限怎么配才刚好够用?
用 root 备份是反模式。应创建专用账号,并严格限定权限——少一点会失败,多一点是风险。
所需最小权限集合(按功能拆解):
-
SELECT:读取所有表数据(必需) -
SHOW VIEW:导出视图定义(否则视图变空) -
TRIGGER:导出触发器(否则丢失逻辑) -
LOCK TABLES:仅当未用--single-transaction时才需要;加了该参数后,此权限可省略 -
EVENT和PROCESS:分别用于导出事件调度器和获取线程状态(--events和部分诊断场景需要)
建号语句示例(执行于 MySQL 8.0):
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'StrongPass!2026';<br>GRANT SELECT, SHOW VIEW, TRIGGER, EVENT ON mydb.* TO 'backup'@'localhost';<br>FLUSH PRIVILEGES;
注意:RELOAD 权限(常被教程误加)仅用于 FLUSH LOGS 等操作,mysqldump 不需要。
压缩与大库备份的实操边界在哪?
mysqldump 本质是单线程文本生成,瓶颈在 CPU 和磁盘 IO。50GB 是经验分水岭:
- mysqldump > file.sql 即可,恢复也快
- 5–50GB:务必加
--quick(逐行 fetch,防内存溢出) +| gzip > file.sql.gz(边 dump 边压) - > 50GB:别硬扛。要么切分(
mysqldump --databases db1 db2分库导),要么换xtrabackup——此时mysqldump的恢复耗时已不可控
额外提醒:MySQL 8.0.23+ 支持 --skip-generated-invisible-primary-key,若表含隐藏主键(由 innodb_force_primary_key 引入),不加此参数可能导致恢复时报错。











