zoukankan      html  css  js  c++  java
  • MySQL模拟生产中备份及利用binlog实时恢复

    1.创建表test1删除主键插入employees表中的10000行数据

    mysql> create table test1 like employees;

    mysql> alter table test1 drop primary key;

    mysql> insert into test1 select * from employees limit 10000;

    2.用mysqldump命令备份数据库(需要加两个参数)

    --master-data=2

    --single-transaction 保持数据库一致性

    master_data 选项开启时默认会打开lock-all-tables,因此同时实现了两个功能,一个是加锁,一个是取得log信息。

    master_data和 single_transaction 同时使用时,先加全局读锁,然后设置事务一致性和使用一致性快照开始事务,然后马上就取消锁,然后执行导出。

    [mysql@bogon ~]$ mysqldump -uroot -poracle -S/home/mysql/mysqldb/insdb_master/mysql.sock --master-data=2 --single-transaction employees > 1.dump

    3.模拟业务

    继续对test1插入10000行数据

    删除test1中的100行(删除操作为误操作)

    创建一个表test2

    mysql> insert into test1 select * from employees limit 10000;

    mysql> select count(*) from test1;

    mysql> delete from test1 limit 100;

    mysql> create table test2 like employees;

    4.发现问题需要回滚

    1. 创建一个新的实例表示备用库
    2. 使用mysqldump恢复(此时恢复得到10000行数据)
    3. 查找对应binlog点,应用binlog恢复(此时恢复20000)

    test1表数据恢复并跳过delete语句.并将数据库导入到test2表

    mysql> create databases employees;

    mysql> source /home/mysql/1.dump;

    dump文件中找到开始位置,在binlog中找到执行delete之前的位置

    开始位置

    -- CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000005', MASTER_LOG_POS=276137;

    终止位置

    # at 551869

    #180807 9:49:16 server id 5530601 end_log_pos 551920 CRC32 0x08fc0b24 Rows_query

    # delete from test1 limit 100

    mysqlbinlog --start-position=276137 --stop-position=551869 --skip-gtids /home/mysql/mysqldb/insdb_master/binlog/master-bin.000005|mysql -uroot -p -S/home/mysql/mysqldb/insdb_slavws/mysql.sock employees

    恢复成功

  • 相关阅读:
    古代规模最大的战争:长平之战(做事不能太小气,不同的将领有不同的视角,要智胜,活着很重要)
    聚集索引更新后会不会马上重新排序
    GitHub Pages 搭建流程-基于jekyll-bootstrap
    OpenStack调研
    领域模型设计
    Load ContextCLR 探测
    Sql Server Job 简单使用
    Power Designer导出实体类和NHibernate xml文件
    解决跨域
    性能计数器
  • 原文地址:https://www.cnblogs.com/Wardenking/p/9588609.html
Copyright © 2011-2022 走看看