xtrabackup是perconna公司的产品
mysql5.7之前(包含5.7)使用xtrabackup - Percona XtraBackup 2.4 ,mysql8.0以上使用Xtrabackup8.0.
首先XtraBackup有两个工具,一个xtrabackup,一个innobackupex 。2.4版本中已经把两个工具和在一起了,innobackupex只是xtarbackup的一个链接。
创建一个全量备份
xtrabackup --backup --target-dir=/data/backups/base --datadir=/var/lib/mysql/
注: --target-dir备份目录 --datadir需要备份的数据目录
备份文件下面除了数据文件外还有xtrabackup的一些信息文件。
backup-my.cnf
此文件中包含了my.cnf中的一些设置信息,但是,并不是my.cnf中的所有信息都会包含在此文件中,此文件中只包含了备份时需要的信息。
xtrabackup_binlog_info
此文件中记录了备份开始时二进制日志文件的"位置(position)"
xtrabackup_checkpoints
此文件中记录此次备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。
xtrabackup_info
本次备份的概要信息,此文件中的信息还是比较全面的。
xtrabackup_logfile
记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。
增量备份
第一次增备:
xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base --datadir=/var/lib/mysql/
第二次增备:
xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1 --datadir=/var/lib/mysql/
注:第二次增备是在第一次增备的基础上进行备份的,这个取决于--incremental-basedir,如果--incremental-basedir是全量备份的目录,则在全量备份的基础上进行增备。
数据库在还原的时候需要先执行一下准备步骤:
xtrabackup --prepare
这一步有两个操作:一个是把日志文件中的已提交的事务写入数据文件,一个是回滚未提交的事务。
增量备份的xtrabackup--prepare步骤与普通全备备份不同。在正常全备备份中,两种类型的操作形式是为了让数据库保持一致性。
增量备份准备步骤时必须跳过未提交事务的回滚,这时候需要用到选项--apply-log-only,因为在备份时可能正在进行中,很可能会在下一次增量备份中提交。只需要在最后一次增量准备中回滚数据即可。
注意:
如果在增量备份准备步骤中没有使用xtrabackup --prepare --apply-log-only 选项,会导致你接下来的增量备份数据不可用。因为在事务被回滚后,下面的增量备份不能被应用。
例如:下面有三个备份文件,一个全备,两个增备:
/data/backups/base
/data/backups/inc1
/data/backups/inc2
准备(prepare)基本备份,组织回滚操作:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
输出的结束文本内容类似于下面这样:
101107 20:49:43 InnoDB: Shutdown completed; log sequence number 1291135
log sequence number需要匹配上base backup 中的to_lsn。
此备份实际上可以安全地恢复到现在的状态,即使已跳过回滚阶段。如果您恢复它并启动MySQL,InnoDB将检测到回滚阶段没有执行,并且它将在后台执行该操作,就像通常用于开始时的崩溃恢复一样。它会通知您数据库没有正常关闭。
当应用第一个增量备份到全备的时候,需要执行下面这段命令:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
这会将增量文件应用于/data/backups/base中的文件,这会将增量文件按时间向前滚动到增量备份的时间。然后它像往常一样应用重做日志到结果中。最后的数据在/data/backups/base中,而不是在增量目录中。你应该看看一些输出,如:
incremental backup from 1291135 is enabled.
xtrabackup: cd to /data/backups/base/
xtrabackup: This target seems to be already prepared.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340)
Applying /data/backups/inc1/ibdata1.delta ...
Applying /data/backups/inc1/test/table1.ibd.delta ...
.... snip
101107 20:56:30 InnoDB: Shutdown completed; log sequence number 1291340
同样,LSN应该与您先前检查第一个增量备份时看到的内容相匹配。如果整修数据文件/data/backups/base,您应该可以看到第一次增量备份时数据库的状态。
准备第二次增量备份的过程与此类似:将增量应用于(修改的)基本备份,然后您将滚动其数据及时转发到第二个增量备份点:
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
提示:
xtrabackup --apply-log-only 选项只用在增量全恢复中,但最后一个增量文件恢复除外。这就是为什么上面一行没有包含xtrabackup --apply log only选项。即使在最后一步中使用了xtrabackup--apply log,备份仍然是
一致,但在这种情况下,服务器将执行回滚阶段。
做完准备工作后,需要把备份的数据恢复,无论是新的库还是以前的库,都应该保证恢复的位置是空的,没有数据。因为默认不会覆盖已经存在的数据文件,除非指定选项 --force-non-empty-directories ,但最好是一个空库,把数据文件全给删除。
xtrabackup --copy-back --datadir=还原的库 --target-dir=/home/mysql3306/back --force-non-empty-directories
xtrabackup --copy-back --datadir=还原的库 --target-dir=/home/mysql3306/back
注:datadir表示新的数据目录,这个可以使用参数指定,可以用添加在默认的配置文件里指定参数--defaults-file=my.cnf.
当启用了单独表空间(innodb_file_per_table)后,xtrabackup支持部分备份。这里有三种方式支持部分备份:
1、可以用正则表达式匹配表名;
2、在文件中提供表列表;
3、提供数据库列表。
示例:
1、$ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.].*"
2、$ echo "mydatabase.mytable" > /tmp/tables.txt
$ xtrabackup --backup --tables-file=/tmp/tables.txt
3、$ xtrabackup --databases='mysql sys performance_schema ...'
还有一些高级特性,待续。。。。。。。。。。。。