pg_stat_backtrace
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_stat_backtrace | 1.0.0 | STAT | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 6030 | pg_stat_backtrace | 否 | 是 | 否 | 是 | 否 | 是 | - |
GitHub v1.0.0; C PGXS extension using ptrace(PTRACE_SEIZE) and libunwind; Linux only; runtime may need kernel.yama.ptrace_scope=0
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 1.0.0 | 1817161514 | pg_stat_backtrace | - |
| RPM | PIGSTY | 1.0.0 | 1817161514 | pg_stat_backtrace_$v | libunwind |
| DEB | PIGSTY | 1.0.0 | 1817161514 | postgresql-$v-pg-stat-backtrace | libunwind8 |
构建
您可以使用 pig build 命令构建 pg_stat_backtrace 扩展的 DEB 包:
安装
您可以直接安装 pg_stat_backtrace 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
使用 pig 或者是 apt/yum/dnf 安装扩展:
创建扩展:
用法
来源:pg_stat_backtrace upstream README、upstream changelog、本地源码归档
pg_stat_backtrace-1.0.0.tar.gz。
pg_stat_backtrace 用于捕获或记录同一 Linux 主机上 PostgreSQL 后端进程或辅助进程的 C 层调用栈。它使用 ptrace(PTRACE_SEIZE) 和 libunwind;不需要 shared_preload_libraries,也不会向目标进程发送 SIGSTOP。
捕获调用栈
先从 PostgreSQL 视图中找到目标进程,再调用 pg_get_backtrace(pid):
返回文本采用类似 pstack(1) 的格式:
写入服务器日志
如果希望结果进入常规 PostgreSQL 日志管道,可以使用 pg_log_backtrace(pid):
该函数成功时返回 true。
权限
默认情况下,两个函数都会从 PUBLIC 撤销执行权限。只应把访问权授予可信的监控角色:
C 代码仍会执行目标检查:
- 超级用户可以定位该实例中的任意 PostgreSQL 进程,包括
walwriter、checkpointer、walsender、autovacuum worker、startup、archiver 等辅助进程。 - 非超级用户只能定位由其成员角色拥有的普通后端进程。
- 辅助进程没有角色所有权,因此非超级用户总会被拒绝。
- 非超级用户不能定位超级用户拥有的后端,即使存在角色成员关系也不行。
输入与错误行为
两个函数都是 VOLATILE STRICT PARALLEL RESTRICTED。
自我定位会被拒绝,因为 Linux 进程不能 ptrace 自己:
运行注意事项
- 版本 1.0.0 支持 PostgreSQL 14-18。上游 1.0.0 同时声明兼容 PostgreSQL 19。
- 该扩展仅支持 Linux,构建和运行时都依赖
libunwind/libunwind-ptrace。 - 在启用了 Yama ptrace 限制的主机上,后端之间互相捕获调用栈可能需要设置
kernel.yama.ptrace_scope = 0。 - 展开调用栈期间,目标进程会被短暂暂停。不要在繁忙主库上对
walwriter、checkpointer或同步复制walsender等关键进程进行紧密循环调用。 - Linux 对每个目标进程只允许一个 tracer。多个会话同时定位同一个 PID 时可能因
EPERM失败;等待正在进行的调用结束后重试。