数据备份方案
数据类型
文件类数据
数据库数据
文件类数据备份方案
文件类方案一般在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