在设计数据表时,添加一个TimeStamp字段已经是常规做法了,对于后期的数据维护、分析都很有用。但是由于各种原因,有时候设计表结构的工作往往是交给普通开发人员去做,又没有仔细去审核,等维护时才发现根本没有时间戳,这时候系统已经上线一段时间,再想找回历史数据的创建时间已无从下手。
好在MySQL数据库的binlog中已为我们忠实的记录了所有sql语句的操作时间(当然,前提是打开了日志选项),我们可以通过如下一段perl小脚本从日志中找回所有数据记录的创建时间(同样适用于自增ID。好吧,不加自增ID这种错误就更初级了,相信没人会犯的):
my $binlog = $ARGV[0]; my $outfile = $ARGV[1]; my $table = $ARGV[2]; my $record; my $INSERT_ID; my $TIMESTAMP; my $i = "SET INSERT_ID="; my $t = "SET TIMESTAMP="; my $r = "INSERT INTO $table"; open(FILE,$binlog); open(OUTFILE, ">>$outfile"); while($record=<FILE>) { if(index($record,$i)==0) { substr($record,length("/*!*/;/n")*-1)=""; $INSERT_ID=substr($record,length($i)); } elsif (index($record,$t)==0) { substr($record,length("/*!*/;/n")*-1)=""; $TIMESTAMP=substr($record,length($t)); } elsif (index($record,$r)==0) { print OUTFILE ("update $table set CreateTime=FROM_UNIXTIME($TIMESTAMP) where id=$INSERT_ID;/n"); } } close(FILE); close(OUTFILE);
程序保存为GetTimestamp.pl,使用步骤为:1、在table中建立类型为TimeStamp的字段CreateTime;2、将binlog导出sql文件;3、perl GetTimestamp.pl sql文件名 输出文件名 数据表名;4、执行输出文件中所有的update语句,即可找回记录的创建时间点。That’s all.
btw,其实以上4步其实可以合并到脚本中自动完成,但和本文主题无涉。