初级,中级和高级开发人员走进酒吧,他们订购了ALTER表
关于这个东西的巨大破坏力的故事
齐聚一堂,让我告诉你那段时间,我的队友和我取消了该平台最关键的服务之一。 为了便于叙述,我将同事的名字命名为 S(高级)和 M(中级),但为了保持尽可能匿名,我更改了日期和一些技术细节。
T'是2016年7月底一个漂亮的星期四下午。天气比以前几天要温和,我的队友和我刚搬到办公室的新地方。 生活大都是美好的。 前一周已经没有我们最高级的开发人员S参加了,但是我和M设法独自完成了一些任务。
这些更改包含一些相当繁重的内容(新的数据库字段,新的端点),因此我们决定在合并它们之前等待S的审查。
数据库更改和迁移脚本
同时,另一位开发人员检查了所做的更改,并提到迁移脚本中的操作对于数据库服务器可能是很多工作,并且可能会使其锁定一段时间。 因此,他提出了一些替代方案。
如果您不知道什么是数据库迁移,那么将使用一系列SQL脚本(按顺序执行)从头开始创建整个数据库架构(表,列,默认值,约束等)。 通常,它们在每个部署上运行,但前提是要应用新的东西,即新的迁移文件。
我们不想将更改作为迁移来运行,因为那样的话,更改将由我们的持续集成系统执行,并且完全不受我们的控制。 我们必须手动运行它。 因此,首先我们坐在生产数据库的副本上,开始处理查询以寻找最有效的替代方法。
这很有趣,我们三个人试图猜测当我们分别运行每个脚本行时会发生什么。 需要多长时间? 还是立即运行? 又为什么呢 我们应该在哪里设置默认值以防止新条目被破坏?
开演时间!
下午5点,我们终于对查询感到满意。 它以正确的顺序完成了所有操作,并且没有锁定很长时间。 我们发送了一张票给基础架构团队,以直接在我们的服务器上运行它,因为显然我们没有相应的凭据。 您很快就会知道为什么 。
Infra对此非常勤奋。 他们是一群忙碌的人,如果他们花一些时间做事没关系。 但是这次不是,这次是在我两次眨眼之前关闭了车票。
一切似乎还好。 快要结束了,所以我们分成了自己的办公桌,完成了一些任务。
几分钟后,另一个团队的成员走了过来,问我是否正在更改该功能,因为它引发了一些错误。 这给我带来了冰桶挑战:
哦,不,我是说,是的……我们把它搞定了。
你能猜出发生了什么吗? 我知道找到遗漏比发现错误更难,但是我认为您可以不知道服务,功能或查询就可以知道我们需要做(和没有做)。
如果您这样做,请滚动到底部并对其进行评论,我相信您不会在这张照片下面窥视????
好吧,如果您不知道会发生什么,那也没关系。 我觉得我应该知道,因为这在开发过程中发生在本地大约一百万次 。 那天我自己开始了一个非常相似的功能,并处理了相同的错误。
准备好了吗?
现实重重
我们在数据库中添加了该列, 但从未合并处理该新数据的代码。 这导致后端不知道WTF与之相关,并在所有GET请求上抛出错误????
现在,某些语言可能不会发生这种情况,这些语言可能会丢弃多余的数据并继续前进。 我不应该透露更多信息,但是我要说的是,我们所使用的技术对恶意数据库列并不那么敏感 ,它要求您告诉它如何处理接收到的所有内容。
不合并代码不是问题。 这是我们的小恶棍进来的时候:相遇*???? 恶魔般,回荡着笑声
看到,我们所有的检索查询都使用*(称为星号或star )来带回它找到的每个字段。 那天我得知这是一个 非常非常非常 糟糕的主意 。
如果我们有要检索而不是*的字段列表,则不会发生任何不良情况。 但是我们没有。 我们所有人3都知道。 只是我们的想法slip了
真正的现实问题
好吧,我们是人类,对吗? 我们犯错误。 没有人可以将所有代码库都保留在系统的工作内存中。 这就是为什么我们要进行测试。 不是因为我们的代码易碎且容易出错,而是因为我们的想法是正确的。 创建代码的是我们的思想。
因此,问题并不是我们真的打破了它。 问题是没有警报响起 。
我们进行了生产测试,但没有通知任何人。 我们在日志中有错误警报,但是他们没有监视引起最多错误的事件。 我们进行了端到端测试,但已将其禁用并标记为“损坏”。 这是真正不可接受的????
结语
但最终,这是一个很大的学习机会。 你永远都不会像起床时那样刻苦学习。 这是一个永远不会离开您的课程。
因此,对于您在那里的孩子,以下是我从那天开始的学习清单:
- 绝对不要在您的代码查询中使用*。 即使您必须编写所有列名称,也最好这样做。
- 害怕数据库更改, 可能害怕引导您谨慎。
- 进行数据库更改时,请确保所有代码均已就位,并且可以处理以前的数据库状态以及更改后的状态。
- 在生产中对关键功能进行适当的测试,以工作并通知合适的人员。
- 一旦受到影响, 就测试数据库更改,并在几分钟后监视日志(取决于您获得的流量)。
- Aaand入睡前先刷牙。
这是一个由经验不足和知识渊博的人物讲述的故事。 如果您对此有任何意见,请补充或纠正我所说的内容,我真的很喜欢阅读 reading