设为首页 收藏本站
查看: 1419|回复: 0

[经验分享] Xtrabackup+Rsync 备份数据库并同步到远端备份机

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-6-12 08:44:02 | 显示全部楼层 |阅读模式
简单架构:

QQ截图20150612083555.png


简单描述:
   要备份中间这三台服务器上面的数据库数据到备份机140上;中间这三台服务器是游戏服务器,WEB服务和DB都在一台机器上
   最前端是passport服务器,提供玩家的账号相关信息及充值信息等,WEB服务和DB都在一台机器上,需要将数据库数据备份到备份机140上
   服务器129对passport服务器的数据库做了mysql的主主同步,这里先忽略



要求:
   对游戏服务器和passport服务器的数据库数据,在本地备份,同时备份到远端备份机140上,在本地保留三天,在备份机保留7天
   将passport服务器的二进制日志文件备份到远端备份机140上(本地不做备份)
   计划任务,每天凌晨1点执行






步骤:
   1、拿其中一台服务器为例,其他都一样
   在192.168.186.130上操作:
   以下所有脚本和所需的软件包请到
百度云附件:mysql_backup.zip    下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
1
2
#对数据库进行全备份
0 1 * * * cd /data/scripts/mysql;./mysql_full_backup.sh




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
此脚本只在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
2
#将二进制文件备份到备份机
*/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                   #创建配置文件,默认是不存在的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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             #创建密码文件,用户名:密码
1
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端口
1
tcp        0      0 :::873                      :::*                        LISTEN      13613/xinetd




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
1
2
#定时清理mysql的全备份和二进制文件
0 3 * * * cd /data/scripts/mysql;./delmysql_backup.sh










后期数据恢复步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#先使用全备份恢复到备份时的数据:
#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命令


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-76402-1-1.html 上篇帖子: mysql锁的一些认识 下篇帖子: Centos6.5 搭建mysq主从复 数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表