⚠ **警告**:本操作涉及 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` 可以快速释放空间,但**风险极高**,请在充分备份的前提下执行,最好在测试环境验证后再在生产环境实施。


网友留言: