Xtrabackup是由percona开发的一个开源软件,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份,备份时不影响数据读写
在备份的时候,备份工具主要执行两个任务来完成备份:
① 在后台启动一个日志拷贝线程。这个线程会监视InnoDB日志文件,当日志文件发生改变时,这个线程会将发生变化的数据块拷贝到备份目录下一个名为xtrabackup_logfile的文件中。这个操作是必要的,因为备份可能会持续很长时间,在数据库恢复时,需要所有从备份开始到结束的这些日志文件。
② 拷贝InnoDB数据文件到指定备份目录下。这不是一个简单的拷贝,备份工具打开并读取文件的方式类似InnoDB,通过读取文件目录并以页(page)为单位进行拷贝。
当数据文件拷贝结束时,xtrabackup会停止日志拷贝线程,并在指定备份目录中创建一个名为xtrabackup_checkpoints的文件,这个文件包含备份的类型、开始备份的日志序列号和结束备份的日志序列号。
Xtrabackup 下载地址:
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.13/source/tarball/percona-xtrabackup-2.4.13.tar.gz
解压安装过程省略。。。
innobackupex常用参数
--compress:该选项表示压缩innodb数据文件的备份。 --compact: 创建一个不包含第二索引(除了主键之外的索引)的备份 --defaults-file=[MY.CNF] 配置文件的路径 --use-memory=# 这个参数用于在准备备份时,xtrabackup执行crash recovery所使用的内存大小。这个参数仅和--apply-log搭配时才生效。 --include:该选项表示使用正则表达式匹配表的名字[db.tb],要求为其指定匹配要备份的表的完整名称,即databasename.tablename。 --user:该选项表示备份账号。 --password:该选项表示备份的密码。 --port:该选项表示备份数据库的端口。 --host:该选项表示备份数据库的地址。 --databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。 --tables-file:该选项表示指定含有表列表的文件,格式为database.table,该选项直接传给--tables-file。 --socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql。 --slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos,同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。 --safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启。 --rsync:该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能--stream一起使用。 --history:该选项表示percona server 的备份历史记录在percona_schema.xtrabackup_history表。 --redo-only 当准备数据库的全备或合并增量备份时,需要指定这个参数。这个参数实际上执行的是xtrabackup --apply-log-only,会让xtrabackup跳过回滚节点,只做“redo”步骤。当数据库需要应用增量备份时,需要指定这个参数。 --no-timestamp 这个参数会让xtrabackup在备份的时候不创建带有时间格式的子文件夹。当指定了这个参数,备份会直接创建在指定的备份目录下。 --stream=STREAMNAME 指定流备份的格式。备份将会以指定格式输出到STDOUT。目前支持的格式有tar 和 xbstream。如果指定了这个参数,后面需要接tmpdir目录作为处理流的一个中间目录。 --incremental 创建增量备份,当指定这个参数的时候,应该指定--incremental-lsn或--incremental-basedir参数,否则将会备份到--incremental-basedir路径 --incremental-basedir 以上一次全量或增量备份的路径,作为增量备份的基础。指定这个参数的同时,应该同样指定--incremental参数 --incremental-dir:该选项表示增量备份的目录。 --incremental-force-scan:该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页。 --incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用。 --incremental-history-name:该选项表示存储在PERCONA_SCHEMA.xtrabackup_history基于增量备份的历史记录的名字。Percona Xtrabackup搜索历史表查找最近(innodb_to_lsn)成功备份并且将to_lsn值作为增量备份启动出事lsn.与innobackupex--incremental-history-uuid互斥。如果没有检测到有效的lsn,xtrabackup会返回error。 --incremental-history-uuid:该选项表示存储在percona_schema.xtrabackup_history基于增量备份的特定历史记录的UUID。 --close-files:该选项表示关闭不再访问的文件句柄,当xtrabackup打开表空间通常并不关闭文件句柄目的是正确的处理DDL操作。如果表空间数量巨大,这是一种可以关闭不再访问的文件句柄的方法。使用该选项有风险,会有产生不一致备份的可能。
全备及本地或者异地恢复过程
备份
innobackupex --defaults-file=/data/mysql_data/3307/my_3307.cnf /data/backups/ --user=root -H127.0.0.1 -P3307 --password=*** --defaults-file:mysql配置文件。不指定默认为 /etc/my.cnf /data/backups/ 备份文件要写入的目录,会创建一个以时间格式为名的目录2019-02-13_15-19-58
恢复
1、本地恢复的话 要先关闭数据库,并且删除数据文件,确保数据目录为空 innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=4G --apply-log /data/backups/2019-02-13_15-19-58 --apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态 2、innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --copy-back /data/backups/2019-02-13_15-19-58 --copy-back,即把备份文件拷贝至原数据目录下。 3、修改数据目录权限 chown mysql.mysql /data/mysql_data/3307/data -R
相关备份binlog点都存在下图中,用作主从同步及记录,数据库启动后根据文件中的点从做主备的相关参数即可
以上流程也适合异地恢复及做主从同步,把备份目录scp到远程服务器目录,再执行第二三步即可
增备及本地或者异地恢复过程
备份及恢复
注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。
1、增量备份:增量备份需要基于全备
innobackupex --defaults-file=/data/mysql_data/3307/my_3307.cnf --user=root -H127.0.0.1 -P3307 --password=*** --incremental /data/backups --incremental-basedir=/data/backups/2019-02-13_15-19-58
--incremental-basedir 指向全量备份目录
--incremental 指向增量备份的目录
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录
可以持续做增量备份
只需要把--incremental-basedir 的目录指向上一次增量备份的目录即可
2、增量备份恢复
innobackupex --apply-log --redo-only --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G /data/backups/INCREMENTAL-DIR(2019-02-13_15-19-58)
- innobackupex --apply-log --redo-only --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G /data/backups/2019-02-13_15-19-58 --incremental-dir=INCREMENTAL-DIR-1
- innobackupex --apply-log --redo-only --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G /data/backups/2019-02-13_15-19-58 --incremental-dir=INCREMENTAL-DIR-2
- 多个备份往后以此类推
INCREMENTAL-DIR:全备目录
INCREMENTAL-DIR-1:增备目录1
INCREMENTAL-DIR-2:增备目录2
。。。
此时两次增量备份其实都合并到全备上了,恢复是只需要使用全备进行恢复就可以了
innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G --apply-log /data/backups/2019-02-13_15-19-58
innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --copy-back /data/backups/2019-02-13_15-19-58
3、修改数据目录权限启动即可