xtrabackup-1.6.5备份详解

来源:互联网 发布:ubuntu安装解压软件 编辑:程序博客网 时间:2024/05/18 00:08
-- 介绍
版本:这里采用的是1.6.5版本,2.02版本测试还有问题。
特点:对innodb热备份和增量备份,流压缩备份到另一台服务器,便捷的创建从

一、安装
下载的编译好的二进制文件。
cd /data
tar -xzvf xtrabackup-1.6.5.tar.gz


建立软连接;
ln -s /data/xtrabackup-1.6.5/bin/innobackupex /usr/bin/innobackupex
ln -s /data/xtrabackup-1.6.5/bin/tar4ibd /usr/bin/tar4ibd   
ln -s /data/xtrabackup-1.6.5/bin/xtrabackup /usr/bin/xtrabackup 
ln -s /data/xtrabackup-1.6.5/bin/xtrabackup_51 /usr/bin/xtrabackup_51 
ln -s /data/xtrabackup-1.6.5/bin/xtrabackup_55 /usr/bin/xtrabackup_55 




需要权限:
RELOAD and LOCK TABLES  为了开始复制文件之前加FLUSH TABLES WITH READ LOCK
REPLICATION CLIENT      为了获得二进制日志的位置,
CREATE TABLESPACE       为了导入表
SUPER                   为了启动和停止从的复制线程 






二、详细
============================= innobackupex =================================


2.1备份顺序及原理

看备份输出可以知道:
1.记录日志开始点,xtrabackup备份所有innodb的表数据(ibdata .ibd),
2.锁所有的表,并且刷新所有数据到磁盘。
3.开始备份.frm, .MRG, .MYD, .MYI
4.开始备份.TRG, .TRN, .ARM, .ARZ, .CSM, .CSV and .opt files
5.检查最新的日志点,并停止日志拷贝线程。

xtrabackup备份的时候会有两个线程:a.一个是线程在后台运行用于拷贝日志文件,它会监听InnoDB日志文件,当日志文件发生变化的时候,它会拷贝改变的块到文件xtrabackup_logfile(在备份目录中)中。这是必须的,
 因为备份可能花很长时间,并且恢复需要从备份开始到结束所有的二进制日志文件。
b.另一个是拷贝InnoDB数据文件到目标目录。这不是一个简单的文件拷贝,它以同样的方式去打开和读取文件,通过读取数据字典并且立刻拷贝他们。

当数据文件拷贝完成时,xtrabackup会停止日志复制线程,并且在目标目录创建一个xtrabackup_checkpoints文件,这个文件包含备份类型,日志开始序列号和结束号。
备份输出里最后会看到这样:xtrabackup: Transaction log of lsn (1682078) to (1684078) was copied.


生成文件:
xtrabackup_checkpoints:备份类型、状态、LSN范围。此信息会被用于增量备份。
xtrabackup_binlog_info:服务器正在使用的二进制日志文件位置,其是 SHOW MASTER STATUS的结果。
xtrabackup_binlog_pos_innodb:InnoDB或XtraDB表的二进制日志文件和它的当前的位置
xtrabackup_binary:备份中所使用的xtrabackup文件
backup-my.cnf:此文件包含在 --apply-log中启动InnoDB表最小的的信息。这不是你原来my.cnf。
xtrabackup_logfile:包含在 --apply-log时需要的数据,这个文件很大在--apply-log 中将会花更多的时间才能完成


复制相关的信息(如果用 --slave-info 选项)
xtrabackup_slave_info:在从上执行CHANGE MASTER需要的值


其他选项:
--no-timestamp  备份将不会创建以当前时间命令的文件夹




2.2示例:


------ 备份阶段 -------
a.全备份
innobackupex --user=root --defaults-file=/etc/my.cnf /data/back_full/ 2>/data/back_full/back_full_err1.log
生成时间文件夹:2012-08-31_11-54-55
除了数据库文件夹外还有如下文件:
ibdata1
ibdata2
backup-my.cnf
xtrabackup_binary
xtrabackup_binlog_info
xtrabackup_checkpoints
xtrabackup_logfile

备份目的目录是/data/back_full/
#备份完后无错应看到类似如下:
innobackupex: MySQL binlog position: filename 'master101-bin.000003', position 19723
120822 04:35:04  innobackupex: completed OK!


注意:可以用--database指定备份数据库,所有数据库中的InnoDB数据文件都会进行备份,未指定库的innodb表定义文件是不会被备份的未指定的myisam表也不会被备份。
3个库:a全innodb b全myisam c两种都有
1.全备份:没有information_schema
2.指定a库:没有基础库,有a、c库,a库文件全,c中值备份innodb的ibd文件,没有表定义文件
3.指定b库:没有基础库,有a、b、c库,b库文件全,a、c中只有innodb的ibd文件,没有表定义文件
4.指定c库:没有基础库,有a、c库,c库文件全,a中只有innodb的ibd文件,没有表定义文件


打包备份:
innobackupex --user=root --defaults-file=/etc/my.cnf --stream=tar /data/back_full/ > /data/back_full/back-test.tar 2>/data/back_full/back_full_err1.log


打包并压缩:
innobackupex --user=root --defaults-file=/etc/my.cnf --stream=tar /data/back_full | gzip -> /data/back_full/back_test2.tar.gz 2>/data/back_full/back_full_err1.log


备份到其他机器:
innobackupex --user=root --defaults-file=/etc/my.cnf --stream=tar /data/back_full/ | ssh root@192.168.1.149 "cat -> /data/back_full/back-test.tar" 2>/data/back_full/back_full_err1.log




b.增量备份:
每个的InnoDB的页面有一个日志序列号,LSN,作为整个数据库的版本号。每次修改数据库,这个数字会递增。
增量备份只对 XtraDB,InnoDB有用,myisam 每次还是复制整个表。
增量备份必须在全备份的基础上,第二次增量备份必须在第一次增量的基础上,依此类推。
1.第一次增量备份:
innobackupex --user=root --defaults-file=/etc/my.cnf --incremental /data/back_incr/ --incremental-basedir=/data/back_full/2012-08-31_11-54-55/  2>/data/back_incr/incr_err1.log
如果成功应该看到如下输出:
innobackupex: Backup created in directory '/data/back_incr/2012-08-31_14-05-00'
120831 14:05:35  innobackupex: completed OK!
除了数据库文件夹外还有如下文件:
backup-my.cnf
xtrabackup_binary
xtrabackup_binlog_info
xtrabackup_checkpoints
xtrabackup_logfile


2.第二次增量备份,--incremental-basedir指向第一次增量
innobackupex --user=root --defaults-file=/etc/my.cnf --incremental /data/back_incr/ --incremental-basedir=/data/back_incr/2012-08-31_14-05-00/  2>/data/back_incr/incr_err2.log
如果成功应该看到如下输出:
innobackupex: Backup created in directory '/data/back_incr/2012-08-31_14-40-18'
120831 14:40:41  innobackupex: completed OK!
除了数据库文件夹外还有如下文件:
backup-my.cnf
xtrabackup_binary
xtrabackup_binlog_info
xtrabackup_checkpoints
xtrabackup_logfile




c.部分备份
innodb_file_per_table必须开启。部分备份不要复制准备的备份,而是通过导入表






------恢复阶段--------
a.全备份恢复
-- 1.清除数据目录
mysqladmin shutdown
cd /data/mysql_db/
rm -rf *


-- 2.准备阶段
innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log /data/back_full/2012-08-31_11-54-55/


正确应该看到类似如下内容:
111225 01:01:57  InnoDB: Shutdown completed; log sequence number 1609228
111225 01:01:57  innobackupex: completed OK!


其他选项--use-memory=4G
默认100M,可以通过次选项用更多的内存。
应用准备目的:备份的时候可能存在未提交的事务需要被撤消或日志重做。


-- 3.恢复阶段
全备份恢复:
innobackupex --user=root --defaults-file=/etc/my.cnf --copy-back /data/back_full/2012-08-31_11-54-55/


-- 4.更改db目录权限为mysql
chown -R mysql:mysql /data/mysql_db
启动mysql
/usr/local/mysql/bin/mysqld_safe --user=mysql &




b.恢复增量:
增量备份恢复必须在全备份的基础上。
-- 1.清除数据目录
mysqladmin shutdown
cd /data/mysql_db/
rm -rf *


-- 2.准备阶段:
准备增量备份跟全备份有点不同:
首先,只有已经提交的事务会被重放到每个备份,这将会把全备份和增量备份放到一起。
然后,未提交的事务必须被回滚,以得到一个可用的备份。
如果在全备份的基础上重放已提交事务和回滚未提交事务,你将无法继续增加。如果你在一个增量上这样做,你将不能继续增加后面的增量数据。
所以必须使用--redo-only 选项。

应用全备份
innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log --redo-only /data/back_full/2012-08-31_11-54-55/
应用后会多出一个文件xtrabackup_binlog_pos_innodb
如下文件会被访问修改,所以如果为了防止应用错误,应该将备份再存储一份最原始的。
xtrabackup_checkpoints
xtrabackup_logfile
ibdata1
ibdata2
例:
stat xtrabackup_logfile 
  File: “xtrabackup_logfile”
  Size: 2097152         Blocks: 4104       IO Block: 4096   一般文件
Device: fd00h/64768d    Inode: 1624010     Links: 1
Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2012-08-29 17:04:37.000000000 +0800
Modify: 2012-08-29 17:04:37.000000000 +0800
Change: 2012-08-29 17:04:37.000000000 +0800






应用第一个增量备份
innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log --redo-only /data/back_full/2012-08-31_11-54-55/ --incremental-dir=/data/back_incr/2012-08-31_10-59-05/  


应用第二个增量备份
innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log --redo-only /data/back_full/2012-08-31_11-54-55/ --incremental-dir=/data/back_incr/2012-08-31_11-00-30/  


应用全部
innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log /data/back_full/2012-08-31_10-53-49/

准备阶段是可选的,如果不这样做会按照宕机处理,回滚未提交的事务,这样可能会会导致启动时间很长。


-- 3.恢复阶段:
将完整备份中的数据恢复到数据库
innobackupex --user=root --defaults-file=/etc/my.cnf --copy-back /data/back_full/2012-08-31_10-53-49/


-- 4.更改权限
chown -R mysql:mysql /data/mysql_db/
/usr/local/mysql/bin/mysqld_safe --user=mysql &


============================= innobackupex =================================












============================== xtrabackup ==================================
xtrabackup是C写的,可以用于热备份,但只适用于innodb和XtraDB。
–target-dir指定备份存储目录,如果innodb的数据文件和日志文件不在一个目录,你需要指定位置,如果–target-dir指定的目录不存在,会自动创建。但是如果目录存在且不是空的,
xtrabackup不会覆盖文件,会报错:error 17, ‘ file exists ‘


注意:xtrabackup 只备份innodb和XtraDB的数据文件,表定义文件和系统数据库都是不备份的。innobackupex是备份的。
      xtrabackup 没有提供恢复的方法,如果只用xtrabackupb备份,准备完成后需要你手工去拷贝,改权限,启动。


1.选择正确的文件:
Server xtrabackup binary
MySQL 5.0.* xtrabackup_51
MySQL 5.1.* xtrabackup_51
MySQL 5.1.* with InnoDB plugin xtrabackup
Percona Server 5.1 and 5.5 xtrabackup
MySQL 5.5.* xtrabackup_55




下面是用innobackupex做的全备份,xtrabackup做的增量备份,其实用innobackupex就可以了。
------备份阶段------
全备份
1.innobackupex全备份
innobackupex --user=root --defaults-file=/etc/my.cnf /data/back_full/ 2>/data/back_full/back_full_err1.log
注意:
如果用xtrabackup全备份,首先不会自己生存一个以时间命名的文件夹,其次xtrabackup只备份innodb和XtraDB,而且只备份数据文件,没有表定义文件和基础数据库。


增量备份
xtrabackup_55 --defaults-file=/etc/my.cnf --backup --target-dir=/data/back_incr/inc1 --incremental-basedir=/data/back_full/2012-09-04_13-56-32 2>/data/back_incr/out1.log
xtrabackup_55 --defaults-file=/etc/my.cnf --backup --target-dir=/data/back_incr/inc2 --incremental-basedir=/data/back_incr/inc1 2>/data/back_incr/out2.log




------恢复阶段------
a.准备全备份
xtrabackup_55 --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/back_full/2012-09-04_13-56-32


innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/back_full/2012-09-04_13-56-32


b.准备增量
xtrabackup --prepare --apply-log-only --target-dir=/data/back_full/2012-09-04_13-56-32 --incremental-dir=/data/back_incr/inc1
xtrabackup --prepare --apply-log-only --target-dir=/data/back_full/2012-09-04_13-56-32 --incremental-dir=/data/back_incr/inc2




c.第二次应用。目的是准备日志文件,xtrabackup会帮生成日志文件,这样恢复的时候就会更快。
innobackupex --defaults-file=/etc/my.cnf --apply-log /data/back_full/2012-09-04_13-56-32
可以看到多出了日志文件:
ib_logfile0
ib_logfile1


d.恢复阶段:
将完整备份中的数据恢复到数据库
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/back_full/2012-09-04_13-56-32


e.更改权限并启动
chown -R mysql:mysql /data/mysql_db/
/usr/local/mysql/bin/mysqld_safe --user=mysql &




============================== xtrabackup ==================================