美文网首页
更新时间,创建时间没写入到数据库怎么办?

更新时间,创建时间没写入到数据库怎么办?

作者: 龚志丹 | 来源:发表于2019-11-06 20:58 被阅读0次

今天遇见一个很尴尬的问题,表字段包含created_at 和 updated_at分别为创建时间和修改时间,一段时间后,发现程序中途修改后,导致两个字段值都是为空。但是这两个值又比较重要,还是想办法修复下数据吧。

入手思路:mysqlbinlog

第一步:找到mysqlbinlog所存储的位置,dump到本地。

第二步:使用mysqlbinlog自带工具解析出base64 SQL文件。


 mysqlbinlog --base64-output=decode-rows  -d shard1 -v ./mysqlbin.000026  > 1.txt

命令解析:

 --base64-output=decode-rows 为每行解析出base64输出

-d shard1 指定databases 为shard1

-v ./mysqlbin.000026 指定binlog日志文件 

> 1.txt 输出结果至1.txt

第三步:对文本进行筛选,导出相关的库名和表名

grep -C2 -w 'INSERT INTO `shard1`.`gold_detail_log_20190701_4`'  ./1.txt > gold_0.sql

第四步:使用php脚本对日志进行分析,获取每条sql的执行时间,就是创建时间


<?php

$filename = [

'./gold_0.sql'

];

$result = [];

foreach ($filename as $file) {

$handle  = fopen ($file,"r");

while (!feof ($handle))

{

$buffer  = fgets($handle);

$content = trim($buffer);

preg_match('/\#(.*?)server id/i',$content,$ma);

if ($ma) {

$tmp = explode(' ',trim($ma[1]));

$year = str_split($tmp[0],2);

$tmpTime = '20' . $year[0]. '-' . $year[1]. '-' . $year[2]. ' ' . ($tmp[1]?: $tmp[2]);

$result['time'][]= $tmpTime;

}

preg_match('/\@1=(\d{0,10})/i',$content,$ma1);

if ($ma1) {

$result['id'][]= $ma1[1];

}

}

if ($result) {

foreach ($result['id']as $k => $id) {

$result['ok'][$id]= $result['time'][$k];

}

}

fclose ($handle);

$tablename = '';

switch ($file) {

case './gold_detail_log_20190701_0.sql':

        case './gold_0.sql':

            $tablename = 'gold_detail_log_20190701_0';

break;

case './gold_detail_log_20190701_1.sql':

        case './gold_1.sql':

            $tablename = 'gold_detail_log_20190701_1';

break;

case './gold_detail_log_20190701_2.sql':

        case './gold_2.sql':

            $tablename = 'gold_detail_log_20190701_2';

break;

case './gold_detail_log_20190701_3.sql':

        case './gold_3.sql':

            $tablename = 'gold_detail_log_20190701_3';

break;

case './gold_detail_log_20190701_4.sql':

        case './gold_4.sql':

            $tablename = 'gold_detail_log_20190701_4';

break;

}

// 生成sql

    foreach ($result['ok']as $id => $time) {

$sql = "update {$tablename} set created_at = '{$time}', updated_at = '{$time}' where id = {$id} and created_at is null;" . PHP_EOL;

file_put_contents('build.sql',$sql,FILE_APPEND);

}

$result = [];

}

相关文章

  • 更新时间,创建时间没写入到数据库怎么办?

    今天遇见一个很尴尬的问题,表字段包含created_at 和 updated_at分别为创建时间和修改时间,一段时...

  • 时序数据库特点与对比

    时序数据库的特点 数据写入时序数据会按照指定的时间粒度持续写入,支持实时、高并发写入,无须更新或删除操作。 数据读...

  • Serverless实战驾校小程序之数据库设计

    数据库设计(基于Bmob后端云数据库) 由于使用Bmob后端云数据库,默认每条记录都带id、创建时间与更新时间,此...

  • InfluxDB

    时间序列数据:从定义上来说,就是一串按时间维度索引的数据。时序数据库(TSDB)特点:持续高并发写入、无更新;数据...

  • GYDataCenter

    这是FMDB数据库的封装版本,具备内存缓存,自动创建及更新数据库表,线程安全,自动批量写入等特征,微信读书团队作品...

  • 3、时间戳的优化

    由于数据库使用的创建时间 create_time和最后更新时间 update_time但是我们的Mapper 和 ...

  • postgresql数据创建时间&更新时间

    建表语句 实现:创建带create_at和update_at字段的表,字段默认值为精度为0的CURRENT_TIM...

  • mysql创建时间和更新时间

  • 表数据公共参数提取

    背景 数据库业务表中都会有创建时间,创建人,更新时间和更新人字段,映射到实体类中,每次做业务都需要手动去给这几个赋...

  • Java字符串格式互相转换为SQL时间戳

    背景 Java的时间转换函数是最乱了。无语了 问题 每次数据库需要保存对应非创建、更新这种能自动更新时间的时候,就...

网友评论

      本文标题:更新时间,创建时间没写入到数据库怎么办?

      本文链接:https://www.haomeiwen.com/subject/slypbctx.html