模拟数据恢复的案例

有些时候脑瓜就会短路,难免会出错

场景:在生产环境中,我们搭建了mysql主从,备份操作都是在从备份数据库上

前提:有最近一天或者最近的全备

或者最近一天相关数据库的备份

最重要的是,二进制日志必须完整

服务器信息   角色 端口
192.168.1.21   mysql主     30136  
192.168.1.21       mysql从 30236

接下来,我们模拟下

案例一、update未加where条件,误操作修改数据

全备命令: mysqldump -uroot -p123456  --single-transaction --set-gtid-purged=OFF --master-data=2 -A > all_database.sql

mysqldump -uroot -p123456  --single-transaction --set-gtid-purged=OFF --master-data=2  xcrm  > xcrm.sql

模拟灾难现场

我这个是在k8s里面搭建了一个主从

kubectl get all -o wide

kubectl exec -it mysql-master-659958ff4f-l4sgt bash                #mysql主

mysql -uroot -p123456

mysql> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| xcrm |
+--------------------+
5 rows in set (0.00 sec)

mysql> use xcrm

mysql> create table edai_test like ding_cun;

mysql> insert into edai_test select * from  ding_cun;

比如凌晨全备是做到这里的

命令:mysqldump -uroot -p123456  --single-transaction --set-gtid-purged=OFF --master-data=2 -A > all_database.sql

早上九点的时候,又有新的数据进来

mysql> insert into edai_test(nper,money) select nper,money from ding_cun;

110 rows in set (0.00 sec)

悲剧来了,上线中的sql,没有检查,where条件没加,直接执行

mysql> update edai_test set money=0;
Query OK, 110 rows affected (0.07 sec)
Rows matched: 110 Changed: 110 Warnings: 0

糟糕,一不小心金额被我修改为0了,偶my嘎,

赶紧恢复,找出binlog点,根据之前的全备+binlog恢复

恢复步骤:

1.找出时间段

root@mysql-master-659958ff4f-l4sgt:~/backu1.p# cat all_database.sql |grep -i 'CHANGE MASTER TO MASTER_LOG_FILE'|head -n1

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=;

mysql -uroot -p123456 -e "show binlog events in 'mysql-bin.000001'"|tail -n1000

找到了对应pos点:

2.mysql导入昨天晚上的备份数据,并且查看pos节点

mysql -uroot -p123456 < all_databases.sql

3.拷贝二进制日志文件到其他地方和二进制恢复

cp /var/lib/mysql/mysql-bin.000001 .

root@mysql-master-659958ff4f-l4sgt:~/backup#  mysqlbinlog  --start-position=154 --stop-position=4326 -d xcrm mysql-bin.000001|mysql -uroot -p123456 xcrm

好了,数据恢复

二、删库

其实删除数据库都是一样的道理

比如我们的备份是还是昨天晚上的,但是今天下午清理数据,删除无效的数据库,误删了

恢复步骤和原理都是差不多的,我就不演示了,简单讲解下

比如下午有新加了一些数据:

mysql> create table customers(
id int not null auto_increment,
name char(20) not null,
age int not null,
primary key(id)
)engine=InnoDB;
Query OK, 0 rows affected (0.35 sec) mysql> insert into customers values(1,"wangbo","24");
Query OK, 1 row affected (0.07 sec) mysql> insert into customers values(2,"guohui","22");
Query OK, 1 row affected (0.12 sec) mysql> insert into customers values(3,"zhangheng","27");
Query OK, 1 row affected (0.06 sec) mysql> select * from customers;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
+----+-----------+-----+
3 rows in set (0.00 sec) 然后我一不小心把数据库删除了
mysql> drop database xcrm;
Query OK, 5 rows affected (0.40 sec)

删库恢复步骤

到这里,如果是在生产环境,必须立刻做处理

1.立刻设置全局只读

进入数据库:set global read_only=1;   #普通权限的用户只读,不能写数据

mysql> show variables like '%read_only%';

此时普通用户不能进行写操作啦,比如下面
mysql -udemo -pdemo -P30136 -h192.168.1.21 xcrm mysql> select * from customers ;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
+----+-----------+-----+
3 rows in set (0.00 sec)
mysql> delete from customers where id=3;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

2.找到最近备份文件和二进制日志点

root@mysql-master-659958ff4f-l4sgt:~/backup# mysql -uroot -p123456 -e "show binlog events in 'mysql-bin.000001'"|grep -i 'DROP DATABASE'

mysql: [Warning] Using a password on the command line interface can be insecure.
mysql-bin.000001 15035 Query 22 15127 drop database xcrm

找到最近备份文件的最后pos位置

root@mysql-master-659958ff4f-l4sgt:~/backup# cat all_database.sql |grep -i 'CHANGE MASTER TO MASTER_LOG_FILE'|head -n1

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=13871;

3.进行恢复

先将今天凌晨备份的导进去

mysql -uroot -p123456 < all_database.sql

   13871   15035  

查看数据中间还相差很多数据,没关系,再根据pos期间来恢复

mysqlbinlog  --start-position=13871   --stop-position=15035  -d xcrm mysql-bin.000001|mysql -uroot -p123456 xcrm

进入数据库看看,数据是否正常
mysql -uroot -p123456
mysql> use xcrm
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables;
+------------------+
| Tables_in_xcrm |
+------------------+
| customers |
| ding_cun |
| edai_app_version |
| edai_test |
+------------------+
4 rows in set (0.00 sec) mysql> select * from customers;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
+----+-----------+-----+
3 rows in set (0.00 sec) 好了,没问题,drop数据库也可以恢复啦

现在把全局锁解开:

mysql> set global read_only=0;
Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%read_only%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | OFF |
| read_only | OFF |
| super_read_only | OFF |
| tx_read_only | OFF |
+------------------+-------+
4 rows in set (0.00 sec) 大家有没有什么疑问?

再三强调:

在生产环境误操作之后,应该立刻判断这个表或者库的重要性
1.如果是不常用的数据库或者表,几乎没有数据更新,可以不用锁库,只读
2.如果是很常用的数据库或者表,必须处理,设置为只读,如果更为严重,需要停止mysql服务器。目的就是防止有新的数据写进来,数据混乱

   

另外呢,假如在生产环境误操作了,比如,insert,delete,update等表的操作,利用mysql全备+binlog来恢复,时间成本很大,这种方式不是很好。

我们可以用python开发的一个工具:binlog2sql    (mysql闪回工具)

Mysql闪回工具之binlog2sql的原理及其使用

mysql利用binlog恢复数据详细例子的更多相关文章

  1. mysql利用binlog恢复数据

    需求:需要给开发提供一个2018年9月30号的数据,按照我们公司正常备份策略来说,直接找到对应时间的备份数据,解压导入即可,恰好这个时间节点的数据没有,只备份到2018年9月25号的,糟糕了吧 咋办呢 ...

  2. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  3. 利用mysql的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  4. Mysql使用binlog恢复数据解决误操作问题的两种方法

    为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识
 安装mysql5.6数据库Mysql binlog初步理解 2. 配置mysql 开启binlog.修 ...

  5. 【转】【MySQL】mysql 通过bin-log恢复数据方法详解

    mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这 ...

  6. MySQL利用binlog恢复误操作数据(python脚本)

    在人工手动进行一些数据库写操作的时候(比方说数据订正),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线上或者测试环境误操作导致数据被删除或者更新 ...

  7. mysql通过binlog恢复数据

    如果mysql不小心操作失误导致数据错误或者丢失这时候binlog起到了很大的作用 恢复有几种方式 1.按时间恢复--start-datetime   如果确定了时间点,那么按时间恢复是一个再好不过的 ...

  8. MySQL 5.7 - 通过 BINLOG 恢复数据

    日常开发,运维中,经常会出现误删数据的情况.误删数据的类型大致可分为以下几类: 使用 delete 误删行 使用 drop table 或 truncate table 误删表 使用 drop dat ...

  9. mysql 利用binlog增量备份,还原实例

    mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 标签:binlog, mysql, mysqldump, 增量备份 一,什么是增量备份 增量 ...

随机推荐

  1. Identity Server 4 原理和实战(完结)_Reference Token,撤销Tokens,Google和Github登录

    服务端设置为ReferenceToken accessToken的内容比原来的少了很多 断点继续回来就会发生异常 服务端设置 客户端设置,使用一个封装好的库 撤销Token 我们在点击退出按钮的时候撤 ...

  2. 如何在.net项目中使用全局程序集GAC

    在解决已有.net网站问题过程中(之前的同事写的),发现出现dll不存在的情况,build报错 在bin目录下找不到该dll,后来发现是全局程序集,存储在C:\Windows\assembly目录下 ...

  3. 【阿里云IoT+YF3300】1.时代大背景下的阿里云IoT物联网的现状和未来

    “未来十到二十年,大家基本已经形成了一个共识,那便是新格局的奠定将由 AI 和物联网技术来支撑.放眼国内,在这些互联网巨头之中,未来真正成为竞争对手厮杀的,阿里和华为是首当其冲,在这两个领域双方分别暗 ...

  4. [Xcode 实际操作]九、实用进阶-(1)隐藏顶部的状态栏

    目录:[Swift]Xcode实际操作 本文将演示隐藏顶部的状态栏. 在项目导航区,打开项目配置文件[Info.plist] 每个程序都拥有自己的项目配置文件,用来存储各种配置信息. 鼠标右键[Add ...

  5. IT兄弟连 JavaWeb教程 JSTL常用标签

    1.条件标签 条件标签能够实现Java语言中的if语句以及if-else语句的功能,它包括以下几种: <c:if>:用于实现Java语言中的if语句的功能. <c:choose> ...

  6. Java 虚拟机(Java Virtual Machine)

    Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode).字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 J ...

  7. Java 分析工具汇总

    http://blog.csdn.net/fenglibing/article/details/6411999 jps  jps -mlvV jmap jmap -heap <pid>   ...

  8. JPA-day04 核心API 一级缓存 主键生成策略 实体对象的4种状态 多对一关系 延迟加载

  9. 解决 mac zsh 所有命令失效

    上面的没啥用, 直接看分割线吧, 上面的是第一次遇到这个问题, 没有解决.. zsh: command not found: 参考: https://www.jiloc.com/43492.html ...

  10. CVE-2017-3248——WebLogic反序列化漏洞利用工具

    著名的web中间件WebLogic被曝出之前的反序列化安全漏洞补丁存在绕过安全风险,用户更新补丁后,仍然存在被绕过成功执行远程命令攻击的情况,安全风险高,Oracle官方及时发布了最新补丁,修复了该漏 ...