前提:对mysql库进行全备和增量备份(全备就是对hive库进行完全备份,增量备份就是将mysql的binlog日志进行备份)

情景说明:由于误操作,将包含有多张表的数据库给误删了

要求:恢复误删的数据库

具体模拟故障过程与恢复操作步骤如下:

(1)首先创建hive库,创建一个before1表,插入一条记录,创建一个after1表,插入3条记录
mysql> use hive;
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
+------+
3 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)

(2)对hive库做个完全备份(记录日志位置,并设置字符集)
mysqldump -uroot -pxxx -h10.191.22.247 -F -R --master-data=2 --default-character-set=utf8 --single-transaction -B hive |gzip >/tmp/mysql_$(date +%F).sql.gz
(3)在hive库中的after1表新增2条记录,并更新2条记录,刷新日志
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
|  555 |
|  666 |
+------+
5 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)
mysql> flush logs;

(4)在hive库中的after1表新增2条记录,误操作,drop数据库hive
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
|  555 |
|  666 |
|   77 |
|   88 |
+------+
7 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)

mysql> drop database hive;

(5)恢复被误删除的hive库
(5.1)先记录下当前数据库的日志号,并刷新日志,当前最新日志为29
(5.2)将没有备份的日志都备份到其他目录下
cp /mnt/sata01/mysql/mysql-bin.000028 ./
cp /mnt/sata01/mysql/mysql-bin.000029 ./

(5.3)恢复hive的完全备份
gzip -d mysql_2018-12-18.sql.gz 
mysql -uroot -pxxx <mysql_2018-12-18.sql 

查看完全备份时的日志号和日志位置:
more mysql_2018-12-18.sql     
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000028', MASTER_LOG_POS=154;   //可以看到完全备份时的日志是28,位置是154.那么可以从28日志的154位置开始往后进行恢复
根据查看到的日志位置,对154后面剩余的日志进行应用:(注意--start-position=154参数的使用)
mysqlbinlog --start-position=154 --database hive mysql-bin.000028|mysql -uroot -pRootlyl123@ -v hive
将删除hive库之前的日志29,30都进行恢复:(还有一个问题,现在不确定drop库的操作在不在29和30的日志里,所以需要在库里或库外查看一下日志里面的具体操作)
对于DCL操作,如建库删库都能在库里查看日志的事件,如果是DDL操作,在库里看日志事件是看不出来的

在库里查看:(发现该删库操作在End_log_pos 733之前)
mysql> show binlog events in 'mysql-bin.000029';
| mysql-bin.000029 |  597 | Write_rows     |       161 |         637 | table_id: 142243 flags: STMT_END_F                                                                      |
| mysql-bin.000029 |  637 | Xid            |       161 |         668 | COMMIT /* xid=13757124 */                                                                               |
| mysql-bin.000029 |  668 | Anonymous_Gtid |       161 |         733 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                    |
| mysql-bin.000029 |  733 | Query          |       161 |         825 | drop database hive                                                                                      |
| mysql-bin.000029 |  825 | Anonymous_Gtid |       161 |         890 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'

在库外查看:如果想找DDL操作,需要到库外,对日志进行分析来查找:
mysqlbinlog -d hive --base64-output=decode-rows -v mysql-bin.000029 >29.sql
vi 29.sql   //在里面过滤查找drop关键字,发现删除位置操作在733处
【SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 733
#181218 11:51:53 server id 161  end_log_pos 825 CRC32 0xd623fa5d        Query   thread_id=83772 exec_time=0     error_code=0
SET TIMESTAMP=1545105113/*!*/;
drop database hive
/*!*/;
# at 825
#181218 11:53:28 server id 161  end_log_pos 890 CRC32 0xe5188448        Anonymous_GTID  last_committed=3        sequence_number=4       rbr_only=no

恢复所有数据到733前,即恢复hive库到删除操作之前:
mysqlbinlog --stop-position=733 --database hive mysql-bin.000029|mysql -uroot -pRootlyl123@ -v hive  //注意stop-position参数的使用

(6)查看数据库,发现数据库和里面的表数据已经都回来了
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
|  555 |
|  666 |
|   77 |
|   88 |
+------+
7 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)

mysql误删库恢复操作相关推荐

  1. 【数据库】mysql删库恢复

    删库跑路撤回手册 1.binlog恢复 1.查看mysql是否开启binlog日志 mysql> show variables like 'log_%'; 2.查看logs文件并查看二进制操作日 ...

  2. linux mysql 误删系统文件恢复_干货分享丨如何恢复Linux下误删/etc目录数据

    对于运维工作者来说,可能最让人担心的,是服务器宕机: 最让人无助的,是被DDOS: 而最让人心惊肉跳的,是rm -rf *这个命令-- 当你执行rm -rf命令时,万一哪个变量没赋值 听说过被删空服务 ...

  3. linux mysql 误删系统文件恢复_MySQL误删物理文件的恢复(Linux)

    以前拜读过一位Oracle大大的文章,结果自己在测试环境也遇到了,顺手记下来 Oracle大大的文章链接http://blog.itpub.net/17203031/viewspace-1077770 ...

  4. mysql配置——库表操作、用户操作

    mysql----库表操作 ## 列出所有的库 mysql> show databases; +--------------------+ | Database           | +--- ...

  5. 数据库访问 mysql连接库--查询

    php操作数据库的三种方法 1.mysql扩展库   (最早的);2.mysqli扩展库;3.pdo php 数据类型 1.基本数据类型;2.符合数据类型;3.特殊数据类型 null 和资源数据类型 ...

  6. mysql数据库恢复操作_MySQL 数据库误删后的数据该如何恢复操作?

    原标题:MySQL 数据库误删后的数据该如何恢复操作? 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 在日常运维工作中,对于数据库的备份是至关重要的!数据库对于网站的重要 ...

  7. mysql dump 导出表_误删库,别跑路!教你一招MySQL 数据恢复

    日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生.但是,如果每次删库都跑路的话,怕是再也不好找工作了吧!所以,删库跑路不是上上策. 1.前言 数据恢复的前提的做好 ...

  8. MySQL数据库 -- 库和表的操作

    关于数据库方面,还是需要多多练习的,否则很多指令不容易记住,所以大家也要在自己的电脑上多写写,熟悉熟悉~ 目录 库的操作 创建数据库 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库的删除 数 ...

  9. [MySQL]-删库后恢复

    [MySQL]-删库后恢复 sen格 | 2022年11月 本文旨在记录个人在数据库的删库恢复演练过程中的一些总结,如有不足,欢迎指正. 一.恢复场景 1)假设生产实例MySQL端口为:3306 2) ...

最新文章

  1. 解决eclipse ctrl+鼠标左键不能用
  2. eclipese web前端开发教学_Web前端零基础好学吗?新手该怎么学?
  3. Spring Cloud Finchley版中Consul多实例注册的问题处理
  4. 基于自编码器的表征学习:如何攻克半监督和无监督学习?
  5. 关于python的GIL
  6. CRM Fiori pipeline应用的背景色问题
  7. 算法导论2nd 10.1-7
  8. maven 命令_Maven企业实战系列(二):Maven高效率初体验
  9. 数据结构 (一) ----- 数据结构基本概念基于数组实现线性表
  10. 基于 HTML5 的 3D 工业互联网展示方案
  11. Ant—使用Ant构建简单Java项目(三)
  12. FinePrint双面打印设置
  13. 如何使用Java计算闰年?
  14. LeetCode——Maxium Depth of Binary Tree
  15. 计算机语言phal语言,phalapi
  16. 企业信息与网络通信安全 团队成员简历-叶俊 (转)
  17. 投顾风向|各方节前无心恋战 等到节后或有“红包”行情
  18. vue中 基于echart地图功能 省级地图下钻和返回、发射线、水波涟漪等功能展示
  19. 《国内十大中文博客托管网站排行榜》
  20. 分布式专题(一)什么是分布式

热门文章

  1. android 1像素变粗,一亿像素的意义:聊聊图像采样与重建
  2. 原生jq下载文件的方式
  3. 小马哥---高仿红米note 刷机 主板型号T7203主板图与开机识别图 6572芯片
  4. iOS动画——文字晃动
  5. C#在Excel与Word中写入上角标与下角标
  6. 2011最牛高考作文:时间在流逝——上还是不上大学?
  7. 淘口令是什么?淘口令怎么在电脑上打开?【已解决】
  8. 三子棋——可修改为多子棋
  9. Android 流量分析API
  10. App ID注册地址