window-linux文件备份

数据备份方案

数据类型

文件类数据

数据库数据

文件类数据备份方案

文件类方案一般在window的服务器里,所以可以实现window和linux的双向备份和异地备份。将某地服务器的数据文件可以备份到异地的服务器。

采取技术:Rsync+crontab

技术说明:rsync 的工具,它不但支持 Windows 与 Linux 之间的数据同步,而且配置简单,同时增量同步的功能更方便。

window文件类数据备份

将window服务器备份到linux服务器(测试案例)

rsync 配置很容易,这里以 Windows 作为客户端,Linux 作为服务端进行演示

linux 服务器端配置
复制代码
#检查是否安装了 rsync
rpm -qa|grep rsync

# 如果没有安装的话,进行安装
yum install rsync
编写配置文件

rsync 涉及到的配置主要有三个:

​ ● /etc/rsyncd.conf -> 对 rsync 服务进行配置

​ ● /tmp/rsync -> 待同步的目标目录,路径可以自定义

​ ● /etc/rsyncd.passwd ->里面包含用于进行密码验证的账号信息

/etc/rsyncd.conf 的配置
复制代码
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# 进行通信的端口,如果 firewall 打开的话,需要将对应的端口添加进去
port=8730
# 日志文件
log file=/var/log/rsync.log
# rsync 的进程 id
pid file=/var/run/rsync.pid
# 要同步的模块,这里一般以项目名命名
[cmi]
# 同步的目标文件夹
path=/tmp/rsync
# rsync daemon 在传输前是否切换到指定的 path 目录下,并将其监禁在内,用于增加传输的安全性
use chroot=no
# 指定最大的连接数
max connections=4
# yes 表示只读本地文件无法同步到服务器
read only=no
# 客户端请求显示模块列表时,该模块是否显示出来
list=true
# 服务运行时的用户
uid=root
# 服务运行时的用户组
gid=root
# 进行验证时的用户名,必须是系统存在的用户
auth users = root 
# 连接用户时的密码
secrets file=/etc/rsyncd.passwd
# 允许的 ip
hosts allow=*
创建数据备份目录
复制代码
mkdir /tmp/rsync
创建密码
复制代码
# 写入密码
echo "root:123456" > /etc/rsyncd.passwd

#更改文件权限
chmod 600 /etc/rsyncd.passwd
重启服务
复制代码
# /usr/bin/rsync  --daemon 
# netstat -lntup |grep rsync 
# ps -ef |grep rsync |grep -v grep
开机自启动
复制代码
echo "/usr/bin/rsync --deamon">>/etc/rc.local #cat  /etc/rc.local
window客户端配置

客户端采取cwRsync_4.1.0这个版本(测试别的版本密码认证文件有问题)

安装cwRsync_4.1.0

配置window客户端密码文件

在这里插入图片描述

密码为123456 需要和服务器端的密码相同

并且需要设置权限为600

在power shell中设置

同步测试
复制代码
rsync.exe -avPz --port 8730 --password-file=/cygdrive/C/cwRsync/bin/rsyncd.password.txt /cygdrive/C/test1  root@192.168.1.15::cmi
在linux服务器端查看

测试成功

复制代码
[root@localhost rsync]# cd test1
[root@localhost test1]# pwd
/tmp/rsync/test1
[root@localhost test1]# ls
1.txt  2.txt

linux服务器数据备份同上

mysql数据脚本备份

脚本备份

复制代码
vim mysql_fullbak.sh
#!/bin/bash
#dest: MySQL全备,仅保留最近4次的全备
PASSWD=123123
BAKDIR=/data/backup/mysql_full_backup
PORT=$(netstat -lanp | grep LISTEN | grep "mysqld"|awk -F ":" 'NR==1{print $4}')
TIME=$(date +"%Y%m%d_%H%M%S")
LOG_DIR=$BAKDIR/logs
if [ ! -d $LOG_DIR ]; then
    mkdir -p $LOG_DIR
elif [ ! -d $BAKDIR ];then
    mkdir -p $BAKDIR
fi
if ! ps -ef | grep -v "grep"|grep -q "mysqld ";then
    echo "$TIME ERROR 未检测到mysql进程" >> $LOG_DIR/$TIME.log
    exit 1
fi
mysqldump -uroot -p$PASSWD --routines --single_transaction \
--master-data=2 --all-databases | gzip > $BAKDIR/backup-all-databses-$TIME.tar.gz
if [ $? -eq 0 ]; then
    echo "$TIME INFO $BAKDIR/backup-all-databses-$TIME.tar.gz 备份成功." >>$LOG_DIR/$TIME.log
fi

COUNT=$(ls -lrt $BAKDIR/*.tar.gz |wc -l)
if [ $COUNT -gt 4 ]; then
    FILE=$(ls -lrt $BAKDIR/*.tar.gz |awk 'NR==1{print $NF}')
    mkdir -p /tmp/mysql_bak && mv $FILE /tmp/mysql_bak
    echo "$TIME INFO $FILE move /tmp/mysql_bak" &> $LOG_DIR/$TIME.log
fi


添加到计划任务,每周天4点执行

crontab -e
0 4 * * 7 /mnt/scripts/mysql_fullbak.sh



# mysql增量备份脚本

root@localhost(192.168.199.106)~>cd /mnt/scripts/
root@localhost(192.168.199.106)/mnt/scripts>vim mysql_binlogbak.sh
#!/bin/bash
# dest: 二进制文件增量备份
PASSWD=123123
BAKDIR=/data/backup/mysqlbinlog/$(date +%F)
PORT=$(netstat -lanp | grep LISTEN | grep "mysqld"|awk -F ":" 'NR==1{print $4}')
TIME=$(date +"%Y%m%d_%H%M%S")
LOG_FILE=$BAKDIR/mysql_fullbak.log
BIN_FILE=/var/lib/mysql/master-bin.index
if [ ! -d $BAKDIR ]; then
    mkdir -p $BAKDIR
fi
if ! ps -ef | grep -v "grep"|grep -q "mysqld ";then
    echo "$TIME ERROR 未检测到mysql进程" >> $LOG_FILE
    exit 1
fi
mysqladmin -uroot -p$PASSWD flush-logs
Counter=`wc -l $BIN_FILE |awk '{print $1}'`
NUM=0
for file in `cat $BIN_FILE`
do
    base=`basename $file`
#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NUM=`expr $NUM + 1`
        if [ $NUM -eq $Counter ]
        then
            echo "$TIME INFO $base skip!" >> $LOG_FILE
        else
            dest=$BAKDIR/$base
            if(test -e $dest)
#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去。
            then
            echo "$TIME INFO $base exist!" >> $LOG_FILE
            else
                cp /var/lib/mysql/$base $BAKDIR
                echo "$TIME INFO $base copying" >> $LOG_FILE
            fi
        fi
done
#保留最近8份数据
COUNT=$(ls -ldtr /data/backup/mysqlbinlog/* | wc -l)
if [ $COUNT -gt 8 ]; then
    MV_DIR=$(ls -dltr /data/backup/mysqlbinlog/* | awk 'NR==1{print $NF}')
    mkdir -p /tmp/mysql_binlog_backup && mv $MV_DIR /tmp/mysql_binlog_backup
fi
相关推荐
对你无可奈何39 分钟前
关于Ubuntu的 update造成的内核升级
运维·服务器·ubuntu
qq_312920111 小时前
Nginx限流与防爬虫与安全配置方案
运维·爬虫·nginx·安全
GanGuaGua1 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
lsnm1 小时前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
全糖去冰吃不了苦1 小时前
ELK 集群部署实战
运维·jenkins
不掰手腕2 小时前
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
linux·数据库·postgresql
Lynnxiaowen2 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
努力学习的小廉2 小时前
深入了解linux系统—— POSIX信号量
linux·运维·服务器
刘一说2 小时前
CentOS部署ELK Stack完整指南
linux·elk·centos
从零开始的ops生活2 小时前
【Day 50 】Linux-nginx反向代理与负载均衡
linux·nginx