
# 使用pg_waldump解析RDS for PostgreSQL的wal日志
RDS for PostgreSQL实例购买完成后，可以先登录到Linux弹性云服务器，在ECS上安装PostgreSQL客户端，然后通过开源pg_waldump解析RDS for PostgreSQL的wal日志。
#### 步骤1：购买ECS
1. [登录管理控制台](https://console.huaweicloud.com/ecm/?locale=zh-cn#/ecs/manager/vmList)，查看是否有弹性云服务器。
   - 有Linux弹性云服务器，执行[步骤2：安装PostgreSQL客户端]。
   
   - 无Linux弹性云服务器，执行[2]。
    
2. 购买弹性云服务器时，选择Linux操作系统，例如CentOS。
   由于需要在ECS下载PostgreSQL客户端，因此需要为ECS绑定弹性公网IP（EIP）。
   购买Linux弹性云服务器请参考《弹性云服务器用户指南》中"[购买弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)"章节。
   
 
 #### 步骤2：安装PostgreSQL客户端
PostgreSQL客户端版本一定要和RDS for PostgreSQL实例版本保持一致，否则可能导致wal日志解析失败。
- [安装PostgreSQL客户端（15及以下版本）]
  1. 登录ECS实例，请参见《弹性云服务器用户指南》中"[Linux弹性云服务器远程登录（VNC方式）](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0136.html)"。
  
  2. 安装PostgreSQL客户端。 PostgreSQL社区提供了针对不同操作系统的[客户端安装方法](https://www.postgresql.org/download/)。通过操作系统的安装工具直接下载安装。此安装方式比较简单，但是对ECS操作系统有要求，只有PostgreSQL社区中支持的操作系统才可以使用该安装方式。
     使用操作系统默认安装，当前使用的Linux操作系统是CentOS 7，通过工具安装最高版本是15版本。
     图1获取安装工具   
     ![](https://support.huaweicloud.com/bestpractice-rds-pg/zh-cn_image_0000002389044213.png "点击放大")
     执行[安装](https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm)命令：
     ```
     sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
     sudo yum install -y postgresql15-server
     ```
     查看是否安装成功：
     ```
     psql -V
     ```
     图2安装成功   
     ![](https://support.huaweicloud.com/bestpractice-rds-pg/zh-cn_image_0000002389004309.png "点击放大") 
   
- [安装PostgreSQL客户端（对版本没有限制）]
  1. 登录ECS实例，请参见《弹性云服务器用户指南》中"[Linux弹性云服务器远程登录（VNC方式）](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0136.html)"。
  
  2. 安装PostgreSQL客户端。 [源码安装方式](https://www.postgresql.org/docs/16/installation.html)，该安装方式对RDS for PostgreSQL实例的版本以及ECS的操作系统没有限制。
     下面以Huawei Cloud EulerOS 2.0镜像的ECS为例，安装PostgreSQL 16.4版本客户端。
     图3查看ECS镜像   
     ![](https://support.huaweicloud.com/bestpractice-rds-pg/zh-cn_image_0000002355364196.png "点击放大")
     1. 要支持SSL，需要在ECS上提前下载openssl。
        ```
        sudo yum install -y openssl-devel
        ```
        
     
     2. 在[官网](https://www.postgresql.org/ftp/source/)获取代码下载链接，使用wget直接下载安装包或者[下载到本地](https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz)后上传到ECS上。
        ```
        wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz
        ```
        
     
     3. 解压安装包。
        ```
        tar xf postgresql-16.4.tar.gz
        ```
        
     
     4. 编译安装。
        ```
        cd postgresql-16.4
        ./configure --without-icu --without-readline --without-zlib --with-openssl
        make -j 8 && make install
        ```
        ![](https://support.huaweicloud.com/bestpractice-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
        不指定--prefix，表示默认路径为"/usr/local/pgsql"，因为只安装客户端采用最简安装。
        图4编译安装   
        ![](https://support.huaweicloud.com/bestpractice-rds-pg/zh-cn_image_0000002355524120.png "点击放大") 
     
     5. 配置环境变量，在"/etc/profile"文件中添加以下内容。
        ```
        export PATH=/usr/local/pgsql/bin:$PATH
        export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
        source /etc/profile
        ```
        
     
     6. 测试psql是否可使用。
        ```
        psql -V
        ```
        图5测试psql可用   
        ![](https://support.huaweicloud.com/bestpractice-rds-pg/zh-cn_image_0000002389044217.png "点击放大") 
      
   
#### 步骤3：获取RDS for PostgreSQL实例中的增量wal日志
1. [下载增量备份文件](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0138.html)，假设将下载的增备文件存放在/download/backup。
2. 使用提供的[脚本](https://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/pg_restore_incre.zip)，解压后执行如下命令，将增量备份文件解压到一个临时目录（例如/tmp/wal）下。
   ```
   python restore_wal.py /download/backup /tmp/wal
   ```
   - /download/backup：PostgreSQL增量备份文件的目录。
   
   - /tmp/wal：临时存放pg_wal日志的目录。
    
 
#### 步骤4：使用pg_waldump解析指定wal日志
示例：如下命令显示wal日志000000010000000000000003中前5行记录内容。
```
pg_waldump -n 5 000000010000000000000003
```
回显如下：
```
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/03000028, prev 0/02000100, desc: RUNNING_XACTS nextXid 765 latestCompletedXid 764 oldestRunningXid 765
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/03000060, prev 0/03000028, desc: CHECKPOINT_SHUTDOWN redo 0/3000060; tli 1; prev tli 1; fpw true; xid 0:765; oid 16393; multi 1; offset 0; oldest xid 730 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
rmgr: XLOG        len (rec/tot):     54/    54, tx:          0, lsn: 0/030000D8, prev 0/03000060, desc: PARAMETER_CHANGE max_connections=200 max_worker_processes=8 max_wal_senders=10 max_prepared_xacts=10 max_locks_per_xact=64 wal_level=logical wal_log_hints=off track_commit_timestamp=off
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/03000110, prev 0/030000D8, desc: RUNNING_XACTS nextXid 765 latestCompletedXid 764 oldestRunningXid 765
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/03000148, prev 0/03000110, desc: RUNNING_XACTS nextXid 765 latestCompletedXid 764 oldestRunningXid 765
```
更多pg_waldump的详细操作，请参考[社区文档](https://www.postgresql.org/docs/current/pgwaldump.html)。
#### 常见问题
问：执行命令时出现如下报错怎么办？
```
pg_waldump: error: could not find a valid record after xxx/xxxxxxxx
```
答：执行**pg_waldump -V**命令查看pg_waldump的版本，查看pg_waldump的大版本是否与RDS for PostgreSQL实例的大版本一致。
如果版本不一致，重新执行[步骤2：安装PostgreSQL客户端]，安装正确的版本。
