xtrabackup備份msyql數據庫

 

簡介:

Xtrabackup是由percona提供的mysql數據庫備份工具,可以對Innodb數據庫做熱備

特點:

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

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

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

(4)自動實現備份檢驗

(5)還原速度快

準備工作:

1.安裝xtrabackup(在percona官網下載rpm包)

# yum install percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm

 

2.創建最小權限用戶

 MariaDB [(none)]>grant reload,lock tables,replication client on *.* to 'backupuser'@'localhost' identified by 'backuppassword';

 

MariaDB [(none)]> flush privileges;

Query OK, 0 rows affected (0.04 sec)

 

開始備份:(模擬線上環境)

1.完全備份(生成的備份目錄爲2015-04-09_02-35-22)

# innobackupex --user=backupuser --password=backuppassword /backup/

若顯示以下內容即爲備份成功:

150409 02:35:25  innobackupex: Connection to database server closed

150409 02:35:25  innobackupex: completed OK!

 

若顯示以下錯誤信息:在my.cnf文件[mysqld] 中添加innodb_log_file_size = 5M 

InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes

InnoDB: than specified in the .cnf file 50331648 bytes!

innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2672.

 

 

2.在數據庫插入數據,模擬msyqld正常線上運行第一天

MariaDB [(none)]> create database xx;

Query OK, 1 row affected (0.00 sec)

 

3.執行增量備份(生成2015-04-09_02-59-13,此時--incremental-basedir則應該指爲完全備份的目錄2015-04-09_02-35-22)

注意:增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份

 

# innobackupex --incremental /backup/ --incremental-basedir=/backup/2015-04-09_02-35-22/

顯示以下信息即爲增量備份成功:

innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 324

150409 02:59:18  innobackupex: Connection to database server closed

150409 02:59:18  innobackupex: completed OK!

 

4.再次在數據庫插入數據,模擬mysqld正常線上運行第二天

MariaDB [(none)]> create database yy;

Query OK, 1 row affected (0.00 sec)

 

5.再次執行增量備份(生成2015-04-09_03-00-38,此時--incremental-basedi則應該指爲上一次增量備份的目錄2015-04-09_02-59-13)

# innobackupex --incremental /backup/ --incremental-basedir=/backup/2015-04-09_02-59-13/

 

6.再次在數據庫插入數據,模擬mysqld正常線上運行第三天

MariaDB [(none)]> create database zz;

Query OK, 1 row affected (0.00 sec)

 

7.模擬事故,停掉mysqld,刪除/data目錄下的數據

注意:線上環境應該將二進制日誌文件(binlog)和數據文件分開存放;

# service mysqld stop

說明:因爲此處實驗我並沒有將二進制日誌文件和數據分開存放,所以我先將二進制日誌複製到其他目錄再刪除數據

# cp mysql-bin.000001  /backup/

# rm /data/* -rf

 

8.查看上一次增量備份,二進制日誌最後記錄position的位置

# cat /backup/2015-04-09_03-00-38/xtrabackup_binlog_info

mysql-bin.000001        479        

 

9.導出二進制日誌,從最後備份的position開始

# mysqlbinlog mysql-bin.000001 --start-position="479">/backup/binlog.sql

 

恢復數據:

一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態

“準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:

(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後,所有的備份數據將合併到完全備份上。

(2)基於所有的備份將未提交的事務進行“回滾”。

 

此時備份目錄下的所有文件:

wKioL1dqKOiQUoNXAAAM-26XEUw639.png

按排列順序:完全備份文件  第一次增量備份文件  第二次增量備份文件  導出的部分二進制日誌文件  所有的二進制日誌文件

 

 

1.整理合並備份文件

# innobackupex --apply-log --redo-only /backup/2015-04-09_02-35-22/

 

將第一個增量備份合併到完全備份中

# innobackupex --apply-log --redo-only /backup/2015-04-09_02-35-22/ --incremental-dir=/backup/2015-04-09_02-59-13/

 

將第二個增量備份合併到完全備份中

# innobackupex --apply-log --redo-only /backup/2015-04-09_02-35-22/ --incremental-dir=/backup/2015-04-09_03-00-38/

注意:假如我們在每週日晚上00:00點做完全備份,在周1-周6晚上00:00點做增量備份,剛好有用戶一直在00:00點前一直在操作,並且在00:01分才提交事務,所以爲了避免系統自動將備份時候未提交的事務做回滾操作,所以我們需要加上--redo-only參數,讓其只提交事務,而不回滾事務。到最後系統會判定哪些是需要回滾的操作執行回滾

 

2.恢復操作

# innobackupex --copy-back /backup/2015-04-09_02-35-22/

 

3.改變恢復後數據目錄(/data)下文件的屬主屬組爲msyql

# chown -R mysql.mysql /data/*

 

4.查看數據庫有備份的內容有無恢復

# service mysqld start

 

wKiom1dqKOiD8PvCAABATJbwfjU490.png

可以看到備份的數據已經恢復

 

5.通過二進制日誌恢復未來得及備份的數據

# mysql <binlog.sql

 

wKiom1dqKOnBLh5nAABCDjeHUJ8464.png

可以看到未來的及備份的數據也通過二進制日誌恢復

 

-------------------------------完成。-------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章