Skip to content

数据备份一直是刚需,数据备份的方式也多种多样,经过自己摸索学习,目前总结到以下的备份方式,环境为Ubuntu22.10。

备份方式

1. 不推荐的脚本备份

  1. 创建脚本文件
touch /home/backup.sh
  1. 添加执行权限
chmod +x /home/backup.sh
  1. 写脚本
vi /home/backup.sh
脚本一
#!/bin/sh
mkdir /home/backup
#创建一个临时文件(要保存备份的路径)

cp -r /home/targe  /home/backup
#数据存在targe目录下,备份到backup目录下,所以先将数据拷过来


tar -zcPvf /home/backup$(date +%Y%m%d).tar.gz /home/backup
 #将数据所在文件夹backup打包

rm -rf /home/backup/
 #删除临时文件内容

find ./ -mtime +30 -name "*.tar.gz" -exec rm -rf {} \;
#删除改文件夹下超过30天的文件
脚本二(未测试)
#########################################################################
# File Name: back_template.sh
# Author: happy
# mail: zaqwsx526@163.com
# Created Time: Wed 06 Jun 2018 12:17:16 PM CST
#########################################################################
#!/bin/bash
SOURCE_DIR=(
    $*
    )
TARGET_DIR=/backup/data/
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
WEEK=`date +%u`
FILES=system_backup.tgz
CODE=$?
if [ -z "$*" ];then
    echo -e "Please Enter Your Backup Files or Directories\n--------------------------------------------\nExample $0 /boot /etc ......"
    exit
fi
#Determine Whether the Target Directory Exists
if [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
    mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
    echo "This $TARGET_DIR is Created Successfully !"
fi
#EXEC Full_Backup Function Command""
Full_Backup()
{
    if [ "$WEEK" -eq "7" ];then
        rm -rf $TARGET_DIR/snapshot
        cd $TARGET_DIR/$YEAR/$MONTH/$DAY
        tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
        [ "$CODE" == "0" ]&&echo -e  "--------------------------------------------\nThese Full_Backup System Files Backup Successfully !"
    fi
}
#Perform incremental BACKUP Function Command
Add_Backup()
{
    cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;
    if [ -f $TARGET_DIR/$YEAR/$MONTH/$DAY/$FILES ];then
        read -p "These $FILES Already Exists, overwrite confirmation yes or no ? : " SURE
        if [ $SURE == "no" -o $SURE == "n" ];then
            sleep 1 ;exit 0
        fi
        #Add_Backup Files System
        if [ $WEEK -ne "7" ];then
            cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $$_$FILES `echo ${SOURCE_DIR[@]}`
            [ "$CODE" == "0" ]&&echo -e  "-----------------------------------------\nThese Add_Backup System Files Backup Successfully !"
        fi
    else
        if [ $WEEK -ne "7" ];then
            cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
            [ "$CODE" == "0" ]&&echo -e  "-------------------------------------------\nThese Add_Backup System Files Backup Successfully !"
        fi
    fi
}
Full_Backup;Add_Backup

2. rsync

Rsync(remote synchronize)是一个远程文件同步工具;

Rsync使用“Rsync算法”来同步文件,该算法只传送两个文件的不同部分,因此速度相当快;

  1. 安装(忽略)

Linux发行版默认已经安装rsync工具,如果想自行安装,可以参考如下安装步骤:

官网上下载 rsync-x.x.x.tar.gz

tar -zxvf rsync-3.1.0.tar.gz

cd rsync-3.1.0

./configure -prefix=/opt/app/rsync

make

make install

安装完成,需将 /opt/app/rsync/bin 增加到PATH中;

  1. 使用 命令行使用rsync的语法

#同步文件夹到远程

rsync -avI  dir_name  remote_ip:dir_name

#同步文件夹到远程,传输时进行压缩

rsync -avzI dir_name remote_ip:dir_name

#同步文件夹到远程(保持严格同步,即本地删除,远程也同步删除)

rsync -avzI –-delete dir_name remote_ip:dir_name

#排除指定的文件或目录,可多次使用,支持通配符(比如.svn、.git等目录)

rsync -avzI —exclude=/a/b/*.svn —exclude=/a/b/*.git dir_name remote_ip:dir_name

#当排除的文件较多时,可将文件写到某文件中,同时使用 --exclude-from 指定该文件即可。

rsync -avzI —exclude-from=/a/exclude_file_list.txt dir_name remote_ip:dir_name

以上使用的选项说明如下:

  • -a, —archive 归档模式,等于-rlptgoD;

  • -r, —recursive 递归模式;

  • -l 保持符号连接;

  • -p 保持文件原有权限;

  • -t 保持文件原有修改时间;

  • -g 保持文件原有用户组;

  • -o 保持文件原有属主;

  • -D -devices -specials,保持块设备文件和特殊文件;

  • -I 强制扫描,放弃“quick check”策略(quick check策略,通过查看文件的时间戳和文件大小,先排除一批认为相同的文件[rsync不会对文件夹本身做“quick check”]);

  • -z, —compress 压缩,默认的压缩算法和gzip一样;

  • -v, --verbose 显示进度详细信息;

  • -q, —quiet 精简输出模式;

  • -R, —relative 保持全路径;

  • --progress 显示传输进度(百分百);

  • --delete 本地删除某一文件,远程也同步的删除该文件,保持严格的一致(不加该参数,则表示只增不减);

  • --exclude=”*.tmp” 排除某些文件;

  • --exclude-from=FILE 排除FILE中指定模式的文件;

  • --port=PORT 指定其他的rsync服务端口;

注意:就路径格式而言,如果源路径末尾使用/,则rsync会将源路径尾端目录中的所有内容复制到目的端;如果没有使用/,rsync会将源路径尾端目录本身复制到目的端。

rsync -av /home/test/ /home/backup; #将test目录中的内容备份;
rsync -av /home/test /home/backup; #将test目录本身备份;

如果目的路径末尾使用/,则rsync会将来自源端的内容复制到目的端的目录中;如果没有使用/,则rsync会在目的端路径尾部创建一个和目的端尾部目录同名的目录,并将源端内容复制到该目录中。

rsync -av /home/test /home/backup/; #将源端内容复制到backup目录中;
rsync -av /home/test /home/backup; #在/home/backup创建下级目录backup,并将源端内容复制到/home/backup/backup目录中;

设置定时备份

例如:设置脚本每7天执行一次。

  1. 安装crond 如果没有安装crond服务就先装上服务。 检查服务状态:service crond status

  2. 修改crontab内容 输入命令:crontab –e 进入后继续输入命令:0 0 /7 * /home/backup.sh 设置为每7天执行一次脚本文件 然后,保存退出:wq

sh脚本前面五个字段分别表示分钟(0-59)、小时(0-23)、日(1-31)、月(0-12)、星期几(0-6)后面的为脚本所在目录

img

  1. 重新启动crond服务 输入命令:service crond restart