1.修改参数列表
(1)执行计划
enable_nestloop = off #默认为on
enable_seqscan = off #默认为on
enable_indexscan = on
enable_bitmapscan = on
max_connections = 1000 #默认为100
 
(2)内存相关
shared_buffers = 16GB # 默认为128MB
effective_cache_size = 24GB #默认为4GB
work_mem = 32MB
temp_buffers = 32MB
wal_buffers = 512MB
maintenance_work_mem = 2GB
 
(3)autovacuum
autovacuum = on
autovacuum_max_workers = 3 #默认为3
autovacuum_work_mem = 256MB
autovacuum_vacuum_scale_factor = 0.05 #默认为0.2
 
(4)检查点
max_wal_size = 4GB #默认为1GB
min_wal_size = 1GB #默认为80MB
checkpoint_completion_target = 0.9 #默认为0.5
checkpoint_timeout = 30min #默认为5min
 
(5)日志
log_destination = csvlog
log_directory = pg_log
logging_collector = on
log_min_duration_statement = 800
log_rotation_size = 1024MB
log_truncate_on_rotation = on
log_filename = 'xl_log_%a.log'
 
2.参数设置公式

这个shell脚本可以使用shell的关联数组对

    1. #!/bin/bash
      1. #command to execute script: su - postgres -c "./create.sh"
        1. #default value refer to standard server(cpu:6cores,memory:32G,storage:12T)
          1. #value according to the actual situation
              1. #List of parameters to be modified
                1. :<<!
                  1. enable_seqscan = off
                    1. enable_indexscan = on
                      1. enable_bitmapscan = on
                        1. max_connections = 1000
                          1. shared_buffers = 16GB
                            1. effective_cache_size = 24GB
                              1. work_mem = 32MB
                                1. temp_buffers = 32MB
                                  1. wal_buffers = 512MB
                                    1. maintenance_work_mem = 2GB
                                      1. autovacuum_max_workers = 3
                                        1. autovacuum_work_mem = 256MB
                                          1. checkpoint_timeout = 30min
                                            1. max_wal_size = 4GB
                                              1. min_wal_size = 1GB
                                                1. checkpoint_completion_target = 0.9
                                                  1. log_destination = csvlog
                                                    1. log_directory = pg_log
                                                      1. logging_collector = on
                                                        1. log_min_duration_statement = 800
                                                          1. log_rotation_size = 1024MB
                                                            1. log_truncate_on_rotation = on
                                                              1. log_filename = 'xl_log_%a.log'
                                                                1. !
                                                                    1. ERROR="\033[41;37m ERROR \033[0m"
                                                                      1. INFO="\033[42;37m INFO \033[0m"
                                                                        1. WARN="\033[43;37m WARN \033[0m"
                                                                          1. COMMON_ERROR="some error happened, specific information please see console output"
                                                                              1. # Array of parameters
                                                                                1. declare -A parameter_array
                                                                                  1. parameter_array=([enable_seqscan]=off [enable_indexscan]=on [enable_bitmapscan]=on [max_connections]=1000 [shared_buffers]=16GB
                                                                                    1. [effective_cache_size]=24GB [work_mem]=32MB [temp_buffers]=32MB [wal_buffers]=512MB [maintenance_work_mem]=2GB
                                                                                      1. [autovacuum_max_workers]=3 [autovacuum_work_mem]=256MB [checkpoint_timeout]=30min [max_wal_size]=4GB
                                                                                        1. [min_wal_size]=1GB [checkpoint_completion_target]=0.9 [log_destination]=csvlog [log_directory]=pg_log
                                                                                          1. [logging_collector]=on [log_min_duration_statement]=800 [log_rotation_size]=1024MB [log_truncate_on_rotation]=on [log_filename]=viid_log_%a.log )
                                                                                              1. #default value :
                                                                                                1. pgctl_path=
                                                                                                  1. data_directory=
                                                                                                    1. memory=
                                                                                                        1. # check command exit value, 0 is success
                                                                                                          1. function check_fun(){
                                                                                                            1. status=$?
                                                                                                              1. error=${COMMON_ERROR}
                                                                                                                1. if [[ 0 -ne ${status} ]] ; then
                                                                                                                  1. echo -e "${ERROR} ${error}"
                                                                                                                    1. exit 1
                                                                                                                      1. fi
                                                                                                                        1. }
                                                                                                                            1. # prepare conditions
                                                                                                                              1. function prepare_conditions(){
                                                                                                                                1. data_directory=$(psql -qtAX -c "show data_directory" | sed 's/[ ]//g')
                                                                                                                                  1. check_fun
                                                                                                                                    1. if [[ ! -d "${data_directory}" ]] ; then
                                                                                                                                      1. echo -e "${ERROR} database's data directory does not exist"
                                                                                                                                        1. exit 1
                                                                                                                                          1. fi
                                                                                                                                            1. # physical machine environment
                                                                                                                                              1. memory=$(grep MemTotal /proc/meminfo | awk '{print $2 / 1024 / 1024}' | sed 's/\.[0-9]*//' | tail -n 1)
                                                                                                                                                1. check_fun
                                                                                                                                                  1. # docker environment
                                                                                                                                                    1. memory_limit=$(($(awk '{print $1}' /sys/fs/cgroup/memory/memory.limit_in_bytes) / 1024 / 1024 /1024))
                                                                                                                                                      1. check_fun
                                                                                                                                                        1. # comparing the two, choose the smaller one.
                                                                                                                                                          1. if [[ "${memory_limit}" -le "${memory}" ]] ; then
                                                                                                                                                            1. memory=${memory_limit}
                                                                                                                                                              1. fi
                                                                                                                                                                1. }
                                                                                                                                                                    1. # calculate parameters
                                                                                                                                                                      1. function calculate_parameters(){
                                                                                                                                                                        1. # 50%*memory
                                                                                                                                                                          1. parameter_array[shared_buffers]=$((memory * 1024 / 2))"MB"
                                                                                                                                                                            1. # 75%*memory
                                                                                                                                                                              1. parameter_array[effective_cache_size]=$((memory * 1024 * 3 / 4 ))"MB"
                                                                                                                                                                                1. # <1%
                                                                                                                                                                                  1. parameter_array[work_mem]=${memory}"MB"
                                                                                                                                                                                    1. # <1%
                                                                                                                                                                                      1. parameter_array[temp_buffers]=${memory}"MB"
                                                                                                                                                                                        1. # 32GB => 512MB
                                                                                                                                                                                          1. parameter_array[wal_buffers]=$((memory * 16 ))"MB"
                                                                                                                                                                                            1. # 32GB => 2048MB
                                                                                                                                                                                              1. parameter_array[maintenance_work_mem]=$((memory * 64 ))"MB"
                                                                                                                                                                                                1. }
                                                                                                                                                                                                    1. # modify parameters
                                                                                                                                                                                                      1. function modify_parameters(){
                                                                                                                                                                                                        1. # modify parameters by modifying file postgresql.conf:
                                                                                                                                                                                                          1. for parameter in ${!parameter_array[*]}
                                                                                                                                                                                                            1. do
                                                                                                                                                                                                              1. #check whether the parameters have been modified
                                                                                                                                                                                                                1. # PostgreSQL's default parameter configuration example: enable_seqscan = on
                                                                                                                                                                                                                  1. # viid's example: enable_seqscan='on'
                                                                                                                                                                                                                    1. check_out=$(grep "^${parameter}=" "${data_directory}"/postgresql.conf | grep -v '#' | tail -n 1)
                                                                                                                                                                                                                      1. # process sleep
                                                                                                                                                                                                                        1. sleep 0.2s
                                                                                                                                                                                                                          1. if [[ -z "${check_out}" ]] ; then
                                                                                                                                                                                                                            1. echo "${parameter}='${parameter_array[${parameter}]}'" >> "${data_directory}"/postgresql.conf
                                                                                                                                                                                                                              1. check_fun
                                                                                                                                                                                                                                1. echo -e "${INFO} modify ${parameter} successfully"
                                                                                                                                                                                                                                  1. else
                                                                                                                                                                                                                                    1. if [[ "${check_out}" = "${parameter}='${parameter_array[${parameter}]}'" ]] ; then
                                                                                                                                                                                                                                      1. echo -e "${INFO} ${parameter} is already configured, then skip this step"
                                                                                                                                                                                                                                        1. else
                                                                                                                                                                                                                                          1. sed -i s!^"${check_out}"!"${parameter}='${parameter_array[${parameter}]}'"!g "${data_directory}"/postgresql.conf
                                                                                                                                                                                                                                            1. check_fun
                                                                                                                                                                                                                                              1. echo -e "${INFO} modify ${parameter} successfully"
                                                                                                                                                                                                                                                1. fi
                                                                                                                                                                                                                                                  1. fi
                                                                                                                                                                                                                                                    1. done
                                                                                                                                                                                                                                                      1. }
                                                                                                                                                                                                                                                          1. # create directory(pg_log and pg_arch), and set user postgres permission
                                                                                                                                                                                                                                                            1. function create_dir(){
                                                                                                                                                                                                                                                              1. directory_array=("pg_arch" "pg_log")
                                                                                                                                                                                                                                                                1. for directory in ${directory_array[*]};
                                                                                                                                                                                                                                                                  1. do
                                                                                                                                                                                                                                                                    1. # process sleep
                                                                                                                                                                                                                                                                      1. sleep 0.2s
                                                                                                                                                                                                                                                                        1. if [[ ! -d "${data_directory}/${directory}" ]] ; then
                                                                                                                                                                                                                                                                          1. mkdir -p "${data_directory}"/"${directory}"
                                                                                                                                                                                                                                                                            1. echo -e "${INFO} path ${data_directory}/${directory} create successfully"
                                                                                                                                                                                                                                                                              1. else
                                                                                                                                                                                                                                                                                1. echo -e "${INFO} ${data_directory}/${directory} is already exists, then skip this step"
                                                                                                                                                                                                                                                                                  1. fi
                                                                                                                                                                                                                                                                                    1. # set user postgres permission
                                                                                                                                                                                                                                                                                      1. chown postgres:postgres "${data_directory}"/"${directory}"
                                                                                                                                                                                                                                                                                        1. done
                                                                                                                                                                                                                                                                                          1. }
                                                                                                                                                                                                                                                                                              1. # because the environment is different, need to find the path of the database restart command 'pg_ctl'
                                                                                                                                                                                                                                                                                                1. function find_cmd(){
                                                                                                                                                                                                                                                                                                  1. result=$(find / -name pg_ctl 2> /dev/null | grep bin/pg_ctl$ | tail -n 1 )
                                                                                                                                                                                                                                                                                                    1. # check whether the path exists
                                                                                                                                                                                                                                                                                                      1. if [[ -z "${result}" ]] ; then
                                                                                                                                                                                                                                                                                                        1. echo -e "${ERROR} database restart command 'pg_ctl' not exists"
                                                                                                                                                                                                                                                                                                          1. echo -e "${ERROR} please check to see if the database is installed or the command directory does not have permission to access it"
                                                                                                                                                                                                                                                                                                            1. exit 1
                                                                                                                                                                                                                                                                                                              1. else
                                                                                                                                                                                                                                                                                                                1. echo -e "${INFO} database restart command 'pg_ctl' path: ${result}"
                                                                                                                                                                                                                                                                                                                  1. pgctl_path=${result}
                                                                                                                                                                                                                                                                                                                    1. fi
                                                                                                                                                                                                                                                                                                                      1. }
                                                                                                                                                                                                                                                                                                                          1. # user choose whether to restart or not
                                                                                                                                                                                                                                                                                                                            1. function check_restart(){
                                                                                                                                                                                                                                                                                                                              1. read -r -p "Is it necessary to restart database immediately?[Enter YES or NO]:" result
                                                                                                                                                                                                                                                                                                                                1. if [[ "${result,,}" = "yes" ]] ; then
                                                                                                                                                                                                                                                                                                                                  1. echo -e "${INFO} start to restart database"
                                                                                                                                                                                                                                                                                                                                    1. ${pgctl_path} restart -D "${data_directory}" >& /dev/null
                                                                                                                                                                                                                                                                                                                                      1. if [[ 0 -ne ${status} ]] ; then
                                                                                                                                                                                                                                                                                                                                        1. echo -e "${ERROR} restart database failed"
                                                                                                                                                                                                                                                                                                                                          1. exit 12
                                                                                                                                                                                                                                                                                                                                            1. fi
                                                                                                                                                                                                                                                                                                                                              1. elif [[ "${result,,}" = "no" ]] ; then
                                                                                                                                                                                                                                                                                                                                                1. echo -e "${WARN} please restart database manually"
                                                                                                                                                                                                                                                                                                                                                  1. echo -e "${WARN} if you don't restart, database may not be available"
                                                                                                                                                                                                                                                                                                                                                    1. exit 11
                                                                                                                                                                                                                                                                                                                                                      1. else
                                                                                                                                                                                                                                                                                                                                                        1. echo -e "${ERROR} invalid input,please enter again"
                                                                                                                                                                                                                                                                                                                                                          1. check_restart
                                                                                                                                                                                                                                                                                                                                                            1. fi
                                                                                                                                                                                                                                                                                                                                                              1. }
                                                                                                                                                                                                                                                                                                                                                                  1. # ******* start *******
                                                                                                                                                                                                                                                                                                                                                                    1. # prepare conditions:memory ,data_directory
                                                                                                                                                                                                                                                                                                                                                                      1. prepare_conditions
                                                                                                                                                                                                                                                                                                                                                                        1. # calculate parameters
                                                                                                                                                                                                                                                                                                                                                                          1. calculate_parameters
                                                                                                                                                                                                                                                                                                                                                                            1. # modify parameters
                                                                                                                                                                                                                                                                                                                                                                              1. modify_parameters
                                                                                                                                                                                                                                                                                                                                                                                1. # create directory(pg_log and pg_arch)
                                                                                                                                                                                                                                                                                                                                                                                  1. create_dir
                                                                                                                                                                                                                                                                                                                                                                                    1. # the path of the database restart command 'pg_ctl'
                                                                                                                                                                                                                                                                                                                                                                                      1. find_cmd
                                                                                                                                                                                                                                                                                                                                                                                        1. # remind user that they need to restart database to take effect
                                                                                                                                                                                                                                                                                                                                                                                          1. # process sleep
                                                                                                                                                                                                                                                                                                                                                                                            1. sleep 0.5s
                                                                                                                                                                                                                                                                                                                                                                                              1. echo -e ""
                                                                                                                                                                                                                                                                                                                                                                                                1. echo -e "*******************************************************************"
                                                                                                                                                                                                                                                                                                                                                                                                  1. echo -e "* *"
                                                                                                                                                                                                                                                                                                                                                                                                    1. echo -e "* *"
                                                                                                                                                                                                                                                                                                                                                                                                      1. echo -e "* restart database to take effect *"
                                                                                                                                                                                                                                                                                                                                                                                                        1. echo -e "* *"
                                                                                                                                                                                                                                                                                                                                                                                                          1. echo -e "* *"
                                                                                                                                                                                                                                                                                                                                                                                                            1. echo -e "*******************************************************************"
                                                                                                                                                                                                                                                                                                                                                                                                              1. # process sleep
                                                                                                                                                                                                                                                                                                                                                                                                                1. sleep 0.5s
                                                                                                                                                                                                                                                                                                                                                                                                                  1. # user choose whether to restart or not
                                                                                                                                                                                                                                                                                                                                                                                                                    1. # check_restart
                                                                                                                                                                                                                                                                                                                                                                                                                      1. echo -e "${INFO} start to restart database"
                                                                                                                                                                                                                                                                                                                                                                                                                        1. ${pgctl_path} restart -D "${data_directory}" >& /dev/null
                                                                                                                                                                                                                                                                                                                                                                                                                        1.  
                                                                                                                                                                                                                                                                                                                                                                                                                        文章知识点与官方知识档案匹配,可进一步学习相关知识
                                                                                                                                                                                                                                                                                                                                                                                                                        PostgreSQL技能树首页概览6104 人正在系统学习中

                                                                                                                                                                                                                                                                                                                                                                                                                        [转帖]PostgreSQL 参数优化设置 32GB内存(推荐) 内存参数 检查点 日志参数 自动初始化参数shell脚本的更多相关文章

                                                                                                                                                                                                                                                                                                                                                                                                                        1. vm内核参数优化设置

                                                                                                                                                                                                                                                                                                                                                                                                                           http://www.cnblogs.com/wjoyxt/archive/2014/06/08/3777042.html (1)vm.overcommit_memory 执行grep -i com ...

                                                                                                                                                                                                                                                                                                                                                                                                                        2. ajax 参数data问题 data中的 参数名 参数值为string 提交到后台后,会自动转换参数名相同的 类型 和 js字符串拼接

                                                                                                                                                                                                                                                                                                                                                                                                                          latlng"14.6005238,100.43635419999998"Cusid"accb5c1b-6aef-4f3b-a4eb-d60ea1ca5f54" ...

                                                                                                                                                                                                                                                                                                                                                                                                                        3. AI人脸识别SDK接入 — 参数优化篇(虹软)

                                                                                                                                                                                                                                                                                                                                                                                                                          引言 使用了虹软公司免费的人脸识别算法,感觉还是很不错的,当然,如果是初次接触的话会对一些接口的参数有些疑问的.这里分享一下我对一些参数的验证结果(这里以windows版本为例,linux.andro ...

                                                                                                                                                                                                                                                                                                                                                                                                                        4. 虹软AI 人脸识别SDK接入 — 参数优化篇

                                                                                                                                                                                                                                                                                                                                                                                                                          引言 使用了免费的人脸识别算法,感觉还是很不错的,但是初次接触的话会对一些接口的参数有些疑问的.这里分享一下我对一些参数的验证结果(这里以windows版本为例,linux.android基本一样), ...

                                                                                                                                                                                                                                                                                                                                                                                                                        5. linux——系统内核参数优化

                                                                                                                                                                                                                                                                                                                                                                                                                          vim /etc/sysctl.conf net.ipv4.tcp_syncookies = 1 fs.file-max = 999999 net.ipv4.tcp_max_tw_buckets = ...

                                                                                                                                                                                                                                                                                                                                                                                                                        6. 使用服务器参数文件(SPFILE)管理初始化参数

                                                                                                                                                                                                                                                                                                                                                                                                                          传统上,Oracle数据库的初始化参数存储在文本初始化参数文件中.为了更好的可管理性,您可以选择在二进制服务器参数文件中维护初始化参数,该文件在数据库启动和关闭期间保持不变.本节介绍服务器参数文件,并 ...

                                                                                                                                                                                                                                                                                                                                                                                                                        7. Ubuntu 系统服务器初始化配置、安全加固、内核优化和常用软件安装的Shell脚本分享

                                                                                                                                                                                                                                                                                                                                                                                                                          转载自:https://www.bilibili.com/read/cv13875402?spm_id_from=333.999.0.0 描述: 适用于企业内部 Ubuntu 操作服务器初始化.系统安 ...

                                                                                                                                                                                                                                                                                                                                                                                                                        8. CentOS7 系统服务器初始化配置、安全加固、内核升级优化常用软件安装的Shell脚本分享

                                                                                                                                                                                                                                                                                                                                                                                                                          转载自:https://www.bilibili.com/read/cv13875630?spm_id_from=333.999.0.0 描述: 适用于企业内部 CentOS7 系列操作服务器初始化. ...

                                                                                                                                                                                                                                                                                                                                                                                                                        9. javaee学习-servlet初始化参数

                                                                                                                                                                                                                                                                                                                                                                                                                          1.需要定义ServletConfig对象来接收servlet配置的初始化参数. 2.当servlet配置了初始化参数后,web容器在创建servlet实例对象时, 会自动将这些初始化参数封装到Ser ...

                                                                                                                                                                                                                                                                                                                                                                                                                        10. ORACLE初始化参数文件概述

                                                                                                                                                                                                                                                                                                                                                                                                                          ORACLE初始化参数文件概述 在9i之前,参数文件只有一种,它是文本格式的,称为pfile,在9i及以后的版本中,新增了服务器参数文件,称为spfile,它是二进制格式的.这两种参数文件都是用来存储 ...

                                                                                                                                                                                                                                                                                                                                                                                                                        随机推荐

                                                                                                                                                                                                                                                                                                                                                                                                                        1. nacos系列:spring cloud使用nacos实现配置管理和服务发现

                                                                                                                                                                                                                                                                                                                                                                                                                          目录 版本说明 创建项目 版本说明 IDEA:2021.3 Maven:3.6.3 Jdk:17 Spring-Boot:2.6.13 Spring-Cloud:2021.0.5 Spring-Clo ...

                                                                                                                                                                                                                                                                                                                                                                                                                        2. 一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效

                                                                                                                                                                                                                                                                                                                                                                                                                          华丽炫酷的动画特效总能够让人心旷神怡,不能自已.艳羡之余,如果还能够探究其华丽外表下的实现逻辑,那就是百尺竿头,更上一步了.本次我们使用图片.SCSS样式以及SVG图片动画来实现"点赞&qu ...

                                                                                                                                                                                                                                                                                                                                                                                                                        3. 关于汽车OTA,这篇科普文能告诉你

                                                                                                                                                                                                                                                                                                                                                                                                                          随着汽车中软件发挥的作用越来越重要,软件定义汽车已经是行业内的共识.汽车行业的发展极有可能最终像手机产业一样,基础硬件差异会越来越小,关键在于汽车给用户的体验的多样性,以及汽车产品在不同场景下满足用户 ...

                                                                                                                                                                                                                                                                                                                                                                                                                        4. 手把手带你写Node.JS版本小游戏

                                                                                                                                                                                                                                                                                                                                                                                                                          摘要:今天就利用Node.JS为大家带来简单有趣的的剪刀石头布的小游戏. JavaScript的出现催动了前端开发的萌芽,前后端分离促进了Vue.React等开发框架的发展,Weex.React-Na ...

                                                                                                                                                                                                                                                                                                                                                                                                                        5. SARIF在应用过程中对深层次需求的实现

                                                                                                                                                                                                                                                                                                                                                                                                                          摘要:为了降低各种分析工具的结果汇总到通用工作流程中的成本和复杂性, 业界开始采用静态分析结果交换格式(Static Analysis Results Interchange Format (SARI ...

                                                                                                                                                                                                                                                                                                                                                                                                                        6. 面试官:说一下Jena推理

                                                                                                                                                                                                                                                                                                                                                                                                                          摘要:本文介绍了Jena的推理子系统,并构建了一个简单的RDF图.基于该RDF图,我们搭建了一个Jena推理引擎,并进行自动化推理. 本文分享自华为云社区<知识推理之基于jena的知识推理(三) ...

                                                                                                                                                                                                                                                                                                                                                                                                                        7. Hudi自带工具DeltaStreamer的实时入湖最佳实践

                                                                                                                                                                                                                                                                                                                                                                                                                          摘要:本文介绍如何使用Hudi自带入湖工具DeltaStreamer进行数据的实时入湖. 本文分享自华为云社区<华为FusionInsight MRS实战 - Hudi实时入湖之DeltaStr ...

                                                                                                                                                                                                                                                                                                                                                                                                                        8. 测试用例又双叒叕失败了,NLP帮你

                                                                                                                                                                                                                                                                                                                                                                                                                          摘要:本文将介绍如何使用AI技术实现失败测试用例的智能分析. 本文分享自华为云社区<测试用例又双叒叕失败了,啥原因?NLP帮你来分析>,作者: 敏捷的小智 . 随着软件行业的快速发展,为了 ...

                                                                                                                                                                                                                                                                                                                                                                                                                        9. Go语言逆向技术:恢复函数名称算法

                                                                                                                                                                                                                                                                                                                                                                                                                          摘要:在对程序做安全审计.漏洞检测时,通常都需要对程序做逆向分析,本文在没有符号表的情况下,提出了一种恢复函数名称的算法,方便对go语言二进制文件进行逆向分析,提升分析效率. 本文分享自华为云社区&l ...

                                                                                                                                                                                                                                                                                                                                                                                                                        10. 浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战

                                                                                                                                                                                                                                                                                                                                                                                                                          作为前端老鸟,从IE的6.7.8开始做前端,各种兼容性折磨死人.js还好有了jQuery.chrome出来后,真是救苦救难,解救程序员的于水火.但是可恶的boss还是要求兼容ie6,7.感谢淘宝团队的 ...