源碼編譯安裝PostgreSQL(pg12)
摘要:源碼安裝PostgreSQL
系統環境:
Centos 7.7
PostgreSQL12.2
1. 安裝依賴包
# yum -y install readline readline-devel zlib zlib-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel perl perl-devel tcl-devel uuid-devel gcc gcc-c++ make flex bison perl-ExtUtils*
此步驟可選,可根據需要選擇,本人是先直接編譯安裝postgres,然后根據提示再回頭安裝所需的依賴包,也推薦根據報錯信息來安裝依賴包,加深pg所需依賴包的作用。
2. 內核參數調整
根據需要指定,可跳過,采用默認值
# vi /etc/sysctl.conf
查看已完成配置
# sysctl -p
3. 用戶limits設置
建議設置一下
# vi /etc/security/limits.conf
postgres soft nofile 1048576
postgres hard nofile 1048576
postgres soft nproc 131072
postgres hard nproc 131072
postgres soft stack 10240
postgres hard stack 32768
postgres soft core 6291456
postgres hard core 6291456
4. 創建用戶和組
# groupadd dba -g 2000
# useradd postgres -g 2000 -u 2000
# id postgres
uid=2000(postgres) gid=2000(dba) groups=2000(dba)
建議固化uid與gid,特別是后期配置流復制或集群。
5. 目錄規划
源文件目錄
# mkdir /soft
安裝文件目錄
# mkdir -p /soft/opt/pg12
數據目錄
# mkdir -p /opt/data5555
WAL目錄
# mkdir -p /opt/wal5555
歸檔目錄
# mkdir -p /opt/archive5555
chmod -R 0770 /opt
chmod -R 0770 /soft
chown -R postgres:dba /soft
數據目錄等帶上端口號也是比較推薦的,尤其當存在多個實例時。
6. 編譯安裝
下載文件並解壓
# su - postgres
$ cd /soft
$ wget https://ftp.postgresql.org/pub/source/v12.1/postgresql-12.2.tar.gz
$ tar -zxvf postgresql-12.2.tar.gz
編譯
$ cd postgresql-12.2/
$ ./configure --prefix=/soft/opt/pg12 --with-pgport=5555
建議修改一下端口,不采用默認5432端口
安裝
使用gmake 或者gmake world
$ gmake world
當看到最后一行顯示為:
PostgreSQL, contrib, and documentation successfully made. Ready to install.
說明已經編譯成功
使用gmake install或者gmake install-world 進行安裝
$ gmake install-world //包含擴展包和文檔
當看到最后一行顯示為:
PostgreSQL, contrib, and documentation installation complete.
說明已經安裝成功
查看版本
$ /soft/opt/pg12/bin/postgres --version
postgres (PostgreSQL) 12.2
7. 設置軟鏈接
$ cd /soft/opt
$ ln -s /soft/opt/pg12 /opt/pgsql
創建一個軟鏈接指向當前版本,當進行版本變更后,不需要調整調用腳本,只需要修改這個軟鏈接即可,后面都會使用這個軟鏈接。
8. 初始化數據目錄
$ /opt/pgsql/bin/initdb -D /opt/data5555 -X /opt/wal5555 -E UTF8 -U postgres -W
下面的例子使用簡體中文編碼
$ /opt/pgsql/bin/initdb -D/opt/data5555
-E EUC_CN
--locale=zh_CN
-W
9. 修改數據庫參數
下面是一個參考配置
$ vi /opt/data5555/postgresql.conf
listen_addresses='192.168.220.150'
port=5555
max_connections=1000
unix_socket_directories='/opt/data5555'
wal_level=logical
archive_mode=on
archive_command='cp %p /opt/archive5555/%f'
max_wal_size=1GB
max_wal_senders=10
wal_keep_segments=512
hot_standby=on
logging_collector=on
log_destination=csvlog
log_directory='/opt/data5555/pg_log'
log_filename='pg_log_%Y-%m-%d_%H%M%S.log'
log_file_mode=0600
log_truncate_on_rotation=on
log_rotation_age=1d
log_rotation_size=10MB
log_min_messages=warning
log_min_duration_statement=30s
log_checkpoints=on
log_connections=on
log_disconnections=on
log_duration=on
log_lock_waits=on
log_statement=DDL
10.配置環境變量
$ vi ~/.bash_profile
export PGPORT=5555
export PGUSER=postgres
export PGHOME=/opt/pgsql
export PGDATA=/opt/data5555
export PATH=$PGHOME/bin:$PATH
11.手工啟停數據庫
查看數據庫運行狀態
$ pg_ctl -D /opt/data5555 status
啟動數據庫
$ pg_ctl -D /opt/data5555 start &
停止數據庫
$ pg_ctl -D /opt/data5555 stop
12.查看實例進程
$ ps f -u postgres
PID TTY STAT TIME COMMAND
1323 pts/0 S 0:00 -bash
1456 pts/0 R+ 0:00 \_ ps f -u postgres
1058 ? Ss 0:00 /opt/pg12/bin/postgres -D /opt/data5555
1068 ? Ss 0:00 \_ postgres: logger
1070 ? Ss 0:00 \_ postgres: checkpointer
1071 ? Ss 0:00 \_ postgres: background writer
1072 ? Ss 0:00 \_ postgres: walwriter
1073 ? Ss 0:00 \_ postgres: autovacuum launcher
1074 ? Ss 0:00 \_ postgres: archiver last was 000000010000000000000008
1075 ? Ss 0:00 \_ postgres: stats collector
1076 ? Ss 0:00 \_ postgres: logical replication launcher
13.開機自啟動
root用戶配置
# cp /soft/postgresql-12.2/contrib/start-scripts/linux /etc/init.d/postgres-12
# chmod +x /etc/init.d/postgres-12
# chkconfig postgres-12 on
# vi /etc/init.d/postgres-12
prefix=/opt/pgsql
PGDATA="/opt/data5555"
PGUSER=postgres
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PGCTL="$prefix/bin/pg_ctl"
set -e
# Only start if we can find the postmaster.
test -x $DAEMON ||
{
echo "$DAEMON not found"
if [ "$1" = "stop" ]
then exit 0
else exit 5
fi
}
# Parse command line parameters.
case $1 in
start)
echo -n "Starting PostgreSQL: "
su - $PGUSER -c "$PGCTL -D '$PGDATA' start >>/dev/null &"
echo "ok"
;;
stop)
echo -n "Stopping PostgreSQL: "
su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s"
echo "ok"
;;
restart)
echo -n "Restarting PostgreSQL: "
su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s"
su - $PGUSER -c "$PGCTL -D '$PGDATA' start >>/dev/null &"
echo "ok"
;;
reload)
echo -n "Reload PostgreSQL: "
su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
echo "ok"
;;
status)
su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
;;
*)
# Print help
echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
exit 1
;;
Esac
exit 0