MySQL数据库备份与恢复完全指南:mysqldump到自动化脚本

运维  ·  2026-06-26

MySQL

数据库备份是运维工作中最重要的环节之一。本文介绍MySQL数据库的备份与恢复方法,从基础的mysqldump到自动化备份脚本,帮你建立完善的备份策略。

一、mysqldump基础用法

# 备份单个数据库
mysqldump -u root -p 数据库名 > backup.sql

# 备份多个数据库
mysqldump -u root -p --databases db1 db2 db3 > multi_backup.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup.sql

# 备份指定表
mysqldump -u root -p 数据库名 表名1 表名2 > tables_backup.sql

二、常用备份参数

# 完整备份(推荐参数)

mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  --flush-logs \
  --master-data=2 \
  数据库名 > full_backup.sql

参数说明:
--single-transaction  InnoDB一致性备份,不锁表
--routines            包含存储过程和函数
--triggers            包含触发器
--events              包含定时事件
--flush-logs          刷新日志(用于增量备份)
--master-data=2       记录binlog位置(注释形式)

三、恢复数据库

# 恢复单个数据库
mysql -u root -p 数据库名 < backup.sql

 恢复所有数据库

mysql -u root -p < all_backup.sql

 恢复到新数据库

mysql -u root -p -e "CREATE DATABASE new_db;"
mysql -u root -p new_db < backup.sql

 压缩备份恢复

gunzip < backup.sql.gz | mysql -u root -p 数据库名

四、压缩备份节省空间

# 压缩备份
mysqldump -u root -p 数据库名 | gzip > backup_$(date +%Y%m%d).sql.gz

 压缩备份并显示进度

mysqldump -u root -p 数据库名 | pv | gzip > backup.sql.gz

 对比大小

ls -lh backup.sql backup.sql.gz

压缩后通常能减少70%-90%的文件大小。

五、自动化备份脚本

#!/bin/bash

 mysql_backup.sh - MySQL自动备份脚本

 配置

DB_USER="backup_user"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7

 创建备份目录

mkdir -p $BACKUP_DIR

 执行备份

mysqldump -u$DB_USER&nbsp;-p$DB_PASS \
  --single-transaction \
  --routines \
  --triggers \
  $DB_NAME&nbsp;|&nbsp;gzip&nbsp;&gt;&nbsp;$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

 检查备份是否成功

if [ $? -eq 0 ]; then
    echo "[$(date)]&nbsp;备份成功:&nbsp;${DB_NAME}_${DATE}.sql.gz"
else
    echo "[$(date)] 备份失败!" >&2
    # 可以在这里发送告警邮件
fi

 删除N天前的备份

find $BACKUP_DIR&nbsp;-name&nbsp;&quot;*.sql.gz&quot;&nbsp;-mtime&nbsp;+$KEEP_DAYS -delete
echo "[$(date)]&nbsp;已清理${KEEP_DAYS}天前的备份"

六、配置定时任务

# 给脚本执行权限
chmod +x /opt/scripts/mysql_backup.sh

 编辑crontab

crontab -e

 每天凌晨2点执行备份

0 2   * /opt/scripts/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

 每周日凌晨3点全量备份

0 3   0 /opt/scripts/mysql_full_backup.sh >> /var/log/mysql_backup.log 2>&1

七、binlog增量备份

# 开启binlog(my.cnf)
[mysqld]
log-bin=mysql-bin
binlog_format=ROW
server-id=1

 查看当前binlog

mysql> SHOW BINARY LOGS;

 刷新binlog(开始新的日志文件)

mysql> FLUSH BINARY LOGS;

 从binlog恢复数据

mysqlbinlog --start-datetime="2026-06-15 00:00:00" \
            --stop-datetime="2026-06-15 12:00:00" \
            mysql-bin.000001 | mysql -u root -p

 从binlog恢复指定位置

mysqlbinlog --start-position=154 --stop-position=1024 \
            mysql-bin.000001 | mysql -u root -p

八、备份验证

# 验证备份文件完整性
mysqlcheck -u root -p --check --all-databases

 恢复到测试环境验证

mysql -u root -p test_db < backup.sql
mysql -u root -p -e "SELECT COUNT(*) FROM test_db.重要表;"

 检查备份文件是否可读

gunzip -t backup.sql.gz && echo "文件完整" || echo "文件损坏"

九、备份策略建议

场景策略频率
小型数据库(<1GB)全量备份每天
中型数据库(1-100GB)全量+binlog增量全量每周,增量每天
大型数据库(>100GB)xtrabackup物理备份全量每周,增量每天
核心业务主从复制+定时备份实时同步+每天备份

备份不验证等于没备份。建议定期在测试环境恢复备份,确保备份可用。

评论
远方. All Rights Reserved. Theme Jasmine by Kent Liao.