docker postgresql17 主从复制

//启动主库容器
sudo docker run -d  --name postgres -e TZ=Asia/Shanghai -e POSTGRES_USER=dev  -e POSTGRES_PASSWORD=testPassword --restart always -p 5432:5432 -v /server/db/pg/data:/var/lib/postgresql/data postgres:17.5

//创建复制专用账号
sudo docker exec -it postgres psql -U dev  -c "CREATE USER replicator WITH REPLICATION LOGIN PASSWORD 'testPassword';"

//修改 pg_hba.conf,放行复制连接
//docker exec postgres sh -c 'echo "host replication replicator 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf'
docker exec -it pg-primary bash
# 容器内执行:
echo "host replication replicator 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf
exit


//打开 WAL 流复制参数
docker exec postgres  psql -U dev  -c "ALTER SYSTEM SET wal_level = 'replica';"
docker exec postgres  psql -U dev  -c "ALTER SYSTEM SET max_wal_senders = 10;"
docker exec postgres  psql -U dev  -c "ALTER SYSTEM SET max_replication_slots = 10;"
docker exec postgres  psql -U dev   -c "ALTER SYSTEM SET hot_standby = 'on';"

//启主库让 WAL level 生效
docker restart postgres 


//创建从库的文件目录
mkdir /server/db/pg_slave/data

//启动一个一次性容器,执行 pg_basebackup把主库数据写到  /server/db/pg_slave/data:

docker run --rm \
-e PGPASSWORD='testPassword' \
  -v  /server/db/pg_slave/data:/var/lib/postgresql/data \
  postgres:17.5 \
  pg_basebackup \
    -h 127.0.0.1 \
    -p 5432 \
    -U replicator \
    -D /var/lib/postgresql/data \
    -Xs -P -R -v


//启动从库容器
docker run -d \
  --name pg-replica \
  -p 5433:5432 \
  -v /server/db/pg_slave/data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=testPassword \
  -e TZ=Asia/Shanghai \
  postgres:17.5

[参考]
pg16主备主从

posted @ 2026-06-18 17:21  Hey,Coder!  阅读(3)  评论(0)    收藏  举报