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

功能介绍:

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

运行原理:

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

感谢:

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

脚本内容:

#!/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 <[email protected]>‘
# 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="[email protected]"
# 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/* [email protected]_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--

时间: 2024-12-26 09:22:12

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

linux下远程备份mysql数据库

本次环境主要是远程备份mysql数据库的一种常见方法,对于其他知识不做太多讲解. 环境需求: 两台linux:一台mysql数据库服务器,另一台当作客户端用来做备份. 环境目标: 实现mysql数据库的远程备份 例子: (A为服务端ip为192.168.1.1    B为客户端ip为192.168.1.2) 1.首先你得在A上建立一个数据库(建立数据库名称我以 xianyu 为例) create database xianyu;   (建立数据库xianyu) 2.在A上建立一个数据库用户用来做

Linux FTP远程备份shell脚本命令

定期备份各服务器的动摇资料,到ftp服务器,注意主动模式和被动模式区别 #!/bin/bash #主动FTP对服务端有利,客户端iptables关闭,客户端需要执行passsiveh后上传数据 #被动FTP对客户端有利,服务端iptables关闭,Linux客户端ftp登陆后不需要执行passive命令,可上传 # #vim /etc/sysconfig/iptables #开放防火墙端口主动模式下,客户端防火墙需要关闭 #-A INPUT -p tcp --dport 20 -j ACCEPT

利用stat命令获取Linux文件系统和文件的详细状态信息

用途:stat命令用于显示文件或文件系统的状态信息,来自于coreutils软件包,一般系统自带此命令工具,它能获取与文件系统及文件相关的许多信息,具体用途见stat的功能选项.这些信息包括inode.atime.ctime.mtime.文件(系统)类型.权限.块大小.符号连接等. 语法:stat [OPTION]... FILE... , 可通过stat --help或man stat获取它的帮助信息 功能选项:功能选项需要结合-c参数使用,如利用stat获取文件的inode信息,则使用sta

Linux下远程备份、上传工程,重启服务器

Linux服务器实现远程,原项目的备份.删除,新项目上传,以及远程重启服务器!分成一个主shell调用三个shell文件步骤完成.mainsh.sh一次按顺序执行多个脚本,将三步sh顺序完成: #!/bin/sh 02.#此Shell一次按顺序执行多个脚本 03.#参数:: 04. #远程jboss服务器所在的ip 05. IP=127.0.0.1 06. #服务器登录账户 07. userx='tskk' 08. #服务器登录密码 09. passx='sasa' 10. #部署jboss远程

使用bacula实现Linux的远程备份和还原

Bacula,被誉为开源软件中最好的备份还原软件,它提供了企业级的客户机/服务器的备份解决方案,能够通过网络来管理文件的备份,恢复和核实工作.Bacula,既有windows版本的,也有Linux,Unix的.但目前有关于其使用的文章是在太少,而且介绍的很不详细,今天,我就来和大家一起探讨一下.(最新版本2.4.3主页 [url]http://www.bacula.org[/url]) 一,bacula的模型 为了部署bacula,应该了解它的主要组件. 控制器是协调备份,恢复和校验操作的守护进

通过rsync+inotify实现文件的实时备份同步

原文参考:http://ixdba.blog.51cto.com/2895551/580280/ http://www.bamaol.com/Psy/Showposts-010000108-5048.html 一,rsync安装 目前rsync的最新版本是3.0.9 wget http://rsync.samba.org/ftp/rsync/rsync-3.0.9.tar.gz tar-xvzfrsync-3.0.9.tar.gz;cdrsync-3.0.9; ./configure;make;

通过rsync+inotify实现数据的实时备份

我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足 与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等. 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首

通过rsync+inotify实现数据的实时备份 【转载】

   在前面的博文中,我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足  与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等.  随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中

利用rsync+inotify实现数据实时同步脚本文件

将代码放在Server端,实现其它web服务器同步.首先创建rsync.shell,rsync.shell代码如下: #!/bin/bash host1=133.96.7.100 host2=133.96.7.101 host3=133.96.7.102 src=/data/www/ dst1=web1 dst2=web2 dst3=web3 user1=web1 user2=web2 user3=web3 /usr/local/inotify/bin/inotifywait -mrq --ti