1. 首页 > Linux教程 > 正文

Linux教程FG248-企业服务备份策略

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

风哥提示:

本文档详细介绍企业服务的备份策略和实施方案。

Part01-备份策略规划

1.1 备份类型

# 备份类型
1. 完全备份:备份所有数据
– 优点:恢复学习交流加群风哥微信: itpux-com简单,数据完整
– 缺点:占用空间大,备份时间长

2. 增量备份:备份变化的数据
– 优点:占用空间小,备份速度快
– 缺点:恢复复杂,依赖前次备份

3. 差异备份:备份自上次完全备份后的变化
– 优点:恢复相对简单
– 缺点:占用空间逐渐增大

# 备份策略
1. 3-2-1备份原则
– 3份备份副本
– 2种不同介质
– 1份异地备份

2. 备份周期
– 每日:增量备份
– 每周:差异备份
– 每月:完全备份

3. 备份保留
– 日备份:保留7天
– 周备份:保留4周
– 月备份:保留12个月
– 年备份:永久保留

# 备份对象
1. 系统配置
– /etc目录
– 用户账户信息
– 服务配置文件

2. 应用数据
– 数据库数据
– Web应用文件
– 日志文件

3. 用户数据
– 用户主目录
– 共享文件
– 邮件数据

Part02-系统备份

2.1 使用tar备份

# 完全备份
$ sudo tar -czpf /backup/system-full-$(date +%Y%m%d).tar.gz \
–exclude=/backup \
–exclude=/proc \
–exclude=/sys \
–exclude=/dev \
–exclude=/tmp \
–exclude=/run \
–exclude=/mnt \
–exclude=/media \
–exclude=/var/cache \
–exclude=/var/tmp \
/

# 增量备份
$ sudo tar -czpf /backup/system-incr-$(date +%Y%m%d).tar.gz \
–listed-incremental=/backup/snapshot.snar \
–exclude=/backup \
–exclude=/proc \
–exclude=/sys \
–exclude=/dev \
–exclude=/tmp \
–exclude=/run \
–exclude=/mnt \
–exclude=/media \
–exclude=/var/cache \
–exclude=/var/tmp \
/

# 差异备份
$ sudo tar -czpf /backup/system-diff-$(date +%Y%m%d).tar.gz \
–listed-incremental=/backup/snapshot-full.snar \
–exclude=/backup \
–exclude=/proc \
–exclude=/sys \
–exclude=/dev \
–exclude=/tmp \
–exclude=/run \
–exclude=/mnt \
–exclude=/media \
–exclude=/var/cache \
–exclude=/var/tmp \
/

# 恢复系统
$ sudo tar -xzpf /backup/system-full-20260404.tar.gz -C /

# 查看备份内容
$ tar -tzf /backup/system-full-20260404.tar.gz | head -20
etc/
etc/mtab
etc/fstab
etc/passwd
etc/shadow
etc/group
etc/gshadow
etc/hosts
etc/resolv.conf
etc/hostname

Part03-数据库备份

3.1 MySQL备份

# 逻辑备份
$ mysqldump -u root -p –all-databases > /backup/mysql-all-$(date +%Y%m%d).sql
Enter password:

$ mysqldump -u root -p –databases mydb > /backup/mysql-mydb-$(date +%Y%m%d).sql
Enter password:

$ mysqldump -u root -p –single-transaction –routines –triggers –events mydb > /backup/mysql-mydb-full-$(date +%Y%m%d).sql
Enter password:

# 物理备份
$ sudo systemctl stop mysqld
$ sudo tar -czpf /backup/mysql-physical-$(date +%Y%m%d).tar.gz /var/lib/mysql
$ sudo systemctl start mysqld

# 使用Percona XtraBackup
$ sudo dnf install -y percona-xtrabackup-80

$ xtrabackup –backup –target-dir=/backup/xtrabackup/full
xtrabackup: recognized server arguments: –innodb_buffer_pool_size=4G –innodb_log_file_size=1G
xtrabackup: recognized client arguments:
230404 01:30:00 version_check Connecting to MySQL server with DSN ‘dbi:mysql:;mysql_read_default_group=xtrabackup’ as ‘root’ (using password: YES).
230404 01:30:00 version_check Connected to MySQL server
230404 01:30:00 version_check Executing a version check against the server…
230404 01:30:00 version_check Done.
230404 01:30:00 Connecting to MySQL server host: localhost, user: root, passwofrom PG视频:www.itpux.comrd: set, port: not set, socket: not set
Using server version 8.0.32
230404 01:30:00 Executing LOCK TABLES FOR BACKUP…
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql/
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
230404 01:30:00 Starting to parse redo log at lsn = 12345678901234
230404 01:30:00 >> log scanned up to (12345678901234)
230404 01:30:00 Executing LOCK BINLOG FOR BACKUP…
230404 01:30:00 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS…
230404 01:30:00 Adding SLAVE LOCK for backup
230404 01:30:00 Executing FLUSH NO_WRITE_TO_BINLOG TABLES…
230404 01:30:00 Acquiring FTWRL…
230404 01:30:00 Starting to backup non-InnoDB tables and files
230404 01:30:00 [00] Copying /var/lib/mysql/mysql.ibd to /backup/xtrabackup/full/mysql.ibd
230404 01:30:00 [00] …done
230404 01:30:00 [00] Copying /var/lib/mysql/sys/sys_config.ibd to /backup/xtrabackup/full/sys/sys_config.ibd
230404 01:30:00 [00] …done
230404 01:30:00 Finished backing up non-InnoDB tables and files
230404 01:30:00 Executing FLUSH NO_WRITE_TO_BINLOG TABLES…
230404 01:30:00 Executing UNLOCK TABLES
230404 01:30:00 All tables unlocked
230404 01:30:00 [00] Copying ib_buffer_pool to /backup/xtrabackup/full/ib_buffer_pool
230404 01:30:00 [00] …done
230404 01:30:00 Backup created in directory ‘/backup/xtrabackup/full’
MySQL binlog position: filename ‘mysql-bin.000001’, position ‘12345’, GTID of the last change ‘12345678-1234-1234-1234-123456789012:1-100’
230404 01:30:00 [00] Writing /backup/xtrabackup/full/backup-my.cnf
230404 01:30:00 [00] …done
230404 01:30:00 [00] Writing /backup/xtrabackup/full/xtrabackup_info
230404 01:30:00 [00] …done
xtrabackup: Transaction log of lsn (12345678901234) to (12345678912345) was copied.
230404 01:30:00 completed OK!

# 恢复数据
$ xtrabackup –prepare –target-dir=/backup/xtrabackup/full
$ xtrabackup –copy-back –target-dir=/backup/xtrabackup/full
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo systemctl start mysqld

Part04-自动化备份

4.1 备份脚本

# 创建备份脚本
$ sudo tee /usr/local/bin/backup.sh << 'EOF' #!/bin/bash BACKUP_DIR="/backup" DATE=$(date +%Y%m%d) LOG_FILE="/var/log/backup.log" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> $LOG_FILE
}

log “Starting bac学习交流加群风哥QQ113257174kup process”

mkdir -p $BACKUP_DIR/{system,mysql,web}

log “Backing up system configuration”
tar -czpf $BACKUP_DIR/system/etc-$DATE.tar.gz /etc 2>> $LOG_FILE

log “Backing up MySQL databases”
mysqldump -u root -pMyPassword123 –all-databases | gzip > $BACKUP_DIR/mysql/all-$DATE.sql.gz 2>> $LOG_FILE

log “Backing up web files”
tar -czpf $BACKUP_DIR/web/www-$DATE.tar.gz /var/www 2>> $LOG_FILE

log “Cleaning old backups”
find $BACKUP_DIR -name “*.tar.gz” -mtime +7 -delete >> $LOG_FILE 2>&1
find $BACKUP_DIR -name “*.sql.gz” -mtime +7 -delete >> $LOG_FILE 2>&1

log “Backup completed successfully”

TOTAL_SIZE=$(du -sh $BACKUP_DIR | awk ‘{print $1}’)
log “Total backup size: $TOTAL_SIZE”
EOF

chmod +x /usr/local/bin/backup.sh

# 配置定时备份
$ sudo tee /etc/cron.d/backup << EOF # 每日凌晨2点执行备份 0 2 * * * root /usr/local/bin/backup.sh EOF # 验证备份 $ sudo /usr/local/bin/backup.sh $ cat /var/log/backup.log 2026-04-04 01:35:00 Starting backup process 2026-04-04 01:35:00 Backing up system configuration 2026-04-04 01:35:01 Backing up MySQL databases 2026-04-04 01:35:02 Backing up web files 2026-04-04 01:35:03 Cleaning old backups 2026-04-04 01:35:03 Backup completed successfully 2026-04-04 01:35:03 Total backup size: 1.5G # 远程备份 $ sudo tee /usr/local/bin/remote-backup.sh << 'EOF' #!/bin/bash BACKUP_DIR="/backup" REMOTE_SERVER="backup@fgedu.net.cn:/backup/remote" DATE=$(date +%Y%m%d) rsync -avz --delete $BACKUP_DIR/ $REMOTE_SERVER/$DATE/ 2>&1 | logger -t backup
EOF

chmod +x /usr/local/bin/remote-backup.sh

# 配置SSH密钥认证
$ sudo -u root ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa -N “”
$ sudo -u root ssh-copy-id backup@fgedu.net.cn

Part05-备份验证

5.1 备份测试

# 验证备份完整性
$ sudo tee /usr/local/bin/verify-backup.sh << 'EOF' #!/bin/bash BACKUP_DIR="/backup" LOG_FILE="/var/log/backup-verify.log" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> $LOG_FILE
}

log “Starting backup verification”

for file in $BACKUP_DIR/**/*.tar.gz; do
log “Verifying $file”
if tar -tzf $file > /dev/null 2>&1; then
log “OK: $file is valid”
else
log “ERROR: $file is corrupted”
fi
done

for file in $BACKUP_DIR/**/*.sql.gz; do
log “Verifying $file”
if gzip -t $file 2>&1; then
log “OK: $file is valid”
else
log “ERROR: $file is corrupted”
fi
done

log “Backup verification completed”
EOF

chmod +x /usr/local/bin/verify-backup.sh

# 测试恢复
$ sudo mkdir -p /restore/test
$ sudo tar -xzpf /backup/system/etc-20260404.tar.gz -C /restore/test

$ mysql -u root -p -e “CREATE DATABASE restore_test;”
$ gunzip < /backup/mysql/all-20260404.sql.gz | mysql -u root -p restore_test # 备份报告 $ sudo tee /usr/local/bin/backup-report.sh << 'EOF' #!/bin/bash BACKUP_DIR="/backup" EMAIL="admin@fgedu.net.cn" cat << EOM | mail -s "Backup Report - $(date +%Y%m%d)" $EMAIL Backup Report ============= Date: $(date) Hostname: $(hostname) Backup Summary: $(du -sh $BACKUP_DIR/* 2>/dev/null)

Total Size: $(du -sh $BACKUP_DIR | awk ‘{print $1}’)

Latest Backups:
$(find $BACKUP_DIR -name “*.tar.gz” -mtime -1 -ls 2>/dev/null)
$(find $BACKUP_DIR -name “*.sql.gz” -mtime -1 -ls 2>/dev/null)

Backup Status: SUCCESS
EOM
EOF

chmod +x /usr/local/bin/backup-report.sh

风哥针对备份建议:
1. 定期测试备份恢复
2. 异地备份重要数据
3. 加密敏感备份数据
4. 监控备份任务状态
5. 保留足够的备份历史

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

联系我们

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

微信号:itpux-com

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