一.Xtrabackup
Xtrabackup是由percona开发的一个开源软件,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此软件可以说是innodb热备工具ibbackup的一个开源替代品
Xtrabackup中包含两个工具:
l
l
Xtrabackup可以做什么
l
l
l
MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:
(1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
(2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。
在Xtrabackup的wiki上简单的介绍了一下实现的原理:
首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。
因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
Tip1:Xtrabackup是一个用于备份InnoDB/XtrDB的工具,真正的在线备份(不影响数据的读写),InnoDB Hot Backup的开源替代品。
Tip2:在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解
备份原理
XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb
InnoDB维护了一个redo log,又称为
1.It applies committed transaction log entries to the data files
2.it performs an undo operation on any transactions that modified data but did not commit.
XtraBackup在备份的时候,
在prepare过程中,XtraBackup使用复制到的transactions log
实现细节
文件权限
xtrabackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。
为什么要用rw模式呢?直接read模式不好么?
因为xtrabackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。
Tuning the OS Buffers
因为XtraBackup要从文件系统中复制大量的数据,所以它尽可能地使用posix_fadvise(),来告诉OS不要缓存读取到的数据,从而提升性能。因为这些数据不会重用到了,OS却没有这么聪明。如果要缓存一下的话,几个G的数据,会对OS的虚拟内存造成很大的压力,其它进程,比如mysqld很有可能被swap出去,这样系统就会受到很大影响了。
posix_fadvise(file,0,0,
而且XtraBackup在读取数据的时候还尽可能地预读:
posix_fadvise(file,0,0,
复制数据文件
在备份innodb page的过程中,XtraBackup每次读写1MB的数据,1MB/16KB=64个page。
这个不可配置。读1MB数据之后,XtraBackup一页一页地遍历这1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。
It skips this check on the doublewrite buffer??
在复制transactions log的时候,每次读写512KB的数据。同样不可以配置。
二.下载及安装配置
1. Xtrabackup二进制64位下载地址:
http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6/Linux/binary/x86_64/
2.MySQL5.1.56的下载地址:
http://dev.mysql.com/downloads/mysql/5.1.html#downloads
操作系统环境:
CentOS release 5.4 (Final) x86_64 GNU/Linux 2.6.18-164.el5
2.安装配置
(1)安装配置mysql-5.1.56
Shell> tar –zxvvf mysql-5.1.56.tar.gz
--with-charset=utf8 --with-collation=utf8_general_ci \
--with-extra-charsets=latin1,gb2312
--with-plugins=innobase,innodb_plugin,myisam,heap,csv,federated,blackhole \
--enable-local-infile --enable-thread-safe-client
Shell>
Shell>cd /opt/mysql5156
Shell>chown –R mysql .
Shell>chgrp –R mysql .
Shell>bin/mysql_install_db –user=mysql
Shell>chown –R root .
Shell> chown –R mysql var
配置启动plugin-innodb
Shell > vi /etc/my.cnf
port
socket
[mysqld]
port
socket
ignore_builtin_innodb
启动:shell>/opt/mysql5156/bin/mysqld_safe –user=mysql &
mysql>INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_TRX SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_LOCKS SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_LOCK_WAITS SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_CMP SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_CMP_RESET SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_CMPMEM SONAME 'ha_innodb_plugin.so';
mysql >INSTALL PLUGIN INNODB_CMPMEM_RESET SONAME 'ha_innodb_plugin.so';
| @@innodb_version |
+------------------+
| 1.0.15
+------------------+
1 row in set (0.00 sec)
mysql执行INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';
如果报错提示:ERROR 1289 (HY000): The ‘plugin’ feature is disabled; you need MySQL built with ‘HAVE_DLOPEN’ to have it working
经上网搜索找到解决问题方法:
在编译时不要用静态编译,将下面两个从编译参数中删除
--with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
至于原因不是很清楚。
另有人提出可以用下面方法解决:
在编译mysql时先执行下面的命令
export CXXFLAGS=”-O2 -DHAVE_DLOPEN=1″
但在做测试时,发现仍然有问题不能编译通过,可能是环境不同吧,我的系统环境为:
Centos 5.4
(2)安装配置Xtrabackup
Shell> mkdir /usr/local/xtrabackup
Shell> tar -zxvf xtrabackup-1.6.tar.gz –C /usr/local/xtrabackup
Shell>cd /usr/local/xtrabackup/bin
Shell>ln –s innobackupex-1.5.1 innobackupex
配置环境变量:
Shell>export PATH=$PATH:/usr/local/xtrabackup/bin
修改mysql配置文件:
Shell> vi /etc/my.cnf
添加或修改:datadir =
特别注意:default_table_type = InnoDB
三.xtrabackup的备份与恢复使用
关于xtrabackup的参数选项,如下:
–defaults-file=#
默认配置文件的路径,如果补该参数,xtrabackup
/usr/local/etc/my.cnf
~/.my.cnf,并读取配置文件中的[mysqld]和[xtrabackup]配置段
–defaults-extra-file=#
如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件
–target-dir=name
备份文件的存放目录路径
–backup实施备份到
–prepare
实施对备份文件迚行恢复前的准备(生成
–print-param
打印备份或恢复时需要的参数
–use-memory=#
该参数在
–suspend-at-end
在
–throttle=#
每秒IO次数,限制
–log-stream
该参数在
–incremental-lsn=name
增量备份时只拷贝
–incremental-basedir=name
该参数在
–incremental-dir=name
该参数在
–tables=name
在备份
–datadir=name
MySQL
xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)
1.普通备份(全量备份)
shell>mkdir -p /backup/xtrabackup
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup
全量备份模拟恢复:
需要执行两次xtrabackup –prepare
shell>xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/backup/xtrabackup
shell>xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/backup/xtrabackup
删除数据库目录下的数据文件:
Shell>rm –rf /usr/local/mysql/var/ib*
Shell>cp /backup/xtrabackup/ib* /usr/local/mysql/var
Shell>chown –R mysql.root /usr/local/mysql/var
重启测试是否恢复成功。
注意,xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm)。
2.
增量备份优点:
1、数据库太大没有足够的空间全量备份,作增量备份有效节省空间,且效率高。
2、支持热备份。备份过程不锁表,不受时间限制,不影响用户使用。
3、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。
5、备份效率更高,恢复效率更高。
增量备份及模拟恢复步骤:
shell>mkdir -p /backup/xtrabackup/base
shell>mkdir -p /backup/xtrabackup/delta
(1)先做一次全量备份,因为后面的增量备份要以此为基础
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base
shell>ls /backup/xtrabackup/base
ibdata1
(2)以此全量备份为基础进行增量备份
Shell> xtrabackup --defaults=/etc/my.cnf
shell>ls /backup/xtrabackup/delta
ibdata1.delta
ps:在增量备份的目录下,数据文件都是以.delta结尾的。增量备份只备份上一次全量备份后被修改过的page,所以增量备份只暂用较少的空间。
增量备份可以在增量备份的基础上增量。
(注:/backup/xtrabackup/delta/是每次都需修改的。比如第二次增量就改成/backup/xtrabackup/delta2,当然可以写个脚本进行自动备份)
增量备份模拟恢复过程:
我们需要分别对全量、增量备份各做一次prepare操作。
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare
--incremental-dir=/backup/xtrabackup/delta/
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/
shell>rm –rf /usr/local/mysql/var/ib* #删除原来数据目录下的数据文件
Shell>cp /backup/xtrabackup/base/ib* /usr/local/mysql/var
Shell>chown –R mysql.root /usr/local/mysql/var
重启后测试是否成功。
再次提醒,xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)。
3.增量备份
对比innobackupex和xtrabackup我们可以看到,innobackupex操作起来更方便,但是innobackupex会有短暂的锁
比如表中目前有10条数据,先备份.备份到/usr/local/backup/1/目录
shell> xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/1/
查看它的lsn点:
shell> cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0:0
to_lsn = 0:592411
再向表中插入数据,增量备份
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/2/ --incremental-basedir=/usr/local/backup/1/
把增量备份到2(1到2的增量备份)
查看它的lsn点:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:592411
to_lsn = 0:908563
再向表中插入数据,增量备份
shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/1/
把增量备份到3(1到3的增量备份,2的备份已经包含在里面了,按照这种方式备份的话,最后的还原只需要还原完全备份和最后一份增量备份即可)
查看它的lsn点:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:592411
to_lsn = 0:1507854
或则另一种增量备份方式:
shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/2/
把增量备份到3(2到3的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原完全备份和各个增量备份)
查看它的lsn点:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:908563
to_lsn = 0:1507854
增量备份模拟恢复:
我们需要分别对全量、增量备份各做一次prepare操作。
①:基于(1到3的增量备份,2的备份已经包含在里面了,按照这种方式备份的话,最后的还原只需要还原完全备份和最后一份增量备份即可)
把第1次的完备恢复
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/
继续把增量备份恢复上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/
恢复完成
接着
cd /usr/local/backup/1/
cp 1/ib* /usr/local/mysql/var/
chown –R mysql.root /usr/local/mysql/var
/etc/init.d/mysql restart
②基于(2到3的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原完全备份和各个增量备份)
把第1次的完备恢复
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/
继续把增量备份恢复上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/2/
继续把增量备份恢复上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/
恢复完成
接着
cd /usr/local/backup/1/
cp 1/ib* /usr/local/mysql/var/
chown –R mysql.root /usr/local/mysql/var
/etc/init.d/mysql restart
四、innobackupex备份与恢复
Usage:
innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME]
innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF]
innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR
第一个命令行是热备份mysql数据库。
带有--apply-log选项的命令是准备在一个备份上启动mysql服务。
带有--copy-back选项的命令从备份目录拷贝数据,索引,日志到my.cnf文件里规定的初始位置。
参数注释:
–defaults-file=
同
–apply-log
对
–copy-back
做数据恢复时将备份数据文件拷贝到
–remote-host=HOSTNAME
通过
--stream=[tar]
备份文件输出格式, tar
--tmpdir=DIRECTORY
当有指定--remote-host or --stream时,
--redo-only --apply-log组,
强制备份日志时只
–use-memory=#
该参数在
–throttle=IOS
同
–sleep=是给
–compress[=LEVEL]
对备份数据迚行压缩,仅支持
–include=REGEXP
对
–databases=LIST
列出需要备份的
–uncompress
解压备份的数据文件,支持
--slave-info,备份从库,
CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
–socket=SOCKET
MySQL
1.
(1)普通备份
shell> mkdir -p /backup/innobackupex/
Shell>innobackupex --defaults-file=/etc/my.cnf
--databases='i_db' --no-lock /backup/ innobackupex /
2> /tmp/innobackup.log
xtrabackup_51
[01] Copying /usr/local/mysql/var/ibdata1
[01]
xtrabackup: The latest check point (for incremental): '0:32538662'
xtrabackup: Stopping log copying thread.
xtrabackup: Transaction log of lsn (0 32538662) to (0 32538662) was copied.
注释:
使用mysql的root用户备份,密码为root
备份文件的存放路径是/backup/innobackupex/,该目录下将创建以时间戳为名称的备份目录
–no-lock备份时不锁定表
–databases="i_db"用于指定要备份的数据库
2>/tmp/backup.log是将备份过程中的输出信息保存到/tmp/backup.log
注意:在使用innobackupex进行备份时,在配置文件my.cnf中要明确指定mysql的数据文件目录,否则会报错。
[mysqld]
datadir=/usr/local/mysql/var
(2)打包(tar)备份
Shell>innobackupex --defaults-file=/etc/my.cnf
--databases='i_db' --no-lock
2> /tmp/innobackup.log
这种备份时间会比较长,主要是执行打包操作。
解包过程,需要使用tar ixvf
模拟恢复过程:
Shell> mysql –uroot –proot –e’drop database i_db’
Shell>mysqladmin –uroot –proot shutdown
Shell>rm –rf /usr/local/mysql/var/ib *
shell >cd /backup/innobackupex/
shell >tar ixvf i_aura.tar
shell>ls
backup-my.cnf
准备还原
shell>innobackupex-1.5.1 --defaults-file=/etc/my.cnf –no-lock –apply-log /data/back_data/
拷贝还原数据:
shell>innobackupex --defaults-file=/etc/my.cnf
Shell>cd /usr/local/mysql/var
Shell>chown -R mysql:root .
shell> mysqld_safe –user=mysql &
检查删除的数据库,如果恢复则证明该恢复过程无误。
(3)压缩(tar)备份
Shell>innobackupex --defaults-file=/etc/my.cnf
--databases=”i_db test”--no-lock
2> /tmp/innobackup.log
这种备份时间会比较长,主要是执行压缩操作。
解压缩过程,需要使用tar izxvf
还原:
使用tar –izxvf
模拟恢复过程:
Shell> mysql –uroot –proot –e’drop database i_db’
Shell>mysqladmin –uroot –proot shutdown
Shell>rm –rf /usr/local/mysql/var/ibdata1 ib_logfile*
shell >cd /backup/innobackupex/
shell >tar ixvf i_aura.tar
shell>ls
backup-my.cnf
准备还原:
shell> innobackupex --defaults-file=/etc/my.cnf
拷贝还原数据:
shell> innobackupex --defaults-file=/etc/my.cnf
Shell>cd /usr/local/mysql/var
Shell>chown -R mysql:root .
shell> mysqld_safe –user=mysql &
检查删除的数据库,如果恢复则证明该恢复过程无误。
(4)整库备份及恢复。
Shell>innobackupex --user=root --password=root --defaults-file=/etc/my.cnf \
检查备份的文件:
Shell>ls /backup/innobackupex/
2011-04-12_09-20-13
Shell> mysql –uroot –proot shutdown
Shell>rm –rf /usr/local/mysql/var/*
首先写日志文件,然后恢复,如下。(注:2011-04-12_09-20-13是自动生成的以备份时间命名的文件夹,恢复时根据情况进行选择)
Shell>innobackupex --apply-log --defaults-file=/etc/my.cnf \
Shell>innobackupex --copy-back --defaults-file=/etc/my.cnf \
/backup/innobackupex/2011-04-12_09-20-13
使用cd或者ls
修改数据库文件权限,否则无法启动。(这步我是cd到原数据库目录下进行的)
Shell>chown -R mysql:mysql .
重启数据库,测试恢复是否成功。
五.备份到远程服务器
(1)innobackupex远程备份方法一
当前数据库所在机器IP:192.168.1.131,现在要备份到192.168.1.132的/data目录下。
目前使用xtrabackup增量备份是不支持到远程的。如何解决呢?可以使用nfs
(2)innobackupex远程备份方法二
#在本地后台启动1234监听,以便接受备份文件
nc -d -l
#ssh到服务器A执行备份,并将备份包推送到备份机B上。同时记录下log。
ssh
–stream=tar :
–include=’renren.*’:备份包含的库表,如例:意思是要备份renren库中所有的表。如果需要全备份,则省略这个参数;如果需
–throttle=500:xtrabackup在备份过程中,IO操作比较多,因此需要限定一下IO操作。以免服务器压力过大,不过好像作用不太明显,也不知道是不是设置的还是过大。待测…
–socket=/data/mysql/backup/mysql.sock:指定mysql.sock所在位置,以便备份进程登录mysql.
–defaults-file=/data/dbbackup/my.cnf :如果您的/etc/my.cnf中没有使用如[mysqld3306]的片段启动mysql,则不需要这行参数,如果使用了上面的片段,那么
[mysqld]
datadir=/data/var
innodb_data_home_dir = /data/ibdata
innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend
innodb_log_group_home_dir = /data/iblogs
innodb_log_files_in_group = 2
innodb_log_file_size = 1G
| | |
|
参考链接: 1.官方文档:http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual 2. 3. 4. 5. 6. 7.http://chlotte.blog.51cto.com/318402/376294 |