记录一次MySQL数据恢复过程,以防止下次再发生类似的操作。
记录一次MySQL数据恢复过程,以防止下次再发生类似的操作。
MySQL版本:Ver 14.14 Distrib 5.6.20
问题描述:
上午不小心更新表中某一行记录的时候不小心,全部更新了。
执行的sql如下:
#update mondo_all set ip ='192.168.36.107'; where seq =3386;
可以看出来中间多了一个分号,导致整个表的记录都被修改了。
在修复数据之前,先要查看my.cnf中是否开启了 binlog功能。
具体查看方式是看my.cnf中是否配置了log_bin。如果没有配置,那就彻底没辙了。
工具:
binlog2sql
安装方式:
直接在线安装(我是安装在mysql目录下的):
shell> git clone https://github.com/danfengcao/binlog2sql.git
上面的命令执行完之后会生成一个binlog2sql的文件夹。
进入该目录,可以看到一个requirments.txt文件,然后执行如下命令:
shell>pip install -r requirements.txt
执行完上面的两条命令后,即可安装成功。
数据恢复:
在恢复数据之前,要先找到误操作的日志记录,可以根据操作时间在mysql的datadir 目录中找到对应的mysql-bin.xxxxxx形式的日志文件。
(我这里的datadir=/var/lib/mysql)
根据实际找到对应的操作记录日志:
然后在binlog2sql的安装目录执行如下操作:
shell>python binlog2sql/binlog2sql.py -h132.121.130.18 -P3306 -uroot -p'hdp123' -dtest -tmondo_all --start-file='mysql-bin.000348' |cat -n |more
上面的命令可以一页一页的翻看对应的日志记录,找到自己想要的日志记录。
导出回滚日志:
命令:$ python binlog2sql/binlog2sql.py -h132.121.130.18 -P3306 -uroot -p'hdp123' -dtest -tmondo_all --start-file='mysql-bin.000348' -B > rollback.sql
rollback.sql文件里面的sql应该是你想恢复的脚本。
然后执行:
shell> mysql -h132.121.130.18 -P3306 -u root -p < rollback.sql
注意:5.6的MySQL版本不能直接输入密码明文进行数据导入操作。
后记:
我这边的实际处理情况是:
我导出了上午执行的update语句脚本后,自己写了个简单的java程序进行处理的。
package com;
import java.awt.print.Printable;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
public class RollBack {
Connection conn = new MySqlTools().getConnection();
public void readFile(){
String filePath = "E:\\platspace\\ExcleTools\\bin\\doc\\rollback.sql";
File file = new File(filePath);
BufferedReader reader=null;
try {
reader = new BufferedReader(new FileReader(file));
int line = 1;
String tempString = null;
while((tempString = reader.readLine()) != null){
//System.out.println("第"+ line +"行:"+tempString);
regSplit(tempString);
line ++ ;
Thread.sleep(100);
}
reader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (reader != null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void regSplit(String line){
//String s1 = "UPDATE `test`.`mondo_all` SET `has_deploy`='鏄?, `deploy_success`='Y', `sys_name`=NULL, `python_version`=NULL, `seq`=5605, `sheet_name`=NULL, `ip`='192.168.36.107', `mark`=NULL, `passwd`='mondev!@#123', `os_full`=NULL, `group_id`=NULL, `os`=NULL, `unit`=NULL WHERE `has_deploy`='鏄? AND `deploy_success`='Y' AND `sys_name` IS NULL AND `python_version` IS NULL AND `seq`=5605 AND `sheet_name` IS NULL AND `ip`='192.168.59.19' AND `mark` IS NULL AND `passwd`='mondev!@#123' AND `os_full` IS NULL AND `group_id` IS NULL AND `os` IS NULL AND `unit` IS NULL LIMIT 1; #start 120 end 1822999 time 2016-12-22 10:10:39";
String whereStr = line.split("WHERE")[1];
String[] sArray = whereStr.split("AND");
String seq = "";
String ip="";
for (int i = 0; i < sArray.length; i++) {
String temp = sArray[i];
if(temp.contains("`seq`=")){
seq = temp.substring(7, temp.length());
}
if(temp.contains("`ip`=")){
ip = temp.substring(7, temp.trim().length());
}
}
System.out.println(seq + "------------>" + ip);
try {
String sql = "update mondo_all set ip2='"+ip.trim()+"' where seq=" + Integer.parseInt(seq.trim()) ;
conn.prepareStatement(sql).execute();
System.out.print(" successfull.");
} catch (NumberFormatException e) {
System.out.println("更新失败.........");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("更新失败.........");
e.printStackTrace();
}
}
public static void main(String[] args) {
new RollBack().readFile();
}
}
参考:
binlog2sql工具安装:http://www.qingpingshan.com/shujuku/mysql/175056.html
数据恢复参考:https://my.oschina.net/u/3119184/blog/802700
2016-12-22
dianxinguangchang.zhongsanerlu.yuexiuqu.guangzhoushi
听雨轩
分享到:
相关推荐
方法1、通过表备份的方式 方法2、idb文件丢失(有备份的表的情况) 方法3、使用MySQL的binlog的方式
MySQL数据恢复-轻轻松松恢复损坏或是遗失的数据库,使用方便,有需要的朋友快来下载吧。
通过binlog日志进行mysql数据恢复
RAID6数据恢复软件V2.1是一款RAID6数据恢复软件,完全支持整个RAID6在缺少两块磁盘后进行完整数据恢复。 该软件是一款功能强大的RAID6数据恢复软件,完全支持整个RAID6在缺少两块磁盘后进行完整数据恢复。 完美...
数据恢复工具:有一些第三方工具可以帮助你进行误删数据的恢复,比如使用类似于 "mysqlbinlog"、"mysqlflashback" 或其他 MySQL 数据恢复工具。 寻求专业帮助:如果以上方法无法解决问题,可以寻求专业的数据库恢复...
mysql下常用的数据恢复方法,基于binlog方式。适合初学者参考。最好的恢复来源还是备份,备份也没有binlog也没有,那就别想了。
文件级别数据库恢复工具软件,本软件适合于操作系统崩溃后将mysql数据目录拷贝出进行恢复,在恢复前需要使用之前备份的数据库结构新建空库,然后将还原文件的数据恢复到新库,目前只能恢复InnoDB引擎、MyISAM引擎 表...
mysql根据日志恢复数据详细步骤
1.1.7 MySQL的数据如何恢复到任意时间点?
java实现对mysql数据库的备份与还原,可跨平台,windows与Linux通用,代码内含有利用注册表信息获取mysqldump命令实例
MySQL日志和数据恢复,错误日志,二进制日志,查询日志,数据恢复。
Mysql数据备份与恢复操作文档.md
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...
本文从实际使用经验出发,介绍一款开源的MySQL数据库InnoDB数据恢复工具:innodb-tools,它通过从原始数据文件中提取表的行记录,实现从丢失的或者被毁坏的MySQL表中恢复数据。例如,当你不小心执行DROP TABLE、...
三种数据库库备份恢复模式整理、
二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。 binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT...数据恢复:通过mysqlbinlog工具来恢复数据。
04-MySQL数据恢复的必要条件及恢复案例场景图解分析 05-实战模拟企业数据丢失应用的案例场景 06-MySQL数据库增量恢复详细实战 07-更多MySQL数据库增量恢复大讨论及大总结 08-MySQL增量恢复小结及核心恢复思想 09-...
MySQL5.0常用命令与数据恢复.pdf
MySQL数据备份和恢复(导出和导入)