由一次MySQL事故想到的

去年10月入职一家新公司,因公司内部某种不和谐因素造成上一个PHP程序员匆忙离职,相关工作都交接到我手里。

  前面说到内部有不和谐的因素存在,因此相关的项目代码也是敷衍了事质量不高,也就为后续事故埋下了炸弹。

  到了年底某天,客户的项目需要参加国家级某项评审,炸弹终于爆炸了。

  打开该项目,所有的普通用户皆能正常访问,唯独只有官方评选小组的专家无法访问。更可怕的所有的专家只用同一个账号,且我们对专家账号一无所知。
  
  客户炸了,急得不行了。连夜打电话到老板哪里,老板又半夜电话到了我。当晚,按照正常账号、正常业务流程走了一遍,没有发现任何问题。但是不知道专家账号,也不可能知道专家账号,问题无法排查自然也就留到次日。

  次日上午,火速前往客户单位机房,现场查询访问日志记录。

  顶着客户施加的强大的压力,冷静一下,终于找到专家账号留下的蛛丝马迹。于是,顺藤摸瓜就把问题根源找到并解决了。真惊险,差点小命不保,被客户喷死。

  问题的根源是评审专家的账号是“audit_expert”12位长度,普通用户都是手机号11为长度。再看一下数据表,发现账号字段account被设计成了varchar(11)。专家账号被存储为 “audit_exper”,写入数据库的时因长度限制被截断丢失了一位。

  怪不得专家打死都登录不上去。这悲催的专家,这傻x的数据表设计。于是,调整数据长度类型,手工修复专家账号。问题就解决了。
  
  

  那么问题来了,如何避免重要数据被截断,造成脏数据?

1.修改MySQL的sql_mode中设置开启STRICT_TRANS_TABLES严格模式。

2.表的存储引擎设置为innoDB。

3.程序脚本在对数据表写操作的时候,主动捕获错误异常并进行预警和处理。

演示

1.往test表中写入a-z长度为26的字符串单条数据,MySQL抛出错误信息:ERROR 1406 (22001): Data too long for column ‘name‘ at row 1。写入数据失败

2.批量往test表中写入数据,test表存储引擎为innodb。发生错误会整理回滚。

原文地址:https://blog.51cto.com/phpme/2468028

时间: 2024-10-26 03:13:06

由一次MySQL事故想到的的相关文章

记一次mysql事故---纪念逝去的一上午

虚拟机关机后第二天mysql起不来,回想一下我关机前和关机后的操作发现:关机前没关闭mysqld服务就直接init 0了,关机后将虚拟机内存由1G降到724M.笔者保证再也做过别的骚操作了. 2017-09-05 09:19:21 1940 [Note] Plugin 'FEDERATED' is disabled. 2017-09-05 09:19:21 1940 [Note] InnoDB: Using atomics to ref count buffer pool pages 2017-

DATABASE CONNECTION ERROR (1): THE MYSQL ADAPTER 'MYSQLI' IS NOT AVAILABLE.解决办法

网站迁移之后遇到:Database connection error (1): The MySQL adapter 'mysqli' is not available.这个问题,我一开始以为是我配置的参数错了呢!然后回去检查,检查好几遍我的数据库账号和密码都没错,但是为什么就是连接不上数据库呢?? 网上有人说是"可能有你安装wamp或者xamp之后,sqlserver的服务没有启动,你可以到系统服务菜单里看看这个是否自动启动."但是我问过空间商,他们说默认都是开启的,然后他们也检查了数

window 安装Mysql 5.6 发生系统错误 1067

问题: #安装MySQL服务:mysqld -install MySQL5 D:\Program Files\mysql_5.6.24_winx64\bin>mysqld -install MySQL5Service successfully installed. #启动MySQL服务:net start mysql5 D:\Program Files\mysql_5.6.24_winx64\bin>net start mysql5MySQL5 服务正在启动 ...MySQL5 服务无法启动.

MySQL与Navicat的连接

最近在做Struts项目的过程中,需要用到MySQL数据库,按照原先做BS和CS的项目的经验我首先要安装MySQL,想到曾经安装sqlserver的窘迫,但是这次师哥告诉我,只需要解压一下MySQL的文件,使用navicat进行连接即可. 下面就来讲讲连接步骤. 1.首先你要有MySQL的压缩包,自己去网上下载即可,我这里使用的是mysql-5.6.19-winx64. 2.解压压缩包,随意路径. 3.下载navicat工具,安装.我使用的是Navicat_Premium_11.0.10. 4.

MySQl资料链接

原文:http://www.uml.org.cn/sjjm/sjjm-MySql.asp MySQl   MySQL高可用数据库内核深度优化的四重定制   MySQL数据表存储引擎类型及特性   MySQL分布式数据库高可用架构.复制机制.多机房   Mysql高并发优化   我必须得告诉大家的MySQL优化原理   MySQL注入攻击与防御   腾讯云:MySQL数据库的高可用性分析   一步一步打造MySQL高可用平台   MySQL 日志管理详解   MySQL锁解决并发问题详解   My

下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除

下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除 http://tech.xiachufang.com/?p=18 在6月26日凌晨12点左右,我们在做线上数据库的备库时,误将线上数据库分区上的所有文件删除.丢失的数据时间段为4月23日至6月25日两个月,在经过7天的努力后,恢复了99%以上的数据.(具体见下面的统计). 下面把整个事故过程记录下来,令关心本次技术事故的人们知晓. 一. 事故隐患 现在回顾,事故隐患在4月23日之后就已经存在. 我们线上数据库使用的是MySQL

Linux 文件系统引起的云盘文件系统异常导致 MySQL 数据页损坏事故恢复复盘

事故的起因是因为当我访问某个数据库的某个表的时候,MySQL 立即出现崩溃并且去查看 MySQL 的错误日志出现类似信息 2019-05-09T05:52:19.232564Z 1027 [ERROR] InnoDB: Space id and page no stored in the page, read in are [page id: space=1668620387, page number=16777216], should be [page id: space=1321, page

【转】记录PHP、MySQL在高并发场景下产生的一次事故

看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且直觉告诉我们,这是不可能的,就一直没有在意,直到后来真的发现了一个用户确实是42亿,当时我们整个公司都震惊了,如果有大量用户是这样的情况,公司要亏损几十万,我们的老大告诉我们,肯定是什么地方数据溢出的,最后我们一帮人,疯了似的查代码,发现…… 如果按照正常的程序逻辑走下去,代码是完全没问题,但是我发

MySQL选用可重复读之前一定要想到的事情

原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必要知道..(随着了解的深入这个极有可能再增加..)1.DDL会引起metadata lock,导致请求连环阻塞,甚至是查询请求.http://blog.itpub.net/29254281/viewspace-1383193/ 2.MySQLDump和XtraBackup的flush table命令