ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PostgreSQL WAL 工具更名陷阱:解决 pg_receivexlog 找不到的问题及替代方案

PostgreSQL WAL 工具更名陷阱:解决 pg_receivexlog 找不到的问题及替代方案 你提到的是 PostgreSQL 附录废弃或更名的特性 (AppendixObsolete or Renamed Features) 中关于pg_receivexlog更名为pg_receivewal的内容。这个变化是与 PostgreSQL 的术语更新相关的主要是为了保持一致性。在 PostgreSQL 9.6 版本中官方将 Write-Ahead Log (WAL) 相关的术语进行了统一。旧术语XLog (eXtended Log)新术语WAL (Write-Ahead Log)因此许多包含xlog的工具和配置参数都被更名以使用wal其中就包括了pg_receivexlog。如果你在使用较新的 PostgreSQL 版本如 10 及更高版本时仍尝试使用旧的pg_receivexlog命令你可能会遇到以下问题这是最直接的问题系统会提示找不到名为pg_receivexlog的程序。$ pg_receivexlog -D /data/wal_archive -S replication_slot_name bash: pg_receivexlog: command not found只需将命令名替换为新的pg_receivewal即可。$ pg_receivewal -D /data/wal_archive -S replication_slot_name如果你有一个用于流复制或备份的 Shell 脚本或 自动化程序它是为 PostgreSQL 9.5 或更早版本编写的那么在较新的服务器上运行时就会失败。脚本中的核心命令如下# archive_wal.sh # ... other setup commands ... pg_receivexlog -h primary_server -p 5432 -U replicator -D /mnt/wal_storage # ...在执行脚本时会中断并报错。为了让你的脚本在不同版本的 PostgreSQL 上都能工作你可以编写一个逻辑来检查哪个命令可用。说明假设你的环境将 PostgreSQL 的bin目录添加到了$PATH环境变量中并且which命令可用。#!/bin/bash # 1. 检查 pg_receivewal 是否存在 (PostgreSQL 10) COMMAND$(which pg_receivewal 2/dev/null) if [ -z $COMMAND ]; then # 2. 如果 pg_receivewal 不存在则检查 pg_receivexlog (PostgreSQL 9.6-) COMMAND$(which pg_receivexlog 2/dev/null) if [ -z $COMMAND ]; then echo 错误找不到 pg_receivewal 或 pg_receivexlog 命令。 2 exit 1 fi echo 注意正在使用旧版命令 pg_receivexlog else echo 使用新版命令 pg_receivewal fi # 3. 执行命令 # 注意使用 $COMMAND 变量来运行找到的命令 $COMMAND -h primary_server -p 5432 -U replicator -D /mnt/wal_storage旧命令 (Old Command)新命令 (New Command)首次更名版本 (First Renamed Version)用途 (Purpose)pg_receivexlogpg_receivewalPostgreSQL 10从主服务器流式接收 WAL 数据用于归档或备机复制。最佳实践如果你的目标环境是 PostgreSQL 10 或更高版本请始终使用pg_receivewal。术语理解在阅读新版 PostgreSQL 文档或配置参数时记住 WAL (Write-Ahead Log) 是标准的术语。
返回列表