人参与 | 时间:2026-10-17 07:27:40
- 监控系统弹出告警的网站时候,我正盯着数据库里那张订单表发呆。监控过去三分钟,数据`updated_at` 字段跳了四十多次,变化而业务后台明明显示没有新订单进来。网站这不正常。监控 通常我们盯数据库变化,数据靠的变化是轮询——每几秒跑一次 `SELECT COUNT(*)`,或者查一下最新时间戳。网站笨是监控笨了点,但简单可靠。数据真正让人头疼的变化,是网站那些改了数据却不走业务接口的操作。比如某个运营同学直接连了生产库,监控手滑把某个字段整体偏移了一位;又比如某个定时任务半夜跑批,数据把状态从“待支付”直接改成“已完成”。这些动作,你的监控系统根本看不见。 我见过最离谱的一次,是某促销活动结束后,优惠券表里多了几千条“已使用”记录。系统没报错,业务量也没异常。直到财务对账发现金额差了几万块,才追查到一个临时脚本忘了加 `WHERE` 条件。那次之后,我们给关键表都加了 binlog 监听。 监听 binlog 是个转折点。它不再问“现在有多少条”,而是直接告诉你“哪一行在什么时间被谁改成了什么”。这就像从看门卫的出入登记本,升级成装了高清摄像头。你甚至能捕捉到事务内部的中间状态——那些在回滚前一闪而过的脏数据。有一次排查线上问题,我就是靠 binlog 里一条被回滚的 `DELETE` 语句,定位到了某个缓存失效的根因。 但光有 binlog 还不够。你得设置合理的告警阈值。比如某张核心表,一分钟内变更超过 200 行就报警。刚开始误报特别多,因为业务高峰期本来就频繁。后来改成按时间段动态阈值——白天 300 行,凌晨 50 行。这才把噪音压下去。还有个细节:要区分“预期变更”和“非预期变更”。像定时任务批量更新状态,那是有规律的,可以直接加白名单。真正的风险,往往藏在那些没有规律、没有对应接口调用的突发写入里。 数据库变化监控做到最后,其实是在回答一个问题:这些数据的变动,是否符合业务逻辑?如果你发现某个字段的值跳过了合法状态机,比如直接从“新建”变成“已删除”,中间没经过“审核”,那多半有人绕过了应用层,或者代码里有隐藏后门。这种问题,靠看日志很难发现,但看变更流一眼就能识破。 顺带说一句,别忽略那些“正常”的异常。比如某个表每天凌晨三点准时更新,持续了半年。突然某天变成凌晨三点零五分。没人改代码,没人调配置。后来查出来是运维给数据库服务器做了迁移,新机器的系统时间比旧机器慢了五分钟。数据本身没问题,但变更模式变了,往往意味着底层环境在悄悄发生变化。 监控数据库变化,不是为了抓谁犯错。而是当数据说话的时候,你能听清它在说什么。毕竟,数据不会撒谎,但撒谎的人,总会留下痕迹。 顶: 4踩: 829
评论专区