• xtrabackup+binlog 实现完全恢复


    一、xtrabackup备份原理

    1.1 全备过程

    1. 开启一个后台检测进程,检测 redo 的变化,一旦发现redo中有新日志写入,将日志记录到后台日志文件 xtrabackup_log中
    2. 复制 InnoDB 的数据文件和系统表空间 ibdata1文件
    3. 复制结束后,执行 flush tables with read lock。加上--no-lock可以不执行,只对 InnoDB 有效,但是无法获取准确的 position。flush tables with read lock的作用是防止数据表发生 DDL 操作。
    4. 复制 MyISAM等其他引擎的文件
    5. 获取binlog的位置
    6. 执行unlock tables,把表设置可读写状态
    7. 停止xtrabackup_log

    1.2 全备恢复

    恢复的过程会应用xtrabackup_log,将提交的事务变更到 InooDB表空间,同时回滚未提交的事务。

     

     

    二、xtrabackup全备+binlog恢复到某个时间点

    2.1. 构造测试数据

    create database vcyber;
    
    use vcyber;
    
    create table t(id int primary key,name varchar(10));
    
    insert into t select 1,'a';
    
    insert into t select 2,'b';
    
    select * from t;
    
    +----+------+
    | id | name |
    +----+------+
    | 1  | a    |
    | 2  | b    |
    +----+------+

    2.2. 执行全量备份

    innobackupex --defaults-file=/etc/my.cnf --slave-info --no-timestamp /data/backup/data/dbfull_3306_`date '+%Y%m%d_%H%M'`

     

    2.3. 新增加2行数据

    insert into t select 3,'c';
    
    insert into t select 4,'d';
    
    select * from t;
    
    +----+------+
    | id | name |
    +----+------+
    | 1  | a    |
    | 2  | b    |
    | 3  | c    |
    | 4  | d    |
    +----+------+

    2.4. 模拟误删除数据库

    drop database vcyber;

    2.5. 恢复数据库

    # 关闭数据库

    mysqladmin shutdown

     

    # 把原来的数据目录改名,清空 data目录下面的数据,要不然后面还原数据的时候会报目录非空

    mv /data/mysql/mysql_3306/data  /data/mysql/mysql_3306/data_bak

    # 应用日志

    innobackupex --defaults-file=/etc/my.cnf --apply-log /data/backup/data/dbfull_3306_20180907_0319

     

    # 把一致性的备份还原到原来数据目录

    innobackupex --defaults-file=/etc/my.cnf --move-back /data/backup/data/dbfull_3306_20180907_0319

    # 修改权限

    chown -R mysql:mysql /data/mysql/mysql_3306/data

     

    2.6. 查看恢复情况

    # 启动数据库

    service mysqld start

    # 查看恢复状况

    select * from t;
    
    +----+------+
    | id | name |
    +----+------+
    | 1  | a    |
    | 2  | b    |
    +----+------+

    有 2 条数据没有恢复过来

    2.7. 应用 binlog

    # 查看开始应用 binlog 的位置

    cat xtrabackup_binlog_pos_innodb
    
    bin.000001 944

    # 解析binlog

    mysqlbinlog -vv --start-position=944 /data/mysql/mysql_3306/logs/bin.00000 > recover.sql

     # 清空GTID,最好先备份 binlog

    reset master

     # 应用 binlog

    mysql < recover.sql

     # 查看恢复情况

    select * from t;
    
    +----+------+
    | id | name |
    +----+------+
    | 1  | a    |
    | 2  | b    |
    | 3  | c    |
    | 4  | d    |
    +----+------+

    看来已经是把数据恢复回来了

     

    参考书籍:《涂抹MySQL》

  • 相关阅读:
    js 剪切板应用clipboardData
    正则表达式的与或非
    自定义类型转换器
    struts2类库下载
    通过ajax提交form表单
    面试官:为什么Mysql中Innodb的索引结构采取B+树?
    代码生成器:IDEA 强大的 Live Templates
    深入理解JVM,7种垃圾收集器,看完我跪了
    你能说出多线程中sleep、yield、join的用法及sleep与wait区别?
    Java8中一个极其强悍的新特性,很多人没用过(非常实用)
  • 原文地址:https://www.cnblogs.com/ziroro/p/9859114.html
Copyright © 2020-2023  润新知