盘点一下数据库的误操作有哪些后悔药?

前言

无论是开发、测试,还是DBA,都难免会涉及到数据库的操作,比如:创建某张表,添加某个字段、添加数据、更新数据、删除数据、查询数据等等。

正常情况下还好,但如果操作数据库时出现失误,比如:

  • 删除订单数据时where条件写错了,导致多删了很多用户订单。
  • 更新会员有效时间时,一次性把所有会员的有效时间都更新了。
  • 修复线上数据时,改错了,想还原。
  • 还有很多很多场景,我就不一一列举了。

    如果出现线上环境数据库误操作怎么办?有没有后悔药?

    答案是有的,请各位看官仔细往下看。

    1.不要用聊天工具发sql语句

    通常开发人员写好sql语句之后,习惯通过聊天工具,比如:qq、钉钉、或者腾讯通等,发给团队老大或者DBA在线上环境执行。但由于有些聊天工具,对部分特殊字符会自动转义,而且有些消息由于内容太长,会被自动分成多条消息。

    这样会导致团队老大或者DBA复制出来的sql不一定是正确的。

    他们需要手动拼接成一条完整的sql,有时甚至需要把转义后的字符替换回以前的特殊字符,无形之中会浪费很多额外的时间。即使终sql拼接好了,真正执行sql的人,心里一定很虚。

    所以,强烈建议你把要在线上执行的sql语句用邮件发过去,可以避免使用聊天工具的一些弊端,减少一些误操作的机会。而且有个存档,方便今后有问题的时候回溯原因。很多聊天工具只保留近7天的历史记录,邮件会保留更久一些。

    别用聊天工具发sql语句!

    别用聊天工具发sql语句!

    别用聊天工具发sql语句!

    重要的事情说三遍,它真的能减少一些误操作。

    2.把sql语句压缩成一行

    有些时候,开发人员写的sql语句很长,使用了各种joinunion,而且使用美化工具,将一条sql变成了多行。在复制sql的时候,自己都无法确定sql是否完整。(为了装逼,把自己也坑了,哈哈哈)

    线上环境有时候需要通过命令行连接数据库,比如:mysql,你把sql语句复制过来后,在命令行界面执行,由于屏幕滚动太快,这时根本无法确定sql是否都执行成功。

    针对这类问题,强烈建议把sql语句压缩成一行,去掉多余的换行符空格,可以有效的减少一些误操作。

    sql压缩工具推荐使用:https://tool.lu/sql/

    3.操作数据之前先select一下

    需要特别说明的是:本文的操作数据主要指修改删除数据。

    很多时候,由于我们人为失误,把where条件写错了。但没有怎么仔细检查,就把sql语句直接执行了。影响范围小还好,如果影响几万、几十万,甚至几百万行数据,我们可能要哭了。

    针对这种情况,在操作数据之前,把sql先改成select count(*)语句,比如:

    update order set status=1 where status=;