准备工作

下载地址:https://www.postgresql.org/ftp/source/v16.3/

#挂载ISO
mount /dev/sr0 /mnt
df -h

#删除现有repo
cd /etc/yum.repos.d/
rm -rf *

#生成新的repo
cat >> /etc/yum.repos.d/centos.repo << "EOF"
[Centos7.9]
name=centos7.9
baseurl=file:///mnt
gpgcheck=0
EOF

#重新加载
yum repolist
#关闭selinux
sed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/selinux/config
setenforce 0

#放行5432端口
firewall-cmd --add-port=5432/tcp --permanent

#重启防火墙更新配置
firewall-cmd --reload

#验证
firewall-cmd --list-all
#安装依赖包
yum install -y make gcc gcc-c++ wget libicu-devel readline readline-devel zlib zlib-devel libxml2-devel libxslt-devel openssl-devel perl-devel python3 python3-devel initscripts

#下载源码包到指定目录
mkdir /data
cd /data
wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz --no-check-certificate

#添加用户和组
groupadd -g 1001 postgres
useradd -g 1001 -u 1001 -m postgres
#设置密码 a1!
passwd postgres

#创建目录
mkdir -p /data/postgresql/{pgdata,archive,scripts,backup,pg16,soft}
chown -R postgres:postgres /data
chmod -R 775 /data

#配置环境变量
su - postgres

vi ~/.bashrc
export PATH=/data/postgresql/pg16/bin:$PATH
export LD_LIBRARY_PATH=/data/postgresql/pg16/lib
export PGDATA=/data/postgresql/pgdata

source ~/.bashrc
  • zlib-devel: 备份时使用的压缩功能
  • readline-devel: 在psql中使用上下方向键把历史命令找出来
  • libxml2-devel: 使用xml数据类型
  • libxslt-devel: 使用libxslt
  • openssl-devel: 支持使用SSL连接加警
  • perl-devel: 使用Perl语言来开发
  • python-devel: 使用Python语言来开发

编译安装

cd /data
tar -xvf postgresql-16.3.tar.gz

cd /data/postgresql-16.3

#编译 给编译的版本添加一个-mao的后缀
./configure --prefix=/data/postgresql/pg16 --with-per --with-python --with-libxml --with-libxslt --with-openssl --with-blocksize=32 --with-wal-blocksize=32 --with-wal-segsize=64  --with-extra-version="-mao"

#安装
make && make install

#创建软链接   方便后续升级
cd /data/postgresql
ln -s pg16/ ./pgsql
  • --prefix: 指定安装目录为/data/postgresql/pg16
  • --with-perl: 使用Perl语言来编写自定义函数,使用该项要先安装perl开发包(perl-devel)
  • --with-python: 使用Python语言来编写自定义函数,使用该选项要先安装python-dev开发包(python-devel)
  • --with-libxml: 使用xml数据类型,使用该选项要先安装python-dev开发包(libxml2-devel)
  • --with-libxslt: 使用libxsit构建,启用xm12模块从而可以从xml到xsl的转换

PostgreSQL在数据仓库使用场景中,较大的数据块以提高IO性能

  • --with-blocksize: 指定数据块为32KB,默认是8KB
  • --with-wal-blocksize: 指定WAL日志块为32KB,默认是8KB
  • --with-wal-segsize: 指定WAL日志文件为64MB,默认是16MB

初始化数据库

#初始化数据库  -W 表示输入数据库用户postgres的初始化密码 a1!
initdb -E UTF8 --locale "C" -W

#查看环境变量
env|grep pgdata

#启动数据库  将日志输出当当前路径的 logfile 文件内
pg_ctl -l logfile start

#登录数据库
psql
#配置远程登陆
vi /data/postgresql/pgdata/pg_hba.conf 
# TYPE  DATABASE    USER    ADDRESS       METHOD
host      all       all    0.0.0.0/0        md5
host   replication  all    0.0.0.0/0        md5


cat >> /data/postgresql/pgdata/postgresql.conf <<"EOF"
listen_addresses = '*'
port=5432
unix_socket_directories='/data/postgresql/pgdata'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
EOF
  • pgdata:数据目录
  • pghost: 数据库主机或socket目录(默认:"本地接口")
  • pgport:数据库服务器的端口(默认:"5432")
  • pgdatabase: 指定要连接的数据库(默认:"postgres")
  • pguser: 指定数据库用户名(默认:"postgres")
#查询已安装的插件
select * from pg_available_extensions;

#安装插件
su - postgres
cd /data/postgresql-16.3/contrib
make && make install

#安装路径
cd /data/postgresql/pgsql/share/extension/
ll

#登录数据库再次查询已安装的插件
su - postgres
psql
select * from pg_available_extensions;

设置开机自启动

#启停数据库 fast(默认,立即断开所有客户端连接) smart immediate(慎用,下次启动需要恢复)
pg_ctl -l logfile start
pg_ctl stop -m fast

#查看数据库状态
pg_ctl -l logfile status

#切换root用户复制配置文件并授权
su - root
cd /data/postgresql-16.3/contrib/start-scripts
cp linux /etc/init.d/postgres
chmod +x /etc/init.d/postgres

#修改数据文件存放路径
vi /etc/init.d/postgres
prefix=/data/postgresql/pg16
PGDATA="/data/postgresql/pgdata"

#root用户使用service命令启动
service postgres start

#查看端口状态
ss -ltn

#设置开机启动
chkconfig postgres on

#查看开机启动项
chkconfig --list

报错解决:添加软连接

#如果遇到以下报错:
error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: 没有那个文件或目录 Is the server running locally and accepting connections on that socket?

#添加软连接
systemctl stop postgres
ln -s /data/postgresql/pgdata/.s.PGSQL.5432 /tmp/.s.PGSQL.5432
systemctl start postgres
systemctl status postgres