postgresql14编译安装脚本

news2025/3/13 19:10:16
#!/bin/bash

####################################readme###################################
#先上传postgresql源码包,再配置yum源,然后执行脚本
#备份官方yum源配置文件:
#cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
#下载阿里云yum源配置文件:
#curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#清除缓存生产新的缓存
#yum clean all
#yum makecache
#############################################################################

set -euo pipefail  # 启用严格错误检查

#============================= 全局配置 =============================#
export MY_SERVER_IP="172.16.1.11"       # 本机服务器IP
export MY_HOSTNAME="testdb"        # 主机名
export MY_SOFT_BASE="/opt"               # 软件包存储根目录
export PG_SOFT="postgresql-14.16.tar.gz" # PG源码包名称
export PG_VERSION="14.16"                # PG版本号
export MY_PG_HOME="/pgccc"               # PG根目录
export PGDATA="${MY_PG_HOME}/pgdata"     # 数据目录
export PGHOME="${MY_PG_HOME}/pgsql"      # 安装目录
export LOG_FILE="/var/log/pg_install.log" # 安装日志文件

#============================= 函数定义 =============================#
init_logging() {
  exec > >(tee -a "$LOG_FILE") 2>&1
  echo "[$(date '+%F %T')] 开始执行PostgreSQL安装脚本"
}

validate_environment() {
  echo "验证安装包..."
  local pg_soft_path="${MY_SOFT_BASE}/${PG_SOFT}"
  [[ -f "$pg_soft_path" ]] || { echo "错误:未找到PostgreSQL源码包 $pg_soft_path"; exit 1; }
}

install_dependencies() {
  echo "安装系统依赖..."
  local deps=(
    openssl openssl-devel pam pam-devel libxml2 libxml2-devel
    libxslt libxslt-devel perl perl-devel python-devel perl-ExtUtils-Embed
    readline readline-devel bzip2 zlib zlib-devel ntp ntpdate
    gettext gettext-devel bison flex gcc gcc-c++ boost-devel
    gmp-devel mpfr-devel libevent-devel libpython3.6m
  )
  yum install -y "${deps[@]}" || { echo "依赖安装失败"; exit 1; }
}

security_settings() {
  # 关闭防火墙
systemctl stop firewalld.service  >/dev/null 2>&1
systemctl disable firewalld.service  >/dev/null 2>&1 


  # SELinux配置
  if [[ $(getenforce) != "Disabled" ]]; then
    sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
    setenforce 0
    echo "SELinux已设置为宽松模式"
  fi
}


create_pg_user() {
  if ! id postgres &>/dev/null; then
    groupadd -g 70000 postgres
    useradd -u 70000 -g postgres -m -s /bin/bash postgres
    echo "postgres:postgres" | chpasswd
    echo "已创建postgres用户"
  fi
}

setup_directories() {
  local dirs=("$MY_PG_HOME"/{pgdata,archive,scripts,backup,pgsql,soft})
  mkdir -p "${dirs[@]}"
  chown -R postgres:postgres "$MY_PG_HOME"
  chmod 2750 "$MY_PG_HOME"  # 设置SGID位保持组权限
  echo "目录结构已创建"
}

configure_env() {
  local profile="/home/postgres/.bashrc"
  cat > "$profile" <<EOF
export LANG=en_US.UTF-8
export PGPORT=5432
export PGDATA=$PGDATA
export PGHOME=$PGHOME
export PATH=\$PGHOME/bin:\$PATH
export PGUSER=postgres
export PGDATABASE=postgres
PS1='[\u@\h \W]\$ '
EOF
  chown postgres:postgres "$profile"
}

compile_pg() {
  local src_dir="${MY_PG_HOME}/soft/postgresql-${PG_VERSION}"
  local build_dir="${MY_PG_HOME}/build"

  # 解压源码
  tar -zxvf "${MY_SOFT_BASE}/${PG_SOFT}" -C "${MY_PG_HOME}/soft"

  # 编译安装
  mkdir -p "$build_dir"
  chown postgres:postgres "$build_dir"
  
  su - postgres -c "
    cd '$build_dir' &&
    '${src_dir}/configure' \
      --prefix='$PGHOME' \
      --with-openssl \
      --with-libxml \
      --with-libxslt &&
    make -j$(nproc) &&
    make install
  " || { echo "编译安装失败"; exit 1; }
}

init_db() {
  su - postgres -c "
    initdb --encoding=UTF8 --locale=en_US.utf8 --username=postgres --pwfile=<(echo 'postgres')
  " || { echo "数据库初始化失败"; exit 1; }

  # 配置参数
  cat >> "$PGDATA/postgresql.conf" <<EOF
listen_addresses = '*'
port = 5432
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
shared_preload_libraries = 'pg_stat_statements'
max_connections = 100
shared_buffers = 128MB
work_mem = 4MB
EOF

  # 配置访问控制
  cat > "$PGDATA/pg_hba.conf" <<EOF
local   all             all                     trust
host    all             all     127.0.0.1/32    trust
host    all             all     $MY_SERVER_IP/32 md5
host    replication     all     0.0.0.0/0       md5
EOF
}

start_service() {
  cat > /etc/systemd/system/postgresql.service <<EOF
[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=notify
User=postgres
ExecStart=$PGHOME/bin/postgres -D $PGDATA
ExecReload=/bin/kill -HUP \$MAINPID
KillMode=mixed

[Install]
WantedBy=multi-user.target
EOF

  systemctl daemon-reload
  systemctl enable postgresql --now
}

#============================= 主执行流程 =============================#
main() {
  init_logging
  validate_environment
  install_dependencies

  create_pg_user
  setup_directories
  configure_env
  compile_pg
  init_db
  start_service

  echo "安装完成!数据库已启动"
  echo "连接命令:psql -h $MY_SERVER_IP -U postgres"
}

main "$@"

遇到问题:

编译安装完成后,启动时报错

pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2024-03-28 10:24:59.830 CST [14206] FATAL: could not access file "pg_stat_statements": No such file or directory
2024-03-28 10:24:59.830 CST [14206] LOG: database system is shut down
 stopped waiting
pg_ctl: could not start server
Examine the log output.

问题处理:

--进入到contrib目录中,再进入到安装包pg_stat_statements目录

cd  contrib/pg_stat_statements/

--直接进行编译安装报错

[pgsql@test:/opt/postgresql-14.16/contrib/pg_stat_statements]$ make && make install
Makefile:33: /contrib/contrib-global.mk: No such file or directory
make: *** No rule to make target '/contrib/contrib-global.mk'. Stop.

--参考官网后执行以下命令编译安装

[pgsql@test:/opt/postgresql-14.16/contrib/pg_stat_statements]$ make USE_PGXS=1&& make USE_PGXS=1 install

--编译安装完成后再次启动数据库

pg_ctl start
waiting for server to start....2024-03-28 10:43:57.642 CST [14578] LOG: redirecting log output to logging collector process
2024-03-28 10:43:57.642 CST [14578] HINT: Future log output will appear in directory "log".
 done
server started

--创建插件

[pgsql@test:/home/postgres]$psql -h127.0.0.1 -Upostgres
psql (15.0)
Type "help" for help.
postgres=# create extension pg_stat_statements;
CREATE EXTENSION
postgres=# alter system set shared_preload_libraries = 'pg_stat_statements';
ALTER SYSTEM

--查询结果成功

postgres=# select count(*) from pg_stat_statements;
 count 
-------
   2
(1 row)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

部署项目至服务器:响应时间太长,无法访问此页面?

在我们部署项目到服务器上的时候&#xff0c;一顿操作猛如虎&#xff0c;打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况&#xff0c;要去操作两边&#xff08;宝塔and服务器所属平台…

【数据结构】List介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。此时extends意为拓展 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&…

vs2022用git插件重置--删除更改(--hard)后恢复删除的内容

1、先到项目工程中打开需要恢复的分支。 2、进入代码管理根目录文件夹。 3、在根目录文件夹点右键&#xff0c;点git bash here 正常情况下如果git目录权限足够&#xff0c;是可以如上图所示显示当前分支和当前目录的。 在git权限不足的情况下会出现如下提示&#xff1a; …

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆&#xff0c;邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible &#xff1b; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

【MySQL】用户管理和权限

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】用户管理和权限 发布时间&#xff1a;2025.3.12 隶属专栏&#xff1a;MySQL 目录 引言用户用户信息创建用户语法案例 修改用户密码语法案例 删除用户语法案例 权限权限列表查看和刷新用户的权限给用户授权…

指令微调 (Instruction Tuning) 与 Prompt 工程

引言 预训练语言模型 (PLMs) 在通用语言能力方面展现出强大的潜力。然而&#xff0c;如何有效地引导 PLMs 遵循人类指令&#xff0c; 并输出符合人类意图的响应&#xff0c; 成为释放 PLMs 价值的关键挑战。 指令微调 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…

UE5.5 Niagara 发射器粒子更新模块

Particle State &#xff08;粒子状态&#xff09;模块 Particle State 主要用于控制粒子的生存状态&#xff0c;包括死亡、消失、响应事件等。 Particle State Kill Particles When Lifetime Has Elapsed 当粒子的生命周期结束时&#xff0c;销毁这些粒子。 Lifetime &…

机器学习(吴恩达)

一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量&#xff0c;是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量&#xff0c;是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…

Django与视图

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲视图 在web应用的MVC结构中&#xff0c;视图一般包含模板和表单&#xff0c;用来给浏览器生成响应。在实际处理过程当中&#xff0c;视图会根据请求的参数从数据源当中找到数据&#xf…

RabbitMQ从入门到实战-2

文章目录 Java客户端快速入门WorkQueue(多消费)能者多劳配置 交换机fanout交换机案例 Direct交换机Topic交互机 声明队列和交互机&#xff08;IDEA中&#xff09;基于Bean声明队列和交换机基于注解声明&#xff08;推&#xff09; 消息转换器配置Json消息转换器 业务改造&#…

Mac 配置 Maven JDK

不使用 Homebrew&#xff0c;创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi &#xff5e;/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放&#xff0c;为了方便使用者更加自由的使用大模型&#xff0c;将大模型变成如同棒球棍一样每个人都能用&#xff0c;并且顺手方便的工具&#xff0c;本地私有化具有重要意义。 本次测试使用ollama完成模型下载&#xff0c;过程简单快捷。 1、进…

Ubuntu通过Ollama部署deepseek和千问

一、准备文件 本地服务器是Ubuntu20.04&#xff0c;输入命令uname -a即可查看 部署方式有多样&#xff0c;点击Ollama访问官网 可复制命令直接粘贴下载&#xff0c;但是过程比较慢&#xff0c;所以我推荐下面这种方式 从githubReleases ollama/ollama GitHub上下载ollama的…

第十一届蓝桥杯单片机国赛

什么&#xff1f;4T模拟赛和省赛做起来轻轻松松&#xff1f;不妨来挑战一下第十一届国赛&#xff0c;这一届的国赛居然没考超声波、串口通信&#xff01;只要你正确地理解了题目的意思&#xff0c;规避出题人挖的坑&#xff0c;拿个国一轻轻松松。 附件&#xff1a;第十一届蓝桥…

【eNSP实战】MSTP与VRRP配合使用

拓扑图 要求&#xff1a; PC1划分在vlan10&#xff1b;PC2划分在vlan20&#xff1b;主机IP和网关如图所示&#xff0c;这里不做展示LSW1配置vlan10的根交换机&#xff0c;vlan20的备根交换机&#xff1b;LSW2配置vlan20的根交换机&#xff0c;vlan10的备根交换机LSW1配置vlan…

UVC摄像头命令推流,推到rv1126里面去

ffmpeg命令查询UVC设备 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上图是查询UVC设备的效果图&#xff0c;画红框的部分是UVC设备的设备名称"USB2.0 PC CAMERA"和设备号 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch

2025年主流原型工具测评&#xff1a;墨刀、Axure、Figma、Sketch 要说2025年国内产品经理使用的主流原型设计工具&#xff0c;当然是墨刀、Axure、Figma和Sketch了&#xff0c;但是很多刚入行的产品经理不了解自己适合哪些工具&#xff0c;本文将从核心优势、局限短板、协作能…

es-索引详解

在 Elasticsearch 中&#xff0c;**索引&#xff08;Index&#xff09;**是核心概念之一&#xff0c;类似于关系型数据库中的“表”。索引用于存储、组织和检索文档&#xff08;Document&#xff09;。以下是关于 Elasticsearch 索引的详细解析&#xff1a; 1. 索引的基本概念 …

SAP接口方式之HTTP请求发布Restful服务

SAP restful http 接口集中管理发布(SICF) 项目上有很多restful接口的需求&#xff0c;其中涉及到多个外围系统&#xff0c;就想着如何通过只发布一个服务&#xff0c;而不用通过Webservice&#xff0c;也不通过RFC方式&#xff0c;让个外围系统传入不同的报文&#xff0c;来决…