## 数据无价
服务器磁盘会坏,黑客会删库,自己手滑会误删。数据库备份是运维的底线,没有备份的服务器,等于裸奔。
## MySQL 备份脚本
```bash
#!/bin/bash
# mysql_backup.sh
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# 删除 30 天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: ${DB_NAME}_${DATE}.sql.gz"
```
## PostgreSQL 备份
```bash
#!/bin/bash
BACKUP_DIR="/backup/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="your_database"
mkdir -p $BACKUP_DIR
# pg_dump 不需要交互式输入密码,用 .pgpass 文件或环境变量
export PGPASSWORD="your_password"
pg_dump -U postgres $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
```
## Docker 中的数据库备份
```bash
# MySQL in Docker
docker exec mysql_container mysqldump -uroot -ppassword db_name | gzip > backup.sql.gz
# PostgreSQL in Docker
docker exec postgres_container pg_dump -U postgres db_name | gzip > backup.sql.gz
```
## 定时执行
```bash
# 每天凌晨 2 点备份
0 2 * * * /scripts/mysql_backup.sh >> /var/log/backup.log 2>&1
```
## 远程备份(同步到另一台服务器)
备份文件只放在本地不够安全,服务器物理损坏了备份也丢了。建议同步到另一台服务器或云存储:
```bash
#!/bin/bash
# 备份后同步到远程服务器
rsync -avz --delete /backup/mysql/ user@remote-server:/backup/mysql/
# 或上传到对象存储
rclone sync /backup/mysql/ s3:my-backup-bucket/mysql/
```
## 备份恢复验证
备份文件不是存了就行,要定期验证能不能恢复:
```bash
# 创建一个测试数据库
mysql -u root -p -e "CREATE DATABASE test_restore;"
# 恢复最近的备份
zcat /backup/mysql/db_20260722_020000.sql.gz | mysql -u root -p test_restore
# 检查表数量是否一致
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='test_restore';"
# 验证完删除测试库
mysql -u root -p -e "DROP DATABASE test_restore;"
```
建议每周自动执行一次恢复验证,确认备份文件可用。
## 备份 3-2-1 原则
- **3** 份备份:1 份原始数据 + 2 份备份
- **2** 种介质:本地磁盘 + 远程/云端
- **1** 份异地:至少 1 份备份在不同物理位置
花 10 分钟配置好备份,可以节省未来 10 个小时的灾难恢复时间。