直接用系统包管理器安装postgresql并配流复制更快更稳;主从同步必须用pg_basebackup初始化从库,手拷data目录或rsync会丢wal位点、缺recovery状态,99%启动失败。

直接用系统包管理器安装 PostgreSQL 并配流复制,比源码编译快、稳、少踩坑;主从同步必须用 pg_basebackup 初始化从库,手拷 data 目录或 rsync 会丢 WAL 位点、缺 recovery 状态,99% 启动失败。
用 apt/dnf/yum 装 PostgreSQL 服务端(别下源码)
除非你明确需要自定义编译选项(如启用 llvmjit 或离线部署),否则不要碰源码。官方仓库包已预编译好、自动建 postgres 用户、注册 systemd 服务、初始化默认集群,路径和权限都对。
- Ubuntu/Debian:
sudo apt update && sudo apt install postgresql-16 postgresql-16-contrib - CentOS/RHEL 8+:
sudo dnf install postgresql16-server postgresql16-contrib(先装 PGDG 仓库 rpm) - CentOS/RHEL 7:
sudo yum install postgresql16-server postgresql16-contrib(注意后缀带版本号)
装完不需手动 initdb —— 包管理器已帮你执行,数据目录通常在 /var/lib/pgsql/16/data 或 /var/lib/postgresql/16/main。
主库必须改的 4 个配置项(漏一个就同步失败)
postgresql.conf 里只开 listen_addresses = 'localhost' 是不够的:从库的 walreceiver 进程要 TCP 连主库拉 WAL,必须监听真实 IP 或 *;同时 WAL 级别、发送进程数、保留量全得配齐。
-
listen_addresses = '192.168.10.102,localhost'(填主库实际 IP,别写*生产环境) -
wal_level = replica(低于这个值无法启用流复制) -
max_wal_senders = 10(必须 ≥ 从库数量;设为 0 就等于关掉复制通道) -
wal_keep_size = 1GB(防止从库断连后主库回收 WAL,报requested WAL segment has already been removed)
改完不用 systemctl restart,sudo systemctl reload postgresql-16 即可生效 —— restart 会中断正在传输的 WAL 流。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
从库必须用 pg_basebackup 初始化(禁止 rsync / cp data)
手动拷贝 data 目录看似快,实则跳过一致性快照、WAL 起始位点校验、standby.signal 创建,大概率启动时报 could not locate a valid checkpoint record 或直接拒绝启动。
- 先在主库创建复制用户:
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'repl2026'; - 在从库机器上,以
postgres用户执行:pg_basebackup -h 192.168.10.102 -U replicator -D /var/lib/pgsql/16/data -P -R -X stream -C - 其中
-R自动生成standby.signal和更新postgresql.auto.conf(PG 12+ 不再用recovery.conf) -
-X stream表示边备份边接收 WAL,保证起点一致;没它,备份完再追 WAL 容易丢位点
执行前确认从库 data 目录为空,且属主是 postgres;执行后别改 postgresql.auto.conf 里的 primary_conninfo,那是 -C 自动写的。
pg_hba.conf 要分两行配,顺序和数据库名不能错
主库的 pg_hba.conf 必须同时放行两类连接:普通应用访问(走 all DB)和从库复制连接(走 replication 关键字 DB)。这两类规则不能混成一行,也不能颠倒顺序。
- 应用连接(主库写入):
host all all 0.0.0.0/0 scram-sha-256 - 从库复制(只允许指定 IP + 复制用户):
host replication replicator 192.168.10.103/32 scram-sha-256
注意:replication 是固定关键字,不是数据库名;写成 all 或 postgres 都无效。改完必须 pg_ctl reload -D /var/lib/pgsql/16/data 或 systemctl reload postgresql-16,不能只改文件不 reload。
最易被忽略的是:从库启动后,别只看 ps aux | grep postgres 有没有进程,要进 psql 查 select * from pg_stat_replication;(主库查)和 select pg_is_in_recovery();(从库查)—— 前者为空说明没连上主库,后者返回 f 说明根本没进 standby 模式。










