备份与恢复
使用 mysqldump 备份数据库,导入恢复数据,配置定时备份策略
语法
mysqldump [options] database [tables] > backup.sql mysql database < backup.sql
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
--single-transaction |
InnoDB 一致性备份(不锁表) | mysqldump --single-transaction ecommerce > backup.sql |
常用 |
--all-databases |
备份所有数据库 | mysqldump --all-databases > all_backup.sql |
常用 |
--routines |
包含存储过程和函数 | mysqldump --routines ecommerce > backup.sql |
进阶 |
--triggers |
包含触发器(默认开启) | mysqldump --triggers ecommerce > backup.sql |
进阶 |
--where |
按条件备份部分数据 | mysqldump ecommerce orders --where="created_at > '2026-01-01'" > orders_2026.sql |
进阶 |
--no-data |
只备份表结构不含数据 | mysqldump --no-data ecommerce > schema.sql |
常用 |
示例
完整备份(推荐)
mysqldump -u root -p \ --single-transaction \ --routines \ --triggers \ --set-gtid-purged=OFF \ ecommerce > ecommerce_$(date +%Y%m%d_%H%M%S).sql
--single-transaction 保证 InnoDB 备份一致性且不锁表
恢复数据库
# 先创建数据库(如果不存在) mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ecommerce;" # 导入备份 mysql -u root -p ecommerce < ecommerce_20260523_100000.sql
恢复前确认目标数据库,大文件导入可能需要较长时间
备份单张表
mysqldump -u root -p \ --single-transaction \ ecommerce users orders > core_tables.sql
只备份关键表,减少备份时间和文件大小
定时备份脚本
#!/bin/bash
# /opt/scripts/mysql_backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/data/backup/mysql
DB_NAME=ecommerce
mysqldump -u backup_user -p'BackupPass!' \
--single-transaction --routines \
$DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# 删除 7 天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
# crontab: 0 2 * * * /opt/scripts/mysql_backup.sh配合 crontab 每天凌晨 2 点自动备份,保留 7 天
常见错误
mysqldump: Got error: 1045: Access denied
备份用户需要 SELECT, SHOW VIEW, TRIGGER, LOCK TABLES 权限
ERROR 1049 (42000): Unknown database
恢复前需要先创建目标数据库:CREATE DATABASE dbname;
技巧
- 生产环境备份必须加 --single-transaction,否则会锁表影响业务
- 备份文件用 gzip 压缩可以减少 70-80% 的存储空间
- 定期测试备份恢复流程,确保备份文件可用