Xtrabackup+Rsync 備份數據庫並同步到遠端備份機前端
簡單架構:mysql
簡單描述: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命令