备份还原
备份是免于损失的有效手段
防火防盗防自己(保持良好睡眠)
版本管理也视为一种备份(上下文不同)
备份还原基础
首先考虑问题
1. what to backup
2. where to back
1
2
|
本地、远程、异地三个副本
磁盘、光盘、磁带、一次性写入介质
|
3. how to restore it
备份方式
Shell脚本手动备份
tar打包压缩减小备份文件大小
写个简单的shell脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
## 如脚本内容,对指定目录打包
#!/bin/bash
#备份源
backup_files="/opt/google /etc/Documents"
#备份目标
dest="/backup"
#创建归档文件(主机名-时间)
day=$(date +%Y-%m-%d-%A-%T)
hostname=$(hostname -s)
archive_file="$hostnane-$day.tgz"
#显示备份状态
echo "Backing up $backup_files to $dest/$archive_file"
date
#执行备份.
tar czPf $dest/$archive_file $backup_files
|
然后手动运行shell脚本(或做一个定时任务crontab)
1
2
|
chmod u+x backup.sh
./backup.sh
|
问题:在业务繁忙时候,影响服务器性能和网络带宽,影响正常业务运行(所有基于业务空闲时候来决定备份时间)
验证备份
1
|
tar -tzvf /backup/backup.tgz
|
还原/恢复
1
2
3
4
5
6
|
# 解压到指定目录
tar -zxvf /backup/backup.tgz -C /tmp
# 解压到原目录(会覆盖已有文件)
cd /
sudo tar -zxvf /backup/host-Monday.tgz
|
Shell脚本自动备份
cron计划任务
配置文件:/etc/crontab
配置
1
2
3
4
5
6
7
8
|
sudo crontab -e # 这里是root权限运行(不同用户有自己的计划任务)
30 23 0 * * 1 /bin/bash /home/xps/backup.sh # 每周一的23:30执行
# 分(m,0-59) 时(h,0-23) 日(dom,1-31) 月(mon,1-12) 周(dow,0-7) 命令(command)
# ctrl + o 保存, ctrl + x 退出
crontab -l # 查看当前用户已有计划任务列表
|
全量滚动备份计划
例如:每天做一个日备份,到一周就合并为一个周备份,到一个月就合并为一个月备份
1
2
3
4
5
|
两个月为周期滚动备份
每月1日执行月备份
每周六执行周备份
每天进行日备份
6个日备份 + 4个周备份 + 2个月备份
|
脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#备份源
backup_files=" /home /var/spool/mail /etc /root /boot /opt"
#备份目标
dest="/backup"
#归档文件名变量(星期几 / 主机名).
day=$(date +%A)
hos tnane=$(hostname -s)
#当前是每月中第几个星期
day_nun=S(date +%-d)
if (( $day .nun <= 7 )); then
week_file= "$hostname -week1.tgz"
ellf (( $day_num > 7 & $day_nun <= 14 )); then
week_file="$hostname -week2.tgz "
elif (( $day_nun >14 && $day_nun <= 21 )); then
week_file=" $hostname -week3.tgz"
elif ( $day_num >21 && $day_num < 32 )); then
week_file=" hostname -week4. tgz"
fi
#单数月 / 双数月
nonth_num=$(date +%m)
month=$(expr $month_num % 2) # 如果余数
if [ $month -eq θ ]; then # 如果余数等于0
nonth_file="$hostname - nonth2.tgz"
else
month_file="$hostname -nonth1.tgz"
fi
#创建归档文件(每月1日-->月备份、 每周六-->周备份、每天-->日备份)
if [ $day_num == 1 ]; then
archive_file=$month_file
elif [ $day != "Saturday" ]; then
archive_file=" $hostname -$day.tgz"
else
archive_file=$week_file
fi
#显示备份开始信息
echo "Backing up Sbackup_ ftles to $dest/$archive_file"
date
echo
#使用tar命令备份
tar CzPf $dest/$archive_file $backup_files
#显示备份结束信息
echo
echo "Backup fintshed "
date
#结束后查看备份文件大小
ls -lh $dest/
|
也可以加入到计划任务里面执行
缺陷:
- 每个备份都是完整备份
- 备份时间长,磁盘空间占用量大
增量差异备份
Rsync
- Linux 下众多备份工具,只rsync是必须掌握的一个
- 在两个目录或两个主机之间同步文件( 从源
单向
同步到目标,但不双向同步)
- 支持增量备份,节省时间带宽源
- 参数众多
- 学习时建议使用例子文件(使用不当可能破坏文件)
- 还原时:先把最前面的完整备份还原,然后依次还原后面的增量备份
文件服务器
1
2
3
|
# 创建演示文件
mkdir sampledir
touch sampledir/file{1..10}
|
客户端同步(下拉
)
1
2
3
4
5
6
7
8
9
|
# 安装
apt install rsync
# 同步服务端的文件
rsync -azP -e ssh xps@1.1.1.1:~/sampledir backup/
# 也可以基于密钥、密码身份认证
# sampledir 后的/表示拷贝其中所有内容,没有/表示拷贝该目录
#服务端新增、修改文件后再次运行此命令,只有变更的部分同步
#服务器断删除文件后再次运行此命令,客户端不同步删除动作
|
同步本地文件夹到服务端
1
2
|
# 源 目标
rsync /var/log/mysql ~/mysql_log_backup
|
计划任务
1
2
3
|
# 每天执行计划任务执行rsync
crontab -e
@daily rsync -azPe ssh xps@1.1.1.1:~/sampledir /backup
|
向上同步(推
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
rsync -azP -e ssh backup/ xps@1.1.1.1:~/sampledir
-a =-rlptgoD # 归档,保留修改时间戳、符号链接、权限等元数据
-r # 递归拷贝目录内容(不保留权限)
-l # 拷贝符号链接
-p # 保留权限
-g # 保留组所有者
-o # 保留用户所有者
-D # 保留设备文件
-v # 显示详细信息
-z # 压缩
-P # 生成进度文件,实现进程报告和断点续传
-e # 指定远程shell类型,默认rsync明文传输数据
--exclude pattern # 指定排除的文件名
--exclude-from filename.txt # 排除文件名的特征文件(把几个文件名写到一个文件里面)
--include pattern # 指定包含的文件名
--include-from filename
# 排除文件
rsync -azP --exclude 'dir*' source/ destination/
rsync -azP --exclude-from 'exclude-list.txt' source/ destination/
# SSH非标准端口
rsync -azP -e "ssh -P port_number" source destination
|
rsync默认不删除目标文件
1
2
3
4
5
6
7
8
|
--delete #镜像源目的内容,源删文件目的也删
--backup #删除/覆盖前备份源文件(改名防覆盖)
--backup-dir #指定备份路径
--remove-source-files #成功传输后删除来源文件
--dry-run #模拟执行命令,并输出结果(并不真正修改文件)
rsync --remove-source-files -azPv srcl dest/
rsync --dry-run --remove-source-files -azPv src/ dest/
|
增量备份:
1
2
3
4
5
6
7
8
|
# touch backup.sh
# chmod +x backup.sh
# mv backup.sh usr/local/bin
# vi backup.sh
#/bin/bash
CURDATE=$(date +%Y-%m-%d)
rsync -avb --delete --backup-dir=/backup/$CURDATE /src /dest
|
其他工具
双向同步工具
1
2
|
sudo apt install unison
unison ~lsampledir ssh:l/1.1.1.1//homelyuanfh/documents
|
实时同步工具
1
2
3
4
|
sudo apt install lsyncd
#lsyncd实时监视本地文目录变化
#默认使用Rsync实现文件同步SCP / SSHFS
#参考以前章节内容
|
SCP/SSHFS
Bacula
简介
Bacula 是一款开源的跨平台网络备份工具,它提供了基于企业级的客户端/服务器的备份恢复解决方案。通过它,系统管理人员可以对数据进行备份、恢复,以及完整性验证等操作。同时,它还提供了许多高级存储管理功能,使系统管理人员能够很容易发现并恢复丢失的或已经损坏的文件。正因如此,Bacula 也被誉为最好的开源企业级备份工具。
- 基于网络的开源备份、还原、验证软件
- 对标商业备份软件的功能
- 客户端支持Windows(很久不更新了,主在其他系统)、Linux、Unix、MAC有多个开源工具组合而成
- 软件架构
- Director :主进程,控制所有备份、恢复、验证、归档操作
- Console:管理员于Director通信的操作借口,分为三种类型
- 基于文本的命令行版本(完全的功能)
- 基于Gnome GTK+的GUI版本(大部分功能)
- wxWidgets GUI版本(大部分功能)
- File Daemon : Bacula客户端程序,安装在需要备份的计算机上
- 负责在Director请求时提供文件属性和数据
- 恢复阶段负责恢复文件属性和数据,以后台进程的形式运行
- Storage Daemon :读写备份存储介质,执行数据存储和恢复
- Catalog :为所有备份文件维护索引和卷数据库
- 快速定位和恢复归档文件
- 支持 MySQL、PostgreSQL、SQLite
- 摘要信息(备份任务、客户端、被备份的文件以及他们存放在哪个卷上)
- 不存放被备份的文件本身
- 是bacula区别于简单备份工具的关键
- Monitor :允许监视Dir、FD和SD(仅GTK+ GUI可用)
- C/S、模块化结构,可单机或分布式部署
最新版支持一次性写入介质和Amazon s3
- 适合大型环境
安装配置
1.安装数据库
1
2
3
4
5
6
7
8
9
|
sudo apt install bacula-director-pgsql
# 各种根据自己情况选项
# 数据库安装在远程还是本地,创建数据库账号的密码或直接回车他自己会随机生成
sudo su postgres
psql
\l # 可以查看库
\c bacula # 连接上这个库
\d
|
2.安装 Director
1
2
3
4
5
6
7
|
# 和上面的数据库是可以不安装在一台机器上的
sudo apt install bacula-director
#-随机生成数据库密码
#-依赖Postfix(后期配置)
#-侦听TCP9101
|
2.1修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#1.主配置文件
# vim /etc/bacula/bacula-dir.conf
# 如果要所有网卡都侦听9101,则直接注释当前DirAddress即可
# 否则有多高个网卡要侦听不同的端口,还需要在Director下增DirAddresses,并注释之前的DIRport
Director {
#......
DirAddresses ={
ip = { addr = 127.0.0.1;port = 9101;}
ip = { addr = 192.168.1.1; port = 9101;}
}
}
#2.重启服务
sudo systemctrl restart bacula-director
|
3.安装SD(storage)
1
2
|
sudo apt install bacula-sd
# 默认监听tcp 9013端口
|
同样也需要修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
|
#1.SD配置文件
# vim /etc/bacula/bacula-sd.conf
#SDAddress和SDPort注释掉,并和上面一样增加
Strage {
#......
SDAddress ={
ip = { addr = 127.0.0.1;port = 9101;}
ip = { addr = 192.168.1.1; port = 9101;}
}
}
#2.重启服务
sudo systemctrl restart bacula-sd
|
4.安装FD(客户端)
1
2
3
|
sudo apt install bacula-fd
#
|
配置
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# /etc/bacula/bacula-fd.conf
# 1.FD配置
FileDaemon {
#FDAddress = 127.0.0.1
# 这个机器所有ip都侦听9102端口
}
#仅客户端安装
#2.重启服务
sudo systemctrl restart bacula-fd
#默认监听TCP 9102
|
在网络中其他计算机上安装FD Windows客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#配置FD
## 客户端配置
#sudo vi /etc/bacula/bacula-fd.conf
Director {
Name = Server-dir # 指定服务器的名字Name
Password= "FmvH" #
#director:
}
## 服务器端配置
# sudo vi /etc/bacula/bacula-dir.conf
Client {
Name = Client-fd # 指定客户器的名字Name
Address = 192.168.1.2
Password ="FmvH" #
}
|
5.安装Console
1
2
3
4
5
|
sudo apt install bacula-console
sudo bconson #进入控制台
show clients #配置文件添加成功
status #验证连接是否成功
|
使用
一些名词:
1
2
3
4
5
|
level = Full # 全量备份
File = xxxx # 要备份的目录
Schedule {} # 指定备份周期
|
执行磁盘备份(文件)
添加Lable/指定备份客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# sudo vi /etc/bacula/bacula-dir.conf
Pool {
Name = File
Label Format = "Vol-S{Year}_${Month}_${Day}" #备份文件名称格式,便于识别和管理
}
Job {
Name = "BackupClient1"
JobDefs = "DefaultJob"
Level = Full
Client = client-fd
}
|
指定备份位置
1
2
3
4
5
6
7
8
9
10
11
12
|
# sudo vi/etc/bacula/bacula-sd.conf
#
Device {
Name = FileChgr1-Dev1
Archive Device = /backups #需要可写权限
}
Device {
Name = FileChgr1-Dev2
Archive Device = /backups2 #需要可写权限
}
|
运行备份
1
|
bconsole - run - BackupClient1
|
查看备份任务状态
1
2
|
bconsole - status - director — list jobs
message #查看成功/报错详细信息
|
配置FileSet
1
2
3
|
FileSet {
File = /usr/sbin
}
|
报错等待连接存储
1
2
3
4
5
6
7
|
sudo vi letc/bacula/bacula-dir.conf
Autochanger {
Name = File1
#Do not use "localhost"" here
Address = 192.168.1.1 #此处不要使用localhost
}
|
Bacula 通知fd向sd存储数据,若sd侦听于localhost,网络不通