PostgreSQL服务器名称、IP及运行实例名称查询方法咨询
获取PostgreSQL服务器信息及实例名称的方法
一、获取PostgreSQL所在服务器的名称与IP地址
PostgreSQL本身没有专门存储服务器系统名称和IP的内置元数据表,得通过调用系统命令或读取系统/配置文件来获取:
1. 服务器系统名称(机器名)
- Linux/Unix:如果数据库用户有足够权限,直接读取主机名文件:
或者安装SELECT pg_read_file('/etc/hostname') AS server_name;plsh扩展后执行系统命令:CREATE OR REPLACE FUNCTION get_server_name() RETURNS text AS $$ #!/bin/sh hostname $$ LANGUAGE plsh; SELECT get_server_name(); - Windows:用PL/Python读取系统环境变量(需先安装
plpythonu扩展):CREATE OR REPLACE FUNCTION get_server_name() RETURNS text AS $$ import os return os.environ['COMPUTERNAME'] $$ LANGUAGE plpythonu; SELECT get_server_name();
2. 服务器IP地址
要获取PostgreSQL服务监听的IP,直接查询配置项:
SELECT current_setting('listen_addresses') AS listening_ips;
如果要获取服务器所有网络接口的IP,得借助系统命令,比如Linux下用PL/Python执行ip addr:
CREATE OR REPLACE FUNCTION get_server_ips() RETURNS text AS $$ import subprocess result = subprocess.check_output(['ip', 'addr', 'show'], text=True) ips = [] for line in result.split('\n'): if 'inet ' in line and '127.0.0.1' not in line: ips.append(line.strip().split(' ')[1].split('/')[0]) return ', '.join(ips) $$ LANGUAGE plpythonu; SELECT get_server_ips();
二、获取服务器上运行的PostgreSQL实例名称
PostgreSQL里的“实例”指独立的数据库集群(每个集群有自己的数据目录、端口),没有内置的全局实例列表,可通过以下方式获取:
1. 当前连接的实例标识
如果是当前连接的实例,查询数据目录路径,通常路径的最后一段就是实例名(比如/var/lib/postgresql/14/test里的test):
SELECT current_setting('data_directory') AS instance_data_dir;
2. 枚举所有实例
- Linux/Unix:通过查找运行的PostgreSQL进程获取数据目录,或者直接遍历默认的数据目录:
或者直接读取默认目录下的实例文件夹:-- 用plsh获取所有实例的 data_directory CREATE OR REPLACE FUNCTION get_all_instances() RETURNS SETOF text AS $$ #!/bin/sh ps aux | grep postgres | grep -E '-D|--data-directory' | awk '{print $11}' $$ LANGUAGE plsh; SELECT get_all_instances();SELECT pg_ls_dir('/var/lib/postgresql/14/') AS instance_names; - Windows:查询Windows服务列表里的PostgreSQL服务名(比如
postgresql-x64-14-test中的test就是实例名),需先启用xp_cmdshell:sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE; SELECT * FROM xp_cmdshell('sc query type= service state= all | findstr "NAME:" | findstr "postgres"');
注意:以上方法大多需要超级用户权限,且部分扩展(如plpythonu、plsh)需要提前安装。
内容的提问来源于stack exchange,提问作者alaa
相关产品推荐
相关产品推荐

