在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
下面是安装方式的详细步骤和一些注意事项。
离线安装PostgreSQL数据库
🔧 方法一:源码编译安装
这种方法适合需要自定义安装路径、编译选项或特定版本的场景。
-
获取源码包及依赖
- 在一台能上网的机器上,从PostgreSQL官网(https://www.postgresql.org/ftp/source/ )下载你所需版本的源码包(例如
postgresql-14.3.tar.gz
)。 - 同时,务必下载或准备编译所需的依赖库,例如
gcc
,gcc-c++
,readline-devel
,zlib-devel
等。这些也需要以RPM等方式下载并离线安装。获取这些依赖的方式可参考方法一中的--downloadonly
。 - 将源码包和依赖库的RPM包上传到离线服务器。
- 在一台能上网的机器上,从PostgreSQL官网(https://www.postgresql.org/ftp/source/ )下载你所需版本的源码包(例如
-
安装编译依赖
- 安装之前下载的编译所需的依赖RPM包:
# 进入存放依赖包的目录 cd /path/to/dependency/rpms rpm -ivh --force --nodeps *.rpm # 或者使用yum本地安装(若yum配置允许) # yum localinstall *.rpm
- 安装之前下载的编译所需的依赖RPM包:
-
编译安装PostgreSQL
- 解压源码包并进入目录:
tar -xvf postgresql-14.3.tar.gz -C /home/postgres/ cd /home/postgres/postgresql-17.5
- 配置编译选项。
--prefix
指定安装目录:./configure --prefix=/home/pgsql --without-readline # 如果readline库有问题可用--without-readline跳过
- 编译并安装:
这个过程可能需要一些时间。make make install
- 解压源码包并进入目录:
⚙️ 公共配置步骤
无论通过哪种方式安装,后续的数据库初始化和管理配置都是类似的。
-
创建postgres用户 (如果安装过程没有自动创建)
groupadd -g 2000 postgres useradd -g 2000 -u 2000 postgres echo "为postgres用户设置密码:" passwd postgres
-
准备数据目录并授权
mkdir -p /home/pgsql/data # 根据你的安装路径调整,这里是示例 chown -R postgres:postgres /home/pgsql chmod -R 700 /home/pgsql/data
-
初始化数据库
- 切换到
postgres
用户:su - postgres
- 初始化数据库(假设PostgreSQL二进制路径已在
postgres
用户的PATH中,或者使用全路径):/home/pgsql/bin/initdb -D /home/pgsql/data
- 切换到
-
配置PostgreSQL
- 修改
pg_hba.conf
(/home/pgsql/data/pg_hba.conf
):
设置认证方式,例如允许所有远程连接使用密码认证:
或者更安全的限制:host all all 0.0.0.0/0 md5
host all all 192.168.1.0/24 md5
- 修改
postgresql.conf
(/home/pgsql/data/postgresql.conf
):
启用远程连接:listen_addresses = '*' # 监听所有IP地址 port = 5432 # 默认端口
- 修改
-
设置环境变量(可选但推荐)
在postgres
用户的~/.bash_profile
或系统全局的/etc/profile
中添加:export PGHOME=/home/pgsql export PGDATA=$PGHOME/data export PATH=$PGHOME/bin:$PATH export LANG=en_US.UTF8
然后执行
source ~/.bash_profile
或source /etc/profile
使其生效。 -
启动数据库
- 使用pg_ctl(手动启动)
su - postgres pg_ctl -D /home/pgsql/data -l /home/pgsql/data/logfile start
- 配置为系统服务(推荐,开机自启)
创建系统服务文件/usr/lib/systemd/system/postgresql.service
,内容示例:
然后重新加载systemd并启动服务:[Unit] Description=PostgreSQL database server Documentation=man:postgres(1) After=syslog.target After=network.target[Service] Type=forking User=postgres Group=postgres OOMScoreAdjust=-1000 Environment=PGDATA=/home/pgsql/data ExecStart=/home/pgsql/bin/pg_ctl -s -D ${PGDATA} start -w -t 300 ExecStop=/home/pgsql/bin/pg_ctl -s -D ${PGDATA} stop -m fast ExecReload=/home/pgsql/bin/pg_ctl -s -D ${PGDATA} reload TimeoutSec=300[Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl enable postgresql systemctl start postgresql systemctl status postgresql
- 使用pg_ctl(手动启动)
-
修改默认用户密码并测试
su - postgres psql -d postgres
在psql提示符下:
ALTER USER postgres WITH PASSWORD '你的强密码'; \q
尝试用新密码重新登录进行测试。
尝试连接数据库
即使服务运行了,最终极的测试是能否成功连接到数据库。PostgreSQL 安装后会创建一个名为 postgres
的默认数据库和同名的超级用户。
-
切换到 postgres 系统用户:
PostgreSQL 会创建一个名为postgres
的Linux系统用户来管理数据库。直接切换到该用户:sudo -i -u postgres
执行后,你的命令行提示符会变成
postgres@your-server
。 -
启动 PostgreSQL 命令行客户端
psql
:psql
或者直接连接到一个特定的数据库:
psql -l # 列出所有可用数据库
-
如何判断结果:
-
如果成功,你会进入
psql
的交互式命令行界面,提示符会变成postgres=#
。这毫无疑问证明安装完全成功。 -
在这里,你可以执行一些简单的 SQL 命令来测试,例如:
SELECT version();
或者
\conninfo
-
输入
\q
可以退出psql
,输入exit
可以退出postgres
用户身份。
-
看起来你在使用 UnionTech OS Server 20 系统时,遇到了 pg_ctl
命令找不到的问题。这通常是因为系统无法找到 pg_ctl
这个命令的位置。别担心,我们一步步来排查和解决。
首先,我为你梳理了一个解决问题的流程图,帮助你清晰快速地理解和操作:
下面是每个步骤的具体操作方法:
🐧 解决 PostgreSQL 的 pg_ctl 命令未找到问题
1. 确认 PostgreSQL 是否安装
首先,你需要确认 PostgreSQL 是否已经在你的系统上安装。虽然你提到了离线安装,但最好再确认一下:
rpm -qa | grep postgresql # 查看是否安装了PostgreSQL相关的RPM包
find / -name pg_ctl -type f 2>/dev/null # 在整个系统查找pg_ctl文件
- 如果没有任何输出或者找不到
pg_ctl
,你可能还没有安装 PostgreSQL,或者安装不完全。 - 如果找到了
pg_ctl
(例如在/home/pgsql/bin/pg_ctl
),请记下这个路径,后面会用到。
2. 配置环境变量
找到 pg_ctl
命令的路径后,你需要将它添加到 postgres
用户的环境变量中。
-
编辑
postgres
用户的~/.bash_profile
文件:su - postgres # 切换到postgres用户 vi ~/.bash_profile # 编辑环境变量文件
-
在
~/.bash_profile
文件中添加以下内容(请将/home/pgsql/bin/bin
替换为你实际找到的pg_ctl
命令所在的目录):PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/pgsql/bin # 将PostgreSQL的bin目录添加到PATH中 export PGDATA=/home/pgsql/data # 设置PGDATA环境变量,指向你的数据目录 export PATH # 导出PATH
请注意,
PGDATA
的值/home/pgsql/data
需要确保是你实际的数据目录。 -
保存文件并退出编辑器(在 vi 中按
Esc
键,然后输入:wq
并按回车)。 -
使新的环境变量立即生效:
source ~/.bash_profile # 重新加载环境变量配置文件
-
验证
pg_ctl
命令是否现在可以识别:which pg_ctl # 查看pg_ctl命令的完整路径 pg_ctl --version # 尝试查看pg_ctl版本
3. 使用绝对路径运行命令
在配置好环境变量之前,你可以直接使用 pg_ctl
的绝对路径来运行命令:
/home/pgsql/bin/pg_ctl -D /home/pgsql/data -l /home/pgsql/data/logfile start # 使用绝对路径启动PostgreSQL
同样,请将 /home/pgsql/bin/pg_ctl
替换为你之前找到的实际路径。
4. 检查文件权限
极少数情况下,即使找到了 pg_ctl
命令,它也可能没有可执行权限。你可以检查并添加执行权限:
ls -l /home/pgsql/bin/pg_ctl # 查看pg_ctl文件的权限
chmod +x /home/pgsql/bin/pg_ctl # 如果缺少执行权限,则添加它
5. 创建软链接(可选)
如果觉得每次输入绝对路径麻烦,你可以将 pg_ctl
链接到系统已有的 PATH 路径下,例如 /usr/local/bin
或 /usr/bin
:
sudo ln -s /home/pgsql/bin/pg_ctl /home/pgsql/bin/pg_ctl # 创建软链接
之后,你就可以直接使用 pg_ctl
命令了。
💡 注意事项
- 路径一致性:确保你设置的环境变量
PGDATA
(这里是/home/pgsql/data
)与你的实际数据目录路径完全一致。如果不一致,后续操作可能会失败。 - 用户权限:上述操作(除了使用
sudo
的步骤)务必在postgres
用户下进行,或者使用su - postgres
切换后操作,避免权限问题。 - 安装验证:如果系统根本找不到任何
pg_ctl
命令,很可能 PostgreSQL 没有成功安装。你可能需要重新检查你的离线安装过程是否完整,所有必要的包是否都已安装。 - 版本差异:你实际安装的 PostgreSQL 版本可能不是 17.5,因此查找路径时可能会有所不同(例如,可能是
/usr/pgsql-13/bin/pg_ctl
)。请以你的实际环境为准。
💡 注意事项
- 版本兼容性:确保你下载的PostgreSQL版本与UnionTech OS Server 20的系统架构(x86_64、aarch64等)和库文件兼容。
- 依赖完整性:离线安装最关键的就是解决所有依赖问题。务必确保所有必要的依赖包(无论是用于RPM安装还是源码编译)都已准备好并正确安装。使用
ldd
命令检查PostgreSQL二进制文件是否有缺失的动态库。 - 防火墙:如果开启了防火墙,需要放行PostgreSQL的监听端口(默认为5432):
firewall-cmd --add-port=5432/tcp --permanent firewall-cmd --reload
- SELinux:如果系统启用了SELinux,可能需要配置相应的策略或将其设置为宽容模式(Permissive)以避免权限问题:
# 临时设置为Permissive setenforce 0 # 永久修改需编辑 /etc/selinux/config 文件
- 数据目录权限:务必保证数据目录(如
/home/pgsql/data
)的所有权和权限正确,确保postgres
用户有完全的读写权限。