本文目录导读:

要实现全量备份数据,通常需要根据数据存储位置(本地文件系统、数据库、云存储等)选择不同的脚本方案,以下是几种主流场景的脚本实现方法(以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更高效。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播