use HTTP::Date qw(time2iso str2time time2iso time2isoz);
use POSIX;
my $SDATE = strftime("%Y-%m-%d",localtime());
if ( $#ARGV < 4 ){
print "please input like binglog-0001 '2013-07-01 00:00:00' '2013-07-02 00:00:00' dml db_name table!\n";
exit(-1);
};
my $binlog= $ARGV[0];
my $start_dt = $ARGV[1];
my $end_dt = $ARGV[2];
my $dml =$ARGV[3];
my $database=$ARGV[4];
my $table=$ARGV[5];
unlink("$table.$SDATE.txt");
unlink("$table.$SDATE.txt.tmp.1");
unlink("$table.$SDATE.txt.tmp.2");
unlink("$table.$SDATE.txt.tmp.3");
my @binlog=`mysqlbinlog --base64-output=decode-rows -v --start-datetime='$start_dt' --stop-datetime='$end_dt' $binlog >$table.$SDATE.txt`;
use DBI;
my $db_name="$database";
my $ip='127.0.0.1';
my $user="root";
my $passwd="1234567";
$dbh = DBI->connect("dbi:mysql:database=$db_name;host=$ip;port=3306",$user,$passwd) or die "can't connect to database ". DBI-errstr;
$UNLOAD_SRC_DBCONN = DBI->connect("dbi:mysql:database=$db_name;host=$ip;port=3306",$user,$passwd) or die "can't connect to database ". DBI-errstr;
my $hostSql = qq{SELECT column_name from information_schema.columns where table_schema='$db_name' and table_name='$table'};
my $DW_DATA_DT ="";
@lstRlst1=();
@lstRlst=();
my ($COLUMN_NAME);
my $selStmt = $dbh->prepare($hostSql);
$selStmt->execute();
$selStmt->bind_col(1, \$COLUMN_NAME);;
$selStmt->execute();
while( $selStmt->fetch() ){
print "$COLUMN_NAME\n";
push (@lstRlst1 ,$COLUMN_NAME);
}
$selStmt->finish;
$dbh->disconnect;
for ($m=1;$m<=@lstRlst1 ; $m++){
$hash{"\@$m"}=$lstRlst1[$m -1 ];
};
print %hash;
print "\n";
sub undo_update {
local $/='/*!*/;';
open (A,"<","$table.$SDATE.txt");
while (<A>){
if (( $_ =~/$dml\s+$table/i ) or ($_ =~/$dml\s+`$table`/i) or ($_ =~/$dml\s+`$database`.`$table`/i) or ($_ =~/$dml\s+$database.$table/i )){
local $/="\n";
#if ($_ =~/.*?(\@[0-9]+).*/){print "\$id is $1\n";};
#print $_;
open DATAFH,">>$table.$SDATE.txt.tmp.1" || die "open csdn file failed:$!";
print DATAFH $_;
};
};
#print DATAFH "\n";
close DATAFH;
print "\n";
local $/="\n";
open (B,"<","$table.$SDATE.txt.tmp.1");
print "orignal update sql\n";
while (<B>){
next unless /^###/;
if ($_ =~/.*?(\@[0-9]+).*/)
{
my $idnum=$1;
#print "\$idnum is $idnum\n";
my $id=$hash{"$idnum"};
$_ =~ s/$idnum/$id/;
print $_;
open (C,">>","$table.$SDATE.txt.tmp.2");
print C $_;
close C
}
else {
print $_;
open (C,">>","$table.$SDATE.txt.tmp.2");
print C $_;};
close C;
};
close B;
open (C,"<","$table.$SDATE.txt.tmp.2");
print "rollback update sql\n";
while (<C>){
next unless /^###/;
#$_ =~ s/^###//;
if ($_ =~ s/WHERE/SET/i){ print "$_";}
elsif ($_ =~ s/SET/WHERE/i){ print "$_";}
else{print "$_";}
};
close C;
}; sub undo_delete {
local $/='/*!*/;';
open (A,"<","$table.$SDATE.txt");
while (<A>){
if (( $_ =~/$dml\s+from\s+$table/i ) or ($_ =~/$dml\s+from\s+`$table`/i) or ($_ =~/$dml\s+from\s+`$database`.`$table`/i) or ($_ =~/$dml\s+from\s+$database.$table/i )){
local $/="\n";
#if ($_ =~/.*?(\@[0-9]+).*/){print "\$id is $1\n";};
#print $_;
open DATAFH,">>$table.$SDATE.txt.tmp.1" || die "open csdn file failed:$!";
print DATAFH $_;
};
};
#print DATAFH "\n";
close DATAFH;
print "\n";
local $/="\n";
open (B,"<","$table.$SDATE.txt.tmp.1");
while (<B>){
if ($_ =~/.*?(\@[0-9]+).*/)
{
my $idnum=$1;
#print "\$idnum is $idnum\n";
my $id=$hash{"$idnum"};
$_ =~ s/$idnum/$id/;
print $_;
open (C,">>","$table.$SDATE.txt.tmp.2");
print C $_;
close C
}
else {
print $_;
open (C,">>","$table.$SDATE.txt.tmp.2");
print C $_;};
close C;
};
close B;
open (C,"<","$table.$SDATE.txt.tmp.2");
while (<C>)
{
next unless /^###/;
next if /^$/;
open (D,">>","$table.$SDATE.txt.tmp.3");
if ($_ =~ s/###\s+DELETE FROM/INSERT INTO/i){ print D $_;}
elsif ($_ =~ s/###\s+WHERE/values/i){ print D $_;}
elsif($_ =~ s/^###\s+//g){ print D $_;}
close D;
};
close C;
print "-----------------------------\n";
@arr=();
$sql="INSERT INTO $table VALUES";
open (E,"<","$table.$SDATE.txt.tmp.3");
while (<E>){
if ($_ =~ /.*?=(.*)/){push (@arr,$1) };
if ( @arr + 0 == @lstRlst1 + 0){
print "\@arr is @arr\n";
for (my $m=0;$m<@arr + 0 ;$m++)
{
if ($m == 0 ){
$sql="$sql ($arr[$m]".",";
}
elsif ($m == @arr - 1){
$sql="$sql $arr[$m]".");"
}
else{$sql="$sql $arr[$m]".","};
};
@arr=();
print "\$sql is $sql\n";
$sql="INSERT INTO $table VALUES";
};
};
close E;
}; if ($dml =~ /update/i){&undo_update};
if ($dml =~ /delete/i){&undo_delete};

mysql 闪回表工具的更多相关文章

  1. MySQL 闪回工具之 binlog2sql

    生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...

  2. Mysql闪回工具之binlog2sql的原理及其使用

    生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成 ...

  3. MySQL闪回工具之myflash 和 binlog2sql

    MySQL闪回工具之:binlog2sql  https://github.com/danfengcao/binlog2sql MYSQL Binglog分析利器:binlog2sql使用详解  :h ...

  4. MySQL闪回工具之binlog2sql

    一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...

  5. MySQL闪回原理与实战

    本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除 ...

  6. (4.11)mysql备份还原——mysql闪回技术(基于binlog)

    0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...

  7. mysql 闪回原理

    利用MySQL闪回技术恢复误删除误更改的数据 笔者相信很多人都遇到过忘带where条件或者where条件漏写了一个和写错了的情况,结果执行了delete/update后把整张表的数据都给改了.传统的解 ...

  8. 技术分享 | 测试git上2500星的闪回小工具

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1.实验环境 2.软件下载 3.开始测试 4.附参数说明 生产上发生误删数据或者误更新数据的事故时,传统恢复方法是利用备份 ...

  9. 【转】FlashBack总结之闪回查询与闪回表

    本文主要介绍利用UNDO表空间的闪回技术,主要包括:闪回表,闪回版本查询,闪回事务查询,闪回查询.这些闪回技术实现从回滚段中读取表中一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错 ...

随机推荐

  1. 登堂入室——java流

    ——文章出自PeterYe,不得私自转载 我所知道的 java.io里面的[流],就仿佛太平洋里面的水一样,浩浩荡荡,横无际涯... -----2016/7/16--------公寓处记录------ ...

  2. php array_walk 和 array_reduce函数

    1.array_walk:将数组中的元素(键+值)依次取出传给处理的函数,函数处理完就完了,没有返回值. $arr1=array( 'name'=>'zhangsan', 'age'=>3 ...

  3. CCNP第四天 OSPF综合实验(1)

    ospf综合实验(1) 本实验主要考察ospf中的接口上的多种工作方式 实验如图所示: 所用拓扑为CCNP标准版,如图: --------------------------------------- ...

  4. C#快速学习笔记(译)

    下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { public static ...

  5. WPF简单入门总结

    WPF简单总结 最近看了点关于WPF的东西,总结了点点入门的东西. XAML语法基础 1.  定义样式 <Window.Resources><!--窗体资源的定义--> < ...

  6. 零基础学Python 3之环境准备

    一. 配置python 3 环境 1. Python 3 下载 64位 https://www.python.org/ftp/python/3.4.2/python-3.4.2.amd64.msi 3 ...

  7. php源代码安装常见错误与解决办法分享

    错误:configure: error: libevent >= 1.4.11 could not be found 解决:yum -y install libevent libevent-de ...

  8. UIImagePickerController拍照与摄像(转)

    转载自:http://blog.sina.com.cn/s/blog_68edaff101019ppe.html (2012-11-23 14:38:40) 标签: ios iphone 拍照 摄像 ...

  9. /****************** Attributes ********************/

    /*预定义字符属性的文本.如果钥匙不在字典,然后使用默认值,如下所述. */ 以下属性是IOS6的 NSVerticalGlyphFormAttributeName NS_AVAILABLE_IOS( ...

  10. How to open MS word document from the SharePoint 2010 using Microsoft.Office.Interop.dll

    or this you must change the identity of word component inC:\windows\System32\comexp.mscto be interac ...