0.3 完成首次连通
最后一步不是“能打开 psql”,而是从连接内部确认操作落点,并保存一份不泄露凭据的 baseline。第 1 章会在此基础上创建本书专用数据库、模式和角色。
0.3.1 找到服务端点、数据库与实验凭据
五元连接身份
host/service
port/route semantics
database
role
TLS/session parameters默认单节点通常提供 pg-meta cluster、meta database 与管理/业务/只读角色;实际值
从你的 pigsty.yml 读取。该文件含 secret,只在受控终端查看,不把整行 URI 或密码
复制进 shell history、截图和文档。
首次连接可让 psql 单独提示密码:
psql -h 127.0.0.1 -p 5432 -U dbuser_dba -d meta -W不要把密码写在命令行 URI。需要非交互任务时使用 mode 0600 的 .pgpass、service
file 或组织 secret injection,并确保日志不打印环境。
先直连,后比较 service
先用 5432 直连确认 PostgreSQL,再按本地配置比较 6432/5433/5436。对每个 endpoint 执行同一 identity query,记录它是否经过 pool、route 到哪个 backend、支持什么会话 状态。不要把“端口可连”推断成“读写语义正确”。
常见失败
| 症状 | 首查 | 不要先做 |
|---|---|---|
| connection refused | host/port/listener/unit | 放开全部 firewall |
| timeout | route/security group/监听地址 | 重启所有组件 |
| password failed | exact role、HBA、secret source | 把密码打印到日志 |
| database missing | database identity/inventory | 连默认库后误以为成功 |
| read-only | endpoint 与 pg_is_in_recovery() | 强行改 transaction_read_only |
0.3.2 执行 SELECT version() 与只读状态查询
在 psql:
\set ON_ERROR_STOP on
\pset pager off
SELECT
current_setting('server_version') AS server_version,
current_setting('server_version_num') AS server_version_num,
current_database() AS database,
current_user AS role,
session_user,
inet_server_addr() AS server_addr,
inet_server_port() AS server_port,
pg_is_in_recovery() AS in_recovery;
SELECT
current_setting('transaction_read_only') AS transaction_read_only,
current_setting('default_transaction_read_only')
AS default_transaction_read_only;Unix socket 连接时 inet_server_addr()/inet_server_port() 可以是 NULL,这是 transport
语义,不是 PostgreSQL 缺地址。service endpoint 可能返回 backend instance 地址,
不等于客户端连接的 HAProxy 地址。
再检查 search path 与身份:
SHOW search_path;
SELECT current_schemas(true);
SELECT
pg_catalog.pg_has_role(current_user, 'USAGE') AS current_role_usable;version() 包含 build 信息,适合证据;程序判断用 server_version_num,不要解析展示
字符串。
保存去敏基线
psql -X -v ON_ERROR_STOP=1 \
-h 127.0.0.1 -p 5432 -U dbuser_dba -d meta \
-A -F $'\\t' -t \
-c \"SELECT current_setting('server_version_num'),
current_database(), current_user,
coalesce(inet_server_addr()::text, 'unix-socket'),
coalesce(inet_server_port()::text, 'unix-socket'),
pg_is_in_recovery();\" \
> pg36-l1-identity.tsv该输出不含 password;仍按内部环境资料保护 host/role。检查退出码与文件非空,不要因 redirect 创建空文件就认为成功。
0.3.3 确认编码、时区和扩展清单后进入 ch01
locale/time/encoding
SELECT
datname,
pg_encoding_to_char(encoding) AS encoding,
datlocprovider,
datcollate,
datctype
FROM pg_catalog.pg_database
WHERE datname = current_database();
SHOW TimeZone;
SHOW DateStyle;
SELECT
now() AS transaction_time,
statement_timestamp() AS statement_time,
clock_timestamp() AS wall_time;后续时间、collation、索引和升级实验依赖这些事实。不要为了“统一”直接修改 cluster; 先记录差异,在对应章节决定是否需要重建或迁移。
installed 与 available extension 分开
当前数据库已安装:
SELECT
extname,
extversion,
extnamespace::pg_catalog.regnamespace AS schema
FROM pg_catalog.pg_extension
ORDER BY extname;操作系统/仓库可提供但未安装的扩展是另一集合,不能用
pg_available_extensions 冒充 installed。扩展是 database-local object;同一
instance 的另一 database 不会自动继承。
最终 baseline
book_baseline:
environment: pg36-l1
production_data: false
production_traffic: false
pigsty_release: v4.4.0
pig_cli: ...
postgresql_server: ...
os_kernel_arch: ...
cluster_database_role: ...
connection_endpoint: ...
encoding_locale_timezone: ...
installed_extensions: [...]
monitoring_observed_at: ...
secret_values_recorded: false进入 ch01 的 gate:
identity query succeeds
server major = 18, exact minor recorded
database and role are expected
L1 is writable and not in recovery
encoding/timezone/collation recorded
installed extension list recorded
monitoring has current target data
no production data/traffic or exposed management endpoint不满足时留在第 0 章修环境。满足后进入
第 1 章:PostgreSQL 与 Pigsty 全局地图,在那里创建
pg36_shop,不要把默认 meta database 当作全书业务模型。
上一节:安装单节点 Pigsty 沙箱 · 返回本章目录 · 进入第 1 章 · 查看全书目录 · 查看索引中心