mysql物理备份和逻辑备份有什么区别_mysql备份方法分析

1次阅读

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

mysql物理备份和逻辑备份有什么区别_mysql备份方法分析

物理备份就是“抄文件”,逻辑备份就是“导SQL”

物理备份本质是直接复制 MySQL 的数据文件(如 ibdfrmbinlogredolog),连同控制文件、日志一并拷走;逻辑备份则是让 MySQL server 执行查询,把表结构和数据转成 CREATE tableINSERT 语句,存成纯文本 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(恢复时间目标),但必须搭配 xtrabackupmysqlbackup 等工具,裸 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,但恢复机器没装 qpressxtrabackup --decompress 直接报 command not found

真正上线前,务必在同环境做一次完整 restore 验证——尤其是物理备份,恢复失败往往发生在最不该出问题的时候。

text=ZqhQzanResources