Keysight SOS 清理 PostgreSQL pg_xlog

EDA软件 0 709 佚名 收藏

⚠ **警告**:本操作涉及 PostgreSQL 数据库事务日志清理,**存在数据丢失风险**。  

在执行前请务必**停止相关服务并完整备份数据库**,确保有回滚方案。  

如果不熟悉 PostgreSQL 内部机制,请谨慎操作。


近日,笔者在巡查服务器空间时发现 SOS 服务器目录占用了海量空间。根据经验,工程数据本身不应有这么大的空间占用。


```bash
[sosadmin@sos repo]$ du -sh * .
2.1T    SCM-BE
```


经过几轮 `du`,最终锁定 `pg_xlog` 目录占用了大量空间。  

`pg_xlog` 是 PostgreSQL 数据库存放事务日志文件的目录,理论上如果不做回滚是可以清除的。  

但是数据库这玩意儿,安全第一,笔者不敢直接 `rm -rf`,于是上网查找清理方法。


PostgreSQL 自带了两个命令:`pg_archivecleanup` 和 `pg_resetxlog`。  

很遗憾,SOS 只自带了 `pg_resetxlog`。以下演示使用 `pg_resetxlog` 清理 `pg_xlog`。


1. 停止 SOS Server


```bash
[sosadmin@login04 sbin]$ sosadmin shutdown SCM-BE
Shutting down SOS Cache Server...
Cache server SCM-BE successfully shut down.
Shutting down SOS Primary Server...
Primary server SCM-BE successfully shut down.
```


2. 查询 xlog 断点信息


💡 **提示**:`pg_controldata` 路径在 SOS 安装目录的 `sbin` 下。  

信息中 **Latest checkpoint's REDO WAL file** 表示该文件以前的 WAL 都可以归档清除(可用 `pg_archivecleanup`)。  

但由于 SOS 只自带 `pg_resetxlog`,我们使用 `NextXID` 和 `NextOID` 两个参数确定清除点。


```bash
[sosadmin@login04 sbin]$ ./pg_controldata /home/repo/SCM-BE/SCM-BE.rep/pg_data/
pg_control version number:            942
Catalog version number:               201409291
Database system identifier:           7210049869644726081
Database cluster state:               shut down
pg_control last modified:             Wed 13 Aug 2025 09:31:25 AM CST
Latest checkpoint location:           3DE/F000028
Prior checkpoint location:            3DE/E000028
Latest checkpoint's REDO location:    3DE/F000028
Latest checkpoint's REDO WAL file:    00000001000003DE0000000F
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0/175529
Latest checkpoint's NextOID:          34463
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        1884
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
```


3. 使用 `pg_resetxlog` 清理 xlog


⚠ **注意**:`pg_resetxlog` 是一个低级别运维工具,使用不当可能导致数据库损坏。  

请务必确认 OID 与 XID 取值正确,并且确保已备份。


指定 OID 和 XID 参数清理:


```bash
[sosadmin@login04 sbin]$ ./pg_resetxlog -o 34463 -x 175529 -f /home/repo/SCM-BE/SCM-BE.rep/pg_data/
Transaction log reset
```


4. 查看清理效果


```bash
[sosadmin@sos repo]$ du -sh * .
18G    SCM-BE
```


5. 启动 SOS Server


```bash
[sosadmin@login04 sbin]$ sosadmin startup SCM-BE
Starting SOS Primary Server...
Starting SOS Cache Server...
```


✅ **总结**:通过 `pg_resetxlog` 清理 `pg_xlog` 可以快速释放空间,但**风险极高**,请在充分备份的前提下执行,最好在测试环境验证后再在生产环境实施。


相关推荐:

网友留言:

您需要 登录账户 后才能发表评论

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码