因为数据库服务器重装系统,需要重新离线安装PG数据库。这里经过不断的试错,终于将数据库安装完成,记录一下每一步的操作流程。
依赖包下载并安装
经过不断试错,这里选择的方式是使用 DNF 的 downloadonly 插件创建本地仓库。
准备可信任相同系统环境的联网机器
这里我使用同样版本的openEuler在虚拟机搭建了一个新系统。
这一步还是需要的,因为之前我有一个openEuler,不知道是版本问题,还是依赖包的环境与服务器不同。下载下来的rpm包不全,导致报错。
联网机器操作
更新dnf
[root@localhost ~]# sudo dnf check-update #检查可用的更新
[root@localhost ~]# sudo dnf upgrade #安装系统更新
安装 createrepo
sudo dnf install -y createrepo
创建仓库目录并下载所有依赖包
mkdir -p ~/local_repo
cd ~/local_repo
# 下载所有必要的包及其依赖,第一次用了这个,好像下载的不行,如果不行换下面的语句
sudo dnf install --downloadonly --downloaddir=. gcc gcc-c++ make readline-devel zlib-devel openssl-devel libxml2-devel ncurses-devel python3-devel tcl-devel libxslt-devel perl-devel perl-ExtUtils-Embed bison flex autoconf patch libtool systemd-devel pam-devel libicu-devel
# 上面rpm下载不全,换这个
dnf download --resolve --alldeps gcc gcc-c++ make readline-devel zlib-devel openssl-devel libxml2-devel
创建本地仓库元数据
createrepo .
打包本地仓库
cd ..
tar -czvf local_pg_repo.tar.gz local_repo
下载 createrepo 包及其依赖
后面发现服务器上没有createrepo 又补了一下。
# 创建下载目录
mkdir -p ~/createrepo_pkgs
cd ~/createrepo_pkgs
# 下载 createrepo 及其所有依赖
sudo dnf install --downloadonly --downloaddir=. createrepo createrepo_c
将下载的包传输到离线服务器
# 打包下载的 RPM 文件
tar -czvf createrepo_pkgs.tar.gz *.rpm
# 然后通过 USB 或其他方式将此文件传输到离线服务器
离线服务器操作
安装createrepo 包
# 解压下载的包
tar -zxvf createrepo_pkgs.tar.gz -C /tmp/
cd /tmp
# 安装包
sudo rpm -ivh --nodeps *.rpm
# 或者尝试
sudo dnf install --nogpgcheck *.rpm
本地仓库配置,安装相关依赖
# 解压本地仓库
tar -zxvf local_pg_repo.tar.gz -C /opt/
# 这里之前我们安装了createrepo,如果有新的rpm加入,就需要重新创建本地仓库元数据。没有就不需要这一步。
createrepo /opt/local-repo/
# 创建本地仓库配置文件
sudo tee /etc/yum.repos.d/local-pg.repo > /dev/null << 'EOF'
[local-pg-repo]
name=PostgreSQL Local Repository
baseurl=file:///opt/local_repo
enabled=1
gpgcheck=0
EOF
# 清理DNF缓存并使用本地仓库安装依赖
sudo dnf clean all
sudo dnf --disablerepo="*" --enablerepo="local-pg-repo" install -y gcc gcc-c++ make readline-devel zlib-devel openssl-devel libxml2-devel
依赖检查
cd postgresql-11.1
./configure --prefix=/usr/local/pgsql
安装数据库
解压PostgreSQL源码
# 创建安装目录
mkdir -p ~/postgresql
cd ~/postgresql
# 解压源码包
tar -zxvf postgresql-11.1.tar.gz
cd postgresql-11.1
配置编译选项
# 基本配置--prefix就是安装路径了
./configure --prefix=/home/soft/pgsql
编译和安装
# 编译
make
# 安装
sudo make install
创建PostgreSQL用户和数据目录
# 创建postgres用户
sudo useradd postgres
# 创建数据目录
sudo mkdir -p /home/soft/pgsql/data
sudo chown postgres:postgres /home/soft/pgsql/data
初始化数据库
# 切换到postgres用户
sudo su - postgres
# 初始化数据库
/home/soft/pgsql/bin/initdb -D /home/soft/pgsql/data -E UTF8 --locale=C
启动数据库服务
# 以postgres用户启动
/home/soft/pgsql/bin/pg_ctl -D /home/soft/pgsql/data -l logfile start
配置环境变量
# 为当前用户配置
echo 'export PATH=$PATH:/home/soft/pgsql/bin' >> ~/.bashrc
echo 'export PGDATA=/home/soft/pgsql/data' >> ~/.bashrc
source ~/.bashrc
# 为postgres用户配置
sudo su - postgres
echo 'export PATH=$PATH:/home/soft/pgsql/bin' >> ~/.bashrc
echo 'export PGDATA=/home/soft/pgsql/data' >> ~/.bashrc
source ~/.bashrc
验证安装
# 以postgres用户登录到PostgreSQL
sudo su - postgres
psql -c "SELECT version();"
这应该显示安装的PostgreSQL 11.1版本信息。
数据库相关配置
打开data目录下,修改相关配置文件
修改postgresql.conf
# 原来可能是localhost
listen_addresses = '*'
# 原来应该是注释状态
password_encryption =md5
修改 pg_hba.conf
# IPv4 local connections: 开启远程连接,和密码登录
host all all 0.0.0.0/0 md5
数据库开机自启配置
ai推荐的是创建系统服务文件的方式,但是经过多次调整和测试都不成功。这里我们使用的是使用旧脚本注册 systemd。
PostgreSQL的开机自动启动脚本位于PostgreSQL源码目录下的contrib/start-scripts目录下。linux文件为linux环境下的开机自启动脚本,将其拷贝到“/etc/init.d”目录下,并改名为postgresql。
修改postgresql文件内容
prefix=/home/soft/pgsql
#PGDATA="/home/soft/pgsql/data"
# 将启动用户修改为实际用户,这里使用postgres,所以不变。
PGUSER=postgres
PGLOG="/home/soft/postgresql/log/server.log"
然后修改postgresql文件的执行权限
chmod a+x postgresql
添加开机启动
chkconfig --add postgresql
chkconfig postgresql on
这里我测试以后发现还是不行,查阅资料后,发现问题原因如下:
- 在 openEuler 和所有 systemd 现代系统中,服务必须是 .service 文件才能使用 systemctl enable 来注册开机启动。
- /etc/init.d/* 脚本并不是完整的 unit 文件,所以 systemd 拒绝用 enable 注册它。
如果上面成功,编辑 rc.local
sudo vi /etc/rc.d/rc.local
在末尾添加一行(注意路径):
/etc/init.d/postgresql start
赋予执行权限
chmod +x /etc/rc.d/rc.local
确保 rc-local.service 启用并运行
systemctl enable rc-local
systemctl start rc-local
检查状态
systemctl status rc-local
