Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工具。特色:mysql
(1)備份過程快速、可靠;sql
(2)備份過程不會打斷正在執行的事務;數據庫
(3)可以基於壓縮等功能節約磁盤空間和流量;vim
(4)自動實現備份檢驗;centos
(5)還原速度快;bash
官方介紹和下載地址:https://www.percona.com/software/percona-xtrabackup服務器
官方有系統rpm包版的軟件,能夠下載rpm包版的軟件直接安裝,因爲xtrabackup是使用perl腳本編寫的因此須要安裝perl-DBD-MySQL不然會報依賴。app
[root@MariaDB~]# yum -y install perl-DBD-MySQL [root@MariaDB~]# rpm -ivh percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
innobackupex: 客戶端工具, 以mysql協議連入mysqld,不支持離線備份,可是支持離線恢復ide
使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中。工具
在使用innobackupex進行備份時,還可使用--no-timestamp選項來阻止命令自動建立一個以時間命名的目錄;如此一來,innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據。
示例:
[root@MariaDB~]# innobackupex --user=root --password=centos /backup/ [root@MariaDB~]# ll /backup/ total4 drwxr-xr-x2 root root 4096 Jun 16 02:28 2015-06-16_02-28-54
備份時報了一個錯
innobackupex:Error: The xtrabackup child process has died at /usr/bin/innobackupex line2672.
解決方法:修改innodb日誌文件大小爲5M,修改完成重啓服務生效
[root@MariaDB~]# vim /etc/my.cnf innodb_log_file_size= 5M
備份完成以後在/backup目錄下就有了以下內容
[root@MariaDB ~]# ll /backup/2015-06-15_23-49-43/ total 18468 -rw-r--r-- 1 root root 356 Jun 15 23:49 backup-my.cnf drwxr-xr-x 2 root root 4096 Jun 15 23:49 hellodb -rw-r----- 1 root root 18874368 Jun 15 23:49ibdata1 drwxr-xr-x 2 root root 4096 Jun 15 23:49 mysql drwxr-xr-x 2 root root 4096 Jun 15 23:49 performance_schema drwxr-xr-x 2 root root 4096 Jun 15 23:49 test -rw-r--r-- 1 root root 23 Jun 15 23:49 xtrabackup_binlog_info -rw-r----- 1 root root 89 Jun 15 23:49 xtrabackup_checkpoints -rw-r--r-- 1 root root 559 Jun 15 23:49 xtrabackup_info -rw-r----- 1 root root 2560 Jun 15 23:49 xtrabackup_logfile
文件說明:
(1)xtrabackup_checkpoints—— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
[root@MariaDB 2015-06-15_23-49-43]# catxtrabackup_checkpoints backup_type = full-backuped #備份類型,full-backuped表示徹底備份 from_lsn = 0 #日誌序列開始 to_lsn = 1597945 #最大日誌序列號 last_lsn = 1597945 #當前日誌序列號 compact = 0 #表示沒有打包
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
[root@MariaDB 2015-06-15_23-49-43]# catxtrabackup_binlog_info mysql-bin.000005 245
(3)backup-my.cnf —— 備份命令用到的配置選項信息和備份無關的不會記錄,備份配置文件的話須要單獨備份
[root@MariaDB 2015-06-15_23-49-43]# catbackup-my.cnf # This MySQL options file was generated byinnobackupex. # The MySQL server [mysqld] innodb_checksum_algorithm=innodb innodb_log_checksum_algorithm=innodb innodb_data_file_path=ibdata1:10M:autoextend innodb_log_files_in_group=2 innodb_log_file_size=5242880 innodb_fast_checksum=0 innodb_page_size=16384 innodb_log_block_size=512 innodb_undo_tablespaces=0
(4)xtrabackup_info —— 記錄了mariadb的版本信息和一些屬性信息,還原是檢測版本匹配度時用到
[root@MariaDB 2015-06-15_23-49-43]# catxtrabackup_info uuid = 25b79086-1376-11e5-980a-000c29bad792 name = tool_name = innobackupex tool_command = --user=root --password=... /backup/ tool_version = 1.5.1-xtrabackup ibbackup_version = xtrabackup version 2.2.3 basedon MySQL server 5.6.17 Linux (x86_64) (revision id: ) server_version = 5.5.43-MariaDB-log start_time = 2015-06-15 23:49:43 end_time = 2015-06-15 23:49:46 lock_time = 1 binlog_pos = filename 'mysql-bin.000005', position245 innodb_from_lsn = 0 innodb_to_lsn = 1597945 partial = N incremental = N format = file compact = N compressed = N encrypted = N
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處於不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobakupex命令的--apply-log選項可用於實現上述功能。以下面的命令:
[root@MariaDB 2015-06-15_23-49-43]# innobackupex--apply-log /backup/2015-06-15_23-49-43/
若是執行正確,其最後輸出的一行信息一般以下:
150615 23:58:59 innobackupex: completed OK!
在實現「準備」的過程當中,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以前還須要事先修改數據文件的屬主和屬組。
模擬數據庫損壞
刪除mariadb數據目錄中的全部內容,模擬數據庫損壞
[root@MariaDB~]# rm -rf /mydata/data/* [root@MariaDB~]# ll /mydata/data/ total0
恢復數據
[root@MariaDB~]# innobackupex --copy-back /backup/2015-06-15_23-49-43/ [root@MariaDB ~]# chown -R mysql:mysql /mydata/data/ [root@MariaDB~]# ll /mydata/data/ total 28692 drwxr-xr-x2 mysql mysql 4096 Jun 16 00:01hellodb -rw-r--r--1 mysql mysql 18874368 Jun 16 00:01 ibdata1 -rw-r--r--1 mysql mysql 5242880 Jun 16 00:01ib_logfile0 -rw-r--r--1 mysql mysql 5242880 Jun 16 00:01ib_logfile1 drwxr-xr-x2 mysql mysql 4096 Jun 16 00:01 mysql drwxr-xr-x2 mysql mysql 4096 Jun 16 00:01performance_schema drwxr-xr-x2 mysql mysql 4096 Jun 16 00:01 test -rw-r--r--1 mysql mysql 559 Jun 16 00:01xtrabackup_info
恢復完成以後,還須要啓動一下Mysql服務,不然Mariadb是是不會記錄二進制日誌的,這個時候啓動起來是從新記錄二進制日誌的。
[root@MariaDB ~]# service mysqld start
提示:在恢復完成以後應該再次作一次徹底備份,後期的增量備份都依照此次的徹底備份來作。
[root@MariaDB ~]# innobackupex --user root --password centos/backup
每一個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-onlyBASE-DIR
接着執行:
# innobackupex --apply-log --redo-onlyBASE-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指的是第二次增量備份的目錄,其它依次類推,即若是有屢次增量備份,每一次都要執行如上操做;
因爲上面的徹底備份恢復以後又進行了一次徹底備份,這裏再也不進行徹底備份,增量備份直接根據上面的徹底備份進行。
查看lsn日誌的起始和結束位置,第一次增量備份的LSN起始位置就是徹底備份LSN的結束位置
[root@MariaDB ~]# cat/backup/2015-06-15_23-45-01/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 1602246 last_lsn = 1602246 compact = 0
修改數據庫內容
MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 21 | | 22 | | 23 | +------+ MariaDB[hellodb]> delete from tb1 where id=21; MariaDB[hellodb]> delete from tb1 where id=22; MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 23 | +------+
第一次增量備份
只須要指向上一次徹底備份的位置和這一次增量備份的存儲位置便可
[root@MariaDB ~]# innobackupex --user root--password centos --incremental /backup/ --incremental-basedir=/backup/2015-06-15_23-45-01/
備份完成以後查看checkpoints信息
[root@MariaDB ~]# cat/backup/2015-06-15_23-47-02/xtrabackup_checkpoints backup_type = incremental #備份類型表示爲增量 from_lsn = 1602246 #表示備份的起始位置 to_lsn = 1604539 last_lsn = 1604539 compact = 0
再次修改一些數據
MariaDB[hellodb]> insert into tb1 values (1000),(9000); MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 23 | |1000 | |9000 | +------+
第二次作增量備份
這是備份是基於第一次增量備份進行
[root@MariaDB ~]# innobackupex --user root--password centos --incremental /backup--incremental-basedir=/backup/2015-06-15_23-47-02/ [root@MariaDB ~]# cat/backup/2015-06-15_23-51-55/xtrabackup_checkpoints backup_type = incremental from_lsn = 1604539 #備份起始位置是第一次增量備份的結束位置 to_lsn = 1604539 last_lsn = 1605623 compact = 0
再次修改一次數據,此次修改沒有作備份
MariaDB[hellodb]> insert into tb1 values (88888); MariaDB[hellodb]> select * from tb1; +-------+ |id | +-------+ | 1 | | 2 | | 3 | | 23 | | 1000 | | 9000 | |88888 | +-------+
說明:因爲沒有實現將bin-log文件和數據目錄分開,因此我先導入二進制日誌文件中的修改內容。
查看binlog_info日誌位置記錄位置爲1621,那麼只須要把1621以後的修改導出爲sql文件便可。
[root@MariaDB~]# cat /backup/2015-06-15_23-51-55/xtrabackup_binlog_info mysql-bin.000005 979 [root@MariaDB ~]# mysqlbinlog --start-position=979/mydata/data/mysql-bin.000005 > /backup/timepoint.sql
中止mysqld服務,而後刪除數據目錄下的全部數據,模擬硬盤損壞
[root@MariaDB~]# service mysqld stop [root@MariaDB~]# rm -rf /mydata/data/*
恢復過程:合併徹底備份
[root@MariaDB ~]# innobackupex --apply-log-redo-only /backup/2015-06-15_23-45-01/
合併第一個增量備份
[root@MariaDB ~]# innobackupex --apply-log-redo-only /backup/2015-06-15_23-45-01/--incremental-dir=/backup/2015-06-15_23-47-02/
合併第二個增量備份
[root@MariaDB ~]# innobackupex --apply-log-redo-only /backup/2015-06-15_23-45-01/--incremental-dir=/backup/2015-06-15_23-51-55/
使用合併後的命令進行恢復
[root@MariaDB ~]# innobackupex --copy-back/backup/2015-06-15_23-45-01/
設置完成以後修改數據目錄的屬主屬組
[root@MariaDB data]# chown -R mysql.mysql ./* [root@MariaDB data]# ll total 18452 drwxr-xr-x 2 mysql mysql 4096 Jun 16 00:01 hellodb -rw-r--r-- 1 mysql mysql 18874368 Jun 16 00:01ibdata1 drwxr-xr-x 2 mysql mysql 4096 Jun 16 00:01 mysql drwxr-xr-x 2 mysql mysql 4096 Jun 16 00:01 performance_schema drwxr-xr-x 2 mysql mysql 4096 Jun 16 00:01 test -rw-r--r-- 1 mysql mysql 632 Jun 16 00:01 xtrabackup_info
設置完成以後啓動Mysql服務器
[root@MariaDBdata]# service mysqld start
查看數據庫這個時候尚未第二次增量備份以後修改的數據
MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 23 | |1000 | |9000 | +------+
將從二進制導出的sql文件,導入到數據庫
[root@MariaDB ~]# mysql -u root -p < /backup/timepoint.sql
查看數據就已經恢復了
MariaDB[hellodb]> select * from tb1; +-------+ |id | +-------+ | 1 | | 2 | | 3 | | 23 | | 1000 | | 9000 | |88888 | +-------+
默認狀況下,InnoDB表不能經過直接複製表文件的方式在mysql服務器之間進行移植,即使使用了innodb_file_per_table選項。而使用Xtrabackup工具能夠實現此種功能,不過,此時須要「導出」表的mysql服務器啓用了innodb_file_per_table選項(嚴格來講,是要「導出」的表在其建立以前,mysql服務器就啓用了innodb_file_per_table選項),而且「導入」表的服務器同時啓用了innodb_file_per_table和innodb_expand_import選項。
(1)「導出」表
導出表是在備份的prepare階段進行的,所以,一旦徹底備份完成,就能夠在prepare過程當中經過--export選項將某表導出了:
# innobackupex --apply-log --export/path/to/backup
此命令會爲每一個innodb表的表空間建立一個以.exp結尾的文件,這些以.exp結尾的文件則能夠用於導入至其它服務器。
(2)「導入」表
要在mysql服務器上導入來自於其它服務器的某innodb表,須要先在當前服務器上建立一個跟原表表結構一致的表,然後才能實現將表導入:
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
而後將此表的表空間刪除:
mysql> ALTER TABLEmydatabase.mytable DISCARD TABLESPACE;
接下來,未來自於「導出」表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,而後使用以下命令將其「導入」:
mysql> ALTER TABLEmydatabase.mytable IMPORT TABLESPACE;
爲了方便稱呼,將導出表的服務器稱爲「源服務器」,導入表的服務器稱爲目標服務器。
設置以前先作一次全庫備份,由於導出表是根據備份進行導出的
[root@MariaDB~]# innobackupex --user root --password centos /backup/
源服務器導出全部innodb存儲引擎的表
[root@MariaDB~]# innobackupex --apply-log --export /backup/2015-06-16_00-14-21/
查看hellodb導出的表文件
[root@MariaDB ~]# ls/backup/2015-06-16_00-14-21/hellodb/ classes.frm coc.MYD courses.MYI scores.MYI tb1.cfg teachers.frm toc.MYD classes.MYD coc.MYI db.opt students.frm tb1.exp teachers.MYD toc.MYI classes.MYI courses.frm scores.frm students.MYD tb1.frm teachers.MYI coc.frm courses.MYD scores.MYD students.MYI tb1.ibd toc.frm
目標服務器建立數據庫和準備導入的表
建立的表須要和源服務器上面的建立表的時候使用如出一轍的命令;源服務器查看建立表的方法以下
MariaDB[hellodb]> show create table tb1; +-------+---------------------------------------------------------------------------------------+ |Table | Create Table | +-------+---------------------------------------------------------------------------------------+ |tb1 | CREATE TABLE `tb1` ( `id` int(11) DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+---------------------------------------------------------------------------------------+
獲取到源服務器建立表的命令後,目標服務器就能夠直接複製用來建立表
MariaDB[(none)]> create database mydb; MariaDB[(none)]> use mydb; MariaDB[mydb]> CREATE TABLE `tb1` ( -> `id` int(11) DEFAULT NULL -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; MariaDB[mydb]> show tables; +----------------+ |Tables_in_mydb | +----------------+ |tb1 | +----------------+
目標服務器須要啓用每表一個表空間的選項,此選項我在安裝Mariadb時已經開啓。
MariaDB[mydb]> show global variables like 'innodb_file%'; +--------------------------+----------+ |Variable_name | Value | +--------------------------+----------+ |innodb_file_format | Antelope | |innodb_file_format_check | ON | |innodb_file_format_max | Antelope | |innodb_file_per_table | ON | #此處爲ON表示啓用 +--------------------------+----------+ 4rows in set (0.00 sec)
目標服務器刪除建立表的表空間
MariaDB[mydb]> ALTER TABLE tb1 DISCARD TABLESPACE;
複製表空間文件到遠程服務器
[root@MariaDBhellodb]# scp tb1.frm tb1.ibd 172.16.4.10:/mydata/data/mydb
修改屬組和屬主爲Mysql
[root@MariaDB~]# cd /mydata/data/mydb/ [root@MariaDBmydb]# ll total112 -rw-rw----1 mysql mysql 65 May 27 22:45 db.opt -rw-rw----1 mysql mysql 8556 May 27 22:53 tb1.frm -rw-r-----1 root root 98304 May 27 22:53 tb1.ibd [root@MariaDBmydb]# chown -R mysql:mysql tb1.ibd [root@MariaDBmydb]# ll total112 -rw-rw----1 mysql mysql 65 May 27 22:45 db.opt -rw-rw----1 mysql mysql 8556 May 27 22:53 tb1.frm -rw-r-----1 mysql mysql 98304 May 27 22:53 tb1.ibd
從新導入表空間
MariaDB[mydb]> ALTER TABLE tb1 IMPORT TABLESPACE;
查看數據庫狀態
MariaDB[mydb]> show table status like 'tb1'\G; ERROR2006 (HY000): MySQL server has gone away Noconnection. Trying to reconnect... Connectionid: 1 Currentdatabase: mydb ***************************1. row *************************** Name: tb1 Engine: InnoDB Version: 10 Row_format: Compact Rows: 8 Avg_row_length: 2048 Data_length: 16384 Max_data_length:0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2015-05-27 22:53:24 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1row in set (0.01 sec) ERROR:No query specified
查看錶已經有了數據
MariaDB[mydb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 23 | |1000 | |9000 | +------+ 6rows in set (0.01 sec)
補充:若是對於MyISAM存儲引擎來講,直接複製三個文件(.frm: 表結構 .MYD:表數據.MYI:表索引)到表目錄下便可,MyISAM會自動識別的。