基于Bash自动化实现PostgreSQL主从复制的实战指南

 更新时间:2026年03月06日 08:40:57   作者:ElioXu  
文章介绍了基于Bash自动化实现PostgreSQL主从复制的步骤,适用于Ubuntu/Debian系统,适用于PostgreSQL 16/17版本,脚本自动识别版本、配置主从库,并详细解析了脚本逻辑和参数,需要的朋友可以参考下

基于 Bash 自动化实现 PostgreSQL 主从复制
支持 Ubuntu / Debian 系统(APT)
适用于 PostgreSQL 16 / 17 最新版本

一、PostgreSQL 主从架构原理

PostgreSQL 主从复制(Streaming Replication)工作流程:

  1. 主库写入数据
  2. 生成 WAL 日志
  3. 从库实时拉取 WAL
  4. 重放日志实现数据同步

简单理解:

主库负责写入
从库负责读取 + 数据备份

适合:

  • 读写分离
  • 数据容灾
  • 高可用架构基础

二、架构流程图(Mermaid)

flowchart LR
    A[Client 写入] --> B[Primary 主库]
    B --> C[生成 WAL 日志]
    C --> D[Replica 从库]
    D --> E[重放 WAL 同步数据]

三、自动化部署脚本

#!/bin/bash

PRIMARY_IP="192.168.1.10"
REPLICA_IP="192.168.1.11"
REPL_USER="repl_user"
REPL_PASS="YourStrongPassword"

set -e

echo "=== PostgreSQL 一主一从自动化部署脚本 ==="
echo "1. 安装并配置为主库 (Primary)"
echo "2. 安装并配置为从库 (Replica)"
read -p "请选择模式 (1/2): " MODE

sudo apt update
sudo apt install -y postgresql postgresql-contrib

PG_VER=$(psql --version | grep -oE '[0-9]+' | head -1)
DATA_DIR="/var/lib/postgresql/$PG_VER/main"
CONF_DIR="/etc/postgresql/$PG_VER/main"

if [ "$MODE" == "1" ]; then

    sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/ " $CONF_DIR/postgresql.conf

    sudo -u postgres psql -c "CREATE ROLE $REPL_USER WITH REPLICATION LOGIN ENCRYPTED PASSWORD '$REPL_PASS';"

    echo "host replication $REPL_USER $REPLICA_IP/32 md5" | sudo tee -a $CONF_DIR/pg_hba.conf

    sudo systemctl restart postgresql

elif [ "$MODE" == "2" ]; then

    sudo systemctl stop postgresql
    sudo rm -rf $DATA_DIR/*

    sudo -u postgres PGPASSWORD=$REPL_PASS pg_basebackup \
        -h $PRIMARY_IP \
        -D $DATA_DIR \
        -U $REPL_USER \
        -v -P -R \
        --slot=replica_slot_1 -C

    sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/ " $CONF_DIR/postgresql.conf

    sudo systemctl start postgresql

else
    echo "无效选项"
    exit 1
fi

sudo systemctl status postgresql --no-pager

四、脚本逻辑逐步解析

1️⃣ set -e 的作用

set -e

作用:

一旦有命令执行失败,脚本立即退出

防止错误被忽略。

2️⃣ 自动识别 PostgreSQL 版本

PG_VER=$(psql --version | grep -oE '[0-9]+' | head -1)

作用:

自动匹配安装版本路径,例如:

/var/lib/postgresql/16/main

避免写死版本号。

3️⃣ 主库模式做了什么?

✔ 开启监听所有 IP
✔ 创建复制账号
✔ 修改 pg_hba.conf 允许从库连接
✔ 重启数据库

核心:

CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'xxx';

4️⃣ 从库模式做了什么?

✔ 停止数据库
✔ 删除旧数据目录
✔ 执行 pg_basebackup 拉取数据
✔ 自动生成 standby.signal 文件

五、pg_basebackup 参数详解

pg_basebackup -h 主库IP -D 数据目录 -U 用户 -v -P -R --slot=replica_slot_1 -C
参数作用
-h主库地址
-D数据存放目录
-U复制账号
-v显示详细日志
-P显示进度条
-R自动生成恢复配置
--slot使用复制槽
-C自动创建复制槽

六、生产环境注意事项

1. 必须放通 5432 端口

检查:

ufw status

2. 复制槽风险

如果从库长期宕机:

主库 WAL 会堆积

可能导致磁盘爆满。

建议:

定期检查:

SELECT * FROM pg_replication_slots;

3. 主库参数建议调整

在 postgresql.conf 中增加:

wal_level = replica
max_wal_senders = 10
max_replication_slots = 10

七、验证主从是否成功

主库执行:

SELECT * FROM pg_stat_replication;

看到状态为:

streaming

说明正常。

从库执行:

SELECT pg_is_in_recovery();

返回:

t

说明当前为从库状态。

总结

这套脚本适用于:

  • 内网双机部署
  • 实验环境
  • 小型生产环境

以上就是基于Bash自动化实现PostgreSQL主从复制的实战指南的详细内容,更多关于Bash PostgreSQL主从复制的资料请关注脚本之家其它相关文章!

相关文章

  • PostgreSQL的generate_series()函数的用法说明

    PostgreSQL的generate_series()函数的用法说明

    这篇文章主要介绍了PostgreSQL的generate_series()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL中MVCC 机制的实现

    PostgreSQL中MVCC 机制的实现

    本文主要介绍了PostgreSQL中MVCC 机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下
    2025-06-06
  • 浅谈PostgreSQL中大小写不敏感问题

    浅谈PostgreSQL中大小写不敏感问题

    这篇文章主要介绍了浅谈PostgreSQL中大小写不敏感问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql查询每个月的最后一天日期并对未查到的日期结果补0(操作示例)

    postgresql查询每个月的最后一天日期并对未查到的日期结果补0(操作示例)

    这篇文章主要介绍了postgresql查询每个月的最后一天日期,并对未查到的日期结果补0,pgsql需要使用函数使用date_trunc()函数找到指定月第一天,然后对该日期先加一个月在减一个月就能得到你传给的日期的最后一天日期,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • PostgreSQL设置主键自增的方法详解

    PostgreSQL设置主键自增的方法详解

    在使用Mysql时,创建表结构时可以通过关键字auto_increment来指定主键是否自增,但在Postgresql数据库中,虽然可以实现字段的自增,但从本质上来说却并不支持Mysql那样的自增,所以本文给大家介绍了PostgreSQL如何设置主键自增,需要的朋友可以参考下
    2024-08-08
  • PostgreSQL 删除check约束的实现

    PostgreSQL 删除check约束的实现

    这篇文章主要介绍了PostgreSQL 删除check约束的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • postgresql 修改字段长度的操作

    postgresql 修改字段长度的操作

    这篇文章主要介绍了postgresql 修改字段长度的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL教程(十五):系统表详解

    PostgreSQL教程(十五):系统表详解

    这篇文章主要介绍了PostgreSQL教程(十五):系统表详解,本文讲解了pg_class、pg_attribute、pg_attrdef、pg_authid、pg_auth_members、pg_constraint、pg_tablespace、pg_namespace、pg_database等表的作用和字段介绍,需要的朋友可以参考下
    2015-05-05
  • PostgreSQL psql 常用命令总结

    PostgreSQL psql 常用命令总结

    psql是PostgreSQL的一个命令行交互式客户端工具,它具有非常丰富的功能,类似于Oracle的命令行工具sqlplus,本文给大家总结下PostgreSQL 中常用 psql 常用命令以便后续查阅,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • postgresql插入后返回id的操作

    postgresql插入后返回id的操作

    这篇文章主要介绍了postgresql插入后返回id的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论