LinuxShell脚本之利用rsync+ssh实现Linux文件系统远程备份

简介:

功能介绍:

该脚本用于定期(结合crontab一起使用)将本地目录通过rsync+ssh传输到远程服务器,每次执行都生成一个带有以时间命名的目录,并且当前最新版本的数据链接到一个名字叫current的符号链接上,便于查找和恢复。在数据传输完成前,会传输到临时目录下,这个临时目录被命名为“时间-incomplete”。超过10天的备份将被删除,超过10天的日志文件也将被删除。

运行原理:

脚本运行的核心就在于ssh的互信和rsync命令。利用rsync能实现压缩传输,节省传输时间。

感谢:

感谢gregrs-uk提供的初始脚本

脚本内容:

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env bash
# Function description:
# Backup filesystem using rsync
 
# Usage:
# bash backup.sh
 
# Birth Time:
# 2016-07-15 16:13:43.895515929 +0800
 
# Author:
# Open Source Software written by 'Guodong Ding <dgdenterprise@gmail.com>'
# Blog: http://dgd2010.blog.51cto.com/
# Github: https://github.com/DingGuodong
 
# Others:
# crontabs -- configuration and scripts for running periodical jobs
# SHELL=/bin/bash
# PATH=/sbin:/bin:/usr/sbin:/usr/bin
# MAILTO=root
# HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
# m h  dom mon dow   command
# execute on 11:59 per sunday
# 59 11 * * */0 bash /path/to/backup.sh >/tmp/log_backup_fs_crontab_$(date +"\%Y\%m\%d\%H\%M\%S").log
# or
# execute on 23:59 per day
# 59 23 * * * bash /path/to/backup.sh >/tmp/log_backup_fs_crontab_$(date +"\%Y\%m\%d\%H\%M\%S").log
 
USER= "`id -un`"
LOGNAME= "$USER"
if  [ $UID - ne  0 ];  then
     echo  "WARNING: Running as a non-root user, \"$LOGNAME\". Functionality may be unavailable. Only root can use some commands or options"
fi
 
old_PATH=$PATH
declare  -x PATH= "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
 
# Snapshot backup script
# Refer: https://github.com/gregrs-uk/snapshot-backup/
 
# directories to backup, separated by spaces
datadir_to_backup= "/data/docker"
# backup location on remote server
# This path should not contain spaces, even if they are escaped
remote_destination= "/data/backup/filesystem/10.6.28.135"
# ssh login to remote server
backup_server= "root@10.6.28.28"
# set ssh options for backup server
ssh_option= "-i /etc/ssh/ssh_host_rsa_key -p 22 -oStrictHostKeyChecking=no"
# log dir on local machine
#log_directory="/tmp/backup-filesystem-10.6.28.135"
log_directory= "/tmp/"
# exclude file on local machine
exclude= ""
 
 
# ------ END OF CONFIGURATION VARIABLES ------
 
# the following two variables should not need modification
datetime=` date  +%Y%m%d%H%M%S`
date =` date  +%Y%m%d`
 
# set log_directory for local backup logs
test  -d ${log_directory} ||  mkdir  -p ${log_directory}
 
# check directories exist and are accessible
ssh  ${ssh_option} ${backup_server}  "test -e $remote_destination || mkdir -p $remote_destination"
 
# make directory for this snapshot
ssh  ${ssh_option} ${backup_server}  "mkdir $remote_destination/$datetime-incomplete"  || {  echo  "Could not create snapshot directory" exit  1; }
 
# Refer:
#rsync -u -r -v -e ssh --progress --delete --chmod=D775 /path/to/documents/* your_server_name@your_domain:~/public_html/documents/ --exclude=.htaccess --exclude=.htaccess~
#rsync -azurR -e "ssh -i /etc/ssh/ssh_host_rsa_key -p 22 -oStrictHostKeyChecking=no" --log-file=/tmp/rsync.log --delete --delete-excluded testdir 10.6.28.28:/data/backup/filesystem/10.6.28.135
 
 
# do the rsync
# -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
# -r, --recursive             recurse into directories
# -R, --relative              use relative path names
# -u, --update                skip files that are newer on the receiver
# -z, --compress              compress file data during the transfer
rsync  -azurR \
     -e  "ssh $ssh_option"  \
     --log- file =${log_directory} /backup_filesystem_rsync_ ${datetime}.log \
     --delete --delete-excluded \
     ${datadir_to_backup} \
     ${backup_server}:${remote_destination}/${datetime}-incomplete/
 
# change name of directory once rsync is complete
ssh  ${ssh_option} ${backup_server}  "mv $remote_destination/$datetime-incomplete $remote_destination/$datetime"  || {  echo  "Could not rename directory after rsync" exit  1; }
 
# link current to this backup
ssh  ${ssh_option} ${backup_server}  "test ! -d $remote_destination/current || rm -f $remote_destination/current"  || {  echo  "Could not remove current backup link" exit  1; }
ssh  ${ssh_option} ${backup_server}  "ln -s $remote_destination/$datetime $remote_destination/current"  || {  echo  "Could not create current backup link" exit  1; }
 
# remove backups older than 10 days
ssh  ${ssh_option} ${backup_server}  "find $remote_destination/* -maxdepth 0 -type d -mtime +10 -exec rm -rf {} \;"  || {  echo  "Could not remove old backups" exit  1; }
 
# remove local log files older than 10 days
find  ${log_directory}/* -maxdepth 0 - type  f -name *.log -mtime +10 - exec  rm  -rf  '{}'  \; || {  echo  "Could not remove old log files" exit  1; }
 
declare  -x PATH=${old_PATH}

tag:Linux备份,远程备份,rsync备份

--end--






本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1826915,如需转载请自行联系原作者


相关文章
|
7天前
|
缓存 监控 Shell
如何使用 HBase Shell 进行数据的实时监控和备份?
如何使用 HBase Shell 进行数据的实时监控和备份?
|
25天前
|
Unix Linux
Linux | Rsync 命令:16 个实际示例(下)
Linux | Rsync 命令:16 个实际示例(下)
33 3
Linux | Rsync 命令:16 个实际示例(下)
|
8天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
26 3
|
8天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
21 3
|
10天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
1月前
|
安全 Linux Shell
Linux | Rsync 命令:16 个实际示例(上)
Linux | Rsync 命令:16 个实际示例(上)
59 0
Linux | Rsync 命令:16 个实际示例(上)
|
1月前
|
大数据 网络安全 数据安全/隐私保护
大数据-03-Hadoop集群 免密登录 超详细 3节点云 分发脚本 踩坑笔记 SSH免密 集群搭建(二)
大数据-03-Hadoop集群 免密登录 超详细 3节点云 分发脚本 踩坑笔记 SSH免密 集群搭建(二)
110 5
|
1月前
|
XML 大数据 网络安全
大数据-03-Hadoop集群 免密登录 超详细 3节点云 分发脚本 踩坑笔记 SSH免密 集群搭建(一)
大数据-03-Hadoop集群 免密登录 超详细 3节点云 分发脚本 踩坑笔记 SSH免密 集群搭建(一)
66 4
|
3月前
|
安全 Linux 数据安全/隐私保护
在Linux中,使用rsync服务模式时,如果指定了⼀个密码文件,那么这个密码文件的权限应该设置成多少才可以?
在Linux中,使用rsync服务模式时,如果指定了⼀个密码文件,那么这个密码文件的权限应该设置成多少才可以?
|
3月前
|
Linux Shell 网络安全
在Linux中,rsync同步时,如何删除目标数据多出来的数据,即源上不存在,但目标却存在的文件或者目录?
在Linux中,rsync同步时,如何删除目标数据多出来的数据,即源上不存在,但目标却存在的文件或者目录?