使用Xtrabackup备份 MySQL 数据库

时间:2021-03-11 03:17:55
今天在网上溜达,看到一个好的文章就转载过来了.源地址:http://blog.chinaunix.net/u/25264/showart_1979755.html 使用Xtrabackup备份 MySQL 数据库

mysql的备份无非有下面几种方式:
1、mysqldump
2、mysqlhotcopy
3、采用Linux LVM的 snapshot 功能进行数据库分区的备份
4、准备一台从服务器,开启日志同步功能,专门做备份

当然,上述方法各有优缺点,简单分析下

第一种方法,mysqldump
MySQL自己提供的mysqldump是把数据转换为SQL语句,这种方式的效率比较低,备份和还原的速度都很慢,而且在dump过程中为了保证数据一致性,任何数据插入和更新操作都会被挂起。

第二种方法,mysqlhotcopy
MySQL自己提供的mysqlhotcopy 是专门针对myisam 数据表进行备份,无法对innodb数据表备份,速度相对快些,因为是文件拷贝,而且在备份的过程中,任何数据插入和更新操作都会被挂起。

第三种方法,LVM
这种方法是利用的逻辑卷的 镜像 功能对整个分区进行在线备份,这种备份数据量大,而且备份性能低下。

第四种方法,在 slave 服务器上备份
这种备份方法个人认为比较好,开始日志同步功能,无论是myisam,还是innodb,都可以在7*24不影响主服务器的情况下,随心所欲的进行备份。



以上内容仅供参考,本文主要介绍采用开源的  Xtrabackup 备份工具对innodb 数据表进行在线备份。

InnoDB 有个商业的InnoDB Hotbackup,可以对InnoDB引擎的表实现在线热备。而 percona出品的Xtrabackup,是InnoDB Hotbackup的一个开源替代品,可以在线对InnoDB/XtraDB引擎的表进行物理备份。

innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的,主要是为了方便的同时备份InnoDB和MyISAM引擎的表,并且加入了一些使用的选项,如 �Cslave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

最新下载地址如下:
http://www.percona.com/mysql/xtrabackup/0.7/

安装过程如下:
最简单的安装方式无疑是使用RPM包,不过如果你想使用源代码方式安装的话,则会发现其安装方式有点古怪,这是因为它采用的在MySQL源代码上打补丁构建的方式。

tar zxf xtrabackup-0.7.tar.gz
cd xtrabackup-0.7
./configure
make

进行到这里时,千万别惯性使用make install,那样就会接着安装MySQL了,正确方法是接着:

cd innobase/xtrabackup/
make
make install

然后,就会在你的/usr/bin目录里安装上两个工具:xtrabackup,innobackupex-1.5.1

xtrabackup可以在不加锁的情况下备份innodb数据表,不过此工具不能操作myisam。
innobackupex-1.5.1是一个脚本封装,能同时处理innodb和myisam,但在处理myisam时需要加一个读锁。


下面我们来拿一个innodb数据表进行备份及恢复,示例如下:


[root@localhost backup]# /usr/bin/innobackupex-1.5.1 --user=root --password=123456 --databases=innodb --slave-info --stream=tar /root/backup/  | gzip > /root/backup/bak_mysql.tar.gz


以下是输出内容:

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy.
All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackup
           prints "innobackup completed OK!".

innobackupex: Using mysql  Ver 14.14 Distrib 5.1.33, for pc-linux-gnu (i686) using readline 5.1
innobackupex: Using mysql server version 5.1.33-log

innobackupex: Created backup directory /root/backup
090628 14:53:43  innobackupex: Starting mysql with options: --unbuffered --password=123456 --user=root
090628 14:53:43  innobackupex: Connected to database with mysql child process (pid=3996)
090628 14:53:47  innobackupex: Connection to database server closed

090628 14:53:47  innobackupex: Starting ibbackup with command: xtrabackup --backup --suspend-at-end --log-stream --target-dir=./
xtrabackup: suspend-at-end is enabled.
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
innobackupex: Waiting for ibbackup (pid=4003) to suspend
innobackupex: Suspend file '/var/lib/mysql/xtrabackup_suspended'

xtrabackup: Target instance is assumed as followings.
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 5242880
xtrabackup: Stream mode.
>> log scanned up to (0 48456)

090628 14:53:49  innobackupex: Continuing after ibbackup has suspended

innobackupex: Starting to backup InnoDB tables and indexes
innobackupex: from original InnoDB data directory '/var/lib/mysql'
innobackupex: Backing up as tar stream 'ibdata1'
090628 14:53:49  innobackupex: Starting mysql with options: --unbuffered --password=123456 --user=root
090628 14:53:49  innobackupex: Connected to database with mysql child process (pid=4012)
>> log scanned up to (0 48456)
090628 14:53:53  innobackupex: Starting to lock all tables...
>> log scanned up to (0 48456)
>> log scanned up to (0 50014)
>> log scanned up to (0 50315)
090628 14:54:09  innobackupex: All tables locked and flushed to disk

090628 14:54:09  innobackupex: Starting to backup .frm, .MRG, .MYD, .MYI,
innobackupex: .TRG, .TRN, and .opt files in
innobackupex: subdirectories of '/var/lib/mysql'
innobackupex: Backing up file '/var/lib/mysql/innodb/innodb_test.frm'
innobackupex: Backing up file '/var/lib/mysql/innodb/db.opt'
090628 14:54:09  innobackupex: Finished backing up .frm, .MRG, .MYD, .MYI, .TRG, .TRN, and .opt files

innobackupex: Resuming ibbackup

xtrabackup: The latest check point (for incremental): '0:50119'
>> log scanned up to (0 50315)
xtrabackup: Transaction log of lsn (0 48456) to (0 50315) was copied.
090628 14:54:14  innobackupex: All tables unlocked
090628 14:54:14  innobackupex: Connection to database server closed

innobackupex: Backup created in directory '/root/backup'
innobackupex: MySQL binlog position: filename 'mysql-bin.000044', position 1052
090628 14:54:14  innobackupex: innobackup completed OK!
innobackupex: You must use -i (--ignore-zeros) option for extraction of the tar stream.


备份完毕后,让我们看看备份了哪些东西:

注意解压缩的时候,一定的加上 -i 这个参数。

[root@localhost backup]# tar zxvfi bak_mysql.tar.gz
backup-my.cnf
ibdata1
xtrabackup_binlog_info
xtrabackup_slave_info
innodb/innodb_test.frm
innodb/db.opt
xtrabackup_logfile
xtrabackup_checkpoints

ok,有了这些信息,你就可以利用这个备份来做 slave。

恢复就很简单了,你找一个测试 mysql实例,将备份里面的 ibdata1,innodb数据表 放进去,然后再通过mysqldump进行数据的导出和导入,,视乎麻烦了一些。


详细信息可以参考wiki
http://www.percona.com/docs/wiki/percona-xtrabackup:start