问题描述

之前做的一个服务端配合硬件端的项目,今天突然在微信上跟我讲在管理后台订单列表里的设备编号看不见后3位数字。

原因查找

看了下数据库表发现原因是因为订单表的设备编号长度限制了16位(开发时跟硬件端开发人员约定16位长度),但是实际插入时的是19位,所以导致后3位没写入表。

问题解决

1.mysql的binlog

首先想到的是利用mysql的binlog日志来恢复正常插入的数据库

2.确定出问题数据的时间段和数量
// 查询第一条问题数据的时间点 (2019-01-02 11:41:05)
select create_time from orders where terminal_sn = '0891184753923260' limit 1;
// 查询最后一条问题数据的时间点 (2019-02-19 00:54:56)
select create_time from orders where terminal_sn = '0891184753923260' order by id desc limit 1;
// 查询错误数据量 (4331条)
select count(*) from orders where terminal_sn = '0891184753923260';

时间段为2019-01-02 11:41:05~2019-02-19 00:54:56

3.导出需要修改的数据

首先需要从binlog日志过滤出需要修改的数据,因为这次只影响了一个orders订单表,所以只需要筛选出针对这张表的增删改操作即可

// 查看当前的binlog文件
MySQL> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000010 | 2535552 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
// 查看binlog日志位置
MySQL> show variables like'log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /data/mysql/mysql-bin |
| log_bin_index | /data/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+-----------------------------+
5 rows in set (0.00 sec)

现在知道了当前binlog日志文件是/data/mysql/mysql-bin.000010,接下来记得使用MySQL>flush logs;刷新一下日志,这样在我们处理时不会影响线上业务

下面来导出orders表的相关sql语句到文件 待修复数据.sql

// 1.仅查看test库的binlog日志
mysqlbinlog --no-defaults --start-datetime="2019-01-02 11:40:00" --stop-datetime="2019-02-19 01:00:00" --database=test /data/mysql/mysql-bin.000010
// 2.使用管道符再次筛选出test库下orders表的sql记录并保存到文件
mysqlbinlog --no-defaults --start-datetime="2019-01-02 11:40:00" --stop-datetime="2019-02-19 01:00:00" --database=test /data/mysql/mysql-bin.000010|grep --ignore-case -E 'insert|update|delete' -A2 -B2|grep orders > 待修复数据.sql

导出后的sql文件行末没有结束符;,所以自己查找替换了一下字符串,insert替换成;insert,update替换成;update,这样sql就没有语法错误了。

数据恢复

1.把待修复数据.sql文件下载到本地,然后在本地数据库里恢复一下数据表,然后删除terminal_sn!='0891184753923260'的数据后查看orders表记录数也是4331条,说明sql语句没问题。
2.接下了我用php把拼接了一下更新的字符串,如下:
UPDATE `orders`  SET `terminal_sn`= '0891184753923260001' WHERE  `order_sn` = '1010211410529976';
UPDATE `orders` SET `terminal_sn`= '0891184753923260006' WHERE `order_sn` = '1010211560262172';
UPDATE `orders` SET `terminal_sn`= '0891184753923260001' WHERE `order_sn` = '1010212471941149';

最后一步

最后就是在生产环境执行更新语句就行啦O(∩_∩)O~~

记一次mysql修复错误数据问题的更多相关文章

  1. 记一次 mysql 启动没反应

    记一次 mysql 启动没反应 ,重启linux又可以启动 vim /var/log/mysqld.log 2018-02-04 13:22:49 28507 [ERROR] InnoDB: Cann ...

  2. 记一次MySQL表分区操作

    最近一次日常迭代中,业务线需要对一张大表进行联合查询,查询性能可想而知,测试过程中服务接口直接响应超时,导致服务不可用,最后临时对该表进行分区操作,暂时缓解性能问题.由于是第一次操作表分区,姑且记录一 ...

  3. 记一次mysql数据库被勒索(中)

    背景在上一篇文章里面已经提过了. 现在面临的问题是nextcloud没有mysql数据库,用不起来了. 因为文件没丢,一种方法是启动新的mysql数据库,把文件重新提交一次. 为了程序员的面子,没有选 ...

  4. 记一次mysql数据库被勒索(下)

    背景: nextcloud的mysql数据库被黑,删库勒索.参考:记一次mysql数据库被勒索(上) mysql数据库恢复成功,nextcloud还是无法连接.参考:记一次mysql数据库被勒索(中) ...

  5. 记一次mysql事务未提交导致锁未释放的问题

    记一次mysql事务未提交导致锁未释放的问题 ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST A ...

  6. 记一次MySQL安装出现的坑爹问题。。。

    关键词:mysql安装 msvcr100.dll缺失  vc++2010 : win10系统首次安装mysql,图方便下载了图形界面的安装包(5.6.4),本以为小事一桩:装一半失败.卸载清注册表.重 ...

  7. 【原创】记一次MySQL大表高并发写入引发CPU飙升的排障过程

    目录 一.故障现象... 1 二.初步分析... 2 三.排障过程... 2 1.排查是否QPS或insert并发请求上升导致问题发生... 2 2.排查是否锁资源等待或block导致了insert变 ...

  8. mysql修复表

    数据库Table xxx is marked as crashed and should be repaired错误的解决方法服务器断电等原因可能导致数据表损坏,导致访问的时候提示:Table xxx ...

  9. 关于pacemaker监控mysql修复的方法

    对工作中,涉及到数据库修复的一个简单汇总 1.在所有的控制节点上,执行pcs resource命令行,查看控制节点上pacemaker的状态是否异常,如果异常,通过crm_resource -P命令行 ...

随机推荐

  1. TreeSet的两种实现方法:Comparable和Comparator(Java比较器)

    Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...

  2. 关于python中第三方库安装方法和问题解决

    一.安装方法 方法一: 1.管理员身份启动命令行(运行--->cmd) 2.pip install 库的绝对路径和库的详细名称 :或者运用cd命令跳转到下载好的库所在的位置然后pip insta ...

  3. windows下node配置npm全局路径(踩坑)

    事情的起因是:Koa要求v7.6.0以上的nodejs. 但是window环境下升级node不容易,试过npm install -g n 和n stable等命令无效,而网上推荐的nvm并不支持win ...

  4. vue钩子

    全局钩子 const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... }) 钩子是异 ...

  5. Centos7安装jupyter notebook

    安装python3 查看当前python版本 [root@iz1i4qd6oynml0z /]# python -V Python 2.7.5 安装python3以及检查python3的版本 yum ...

  6. 9.2 Go 文件IO操作

    9.2 Go 文件IO操作 1.1.1. bufio包 带有缓冲区的IO读写操作,用于读写文件,以及读取键盘输入 func main() { //NewReader返回一个结构体对象指针 reader ...

  7. sourcetree 拉取 一直让输入密码

    以下方法都没用 在控制台中 git gc git prune git config --global credential.helper store git pull 输入账号密码 git pull ...

  8. for、forEach、for in、for of用法

    循环遍历数组或者对象,for.forEach.for in . for of 使用最多 for循环 自Javascript诞生时就有,遍历数组,for 循环的语法如下: for (语句 1; 语句 2 ...

  9. xcode搜索路径缩写

    $(inherited) 这个$(inherited)可用于将构建设置从project级别继承到target级别.拿添加pod依赖遇到的问题来说就是,当前工程target级别没有继承项目级别的配置,所 ...

  10. 设置键盘return键样式

    textField.returnKeyType = UIReturnKeySend; typedef NS_ENUM(NSInteger, UIReturnKeyType) { UIReturnKey ...