天天看点

MySQL备份之Xtrabackup实战

简介

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁)

特点

1) 备份过程快速、可靠;

2) 备份过程不会打断正在执行的事务;

3) 能够基于压缩等功能节约磁盘空间和流量;

4) 自动实现备份检验;

5) 还原速度快;

安装

ubuntu下安装

完全备份

备份

innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

--user: 需要创建一个拥有最小权限的用户
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'xtrauser'@'localhost' IDENTIFIED BY 'xtrauser' ;
mysql> FLUSH PRIVILEGES ;
           

/path/to/BACKUP_DIR

备份出来的数据存放目录,外加包含一些xtrabackup的元数据使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

在备份的同时,innobackupex还会在备份目录中创建如下文件:

1.xtrabackup_checkpoints: 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(Log Serial Number日志序列号)范围信息;

# cat xtrabackup_checkpoints     
  backup_type = full-backuped
  from_lsn = 
  to_lsn = 
  last_lsn = 
  compact = 
  recover_binlog_info = 
           

在mysql中,存储数据的数据块会有按照顺序的ID, 如果某一块数据被修改,将会赋予新的ID。 根据这些ID,可以标记数据的新老成都。xtrabackup也就是使用这些ID来进行备份,和增量备份

每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

2.xtrabackup_binlog_info: mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

还原

假设数据库发生错误,删除了数据目录

//删除目录(根据自己的环境)
sudo rm -rf /data/mysql/var
sudo rm -rf /data/mysql/data
//创建目录(根据自己的环境)
sudo mkdir /data/mysql/var
sudo mkdir /data/mysql/data
//修改目录的所有者(根据自己的环境)
sudo chown -R mysql:mysql /data/mysql/var
sudo chown -R mysql:mysql /data/mysql/data
//还原数据
innobackupex --defaults-file=/etc/my.cnf --copy-back=/data/backup/--_16--
           

增量备份

备份

基于全量备份做增量备份。

先做一次全量备份

中间做一些修改……

第一次增量备份

中间做一些修改……

第二次增量备份

准备

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

2)基于所有的备份将未提交的事务进行“回滚”。于是,操作就变成了:不能回滚,因为有可能第一次备份时候没提交,在增量中已经成功提交

innobackupex --apply-log --redo-only /data/backup/--_17--

innobackupex --apply-log --redo-only /data/backup/--_17-- --incremental-dir=/data/increment/--_17--

innobackupex --apply-log --redo-only /data/backup/--_17-- --incremental-dir=/data/increment/--_17--
           

恢复

同完全备份恢复过程一致。

继续阅读