一、概述
由于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;