mysqldump與xtrabackup備份流程差別圖
mysql
3.1優點特性sql
1.徹底以熱備的形式進行,可以實現快速可靠地徹底備份和部分備份,支持增量備份,支持時間點還原;數據庫
2.備份過程當中不會打擾到事務操做,可以實現網絡傳輸和壓縮功能,備份完成後可自動驗證數據是否可用,恢復速度較快。服務器
3.更多優點特性請參考http://www.percona.com/software/percona-xtrabackup網絡
注意:XtraBackup對myISAM只能溫備,並且不能支持增量備份。對innoDB引擎要求單表單空間,不然沒法進行單表的導進導出;app
mysql>SHOW GLOBAL VARIABLES LIKE '%per_table%';ide
|Variable_name | Value |工具
|innodb_file_per_table | ON |spa
其中的innodb_file_per_table爲ON則表示實現了單表單空間。若爲OFF則須要使用mysqldump全備而後更改配置文件刪除原來的數據文件並從新初始化服務器最後將數據從新導入。因此建議之後在安裝Mysql服務器時將其選項默認設置成1便可(innodb_file_per_table = 1)。3d
3.2 安裝xtrabackup
[root@station253~]# yum -y install perl-DBD-MySQL perl-Time-HiRes
[root@station253~]# rpm -ivh percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
[root@station253~]# rpm -ql percona-xtrabackup
/usr/bin/innobackupex 統一接口識別innodb的版本,啓動對應的xtrabackup
/usr/bin/innobackupex-1.5.1
/usr/bin/xbcrypt
/usr/bin/xbstream 流式備份
/usr/bin/xtrabackup
/usr/bin/xtrabackup_55真正執行備份工具
/usr/bin/xtrabackup_56真正執行備份工具
/usr/share/doc/percona-xtrabackup-2.1.4
/usr/share/doc/percona-xtrabackup-2.1.4/COPYING
[root@station253~]# innobackupex --help 內置幫助
3.4 備份步驟
1.創建備份帳戶
2.徹底備份
[root@station253~]# mkdir /innobackup
1.爲備份創建一個只有備份權限的用戶
mysql>create user 'percona'@'localhost' identified by 'redhat';
mysql>show grants for 'percona'@'localhost'; 權限太大
| Grantsfor percona@localhost
| GRANTUSAGE ON *.* TO 'percona'@'localhost' IDENTIFIED BY PASSWORD '*84BB5DF4823DA319BBF86C99624479A198E6EEE9'|
mysql>revoke all privileges,grant option from 'percona'@'localhost';
mysql>grant reload,lock tables,replication client on *.* to 'percona'@'localhost';
mysql>flush privileges;
2.徹底備份
[root@station253~]# innobackupex --user=percona --password=redhat /innobackup/
innobackupex:Backup created in directory '/innobackup/2014-05-23_02-41-15'
innobackupex:MySQL binlog position: filename 'mysql-bin.000002', position 1949
[root@station253~]# ls /innobackup/2014-05-23_02-41-15
backup-my.cnf ibdata1 performance_schema test xtrabackup_binlog_info xtrabackup_logfile
cactidb mysql school xtrabackup_binary xtrabackup_checkpoints
[root@station2532014-05-23_02-41-15]# cat xtrabackup_checkpoints
backup_type= full-backuped 備份類型
from_lsn= 0 lsn起始點
to_lsn =1670221 lsn結束點
last_lsn= 1670221 最後一個lsn
compact= 0 非緊密
[root@station2532014-05-23_02-41-15]# cat xtrabackup_binlog_info 二進制日誌文件至備份這一刻爲止位置
mysql-bin.000002 1949
[root@station2532014-05-23_02-41-15]# file xtrabackup_logfile xtrbackup日誌非文本文件
xtrabackup_logfile:data
備份完成,但不能用於直接還原,有增量日誌就只能提交事務不能回滾
3.5恢復步驟
1. 準備prepare一個徹底備份
2. 從一個徹底備份中恢復數據
1. 準備prepare一個徹底備份
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobakupex命令的--apply-log選項可用於實現上述功能。以下面的命令:實現提交已提交事務,回滾未提交事務
#innobackupex --apply-log --redo-only /path/to/BACKUP-DIR
2、從一個徹底備份中恢復數據
注意:恢復不用啓動MySQL
innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。
mysql啓動後執行
#innobackupex --copy-back /path/to/BACKUP-DIR
5.備份剛完成數據庫就崩潰,如何恢復數據庫
模擬崩潰
mysql>show master status;
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
|mysql-bin.000002 | 1949 | | |
[root@station253~]# service mysqld stop
[root@station253~]# rm -rf /mydata/data/*
[root@station253~]# chown -R mysq.mysql /mydata/data
[root@station253~]# cd /usr/local/mysql
5.1先準備徹底備份,回滾未說起,同步已提交
#innobackupex --apply-log --redo-only /path/to/BACKUP-DIR
[root@station253mysql]# innobackupex --apply-log --redo-only /innobackup/2014-05-23_02-41-15/
InnoDB:Last MySQL binlog file position 0 1473, file name ./mysql-bin.000002
5.2從徹底備份中恢復數據--copy-back
#innobackupex --copy-back /path/to/BACKUP-DIR
[root@station253mysql]# innobackupex --copy-back /innobackup/2014-05-23_02-41-15/
5.3修復屬組屬主
[root@station253~]# ll /mydata/data
總用量 28696
drwxr-xr-x2 root root 4096 5月 23 03:19 cactidb
-rw-r--r--1 root root 18874368 5月 23 03:19 ibdata1
-rw-r--r--1 root root 5242880 5月 23 03:19 ib_logfile0
-rw-r--r--1 root root 5242880 5月 23 03:19 ib_logfile1
drwxr-xr-x2 root root 4096 5月 23 03:19 mysql
drwxr-xr-x2 root root 4096 5月 23 03:19 performance_schema
drwxr-xr-x2 root root 4096 5月 23 03:19 school
drwxr-xr-x2 root root 4096 5月 23 03:19 test
-rw-r--r--1 root root 24 5月 23 03:19xtrabackup_binlog_pos_innodb
[root@station253~]# chown -R mysql.mysql /mydata/data
[root@station253~]# service mysqld start
[root@station253~]# mysql -uroot -predhat -e "SHOW DATABASES;"
|Database |
|information_schema |
|cactidb |
|mysql |
|performance_schema |
|school |
|test |
6. 使用innobackup增量備份
由於增量備份恢復後必須合併入徹底備份,並且增量備份基於徹底備份,必須每一次數據庫恢復後馬上作一次徹底備份。
6.1.增量備份前先徹底備份,前一份完備作過apply-log不能複用
[root@station253~]# innobackupex --user=root --password=redhat /innobackup/
innobackupex:Backup created in directory '/innobackup/2014-05-23_03-31-16'
innobackupex:MySQL binlog position: filename 'mysql-bin.000001', position 107
[root@station253~]# ls /innobackup/
2014-05-23_02-41-15 2014-05-23_03-31-16
6.2 第一次增量操做並增量備份
[root@station253~]# mysql -uroot -predhat
mysql>use school;
mysql>INSERT INTO students (Name,Age,Gender,ClassID) VALUES('Guo Jin',18,'M',3);
mysql>select * from students;
| StuID| Name | Age | Gender | ClassID |
| 1 | Shi zhongyu | 22 | M | 2 |
| 2 | Shi zhongyu | 22 | M | 2 |
| 3 | Guo Jin | 18 | M | 3 |
# innobackupex --incremental /backup備份目錄--incremental-basedir=BASEDIR對應基準目錄
其中,BASEDIR指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。增量備份會自動建立時間子目錄包含xtrabackup_checkpoints。
[root@station253mysql]# innobackupex --user=root --password=redhat --incremental /innobackup/--incremental-basedir=/innobackup/2014-05-23_03-31-16/
innobackupex:Backup created in directory '/innobackup/2014-05-23_03-42-07'
innobackupex:MySQL binlog position: filename 'mysql-bin.000001', position 370
14052303:42:11 innobackupex: Connection todatabase server closed
14052303:42:11 innobackupex: completed OK!
[root@station253~]# ls /innobackup/
2014-05-23_02-41-15 2014-05-23_03-31-16第一次全備 2014-05-23_03-42-07第一次增量
[root@station253~]# cd /innobackup/2014-05-23_03-42-07/
[root@station2532014-05-23_03-42-07]# cat xtrabackup_binlog_info 增量後二進制文件日誌及位置
mysql-bin.000001 370
[root@station2532014-05-23_03-42-07]# cat xtrabackup_checkpoints
backup_type= incremental 備份類型增量
from_lsn= 1671692
to_lsn =1672024
last_lsn= 1672024
compact= 0
6.3第二次增量操做並增量備份
mysql>INSERT INTO students (Name,Age,Gender,ClassID) VALUES ('Tom',33,'M',2);
mysql>select * from students;
| StuID| Name | Age | Gender | ClassID |
| 1 | Shi zhongyu | 22 | M | 2 |
| 2 | Shi zhongyu | 22 | M | 2 |
| 3 | Guo Jin | 18| M | 3 |
| 4 | Tom | 33 | M | 2 |
第二次增量備份以第一次增量爲basedir
[root@station2532014-05-23_03-42-07]# innobackupex --user=root --password=redhat --incremental/innobackup/ --incremental-basedir=/innobackup/2014-05-23_03-42-07/
innobackupex:Backup created in directory '/innobackup/2014-05-23_03-50-16'
innobackupex:MySQL binlog position: filename 'mysql-bin.000001', position 630
14052303:50:20 innobackupex: Connection todatabase server closed
14052303:50:20 innobackupex: completed OK!
[root@station253~]# ls /innobackup/
2014-05-23_02-41-15 2014-05-23_03-31-16 2014-05-23_03-42-07第一次增量 2014-05-23_03-50-16第二次增量
[root@station2532014-05-23_03-50-16]# cat xtrabackup_binlog_info
mysql-bin.000001 630
[root@station2532014-05-23_03-50-16]# cat xtrabackup_checkpoints
backup_type= incremental
from_lsn= 1672024 對應上一次結束點
to_lsn =1672332
last_lsn= 1672332
compact= 0
6.4第二次增量備份又作改變,但未作再次備份,即時點操做恢復依賴二進制日誌
mysql>INSERT INTO students (Name,Age,Gender,ClassID) VALUES ('Jerry',12,'F',3);
mysql>select * from students;
| StuID| Name | Age | Gender | ClassID |
| 1 | Shi zhongyu | 22 | M | 2 |
| 2 | Shi zhongyu | 22 | M | 2 |
| 3 | Guo Jin | 18 | M | 3 |
| 4 | Tom | 33 | M | 2 |
| 5 | Jerry | 12 | F | 3 |
+-------+-------------+-----+--------+---------+
mysql>show master status;
|File | Position |Binlog_Do_DB | Binlog_Ignore_DB |
|mysql-bin.000001 | 892 | | |
先備份二進制日誌
[root@station253data]# cp -aR /mydata/data/mysql-bin.000001 /tmp/
[root@station253data]# ll /tmp/mysql-bin.000001
-rw-rw----1 mysql mysql 892 5月 23 03:55 /tmp/mysql-bin.000001
6.5 模擬崩潰並恢復數據庫
[root@station253~]# service mysqld stop
[root@station253data]# rm -rf *
6.5.1先準備徹底備份,回滾未說起,同步已提交
#innobackupex --apply-log --redo-only /path/to/BACKUP-DIR
[root@station253~]# ls /innobackup/
2014-05-23_02-41-15 2014-05-23_03-31-16 2014-05-23_03-42-07 2014-05-23_03-50-16
準備徹底備份
[root@station253mysql]# innobackupex --apply-log --redo-only /innobackup/2014-05-23_03-31-16/
IInnoDB: Last MySQL binlog file position 0 1473, file name ./mysql-bin.000002
準備第一次增量備份
[root@station253~]# innobackupex --apply-log --redo-only /innobackup/2014-05-23_03-31-16/--incremental-dir=/innobackup/2014-05-23_03-42-07
準備第二次增量備份
[root@station253~]# innobackupex --apply-log --redo-only /innobackup/2014-05-23_03-31-16/--incremental-dir=/innobackup/2014-05-23_03-50-16
查看完整備份信息
[root@station253~]# ls /innobackup/
2014-05-23_02-41-15 2014-05-23_03-31-16 2014-05-23_03-42-07 2014-05-23_03-50-16
對比last_lsn,全備結束點已經覆蓋第一次第二次增量,準備工做成功
[root@station253~]# cat /innobackup/2014-05-23_03-31-16/xtrabackup_checkpoints
backup_type= full-prepared
from_lsn= 0
to_lsn =1672332
last_lsn = 1672332
compact= 0
[root@station253~]# cat /innobackup/2014-05-23_03-42-07/xtrabackup_checkpoints
backup_type= incremental
from_lsn= 1671692
to_lsn =1672024
last_lsn= 1672024
compact= 0
[root@station253~]# cat /innobackup/2014-05-23_03-50-16/xtrabackup_checkpoints
backup_type= incremental
from_lsn= 1672024
to_lsn =1672332
last_lsn = 1672332
compact= 0
6.5.2從徹底備份中恢復數據--copy-back
#innobackupex --copy-back /path/to/BACKUP-DIR
[root@station253~]# innobackupex --copy-back /innobackup/2014-05-23_03-31-16/
6.6修正權限
[root@station253~]# chown -R mysql.mysql /mydata/data
[root@station253~]# service mysqld start
mysql>select * from school.students;
| StuID| Name | Age | Gender | ClassID |
| 1 | Shi zhongyu | 22 | M | 2 |
| 2 | Shi zhongyu | 22 | M | 2 |
| 3 | Guo Jin | 18 | M | 3 |
| 4 | Tom | 33 | M | 2 |
6.7應用二進制日誌完成即時點恢復
徹底備份已經與後2個增量合併,後2個增量日誌的位置就沒有意義了。
[root@station253innobackup]# cat 2014-05-23_03-31-16/xtrabackup_binlog_info 完備的結束位置
mysql-bin.000001 630
[root@station253mysql]# mysqlbinlog/tmp/mysql-bin.000001 | grep 'end_log_pos' 找到最後一行
#140523 3:55:51 server id 1 end_log_pos 892 Xid = 43 即時點結束位置
[root@station253mysql]# mysqlbinlog --start-position=630 /tmp/mysql-bin.000001 >/tmp/all.sql
[root@station253mysql]# cat /tmp/all.sql
# at 630
#140523 3:55:51 server id 1 end_log_pos 700 Query thread_id=3 exec_time=0 error_code=0
#140523 3:55:51 server id 1 end_log_pos 892 Xid = 43
COMMIT/*!*/;
mysql> set sql_log_bin=0; 關閉二進制日誌
mysql> source /tmp/all.sql; 倒入即時點日誌
mysql> set sql_log_bin=1; 打開二進制日誌
mysql>select * from school.students;
| StuID| Name | Age | Gender | ClassID |
| 1 | Shi zhongyu | 22 | M | 2 |
| 2 | Shi zhongyu | 22 | M | 2 |
| 3 | Guo Jin | 18 | M | 3 |
| 4 | Tom | 33 | M | 2 |
| 5 | Jerry | 12 | F | 3 |