初级,中级和高级开发人员走进酒吧,他们订购了ALTER表

关于这个东西的巨大破坏力的故事

初级,中级和高级开发人员走进酒吧,他们订购了ALTER表
Dan GoldUnsplash拍摄的照片

齐聚一堂,让我告诉你那段时间,我的队友和我取消了该平台最关键的服务之一。 为了便于叙述,我将同事的名字命名为 S(高级)和 M(中级),但为了保持尽可能匿名,我更改了日期和一些技术细节。

T'是2016年7月底一个漂亮的星期四下午。天气比以前几天要温和,我的队友和我刚搬到办公室的新地方。 生活大都是美好的。 前一周已经没有我们最高级的开发人员S参加了,但是我和M设法独自完成了一些任务。

这些更改包含一些相当繁重的内容(新的数据库字段,新的端点),因此我们决定在合并它们之前等待S的审查。

数据库更改和迁移脚本

同时,另一位开发人员检查了所做的更改,并提到迁移脚本中的操作对于数据库服务器可能是很多工作,并且可能会使其锁定一段时间。 因此,他提出了一些替代方案。

如果您不知道什么是数据库迁移,那么将使用一系列SQL脚本(按顺序执行)从头开始创建整个数据库架构(表,列,默认值,约束等)。 通常,它们在每个部署上运行,但前提是要应用新的东西,即新的迁移文件。

我们不想将更改作为迁移来运行,因为那样的话,更改将由我们的持续集成系统执行,并且完全不受我们的控制。 我们必须手动运行它。 因此,首先我们坐在生产数据库的副本上,开始处理查询以寻找最有效的替代方法。

这很有趣,我们三个人试图猜测当我们分别运行每个脚本行时会发生什么。 需要多长时间? 还是立即运行? 又为什么呢 我们应该在哪里设置默认值以防止新条目被破坏?

开演时间!

下午5点,我们终于对查询感到满意。 它以正确的顺序完成了所有操作,并且没有锁定很长时间。 我们发送了一张票给基础架构团队,以直接在我们的服务器上运行它,因为显然我们没有相应的凭据。 您很快就会知道为什么

Infra对此非常勤奋。 他们是一群忙碌的人,如果他们花一些时间做事没关系。 但是这次不是,这次是在我两次眨眼之前关闭了车票。

一切似乎还好。 快要结束了,所以我们分成了自己的办公桌,完成了一些任务。

几分钟后,另一个团队的成员走了过来,问我是否正在更改该功能,因为它引发了一些错误。 这给我带来了冰桶挑战:

哦,不,我是说,是的……我们把它搞定了。

你能猜出发生了什么吗? 我知道找到遗漏比发现错误更难,但是我认为您可以不知道服务,功能或查询就可以知道我们需要做(和没有做)。

如果您这样做,请滚动到底部并对其进行评论,我相信您不会在这张照片下面窥视????

初级,中级和高级开发人员走进酒吧,他们订购了ALTER表
胡卓· 亨顿摄Unsplash

好吧,如果您不知道会发生什么,那也没关系。 我觉得我应该知道,因为这在开发过程中发生在本地大约一百万次 那天我自己开始了一个非常相似的功能,并处理了相同的错误。

准备好了吗?

现实重重

我们在数据库中添加了该列, 但从未合并处理该新数据的代码。 这导致后端不知道WTF与之相关,并在所有GET请求上抛出错误????

现在,某些语言可能不会发生这种情况,这些语言可能会丢弃多余的数据并继续前进。 我不应该透露更多信息,但是我要说的是,我们所使用的技术对恶意数据库列并不那么敏感 ,它要求您告诉它如何处理接收到的所有内容。

不合并代码不是问题。 这是我们的小恶棍进来的时候:相遇*???? 恶魔般,回荡着笑声

看到,我们所有的检索查询都使用*(称为星号star )来带回它找到的每个字段。 那天我得知这是一个 非常非常非常 糟糕的主意

如果我们有要检索而不是*的字段列表,则不会发生任何不良情况。 但是我们没有。 我们所有人3都知道。 只是我们的想法slip了

真正的现实问题

好吧,我们是人类,对吗? 我们犯错误。 没有人可以将所有代码库都保留在系统的工作内存中。 这就是为什么我们要进行测试。 不是因为我们的代码易碎且容易出错,而是因为我们的想法是正确的。 创建代码的是我们的思想。

因此,问题并不是我们真的打破了它。 问题是没有警报响起

我们进行了生产测试,但没有通知任何人。 我们在日志中有错误警报,但是他们没有监视引起最多错误的事件。 我们进行了端到端测试,但已将其禁用并标记为“损坏”。 这是真正不可接受的????

结语

但最终,这是一个很大的学习机会。 你永远都不会起床时那样刻苦学习。 这是一个永远不会离开您的课程。

因此,对于您在那里的孩子,以下是我从那天开始的学习清单:

  • 绝对不要在您的代码查询中使用*。 即使您必须编写所有列名称,也最好这样做。
  • 害怕数据库更改, 可能害怕引导您谨慎。
  • 进行数据库更改时,请确保所有代码均已就位,并且可以处理以前的数据库状态以及更改后的状态。
  • 在生产中对关键功能进行适当的测试,以工作并通知合适的人员。
  • 一旦受到影响, 测试数据库更改并在几分钟后监视日志(取决于您获得的流量)。
  • Aaand入睡前先刷牙。

这是一个由经验不足和知识渊博的人物讲述的故事。 如果您对此有任何意见,请补充或纠正我所说的内容,我真的很喜欢阅读 reading

From: https://hackernoon.com/a-junior-a-middle-and-a-senior-dev-walk-into-a-bar-and-they-order-an-alter-table-36d7bf650d33