PG源码编译安装之小版本升级(12.2 升级到12.7)

一、概述

由于PostgreSQL 输入验证错误漏洞(CVE-2021-32027 )问题,需升级pg版本到12.7版本。

二、环境准备

1、安装pg12.2

之前是用脚本自动安装pg12.2版本,可以看到是用源码编译安装的方式:

#!/bin/bash
#################################
# copyright by hwb
# DATE:2020-05-06
#
#################################


#postgresql
PG_USER=postgres
PG_GROUP=postgres
PG_HOME=/usr/local/postgres
PG_DATA=/data/pgdata
PG_LOG=/data/pglog
PG_ARCH=/data/pgarch
PG_PWD=fswl@1234
PG_PORT=55432
#磁盘
dev="/dev/sdb"

#调用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
source /etc/profile

#Require root to run this script.
[ $(id -u) -gt 0 ] && echo "请用root用户执行此脚本!" && exit 1

#报错日志记录
[ -f /tmp/install_error.log ] || touch /tmp/install_error.log
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$DATE 系统初始化报错记录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> /tmp/install_error.log


auto_disk(){
  echo ""
  echo -e "\033[33m**************************************************自动分区${dev}磁盘*******************************************************\033[0m"
  #判断磁盘是否已经进行了分区
  judge_disk=`fdisk -l $dev |grep "^$dev"|wc -l`
  #ge:大于等于
  if  [ $judge_disk -ge 1 ]; then
	action "****$dev磁盘已经分区,请管理员慎重检查*****" /bin/false
	echo "$dev磁盘已经分区,请管理员慎重检查" >> /tmp/install_error.log
	exit $?   #退出脚本,后面的命令不再执行
	else
	  echo "*******开始进行磁盘分区*******"
fdisk $dev <<EOF
n
p
1


w
EOF
      action "****$dev磁盘已经分区完成*****" /bin/true
  fi

  echo  "*******创建物理卷*******"
  pvcreate ${dev}1
  pvs
  #待分配空间
  pvfree=`pvs | grep $dev  | awk '{print $NF-1}'`

  echo "*******创建卷组*******"
  vgcreate datavg ${dev}1
  vgs

  echo "*******创建逻辑卷*******"
  lvcreate -n lv_data -L +${pvfree}G  datavg
  lvs

  echo "*******格式化磁盘*******"
  mkfs.ext4 /dev/datavg/lv_data

  echo "*******挂载及开机自动挂载*******"
  [ -d /data ] || mkdir -p /data
  \cp /etc/fstab /etc/fstab.$(date +%F)
  echo  "/dev/datavg/lv_data     /data                           ext4 defaults           0 0"  >>/etc/fstab
  mount -a

  echo -e "\033[33m*************************************************已完成磁盘自动分区**************************************************\033[0m"
  echo ""
  sleep 1
}




function install_postgresql12_el7(){
  auto_disk

  echo ""
  echo -e "\033[33m********************************************自动部署postgresql_12.2**************************************************\033[0m"

  action "******新建PG用户及目录******" /bin/true
  groupadd -r $PG_GROUP -g 555 && useradd -r $PG_USER -g 555 -u 555  -d /home/$PG_USER -m
  [ -d $PG_HOME ] || mkdir -p $PG_HOME &&  [ -d $PG_DATA ] || mkdir -p $PG_DATA && [ -d $PG_LOG ] || mkdir -p $PG_LOG && [ -d $PG_ARCH ] || mkdir -p $PG_ARCH
  id postgres

  action "******下载postgresql 12.2安装包******" /bin/true
  if [ -f /opt/postgresql-12.2.tar.gz ];then
      echo  "*****存在postgresql12.2安装包,无需下载*****"
  else
      ping -c 4 app.fslgz.com >/dev/null 2>&1
      if [ $? -eq 0 ];then
      	#wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz  -P /opt
		wget https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=773494497559511040 -O /opt/postgresql-12.2.tar.gz
		action "******下载postgresql12.2安装包完成******" /bin/true
      else
        action  "*****请手动下载postgresql 12.2安装包*****" /bin/false
		exit $?
      fi
  fi

  #配yum安装pg依赖包
  rpm -qa|grep flex
  if [ $? -eq 1 ];then
    #install_yum
    yum install -y openssl openssl-devel pam pam-devel libxml2 libxml2-devel  libxslt libxslt-devel perl perl-devel perl-ExtUtils* tcl-devel uuid-devel perl-ExtUtils-Embed readline   readline-devel  zlib zlib-devel gettext gettext-devel bison flex make gcc gcc-c++  &>/dev/null
    action "***************安装postgresql依赖包完成***************" /bin/true
    else
      action "****************已安装postgresql依赖包,无需安装****************" /bin/false
  fi

  #编译安装postgresql12.2
  pid=`ps -ef|grep postgres |grep -v grep | wc -l`
  if [ $pid -ge 1 ] ;then
     action "*********已存在postgresql进程,请检查是否还需部署postgresql数据库*********" /bin/false
     exit $?
  else
	 # 安装postgresql
     action "***************编译安装postgresql数据库***************" /bin/true
     tar -xvf /opt/postgresql-12.2.tar.gz -C  /opt/ &>/dev/null && chown -R $PG_USER:$PG_GROUP /opt/postgresql-12.2
	 cd /opt/postgresql-12.2 && ./configure --prefix=$PG_HOME --with-pgport=$PG_PORT --with-openssl --with-perl  --with-blocksize=16 &>/dev/null
	 make &>/dev/null && make install &>/dev/null
	 action "***************编译安装pg_stat_statements模块***************" /bin/true
	 cd /opt/postgresql-12.2/contrib/pg_stat_statements && make &>/dev/null && make install &>/dev/null
  fi

  #配置环境变量
cat >> /etc/profile <<EOF
export PGPORT=$PG_PORT
export PGUSER=$PG_USER
export PGHOME=$PG_HOME
export PGDATA=$PG_DATA
export LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARY_PATH
export PATH=$PG_HOME/bin:$PATH
EOF
  source /etc/profile

  #授权
  chown -R $PG_USER:$PG_GROUP $PG_HOME  && chmod -R 755 $PG_HOME
  chown -R $PG_USER:$PG_GROUP $PG_DATA  && chmod -R 755 $PG_DATA
  chown -R $PG_USER:$PG_GROUP $PG_LOG  && chmod -R 755  $PG_LOG
  chown -R $PG_USER:$PG_GROUP $PG_ARCH  && chmod -R 755 $PG_ARCH

  action "***************postgresql数据库初始化***************" /bin/true
su - $PG_USER <<EOF
cd  $PG_HOME/bin
./initdb -D $PG_DATA
exit
EOF

  action "***************postgresql数据库配置文件优化***************" /bin/true
  \cp $PG_DATA/postgresql.conf $PG_DATA/postgresql.conf_$DATE
  \cp $PG_DATA/pg_hba.conf $PG_DATA/pg_hba.conf_$DATE
cat > $PG_DATA/postgresql.conf <<EOF
# - Connection Settings -
# 监听
listen_addresses = '0.0.0.0'            # what IP address(es) to listen on;
# 监听端口
port = $PG_PORT                             # (change requires restart)

# 比较安全的值:建议不要大于 200*四分之一物理内存(GB), 例如四分之一物理内存为16G,则建议不要超过3200.
# (假设平均一个连接耗费5MB,实际上syscache很大、SQL 使用到WORK_MEM,未使用hugepage并且访问到大量shared buffer page时,可能消耗更多内存)
# 如果业务有更多并发连接,可以使用连接池,例如pgbouncer
# max_connections 公式:物理内存(GB)*1000*(1/4)/5
max_connections = 800                  # (change requires restart)
# 为超级用户保留多少个连接
superuser_reserved_connections = 20    # (change requires restart)

# $PGDATA, /tmp中 创建unix socket监听
unix_socket_directories = '., /tmp'     #comma-separated list of directories(change requires restart)
# 除了OWNER和超级用户,其他用户无法从/tmp unix socket连接该实例
unix_socket_permissions = 0700          # begin with 0 to use octal notation(change requires restart)

# - TCP Keepalives -
# 如果连接数据库空闲一段时间会端口,可能是网络中存在会话超时的设备,建议可以设置一下这个心跳时间,TCP心跳间隔会缩短到60秒。
tcp_keepalives_idle = 60                # TCP_KEEPIDLE, in seconds;
                                        # 0 selects the system default
tcp_keepalives_interval = 10            # TCP_KEEPINTVL, in seconds;
                                        # 0 selects the system default
tcp_keepalives_count = 10               # TCP_KEEPCNT;
                                        # 0 selects the system default

# - Authentication -
#authentication_timeout = 1min     # 1s-600s
#如果用户密码的MD5会泄露,建议使用scram-sha-256,但是相互不兼容,请注意。
#password_encryption = md5          # md5 or scram-sha-256
#db_user_namespace = off

# - SSL -
#ssl = off
#ssl_ca_file = ''
#ssl_cert_file = 'server.crt'
#ssl_crl_file = ''
#ssl_key_file = 'server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off

# - Locale and Formatting -
lc_messages = 'en_US.UTF-8'         # locale for system error message
                    # strings
lc_monetary = 'en_US.UTF-8'         # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'          # locale for number formatting
lc_time = 'en_US.UTF-8'             # locale for time formatting
default_text_search_config = 'pg_catalog.english'


# - Memory -
# 1/4 主机内存
# shared_buffers 公式: IF use hugepage: 主机内存*(1/4) ELSE: min(32GB, 主机内存*(1/4))
shared_buffers = 2GB                   # min 128kB
                                        # (change requires restart)

# 建议shared buffer设置超过32GB时 使用大页,页大小 /proc/meminfo Hugepagesize
huge_pages = try                        # on, off, or try
                                        # (change requires restart)
#temp_buffers = 8MB                     # min 800kB

# 如果用户需要使用两阶段提交,需要设置为大于0,建议与max_connections一样大
# max_prepared_transactions 公式: max_prepared_transactions=max_connections
max_prepared_transactions = 800         # zero disables the feature
                                        # (change requires restart)

# 可以在会话中设置,如果有大量JOIN,聚合操作,并且期望使用hash agg或hash join。   (排序,HASH都会用到work_mem)
# 可以设大一些,但是不建议大于四分之一内存除以最大连接数 (一条QUERY中可以使用多倍WORK_MEM,与执行计划中的NODE有关)
# work_mem 公式: max(min(物理内存/4096, 64MB), 4MB)
work_mem = 8MB                          # min 64kB

# 创建索引时使用的内存空间。
# maintenance_work_mem 公式: min( 8G, (主机内存*1/8)/max_parallel_maintenance_workers )
maintenance_work_mem = 128MB              # min 1MB

# 在对一张表进行垃圾回收时,用于缓存垃圾版本的ctid,
# 如果autovacuum work mem填满了,则VACUUM需要进入索引垃圾回收阶段,扫描索引(因此为了避免索引被多次扫描,需要缓存住一张表的所有垃圾TUPLE的CTID)。
# 一张表(细到单个最底层分区)垃圾回收结束后释放。
# autovacuum_work_mem 公式: min( 8G, (主机内存*1/8)/autovacuum_max_workers )
autovacuum_work_mem = 128MB               # min 1MB, or -1 to use maintenance_work_mem

#max_stack_depth = 2MB                  # min 100kB
dynamic_shared_memory_type = posix      # supported by the operating system: posix\sysv\windows\mmap

# - Cost-Based Vacuum Delay -
#VACUUM 运行会导致读写性能比较差,所以需要调整一些参数降低影响
# 如果你的系统IO非常好,则可以关闭vacuum delay,避免因为垃圾回收任务周期长导致的膨胀。
#vacuum_cost_delay 主要用于并发时降低I/O的影响,推荐为10,单位微秒,默认为0没有开启
vacuum_cost_delay = 10
vacuum_cost_page_hit = 1               # 0-10000 credits
vacuum_cost_page_miss = 10             # 0-10000 credits
vacuum_cost_page_dirty = 20            # 0-10000 credits
temp_file_limit = -1                   #默认-1表示不限制每个进程可使用的最大临时文件限制,单位kb

# io很好,CPU核数很多的机器,设大一些。如果设置了vacuum_cost_delay = 0,则这个不需要配置
vacuum_cost_limit = 200

# - Background Writer -
#指定background writer将dirty buffer写入磁盘的频率,默认200ms,即200ms写一次,写入周期200ms。
bgwriter_delay = 200ms                   # 10-10000ms between rounds
#指定一次写入周期 写入的dirty buffer的最大数量(单位buffers),默认值100
bgwriter_lru_maxpages = 1000            # max buffers written/round, 0 disables
#一次写入周期要写到磁盘的dirt buffers的数量T,是基于上一个周期内server进程需要的新的buffers数量N。
#bgwriter_lru_multiplier是一个乘法因子p,T = N * p;较大的值为峰值提供了缓冲,较小的值则需要服务器进程完成写入。
#如上一个写入周期内服务器使用了100个new buffer(100次写产生不同的脏数据),bgwriter_lru_multiplier使用了默认值2.那么这次会将100*2个dirty buffers写到磁盘中,也就是腾出了200个干净的buffers,
#如果再下一次写入周期前,服务器申请的buffers数量小于这个值,则自然够用,如果大于200,那么需要服务器自己去触发将dirty buffers写入磁盘。
bgwriter_lru_multiplier = 10.0          # 0-10.0 multiplier on buffers scanned/round
#上面的写入磁盘行为指的是普通意义的向磁盘文件写,但是会被操作系统缓存,所以实际行为可能没有写到磁盘中。
#当超过bgwriter_flush_after bytes的数据被bgwriter写时,强制OS将缓存数据写入物理磁盘。默认值为512KB
bgwriter_flush_after = 512kB            # measured in pages, 0 disables

# - Checkpoints -

#  不建议频繁做检查点,否则XLOG会产生很多的FULL PAGE WRITE(when full_page_writes=on)。
checkpoint_timeout = 60min              # range 30s-1d

# 建议等于SHARED BUFFER,或2倍。
# 同时需要考虑崩溃恢复时间,越大,检查点可能拉越长导致崩溃恢复耗时越长.但是越小,开启FPW时WAL日志写入量又越大.建议采用COW文件系统,关闭FPW。
# max_wal_size 公式: # min(shared_buffers*2 ,   用户存储空间/10)
max_wal_size = 2GB

# 建议是SHARED BUFFER的2分之一
# min_wal_size 公式: # min(shared_buffers/2  , 用户存储空间/10)
min_wal_size = 1GB

# 硬盘好(nvme ssd)的情况下,值越小可以让检查点快速结束,恢复时也可以快速达到一致状态。否则建议0.5~0.9
# 如果有hot standby作为HA节点,这个值也可以设置为0.5~0.9   避免写高峰时CHECKPOINT对写带来的冲击。
checkpoint_completion_target = 0.5      # checkpoint target duration, 0.0 - 1.0

# IO很好的机器,不需要考虑平滑调度, 否则建议128~256kB
checkpoint_flush_after = 256kB          # measured in pages, 0 disables
#checkpoint_warning = 30s               # 0 disables

# - Archiving -
# 打开后一个WAL文件写满后,会在pg_wal/archive_status目录中创建xxxxxx.ready的文件
# 归档命令archive_command正常结束后,会清除这个状态文件。
wal_level = replica
archive_mode = on             # enables archiving; off, on, or always
archive_command = 'test ! -f  $PG_ARCH/%f && cp %p  $PG_ARCH/%f;find $PG_ARCH/ -type f -mtime +30 -exec rm -f {} \;'

#  后期再修改,如  'test ! -f /disk1/digoal/arch/%f && cp %p /disk1/digoal/arch/%f'
#archive_command = '/bin/date'           # command to use to archive a logfile segment
#archive_command = 'DIR=$PG_ARCH/`date +%F`; sudo test ! -d \$DIR && sudo mkdir -p \$DIR; sudo test ! -f \$DIR/%f && sudo cp %p \$DIR/%f'
#archive_timeout = 0            # force a logfile segment switch after this,number of seconds; 0 disables

#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------
# - Where to Log -
log_destination = 'csvlog'              # Valid values:stderr, csvlog, syslog, and eventlog,

# This is used when logging to stderr:
logging_collector = on                  # Enable capturing of stderr and csvlog into log files.

# These are only used if logging_collector is on:
log_directory = 'log'                   # directory where log files are written,can be absolute or relative to PGDATA

# 时间格式 http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html
# 设置参考 https://www.postgresql.org/docs/11/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHERE
# 日志保留一天,每个小时一个文件取决于log_rotation_age,每小时切换一下
log_filename = 'postgresql-%H.log'      # log file name pattern,
# 日志保留一个月例子,每天一个文件取决于log_rotation_age    每天切换一下
# log_filename = 'postgresql-%d.log'    # log file name pattern,
# 日志保留一周例子,每天一个文件取决于log_rotation_age    每天切换一下
# log_filename = 'postgresql-%a.log'    # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the same name as the new log file will be
 #truncated rather than appended to. But such truncation only occurs on  time-driven rotation, not on restarts or size-driven rotation.

# 配合log_filename设置,建议与%后面的名字周期一致
log_rotation_age = 1h                   # Automatic rotation of logfiles will
                                        # happen after that time.  0 disables.

# 单个日志文件最大多大时,被截断,可以设置一个上限防止日志无限制增长
log_rotation_size = 1GB

# 根据实际情况设定,例如业务上认为60秒以上是慢SQL,那么就设置为60秒。
log_min_duration_statement =120s        # -1 is disabled, 0 logs all statements
                                        # and their durations, > 0 logs only
                                        # statements running at least this number
                                        # of milliseconds

# - What to Log -
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on

# 记录检查点的详细统计信息
log_checkpoints = on

# 如果业务是短连接,建议设置为OFF,否则建议设置为ON
log_connections = off

# 如果业务是短连接,建议设置为OFF,否则建议设置为ON
log_disconnections = off

#log_duration = off

# 记录错误代码的代码位置,是什么代码输出的日志,更好的跟踪问题
log_error_verbosity = verbose    # terse, default, or verbose messages
#log_hostname = off
#log_line_prefix = '%m [%p] '           # special values:
                                        #   %a = application name
                                        #   %u = user name
                                        #   %d = database name
                                        #   %r = remote host and port
                                        #   %h = remote host
                                        #   %p = process ID
                                        #   %t = timestamp without milliseconds
                                        #   %m = timestamp with milliseconds
                                        #   %n = timestamp with milliseconds (as a Unix epoch)
                                        #   %i = command tag
                                        #   %e = SQL state
                                        #   %c = session ID
                                        #   %l = session line number
                                        #   %s = session start timestamp
                                        #   %v = virtual transaction ID
                                        #   %x = transaction ID (0 if none)
                                        #   %q = stop here in non-session
                                        #        processes
                                        #   %% = '%'
                                        # e.g. '<%u%%%d> '

# 是否打印锁等待事件
log_lock_waits = on                   # log lock waits >= deadlock_timeout

# 如果需要审计SQL,则可以设置为all
log_statement = 'ddl'                 # none, ddl, mod, all

#log_replication_commands = off

# 当使用的临时文件超过多大时,打印到日志中,跟踪大SQL。
log_temp_files = 256MB                    # log temporary files equal or larger
                                        # than the specified size in kilobytes;
                                        # -1 disables, 0 logs all temp files
log_timezone = 'PRC'
timezone = 'PRC'


# - Planner Cost Constants -
# 扣掉会话连接RSS,shared buffer, autovacuum worker, 剩下的都是OS可用的CACHE。
# effective_cache_size 公式: 主机内存*0.75
effective_cache_size = 12GB

#------------------------------------------------------------------------------
## PG_STAT_STATEMENTS OPTIONS
##------------------------------------------------------------------------------
shared_preload_libraries = 'pg_stat_statements'
track_io_timing = on              #跟踪IO消耗的时间
pg_stat_statements.max = 10000    #最多保留多少条统计信息,通过LRU算法,覆盖老的记录。
pg_stat_statements.track = all    #all:所有SQL包括函数内嵌套的SQL,top:直接执行的SQL(函数内的sql不被跟踪),none:不跟踪
pg_stat_statements.track_utility=on # 是否跟踪非DML语句 (例如DDL,DCL),on表示跟踪, off表示不跟踪
pg_stat_statements.save = on      # 重启后是否保留统计信息
#track_activity_query_size = 2048  #设置单条SQL的最长长度,超过被截断显示
EOF

cat > $PG_DATA/pg_hba.conf <<EOF
# TYPE  DATABASE    USER   ADDRESS   METHOD
#在本地允许任何用户无密码登录
#local          all               all                         trust
#操作系统的登录用户和pg的用户是否一致,一致则可以登录
#local          all                all                        peer
#操作系统的登录用户和pg的用户是否一致,一致则可以登录
#local          all                all                        ident
#指定客户端IP访问通过md5身份验证进行登录
#host          all                all     0.0.0.0              md5
#指定客户端IP通过password身份验证进行登录
#host          all                all     0.0.0.0             password
local   all             $PG_USER                                peer
local   all             all                                     trust
host    all             all             0.0.0.0/0               md5
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
EOF

   action "***************postgresql数据库配置开机启动***************" /bin/true
cat > /etc/systemd/system/postgresql.service << EOF
[Unit]
Description=postgresql project
After=network.target

[Service]
Type=forking
#服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork #系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。 #pg需要通过fork来创建一些子进程,所以这里选择forKing
User=${PG_USER}
Group=${PG_GROUP}
ExecStart=${PG_HOME}/bin/pg_ctl start -D $PG_DATA  -l ${PG_LOG}/server.log
ExecReload=${PG_HOME}/bin/pg_ctl restart -D $PG_DATA  -l ${PG_LOG}/server.log
ExecStop=${PG_HOME}/bin/pg_ctl stop -D $PG_DATA   -l ${PG_LOG}/server.log
PrivateTmp=true
#是否给服务分配独立的临时空间(true/false)

[Install]
WantedBy=multi-user.target
#和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。“WantedBy=multi-user.target” #表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效
EOF
  chmod -R 754 /etc/systemd/system/postgresql.service
  systemctl daemon-reload
  systemctl enable postgresql
  action "*********启动postgresql数据库*********" /bin/true
  systemctl start postgresql
  systemctl status postgresql

  #systemctl启动postgresql服务不会在/tmp目录产生socket,需做软链接
  ln -s $PG_DATA/.s.PGSQL.$PG_PORT /tmp/.s.PGSQL.$PG_PORT

  #动态库配置
  echo "${PG_HOME}/lib" >> /etc/ld.so.conf.d/postgresql12.conf
  ldconfig

  action "*********修改数据库密码*********" /bin/true
su - $PG_USER <<EOF
$PG_HOME/bin/psql
alter user $PG_USER with password '$PG_PWD';
\q
exit
EOF

  echo -e "\033[33m**********************************************完成部署postgresql_12.2************************************************\033[0m"

cat > /tmp/pg.log  << EOF
PG安装目录:${PG_HOME}
PG数据目录:${PG_DATA}
PG日志目录:${PG_LOG}/server.log
PG版本:postgres-12.2
PG用户:${PG_USER}
PG端口:${PG_PORT}
PG密码:${PG_PWD}
EOF
  cat /tmp/pg.log
  echo -e "\e[1;31m 以上信息10秒后消失,保存在/tmp/pg.log文件下 \e[0m"
  echo -e "\033[33m*********************************************************************************************************************\033[0m"
  echo ""
  sleep 10
}

install_postgresql12_el7

2、准备测试数据

# su - postgres
$ psql  -Upostgres
create table t1 (id int ,info text);
insert into t1 values(100,now());
select * from t1;

在这里插入图片描述

三、停pg12.2并编译12.7

1、编译安装pg12.7到另一个目录

wget https://ftp.postgresql.org/pub/source/v12.7/postgresql-12.7.tar.gz  -P /opt
tar -xvf /opt/postgresql-12.7.tar.gz -C  /opt/ && chown -R postgres:postgres /opt/postgresql-12.7
cd /opt/postgresql-12.7
./configure --prefix=/usr/local/postgres --with-pgport=5432 --with-openssl --with-perl 
make  && make install
# 编译安装pg_stat_statements模块
cd /opt/postgresql-12.7/contrib/pg_stat_statements && make && make install
chown -R postgres:postgres /usr/local/postgres/
chmod -R 755 /usr/local/postgres/

在这里插入图片描述

2、停止pg12.2服务

这里顺便把虚拟机做个快照

systemctl stop postgresql
systemctl status postgresql

3、启动pg12.7服务

用pg12.7软件启动原有的数据目录,这步是重中之重

su - postgres
/usr/local/postgres/bin/pg_ctl start -D /data/pgdata/data  -l /data/pgdata/server.log

4、修正环境变量及自启动服务配置

vim /etc/systemd/system/postgresql.service
==============================================================================
[Unit]
Description=postgresql project
After=network.target

[Service]
Type=forking
#服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork #系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。 #pg需要通过fork来创建一些子进程,所以这里选择forKing
User=postgres
Group=postgres
ExecStart=/usr/local/postgres/bin/pg_ctl start -D /data/pgdata/data  -l /data/pgdata/server.log
ExecReload=/usr/local/postgres/bin/pg_ctl restart -D /data/pgdata/data  -l /data/pgdata/server.log
ExecStop=/usr/local/postgres/bin/pg_ctl stop -D /data/pgdata/data  -l /data/pgdata/server.log
PrivateTmp=true
#是否给服务分配独立的临时空间(true/false)

[Install]
WantedBy=multi-user.target
#和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。“WantedBy=multi-user.target” #表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效
========================================================================================================
systemctl daemon-reload
systemctl start postgresql

5、检查数据

可以发现已正常升级

# su - postgres
$ psql  -Upostgres
select * from t1;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定波007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值