目标
在不中断服务的前提下,把应用使用的数据库角色从 app_rw 迁移到 app_rw_v2。PostgreSQL 每个角色只有一个密码,直接改密会让所有实例同时失效,因此要通过继任角色让新旧凭据并存,等所有调用方切换后再禁用旧角色。
步骤
- 盘点使用方:检索密钥管理元数据、部署清单和
pg_stat_activity,找出 Web 实例、后台任务、定时作业和报表工具,并用pg_dumpall --roles-only导出角色权限。 - 创建继任角色并交互式设置密码,避免密码进入命令历史:
CREATE ROLE app_rw_v2 LOGIN;
GRANT app_rw TO app_rw_v2;
\password app_rw_v2
SELECT usename, count(*)
FROM pg_stat_activity
WHERE usename IN ('app_rw', 'app_rw_v2')
GROUP BY usename;
- 在密钥管理器中写入新版本,更新应用的密钥引用,分批滚动重启使用方,并观察每一批的认证错误。
- 确认旧角色会话归零后执行
ALTER ROLE app_rw NOLOGIN,保留角色和权限七天,继续观察完整业务周期。 - 七天内无异常后执行
DROP ROLE app_rw,归档权限导出,并在凭据清单中记录轮换日期、负责人和下次到期日。
验证
用 app_rw 建立 psql 连接应被拒绝;用 app_rw_v2 连接并执行一次代表性读写;检查 pg_stat_activity 中没有 app_rw 会话;应用仪表盘的认证错误为零;凭据清单中只剩新角色及下次轮换日期。
回滚
删除角色之前,回滚只需两步:执行 ALTER ROLE app_rw LOGIN,并把应用密钥引用指回上一版本,不涉及任何数据变更。执行 DROP ROLE app_rw 之后无法直接恢复,必须用导出的权限重建角色并恢复对象所有权,因此把删除视为不可逆步骤,只在观察期结束后执行。新角色在回滚后可执行 ALTER ROLE app_rw_v2 NOLOGIN 再删除,同样先确认没有会话在使用。