Mysql之二:利用Xtrabackup完成數據的備份和還原

#####################################mysql

安裝和簡介sql

備份和還原的實現數據庫

徹底+增量+二進制日誌的備份和還原bash

#####################################服務器

1、安裝和簡介
session

一、簡介app

Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工具。特色:ide

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

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

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

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

(5)還原速度快;

二、安裝

其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 得到。本文基於RHEL5.8的系統,所以,直接下載相應版本的rpm包安裝便可:

rpm -ivh percona-xtrabackup-2.0.0-417.rhel5.i386.rpm


2、備份和還原的實現

一、徹底備份

#####本文中直接使用root
innobackupex --user=root /backup/
#####語法
innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

若是要使用一個最小權限的用戶進行備份,則可基於以下命令建立此類用戶:

mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;

使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中。

在備份的同時,innobackupex還會在備份目錄中建立以下文件:

(1)xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。

(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。

(3)xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。

(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;

(5)backup-my.cnf —— 備份命令用到的配置選項信息;


二、準備(prepare)一個徹底備份

通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。

innobakupex命令的--apply-log選項可用於實現上述功能。以下面的命令:

# innobackupex --apply-log  /path/to/BACKUP-DIR

在實現「準備」的過程當中,innobackupex一般還可使用--use-memory選項來指定其可使用的內存的大小,默認一般爲100M。若是有足夠的內存可用,能夠多劃分一些內存給prepare的過程,以提升其完成速度。



三、從一個徹底備份中恢復數據

innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。

# innobackupex --copy-back  /path/to/BACKUP-DIR

當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在啓動mysqld以前還須要事先修改數據文件的屬主和屬組。如:

# chown -R  mysql:mysql  /mydata/data/


四、使用innobackupex進行增量備份

每一個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增加。這正是InnoDB表能夠進行增量備份的基礎,即innobackupex經過備份上次徹底備份以後發生改變的頁面來實現。

要實現第一次增量備份,可使用下面的命令進行:

# innobackupex --incremental /backup --incremental-basedir=BASEDIR

其中,BASEDIR指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。

須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。

「準備」(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:

(1)須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」。「重放」以後,全部的備份數據將合併到徹底備份上。

(2)基於全部的備份將未提交的事務進行「回滾」。

因而,操做就變成了:

# innobackupex --apply-log --redo-only BASE-DIR

接着執行:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

然後是第二個增量:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR指的是徹底備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即若是有屢次增量備份,每一次都要執行如上操做;



3、徹底+增量+二進制日誌的備份和還原

徹底備份

#####備份前表中數據以下
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | kobe |
|  2 | wade |
|  3 | nash |
+----+------+
#####使用Xtrabackup對全部庫作徹底備份
innobackupex --user=root /backup

第一次增量備份

第一次增量備份
mysql> insert into tb1 (name) values ('firstday');
mysql> select * from tb1;
+----+----------+
| id | name     |
+----+----------+
|  1 | kobe     |
|  2 | wade     |
|  3 | nash     |
|  9 | firstday |
+----+----------+
#####basedir指向徹底備份目錄
innobackupex --incremental /backup --incremental-basedir=/backup/2013-09-19_15-45-49/

第二次增量備份

mysql> insert into tb1 (name) values ('secondday');
mysql> select * from tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
+----+-----------+
#####basedir指向第一次增量備份目錄
innobackupex --incremental /backup --incremental-basedir=/backup/2013-09-19_15-47-49/

第一次滾動日誌插入新數據

mysql> flush logs;
#####查看當前使用二進制日誌文件
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      107 |              |                  |
+------------------+----------+--------------+------------------+
#####刪除制定二進制日誌文件以前的全部文件(不包含制定文件)
mysql> PURGE BINARY LOGS TO 'mysql-bin.000002'; 
mysql> insert into tb1 (name) values ('thirdday');
mysql> select * from tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
| 11 | thirdday  |
+----+-----------+

第二次滾動日誌插入數據

mysql> flush logs;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      341 |              |                  |
+------------------+----------+--------------+------------------+
mysql> insert into tb1 (name) values ('forthday');
#####最後數據爲
mysql> select * from tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
| 13 | thirdday  |
| 14 | forthday  |
+----+-----------+

基於多個二進制日誌生成單個SQL格式文件

#####查看快照時刻所處位置的時間點
[root@localhost ~]# mysqlbinlog --start-position=107 /mydata/data/mysql-bin.000002
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#130919 15:59:00 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.28-log created 130919 15:59:00   #時間
#####基於時間作限定來合併多個日誌文件爲一個SQL格式的文件(很明顯是從2的開始到3的結束)
mysqlbinlog --start-datetime='2013-09-19 15:59:00 ' /mydata/data/mysql-bin.000002 /mydata/data/mysql-bin.000003 > /backup/increment-`date +%F`.sql

準備操做(合併全部Xtrabackup備份數據)

#####準備徹底備份
innobackupex --apply-log --redo-only /backup/2013-09-19_15-45-49/
#####合併第一次增量備份
innobackupex --apply-log --redo-only /backup/2013-09-19_14-00-12/ --incremental-dir=/backup/2013-09-19_14-07-35/
#####合併第二次增量備份
innobackupex --apply-log --redo-only /backup/2013-09-19_15-45-49/ --incremental-dir=/backup/2013-09-19_15-50-46/

模擬數據庫損壞

service mysqld stop
rm -rf /mydata/data/*

徹底+增量的數據還原

#####一次性便可還原合併後用Xtrabackup備份過的全部文件
innobackupex --copy-back /backup/2013-09-19_15-45-49/
chown -R mysql.mysql /mydata/data/
service mysqld start
mysql> use soulboy
#####還原成功
mysql> select * from tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
+----+-----------+

利用二進制日誌完成即時點恢復

#####禁止二進制日誌記錄功能
mysql> set sql_log_bin=0;
#####即時點回復
mysql> source /backup/increment-2013-09-19.sql
#####開啓二進制日誌記錄功能
mysql> set sql_log_bin=1;
#####還原成功,至此全部數據還原成功
mysql> select * from tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
| 13 | thirdday  |
| 14 | forthday  |
+----+-----------+
相關文章
相關標籤/搜索