MySQL模拟生产中备份及利用binlog实时恢复

本文介绍了一个MySQL数据库的数据恢复过程,包括使用mysqldump备份、通过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

 

 

 

恢复成功

转载于:https://www.cnblogs.com/Wardenking/p/9588609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值