Appearance
备份恢复
备份类型
| 类型 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 物理备份 | 复制数据文件 | 速度快 | 需要停机或锁表 |
| 逻辑备份 | 导出 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-transaction | InnoDB 一致性备份 |
| --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.sqlmysqlpump 备份 (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物理备份
冷备份
- 停止 MySQL 服务
- 复制数据目录
- 启动 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.sqlsource 恢复
sql
USE mydb;
SOURCE /path/to/backup.sql;恢复单个表
bash
mysql -u root -p mydb < users_backup.sqlXtraBackup 恢复
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/fullBinlog 恢复
查看 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