基於xtrabackup實現備份mysql

mysqldump與xtrabackup備份流程差別圖
mysql

wKiom1N-ahSwZQamAAGXaqGJ9X8893.jpg


3.1優點特性sql

   1.徹底以熱備的形式進行,可以實現快速可靠地徹底備份和部分備份,支持增量備份,支持時間點還原;數據庫

   2.備份過程當中不會打擾到事務操做,可以實現網絡傳輸和壓縮功能,備份完成後可自動驗證數據是否可用,恢復速度較快。服務器

   3.更多優點特性請參考http://www.percona.com/software/percona-xtrabackup網絡

注意:XtraBackupmyISAM只能溫備,並且不能支持增量備份。對innoDB引擎要求單表單空間,不然沒法進行單表的導進導出;app

mysql>SHOW GLOBAL VARIABLES LIKE '%per_table%';ide

|Variable_name         | Value |工具

|innodb_file_per_table | ON    |spa

其中的innodb_file_per_tableON則表示實現了單表單空間。若爲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 |

相關文章
相關標籤/搜索