讲解
备份分两大类:逻辑备份导出 SQL 文本(mysqldump),物理备份直接拷贝数据文件(Percona XtraBackup、文件系统快照)。mysqldump 的优点是简单、可读、跨版本跨平台恢复;缺点是备份慢、恢复更慢(要逐条执行 INSERT),适合中小规模(几十 GB 以内)的库。大库需要物理备份方案,但 mysqldump 的原理和流程是所有备份方案的入门课。
对 InnoDB 表备份的关键参数是 --single-transaction:它开启一个一致性快照事务,备份期间不锁表、不阻塞业务读写(这正是 InnoDB MVCC 的用武之地)。不配它,mysqldump 默认会锁表。另外两个常配参数:--routines 导出存储过程和函数、--triggers 导出触发器(默认已含,显式写出更稳妥);如果要备份事件调度器里的事件,加 --events。
恢复就是把备份文件喂回 mysql 客户端:mysql -u 用户 -p 目标库 < 备份文件。备份领域最重要的铁律是「没有验证过恢复的备份等于没有备份」——定期把备份恢复到一个临时库、核对表行数,是备份系统的基本演练。备份文件还要异地存放,和数据库服务器放在同一台机器上的备份,机器一坏全完。
示例
先造一个演示用的业务库 shop,里面放一张商品表:
DROP DATABASE IF EXISTS shop;
CREATE DATABASE shop CHARACTER SET utf8mb4;
USE shop;
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
INSERT INTO products (name, price) VALUES ('机械键盘', 299.00), ('无线鼠标', 99.00), ('显示器支架', 159.00);
SELECT COUNT(*) AS products_in_shop FROM products;
用 mysqldump 做一次一致性备份,产出 SQL 文件:
# --single-transaction:InnoDB 一致性快照备份,不锁表
# --routines --triggers:连存储过程、函数、触发器一起导出
mysqldump -uroot -p --single-transaction --routines --triggers shop > /tmp/shop_backup.sql
ls -lh /tmp/shop_backup.sql
恢复到新库 shop_restored 验证备份可用,核对行数后清理——这就是「备份恢复演练」的最小闭环:
# 恢复到另一个库名,避免覆盖原库
mysql -uroot -p -e "DROP DATABASE IF EXISTS shop_restored; CREATE DATABASE shop_restored;"
mysql -uroot -p shop_restored < /tmp/shop_backup.sql
mysql -uroot -p -e "SELECT COUNT(*) AS restored_rows FROM shop_restored.products;"
mysql -uroot -p -e "DROP DATABASE shop_restored;"
rm -f /tmp/shop_backup.sql
清理演示库:
DROP DATABASE IF EXISTS shop;
常见坑
- 备份从不做恢复演练:真到要恢复时才发现备份文件损坏、缺参数(没导出存储过程),为时已晚。恢复演练要纳入例行流程。
- 忘了 --single-transaction:默认行为会锁表,业务高峰期备份等于主动制造故障。InnoDB 表的一致性备份一定带上它。
- 备份文件放在本机:机器磁盘损坏时数据和备份一起消失。备份要异地、异介质存放,最好有保留周期(如每天一份保留 30 天)。
- 在脚本里明文写 -p密码:密码进 shell 历史和进程列表。用 mysql_config_editor 生成 login-path,或把备份任务交给专用账号并保护脚本权限。
小结
mysqldump 做逻辑备份:--single-transaction 保证 InnoDB 一致性,--routines/--triggers/--events 别落下;恢复就是执行备份文件,恢复演练必须定期做。下一章讲粒度更细的补救手段:binlog 时间点恢复。