# 完成首次连通

LLMS 索引： [llms.txt](/llms.txt)

---

最后一步不是“能打开 psql”，而是从连接内部确认操作落点，并保存一份不泄露凭据的
baseline。第 1 章会在此基础上创建本书专用数据库、模式和角色。

## 0.3.1 找到服务端点、数据库与实验凭据 {#item-0-3-1}

### 五元连接身份

```text
host/service
port/route semantics
database
role
TLS/session parameters
```

默认单节点通常提供 `pg-meta` cluster、`meta` database 与管理/业务/只读角色；实际值
从你的 `pigsty.yml` 读取。该文件含 secret，只在受控终端查看，不把整行 URI 或密码
复制进 shell history、截图和文档。

首次连接可让 `psql` 单独提示密码：

```bash
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()` 与只读状态查询 {#item-0-3-2}

在 `psql`：

```sql
\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 与身份：

```sql
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`，不要解析展示
字符串。

### 保存去敏基线

```bash
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 {#item-0-3-3}

### locale/time/encoding

```sql
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 分开

当前数据库已安装：

```sql
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

```yaml
book_baseline:
  environment: pg36-l1
  production_data: false
  production_traffic: false
  pigsty_release: v4.5.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：

```text
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 全局地图](/postgresql-pigsty-map/)，在那里创建
`pg36_shop`，不要把默认 `meta` database 当作全书业务模型。

---

[上一节：安装单节点 Pigsty 沙箱](../02/) · [返回本章目录](../) ·
[进入第 1 章](/postgresql-pigsty-map/) ·
[查看全书目录](/toc/) · [查看索引中心](/indexes/)
