xtrabackup備份數據庫

xtrabackup備份數據庫python


說明:mysql

    公司以前備份數據庫用的是mysqldump,備份幾十G的數據,再加上服務器繁忙,備份速度像蝸牛似的。如今選用xtrabackup備份大的數據庫,備份效率高,恢復速度也快sql




參考:shell

    http://467754239.blog.51cto.com/4878013/1621711 數據庫




優勢:安全

    (1)備份過程快速、可靠;bash

    (2)備份過程不會打斷正在執行的事務;服務器

    (3)可以基於壓縮等功能節約磁盤空間和流量;app

    (4)自動實現備份檢驗;socket

    (5)還原速度快




安裝:

   這裏採用rpm包方式(推薦)

   yum -y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL

   cd /usr/local/src/

   32位:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/i386/percona-xtrabackup-2.2.9-5067.el6.i686.rpm

   64位:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/x86_64/percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm

   rpm -ivh percona-xtrabackup-2.2.9-5067.el6.i686.rpm




使用:

   全備份(目前公司只採用了全備份)

   innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock  --defaults-file=/usr/local/mysql/my.cnf /data/mysql_bacp/         #備份數據庫

   注意:

       /data/mysql_bacp/:備份目錄

       在/data/mysql_bacp/目錄下面會生成一個以時間命名的目錄

wKiom1V2rDzCQFXAAAB2nlms8wA371.jpg

       全部的數據庫數據都被備份在這個目錄下,同時又會生成幾個新的文件:

wKioL1V2rpDgXWtkAAJobK7LPxw890.jpg

       backup-my.cnf: 備份命令用到的配置選項信息

       xtrabackup_binlog_info: 備份時所用的二進制日誌信息(記錄了在備份時,正在用的二進制日誌文件及備份完這一刻的pos值,這個在數據恢復時用)

       xtrabackup_checkpoints: 備份的信息(備份類型(徹底或增量)、備份狀態(是否已經爲prepared狀態)、LSN(日誌序列號)範圍信息),能夠查看此備份是全備份仍是增量備份

       xtrabackup_info: xtrabackup相關的信息

      


   使用全備份恢復到備份時的數據

       /etc/init.d/mysqld stop             #在數據恢復時必定要記得把mysql服務停掉

       mv /opt/mysql/data/* /tmp/linshi/             #把數據庫數據目錄下的全部數據臨時mv到一個臨時目錄裏

       innobackupex --apply-log 2015-06-09_13-02-30/      #找到最後一個全備份目錄(準備(prepared)一個全備份) 意義:將未提交的事務進行回滾,將已經提交但尚未同步的數據進行同步

       innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf 2015-06-09_13-02-30/ #恢復數據

       chown -R mysql.mysql /opt/mysql/data/         #修改數據權限(默認xtrabackup恢復數據後,全部數據的權限都是root)

       /etc/init.d/mysqld start                      #啓動mysql服務

   

   使用二進制日誌文件恢復備份以後的數據:

       找到最後一個全備份目錄:

       cd /data/mysql_bacp/2015-06-09_13-02-30/

  cat xtrabackup_binlog_info
  mysql-binlog.000052	120

       mysql-binlog.000052和120:作全備份時正在使用的二進制日誌文件和備份完那一刻的pos值

       從這個二進制日誌文件和pos值開始恢復以後的數據

       參考:http://732233048.blog.51cto.com/9323668/1633051





使用腳本和計劃任務實現自動全備份:

 vi /data/scripts/mysql/mysqlfullbackup.py

#!/usr/bin/python
#encoding:utf-8

#此腳本用來對數據庫作全備份,並定時清理備份文件和二進制日誌文件

import os
import sys
import commands

user='root'
password='123456'
socket='/tmp/mysqld.sock'
defaults_file='/usr/local/mysql/my.cnf'

backuptodir='/data/mysql_bacp/'    #備份目錄
binlogdir='/opt/mysql/binlog/'     #二進制日誌目錄
binlogname='mysql-binlog.0*'       #二進制日誌文件名

def fullbackup():
    #備份數據
    os.system('innobackupex --user='+user+ ' --password='+password+ ' --socket='+socket+ ' --defaults-file='+defaults_file+ ' ' +backuptodir+ ' 2> /dev/null')

    #刪除兩天前的備份文件,即保留三個備份文件
    os.system('find ' +backuptodir+ ' -type f -mtime +2 -exec rm -f {} \;')

    #找出兩天前的最後一個二進制日誌文件
    os.chdir(binlogdir)
    twodaysago_binlog=commands.getoutput('find . -type f -mtime +2 -name ' '"'+binlogname+'"' " | sort | tail -n1 | awk -F'/' '{print $2}'")   # '"'+binlogname+'"' 在shell中是"mysql-binlog.0*"

    #刪除兩天前的二進制日誌文件,即保留兩天的二進制日誌文件
    os.system('mysql -u'+user+ ' -p'+password+ ' -e "PURGE MASTER LOGS TO ' "'"+twodaysago_binlog+"'" '" 2> /dev/null')

if __name__=='__main__':
    fullbackup()

   注意:使用此腳本時,腳本def函數裏的語句不用修改,只須要修改函數上面的變量值便可

   chmod 600 /data/scripts/mysql/mysqlfullbackup.py       #此腳本里麪包含了mysql的root密碼,爲了安全,設置600權限,其餘人都不可訪問

   crontab -e                          #建立計劃任務

#分 時 日 月 周 用戶名 命令
0 1 * * * cd /data/scripts/mysql;python mysqlfullbackup.py














附加:使用xtrabackup進行全備份+增量備份:

增量備份經常使用的幾個參數:

    --redo-only:將一個增量備份與全備份進行合併,造成一個新的全備份(以後用這個新的全備份進行數據的恢復)

    --incremental:指定進行增量備份

    --incremental-basedir:進行增量備份時,用來指定上一次的備份(全備份或上一次的增量備份)

    --incremental-dir:數據恢復時,用來指定上一次的備份(全備份或上一次的增量備份)


全備份+增量備份:

    全備份:

        innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock  --defaults-file=/usr/local/mysql/my.cnf /data/mysql_backup/mysql_full_backup_lszc   #全備份數據庫

wKiom1V-RKmC4J8GAACgb5-ZQGQ008.jpg

        如圖:生成一個全備份目錄:2015-06-15_07-20-33


    增量備份:

        innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock  --defaults-file=/usr/local/mysql/my.cnf --incremental /data/mysql_backup/mysql_incremental_backup_lszc/ --incremental-basedir=/data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/           #指定上一次的備份(這裏是上一次的全備份)

wKioL1V-S7CCqZ5kAABwWkUwqYE448.jpg

        如圖:生成一個增量備份目錄:2015-06-15_07-26-29


    再次增量備份:

        innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock  --defaults-file=/usr/local/mysql/my.cnf --incremental /data/mysql_backup/mysql_incremental_backup_lszc/ --incremental-basedir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-26-29    #指定上一次的備份(這裏是上一次的增量備份)

wKiom1V-SvLzpccoAAEdEfiIcjQ353.jpg

        如圖:又生成一個增量備份目錄:2015-06-15_07-43-33



數據恢復:

    使用全備份和增量備份將數據恢復到最後一個增量備份時的數據:

        /etc/init.d/mysqld stop              #在數據恢復時必定要記得把mysql服務停掉

        mv /opt/mysql/data/* /tmp/linshi/             #把數據庫數據目錄下的全部數據臨時mv到一個臨時目錄裏


        innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/        #找到最後一個全備份目錄(準備(prepared)一個全備份


        innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ --incremental-dir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-26-29/    #將第一個增量備份合併到全備份


        innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ --incremental-dir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-43-33/    #將第二個增量備份合併到全備份


        注意:將增量備份與全備份合併,造成一個新的全備份,以後將用這個新的全備份進行數據恢復(全備份名稱始終不變,即:永遠是最初的名字


        innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/          #恢復數據


        chown -R mysql.mysql /opt/mysql/data/         #修改數據權限(默認xtrabackup恢復數據後,全部數據的權限都是root)

        /etc/init.d/mysqld start                      #啓動mysql服務


    使用二進制日誌文件恢復最後一個增量備份以後的數據:

        找到最後一個增量備份:

wKioL1V-gVjROqErAADYtIk1xhI923.jpg

        如圖:獲取執行最後一個增量備份時正在使用的二進制日誌文件和此時的pos值


        從這個二進制日誌文件和pos值開始恢復以後的數據














附加:

注意:備份時候MySQL必須是運行狀態,而在作數據恢復時候服務必須是處於停滯狀態。

重要參數:


    --defaults-file=/etc/my.cnf:備份時,指定配置文件


    --socket=/tmp/mysql.sock:備份時,鏈接到備份的mysql服務器所使用的 套接字文件


    --user=root:鏈接備份mysqld所使用的用戶


    --password=hello:鏈接備份mysqld所使用的用戶密碼


    --no-timestamp:默認狀況下,備份目錄會使用以當前時間爲名稱建立一個備份目錄,加上此參數則不會作這個動做


    --apply-log:建立ib_logfile文件,並恢復備份期間產生的redo日誌到ib_logfile和表空間中。注意:若備份期間產生了提交的事務日誌,則apply-log操做會將未提交的事務回滾


    --copy-back:執行恢復數據到目標mysqld,可是目標mysqld的數據目錄不 能用—datadir指定,這一點不一樣與meb,而是須要使用—defaults-file指 定一個配置文件,在配置文件中指定恢復的datadir。與meb不一樣,恢復前必 須清空目錄數據目錄


    --use-memory=1G:備份時xtrabackup可用的內存大小,取決於操做系統可用的內存量,默認爲100M,使用大的內存可加速備份的速度


    --incremental:表示爲增量備份,增量備份只對innodb表有效,對於non-innodb表,例如myisam則無效,由於每次增量備份都會拷貝myisam相關的全部文件,無論上次備份到此次備份有沒有發生更改;而對於innodb表,增量備份則只會備份上次備份到此次備份所更改的表


    --incremental-basedir=/lxw/full-back/:基於上一次的備份目錄作增量 備份


    --incremental-dir=/lxw/incr-backup/:用於將增量備份恢復到全備時指定增量備份的目錄


    --redo-only:增量備份恢復到以前的備份時,除了最後一個增量備份外,其餘的增量備份最好指定該參數


    --databases=’dba.t1 mysql performance_schema lxw.t1’:用於部分備份,能夠用空格分開,指定備份哪些庫的全部表,或者哪些庫的某些表


    --export:在執行apply-log操做時,將應用信息保存到文件中,在恢復部分備份時有用


    --compact:採用壓縮備份


    --rebuild-indexes:解壓縮

相關文章
相關標籤/搜索