# PostgreSQL中PG_REWIND有什么用
## 引言
在PostgreSQL的高可用架構中,主從切換是常見的運維操作。當主庫發生故障時,通常會提升一個從庫作為新的主庫。然而,原主庫恢復后可能包含與新主庫沖突的數據變更,直接重新加入集群會導致數據不一致。`pg_rewind`正是為解決這一問題而設計的利器。
本文將深入探討`pg_rewind`的工作原理、適用場景、使用方法和注意事項,幫助DBA高效處理PostgreSQL集群的腦裂修復問題。
---
## 一、PG_REWIND概述
### 1.1 基本定義
`pg_rewind`是PostgreSQL自帶的一個命令行工具(9.5版本引入),用于將一個脫離集群的主庫與當前主庫同步,通過"回退"不需要的變更使其能夠作為從庫重新加入集群。
### 1.2 核心價值
傳統修復方法需要全量重建從庫,而`pg_rewind`可以:
- **節省時間**:只同步差異部分,避免完整基礎備份
- **節省空間**:無需額外的存儲空間存放備份
- **減少停機**:縮短故障恢復時間窗口
### 1.3 工作原理
通過對比兩個數據庫集群的WAL(Write-Ahead Logging)歷史,識別分叉點后的差異:
1. 掃描原主庫和新主庫的WAL記錄
2. 定位時間線分叉點(timeline split point)
3. 將原主庫回退到分叉點狀態
4. 從新主庫復制分叉點后的變更
---
## 二、適用場景分析
### 2.1 典型使用場景
1. **主庫故障轉移后**:原主庫恢復時需要重新加入集群
2. **計劃內切換**:手動主從切換后的原主庫重配置
3. **誤操作恢復**:當從庫意外寫入數據后需要重新同步
### 2.2 不適用情況
- 非時間線分叉導致的不一致(如文件系統級損壞)
- PostgreSQL大版本升級后的同步
- 開啟了`wal_level=minimal`的實例
### 2.3 版本兼容性
| PostgreSQL版本 | 功能支持 |
|----------------|----------|
| < 9.5 | 不可用 |
| 9.5-10 | 基礎功能 |
| 11+ | 增強性能 |
---
## 三、工作原理深度解析
### 3.1 關鍵概念:時間線(Timeline)
PostgreSQL使用時間線ID區分不同的WAL歷史分支。每次提升新主庫時會遞增時間線號。
### 3.2 核心處理流程
1. **分叉點檢測**
- 解析新舊主庫的`pg_wal`目錄
- 查找最后一個共同的WAL位置(LSN)
2. **文件系統掃描**
- 使用`filemap`機制對比數據文件差異
- 三類文件處理:
- 保持不變(未修改文件)
- 需要替換(沖突文件)
- 需要復制(新增文件)
3. **WAL重放**
- 從新主庫獲取缺失的WAL段
- 應用這些WAL使數據庫達到一致狀態
### 3.3 技術限制
- 要求舊主庫的WAL至少保留到分叉點
- 需要`full_page_writes=on`(默認值)
- 不能處理非WAL管理的文件(如臨時文件)
---
## 四、實戰操作指南
### 4.1 前置條件檢查
```bash
# 確保參數配置正確
psql -c "SHOW wal_level;" # 必須為replica或logical
psql -c "SHOW full_page_writes;" # 建議為on
pg_rewind \
--target-pgdata=/var/lib/pgsql/old_primary \
--source-server="host=new_primary user=postgres port=5432" \
--progress
場景:原主庫在10:00故障,從庫在10:05被提升為新主庫
停止原主庫服務
pg_ctl stop -D /var/lib/pgsql/old_primary
執行rewind操作
pg_rewind \
--target-pgdata=/var/lib/pgsql/old_primary \
--source-server="host=new_primary user=rep_user" \
--dry-run # 先進行試運行
配置為從庫啟動
echo "primary_conninfo = 'host=new_primary'" > /var/lib/pgsql/old_primary/recovery.conf
pg_ctl start -D /var/lib/pgsql/old_primary
問題1:WAL日志不完整
error: could not find common ancestor
解決方案:確保舊主庫保留足夠的WAL日志,或手動從歸檔恢復
問題2:連接認證失敗
調整pg_hba.conf允許復制用戶連接
# postgresql.conf優化
wal_keep_segments = 1024 # 保留更多WAL段
max_wal_senders = 10 # 增加WAL發送進程
--no-ensure-shutdown加速(需確保數據庫已干凈關閉)--jobs參數)-- 檢查同步進度
SELECT * FROM pg_stat_replication;
| 方案 | 優點 | 缺點 |
|---|---|---|
| pg_rewind | 快速,增量同步 | 有前置條件限制 |
| 全量基礎備份 | 絕對干凈 | 耗時且占用資源 |
| 邏輯復制 | 可選擇性同步 | 需要預先配置 |
wal_keep_segments和歸檔pg_rewind作為PostgreSQL高可用架構中的關鍵工具,能顯著降低主從切換后的恢復成本。理解其工作原理和適用邊界,結合合理的運維流程,可以極大提升數據庫系統的可用性。隨著PostgreSQL的持續演進,該工具的功能和性能仍在不斷優化,值得DBA們深入掌握。
注意:本文基于PostgreSQL 15編寫,部分參數在不同版本中可能存在差異。 “`
這篇文章共計約2600字,采用Markdown格式編寫,包含: 1. 多級標題結構 2. 技術原理圖解說明 3. 代碼塊示例 4. 表格對比 5. 實操命令 6. 常見問題解決方案 7. 版本兼容性說明
可根據需要調整具體內容細節或補充特定版本的注意事項。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。