前言
热备份的方式也就是直接复制数据物理文件,热备份可以不停机直接复制,一般用于7×24小时不间断的重要核心业务。mysql社区版的热备份工具ImnoDB Hot Backup是付费的,只能试用30天,只有购买企业版才可以得到永久使用权。Percona公司发布了一个xtrabackup热备份工具,和官方付费版的功能一样,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDBHot Backup的一个很好的替代品。
xtrabackup简介
xtrabackup是由Percona开源的免费数据库热备份软件,它能对Innodb存储引擎的数据库和XtraDB存储引擎的数据库非阻塞地备份(对于myisam存储引擎数据库的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。
xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup
①、xtrabackup 是用于热备份InnoDB及XtraDB表中数据的工具,不能备份其他类型的表,也不能备份数据表结构。是专门用来备份InnoDB存储引擎的表的
②、innobackupex 是将xtrabackup进行封装的perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
③、xbcrypt 加密解密备份工具
④、xbstream 流传打包传输工具,类似tar
xtrabackup手册:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
xtrabackup备份的过程
(1)非InooDB的表,备份的时候会进行短暂的锁表,然后copy数据的物理文件
(2)对于InnoDB的表,立即触发checkpoint,会立即记录一个LSN号,然后copy数据物理文件
(3)将备份过程中产生的redo进行截取和保存,并记录此时最新的LSN号
xtrabackup恢复的过程
恢复其实就是模拟了CSR的全过程,在恢复之前,将数据的LSN号和redo LSN号追平,恢复方法就是直接copy回去即可。
xtrabackup增量备份介绍
xtrabackup增量备份的原理是:
①、首先完成一个完全备份(或者说是 全量备份),并记录下此时检查点LSN。
②、然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。
PS:说白了,进行增量备份的时候必须先进行一次全量备份的操作
增量备份优点:
①、数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高。
②、支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写。
③、每日备份只产生少量数据,也可采用远程备份,节省本地空间。
④、备份恢复基于文件操作,降低直接对数据库操作风险。
⑤、备份效率更高,恢复效率更高。
xtrabackup的安装
安装命令如下:
注意:注意版本限制,我提供的下载链接是mysql5.7版可以用以下命令安装,mysql8.0及以上版本需要去官网下载对应mysql8.0等系列的版本
[root@ecs-abcf ~] wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm [root@ecs-abcf ~] yum -y localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm [root@ecs-abcf ~] rpm -qa | grep xtrabackup
xtrabackup工具的简单备份(导出)操作
示例一:
#使用mysql的root账号备份mysql中的所有数据库,将备份文件保存到/home/backup目录下。注意需要指定mysql的配置文件 下面的my.cnf换成你自己的路径 innobackupex --default-file=/etc/my.cnf --user=root --password=your_password --backup /home/backup
通过上图可以看到该工具将mysql里面的数据文件都进行了copy操作。
然后cd /home/backup目录下会发现生成了一个以日期命名的文件夹,进入该文件后里面就是我们备份的数据文件了。
xtrabackup工具的简单恢复(导入)操作
恢复前的准备工作:
①、停止mysql服务
②、将mysql的数据目录(也就是data目录,这个是默认的数据目录。不过我这里安装的mysql,它默认的数据目录是/your_mysql_path/var这个,以下我就使用var目录了。),重命名为别的名字,我这里为:var-back
var目录重命名后的截图:
开始恢复:
#注意把对应的路径换成你自己的就可以了 innobackupex --default-file=/etc/my.cnf --copy-back /home/backup/2019-11-02_13-30-38/
示例截图:
再次查看mysql的数据目录,发现多了一个var目录,该目录就是我们上面执行恢复命令而来的。
示例截图:
如果这个时候你去启动mysql服务,会发现启动失败,出错了。为什么?通过上图我们看到恢复的数据目录(我这里也就是var目录)的权限都是root用户 root用户组,我们需要改成mysql,报错原因就是因为权限的问题,改一下就可以了
chown -R mysql:mysql var #再次强调 我这里的mysql数据目录是var目录 但是默认的一般都是data目录,上面的命令把var换成自己实际的目录
然后再次启动mysql服务就可以了,启动后进入mysql里面可以看到数据又都回来啦。
这里只是简单演示下如何使用,根据自己各自的情况灵活变通即可。
xtrabackup工具的常用选项
xtrabackup 工具有许多参数,具体可去官网查询(xtrabackup 参数选项 | innobackupex 参数选项),这里简单介绍 innobackupex 一些常用的选项参数。
1) innobackupex 常用参数选项:
--defaults-file=[MY.CNF] //指定配置文件:只能从给定的文件中读取默认选项。 且必须作为命令行上的第一个选项;必须是一个真实的文件,它不能是一个符号链接
--host //指定主机
--user //指定用户名
--password //指定密码
--port //指定端口
--databases=# //指定备份的数据库和表,格式为:--databases="db1[.tb1] db2[.tb2]" 多个库之间以空格隔开,如果此选项不被指定,将会备份所有的数据库
--include=REGEXP //用正则表达式的方式指定要备份的数据库和表,格式为 --include=‘^mydb[.]mytb’ ,对每个库中的每个表逐一匹配,因此会创建所有的库,不过是空的目录。--include 传递给 xtrabackup --tables
--tables-file=FILE //此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称,格式为databasename.tablename。该选项传递给 xtrabackup --tables-file,与--tables选项不同,只有要备份的表的库才会被创建
注意:部分备份(--include、--tables-file、--database)需要开启 innodb_file_per_table
--compact //创建紧凑型备份,忽略所有辅助索引页,只备份data page;通过--apply-log中重建索引--rebuild-indexs
--compress //此选项指示xtrabackup压缩备份的InnoDB数据文件,会生成 *.qp 文件
--no-timestamp //指定了这个选项备份将会直接存储在 BACKUP-DIR 目录,不再创建时间戳文件夹
--decompress //解压缩qp文件,为了解压缩,必须安装 qpress 工具。 Percona XtraBackup不会自动删除压缩文件,为了清理备份目录,用户应手动删除 * .qp文件:find /data/backup -name "*.qp" | xargs rm
--apply-log //应用 BACKUP-DIR 中的 xtrabackup_logfile 事务日志文件。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件使得数据文件处于一致性状态
--use-memory=# //此选项接受一个字符参数(1M/1MB,1G/1GB,默认100M),仅与--apply-log一起使用,该选项指定prepare时用于崩溃恢复(crash-recovery)的内存
--copy-back //拷贝先前备份所有文件到它们的原始路径(也就是指定恢复备份的目录)。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项
--force-non-empty-directories //恢复时指定此选项,可使 --copy-back 和 --move-back 复制文件到非空目录,即原data目录下可以有其他文件,但是不能有与恢复文件中同名的文件,否则恢复失败
--rsync //此选项可优化本地文件(非InnoDB)的传输。rsync工具一次性拷贝所有非InnoDB文件,而不是为每个文件单独创建cp,在备份恢复很多数据库和表时非常高效。此选项不能和 --stream 一起使用
--incremental //这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。它传递到 xtrabackup 子进程。当指定这个选项,可以设置 --incremental-lsn 或 --incremental-basedir。如果这2个选项都没有被指定,--incremental-basedir 传递给 xtrabackup 默认值,默认值为:基础备份目录的第一个时间戳备份目录
--incremental-basedir=DIRECTORY //该选项接受一个字符串参数,该参数指定作为增量备份的基本数据集的完整备份目录。它与 --incremental 一起使用
--incremental-dir=DIRECTORY //该选项接受一个字符串参数,该参数指定了增量备份将与完整备份相结合的目录,以便进行新的完整备份。它与 --incremental 选项一起使用
--redo-only //在“准备基本完整备份“ 和 “合并所有的增量备份(除了最后一个增备)”时使用此选项。它直接传递给xtrabackup的 xtrabackup --apply-log-only 选项,使xtrabackup跳过"undo"阶段,只做"redo"操作。如果后面还有增量备份应用到这个全备,这是必要的。有关详细信息,请参阅xtrabackup文档。
--parallel=NUMBER-OF-THREADS //此选项接受一个整数参数,指定xtrabackup子进程应用于同时备份文件的线程数。请注意,此选项仅适用于文件级别,也就是说,如果您有多个.ibd文件,则它们将被并行复制; 如果您的表一起存储在一个表空间文件中,它将不起作用
--help //查看innobackupex工具的更多选项参数使用说明
2) xtrabackup 常用参数选项:
--apply-log-only //这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要
xtrabackup备份原理
①、innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件。
②、xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)。
③、xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)。
④、innobackupex收到xtrabackup通知后,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
⑤、当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态。
⑥、xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成。
⑦、innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES。
⑧、最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
重要的不是我们生下来怎样 而是我们将来会变成怎样 -->哈利波特
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论