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
  2. #command to execute script: su - postgres -c "./create.sh"
  3. #default value refer to standard server(cpu:6cores,memory:32G,storage:12T)
  4. #value according to the actual situation
  5. #List of parameters to be modified
  6. :<<!
  7. enable_seqscan = off
  8. enable_indexscan = on
  9. enable_bitmapscan = on
  10. max_connections = 1000
  11. shared_buffers = 16GB
  12. effective_cache_size = 24GB
  13. work_mem = 32MB
  14. temp_buffers = 32MB
  15. wal_buffers = 512MB
  16. maintenance_work_mem = 2GB
  17. autovacuum_max_workers = 3
  18. autovacuum_work_mem = 256MB
  19. checkpoint_timeout = 30min
  20. max_wal_size = 4GB
  21. min_wal_size = 1GB
  22. checkpoint_completion_target = 0.9
  23. log_destination = csvlog
  24. log_directory = pg_log
  25. logging_collector = on
  26. log_min_duration_statement = 800
  27. log_rotation_size = 1024MB
  28. log_truncate_on_rotation = on
  29. log_filename = 'xl_log_%a.log'
  30. !
  31. ERROR="\033[41;37m ERROR \033[0m"
  32. INFO="\033[42;37m INFO \033[0m"
  33. WARN="\033[43;37m WARN \033[0m"
  34. COMMON_ERROR="some error happened, specific information please see console output"
  35. # Array of parameters
  36. declare -A parameter_array
  37. parameter_array=([enable_seqscan]=off [enable_indexscan]=on [enable_bitmapscan]=on [max_connections]=1000 [shared_buffers]=16GB
  38. [effective_cache_size]=24GB [work_mem]=32MB [temp_buffers]=32MB [wal_buffers]=512MB [maintenance_work_mem]=2GB
  39. [autovacuum_max_workers]=3 [autovacuum_work_mem]=256MB [checkpoint_timeout]=30min [max_wal_size]=4GB
  40. [min_wal_size]=1GB [checkpoint_completion_target]=0.9 [log_destination]=csvlog [log_directory]=pg_log
  41. [logging_collector]=on [log_min_duration_statement]=800 [log_rotation_size]=1024MB [log_truncate_on_rotation]=on [log_filename]=viid_log_%a.log )
  42. #default value :
  43. pgctl_path=
  44. data_directory=
  45. memory=
  46. # check command exit value, 0 is success
  47. function check_fun(){
  48. status=$?
  49. error=${COMMON_ERROR}
  50. if [[ 0 -ne ${status} ]] ; then
  51. echo -e "${ERROR} ${error}"
  52. exit 1
  53. fi
  54. }
  55. # prepare conditions
  56. function prepare_conditions(){
  57. data_directory=$(psql -qtAX -c "show data_directory" | sed 's/[ ]//g')
  58. check_fun
  59. if [[ ! -d "${data_directory}" ]] ; then
  60. echo -e "${ERROR} database's data directory does not exist"
  61. exit 1
  62. fi
  63. # physical machine environment
  64. memory=$(grep MemTotal /proc/meminfo | awk '{print $2 / 1024 / 1024}' | sed 's/\.[0-9]*//' | tail -n 1)
  65. check_fun
  66. # docker environment
  67. memory_limit=$(($(awk '{print $1}' /sys/fs/cgroup/memory/memory.limit_in_bytes) / 1024 / 1024 /1024))
  68. check_fun
  69. # comparing the two, choose the smaller one.
  70. if [[ "${memory_limit}" -le "${memory}" ]] ; then
  71. memory=${memory_limit}
  72. fi
  73. }
  74. # calculate parameters
  75. function calculate_parameters(){
  76. # 50%*memory
  77. parameter_array[shared_buffers]=$((memory * 1024 / 2))"MB"
  78. # 75%*memory
  79. parameter_array[effective_cache_size]=$((memory * 1024 * 3 / 4 ))"MB"
  80. # <1%
  81. parameter_array[work_mem]=${memory}"MB"
  82. # <1%
  83. parameter_array[temp_buffers]=${memory}"MB"
  84. # 32GB => 512MB
  85. parameter_array[wal_buffers]=$((memory * 16 ))"MB"
  86. # 32GB => 2048MB
  87. parameter_array[maintenance_work_mem]=$((memory * 64 ))"MB"
  88. }
  89. # modify parameters
  90. function modify_parameters(){
  91. # modify parameters by modifying file postgresql.conf:
  92. for parameter in ${!parameter_array[*]}
  93. do
  94. #check whether the parameters have been modified
  95. # PostgreSQL's default parameter configuration example: enable_seqscan = on
  96. # viid's example: enable_seqscan='on'
  97. check_out=$(grep "^${parameter}=" "${data_directory}"/postgresql.conf | grep -v '#' | tail -n 1)
  98. # process sleep
  99. sleep 0.2s
  100. if [[ -z "${check_out}" ]] ; then
  101. echo "${parameter}='${parameter_array[${parameter}]}'" >> "${data_directory}"/postgresql.conf
  102. check_fun
  103. echo -e "${INFO} modify ${parameter} successfully"
  104. else
  105. if [[ "${check_out}" = "${parameter}='${parameter_array[${parameter}]}'" ]] ; then
  106. echo -e "${INFO} ${parameter} is already configured, then skip this step"
  107. else
  108. sed -i s!^"${check_out}"!"${parameter}='${parameter_array[${parameter}]}'"!g "${data_directory}"/postgresql.conf
  109. check_fun
  110. echo -e "${INFO} modify ${parameter} successfully"
  111. fi
  112. fi
  113. done
  114. }
  115. # create directory(pg_log and pg_arch), and set user postgres permission
  116. function create_dir(){
  117. directory_array=("pg_arch" "pg_log")
  118. for directory in ${directory_array[*]};
  119. do
  120. # process sleep
  121. sleep 0.2s
  122. if [[ ! -d "${data_directory}/${directory}" ]] ; then
  123. mkdir -p "${data_directory}"/"${directory}"
  124. echo -e "${INFO} path ${data_directory}/${directory} create successfully"
  125. else
  126. echo -e "${INFO} ${data_directory}/${directory} is already exists, then skip this step"
  127. fi
  128. # set user postgres permission
  129. chown postgres:postgres "${data_directory}"/"${directory}"
  130. done
  131. }
  132. # because the environment is different, need to find the path of the database restart command 'pg_ctl'
  133. function find_cmd(){
  134. result=$(find / -name pg_ctl 2> /dev/null | grep bin/pg_ctl$ | tail -n 1 )
  135. # check whether the path exists
  136. if [[ -z "${result}" ]] ; then
  137. echo -e "${ERROR} database restart command 'pg_ctl' not exists"
  138. echo -e "${ERROR} please check to see if the database is installed or the command directory does not have permission to access it"
  139. exit 1
  140. else
  141. echo -e "${INFO} database restart command 'pg_ctl' path: ${result}"
  142. pgctl_path=${result}
  143. fi
  144. }
  145. # user choose whether to restart or not
  146. function check_restart(){
  147. read -r -p "Is it necessary to restart database immediately?[Enter YES or NO]:" result
  148. if [[ "${result,,}" = "yes" ]] ; then
  149. echo -e "${INFO} start to restart database"
  150. ${pgctl_path} restart -D "${data_directory}" >& /dev/null
  151. if [[ 0 -ne ${status} ]] ; then
  152. echo -e "${ERROR} restart database failed"
  153. exit 12
  154. fi
  155. elif [[ "${result,,}" = "no" ]] ; then
  156. echo -e "${WARN} please restart database manually"
  157. echo -e "${WARN} if you don't restart, database may not be available"
  158. exit 11
  159. else
  160. echo -e "${ERROR} invalid input,please enter again"
  161. check_restart
  162. fi
  163. }
  164. # ******* start *******
  165. # prepare conditions:memory ,data_directory
  166. prepare_conditions
  167. # calculate parameters
  168. calculate_parameters
  169. # modify parameters
  170. modify_parameters
  171. # create directory(pg_log and pg_arch)
  172. create_dir
  173. # the path of the database restart command 'pg_ctl'
  174. find_cmd
  175. # remind user that they need to restart database to take effect
  176. # process sleep
  177. sleep 0.5s
  178. echo -e ""
  179. echo -e "*******************************************************************"
  180. echo -e "* *"
  181. echo -e "* *"
  182. echo -e "* restart database to take effect *"
  183. echo -e "* *"
  184. echo -e "* *"
  185. echo -e "*******************************************************************"
  186. # process sleep
  187. sleep 0.5s
  188. # user choose whether to restart or not
  189. # check_restart
  190. echo -e "${INFO} start to restart database"
  191. ${pgctl_path} restart -D "${data_directory}" >& /dev/null
文章知识点与官方知识档案匹配,可进一步学习相关知识
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. 华为云MVP程云:知识化转型,最终要赋能一线

    摘要:如今的智能语音助手,可以帮助我们完成日常生活中的一些常规动作.同样,在企业中,智能问答机器人也在扮演着同样的角色. 本文分享自华为云社区<[亿码当先,云聚金陵]华为云MVP程云:知识化转型 ...

  2. iOS应用程序发布流程:从测试到上架的完整指南

    ​ 目录 转载:iOS应用程序的签名.重签名和安装测试 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 转载:iOS应用程序的签名.重签名和安装测试 前言 ipa ...

  3. Solon Aop 特色开发(6)新鲜货提取器,提取Bean的函数进行定制开发

    Solon,更小.更快.更自由!本系列专门介绍Solon Aop方面的特色: <Solon Aop 特色开发(1)注入或手动获取配置> <Solon Aop 特色开发(2)注入或手动 ...

  4. AI 0基础学习,数学名词解析

    AI学习过程中,常见的名词解析 中位数 将数据从小到大排序,奇数列,取中间值,偶数列,中间两个值的平均,可做为销售指标 众数 一组数据中,数值出现最多的那个.反映哪款产品,销量最好 平均数 比赛中,去 ...

  5. Axure 单键快捷键

    如果怕误操作,可以把它关闭

  6. Axure 绘制表格添加删除

    1.添加按钮:白底黑框,80X30,文本和命名均为"添加"; 2.数据表格(表头):1行5列,灰底黑框的表格作为表头,从左到右每个格子的文字分别为:姓名.性别.年龄.电话和操作: ...

  7. Android WebView 踩坑日记,字体怎么突然变小了???

    背景 最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小. 一开始不知道是什么原因,通过二分法查找最近的提交,排查之后 ...

  8. Rust Installation with relative Configuration

    References Rust Course The Hitchhiker's Guide to Rust mirrors.tuna.tsinghua.edu.cn Rust Crates 拉取慢的解 ...

  9. UVA540 Team Queue(双queue)

    题目大意 有一条长队,每个人均唯一属于一个组(有编号),执行给定操作序列,输出相应结果.操作如下: (假设长队q1) ENQUEUE x:标号为x的人入队,若q1中存在和x属于同一组的人,则将x插入长 ...

  10. 工作中使用Redis的10种场景

    前言 Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现. 今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景 ...