第 17 / 22 篇

第 16 章:把实验结论带到真实服务之前

实验的随机数据库、单节点实例和短事务,帮助我们定位语义。真实服务还要处理连接池、权限、部署、数据量、复制与恢复。迁移时应保留不变量和证据,再重新验证每个实现边界。

16.1 会话状态必须回到可知起点

连接池复用连接时,应明确 autocommit、隔离级别、超时和未提交事务的清理。业务异常路径不能带着部分写入进入下一次请求。测试可让一个请求失败后复用同一连接,再检查新请求看见的模式和数据。

事务中执行 SQL 的对象必须真正在同一连接和事务里。框架的事务标记、异步执行与跨线程调用都有各自限制;应在运行时确认连接、事务边界和提交位置,不只根据注解名称推断。

16.2 传输与账号保护独立设计

生产应显式配置 TLS、受信任 CA 与服务端身份验证,并按工作负载分配最小数据库权限。驱动默认愿意协商加密,不等于已经验证服务器身份。不要因为环回故障代理需要明文,就取消真实服务的传输保护。

业务账号一般不需要创建和删除数据库,也不应持有全实例诊断权限。随书测试使用隔离实例的管理账号,只创建本次随机库;生产应用与诊断操作者应分别授权。

16.3 重试受业务身份与总预算约束

将明确死锁与未知提交分开处理。前者在重新读取与校验后,可以按策略重试完整事务;后者应先查询原业务身份。次数、总期限和退避共同限制恢复,避免错误率下降却把数据库负载放大数倍。

业务键、请求指纹、结果与保留期限需要可查询。幂等记录过早删除、不同参数复用同键或不同租户共享键,都可能损坏恢复判断。

16.4 索引与迁移需要代表性负载

实验计划从 ALL 改为 const,不能代替真实读写压测。上线前应使用有代表性的数据规模与分布,观察扫描、写入维护、锁等待和事务时长,并制定回退与发布窗口。

DDL 的算法、锁与耗时要按所用版本及操作验证。先在隔离环境演练长事务与迁移并发,确认元数据等待、资源和故障恢复;不能从空表成功推导大表可以无感变更。

16.5 复制、备份与持久性需要另一组证据

本书没有进行主从切换、断电或备份恢复演练。单节点正常事务结果不能证明这些保证。生产应分别确定恢复点目标、恢复时间目标、读取位置、复制延迟、备份可恢复性和切换后的幂等记录状态。

“有备份”应通过恢复到隔离实例并核对业务数据来验证。故障切换后,查询原操作键的可信位置也可能变化,未知提交恢复流程必须与数据库高可用设计一起演练。

16.6 给值班者一条可执行路径

运行手册应说明如何查原业务键、识别当前事务、读取等待边、处理连接以及进行授权核查。任何会终止会话、回滚事务或修改业务状态的动作,都需要记录依据与影响范围。

练习。 将实验中的管理账号替换为业务账号与诊断账号,分别列出所需权限。再选一个尚未验证的生产保证,写出完成时需要的实际演练,而不是只列一个配置名称。