ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VCSA vPostgres数据库登录全攻略:从peer认证到外部连接

VCSA vPostgres数据库登录全攻略:从peer认证到外部连接 第一次在VCSA上折腾数据库时我卡了整整一下午。网上搜到的教程清一色让你“psql -U postgres”结果连上去就报Peer authentication failed好不容易查到要切postgres用户又发现这系统里postgres用户根本没有密码。更离谱的是7.0之后psql的路径变了照着6.x的绝对路径敲肯定报No such file or directory。这篇就把我折腾完梳理清楚的完整登录方法、外部连接配置和几个实测过的排查场景一次讲透希望你能少走弯路。先说明白一个事VCSAvCenter Server Appliance底层的数据库就是PostgreSQLVMware内部叫它vPostgres实例默认库有VCDB、VUMDB等。很多运维朋友一听“数据库”三个字就紧张觉得这是DBA的活实际上在日常运维里登录vPostgres查个表、看个任务状态、确认下历史数据清理情况都是很有用的debug手段难度也没想象中高。1. 先认清对象VCSA里的vPostgres到底是个什么东西1.1 VCDB的位置与vpostgres服务机制VCSA是一个Photon OS为基础的虚拟设备vPostgres作为内置服务跑在设备内部并非独立数据库虚拟机。数据库的数据目录一般位于/storage/db/vpostgres/二进制程序和工具链位于/etc/vmware/vpostgres/current/bin/这个current是个软链接指向具体的版本目录升级后指向新版本避免你记一堆带版本号的路径。服务管理方面VCSA里的vpostgres由VMware自己的进程管家vmon托管所以传统的systemctl在设备上不一定好使。你常用的命令是service vpostgres status service vpostgres restart或者用更底层的vmon接口vmon-cli -i vpostgres status vmon-cli -i vpostgres restart实测下来service命令在VCSA的Bash Shell里是能用的但我建议你两种都掌握因为不同小版本对vmon的兼容性更稳定一点。1.2 为什么登录方式跟常规PostgreSQL不一样我们平时在自己服务器上装PostgreSQL通常会用sudo -u postgres psql进入本地或者改完密码后用psql -h IP -U user -W从远程连。但在VCSA里有两个隐藏门槛postgres系统用户在设备上默认是“不可登录”状态你无法用su切换到它再去交互式操作至少在很多版本里直接su - postgres会报错或卡住。psql不在普通用户的PATH环境变量里直接在shell里敲psql会提示command not found。这就导致了很多网上的教程“照抄就翻车”。我见过不少人在root下执行psql -U postgres结果报“Peer authentication failed for user postgres”然后一头雾水。这个报错的本质是PostgreSQL默认的本地认证方式是peer它要求操作系统用户名和数据库用户名一致。你现在是root数据库用户是postgres两边对不上当然拒绝。所以登录vPostgres的第一性原理是要么让进程以postgres系统用户身份运行要么在psql连接时显式指定能通过的认证方式。搞懂这一点后面所有命令都顺理成章了。2. 登录前的基础准备SSH、Bash Shell和账号关系2.1 开启SSH访问的两种途径VCSA默认不开SSH官方出于安全考虑把这扇门焊死了。要打开最快的方式是登录VAMI管理界面浏览器访问https://vcsa-ip:5480使用root账号登录左侧菜单找到“访问”→“SSH登录”把“SSH登录”开关从“已禁用”拨到“已启用”这样SSH服务就起来了端口是默认的22。如果你不想开Web界面也可以在VCSA控制台直接操作虚拟机窗口里按F2进入DCUI在“Troubleshooting Mode Options”里启用SSH效果一样。注意生产环境建议只在需要排查问题时临时开启SSH用完立刻关闭毕竟VCSA是核心管理节点暴露面越少越好。2.2 开启Bash Shell并把环境准备好SSH连上之后默认进入的是VCSA的受限shell叫“shell utility”只能跑有限的几个命令比如help、service。要进入真正的Bash环境需要先开启Bash Shell授权shell.set --enabled True然后输入shell回车就能进入Bash了。这一步很容易被忽略很多人卡在SSH连上后只能执行几个命令以为VCSA就这个德行其实是Shell等级没切过来。进入Bash后建议先把postgres相关路径加进环境变量省得每次敲全路径export PGBIN/etc/vmware/vpostgres/current/bin export PATH$PATH:$PGBIN export PGDATA/storage/db/vpostgres如果你用的是6.x老版本路径可能是/opt/vmware/vpostgres/9.3/bin/psql版本号以实际目录为准用ls /opt/vmware/vpostgres/看一眼就知道了。我记得6.5的vPostgres还是9.3到了7.0直接跳到128.0好像是14跨度挺大的。3. 正式登录把psql用起来的完整命令流程3.1 关键一步用系统postgres用户身份执行psql环境准备好后最稳的登录方式是借助操作系统用户切换能力以postgres身份执行psql。VCSA的root权限足够大可以直接用su把命令体交给postgres用户去跑su - postgres -c /etc/vmware/vpostgres/current/bin/psql -p 5432 -d VCDB这一步的原理就是前面提到的peer认证进程由postgres用户发起数据库用户名也填postgres操作系统层面匹配直接被信任。实测在VCSA 7.0 U2、7.0 U3、8.0上都跑得通。如果su - postgres因为登录shell问题报错可以改用下面的方式不切换环境只提权执行sudo -u postgres /etc/vmware/vpostgres/current/bin/psql -p 5432 -d VCDB不过VCSA默认不一定装了sudo我碰到过一次提示sudo找不到所以还是优先用su方案。还有个小细节psql连接本地时默认会去连接Unix Socket而VCSA的PostgreSQL socket目录通常放在/var/run/vpostgres不是默认的/tmp。如果你只写了psql -U postgres没带-h可能会报psql: error: could not connect to server: No such file or directory这时候加上-h /var/run/vpostgres或者-h localhost指定走TCP回环就能绕过去。我自己的习惯是直接用-h localhost省得记socket路径。3.2 登录后必查的几类SQL示例进入psql之后你就能做常规的PostgreSQL操作了。先看库里有哪些数据库\l正常会看到VCDB、VUMDB、VRMSDB之类的库名具体取决于你的VCSA装了什么模块。VCDB是vCenter主库也就是平时说的“配置和库存数据库”。切库\c VCDB然后列出所有表\dt这里注意VCDB里有很多以VPX_开头的表比如VPX_VM虚拟机信息、VPX_HOST主机信息、VPX_DATASTORE存储信息、VPX_TASK任务记录、VPX_EVENT事件记录。想确认vCenter版本信息直接查配置表SELECT * FROM vpx_vcenter_config;这个表里包含vCenter的GUID、版本、部署类型等关键信息非常适合在排查版本不匹配问题时快速确认。查看最近的vCenter任务SELECT id, name, state, creation_time FROM vpx_task ORDER BY id DESC LIMIT 20;这条SQL在我排查“某某任务卡住不结束”的时候帮过大忙。vCenter Web界面上有时会显示任务一直在“正在运行”但后台这个任务的state已经变成error了界面刷新不及时就会造成误导。查看最近的告警或事件SELECT * FROM vpx_event ORDER BY id DESC LIMIT 50;事件表挺大的实际用的时候建议加上WHERE过滤条件不要一口气全捞出来否则终端刷屏刷到崩溃。4. 从外部客户端连接vPostgres的正确姿势4.1 修改监听地址与认证策略用SSH进VCSA敲SQL对付临时排查够了但如果要做数据分析、可视化报表或者用Navicat、DBeaver、DataGrip这些图形化工具连上去看表结构就需要把vPostgres暴露到外部。这一步风险比本地登录大操作起来也容易踩坑我先把安全做法讲清楚。VCSA的postgresql.conf默认listen_addresses localhost这意味着即使你开了防火墙端口外部也连不进来。先找到配置文件find / -name postgresql.conf 2/dev/null在VCSA 7/8上一般位于/storage/db/vpostgres/postgresql.conf。修改监听地址sed -i s/#*listen_addresses localhost/listen_addresses */ /storage/db/vpostgres/postgresql.conf然后修改pg_hba.conf这个文件跟postgresql.conf在同一个目录。建议追加一条限制来源IP的规则不要图省事直接放开所有网段host all all 192.168.1.0/24 scram-sha-256如果你不想让数据库用户走密码认证也可以用trust但这等于裸奔强烈不建议。配置完重启vpostgres服务service vpostgres restart重启后vCenter自己的组件可能会短暂报错比如登录时提示“vCenter Inventory Service不可用”等一两分钟服务自愈就好。我建议你在业务低峰期做这个操作否则影响了生产环境可别怪我没提醒。4.2 建一个只读账号别动postgres超级用户外部连接最忌讳的是直接用postgres超级用户。一方面密码不好设设复杂了容易忘另一方面如果外部工具误操作改了表结构vCenter直接瘫痪。正确做法是创建一个专门的只读账号CREATE USER vc_readonly WITH PASSWORD YourStrongPass123; GRANT CONNECT ON DATABASE VCDB TO vc_readonly; GRANT USAGE ON SCHEMA public TO vc_readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO vc_readonly;如果你的查询需要跨多个schema比如VC、VUM还需要对每个schema单独授权GRANT USAGE ON SCHEMA VC TO vc_readonly; GRANT SELECT ON ALL TABLES IN SCHEMA VC TO vc_readonly;这个账号只读连接串里用vc_readonly登录外部工具再怎么会玩也删不了数据。我之前用这个方案给监控团队开过一个账号让他们拉vCenter的性能数据做大屏展示跑了半年没出过问题。还有一条路更安全不开数据库端口用SSH隧道。比如Navicat/DBeaver都支持SSH隧道连接先SSH到VCSA再通过本地端口转发连vPostgres。这样数据库端口完全不暴露到外网安全性拉满。操作方法是ssh -L 5432:localhost:5432 rootvcsa-ip然后用本地的5432端口连vPostgres相当于把VCSA里的5432映射到你的电脑上。这个方法唯一的前提是你得先把SSH隧道工具配好~/.ssh/config里可以写别名用起来很方便。5. 实战案例用SQL排查vCenter的常见问题5.1 查看vCenter任务与事件走向vCenter Web界面偶尔会抽风任务历史列表加载不出来或者事件告警页转圈圈。这时候如果客户爸爸催得急直接从数据库里捞是最快的。假设我要查某个时间段内所有的虚拟机创建任务SELECT id, name, state, error_msg, creation_time FROM vpx_task WHERE name LIKE %CreateVm% AND creation_time BETWEEN 2025-01-01 00:00:00 AND 2025-01-31 23:59:59 ORDER BY id DESC;error_msg字段经常能直接给出失败原因比Web界面上的“一般性错误”有营养得多。还有一次我遇到一个vMotion任务卡住Web界面怎么都取消不掉直接在数据库里看到这个任务的state字段是running同时error_msg里写着某个主机连接超时后来定位到是ESXi主机管理网络异常问题一下就清楚了。5.2 查看vCenter自身的心跳与配置状态有些问题连vCenter服务都起不来Web界面进不去这时候只有SSH数据库这条路能进去看。比如你想确认vCenter到底有没有把配置写进数据库可以查SELECT * FROM vpx_vcenter_config;你会看到db_encoding、install_time、version这些字段。如果version跟你升级预期不一致或者install_time异常变化基本可以判断是数据库层面的元数据出了问题。再比如查vCenter的扩展插件注册信息SELECT * FROM vpx_extension ORDER BY id;我在排查vCenter报警插件不生效时用过这条SQL发现某个extension的subject_name和实际证书不匹配才导致告警推送失败。这种问题靠Web界面是看不到的数据库里一目了然。5.3 清理历史数据的场景vCenter默认有数据保留策略但有些历史任务和事件超过保留期后还赖在表里不消失导致VPX_TASK和VPX_EVENT表膨胀数据库文件越来越大。虽然不建议手工删数据但排查阶段你可以先看看数据量到底有多大SELECT count(*) FROM vpx_task; SELECT count(*) FROM vpx_event;再按天分组看看分布SELECT DATE(creation_time) AS day, count(*) FROM vpx_event GROUP BY day ORDER BY day DESC LIMIT 30;有一次我发现vCenter的数据库文件暴涨就是靠这条SQL定位到某天的vpx_event有上百万条记录后来配合vCenter的“数据中心保留时间”设置调整策略才把问题解决。手工删除历史数据的事我劝你别干除非你已经有了完整的备份并且知道后果否则分分钟把vCenter搞到起不来。6. 踩过才知道的坑与补充建议6.1 路径、socket目录和权限的“经典三连坑”先说一下我最早在6.5上踩的坑。当时所有教程都是/opt/vmware/vpostgres/9.3/bin/psql9.3这个版本号很具体结果到了7.0这个路径直接变成了软链接/etc/vmware/vpostgres/current/bin/psql如果你还用老路径报错是必然的。跨版本排查问题前先确认VCSA版本再确定psql路径能省很多无用功。第二个坑是socket目录。PostgreSQL客户端连本地默认找/tmp/.s.PGSQL.5432但VCSA的PostgreSQL进程把socket文件放在/var/run/vpostgres。所以裸敲psql -U postgres大概率报连接不到服务器。应对方式就是前面说的要么加-h localhost要么加-h /var/run/vpostgres。第三个坑是权限。有些人图省事直接把数据库目录的权限改成777或者用chown乱改属主结果vpostgres服务起不来。数据库目录的权限是VMware自己管理的千万别手贱。我有一次为了改配置文件方便把/storage/db/vpostgres下面的文件属主改了重启服务后vCenter直接报“数据库无法访问”最后只能从备份恢复教训惨痛。6.2 动手改库前的自保操作如果你实在需要执行DELETE或UPDATE操作动手之前务必先备份。vCenter的官方备份功能走的是VAMI的“备份”页面会把整个配置和数据库打包你可以在5480端口上操作。如果只是想快速导出某个表的数据用pg_dump也够/etc/vmware/vpostgres/current/bin/pg_dump -U postgres -d VCDB -t vpx_task -F c -f /tmp/vpx_task.dump这个命令只导出vpx_task这张表压缩格式存储体积小恢复也方便。真出了问题还能靠这个文件顶一下。不过说实话VCDB里VPX开头的表之间有外键关联单独导一张表恢复是不完整的所以最靠谱的还是定期走VAMI全备。还有一个实用技巧登录vPostgres前先看下服务健康状态避免连上一个半死不活的服务然后误判问题。service vpostgres status返回里会显示进程PID、启动时间、是否active。如果服务显示正在运行但端口不通再检查监听地址和防火墙别一股脑怪数据库。最后分享一个小技巧把常用的psql连接参数写进~/.pgpass文件VCSA的root用户下格式是host:port:database:user:password这样写脚本批量执行SQL时不用每次交互输密码。注意这个文件权限必须是600否则PostgreSQL拒绝读取。另外如果你从外部工具连接VCDB一定要用只读账号别用postgres超级用户这是我在生产环境吃过亏之后总结出来的铁律。总之登录VCSA的vPostgres数据库没有想象中那么神秘搞懂peer认证的机制、把路径和环境准备好、知道常见坑在哪剩下的就是用SQL去探索vCenter的内部逻辑。希望这篇经验能帮你少踩几个坑早点下班。
返回列表