Xtrabackup+Rsync 備份數據庫並同步到遠端備份機

Xtrabackup+Rsync 備份數據庫並同步到遠端備份機前端


簡單架構:mysql

wKiom1V5N5yzcxrsAAErWN2NyIE784.jpg




簡單描述:sql

   要備份中間這三臺服務器上面的數據庫數據到備份機140上;中間這三臺服務器是遊戲服務器,WEB服務和DB都在一臺機器上數據庫

   最前端是passport服務器,提供玩家的帳號相關信息及充值信息等,WEB服務和DB都在一臺機器上,須要將數據庫數據備份到備份機140上bash

   服務器129對passport服務器的數據庫作了mysql的主主同步,這裏先忽略服務器




要求:架構

   對遊戲服務器和passport服務器的數據庫數據,在本地備份,同時備份到遠端備份機140上,在本地保留三天,在備份機保留7天app

   將passport服務器的二進制日誌文件備份到遠端備份機140上(本地不作備份)socket

   計劃任務,天天凌晨1點執行tcp




參考:

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





步驟:

   一、拿其中一臺服務器爲例,其餘都同樣

   在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

#將二進制文件備份到備份機
*/30 * * * * cd /data/scripts/mysql;./mysqlbinlog_backup.sh


   二、在備份機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








後期數據恢復步驟:

#先使用全備份恢復到備份時的數據:
#一、/etc/init.d/mysqld stop                 #在數據恢復時必定要記得把mysql服務停掉
#二、mv /opt/mysql/data/* /tmp/linshi/       #把數據庫數據目錄下的全部數據臨時mv到一個臨時目錄
#三、在本地找到最後一個全備份:(例如是:2015-06-11_05-13-26)
#四、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服務
#
#若是本地備份數據所有丟失:
#到備份機上找到最後一個全備份文件:(例如是: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命令
相關文章
相關標籤/搜索