MySQL 数据库备份与恢复笔记
一、备份的核心概念
- 备份目的:防止数据丢失、灾难恢复、数据迁移、审计与分析。
- 备份类型 :
- 冷备份:数据库停机时备份,一致性高但影响业务。
- 热备份:数据库运行中备份,不影响业务,是生产环境主流选择。
- 逻辑备份:导出 SQL 语句 / 数据,文件小、可跨平台,但恢复速度慢。
- 物理备份:直接拷贝数据文件,速度快,但平台兼容性差。
二、常用备份工具与方法
1. mysqldump(逻辑备份,官方推荐)
适用场景
- 中小型数据库、数据迁移、单库 / 单表备份。
- 支持全量备份与部分数据备份。
常用命令
bash
运行
# 全量备份所有数据库
mysqldump -u[用户名] -p --all-databases > all_databases_$(date +%Y%m%d).sql
# 备份指定数据库
mysqldump -u[用户名] -p [数据库名] > [数据库名]_$(date +%Y%m%d).sql
# 备份指定数据库中的单张表
mysqldump -u[用户名] -p [数据库名] [表名] > [表名]_$(date +%Y%m%d).sql
# 备份时添加库创建语句(避免恢复时手动建库)
mysqldump -u[用户名] -p --databases [数据库名] > [数据库名]_with_create.sql
关键参数
--databases:显式包含CREATE DATABASE语句,恢复时无需手动建库。--single-transaction:对 InnoDB 引擎做一致性热备份,不锁表。--lock-tables:对 MyISAM 引擎锁表备份,保证一致性。--routines --triggers --events:同时备份存储过程、触发器、事件。
2. 物理备份(冷备份)
适用场景
- 大型数据库、需要快速恢复、同版本 / 同平台迁移。
- 数据库必须停机或处于只读状态。
操作步骤
-
停止 MySQL 服务: bash
运行
systemctl stop mysqld -
拷贝数据目录(默认路径
/var/lib/mysql):bash
运行
cp -r /var/lib/mysql /backup/mysql_data_$(date +%Y%m%d) -
启动 MySQL 服务: bash
运行
systemctl start mysqld
3. xtrabackup(物理热备份,Percona 工具)
适用场景
- 生产环境大型数据库,支持在线热备份、增量备份,速度远快于 mysqldump。
- 仅支持 InnoDB/XtraDB 引擎。
核心命令
bash
运行
# 全量备份
xtrabackup --user=[用户名] --password=[密码] --backup --target-dir=/backup/full_$(date +%Y%m%d)
# 增量备份(基于全量备份)
xtrabackup --user=[用户名] --password=[密码] --backup --incremental-basedir=/backup/full_20260330 --target-dir=/backup/incr_$(date +%Y%m%d)
# 准备备份(合并增量数据,使备份可恢复)
xtrabackup --prepare --target-dir=/backup/full_20260330
xtrabackup --prepare --target-dir=/backup/full_20260330 --incremental-dir=/backup/incr_20260330
三、数据恢复方法
1. mysqldump 备份恢复
全库 / 单库恢复
bash
运行
# 恢复所有数据库(需先停止业务,避免数据冲突)
mysql -u[用户名] -p < all_databases_20260330.sql
# 恢复指定数据库(备份文件含 --databases 时)
mysql -u[用户名] -p < [数据库名]_with_create.sql
# 恢复指定数据库(备份文件不含 --databases,需先手动建库)
mysql -u[用户名] -p -e "CREATE DATABASE IF NOT EXISTS [数据库名];"
mysql -u[用户名] -p [数据库名] < [数据库名]_20260330.sql
单表恢复
bash
运行
# 先导入到临时库,再导出单表到目标库
mysql -u[用户名] -p temp_db < [表名]_20260330.sql
mysqldump -u[用户名] -p temp_db [表名] | mysql -u[用户名] -p target_db
2. 物理备份恢复
-
停止 MySQL 服务: bash
运行
systemctl stop mysqld -
清空原数据目录(务必先备份原数据! ):
bash
运行
rm -rf /var/lib/mysql/* -
拷贝备份数据到原目录: bash
运行
cp -r /backup/mysql_data_20260330/* /var/lib/mysql/ -
修正权限: bash
运行
chown -R mysql:mysql /var/lib/mysql -
启动 MySQL 服务: bash
运行
systemctl start mysqld
3. xtrabackup 备份恢复
bash
运行
# 停止 MySQL 服务
systemctl stop mysqld
# 清空原数据目录
rm -rf /var/lib/mysql/*
# 拷贝准备好的备份数据到原目录
cp -r /backup/full_20260330/* /var/lib/mysql/
# 修正权限
chown -R mysql:mysql /var/lib/mysql
# 启动 MySQL 服务
systemctl start mysqld
四、备份与恢复最佳实践
-
定期备份:生产环境建议每日全量备份 + 每小时增量备份。
-
异地存储:备份文件不要和数据库存放在同一服务器,避免机房故障。
-
自动验证:定期执行恢复测试,确保备份文件可用。
-
权限最小化 :备份账号仅授予
SELECT、RELOAD、LOCK TABLES等必要权限。 -
压缩备份 :备份后用
gzip/xz压缩,节省存储空间:bash
运行
mysqldump -u[用户名] -p [数据库名] | gzip > [数据库名]_$(date +%Y%m%d).sql.gz恢复时:
bash
运行
gunzip < [数据库名]_20260330.sql.gz | mysql -u[用户名] -p [数据库名]
五、常见问题排查
- 报错
Table 'xxx' doesn't exist:- 检查备份文件是否包含该表,或恢复时库名 / 表名拼写错误。
- 确认备份文件执行时是否有语法错误(可查看 MySQL 日志)。
- 恢复缓慢 :
- 大库恢复建议关闭二进制日志(
set sql_log_bin=0),提升速度。 - 调整
innodb_buffer_pool_size等参数优化 I/O。
- 大库恢复建议关闭二进制日志(
- 权限问题 :
- 确保 MySQL 进程对数据目录有读写权限,备份文件路径可访问。