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. qml去标题栏

    只要加入"flags: Qt.Window | Qt.FramelessWindowHint "属性就可实现去标题栏. 注意:在使用这个属性的时候要先导入QtQuick.Windo ...

  2. 弹性布局学习-详解align-content(六)

    弹性布局学习-详解align-content(六)

  3. phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法

    最近在phpcmsV9里用表单向导弄个的提交表单,但用了日期和时间类型时,用   <script language='javascript' src='{APP_PATH}index.php?m ...

  4. MySql 服务端与客户端下载地址

    mysql官网的注册,要上传户口,才能下载. 在网上搜了个下载地址. mysql-5.6.8-rc http://mysql.stu.edu.tw/Downloads/MySQL-5.6/mysql- ...

  5. 1035 Password (20)

    #include <stdio.h> #include <string.h> struct MyStruct { ]; ]; bool changed; }; int main ...

  6. Linux 启动直接进入 console,

    我的电脑上有两块显卡,上次fedora更新后,自动安装了nvidia的驱动, 然后悲剧发生了.再也不能够正常进行图形界面了.所以需要进入CONSOLE. 1. 当系统启动时,停止grub menu自动 ...

  7. Java中的异常处理(二)

    1.finally package second; public class C { public static void main(String[] args){ String name = nul ...

  8. c#教程之事件处理函数的参数

    事件处理函数一般有两个参数,第一个参数(object sender)为产生该事件的对象的属性Name的值,例如上例单击标题为红色的按钮,第一个参数sender的值为button1.如上例标题为红色的按 ...

  9. Raft、Zab

    Raft.Zab 引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议--Raft和Zab.通过与Paxos对比,了解Raft和Z ...

  10. 对象工具类 - ObjectUtils.java

    对象工具类,提供对象克隆.获取对象属性.类型判断.Map转换对象.对象转Map.设置对象属性等. 源码如下:(点击下载 -  ObjectUtils.java .JsonUtils.java .gso ...