脚本自动备份

备份的原则

备份什么:数据、配置、操作系统、运行环境

往哪里备份:本地、远程、异地三个副本

怎么恢复备份:备份系统自动恢复、人工手动恢复

Shell脚本备份

最简单的备份,在需要备份的服务器上挂载一个存储空间,挂载到 /mnt 目录下,定期的将重要的资料拷贝到存储空间中。可以写一个shell脚本自动备份。

手动备份

备份脚本实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
####################################
#
# 备份脚本
#
####################################
# 备份源
backup_files="/opt/google" # 定义变量,要备份的文件目录
# 备份目标
dest="/backup" # 往存储空间备份到/backup目录下,注意:必须要有这个文件夹且要有写入权限
# 创建归档文件
day=$(date +%Y-%m-%d-%A-%T) # 以日期命名 备份
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"
# 显示备份状态
echo "Backing up $backup_files to $dest/$archive_file"
date
# 执行备份.
tar czPf $dest/$archive_file $backup_files

然后赋予脚本文件可执行权限

1
2
3
chmod u+x backup.sh      # 赋予脚本文件可执行权限

./backup.sh # 执行脚本文件

验证备份

1
tar -tzvf /backup/backup.tgz

还原

1
2
cd /
sudo tar -zxvf /backup/backup.tgz # 会将现有的文件覆盖

cron计划任务

  • 计划任务,在指定时间执行指定命令
  • 全局配置文件 /etc/crontab

配置:

1
2
3
4
5
6
7
8
9
10
11
12
crontab -l   # 查看当前用户的计划任务

sudo crontab -e # 以root账号运行

0 0 * * * bash /home/cwz/backup.sh # 配置说明如下:

m: 分钟(0-59)
h: 小时(0-23)
dom: 日期(1-31)
mon: 月份(1-12)
dow: 星期(0-7),0、7都表示星期日
command: 命令

备份计划

比如做半年的数据备份

  • 一两个月为周期滚动备份
  • 每月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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/bash
####################################
#
# 滚动备份计划
#
####################################

# 备份源
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# 备份目标
dest="/backup"

# 归档文件名变量(星期几 / 主机名).
day=$(date +%A)
hostname=$(hostname -s)

# 当前是每月中第几个星期
day_num=$(date +%-d)
if (( $day_num <= 7 )); then
week_file="$hostname-week1.tgz"
elif (( $day_num > 7 && $day_num <= 14 )); then
week_file="$hostname-week2.tgz"
elif (( $day_num > 14 && $day_num <= 21 )); then
week_file="$hostname-week3.tgz"
elif (( $day_num > 21 && $day_num < 32 )); then
week_file="$hostname-week4.tgz"
fi

# 单数月 / 双数月
month_num=$(date +%m)
month=$(expr $month_num % 2)
if [ $month -eq 0 ]; then
month_file="$hostname-month2.tgz"
else
month_file="$hostname-month1.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 $backup_files to $dest/$archive_file"
date
echo

# 使用 tar 命令备份
tar czPf $dest/$archive_file $backup_files

# 显示备份结束信息
echo
echo "Backup finished"
date

# 结束后查看备份文件大小
ls -lh $dest/

Rsync

Rsync用法

介绍

  • Linux下众多备份工具,但是rsync是必须掌握的一个
  • 在两个目录或两个主机之间同步文件
  • 从源同步到目标,但不双向同步
  • 支持增量备份,节省时间带宽源

增量备份(incremental backup)是备份的一个类型,是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。

简单使用

将源里的文件同步到目标文件。我们把源称为文件服务器,给我们提供服务器;目标好比客户端,从文件服务器上同步到我们的机器上。

文件服务器

1
2
3
# 创建文件做试验
mkdir sampledir
touch sampledir/file{1..10}

客户端同步

rsync在Linux发行版上基本上都默认安装的,如果没有在ubuntu上安装

1
sudo apt install rsync
  • rsync默认是明文协议,我们可以利用ssh加密的特性来使用。
  • 也可以使用ssh 基于密钥的方式
  • 默认使用增量接受传输文件的方式,receiving incremental file list
1
2
3
rsync -azP -e ssh cwz@172.16.247.128:~/sampledir/ backup/

# sampledir 后的/ 表示拷贝其中的所有内容,没有 / 表示拷贝该目录

注意点:

  • 服务器新增、修改文件后再次运行次命令,只有变更的部分同步。
  • 服务器删除文件后再次运行此命令,客户端不同步删除动作。

同步本地文件夹

rsync也支持在同一台机器上不同目录下同步

1
rsync /var/log/mysql ~/mysql_log_backup

计划任务

1
2
crontab -e
@daily rsync -azP -e ssh cwz@172.16.247.128:~/sampledir /backup

rsync的参数

1
rsync -azP -e ssh cwz@172.16.247.128:~/sampledir/ backup/
  • -r 递归拷贝目录内容,但不保留权限
  • -l 拷贝符号链接
  • -p 保留权限
  • -g 保留组所有者
  • -o 保留用户所有者
  • -D 保留设备文件
  • -v 显示详细信息
  • -a -a参数=rlptgoD的总和
  • -z 压缩
  • -P 生成进度文件,实现进程报告和断电续传
  • -e 指定远程shell类型,默认rsync是明文传输数据
  • —exclude filename 指定排除的文件名,这样就不同步filename文件
  • —exclude-from exe.txt 将不同步的文件名放入exe.txt文件,这样就不会同步多个文件
  • —include filename 指定包含的文件名
  • —include-from exe.txt 指定多个文件

SSH使用非标准端口

1
rsync -zaP -e "ssh -p 2222" source destination        # ssh在2222端口

rsync默认不删除目标文件

  • —delete 镜像源的内容,源文件删除目标文件也删除
  • —backup 删除 / 覆盖前 备份源文件(改名防删除)
  • —backup-dir 指定备份路径
  • —remove-source-files 成功传输后删除源文件
  • —dry-run 模拟执行命令,并输出结果(并不修改真正的文件)
1
2
rsync --remove-source-files -azPv src/ dest/
rsync --dry-run --remve-source-files -azPv src/ dest/

增量备份

1
2
3
4
5
6
7
8
9
10
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

其他工具

rsync本来不能双向同步

双向同步工具

1
2
3
sudo apt install unison

unison ~/sampledir ssh://172.16.247.128//home/cwz/documents

需要手动

实时同步工具

1
sudo apt install lsyncd      # lsyncd可以实现本地文件夹与云端文件夹实时同步
  • 实时监视本地文件目录变化
  • 默认使用rsync实现文件同步

SCP / SSHF

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:允许监视Director、File Daemon和Storage Daemon,仅限GTK+ GUI可用。

其他特性

  • Bacula可以单机部署,也可以分布式部署
  • 最新版本支持一次性写入介质和Amazon S3
  • 适合大型环境

安装Bacula

Bacula是模块化的,每个组件都可以独立安装。

安装数据库

1
2
3
4
5
6
7
sudo apt install bacula-director-pgsql    # 安装pgsql和连接数据库的脚本, 安装过程数据库密码不设,系统随机成功

sudo su postgres # 验证数据库
psql
\l
\c bacula
\d

安装Director

1
2
3
4
sudo apt install bacula-director   # 安装过程会强制安装Postfix

# 帧听在TCP 9101
sudo ss -pantu | grep 9101

修改帧听的ip地址

1
2
3
4
5
6
7
8
9
10
11
12
sudo vi /etc/bacula/bacula-dir.conf    # 主配置文件


Director {
#DIRport = 9101

#DirAddress = 127.0.0.1
DirAddresses = {
ip = { addr = 127.0.0.1; port = 9101; }
ip = { addr = 172.16.247.128; port = 9101; }
}
}

重启服务

1
sudo systemctl restart bacula-director.service

安装Storage Daemon

1
2
3
sudo apt install bacula-sd

sudo ss -pantu | grep 9103

修改帧听ip

Storage Daemon默认是帧听在 TCP 9103

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo vi /etc/bacula/bacula-sd.conf        # SD的配置文件

Storage { # definition of myself
Name = u-sd
#SDPort = 9103 # Director's port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/run/bacula"
Plugin Directory = "/usr/lib/bacula"
Maximum Concurrent Jobs = 20
#SDAddress = 127.0.0.1
SDAddresses = {
ip = { addr = 127.0.0.1;port = 9103; }
ip = { addr = 172.16.247.128;port = 9103; }
}
}

重启服务

1
sudo systemctl restart bacula-sd.service

安装File Daemon

1
sudo apt install bacula-fd

修改帧听ip

默认帧听在 TCP 9102

1
2
3
4
5
6
7
8
9
10
11
sudo vi /etc/bacula/bacula-fd.conf    # FD配置文件

FileDaemon { # this is me
Name = u-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /run/bacula
Maximum Concurrent Jobs = 20
Plugin Directory = /usr/lib/bacula
#FDAddress = 127.0.0.1
}

重启服务

1
sudo systemctl restart bacula-fd.service

在网络中其他计算机上安装FD

windows客户端下载FD:https://sourceforge.net/projects/bacula/files/

配置FD

如果客户端(比如说ubuntu桌面版)想和Bacula服务端进行通信,必须要经过身份认证。它们身份认证的方法是通过password的机制。

客户端配置

1
2
3
4
5
6
sudo vi /etc/bacula/bacula-fd.conf

Director {
Name = u-dir # 这里的Name必须要和服务端的一样
Password = "GNc-rPO3FhIlEuHYjLqrzICQrl_MHuHVG"
}

服务端配置

在Director添加客户端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo vi /etc/bacula/bacula-dir.conf

# 将client配置复制一份,修改
Client {
Name = Client-id
Address = 172.16.247.129
FDPort = 9102
Catalog = MyCatalog
Password = "GNc-rPO3FhIlEuHYjLqrzICQrl_MHuHVG" # password for FileDaemon
File Retention = 60 days # 60 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}

服务器端要指定客户端的名字,使用客户端的密码

客户端上要指定服务端的名字,两端的密码保持一致。

安装Console

1
2
3
4
5
sudo apt install bacula-console    #安装

sudo bconson # 进入控制台
show clients # 配置文件添加成功
status # 验证连接是否成功

Bacula备份

一些概念的介绍

  • Directive:指令,配置文件中定义资源中的语句或记录
  • 全部备份:数据完整的备份。
  • 差异备份:基于上一次完整备份后发生变化的内容的备份。
  • 增量备份:基于上一次完整、增量、差异备份之后的变化。
  • 备份任务 JOB(备份、还原、验证)
    • FileSet:备份什么
    • Client:备份哪台机器
    • Schedule:备份时间(周期)、备份类型(每周一全备,其余增量)
    • Pool:往哪里备份(一组volume)
    • Priority:多个JOb使用相同的schedule时,优先级决定谁先执行
    • JobDefs:Job模板,定义Job通用默认指令,可被Job定义覆盖
    • 默认包含一个Catalog的备份Job
  • Pools / Volumes / Labels
    • Volumes:一个物理磁带或一个文件,备份数据写入其中
    • Pool:组合的volumes
      • 使得备份不受单个卷(磁带)长度的限制
      • 备份时指定使用的 池 作为存储单元
      • Bacula依次使用池中的卷,或者 提示你挂载下一个卷
    • Pool资源在DIrector配置文件中定义,但由Catalog实际维护,包含组成池的所有卷的信息
    • 可分别创建每日备份池(增量备份)、每周备份池(全备)

纵览Director配置文件

1
sudo vi /etc/bacula/bacula-dir.conf
  • 有一个默认的JobDefs。存储storage,使用文件类型File1;
  • 在Job中定义备份任务,如果与JobDefs的不同,可以重新进行定义

添加Label Format 指定备份客户端

1
2
3
4
5
6
7
8
9
10
11
Pool {
Name = File
Label Format = "Vol-${Year}_${Month}_${Day}" # 备份文件名
}

Job {
Name = "BackupClient1"
JobDefs = "DefaultJob"
Level = Full
Client=u-fd
}

指定备份文件

1
2
3
4
5
6
7
sudo vi /etc/bacula/bacula-sd.conf

Device {
Name = FileChgr1-Dev1
Media Type = File1
Archive Device = /backups # 需要可写权限
}

运行备份

1
2
3
bconsole 
run
BackupClient1

查看备份任务状态

1
2
3
4
bconsole
status
director
list jobs