本文将详细介绍如何在 CentOS 7.9 上安装和配置 PostgreSQL 16.3,包括源码获取、依赖安装、编译与安装、用户和权限配置、环境变量设置、数据库初始化、服务脚本创建、定时备份脚本编写,以及常见问题的解决方法。
1. 获取源码
首先,下载 PostgreSQL 16.3 的源码:
wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz
2. 安装编译需要的依赖
在 CentOS 上安装所需的开发包:
sudo yum install -y readline-devel zlib-devel openssl-devel libxml2-devel libxslt-devel python3-devel liblz4 liblz4-devel e2fsprogs-devel uuid uuid-devel libuuid-devel libaio-devel
3. 编译&安装
解压并编译安装 PostgreSQL:
tar -xzvf postgresql-16.3.tar.gz
cd postgresql-16.3
./configure --prefix=/usr/local/PostgreSQL --with-openssl --with-uuid=ossp --with-libxml --with-libxslt
make -j2
make install
4. 新增安装用户
创建 PostgreSQL 用户并设置数据目录权限:
sudo useradd -m postgres # 创建 PostgreSQL 用户
sudo passwd postgres # 为用户设置密码
sudo mkdir -p /home/postgres/opt/data # 创建数据目录
sudo chown -R postgres:postgres /home/postgres/opt/data # 将数据目录权限授予 postgres 用户
sudo chown -R postgres:postgres /usr/local/PostgreSQL # 将安装目录权限授予 postgres 用户
5. 配置环境postgres用户环境变量
切换到 postgres 用户并配置环境变量:
- 切换到postgres用户
su - postgres
- 编辑 ~/.bash_profile 文件:
export POSTGRES_HOME=/usr/local/PostgreSQL
export PATH=$POSTGRES_HOME/bin:/usr/sbin/ip:$HOME/.local/bin:$HOME/bin:$PATH
export LD_LIBRARY_PATH=$POSTGRES_HOME/lib:$LD_LIBRARY_PATH
- 重新加载环境变量:
source ~/.bash_profile
6. 数据库初始化
初始化数据库:
su - postgres
initdb -D /home/postgres/opt/data
7. 启动&停止数据库
启动和停止 PostgreSQL 数据库:
su - postgres
#启动
pg_ctl start -D /home/postgres/opt/data
#停止
pg_ctl stop -D /home/postgres/opt/data
8. 把数据库制作成系统服务脚本postgresql.service
创建并配置 PostgreSQL 服务脚本:
sudo nano /etc/systemd/system/postgresql.service
在文件中添加以下内容:
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
# 设定环境变量
Environment=PGDATA=/home/postgres/opt/data
# 配置启动和停止的命令
ExecStart=/usr/local/PostgreSQL/bin/pg_ctl start -D ${PGDATA} -s -o "-p 5432" -l /var/log/postgresql/postgresql.log
ExecStop=/usr/local/PostgreSQL/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/PostgreSQL/bin/pg_ctl reload -D ${PGDATA} -s
# 用户和组配置
User=postgres
Group=postgres
# 设置服务的运行限制
LimitNOFILE=65536
# 日志配置
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=postgresql
[Install]
WantedBy=multi-user.target
设置文件权限并重新加载 systemd 配置:
sudo chmod 644 /etc/systemd/system/postgresql.service
sudo systemctl daemon-reload
启动 PostgreSQL 服务并设置开机自启动:
sudo systemctl start postgresql
sudo systemctl enable postgresql
检查 PostgreSQL 服务状态:
sudo systemctl status postgresql
9. 定时备份数据库脚本
编写备份脚本 backups.sh:
#!/bin/bash
# 设定变量,备份文件存储路径,需要先用mkdir -p 命令进行建立
BACKUP_DIR="/var/backups/postgresql"
DATE=$(date +'%Y-%m-%d_%H-%M-%S')
# 需要备份的数据库
DATABASE_NAME="your_database_name"
USER="postgres"
PG_DUMP="/usr/local/PostgreSQL/bin/pg_dump"
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# 执行备份
${PG_DUMP} -U ${USER} ${DATABASE_NAME} > ${BACKUP_DIR}/backup_${DATABASE_NAME}_${DATE}.sql
# 删除7天前的备份
find ${BACKUP_DIR} -type f -mtime +7 -name '*.sql' -exec rm {} \;
为脚本添加可执行权限:
sudo chmod +x /usr/local/PostgreSQL/bin/backups.sh
创建一个 cron job 来定时运行这个脚本:
sudo crontab -e
设置每天凌晨2点执行备份脚本:
0 2 * * * /usr/local/PostgreSQL/bin/backups.sh
10. 遇见的问题以及解决办法
问题1: configure: error: no acceptable C compiler found in $PATH
解决办法:
sudo yum install gcc
问题2:configure: error: ICU library not found
If you have ICU already installed, see config.log for details on the
failure. It is possible the compiler isn’t looking in the proper directory.
Use --without-icu to disable ICU support.
解决办法:
sudo yum install icu libicu libicu-devel
问题3: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
解决办法:
sudo ln -s /usr/local/PostgreSQL/lib/libpq.so.5 /usr/lib64/libpq.so.5
问题4: /bin/sh: /var/log/postgresql/postgresql.log: No such file or directory
解决办法:
sudo mkdir -p /var/log/postgresql
sudo chown postgres:postgres /var/log/postgresql
sudo chmod 755 /var/log/postgresql
sudo systemctl daemon-reload
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl status postgresql
通过以上步骤,您已经成功在 CentOS 7.9 上安装并配置了 PostgreSQL 16.3,设置了数据库备份脚本,并解决了可能遇到的常见问题。