mysql在線備份恢復--Xtrabackup

Xtrabackupphp


Xtrabackup是一個對InnoDB作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。mysql

Xtrabackup介紹

Xtrabackup有兩個主要的工具:xtrabackup、innobackupexc++

  • xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表
  • innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個perl腳本封裝,封裝了xtrabackup。主要是爲了方便的同時備份InnoDB和MyISAM引擎的表,但在處理myisam時須要加一個讀鎖。而且加入了一些使用的選項。如slave-info能夠記錄備份恢復後,做爲slave須要的一些信息,根據這些信息,能夠很方便的利用備份來重作slave。

Xtrabackup功能

  • 在線(熱)備份整個庫的InnoDB、 XtraDB

在xtrabackup的上一次整庫備份基礎上作增量備份(innodb only) 以流的形式產生備份,能夠直接保存到遠程機器上(本機硬盤空間不足時頗有用)sql

  • MySQL數據庫自己提供的工具並不支持真正的增量備份,二進制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工做原理以下:
  1. 首先完成一個徹底備份,並記錄下此時檢查點的LSN(Log Sequence Number)。
  2. 在進程增量備份時,比較表空間中每一個頁的LSN是否大於上次備份時的LSN,若是是,則備份該頁,同時記錄當前檢查點的LSN。
  • 首先,在logfile中找到並記錄最後一個checkpoint(「last checkpoint LSN」),而後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接着,開始拷貝所有的數據文件.ibd;在拷貝所有數據文件結束以後,才中止拷貝logfile。
  • 由於logfile裏面記錄所有的數據修改狀況,因此,即時在備份過程當中數據文件被修改過了,恢復時仍然可以經過解析xtrabackup_logfile保持數據的一致。

Xtrabackup備份原理

  • XtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,因爲不鎖表,複製出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。
  • InnoDB維護了一個redo log,又稱爲transaction log,事務日誌,它包含了innodb數據的全部改動狀況。當InnoDB啓動的時候,它會先去檢查data file和transaction log,而且會作二步操做:
  • XtraBackup在備份的時候, 一頁一頁地複製innodb的數據,並且不鎖定表,與此同時,XtraBackup還有另一個線程監視着transactions log,一旦log發生變化,就把變化過的log pages複製走。爲何要急着複製走呢? 由於transactions log文件大小有限,寫滿以後,就會從頭再開始寫,因此新數據可能會覆蓋到舊的數據。
  • 在prepare過程當中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。


1.下載&安裝數據庫

  yum安裝vim

    配置源centos

     #vim /etc/yum.repos.d/percona.repo服務器

[percona]
name = CentOS $releasever - Percona
baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona
gpgcheck = 1

       添加keyapp

          #cd  /etc/pki/rpm-gpgsocket

          #wget http://www.percona.com/downloads/RPM-GPG-KEY-percona

        yum安裝xtrabackup

           [root@server ~]# yum list |grep percona

            Percona-SQL-50-debuginfo.i686              5.0.92-b23.85.rhel5         percona  

            Percona-SQL-client-50.i686                 5.0.92-b23.85.rhel5         percona  

            Percona-SQL-devel-50.i686                  5.0.92-b23.85.rhel5         percona  

            Percona-SQL-server-50.i686                 5.0.92-b23.85.rhel5         percona  

            Percona-SQL-shared-50.i686                 5.0.92-b23.85.rhel5         percona  

            Percona-SQL-shared-compat.i686             5.0.92-b23.85.rhel5         percona  

            Percona-SQL-test-50.i686                   5.0.92-b23.85.rhel5         percona  

            Percona-Server-51-debuginfo.i686           5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-51-debuginfo.i386           5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-55-debuginfo.i686           5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-client-51.i686              5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-client-51.i386              5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-client-55.i686              5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-devel-51.i686               5.1.59-rel13.0.325.rhel5    percona      

            Percona-Server-devel-51.i386               5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-devel-55.i686               5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-server-51.i686              5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-server-51.i386              5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-server-55.i686              5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-shared-51.i686              5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-shared-51.i386              5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-shared-55.i686              5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-shared-compat.i386          5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-shared-compat.i686          5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-test-51.i686                5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-test-51.i386                5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-test-55.i686                5.5.20-rel24.1.217.rhel5    percona  

            percona-toolkit.noarch                     2.0.3-1                     percona  

            xtrabackup.i386                            1.6.5-328.rhel5             percona  

            xtrabackup-debuginfo.i386                  1.6.5-328.rhel5             percona

          #yum install xtrabackup

  rpm安裝

    安裝依賴包

     $ yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses5-devel

       下載包&安裝

           #wget http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6.5/RPM/rhel6/x86_64/xtrabackup-1.6.5-328.rhel6.x86_64.rpm

           #rpm xtrabackup-1.6.5-328.rhel6.x86_64.rpm

2,使用

        Usage: [./xtrabackup [DEFAULTS OPTION] —backup | ./xtrabackup [DEFAULTS OPTION] —prepare] [OPTIONS] 

         Default options are read from the following files in this order: /etc/my.cnf, /opt/mysql-5.0.xx/etc/my.cnf, ~/.my.cnf

參數說明:

--defaults-file=   讀my.cnf的位置,在DB服務器上有多實例時頗有用,未指定將讀/etc/my.cnf~(如要備份DB 3307的數據庫,要單獨指定3307的 my.cnf文件)

--datadir= 數據存放目錄,和my.cnf中要相一致~ (必須,但實際上通常不用特別指定,由於會從my.cnf中去讀取~)
--target-dir= 存放備份文件的目錄,要使用絕對路徑~ 若此目錄開始不存在,則--backup選項會創建此目錄~
--backup   備份InnoDB/XTraDB表空間,存放*.ibd及備份的log文件(xtrabackup_logfile)到 --target-dir目錄~
--stats   統計分析innodb表存儲信息,eg. xtrabackup --stats --defaults-file=/data/scrips/mysql_3306.cnf 
--prepare 返原innodb前要執行,prepare命令~ eg. xtrabackup --prepare --defaults-file=`pwd`/mysql_3306.cnf --throttle=2000 --target-dir=`pwd`/dbbak   
--print-param 主要用於innobackupex腳本copyback操做時, 打印出目標mysqld的參數~
--use-memory= 用於--prepare 或 --stats,在prepare至關於innodb_buffer_pool_size 做用~ eg.xtrabackup --use-memory=1G --stat
--export       --prepare操做時,導入其它數據庫使用。在使用'ALTER TABLE … IMPORT TABLESPACE' 命令時,輸出乾淨的.ibd files 或 .exp 文件.
--suspend-at-end 在backup操做時用於同步(synchronizing)
--log-stream --backup操做時,輸出xtrabackup_logfile內容,innobackupex --stream 就使用此選項~
--incremental-lsn= 用於--backup. Copy only .ibd pages newer than specified LSN 'high:low'
--incremental-basedir= 用於增量備份backup~只拷貝比目標目錄中更新的.ibd 文件~
--incremental-dir=name= 用於增量prepare,
--tables= innodb數據庫使用file-per-table模式時,可用此選項備份部分表~也可用於stat操做時~
--throttle= 用於限制每秒中磁盤的讀寫操做~ 在線備份時很是有用~
--create-ib-logfile 用於--prepare時生成ib-logfile~ 注意:當前版本未實現,仍是要re–prepare^_^
--tmpdir= 存放temporary files的路徑~

 

三、innobackupex工具

(1)備份操做(下列是幾個例子)

####備份employess數據庫(普通備份)#### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=employees /root/backup 1> process_log 2>&1 & 
注意:將數據庫employees備份到目錄/root/backup/XXXX下 
[root@SQL1 ~]# ls -l /root/backup 
total 4 
drwxr-xr-x 3 root root 4096 Apr 13 14:16 2010-04-13_14-14-43 
####備份給定的數據庫列表中的數據庫中(普通備份)#### 
[root@SQL1 ~]# cat backup_db_name 
school 
employees 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=/root/backup_db_name /root/backup 1> process_log 2>&1 & 
或者 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=「school employees」 /root/backup 1> process_log 2>&1 & 
####備份employess數據庫中的employess表(普通備份)#### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases="employees.employees" /root/backup 1> process_log 2>&1 & 
####備份全部的數據庫,並打包(tar方式)##### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --stream=tar /root/backup 1> /root/backup/all_databases.tar 2> process_log & 
####備份全部的數據庫並壓縮,並打包壓縮(tar+gzip方式)#### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --stream=tar /root/backup 2> process_log | gzip > /root/backup/all_databases.tar.gz &

注意:首先要先建立備份目錄:/root/backup,--databases=[ db_name.tb_name | db_name ],若是不使用--databases參數的話,那麼將備份全部的數據庫

(2)恢復操做

(步驟:先apply log,再copy back,最後再chown -R mysql:mysql datadir)

####(普通備份)的還原操做######  [root@SQL1 ~]# ls -l /root/backup/2010-04-13_15-02-37/  total 223484  -rw-r--r-- 1 root root 348 Apr 13 15:02 backup-my.cnf  drwxr-xr-x 2 root root 4096 Apr 13 15:03 employees  -rw-r--r-- 1 root root 228589568 Apr 13 15:03 ibdata1  -rw-r--r-- 1 root root 0 Apr 13 15:03 mysql-stderr  -rw-r--r-- 1 root root 379 Apr 13 15:03 mysql-stdout  -rw-r--r-- 1 root root 1 Apr 13 15:03 xtrabackup_binlog_info  -rw-r--r-- 1 root root 60 Apr 13 15:03 xtrabackup_checkpoints  -rw-r--r-- 1 root root 2048 Apr 13 15:02 xtrabackup_logfile  -rw-r--r-- 1 root root 53 Apr 13 15:03 xtrabackup_slave_info  [root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/2010-04-13_15-02-37  [root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/2010-04-13_15-02-37  [root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data  [root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup*  ####(tar方式備份)的還原操做######  [root@SQL1 ~]# mkdir /root/backup/db  [root@SQL1 ~]# tar -ixvf all_databases.tar -C /root/backup/db(先解壓,注意必須跟-i參數)  [root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/db  [root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/db  [root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data  [root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup  [root@SQL1 ~]# rm -rf /root/backup/db  ####(tar+gzip方式備份)的還原操做######  [root@SQL1 ~]# mkdir /root/backup/db  [root@SQL1 ~]# tar -izxvf all_databases.tar.gz -C /root/backup/db(先解壓,注意必須跟-i參數)  [root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/db  [root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/db  [root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data  [root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup  [root@SQL1 ~]# rm -rf /root/backup/db
相關文章
相關標籤/搜索