MySQL 数据库增量数据恢复案例

一、场景概述

  1. MySQL数据库每日零点自动全备
  2. 某天上午10点,小明莫名其妙地drop了一个数据库
  3. 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢复

二、主要思想

  1. 利用全备的sql文件中记录的CHANGE MASTER语句,binlog文件及其位置点信息,找出binlog文件增量的部分
  2. 用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句
  3. 通过全备文件和增量binlog文件的导出sql文件,就可以恢复到完整的数据

三、过程示意图

四、操作过程

1. 模拟数据

 
 
 
 
 

MySQL

 
1
2
3
4
5
6
7
8
9
10
11
CREATETABLE`student`(
  `id`int(11)NOT NULLAUTO_INCREMENT,
  `name`char(20)NOT NULL,
  `age`tinyint(2)NOT NULLDEFAULT'0',
  PRIMARY KEY(`id`),
  KEY`index_name`(`name`)
)ENGINE=InnoDBAUTO_INCREMENT=8DEFAULTCHARSET=utf8
 
mysql>insertstudentvalues(1,'zhangsan',20);
mysql>insertstudentvalues(2,'lisi',21);
mysql>insertstudentvalues(3,'wangwu',22);

2. 全备命令

 
 
 
 
 
 

MySQL

 
1
2
3
4
5
6
7
8
# mysqldump -uroot -p -B -F -R -x --master-data=2 test|gzip >/server/backup/test_$(date +%F).sql.gz
 
参数说明:
-B指定数据库
-F刷新日志
-R备份存储过程等
-x锁表
--master-data在备份语句里添加CHANGEMASTER语句以及binlog文件及位置点信息

3. 继续插入数据

 
 
 
 
 

MySQL

 
1
2
3
4
5
6
mysql>insertstudentvalues(6,'xiaoming',20);
 
mysql>insertstudentvalues(6,'xiaohong',20);
 
此时误操作,删除了test数据库
mysql>dropdatabasetest;

此时,全备之后到误操作时刻之间,用户写入的数据在binlog中,需要恢复出来

4.查看全备之后新增的binlog文件

 
 
 
 
 
 

MySQL

 
1
2
3
4
5
6
# cd /server/backup/
# ls
test_2016-08-02.sql.gz
# gzip -d test_2016-08-02.sql.gz
# grep CHANGE test_2016-08-02.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107;

这是全备时刻的binlog文件位置,即mysql-bin.000003的107行,因此在该文件之前的binlog文件中的数据都已经包含在这个全备的sql文件中了

5. 移动binlog文件,并读取sql,剔除其中的drop语句

 
 
 
 
 

MySQL

 
1
2
3
# cp /data/3306/mysql-bin.000003 /server/backup/
# mysqlbinlog -d test mysql-bin.000003 >003bin.sql
# 用vim编辑文件,剔除drop语句

在恢复全备数据之前必须将该binlog文件移出,否则恢复过程中,会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱

6. 恢复数据

 
 
 
 
 
 

MySQL

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# mysql -uroot -p <test_2016-08-02.sql
# mysql -uroot -p -e "select * from test.student;"
+----+----------+-----+
|id|name     |age|
+----+----------+-----+
|  1|zhangsan|  20|
|  2|lisi     |  21|
|  3|wangwu   |  22|
+----+----------+-----+
//此时恢复了全备时刻的数据
//然后使用003bin.sql文件恢复全备时刻到删除数据库之间,新增的数据
# mysql -uroot -p test<003bin.sql <span style="color: #3366ff;" data-mce-style="color: #3366ff;"><-需要指定恢复的数据库
</span># mysql -uroot -p -e "select * from test.student;"
+----+----------+-----+
|id|name     |age|
+----+----------+-----+
|  1|zhangsan|  20|
|  2|lisi     |  20|
|  3|wangwu   |  20|
|  4|xiaoming|  20|
|  5|xiaohong|  20|
+----+----------+-----+
完成

五、小结

  • 适合人为SQL语句造成的误操作或者没有主从复制等的热备情况宕机时的修复
  • 恢复条件要全备和增量的所有数据
  • 恢复时建议对外停止更新,即禁止更新数据库
  • 先恢复全量,然后把全备时刻点以后的增量日志,按顺序恢复成SQL文件,然后把文件中有问题的SQL语句删除(也可通过时间和位置点),再恢复到数据库

MySQL 数据库增量数据恢复案例的更多相关文章

  1. MySQL 之数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  2. MYSQL数据库增量备份

    MySQL数据库增量备份,在这之前修改我们的数据库配置文件/etc/my.cnf开启bin-log日志功能即可.接下来是我参考了下网上的一些方法,自己写的,主要还是要能学到他的一些思路和方法. #fu ...

  3. 170301、使用Spring AOP实现MySQL数据库读写分离案例分析

    使用Spring AOP实现MySQL数据库读写分离案例分析 原创 2016-12-29 徐刘根 Java后端技术 一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案 ...

  4. canal 基于Mysql数据库增量日志解析

    canal 基于Mysql数据库增量日志解析  1.前言  最近太多事情 工作的事情,以及终身大事等等 耽误更新,由于最近做项目需要同步监听 未来电视 mysql的变更了解到公司会用canal做增量监 ...

  5. MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例

      上周,以前公司的同事朋友找我帮忙,看看能否帮忙恢复一个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不清楚),也不清楚具体的数据库引擎; 没有数据库备份,只剩下数据库下面 ...

  6. Python 生产环境MySQL数据库增量备份脚本

    MySQL数据库常用的办法是通过MySQLdump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题.前面写了一遍文章介绍xtrabackup的热备工具,见 http://w ...

  7. 161220、使用Spring AOP实现MySQL数据库读写分离案例分析

    一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...

  8. 使用Spring AOP实现MySQL数据库读写分离案例分析

    一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...

  9. mysql数据库增量恢复

    mysqldump -uroot -p -B discuzx -F -x --master-data=2 --events|gzip >/root/discuzx.sql.gz 写入数据 删除数 ...

随机推荐

  1. 一个实际的sonar代码检查的配置文件

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. 作为平台的Windows PowerShell(一)

    除了作为一种脚本语言外,Windows PowerShell被多种应用程序使用.这是因为Windows PowerShell引擎可以被托管在一个应用程序内部.这篇博文和下一篇博文将会处理在C#应用程序 ...

  3. BZOJ 1927: [Sdoi2010]星际竞速 费用流

    1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  4. ios开发——实用技术OC篇&地图与定位

    地图与定位 11.1 iOS定位服务 11.2 iOS地图 11.3 Web地图 1 iOS定位服务 iOS中有三个定位服务组件: Wifi定位,通过查询一个Wifi路由器的地理位置的信息.比较省电, ...

  5. android Popupwindow 的一个demo源码

    一直想用一下PopupWindow,就是苦于没有demo,自己去研究有太懒,刚好最近研究推送,下载了一个腾讯信鸽的demo,里面用到了一个PopupWindow,效果还不错,弄下来记录一下: 1.核心 ...

  6. sql根据表名获取字段及对应说明

    SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Description = ex.value, ColumnTyp ...

  7. VM11安装Mac OS X 10.10

    工具/原料 1. VMware Workstation 11.12 2. unlocker 206(for OS X 插件补丁) 3. Mac OS X 10.10镜像 方法/步骤   有图有真相,哈 ...

  8. javascript——touch事件

    前言 诸如智能手机和平板电脑一类的移动设备通常会有一(capacitive touch-sensitivescreen),以捕捉用户的手指所做的交互.随着移动网络的发展,其能够支持越来越复杂的应用,w ...

  9. 数字转化成字符串C语言

    #include <stdio.h> void Myitoa(int,char *); int getnumberLength(int); int main(){ ]; ; Myitoa( ...

  10. JavaScript学习总结一(String对象的用法)

    javascript String对象的常用API 1:indexOf indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置.如果没有找到匹配的字符串则返回 -1.注意: inde ...