虽然大部分时候都是不作不死,不过在很多时候程序的崩溃也是让人措不及手啊。自动化的备份和同步必须要有。
我没有什么很复杂的应用程序或者数据库需要备份,都是简单的文件备份(包括常规数据库)。
因为我服务器一切皆容器,数据全部通过数据卷挂载,所以我要做的事情仅仅只是打包文件夹,增量备份并同步,仅此而已。
tar 命令
tar 命令是通用性较强的 Unix/Linux 归档命令。tar 将一个或多个文件和目录打包为单个文件,并保持原始文件的大小、拥有者、权限、文件类型及其在文件系统层次结构中的位置。tar 是最易用的数据备份实用程序。
参数 | 含义 |
---|---|
-c | 该参数会创建一个新的存档 |
-v | 该参数会列出每个处理的文件名称 |
-f | 该参数会指定存档或设备名称 |
-z | 该参数将用 gzip 对存档进行压缩或解压 |
-x | 该参数将从存档文件中提取一个或多个文件 |
–exclude | 排除不打包的目录或文件,支持正则匹配 |
要创建 /Data 的存档文件,使用:
# tar -czvf backup.tar.gz /Data/
要恢复该目录,使用:
# tar -xzvf backup.tar.gz /Data/
tar 在提取文件和较小的目录方面表现不错,如果要恢复文件系统和卷组,我们更倾向于选用 cpio, 或是使用专用性更强的 Linux/Unix 数据备份实用程序。
tar 提供了增量压缩的功能
备份当前目录下的所有文件:
# tar -g /data.snap -zcpf /data-$(date +%Y-%m-%d_%H).tar.gz .
在需要恢复的目录下解压恢复:
# tar -zxpf /data-****.tar.gz -C .
如果归档文件太大,可以分割压缩:
# tar -g /data.snap -zcpf - --exclude=./cache ./ | split -b 1024M - /data-$(date +%Y-%m-%d_%H).tar.gz_
分割后文件名后会依次加上aa,ab,ac,…,上面最终的备份归档会保存为以下的格式(每个归档文件最大 1024MB):
data-2017-02-07_22.tar.gz_aa
data-2017-02-07_23.tar.gz_ab
data-2017-02-07_24.tar.gz_ac
恢复备份的档案文件:
# cat data-2017-02-07_24.tar.gz_* | tar -zxpf - -C /tmp/data/
恢复增量备份的档案文件(可以一直逆向恢复到你想要恢复的时间点):
$ tar –zxpf /data-2017-02-07_24.tar.gz -C /Data
$ tar –zxpf /data-2017-02-07_23.tar.gz -C /Data
$ tar –zxpf /data-2017-02-07_22.tar.gz -C /Data
一定要保证是按时间逆序恢复的,这一点挺麻烦的,不过可以使用上面通配符的形式自动恢复到指定日期。
cpio 命令
cpio 与 tar 类似,是通用性较强的 Unix/Linux 归档命令。一般被用来备份和恢复文件及目录结构。
参数 | 含义 |
---|---|
-o | 该参数会将数据拷贝到文件或设备中 |
-i | 该参数会将数据从文件或设备中还原到系统中 |
-v | 该参数会列出每个处理的文件名称 |
-z | 该参数会按需要建立目录 |
-x | 该参数会从标准输入读取文件路径名称,然后将这些文件复制到指定的目录 |
-d | 该参数会按需要建立目录 |
-p | 该参数会从标准输入读取文件路径名称,然后将这些文件复制到指定的目录 |
-B | 该参数会将 I/O block 增加到 5120bytes,默认是 512bytes。加快数据备份速度 |
-m | 该参数会保留时间属性 |
-u | 该参数自动将较新的文件替换到较旧的文件 |
将 /Date 目录和它的所有文件和子目录建立存档,使用:
# find /Data/ -depth | cpio -ov > backup.cpio
cpio 无法直接读取文件,它需要每个文件或者目录的完整路径名才能识别读取,而 find 命令的输出刚好做到了这点,因此,cpio 命令一般和 find 命令配合使用。
要恢复该目录,使用:
# cpio -ivdum < backup.cpio
cpio 建立起来的归档文件包括文件头和文件数据两部分。文件头包含了对应文件的信息。如文件的 UID,GID,连接数以及文件大小等。其好处是可以保留硬连接,在恢复时默认情况下保留时间戳,无文件名称长度的限制。
我喜欢用这个工具备份,简单粗暴,毕竟我数据不是很多。
参考链接:
rsync
如果将数据备份与远程传输结合起来,譬如 scp,就可以实现数据的远程备份。但通常的备份方法,都无法对本地和远程目录中的内容进行同步。
rsync(Remote Sync)是 Unix/Linux 系统下一款优秀的数据备份与同步工具。它可以对文件集进行同步。然而更有价值的是,rsync 使用文件的增量,也就是说,它在网络中仅发送两个文件集合有区别的部分。这样可以占用更少的带宽,并且速度更快。
rsync 的特性:
- 能够更新整个目录树和文件系统
- 保持原文件的权限,时间,软硬链接
- 安装无需特殊权限
- 优化的流程,文件传输速率高
- 可以通过直接的 socket 连接传输文件,或者选择 rsh,ssh 等方式
- 支持匿名传输
|参数|含义|
|-a|该参数表示以递归方式传输文件,并保持所有文件属性|
|-v|该参数显示详细的传输处理|
|-z|该参数对备份的文件在传输时进行压缩处理|
|-P|该参数将显示备份过程|
使用方法烂大街不想说,而且我也不用这个,效率不高。需要实现自动备份还需要靠inotify-tools这种工具配合。
比如这篇教程:Linux 下同步工具 inotify+rsync 使用详解
qshell
因为你用七牛存储文件,可以用这个工具同步文件。
https://developer.qiniu.com/kodo/tools/qshell
其他
像 Google Driver、Dropbox、百度云都有终端的工具,自己同步就好,这类工具的自动检测文件夹比传统 Linux 传输工具好用。
自动执行?Crontab 啊!
我懒,直接丢个链接:
Crontab – 定时任务必备招式