PostgreSQL12+TimescaleDB容器执行pg_basebackup关闭,如何配置主从复制?
问题根因
你遇到的崩溃问题核心是操作流程错误和权限不匹配:
- 你在运行中的PostgreSQL容器内直接清空数据目录执行备份,运行中的PostgreSQL进程会持续读写数据目录下的
postmaster.pid、pg_stat_tmp/*等文件,小数据量备份耗时短,进程还未触发错误检测就已完成备份;大数据量备份耗时长,进程读写缺失的文件失败,触发自动关闭逻辑 - 你在容器内以root用户执行
pg_basebackup,生成的备份文件属主为root,而容器内PostgreSQL默认使用uid为999的postgres用户运行,无权限读写备份文件,进而触发大量权限报错导致服务崩溃
正确操作步骤
1. 执行离线备份,避免运行中进程干扰
首先停止从库原有运行的容器:
docker stop timescaledb
使用临时容器挂载从库数据卷执行备份,避免启动PostgreSQL服务:
docker run -it --rm -v timescale_volume:/var/lib/postgresql/data timescale/timescaledb-postgis:latest-pg12 bash # 进入临时容器后执行以下命令 rm -rf /var/lib/postgresql/data/* pg_basebackup -h 34.64.147.133 -D /var/lib/postgresql/data -U rep_user -P # 输入复制用户密码等待备份完成 # 备份完成后修正权限 chown -R postgres:postgres /var/lib/postgresql/data exit
2. 配置从库复制参数
PG12及以上版本不需要创建recovery.conf,只需添加standby标识和主库连接配置:
# 创建standby标识文件 docker run --rm -v timescale_volume:/var/lib/postgresql/data busybox touch /var/lib/postgresql/data/standby.signal # 编辑数据目录下的postgresql.conf,添加以下配置 docker run --rm -v timescale_volume:/var/lib/postgresql/data busybox sed -i "s/#primary_conninfo = ''/primary_conninfo = 'host=34.64.147.133 port=5432 user=rep_user password=你的复制用户密码'/" /var/lib/postgresql/data/postgresql.conf docker run --rm -v timescale_volume:/var/lib/postgresql/data busybox sed -i "s/#hot_standby = on/hot_standby = on/" /var/lib/postgresql/data/postgresql.conf
3. 启动从库验证
docker start timescaledb # 验证是否进入复制模式,返回t则配置成功 docker exec -it timescaledb psql -U postgres -c "SELECT pg_is_in_recovery();"
内容的提问来源于stack exchange,提问作者윤태일
相关产品推荐
相关产品推荐

