大数据量备份与还原,始终是个难点。当MYSQL超10G,用mysqldump来导出就比较慢了。在这里推荐xtrabackup,这个工具比mysqldump要快很多。
Xtrabackup介绍
Xtrabackup是什么
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
- xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
- innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
Xtrabackup可以做什么 :
在线(热)备份整个库的InnoDB、 XtraDB表
在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。
Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:
- 首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
- 在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。
首 先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文 件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。
因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
因为innobackupex支持innodb,myisam,所以本文说一下,怎么使用innobackupex
全备和全备还原
使用innobackupex创建全备
- 本地创建全备
[root@localhost var]# innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/xtrabackup01/
[root@localhost var]# innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/xtrabackup01/
170223 15:55:36 innobackupex: Starting the backup operation
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
Unrecognized character \x01; marked by <-- HERE after <-- HERE near column 1 at - line 1374.
170223 15:55:36 Connecting to MySQL server host: 127.0.0.1, user: root, password: set, port: 3306, socket: /var/lib/mysql/mysql.sock
Using server version 5.6.35
innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 54967d1)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
170223 15:55:36 >> log scanned up to (3692666)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 1 for mysql/innodb_table_stats, old maximum was 0
170223 15:55:37 [01] Copying ./ibdata1 to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/ibdata1
170223 15:55:37 [01] ...done
170223 15:55:37 [01] Copying ./mysql/innodb_table_stats.ibd to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/mysql/innodb_table_stats.ibd
170223 15:55:37 [01] ...done
170223 15:55:37 [01] Copying ./mysql/innodb_index_stats.ibd to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/mysql/innodb_index_stats.ibd
170223 15:55:37 [01] ...done
....
....
....
170223 15:55:38 Finished backing up non-InnoDB tables and files
170223 15:55:38 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '3692666'
xtrabackup: Stopping log copying thread.
.170223 15:55:38 >> log scanned up to (3692666)
170223 15:55:38 Executing UNLOCK TABLES
170223 15:55:38 All tables unlocked
170223 15:55:38 Backup created in directory '/home/xtarback/xtrabackup01/2017-02-23_15-55-36/'
170223 15:55:38 [00] Writing backup-my.cnf
170223 15:55:38 [00] ...done
170223 15:55:38 [00] Writing xtrabackup_info
170223 15:55:38 [00] ...done
xtrabackup: Transaction log of lsn (3692666) to (3692666) was copied.
170223 15:55:39 completed OK! #全备份完成
在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件,/home/xtarback/xtrabackup01/2017-02-23_15-55-36/备份到此目录下面
- 备份目录下面的各项文件说明
xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
backup-my.cnf —— 备份命令用到的配置选项信息;
在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。
内部机制:在备份的时候innobackupex会调用xtrabackup来备份innodb表,并复制所有的表定义,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。
使用innobackupex预备全备
创建完备份之后数据并没有马上可以被还原,需要回滚未提交事务,前滚提交事务,让数据库文件保持一致性。
innobackupex使用--apply-log来做预备备份
innobackupex --apply-log /home/xtarback/xtrabackup01/2017-02-23_15-55-36/
输出:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3693619
170223 16:24:26 completed OK!
成功后,备份可以被用来还原数据库了。
内部机制:读取备份文件夹中的配置文件,然后innobackupex重做已提交事务,回滚未提交事务,之后数据就被写到了备份的数据文件(innodb文件)中,并重建日志文件。这一步隐式调用了2次xtrabackup –prepare。跟多关于xtrabackup可以看之后的章节。
使用innobackupex还原备份
- 模拟删除mysql目录下面的数据
[root@localhost mysql]# cd /var/lib/mysql
[root@localhost mysql]# rm -r ./*
[root@localhost mysql]# ll
总用量 0
[root@localhost mysql]#
- 使用innobackupex --copy-back来还原备份
$ innobackupex --coyp-back /home/xtarback/xtrabackup01/2017-02-23_15-55-36/
会根据my.cnf复制所有备份到datadir下:
170223 16:34:50 Executing UNLOCK TABLES
170223 16:34:50 All tables unlocked
170223 16:34:50 Backup created in directory '/home/xtarback/xtrabackup01/2017-02-23_15-55-36/2017-02-23_16-34-48/'
170223 16:34:50 [00] Writing backup-my.cnf
170223 16:34:50 [00] ...done
170223 16:34:50 [00] Writing xtrabackup_info
170223 16:34:50 [00] ...done
xtrabackup: Transaction log of lsn (1625997) to (1625997) was copied.
170223 16:34:50 completed OK!
注:datadir必须是为空的,innobackupex –copy-back不会覆盖已存在的文件。
- 修改还原数据目录的用户属组
cd /var/lib/mysql
[root@localhost mysql]# chown -R mysql:mysql ./*
注:datadir必须是为空的,innobackupex –copy-back不会覆盖已存在的文件,还要注意,还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir。