今天中欧时间晚上10点45分左右,在喝了几杯红酒后,我们意外地删除了生产数据库😨。
谢天谢地,我们的数据库是来自DigitalOcean的托管数据库,这意味着DigitalOcean每天自动执行一次备份。经过5分钟的紧张和恐慌,我们进入了维护模式,并能够恢复备份。在欧洲中部时间晚上11点15分左右,也就是灾难发生30分钟后,我们恢复了在线,然而7个小时的记分板数据在😵上一去不复返了。
准确地说,在欧洲中部时间15:47到23:21之间创建的任何记分牌或添加的分数都已丢失。我们对此深表歉意。
人们很容易把这场灾难归咎于那两杯红酒。然而,擦除数据库的函数是在清醒的情况下编写的。它是一个删除本地数据库并从头开始创建所有所需表的函数。今天晚上,在进行深夜编码时,该函数连接到生产数据库并将其擦除。为什么?这是我们仍在努力弄清楚的事情。
Def database_model_create():";";";";仅适用于localhost以防止灾难";";";";database=config.DevelopmentConfig.DB_database user=config.DevelopmentConfig.DB_username password=config.DevelopmentConfig.DB_Password port=config.DevelopmentConfig.DB_Port local_db=PostgresqlDatabase(database=database,user=user,password=password,host=';localhost';,port=port)local_db.drop_tables([Game,Player,Circle,Score,Order])local_db.create_tables([Game,Player,Circle,Score,Order])print(';初始化本地数据库。';)。
请注意,host被硬编码为localhost。这意味着它永远不应该连接到除开发人员计算机之外的任何计算机。我们太累了,现在想不出来。小鬼们这次赢了。
我们已经了解到,拥有一个删除数据库的函数太危险了,不能无所事事。问题是,您永远不能真正正确地测试安全机制,因为测试它将意味着用枪指着生产数据库。
事实是,我们永远不能百分之百确定这样的事情不会再发生。计算机实在太复杂了,有时候复杂的小妖精会赢。但是,我们将找出哪里出了问题,并确保这种特定的错误不会再次发生。