Skip to content

备份恢复

备份类型

类型说明优点缺点
物理备份复制数据文件速度快需要停机或锁表
逻辑备份导出 SQL 语句可读性强速度较慢
全量备份完整备份恢复简单占用空间大
增量备份只备份变化占用空间小恢复复杂
差异备份相对全量备份的变化恢复较快占用空间中等

mysqldump 备份

基本语法

bash
mysqldump -u root -p database_name > backup.sql

备份单个数据库

bash
mysqldump -u root -p mydb > mydb_backup.sql

备份多个数据库

bash
mysqldump -u root -p --databases db1 db2 > databases_backup.sql

备份所有数据库

bash
mysqldump -u root -p --all-databases > all_backup.sql

备份单个表

bash
mysqldump -u root -p mydb users > users_backup.sql

备份多个表

bash
mysqldump -u root -p mydb users orders > tables_backup.sql

只备份表结构

bash
mysqldump -u root -p --no-data mydb > schema.sql

只备份数据

bash
mysqldump -u root -p --no-create-info mydb > data.sql

常用参数

参数说明
--single-transactionInnoDB 一致性备份
--lock-tables锁定所有表
--lock-all-tables锁定所有数据库的表
--routines备份存储过程和函数
--triggers备份触发器
--events备份事件
--flush-logs刷新日志
--master-data记录 binlog 位置

完整备份示例

bash
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  --master-data=2 \
  --flush-logs \
  mydb > mydb_full_backup.sql

mysqlpump 备份 (MySQL 5.7+)

基本语法

bash
mysqlpump -u root -p mydb > backup.sql

并行备份

bash
mysqlpump -u root -p --parallel-schemas=4 mydb > backup.sql

压缩备份

bash
mysqlpump -u root -p --compress-output=LZ4 mydb > backup.sql.lz4

物理备份

冷备份

  1. 停止 MySQL 服务
  2. 复制数据目录
  3. 启动 MySQL 服务
bash
systemctl stop mysql
cp -r /var/lib/mysql /backup/mysql_cold
systemctl start mysql

热备份 (InnoDB)

使用 Percona XtraBackup:

bash
xtrabackup --backup --target-dir=/backup/full
xtrabackup --prepare --target-dir=/backup/full
xtrabackup --copy-back --target-dir=/backup/full

增量备份

使用 mysqldump + binlog

bash
mysqldump -u root -p --single-transaction --flush-logs --master-data=2 mydb > full_backup.sql

使用 XtraBackup

bash
xtrabackup --backup --target-dir=/backup/full
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full
xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

恢复数据

mysql 恢复

bash
mysql -u root -p mydb < backup.sql

source 恢复

sql
USE mydb;
SOURCE /path/to/backup.sql;

恢复单个表

bash
mysql -u root -p mydb < users_backup.sql

XtraBackup 恢复

bash
xtrabackup --prepare --target-dir=/backup/full
xtrabackup --copy-back --target-dir=/backup/full
chown -R mysql:mysql /var/lib/mysql

增量恢复

bash
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc2
xtrabackup --copy-back --target-dir=/backup/full

Binlog 恢复

查看 binlog

bash
mysqlbinlog /var/lib/mysql/mysql-bin.000001

指定时间恢复

bash
mysqlbinlog --start-datetime="2023-01-01 00:00:00" \
            --stop-datetime="2023-01-02 00:00:00" \
            mysql-bin.000001 | mysql -u root -p

指定位置恢复

bash
mysqlbinlog --start-position=1000 \
            --stop-position=2000 \
            mysql-bin.000001 | mysql -u root -p

自动备份脚本

bash
#!/bin/bash

BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="mydb"
USER="root"
PASS="password"

mkdir -p $BACKUP_DIR

mysqldump -u$USER -p$PASS \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

echo "Backup completed: ${DB_NAME}_${DATE}.sql.gz"

定时备份

crontab 配置

bash
crontab -e

0 2 * * * /scripts/mysql_backup.sh

备份验证

检查备份文件

bash
gzip -t backup.sql.gz

测试恢复

bash
mysql -u root -p test_db < backup.sql

下一步学习