重新同步postgres从库

可以通过重新同步从库来恢复复制。以下是详细的步骤和方法,帮助您重新同步 PostgreSQL 的从库(备库):

一、概述

当从库因为缺少必要的 WAL(Write-Ahead Logging)段而无法继续复制时,通常需要重新初始化从库。这涉及到从主库获取最新的数据快照,并重新配置复制设置。以下步骤将指导您完成这一过程。

二、准备工作

1. 确认主库的状态

确保主库运行正常,并且所有必要的配置(如 wal_levelmax_wal_senders 等)已正确设置。

2. 确认网络连接

确保从库能够通过网络连接到主库,且相关端口(默认 5432)未被防火墙或网络策略阻挡。

3. 检查磁盘空间

确保从库所在服务器有足够的磁盘空间来存储新的数据快照和 WAL 文件。

三、重新同步从库的步骤

步骤 1:在主库上创建复制槽(可选,但推荐)

使用复制槽可以确保主库保留从库所需的 WAL 文件,防止因复制延迟导致 WAL 文件被删除。

-- 在主库上创建物理复制槽
SELECT * FROM pg_create_physical_replication_slot('standby_slot');

注意:复制槽名称(如 standby_slot)需要在从库的配置中使用。

步骤 2:停止从库的 PostgreSQL 服务

在从库服务器上,停止 PostgreSQL 服务以准备重新初始化。

# 使用 systemd
sudo systemctl stop postgresql

# 或者使用 pg_ctl
pg_ctl stop -D /path/to/data_directory

步骤 3:备份或清理从库的数据目录

重要:在进行以下操作前,建议备份现有的数据目录以防万一。

# 备份现有数据目录(可选)
mv /path/to/data_directory /path/to/data_directory_backup

# 创建新的数据目录
mkdir /path/to/data_directory

步骤 4:使用 pg_basebackup 从主库获取最新数据快照

pg_basebackup 是 PostgreSQL 提供的一个工具,用于从主库获取完整的数据库备份,并为设置物理复制提供必要的文件。

pg_basebackup -h <主库地址> -D /path/to/data_directory -U replicator -P -v -R

参数解释

  • -h <主库地址>:主库的主机地址。
  • -D /path/to/data_directory:从库的数据目录路径。
  • -U replicator:用于复制的用户(确保在主库上已创建该用户并授予复制权限)。
  • -P:显示进度信息。
  • -v:详细模式。
  • -R:在数据目录中创建 standby.signal 文件,并生成 postgresql.auto.conf,配置从库连接到主库。

示例

pg_basebackup -h 192.168.1.100 -D /var/lib/postgresql/14/main -U replicator -P -v -R

注意

  • 确保 replicator 用户在主库上具有 REPLICATION 权限。
  • 如果使用了复制槽,pg_basebackup 会自动使用它。

步骤 5:配置从库的连接参数

如果在 pg_basebackup 中使用了 -R 参数,相关配置会自动生成。如果没有,您需要手动配置从库的连接信息。

编辑从库的数据目录中的 postgresql.auto.confpostgresql.conf,添加以下配置:

primary_conninfo = 'host=<主库地址> port=5432 user=replicator password=<你的密码>'
primary_slot_name = 'standby_slot'  # 如果使用了复制槽

示例

primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=yourpassword'
primary_slot_name = 'standby_slot'

注意

  • 确保 password 被安全存储,可以使用 pgpass 文件来管理密码。
  • 如果不使用复制槽,可以省略 primary_slot_name 参数。

步骤 6:启动从库的 PostgreSQL 服务

启动 PostgreSQL 服务,使从库开始应用新的数据快照并重新建立复制连接。

# 使用 systemd
sudo systemctl start postgresql

# 或者使用 pg_ctl
pg_ctl start -D /path/to/data_directory

步骤 7:验证复制状态

在主库上,使用 pg_stat_replication 查看复制状态:

SELECT 
    pid,
    usename,
    application_name,
    client_addr,
    state,
    sent_lsn,
    write_lsn,
    flush_lsn,
    replay_lsn,
    sync_priority,
    sync_state
FROM 
    pg_stat_replication;

在从库上,使用 pg_stat_wal_receiver 查看 WAL 接收状态:

SELECT 
    pid,
    status,
    receive_start_lsn,
    receive_start_tli,
    received_lsn,
    last_msg_send_time,
    last_msg_receipt_time,
    latest_end_lsn,
    latest_end_time
FROM 
    pg_stat_wal_receiver;

目标

  • 在主库的 pg_stat_replication 中,应看到从库的连接状态为 streaming
  • 在从库的 pg_stat_wal_receiver 中,应显示 WAL 接收状态为 streaming,且没有错误。

四、常见问题排查

1. 无法连接到主库

检查

  • 网络连接是否正常(使用 pingtelnet 测试主库端口)。
  • 主库的 pg_hba.conf 是否允许从库的 IP 地址连接。
  • 确保 replicator 用户具有正确的权限。

2. 复制槽问题

如果使用复制槽,确保主库上的复制槽存在且未被删除。

SELECT * FROM pg_replication_slots;

如果复制槽不存在,可以重新创建:

SELECT * FROM pg_create_physical_replication_slot('standby_slot');

3. WAL 保留设置

确保主库的 wal_keep_sizearchive_mode 设置合理,防止 WAL 文件过早被删除。

检查主库配置

SHOW wal_keep_size;
SHOW archive_mode;
SHOW archive_command;

五、预防措施

1. 使用复制槽

复制槽可以防止主库删除从库尚未接收的 WAL 文件,减少复制延迟导致的问题。

2. 配置适当的 WAL 保留策略

根据业务需求,调整 wal_keep_size 和启用 archive_mode,确保有足够的 WAL 文件供从库使用。

示例配置(在主库的 postgresql.conf):

wal_keep_size = '512MB'  # 根据需要调整
archive_mode = on
archive_command = 'cp %p /path/to/archive/%f'  # 设置 WAL 归档命令

3. 监控复制状态

定期监控主库和从库的复制状态,及时发现并处理复制延迟或中断问题。可以使用以下方法:

  • SQL 查询

    • pg_stat_replication(主库)
    • pg_stat_wal_receiver(从库)
  • 第三方工具

    • pgAdmin:提供图形化界面监控复制状态。
    • Prometheus + PostgreSQL Exporter:实时监控和告警。
    • Powa:性能分析工具。

4. 优化从库性能

确保从库具有足够的资源(CPU、内存、磁盘 I/O)来处理复制负载,避免因性能瓶颈导致的复制延迟。

5. 确保网络稳定

主从库之间的网络连接应稳定,低延迟,避免因网络波动导致的复制中断。

六、示例:完整的重新同步流程

以下是一个完整的示例,假设主库地址为 192.168.1.100,从库数据目录为 /var/lib/postgresql/14/main,复制用户为 replicator

1. 在主库上创建复制槽

SELECT * FROM pg_create_physical_replication_slot('standby_slot');

2. 在从库上停止 PostgreSQL 服务

sudo systemctl stop postgresql

3. 备份或清理数据目录

mv /var/lib/postgresql/14/main /var/lib/postgresql/14/main_backup
mkdir /var/lib/postgresql/14/main
chown postgres:postgres /var/lib/postgresql/14/main

4. 使用 pg_basebackup 获取数据快照

pg_basebackup -h 192.168.1.100 -D /var/lib/postgresql/14/main -U replicator -P -v -R

5. 编辑从库的 postgresql.auto.conf(如果需要)

primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=yourpassword'
primary_slot_name = 'standby_slot'

6. 启动从库的 PostgreSQL 服务

sudo systemctl start postgresql

7. 验证复制状态

在主库上:

SELECT 
    pid,
    usename,
    application_name,
    client_addr,
    state,
    sent_lsn,
    write_lsn,
    flush_lsn,
    replay_lsn,
    sync_priority,
    sync_state
FROM 
    pg_stat_replication;

在从库上:

SELECT 
    pid,
    status,
    receive_start_lsn,
    receive_start_tli,
    received_lsn,
    last_msg_send_time,
    last_msg_receipt_time,
    latest_end_lsn,
    latest_end_time
FROM 
    pg_stat_wal_receiver;

七、总结

通过上述步骤,您可以成功地重新同步 PostgreSQL 的从库,确保数据复制的连续性和一致性。为了避免未来出现类似问题,建议:

  • 使用复制槽来管理 WAL 文件的保留。
  • 配置合理的 WAL 保留策略,结合 wal_keep_sizearchive_mode
  • 定期监控复制状态,及时处理延迟和中断。
  • 优化从库的性能,确保其能够及时处理和应用 WAL 文件。

如果在操作过程中遇到任何问题,建议查阅 PostgreSQL 官方文档或寻求专业支持。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容