从CloudSQL审计日志追踪PostgreSQL游标c1的原始查询
追踪CloudSQL PostgreSQL中FETCH语句对应的游标原始查询
方法一:通过Cloud Logging回溯历史会话的游标创建语句
审计日志中的进程ID和会话ID是关联同一会话操作的关键:
- 从你的日志条目里提取两个核心标识:进程ID(
980077)和会话ID(41406,对应日志里的[41406-1]) - 在Cloud Logging中使用以下过滤条件查询同一会话的所有日志:
logName="projects/xyz/logs/cloudsql.googleapis.com%2Fpostgres.log" resource.type="cloudsql_database" resource.labels.database_id="xyz:postgres" textPayload:"[980077]" textPayload:"[41406-" - 缩小时间范围到FETCH语句执行时间(
2023-04-27T08:03:17)之前的几分钟内,在结果中查找包含DECLARE c1 CURSOR的日志条目,该语句就是游标c1对应的原始查询。
方法二:调整PostgreSQL日志配置,捕获完整游标操作日志
如果当前日志未记录游标创建语句,需要修改CloudSQL实例的日志参数:
- 登录Cloud Console,进入目标CloudSQL实例的数据库标志页面
- 添加或修改以下参数:
log_statement:设置为all(会记录所有SQL语句,包括游标声明和FETCH操作),排查完成后建议改回原配置以避免日志量过大log_min_duration_statement:可选,若仅关注慢语句,可设置为1000(记录执行时间超过1秒的语句),需结合log_statement使用以确保游标声明被捕获
- 保存参数后实例会重启生效,后续新会话的游标创建语句会被完整记录,可直接关联对应的FETCH操作
补充说明
pg_cursors视图仅能查询当前活跃会话的游标,一旦会话关闭,游标会被销毁,因此查询不到历史游标是正常现象,必须通过日志回溯历史会话的操作记录。
内容的提问来源于stack exchange,提问作者SRJ
相关产品推荐
相关产品推荐

