老哥们,今天遇到一个非常严重的问题——vCenter Server 的 vpxd 服务无法启动,提示无法连接到数据库。查了一下 VMware KB 313592,发现是 PostgreSQL 事务日志损坏导致的。这个问题需要我们手动修复,赶紧来看一下具体步骤。
故障现象还原
1. 错误提示
当尝试启动 vpxd 服务时,你会看到以下错误:
vpxd.log 中的数据库连接失败:
Failed to connect to database: ODBC error: (08001) - [unixODBC] Could not connect to the server; --> Connection refused [XXX.X.X.XX:XXXX]
PostgreSQL 日志中的致命错误:
LOG: invalid primary checkpoint record
PANIC: could not locate a valid checkpoint record
2. 可能的根本原因
PostgreSQL 事务日志损坏通常由以下原因引起:
-
- vCenter 服务器突然关机(如电源故障)
- 磁盘空间耗尽导致事务日志无法写入
- 硬件故障(如磁盘坏道、RAID 故障)
- 文件系统损坏
完整修复步骤
1. 备份与准备
警告:修复过程可能导致数据丢失。 在开始之前,请确保:
1. 关闭并关机 vCenter Server Appliance
2. 为 vCenter VM 拍摄快照(用于回滚)
3. 开机 vCenter Server
2. 停止所有服务
# 停止 vCenter Server 的所有服务
service-control --stop --all
3. 切换到 vpostgres 用户
# 切换到 vpostgres 用户,使用 /bin/sh 作为 shell
su vpostgres -s /bin/sh
4. 重置 PostgreSQL 事务日志
注意:命令在不同 vCenter 版本中略有不同
#### vCenter Server Appliance 6.5.x 和 6.7.x
# 重置事务日志(使用 pg_resetxlog)
/opt/vmware/vpostgres/current/bin/pg_resetxlog -f /storage/db/vpostgres
#### vCenter Server 7.0 及更高版本
# 重置事务日志(使用 pg_resetwal)
/opt/vmware/vpostgres/current/bin/pg_resetwal -f /storage/db/vpostgres
5. 恢复服务
# 退出 vpostgres 用户会话
exit
# 启动所有服务
service-control --start --all
6. 验证与清理
1. 确认 vCenter Server 服务成功启动
2. 测试 vCenter Server 的核心功能(如虚拟机管理、集群功能)
3. 删除之前创建的快照(防止长期保留导致性能问题)
风险评估与备用方案
1. 数据丢失风险
-
- 重置事务日志可能会导致未提交的事务丢失
- 可能会影响最近的配置变更
- 如果损坏严重,可能需要从备份恢复
2. 从备份恢复的步骤
如果重置事务日志失败或数据丢失严重,请考虑从备份恢复:
1. 确保有有效的 vCenter Server 备份(包括数据库)
2. 恢复到备份点
3. 检查并应用备份后的配置变更
如何防止类似问题
1. 定期备份
-
- 配置 vCenter Server 的定期备份
- 至少保留 3-7 天的备份
- 定期测试备份的可恢复性
2. 监控磁盘空间
-
- 监控 /storage/db 分区的磁盘空间使用情况
- 确保至少有 20% 的可用空间
- 配置告警以在空间不足时通知管理员
3. 合理规划维护窗口
-
- 避免突然关机
- 在进行重大操作前拍摄快照
- 遵循正确的关机流程
验证修复是否成功
1. 检查服务状态
# 检查 vpxd 服务状态
service-control --status vpxd
# 检查所有服务状态
service-control --status --all
# 检查 PostgreSQL 进程
ps -ef | grep postgres
2. 验证数据库连接
# 使用 isql 测试 ODBC 连接(需要安装 unixODBC 工具)
isql -v VCDB
3. 检查 vCenter Server 功能
- 登录到 vSphere Client
- 验证虚拟机列表是否正常显示
- 测试虚拟机的基本操作(如开机、关机、迁移)
- 检查集群功能(如 HA、DRS)
总结
虽然修复过程其实的确有一定的风险的,但只要我们做好充分的备份和准备,就可以将风险降到最低。
记住,防止问题比修复问题更重要。定期备份、监控磁盘空间和遵循正确的维护流程,可以帮助我们避免这种数据库损坏的问题。
Reference: VMware KB 313592





