当前位置: 首页 > news >正文

Ubuntu 20.04 源码编译 PostgreSQL 实操手记

1. 项目概述:为什么在 Ubuntu 20.04 上亲手装 PostgreSQL 比“一键安装”更值得花这三小时

你刚配好一台 Ubuntu 20.04 的开发机,想搭个数据库跑本地服务,随手搜“ubuntu 安装postgresql”,前五条全是sudo apt install postgresql加两行配置就完事的教程。我试过——第一次照着做,第二天连psql命令都打不开;第三次重装,发现默认创建的postgres用户密码根本没设,连本地连接都报peer authentication failed;第四次用 Docker 拉镜像,结果业务要调用pgvector扩展,镜像里没编译,又得进容器手动装依赖、重编译……这些不是玄学,是 Ubuntu 20.04 + PostgreSQL 组合里埋得最深的三颗雷:系统级服务管理逻辑不透明、默认认证策略与开发者直觉相悖、扩展生态依赖链极长但文档从不提编译上下文

这篇内容就是为踩过这三颗雷的人写的。它不叫“PostgreSQL 安装教程”,而是一份Ubuntu 20.04 环境下 PostgreSQL 全生命周期实操手记——从源码编译(非 apt)、用户权限体系重建、pg_hba.conf认证规则逐行调试,到pgvector这类现代 AI 扩展的嵌入式编译,全部基于真实终端日志还原。你会看到我如何用strace跟踪psql连接失败时到底在读哪个 socket 文件,如何把pg_config输出的路径错位问题定位到LD_LIBRARY_PATH缺失,甚至怎么让systemctl status postgresql显示的不是“active (exited)”这种让人血压飙升的假状态。关键词PostgreSQLUbuntu 20.04установка(俄语“安装”)、использование(俄语“使用”)不是凑数的——它们对应着三个硬核动作:亲手编译安装(绕过 apt 的黑盒)、彻底理解服务启动机制(不是 systemctl start 就完事)、掌握生产级使用范式(从 psql 命令行到扩展集成)。适合正在 Ubuntu 20.04 上部署 Nacos、DBeaver 连接超时、或被maven artifact 'org.postgresql:postgresql:release' cannot be resolved卡住的 Java 开发者,也适合需要在群晖、树莓派等 ARM 设备上复现相同环境的运维同学。这不是教你怎么“能用”,而是教你怎么“知道为什么能用、为什么不能用、以及出问题时第一眼该看哪行日志”。

2. 核心设计思路:为什么放弃 apt,坚持源码编译?

2.1 Ubuntu 20.04 自带包的三大隐形陷阱

Ubuntu 20.04 官方仓库里的postgresql包版本是 12.18(截至 2024 年中),而当前稳定版已是 16.x。有人会说:“够用了”。但实际踩坑后你会发现,问题不在版本号本身,而在apt 包的构建方式与系统环境强耦合。我拆解过postgresql-12.deb包结构,关键发现有三点:

第一,二进制硬编码路径/usr/lib/postgresql/12/bin/postgres这个主进程二进制文件,在编译时就把--sysconfdir=/etc/postgresql--datadir=/var/lib/postgresql/12/main写死了。这意味着你无法通过环境变量临时切换数据目录——比如想把数据存到/mnt/ssd/pgdatainitdb -D /mnt/ssd/pgdata会成功,但systemctl start postgresql仍会去/var/lib/postgresql/12/main启动,因为postgresql@12-main.serviceExecStart指令直接调用/usr/lib/postgresql/12/bin/pg_ctl -D /var/lib/postgresql/12/main start,路径写死,改 service 文件只是治标。

第二,扩展模块缺失pgvectortimescaledbpostgis这些现代扩展,在 Ubuntu 仓库里要么没有,要么是独立包(如postgresql-12-postgis-3),但安装后CREATE EXTENSION vector;仍报extension "vector" does not exist。原因在于:apt 包的shared_preload_libraries默认为空,且postgresql.confextension相关参数全被注释。你得手动编辑至少 4 个文件(postgresql.confpg_hba.conf/etc/postgresql/12/main/conf.d/下新建配置、甚至/usr/share/postgresql/12/extension/目录权限),而源码编译时,make install-world会自动把所有扩展.so文件、.control描述文件、SQL 初始化脚本,按规范路径安装到$PREFIX/share/extension/$PREFIX/lib/,只要shared_preload_libraries配对,CREATE EXTENSION就能秒响应。

第三,调试符号完全剥离。当你遇到postgres进程崩溃,coredump里全是??符号,gdb无法回溯。apt 包默认不带 debuginfo,而源码编译时加-g参数,gdb /usr/local/pgsql/bin/postgres core能直接看到src/backend/utils/init/miscinit.c:245这一行触发了FATAL: data directory "/usr/local/pgsql/data" has wrong ownership—— 这种精度,是排障效率的分水岭。

提示:别信“apt 最省事”。在 Ubuntu 20.04 上,apt install postgresql实际执行的是apt install postgresql-12 postgresql-client-12 postgresql-contrib-12三个包,它们由不同维护者打包,contrib包里的pg_stat_statements扩展甚至可能因pg_config版本不一致而加载失败。源码编译是唯一能确保pg_config --versionpg_config --bindirpg_config --libdir全部指向同一构建产物的方式。

2.2 源码编译不是“炫技”,而是掌控权移交

选择源码编译,本质是把 PostgreSQL 的构建决策权从 Ubuntu 维护者手里拿回来。具体体现在四个可量化控制点:

  • CFLAGS 精细调优:Ubuntu 20.04 默认用 GCC 9.4,但 PostgreSQL 15+ 对-O3 -march=native敏感。我实测在 Intel i7-10875H 上,./configure CFLAGS="-O2 -march=haswell"比默认-O3启动快 12%,且内存占用低 8%。这个参数在 apt 包里是锁死的。
  • SSL 库绑定可控:Ubuntu 20.04 自带 OpenSSL 1.1.1f,但某些金融场景要求 FIPS 模式。源码编译时加--with-openssl --with-openssl-libraries=/usr/lib/x86_64-linux-gnu,就能强制链接系统 OpenSSL,避免 apt 包里可能混用 LibreSSL 的风险。
  • ICU 支持开关自由--with-icu参数决定是否启用 Unicode 排序规则。Ubuntu 20.04 的libicu-dev包版本是 66.1,而 PostgreSQL 15 要求 ICU >= 60.0,看似兼容,但icu-config --version输出的66.1-2ubuntu2末尾-2ubuntu2会导致configure脚本解析失败。源码编译时手动指定ICU_CONFIG=/usr/bin/icu-config,就能绕过这个字符串校验 bug。
  • Python 绑定版本锁定--with-python参数允许指定python3.8-config而非系统默认python3-config,这对需要plpython3u函数但又不想升级系统 Python 的场景至关重要——Ubuntu 20.04 的python3是 3.8.10,但某些机器手动装了 3.11,apt 包会混乱绑定。

所以,当网络热词里反复出现ubuntu postgresql 二进制安装postgresql源码安装,它们指向的不是“难易度差异”,而是生产环境容错能力的代差。apt 适合演示环境,源码编译才是交付环境的起点。

3. 实操全流程:从零开始编译、初始化、认证调试到扩展集成

3.1 环境准备:Ubuntu 20.04 的最小化依赖清单

Ubuntu 20.04 默认不装编译工具链,但很多人只装build-essential就以为万事大吉。这是个致命误区——PostgreSQL 源码里大量使用flex(词法分析器)和bison(语法分析器),而build-essential只包含gccg++make,不包含这两个。我第一次编译卡在src/backend/parser/Makefile,报错flex: command not found,查了半小时才发现缺flex。以下是经过验证的完整依赖命令:

sudo apt update && sudo apt install -y \ build-essential \ flex \ bison \ libreadline-dev \ zlib1g-dev \ libssl-dev \ libxml2-dev \ libxslt1-dev \ libpam0g-dev \ python3-dev \ pkg-config \ curl \ wget \ vim

重点解释三个易忽略项:

  • libreadline-dev:提供命令行历史编辑功能。没有它,psql里按方向键会输出^[[A这类乱码,无法上下翻阅历史 SQL。
  • libpam0g-dev:PAM(Pluggable Authentication Modules)开发头文件。这是后续配置pg_hba.conf使用pam认证方式的基础,比如对接 LDAP 或自定义 PAM 模块。
  • python3-dev:注意不是python3,而是带dev的开发包。它提供Python.h头文件和libpython3.8.so,否则--with-python会失败,plpython3u扩展无法编译。

注意:不要装postgresql-server-dev-all!这个包是给第三方扩展(如pgvector)编译用的,但它的pg_config指向的是 apt 安装的 PostgreSQL,和你即将编译的源码版冲突。我们会在pgvector章节单独处理。

3.2 源码获取与配置:为什么必须用--prefix且不能是/usr/local

PostgreSQL 官方下载页(https://www.postgresql.org/download/)提供源码 tarball,但直接wget https://ftp.postgresql.org/pub/source/v15.5/postgresql-15.5.tar.gz有风险——国内镜像同步延迟可能达 24 小时。更稳妥的方式是用curl -L加 GitHub Release API 获取最新版:

# 获取最新稳定版 URL(v15.5 为例) LATEST_URL=$(curl -s https://api.github.com/repos/postgres/postgres/releases/latest | \ grep "browser_download_url.*tar.gz" | cut -d '"' -f 4) wget "$LATEST_URL" tar -xzf postgresql-*.tar.gz cd postgresql-*/

配置阶段,./configure参数是核心。我推荐的最小安全集如下:

./configure \ --prefix=/opt/pgsql-15.5 \ --with-openssl \ --with-python \ --with-icu \ --with-system-tzdata=/usr/share/zoneinfo \ --enable-debug \ --enable-cassert \ CFLAGS="-O2 -march=haswell -g"

关键参数解析:

  • --prefix=/opt/pgsql-15.5绝对不要用/usr/local。Ubuntu 20.04 的/usr/localsnapdapt共享,权限混乱。/opt是 Linux 标准的“第三方软件安装目录”,/opt/pgsql-15.5路径清晰表明版本,便于多版本共存(如/opt/pgsql-14.9)。
  • --with-system-tzdata:Ubuntu 20.04 的时区数据在/usr/share/zoneinfo,但 PostgreSQL 源码默认用内置 tzdata。显式指定,避免SELECT now();返回时间比系统快 8 小时的诡异问题。
  • --enable-debug--enable-cassert:开启调试符号和断言检查。断言失败时会打印Assertion failed: (xxx), file xxx.c, line yyy,这是定位逻辑错误的黄金线索。

执行./configure后,务必检查最后几行输出:

... checking for library containing getaddrinfo... none required checking for library containing dlopen... -ldl checking for library containing clock_gettime... -lrt ... PostgreSQL installation directory: /opt/pgsql-15.5 ...

如果看到PostgreSQL installation directory: /usr/local/pgsql,说明--prefix没生效,立即make distclean重来。

3.3 编译与安装:make worldmake install-world的区别

很多人只执行make && make install,这只能编译核心数据库,不包括contrib扩展(如pg_stat_statementshstore)。正确流程是:

# 第一步:并行编译(-j$(nproc) 利用所有 CPU 核心) make -j$(nproc) # 第二步:运行测试套件(可选但强烈推荐) make check-world # 第三步:安装全部(核心 + contrib + docs) sudo make install-world

make check-world是精华所在。它会启动一个临时 PostgreSQL 实例,运行 200+ 个测试用例,覆盖 SQL 解析、事务隔离、复制协议等。我曾在 AMD Ryzen 9 5900X 上跑make check-world,发现isolation测试组里serializable用例失败,追查后是内核vm.swappiness=60导致内存压力测试误报——这比上线后遇到序列化异常好一万倍。

安装完成后,验证路径:

/opt/pgsql-15.5/bin/pg_config --version # 应输出 15.5 /opt/pgsql-15.5/bin/pg_config --bindir # 应输出 /opt/pgsql-15.5/bin ls /opt/pgsql-15.5/share/extension/ | grep vector # 此时应为空,pgvector 需单独编译

3.4 初始化与服务注册:绕过systemctl enable postgresql的陷阱

make install-world只装二进制,不创建数据目录,也不注册 systemd 服务。很多教程教sudo pg_createcluster 15 main --start,但这是postgresql-common包的命令,专为 apt 包设计,和源码版不兼容。我们必须手动初始化:

# 创建专用用户(不推荐用 root 或当前用户) sudo useradd -r -m -d /opt/pgsql-15.5/data -s /bin/bash postgres sudo chown -R postgres:postgres /opt/pgsql-15.5 # 切换用户初始化 sudo -u postgres /opt/pgsql-15.5/bin/initdb \ -D /opt/pgsql-15.5/data \ -E UTF8 \ --locale=C.UTF-8 \ -U postgres

参数说明:

  • -D /opt/pgsql-15.5/data:数据目录,必须和--prefix分离,便于备份迁移。
  • --locale=C.UTF-8关键!Ubuntu 20.04 的en_US.UTF-8locale 在某些 glibc 版本下有排序 bug,C.UTF-8是 POSIX 兼容的 UTF-8 locale,最稳定。
  • -U postgres:指定超级用户,名字必须是postgres,这是 PostgreSQL 的硬编码约定,改名会导致psql -U myuser连不上。

初始化后,编辑/opt/pgsql-15.5/data/postgresql.conf

# 关键三行(取消注释并修改) listen_addresses = 'localhost' # 仅监听本地,生产环境加 '127.0.0.1,::1' port = 5432 max_connections = 100 # 日志相关(必开,否则出问题找不到日志) logging_collector = on log_directory = 'pg_log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_statement = 'all' # 开发期记录所有 SQL,上线后改为 'ddl'

然后创建 systemd 服务文件/etc/systemd/system/postgresql-15.5.service

[Unit] Description=PostgreSQL 15.5 Database Server Documentation=https://www.postgresql.org/docs/15/ After=network.target [Service] Type=notify User=postgres Group=postgres Environment=PGDATA=/opt/pgsql-15.5/data ExecStart=/opt/pgsql-15.5/bin/pg_ctl start -D ${PGDATA} -s -w -t 300 ExecStop=/opt/pgsql-15.5/bin/pg_ctl stop -D ${PGDATA} -s -m fast Restart=on-failure RestartSec=30 TimeoutSec=300 [Install] WantedBy=multi-user.target

注意:Type=notify是精髓。PostgreSQL 15+ 支持pg_ctl发送sd_notify信号给 systemd,这样systemctl status postgresql-15.5才会显示active (running)而非active (exited)。旧教程用Type=simplepg_ctl启动后立即返回,systemd 认为服务已退出。

启用并启动:

sudo systemctl daemon-reload sudo systemctl enable postgresql-15.5 sudo systemctl start postgresql-15.5 sudo systemctl status postgresql-15.5 # 应显示 active (running)

3.5 认证调试:pg_hba.conf的七层地狱与peer认证真相

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"—— 这是 Ubuntu 20.04 上最高频的报错。根源在于pg_hba.conf的默认规则和 Ubuntu 的peer认证机制。

pg_hba.conf是 PostgreSQL 的防火墙,每行格式:TYPE DATABASE USER ADDRESS METHOD。Ubuntu 20.04 源码编译后,默认pg_hba.conf只有两行:

local all all peer host all all 127.0.0.1/32 md5

问题出在第一行local all all peerlocal表示 Unix domain socket 连接(即psql不加-h参数时走的路径),peer认证要求操作系统用户名必须和数据库用户名完全一致。所以psql -U postgres失败,是因为你当前 shell 是ubuntu用户,而peer要求 OS 用户也是postgres

解决方案有三,按推荐度排序:

方案一(推荐):改pg_hba.conf,允许ubuntu用户本地免密登录

# 在原有 local 行上方插入(顺序很重要!) local all ubuntu trust # 然后注释或删除原 local 行 # local all all peer

trust表示无条件信任,适合开发机。重启服务后,sudo -u ubuntu psql -U postgres即可进入。

方案二:用ident认证映射 OS 用户

local all all ident map=ubuntu-to-postgres

并在pg_ident.conf添加:

ubuntu-to-postgres ubuntu postgres

这样ubuntu用户连接时,被映射为postgres数据库用户。

方案三(生产环境):强制走 TCP,用md5密码

# 注释 local 行,只留 host # local all all peer host all all 127.0.0.1/32 md5 host all all ::1/128 md5

然后为postgres用户设密码:

sudo -u postgres /opt/pgsql-15.5/bin/psql -c "ALTER USER postgres PASSWORD 'mysecretpass';"

再用psql -h 127.0.0.1 -U postgres连接。

实操心得:pg_hba.conf修改后,必须sudo systemctl reload postgresql-15.5(不是 restart),因为reload会发送SIGHUP信号让 postmaster 重新读取配置,而restart会中断所有连接。我曾因用restart导致正在跑的pg_dump中断,浪费 2 小时重跑。

3.6 扩展集成:pgvector的嵌入式编译与CREATE EXTENSION成功秘诀

网络热词docker postgresql怎么添加 pgvector扩展postgresql安装到群辉给我详细步骤,本质都是问“如何在非标准环境装扩展”。pgvector是典型——它不随 PostgreSQL 源码发布,需单独编译。

步骤:

# 1. 克隆 pgvector(注意分支匹配 PostgreSQL 版本) git clone https://github.com/pgvector/pgvector.git cd pgvector git checkout v0.5.1 # 对应 PostgreSQL 15.x # 2. 设置 pg_config 路径(关键!) export PATH="/opt/pgsql-15.5/bin:$PATH" which pg_config # 应输出 /opt/pgsql-15.5/bin/pg_config # 3. 编译安装(无需 configure,直接 make) make sudo make install # 4. 验证 .so 文件位置 ls /opt/pgsql-15.5/lib/ | grep vector # 应有 vector.so ls /opt/pgsql-15.5/share/extension/ | grep vector # 应有 vector.control, vector--0.5.1.sql

此时CREATE EXTENSION vector;仍可能失败,因为shared_preload_libraries未加载。编辑/opt/pgsql-15.5/data/postgresql.conf

# 在文件末尾添加 shared_preload_libraries = 'vector'

然后sudo systemctl reload postgresql-15.5

最后,在psql里执行:

-- 连接到目标数据库(不是 template1) \c mydb CREATE EXTENSION vector; -- 验证 SELECT * FROM pg_extension WHERE extname = 'vector';

常见问题:如果报错could not open extension control file "/opt/pgsql-15.5/share/extension/vector.control": No such file or directory,说明make install没把.control文件拷过去。检查pgvector/Makefile里的EXTENSION_DIR是否指向正确路径,或手动拷贝:

sudo cp /path/to/pgvector/vector.control /opt/pgsql-15.5/share/extension/ sudo cp /path/to/pgvector/sql/vector--0.5.1.sql /opt/pgsql-15.5/share/extension/

4. 常见问题与排查技巧实录:来自 17 次重装的血泪笔记

4.1 连接类问题速查表

现象根本原因排查命令修复方案
psql: error: could not connect to server: No such file or directoryUnix socket 文件不存在ls -l /var/run/postgresql/检查postgresql.confunix_socket_directories(默认/var/run/postgresql),确认postgres用户对该目录有写权限
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refusedpostmaster 进程未监听 TCPsudo netstat -tlnp | grep :5432检查postgresql.conflisten_addressesport,确认systemctl status显示active (running)
FATAL: password authentication failed for user "postgres"密码错误或pg_hba.conf规则不匹配sudo tail -20 /opt/pgsql-15.5/data/pg_log/postgresql-*.log查日志末尾的authentication failed行,看匹配了哪条pg_hba.conf规则;用psql -U postgres -h 127.0.0.1强制走 TCP
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failedsocket 路径错误(Ubuntu 20.04 默认用/var/run/postgresqlpsql --help | grep socketpsql -h /var/run/postgresql指定路径,或在~/.psqlrc添加\set HOST /var/run/postgresql

4.2 权限与路径类问题

  • 问题initdb报错The data directory must be empty,但ls /opt/pgsql-15.5/data显示为空。
    原因/opt/pgsql-15.5/data目录本身被root拥有,postgres用户无写权限。
    解决sudo chown -R postgres:postgres /opt/pgsql-15.5/data,再sudo -u postgres initdb

  • 问题systemctl start postgresql-15.5status显示active (exited),且ps aux \| grep postgres无进程。
    原因Type=notifypg_ctl未正确发送通知,或pg_ctl路径错误。
    解决:手动执行sudo -u postgres /opt/pgsql-15.5/bin/pg_ctl start -D /opt/pgsql-15.5/data -l /tmp/pglog,看/tmp/pglog输出的错误。常见是pg_hba.conf语法错误,pg_ctl启动失败后静默退出。

  • 问题CREATE EXTENSION vector;报错function "vector_in" does not exist
    原因pgvector编译时pg_config指向了旧版本,导致.so文件链接了错误的libpq
    解决ldd /opt/pgsql-15.5/lib/vector.so \| grep pq,确认链接的是/opt/pgsql-15.5/lib/libpq.so,不是/usr/lib/x86_64-linux-gnu/libpq.so。若错误,重新make clean && make PG_CONFIG=/opt/pgsql-15.5/bin/pg_config

4.3 性能与日志类技巧

  • 日志精确定位log_statement = 'all'会产生海量日志。更高效的方式是动态开启:

    -- 只对当前会话记录所有 SQL SET log_statement = 'all'; -- 执行可疑 SQL SELECT * FROM huge_table WHERE condition; -- 关闭 RESET log_statement;
  • 慢查询抓取:在postgresql.conf中加:

    log_min_duration_statement = 1000 # 记录 >1 秒的查询 log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '

    这样日志每行开头是2024-06-15 14:23:45 CST [12345]: [1-1] user=postgres,db=mydb,app=psql,client=[local],可直接用grep "mydb" /opt/pgsql-15.5/data/pg_log/*.log \| awk '{print $1,$2,$NF}'快速提取耗时。

  • 内存泄漏初筛ps aux --sort=-%mem \| head -10,如果postgres进程 RSS 持续增长,可能是work_mem设置过高。Ubuntu 20.04 默认work_mem = 4MB,对于复杂 JOIN 可能不足,但设到64MB以上,100 个连接就会吃光 6GB 内存。建议公式:work_mem = (RAM * 0.25) / max_connections,例如 16GB RAM、max_connections=100,则work_mem = 40960kB

5. 生产就绪检查清单:从开发机到交付环境的最后十步

完成上述步骤后,你的 PostgreSQL 已可用,但距离生产就绪还差关键十步。这是我在金融、IoT 项目中沉淀的 checklist,每一条都源于线上事故:

  1. 备份策略验证:执行一次pg_dump -U postgres -F c -b -v -f /tmp/mydb.backup mydb,然后pg_restore -U postgres -d mydb_test /tmp/mydb.backup,确认恢复后数据一致。-F c(custom format)支持并行恢复,-b(blobs)确保大对象不丢。
  2. 连接池预热:在应用启动前,用pgbench -i -s 10 mydb初始化测试数据,再pgbench -c 20 -j 4 -t 100 mydb模拟 20 连接压测,观察pg_stat_activity是否有idle in transaction残留。
  3. SSL 强制启用:生成自签名证书openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=localhost"chmod 600 server.key,在postgresql.confssl = onssl_cert_file = 'server.crt'ssl_key_file = 'server.key'
  4. 监控端点暴露:安装pg_exporter(Prometheus exporter),curl http://localhost:9187/metrics \| grep pg_up,确认pg_up 1。这是 SRE 团队接入统一监控的前提。
  5. 时区全局校验psql -c "SHOW timezone;"date命令输出对比,必须一致。不一致会导致now()clock_timestamp()时间差,引发定时任务错乱。
  6. 大页内存启用sudo sysctl vm.nr_hugepages=128,然后在postgresql.confhuge_pages = on。Ubuntu 20.04 内核支持,可降低 TLB miss,TPC-C 测试提升 8%。
  7. 审计日志开关sudo apt install postgresql-contrib-12(即使不用 apt 主包,pgaudit扩展需此包),然后CREATE EXTENSION pgaudit;SET pgaudit.log = 'write, ddl';,满足等保三级要求。
  8. 连接数硬限制sudo systemctl set-property postgresql-15.5.service LimitNOFILE=65536,避免Too many open files错误。
  9. 自动故障转移预案:用repmgr配置双节点,repmgr standby clone -h primary-hostrepmgr standby startrepmgr cluster show确认状态。单节点永远不是生产环境。
  10. 灾难恢复演练:拔掉主库网线,确认repmgr在 30 秒内完成 failover,应用连接新主库无报错。这是 SLA 的底线。

我个人在实际操作中的体会是:PostgreSQL 的强大,90% 体现在它出问题时给你足够多的线索,而不是不出问题pg_log里的每一行LOG:WARNING:ERROR:都是精确的手术刀标记,pg_stat_*视图是实时的血管造影。Ubuntu 20.04 的稳定内核和 PostgreSQL 的严谨设计,组合起来不是“能跑就行”,而是“出了问题,你能 5 分钟内定位到第 3 行代码”。那些热词里反复出现的postgresql安装教程postgresql使用,真正价值不在“怎么装”,而在“装完之后,你敢不敢把它放在生产流量前面”。

http://www.cnnetsun.cn/news/2990084.html

相关文章:

  • Shipyard 2.0.10 在 CoreOS 上的 TLS 部署本质是技术债陷阱
  • Object.getOwnPropertyDescriptors:解决getter/setter丢失的深拷贝关键
  • Kimi K2.6 + Hermes:构建稳定可控的中文多Agent协作系统
  • VR-Reversal:零成本将3D视频转换为交互式2D体验的终极指南
  • 2026免费录音转文字工具保姆级教程:电脑手机都能用,无付费限制
  • 一文讲透所有主流AI模型:GPT、Claude、Gemini、Grok、DeepSeek到底怎么选?
  • 3步诊断与修复:解决macOS升级后Mac Mouse Fix鼠标侧键失效问题
  • Vela Jr.超新星遗迹的伽马射线辐射机制研究
  • 怪物猎人世界玩家的终极狩猎助手:HunterPie实战指南
  • Carbon:PHP 开发者的日期时间工具箱
  • Windows系统文件danim.dll丢失找不到问题解决
  • OpenClaw:Android终端号码显示层隐私保护SDK原理与实践
  • Spring AI入门:Java开发者的大模型集成实践指南
  • 直流母线电压恢复的二次控制策略 直流微网中采用虚拟压降补偿 并联双向Buck-boost研究(Simulink仿真实现)
  • 本地部署大模型接入业务系统:硬件适配、API契约与RAG集成实战
  • 智能告警降噪:从告警洪流到精准触达的算法与工程实践
  • 手搓Claude Code式AI Agent:可审计、可隔离、可进化的智能工作流
  • Claude Code本地部署实战:vLLM+llama.cpp双后端配置指南
  • QKeyMapper坐标映射:三步实现屏幕精准点击,告别重复操作烦恼
  • 豆包在抖音生态中的实战应用场景大纲
  • PowerPC e600指令时序与流水线优化实战指南
  • 如何免费升级旧Mac:OpenCore Legacy Patcher终极完整指南
  • 如何用TV Bro智能电视浏览器彻底改变你的大屏上网体验:终极指南
  • 2026年度华南地区办公室家具市场趋势分析:五大品牌评测与采购要点
  • 无名杀:开源三国杀网页版终极体验指南
  • 如何用Video2X将低清视频无损放大到4K:免费AI视频增强完整指南
  • Vortex模组管理器终极指南:让游戏模组管理变得简单而高效
  • 2026年腾讯云 618 活动介绍及 Hermes Agent/OpenClaw配置Token Plan搭建新手友好
  • 同态加密神经网络推理优化:从算法轻量化到GPU加速的高并发实践
  • uni-app 跨平台开发从入门到精通:原理剖析、工程实战与性能优化全指南