使用黑洞存储打造更安全的预发布环境
发布日期:作者: Chris Fidao
我最近犯了一个错误,导致预发布环境向几千人发送了邮件。
这很常见。
有很多方法可以防止这种情况发生,但这个“技巧”是我很少见到的。
就我们而言,我们有一个数据库表,其中包含要发送邮件的人员列表、要发送的邮件以及发送时间。一个 CRON 任务会定期检查该表。
👨🔬 酷炫的 MySQL 技巧
— Chris Fidao (@fideloper) 2022 年 1 月 20 日
🧐 如果您的预发布环境有一个理想情况下不应该包含数据的表(尤其是生产数据)
🕳 您可将其设为 BLACKHOLE 表
😅 我用这个技巧来确保一个包含要发送邮件列表的表永远不会包含任何行。因为,你知道…… pic.twitter.com/kGh3wHnLzJ
BLACKHOLE 存储引擎
在我看来,防止这种情况发生的一种方法是让该表永远不包含数据。
在 MySQL 中,我们大多数情况下都在使用 InnoDB 存储引擎(或对于旧数据库或特定用例使用 MyISAM)。MySQL 有其他存储引擎,其中之一就是 BLACKHOLE 引擎。
如 MySQL 所述
BLACKHOLE 存储引擎充当“黑洞”,接受数据,但会将其丢弃,而不进行存储。检索始终返回空结果
这太完美了 - 我们的应用程序在预发布环境中可以正常运行,但该表永远不会包含数据。
修改 MySQL 表
我需要做的唯一步骤就是修改表。
我遇到了一个错误,MySQL 不喜欢我在时间戳字段中使用 0000-00-00 00:00:00
作为默认值。为了解决这个问题,我不得不调整数据库连接会话的 sql_mode
。
以下是我运行的 SQL 命令
SHOW VARIABLES LIKE 'sql_mode';-- Result: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,-- NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,-- NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION -- We want to remove modes related to NO_ZERO_DATE-- But just for this sessionSET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; -- Ensure the table has no datatruncate offending_worrisome_table; -- Set the table's new storage engineALTER TABLE offending_worrisome_table ENGINE = BLACKHOLE;
就是这样!该表将存在,可查询,但永远不会保留数据!