mysqldump与xtrabackup备份流程差异图
3.1优势特性
1.完全以热备的形式进行,能够实现快速可靠地完全备份和部分备份,支持增量备份,支持时间点还原;
2.备份过程中不会打扰到事务操作,能够实现网络传输和压缩功能,备份完成后可自动验证数据是否可用,恢复速度较快。
3.更多优势特性请参考http://www.percona.com/software/percona-xtrabackup
注意:XtraBackup对myISAM只能温备,而且不能支持增量备份。对innoDB引擎要求单表单空间,否则无法进行单表的导进导出;
mysql>SHOW GLOBAL VARIABLES LIKE '%per_table%';
|Variable_name | Value |
|innodb_file_per_table | ON |
其中的innodb_file_per_table为ON则表示实现了单表单空间。若为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 |