物理备份是直接复制mysql数据文件,逻辑备份是导出sql语句;前者快但不可读、难跨版本、无法单表恢复,后者慢但可读可编辑、支持单表还原。

物理备份就是“抄文件”,逻辑备份就是“导SQL”
物理备份本质是直接复制 MySQL 的数据文件(如 ibd、frm、binlog、redolog),连同控制文件、日志一并拷走;逻辑备份则是让 MySQL server 执行查询,把表结构和数据转成 CREATE TABLE 和 INSERT 语句,存成纯文本 SQL 文件。
这意味着:物理备份快但笨重,逻辑备份慢但灵活。比如你用 mysqldump -u root -p testdb > backup.sql,得到的是人类可读、可编辑、可删行、可改库名的文本;而用 cp -r /var/lib/mysql/testdb /backup/(冷备)或 xtrabackup --backup --target-dir=/backup/(热备),拿到的就是一堆二进制文件,不能直接打开看内容,也不能跨 MySQL 大版本恢复。
恢复时能不能“只还原一张表”?逻辑可以,物理基本不行
这是最常被低估的实操差异。逻辑备份支持细粒度还原:mysql -u root -p testdb 或用 <code>--tables 参数只 dump 某几张表;物理备份则天然绑定整个实例或至少整个数据库目录——哪怕你只想恢复 orders 表,也得先恢复整库,再从里面导出那张表(还得确保引擎是 InnoDB + 独立表空间,否则连单独拷 orders.ibd 都会报错 Tablespace is missing for table 'testdb/orders')。
- 逻辑备份适合开发环境迁移、线上误删单表抢救、跨版本升级前验证
- 物理备份适合 TB 级生产库的分钟级 RTO(恢复时间目标),但必须搭配
xtrabackup或mysqlbackup等工具,裸cp只适用于 MyISAM 冷备或测试机 - MyISAM 表物理备份看似简单,但若没加
FLUSH TABLES WITH READ LOCK就直接cp,极易产生索引损坏,恢复后SELECT报错Incorrect key file for table
热备能否真正“不锁库”?物理方案有门道,逻辑方案靠隔离级别
所谓“热备”,不是指完全无感知,而是尽量减少业务影响。逻辑备份(mysqldump)默认执行 FLUSH TABLES WITH READ LOCK,对 MyISAM 是全局写锁,对 InnoDB 则靠 START TRANSACTION WITH CONSISTENT SNAPSHOT 实现 MVCC 快照——但注意:如果备份过程中有长事务未提交,mysqldump 会卡在等待锁释放,导致备份 hang 住,业务写入堆积。
物理热备(如 xtrabackup)更进一步:它一边拷数据文件,一边持续监听并备份 redo log,最后做一次短暂 FTWRL 获取 binlog 位点。所以它的“热”是真热——InnoDB 表全程可读可写,只有最后几秒锁表。但代价是:必须用 xtrabackup,不能自己写脚本 rsync 数据目录,否则必然不一致。
-
mysqldump --single-transaction是 InnoDB 安全前提,但不适用于混合引擎库 -
xtrabackup要求 MySQL 开启innodb_file_per_table,否则无法单独处理某张表 - 备份期间若发生 crash,逻辑备份可能只完成一半(SQL 文件截断),而物理备份即使中断,只要没覆盖原目录,仍可尝试
--prepare恢复
跨平台和版本兼容性,别想当然
逻辑备份生成的 .sql 文件,只要语法没废弃(比如 MySQL 8.0 去掉 password 字段),就能在 MariaDB 或低版本 MySQL 上执行;物理备份则严格受限于 MySQL 版本、架构(x86 vs ARM)、甚至文件系统(XFS vs ext4 对 direct IO 行为不同)。常见翻车场景:
- 用 MySQL 5.7 的
ibdata1直接替换到 8.0 实例,启动失败报错InnoDB: Unsupported redo log format - 在 CentOS 上用
xtrabackup 2.4备份,拿到 Ubuntu 上用xtrabackup 8.0恢复,提示Unsupported version of backup - 备份时用了
--compress,但恢复机器没装qpress,xtrabackup --decompress直接报 command not found
真正上线前,务必在同环境做一次完整 restore 验证——尤其是物理备份,恢复失败往往发生在最不该出问题的时候。










