1. 首页 > Linux教程 > 正文

Linux教程FG525-Linux企业级备份恢复方案

内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。

风哥提示:

本文档介绍Linux企业级备份恢复方案设计和实施。

Part01-备份策略设计

1.1 备份策略规划

# 创建备份目录结构
[root@fgedu-backup ~]# mkdir -p /backup/{daily,weekly,monthly,archive}
[root@fgedu-backup ~]# mkdir -p /backup/{database,files,configs,applications}

# 创建备份配置文件
[root@fgedu-backup ~]# cat > /etc/backup/backup.conf << 'EOF' # 备份更多学习教程公众号风哥教程itpux_com配置文件 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 备份服务器配置 BACKUP_SERVER="backup.fgedu.net.cn" BACKUP_USER="backup" BACKUP_PATH="/data/backups" # 本地备份路径 LOCAL_BACKUP_DIR="/backup" DATABASE_BACKUP_DIR="/backup/database" FILES_BACKUP_DIR="/backup/files" CONFIG_BACKUP_DIR="/backup/configs" # 保留策略 DAILY_RETENTION=7 WEEKLY_RETENTION=4 MONTHLY_RETENTION=12 ARCHIVE_RETENTION=365 # 数据库配置 DB_HOST="192.168.1.40" DB_USER="backup" DB_PASS="Backup@123" # 压缩配置 COMPRESS_CMD="gzip" COMPRESS_EXT=".gz" # 通知配置 NOTIFY_EMAIL="ops@fgedu.net.cn" NOTIFY_ON_SUCCESS=false NOTIFY_ON_FAILURE=true EOF # 创建备份脚本 [root@fgedu-backup ~]# cat > /usr/local/bin/backup.sh << 'EOF' #!/bin/bash # backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn source /etc/backup/backup.conf DATE=$(date +%Y%m%d) TIME=$(date +%H%M%S) LOG_FILE="/var/log/backup/backup-${DATE}.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

send_notification() {
local subject=$1
local body=$2
echo “$body” | mail -s “$subject” $NOTIFY_EMAIL
}

# 数据库备份
backup_database() {
log “开始数据库备份…”

mkdir -p ${DATABASE_BACKUP_DIR}/${DATE}

# 备份所有数据库
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS –all-databases –single-transaction –routines –triggers | gzip > ${DATABASE_BACKUP_DIR}/${DATE}/all-databases-${DATE}.sql.gz

# 备份指定数据库
for db in fgedu_db fgedu_cms fgedu_api; do
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS –single-transaction $db | gzip > ${DATABASE_BACKUP_DIR}/${DATE}/${db}-${DATE}.sql.gz
done

log “数据库备份完成”
}

# 文件备份
backup_files() {
log “开始文件备份…”

mkdir -p ${FILES_BACKUP_DIR}/${DATE}

# 备份Web文件
tar -czf ${FILES_BACKUP_DIR}/${DATE}/web-files-${DATE}.tar.gz -C /var/www fgedu

# 备份上传文件
tar -czf ${FILES_BACKUP_DIR}/${DATE}/uploads-${DATE}.tar.gz -C /var/www/fgedu/storage uploads

# 备份日志文件
tar -czf ${FILES_BACKUP_DIR}/${DATE}/logs-${DATE}.tar.gz -C /var/log nginx php-fpm

log “文件备份完成”
}

# 配置备份
backup_configs() {
log “开始配置备份…”

mkdir -p ${CONFIG_BACKUP_DIR}/${DATE}

# 备份系统配置
tar -czf ${CONFIG_BACKUP_DIR}/${DATE}/system-configs-${DATE}.tar.gz \
/etc/nginx \
/etc/php-fpm \
/etc/my.cnf.d \
/etc/redis \
/etc/ssh \
/etc/sysconfig \
/etc/cron.d

# 备份应用配置
tar -czf ${CONFIG_BACKUP_DIR}/${DATE}/app-configs-${DATE}.tar.gz \
/var/www/fgedu/.env \
/var/www/fgedu/config

log “配置备份完成”
}

# 同步到远程
sync_to_remote() {
log “开始同步到远程服务器…”

rsync -avz –delete \
${LOCAL_BACKUP_DIR}/ \
${BACKUP_USER}@${BACKUP_SERVER}:${BACKUP_PATH}/$(hostname)/

log “远程同步完成”
}

# 清理旧备份
cleanup_old_backups() {
log “开始清理旧备份…”

# 清理每日备份
find ${LOCAL_BACKUP_DIR}/daily -mtime +${DAILY_RETENTION} -delete

# 清理每周备份
find ${LOCAL_BACKUP_DIR}/weekly -mtime +$((WEEKLY_RETENTION * 7)) -delete

# 清理每月备份
find ${LOCAL_BACKUP_DIR}/monthly -mtime +$((MONTHLY_RETENTION * 30)) -delete

log “清理完成”
}

# 主函数
main() {
log “=== 开始备份任务 ===”

backup_database
backup_files
backup_configs
sync_to_remote
cleanup_old_backups

log “=== 备份任务完成 ===”
}

main
EOF

[root@fgedu-backup ~]# chmod +x /usr/local/bin/backup.sh

Part02-Rsync同步备份

2.1 Rsync服务器配置

# 配置Rsync服务器
[root@fgedu-backup-server ~]# cat > /etc/rsyncd.conf << 'EOF' uid = backup gid = backup use chroot = yes max connections = 10 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log timeout = 300 [backup] path = /data/backups comment = FGEDU Backup Server read only = no list = no auth users = backup secrets file = /etc/rsyncd.secrets hosts allow = 192.168.1.0/24 hosts deny = * [database] path = /data/backups/database comment = Database Backups read only = no auth users = dbbackup secrets file = /etc/rsyncd.secrets [files] path = /data/backups/files comment = File Backups read only = no auth users = filebackup secrets file = /etc/rsyncd.secrets EOF # 创建认证文件 [root@fgedu-backup-server ~]# cat > /etc/rsyncd.secrets << 'EOF' backup:Backup@123 dbbackup:DbBackup@123 filebackup:FileBackup@123 EOF [root@fgedu-backup-server ~]# chmod 600 /etc/rsyncd.secrets # 启动Rsync服务 [root@fgedu-backup-server ~]# systemctl enable rsyncd --now # 客户端同步脚本 [root@fgedu-app ~]# cat > /usr/local/bin/rsync-backup.sh << 'EOF' #!/bin/bash # rsync-backup.更多视频教程www.fgedu.net.cnsh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn RSYNC_SERVER="192.168.1.200" RSYNC_MODULE="backup" RSYNC_USER="backup" RSYNC_PASS="Backup@123" LOCAL_DIR="/data" EXCLUDE_FILE="/etc/backup/exclude.txt" # 创建密码文件 echo "$RSYNC_PASS" > /tmp/rsync.pass
chmod 600 /tmp/rsync.pass

# 同步数据
rsync -avz –delete \
–password-file=/tmp/rsync.pass \
–exclude-from=$EXCLUDE_FILE \
$LOCAL_DIR/ \
${RSYNC_USER}@${RSYNC_SERVER}::${RSYNC_MODULE}/$(hostname)/

# 清理密码文件
rm -f /tmp/rsync.pass

echo “同步完成: $(date)”
EOF

[root@fgedu-app ~]# chmod +x /usr/local/bin/rsync-backup.sh

# 创建排除文件
[root@fgedu-app ~]# cat > /etc/backup/exclude.txt << 'EOF' *.log *.tmp *.swp .cache/ .tmp/ node_modules/ vendor/ *.tar.gz *.zip EOF

Part03-Bacula企业备份

3.1 Bacula配置

# 安装Bacula
[root@fgedu-bacula ~]# yum install -y bacula-director bacula-storage bacula-console bacula-client

# 配置Director
[root@fgedu-bacula ~]# cat > /etc/bacula/bacula-dir.conf << 'EOF' Director { Name = fgedu-dir DIRport = 9101 QueryFile = "/etc/bacula/query.sql" WorkingDirectory = "/var/spool/bacula" PidDirectory = "/var/run" Maximum Concurrent Jobs = 20 Password = "Director@123" Messages = Daemon } Storage { Name = File Address = 192.168.1.200 SDPort = 9103 Password = "Storage@123" Device = FileStorage Media Type = File } Catalog { Name = MyCatalog dbname = "bacula"; dbuser = "bacula"; dbpassword = "Bacula@123" } FileSet { Name = "Full Set" Include { Options { signature = MD5 compression = GZIP } File = /var/www File = /etc File = /home } Exclude { File = /var/www/*/cache File = /var/www/*/logs File = *.tmp File = *.log } } Schedule { Name = "WeeklyCycle" Run = Full 1st sun at 2:00 Run = Differential 2nd-5th sun at 2:00 Run = Incremental mon-sat at 2:00 } Job { Name = "BackupWeb" Type = Backup Level = Incremental Client = web-fd FileSet = "Full Set" Schedule = "WeeklyCycle" Storage = File Messages = Standard Pool = Default Priority = 10 Write Bootstrap = "/var/spool/bacula/%c.bsr" } Job { Name = "RestoreFiles" Type = Restore Client = web-fd FileSet = "Full Set" Storage = File Messages = Standard Pool = Default Where = /restore } Pool { Name = Default Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 30 days Maximum Volume Bytes = 50G Maximum Volumes = 100 Label Format = "Vol-" } Messages { Name = Standard mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\” -s \”Bacula: %t %e of %c %l\” %r”
operatorcommand = “/usr/sbin/bsmtp -h localhost -f \”\(Bacula\) \<%r\>\” -s \”Bacula: Intervention needed for %j\” %r”
mail = ops@fgedu.net.cn = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
}
EOF

# 配置Storage Daemon
[root@fgedu-bacula ~]# cat > /etc/bacula/bacula-sd.conf << 'EOF' Storage { Name = fgedu-sd SDPort = 9103 WorkingDirectory = "/var/spool/bacula" Pid Directory = "/var/run" Maximum Concurrent Jobs = 20 } Device { Name = FileStorage Media Type = File Archive Device = /backup/bacula LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; } Messages { Name = Standard director = fgedu-dir = all } EOF # 启动Bacula [root@fgedu-bacula ~]# systemctl enable bacula-dir bacula-sd --now

Part04-恢复测试

4.1 恢复验证

# 创建恢复测试脚本
[root@fgedu-backup ~]# cat > /usr/local/bin/restore-test.sh << 'EOF' #!/bin/bash # restore-test.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn RESTORE_DIR="/tmp/restore-test" DATE=$(date +%Y%m%d) LOG_FILE="/var/log/backup/restore-test-${DATE}.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE } # 准备恢复目录 prepare_restore_dir() { rm -rf $RESTORE_DIR mkdir -p $RESTORE_DIR/{database,files,configs} log "恢复目录准备完成" } # 测试数据库恢复 test_database_restore() { log "测试数据库恢复..." LATEST_BACKUP=$(ls -t /backup/database/ | head -1) BACKUP_FILE="/backup/database/${LATEST_BACKUP}/fgedu_db-${LATEST_BACKUP}.sql.gz" if [ -f "$BACKUP_FILE" ]; then gunzip -c $BACKUP_FILE > $RESTORE_DIR/database/fgedu_db.sql
log “数据库备份解压成功”

# 检查SQL文件完整性
if grep -q “CREATE TABLE” $RESTORE_DIR/database/fgedu_db.sql; then
log “数据库文件完整性检查通过”
else
log “错误: 数据库文件完整性检查失败”
fi
else
log “错误: 找不到数据库备份文件”
fi
}

# 测试文件恢复
test_file_restore() {
log “测试文件恢复…”

LATEST_BACKUP=$(ls -t /backup/files/ | head -1)
BACKUP_FILE=”/backup/files/${LATEST_BACKUP}/web-files-${LATEST_BACKUP}.tar.gz”

if [ -f “$BACKUP_FILE” ]; then
tar -tzf $BACKUP_FILE > /dev/null 2>&1
if [ $? -eq 0 ]; then
log “文件备份完整性检查通过”
tar -xzf $BACKUP_FILE -C $RESTORE_DIR/files/
log “文件恢复测试成功”
else
log “错误: 文件备份损坏”
fi
else
log “错误: 找不到文件备份”
fi
}

# 测试配置恢复
test_config_restore() {
log “测试配置恢复…”

LATEST_BACKUP=$(ls -t /backup/configs/ | head -1)
BACKUP_FILE=”/backup/configs/${LATEST_BACKUP}/system-configs-${LATEST_BACKUP}.tar.gz”

if [ -f “$BACKUP_FILE” ]; then
tar -tzf $BACKUP_FILE > /dev/null 2>&1
if [ $? -eq 0 ]; then
log “配置备份完整性检查通过”
else
log “错误: 配置备份损坏”
fi
fi
}

# 生成报告
generate_report() {
log “=== 恢复测试报告 ===”
log “测试时间: $(dfrom PG视频:www.itpux.comate)”
log “数据库恢复: $(test -f $RESTORE_DIR/database/fgedu_db.sql && echo ‘成功’ || echo ‘失败’)”
log “文件恢复: $(test -d $RESTORE_DIR/files/fgedu && echo ‘成功’ || echo ‘失败’)”
log “配置恢复: $(test -f $RESTORE_DIR/configs/test && echo ‘成功’ || echo ‘失败’)”
log “=== 测试完成 ===”
}

# 主函数
main() {
prepare_restore_dir
test_database_restore
test_file_restore
test_config_restore
generate_report
}

main
EOF

[root@fgedu-backup ~]# chmod +x /usr/l学习交流加群风哥微信: itpux-comocal/bin/restore-test.sh

# 配置定期恢复测试
[root@fgedu-backup ~]# echo “0 4 * * 0 root /usr/local/bin/restore-test.sh” >> /etc/crontab

风哥针对备份恢复建议:

  • 实施3-2-1备份策略
  • 定期测试恢复流程
  • 配置异地备份
  • 加密敏感备份数据
  • 建立备份监控告警

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息