备份与恢复

使用 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;

技巧

相关命令