`

MySQL数据恢复

阅读更多
记录一次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

听雨轩


0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics