文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

xtrabackup原理及用法详解

2024-04-02 19:55

关注

开源的一款数据库备份工具,可以去官网下载并使用

percona-backupxtra对InonoDB会进行增量备份,面对MyISAM的数据进持完全备份。

1 xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;

2 innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份。

3 另外2个工具相对小众些,xbcrypt 是加解密用的;xbstream 类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式。两都在备份和解压时都会用到(如果备份用了加密和并发)。

mysql:表是MyISAM引擎,读多写少,性能好。

实现方式:说实话,看这个不如看备份产生的信息,产生的信息中每一步都显示出来,能更好带你了解innobackupex 是如何备份的。

1 首先会启动一个xtrabackup_log后台检测的进程,实时检测mysql redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_log中


2 复制innodb的数据文件和系统表空间文件idbdata1到对应的以默认时间戳为备份目录的地方


3 复制结束后,执行flush table with read lock操作


4 复制.frm .myd .myi文件


5 并且在这一时刻获得binary log 的位置


6 将表进行解锁unlock tables


7 停止xtrabackup_log进程


xtrabackup原理及用法详解


完全备份:

# innobackupex --user=root --password=mysql /PATH/TO/BACKUP-DIR/

如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户

> CREATE USER 'bkpuser'@'localhost' IDENRIFIED BY 'PASSWORD';

> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bkpuser';

> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';

> FLUSH PRIVILEGES;

The RELOAD privilege enables use of the FLUSH statement. It also enables mysqladmin commands that are equivalent to FLUSH operations: flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, and reload.

The REPLICATION CLIENT privilege enables the use of the SHOW MASTER STATUS, SHOW SLAVE STATUS, and SHOW BINARY LOGS statements.

    使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)心及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

在备份的同时,innobackupex还会备份目录中创建如下文件:

(1)xtrabackup_checkpoints 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

每个InnoDB页(通常为16K大小)都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页最近是如何发生改变的。

    (2)xtrabackup_binlog_infomysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

3)xtrabackup_info备份的信息集合

(4)xtrabackup_binary 备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf备份命令用到的配置选项信息;

(6)xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0 从哪个数据块开始备份

to_lsn = 1637454备份到哪里

last_lsn = 1637454最后的数据块

会维护每个数据块的日志序列号,如果数据发生改变,日志序列号就会往前走一次的,所以它可以根据这个号码来进行增量备份。发生改变就备份,没有改变就不用备份了。

在使用innobackupex进行备份时,还可以用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录,如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚且未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。


3、从一个完全备份中恢复数据

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。

# innobackupex --copy-back /PATH/TO/BACKUP-DIR/     //--copy-back 或 --force-non-empty-directories 

    datadir必须是为空的,innobackupex –copy-back不会覆盖已存在的文件

还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir。

如果执行正确,其输出信息的最后几行通常如下:

innobackupex: Starting to copy InnoDB log file

...

innobackupex: Finished copying back files.

innobackupex: completed OK!

请确保如上信息的最后一行出现“completed OK!”

当数据恢复至DATADIR目录后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要先修改文件的属主和属组,如:

chown -R mysql.msyql /data/


4、使用innobackupex进行增量备份

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的甚而,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

要实现第一次增量备份,可以使用下面的命令进行:

# innobackupex --incremental /backup --incremental-dir=BASEDIR

ex:

innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_12-32-56/ --incremental /backup/

下一个增量备份要以之前的增量备份上做备份,也就是说--incremental-basedir=上一个新增的目录,而不是全备的。

其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-dir应该指向上一次完全备份所在的目录。

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份其实进行的是完全备份,

“prepare”增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”,“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。

于是,操作就变成了:

#innobackupex --apply-log --redo-only BACKUP-DIR\//每一次的BACKUP-DIR都是全量备份文件的位置

接着执行:

# innobackupex --apply-log --redo-only BACKUP-DIR --incremental-dir=INCREMENTAL-DIR-1

而后是第二个增量:

# innobackupex --apply-log --redo-only BACKUP-DIR(这里的目录不是完全备份的目录,面是上一次增量备份的目录,因为是在上一次增量备份的基础上还原的) --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1 指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,第一次都要执行如上操作;


首先准备文件

我的数据库数据在/data/下用LVM做的,我在这还要强调一下,二进制日志必须与数据不在同一个磁盘上,这一点怎么提醒都不为过,最好日志能放到raid1有镜像的地方上去。

mkdir /backup/

1、# innobackupex --user=root --password=mysql /backup///进行完全备份

2、# innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_13-49-52/ --incremental /backup/进行第一次增量备份 

3、# innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_12-49-52/ --incremental /backup/进行第二次增量备份

4、# innobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56///第一次全量恢复,但是数据没有回/data目录下

5、# nnobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56/ --incremental-dir=/backup/2017-03-29_13-49-52/    //恢复第一次增量备份

6、# innobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56/ --incremental-dir=/backup/2017-03-29_13-53-57///恢复第二次增量备份

7、# innobackupex --copy-back /backup/2017-03-29_12-32-56///进行回滚操作,因为之前做过perpare操作,所以直接回滚就可以了,数据就回来了

8、# chown -R mysql.mysql /data/*

9、# service mysqld start//如果这时候出现Starting MySQL.. ERROR! The server quit without updating PID file (/var/mysql/data/localhost.localdomain.pid).

你就可以killall mysqld    把之前残留的进程杀死,在启动


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯