通过psql命令配置postgresql.conf:交互式脚本编写及参数修改问题
直接修改postgresql.conf的交互式配置脚本
由于ALTER SYSTEM会将配置写入postgresql.auto.conf并覆盖postgresql.conf的对应参数,而你需要直接修改postgresql.conf文件,下面提供一个bash脚本实现交互式修改需求:
脚本实现
#!/bin/bash # 替换为你的postgresql.conf实际路径 PG_CONF="/var/lib/postgresql/14/main/postgresql.conf" # 检查配置文件是否存在 if [ ! -f "$PG_CONF" ]; then echo "错误:未找到postgresql.conf文件,请检查路径设置" exit 1 fi # 定义需要处理的参数列表,可按需添加或删除 TARGET_PARAMS=( "shared_preload_libraries" "work_mem" "maintenance_work_mem" "effective_cache_size" ) # 提取参数当前值的辅助函数 get_current_param_value() { local param_name=$1 # 匹配未注释的参数行,提取并清理值(去除引号、多余空格) grep -E "^${param_name}\s*=" "$PG_CONF" | sed -E "s/^${param_name}\s*=\s*//" | sed -e "s/^'//" -e "s/'$//" -e "s/\s+$//" } # 遍历参数进行交互式修改 for param in "${TARGET_PARAMS[@]}"; do current_value=$(get_current_param_value "$param") echo "参数 ${param} 当前值:${current_value}" read -p "请输入${param}的新值(留空则保持原值):" input_value if [ -n "$input_value" ]; then # 根据参数类型处理替换逻辑:带引号的列表参数(如shared_preload_libraries) if [[ "$current_value" == *,* ]]; then sed -i.bak -E "s/^${param}\s*=\s*'.*'/${param}='${input_value}'/" "$PG_CONF" else # 普通数值/字符串参数 sed -i.bak -E "s/^${param}\s*=\s*.*/${param}=${input_value}/" "$PG_CONF" fi echo "已更新${param}为:${input_value}" else echo "未修改${param},保留原值" fi echo "------------------------" done echo "所有参数处理完成!请重启PostgreSQL服务使新配置生效"
使用说明
- 调整路径:将脚本中的
PG_CONF变量值改为你的PostgreSQL配置文件实际路径 - 配置参数列表:在
TARGET_PARAMS数组中添加或删除需要处理的参数 - 运行脚本:确保脚本有执行权限(
chmod +x pg_conf_edit.sh),并以拥有配置文件修改权限的用户运行(通常需要sudo) - 生效配置:修改完成后重启PostgreSQL服务,例如:
sudo systemctl restart postgresql
针对shared_preload_libraries的示例操作
当脚本提示输入该参数新值时,直接输入pgaudit,$libdir/dbms_pipe,$libdir/edb_gen,$libdir/dbms_aq即可完成添加,脚本会自动替换原有的参数值。
注意:脚本会自动生成配置文件备份(如
postgresql.conf.bak),若修改出错可恢复备份文件。
内容的提问来源于stack exchange,提问作者Mayank Singh
相关产品推荐
相关产品推荐

