我们在生产中发生的最严重的数据库事故是什么?

时间:2020-03-05 18:39:51  来源:igfitidea点击:

例如:更新客户表的所有行,因为我们忘记添加where子句。

  • 将其实现并将其报告给同事或者客户是什么样的感觉?
  • 从中学到了什么?

解决方案

回答

我删除了实时数据库并删除了它。

获得的经验教训:确保我们了解SQL,并确保在备份内容之前先进行备份。

回答

初级DBA的目的是:

delete from [table] where [condition]

相反,他们输入:

delete [table] where [condition]

哪个是有效的T-Sql,但基本上完全忽略了where [condition]位(至少在MSSQL 2000/97上它确实做到了,我忘记了那个),并擦除了整个表。

蛮好玩的 :-/

回答

我发现我不理解Oracle重做日志文件(术语?是很久以前的事了),并且丢失了一周的交易数据,这些数据必须从纸质票中手动输入。

我在输入上花费的周末有一线希望,我从我的交易输入屏幕的可使用性中学到了很多,此后大大改善了。

回答

我认为我最严重的错误是

truncate table Customers
truncate table Transactions

我没有看到我登录的MSSQL服务器,我想清除本地副本...熟悉的" OH s ** t",删除时间要长于大约半秒钟,我的老板注意到我去了见白,问我刚刚做了什么。大约半分钟后,我们的站点监控器崩溃了,并开始通过电子邮件向我们发送电子邮件,说站点已关闭。

学过的知识?打开活动数据库的连接绝对不要超过绝对需要的时间。

直到凌晨4点才从备份中还原数据!老板为我感到难过,并给我买了晚餐。

回答

对于大多数人来说,最糟糕的情况是生产数据丢失,但是如果他们不执行每晚备份或者将数据复制到灾难恢复站点,则他们应得到的一切!

在T-SQL中,@ Keith是DELETE的FROM关键字不是可选的吗?这两个语句都做完全相同的事情...

回答

我在一家小型电子商务公司工作,有2名开发人员和一名DBA,我是其中一名开发人员。我通常不习惯于实时更新生产数据,如果我们更改了存储过程,则将其置于源代码控制之下,并进行正式的部署例行程序设置。

好吧,无论如何,用户来找我,需要对我们的联系人数据库进行更新,以批量更新一堆设施。所以我在测试环境中写出了查询,例如

update facilities set address1 = '123 Fake Street'
    where facilityid in (1, 2, 3)

这样的事情。在测试中运行它,更新了3行。将其复制到剪贴板,将其粘贴到我们的生产sql框中的终端服务中,运行它,惊恐地看着它花了5秒钟执行并更新了100000行。不知何故,我复制了第一行而不是第二行,并且由于我CTRL+VCTRL+Ed而没有引起注意。

我的DBA是一位年纪较大的希腊绅士,可能不是我遇到的最脾气暴躁的人。幸运的是,我们有一个备份,它没有中断任何页面,幸运的是,该字段仅用于显示目的(以及计费/运输)。

吸取的教训是要注意我们要复制和粘贴的内容,可能还需要注意其他一些内容。

回答

对我而言,最糟糕的事情是生产服务器占用了HD中的所有空间。我使用的是SQL Server,因此我看到数据库文件,并且看到日志大约是10 Gb,因此我决定做我想截断日志文件时经常执行的操作。我做了一个分离,删除了日志文件,然后再次添加。好吧,我意识到,如果未正确关闭日志文件,则此过程将不起作用。所以我最终得到的是mdf文件,而没有日志文件。值得庆幸的是,我去了Microsoft站点,我有一种方法可以将数据库恢复为恢复状态并移到另一个数据库。

回答

update Customers set ModifyUser = 'Terrapin'

我忘记了where子句非常清白,但是在有5000多个客户的表上,我的名字将在一段时间内出现在每条记录上。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

经验教训:使用事务提交和回滚!

回答

我曾经设法编写一个从未退出过的更新游标。在2M +行表上。锁只是逐步升级,直到这个16核8GB RAM(在2002年!)盒实际上停滞了(蓝屏)。

回答

大约7年前,我工作到很晚才为客户的数据库生成一个更改脚本。我只更改了存储过程,但是在生成SQL时,我检查了"脚本相关对象"。我在我的本地计算机上运行了它,并且一切似乎都运行良好。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。我在客户端的服务器上运行它,脚本成功。

然后,我加载了该网站,该网站是空的。令我震惊的是,"脚本相关对象"设置为我的存储过程所接触的每个表都做了一个" DROP TABLE"。

我立即打电话给首席开发人员和老板,让他们知道发生了什么,并询问数据库的最新备份可以存放在哪里。参加了另外两个开发人员会议,我们得出的结论是,甚至没有备份系统,也无法恢复数据。客户失去了他们整个网站的内容,而我才是根本原因。结果是向我们的客户提供了$ 5,000的信用额。

对我来说,这是一个很棒的课程,现在我对运行任何更改脚本和首先备份数据库非常谨慎。我今天仍在同一家公司工作,每当有关备份或者数据库脚本的笑话浮出水面时,总会有人提出著名的" DROP TABLE"事件。

回答

我以为我正在测试数据库中工作(显然情况并非如此),所以当我完成"测试"时,我运行了一个脚本以将所有数据重置为我们使用的标准测试数据。
幸运的是,这发生在有备份的数据库上,因此在弄清楚我做错了什么之后,我们可以轻松地恢复原始数据库。

但是,此事件确实教会了我工作的公司真正将生产和测试环境区分开来。

回答

我们正在尝试修复Oracle集群上的无效节点。

存储管理模块出现问题,因此我们单击了"卸载"按钮,目的是从另一个节点重新安装并复制配置。

嗯,事实证明是将卸载按钮应用于整个集群,因此很高兴地从系统中的所有节点上删除了存储管理模块。

使生产集群中的每个节点崩溃。而且由于所有节点都没有存储管理器,因此它们不会出现!

这是有关备份的一个有趣的事实...最旧的备份在站点外轮换,我们知道数据库中最旧的文件是什么吗?安装系统时设置的配置文件。

因此,我们必须让异地的人用该磁带发送快递,几个小时后,我们重新安装并运行了所有内容。现在,我们保留安装和配置文件的本地副本!

回答

Updating all rows of the customer table because you forgot to add the where clause.

那正是我所做的:| 。我已将所有用户的密码列更新为我在控制台上键入的示例字符串。最糟糕的部分是我正在访问生产服务器,并且在执行此操作时正在检查一些查询。然后,我的前辈们不得不还原旧的备份,并且不得不打听一些真正心怀不满的客户的电话。当然,还有一次我确实使用了delete语句,我什至不想谈论它;-)

回答

Truncate table T_DAT_STORE

T_DAT_STORE是我所在部门的事实表。我认为我已连接到开发数据库。幸运的是,我们有每天的备份,直到那天才使用,并且在六个小时内就恢复了数据。

从那时起,我在截断之前修改了所有内容,并定期要求对次要表进行备份还原,只是为了检查备份是否正常(我部门未完成备份)

回答

我不记得所有失去控制的sql语句,但我吸取了一个教训,那就是如果可以的话,请在事务中进行操作(请注意大的日志文件!)。

在生产中,如果可以的话,请按照旧的方式进行:

  • 使用维护窗口
  • 后备
  • 执行更改
  • 核实
  • 如果出现问题,请恢复

相当不酷,但通常可以正常工作,甚至可以让其他人在夜班期间执行此程序,而我们应该得到应有的睡眠

回答

这不是我发生的事情,只是我必须清理的客户的麻烦。

他们有一个运行在RAID5磁盘阵列上的SQL Server,漂亮的热插拔驱动器配有亮起的磁盘状态指示灯。绿色=良好,红色=较差。

他们的驱动器之一从绿色变为红色,而被告知要拔出并更换(红色)坏驱动器的天才则将(绿色)好驱动器取出来。好吧,这并没有完全使RAID集完全消失,而是选择了几分钟的可读性(红色)对不可用(绿色)的设备。 ...由于失去了磁盘同步而变得混乱起来)。24个小时后,编写元程序以恢复可读数据并重建它们正在运行的中等大小的架构。

这个故事的寓意包括...永远不要使用RAID5,始终维护备份,请小心雇用谁。

我曾经在客户生产系统上犯了一个重大错误-幸运的是,在想知道为什么执行命令要花费这么长时间时,我意识到我所做的一切并在世界灭亡之前取消了它。

这个故事的寓意包括...总是在更改任何内容之前开始新的事务,测试结果是否符合期望,然后才提交事务。

作为一般观察,可以通过在模式上正确定义外键约束并远离任何经过命令标记的" CASCADE"来防止rm -rf /类型错误的许多类

回答

我完全按照你的建议做了。我更新了保存客户文档的表中的所有行,因为我忘记在末尾添加" where ID = 5"。那是个错误。

但是我很聪明,偏执。我知道我会一天搞砸。我已经发出了"开始交易"。我发出回滚,然后检查表是否正常。

不是。

在生产中获得的经验教训:尽管事实上我们出于很多原因希望在MySQL中使用InnoDB表...请确保我们没有设法找到少数几个不遵守事务且无法滚动的MyISAM表之一回来。在任何情况下都不要相信MySQL,习惯性地发出"开始交易"是一件好事。即使在最坏的情况下(这里发生了什么),它也丝毫没有伤害任何东西,并且可以保护我在InnoDB表上的安全。

我不得不从备份中还原表。幸运的是,我们每夜都有备份,数据几乎从未更改,并且该表只有几十行,因此几乎是瞬时的。作为参考,没有人知道我们周围仍然有非InnoDB表,我们认为很早以前就将它们转换了。没有人告诉我要注意这个陷阱,没人知道它在那里。我的老板会做同样的事情(如果他在键入where子句之前就按回车太早了)。

回答

效果:

update email set processedTime=null,sentTime=null

在生产时事通讯数据库上,重新发送数据库中的每封电子邮件。