电话
400 9058 355
MySQL快照备份需先执行FLUSH TABLES WITH READ LOCK使InnoDB静默并同步日志,再调用LVM/ZFS/云平台打快照,最后UNLOCK TABLES;直接对运行中数据目录打快照会导致ibdata1与ib_logfile不一致,恢复失败。
MySQL 本身不提供原生的“快照”功能(如 LVM 快照或云盘快照那种秒级一致性镜像),所谓“MySQL 快照备份”,实际是借助底层存储层(如 LVM、ZFS、AWS EBS、阿里云快照)在 mysqld 静默状态下打卷快照,从而获得一个数据文件的一致性副本。直接在运行中的 MySQL 数据目录上打快照,大概率导致 ibdata1、ib_logfile* 或表空间不一致,恢复后会报 Tablespace is missing 或启动失败。
MySQL 的 InnoDB 引擎采用写前日志(WAL)和后台刷脏页机制,数据文件(ibdata1、.ibd)与重做日志(ib_logfile0/1)处于异步状态。快照瞬间捕获的是一组可能处于中间状态的文件 —— 比如日志已落盘但数据页未刷出,或反之。这种不一致无法通过后续 innodb_force_recovery 修复,只能丢弃。
mysqld 启动卡在 Starting crash recovery... 或报错 InnoDB: Database page corruption on disk
FLUSH TABLES WITH READ LOCK + SHOW MASTER STATUS 配合快照这是最常用、兼容性最好的手动配合方式,适用于所有 MySQL 版本(5.6+ 到 8.0),不要求 super_priv 以外的特殊权限,但需注意锁的持续时间。
FLUSH TABLES WITH READ LOCK 会阻塞所有写入,并强制刷脏页、同步日志到磁盘(对 InnoDB 是 fsync 所有 .ibd 和 ib_logfile*)SHOW MASTER STATUS 记录 File 和 Position(用于后续搭建从库或 PITR)lvcreate --snapshot、zfs snapshot、aws ec2 create-snapshot)UNLOCK TABLES —— 锁持有时间越短越好,否则业务写入被阻塞mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;" mysql -u root -p -e "SHOW MASTER STATUS\G" > /tmp/master_pos.txt # → 此刻立即执行你的快照命令,例如: # lvcreate -L 1G -s -n mysql_snap /dev/vg0/mysql_data mysql -u root -p -e "UNLOCK TABLES;"
LVM 是最常被选作 MySQL 快照载体的方案,但它不是“零开销” —— 快照卷本身会随原卷写入而增长,且存在性能衰减和空间耗尽风险。
/dev/vg0/mysql_data),而非根卷或混用卷lvs -o +snap_percent;超过 80% 应及时合并或删除mysqld:需先 lvconvert --merge(仅当原卷未修改时可用),或拷贝快照内容到新路径并修正 my.cnf 中的 datadir
云厂商快照虽标榜“应用一致性”,但 MySQL 不在其默认保护列表中(Windows SQL Server、Oracle 才有 Agent 级集成)。必须人工干预才能保证一致性。
Enable automatic application-consistent snapshots 无效,它只调用 Windows VSS;Linux 下仍需自行 FLUSH TABLES WITH READ LOCK + create-snapshot
mysqladmin flush-logs + FLUSH TABLES WITH READ LOCK,并在快照完成回调中 UNLOCK TABLES
FLUSH 后等待 2–3 秒再触发快照命令,避免内核缓冲区残留真正省事的方案是用 mysqldump 或 mydumper 做逻辑备份,或用 Percona XtraBackup 做热物理备份 —— 它们自己处理了日志同步与一致性点定位。而“快照”只是个快捷入口,背后必须有人为的静默步骤兜底。漏掉 FLUSH 或忘了 UNLOCK,就是生产事故的起点。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...