本文目录导读:

要实现全量备份数据,通常需要根据数据存储位置(本地文件系统、数据库、云存储等)选择不同的脚本方案,以下是几种主流场景的脚本实现方法(以Shell和Python为主):
文件系统全量备份
Shell脚本(适用于Linux/Unix)
#!/bin/bash
# 配置参数
SOURCE_DIR="/data/www" # 要备份的源目录
BACKUP_DIR="/backup" # 备份存储目录
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="full_backup_${DATE}.tar.gz"
LOG_FILE="/var/log/backup.log"
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# 执行全量备份(tar打包压缩)
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始全量备份: ${SOURCE_DIR}" >> ${LOG_FILE}
tar -czf ${BACKUP_DIR}/${BACKUP_FILE} ${SOURCE_DIR} 2>> ${LOG_FILE}
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 备份成功: ${BACKUP_FILE}" >> ${LOG_FILE}
echo "备份文件: ${BACKUP_DIR}/${BACKUP_FILE}"
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 备份失败" >> ${LOG_FILE}
exit 1
fi
# 可选:删除30天前的旧备份
find ${BACKUP_DIR} -name "full_backup_*.tar.gz" -mtime +30 -delete
Python脚本(更灵活,支持跨平台)
#!/usr/bin/env python3
import os
import tarfile
import datetime
import shutil
import logging
# 配置
SOURCE = "/data/www"
BACKUP_DIR = "/backup"
LOG_FILE = "/var/log/backup.log"
RETENTION_DAYS = 30
# 初始化日志
logging.basicConfig(filename=LOG_FILE, level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
def full_backup():
try:
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_file = f"full_backup_{timestamp}.tar.gz"
backup_path = os.path.join(BACKUP_DIR, backup_file)
logging.info(f"开始全量备份: {SOURCE}")
# 创建tar.gz压缩
with tarfile.open(backup_path, "w:gz") as tar:
tar.add(SOURCE, arcname=os.path.basename(SOURCE))
logging.info(f"备份成功: {backup_file}")
print(f"备份完成: {backup_path}")
return True
except Exception as e:
logging.error(f"备份失败: {str(e)}")
return False
# 清理旧备份
def cleanup():
try:
cutoff = datetime.datetime.now() - datetime.timedelta(days=RETENTION_DAYS)
for f in os.listdir(BACKUP_DIR):
if f.startswith("full_backup_") and f.endswith(".tar.gz"):
file_path = os.path.join(BACKUP_DIR, f)
file_time = datetime.datetime.fromtimestamp(os.path.getctime(file_path))
if file_time < cutoff:
os.remove(file_path)
logging.info(f"删除旧备份: {f}")
except Exception as e:
logging.error(f"清理失败: {str(e)}")
if __name__ == "__main__":
if full_backup():
cleanup()
数据库全量备份
MySQL全量备份
#!/bin/bash
# MySQL全量备份脚本
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${DB_NAME}_full_${DATE}.sql.gz"
LOG_FILE="/var/log/mysql_backup.log"
mkdir -p ${BACKUP_DIR}
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始MySQL全量备份: ${DB_NAME}" >> ${LOG_FILE}
# 使用mysqldump进行全量导出并压缩
mysqldump --single-transaction -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_DIR}/${BACKUP_FILE}
if [ $? -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] MySQL备份成功: ${BACKUP_FILE}" >> ${LOG_FILE}
# 删除7天前的备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +7 -delete
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] MySQL备份失败" >> ${LOG_FILE}
exit 1
fi
PostgreSQL全量备份
#!/bin/bash
# PostgreSQL全量备份
PG_USER="postgres"
PG_DB="your_database"
BACKUP_DIR="/backup/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${PG_DB}_full_${DATE}.dump"
LOG_FILE="/var/log/pg_backup.log"
mkdir -p ${BACKUP_DIR}
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始PostgreSQL全量备份: ${PG_DB}" >> ${LOG_FILE}
# pg_dump自定义格式(压缩的)
pg_dump -U ${PG_USER} -Fc -f ${BACKUP_DIR}/${BACKUP_FILE} ${PG_DB}
if [ $? -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] PostgreSQL备份成功: ${BACKUP_FILE}" >> ${LOG_FILE}
find ${BACKUP_DIR} -name "*.dump" -mtime +7 -delete
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] PostgreSQL备份失败" >> ${LOG_FILE}
exit 1
fi
使用专业备份工具(rsync)
#!/bin/bash
# rsync全量同步备份(适合从远程服务器备份到本地)
SOURCE_USER="backup_user"
SOURCE_HOST="192.168.1.100"
SOURCE_PATH="/data/www/"
BACKUP_LOCAL_PATH="/backup/rsync"
DATE=$(date +%Y%m%d_%H%M%S)
RSYNC_LOG="/var/log/rsync_backup.log"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始rsync全量同步" >> ${RSYNC_LOG}
# 使用rsync进行全量同步(-a归档模式,-z压缩传输,-v详细输出)
rsync -azv --delete ${SOURCE_USER}@${SOURCE_HOST}:${SOURCE_PATH} ${BACKUP_LOCAL_PATH} >> ${RSYNC_LOG} 2>&1
if [ $? -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] rsync同步成功" >> ${RSYNC_LOG}
# 创建快照标记(可选)
# cp -al ${BACKUP_LOCAL_PATH} ${BACKUP_LOCAL_PATH}_${DATE}
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] rsync同步失败" >> ${RSYNC_LOG}
exit 1
fi
自动化调度
添加crontab定时任务
# 编辑crontab crontab -e # 每天凌晨2点执行文件备份 0 2 * * * /opt/scripts/full_backup.sh # 每天凌晨3点执行数据库备份 0 3 * * * /opt/scripts/mysql_backup.sh # 每周日凌晨4点执行rsync同步 0 4 * * 0 /opt/scripts/rsync_backup.sh
备份验证与恢复测试
编写一个验证脚本,定期检查备份文件的完整性:
#!/bin/bash
# 备份验证脚本
BACKUP_FILE="/backup/full_backup_20240220_000000.tar.gz"
# 检查文件是否存在且非空
if [ -f "${BACKUP_FILE}" ] && [ -s "${BACKUP_FILE}" ]; then
echo "文件存在且非空"
# 检查tar文件完整性
if tar -tzf ${BACKUP_FILE} > /dev/null 2>&1; then
echo "备份文件完整,验证通过"
else
echo "备份文件损坏!"
exit 1
fi
else
echo "备份文件不存在或为空"
exit 1
fi
重要提示
- 测试备份恢复:务必定期在测试环境验证备份文件能否成功恢复
- 异地备份:将备份文件复制到其他服务器或云存储(OSS/S3等)
- 加密备份:敏感数据应使用GPG或openssl加密:
gpg -e -r recipient backup.tar.gz - 备份日志:记录每个备份操作的时间、大小、校验和等信息
- 监控告警:添加失败通知(邮件、短信、企业微信等)
选择哪种脚本取决于你的具体环境:如果是Web服务器的文件,优先用tar;如果是数据库,使用专用工具(mysqldump/pg_dump);如果是大量文件同步,rsync更高效。