文章目录
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 8
版本:4.5.1
症状
使用命令 pg_ctl start 启动db_ha集群中的一个节点上的数据库报错,
查看数据库日志,日志中无关于此次启动的任何信息输出。
数据目录中postgresql.conf、postgresql.auto.conf 等配置文件为空文件
报错信息如下,提示缺少加密模块。
pg_ctl start
等待服务器进程启动 ....
2025-07-16 15:51:10.468 CST [15752] FATAL: database files are encrypted
2025-07-16 15:51:10.468 CST [15752] DETAIL: The database cluster was initialized with encryption but the server was started without an encryption module.
2025-07-16 15:51:10.468 CST [15752] HINT: Set the encryption module using encryption_library configuration parameter.
已停止等待
pg_ctl: 无法启动服务器进程
检查日志输出.
问题原因
数据库为db_ha两节点集群,sm4加密。
启动失败的节点之前一个月一直处于关机状态,且关机前为主库。
由于较长时间未开启,再次开启时db_ha将其降为备库,且做rewind修复数据。
因rewind未正常结束,导致postgresql.conf为空文件,
数据库启动时找不到参数encryption_library = 'sm4'
解决方案
由于该节点数据已完全损坏,需要重新拉取数据,重做备库。
1.更改数据目录名称
mv /data/highgo/data_bak_yyyymmdd
2.新建数据目录
mkdir /data/highgo/data
3.拉取数据
pg_basebackup -h 主库IP -U sysdba -D /data/highgo/data -Fp -Xs -R -P -v
4.启动备库
pg_ctl start
5.主库上查看流复制状态
select * from pg_stat_replication;
6.主库上查看复制槽
select * from pg_replication_slots;
7.在备库上添加复制槽
alter system set primary_slot_name = 'xxxx'; -- 根据上面的查询填写
select pg_reload_conf();
8.切换主节点
db_ha switchover xxx.xxx.xxx.xxx # 原备节点IP
9.新主库创建复制槽
select * from pg_create_physical_replication_slot('db_ha_slot_2');
10.新备库添加复制槽
alter system set primary_slot_name = 'db_ha_slot_2';
11.主库上查看流复制状态
select * from pg_stat_replication;
报错编码
15752