mysql恢复drop的表_mysql恢复drop表
drop误操作删除表后,恢复的大概流程是
1、从备份中将表恢复到备份时间点
2、找到drop操作点
3、从binlog中找到备份点到drop点中间所有事件,并筛选出该表的事件
4、执行找到该表的事件
一、实验数据:
mysql> select * from sale;
+--------+---------+--------+
| month | user_id | amount |
+--------+---------+--------+
| 201601 | 1 | 500 |
| 201601 | 2 | 300 |
| 201601 | 3 | 500 |
| 201602 | 1 | 1000 |
| 201602 | 2 | 800 |
| 201603 | 2 | 1000 |
| 201603 | 3 | 500 |
| 201604 | 1 | 1000 |
+--------+---------+--------+
8 rows in set (0.00 sec)
二:备份
[root@wd-gtt-system-db data]# mysqldump -S /data/DB/mysql/mysql.sock -h172.30.249.143 -P3306 -uroot -p --single-transaction -B test --tables sale --master-data=2 >/data/backup/mysql_dump.sql
这里一定要加--master-data参数,因为要记录备份时binlog位置
[root@wd-gtt-system-db data]# cat /data/backup/mysql_dump.sql
-- MySQL dump 10.13 Distrib 5.6.27-76.0, for Linux (x86_64)
--
-- Host: 172.30.249.143 Database: test
-- ------------------------------------------------------
-- Server version 5.6.27-76.0-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TOMASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=309610;
.......
标红处就是备份点,在后面从binlog中找到备份点到drop点中间所有事件用得上
三:增加测试数据并drop表
insert into sale values(201605,'5',10000)
update sale set amount=0 where user_id=1
mysql> select * from sale;
+--------+---------+--------+
| month | user_id | amount |
+--------+---------+--------+
| 201601 | 1 | 0 |
| 201601 | 2 | 300 |
| 201601 | 3 | 500 |
| 201602 | 1 | 0 |
| 201602 | 2 | 800 |
| 201603 | 2 | 1000 |
| 201603 | 3 | 500 |
| 201604 | 1 | 0 |
| 201605 | 5 | 10000 |
+--------+---------+--------+
9 rows in set (0.00 sec)
mysql> drop table sale;
四:从备份中恢复数据到备份点
因为备份的是全库,要从备份中找到sale表相关的建表语句和数据
[root@wd-gtt-system-db ~]# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `sale`/!d;q' /data/backup/mysql_dump.sql
DROP TABLE IF EXISTS `sale`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sale` (
`month` int(10) DEFAULT NULL,
`user_id` varchar(64) DEFAULT NULL,
`amount` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
[root@wd-gtt-system-db ~]# grep 'INSERT INTO `sale`' /data/backup/mysql_dump.sql>data.sql
[root@wd-gtt-system-db ~]# cat data.sql
INSERT INTO `sale` VALUES (201601,'1',500),(201601,'2',300),(201601,'3',500),(201602,'1',1000),(201602,'2',800),(201603,'2',1000),(201603,'3',500),(201604,'1',1000);
执行上面的语句,查看数据,已经恢复备份点的状态
mysql> select * from sale;
+--------+---------+--------+
| month | user_id | amount |
+--------+---------+--------+
| 201601 | 1 | 500 |
| 201601 | 2 | 300 |
| 201601 | 3 | 500 |
| 201602 | 1 | 1000 |
| 201602 | 2 | 800 |
| 201603 | 2 | 1000 |
| 201603 | 3 | 500 |
| 201604 | 1 | 1000 |
+--------+---------+--------+
8 rows in set (0.00 sec)
五、查询dorp操作的position
因为drop操作是在备份后发生的,加个--start-position=309610
[root@wd-gtt-system-db mysql]# mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 /data/DB/mysql/mysql-bin.000002 |grep DROP -A10 -B10
### @1=201604 /* INT meta=0 nullable=1 is_null=0 */
### @2='1' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */
### @3=0 /* INT meta=0 nullable=1 is_null=0 */
# at 328220
#161220 15:30:49 server id 2 end_log_pos 328251CRC32 0xb42e62b5 Xid = 8713
COMMIT/*!*/;
# at 328251
#161220 15:31:12 server id 2 end_log_pos328368CRC32 0xf8c5dde3 Query thread_id=127 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1482219072/*!*/;
DROP TABLE `sale`/* generated by server */
......
标红的地方表示position=328368执行的drop操作,我们要恢复到这个之前,也就是328251这个事件
六:从binlog中找到备份点到drop点中间所有事件
--start-position=备份点
--stop-position=drop操作前的事件点
[root@wd-gtt-system-db mysql]# mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 --stop-position=328251 mysql-bin.000002 > recover.sql
检索出sale表相关事件
[root@trcloud opt]# more recover.sql |grep --ignore-case -E 'insert|update|delete' -A2 -B2|grep sale
insert into sale values(201605,'5',10000)
update sale set amount=0 where user_id=1
注:binlog是MIXED或者Statement模式才可通过上述方法找到事件的DML语句
七:执行上面找出来的语句
查看数据,全部恢复
mysql> select * from sale;
+--------+---------+--------+
| month | user_id | amount |
+--------+---------+--------+
| 201601 | 1 | 0 |
| 201601 | 2 | 300 |
| 201601 | 3 | 500 |
| 201602 | 1 | 0 |
| 201602 | 2 | 800 |
| 201603 | 2 | 1000 |
| 201603 | 3 | 500 |
| 201604 | 1 | 0 |
| 201605 | 5 | 10000 |
+--------+---------+--------+
9 rows in set (0.00 sec)
mysql恢复drop的表_mysql恢复drop表相关推荐
- mysql truncate 大表_MySQL删除大表时潜在的问题(drop table,truncate table)
case1,删除大表时,因为清理自适应hash索引占用的内容导致的MySQL服务挂起 case2,大表的随意Drop或者truncate导致MySQL服务的挂起 按照本文中的结论就是 MySQL5.6 ...
- mysql数据库误删且未持久化_MySQL恢复误删数据解决方案
工作中难免会误删数据,下面说一下怎样从导出的备份数据和binlog日志中恢复数据.关于备份数据和binlog可以参考下面的文章: 一.恢复数据思路 总体思路是从备份文件中恢复已备份的数据,还有一些未备 ...
- mysql存储引擎静态表_MySQL存储引擎(表类型)的选择
一.MySQL存储引擎概述 MySQL与多数数据库不同的是包含存储引擎这一特性,用户可以根据应用的需要选择合适的存储引擎来使存储和索引数据,以及是否使用事务等.MySQL5.0支持的存储引擎包括MyI ...
- mysql 创建删除表_mysql创建删除表的的详细解析
本文主要介绍MySQL.html "target =" _ blank "> MySQL对创建删除表的详细分析.我希望作者收集的相关知识和数据对你有所帮助.创建 表 ...
- mysql数据库操作宠物表_mysql数据库之表的操作
语法:1. 修改表名 ALTER TABLE 表名 RENAME 新表名;2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件-], ADD 字段名 数据类型 [完 ...
- mysql中merge的用法_mysql中merge表存儲引擎用法介紹
mysql中merge表存儲引擎用法介紹: mysql的merge引擎類型允許你把許多結構相同的表合並為一個表.然后,你可以執行查詢,從多個表返回的結果就像從一個表返回的結果一樣.每一個合並的表必須有 ...
- mysql pdo 插入没效果_MySQL分库分表后用PHP如何来完美操作
当单表达到几千万时,查询一次要很久,如果有联合查询,有可能会死在那 分库分表主要就是解决这个问题,减小数据库的负担,缩短查询时间分库 1)按功能分 用户类库.商品类库.订单类库.日志类.统计类库... ...
- mysql数据库操作宠物表_mysql数据库及表的基本操作
1. 数据库操作 1.1 创建数据库 # 创建数据库 mysql> create database db_test; # 查看创建好的数据库 mysql> show create data ...
- mysql创建销售表_MySQL创建数据表(CREATE TABLE语句)
在创建数据库之后,接下来就要在数据库中创建数据表.所谓创建数据表,指的是在已经创建的数据库中建立新表. 创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性.引用完整性和域 ...
- mysql怎么建表_mysql如何创建表
在mysql中,可以使用"CREATE TABLE"语句创建表:其语法格式为"CREATE TABLE ([表定义选项])[表选项][分区选项];",其中&qu ...
最新文章
- 20 个 jQuery 超酷视觉效果构建教程推荐
- 使用Javascript来实现的超炫组织结构图(Organization Chart)
- Cloud for Customer UI checkbox控件在PC和mobile端的不同显示
- linux启动mqtt_linux下安装MQTT服务器 - EMQTT
- LeetCode 360. 有序转化数组(抛物线对称轴)
- python 3.9.0a0_Python 3.9.0 稳定版发布
- Qt 给控件QLineEdit添加clicked事件方法
- 放苹果(信息学奥赛一本通-T1192)
- C语言封顶,我们的大屋顶|阳光方舟2.0--C-HOUSE正式封顶
- 开热点给电脑消耗大吗_你试过爬楼梯减肥吗?热量消耗大,选对姿势很重要!...
- delphi组件读写机制
- c语言荷兰国旗问题算法,荷兰国旗问题
- JS加入收藏夹操作代码
- 每台计算机ip地址,每台电脑均要设置IP地址,究竟什么是IP地址,到底有什么用呢?...
- Windows XP 系统优化全攻略(转)
- 数据分析EXCEL常用统计函数
- springboot基于webrtc和janus的视频会议流程图
- php 制作的效果图,PS制作逼真的下雨效果图
- 你刷我,我刷你,霸榜CLUE甜蜜蜜
- Mixlab设计黑客Shadow,做客光点TALK
热门文章
- C++ Deque的使用
- 像老熊一样学习oracle
- 租衣APP开发前景分析
- 产品经理数据分析入门指南
- npm install 报错sill pacote range manifest for hmac-drbg@^1.0.0 fetched
- 环境工程部门怎么实施自动化软件学习时间更多
- php调用sqlmapapi.py,SQL注入 SqlmapApi快速上手
- manjaro deepin 闪屏_微信聊天“闪屏”特效,整蛊效果100分!
- thinkpad X1 2016 NMV固态硬盘 win7+win10双系统 GPT+UEFI启动 系统安装记录
- 第七十二章 Caché 函数大全 $WISWIDE 函数