Xtrabackup 是percona公司(mysqlperformanceblog)的开源项目,目的是实现类似innodb官方的热备份工具InnoDB Hot Backup的功能,可以帮助我们对MySQL InnoDB类型的数据库表进行在线热备份。

Xtrabackup中包含两个工具:
* xtrabackup – 用于热备份innodb, xtradb表的工具,不能备份其他表;
* innobackupex – 对xtrabackup封装的perl脚本,提供了myisam表备份的能力;

好东西大家支持,要用, 但要用好,在这里跟大家分享自己没用好的案例;

现象 : 在进行备份过程中,MYSQL HANG起;所有操作不能进行(5分钟左右); 导致重大故障。
分析: 当时就是在进行innobackupex 备份 ,所以突破点非常明确 ;
疑问: xtrabackup 不是热备吗?  怎么会导致整个库不能操作呢?

日志: 用过innobackupex的同学肯定看到过备份过程中产生的日志文件;
… …
>> log scanned up to (2033 543788660)
>> log scanned up to (2033 546355144)
>> log scanned up to (2033 548568390)
>> log scanned up to (2033 551355379)
>> log scanned up to (2033 553779581)
>> log scanned up to (2033 556022806)
>> log scanned up to (2033 557837545)
>> log scanned up to (2033 560262937)
>> log scanned up to (2033 562723545)
>> log scanned up to (2033 565187514)
>> log scanned up to (2033 567275222)
tar: monitor/rrd_value.ibd: file changed as we read it
110510 10:07:04  innobackupex: Starting mysql with options: –unbuffered –password=Xtrapassword –user=Xtrabak –host=127.0.0.1 –port=3306
110510 10:07:04  innobackupex: Connected to database with mysql child process (pid=29094)
>> log scanned up to (2033 569803877)
110510 10:07:08  innobackupex: Starting to lock all tables…
>> log scanned up to (2033 572163953)
>> log scanned up to (2033 574650634)
>> log scanned up to (2033 575060545)
110510 10:07:26  innobackupex: All tables locked and flushed to disk

110510 10:07:26  innobackupex: Starting to backup .frm, .MRG, .MYD, .MYI,
innobackupex: .TRG, .TRN, .ARM, .ARZ and .opt files in
innobackupex: subdirectories of ‘/home/mysql/data/mysql’
innobackupex: Backing up files ‘/home/mysql/data/mysql/mysql/*.{frm,MYD,MYI,MRG,TRG,TRN,ARM,ARZ,opt}’ (66 files)
>> log scanned up to (2033 575060545)
>> log scanned up to (2033 575060545)
innobackupex: Backing up files ‘/home/mysql/data/mysql/test/*.{frm,MYD,MYI,MRG,TRG,TRN,ARM,ARZ,opt}’ (48 files)
>> log scanned up to (2033 575060545)
>> log scanned up to (2033 575060545)
>> log scanned up to (2033 575060545)
innobackupex: Backing up files ‘/home/mysql/data/mysql/monitor/*.{frm,MYD,MYI,MRG,TRG,TRN,ARM,ARZ,opt}’ (17 files)
110510 10:07:49  innobackupex: Finished backing up .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ and .opt files

在上面我们会发现innobackupex有一个动作:
110510 10:07:08  innobackupex: Starting to lock all tables…
… …
110510 10:07:26  innobackupex: All tables locked and flushed to disk

就是这个过程锁住了全部的库和表。
这个过程在干什么?
我们来回顾一下xtrabackup的整个过程:
——————————————–
###  复制所有.idb
复制物理文件 (固定每次1M)

###  同步 transaction log (每次读写512KB的数据,一直进行,直到结束)
XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,
与此同时,XtraBackup还有另外一个线程监视着transactions log,
一旦log发生变化,就把变化过的log pages复制走。
由于REDOL会重复利用, 所以要尽量复制走;不然就会被覆盖。

###  锁住实例
等所有IDB复制完后,就执行  lock all tables

###  复制所有非INNODB表(如MYISAM等)
这时INNODB数据已经备份完成,还需要备份其他引擎的数据,
由于要达到数据一致,这时候必须在锁住所有表后进行操作;

###  同步日志
备份非INNODB引擎过程中产生的日志还是需要复制的

###  释放锁
所有数据都备份完成后,在某个LSN状态,释放锁

###  备份结束

到了这里已经比较清楚为什么在热备的时候,数据库也会HANG起了。
热备是针对INNODB的, 对MYISAM等非INNODB引擎在使用的时候,还是要注意谨慎;