码迷,mamicode.com
首页 > 数据库 > 详细

Xtrabackup+Rsync 备份数据库并同步到远端备份机

时间:2015-06-11 23:14:24      阅读:539      评论:0      收藏:0      [点我收藏+]

标签:xtrabackup mysql rsync

Xtrabackup+Rsync 备份数据库并同步到远端备份机


简单架构:

技术分享




简单描述:

   要备份中间这三台服务器上面的数据库数据到备份机140上;中间这三台服务器是游戏服务器,WEB服务和DB都在一台机器上

   最前端是passport服务器,提供玩家的账号相关信息及充值信息等,WEB服务和DB都在一台机器上,需要将数据库数据备份到备份机140上

   服务器129对passport服务器的数据库做了mysql的主主同步,这里先忽略




要求:

   对游戏服务器和passport服务器的数据库数据,在本地备份,同时备份到远端备份机140上,在本地保留三天,在备份机保留7天

   将passport服务器的二进制日志文件备份到远端备份机140上(本地不做备份)

   计划任务,每天凌晨1点执行




参考:

http://732233048.blog.51cto.com/9323668/1660146





步骤:

   1、拿其中一台服务器为例,其他都一样

   在192.168.186.130上操作:

   以下所有脚本和所需的软件包请到http://down.51cto.com/data/2058997下载

vi install_packages.sh 
#!/bin/bash

#安装xtrabackup rsync及依赖包

#变量值可能需要修改,仔细确认下
rsyncpassword=scj            #rsync的密码

rsync=`rpm -qa rsync`
if [ -z ${rsync} ];then
    yum -y install rsync
fi
echo $rsyncpassword > /etc/rsyncd.password
chmod 600 /etc/rsyncd.password

libaio=`rpm -qa libaio`
if [ -z ${libaio} ];then
    yum -y install libaio
fi

perl_Time_HiRes=`rpm -qa perl-Time-HiRes`
if [ -z ${perl_Time_HiRes} ];then
    yum -y install perl-Time-HiRes
fi

perl_DBD_MySQL=`rpm -qa perl-DBD-MySQL`
if [ -z ${perl_DBD_MySQL} ];then
    yum -y install perl-DBD-MySQL
fi

perl_IO_Socket_SSL=`rpm -qa perl-IO-Socket-SSL`
if [ -z ${perl_IO_Socket_SSL} ];then
    yum -y install perl-IO-Socket-SSL
fi

percona_xtrabackup=`rpm -qa percona-xtrabackup`
system_weishu=`uname -i`
mysqlversion=`mysql -V | awk -F‘,‘ ‘{print $1}‘ | awk ‘{print $5}‘ |awk -F‘.‘ ‘{print $2}‘`
if [ -z ${percona_xtrabackup} ];then
    if [ ${system_weishu} == ‘i386‘ ];then   #等号前后要有空格
        if [ $mysqlversion -ge 5 ];then      #版本大于等于5.5
            rpm -ivh  packages/percona-xtrabackup-2.2.9-5067.el6.i686.rpm
        elif [ $mysqlversion -lt 5 ];then    #版本小于5.5
            rpm -ivh  packages/percona-xtrabackup-20-2.0.8-587.rhel6.i686.rpm
        fi
    elif [ ${system_weishu} == ‘x86_64‘ ];then
        if [ $mysqlversion -ge 5 ];then      #版本大于等于5.5
            rpm -ivh packages/percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm
        elif [ $mysqlversion -lt 5 ];then    #版本小于5.5
            rpm -ivh  packages/percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm
        fi
    fi
fi


vi mysql_full_backup.sh
#!/bin/bash
#此脚本用来进行数据库的全备份,结合计划任务完成

#注意:下面的变量值可能要修改,仔细确认下
mysqluser=root
rsyncuser=scj
rsync_hostip=‘192.168.186.140‘
ip=‘192.168.186.130‘               #本机ip
mysqlpassword=123456
mysqlsocket=‘/tmp/mysqld.sock‘
mysql_defaults_file=‘/usr/local/mysql/my.cnf‘

backuptodir=‘/data/mysql_backup/mysql_full_backup_lszc/‘    #备份到目录
binlogdir=‘/opt/mysql/binlog/‘     #二进制日志目录
binlogname=‘mysql-binlog.0*‘       #二进制日志文件名
rsyncmodule=mysqlbackup            #rsync的模块

if [ ! -d $backuptodir ];then
    mkdir -p $backuptodir
fi

#进行全备份
innobackupex --user=$mysqluser --password=$mysqlpassword --socket=$mysqlsocket --defaults-file=$mysql_defaults_file $backuptodir 2> /dev/null || exit 1

#删除一天前的全备份文件,即保留两个备份文件
find $backuptodir  -type f -mtime +1 -exec rm -f {} \;

#删除一天前的二进制日志文件,即保留两天的二进制日志文件
cd $binlogdir
onedayago_binlog=`find . -type f -mtime +1 -name "$binlogname" | sort | tail -n1 | awk -F‘/‘ ‘{print $2}‘`
mysql -u $mysqluser -p$mysqlpassword -e "PURGE MASTER LOGS TO ‘$onedayago_binlog‘" 2> /dev/null

#找出最后一个全备份文件,进行压缩
cd $backuptodir
lastfull_backup=`ls -l | grep ‘^d‘ | awk ‘{print $9}‘ | sort | tail -n1`
tar -zcf mysql_full_${ip}_${lastfull_backup}.tar.gz ${lastfull_backup}

#将压缩文件rsync同步到备份机
rsync -az --password-file=/etc/rsyncd.password  ${backuptodir}mysql_full_${ip}_${lastfull_backup}.tar.gz $rsyncuser@${rsync_hostip}::$rsyncmodule || exit 1

#删除压缩文件
rm -f ${backuptodir}mysql_full_${ip}_${lastfull_backup}.tar.gz

   创建计划任务:

   crontab -e

#对数据库进行全备份
0 1 * * * cd /data/scripts/mysql;./mysql_full_backup.sh


此脚本只在passport服务器上执行
vi mysqlbinlog_backup.sh
#!/bin/bash

#此脚本用来备份二进制日志文件,并结合计划任务完成
#注意:此脚本只适用于二进制日志文件单独在一个目录下,若二进制日志文件不是单独在一个目录下面,请先去修改配置文件
#此脚本:二进制日志文件在本地没有备份,只备份到远端的备份机

#变量值可能需要修改,仔细确认下
binlogdir=/opt/mysql/binlog/         #binlog的数据目录
rsyncuser=scj
rsync_hostip=‘192.168.186.140‘
rsync_binlog_monule=mysqlbinlogbackup         #binlog的rsync模块

#同步数据到备份机
rsync -az --password-file=/etc/rsyncd.password ${binlogdir}* $rsyncuser@$rsync_hostip::$rsync_binlog_monule || exit 1

   在passport服务器创建计划任务

   crontab -e

#将二进制文件备份到备份机
*/1 * * * * cd /data/scripts/mysql;./mysqlbinlog_backup.sh


   2、在备份机140上安装rsync:

   yum -y install rsync

   vi /etc/xinetd.d/rsync                #修改文件,让xinetd来管理rsync

   将disable = yes 改为 disable = no

   yum -y install xinetd 

   vi /etc/rsyncd.conf                   #创建配置文件,默认是不存在的

uid = root
gid = root
user chroot = no
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log

[mysqlbackup]
path = /data/mysql/mysql_full_backup
ignore errors
read only = no
list = no
hosts allow = 192.168.186.0/255.255.255.0
auth users = scj
secrets file = /etc/rsyncd.password

[mysqlbinlogbackup]
path = /data/mysql/mysqlbinlog_backup
ignore errors
read only = no
list = no
hosts allow = 192.168.186.0/255.255.255.0
auth users = scj
secrets file = /etc/rsyncd.password

  注意:auth users = scj 这一行一定要有,否则任何账号不用密码都可以访问rsync服务端;这样就只有scj这一个账号可以访问了

    vi /etc/rsyncd.password             #创建密码文件,用户名:密码

scj:scj

    chmod 600 /etc/rsyncd.password      #密码文件的权限必须是600,否则会有问题

    mkdir -p /data/mysql/{mysqlbinlog_backup,mysql_full_backup}            #创建共享目录

    chkconfig xinetd on

    /etc/init.d/xinetd start            #启动rsync

    netstat  -tlnpa | grep 873          #rsync监听873端口

tcp        0      0 :::873                      :::*                        LISTEN      13613/xinetd


vi /data/scripts/mysql/delmysql_backup.sh
#!/bin/bash

#此脚本用来定时清理备份机上mysql的全备份和二进制文件
#mysql全备份和二进制文件全部保留7天

#变量值可能需要修改,仔细确认下
mysql_full_backupdir=/data/mysql/mysql_full_backup       #mysql的全备份目录
mysqlbinlog_backupdir=/data/mysql/mysqlbinlog_backup     #二进制文件备份目录

#删除七天前的全备份文件,即保留八个备份文件
find $mysql_full_backupdir  -type f -mtime +7 -exec rm -f {} \;

#删除七天前的二进制日志文件,即保留八天的二进制日志文件
find $mysqlbinlog_backupdir  -type f -mtime +7 -exec rm -f {} \;

   创建计划任务

   crontab -e

#定时清理mysql的全备份和二进制文件
0 3 * * * cd /data/scripts/mysql;./delmysql_backup.sh








后期数据恢复步骤:

#先使用全备份恢复到备份时的数据:
#1、/etc/init.d/mysqld stop                 #在数据恢复时一定要记得把mysql服务停掉
#2、mv /opt/mysql/data/* /tmp/linshi/       #把数据库数据目录下的所有数据临时mv到一个临时目录
#3、在本地找到最后一个全备份:(例如是:2015-06-11_05-13-26)
#4、innobackupex --apply-log 2015-06-11_05-13-26      #准备一个全备份
#5、innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf 2015-06-11_05-13-26             #恢复数据
#6、chown -R mysql.mysql /opt/mysql/data/         #修改数据权限(默认xtrabackup恢复数据后,所有数据的权限都是root)
#7、/etc/init.d/mysqld start                      #启动mysql服务
#
#如果本地备份数据全部丢失:
#到备份机上找到最后一个全备份文件:(例如是:mysql_full_192.168.186.136_2015-06-11_05-13-26.tar.gz)
#rsync -avz root@备份机ip:/data/mysql/mysql_full_backup/mysql_full_192.168.186.136_2015-06-11_05-13-26.tar.gz /data/mysql_backup/mysql_full_backup_lszc/       #这里的root是备份机的root用户,需要用到root的密码
#cd /data/mysql_backup/mysql_full_backup_lszc/
#tar -zxf mysql_full_192.168.186.136_2015-06-11_05-13-26.tar.gz
#innobackupex --apply-log 2015-06-11_05-13-26      #准备一个全备份
#innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf 2015-06-11_05-13-26             #恢复数据
#chown -R mysql.mysql /opt/mysql/data/         #修改数据权限(默认xtrabackup恢复数据后,所有数据的权限都是root)
#/etc/init.d/mysqld start                      #启动mysql服务
#
#再使用二进制日志文件恢复备份之后的数据:
#cd 2015-06-11_05-13-26                    #进入到最后一个备份目录
#cat xtrabackup_binlog_info                #获取做全备份时正在使用的二进制日志文件和此时的pos值,从这个二进制日志文件和pos值开始恢复之后的数据
#使用mysqlbinlog命令

















本文出自 “” 博客,请务必保留此出处http://732233048.blog.51cto.com/9323668/1660910

Xtrabackup+Rsync 备份数据库并同步到远端备份机

标签:xtrabackup mysql rsync

原文地址:http://732233048.blog.51cto.com/9323668/1660910

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!