使用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引擎的表,并且加入了一些使用的选项,如 –slave-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

使用Xtrabackup对MySQL进行热备份是非常简单的,例如我们使用Xtrabackup自带的innobackupex脚本对整个数据库进行热备份,将数据库拷贝到本地的/db_backup目录:
C代码
innobackupex --user=root --password=password --defaults-file=/etc/my.cnf /db_backup  


在备份的同时,将备份文件打包:

C代码
innobackupex --user=root --password=password --defaults-file=/etc/my.cnf --stream=tar /db_backup | gzip >  /db_backup/db.tar.gz  


将备份文件直接通过网络备份到一台远程服务器:

C代码
innobackupex --user=root --password=password --defaults-file=/etc/my.cnf --stream=tar /db_backup | ssh dbbackup@remote_host cat > backup.tar  


直接通过ssh端口,将数据库热备份到一台远程的服务器上面去。

总之Xtrabackup为MySQL带来了企业级的数据备份机制,让MySQL在大容量存储方面扫除了后顾之忧。


--------------------


http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual
http://www.187299.com/archives/1436

install xtrabackup-1.0
wget http://www.percona.com/mysql/xtrabackup/1.0/source/xtrabackup-1.0-56.rhel5.src.rpm
rpm -i xtrabackup-1.0-56.rhel5.src.rpm
cd /usr/src/redhat/SOURCES/
tar -zxvf xtrabackup-1.0.tar.gz
cd xtrabackup-1.0
./configure
make
cd innobase/xtrabackup/
make
make install
innobackupex-1.5.1 --version
/usr/bin/innobackupex-1.5.1 --help

backup database(datadir=/var/lib/mysql)
mkdir /backup/
innobackupex-1.5.1  --user=root --password=password  /backup/ --stream=tar --defaults-file=/etc/my.cnf > /backup/mysqldb_back.tar

restore database(datadir=/var/lib/mysql)
/etc/init.d/mysqld stop
rm -rf /var/lib/mysql
mkdir /var/lib/mysql
tar -ixvf /backup/mysqldb_back.tar -C /var/lib/mysql
innobackupex-1.5.1 --apply-log /var/lib/mysql --defaults-file=/etc/my.cnf
chown -R mysql:mysql /var/lib/mysql
/etc/init.d/mysqld start

  可惜的是,每当你输入一次alias指令后,这个修改只在当前的Shell生效,也就是说,如果你重新开启一个 Shell,或者重新登录之后,这些更改就全消失了。怎么办?修改bash的配置文件~/.bashrc。显然,每个用户都有自己的.bashrc文件,因此每个用户都可以设定自己的个性化命令昵称。

    $ vi .bashrc

添加 alias mysql='/usr/local/webserver/mysql/bin/mysql'

保存退出。

vi .bash_profile

PATH=$PATH:$HOME/bin:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/webserver/mysql/bin

或在/etc/profile 中的 export语句前 加入新添加的PATH路径
PATH=$PATH:/usr/local/mysql/bin
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

注意:在修改了PATH值或任何环境变量后,都要用export将其输出,新的PATH值才能生效。
export PATH

    从下一次打开 Shell 时,这些设置就生效了。要是你想在当前的Shell中就生效,执行:

    $ source ~/.bashrc

--------------------------------------------------------------------------------------------------------------

mysqldump支持在线备份,不过是逻辑备份,效率比较差。

xtrabackup是开源的MySQL备份工具,物理备份,效率很不错。
下载编译好的二进制文件,解压,设置环境变量。MySQL版本为5.1.38,my.cnf里的[mysqld]里的datadir参数为datadir=/data

1.[root@DB1 bin]#wget http://www.percona.com/mysql/xtrabackup/0.9/binary/xtrabackup-0.9.tar.gz

2.[root@DB1 bin]#tar xzvf xtrabackup-0.9.tar.gz
3.[root@DB1 bin]#cd xtrabackup-0.9/bin/
4.[root@DB1 bin]#export PATH=$PATH:/root/xtrabackup-0.9/bin
备份所有数据库,备份目录为/tmp/backup/,innobackupex自动在这个目录下生成 年-月-日_时-分-秒 这类目录,目录下即为备份的文件。
01.[root@DB1 bin]# ./innobackupex-1.5.1  /tmp/backup/    --defaults-file=/etc/my.cnf
02.InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy.
03.All Rights Reserved.
04.

05....省略N行...
06.

07.innobackupex: Backup created in directory '/tmp/backup/2009-10-09_04-35-13'
08.innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 722
09.091009 04:35:45  innobackupex: innobackup completed OK!
关闭MySQL,并删除MySQL datadir目录下的所有文件。

1.[root@DB1 bin]# service mysqld stop
2.Shutting down MySQL...                                     [确定]
3.[root@DB1 bin]# rm -rf /data/*
生成ib_logfile文件

1.[root@DB1 bin]# ./innobackupex-1.5.1 --apply-log /tmp/backup/2009-10-09_04-35-13/   --defaults-file=/etc/my.cnf
2.

3....省略N行...
4.

5.091009 04:37:11  innobackupex: innobackup completed OK!
这个命令后,/tmp/backup/2009-10-09_04-35-13/目录生成了以下两个文件。
ib_logfile0 ib_logfile1

接下来就是将整个文件夹里的内容复制到mysql datadir目录,并重新设置权限即可恢复。

01.[root@DB1 bin]# ./innobackupex-1.5.1 --copy-back /tmp/backup/2009-10-09_04-35-13/  --defaults-file=/etc/my.cnf
02.InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy.
03.All Rights Reserved.
04.

05....省略N行...
06.

07.091009 04:40:07  innobackupex: innobackup completed OK!
08.[root@DB1 bin]# chown mysql:mysql /data/ -R
09.[root@DB1 bin]# service mysqld start
10.Starting MySQL.                                            [确定]
看到这里大家应该可以发现,其实也可以不用–copy-back这一步,直接在MySQL的datadir目录进行恢复,看下面步骤,是不是更简单呢?
01.[root@DB1 bin]# ./innobackupex-1.5.1  /tmp/backup/    --defaults-file=/etc/my.cnf
02.InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy.

03.All Rights Reserved.
04.

05....省略N行...
06.

07.innobackupex: Backup created in directory '/tmp/backup/2009-10-09_04-35-13'
08.innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 722
09.091009 04:35:45  innobackupex: innobackup completed OK!
10.

11.[root@DB1 bin]# cp /tmp/backup/2009-10-09_04-35-13/*  /data/ -a
12.

13.[root@DB1 bin]# ./innobackupex-1.5.1 --apply-log  /data/   --defaults-file=/etc/my.cnf
14.

15.[root@DB1 bin]# chown mysql:mysql /data/ -R
16.[root@DB1 bin]# service mysqld start
17.Starting MySQL.                                            [确定]
innobackupex还有一个参数可以进行打包stream,可以压缩成tar包,需要注意的是解压的时候必须要用-i来解压。


01.[root@DB1 bin]#./innobackupex-1.5.1  /tmp/backup/  --stream=tar  --defaults-file=/etc/my.cnf  > /tmp/backup/mysqldb_back.tar
02.[root@DB1 backup]# service mysqld stop
03.Shutting down MySQL...                                     [确定]
04.[root@DB1 bin]# rm -rf /data/*
05.[root@DB1 bin]# tar xif  /tmp/backup/mysqldb_back.tar  -C /data/
06.[root@DB1 bin]# ./innobackupex-1.5.1 --apply-log  /data/   --defaults-file=/etc/my.cnf
07.[root@DB1 bin]# chown mysql:mysql /data/ -R
08.[root@DB1 bin]# service mysqld start
09.Starting MySQL..                                           [确定]
10.[root@DB1 bin]#
Linux/Unix相关 | 评论(0) | 引用(0) | 阅读(1922)
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]