跳至内容
0.3 完成首次连通

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 refusedhost/port/listener/unit放开全部 firewall
timeoutroute/security group/监听地址重启所有组件
password failedexact role、HBA、secret source把密码打印到日志
database missingdatabase identity/inventory连默认库后误以为成功
read-onlyendpoint 与 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 章 · 查看全书目录 · 查看索引中心

最后更新于