PostgreSQL17 编译安装+相关问题解决+bash脚本_postgresql 编译安装
更新时间:2025.6.6,当前最新稳定版本17.5,演示的是17.5,最新测试版本18beta1
演示系统:debian12
很多时候,只有编译安装才能用上最新的软件版本或指定的版本。这也是编译安装的意义。
一、编译安装
(一)相关链接
链接:postgresql官网
这里可以看到目前的版本:postgresql当前可用版本
(二)下载源码并编译
以下操作默认使用root用户,如果非root用户请自行添加sudo提权
个人习惯在/usr/local目录安装软件
1.进入目录并下载源码
官方下载地址: pgsql17.5
cd /usr/local && wget https://ftp.postgresql.org/pub/source/v17.5/postgresql-17.5.tar.gz
2.解压源代码
tar -zxvf postgresql-17.5.tar.gz && cd postgresql-17.5
3.安装相关依赖
根据自己需要的增加依赖,这里的依赖是根据下面的编译参数确定的。(简单来讲,就是扩展的功能需要依赖外部已有的程序),我这里装一些常用的。
如果你的ssh客户端不支持多行,需要手动合并成一行来运行
pgsql的拓展能力很强,有很多插件可以安装,不过默认的情况下初学也是够用了。
下面的依赖还包括了postgis的依赖(最后两行,不需要可以去掉)。有一些常用插件是默认编译的,安装完成后可以直接使用简单命令就可以使用。
apt-get -y install build-essentialliblz4-dev lz4 bison flexpkg-config libreadline-dev zlib1g-devlibxml2-dev libxml2 libssh-devuuid-dev libossp-uuid-dev llvm clanglibgeos-dev libproj-dev libprotobuf-c-dev osm2pgsqlprotobuf-c-compiler gdal-bin libgdal-dev xsltproc
4.编译安装
编译参数,根据自己的需要添加。
查看所有编译参数:
安装的位置不是数据存放地址,数据通常放到别的分区
./configure --help
./configure--enable-debug--with-lz4--with-openssl--with-libxml--with-ossp-uuid--with-llvm
如果没有报错,则提示类似下面内容:
编译安装
make && make install
(三)初始化数据和用户
1.创建用户
初始化pgsql不能用root账户
添加用户组
groupadd postgres
添加用户
useradd -g postgres postgres -m
2.创建数据目录
pgsql的默认数据存储目录是/var/pgsqldata
创建文件夹(我就默认的来创建)
mkdir /var/pgsqldata
转移所属权
chown postgres:postgres /var/pgsqldata
3.配置环境变量
编辑环境变量文件
vi /etc/profile
添加如下内容,并保存(pghome和pgdata的变量名不能改成别的,否则无法启动)
PGDATA这个数据地址,调成自己的数据目录(如果单机多开这个可以不不设置这次变量)
export PGHOME=/usr/local/pgsqlexport PGDATA=/var/pgsqldataPATH=$PATH:$PGHOME/bin:$PGHOME/bin
刷新环境变量
source /etc/profile
4.切换postgres用户并初始化数据库
除了这一步要用postgres用户,其他都可以用root创建
pgsql不允许用root初始化和登录,必须用创建的账号
先进入到指定目录
cd /var/pgsqldata
su postgres
initdb
如果一切顺利,可以看到下面的内容:
启动测试(如果不使用默认的/var/pgsqldata目录,这里把位置改为相应的)
pg_ctl -D /var/pgsqldata start
停止测试
pg_ctl -D /var/pgsqldata stop
(四)管理
切换回root用户
1.通过systemctl管理
vi /usr/lib/systemd/system/pgsql.service
内容如下(如果不是使用默认的/var/pgsqldata目录,下面的三处也要改)
[Unit]Description=postgresql[Service]Type=forkingGroup=postgresUser=postgresExecStart=/usr/local/pgsql/bin/pg_ctl -D /var/pgsqldata startExecReload=/usr/local/pgsql/bin/pg_ctl -D /var/pgsqldata restartExecStop=/usr/local/pgsql/bin/pg_ctl -D /var/pgsqldata stop[Install]WantedBy=multi-user.target
2.启动运行
重新加载脚本
systemctl daemon-reload
启动并开机启动
systemctl start pgsql.service && systemctl enable pgsql.service
查看状态
systemctl status pgsql.service
通常是运行正常的,如果不正常,等待看看返回的是什么结果
3.创建unix_socket_directories目录
因为默认的包安装会使用/var/run/postgresql,而编译的psql会使用/tmp,而很多软件会默认你是包安装,所以这里需要与包安装对齐,避免更多的问题。
mkdir -p /var/run/postgresqlchown postgres:postgres /var/run/postgresqlchmod 755 /var/run/postgresql
4.修改配置文件
修改的是存储位置的,如果上面一步初始化不是/var/pgsqldata ,需要修改那个目录下的conf
编辑postgresql.conf
vi /var/pgsqldata/postgresql.conf
修改listen_addresses为listen_addresses = ‘*’,并取消前面的#号,允许别的机器访问
修改max_connections=1000,修改最大连接数(100太低了,当然设的太高如果性能不够也没用)
开启日志logging,方便检查错误
找到logging_collector = off ,改为logging_collector = on。
删除log_destination = \'stderr’前面的#
找到log_statement = ‘none’,删除前面的#,改为log_statement = ‘ddl’
(如果需要找问题,可以设置all,如果高并发环境,可以设置none)
修改unix_socket_directories
unix_socket_directories = ‘/tmp,/var/run/postgresql’
编辑pg_hba.conf
vi /var/pgsqldata/pg_hba.conf
在文件最下面添加,允许外部密码登录
host all all 0.0.0.0/0 md5
5.linux进入命令行并创建密码
再次切换到postgres用户
su postgres
进入命令行(这种方法就是最基础的cli来操作数据库,通常只有极少情况会使用psql)
psql
下面操作修改密码为abc123456,根据自己的密码修改
最后的分号不能少,下面就是修改pgsql默认的postgres账号的密码(之前版本的初始密码是postgres,后面的版本就必须要重新设定密码了,我这里改为abc123456)
ALTER USER postgres WITH PASSWORD \'abc123456\';
输入quit退出
6.默认账号密码
pgsql数据库
账号:postgres
密码:上面设定的abc123456
本地访问(127.0.0.1)是可以无密码的。
7.自动清理日志
使用pgsql自己的即可,设置轮转时间
修改:postgresql.conf
logging_collector = on # 必须启用日志收集log_directory = \'pg_log\' # 日志存放目录log_filename = \'postgresql-%d.log\' #按照日的数字来命名文件log_rotation_age = 1d # 每天切换一个新日志log_rotation_size = 0 # 不按文件大小切换(仅按时间切换)log_truncate_on_rotation = on # 日志文件重用时覆盖(不追加)
二、插件安装相关
1.pg_stat_statements:
链接
2.pg_trgm,rum:
链接
3.postgis :
链接
三、一键安装脚本bash
该脚本使用debian12,其它发行版不适用,可以修改脚本开始的常量来调整版本、安装目录等
vi /usr/local/pgsql17.sh
#!/bin/bash# 常量设置pgsql_version=\"17.5\" # pgsql版本install_path=\"/usr/local\" # 安装、操作目录data_path=\"/var/pgsqldata\" # 数据保存目录pgsql_username=\"postgres\" # 用户名systemctl_name=\"pgsql\" # systemctl名称# 安装依赖echo \"......正在安装依赖......\"apt-get install -y build-essential liblz4-dev lz4 bison flex pkg-config libreadline-dev zlib1g-dev libxml2-dev libxml2 libssh-dev uuid-dev libossp-uuid-dev llvm clang libgeos-dev libproj-dev libprotobuf-c-dev osm2pgsql protobuf-c-compiler gdal-bin libgdal-dev xsltprocif [ $? -ne 0 ]; then echo \"依赖安装失败,脚本终止\" exit 1fiecho \"......依赖安装完成......\"# 下载源代码echo \"......正在下载源码包......\"wget -P ${install_path} https://mirrors.tuna.tsinghua.edu.cn/postgresql/source/v${pgsql_version}/postgresql-${pgsql_version}.tar.gzif [ $? -ne 0 ]; then echo \"源码包下载失败,脚本终止\" exit 1fiecho \"......源码包下载完成......\"# 解压缩echo \"......正在解压缩源码包......\"cd ${install_path}tar -zxf ${install_path}/postgresql-${pgsql_version}.tar.gzif [ $? -ne 0 ]; then echo \"源码包解压缩失败,脚本终止\" exit 1fiecho \"......源码包解压缩完成......\"# 编译安装echo \"......正在编译安装......\"cd ${install_path}/postgresql-${pgsql_version}./configure --prefix=${install_path}/pgsql --enable-debug --with-lz4 --with-openssl --with-libxml --with-ossp-uuidif [ $? -ne 0 ]; then echo \"配置失败,脚本终止\" exit 1fimake && make installif [ $? -ne 0 ]; then echo \"编译安装失败,脚本终止\" exit 1fiecho \"......编译安装完成......\"# 添加用户组和用户echo \"......正在添加用户组和用户......\"groupadd ${pgsql_username} && useradd -g ${pgsql_username} ${pgsql_username} -mif [ $? -ne 0 ]; then echo \"用户组或用户添加失败,脚本终止\" exit 1fiecho \"......完成添加用户组和用户......\"# 配置环境变量echo \"......正在配置环境变量......\"echo \"export PGHOME=/usr/local/pgsql\" >> /etc/profileecho \"export PGDATA=/var/pgsqldata\" >> /etc/profileecho \"PATH=\\$PATH:\\$PGHOME/bin:\\$PGHOME/bin\" >> /etc/profilesource /etc/profile # 刷新环境变量echo \"......配置环境变量完成......\"# 创建数据文件夹并移交所有权echo \"......正在创建数据文件夹......\"mkdir -p ${data_path}chown ${pgsql_username}:${pgsql_username} ${data_path}if [ $? -ne 0 ]; then echo \"数据文件夹创建失败,脚本终止\" exit 1fiecho \"......完成创建数据文件夹......\"# 切换用户并初始化数据库echo \"......正在初始化数据库......\"su - ${pgsql_username} -c \"initdb -D ${data_path}\"if [ $? -ne 0 ]; then echo \"数据库初始化失败,脚本终止\" exit 1fiecho \"......完成初始化数据库......\"# 切换回rootsu root# 修改配置文件sed -i \"s/#listen_addresses = \'localhost\'/listen_addresses = \'*\'/g\" ${data_path}/postgresql.confecho \"host all all 0.0.0.0/0 md5\" >> ${data_path}/pg_hba.conf# 配置systemctl脚本echo \"......正在配置systemctl脚本......\"cat>/usr/lib/systemd/system/${systemctl_name}.service<<EOF[Unit]Description=postgresql${pgsql_version}[Service]Type=forkingUser=${pgsql_username}Group=${pgsql_username}ExecStart=/usr/local/pgsql/bin/pg_ctl -D /var/pgsqldata startExecReload=/usr/local/pgsql/bin/pg_ctl -D /var/pgsqldata restartExecStop=/usr/local/pgsql/bin/pg_ctl -D /var/pgsqldata stop[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl start ${systemctl_name}systemctl enable ${systemctl_name}systemctl status ${systemctl_name}echo \"......systemctl脚本配置完成......\"echo \"......!!!脚本运行完成!!!......\"
保存后
加入执行权限
chmod +x /usr/local/pgsql17.sh
运行脚本
sh /usr/local/pgsql17.sh
注意:bash脚本执行完成后仍然要进pgsql命令行修改密码,然后才能远程登录,空密码是不允许用md5登录的,除非设置trust允许所有非验证的登录
安装完成后还需要手动安装pgsql插件,因为每个人的插件不同,所以不写在脚本里面了