Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273592
  • 博文数量: 52
  • 博客积分: 120
  • 博客等级: 民兵
  • 技术积分: 1189
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-03 15:41
个人简介

MySQL DBA

文章分类

全部博文(52)

文章存档

2013年(51)

2011年(1)

分类: Mysql/postgreSQL

2013-03-07 13:04:25

一.Xtrabackup 简介及备份原理说明:

Xtrabackup是由percona开发的一个开源软件,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此软件可以说是innodb热备工具ibbackup的一个开源替代品

Xtrabackup中包含两个工具:

??xtrabackup -用于热备份innodb,xtradb引擎表的工具,不能备份其他表。

??innobackupex-xtrabackup封装的perl脚本,提供了用于myisam(会锁表)innodb引擎,及混合使用引擎备份的能力。

   

Xtrabackup可以做什么

??在线()备份整个库的InnoDB, XtraDB

??xtrabackup的上一次整库备份基础上做增量备份(innodb only

??以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

   

MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:(1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。(2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN

   

Xtrabackupwiki上简单的介绍了一下实现的原理:

首先,在logfile中找到并记录最后一个checkpoint"last checkpoint LSN"),然后开始从LSN的位置开始拷贝InnoDBlogfilextrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile

因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

Tip1Xtrabackup是一个用于备份InnoDB/XtrDB的工具,真正的在线备份(不影响数据的读写),InnoDB Hot Backup的开源替代品。

Tip2:在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解 决这个问题。

   

备份原理

XtraBackup基于InnoDBcrash-recovery功能。它会复制innodb data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。

InnoDB维护了一个redo log,又称为 transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data filetransaction 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在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 前几章的时候就提过这个问题,因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。

prepare过程中,XtraBackup使用复制到的transactions log 对备份出来的innodb data file 进行crash recovery

实现细节

文件权限

xtrabackupread-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, POSIX_FADV_DONTNEED)

而且XtraBackup在读取数据的时候还尽可能地预读:

posix_fadvise(file,0,0, POSIX_FADV_SEQUENTIAL)

   

复制数据文件

在备份innodb page的过程中,XtraBackup每次读写1MB的数据,1MB/16KB=64page。这个不可配置。读1MB数据之后,XtraBackup一页一页地遍历这1MB数据,使用innodbbuf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。

It skips this check on the doublewrite buffer??

在复制transactions log的时候,每次读写512KB的数据。同样不可以配置。

   

二.下载及安装配置

1. Xtrabackup二进制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

MySQL 5.1.38前的版本中,当你需要安装InnoDB Plugin时,必须下载Plugin的文件,解压后再进行一系列的安装。从MySQL 5.1.38开始往后,MySQL包含了2个不同版本的InnoDB存储引擎一个是旧版本的引擎,称之为build-in innodb;另一个是1.0.4版本的InnoDB存储引擎。

Shell> tar –zxvvf mysql-5.1.56.tar.gz

Shell> cd mysql-5.1.56

Shell> ./configure --prefix=/opt/mysql5156

--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> make

Shell >make install

Shell> cp support-files/my-medium.cnf /etc/my.cnf

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 = 3307

socket = /tmp/mysql5156.sock

   

[mysqld]

port = 3307

socket = /tmp/mysql5156.sock

ignore_builtin_innodb

   

启动:shell>/opt/mysql5156/bin/mysqld_safe –user=mysql &

加载plugin-innodb:

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';

上述语句只需执行一次就ok了,即使重启mysqld也不需要再次安装了。

mysql > show plugins;

mysql> select @@innodb_version;

+------------------+

| @@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 CFLAGS="-O2 -DHAVE_DLOPEN=1export CXXFLAGS="-O2 -DHAVE_DLOPEN=1

但在做测试时,发现仍然有问题不能编译通过,可能是环境不同吧,我的系统环境为:

Centos 5.4 x86_64 GNU/Linux

   

2)安装配置Xtrabackup

先看看如何安装Xtrabackup,最简单的安装方式是使用RPM包,不过想使用源代码方式安装的话,其安装方式有点古怪,因为它采用的在MySQL源代码上打补丁构建的方式安装的。这里使用二进制包的安装方式,相对比较灵活。

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 = /usr/local/mysql/var(数据库目录)

特别注意:default_table_type = InnoDB (必须改,否则进行增量备份的时候不成功)

   

三.xtrabackup的备份与恢复使用

关于xtrabackup的参数选项,如下:–defaults-file=#默认配置文件的路径,如果补该参数,xtrabackup 将从依次从以下位置查找配置文件/etc/my.cnf /etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
,并读取配置文件中的[mysqld][xtrabackup]配置段

–defaults-extra-file=#如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件

–target-dir=name备份文件的存放目录路径

–backup实施备份到 target-dir

–prepare实施对备份文件迚行恢复前的准备(生成 InnoDB log file

–print-param打印备份或恢复时需要的参数

–use-memory=#该参数在 prepare 的时候使用,控制 prepare  innodb 实例使用的内存量

–suspend-at-end target-dir 目录下产生一个 xtrabackup_suspended 文件,将 xtrabackup 进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除xtrabackup_suspended 文件

–throttle=#每秒IO次数,限制 backup 时使用的 I/O 操作量,使备份对数据库正常业务的影响最小化

–log-stream该参数在 backup 的时候使用,将 xtrabackup_logfile 的内容输出到标准输出,使用该参数时会自动使用–suspend-at-end 参数,innobackupex 脚本的–stream 模式会使用该参数。

–incremental-lsn=name增量备份时只拷贝 LSN比该参数指定值新的 ibd pages,前次备份到了哪个 LSN可以看前次备份集的xtrabackup_checkpoints 文件

–incremental-basedir=name该参数在 backup 的时候使用,备份比该参数指定位置的备份集新的 idb pages

–incremental-dir=name该参数在 prepare 的时候使用,指定 prepare 时产生的.delta 文件和日志文件的存放路径

–tables=name在备份 file-per-table 类型的数据文件时使用,使用正则表达式指定需要备份的 innodb 

–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 –prepareshell>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、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。

4、备份恢复基于文件操作,降低直接对数据库操作风险。

5、备份效率更高,恢复效率更高。

   

增量备份及模拟恢复步骤:

shell>mkdir -p /backup/xtrabackup/base

shell>mkdir -p /backup/xtrabackup/delta1)先做一次全量备份,因为后面的增量备份要以此为基础

shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base

shell>ls /backup/xtrabackup/base

ibdata1 xtrabackup_checkpoints xtrabackup_logfile

(2)以此全量备份为基础进行增量备份

Shell> xtrabackup --defaults=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/delta/ --incremental-basedir=/backup/xtrabackup/base/

shell>ls /backup/xtrabackup/delta

ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile

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 --target-dir=/backup/xtrabackup/base/

--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.增量备份对比innobackupexxtrabackup我们可以看到,innobackupex操作起来更方便,但是innobackupex会有短暂的锁 表(时间依赖于MyISAM大小)。xtrabackup备份还有另一个重要特性:增量备份。(未来的版本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(12的增量备份)查看它的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(13的增量备份,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(23的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原完全备份和各个增量备份)查看它的lsn:
shell>cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 0:908563
to_lsn = 0:1507854
增量备份模拟恢复:我们需要分别对全量、增量备份各做一次prepare操作。①:基于(13的增量备份,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
②基于(23的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原完全备份和各个增量备份)把第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]

[--password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timestamp]

[--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]

[--defaults-file=MY.CNF]

[--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR

innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF]

[--ibbackup=IBBACKUP-BINARY] BACKUP-DIR

innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR

第一个命令行是热备份mysql数据库。

带有--apply-log选项的命令是准备在一个备份上启动mysql服务。

带有--copy-back选项的命令从备份目录拷贝数据,索引,日志到my.cnf文件里规定的初始位置。

   

参数注释:

–defaults-file= xtrabackup –defaults-file 参数;

–apply-log xtrabackup –prepare 参数的封装;

–copy-back做数据恢复时将备份数据文件拷贝到 MySQL 服务器的 datadir 

–remote-host=HOSTNAME通过 ssh 将备份数据存储到进程服务器上;

阅读(1877) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~