脚本如何全量备份数据

wen 实用脚本 27

本文目录导读:

脚本如何全量备份数据

  1. 文件系统全量备份
  2. 数据库全量备份
  3. 使用专业备份工具(rsync)
  4. 自动化调度
  5. 备份验证与恢复测试
  6. 重要提示

要实现全量备份数据,通常需要根据数据存储位置(本地文件系统、数据库、云存储等)选择不同的脚本方案,以下是几种主流场景的脚本实现方法(以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

重要提示

  1. 测试备份恢复:务必定期在测试环境验证备份文件能否成功恢复
  2. 异地备份:将备份文件复制到其他服务器或云存储(OSS/S3等)
  3. 加密备份:敏感数据应使用GPG或openssl加密:gpg -e -r recipient backup.tar.gz
  4. 备份日志:记录每个备份操作的时间、大小、校验和等信息
  5. 监控告警:添加失败通知(邮件、短信、企业微信等)

选择哪种脚本取决于你的具体环境:如果是Web服务器的文件,优先用tar;如果是数据库,使用专用工具(mysqldump/pg_dump);如果是大量文件同步,rsync更高效。

抱歉,评论功能暂时关闭!