安装脚本

#!/bin/sh

# 使用示例: sh install_pgsql.sh /tool/postgresql-12.3.tar.gz
# 说明: 默认创建的数据库用户 postgres 其密码为 passwd

if [[ $# -ne 1 ]];then
echo 'please input PG software absolute file path !'
exit 1
fi
PG_SRC_DIR=`dirname $1` # 获取PG12.3 安装包绝对路径
PG_SRC_FILE=`basename $1` # 获取PG12.3 安装包绝对路径

: "
# 目录规划
PGHOME=/home/postgres/pgsql
PG_DATA=$PGHOME/data
|--> data 数据目录
|--> pg_server_log 服务器日志目录
|--> pg_wal_log PG wal日志目录
|--> pg_archive_log 归档日志目录
|--> pg_rman_backups pg_rman 备份目录
"

# 卸载残留的 rpm 包
for rpm_file in `rpm -qa | grep postgresql`
do
rpm -e $rpm_file
done


# 安装 rpm 包
yum -y install coreutils glib2 lrzsz mpstat dstat sysstat e4fsprogs xfsprogs ntp readline-devel zlib-devel openssl-devel pam-devel libxml2-devel libxslt-devel python-devel tcl-devel gcc make smartmontools flex bison perl-devel perl-ExtUtils* openldap-devel jadetex openjade bzip2

# 杀死 postgres 进程
pkill postgres

# 创建 postgres 用户
userdel -r postgres
useradd postgres

# 创建相关目录
USER_HOME=/home/postgres
PGHOME=/home/postgres/pgsql
rm -rf $PGHOME/{data,pg_server_log,pg_wal_log,pg_archive_log,pg_rman_backups}
mkdir -p $PGHOME/{data,pg_server_log,pg_wal_log,pg_archive_log,pg_rman_backups}
chown postgres.postgres -R $PGHOME/{data,pg_server_log,pg_wal_log,pg_archive_log,pg_rman_backups}

# 解压并编译安装PG
PG_VERSION=`echo ${PG_SRC_FILE} | sed -nr 's/.*-(.*).tar.gz/\1/g'p`
cd $PG_SRC_DIR && tar zxvf postgresql-${PG_VERSION}.tar.gz -C $USER_HOME
chown -R postgres.postgres postgresql-$PG_VERSION
cd $USER_HOME/postgresql-$PG_VERSION
./configure --prefix=$PGHOME --with-python && make world -j 8 && make install-world

chown -R postgres.postgres $PGHOME/*

# 环境变量设置
cat >> $USER_HOME/.bash_profile <<EOF
export PS1="[\u@\h \w]\$"
export PGHOME=$USER_HOME/pgsql
export PGDATA=$USER_HOME/pgsql/data
export PATH=$USER_HOME/pgsql/bin:$PATH
export PGUSER=postgres
export PGDATABASE=postgres
export LANG=en_US.utf8
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export MANPATH=PGHOME/share/man:/share/man:MANPATH
EOF

su - postgres -c "source $USER_HOME/.bash_profile"
su - postgres -c "initdb -D $PGDATA -E UTF8 --locale=C"


cat >> $PGDATA/postgresql.conf <<EOF
listen_addresses = '*'
port = 5432
max_connections = 200
shared_buffers = 512MB
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10
dynamic_shared_memory_type = posix
vacuum_cost_delay = 0
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 1000
bgwriter_lru_multiplier = 10.0
bgwriter_flush_after = 0
old_snapshot_threshold = -1
backend_flush_after = 0
wal_level = replica
synchronous_commit = off
full_page_writes = on
wal_buffers = 16MB
wal_writer_delay = 10ms
wal_writer_flush_after = 0
checkpoint_timeout = 30min
max_wal_size = 2GB
min_wal_size = 128MB
checkpoint_completion_target = 0.05
checkpoint_flush_after = 0
random_page_cost = 1.3
log_destination = 'syslog'
logging_collector = on
log_truncate_on_rotation = on
log_checkpoints = on
log_connections = on
log_disconnections = on
log_error_verbosity = verbose
autovacuum = on
log_autovacuum_min_duration = 0
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.05
autovacuum_freeze_max_age = 1500000000
autovacuum_multixact_freeze_max_age = 1600000000
autovacuum_vacuum_cost_delay = 0
vacuum_freeze_table_age = 1400000000
vacuum_multixact_freeze_table_age = 1500000000
datestyle = 'iso, mdy'
timezone = 'PRC'
lc_messages = 'C'
lc_monetary = 'C'
lc_numeric = 'C'
lc_time = 'C'
default_text_search_config = 'pg_catalog.english'
shared_preload_libraries='pg_stat_statements'
EOF

sed -i '/log_directory/d' $PGDATA/postgresql.conf
echo "log_directory = '/$PGHOME/pg_server_log'" >> $PGDATA/postgresql.conf
# 启动 PG
su - postgres -c "pg_ctl start -D $PGDATA"

# 修改 postgres 用户密码 为 passwd
psql -c "alter user postgres with ENCRYPTED password 'passwd'"

# 设置需要密码登陆
echo "host all all 0.0.0.0/0 trust " >> $PGDATA/pg_hba.conf
sed -i 's/trust/md5/g' $PGDATA/pg_hba.conf

# 重启 PG
su - postgres -c "pg_ctl restart -m fast"

测试

[root@node_205 ~]# su - postgres -c "psql"
Password for user postgres:
psql (12.3)
Type "help" for help.
postgres=#