全量备份( --backup)
创建备份,使用xtrabackup --backup
选项运行xtrabackup。还需要指定一个--target-dir
选项,即备份的存储位置。
如果InnoDB数据或日志文件未存储在同一目录中,则可能还需要指定这些文件的位置。
如果目标目录不存在,则xtrabackup 会创建它。如果该目录确实存在且为空,则xtrabackup将成功。
如果存在文件,xtrabackup不会覆盖现有文件,它显示系统错误17并失败。
备份命令
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** ${backup_dir}
该命令将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下${backup_dir}。
注意:如果不指定--defaults-file,默认值为/etc/my.cnf。
执行完成后将显示如下命令行执行信息
160906 10:19:17 Finished backing up non-InnoDB tables and files
160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '62988944'
xtrabackup: Stopping log copying thread.
.160906 10:19:18 >> log scanned up to (137343534)
160906 10:19:18 Executing UNLOCK TABLES
160906 10:19:18 All tables unlocked
160906 10:19:18 Backup created in directory '${backup_dir}'
160906 10:19:18 [00] Writing backup-my.cnf
160906 10:19:18 [00] ...done
160906 10:19:18 [00] Writing xtrabackup_info
160906 10:19:18 [00] ...done
xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied.
160906 10:19:18 completed OK!
看到的最后一行显示类似于以下内容,其中的值LSN
将是一个取决于您的系统的数字:
xtrabackup: Transaction log of lsn (<SLN>) to (<LSN>) was copied.
备份成功后,将在备份目录下创建一个时间戳目录,该目录下存放着备份文件。
恢复准备(--prepare)
使用--backup
选项进行备份后,备份文件在时间点上是不一致的,因为它们是在程序运行时在不同的时间复制的,并且在过程中它们可能已被更改。
如果尝试使用这些数据文件启动InnoDB,它将检测到文件损坏(不一致)并异常退出,防止在损坏(不一致)的数据上运行。
通过xtrabackup --prepare
可以使备份文件在单个时间点保持一致性,操作完成后可以运行InnoDB。
在prepare
操作过程中,xtrabackup会启动一种嵌入其中的并经过修改的InnoDB。
InnoDB必须进行一些修改才能禁用一些标准安全检查,例如比较日志文件的大小不合适等。
这些修改仅适用于xtrabackup命令;不需要修改的InnoDB即可使用xtrabackup进行备份。
prepare
步骤使用嵌入式InnoDB复制的日志文件对复制的数据文件执行故障恢复操作。
prepare
步骤非常简单:只需运行xtrabackup --prepare
选项并告诉它要准备的目录,例如:
xtrabackup --prepare --target-dir=/data/backups/
完成此操作后,应该看到带有InnoDB shutdown
的消息,其中LSN
的值取决于您的系统。
InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!
不建议在prepare
时中断xtrabackup过程,因为可能会导致数据文件损坏并且备份将变得不可用。
备份恢复(--apply-log、--copy-back )
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --use-memory=4G --apply-log ${backup_dir}/2020-12-29_09-05-25
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --copy-back ${backup_dir}/2020-12-29_09-05-2
恢复分为两个步骤,第一步是apply-log,,一般建议设置--use-memory选项加快速度。
这个步骤完成之后,目录${backup_dir}/2020-12-29_09-05-25下的备份文件已经准备就绪。
第二步是copy-back,即把备份文件拷贝至原数据目录下。
恢复完成之后,需要检查数据目录的所有者和权限是否正确。
增量备份(--incremental)
注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。
增量备份需要基于全量备份, xtrabackup备份时写入一个名为xtrabackup_checkpoints
到备份的目标目录。该文件包含一行显示 to_lsn
,这是备份结束时数据库的LSN
。
例如,全备的信息如下:
backup_type = full-backuped
from_lsn = 0
to_lsn = 563759005914
last_lsn = 563759005914
假设已经有了一个全备目录(${backup_dir}/2020-12-29_09-05-25)。
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=${backup_dir}/2020-12-29_09-05-25 --incremental ${backup_dir}
其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。
上面语句执行成功后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:${backup_dir}/2020-12-29_09-52-37)。
在该目录下存放着增量备份的所有文件。
基于该全备的增量备份的信息如下:
backup_type = incremental
from_lsn = 563759005914
to_lsn = 574765133284
last_lsn = 574765133284
从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
还可以在增量备份的基础上再做增量备份,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示:
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=${backup_dir}/2020-12-29_09-52-37 --incremental ${backup_dir}
它的xtrabackup_checkpoints记录着备份信息如下:
backup_type = incremental
from_lsn = 574765133284
to_lsn = 574770200380
last_lsn = 574770200950
可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。
增量备份准备(--apply-log-only)
增量备份的 --prepare步骤与完全备份的步骤不同。
在完全备份中,将执行两种的操作来保证数据库一致:一是对已提交的事务,相对于数据文件从日志文件中重放,二是未提交的事务被回滚。
在准备增量备份恢复时,需要跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能将在下一个增量备份中提交。
可以使用xtrabackup --apply-log-only
选项来防止回滚。
要准备基本备份,只需要照常运行xtrabackup --prepare
,
要防止回滚阶段,需执行类似以下命令:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
输出应以类似于以下内容的文本结尾:
InnoDB: Shutdown completed; log sequence number 1626007
161011 12:41:04 completed OK!
将第一个增量备份应用于完整备份,请运行以下命令:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1
这会将增量文件应用于中的文件/data/backups/base
,从而将它们及时向前滚动到增量备份的时间。
然后,它像往常一样将重做日志应用于结果。最终数据在中 /data/backups/base
,而不在增量目录中。
您应该看到类似于以下内容的输出:
incremental backup from 1626007 is enabled.
xtrabackup: cd to data/backups/base
xtrabackup: This target seems to be already prepared with --apply-log-only.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(4124244)
...
xtrabackup: page size for tmp/backups/inc1/ibdata1.delta is 16384 bytes
Applying tmp/backups/inc1/ibdata1.delta to ./ibdata1...
...
161011 12:45:56 completed OK!
增量备份恢复(--apply-log)
增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志:
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。
这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--use_memory提高性能。
以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。
第二步:回滚未完成的日志:
innobackupex --apply-log BASE-DIR
上面执行完之后,BASE-DIR里的备份文件已完全准备就绪。
最后一步是拷贝:
innobackupex --copy-back BASE-DIR
同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。