mysqldump与xtrabackup备份流程差异图

基于xtrabackup实现备份mysql_第1张图片


3.1优势特性

   1.完全以热备的形式进行,能够实现快速可靠地完全备份和部分备份,支持增量备份,支持时间点还原;

   2.备份过程中不会打扰到事务操作,能够实现网络传输和压缩功能,备份完成后可自动验证数据是否可用,恢复速度较快。

   3.更多优势特性请参考http://www.percona.com/software/percona-xtrabackup

注意:XtraBackupmyISAM只能温备,而且不能支持增量备份。对innoDB引擎要求单表单空间,否则无法进行单表的导进导出;

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

|Variable_name         | Value |

|innodb_file_per_table | ON    |

其中的innodb_file_per_tableON则表示实现了单表单空间。若为OFF则需要使用mysqldump全备然后更改配置文件删除原来的数据文件并重新初始化服务器最后将数据重新导入。所以建议以后在安装Mysql服务器时将其选项默认设置成1即可(innodb_file_per_table = 1)。

 

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 |