zoukankan      html  css  js  c++  java
  • 2. Mysql之xtrabackup工作原理浅谈02

    1.前言

      本章节重点剖析Xtrabackup的工作原理(包括它的备份原理以及恢复原理)

    2.开始

      在下载完percona-xtrabackup(我这里下载的是二进制包),版本是:xtrabackup version 2.4.21    会发现其bin目录是如下结构:  

    [root@node01 bin]# tree /usr/local/xtrabackup/bin
    /usr/local/xtrabackup/bin
    ├── innobackupex -> xtrabackup
    ├── xbcloud
    ├── xbcloud_osenv
    ├── xbcrypt
    ├── xbstream
    └── xtrabackup

      这里的innobackupex是xtrabackup的软连接,但是在之前版本,这两个是相互独立的命令。

      在之前版本中xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。简单来说,innobackupex 在 xtrabackup 之上做了一层封装。但是在2.4版本中已经把innobackupex作为xtrabackup的软连接,说明xtrabackup已经整合了innobackupex所有功能。

    • innobackupex:innobackupex是xtrabackup的符号链接。innobackupex仍然像2.2版本一样支持所有功能和语法,但现在已弃用,并将在下一个主要版本中删除。
    • xtrabackup:一个已编译的C二进制文件,它提供了使用MyISAM、InnoDB和XtraDB表备份整个MySQL数据库实例的功能。
    • xbcrypt:用于加密和解密备份文件的实用程序
    • xbstream:允许从 xbstream 格式流式传输和提取文件的实用程序
    • xbcloud:用于从云下载或从云上传全部或部分 xbstream 存档的实用程序    

    3.完全备份流程解析原理 

      Percona XtraBackup基于innodb的崩溃恢复功能。复制innodb数据文件,这会导致数据在内部不一致;但随后它对文件执行崩溃恢复,是它们再次成为一致、可用的数据库。

      

      具体步骤:

    • 在开始备份时,首先使用指定的账号和密码连接Mysql,该数据库连接用于备份过程中执行如加锁、解锁、刷新redo日志等与数据库进行交互操作
    • 读取--defaults-file选项指定的配置文件,解析innodb_data_home_dir和innodb_log_group_home_dir等系统参数,找到数据表空间和redo日志文件的位置。创建xtrabackup_logfile文件,模拟Mysql实例方式,以读写模式打开并读取redo日志,检查当前的检查点,从当前检查点位置复制redo日志,同时持续扫描redo日志,有新产生的redo日志数据都复制到xtrabackup_logfile文件中(整个备份过程中一直复制redo日志,通过查看备份目录下的xtrabackup_log文件,可以看到这个文件在不断增长)
    • 另外一个线程调用xtrabackup命令开始复制数据文件(主要是磁盘上的文件),包括共享表空间文件和独立表空间文件,相当于获得了redo日志,undo日志和数据文件,只是没有没存中脏页数据,不过后期在恢复是直接通过redo日志来恢复就可以了。
    • 全局执行FLUSH TABLE WITH READ LOCK 语句加上一个S锁,此时数据库处于不可写状态(执行FTWRL的目的是为了防止读取数据是发生DDL操作,并且获取binlog文件位置)。redo日志暂时也会卡在这里。  
    • 开始复制表结构文件,复制非innodb引擎表的.MYD、.MYI、.frm等文件和innodb引擎表.fim、opt等文件,并获取binlog文件位置并写到xtrabackup_binlog_info文件中
    • 执行flush no_waite_to_binlog engine logs语句将innodb层的redo日志持久化到磁盘后进行复制(因为xtrabackup不备份二进制日志,所以,如果这个过程如果出现问题,就会导致恢复之后丢失redo日志中数据,做主从复制可能会同步出错,但是在2.2.3版本之后修复),最后再停止读redo日志复制的线程。需要主要的是,innobackupex备份数据的时间点是停止redo日志复制时的数据对应的时间点
    • 当redo日志的复制线程停止后,执行unlock tables 语句解锁表。
    • 最后innobackupex完成收尾工作,如释放资源,记录与备份相关的元数据信息等(例如backup-my.cnf和xtrabackup_info文件),最后退出innobackupex备份进程

      在上面描述的文件拷贝,都是备份进程直接通过操作系统读取数据文件的,只在执行 SQL 命令时和数据库有交互,基本不影响数据库的运行,在备份非 InnoDB 时会有一段时间只读(如果没有MyISAM表的话,只读时间在几秒左右),在备份 InnoDB 数据文件时,对数据库完全没有影响,是真正的热备。

    4.完全备份恢复解析流程

        

         具体步骤:

    • 在备份恢复时,启动一个minni instance(最小化数据库实例),把数据文件复制到内存中,然后再读取xtrabackup_log中的redo日志进行应用,最后对没有提交的事务使用undo日志进行回滚
    • 如果查看备份恢复时的打印日志,就会发现使用innobackupex命令执行备份恢复的过程和mysqld进行启动过程非常相似,使用innobakupex命令执行备份恢复的过程中会做一次crash recovery(崩溃恢复)操作,恢复的目的是把备份数据恢复到一个一致性位点(undo、redo日志和表空间中的数据相对应)
    • 备份时执行FTWRL后,数据库处于只读状态,非innodb表是在持有全局读锁的情况下复制的,所以其本身就对应于FTWRL的时间点。innodb的.ibd文件复制是在FTWRT前做的,复制出出来的不同.ibd文件的最后更新时间点是不一样的,这种状态的.ibd文件是不能直接用的,但是redo日志是从备份开始就一直持续复制的,最后redo日志时间点是在执行FTWRL后取得的,所以最终通过redo日志应用字后的.ibd文件数据的时间和FTWRLd的时间点是一致的,因此,恢复过程只涉及innodb文件的恢复,非innodb表示不需要恢复的,当备份恢复完成后,就可以把数据文件复制到对应的目录下,通过mysqld来启动了。  

    5.增量备份

      原理后补。。

     参考文献:

      http://mysql.taobao.org/monthly/2016/03/07/

      https://www.percona.com/doc/percona-xtrabackup/2.4/how_xtrabackup_works.html

      

     

     

     

     

     

     

     

     

       

  • 相关阅读:
    MYSQL数据库实验(存储过程与触发器)
    Markdown
    EXT文件系统
    Arch在VirtualBox虚拟机中挂载U盘
    U盘启动没有引导项
    安装ArchLinux的两篇博文
    Arch Linux上安装Win10
    Gentoo系统安装痕迹化记录
    物联网操作系统安全研究综述
    2013.06_多线程_多核多线程技术综述_眭俊华
  • 原文地址:https://www.cnblogs.com/zmc60/p/14994108.html
Copyright © 2011-2022 走看看