From 571a55b3614fdfb2473348dd22a444a56ddb0632 Mon Sep 17 00:00:00 2001 From: faweizhao26 Date: Fri, 29 May 2026 18:14:02 +0800 Subject: [PATCH 1/2] docs: migrate from AsciiDoc to Markdown Signed-off-by: faweizhao26 --- .DS_Store | Bin 0 -> 8196 bytes CN/.DS_Store | Bin 0 -> 6148 bytes CN/antora.yml | 19 +- CN/modules/.DS_Store | Bin 0 -> 6148 bytes CN/modules/ROOT/.DS_Store | Bin 0 -> 8196 bytes CN/modules/ROOT/nav.adoc | 93 - CN/modules/ROOT/nav.md | 93 + CN/modules/ROOT/pages/{1.adoc => 1.md} | 60 +- CN/modules/ROOT/pages/{10.adoc => 10.md} | 28 +- CN/modules/ROOT/pages/{100.adoc => 100.md} | 8746 +++++++---------- CN/modules/ROOT/pages/110.adoc | 5063 ---------- CN/modules/ROOT/pages/110.md | 1627 +++ CN/modules/ROOT/pages/{2.adoc => 2.md} | 36 +- CN/modules/ROOT/pages/{23.adoc => 23.md} | 291 +- CN/modules/ROOT/pages/{3.1.adoc => 3.1.md} | 125 +- CN/modules/ROOT/pages/3.2.adoc | 1285 --- CN/modules/ROOT/pages/3.2.md | 1240 +++ CN/modules/ROOT/pages/{3.3.adoc => 3.3.md} | 194 +- CN/modules/ROOT/pages/{33.adoc => 33.md} | 27 +- CN/modules/ROOT/pages/{4.1.adoc => 4.1.md} | 229 +- CN/modules/ROOT/pages/{4.2.adoc => 4.2.md} | 110 +- CN/modules/ROOT/pages/{4.3.adoc => 4.3.md} | 1752 ++-- CN/modules/ROOT/pages/{4.4.adoc => 4.4.md} | 636 +- CN/modules/ROOT/pages/{4.5.adoc => 4.5.md} | 183 +- .../ROOT/pages/{4.6.1.adoc => 4.6.1.md} | 24 +- .../ROOT/pages/{4.6.2.adoc => 4.6.2.md} | 1105 +-- .../ROOT/pages/{4.6.3.adoc => 4.6.3.md} | 32 +- .../ROOT/pages/{4.6.4.adoc => 4.6.4.md} | 61 +- .../ROOT/pages/{4.7.1.adoc => 4.7.1.md} | 167 +- .../ROOT/pages/{4.7.2.adoc => 4.7.2.md} | 148 +- CN/modules/ROOT/pages/{4.7.adoc => 4.7.md} | 0 CN/modules/ROOT/pages/5.0.adoc | 28 - CN/modules/ROOT/pages/5.0.md | 21 + CN/modules/ROOT/pages/{5.1.adoc => 5.1.md} | 53 +- CN/modules/ROOT/pages/{5.10.adoc => 5.10.md} | 64 +- CN/modules/ROOT/pages/{5.2.adoc => 5.2.md} | 104 +- CN/modules/ROOT/pages/{5.3.adoc => 5.3.md} | 37 +- CN/modules/ROOT/pages/{5.4.adoc => 5.4.md} | 103 +- CN/modules/ROOT/pages/{5.5.adoc => 5.5.md} | 47 +- CN/modules/ROOT/pages/{5.6.adoc => 5.6.md} | 58 +- CN/modules/ROOT/pages/{5.7.adoc => 5.7.md} | 66 +- CN/modules/ROOT/pages/{5.8.adoc => 5.8.md} | 65 +- CN/modules/ROOT/pages/{5.9.adoc => 5.9.md} | 31 +- .../ROOT/pages/{6.1.1.adoc => 6.1.1.md} | 18 +- .../ROOT/pages/{6.2.1.adoc => 6.2.1.md} | 44 +- .../ROOT/pages/{6.3.1.adoc => 6.3.1.md} | 24 +- .../ROOT/pages/{6.3.10.adoc => 6.3.10.md} | 17 +- .../ROOT/pages/{6.3.11.adoc => 6.3.11.md} | 31 +- .../ROOT/pages/{6.3.12.adoc => 6.3.12.md} | 24 +- .../ROOT/pages/{6.3.2.adoc => 6.3.2.md} | 28 +- .../ROOT/pages/{6.3.3.adoc => 6.3.3.md} | 28 +- .../ROOT/pages/{6.3.4.adoc => 6.3.4.md} | 45 +- .../ROOT/pages/{6.3.5.adoc => 6.3.5.md} | 72 +- .../ROOT/pages/{6.3.6.adoc => 6.3.6.md} | 46 +- .../ROOT/pages/{6.3.7.adoc => 6.3.7.md} | 70 +- .../ROOT/pages/{6.3.8.adoc => 6.3.8.md} | 67 +- .../ROOT/pages/{6.3.9.adoc => 6.3.9.md} | 22 +- CN/modules/ROOT/pages/6.4.1.adoc | 94 - CN/modules/ROOT/pages/6.4.1.md | 82 + .../ROOT/pages/{6.4.2.adoc => 6.4.2.md} | 37 +- CN/modules/ROOT/pages/{6.5.adoc => 6.5.md} | 35 +- CN/modules/ROOT/pages/{7.1.adoc => 7.1.md} | 25 +- CN/modules/ROOT/pages/{7.10.adoc => 7.10.md} | 101 +- CN/modules/ROOT/pages/{7.11.adoc => 7.11.md} | 17 +- CN/modules/ROOT/pages/{7.12.adoc => 7.12.md} | 86 +- CN/modules/ROOT/pages/{7.13.adoc => 7.13.md} | 42 +- CN/modules/ROOT/pages/{7.14.adoc => 7.14.md} | 47 +- CN/modules/ROOT/pages/{7.15.adoc => 7.15.md} | 68 +- CN/modules/ROOT/pages/{7.16.adoc => 7.16.md} | 43 +- CN/modules/ROOT/pages/{7.17.adoc => 7.17.md} | 59 +- CN/modules/ROOT/pages/{7.18.adoc => 7.18.md} | 41 +- CN/modules/ROOT/pages/{7.19.adoc => 7.19.md} | 32 +- CN/modules/ROOT/pages/{7.2.adoc => 7.2.md} | 93 +- CN/modules/ROOT/pages/{7.20.adoc => 7.20.md} | 24 +- CN/modules/ROOT/pages/{7.21.adoc => 7.21.md} | 22 +- CN/modules/ROOT/pages/{7.22.adoc => 7.22.md} | 81 +- CN/modules/ROOT/pages/{7.3.adoc => 7.3.md} | 22 +- CN/modules/ROOT/pages/{7.4.adoc => 7.4.md} | 26 +- CN/modules/ROOT/pages/{7.5.adoc => 7.5.md} | 66 +- CN/modules/ROOT/pages/{7.6.adoc => 7.6.md} | 19 +- CN/modules/ROOT/pages/{7.7.adoc => 7.7.md} | 117 +- CN/modules/ROOT/pages/{7.8.adoc => 7.8.md} | 271 +- CN/modules/ROOT/pages/{7.9.adoc => 7.9.md} | 20 +- CN/modules/ROOT/pages/{8.1.adoc => 8.1.md} | 104 +- CN/modules/ROOT/pages/{8.2.adoc => 8.2.md} | 170 +- CN/modules/ROOT/pages/{9.adoc => 9.md} | 693 +- CN/modules/ROOT/pages/cpu_arch_adp.adoc | 15 - CN/modules/ROOT/pages/cpu_arch_adp.md | 8 + .../{os_arch_adp.adoc => os_arch_adp.md} | 24 +- CN/modules/ROOT/pages/welcome.adoc | 18 - CN/modules/ROOT/pages/welcome.md | 16 + EN/.DS_Store | Bin 0 -> 6148 bytes EN/antora.yml | 19 +- EN/modules/.DS_Store | Bin 0 -> 6148 bytes EN/modules/ROOT/.DS_Store | Bin 0 -> 6148 bytes EN/modules/ROOT/nav.adoc | 89 - EN/modules/ROOT/nav.md | 89 + EN/modules/ROOT/pages/{1.adoc => 1.md} | 61 +- EN/modules/ROOT/pages/{10.adoc => 10.md} | 16 +- EN/modules/ROOT/pages/{2.adoc => 2.md} | 36 +- EN/modules/ROOT/pages/{3.1.adoc => 3.1.md} | 121 +- EN/modules/ROOT/pages/{3.2.adoc => 3.2.md} | 1785 ++-- EN/modules/ROOT/pages/{3.3.adoc => 3.3.md} | 298 +- EN/modules/ROOT/pages/{4.1.adoc => 4.1.md} | 243 +- EN/modules/ROOT/pages/{4.2.adoc => 4.2.md} | 103 +- EN/modules/ROOT/pages/{4.3.adoc => 4.3.md} | 995 +- EN/modules/ROOT/pages/{4.4.adoc => 4.4.md} | 648 +- EN/modules/ROOT/pages/{4.5.adoc => 4.5.md} | 182 +- .../ROOT/pages/{4.6.1.adoc => 4.6.1.md} | 24 +- .../ROOT/pages/{4.6.2.adoc => 4.6.2.md} | 1308 +-- .../ROOT/pages/{4.6.3.adoc => 4.6.3.md} | 32 +- .../ROOT/pages/{4.6.4.adoc => 4.6.4.md} | 61 +- .../ROOT/pages/{4.7.1.adoc => 4.7.1.md} | 167 +- .../ROOT/pages/{4.7.2.adoc => 4.7.2.md} | 147 +- EN/modules/ROOT/pages/{4.7.adoc => 4.7.md} | 0 EN/modules/ROOT/pages/5.0.adoc | 29 - EN/modules/ROOT/pages/5.0.md | 21 + EN/modules/ROOT/pages/{5.1.adoc => 5.1.md} | 53 +- EN/modules/ROOT/pages/{5.10.adoc => 5.10.md} | 65 +- EN/modules/ROOT/pages/{5.2.adoc => 5.2.md} | 105 +- EN/modules/ROOT/pages/{5.3.adoc => 5.3.md} | 36 +- EN/modules/ROOT/pages/{5.4.adoc => 5.4.md} | 102 +- EN/modules/ROOT/pages/{5.5.adoc => 5.5.md} | 46 +- EN/modules/ROOT/pages/{5.6.adoc => 5.6.md} | 58 +- EN/modules/ROOT/pages/{5.7.adoc => 5.7.md} | 71 +- EN/modules/ROOT/pages/{5.8.adoc => 5.8.md} | 64 +- EN/modules/ROOT/pages/{5.9.adoc => 5.9.md} | 30 +- .../ROOT/pages/{6.1.1.adoc => 6.1.1.md} | 26 +- .../ROOT/pages/{6.2.1.adoc => 6.2.1.md} | 45 +- .../ROOT/pages/{6.3.1.adoc => 6.3.1.md} | 24 +- .../ROOT/pages/{6.3.10.adoc => 6.3.10.md} | 17 +- .../ROOT/pages/{6.3.11.adoc => 6.3.11.md} | 31 +- .../ROOT/pages/{6.3.12.adoc => 6.3.12.md} | 28 +- .../ROOT/pages/{6.3.2.adoc => 6.3.2.md} | 24 +- .../ROOT/pages/{6.3.3.adoc => 6.3.3.md} | 32 +- .../ROOT/pages/{6.3.4.adoc => 6.3.4.md} | 49 +- .../ROOT/pages/{6.3.5.adoc => 6.3.5.md} | 78 +- .../ROOT/pages/{6.3.6.adoc => 6.3.6.md} | 48 +- .../ROOT/pages/{6.3.7.adoc => 6.3.7.md} | 70 +- .../ROOT/pages/{6.3.8.adoc => 6.3.8.md} | 67 +- .../ROOT/pages/{6.3.9.adoc => 6.3.9.md} | 23 +- EN/modules/ROOT/pages/6.4.1.adoc | 97 - EN/modules/ROOT/pages/6.4.1.md | 85 + .../ROOT/pages/{6.4.2.adoc => 6.4.2.md} | 36 +- EN/modules/ROOT/pages/{6.5.adoc => 6.5.md} | 35 +- EN/modules/ROOT/pages/{7.1.adoc => 7.1.md} | 26 +- EN/modules/ROOT/pages/{7.10.adoc => 7.10.md} | 106 +- EN/modules/ROOT/pages/{7.11.adoc => 7.11.md} | 19 +- EN/modules/ROOT/pages/{7.12.adoc => 7.12.md} | 88 +- EN/modules/ROOT/pages/{7.13.adoc => 7.13.md} | 44 +- EN/modules/ROOT/pages/{7.14.adoc => 7.14.md} | 50 +- EN/modules/ROOT/pages/{7.15.adoc => 7.15.md} | 50 +- EN/modules/ROOT/pages/{7.16.adoc => 7.16.md} | 45 +- EN/modules/ROOT/pages/{7.17.adoc => 7.17.md} | 61 +- EN/modules/ROOT/pages/{7.18.adoc => 7.18.md} | 41 +- EN/modules/ROOT/pages/{7.19.adoc => 7.19.md} | 32 +- EN/modules/ROOT/pages/{7.2.adoc => 7.2.md} | 95 +- EN/modules/ROOT/pages/{7.20.adoc => 7.20.md} | 24 +- EN/modules/ROOT/pages/{7.21.adoc => 7.21.md} | 23 +- EN/modules/ROOT/pages/{7.22.adoc => 7.22.md} | 81 +- EN/modules/ROOT/pages/{7.3.adoc => 7.3.md} | 31 +- EN/modules/ROOT/pages/{7.4.adoc => 7.4.md} | 44 +- EN/modules/ROOT/pages/{7.5.adoc => 7.5.md} | 66 +- EN/modules/ROOT/pages/{7.6.adoc => 7.6.md} | 19 +- EN/modules/ROOT/pages/{7.7.adoc => 7.7.md} | 91 +- EN/modules/ROOT/pages/{7.8.adoc => 7.8.md} | 273 +- EN/modules/ROOT/pages/{7.9.adoc => 7.9.md} | 19 +- EN/modules/ROOT/pages/{8.adoc => 8.md} | 331 +- EN/modules/ROOT/pages/{9.adoc => 9.md} | 477 +- EN/modules/ROOT/pages/cpu_arch_adp.adoc | 15 - EN/modules/ROOT/pages/cpu_arch_adp.md | 8 + .../{os_arch_adp.adoc => os_arch_adp.md} | 25 +- EN/modules/ROOT/pages/welcome.adoc | 18 - EN/modules/ROOT/pages/welcome.md | 16 + README.md | 4 +- README_zh.md | 8 +- ...e.md => markdown_syntax_quick_reference.md | 121 +- 177 files changed, 14483 insertions(+), 22992 deletions(-) create mode 100644 .DS_Store create mode 100644 CN/.DS_Store create mode 100644 CN/modules/.DS_Store create mode 100644 CN/modules/ROOT/.DS_Store delete mode 100644 CN/modules/ROOT/nav.adoc create mode 100644 CN/modules/ROOT/nav.md rename CN/modules/ROOT/pages/{1.adoc => 1.md} (63%) rename CN/modules/ROOT/pages/{10.adoc => 10.md} (94%) rename CN/modules/ROOT/pages/{100.adoc => 100.md} (53%) delete mode 100644 CN/modules/ROOT/pages/110.adoc create mode 100644 CN/modules/ROOT/pages/110.md rename CN/modules/ROOT/pages/{2.adoc => 2.md} (82%) rename CN/modules/ROOT/pages/{23.adoc => 23.md} (82%) rename CN/modules/ROOT/pages/{3.1.adoc => 3.1.md} (59%) delete mode 100644 CN/modules/ROOT/pages/3.2.adoc create mode 100644 CN/modules/ROOT/pages/3.2.md rename CN/modules/ROOT/pages/{3.3.adoc => 3.3.md} (91%) rename CN/modules/ROOT/pages/{33.adoc => 33.md} (79%) rename CN/modules/ROOT/pages/{4.1.adoc => 4.1.md} (59%) rename CN/modules/ROOT/pages/{4.2.adoc => 4.2.md} (74%) rename CN/modules/ROOT/pages/{4.3.adoc => 4.3.md} (67%) rename CN/modules/ROOT/pages/{4.4.adoc => 4.4.md} (93%) rename CN/modules/ROOT/pages/{4.5.adoc => 4.5.md} (88%) rename CN/modules/ROOT/pages/{4.6.1.adoc => 4.6.1.md} (93%) rename CN/modules/ROOT/pages/{4.6.2.adoc => 4.6.2.md} (73%) rename CN/modules/ROOT/pages/{4.6.3.adoc => 4.6.3.md} (88%) rename CN/modules/ROOT/pages/{4.6.4.adoc => 4.6.4.md} (51%) rename CN/modules/ROOT/pages/{4.7.1.adoc => 4.7.1.md} (81%) rename CN/modules/ROOT/pages/{4.7.2.adoc => 4.7.2.md} (62%) rename CN/modules/ROOT/pages/{4.7.adoc => 4.7.md} (100%) delete mode 100644 CN/modules/ROOT/pages/5.0.adoc create mode 100644 CN/modules/ROOT/pages/5.0.md rename CN/modules/ROOT/pages/{5.1.adoc => 5.1.md} (64%) rename CN/modules/ROOT/pages/{5.10.adoc => 5.10.md} (79%) rename CN/modules/ROOT/pages/{5.2.adoc => 5.2.md} (83%) rename CN/modules/ROOT/pages/{5.3.adoc => 5.3.md} (78%) rename CN/modules/ROOT/pages/{5.4.adoc => 5.4.md} (71%) rename CN/modules/ROOT/pages/{5.5.adoc => 5.5.md} (82%) rename CN/modules/ROOT/pages/{5.6.adoc => 5.6.md} (74%) rename CN/modules/ROOT/pages/{5.7.adoc => 5.7.md} (72%) rename CN/modules/ROOT/pages/{5.8.adoc => 5.8.md} (91%) rename CN/modules/ROOT/pages/{5.9.adoc => 5.9.md} (83%) rename CN/modules/ROOT/pages/{6.1.1.adoc => 6.1.1.md} (95%) rename CN/modules/ROOT/pages/{6.2.1.adoc => 6.2.1.md} (81%) rename CN/modules/ROOT/pages/{6.3.1.adoc => 6.3.1.md} (91%) rename CN/modules/ROOT/pages/{6.3.10.adoc => 6.3.10.md} (82%) rename CN/modules/ROOT/pages/{6.3.11.adoc => 6.3.11.md} (89%) rename CN/modules/ROOT/pages/{6.3.12.adoc => 6.3.12.md} (92%) rename CN/modules/ROOT/pages/{6.3.2.adoc => 6.3.2.md} (94%) rename CN/modules/ROOT/pages/{6.3.3.adoc => 6.3.3.md} (93%) rename CN/modules/ROOT/pages/{6.3.4.adoc => 6.3.4.md} (90%) rename CN/modules/ROOT/pages/{6.3.5.adoc => 6.3.5.md} (74%) rename CN/modules/ROOT/pages/{6.3.6.adoc => 6.3.6.md} (95%) rename CN/modules/ROOT/pages/{6.3.7.adoc => 6.3.7.md} (91%) rename CN/modules/ROOT/pages/{6.3.8.adoc => 6.3.8.md} (91%) rename CN/modules/ROOT/pages/{6.3.9.adoc => 6.3.9.md} (90%) delete mode 100644 CN/modules/ROOT/pages/6.4.1.adoc create mode 100644 CN/modules/ROOT/pages/6.4.1.md rename CN/modules/ROOT/pages/{6.4.2.adoc => 6.4.2.md} (71%) rename CN/modules/ROOT/pages/{6.5.adoc => 6.5.md} (87%) rename CN/modules/ROOT/pages/{7.1.adoc => 7.1.md} (71%) rename CN/modules/ROOT/pages/{7.10.adoc => 7.10.md} (70%) rename CN/modules/ROOT/pages/{7.11.adoc => 7.11.md} (84%) rename CN/modules/ROOT/pages/{7.12.adoc => 7.12.md} (79%) rename CN/modules/ROOT/pages/{7.13.adoc => 7.13.md} (82%) rename CN/modules/ROOT/pages/{7.14.adoc => 7.14.md} (76%) rename CN/modules/ROOT/pages/{7.15.adoc => 7.15.md} (89%) rename CN/modules/ROOT/pages/{7.16.adoc => 7.16.md} (86%) rename CN/modules/ROOT/pages/{7.17.adoc => 7.17.md} (63%) rename CN/modules/ROOT/pages/{7.18.adoc => 7.18.md} (86%) rename CN/modules/ROOT/pages/{7.19.adoc => 7.19.md} (90%) rename CN/modules/ROOT/pages/{7.2.adoc => 7.2.md} (70%) rename CN/modules/ROOT/pages/{7.20.adoc => 7.20.md} (67%) rename CN/modules/ROOT/pages/{7.21.adoc => 7.21.md} (85%) rename CN/modules/ROOT/pages/{7.22.adoc => 7.22.md} (85%) rename CN/modules/ROOT/pages/{7.3.adoc => 7.3.md} (96%) rename CN/modules/ROOT/pages/{7.4.adoc => 7.4.md} (72%) rename CN/modules/ROOT/pages/{7.5.adoc => 7.5.md} (77%) rename CN/modules/ROOT/pages/{7.6.adoc => 7.6.md} (86%) rename CN/modules/ROOT/pages/{7.7.adoc => 7.7.md} (83%) rename CN/modules/ROOT/pages/{7.8.adoc => 7.8.md} (90%) rename CN/modules/ROOT/pages/{7.9.adoc => 7.9.md} (76%) rename CN/modules/ROOT/pages/{8.1.adoc => 8.1.md} (69%) rename CN/modules/ROOT/pages/{8.2.adoc => 8.2.md} (77%) rename CN/modules/ROOT/pages/{9.adoc => 9.md} (78%) delete mode 100644 CN/modules/ROOT/pages/cpu_arch_adp.adoc create mode 100644 CN/modules/ROOT/pages/cpu_arch_adp.md rename CN/modules/ROOT/pages/{os_arch_adp.adoc => os_arch_adp.md} (88%) delete mode 100644 CN/modules/ROOT/pages/welcome.adoc create mode 100644 CN/modules/ROOT/pages/welcome.md create mode 100644 EN/.DS_Store create mode 100644 EN/modules/.DS_Store create mode 100644 EN/modules/ROOT/.DS_Store delete mode 100644 EN/modules/ROOT/nav.adoc create mode 100644 EN/modules/ROOT/nav.md rename EN/modules/ROOT/pages/{1.adoc => 1.md} (66%) rename EN/modules/ROOT/pages/{10.adoc => 10.md} (98%) rename EN/modules/ROOT/pages/{2.adoc => 2.md} (80%) rename EN/modules/ROOT/pages/{3.1.adoc => 3.1.md} (61%) rename EN/modules/ROOT/pages/{3.2.adoc => 3.2.md} (53%) rename EN/modules/ROOT/pages/{3.3.adoc => 3.3.md} (69%) rename EN/modules/ROOT/pages/{4.1.adoc => 4.1.md} (57%) rename EN/modules/ROOT/pages/{4.2.adoc => 4.2.md} (74%) rename EN/modules/ROOT/pages/{4.3.adoc => 4.3.md} (76%) rename EN/modules/ROOT/pages/{4.4.adoc => 4.4.md} (81%) rename EN/modules/ROOT/pages/{4.5.adoc => 4.5.md} (90%) rename EN/modules/ROOT/pages/{4.6.1.adoc => 4.6.1.md} (93%) rename EN/modules/ROOT/pages/{4.6.2.adoc => 4.6.2.md} (76%) rename EN/modules/ROOT/pages/{4.6.3.adoc => 4.6.3.md} (89%) rename EN/modules/ROOT/pages/{4.6.4.adoc => 4.6.4.md} (50%) rename EN/modules/ROOT/pages/{4.7.1.adoc => 4.7.1.md} (81%) rename EN/modules/ROOT/pages/{4.7.2.adoc => 4.7.2.md} (61%) rename EN/modules/ROOT/pages/{4.7.adoc => 4.7.md} (100%) delete mode 100644 EN/modules/ROOT/pages/5.0.adoc create mode 100644 EN/modules/ROOT/pages/5.0.md rename EN/modules/ROOT/pages/{5.1.adoc => 5.1.md} (63%) rename EN/modules/ROOT/pages/{5.10.adoc => 5.10.md} (78%) rename EN/modules/ROOT/pages/{5.2.adoc => 5.2.md} (83%) rename EN/modules/ROOT/pages/{5.3.adoc => 5.3.md} (78%) rename EN/modules/ROOT/pages/{5.4.adoc => 5.4.md} (69%) rename EN/modules/ROOT/pages/{5.5.adoc => 5.5.md} (81%) rename EN/modules/ROOT/pages/{5.6.adoc => 5.6.md} (76%) rename EN/modules/ROOT/pages/{5.7.adoc => 5.7.md} (71%) rename EN/modules/ROOT/pages/{5.8.adoc => 5.8.md} (90%) rename EN/modules/ROOT/pages/{5.9.adoc => 5.9.md} (83%) rename EN/modules/ROOT/pages/{6.1.1.adoc => 6.1.1.md} (88%) rename EN/modules/ROOT/pages/{6.2.1.adoc => 6.2.1.md} (81%) rename EN/modules/ROOT/pages/{6.3.1.adoc => 6.3.1.md} (90%) rename EN/modules/ROOT/pages/{6.3.10.adoc => 6.3.10.md} (80%) rename EN/modules/ROOT/pages/{6.3.11.adoc => 6.3.11.md} (89%) rename EN/modules/ROOT/pages/{6.3.12.adoc => 6.3.12.md} (92%) rename EN/modules/ROOT/pages/{6.3.2.adoc => 6.3.2.md} (95%) rename EN/modules/ROOT/pages/{6.3.3.adoc => 6.3.3.md} (91%) rename EN/modules/ROOT/pages/{6.3.4.adoc => 6.3.4.md} (89%) rename EN/modules/ROOT/pages/{6.3.5.adoc => 6.3.5.md} (83%) rename EN/modules/ROOT/pages/{6.3.6.adoc => 6.3.6.md} (95%) rename EN/modules/ROOT/pages/{6.3.7.adoc => 6.3.7.md} (91%) rename EN/modules/ROOT/pages/{6.3.8.adoc => 6.3.8.md} (90%) rename EN/modules/ROOT/pages/{6.3.9.adoc => 6.3.9.md} (91%) delete mode 100644 EN/modules/ROOT/pages/6.4.1.adoc create mode 100644 EN/modules/ROOT/pages/6.4.1.md rename EN/modules/ROOT/pages/{6.4.2.adoc => 6.4.2.md} (71%) rename EN/modules/ROOT/pages/{6.5.adoc => 6.5.md} (87%) rename EN/modules/ROOT/pages/{7.1.adoc => 7.1.md} (77%) rename EN/modules/ROOT/pages/{7.10.adoc => 7.10.md} (69%) rename EN/modules/ROOT/pages/{7.11.adoc => 7.11.md} (83%) rename EN/modules/ROOT/pages/{7.12.adoc => 7.12.md} (80%) rename EN/modules/ROOT/pages/{7.13.adoc => 7.13.md} (80%) rename EN/modules/ROOT/pages/{7.14.adoc => 7.14.md} (73%) rename EN/modules/ROOT/pages/{7.15.adoc => 7.15.md} (90%) rename EN/modules/ROOT/pages/{7.16.adoc => 7.16.md} (86%) rename EN/modules/ROOT/pages/{7.17.adoc => 7.17.md} (77%) rename EN/modules/ROOT/pages/{7.18.adoc => 7.18.md} (87%) rename EN/modules/ROOT/pages/{7.19.adoc => 7.19.md} (90%) rename EN/modules/ROOT/pages/{7.2.adoc => 7.2.md} (74%) rename EN/modules/ROOT/pages/{7.20.adoc => 7.20.md} (64%) rename EN/modules/ROOT/pages/{7.21.adoc => 7.21.md} (86%) rename EN/modules/ROOT/pages/{7.22.adoc => 7.22.md} (85%) rename EN/modules/ROOT/pages/{7.3.adoc => 7.3.md} (96%) rename EN/modules/ROOT/pages/{7.4.adoc => 7.4.md} (72%) rename EN/modules/ROOT/pages/{7.5.adoc => 7.5.md} (76%) rename EN/modules/ROOT/pages/{7.6.adoc => 7.6.md} (85%) rename EN/modules/ROOT/pages/{7.7.adoc => 7.7.md} (82%) rename EN/modules/ROOT/pages/{7.8.adoc => 7.8.md} (91%) rename EN/modules/ROOT/pages/{7.9.adoc => 7.9.md} (78%) rename EN/modules/ROOT/pages/{8.adoc => 8.md} (82%) rename EN/modules/ROOT/pages/{9.adoc => 9.md} (86%) delete mode 100644 EN/modules/ROOT/pages/cpu_arch_adp.adoc create mode 100644 EN/modules/ROOT/pages/cpu_arch_adp.md rename EN/modules/ROOT/pages/{os_arch_adp.adoc => os_arch_adp.md} (69%) delete mode 100644 EN/modules/ROOT/pages/welcome.adoc create mode 100644 EN/modules/ROOT/pages/welcome.md rename adoc_syntax_quick_reference.md => markdown_syntax_quick_reference.md (53%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..553a4cbe9e7a13b9a84885834b81f319ed4ba352 GIT binary patch literal 8196 zcmeHMO-~a+7=EXqZbfv#7BOnFp%)Vy1QSK#!BQ}W7==)RC7@;74rOIKQ+BshBqTlR z)r&vCA7J9av;F`*dey`~;Kj4P^HGHsFD8BjXOfv`cHZ~dnfKY*otYK@NVZ-c1sDVX z3$sAG2aA1@u#4Q0V!B1}2=bxm^CH%5%vo(SU=%P47zK<1MggP1zoh`K*&>b-3=?)~L(3D02qd=zuV(pK?B;1+yd8zIEKKxZC zNs>OrMp)B6uZlI_3!{;d_axTUedzEJ>xk83-OH`70CzNZp9Km+Hy2!&+*??|hg!za*jB?&1 zH1)R;=4ko;kEZ#p8u}!DG{~FY3@BwwmB1^{tgePM%I~T#irz{A_x)KOdXdN3;iTCTWIUBQuWB}=TH0EPR!t*Gy`~>!eV%bfku<9;smv|yV!;KNfE+Bt1~lOrJck$X z2HwFZ_yS)^FBu?10lIS$}{Yy=vkg@ZuTY%+3aB)guwJFPZt?%zJNU-nW^V9RMI!qcR1c1AvA_ zV5$$R--xh_(ji@{rw5V9F?_IL0`{Q>UWa$mkuZ=j@UJl-_HG~US_UC-_+|etdc5p- z+(ElI94ssoM^aD&=*2zGp#lxu=@f!C@3(*VcA7z5js4E4du|X;PJSj`-Km~)y;`r< zuWc0`^JXEm!$x4){)T9+a_%{?ZaZr(ZI<-RJZGWpGV03!w?ffn^P$TsylL?Us{}H( z5E-jxgO>Ec0CQd}bGGc$J>;f!vK@{yiWMx?g(+C0et_5!Q(U)w-)2>6 z?QeOuL%k(t@i64IqKjFGmCGp$b-V1cYVPj$h|6@&ydG&f;hY zlP6JpSNy53s__(%0F|~+y;ty=$5|CEan#A6GtyFv*ZR-MdXr@)3?vMk9s}ZhFt7+T z6}BRjM+a72*cA4ZKq07$-vxn&LQ`QYLbRZeC=@XYCF+SmqHydtl%J`v6=4((M9z%k zsF{g+p%6Jc_8Zb2h#6s0Ck!MEoMfOoYU<+tzxU_&|H+`Fl`xPn@Lw@NQVWFz3sX{e zYe#b8t~Ic1V-X_!S`o?+tkiWZ6>$}hVUdD1Lnw%*!d8UXgOdCRNE(tVVc=95_zAMs B<;(y8 literal 0 HcmV?d00001 diff --git a/CN/antora.yml b/CN/antora.yml index dcf3824c..674107c3 100644 --- a/CN/antora.yml +++ b/CN/antora.yml @@ -1,21 +1,6 @@ name: ivorysql-doc title: 文档中心 version: v5.3 -start_page: welcome.adoc -asciidoc: - attributes: - source-language: asciidoc@ - table-caption: false - ivorysql-version: 5.3 - pg-version: 18.3 - package-link: 'https://github.com/ivorysql/ivorysql' - package-link-x86_64-deb: 'IvorySQL-5.3-4dfba1d-20260312.amd64.deb' - package-link-x86_64-rpm: 'IvorySQL-5.3-4dfba1d-20260312.x86_64.rpm' - package-link-aarch64-deb: 'IvorySQL-5.3-4dfba1d-20260312.arm64.deb' - package-link-aarch64-rpm: 'IvorySQL-5.3-4dfba1d-20260312.aarch64.rpm' - package-link-mips64el-deb: 'IvorySQL-5.3-4dfba1d-20260312.mips64el.deb' - package-link-mips64el-rpm: 'IvorySQL-5.3-4dfba1d-20260312.mips64el.rpm' - package-link-loongarch64-deb: 'IvorySQL-5.3-4dfba1d-20260312.loongarch64.deb' - package-link-loongarch64-rpm: 'IvorySQL-5.3-4dfba1d-20260312.loongarch64.rpm' +start_page: welcome.md nav: -- modules/ROOT/nav.adoc +- modules/ROOT/nav.md diff --git a/CN/modules/.DS_Store b/CN/modules/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c74f2d2703f28b9c8beb837b765c584581344544 GIT binary patch literal 6148 zcmeHK&rTCT7@sLswji=Vix@T8*oz5`f(at=;Id#0@leujumrGd+o7&3Gj(@MMMBb} zK7kM519b{n)m`^ZVxeGqc~XnVlVk5O&&)NrX&0`LLQ=|-2E=@hg@Dy-0jt57PpCyRpc(kL8Q^<2jY_Bpzw)vD>wxe2z7SEw zL0qj9wbVX;TWbY=6i-Zi!l|D0nX|n{uhDO;xsO@LjlH-XIbOKJM`gx>TB3WkC7*Pv zW_FIz*z+j~MS|ZT5VHEvrw!I|SerH?k?Tr_kufq=b98riqF~*c*(+GPlT(v73)b!F znZ3P?k;~t>Q>tzTTa>+!q+@t12^mnBz)MgLs`2aFsv7(usphk3CiP_c`p*rVA2f%C zM~1RPxm<4a!q~;(OP8zWNX@HnHbefLb1Yz?6SPUy9E_mag*u~)A=!p1D=~Q%yZ&=< z4IfJ=k;bD#Q+cNaG1)_dnDl-~2wiE0extat5s|p^lfKMXtA{KI7Fp!SKBLR4V)dA8 zEzk`HEAl5Owzw-=B4Gr0BB!$Kg`r2A#MxO3yc!9L)M0VVwkkeU!Jk|#>9)MOPn-F> z-z1BfynRh-Cdwzo8reisi1Y8r7onFaqXd!`r6+GcP$32yN3+O9tLQ1}qF3lOdV}7h zkLWArJjI40QPrjn&Q-C8-4*ukAH>3fhO|T{L zN5fCyND*Q5pTgR8$(jMpz@Hi5?*|JSM_XZ6qIh*cmx3Yp^Unw&po>p`K#LmyZG~Nl zU;)806;P&Pb;ZEy=7427_-z&6l_=8@7AwO%YGtf$C|F%QuqDC~wk7IbGoTqb%0Q1C zn*98~2YdK8_y40wdZZc94E$FN;PkvZ??6fFY&}sNKWi;$>(IFHxUNKz0-ZXJg~E^G dF=#@-XK@A4R@jvY77+a*AZXB?X5g%_-YHH13;}?J zU7+2K!x>HJML*Tr^h^wqpg#bGaNg&IywCHetj&aBz%XDKFbo(53XIfO9sUA!ND#trLnG1K00uaB>-XvPRoWe)&bJT(U{U$S14Wan5udp+Lh=M zgD7{@JHi|>rLnG1xdTz|K=jH)S13fTj((0b2a-}~M#F$%;4}lGcE11~l);74iTYin zQX2c%fo#(Gm~FlmR&=fZAz$&mFd85KO4`~xIxlotT~@cXk$K8%naGWH!n7N#iC@c{ z`}v0K=2tvg%h~Z+&LY=iG>{Hnk)p}^V~-ViEzNgWF_gX;rLbaFEN2hy?TwE*cc%A8 zoxO?4iQA*j-KpvQ{g{0$b&u%C}nG{{`Lq>&^)((h7UW}H!UT2z{3>XA0FU<76$ z1MBb{>hK2M!aMi`U*HG)f&t3>XH^W`K0eW#+_2zp;BdY1W1l4)#s# zq6xdYLg|8oFcI^z97jC-!w_Xh>rxu)3Q>dYuYU*-8)vgwM&|#xSvK!~d3Uz%@Ee_T B^cesE literal 0 HcmV?d00001 diff --git a/CN/modules/ROOT/nav.adoc b/CN/modules/ROOT/nav.adoc deleted file mode 100644 index f7d55c28..00000000 --- a/CN/modules/ROOT/nav.adoc +++ /dev/null @@ -1,93 +0,0 @@ -* xref:2.adoc[关于IvorySQL] -** xref:welcome.adoc[欢迎] -** xref:1.adoc[发行说明] -* 快速上手 -** xref:3.1.adoc[快速开始] -* 安装部署 -** xref:4.1.adoc[安装指南] -** xref:4.2.adoc[集群搭建] -* Oracle兼容功能 -** xref:7.3.adoc[1、大小写转换] -** xref:7.5.adoc[2、LIKE操作符] -** xref:7.6.adoc[3、匿名块] -** xref:7.7.adoc[4、函数与存储过程] -** xref:7.8.adoc[5、内置数据类型与内置函数] -** xref:7.9.adoc[6、端口与IP] -** xref:7.10.adoc[7、XML函数] -** xref:7.11.adoc[8、sequence] -** xref:7.12.adoc[9、包] -** xref:7.13.adoc[10、不可见列] -** xref:7.14.adoc[11、RowID] -** xref:7.15.adoc[12、OUT 参数] -** xref:7.16.adoc[13、%TYPE、%ROWTYPE] -** xref:7.17.adoc[14、NLS 参数] -** xref:7.18.adoc[15、Force View] -** xref:7.19.adoc[16、嵌套子函数] -** xref:7.20.adoc[17、sys_guid 函数] -** xref:7.21.adoc[18、空字符串转null] -** xref:7.22.adoc[19、CALL INTO] -* 容器化与云服务 -** 容器化指南 -*** xref:4.6.1.adoc[K8S部署] -*** xref:4.6.2.adoc[Operator部署] -*** xref:4.6.4.adoc[Docker & Podman部署] -*** xref:4.6.3.adoc[Docker Swarm & Docker Compose部署] -** 云服务平台指南 -*** xref:4.7.1.adoc[IvorySQL Cloud安装] -*** xref:4.7.2.adoc[IvorySQL Cloud使用] -* IvorySQL生态 -** xref:cpu_arch_adp.adoc[芯片架构适配] -** xref:os_arch_adp.adoc[操作系统适配] -** 生态组件适配 -*** xref:5.0.adoc[概述] -*** xref:5.1.adoc[postgis] -*** xref:5.2.adoc[pgvector] -*** xref:5.3.adoc[pgddl(DDL Extractor)] -*** xref:5.4.adoc[pg_cron] -*** xref:5.5.adoc[pgsql-http] -*** xref:5.6.adoc[plpgsql_check] -*** xref:5.7.adoc[pgroonga] -*** xref:5.8.adoc[pgaudit] -*** xref:5.9.adoc[pgrouting] -*** xref:5.10.adoc[system_stats] -* 监控运维 -** xref:3.2.adoc[日常监控] -** xref:3.3.adoc[日常维护] -** xref:4.4.adoc[运维管理] -* 数据迁移 -** xref:4.5.adoc[迁移指南] -* IvorySQL开发者 -** xref:8.1.adoc[社区贡献指南] -** xref:4.3.adoc[开发者指南] -** IvorySQL架构设计 -*** 查询处理 -**** xref:6.1.1.adoc[双parser] -*** 兼容框架 -**** xref:7.1.adoc[框架设计] -**** xref:7.2.adoc[GUC框架] -**** xref:7.4.adoc[双模式设计] -**** xref:6.2.1.adoc[initdb过程] -*** 兼容特性 -**** xref:6.3.1.adoc[like] -**** xref:6.3.3.adoc[RowID] -**** xref:6.3.2.adoc[OUT 参数] -**** xref:6.3.4.adoc[%TYPE、%ROWTYPE] -**** xref:6.3.5.adoc[NLS 参数] -**** xref:6.3.6.adoc[函数与存储过程] -**** xref:6.3.7.adoc[嵌套子函数] -**** xref:6.3.8.adoc[Force View] -**** xref:6.3.9.adoc[大小写转换] -**** xref:6.3.10.adoc[sys_guid 函数] -**** xref:6.3.11.adoc[空字符串转null] -**** xref:6.3.12.adoc[CALL INTO] -*** 内置函数 -**** xref:6.4.1.adoc[sys_context] -**** xref:6.4.2.adoc[userenv] -*** xref:6.5.adoc[国标GB18030] -* 参考指南 -** xref:9.adoc[工具参考] -** xref:8.2.adoc[asciidoc语法快速参考] -** xref:100.adoc[PG参数参考手册] -** xref:110.adoc[PG函数参考手册] -* 常见问题解答 -** xref:10.adoc[FAQ] diff --git a/CN/modules/ROOT/nav.md b/CN/modules/ROOT/nav.md new file mode 100644 index 00000000..7085d39c --- /dev/null +++ b/CN/modules/ROOT/nav.md @@ -0,0 +1,93 @@ +- [关于IvorySQL](2.md) + - [欢迎](welcome.md) + - [发行说明](1.md) +- **快速上手** + - [快速开始](3.1.md) +- **安装部署** + - [安装指南](4.1.md) + - [集群搭建](4.2.md) +- **Oracle兼容功能** + - [1、大小写转换](7.3.md) + - [2、LIKE操作符](7.5.md) + - [3、匿名块](7.6.md) + - [4、函数与存储过程](7.7.md) + - [5、内置数据类型与内置函数](7.8.md) + - [6、端口与IP](7.9.md) + - [7、XML函数](7.10.md) + - [8、sequence](7.11.md) + - [9、包](7.12.md) + - [10、不可见列](7.13.md) + - [11、RowID](7.14.md) + - [12、OUT 参数](7.15.md) + - [13、%TYPE、%ROWTYPE](7.16.md) + - [14、NLS 参数](7.17.md) + - [15、Force View](7.18.md) + - [16、嵌套子函数](7.19.md) + - [17、sys_guid 函数](7.20.md) + - [18、空字符串转null](7.21.md) + - [19、CALL INTO](7.22.md) +- **容器化与云服务** + - **容器化指南** + - [K8S部署](4.6.1.md) + - [Operator部署](4.6.2.md) + - [Docker & Podman部署](4.6.4.md) + - [Docker Swarm & Docker Compose部署](4.6.3.md) + - **云服务平台指南** + - [IvorySQL Cloud安装](4.7.1.md) + - [IvorySQL Cloud使用](4.7.2.md) +- **IvorySQL生态** + - [芯片架构适配](cpu_arch_adp.md) + - [操作系统适配](os_arch_adp.md) + - **生态组件适配** + - [概述](5.0.md) + - [postgis](5.1.md) + - [pgvector](5.2.md) + - [pgddl(DDL Extractor)](5.3.md) + - [pg_cron](5.4.md) + - [pgsql-http](5.5.md) + - [plpgsql_check](5.6.md) + - [pgroonga](5.7.md) + - [pgaudit](5.8.md) + - [pgrouting](5.9.md) + - [system_stats](5.10.md) +- **监控运维** + - [日常监控](3.2.md) + - [日常维护](3.3.md) + - [运维管理](4.4.md) +- **数据迁移** + - [迁移指南](4.5.md) +- **IvorySQL开发者** + - [社区贡献指南](8.1.md) + - [开发者指南](4.3.md) + - **IvorySQL架构设计** + - **查询处理** + - [双parser](6.1.1.md) + - **兼容框架** + - [框架设计](7.1.md) + - [GUC框架](7.2.md) + - [双模式设计](7.4.md) + - [initdb过程](6.2.1.md) + - **兼容特性** + - [like](6.3.1.md) + - [RowID](6.3.3.md) + - [OUT 参数](6.3.2.md) + - [%TYPE、%ROWTYPE](6.3.4.md) + - [NLS 参数](6.3.5.md) + - [函数与存储过程](6.3.6.md) + - [嵌套子函数](6.3.7.md) + - [Force View](6.3.8.md) + - [大小写转换](6.3.9.md) + - [sys_guid 函数](6.3.10.md) + - [空字符串转null](6.3.11.md) + - [CALL INTO](6.3.12.md) + - **内置函数** + - [sys_context](6.4.1.md) + - [userenv](6.4.2.md) + - [国标GB18030](6.5.md) +- **参考指南** + - [工具参考](9.md) + - [Markdown语法快速参考](8.2.md) + - [PG参数参考手册](100.md) + - [PG函数参考手册](110.md) +- **常见问题解答** + - [FAQ](10.md) diff --git a/CN/modules/ROOT/pages/1.adoc b/CN/modules/ROOT/pages/1.md similarity index 63% rename from CN/modules/ROOT/pages/1.adoc rename to CN/modules/ROOT/pages/1.md index 7a61811c..7346efee 100644 --- a/CN/modules/ROOT/pages/1.adoc +++ b/CN/modules/ROOT/pages/1.md @@ -1,15 +1,9 @@ -:sectnums: -:sectnumlevels: 5 +## 版本概览 +[**发布日期:2026 年 3 月 12 日**] +IvorySQL 5.3 基于 PostgreSQL 18.3 构建,包含多项错误修复。有关更新的完整列表,请访问我们的 [文档站点](https://docs.ivorysql.org/)。 -== 版本概览 - -[*发布日期:2026 年 3 月 12 日*] - -IvorySQL 5.3 基于 PostgreSQL 18.3 构建,包含多项错误修复。有关更新的完整列表,请访问我们的 https://docs.ivorysql.org/[文档站点]。 - -== 增强内容 - +## 增强内容 - PostgreSQL 18.3 1. 修复在重放由旧小版本生成的 multixid 截断 WAL 记录后出现的失败问题。 @@ -18,7 +12,7 @@ IvorySQL 5.3 基于 PostgreSQL 18.3 构建,包含多项错误修复。有关 4. 修复 json_strip_nulls() 和 jsonb_strip_nulls() 的易变性标记。 5. 修复 LATERAL UNION ALL 子查询输出中可能为空的外连接集合的计算问题。 -更多详情,请参阅 https://www.postgresql.org/docs/release/18.3/[PostgreSQL 18.3 发布说明]。 +更多详情,请参阅 [PostgreSQL 18.3 发布说明](https://www.postgresql.org/docs/release/18.3/)。 - PostgreSQL 18.2 @@ -28,17 +22,16 @@ IvorySQL 5.3 基于 PostgreSQL 18.3 构建,包含多项错误修复。有关 4. 修复多字节字符长度验证不充分的问题。 5. 加固 contrib/pg_trgm,使其能应对字符串小写化行为的变化。 -更多详情,请参阅 https://www.postgresql.org/docs/release/18.2/[PostgreSQL 18.2 发布说明]。 - -== 新特性 +更多详情,请参阅 [PostgreSQL 18.2 发布说明](https://www.postgresql.org/docs/release/18.2/)。 -- 升级至 PG 18.3 内核:Feature https://github.com/IvorySQL/IvorySQL/pull/1199[#1199] + +## 新特性 +- 升级至 PG 18.3 内核:Feature [#1199](https://github.com/IvorySQL/IvorySQL/pull/1199) + PostgreSQL 内核已升级至 18.3 版本。 -- 升级至 PG 18.2 内核:Feature https://github.com/IvorySQL/IvorySQL/pull/1195[#1195] + +- 升级至 PG 18.2 内核:Feature [#1195](https://github.com/IvorySQL/IvorySQL/pull/1195) + PostgreSQL 内核已升级至 18.2 版本。 -- http://trial.ivorysql.org/[在线体验]:IvorySQL 5.3:Feature https://github.com/IvorySQL/ivorysql-wasm/pull/7[#7] + +- [在线体验](http://trial.ivorysql.org/):IvorySQL 5.3:Feature [#7](https://github.com/IvorySQL/ivorysql-wasm/pull/7) + 上线交互式浏览器环境,用户可实时体验与评估 IvorySQL 5.3,无需安装。 - 全平台打包:+ @@ -53,21 +46,19 @@ IvorySQL 5.3 基于 PostgreSQL 18.3 构建,包含多项错误修复。有关 - PostgreSQL Extensions + 新增支持 10 个 PostgreSQL 扩展:pg_cron、pgAudit、PostGIS、pgRouting、PGroonga、ddlx、pgsql-http、system_stats、plpgsql_check、pgvector。 -== 缺陷修复 - -- 清除编译警告:PR https://github.com/IvorySQL/IvorySQL/pull/1190[#1190] -- 修复 ColumnRefOrFuncCall 的 raw_expression_tree_walker 问题:Issue https://github.com/IvorySQL/IvorySQL/issues/1182[#1182] -- 修复从 PostgreSQL 升级到 IvorySQL 失败的问题:Issue https://github.com/IvorySQL/IvorySQL/issues/1130[#1130] -- 改善 ivorysql.compatible_mode = 'pg' 时关于 plisql 用法的错误信息:PR https://github.com/IvorySQL/IvorySQL/pull/1178[#1178] -- 修复 liboracle_parser.c 中 token_is_col_id() 的数组越界读取问题:Issue https://github.com/IvorySQL/IvorySQL/issues/1159[#1159] -- 修复 psql 的 Tab 补全显示 INVISIBLEINCREMENT 的问题:Issue https://github.com/IvorySQL/IvorySQL/issues/1135[#1135] -- 修复嵌套函数表达式中变量重置的 Bug:Issue https://github.com/IvorySQL/IvorySQL/issues/1124[#1124] -- 修复 packages 和 subprocedures 中混用位置参数/命名参数时的类型强制转换失败问题:Issue https://github.com/IvorySQL/IvorySQL/issues/1006[#1006] -- 修复 package 过程从参数初始化局部变量时发生的段错误:Issue https://github.com/IvorySQL/IvorySQL/issues/1005[#1005] -- 修复因新年导致的回归测试失败问题:PR https://github.com/IvorySQL/IvorySQL/pull/1146[#1146] - -== 源码仓库 - +## 缺陷修复 +- 清除编译警告:PR [#1190](https://github.com/IvorySQL/IvorySQL/pull/1190) +- 修复 ColumnRefOrFuncCall 的 raw_expression_tree_walker 问题:Issue [#1182](https://github.com/IvorySQL/IvorySQL/issues/1182) +- 修复从 PostgreSQL 升级到 IvorySQL 失败的问题:Issue [#1130](https://github.com/IvorySQL/IvorySQL/issues/1130) +- 改善 ivorysql.compatible_mode = 'pg' 时关于 plisql 用法的错误信息:PR [#1178](https://github.com/IvorySQL/IvorySQL/pull/1178) +- 修复 liboracle_parser.c 中 token_is_col_id() 的数组越界读取问题:Issue [#1159](https://github.com/IvorySQL/IvorySQL/issues/1159) +- 修复 psql 的 Tab 补全显示 INVISIBLEINCREMENT 的问题:Issue [#1135](https://github.com/IvorySQL/IvorySQL/issues/1135) +- 修复嵌套函数表达式中变量重置的 Bug:Issue [#1124](https://github.com/IvorySQL/IvorySQL/issues/1124) +- 修复 packages 和 subprocedures 中混用位置参数/命名参数时的类型强制转换失败问题:Issue [#1006](https://github.com/IvorySQL/IvorySQL/issues/1006) +- 修复 package 过程从参数初始化局部变量时发生的段错误:Issue [#1005](https://github.com/IvorySQL/IvorySQL/issues/1005) +- 修复因新年导致的回归测试失败问题:PR [#1146](https://github.com/IvorySQL/IvorySQL/pull/1146) + +## 源码仓库 IvorySQL 的主要代码仓库: - IvorySQL 数据库源码:https://github.com/IvorySQL/IvorySQL @@ -75,8 +66,7 @@ IvorySQL 的主要代码仓库: - IvorySQL 文档:https://github.com/IvorySQL/IvorySQL-docs - IvorySQL Docker:https://github.com/IvorySQL/docker_library -== 贡献者名单 - +## 贡献者名单 以下人员(按字母顺序)作为补丁作者、提交者、审阅者、测试者或问题报告者,为本次发布做出了贡献。 @@ -98,4 +88,4 @@ IvorySQL 的主要代码仓库: * 陶郑 * 杨世华 * 赵法威 -* 张哲 +* 张哲 \ No newline at end of file diff --git a/CN/modules/ROOT/pages/10.adoc b/CN/modules/ROOT/pages/10.md similarity index 94% rename from CN/modules/ROOT/pages/10.adoc rename to CN/modules/ROOT/pages/10.md index b556f11e..8cb265d4 100644 --- a/CN/modules/ROOT/pages/10.adoc +++ b/CN/modules/ROOT/pages/10.md @@ -1,12 +1,5 @@ - -:sectnums: -:sectnumlevels: 5 - - -= FAQ - -== IvorySQL贡献的许可 - +# FAQ +## IvorySQL贡献的许可 如果您提交的贡献是原创作品,那么您可以假设IvorySQL将作为整个IvorySQL版本的一部分发布给下游用户,该版本将遵循Apache许可证2.0版本。 如果您提交的内容不是原创作品,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布。请注意需要满足如下条件: @@ -21,8 +14,7 @@ 最后,请记住,从非原始的工作中删除许可标头从来都不是一个好主意。即使您使用的文件部分最初在顶部有许可标头,您也应该保留它。与往常一样,如果您不太确定您的贡献所涉及的许可问题,请随时在开发人员邮件列表中联系我们。 -== 编码指南 - +## 编码指南 您获得反馈和看到代码合并到项目中的机会在很大程度上取决于更改的粒度。如果您的想法发生了更大的变化,我们强烈建议您在花大量时间编写代码之前,先加入开发人员的邮件列表,并与我们分享您的建议。即使您的建议得到社区的验证,我们仍然建议您将实际工作作为一系列小型的、独立的提交来完成。这使得评审员的工作更加容易,并提高了反馈的及时性。 当谈到IvorySQL的C和C++部分时,我们尝试遵循PostgreSQL编码约定。除此之外: @@ -33,16 +25,13 @@ 至少,您应该始终运行make installcheck world,以确保您没有破坏任何东西。 -== 适用于上游PostgreSQL的更改 - +## 适用于上游PostgreSQL的更改 如果您正在进行的更改涉及PostgreSQL和IvorySQL之间的通用功能,则可能会要求您将其转发到PostgreSQL。这不仅是为了我们不断减少两个项目之间的差异,而且是为了让与PostgreSQL相关的任何变化都能从对上游PostgreSQL社区更广泛的审查中受益。一般来说,将这两个代码库都放在手边是个好主意,这样您就可以确定您的更改是否需要前移。 -== 补丁提交 - +## 补丁提交 一旦您准备好与IvorySQL核心团队和IvorySQL社区的其他成员共享您的工作,您应该将所有提交推送到从官方IvorySQL派生的分支的您自己的存储库中,并向我们发送请求。 -== 补丁审查 - +## 补丁审查 假定提交的拉取请求通过验证检查,可供同行审查。同行审查是确保对IvorySQL的贡献具有高质量并与路线图和社区期望保持一致的过程。我们鼓励IvorySQL社区的每个成员审查请求并提供反馈。由于您不必成为核心团队成员就可以做到这一点,因此我们建议您向有兴趣成为IvorySQL长期贡献者的任何人提供一系列拉动式评论。 同行评审的一个结果可能是达成共识,即您需要以某些方式修改pull请求。GitHub允许您将其他提交推送到从中发送请求的分支中。这些额外的提交将对所有审阅者可见。 @@ -51,6 +40,5 @@ 在补丁审查期间的任何时候,您都可能会因审查人员和核心团队成员的工作效率而遇到延迟。请耐心点,也不要气馁。如果您在几天内没有收到预期的反馈,请添加一条评论,要求更新pull请求本身,或者向邮件列表发送一封电子邮件。 -== 直接提交到存储库 - -有时,您会看到核心团队成员直接提交到存储库,而无需执行pull请求工作流。这仅适用于小的更改,我们使用的经验法则是:如果更改涉及任何可能导致测试失败的功能,那么它必须通过pull请求工作流。另一方面,如果更改发生在代码库的非功能部分(例如在注释块中修复打字错误),则核心团队成员可以决定直接提交到存储库。 +## 直接提交到存储库 +有时,您会看到核心团队成员直接提交到存储库,而无需执行pull请求工作流。这仅适用于小的更改,我们使用的经验法则是:如果更改涉及任何可能导致测试失败的功能,那么它必须通过pull请求工作流。另一方面,如果更改发生在代码库的非功能部分(例如在注释块中修复打字错误),则核心团队成员可以决定直接提交到存储库。 \ No newline at end of file diff --git a/CN/modules/ROOT/pages/100.adoc b/CN/modules/ROOT/pages/100.md similarity index 53% rename from CN/modules/ROOT/pages/100.adoc rename to CN/modules/ROOT/pages/100.md index 8152d636..47bb4a18 100644 --- a/CN/modules/ROOT/pages/100.adoc +++ b/CN/modules/ROOT/pages/100.md @@ -1,9 +1,5 @@ -:sectnums: -:sectnumlevels: 16 - -== PostgreSQL 参数参考手册 - -本文参考来源: https://www.postgresql.org/docs/13/runtime-config.html[https://www.postgresql.org/docs/13/runtime-config.html] +## PostgreSQL 参数参考手册 +本文参考来源: [https://www.postgresql.org/docs/13/runtime-config.html](https://www.postgresql.org/docs/13/runtime-config.html) 本文档贡献单位及贡献者: @@ -15,5840 +11,4064 @@ 本文档错误反馈方式: -请在 https://github.com/IvorySQL/ivorysql_docs/issues[https://github.com/IvorySQL/ivorysql_docs/issues]提交issue。 +请在 [https://github.com/IvorySQL/ivorysql_docs/issues](https://github.com/IvorySQL/ivorysql_docs/issues)提交issue。 文档下载: link:../postgresql.pdf[PostgreSQL参考手册] -=== Resource Usage / Disk - -==== temp_file_limit - -[cols="136,387"] -|=== -h| 参数名称 h| temp_file_limit -| 参数值数据类型 | integer -| 默认值 | -1,表示不限制 -| 取值范围 | -1到2147483647 -| 参数单位 | 如果指定的值不带单位,则以KB为单位 -| 参数含义 | 指定一个进程可以占用的最大的磁盘空间。该磁盘空间可以用于temporary files(sort及hash使用)或者持有cursor的storage file。试图超过该限制的transaction会被取消。 -| 是否可session级修改 | 可以,此时仅限于superuser可以在session级修改 -| 修改后何时生效 | 非session级修改Reload即可生效;Session级修改时会立即在session级生效 +### Resource Usage / Disk +#### temp_file_limit +| 参数名称 h| temp_file_limit | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | -1,表示不限制 | +| 取值范围 | -1到2147483647 | +| 参数单位 | 如果指定的值不带单位,则以KB为单位 | +| 参数含义 | 指定一个进程可以占用的最大的磁盘空间。该磁盘空间可以用于temporary files(sort及hash使用)或者持有cursor的storage file。试图超过该限制的transaction会被取消。 | +| 是否可session级修改 | 可以,此时仅限于superuser可以在session级修改 | +| 修改后何时生效 | 非session级修改Reload即可生效;Session级修改时会立即在session级生效 | -|=== - -=== Replication - -==== track_commit_timestamp - -[cols="136,387"] -|=== -h| 参数名称 h| track_commit_timestamp -| 参数值数据类型 | bool -| 默认值 | off -| 取值范围 | on和off +### Replication +#### track_commit_timestamp +| 参数名称 h| track_commit_timestamp | +| --- | --- | +| 参数值数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 记录transaction的提交时间。注意:只有当这个参数是on时,函数pg_xact_commit_timestamp(xid)、pg_last_committed_xact()才能获得已提交事务的时间值。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== +| 参数含义 | 记录transaction的提交时间。注意:只有当这个参数是on时,函数pg_xact_commit_timestamp(xid)、pg_last_committed_xact()才能获得已提交事务的时间值。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | - -=== Version and Platform Compatibility / Other Platforms and Clients - -==== transform_null_equals - -[cols="136,387"] -|=== -h| 参数名称 h| transform_null_equals -| 参数值数据类型 | bool -| 默认值 | off -| 取值范围 | on和off +### Version and Platform Compatibility / Other Platforms and Clients +#### transform_null_equals +| 参数名称 h| transform_null_equals | +| --- | --- | +| 参数值数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 当本参数值为on时,PG会将expr=NULL(或者NULL=expr)视为expr IS NULL.本参数仅仅影响=NULL这个形式,不会影响其他形式(如in) -| 是否可session级修改 | 可以,superuser和普通用户均可以在session级修改 -| 修改后何时生效 | Reload即可生效Session级修改时会立即在session级生效 - -|=== +| 参数含义 | 当本参数值为on时,PG会将expr=NULL(或者NULL=expr)视为expr IS NULL.本参数仅仅影响=NULL这个形式,不会影响其他形式(如in) | +| 是否可session级修改 | 可以,superuser和普通用户均可以在session级修改 | +| 修改后何时生效 | Reload即可生效Session级修改时会立即在session级生效 | -=== Resource Usage / Kernel Resources - -==== max_files_per_process - -[cols="136,387"] -|=== -h| 参数名称 h| max_files_per_process -| 参数值数据类型 | integer -| 默认值 | 1000 -| 取值范围 | 64到2147483647 +### Resource Usage / Kernel Resources +#### max_files_per_process +| 参数名称 h| max_files_per_process | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 1000 | +| 取值范围 | 64到2147483647 | | 参数单位 | -| 参数含义 | 本参数用于设置每个server subprocess允许同时打开的files的最大数量。如果遇到 "Too many open files"的提示,请尝试减少本参数值。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 - -|=== - +| 参数含义 | 本参数用于设置每个server subprocess允许同时打开的files的最大数量。如果遇到 "Too many open files"的提示,请尝试减少本参数值。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -=== Process Title -==== cluster_name - -[cols="136,387"] -|=== -h| 参数名称 h| cluster_name -| 参数值数据类型 | string -| 默认值 | 空值 +### Process Title +#### cluster_name +| 参数名称 h| cluster_name | +| --- | --- | +| 参数值数据类型 | string | +| 默认值 | 空值 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数用于设置PGCluster的名字,可以用操作系统命令ps -ef\| grep postgres查看该名字。该名字会出现在所有server process的开头位置,另外,对于standby连接来说,该名字还是默认的application name. -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 -|=== - +| 参数含义 | 本参数用于设置PGCluster的名字,可以用操作系统命令ps -ef\ | grep postgres查看该名字。该名字会出现在所有server process的开头位置,另外,对于standby连接来说,该名字还是默认的application name. | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -==== update_process_title -[cols="136,387"] -|=== -h| 参数名称 h| update_process_title -| 参数值数据类型 | Bool -| 默认值 | on(除windows之外的平台);off(Windows平台) -| 取值范围 | on和off +#### update_process_title +| 参数名称 h| update_process_title | +| --- | --- | +| 参数值数据类型 | Bool | +| 默认值 | on(除windows之外的平台);off(Windows平台) | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 每当服务器接收到一个新的 SQL 命令时都更新process title -| 是否可session级修改 | 是,此时仅限于superuser可以在session级修改 -| 修改后何时生效 | Reload即可生效Session级修改时会立即在session级生效 - -|=== - +| 参数含义 | 每当服务器接收到一个新的 SQL 命令时都更新process title | +| 是否可session级修改 | 是,此时仅限于superuser可以在session级修改 | +| 修改后何时生效 | Reload即可生效Session级修改时会立即在session级生效 | -=== Replication / Master Server -==== synchronous_standby_names - -[cols="136,387"] -|=== -h| 参数名称 h| synchronous_standby_names -| 参数值数据类型 | string -| 默认值 | 空字符串 +### Replication / Master Server +#### synchronous_standby_names +| 参数名称 h| synchronous_standby_names | +| --- | --- | +| 参数值数据类型 | string | +| 默认值 | 空字符串 | | 取值范围 | | 参数单位 | -| 参数含义 -a| 本参数为primary角色库参数。本参数值区分大小写。本参数指定了支持同步复制的standby server清单。standby server的name是standby连接信息中的application_name,在物理复制standby中,standby server的name是在primary_conninfo中设置的,如果cluster_name配置参数的配置过了,那么standby server的name默认是cluster_name参数值,否则是walreceiver对于逻辑复制,可以在subscription中设置连接信息,默认值是subscription name本参数使用如下语法指定了一系列的standby servers的列表:[FIRST] num_sync ( standby_name [, ...] )ANY num_sync ( standby_name [, ...] )standby_name [, ...] + -num_sync代表同步standby的个数举例,FIRST 3 (s1, s2, s3, s4)的含义:s1, s2, s3这三个standby是同步standbys4这个standby是潜在的同步standby(potential synchronous standbys)如果当前同步standby不论什么原因断开,它的位置会立即被next-highest-priority standby取代。关键字FIRST是可选的。FIRST 3 (s1, s2, s3, s4)中,优先级由大到小为s1>s2>s3>s4 + -举例, ANY 3 (s1, s2, s3, s4) 的含义:s1, s2, s3, s4这四个standby 中的任意3个standby server应用wal变化之后,primary端的事务才能提交请务必注意:FIRST 和ANY关键字是大小写敏感的。如果这两个关键字被用于standby server的name,那么standby_name需要用双引号引起来。在PostgreSQL 9.6之前版本中使用的第三种语法已经受到支持。该语法与"FIRST 1"是相同作用。比如, FIRST 1 (s1, s2) 和 s1, s2 有相同的含义:要么s1要么s2被选为同步standby + -*表示匹配任何standby name + -没有机制来确保standby name的唯一性。在重复发生时,匹配到的standby 会被视为更高的优先级。尽管确切地说哪个是不确定的注意:每个standby_name应该是有效地SQL 标识符,除非是*。如果需要,你可以使用双引号。但是请注意:standby_names与standby application_name 比较时,是不区分大小写的,不论有无双引号。 + -如果synchronous_standby_names参数不指定值,同步复制不会启用。即使同步复制被启用,通过设置synchronous_commit配置参数为local或者off,单个事务可以被配置为不等待standby端的wal被应用。 + -本参数可以在postgresql.conf文件或者在the server command line设置 + - + - -| 是否可session级修改 | 否 -| 修改后何时生效 -a| Reload即可生效。 + - -|=== - +| 参数含义 | +| 本参数为primary角色库参数。本参数值区分大小写。本参数指定了支持同步复制的standby server清单。standby server的name是standby连接信息中的application_name,在物理复制standby中,standby server的name是在primary_conninfo中设置的,如果cluster_name配置参数的配置过了,那么standby server的name默认是cluster_name参数值,否则是walreceiver对于逻辑复制,可以在subscription中设置连接信息,默认值是subscription name本参数使用如下语法指定了一系列的standby servers的列表:[FIRST] num_sync ( standby_name [, ...] )ANY num_sync ( standby_name [, ...] )standby_name [, ...] + num_sync代表同步standby的个数举例,FIRST 3 (s1, s2, s3, s4)的含义:s1, s2, s3这三个standby是同步standbys4这个standby是潜在的同步standby(potential synchronous standbys)如果当前同步standby不论什么原因断开,它的位置会立即被next-highest-priority standby取代。关键字FIRST是可选的。FIRST 3 (s1, s2, s3, s4)中,优先级由大到小为s1>s2>s3>s4 + 举例, ANY 3 (s1, s2, s3, s4) 的含义:s1, s2, s3, s4这四个standby 中的任意3个standby server应用wal变化之后,primary端的事务才能提交请务必注意:FIRST 和ANY关键字是大小写敏感的。如果这两个关键字被用于standby server的name,那么standby_name需要用双引号引起来。在PostgreSQL 9.6之前版本中使用的第三种语法已经受到支持。该语法与"FIRST 1"是相同作用。比如, FIRST 1 (s1, s2) 和 s1, s2 有相同的含义:要么s1要么s2被选为同步standby + *表示匹配任何standby name + 没有机制来确保standby name的唯一性。在重复发生时,匹配到的standby 会被视为更高的优先级。尽管确切地说哪个是不确定的注意:每个standby_name应该是有效地SQL 标识符,除非是*。如果需要,你可以使用双引号。但是请注意:standby_names与standby application_name 比较时,是不区分大小写的,不论有无双引号。 + 如果synchronous_standby_names参数不指定值,同步复制不会启用。即使同步复制被启用,通过设置synchronous_commit配置参数为local或者off,单个事务可以被配置为不等待standby端的wal被应用。 + 本参数可以在postgresql.conf文件或者在the server command line设置 + + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| Reload即可生效。 + | -==== vacuum_defer_cleanup_age -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_defer_cleanup_age -| 参数值数据类型 | integer -| 默认值 | 0 -| 取值范围 | 0到1000000 +#### vacuum_defer_cleanup_age +| 参数名称 h| vacuum_defer_cleanup_age | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 0 | +| 取值范围 | 0到1000000 | | 参数单位 | -| 参数含义 -a| 该参数指定了在primary库上vacuum和HOT updates 会延迟清理dead row versions的事务的数量。默认值是零个事务,零个事务的含义是dead row versions会尽可能快的被removed掉。尽可能快是指dead row versions不会被任何open transaction可见。你可以在hot standby环境中的primary端为此参数设置为非零值,这允许standby端的query运行更长的时间以便完成,而不会遇到过早的dead row versions cleanup而导致冲突。由于本参数值是根据在primary上发生的写入事务的数量来衡量的,因此,很难预测会为standby query增加多长时间。 + -本参数可以在postgresql.conf文件或者在the server command line设置 + -你可以考虑在standby 端使用hot_standby_feedback配置参数作为vacuum_defer_cleanup_age的替代。本参数不会防止那些已经达到age(由old_snapshot_threshold配置参数指定)的dead rows的清理。 - -| 是否可session级修改 | 否 -| 修改后何时生效 -a| Reload即可生效。 + - -|=== - - - -=== Replication / Subscribers +| 参数含义 | +| 该参数指定了在primary库上vacuum和HOT updates 会延迟清理dead row versions的事务的数量。默认值是零个事务,零个事务的含义是dead row versions会尽可能快的被removed掉。尽可能快是指dead row versions不会被任何open transaction可见。你可以在hot standby环境中的primary端为此参数设置为非零值,这允许standby端的query运行更长的时间以便完成,而不会遇到过早的dead row versions cleanup而导致冲突。由于本参数值是根据在primary上发生的写入事务的数量来衡量的,因此,很难预测会为standby query增加多长时间。 + 本参数可以在postgresql.conf文件或者在the server command line设置 + 你可以考虑在standby 端使用hot_standby_feedback配置参数作为vacuum_defer_cleanup_age的替代。本参数不会防止那些已经达到age(由old_snapshot_threshold配置参数指定)的dead rows的清理。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| Reload即可生效。 + | -==== max_logical_replication_workers -[cols="136,387"] -|=== -h| 参数名称 h| max_logical_replication_workers -| 参数值数据类型 | integer -| 默认值 | 4 -| 取值范围 | 0到262143 +### Replication / Subscribers +#### max_logical_replication_workers +| 参数名称 h| max_logical_replication_workers | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 4 | +| 取值范围 | 0到262143 | | 参数单位 | -| 参数含义 | 本参数设置Logical replication workers进程的最大数量,此处的worker进程包括两种:apply workers 和table synchronization workers。Logical replication workers进程的数量从max_worker_processes配置参数定义的池中获取。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 +| 参数含义 | 本参数设置Logical replication workers进程的最大数量,此处的worker进程包括两种:apply workers 和table synchronization workers。Logical replication workers进程的数量从max_worker_processes配置参数定义的池中获取。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -|=== +#### max_sync_workers_per_subscription +| 参数名称 h| max_sync_workers_per_subscription | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 2 | +| 取值范围 | 0到262143 | +| 参数单位 | +| 参数含义 | 指定了每个subscription中synchronization workers的最大数量。本参数控制在subscription初始化 或者 新表加入时的initial data copy的并行度。目前,每个table只能指定一个synchronization workersynchronization workers从max_logical_replication_workers配置参数定义的池中取得。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效。 | -==== max_sync_workers_per_subscription -[cols="136,387"] -|=== -h| 参数名称 h| max_sync_workers_per_subscription -| 参数值数据类型 | integer -| 默认值 | 2 -| 取值范围 | 0到262143 +### Write-Ahead Log / Archive Recovery +#### restore_command +| 参数名称 h| restore_command | +| --- | --- | +| 参数值数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | | 参数单位 | -| 参数含义 | 指定了每个subscription中synchronization workers的最大数量。本参数控制在subscription初始化 或者 新表加入时的initial data copy的并行度。目前,每个table只能指定一个synchronization workersynchronization workers从max_logical_replication_workers配置参数定义的池中取得。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效。 - -|=== +| 参数含义 | +| 恢复时指定archive wal的位置 restore_command = 'cp /mnt/server/archivedir/%f "%p"' restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows restore_command对应的命令执行成功之后,restore_command返回零, + %f代表archived wal文件名 %p代表copy destination path name %r代表含有最后一个有效的resart point的file的文件名 %%代表一个%字符(当需要写入%字符的情况下使用) + 本参数需要在pg instance启动之前进行设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -=== Write-Ahead Log / Archive Recovery +#### archive_cleanup_command +| 参数名称 h| archive_cleanup_command | +| --- | --- | +| 参数值数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | +| 本参数定义了在每个restart point时所执行的shell命令。 + archive_cleanup_command参数的目的是提供一个清理不再被standby server所需要的老的archived wal file的机制。 + %r代表最后一个有效的restart point的wal file。该wal file是最早一个必须保留的文件,以便允许restore操作可以被restart。注意: restart point 是一个 point ,该point用于standby server重启recovery操作。因此,所有早于%r的文件可以被安全的清理掉。本信息可以用来truncate掉archive wal file,以便满足从当前restore可以restart的最小需求。 pg_archivecleanup实用命令常被用在单个standby配置的archive_cleanup_command参数中 archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r' + %%代表一个%字符(当需要写入%字符的情况下使用)如果命令返回非零值,一个警告日志消息会被写入。一个例外是:当命令被一个signal终止或者shell中有错误时,一个fatal error会被抛出。 + 本参数可以在postgresql.conf设置,也可以在server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| Reload即可生效。 + | -==== restore_command -[cols="136,387"] -|=== -h| 参数名称 h| restore_command -| 参数值数据类型 | string -| 默认值 | 空字符串 +#### recovery_end_command +| 参数名称 h| recovery_end_command | +| --- | --- | +| 参数值数据类型 | String | +| 默认值 | 空字符串 | | 取值范围 | | 参数单位 | -| 参数含义 -a| 恢复时指定archive wal的位置 restore_command = 'cp /mnt/server/archivedir/%f "%p"' restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows restore_command对应的命令执行成功之后,restore_command返回零, + - %f代表archived wal文件名 %p代表copy destination path name %r代表含有最后一个有效的resart point的file的文件名 %%代表一个%字符(当需要写入%字符的情况下使用) + -本参数需要在pg instance启动之前进行设置。 - -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 +| 参数含义 | 本参数用于定义在recovery结束时候的需要执行的shell命令。如果命令返回非零值,一个警告日志消息会被写入,然后数据库会继续启动。一个例外是:当命令被一个signal终止或者shell中错误时,数据库不会继续启动。%r代表最后一个有效的restart point的wal file | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效。 | -|=== +### Error Handling +#### exit_on_error +| 参数名称 h| exit_on_error | +| --- | --- | +| 参数值数据类型 | Bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | +| 当设置为on时,任何error均会导致session被终止。默认情况下,本参数值为off,只有FATAL error才会终止session。 postgres=# set exit_on_error=on; SET postgres=# show exit_on_error ; -[RECORD 1]-+--- exit_on_error \ | on + postgres=# begin; BEGIN postgres=**# select \** form t1; FATAL: syntax error at or near "form" LINE 1: select \* form t1; ^ server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Succeeded.postgres=# | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效Session级别修改可以立即生效。 | -==== archive_cleanup_command -[cols="136,387"] -|=== -h| 参数名称 h| archive_cleanup_command -| 参数值数据类型 | string -| 默认值 | 空字符串 +#### restart_after_crash +| 参数名称 h| restart_after_crash | +| --- | --- | +| 参数值数据类型 | bool | +| 默认值 | on | | 取值范围 | | 参数单位 | -| 参数含义 -a| 本参数定义了在每个restart point时所执行的shell命令。 + - archive_cleanup_command参数的目的是提供一个清理不再被standby server所需要的老的archived wal file的机制。 + - %r代表最后一个有效的restart point的wal file。该wal file是最早一个必须保留的文件,以便允许restore操作可以被restart。注意: restart point 是一个 point ,该point用于standby server重启recovery操作。因此,所有早于%r的文件可以被安全的清理掉。本信息可以用来truncate掉archive wal file,以便满足从当前restore可以restart的最小需求。 pg_archivecleanup实用命令常被用在单个standby配置的archive_cleanup_command参数中 archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r' + - %%代表一个%字符(当需要写入%字符的情况下使用)如果命令返回非零值,一个警告日志消息会被写入。一个例外是:当命令被一个signal终止或者shell中有错误时,一个fatal error会被抛出。 + -本参数可以在postgresql.conf设置,也可以在server command line设置。 +| 参数含义 | 当设置为on时,PostgreSQL会在backend crash之后重新初始化(即:restart)。在某些情况下,比如PostgreSQL被Clusterware调用时,需要禁用PostgreSQL的restart(将该参数值设置为off)以便clusterware获得PostreSQL的控制权并采取适当的操作。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| Reload即可生效 + | -| 是否可session级修改 | 否 -| 修改后何时生效 -a| Reload即可生效。 + -|=== +#### data_sync_retry +| 参数名称 h| data_sync_retry | +| --- | --- | +| 参数值数据类型 | bool | +| 默认值 | off | +| 取值范围 | off 和on | +| 参数单位 | +| 参数含义 | 如果设置为off(默认值),当PostgreSQL flush数据到文件系统上遇到failure时,PostgreSQL会抛出一个panic级别的error。这会导致数据库服务crash掉。本参数只能在数据库服务启动之前设置。在某些操作系统中,当回写(write-back)失败之后,kernel的page cache中的数据状态是未知的(unknown).在一些情况下,它可能会被完全忘记,设置为尝试是不安全的,在实际上数据已经丢失的情况下,第二次尝试可能会报告成功,在这些场景中,避免数据损失的唯一方法是解决掉硬件问题之后从wal中恢复。当设置为on时,PostgreSQL会报告一个error并会继续运行,data flushing操作会在稍后的checkpoint中尝试。注意:仅在调查操作系统对buffered data的处理以防回写失败的情况下,才将其设置为on。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -==== recovery_end_command +### Write-Ahead Log / Archiving +#### archive_mode +| 参数名称 h| archive_mode | +| --- | --- | +| 参数值数据类型 | enum | +| 默认值 | off | +| 取值范围 | off,on,always | +| 参数单位 | +| 参数含义 | 指定归档模式。on表示启用归档模式,当wal_level配置参数值为minimal时, archive_mode 不能设置为on。当本参数值设置为always时,standby 实例会为收到的每个wal segments调用归档命令,也就是standby实例上也会进行wal的归档操作。本参数仅仅能在pg启动时设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| 重启PG instance生效。 + | -[cols="136,387"] -|=== -h| 参数名称 h| recovery_end_command -| 参数值数据类型 | String -| 默认值 | 空字符串 +#### archive_command +| 参数名称 h| archive_command | +| --- | --- | +| 参数值数据类型 | string | +| 默认值 | 空字符串 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数用于定义在recovery结束时候的需要执行的shell命令。如果命令返回非零值,一个警告日志消息会被写入,然后数据库会继续启动。一个例外是:当命令被一个signal终止或者shell中错误时,数据库不会继续启动。%r代表最后一个有效的restart point的wal file -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效。 - -|=== - - -=== Error Handling +| 参数含义 | +| 定义对wal进行归档的命令。当archive_mode配置参数启用并且archive_command配置参数是空字符串时,wal archiving暂时被禁用,但是pg会继续积累wal segment文件。archive_command参数值设置为/bin/true会禁用归档,但这样会导致wal文件归档中断,归档中断是无法进行归档恢复的,请注意这一点。使用举例如下: archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' # Unix archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"' # Windows + 退出码是零代表本命令正常运行。本参数可以在postgresql.conf或者server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| Reload即可生效 + | + + +#### archive_timeout +| 参数名称 h| archive_timeout | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 0 | +| 取值范围 | 0到1073741823 | +| 参数单位 | 若是不指定单位,那默认的单位是秒 | +| 参数含义 | 强制进行wal segments归档的时长。使用本参数归档出来的wal segment与正常的wal segment是相同的大小。因此,本参数值设置太小会对存储空间有浪费。本参数可以在postgresql.conf或者server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +### Resource Usage / Background Writer +#### bgwriter_delay +| 参数名称 h| bgwriter_delay | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 200 | +| 取值范围 | 10到10000 | +| 参数单位 | 若是不指定单位,那默认的单位是毫秒(ms) | +| 参数含义 | 在每一轮循环中,background writer都会为一定数量的脏缓冲区发出写操作,然后background writer进行睡眠,睡眠的时间为bgwriter_delay参数值,然后再唤醒,然后重复。设置bgwriter_delay为不是10的倍数的值可能与将其设置为10的下一个更高的倍数具有相同的结果。本参数可以在postgresql.conf或者server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### bgwriter_lru_maxpages +| 参数名称 h| bgwriter_lru_maxpages | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | 100 | +| 取值范围 | 0到1073741823 | +| 参数单位 | +| 参数含义 | 每轮bgwriter进程写入LRU Page的最大数量。本参数设置为零会禁用background writing行为,但是background writer进程依然会存在。本参数可以在postgresql.conf或者server command line设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | +| Reload即可 + | -==== exit_on_error -[cols="136,387"] -|=== -h| 参数名称 h| exit_on_error -| 参数值数据类型 | Bool -| 默认值 | off -| 取值范围 | on和off +#### bgwriter_lru_multiplier +| 参数名称 h| bgwriter_lru_multiplier | +| --- | --- | +| 参数值数据类型 | real | +| 默认值 | 2.0 | +| 取值范围 | 0到10 | | 参数单位 | -| 参数含义 -a| 当设置为on时,任何error均会导致session被终止。默认情况下,本参数值为off,只有FATAL error才会终止session。 postgres=# set exit_on_error=on; SET postgres=# show exit_on_error ; -[RECORD 1]-+--- exit_on_error \| on + - postgres=# begin; BEGIN postgres=*# select \* form t1; FATAL: syntax error at or near "form" LINE 1: select \* form t1; ^ server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Succeeded.postgres=# +| 参数含义 | 每轮写dirty buffer的数量基于服务器进程(即:backend process)在最近几轮中所需要的新buffer数量。最近的平均需要量乘以本参数值就是下一轮需要的新buffers数量的估计值。Dirty buffers会一直写入,直到有那么多干净的、可重用的buffers为止。因此,本参数值为1.0表示准确预计了需要的buffers数量。较大的本参数值提供了一些缓冲,以防需求激增,而较小的本参数值会有意将写dirty buffers操作留给服务器进程(即:backend process)完成。本参数可以在postgresql.conf或者server command line设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效Session级别修改可以立即生效。 -|=== +#### bgwriter_flush_after +| 参数名称 h| bgwriter_flush_after | +| --- | --- | +| 参数值数据类型 | integer | +| 默认值 | Linux平台下是64,也就是512KB;其他平台下是0 | +| 取值范围 | 源码中BLCKSZ 符号常量为8KB时,取值范围是0到256;源码中BLCKSZ 符号常量不为8KB时,等比例计算即可。 | +| 参数单位 | 8KB | +| 参数含义 | 当background writer写入的数据量超过本参数值之后,尝试强制操作系统发送这些写入的数据到底层存储中。这么做会限制kernel中page cache的dirty data的数量,减少在checkpoint末尾发生fsync时发生卡顿的可能性。本参数可以在postgresql.conf或者server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== restart_after_crash -[cols="136,387"] -|=== -h| 参数名称 h| restart_after_crash -| 参数值数据类型 | bool -| 默认值 | on -| 取值范围 | +### Statistics / Monitoring +#### log_statement_stats +| 参数名称 h| log_statement_stats | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 当设置为on时,PostgreSQL会在backend crash之后重新初始化(即:restart)。在某些情况下,比如PostgreSQL被Clusterware调用时,需要禁用PostgreSQL的restart(将该参数值设置为off)以便clusterware获得PostreSQL的控制权并采取适当的操作。 -| 是否可session级修改 | 否 -| 修改后何时生效 -a| Reload即可生效 + +| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入系统性能统计信息。本参数on时,其他参数(log_parser_stats 、log_planner_stats、log_executor_stats)必须设置为off在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \** from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 09:55:21.621 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,6,"",2021-03-31 09:51:32 CST,3/0,0,LOG,00000,"QUERY STATISTICS","! system usage stats: ! 0.000657 s user, 0.000000 s system, 0.000657 s elapsed ! [0.003464 s user, 0.001403 s system total] ! 6288 kB max resident size ! 0/8 [0/24] filesystem blocks in/out ! 0/128 [0/1295] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [11/2] voluntary/involuntary context switches",,,,,"select \**from pg_database;",,,"psql","client backend" | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效,仅仅superuser能修改本参数 | -|=== +#### log_parser_stats +| 参数名称 h| log_parser_stats | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入解析统计信息。在本参数设置为on的情况下,log_statement_stats配置参数无法设置为on,设置为on时会有如下的错误: postgres=# alter system set log_statement_stats='on'; ERROR: invalid value for parameter "log_statement_stats": 1 DETAIL: Cannot enable "log_statement_stats" when "log_parser_stats", "log_planner_stats", or "log_executor_stats" is true. postgres=#在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \** from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,41,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"PARSER STATISTICS","! system usage stats: ! 0.000019 s user, 0.000000 s system, 0.000019 s elapsed ! [0.015481 s user, 0.001403 s system total] ! 7720 kB max resident size ! 0/0 [0/56] filesystem blocks in/out ! 0/0 [0/1673] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent ! 0/0 [39/6] voluntary/involuntary context switches",,,,,"select \** from pg_database;",,,"psql","client backend" 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,42,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"statement: select \** from pg_database;",,,,,,,,,"psql","client backend" 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,43,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"PARSE ANALYSIS STATISTICS","! system usage stats: ! 0.000031 s user, 0.000000 s system, 0.000030 s elapsed ! [0.015565 s user, 0.001403 s system total] ! 7720 kB max resident size ! 0/0 [0/56] filesystem blocks in/out ! 0/0 [0/1673] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent ! 0/0 [39/6] voluntary/involuntary context switches",,,,,"select \** from pg_database;",,,"psql","client backend" 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,44,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"REWRITER STATISTICS","! system usage stats: ! 0.000003 s user, 0.000000 s system, 0.000003 s elapsed ! [0.015582 s user, 0.001403 s system total] ! 7720 kB max resident size ! 0/0 [0/56] filesystem blocks in/out ! 0/0 [0/1673] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [39/6] voluntary/involuntary context switches",,,,,"select \* from pg_database;",,,"psql","client backend" | +| 是否可session级修改 | 是,但是不能在log_statement_stats=on时设置本参数为on | +| 修改后何时生效 | Session级修改立即生效非session级修改reload生效,仅仅superuser能修改本参数 | -==== data_sync_retry -[cols="136,387"] -|=== -h| 参数名称 h| data_sync_retry -| 参数值数据类型 | bool -| 默认值 | off -| 取值范围 | off 和on +#### log_planner_stats +| 参数名称 h| log_planner_stats | +| --- | --- | +| 参数值数据类型 | boolean | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 如果设置为off(默认值),当PostgreSQL flush数据到文件系统上遇到failure时,PostgreSQL会抛出一个panic级别的error。这会导致数据库服务crash掉。本参数只能在数据库服务启动之前设置。在某些操作系统中,当回写(write-back)失败之后,kernel的page cache中的数据状态是未知的(unknown).在一些情况下,它可能会被完全忘记,设置为尝试是不安全的,在实际上数据已经丢失的情况下,第二次尝试可能会报告成功,在这些场景中,避免数据损失的唯一方法是解决掉硬件问题之后从wal中恢复。当设置为on时,PostgreSQL会报告一个error并会继续运行,data flushing操作会在稍后的checkpoint中尝试。注意:仅在调查操作系统对buffered data的处理以防回写失败的情况下,才将其设置为on。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 +| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入规划器统计信息。在本参数设置为on的情况下,log_statement_stats配置参数无法设置为on,设置为on时会有如下的错误: postgres=# alter system set log_statement_stats='on'; ERROR: invalid value for parameter "log_statement_stats": 1 DETAIL: Cannot enable "log_statement_stats" when "log_parser_stats", "log_planner_stats", or "log_executor_stats" is true. postgres=#在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \** from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 10:24:39.323 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,63,"",2021-03-31 09:51:32 CST,3/3491,0,LOG,00000,"PLANNER STATISTICS","! system usage stats: ! 0.000041 s user, 0.000006 s system, 0.000045 s elapsed ! [0.017384 s user, 0.002173 s system total] ! 7740 kB max resident size ! 0/0 [0/80] filesystem blocks in/out ! 0/0 [0/1674] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [55/10] voluntary/involuntary context switches",,,,,"select \** from pg_database;",,,"psql","client backend" | +| 是否可session级修改 | 是,但是不能在log_statement_stats=on时设置本参数为on | +| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效,仅仅superuser能修改本参数 | -|=== +#### log_executor_stats +| 参数名称 h| log_executor_stats | +| --- | --- | +| 参数值数据类型 | Bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入执行器统计信息。在本参数设置为on的情况下,log_statement_stats配置参数无法设置为on,设置为on时会有如下的错误: postgres=# alter system set log_statement_stats='on'; ERROR: invalid value for parameter "log_statement_stats": 1 DETAIL: Cannot enable "log_statement_stats" when "log_parser_stats", "log_planner_stats", or "log_executor_stats" is true. postgres=#在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \** from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 10:27:59.858 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,71,"",2021-03-31 09:51:32 CST,3/3496,0,LOG,00000,"EXECUTOR STATISTICS","! system usage stats: ! 0.000031 s user, 0.000000 s system, 0.000030 s elapsed ! [0.018581 s user, 0.003320 s system total] ! 7744 kB max resident size ! 0/0 [0/104] filesystem blocks in/out ! 0/0 [0/1676] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [71/14] voluntary/involuntary context switches",,,,,"select \** from pg_database;",,,"psql","client backend" | +| 是否可session级修改 | 是,但是不能在log_statement_stats=on时设置本参数为on | +| 修改后何时生效 | Session级修改立即生效非session级修改reload生效,仅仅superuser能修改本参数 | -=== Write-Ahead Log / Archiving - -==== archive_mode -[cols="136,387"] -|=== -h| 参数名称 h| archive_mode -| 参数值数据类型 | enum -| 默认值 | off -| 取值范围 | off,on,always +### Client Connection Defaults / Shared Library Preloading +#### jit_provider +| 参数名称 h| jit_provider | +| --- | --- | +| 数据类型 | string | +| 默认值 | llvmjit | +| 取值范围 | | 参数单位 | -| 参数含义 | 指定归档模式。on表示启用归档模式,当wal_level配置参数值为minimal时, archive_mode 不能设置为on。当本参数值设置为always时,standby 实例会为收到的每个wal segments调用归档命令,也就是standby实例上也会进行wal的归档操作。本参数仅仅能在pg启动时设置 -| 是否可session级修改 | 否 -| 修改后何时生效 -a| 重启PG instance生效。 + +| 参数含义 | 本参数值指定了jit provider library的名称,本参数仅仅可以在pg启动时设置。若是指定了不存在的library,则jit不可用,但是不会有报错抛出。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -|=== +#### local_preload_libraries +| 参数名称 h| local_preload_libraries | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数指定在连接启动时被预加载的一个或多个共享库。多个库名称以逗号分隔,其中每个库名的解释与load命令相同。库名之间的空格会被忽略,若是需要在库名中包括空格或者逗号,请用双引号将库名引起来。参数值仅仅在连接开始时生效,后续更改无效。如果找不到指定的库,则连接会将失败(即:连接将无法登陆到数据库中)。本参数任何user都可以设置。因此,被加载的共享库仅仅限于在$libdir/plugins目录下。数据库管理员有责任确保该目录下的共享库的安全性。本参数的参数值可以明确指定目录,比如$libdir/plugins/mylib,或者仅仅指定library名称,比如mylib,mylib的作用等同于$libdir/plugins/mylib本参数的目的是允许非授权用户加载debugging或者performance-measurement 库到特定session中,而无需load命令。为此,可以在客户端上使用设置了本参数的PGOPTIONS环境变量或者使用alter role set | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级修改立即生效非session级修改reload生效 | +#### session_preload_libraries +| 参数名称 h| session_preload_libraries | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值指定了在连接启动时被预加载的一个或者多个共享库。多个库名称以逗号分隔,其中每个库名的解释与load命令相同。库名之间的空格会被忽略,若是需要在库名中包括空格或者逗号,请用双引号将库名引起来。参数值仅仅在连接开始时生效,后续更改无效。如果找不到指定的库,则连接会将失败(即:连接将无法登陆到数据库中)。本参数的目的是允许加载debugging或者performance-measurement 库到特定session中,而无需load命令。比如,使用alter role set 语句设置本参数可以将auto_explain针对所有session生效。与shared_preload_libraries不同,在会话开始时(而不是在首次使用时)加载库没有太大的性能优势。但是,使用连接池时有一些优点。 | +| 是否可session级修改 | 可以,只有superuser可以改变本参数值 | +| 修改后何时生效 | Session级修改立即生效非session级修改reload生效,reload之后,仅仅对新启动的session生效。 | -==== archive_command -[cols="136,387"] -|=== -h| 参数名称 h| archive_command -| 参数值数据类型 | string -| 默认值 | 空字符串 +#### shared_preload_libraries +| 参数名称 h| shared_preload_libraries | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | | 取值范围 | | 参数单位 | -| 参数含义 -a| 定义对wal进行归档的命令。当archive_mode配置参数启用并且archive_command配置参数是空字符串时,wal archiving暂时被禁用,但是pg会继续积累wal segment文件。archive_command参数值设置为/bin/true会禁用归档,但这样会导致wal文件归档中断,归档中断是无法进行归档恢复的,请注意这一点。使用举例如下: archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' # Unix archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"' # Windows + -退出码是零代表本命令正常运行。本参数可以在postgresql.conf或者server command line设置。 +| 参数含义 | 本参数值指定了在PostgreSQL数据库启动时被预加载的一个或者多个共享库。多个库名称以逗号分隔,其中每个库名的解释与load命令相同。库名之间的空格会被忽略,若是需要在库名中包括空格或者逗号,请用双引号将库名引起来。该参数只能在PostgreSQL数据库启动时设置,若是找不到指定的库,PostgreSQL数据库启动会失败。设置了本参数之后,新的backend process的启动时间会略有延长,即使这个backedn process不用这个共享库。因此,本参数推荐用于哪些在绝大多数session中使用的共享库。另外,由于本参数需要重启PostgreSQL数据库生效,因此,若是用于短期的debugging目的,请使用session_preload_libraries参数。请注意,在Windows主机上,在服务器启动时预加载库不会减少启动每个新服务器进程所需的时间。每个服务器进程将重新加载所有预加载库。但是,对于需要在postmaster启动时执行操作的库,本参数在windows主机上是很有用的。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -| 是否可session级修改 | 否 -| 修改后何时生效 -a| Reload即可生效 + -|=== +### Lock Management +#### deadlock_timeout +| 参数名称 h| deadlock_timeout | +| --- | --- | +| 数据类型 | string | +| 默认值 | 1000 | +| 取值范围 | 1到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 在检查是否存在deadlock条件之前,等待一个lock的时间长度。死锁检查是相对昂贵的,因此,pg不会在每次等待lock时都运行死锁检测。PostgreSQL会乐观的认为死锁在生产应用程序中并不常见,只需要等待一段时间后再检查死锁。这是您在实践中想要设置的最小值,在负载很重的pg中,可能需要提高本参数值。在理想情况下,本参数值应该超过典型的transaction 时间,以提高在PostgreSQL决定检查死锁之前将释放锁的几率。仅仅superuser可以修改本参数值。在log_lock_waits参数启用的情况下,deadlock_timeout参数值也决定了一个有关lock wait的 log message被写入运行日志之前的等待时间。如果你正在尝试调查锁定延迟(locking delays),你可能希望设置比正常deadlock_timeout参数值更短的时间。 | +| 是否可session级修改 | 是(仅仅superuser可修改) | +| 修改后何时生效 | Session级修改立即生效(仅仅superuser);非session级别修改Reload即可生效 | -==== archive_timeout +#### max_locks_per_transaction +| 参数名称 h| max_locks_per_transaction | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 64 | +| 取值范围 | 10到2147483647 | +| 参数单位 | +| 参数含义 | +| 共享锁表(shared lock table)追踪max_locks_per_transaction \* (max_connections + max_prepared_transactions) 个lock objects,因此,一次只能锁定这么多不同的对象。本参数控制分配给每个事务的object lock的平均数量。单个事务可以锁定更多的对象,只要所有事务的锁都在锁表(lock table)中. 本参数值不是可以锁定的行数;可以锁定的行数是无限的。max_locks_per_transaction的默认值是64在历史上是被证明足够的,但是如果在多个事务中有涉及多个不同的表的SQL语句(比如一个有多个子表的父表的SQL语句),则可能提高该数值。本参数只能在PostgreSQL数据库启动时设置。当存在standby server时,standby server上的本参数值要大于或者等于master server上的本参数值,否则,查询语句在standby server上是不被允许的。 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +#### max_pred_locks_per_transaction +| 参数名称 h| max_pred_locks_per_transaction | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 64 | +| 取值范围 | 10到2147483647 | +| 参数单位 | +| 参数含义 | 共享谓词锁表(shared predicate lock table)追踪max_pred_locks_per_transaction \* (max_connections + max_prepared_transactions) 个lock objects,因此,一次只能锁定这么多不同的对象。本参数控制分配给每个事务的object lock的平均数量。单个事务可以锁定更多的对象,只要所有事务的锁都在锁表(lock table)中. 本参数值不是可以锁定的行数;可以锁定的行数是无限的。本参数默认值64在测试环境中是足够的,但是如果你的client在单个串行化事务中用到了多个不同的table,你可能需要加大本参数值。本参数只能在PostgreSQL数据库启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +#### max_pred_locks_per_relation +| 参数名称 h| max_pred_locks_per_relation | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | -2 | +| 取值范围 | -2147483648到2147483647 | +| 参数单位 | +| 参数含义 | 本参数控制在将锁提升为覆盖整个relation之前,单个relation中能有多少pages或者tuples能被predicate-locked 。本参数值大于等于零时表示绝对限制,本参数值为负值时表示max_pred_locks_per_transaction/本参数值的绝对值。本参数可以在postgresql.conf设置也可以在server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload生效 | + + +#### max_pred_locks_per_page +| 参数名称 h| max_pred_locks_per_page | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 2 | +| 取值范围 | 0到2147483647 | +| 参数单位 | +| 参数含义 | 本参数控制在将锁提升为覆盖整个page之前,单个page中能有多少tuples能被predicate-locked。本参数可以在postgresql.conf设置也可以在server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload生效 | + + +### Resource Usage / Cost-Based Vacuum Delay +#### vacuum_cost_delay +| 参数名称 h| vacuum_cost_delay | +| --- | --- | +| 数据类型 | Real | +| 默认值 | 0,零代表禁用了基于成本的vacuum delay特性。 | +| 取值范围 | 0到100 | +| 参数单位 | 毫秒 | +| 参数含义 | vacuum_cost_limit参数值是一个累积vacuum io操作的成本值,当vacuum操作达到vacuum_cost_limit参数值之后,vacuum操作会停下来休眠一段时间,该段时间是vacuum_cost_delay参数值指定的,然后,PostgreSQL会重置计数器并继续vacuum操作。本参数的参数值建议尽量小,大值是没有帮助的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 | + + +#### vacuum_cost_page_hit +| 参数名称 h| vacuum_cost_page_hit | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 1 | +| 取值范围 | 0到10000 | +| 参数单位 | +| 参数含义 | 对shared buffer中发现的一个buffer进行vacuum的估计成本,本成本代表:锁定buffer pool的成本+查找shared hash table的成本+扫描page中内容的成本。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 | + + +#### vacuum_cost_page_miss +| 参数名称 h| vacuum_cost_page_miss | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 10 | +| 取值范围 | 0到10000 | +| 参数单位 | +| 参数含义 | 对不在shared buffer中的一个buffer(只能从disk读取)进行vacuum的估计成本,本成本代表:锁定buffer pool的成本+查找shared hash table的成本+从disk中读取该block到buffer的成本+扫描page中内容的成本。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 | + + +#### vacuum_cost_page_dirty +| 参数名称 h| vacuum_cost_page_dirty | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 20 | +| 取值范围 | 0到10000 | +| 参数单位 | +| 参数含义 | Vacuum改变一个之前是干净的block的估计成本。本成本代表:额外的io操作以便将dirty block刷新到disk中。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 | + + +#### vacuum_cost_limit +| 参数名称 h| vacuum_cost_limit | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 200 | +| 取值范围 | 1到10000 | +| 参数单位 | +| 参数含义 | 本参数值是一个累积vacuum io操作的成本值,当vacuum操作达到本参数值之后,vacuum操作会停下来休眠一段时间。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 | + + +### Replication / Sending Servers +#### max_wal_senders +| 参数名称 h| max_wal_senders | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 10 | +| 取值范围 | 0到262143,0表示复制被禁用 | +| 参数单位 | +| 参数含义 | 同时运行wal sender process的最大数量。运行wal sender process的场景包括流复制和以streaming模式进行base backup(译者注:其实还包括逻辑复制使用逻辑复制槽的场景,但是在PostgreSQL文档中并没有写明这一点)。本参数仅能在PostgreSQL启动时进行设置。配置参数waL_level必须设置为replica或者更高的值以便允许来自standby server的连接。在流复制环境中,在流复制备库上的该参数值至少要等于或者大于流复制主库上的该参数值,否则在备库上的query是不允许的。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instanc生效 | + + +#### max_replication_slots +| 参数名称 h| max_replication_slots | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 10 | +| 取值范围 | 0到262143 | +| 参数单位 | +| 参数含义 | +| 设置PostgreSQL能支持的复制槽的最大数量,本参数仅能在PostgreSQL启动时进行设置。当本参数值小于当前已经存在的replicat slot时,会导致PG instance无法启动。配置参数waL_level必须设置为replica或者更高的值以便允许replication slot被用到。 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instanc生效 | + + +#### wal_keep_size +| 参数名称 h| wal_keep_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,0表示PostgreSQL不会为流复制环境保留额外的wal segments, | +| 取值范围 | 0到2147483647 | +| 参数单位 | MB,若是设置时不带单位,则默认为MB | +| 参数含义 | 指定在pg_wal目录中保留的wal segment file的最小大小,以便流复制环境中的standby server 从主库中fetch wal file。如果连接到发送服务器的standby server超过本参数值的大小,发送服务器可能会删除掉standby server仍然需要的wal segments,此时,复制连接会终止,下游的连接最终也会因此失败,若是wal进行了归档,standby server可以从归档中进行fetch segments,以便恢复流复制。本参数值仅仅设置保留在pg_wal中的wal segments的最小大小。系统可能需要保留更多的wal segments以便进行wal 归档或者从检查点中恢复。本参数值仅仅在postgresql.conf中进行设置或者在server command line中进行设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### max_slot_wal_keep_size +| 参数名称 h| max_slot_wal_keep_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | -1,-1表示复制槽保留不限数量的wal files。 | +| 取值范围 | -1到2147483647 | +| 参数单位 | MB | +| 参数含义 | 用来指定复制槽保留pg_wal目录中wal file的最大大小。当一个复制槽的restart_lsn落后于current_lsn超过本参数值时,使用了复制槽的standby server不能再继续流复制,因为已经删除掉了需要的wal files | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_sender_timeout +| 参数名称 h| wal_sender_timeout | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 60000 | +| 取值范围 | 0到2147483647,0代表禁用timeout机制。 | +| 参数单位 | 毫秒,若是指定时不带单位,默认为为毫秒数 | +| 参数含义 | 当处于inactive状态多长时间(多长时间由本参数指定)之后,终止掉复制连接。这对于发送服务器检测standby crash或者网络中断很有用。当主备节点分布于不同的地理位置时,不同地理位置的节点使用不同的本参数值会带来管理上的灵活性。对于低延迟网络连接,较小的本参数值有助于快速的连接故障检测;对于地理位置较远的高延迟网络连接,较高的本参数值有助于判断standby server的健康状况。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效,允许非superuser修改本参数值非session级修改reload生效。 | + + +### Connections and Authentication / Authentication +#### authentication_timeout +| 参数名称 h| authentication_timeout | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 60 | +| 取值范围 | 1到600 | +| 参数单位 | 秒,如果指定本参数值时不带单位,默认为秒 | +| 参数含义 | 允许完成连接认证的最长时间。如果客户端没有在本参数值指定的时间内完成连接认证,PostgreSQL数据库会关闭此次连接。本参数用于防止大量的客户端无限制的占用连接。本参数仅仅可以在postgresql.conf设置或者在server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### password_encryption +| 参数名称 h| password_encryption | +| --- | --- | +| 数据类型 | enum | +| 默认值 | md5 | +| 取值范围 | md5和scram-sha-256,写on也可以,on与md5有相同的作用。 | +| 参数单位 | +| 参数含义 | 本参数决定了create role或者alter role语句中指定的密码的加密算法。请注意,老的客户端版本不支持SCRAM-SHA-256密码加密算法,具体请见下面的描述。有两个关键的标准去确定是否支持SCRAM密码加密算法。 正在运行PostgreSQL 10及其更高版本 你用来连接到PostgreSQL数据库的驱动有SCRAM兼容性。PostgreSQL社区已经提供了一个驱动清单(https://wiki.postgresql.org/wiki/List_of_drivers#Drivers)如果您的系统满足上述两个标准,您可以使用SCRAM密码加密算法。请注意:要把现有的环境从md5升级到scram-sha-256,可以在确保所有在用的客户端已经足以支持SCRAM之后,在postgresql.conf中设置password_encryption = 'scram-sha-256',然后让所有用户设置新口令并且在pg_hba.conf中将认证方法说明改为scram-sha-256。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 | + + +#### krb_server_keyfile +| 参数名称 h| krb_server_keyfile | +| --- | --- | +| 数据类型 | string | +| 默认值 | FILE:/krb5.keytab,注意,sysconfdir代表sysconfdir目录,该目录可以用pg_config --sysconfdir操作系统命令获得。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 设置服务器Kerberos key file的位置。如果本参数设置为空字符串(empty string),PostgreSQL会忽略这个空字符串,此时系统默认值会被使用。本参数值在postgresql.conf或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### krb_caseins_users +| 参数名称 h| krb_caseins_users | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off,off代表大小写敏感 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数用于控制GSSAPI user names是否被视为大小写不敏感,本参数值仅能在postgresql.conf或者server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### db_user_namespace +| 参数名称 h| db_user_namespace | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | +| 若本参数值设置为on,那么创建的用户名的格式是username@dbname,当client传递username时,@符以及database name会被附加到username的末尾,并且PostgreSQL数据库查询用户是查找username@dbname这个格式的用户。当你在SQL环境中使用username@dbname这个格式的用户名时,请使用引号引起来username@dbname。当本参数值设置为on时,你依然可以建立普通的全局users,在客户端指定username时加上@即可,当PostgreSQL查找username之前,@符号会被去掉。 + 本参数会导致客户端和服务器端的用户名称表示方法不同。认证始终检查服务器端的username。因此,认证方法必须被配置为服务器端的username。因为md5密码加密算法在客户端和服务器端均使用username作为salt,因此,md5密码加密算法不能与本参数值一起使用。 + 本参数值仅能在postgresql.conf或者server command line中设置。请注意,本特性的目的是在一个完整的解决方案找到之前作为临时措施,到那时,本参数会被remove掉。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -[cols="136,387"] -|=== -h| 参数名称 h| archive_timeout -| 参数值数据类型 | integer -| 默认值 | 0 -| 取值范围 | 0到1073741823 -| 参数单位 | 若是不指定单位,那默认的单位是秒 -| 参数含义 | 强制进行wal segments归档的时长。使用本参数归档出来的wal segment与正常的wal segment是相同的大小。因此,本参数值设置太小会对存储空间有浪费。本参数可以在postgresql.conf或者server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 -|=== +### Statistics / Query and Index Statistics Collector +#### track_activities +| 参数名称 h| track_activities | +| --- | --- | +| 数据类型 | boolean | +| 默认值 | on | +| 取值范围 | on 和off | +| 参数单位 | +| 参数含义 | 当设置为on时,当每个session中执行SQL语句或者命令时,PostgreSQL会收集信息(包括命令执行的时间信息)。收集的信息仅仅对superuser和执行命令所在session的owner可见。 | +| 是否可session级修改 | 是,仅限于superuser可进行session级修改 | +| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 | -=== Resource Usage / Background Writer +#### track_activity_query_size +| 参数名称 h| track_activity_query_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 1024 | +| 取值范围 | 100到1048576 | +| 参数单位 | Byte,当指定本参数不带单位时,默认是Bytes | +| 参数含义 | 为每个active的session保留当前执行命令的文本的大小,该文本对应pg_stat_activity.query列。本参数仅仅能在PostgreSQL start时设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== bgwriter_delay -[cols="136,387"] -|=== -h| 参数名称 h| bgwriter_delay -| 参数值数据类型 | integer -| 默认值 | 200 -| 取值范围 | 10到10000 -| 参数单位 | 若是不指定单位,那默认的单位是毫秒(ms) -| 参数含义 | 在每一轮循环中,background writer都会为一定数量的脏缓冲区发出写操作,然后background writer进行睡眠,睡眠的时间为bgwriter_delay参数值,然后再唤醒,然后重复。设置bgwriter_delay为不是10的倍数的值可能与将其设置为10的下一个更高的倍数具有相同的结果。本参数可以在postgresql.conf或者server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 +#### track_counts +| 参数名称 h| track_counts | +| --- | --- | +| 数据类型 | Bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当设置为on时,针对database activity收集统计信息。Autovacuum进程需要这些收集的信息。 | +| 是否可session级修改 | 是,仅限于superuser可进行session级修改 | +| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 | -|=== +#### track_io_timing +| 参数名称 h| track_io_timing | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 是否为database中的 io call/activity启用计时(即:io操作消耗了多少时间)。io计时信息体现在如下方面: pg_stat_database中 explain 带buffer时的输出中 pg_stat_statements中当设置为on时,PostgreSQL会重复查询操作系统的当前时间,这个可能会导致在某些平台下有大量开销。您可以使用pg_test_timing工具(该工具在bin目录下)来衡量系统的计时开销。仅superuser可以更改本参数值 | +| 是否可session级修改 | 是,仅限于superuser可进行session级修改 | +| 修改后何时生效 | Session级修改立即生效非session级修改reload生效 | +#### track_functions +| 参数名称 h| track_functions | +| --- | --- | +| 数据类型 | enum | +| 默认值 | none,none的含义是禁用本功能 | +| 取值范围 | none,pl,all | +| 参数单位 | +| 参数含义 | 启用追踪函数调用计数和消耗的时间。参数值pl的含义是仅仅对procedural-language函数进行追踪,参数值all的含义是追踪SQL和C语言函数。仅superuser可以更改本参数值 | +| 是否可session级修改 | 是,仅限于superuser可进行session级修改 | +| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 | -==== bgwriter_lru_maxpages -[cols="136,387"] -|=== -h| 参数名称 h| bgwriter_lru_maxpages -| 参数值数据类型 | integer -| 默认值 | 100 -| 取值范围 | 0到1073741823 +#### stats_temp_directory +| 参数名称 h| stats_temp_directory | +| --- | --- | +| 数据类型 | string | +| 默认值 | pg_stat_tmp | +| 取值范围 | | 参数单位 | -| 参数含义 | 每轮bgwriter进程写入LRU Page的最大数量。本参数设置为零会禁用background writing行为,但是background writer进程依然会存在。本参数可以在postgresql.conf或者server command line设置 -| 是否可session级修改 | 否 -| 修改后何时生效 -a| Reload即可 + +| 参数含义 | 本参数值用于指定存储临时统计信息的目录。本参数值可以是绝对路径,也可以是相对于data directory的相对路径本参数值指定为基于RAM的文件系统会减少物理IO并提升性能。本参数仅能在postgresql.conf中设置或者在server command line设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload生效 | -|=== +### File Locations +#### data_directory +| 参数名称 h| data_directory | +| --- | --- | +| 数据类型 | string | +| 默认值 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值表示PostgreSQL的数据目录的位置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== bgwriter_lru_multiplier -[cols="136,387"] -|=== -h| 参数名称 h| bgwriter_lru_multiplier -| 参数值数据类型 | real -| 默认值 | 2.0 -| 取值范围 | 0到10 +#### config_file +| 参数名称 h| config_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 在数据目录中 | +| 取值范围 | | 参数单位 | -| 参数含义 | 每轮写dirty buffer的数量基于服务器进程(即:backend process)在最近几轮中所需要的新buffer数量。最近的平均需要量乘以本参数值就是下一轮需要的新buffers数量的估计值。Dirty buffers会一直写入,直到有那么多干净的、可重用的buffers为止。因此,本参数值为1.0表示准确预计了需要的buffers数量。较大的本参数值提供了一些缓冲,以防需求激增,而较小的本参数值会有意将写dirty buffers操作留给服务器进程(即:backend process)完成。本参数可以在postgresql.conf或者server command line设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 本参数值指定了postgresql.conf的位置本参数值仅仅可以在postgres command line设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -|=== +#### hba_file +| 参数名称 h| hba_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 在数据目录中 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值指定了pg_hba.conf的位置;本参数值仅仅可以在PostgreSQL启动时设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== bgwriter_flush_after -[cols="136,387"] -|=== -h| 参数名称 h| bgwriter_flush_after -| 参数值数据类型 | integer -| 默认值 | Linux平台下是64,也就是512KB;其他平台下是0 -| 取值范围 | 源码中BLCKSZ 符号常量为8KB时,取值范围是0到256;源码中BLCKSZ 符号常量不为8KB时,等比例计算即可。 -| 参数单位 | 8KB -| 参数含义 | 当background writer写入的数据量超过本参数值之后,尝试强制操作系统发送这些写入的数据到底层存储中。这么做会限制kernel中page cache的dirty data的数量,减少在checkpoint末尾发生fsync时发生卡顿的可能性。本参数可以在postgresql.conf或者server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 +#### ident_file +| 参数名称 h| ident_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 在数据目录中 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值指定了pg_ident.conf的位置本参数值仅仅可以在PostgreSQL启动时设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -|=== +#### external_pid_file +| 参数名称 h| external_pid_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 指定了将postmaster的pid写入哪个文件本参数值仅仅可以在PostgreSQL启动时设置。 postgres=# alter system set external_pid_file='/home/pg131/postmasterpid.txt'; ALTER SYSTEM postgres=# exit [pg131@VM-0-8-centos ~]$ pg_ctl restart waiting for server to shut down.... done server stopped waiting for server to start....2021-04-09 10:09:21.776 CST [5977] LOG: redirecting log output to logging collector process 2021-04-09 10:09:21.776 CST [5977] HINT: Future log output will appear in directory "log". done server started [pg131@VM-0-8-centos ~]$ cd [pg131@VM-0-8-centos ~]$ ll total 136260 -rw-rw-r-- 1 pg131 pg131 0 Mar 10 20:47 12345aa drwxrwxr-x 2 pg131 pg131 4096 Apr 9 10:09 archive drwx------ 20 pg131 pg131 4096 Apr 9 10:09 data -rw-rw-r-- 1 pg131 pg131 72 Mar 23 10:34 para.sql drwxrwxr-x 6 pg131 pg131 4096 Dec 20 14:32 postgresql-13.1 -rw-r--r-- 1 pg131 pg131 139499520 Dec 20 14:07 postgresql-13.1.tar -rw-r--r-- 1 pg131 pg131 5 Apr 9 10:09 postmasterpid.txt drwxrwxr-x 7 pg131 pg131 4096 Dec 20 14:45 soft drwx------ 3 pg131 pg131 4096 Dec 20 16:04 ts1 [pg131@VM-0-8-centos ~]$ cat postmasterpid.txt 5977 [pg131@VM-0-8-centos ~]$ pg_ctl status pg_ctl: server is running (PID: 5977) /home/pg131/soft/bin/postgres[pg131@VM-0-8-centos ~]$ | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -=== Statistics / Monitoring +### Reporting and Logging / When to Log +#### log_min_messages +| 参数名称 h| log_min_messages | +| --- | --- | +| 数据类型 | enum | +| 默认值 | warning | +| 取值范围 | debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic | +| 参数单位 | +| 参数含义 | 控制哪种message level写入系统日志。取值范围见上。在上面的取值范围中,前一个取值包括其后的取值。在上面的取值范围中,级别越在后边,写入系统日志中的messages就越少。注意: 本参数的参数值log的级别与client_min_messages配置参数的参数值log的级别不同。仅允许superuser可以修改本参数值。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 | +| 修改后何时生效 | Session级别修改立即生效;其他级别修改reload生效 | -==== log_statement_stats -[cols="62,207"] -|=== -h| 参数名称 h| log_statement_stats -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_min_error_statement +| 参数名称 h| log_min_error_statement | +| --- | --- | +| 数据类型 | enum | +| 默认值 | error,表示那些导致了errors、log messages、fatal errors、panics的SQL语句会被记录到日志中。 | +| 取值范围 | debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic | | 参数单位 | -| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入系统性能统计信息。本参数on时,其他参数(log_parser_stats 、log_planner_stats、log_executor_stats)必须设置为off在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \* from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 09:55:21.621 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,6,"",2021-03-31 09:51:32 CST,3/0,0,LOG,00000,"QUERY STATISTICS","! system usage stats: ! 0.000657 s user, 0.000000 s system, 0.000657 s elapsed ! [0.003464 s user, 0.001403 s system total] ! 6288 kB max resident size ! 0/8 [0/24] filesystem blocks in/out ! 0/128 [0/1295] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [11/2] voluntary/involuntary context switches",,,,,"select \*from pg_database;",,,"psql","client backend" -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效,仅仅superuser能修改本参数 +| 参数含义 | 控制导致何种级别错误的SQL语句内容被记录到日志中。为了关闭对错误SQL语句的记录,请设置被参数值为panic仅允许superuser可以修改本参数值。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -|=== +#### log_min_duration_statement +| 参数名称 h| log_min_duration_statement | +| --- | --- | +| 数据类型 | integer | +| 默认值 | -1,-1表示禁用本功能。 | +| 取值范围 | -1到2147483647 | +| 参数单位 | 毫秒,若是不指定单位的话。 | +| 参数含义 | 所有运行超过本参数值的SQL语句会打印到系统日志中。本参数对追踪未优化的SQL语句有很大帮助。本参数值为零表示打印所有的SQL语句。仅允许superuser可以修改本参数值。本参数会覆盖log_min_duration_sample参数,这意味持续时间超过本参数值的SQL语句将不进行采样,而是始终记录下来。对于使用扩展查询协议的客户端,Parse、Bind、Execute阶段会被各自独立记录下来。本参数与log_statement参数合用时,由于log_statement参数起作用而记录到log中的SQL文本不会被重复记录。在不使用syslog时,推荐使用log_line_prefix参数,以便记录PID或者Session ID。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== log_parser_stats +#### log_min_duration_sample +| 参数名称 h| log_min_duration_sample | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | -1,-1表示禁用本功能。 | +| 取值范围 | -1到2147483647,参数值为零时,记录所有语句的sample | +| 参数单位 | 毫秒 | +| 参数含义 | 举例说明,如果本参数值设置为100ms,那么运行时间超过100ms的SQL语句会被考虑进行采样。仅允许superuser可以修改本参数值。当流量太大而无法记录所有查询时,启用此参数会很有帮助。本参数的优先级比log_min_duration_statement参数优先级要低。这意味着持续时间超过log_min_duration_statement参数值的SQL语句不受采样限制,并且总是被记录下来。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +#### log_statement_sample_rate +| 参数名称 h| log_statement_sample_rate | +| --- | --- | +| 数据类型 | Real | +| 默认值 | 1 | +| 取值范围 | 0到1 | +| 参数单位 | +| 参数含义 | 确定将记录的持续时间超过log_min_duration_sample参数值的的语句的比率。例如0.5意味着统计上每两个给定语句中就有一个被记录的机会。默认值为1.0,意味着记录所有采样语句。本参数值设置为0表示禁用sampled statement-duration logging。仅允许superuser可以修改本参数值。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +#### log_transaction_sample_rate +| 参数名称 h| log_transaction_sample_rate | +| --- | --- | +| 数据类型 | Real | +| 默认值 | 0,参数值为0表示不记录任何其他事务的语句 | +| 取值范围 | 0到1,参数值为1表示记录所有事物的所有语句 | +| 参数单位 | +| 参数含义 | 设置除其他原因记录的语句之外,所有记录语句的事务的百分比,本参数适用于每个新事务,而不考虑其语句的持续时间。采样是随机的,例如0.1意味着在统计上,每十个交易中有一个机会记录任何给定的事务。本参数值有助于构建一个事务的采样。仅允许superuser可以修改本参数值。另外请注意:与所有statement-logging选项一样,本参数会显著增加系统负载。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +### Checkpoints +#### checkpoint_timeout +| 参数名称 h| checkpoint_timeout | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 300 | +| 取值范围 | 30到86400 | +| 参数单位 | 秒 | +| 参数含义 | 设置两次automatic WAL checkpoints的时间间隔。增加本参数值会导致进行crash recovery的时间长度增大。本参数值仅能在postgresql.conf设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### checkpoint_completion_target +| 参数名称 h| checkpoint_completion_target | +| --- | --- | +| 数据类型 | Real | +| 默认值 | 0.5 | +| 取值范围 | 0到1 | +| 参数单位 | +| 参数含义 | 指定了checkpoint 完成的目标,即:checkpoint需要在checkpoint_timeout\* checkpoint_completion_target的时间长度内完成。本参数值仅能在postgresql.conf设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### checkpoint_flush_after +| 参数名称 h| checkpoint_flush_after | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 32,注意:linux平台下本参数默认值为32,Windows平台下本参数默认值为0 | +| 取值范围 | 0到256,如果BLCKSZ符号常量值不是8KB,请根据比例进行修改。 | +| 参数单位 | 8KB,若是指定参数值时不带单位,默认是BLCKSZ bytes,在不修改BLCKSZ符号常量值的情况下,该符号常量值为8KB。 | +| 参数含义 | 每当在执行检查点时写入的数据量超过本参数值时,会尝试强制操作系统向底层存储发出这些写入操作。这样会限制kernel page cache中dirty data的总量,减少了在checkpoint的末尾发出fsync命令时,或者当操作系统在后台以更大的批写入数据时,PostgreSQL暂停的可能性。这通常会大大减少事务延迟,但也有一些情况,特别是在工作负载大于shared_buffers,但小于操作系统page cache的情况下,性能可能会降低。本参数值仅可以在postgresql.conf中设置或者在server command line进行设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### checkpoint_warning +| 参数名称 h| checkpoint_warning | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 30 | +| 取值范围 | 0到2147483647,0会禁用warning。 | +| 参数单位 | 秒。若是指定本参数值不带单位,默认是秒 | +| 参数含义 | 如果由于填充WAL段文件而导致的检查点发生的时间间隔比本参数值更小(这表明应该加大max_wal_size配置参数值),则向服务器日志写入一条消息。当checkpoint_timeout参数值小于checkpoint_warning参数值时,warning不会产生。本参数值仅可以在postgresql.conf中设置或者在server command line进行设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### max_wal_size +| 参数名称 h| max_wal_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 1024 | +| 取值范围 | 2到2147483647 | +| 参数单位 | MB | +| 参数含义 | 触发automatic checkpoints的最大wal 大小。这是软限制,wal size可以在如下情况下超过本参数值的限制:重负载,失败的archive_command命令,以及高的wal_keep_size参数值设置。增加本参数值会导致进行crash recovery的时间长度增大。本参数值仅能在postgresql.conf设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### min_wal_size +| 参数名称 h| min_wal_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 80 | +| 取值范围 | 2到2147483647 | +| 参数单位 | MB | +| 参数含义 | 只要WAL Disk的使用低于本参数值,旧的wal文件总是在checkpoint发生时被循环使用,而不是删除wal文件。这可以用来确保保留足够的WAL空间来处理WAL使用中的峰值,例如在运行大型批处理作业时。此参数只能在postgresql.conf文件文件或在server command line上。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +### dynamic_library_path +| 参数名称 h| dynamic_library_path | +| --- | --- | +| 数据类型 | string | +| 默认值 | $libdir, $libdir代表的绝对路径请见pg_config --pkglibdir命令的输出 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 如果需要打开可动态加载的模块,并且create function 或LOAD命令中指定的文件名没有目录组件(即名称不包含斜杠),系统将在该路径中搜索所需的文件。本参数值必须是由冒号分隔(针对Linux平台)或者分号分隔(针对Windows平台)的绝对路径列表。如果本参数值以特殊字符串$libdir开头,那么编译后的PostgreSQL package library directory会取代$libdir, PostgreSQL package library directory请见pg_config --pkglibdir命令的结果。若是本参数值被设置为空字符串,表示自动path search功能会被关闭。superuser可以在运行时更改此参数,但这样做的设置只会持续到客户端连接结束,因此应将此方法保留用于开发目的。 | +| 是否可session级修改 | 是,此时仅限于superuser在session级别修改。 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +### gin_fuzzy_search_limit +| 参数名称 h| gin_fuzzy_search_limit | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,0表示无限制 | +| 取值范围 | 0到2147483647 | +| 参数单位 | +| 参数含义 | GIN索引扫描返回的结果集大小的软上限。开发GIN索引的主要目的是在PostgreSQL中创建对高度可伸缩的全文搜索的支持,而且通常情况下,全文搜索会返回非常大的结果集。此外,当查询包含非常频繁的单词时,这种情况经常发生,因此大的结果集甚至没有用处。因为从磁盘读取许多元组并对它们进行排序可能需要花费大量时间,这对于生产来说是不可接受的。(请注意,索引搜索本身非常快。)为了便于此类查询的受控执行,GIN对返回的行数有一个可配置的软上限,这就是gin_fuzzy_search_limit配置参数。默认设置为0(表示无限制)。如果设置了非零限制,则返回的集是随机选择的整个结果集的子集。"软"意味着返回结果的实际数量可能与指定的限制有所不同,这取决于查询和系统随机数生成器的质量。从经验来看,以千为单位的本参数值(例如,5000-20000)工作正常。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload生效 | + + +### tcp_keepalives_count +| 参数名称 h| tcp_keepalives_count | +| --- | --- | +| 数据类型 | +| 默认值 | 0,0表示取操作系统的默认值, | +| 取值范围 | 0到2147483647 | +| 参数单位 | +| 参数含义 | 指定在服务器与客户端的连接被视为已断开之前可以被丢弃的TCP keepalive messages.在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为零。本参数在Windows操作系统上不被支持,因此,在Windows操作系统上,本参数值必须为0。本参数仅仅支持符合如下条件的操作系统:那些支持TCP_KEEPCNT或者等价socket option的操作系统。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +### tcp_keepalives_idle +| 参数名称 h| tcp_keepalives_idle | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,0表示取操作系统的默认值 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 秒 | +| 参数含义 | 指定在没有网络活动的情况下,经过多长时间之后,操作系统应该向Client端发送TCP keepalive message.本参数仅仅支持符合如下条件的操作系统:那些支持TCP_KEEPIDLE或者等价socket option的操作系统。因此,在Windows以及其他操作系统中,本参数值必须为0,在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为0。在Windows操作系统上,本参数值为0时,本参数值将会被视为2小时,因为,Windows不提供读取系统默认值的方法。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +### tcp_keepalives_interval +| 参数名称 h| tcp_keepalives_interval | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,0表示取操作系统的默认值 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 秒 | +| 参数含义 | 指定TCP keepalive message重传的时间间隔。本参数仅仅支持符合如下条件的操作系统:那些支持TCP_KEEPINTVL或者等价socket option的操作系统。因此,在Windows以及其他操作系统中,本参数值必须为零,在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为零。在Windows操作系统上,本参数值为零时,本参数值将会被视为1秒,因为,Windows不提供读取系统默认值的方法。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +### tcp_user_timeout +| 参数名称 h| tcp_user_timeout | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,0表示取操作系统的默认值 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 指定在强制关闭TCP连接之前,传输的数据可能保持未确认状态的时间长度本参数仅仅支持符合如下条件的操作系统:那些支持TCP_USER_TIMEOUT或者等价socket option的操作系统。因此,在其他操作系统中,本参数值必须为零,在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为零。在Windows操作系统上,本参数不受支持,此时本参数值必须设置为零。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + + +### Query Tuning / Genetic Query Optimizer +#### geqo +| 参数名称 h| geqo | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | +| 启用或者禁用genetic query optimization,生产环境中不应该将本参数设置为off。配置参数geqo_threshold提供了对GEQO更细粒度的控制。遗传查询优化器(GEQO)是一种使用启发式搜索进行查询计划的算法。这减少了用于复杂查询(那些包含许多关系的查询)的计划时间,但所产生的计划的成本有时不如普通穷举搜索算法所找到的计划。 + | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | + -[cols="58,211"] -|=== -h| 参数名称 h| log_parser_stats -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### geqo_threshold +| 参数名称 h| geqo_threshold | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 12 | +| 取值范围 | 2到2147483647 | | 参数单位 | -| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入解析统计信息。在本参数设置为on的情况下,log_statement_stats配置参数无法设置为on,设置为on时会有如下的错误: postgres=# alter system set log_statement_stats='on'; ERROR: invalid value for parameter "log_statement_stats": 1 DETAIL: Cannot enable "log_statement_stats" when "log_parser_stats", "log_planner_stats", or "log_executor_stats" is true. postgres=#在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \* from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,41,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"PARSER STATISTICS","! system usage stats: ! 0.000019 s user, 0.000000 s system, 0.000019 s elapsed ! [0.015481 s user, 0.001403 s system total] ! 7720 kB max resident size ! 0/0 [0/56] filesystem blocks in/out ! 0/0 [0/1673] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent ! 0/0 [39/6] voluntary/involuntary context switches",,,,,"select \* from pg_database;",,,"psql","client backend" 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,42,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"statement: select \* from pg_database;",,,,,,,,,"psql","client backend" 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,43,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"PARSE ANALYSIS STATISTICS","! system usage stats: ! 0.000031 s user, 0.000000 s system, 0.000030 s elapsed ! [0.015565 s user, 0.001403 s system total] ! 7720 kB max resident size ! 0/0 [0/56] filesystem blocks in/out ! 0/0 [0/1673] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent ! 0/0 [39/6] voluntary/involuntary context switches",,,,,"select \* from pg_database;",,,"psql","client backend" 2021-03-31 10:16:25.962 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,44,"",2021-03-31 09:51:32 CST,3/3486,0,LOG,00000,"REWRITER STATISTICS","! system usage stats: ! 0.000003 s user, 0.000000 s system, 0.000003 s elapsed ! [0.015582 s user, 0.001403 s system total] ! 7720 kB max resident size ! 0/0 [0/56] filesystem blocks in/out ! 0/0 [0/1673] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [39/6] voluntary/involuntary context switches",,,,,"select \* from pg_database;",,,"psql","client backend" -| 是否可session级修改 | 是,但是不能在log_statement_stats=on时设置本参数为on -| 修改后何时生效 | Session级修改立即生效非session级修改reload生效,仅仅superuser能修改本参数 - -|=== +| 参数含义 | 本参数是启用geqo的阈值,即:当from之后的关系数量至少有本参数值指定的个数时,才启用geqo。注意一个FULL OUTER JOIN只被计为一个FROM项。对于简单的SQL语句,通常最好使用常规的穷举搜索planner,但是对于具有许多表的查询,穷举搜索花费的时间太长,通常比执行次优计划的代价要长,因此,本阈值是管理geqo的一种方法。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### geqo_effort +| 参数名称 h| geqo_effort | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 5 | +| 取值范围 | 1到10 | +| 参数单位 | +| 参数含义 | 控制GEQO中计划时间和查询计划质量之间的权衡。此变量必须是1到10之间的整数。默认值为5。较大的值会增加生成查询计划所花费的时间,但也会增加选择高效查询计划的可能性。本参数实际上并不直接做任何事情;它只用于计算影响geqo行为的其他变量的默认值。如果愿意,可以手动设置其他参数。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== log_planner_stats -[cols="58,211"] -|=== -h| 参数名称 h| log_planner_stats -| 参数值数据类型 | boolean -| 默认值 | off -| 取值范围 | off和on +#### geqo_pool_size +| 参数名称 h| geqo_pool_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,0表示PostgreSQL会根据SQL语句中表的数量以及geqo_effort参数值选择一个合适的值。 | +| 取值范围 | 0到2147483647 | | 参数单位 | -| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入规划器统计信息。在本参数设置为on的情况下,log_statement_stats配置参数无法设置为on,设置为on时会有如下的错误: postgres=# alter system set log_statement_stats='on'; ERROR: invalid value for parameter "log_statement_stats": 1 DETAIL: Cannot enable "log_statement_stats" when "log_parser_stats", "log_planner_stats", or "log_executor_stats" is true. postgres=#在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \* from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 10:24:39.323 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,63,"",2021-03-31 09:51:32 CST,3/3491,0,LOG,00000,"PLANNER STATISTICS","! system usage stats: ! 0.000041 s user, 0.000006 s system, 0.000045 s elapsed ! [0.017384 s user, 0.002173 s system total] ! 7740 kB max resident size ! 0/0 [0/80] filesystem blocks in/out ! 0/0 [0/1674] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [55/10] voluntary/involuntary context switches",,,,,"select \* from pg_database;",,,"psql","client backend" -| 是否可session级修改 | 是,但是不能在log_statement_stats=on时设置本参数为on -| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效,仅仅superuser能修改本参数 - -|=== +| 参数含义 | 控制GEQO使用的pool size,即:遗传群体中的个体数,至少是2,有用的值通常是100到1000. 参数值为0表示PostgreSQL会根据SQL语句中表的数量以及geqo_effort参数值选择一个合适的值。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### geqo_generations +| 参数名称 h| geqo_generations | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0 | +| 取值范围 | 0到2147483647 | +| 参数单位 | +| 参数含义 | 控制GEQO使用的generations,即算法的迭代次数。它必须至少是一个,并且有用的值通常是100到1000。如果设置为零(默认设置),则PostgreSQL会根据geqo_pool_size选择合适的值。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== log_executor_stats -[cols="58,211"] -|=== -h| 参数名称 h| log_executor_stats -| 参数值数据类型 | Bool -| 默认值 | off -| 取值范围 | off和on +#### geqo_selection_bias +| 参数名称 h| geqo_selection_bias | +| --- | --- | +| 数据类型 | real | +| 默认值 | 2 | +| 取值范围 | 1.5到2 | | 参数单位 | -| 参数含义 | 在本参数设置为on的情况下,pg会向运行日志中写入执行器统计信息。在本参数设置为on的情况下,log_statement_stats配置参数无法设置为on,设置为on时会有如下的错误: postgres=# alter system set log_statement_stats='on'; ERROR: invalid value for parameter "log_statement_stats": 1 DETAIL: Cannot enable "log_statement_stats" when "log_parser_stats", "log_planner_stats", or "log_executor_stats" is true. postgres=#在本参数设置为on的情况下,当前台发出SQL语句时(如下以psql中执行select \* from pg_database为例子),在pg的运行日志中,会有如下的输出: 2021-03-31 10:27:59.858 CST,"pg131","postgres",8896,"[local]",6063d5a4.22c0,71,"",2021-03-31 09:51:32 CST,3/3496,0,LOG,00000,"EXECUTOR STATISTICS","! system usage stats: ! 0.000031 s user, 0.000000 s system, 0.000030 s elapsed ! [0.018581 s user, 0.003320 s system total] ! 7744 kB max resident size ! 0/0 [0/104] filesystem blocks in/out ! 0/0 [0/1676] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent! 0/0 [71/14] voluntary/involuntary context switches",,,,,"select \* from pg_database;",,,"psql","client backend" -| 是否可session级修改 | 是,但是不能在log_statement_stats=on时设置本参数为on -| 修改后何时生效 | Session级修改立即生效非session级修改reload生效,仅仅superuser能修改本参数 +| 参数含义 | 控制GEQO使用的选择偏差。选择偏差是population内部的选择压力 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -|=== +#### geqo_seed +| 参数名称 h| geqo_seed | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0 | +| 取值范围 | 0到1 | +| 参数单位 | +| 参数含义 | 控制GEQO用于通过连接顺序搜索空间选择随机路径的随机数生成器的初始值,更改该值将更改所探索的连接路径集。并可能导致找到更好或更差的最佳路径 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -=== Client Connection Defaults / Shared Library Preloading +### Write-Ahead Log / Recovery Target +#### recovery_target +| 参数名称 h| recovery_target | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空串 | +| 取值范围 | immediate | +| 参数单位 | +| 参数含义 | 此参数指定恢复应在达到一致状态后尽快结束,即尽早结束。从联机备份还原时,这意味着在备份结束的时间点结束恢复。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 本参数不支持修改。 | -==== jit_provider -[cols="136,387"] -|=== -h| 参数名称 h| jit_provider -| 数据类型 | string -| 默认值 | llvmjit +#### recovery_target_name +| 参数名称 h| recovery_target_name | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空串 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值指定了jit provider library的名称,本参数仅仅可以在pg启动时设置。若是指定了不存在的library,则jit不可用,但是不会有报错抛出。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - +| 参数含义 | 此参数指定将继续恢复(recovery)到的命名还原点,该还原点由函数pg_create_restore_point()创建。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | -==== local_preload_libraries - -[cols="136,387"] -|=== -h| 参数名称 h| local_preload_libraries -| 数据类型 | string -| 默认值 | 空字符串 +#### recovery_target_time +| 参数名称 h| recovery_target_time | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空串 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数指定在连接启动时被预加载的一个或多个共享库。多个库名称以逗号分隔,其中每个库名的解释与load命令相同。库名之间的空格会被忽略,若是需要在库名中包括空格或者逗号,请用双引号将库名引起来。参数值仅仅在连接开始时生效,后续更改无效。如果找不到指定的库,则连接会将失败(即:连接将无法登陆到数据库中)。本参数任何user都可以设置。因此,被加载的共享库仅仅限于在$libdir/plugins目录下。数据库管理员有责任确保该目录下的共享库的安全性。本参数的参数值可以明确指定目录,比如$libdir/plugins/mylib,或者仅仅指定library名称,比如mylib,mylib的作用等同于$libdir/plugins/mylib本参数的目的是允许非授权用户加载debugging或者performance-measurement 库到特定session中,而无需load命令。为此,可以在客户端上使用设置了本参数的PGOPTIONS环境变量或者使用alter role set -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级修改立即生效非session级修改reload生效 - -|=== - - +| 参数含义 | 此参数指定将继续恢复(recovery)到的time stamp,精确的停止点受到recovery_target_inclusive配置参数影响。此参数的值是一个时间戳,其格式与timestamp with time zone数据类型所接受的格式相同,只是您不能使用时区缩写(除非在配置文件的前面设置了timezone_abbreviations变量)。首选样式是使用UTC的数字偏移量,或者您可以编写完整的时区名称,例如,Europe/Helsinki,而不是EEST | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | -==== session_preload_libraries -[cols="136,387"] -|=== -h| 参数名称 h| session_preload_libraries -| 数据类型 | string -| 默认值 | 空字符串 +#### recovery_target_xid +| 参数名称 h| recovery_target_xid | +| --- | --- | +| 数据类型 | string | +| 默认值 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值指定了在连接启动时被预加载的一个或者多个共享库。多个库名称以逗号分隔,其中每个库名的解释与load命令相同。库名之间的空格会被忽略,若是需要在库名中包括空格或者逗号,请用双引号将库名引起来。参数值仅仅在连接开始时生效,后续更改无效。如果找不到指定的库,则连接会将失败(即:连接将无法登陆到数据库中)。本参数的目的是允许加载debugging或者performance-measurement 库到特定session中,而无需load命令。比如,使用alter role set 语句设置本参数可以将auto_explain针对所有session生效。与shared_preload_libraries不同,在会话开始时(而不是在首次使用时)加载库没有太大的性能优势。但是,使用连接池时有一些优点。 -| 是否可session级修改 | 可以,只有superuser可以改变本参数值 -| 修改后何时生效 | Session级修改立即生效非session级修改reload生效,reload之后,仅仅对新启动的session生效。 - -|=== - - +| 参数含义 | 此参数指定将继续恢复(recovery)到的trasaction ID。请记住,虽然事务ID在事务开始时按顺序分配,但事务可以按不同的数字顺序完成。要恢复的事务是在指定事务之前提交的事务(也可以选择包括指定事务),精确的停止点受到recovery_target_inclusive配置参数影响。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | -==== shared_preload_libraries -[cols="136,387"] -|=== -h| 参数名称 h| shared_preload_libraries -| 数据类型 | string -| 默认值 | 空字符串 +#### recovery_target_lsn +| 参数名称 h| recovery_target_lsn | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空串 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值指定了在PostgreSQL数据库启动时被预加载的一个或者多个共享库。多个库名称以逗号分隔,其中每个库名的解释与load命令相同。库名之间的空格会被忽略,若是需要在库名中包括空格或者逗号,请用双引号将库名引起来。该参数只能在PostgreSQL数据库启动时设置,若是找不到指定的库,PostgreSQL数据库启动会失败。设置了本参数之后,新的backend process的启动时间会略有延长,即使这个backedn process不用这个共享库。因此,本参数推荐用于哪些在绝大多数session中使用的共享库。另外,由于本参数需要重启PostgreSQL数据库生效,因此,若是用于短期的debugging目的,请使用session_preload_libraries参数。请注意,在Windows主机上,在服务器启动时预加载库不会减少启动每个新服务器进程所需的时间。每个服务器进程将重新加载所有预加载库。但是,对于需要在postmaster启动时执行操作的库,本参数在windows主机上是很有用的。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 +| 参数含义 | 此参数指定将继续恢复(recovery)到的LSN,精确的停止点受到recovery_target_inclusive配置参数影响。本参数使用系统数据类型pg_lsn解析。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | -|=== +#### recovery_target_inclusive +| 参数名称 h| recovery_target_inclusive | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当本参数设置为on时指定到达指定的recovery target之后停止当本参数设置为off时指定到达指定的recovery target之前停止本参数与如下参数配合使用:recovery_target_lsn、recovery_target_time、recovery_target_xid。本参数控制含有精确recovery target(恢复目标)的LSN、commit time、或者trasaction id是否被包括恢复(recovery)之内。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | -=== Lock Management - -==== deadlock_timeout - -[cols="136,387"] -|=== -h| 参数名称 h| deadlock_timeout -| 数据类型 | string -| 默认值 | 1000 -| 取值范围 | 1到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 在检查是否存在deadlock条件之前,等待一个lock的时间长度。死锁检查是相对昂贵的,因此,pg不会在每次等待lock时都运行死锁检测。PostgreSQL会乐观的认为死锁在生产应用程序中并不常见,只需要等待一段时间后再检查死锁。这是您在实践中想要设置的最小值,在负载很重的pg中,可能需要提高本参数值。在理想情况下,本参数值应该超过典型的transaction 时间,以提高在PostgreSQL决定检查死锁之前将释放锁的几率。仅仅superuser可以修改本参数值。在log_lock_waits参数启用的情况下,deadlock_timeout参数值也决定了一个有关lock wait的 log message被写入运行日志之前的等待时间。如果你正在尝试调查锁定延迟(locking delays),你可能希望设置比正常deadlock_timeout参数值更短的时间。 -| 是否可session级修改 | 是(仅仅superuser可修改) -| 修改后何时生效 | Session级修改立即生效(仅仅superuser);非session级别修改Reload即可生效 +#### recovery_target_timeline +| 参数名称 h| recovery_target_timeline | +| --- | --- | +| 数据类型 | string | +| 默认值 | latest | +| 取值范围 | +| 参数单位 | +| 参数含义 | 指定recovery进入一个特定的timeline,本参数值可以是一个数字的timeline id或者一个特定的值,值current的含义:recover到做base backup时的那个timeline;值latest表示recover到在archive 中找到的最新的timeline,值latest适用于standby server。您通常只需要在复杂的重新恢复情况下设置本参数,在这种情况下,您需要返回到在时间点恢复之后达到的状态。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | -|=== +#### recovery_target_action +| 参数名称 h| recovery_target_action | +| --- | --- | +| 数据类型 | enum | +| 默认值 | pause | +| 取值范围 | pause,promote,shutdown | +| 参数单位 | +| 参数含义 | 指定了一旦达到recovery target,PostgreSQL该采取的操作。默认值pause表示恢复暂停(pause),值promote表示恢复过程完成并且PostgreSQL将会启动以接受外部连接,值shutdown表示在达到recovery target之后会stop PostgreSQL。pause值的预期用途是允许对数据库执行查询,以检查此恢复目标是否是最理想的恢复点,pg_wal_replay_resume()函数表示paused state resumed,这意味着恢复走到了终点。若是recovery target不是期望的那个stopping point,那么请关闭PostgreSQL,改变recovery target到更为之后的一个target,然后重启recovery即可。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG Instance生效 | +### Query Tuning / Other Planner Options +#### default_statistics_target +| 参数名称 h| default_statistics_target | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 100 | +| 取值范围 | 1到10000 | +| 参数单位 | +| 参数含义 | 为没有通过ALTER TABLE SET STATISTICS设置column-specific target的表列设置默认统计目标。较大的本参数值会增加analyze的时间,但也会提升planner估计的质量。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== max_locks_per_transaction -[cols="136,387"] -|=== -h| 参数名称 h| max_locks_per_transaction -| 数据类型 | integer -| 默认值 | 64 -| 取值范围 | 10到2147483647 +#### constraint_exclusion +| 参数名称 h| constraint_exclusion | +| --- | --- | +| 数据类型 | enum | +| 默认值 | partition | +| 取值范围 | partition,on,off on表示检查所有表的约束 off表示不检查约束partition表示仅仅对继承的子表以及union all子查询检查约束。 | | 参数单位 | -| 参数含义 -a| 共享锁表(shared lock table)追踪max_locks_per_transaction \* (max_connections + max_prepared_transactions) 个lock objects,因此,一次只能锁定这么多不同的对象。本参数控制分配给每个事务的object lock的平均数量。单个事务可以锁定更多的对象,只要所有事务的锁都在锁表(lock table)中. 本参数值不是可以锁定的行数;可以锁定的行数是无限的。max_locks_per_transaction的默认值是64在历史上是被证明足够的,但是如果在多个事务中有涉及多个不同的表的SQL语句(比如一个有多个子表的父表的SQL语句),则可能提高该数值。本参数只能在PostgreSQL数据库启动时设置。当存在standby server时,standby server上的本参数值要大于或者等于master server上的本参数值,否则,查询语句在standby server上是不被允许的。 + +| 参数含义 | +| 控制planner是否使用constraints优化查询,如果表的约束保证没有与查询匹配的行,table scan会被跳过。本参数经常与传统的继承树一起使用以提高性能,比如如下的例子: CREATE TABLE parent(key integer, ...); CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent); CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent); ... SELECT \* FROM parent WHERE key = 2400;当本参数启用时,select语句就不会扫描child1000这个表。目前,默认情况下仅对经常用于通过继承树实现表分区的情况启用约束排除。为所有表启用它会带来额外的计划开销,这在简单查询中非常明显,而且对于简单查询通常不会产生任何好处。如果没有使用传统继承进行分区的表,则可能希望完全关闭它。(请注意,分区表的等效功能由单独的配置参数enable_partition_pruning控制。) + | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 -|=== +#### cursor_tuple_fraction +| 参数名称 h| cursor_tuple_fraction | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.1 | +| 取值范围 | 0到1 | +| 参数单位 | +| 参数含义 | 设置planner's估计,本参数设置较少的值时,会使planner倾向于对cursors使用"fast start" plan,这会快速的检索前几行,而获取所有行可能需要很长时间。较大的值更强调总的估计时间。在最大设置为1.0时,游标的规划与常规查询完全相同,只考虑总的估计时间,而不考虑第一行的交付时间。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### from_collapse_limit +| 参数名称 h| from_collapse_limit | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 8 | +| 取值范围 | 1到2147483647 | +| 参数单位 | +| 参数含义 | 如果生成的FROM列表包含的项目不超过本参数值,那么planner将会把子查询合并到上面的查询中。较小的值会减少计划时间,但可能会产生较差的查询计划。设置本参数值为geqo_threshold参数值或者更大可能会触发GEQO Planner的使用,进而导致非优化的执行计划。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### jit +| 参数名称 h| jit | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 确定jit编译是否被PostgreSQL使用。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== max_pred_locks_per_transaction -[cols="136,387"] -|=== -h| 参数名称 h| max_pred_locks_per_transaction -| 数据类型 | Integer -| 默认值 | 64 -| 取值范围 | 10到2147483647 +#### join_collapse_limit +| 参数名称 h| join_collapse_limit | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 8 | +| 取值范围 | 1到2147483647 | | 参数单位 | -| 参数含义 | 共享谓词锁表(shared predicate lock table)追踪max_pred_locks_per_transaction \* (max_connections + max_prepared_transactions) 个lock objects,因此,一次只能锁定这么多不同的对象。本参数控制分配给每个事务的object lock的平均数量。单个事务可以锁定更多的对象,只要所有事务的锁都在锁表(lock table)中. 本参数值不是可以锁定的行数;可以锁定的行数是无限的。本参数默认值64在测试环境中是足够的,但是如果你的client在单个串行化事务中用到了多个不同的table,你可能需要加大本参数值。本参数只能在PostgreSQL数据库启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== +| 参数含义 | 每当生成的items列表不超过本参数值时,planner就会将explicit join结构(FULL JOINs除外)重写为FROM items列表。较小的值会减少计划时间,但可能会产生较差的查询计划.默认情况下,此参数值设置为与from_collapse_limit参数值相同,这适用于大多数用途。将其设置为1可防止explicit join的任何重新排序。因此,查询中指定的显式连接顺序将是连接关系的实际顺序。因为查询规划器并不总是选择最佳的连接顺序,所以高级用户可以选择将此参数值临时设置为1,然后显式指定所需的连接顺序。设置本参数值为geqo_threshold参数值或者更大可能会触发GEQO Planner的使用,进而导致非优化的执行计划。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### parallel_leader_participation +| 参数名称 h| parallel_leader_participation | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 允许leader进程在Gather和Gather Merge node下执行查询计划,而不是等待worker进程。将此值设置为off可降低worker进程被阻塞的可能性,因为leader进程读取元组的速度不够快,但需要leader进程等待工作进程启动,然后才能生成第一个元组。Leader进程能够帮助或阻碍性能的程度取决于计划类型、worker数量和查询持续时间。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== max_pred_locks_per_relation -[cols="136,387"] -|=== -h| 参数名称 h| max_pred_locks_per_relation -| 数据类型 | Integer -| 默认值 | -2 -| 取值范围 | -2147483648到2147483647 +#### force_parallel_mode +| 参数名称 h| force_parallel_mode | +| --- | --- | +| 数据类型 | enum | +| 默认值 | off | +| 取值范围 | off,on,regress off表示仅仅当预期能提升性能时,才使用parallel mode on表示对被视为safe的查询语句强制使用并行查询。regress表示除了有本参数值设置为"on"的相同的所有效果之外,还有一些旨在促进自动回归测试的附加效果 | | 参数单位 | -| 参数含义 | 本参数控制在将锁提升为覆盖整个relation之前,单个relation中能有多少pages或者tuples能被predicate-locked 。本参数值大于等于零时表示绝对限制,本参数值为负值时表示max_pred_locks_per_transaction/本参数值的绝对值。本参数可以在postgresql.conf设置也可以在server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload生效 +| 参数含义 | 是否使用parallel query功能。更具体地说,将此值设置为on将在任何查询计划的顶部添加一个Gather节点,这看起来是安全的,因此查询在并行worker进程中运行,即使并行worker进程不可用或无法使用,也将禁止在并行查询上下文中禁止的操作(如启动子事务),除非planner认为这将导致查询失败,如果设置此选项时出现故障或意外结果,则查询使用的某些函数可能需要标记为PARALLEL UNSAFE(或者,可能是PARALLEL RESTRICTED)通常,来自并行worker进程的消息包含一个context line,但是设置为regress会抑制该context line,以便输出与非并行执行中的输出相同。此外,通过此设置,添加到计划中的Gather nodes将隐藏在EXPLAIN的输出中,以便当本参数值设置为off时,输出与获得的结果相匹配。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -|=== +#### plan_cache_mode +| 参数名称 h| plan_cache_mode | +| --- | --- | +| 数据类型 | enum | +| 默认值 | auto | +| 取值范围 | auto,force_generic_plan,force_custom_plan | +| 参数单位 | +| 参数含义 | 可以使用自定义或generic的plan执行prepared statements(explicitly prepared或implicitly generated,例如通过PL/pgSQL),针对每一次的执行,自定义plan使用特定的一组参数值被重新生成,generic plans不依赖本plan_cache_mode参数值,可以被多次的执行重复使用。此外,使用generic plans会节省 planning time,但是,如果理想的plan强烈依靠本参数,那么,generic plan可能效率低下。这些选项之间的选择通常是自动进行的,但它可以被plan_cache_mode配置参数覆盖。在执行缓存的计划时,而不是在准备计划时,会考虑本参数值 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== max_pred_locks_per_page -[cols="136,387"] -|=== -h| 参数名称 h| max_pred_locks_per_page -| 数据类型 | integer -| 默认值 | 2 -| 取值范围 | 0到2147483647 +### Version and Platform Compatibility / Previous PostgreSQL Versions +#### array_nulls +| 参数名称 h| array_nulls | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on,本参数值为on时表示允许输入包括NULL的数组值 | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 本参数控制在将锁提升为覆盖整个page之前,单个page中能有多少tuples能被predicate-locked。本参数可以在postgresql.conf设置也可以在server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload生效 +| 参数含义 | 本参数控制数组输入解析器是否将未加引号的NULL识别为指定NULL数组元素。8.2版本之前的PostgreSQL不支持数组中的null值,因此将null视为使用字符串值"null"指定普通数组元素。为了向后兼容需要旧行为的应用程序,可以关闭此参数。请注意,即使本参数值是off,也可以创建包含NULL的数组值 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -|=== +#### backslash_quote +| 参数名称 h| backslash_quote | +| --- | --- | +| 数据类型 | enum | +| 默认值 | safe_encoding | +| 取值范围 | safe_encoding,on,off on表示始终允许\' off表示始终拒绝\'safe_encoding表示仅当客户端编码不允许在多字节字符中使用ASCII\时才允许. | +| 参数单位 | +| 参数含义 | 本参数用于设置字符串的引用符是否是\'符号。SQL标准中是'',而PostgreSQL历史上也接受了\'符号,但是,使用\'会带来安全风险,这是因为,在一些客户端字符集编码中,存在多字节字符,其中最后一个字节在数字上等同于ASCII \.如果客户端没有正确的转义,那么SQL注入攻击是可能的。这种风险可以通过使PostgreSQL数据库拒绝引用符被backslash反斜杠转义的查询来防止。请注意,在标准一致性字符串文本中,无论如何,\仅仅表示\。此参数仅影响对非标准一致性文本的处理,包括转义字符串语法(E'…') | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### escape_string_warning +| 参数名称 h| escape_string_warning | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当设置为on时,表示当\出现在一个普通的字符串('…'这样的)中并且standard_conforming_strings参数值为off时,一个warning会发出。希望使用反斜杠作为转义的应用程序应该修改为使用转义字符串语法(E'…'). 因为根据SQL标准,普通字符串的默认行为现在是将反斜杠视为普通字符. 可以启用本参数来帮助定位需要更改的代码 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -=== Resource Usage / Cost-Based Vacuum Delay -==== vacuum_cost_delay +#### lo_compat_privileges +| 参数名称 h| lo_compat_privileges | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | +| 参数单位 | +| 参数含义 | 对large object,为权限检查启用面向backward的兼容性模式。在PostgreSQL9.0之前,large object并不具有访问权限,因此,large object总是能被所有的user进行读和写。设置本参数值为on将会禁用新权限的检查,这会与PostgreSQL9.0之前的版本保持兼容。 | +| 是否可session级修改 | 是,仅限于superuser进行修改 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_cost_delay -| 数据类型 | Real -| 默认值 | 0,零代表禁用了基于成本的vacuum delay特性。 -| 取值范围 | 0到100 -| 参数单位 | 毫秒 -| 参数含义 | vacuum_cost_limit参数值是一个累积vacuum io操作的成本值,当vacuum操作达到vacuum_cost_limit参数值之后,vacuum操作会停下来休眠一段时间,该段时间是vacuum_cost_delay参数值指定的,然后,PostgreSQL会重置计数器并继续vacuum操作。本参数的参数值建议尽量小,大值是没有帮助的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 -|=== +#### operator_precedence_warning +| 参数名称 h| operator_precedence_warning | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 启用此选项后,解析器将对自PostgreSQL 9.4以来由于运算符优先级的更改而可能已更改含义的任何构造发出警告。对于审核应用程序以查看优先级更改是否破坏了任何内容非常有用;但这并不意味着在生产环境中保持打开状态,因为它将警告某些完全有效、符合标准的SQL代码 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### quote_all_identifiers +| 参数名称 h| quote_all_identifiers | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | +| 当数据库生成SQL语句时,即使标识符不是关键字,也会将标识符引用起来。这会影响explain的输出以及诸如pg_get_viewdef函数的结果,比如下面的例子: postgres=# select pg_get_viewdef('company_view'); -[RECORD 1]--+-------------------- pg_get_viewdef | SELECT company.id,+ | company.name, + | company.age + | FROM company; + postgres=# set quote_all_identifiers=on; SET postgres=# select pg_get_viewdef('company_view'); -[RECORD 1]--+------------------------ pg_get_viewdef | SELECT "company"."id",+ | "company"."name", + | "company"."age" + | FROM "company"; + postgres=# | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +#### standard_conforming_strings +| 参数名称 h| standard_conforming_strings | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 本参数控制普通字符串文本('…')是否按SQL标准中的指定按字面含义处理反斜杠.从PostgreSQL9.1开始,默认值为on。此参数的存在也可以被视为表示支持转义字符串语法(E'…')如果应用程序希望反斜杠被视为转义字符,则应使用转义字符串语法 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | -==== vacuum_cost_page_hit -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_cost_page_hit -| 数据类型 | Integer -| 默认值 | 1 -| 取值范围 | 0到10000 +#### synchronize_seqscans +| 参数名称 h| synchronize_seqscans | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 对shared buffer中发现的一个buffer进行vacuum的估计成本,本成本代表:锁定buffer pool的成本+查找shared hash table的成本+扫描page中内容的成本。 -| 是否可session级修改 | 是 -| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 - -|=== +| 参数含义 | 这允许对大表的顺序扫描彼此同步,以便并发扫描在大约相同的时间读取相同的块,从而共享I/O工作负载。启用本参数后,扫描可能从表的中间开始,然后"环绕"结尾以覆盖所有行,以便与正在进行的扫描活动同步。这可能导致没有ORDERBY子句的查询返回的行顺序发生不可预知的更改。将此参数设置为off可确保与PostgreSQL 8.3之前的行为,即顺序扫描始终从表的开头开始 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 | +### Connections and Authentication / Connection Settings +#### listen_addresses +| 参数名称 h| listen_addresses | +| --- | --- | +| 数据类型 | string | +| 默认值 | localhost | +| 取值范围 | +| 参数单位 | +| 参数含义 | 设置数据库服务器监听的hostname或者IP地址,监听多个hostname或者IP地址时,请用逗号隔开。 \*号表示监听所有可用的IP地址, 0:0:0:0监听代表所有IPV4的地址, ::代表监听所有IPV6的地址。当本参数值为空时,PostgreSQL不会监听任何的IP,此时,只有Unix-domain sockets才可以用于连接到数据库中。本参数控制哪些IP地址上接受连接尝试,这可以帮助防止在不安全的IP地址上重复出现恶意连接请求。该参数只能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== vacuum_cost_page_miss -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_cost_page_miss -| 数据类型 | Integer -| 默认值 | 10 -| 取值范围 | 0到10000 +#### port +| 参数名称 h| port | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 5432 | +| 取值范围 | 1到65535 | | 参数单位 | -| 参数含义 | 对不在shared buffer中的一个buffer(只能从disk读取)进行vacuum的估计成本,本成本代表:锁定buffer pool的成本+查找shared hash table的成本+从disk中读取该block到buffer的成本+扫描page中内容的成本。 -| 是否可session级修改 | 是 -| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 - -|=== +| 参数含义 | PostgreSQL监听的TCP端口。请注意,PostgreSQL监听的所有IP地址都使用相同的端口号,本参数只能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### max_connections +| 参数名称 h| max_connections | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 100 | +| 取值范围 | 1到262143 | +| 参数单位 | +| 参数含义 | 本参数值指定了PostgreSQL数据库的最大连接数。本参数只能在PostgreSQL启动时设置。在流复制备库上,必须将本参数值设置为与主库相同或者比主库参数值大,否则,后备服务器将不允许查询操作。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== vacuum_cost_page_dirty -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_cost_page_dirty -| 数据类型 | Integer -| 默认值 | 20 -| 取值范围 | 0到10000 +#### superuser_reserved_connections +| 参数名称 h| superuser_reserved_connections | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 3 | +| 取值范围 | 0到262143 | | 参数单位 | -| 参数含义 | Vacuum改变一个之前是干净的block的估计成本。本成本代表:额外的io操作以便将dirty block刷新到disk中。 -| 是否可session级修改 | 是 -| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 +| 参数含义 | 为superusers保留的connection "slots"的数量,当PostgreSQL的活跃的并发连接的数量等于max_connections参数值减去superuser_reserved_connections参数值之后,仅仅可以面向superuser建立新的连接,并且,replication connection也是建立不了的。本参数只能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -|=== +#### unix_socket_directories +| 参数名称 h| unix_socket_directories | +| --- | --- | +| 数据类型 | string | +| 默认值 | 在Linux中默认值为/tmp;在Windows中默认值为空 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数指定了PostgreSQL监听客户端连接的Unix-domain socket(s)目录,多个目录可以用逗号隔开,两个目录之间的空格会被忽略,如果你想在目录名中包括逗号或者空格,请使用双引号引起来。本参数值为空时表示不监听任何的Unix-domain socket(s)目录,这意味着只有TCP/IP sockets可以被用来连接到PostgreSQL中。本参数只能在PostgreSQL启动时设置。在本参数值指定的目录下,会有名为s.PGSQL.nnnn的socket file,nnnn是PostgreSQL使用的端口号,在该目录下,还有一个名为.s.PGSQL.nnnn.lock的文件。这两个文件请不要手工删除。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### unix_socket_group +| 参数名称 h| unix_socket_group | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串表示使用启动PostgreSQL 的user的默认组。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 设置Unix-domain socket(s).的owning group(请注意:socket的owning user总是启动PostgreSQL的user)。本参数与unix_socket_permissions结合使用可以将其作为Unix-domain connections的额外访问控制机制。本参数只能在PostgreSQL启动时设置。本参数不支持在Windows上使用,在Windows上,本参数取任何值都会被忽略。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== vacuum_cost_limit -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_cost_limit -| 数据类型 | Integer -| 默认值 | 200 -| 取值范围 | 1到10000 +#### unix_socket_permissions +| 参数名称 h| unix_socket_permissions | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0777,0777表示任何人都可以连接 | +| 取值范围 | 0到511 | | 参数单位 | -| 参数含义 | 本参数值是一个累积vacuum io操作的成本值,当vacuum操作达到本参数值之后,vacuum操作会停下来休眠一段时间。 -| 是否可session级修改 | 是 -| 修改后何时生效 | session修改会立即生效;非session级修改reload即可生效。 +| 参数含义 | 本参数用于设置Unix-domain socket(s)的访问权限。Unix-domain socket使用通常的Unix文件系统权限集。参数值预计是被chmod和umask系统调用接受的数字模式。(要使用惯用的八进制格式,数字必须以0(零)开头。)合理的参数值是0770(仅用户和组,另请参见unix_socket_group)和0700(仅用户)。请注意,对于Unix-domain socket,仅写许可权是重要的,因此设置或撤消读或执行许可权没有意义。本参数只能在PostgreSQL启动时设置。在完全忽略socket permissions的操作系统上(特别是自solaris10起的Solaris),此参数是不相关的。在此类操作系统上,可以通过将unix目录指向一个搜索权限仅限于所需访问用户的目录来实现类似的效果。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -|=== +#### bonjour +| 参数名称 h| bonjour | +| --- | --- | +| 数据类型 | boolean | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 本参数控制是否通过Bonjour机制通告PostgreSQL的存在。本参数只能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -=== Replication / Sending Servers +#### bonjour_name +| 参数名称 h| bonjour_name | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串。空字符串表示使用计算机名 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数用于设置Bonjour service name。当PostgreSQL软件没有编译Bonjour support时,本参数会被忽略。本参数只能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效。 | -==== max_wal_senders -[cols="136,387"] -|=== -h| 参数名称 h| max_wal_senders -| 数据类型 | Integer -| 默认值 | 10 -| 取值范围 | 0到262143,0表示复制被禁用 +### Resource Usage / Asynchronous Behavior +#### effective_io_concurrency +| 参数名称 h| effective_io_concurrency | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 1 | +| 取值范围 | 0到1000,0表示禁止发布异步I/O请求 | | 参数单位 | -| 参数含义 | 同时运行wal sender process的最大数量。运行wal sender process的场景包括流复制和以streaming模式进行base backup(译者注:其实还包括逻辑复制使用逻辑复制槽的场景,但是在PostgreSQL文档中并没有写明这一点)。本参数仅能在PostgreSQL启动时进行设置。配置参数waL_level必须设置为replica或者更高的值以便允许来自standby server的连接。在流复制环境中,在流复制备库上的该参数值至少要等于或者大于流复制主库上的该参数值,否则在备库上的query是不允许的。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instanc生效 - -|=== +| 参数含义 | 有效利用disk子系统的并发disk io的数量。目前,本参数仅仅影响bitmap heap scans。对于HDD(机械硬盘),本参数的起始值应该是PostgreSQL database用到的、组成raid 0 条带或者raid 1镜像的单独 disk drive的个数。但是,如果PostgreSQL数据库经常忙于并发会话中发出的多个查询,则较低的值可能足以使磁盘阵列保持繁忙。高于使磁盘保持忙碌的本参数值只会导致额外的CPU开销,固态盘(SSD)以及其他基于内存的存储可以经常处理很多并发请求,因此,此时最佳的值可能是几百。异步IO请求取决于一个有效的posix_fadvise函数,该函数在有些操作系统上是缺少的。在该函数缺少时,设置本参数为非零值会导致错误发生。在有些操作系统上(比如Solaris),本函数存在但是并没有实际的执行任何操作。在受到支持的操作系统上,本参数值的默认值为1,否则为零。本参数值可以被tablespace级别的同名参数值所覆盖。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 | +#### maintenance_io_concurrency +| 参数名称 h| maintenance_io_concurrency | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 10 | +| 取值范围 | 0到1000 | +| 参数单位 | +| 参数含义 | 本参数类似于effective_io_concurrency参数,但本参数用于代表许多客户端会话执行的维护工作。在受到支持的操作系统上,本参数值的默认值为10,否则为零。本参数值可以被tablespace级别的同名参数值所覆盖。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 | -==== max_replication_slots -[cols="136,387"] -|=== -h| 参数名称 h| max_replication_slots -| 数据类型 | Integer -| 默认值 | 10 -| 取值范围 | 0到262143 +#### max_worker_processes +| 参数名称 h| max_worker_processes | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 8 | +| 取值范围 | 0到262143 | | 参数单位 | -| 参数含义 -a| 设置PostgreSQL能支持的复制槽的最大数量,本参数仅能在PostgreSQL启动时进行设置。当本参数值小于当前已经存在的replicat slot时,会导致PG instance无法启动。配置参数waL_level必须设置为replica或者更高的值以便允许replication slot被用到。 + +| 参数含义 | 本参数值指定了PostgreSQL所能支持的并发worker进程的最大数量。本参数值仅能在PostgreSQL启动时设置。当运行在standby server环境中时,在standby server上的本参数值必须大于或者等于在master server上的本参数值。否则,query是不能运行在standby server上。当改变本参数值时,请考虑调整max_parallel_workers,参数,max_parallel_maintenance_workers参数,max_parallel_workers_per_gather参数 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instanc生效 -|=== +#### max_parallel_workers_per_gather +| 参数名称 h| max_parallel_workers_per_gather | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 2 | +| 取值范围 | 0到1024,0表示禁用parallel query execution | +| 参数单位 | +| 参数含义 | 本参数指定了可以被单个Gather或者Gather Merge Node启动的worker进程的最大数量。Parallel Workers进程从由max_worker_processes配置参数建立的进程池中获取,受限于max_parallel_workers配置参数。请注意,请求的workers的数量在运行时并不一定实际可用,如果这个情况发生,执行计划会以少于期望个数的workers去运行,这可能是低效的。请注意,parallel queries可能比非parallel queries消耗更多的资源,因为每个工作进程是一个完全独立的进程,其对系统的影响与附加用户会话大致相同。在为此设置选择值时,以及在配置控制资源利用率的其他设置(如work_mem)时,都应考虑到这一点。诸如work_mem之类的资源限制单独应用于每个worker,这意味着所有进程的总利用率可能比任何单个进程的正常利用率高得多。例如,一个使用4个worker的并行查询可能会使用多达5倍的CPU时间、内存、I/O带宽。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 | -==== wal_keep_size +#### max_parallel_maintenance_workers +| 参数名称 h| max_parallel_maintenance_workers | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 2 | +| 取值范围 | 0到1024,0表示禁用由实用命令使用的parallel workers | +| 参数单位 | +| 参数含义 | 可以被单个实用命令启动的parallel worker的最大数量。当前,支持parallel workers的并行实用命令有如下几种: create index 建立B-Tree时; vacuum 不带full选项时; Parallel Workers进程从由max_worker_processes配置参数建立的进程池中获取,受限于max_parallel_workers配置参数。请注意,请求的workers的数量在运行时并不一定实际可用,如果这个情况发生,执行计划会以少于期望个数的workers去运行,这可能是低效的。注意,并行实用程序命令不应该比等效的非并行操作消耗更多的内存,这种策略不同于并行查询,在并行查询中资源限制通常适用于每个worker进程。并行实用命令将资源限制maintenance_work_mem视为应用于整个实用命令的限制,而不考虑并行工作进程的数量。然而,并行实用命令仍然可能消耗更多的CPU资源和I/O带宽。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 | -[cols="136,387"] -|=== -h| 参数名称 h| wal_keep_size -| 数据类型 | Integer -| 默认值 | 0,0表示PostgreSQL不会为流复制环境保留额外的wal segments, -| 取值范围 | 0到2147483647 -| 参数单位 | MB,若是设置时不带单位,则默认为MB -| 参数含义 | 指定在pg_wal目录中保留的wal segment file的最小大小,以便流复制环境中的standby server 从主库中fetch wal file。如果连接到发送服务器的standby server超过本参数值的大小,发送服务器可能会删除掉standby server仍然需要的wal segments,此时,复制连接会终止,下游的连接最终也会因此失败,若是wal进行了归档,standby server可以从归档中进行fetch segments,以便恢复流复制。本参数值仅仅设置保留在pg_wal中的wal segments的最小大小。系统可能需要保留更多的wal segments以便进行wal 归档或者从检查点中恢复。本参数值仅仅在postgresql.conf中进行设置或者在server command line中进行设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 -|=== +#### max_parallel_workers +| 参数名称 h| max_parallel_workers | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 8 | +| 取值范围 | 0到1024 | +| 参数单位 | +| 参数含义 | 本参数值指定了PostgreSQL支持的parallel操作的worker的最大数量。当增加或者减少本参数值时,请考虑同时调整max_parallel_maintenance_workers 配置参数和 max_parallel_workers_per_gather配置参数。请注意:当本参数值高于max_worker_processes参数值时不会有任何作用。因为,因为parallel workers是从max_worker_processes配置参数所建立的工作进程池中获取的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 | +#### backend_flush_after +| 参数名称 h| backend_flush_after | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,0表示禁用强制writeback | +| 取值范围 | 0到256 | +| 参数单位 | 8KB | +| 参数含义 | 每当单个backend进程写入的数据超过本参数值时,尝试强制操作系统向底层存储发出这些写入操作。这样做将限制内核page cache中脏数据的数量,减少在检查点结束时发出fsync时,或者当操作系统在后台以更大的批写入数据时暂停的可能性。这通常会大大减少事务延迟,但也有一些情况,特别是在工作负载大于共享缓冲区,但小于操作系统page cache的情况下,性能可能会降低。此参数可能在某些平台下无效。如果指定该值时没有单位,则将其作为块,即源码中的符号常量BLCKSZ个字节,通常为8KB。如果BLCKSZ不是8KB,则最大值与之成比例缩放。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 | -==== max_slot_wal_keep_size +#### old_snapshot_threshold +| 参数名称 h| old_snapshot_threshold | +| --- | --- | +| 数据类型 | intger | +| 默认值 | -1,-1代表禁用本特性,表示snapshot age 是无限制的。 | +| 取值范围 | -1到86400 | +| 参数单位 | 分钟 | +| 参数含义 | 设置在使用snapshot时可以使用查询快照而不会出现"snapshot too old"错误的最短时间。处于dead状态的且超过本参数值的数据可以被vacuum掉。这有助于防止snapshot长期使用时出现表膨胀。为了防止由于清除快照可见的数据而产生不正确的结果,当快照早于本参数值并且快照用于读取自创建快照以来已修改的页面时,将生成一个错误。对生产环境有用的值可能从几个小时到几天不等。只允许使用较小的值(如0或1min),因为它们有时可能对测试有用。虽然允许高达60d的设置,但请注意,在许多工作负载中,在更短的时间内可能会出现极端膨胀或事务ID环绕(transaction ID wraparound)。启用本特性后,relation末尾释放的空间将无法释放给操作系统,因为这可能会删除检测"snapshot too old"条件所需的信息。分配给relation的所有空间都与该relation保持关联,以便仅在该relation中重用,除非显式释放(例如,使用VACUUM FULL)。此参数并不试图保证在任何特定情况下都会生成错误。事实上,如果正确的结果可以从一个已经物化的结果集中生成,则即使引用表中的底层行已被vacuum,也不会生成错误。某些表不能安全地提前vacuum,因此不受此设置的影响,例如系统目录(system catalogs)。对于这样的表,此设置既不会减少膨胀,也不会在扫描时产生"snapshot too old"错误的可能性。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -[cols="136,387"] -|=== -h| 参数名称 h| max_slot_wal_keep_size -| 数据类型 | Integer -| 默认值 | -1,-1表示复制槽保留不限数量的wal files。 -| 取值范围 | -1到2147483647 -| 参数单位 | MB -| 参数含义 | 用来指定复制槽保留pg_wal目录中wal file的最大大小。当一个复制槽的restart_lsn落后于current_lsn超过本参数值时,使用了复制槽的standby server不能再继续流复制,因为已经删除掉了需要的wal files -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 -|=== +### Replication / Standby Servers +#### primary_conninfo +| 参数名称 h| primary_conninfo | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数值指定了连接到sending server的连接字符串(连接信息).在本连接字符串中缺少的option,PostgreSQL会到环境变量中取寻找。若是环境变量中也没有,那么就用默认值。连接字符串应该指定如下信息: Sending Server的主机名或者IP地址、 Sending Server的端口号(若是跟standby server端口号不同) Username(该用户在sending-server端有合适的权限) Password:请注意,密码可以在primary_conninfo中提供,也可以在standby server上的~/.pgpass文件中提供(此时,是用replication作为database name)。请不要在primary_conninfo中指定database的名字本参数仅能在postgresql.conf文件或者server command line中设置。当在wal receiver process正在运行的情况下修改本参数值,wal receiver process会被发信号通知关闭然后再以新参数值去启动,除非primary_conninfo配置参数为空字符串。当PostgreSQL没有处于standby mode的情况下,本参数无效。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### primary_slot_name +| 参数名称 h| primary_slot_name | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数指定了当要连接到sending-server端时,要使用的sending-server端的已经存在的replication slot,用来控制sending-server端的wal removal。本参数仅能在postgresql.conf文件或者server command line中设置。当在wal receiver process正在运行的情况下修改本参数值,wal receiver process会被发信号通知关闭然后再以新参数值去启动,本参数在如下情况下没有作用:PostgreSQL没有处于standby mode或者primary_conninfo参数值没有设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== wal_sender_timeout +#### promote_trigger_file +| 参数名称 h| promote_trigger_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数值指定了一个trigger file,该文件用于standby server结束recovery状态进行角色提升。本参数值没有设置时,你可以使用pg_ctl promote或者使用函数pg_promote()进行角色提升。本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -[cols="136,387"] -|=== -h| 参数名称 h| wal_sender_timeout -| 数据类型 | Integer -| 默认值 | 60000 -| 取值范围 | 0到2147483647,0代表禁用timeout机制。 -| 参数单位 | 毫秒,若是指定时不带单位,默认为为毫秒数 -| 参数含义 | 当处于inactive状态多长时间(多长时间由本参数指定)之后,终止掉复制连接。这对于发送服务器检测standby crash或者网络中断很有用。当主备节点分布于不同的地理位置时,不同地理位置的节点使用不同的本参数值会带来管理上的灵活性。对于低延迟网络连接,较小的本参数值有助于快速的连接故障检测;对于地理位置较远的高延迟网络连接,较高的本参数值有助于判断standby server的健康状况。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效,允许非superuser修改本参数值非session级修改reload生效。 -|=== +#### hot_standby +| 参数名称 h| hot_standby | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数控制standby server是否允许运行只读查询语句。本参数仅能在server start时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### max_standby_archive_delay +| 参数名称 h| max_standby_archive_delay | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 30000 | +| 取值范围 | -1到2147483647,-1表示允许standby server一直在等待直到冲突的query执行完毕。 | +| 参数单位 | 毫秒 | +| 参数含义 | +| 本参数为备库参数,本参数在sending-server端会被忽略。当hot standby在被启用的状态下,本参数决定了standby server在取消掉standby中运行的且与WAL日志应用有冲突的查询语句之前的等待时间。本参数适用于从wal 归档读取wal data的情况。当不指定单位时,本参数的单位是毫秒。本参数仅能在postgresql.conf文件或者server command line中设置。 + + 本参数值与查询语句在取消之前可以运行的最长时间不同。相反,本参数值是:一旦standby server从sending-server收到wal data,所允许的应用wal data的最长时间。因此,如果一个查询在一个wal segment之前导致了显著的延迟,那么在standby server再次赶上之前,后续冲突查询的容忍时间(宽限时间)将少得多。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### max_standby_streaming_delay +| 参数名称 h| max_standby_streaming_delay | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 30000 | +| 取值范围 | -1到2147483647,-1表示允许standby server一直在等待直到冲突的query执行完毕。 | +| 参数单位 | 毫秒 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。当hot standby在被启用的状态下,本参数决定了standby server在取消掉standby中运行的且与WAL日志应用有冲突的查询语句之前的等待时间。本参数适用于wal data通过流复制被接收的情况。当不指定单位时,本参数的单位是毫秒。本参数仅能在postgresql.conf文件或者server command line中设置。本参数值与查询语句在取消之前可以运行的最长时间不同。相反,本参数值是从主服务器接收到WAL数据后允许应用该数据的最长总时间,因此,如果一个查询导致了显著的延迟,那么在后备服务器再次赶上之前,后续冲突查询的容忍时间(宽限时间)将少得多 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_receiver_create_temp_slot +| 参数名称 h| wal_receiver_create_temp_slot | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数用于指定当永久的复制槽没有配置(复制槽配置请见配置参数primary_slot_name)的情况下,wal receiver是否在远程PG Cluster上创建一个临时的复制槽。本参数仅能在postgresql.conf文件或者server command line中设置。当wal receiver进程正在运行的同时本参数被改变时,wal receiver进程会关闭并重启以读取到新值。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_receiver_status_interval +| 参数名称 h| wal_receiver_status_interval | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 10 | +| 取值范围 | 0到2147483,0表示完全禁止状态更新。 | +| 参数单位 | 秒 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数指定了备库上的wal receiver 进程向 primary库或者sending-server库发送复制进度(replication progress)的最短时间频率。备库将报告它写到的wal的位置,它flush 到disk的位置以及它应用wal的位置。本参数值是两次报告之间的最大时间间隔。每次写入(write)或刷新(flush)位置更改时都会发送更新,或者至少与本参数指定的频率相同。因此,应用的位置可能稍微落后于真实位置。本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### hot_standby_feedback +| 参数名称 h| hot_standby_feedback | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。是否允许一个hot standby的备库发送关于正在备库执行的查询的feedback给primary库或者upstream库。本参数值可以消除由于cleanup records导致的query cancels,但是会导致primary库上发生膨胀。feedback信息的发送频率不会超过配置参数wal_receiver_status_interval。当是级联复制环境时,feedback会通过upstream(即:中间节点)会最终到达primary库。Standby节点除了向upstream反馈信息外,没有其他用途。本参数不会覆盖primary端的配置参数old_snapshot_threshold的行为。Standby端上超过primary端age阈值的snapshot会变为invalid,这导致standby端上的查询被取消。这是因为配置参数old_snapshot_threshold的目的是在时间上对dead row导致膨胀提供绝对的限制,否则会因为standby的配置违反该限制。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_receiver_timeout +| 参数名称 h| wal_receiver_timeout | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 60000 | +| 取值范围 | 0到2147483647,0代表禁用本timeout检测机制。 | +| 参数单位 | 毫秒 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。当本备端与sending-server端或者primary端的inactive状态超过本参数值时,终止掉复制连接。本参数对receiving standby server检测primary node crash或者网络故障很有用。本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_retrieve_retry_interval +| 参数名称 h| wal_retrieve_retry_interval | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 5000 | +| 取值范围 | 1到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数控制standby server遇到从所有源头(streaming replication、本地pg_wal目录、WAL Archive位置)获取wal而获取不到时的等待时间。本参数对处于in recovery的节点需要控制等待新的wal data可用的时间很有用。比如,在archive recovery中,通过降低本参数值,在检测一个新wal log file时,可以使recovery更快响应。在一个wal file产生很少的PostgreSQL中,增加本参数值会减少访问wal archive的请求次数。这在那些基础设施的访问次数会被考虑在内的云环境中非常有用。本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### recovery_min_apply_delay +| 参数名称 h| recovery_min_apply_delay | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,0代表无延迟。 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。默认情况下,standby server会及时的restore 来自于sending server端的WAL 记录。数据的延迟copy可能很有用,它提供了纠正数据丢失错误的机会。本参数值指定了允许你指定延迟recovery的时间长度。比如,你设置本参数值为5分钟,那么只有当standby端的系统时间比master端报告的提交时间至少晚5分钟时,standby端才会重放每个事物的提交。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +### Query Tuning / Planner Cost Constants +#### seq_page_cost +| 参数名称 h| seq_page_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 1 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数设置了顺序读取磁盘上的page的成本。在table以及index上的表空间级别的同名本参数可以覆盖配置参数中的该参数值。增大本参数值会使索引扫描看起来相对更昂贵 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### random_page_cost +| 参数名称 h| random_page_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 4 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数设置了非顺序读取磁盘上的page的成本。在table以及index上的表空间级别的同名本参数可以覆盖配置参数中的该参数值。相对于seq_page_cost减少本参数值会使PostgreSQL更倾向于使用索引扫描。随机访问机械硬盘要比四次顺序访问还要昂贵。但是,使用较低的默认值(4.0),因为大多数对磁盘的随机访问(如索引读取)都假定在cache中。默认值可以认为是将随机访问模型比顺序访问慢40倍,同时,期望90%的随机读取都是在cache中。如果您认为90%的缓存比率对于您的工作负载来说是一个不正确的假设,那么你可以增加本参数值以反映随机存储读取的真实成本。相应的,如果你的数据可能完全在cache中,比如在database大小小于服务器内存,减少本参数值是合适的。那些相对于顺序读具有低随机读成本的存储(比如固态驱动器),也可以使用较低本参数值(比如1.1) | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### cpu_tuple_cost +| 参数名称 h| cpu_tuple_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.01 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数值设置在执行一个SQL语句时planner预计的处理每行数据的成本 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### cpu_index_tuple_cost +| 参数名称 h| cpu_index_tuple_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.005 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数用于设置在索引扫描期间planner预计的处理每个index entry的成本。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### cpu_operator_cost +| 参数名称 h| cpu_operator_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.0025 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数值设置在执行一个SQL语句时planner预计的处理执行的每个operator或者function的成本。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### parallel_setup_cost +| 参数名称 h| parallel_setup_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 1000 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数值设置planner预估的启动parallel worker processes的成本。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### parallel_tuple_cost +| 参数名称 h| parallel_tuple_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.1 | +| 取值范围 | 0到1.79769e+308 | +| 参数单位 | +| 参数含义 | 本参数值设置了从一个parallel worker进程将一个tuple传输到另外一个parallel worker进程的成本。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### min_parallel_table_scan_size +| 参数名称 h| min_parallel_table_scan_size | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 1024,默认情况下是8MB | +| 取值范围 | 0到715827882 | +| 参数单位 | 8KB | +| 参数含义 | 本参数设置了考虑使用parallel scan的table的数据(data)的最小大小,对于并行顺序扫描,table的数据(data)的最小大小总是等于table的大小。但是当index被用到时,table的数据(data)的最小大小通常会笑。如果本参数不带单位,取的是源码中符号常量BLCKSZ的值,通常为8KB。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### min_parallel_index_scan_size +| 参数名称 h| min_parallel_index_scan_size | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 64,默认情况下是512KB | +| 取值范围 | 0到715827882 | +| 参数单位 | 8KB | +| 参数含义 | 本参数设置了考虑使用parallel scan的index的数据(data)的最小大小,请注意:一个并行索引扫通常不会扫过整个index。本参数是planner认为扫描实际会涉及的页数,本参数也用来决定一个特定的索引是否可以参与并行vacuum。如果本参数不带单位,取的是源码中符号常量BLCKSZ的值。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### effective_cache_size +| 参数名称 h| effective_cache_size | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 524288 | +| 取值范围 | 1到2147483647 | +| 参数单位 | 8KB | +| 参数含义 | 本参数设置了planner对单个SQL语句可用的disk cache的有效大小。这被纳入使用索引的成本估算中。值越大,使用索引扫描的可能性越大;值越小,使用顺序扫描的可能性越大。设置本参数时,应该同时考虑PostgreSQL的shared buffers和kernel的page cache用于PostgreSQL数据文件的部分,虽然这两个位置都可能存在一些数据。另外,还要考虑在不同表上预计的并发SQL语句数量,因为他们必须共享可用空间。本参数不影响PostgreSQL分配的shared buffers大小,也不会保留kernel的page cache。它仅用于估算目的。系统也不坚定在两次查询之间数据扔保留在磁盘cache中。如果本参数不带单位,取的是源码中符号常量BLCKSZ的值。通常为8KB。如果BLCKSZ不是8KB,则默认值按照定比例缩放。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### jit_above_cost +| 参数名称 h| jit_above_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 100000 | +| 取值范围 | -1到1.79769e+308。-1表示禁用JIT编译 | +| 参数单位 | +| 参数含义 | 当SQL语句的查询成本高于本参数值时,JIT编译会被激活,若是JIT编译被enable的情况下。执行JIT会消耗planning time但是可以加速查询执行。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### jit_inline_above_cost +| 参数名称 h| jit_inline_above_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 500000 | +| 取值范围 | -1到1.79769e+308,-1表示禁用inline | +| 参数单位 | +| 参数含义 | 当SQL语句的查询成本高于本参数值时,JIT编译会尝试inline functions and operators。Inlining会增加planning time,但是会提升执行速度。将本参数值设置为低于jit_above_cost是没有意义的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +#### jit_optimize_above_cost +| 参数名称 h| jit_optimize_above_cost | +| --- | --- | +| 数据类型 | real | +| 默认值 | 500000 | +| 取值范围 | -1到1.79769e+308,-1表示禁用expensive optimizations | +| 参数单位 | +| 参数含义 | 当SQL语句的查询成本高于本参数值时,JIT编译会尝试进行expensive optimizations。这种优化会增加planning time,但是会提升执行速度。将本参数值设置为低于jit_above_cost是没有意义的,将本参数值设置为高于jit_inline_above_cost也是没有益处的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 | + + +### autovacuum +#### autovacuum +| 参数名称 h| autovacuum | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 控制PostgreSQL是否允许autovacuum launcher daemon.autovacuum进程能正常工作的前提条件是配置参数track_counts设置为启用。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。即使本参数被禁用,若是需要防止事务id wraparound,PostgreSQL会启动autovacuum进程。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### log_autovacuum_min_duration +| 参数名称 h| log_autovacuum_min_duration | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,0表示记录所有autovacuum操作到PostgreSQL运行日志中 | +| 取值范围 | -1到2147483647,-1表示禁止autovacuum进程执行信息打印到PostgreSQL运行日志中。 | +| 参数单位 | 毫秒 | +| 参数含义 | +| 当autovacuum进程运行的时间长度大于等于本参数值时,autovacuum进程执行时的每个动作会被记录到PostgreSQL运行日志中。举例,若是本参数值设置为250ms,那么所有运行时间长度大于等于250ms的automatic vacuum 和analyze操作会记录到PostgreSQL运行日志中。当本参数值被设置为-1之外的值时,若是autovacumm由于冲突所或者并发dropped relation的原因被skipped掉,一条信息会打印到PostgreSQL运行日志中。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### autovacuum_max_workers +| 参数名称 h| autovacuum_max_workers | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 3 | +| 取值范围 | 1到262143 | +| 参数单位 | +| 参数含义 | 本参数设置了同时可以运行的autovacuum worker进程的最大个数。本参数仅仅可以在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +#### autovacuum_naptime +| 参数名称 h| autovacuum_naptime | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 60 | +| 取值范围 | 1·到2147483 | +| 参数单位 | 秒 | +| 参数含义 | 本参数指定了两次autovacuum进程运行的最小时间间隔。在每次autovacuum进程运行时,autovacuum守护进程检查数据库并针对需要的表发出vacuum和analyze命令。本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### autovacuum_vacuum_threshold +| 参数名称 h| autovacuum_vacuum_threshold | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 50 | +| 取值范围 | 0到2147483647 | +| 参数单位 | +| 参数含义 | 本参数用于设置作为vacuum操作候选表的条件,即:更新或者删除掉多少条记录可以被作为vacuum操作的候选表。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### autovacuum_vacuum_insert_threshold +| 参数名称 h| autovacuum_vacuum_insert_threshold | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 1000 | +| 取值范围 | -1到2147483647,-1表示即使有本参数值数量的insert记录,autovacuum守护进程也不会针对该表触发vacuum操作。 | +| 参数单位 | +| 参数含义 | 本参数用于设置作为vacuum操作候选表的条件,即:插入多少条记录可以触发针对该表的vacuum。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### autovacuum_analyze_threshold +| 参数名称 h| autovacuum_analyze_threshold | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 50 | +| 取值范围 | 0到2147483647 | +| 参数单位 | +| 参数含义 | 本参数用于设置作为analyze操作候选表的条件,即:插入、更新、删除多少条记录可以触发针对该表的analyze。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### autovacuum_vacuum_scale_factor +| 参数名称 h| autovacuum_vacuum_scale_factor | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.2,0.2表示表大小的20% | +| 取值范围 | 0到100 | +| 参数单位 | +| 参数含义 | 本参数设置了表大小的一个比率,当决定一个表是否触发vacuum操作时,该比率会被配置参数autovacuum_vacuum_threshold考虑在内。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### autovacuum_vacuum_insert_scale_factor +| 参数名称 h| autovacuum_vacuum_insert_scale_factor | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.2,0.2表示表大小的20% | +| 取值范围 | 0到100 | +| 参数单位 | +| 参数含义 | 本参数设置了表大小的一个比率,当决定一个表是否触发vacuum操作时,该比率会被配置参数autovacuum_vacuum_insert_threshold考虑在内。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -=== Connections and Authentication / Authentication -==== authentication_timeout +#### autovacuum_analyze_scale_factor +| 参数名称 h| autovacuum_analyze_scale_factor | +| --- | --- | +| 数据类型 | real | +| 默认值 | 0.1 | +| 取值范围 | 0到100 | +| 参数单位 | +| 参数含义 | 本参数设置了表大小的一个比率,当决定一个表是否触发vacuum操作时,该比率会被配置参数autovacuum_analyze_threshold考虑在内。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -[cols="136,387"] -|=== -h| 参数名称 h| authentication_timeout -| 数据类型 | Integer -| 默认值 | 60 -| 取值范围 | 1到600 -| 参数单位 | 秒,如果指定本参数值时不带单位,默认为秒 -| 参数含义 | 允许完成连接认证的最长时间。如果客户端没有在本参数值指定的时间内完成连接认证,PostgreSQL数据库会关闭此次连接。本参数用于防止大量的客户端无限制的占用连接。本参数仅仅可以在postgresql.conf设置或者在server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 -|=== +#### autovacuum_freeze_max_age +| 参数名称 h| autovacuum_freeze_max_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 200000000 | +| 取值范围 | 100000到2000000000 | +| 参数单位 | +| 参数含义 | 指定表的pg_class.relfrozenxid字段在强制执行vacuum操作以防止事务ID wraparound之前可以达到的最大年龄,请注意,即使autovacuum进程被禁用,PostgreSQL也会为了防止wraparound而启动autovacuum进程。Vacuum还允许从pg_xact子目录中删除旧文件,这就是为什么默认值是相对较低的2亿个事务的原因。此参数只能在服务器启动时设置,但是可以通过更改表存储参数来减少单个表的设置值。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### autovacuum_multixact_freeze_max_age +| 参数名称 h| autovacuum_multixact_freeze_max_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 400000000 | +| 取值范围 | 10000到2000000000 | +| 参数单位 | +| 参数含义 | 指定表的pg_class. relminmxid字段在强制执行vacuum操作以防止multixact ID wraparound之前可以达到的最大年龄,请注意,即使autovacuum进程被禁用,PostgreSQL也会为了防止wraparound而启动autovacuum进程。Vacuuming multixacts还允许从pg_multixact/members 和pg_multixact/offsets子目录中删除旧文件,这就是为什么默认值是相对较低的4亿个事务的原因。此参数只能在服务器启动时设置,但是可以通过更改表存储参数来减少单个表的设置值。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### autovacuum_vacuum_cost_delay +| 参数名称 h| autovacuum_vacuum_cost_delay | +| --- | --- | +| 数据类型 | real | +| 默认值 | 2 | +| 取值范围 | -1到100,-1表示使用配置参数vacuum_cost_delay的参数值。 | +| 参数单位 | 毫秒 | +| 参数含义 | 本参数是在autovacuum中vacuum操作用到的cost delay值。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### autovacuum_vacuum_cost_limit +| 参数名称 h| autovacuum_vacuum_cost_limit | +| --- | --- | +| 数据类型 | integer | +| 默认值 | -1,-1表示使用配置参数vacuum_cost_limit的参数值。 | +| 取值范围 | -1到10000 | +| 参数单位 | +| 参数含义 | 本参数是在autovacuum中vacuum操作用到的cost limit值。请注意,如果有多个autovacuum workers,则本参数值按比例分布在运行中的autovacuum workers之间,以便每个autovacuum worker该值的总和不超过本参数值。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +### Connections and Authentication / SSL +#### ssl +| 参数名称 h| ssl | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 是否启用ssl连接 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### ssl_ca_file +| 参数名称 h| ssl_ca_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串表示没有CA File被加载,并且Client身份验证不会被执行。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数指定了包括SSL server certificate authority (CA)的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== password_encryption -[cols="136,387"] -|=== -h| 参数名称 h| password_encryption -| 数据类型 | enum -| 默认值 | md5 -| 取值范围 | md5和scram-sha-256,写on也可以,on与md5有相同的作用。 +#### ssl_cert_file +| 参数名称 h| ssl_cert_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | server.crt | +| 取值范围 | | 参数单位 | -| 参数含义 | 本参数决定了create role或者alter role语句中指定的密码的加密算法。请注意,老的客户端版本不支持SCRAM-SHA-256密码加密算法,具体请见下面的描述。有两个关键的标准去确定是否支持SCRAM密码加密算法。 正在运行PostgreSQL 10及其更高版本 你用来连接到PostgreSQL数据库的驱动有SCRAM兼容性。PostgreSQL社区已经提供了一个驱动清单(https://wiki.postgresql.org/wiki/List_of_drivers#Drivers)如果您的系统满足上述两个标准,您可以使用SCRAM密码加密算法。请注意:要把现有的环境从md5升级到scram-sha-256,可以在确保所有在用的客户端已经足以支持SCRAM之后,在postgresql.conf中设置password_encryption = 'scram-sha-256',然后让所有用户设置新口令并且在pg_hba.conf中将认证方法说明改为scram-sha-256。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 +| 参数含义 | 本参数指定了包括SSL server certificate的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### ssl_crl_file +| 参数名称 h| ssl_crl_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串表示没有CRL文件被加载。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数指定了包括SSL server certificate revocation list (CRL)的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### ssl_key_file +| 参数名称 h| ssl_key_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | server.key | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数指定了包括SSL server private key的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== krb_server_keyfile -[cols="136,387"] -|=== -h| 参数名称 h| krb_server_keyfile -| 数据类型 | string -| 默认值 | FILE:/krb5.keytab,注意,sysconfdir代表sysconfdir目录,该目录可以用pg_config --sysconfdir操作系统命令获得。 +#### ssl_ciphers +| 参数名称 h| ssl_ciphers | +| --- | --- | +| 数据类型 | string | +| 默认值 | HIGH:MEDIUM:+3DES:!aNULL | | 取值范围 | | 参数单位 | -| 参数含义 | 设置服务器Kerberos key file的位置。如果本参数设置为空字符串(empty string),PostgreSQL会忽略这个空字符串,此时系统默认值会被使用。本参数值在postgresql.conf或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 设置允许被SSL连接使用的SSL ciphers suites的清单。有关此设置的语法和支持值的列表,请参阅OpenSSL package中的ciphers manual page。有使用TLS版本1.2及更低版本的连接才会受到影响。当前没有控制TLS版本1.3连接使用的密码选择的设置。默认值通常是一个合理的选择,除非您有特定的安全要求。本参数仅能在postgresql.conf文件或者server command line中设置。下面解释一下默认值的含义: HIGH:使用HIGH Group的Cipher suites(例如,AES、Camellia、3DES)MEDIUM:使用MEDIUM Group的Cipher suites(例如,RC4, SEED) +3DES:针对HIGH的OpenSSL默认排序是存在问题的,因为3DES排序高于AES128.这是错误的,因为3DES比ASE128提供了少的安全性,并且3DES更慢。在所有除了HIGH和MEDIUM的ciphers外,+3DES进行了重新排序 !aNULL:禁用掉没有经过身份验证的匿名cipher suites。此类cipher suites易于遭受中间人攻击,因此不应该使用。可用的cipher suites在不同OpenSSL版本中的细节差异很大。使用操作系统命令openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'可以看到当前安装的OpenSSL库的实际细节。请注意:这个list会在运行时基于server key type被过滤 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### ssl_prefer_server_ciphers +| 参数名称 h| ssl_prefer_server_ciphers | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 指定是否优先使用server端的SSL cipher,还是使用client端的。本参数仅能在postgresql.conf文件或者server command line中设置。更老的PostgreSQL版本没有本参数,更老的PostgreSQL版本总是优先使用client端的SSL cipher。本参数仅能在postgresql.conf文件或者server command line中设置。本参数的目的是用于向后兼容性。优先使用server端通常更好,因为更可能的是server端的配置是适当的 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== krb_caseins_users -[cols="136,387"] -|=== -h| 参数名称 h| krb_caseins_users -| 数据类型 | bool -| 默认值 | off,off代表大小写敏感 +#### ssl_ecdh_curve +| 参数名称 h| ssl_ecdh_curve | +| --- | --- | +| 数据类型 | string | +| 默认值 | prime256v1 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数用于控制GSSAPI user names是否被视为大小写不敏感,本参数值仅能在postgresql.conf或者server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 指定要在ECDH密钥交换中使用的曲线的名称。它需要所有连接的客户端支持。它不需要与服务器的椭圆曲线密钥使用的曲线相同。本参数仅能在postgresql.conf文件或者server command line中设置。最常见曲线的OpenSSL名称是:prime256v1(NIST P-256)、secp384r1(NIST P-384)、secp521r1(NIST P-521)。可用曲线的完整列表可以通过操作系统命令openssl ecparam -list_curves显示。但并不是所有这些都可以在TLS中使用。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### ssl_min_protocol_version +| 参数名称 h| ssl_min_protocol_version | +| --- | --- | +| 数据类型 | enum | +| 默认值 | TLSv1.2 | +| 取值范围 | {TLSv1,TLSv1.1,TLSv1.2,TLSv1.3} | +| 参数单位 | +| 参数含义 | 设置使用的SSL/TLS协议的最小版本。OpenSSLLibrary的更老的版本不支持所有的值。如果选择了不支持的设置,将引发错误。TLS 1.0之前的协议版本(即SSL version 2 和3)始终处于禁用状态。默认值是TLSv1.2,该默认值是满足本文档编写时的工业最佳实践。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== db_user_namespace -[cols="136,387"] -|=== -h| 参数名称 h| db_user_namespace -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### ssl_max_protocol_version +| 参数名称 h| ssl_max_protocol_version | +| --- | --- | +| 数据类型 | enum | +| 默认值 | 空字符串,空字符串意味着运行任何的协议版本。 | +| 取值范围 | {"",TLSv1,TLSv1.1,TLSv1.2,TLSv1.3} | | 参数单位 | -| 参数含义 -a| 若本参数值设置为on,那么创建的用户名的格式是username@dbname,当client传递username时,@符以及database name会被附加到username的末尾,并且PostgreSQL数据库查询用户是查找username@dbname这个格式的用户。当你在SQL环境中使用username@dbname这个格式的用户名时,请使用引号引起来username@dbname。当本参数值设置为on时,你依然可以建立普通的全局users,在客户端指定username时加上@即可,当PostgreSQL查找username之前,@符号会被去掉。 + -本参数会导致客户端和服务器端的用户名称表示方法不同。认证始终检查服务器端的username。因此,认证方法必须被配置为服务器端的username。因为md5密码加密算法在客户端和服务器端均使用username作为salt,因此,md5密码加密算法不能与本参数值一起使用。 + -本参数值仅能在postgresql.conf或者server command line中设置。请注意,本特性的目的是在一个完整的解决方案找到之前作为临时措施,到那时,本参数会被remove掉。 +| 参数含义 | 设置使用的SSL/TLS协议的最大版本,这对测试或者有些组件使用新版本协议出现问题是有用的。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== +#### ssl_dh_params_file +| 参数名称 h| ssl_dh_params_file | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串意味着使用默认DH参数编译。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 指定包含Diffie-Hellman参数的文件名,该参数用于所谓的临时DH SSL密码族。如果攻击者设法破解众所周知的编译在DH中的参数,那么使用自定义DH参数可以减少暴露。您可以使用操作系统命令openssl dhparam-out dhparams.pem 2048创建自己的DH参数文件本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -=== Statistics / Query and Index Statistics Collector +#### ssl_passphrase_command +| 参数名称 h| ssl_passphrase_command | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串表示使用内置的提示机制。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 设置需要获取用于解密SSL文件(如私钥)的密码短语时要调用的外部命令。命令必须将密码短语打印到标准输出,并以代码0退出。在参数值中,%p替换为提示字符串(写%%表示文本值%)。请注意提示字符串可能包含空格,因此请确保引用足够的引号。命令实际上不必提示用户输入密码短语,它可以从一个文件中读取它,从一个keychain工具中获取它,或者类似的。由用户来确定所选机制是否足够安全本参数仅能在postgresql.conf文件或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== track_activities -[cols="136,387"] -|=== -h| 参数名称 h| track_activities -| 数据类型 | boolean -| 默认值 | on -| 取值范围 | on 和off +#### ssl_passphrase_command_supports_reload +| 参数名称 h| ssl_passphrase_command_supports_reload | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off,off表示在reload时,ssl_passphrase_command配置参数会被忽略,并且在passphrase被需要时,SSL configuration不会被reload | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 当设置为on时,当每个session中执行SQL语句或者命令时,PostgreSQL会收集信息(包括命令执行的时间信息)。收集的信息仅仅对superuser和执行命令所在session的owner可见。 -| 是否可session级修改 | 是,仅限于superuser可进行session级修改 -| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 - -|=== +| 参数含义 | 当一个key file需要passphrase时,本参数决定由ssl_passphrase_command配置参数设置的passphrase command在configuration reload期间是否被调用本参数仅能在postgresql.conf文件或者server command line中设置。该设置适用于需要TTY进行提示的命令,该命令在PostgreSQL运行时可能不可用。例如,如果密码短语是从文件获取的,则将本参数设置为on可能是合适的 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +### Resource Usage / Memory +#### shared_buffers +| 参数名称 h| shared_buffers | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 16384,即:128MB | +| 取值范围 | 16到1073741823 | +| 参数单位 | 8KB,若是指定本参数值时不带单位,则取自源码中的符号常量BLCKSZ大小,默认是8KB。非默认的BLCKSZ大小会改变本参数的最小值。本参数值仅仅能在PostgreSQL启动时设置。建议将OS物理内存的25%分配给本参数值。因为PostgreSQL依赖于操作系统的cache(也就是文件系统的page cache),因此将超过40%的RAM分配给本参数值的情况不太可能比分配较小的缓冲区效果更好。较大的本参数值通常需要相应的增加max_wal_size, 以便在较长时间内分散写入大量新数据或更改数据的过程。 | +| 参数含义 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +#### huge_pages +| 参数名称 h| huge_pages | +| --- | --- | +| 数据类型 | enum | +| 默认值 | try,try的含义是PostgreSQL会尝试使用huge pages,如果尝试失败将返回默认值。on的含义是请求huge pages失败将阻止PostgreSQL启动,off的含义是不会启用huge pages。目前,本参数值仅支持Linux和Windows平台。当在其他平台下本参数值设置为try时,本参数值会被忽略。 huge pages的使用导致了更小的page tables以及耗费在内存管理方面的更小的CPU时间,这提高了性能。在Windows平台上,huge pages被称之为large pages。开启large pages的步骤: 0.安装PostgreSQL 数据库 1.关闭windows uac控制面板--系统和安全--更改用户账户控制设置--改为'从不通知',点击确定。 2.在windows组策略编辑器,赋予运行PostgreSQL的操作系统用户'锁定内存页'的权力(Lock Pages in Memory)计算机配置\Windows 设置\安全设置\本地策略\用户权利分配\下的"锁定内存页"这个策略。 3.将windows服务中的postgresql-x64-11这个服务改为手动启动。 4.重新启动OS 5.设置postgresql.conf的配置参数huge_pages=on 6.设置postgresql.conf的配置参数shared_buffers=2048MB 7.以管理员身份打开cmd窗口,执行pg_ctl start -D e:\postgresql\11\data启动PostgreSQL 8.验证是否启用请注意:当启用large pages时,不能用Windows服务中的PostgreSQL服务启动postgresql。请注意,本参数设置仅影响main shared memory area. Linux、FreeBSD和Illumos等操作系统也可以自动使用huge pages(也称为"super" pages 或者 "large" pages)进行正常内存分配,而无需PostgreSQL的显式请求。在Linux上,这被称为"transparent huge pages"(THP)。众所周知,对于某些Linux版本的某些用户来说,该特性会导致PostgreSQL的性能下降,因此目前不鼓励使用它(与显式使用huge_pages)。 | +| 取值范围 | {off,on,try} | +| 参数单位 | +| 参数含义 | 控制shared_buffers是否使用huge pages。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +#### temp_buffers +| 参数名称 h| temp_buffers | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 1024 | +| 取值范围 | 100到1073741823 | +| 参数单位 | 8KB | +| 参数含义 | 设置每个session使用的temporary buffers的最大值,供临时表使用。指定本参数值时若是不带单位,以blocks为单位,取自源码中符号常量BLCKSZ,通常为8KB。若是BLCKSZ不为8KB,则本参数按照等比例变化。本参数值可以在单个session中更改,但只能在session中首次使用临时表之前更改;随后更改该值的尝试不会对该session产生任何影响。session将根据需要分配临时缓冲区,直到到达本参数值指定的限制。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### max_prepared_transactions +| 参数名称 h| max_prepared_transactions | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 100 | +| 取值范围 | 0到262143,0代表禁用prepared-transaction特性。 | +| 参数单位 | 设置同时可以处于prepared状态的最大的事务个数。若是你不打算使用prepared transaction,请将本参数值设置为零以防止偶然建立prepared transaction。如果你使用prepared transaction,你可能希望本参数值与max_connections一样大。这样每个session都可以有一个prepared transaction pending。当有流复制环境是,你必须确保在备库上该参数值要大于等于在主库上的该参数值,否则,不能在备库上运行查询语句。 | +| 参数含义 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== track_activity_query_size -[cols="136,387"] -|=== -h| 参数名称 h| track_activity_query_size -| 数据类型 | Integer -| 默认值 | 1024 -| 取值范围 | 100到1048576 -| 参数单位 | Byte,当指定本参数不带单位时,默认是Bytes -| 参数含义 | 为每个active的session保留当前执行命令的文本的大小,该文本对应pg_stat_activity.query列。本参数仅仅能在PostgreSQL start时设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 +#### work_mem +| 参数名称 h| work_mem | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 4096 | +| 取值范围 | 64到2147483647 | +| 参数单位 | KB | +| 参数含义 | +| 在写入磁盘临时文件之前,被查询操作(比如sort或者hash table)使用的内存最大值。若是指定本参数值时不带单位,那么是以KB为单位。请注意,针对复杂的查询,sort或者hash操作可能以parallel去运行,在开始向磁盘的临时文件写入数据之前,每个操作被允许最多使用本参数值对应的内存大小。同事,正在运行的多个session会并发执行这些操作。因此,使用的所有内存可以是本参数值的若干倍,当设置本参数值时,需要明确记住这个事实。Sort操作被如下使用:order by、distinct、merge joins;hash table被如下使用:hash joins、hash-base aggregation、在in子句中的基于hash的处理。 + 基于哈希的操作通常比基于排序的等效操作对内存可用性更加敏感。哈希表可用的内存是通过work_mem*hash_mem_multiplier来计算的。这使得基于哈希的操作使用的内存量可能超过通常的work_mem数量。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级修改立即生效其他修改Reload即可生效 | + + +#### hash_mem_multiplier +| 参数名称 h| hash_mem_multiplier | +| --- | --- | +| 数据类型 | real | +| 默认值 | 1 | +| 取值范围 | 1到1000 | +| 参数单位 | +| 参数含义 | 本参数值用于计算hash-base操作可以使用的最大内存。该最大内存是由work_mem*hash_mem_multiplier决定的。在经常有大量查询操作的环境中,考虑增加本参数值,特别是当简单的增加work_mem会导致内存压力时(内存压力通常以间歇性内存不足的形式出现)。设置我1.5或者2.0可能对混合负载有效。在work_mem参数值已经增加到40MB或者更多时,2.0-8.0或者更大范文内的更高设置可能会有效。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级修改立即生效其他修改Reload即可生效 | + + +#### maintenance_work_mem +| 参数名称 h| maintenance_work_mem | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 65536 | +| 取值范围 | 1024到2147483647 | +| 参数单位 | KB | +| 参数含义 | 指定用于维护操作(maintenance operations)的最大可用的内存。维护操作包括:vacuum,create index, ALTER TABLE ADD FOREIGN KEY.若指定本参数值时不带单位,那默认的单位是KB。较大的本参数值有助于提升vacuuming以及restore database时的性能。请注意:当autovacuum运行时,最多有本参数值\* autovacuum_max_workers的内存被使用,因此,请小心设置本参数值,不要设置太高。可以使用配置参数autovacuum_work_mem来单独控制autovacuum时的内存使用。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Session级修改立即生效其他修改Reload即可生效 | + + +#### autovacuum_work_mem +| 参数名称 h| autovacuum_work_mem | +| --- | --- | +| 数据类型 | integer | +| 默认值 | -1,-1表示使用maintenance_work_mem配置参数值 | +| 取值范围 | -1到2147483647 | +| 参数单位 | KB | +| 参数含义 | 本参数用于设置每个autovacuum worker process使用的最大内存大小。若指定本参数值时不带单位,那默认的单位是KB。当vacuum的行为运行在其他上下文环境中时,本参数不生效。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### logical_decoding_work_mem +| 参数名称 h| logical_decoding_work_mem | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 65536,即64MB | +| 取值范围 | 64到2147483647 | +| 参数单位 | KB | +| 参数含义 | 本参数用于设置在解码后的变化写入到本地disk之前,逻辑解码使用的最大内存大小。本参数限制了逻辑流复制连接使用的内存大小。由于每个复制连接只使用此大小的单个buffer,并且通常不会有许多这样的连接(受到max_wal_senders配置参数限制)。因此可以将本参数值设置为比work_mem高,从而减少写入磁盘的解码变化量。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | session级修改立即生效其他修改Reload即可生效 | + + +#### max_stack_depth +| 参数名称 h| max_stack_depth | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 2048 | +| 取值范围 | 100到2147483647 | +| 参数单位 | KB | +| 参数含义 | 本参数值指定PostgreSQL execution stack的最大安全深度。本参数值的理想设置是kernel执行的实际stack size limit(可以用操作系统命令ulimit -s或者ulimit -a进行查看)减去大约1MB的安全裕度。所以需要安全裕度,是因为并不是在服务器中的每个例程中都检查stack depth,而是只在可能递归的关键例程中检查stack depth。若指定本参数值时不带单位,那默认的单位是KB。本参数默认值为2MB,该值相对保守,不太可能有crash的风险。但是,它可能太小,无法执行复杂的函数。只有superuser才能更改此设置。本参数值设置为高于kernel的限制将意味着一个失控的递归函数可以crash掉一个单独的backend process。在PostgreSQL可以确定内核限制的平台上,服务器将不允许把本参数值设置为不安全的值。但是并非所有平台都提供该信息。因此建议谨慎选择本参数值。 | +| 是否可session级修改 | 是,仅限于superuser可进行session级修改。 | +| 修改后何时生效 | session级修改立即生效其他修改Reload即可生效 | + + +#### shared_memory_type +| 参数名称 h| shared_memory_type | +| --- | --- | +| 数据类型 | enum | +| 默认值 | mmap | +| 取值范围 | {sysv,mmap,windows}, sysv,mmap适用于Linux平台;windows适用于windows平台。 | +| 参数单位 | +| 参数含义 | 指定shared memory的实现方式。 mmap是指使用mmap分配的anonymous shared memory; sysv是指通过shmget分配的 System V shared memory ;windows是指Windows shared memory。通常不鼓励使用sysv值,因为它通常需要非默认的内核设置来允许较大的分配,而sysv值在任何平台上都不是默认的。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +#### dynamic_shared_memory_type +| 参数名称 h| dynamic_shared_memory_type | +| --- | --- | +| 数据类型 | enum | +| 默认值 | posix | +| 取值范围 | {posix,sysv,mmap,windows} 其中posix,sysv,mmap适用于Linux平台;windows适用于Windows平台 | +| 参数单位 | +| 参数含义 | 指定PostgreSQL使用的dynamic shared memory的实现方式。 posix是指使用shm_open分配的POSIX shared memory; sysv是指使用shmget分配的System V shared memory; windows是指Windows shared memory; mmap是指使用存在的data directory中的memory-mapped files模拟的shared memory。通常不鼓励使用mmap值,这在任何平台上都不是默认值,因为操作系统可能会反复将修改过的页面写回磁盘,从而增加系统I/O负载;但是,当pg_dynshmem子目录存储在RAM磁盘上,或者其他共享内存工具不可用时,它可能对调试有用。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | + + +### Reporting and Logging / Where to Log +#### log_destination +| 参数名称 h| log_destination | +| --- | --- | +| 数据类型 | string | +| 默认值 | stderr | +| 取值范围 | Linux平台下的取值有:stderr、csvlog、syslogWindows平台下的取值有:stderr、csvlog、eventlog | +| 参数单位 | +| 参数含义 | +| PostgreSQL支持多种记录PostgreSQL消息的方法。包括stderr、csvlog、syslog,在windows平台下还有eventlog。当本参数值是一个列表时,请使用逗号分隔每个值。本参数仅能在postgresql.conf中设置或者在server command line中设置。当本参数值中含有csvlog时,日志条目被输出为csv格式(comma separated value),这便于程序加载log内容。需要将配置参数logging_collector设置为on才可以生成csv格式的log。当本参数值含有stderr或者csvlog时,current_logfiles文件被建立用来记录当前正在被logging collector进程使用的logfile的位置。这提供了一个查找当前正在使用的log的简便方法。 current_logfiles文件的内容如下(举例): stderr log/postgresql.log csvlog log/postgresql.csv当新的logfile被建立或者log_destination被加载时,current_logfiles文件会被重建。当本参数值不含有stderr或者csvlog,以及logging collector被禁用时,current_logfiles文件会被删除掉。 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### logging_collector +| 参数名称 h| logging_collector | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 本参数会启用logging collector进程,该进程是一个background process,用来捕获发送到stderr的log messages并重定向这些信息到log file中。这个方法比记录到syslog中要有用。因为有些类型的messages不会显示在syslog的输出中(一个例子是dynamic-linker failure messages,另外一个是脚本产生的error messages,比如archive_command).本参数仅仅可以在PostgreSQL启动时设置。logging collector设计为永不丢失消息。这意味着在负载极高的情况下,当logging collector落后时,服务器进程可能会在尝试发送额外日志消息时被阻止。相反,syslog更喜欢在无法写入消息时丢弃消息,这意味着在这种情况下它可能无法记录某些消息,但不会阻塞系统的其余部分。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### log_directory +| 参数名称 h| log_directory | +| --- | --- | +| 数据类型 | string | +| 默认值 | log | +| 取值范围 | +| 参数单位 | +| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数用于确定log file被建立在哪个目录下。本参数值可以是绝对路径,也可以是相对于data directory的相对路径。本参数仅能在postgresql.conf中设置或者在server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== track_counts -[cols="136,387"] -|=== -h| 参数名称 h| track_counts -| 数据类型 | Bool -| 默认值 | on -| 取值范围 | on和off +#### log_filename +| 参数名称 h| log_filename | +| --- | --- | +| 数据类型 | string | +| 默认值 | postgresql-%Y-%m-%d_%H%M%S.log | +| 取值范围 | | 参数单位 | -| 参数含义 | 当设置为on时,针对database activity收集统计信息。Autovacuum进程需要这些收集的信息。 -| 是否可session级修改 | 是,仅限于superuser可进行session级修改 -| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 +| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数用于确定所创建的log file的文件名。本参数值被视为strftime pattern,因此可以使用%-escapes指定随时间变化的文件名(请注意,如果存在任何依赖于时区的%-转义,则计算将在配置参数log_timezone指定的时区中完成。)支持的%-转义与开放组的strftime规范中列出的那些类似。请注意,系统的strftime不是直接使用的,因此特定于平台(非标准)的扩展不起作用。如果本参数值中不带转义符,你应使用log rotation 工具以避免日志填充满整个磁盘。若是在log_destination配置参数中启用了csv格式的输出,那么会将.CSV附加到带时间戳的日志文件名. 以创建CSV格式输出的文件名(如果日志文件名以.log结尾,则替换后缀。)本参数仅能在postgresql.conf中设置或者在server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### log_file_mode +| 参数名称 h| log_file_mode | +| --- | --- | +| 数据类型 | string | +| 默认值 | 0600, 0600表示只有PostgreSQL的owner可以读取或者写入log files | +| 取值范围 | 0到511 | +| 参数单位 | +| 参数含义 | 在logging_collector配置参数设置为on的情况下,在Unix/Linux系统中本参数用于设置logfile的权限(在Microsoft Windows平台上,本参数被忽略)。 参数值应该是以chmod和umask系统调用接受的格式指定的数字模式。 0600表示只有PostgreSQL的owner可以读取或者写入log files.其他通常有用的设置是0640,0640允许owner的group的成员去读取log files。请注意,要使用这样的设置,您需要更改log_directory目录以将文件存储在data directory目录之外的某个位置。无论如何,让日志文件具有广泛的可读性是不明智的,因为它们可能包含敏感数据本参数仅能在postgresql.conf中设置或者在server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### log_rotation_age +| 参数名称 h| log_rotation_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 1440 | +| 取值范围 | 0到35791394,0表示禁用掉基于time的new log file创建。 | +| 参数单位 | 分钟 | +| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数确定了一个单独的log file能使用的最长时间。在将此数量的数据发送到日志文件后,将创建一个新的日志文件。若指定本参数值时不带单位,那默认的单位是分钟。默认值是24小时。本参数仅能在postgresql.conf中设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== track_io_timing -[cols="136,387"] -|=== -h| 参数名称 h| track_io_timing -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_rotation_size +| 参数名称 h| log_rotation_size | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 10240 | +| 取值范围 | 0到2097151,0表示禁用掉基于size的new log file创建 | | 参数单位 | -| 参数含义 | 是否为database中的 io call/activity启用计时(即:io操作消耗了多少时间)。io计时信息体现在如下方面: pg_stat_database中 explain 带buffer时的输出中 pg_stat_statements中当设置为on时,PostgreSQL会重复查询操作系统的当前时间,这个可能会导致在某些平台下有大量开销。您可以使用pg_test_timing工具(该工具在bin目录下)来衡量系统的计时开销。仅superuser可以更改本参数值 -| 是否可session级修改 | 是,仅限于superuser可进行session级修改 -| 修改后何时生效 | Session级修改立即生效非session级修改reload生效 +| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数确定了一个单独的log file能使用的最大大小。将此数量的数据发送到日志文件后,将创建一个新的日志文件。若指定本参数值时不带单位,那默认的单位是KB。默认值是10MB。本参数仅能在postgresql.conf中设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -|=== + +#### log_truncate_on_rotation +| 参数名称 h| log_truncate_on_rotation | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数将导致PostgreSQL截断(覆盖)而不是附加到任何同名的现有日志文件。请注意,只有在由于基于time(时间)的rotate而打开新文件时才会发生截断,而不是在服务器启动或基于size的rotate期间。当本参数值设置off时,在所有情况下都会附加到已有文件中。将本参数值与日志文件名(如postgresql-%H.log)结合使用会生成24个每小时一次的日志文件,然后周期性地覆盖它们。本参数仅能在postgresql.conf中设置或者在server command line中设置。举例:为了达到如下目的:保留7天的log,每天的log文件的文件名是server_log.Mon,server_log.Tue等等,然后用本周的log自动覆盖上周的log。该需求需要设置log_filename为server_log.%a, log_truncate_on_rotation为on,log_rotation_age为1440举例:为了达到如下目的:保留24小时的log,每小时一个log file,如果log file大小超过1GB时也需要很快进行rotate。该需求需要设置log_filename为server_log.%H%M, log_truncate_on_rotation为on,log_rotation_age为60,log_rotation_size为1000000.在log_filename中包括%M允许任何基于size的且可能在同一个小时内有多个log file的rotate | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### syslog_facility +| 参数名称 h| syslog_facility | +| --- | --- | +| 数据类型 | enum | +| 默认值 | local0 | +| 取值范围 | {local0,local1,local2,local3,local4,local5,local6,local7} | +| 参数单位 | +| 参数含义 | 当配置参数log_destination被设置为syslog时,本参数用于确定使用的syslog facility。本参数仅能在postgresql.conf中设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== track_functions -[cols="136,387"] -|=== -h| 参数名称 h| track_functions -| 数据类型 | enum -| 默认值 | none,none的含义是禁用本功能 -| 取值范围 | none,pl,all +#### syslog_ident +| 参数名称 h| syslog_ident | +| --- | --- | +| 数据类型 | string | +| 默认值 | postgres | +| 取值范围 | | 参数单位 | -| 参数含义 | 启用追踪函数调用计数和消耗的时间。参数值pl的含义是仅仅对procedural-language函数进行追踪,参数值all的含义是追踪SQL和C语言函数。仅superuser可以更改本参数值 -| 是否可session级修改 | 是,仅限于superuser可进行session级修改 -| 修改后何时生效 | Session级修改立即生效;非session级修改reload生效 +| 参数含义 | 本参数设置了在操作系统syslog日志中用于标识PostgreSQL消息的关键字。本参数仅仅适用于Linux平台,因为只有Linux平台才有syslog.虽然在Windows平台下也能修改本参数值,但是该修改没有任何意义。本参数仅能在postgresql.conf中设置或者在server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### syslog_sequence_numbers +| 参数名称 h| syslog_sequence_numbers | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | +| 当配置参数log_destination被设置为syslog并且本参数值设置为on时,PostgreSQL会在每条消息的前面加一个依次增大的顺序号,同一个命令的多条输出会以[2-1],[2-2]之类的次序标出:(如下截取自linux的/var/log/messages)![140](../images/PostgreSQL13%E6%96%87%E6%A1%A3%E4%B9%8BPG%E5%8F%82%E6%95%B0%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C_html_b376f05a85e6462b.png) + 本参数设置为off的效果如下:(如下截取自linux的/var/log/messages)![131](../images/PostgreSQL13%E6%96%87%E6%A1%A3%E4%B9%8BPG%E5%8F%82%E6%95%B0%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C_html_340e68e94edcda77.png)本参数仅能在postgresql.conf中设置或者在server command line中设置。 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | +#### syslog_split_messages +| 参数名称 h| syslog_split_messages | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当配置参数log_destination被设置为syslog并且本参数值设置为on时,消息被按行分割,长的行会被分割,以便填满1024Bytes,这是传统syslog实现上的典型大小限制。当设置为off时,PostgreSQL日志消息将按照原样传递给syslog服务,并由syslog服务来处理可能非常庞大的消息。如果syslog最终记录到一个文本文件中,那么无论哪种方式,效果都是一样的,最好保持该设置处于on状态,因为大多数syslog实现要么不能处理大型消息,要么需要专门配置来处理它们。但是,如果syslog最终要写入其他介质,那么将消息逻辑地保持在一起可能是必要的或更有用的。本参数仅能在postgresql.conf中设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== stats_temp_directory -[cols="136,387"] -|=== -h| 参数名称 h| stats_temp_directory -| 数据类型 | string -| 默认值 | pg_stat_tmp +#### event_source +| 参数名称 h| event_source | +| --- | --- | +| 数据类型 | bool | +| 默认值 | PostgreSQL | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值用于指定存储临时统计信息的目录。本参数值可以是绝对路径,也可以是相对于data directory的相对路径本参数值指定为基于RAM的文件系统会减少物理IO并提升性能。本参数仅能在postgresql.conf中设置或者在server command line设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload生效 - -|=== +| 参数含义 | 本参数仅仅适用于Windows平台,因为只有Windows平台才有event log,本参数值会体现在Windows操作系统的事件查看器的"Windows日志"-"应用程序"-"来源"一列。虽然在Linux平台下也能修改本参数值,但是该修改没有任何意义。本参数仅能在postgresql.conf中设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +### Preset Options +#### block_size +| 参数名称 h| block_size | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 8192 | +| 取值范围 | 8192 | +| 参数单位 | +| 参数含义 | 数据库使用的disk block的大小,该参数也影响其他的配置参数,比如shared_buffers,该参数通过编译时./configure命令的--with-blocksize选项确定 | +| 是否可session级修改 | 否,不可修改。 | +| 修改后何时生效 | 不可修改。 | -=== File Locations +#### data_checksums +| 参数名称 h| data_checksums | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 显示data checksums是否启用。本参数值通过initdb时的-k选项或者--data-checksums选项确定。本参数值可以使用pg_checksums进行修改,pg_checksums命令具体用法请见pg_checksums --help | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 立即生效 | -==== data_directory -[cols="136,387"] -|=== -h| 参数名称 h| data_directory -| 数据类型 | string -| 默认值 | -| 取值范围 | +#### data_directory_mode +| 参数名称 h| data_directory_mode | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0700 | +| 取值范围 | 0到511 | | 参数单位 | -| 参数含义 | 本参数值表示PostgreSQL的数据目录的位置 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== +| 参数含义 | 在linux/unix中显示data_directory参数值对应的目录的权限;在windows系统中,本参数值总是显示为0700 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改 | +#### debug_assertions +| 参数名称 h| debug_assertions | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 显示PG在编译时是否启用assertion。本参数值通过编译时./configure命令的--enable-cassert选项确定。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改 | -==== config_file -[cols="136,387"] -|=== -h| 参数名称 h| config_file -| 数据类型 | string -| 默认值 | 在数据目录中 -| 取值范围 | +#### integer_datetimes +| 参数名称 h| integer_datetimes | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 本参数值指定了postgresql.conf的位置本参数值仅仅可以在postgres command line设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== +| 参数含义 | 支持64bit整型的date和time。本参数通过编译时./configure命令确定。注意:configure的--disable-integer-datetimes选项,是"obsolete option, no longer supported" | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改 | +#### lc_collate +| 参数名称 h| lc_collate | +| --- | --- | +| 数据类型 | string | +| 默认值 | en_US.UTF-8(根据操作系统环境变量不同而不同,见os命令locale的返回结果) | +| 取值范围 | +| 参数单位 | +| 参数含义 | 字符串的排序规则(String sort order)。本参数值通过initdb时的--lc-collate确定,若是不指定该选项,initdb会取环境变量 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 在PG Database级别确定,确定后不可修改,只读参数 | -==== hba_file -[cols="136,387"] -|=== -h| 参数名称 h| hba_file -| 数据类型 | string -| 默认值 | 在数据目录中 +#### lc_ctype +| 参数名称 h| lc_ctype | +| --- | --- | +| 数据类型 | string | +| 默认值 | en_US.UTF-8(根据操作系统环境变量不同而不同,见os命令locale的返回结果) | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值指定了pg_hba.conf的位置;本参数值仅仅可以在PostgreSQL启动时设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== +| 参数含义 | 字符分类(是否区分大小写,什么是字符等)。本参数通过initdb时的--lc-ctype确定,若是不指定该选项,initdb会取环境变量 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 在PG Database级别确定,确定后不可修改,只读参数。 | +#### max_function_args +| 参数名称 h| max_function_args | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 100 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 返回函数参数的最大个数, | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | +#### max_identifier_length +| 参数名称 h| max_identifier_length | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 63 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 返回标识符的最大长度 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -==== ident_file -[cols="136,387"] -|=== -h| 参数名称 h| ident_file -| 数据类型 | string -| 默认值 | 在数据目录中 +#### max_index_keys +| 参数名称 h| max_index_keys | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 32 | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值指定了pg_ident.conf的位置本参数值仅仅可以在PostgreSQL启动时设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 +| 参数含义 | 一个index最多能含有多少列 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -|=== +#### segment_size +| 参数名称 h| segment_size | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 131072 | +| 取值范围 | +| 参数单位 | 8KB | +| 参数含义 | 本参数值确定了每个disk file中的page的数量。本参数值通过编译时./configure命令执行的--with-segsize=SEGSIZE选项确定。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | +#### server_encoding +| 参数名称 h| server_encoding | +| --- | --- | +| 数据类型 | string | +| 默认值 | UTF8 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 数据库的编码 (即:字符集),本参数通过initdb时的-E或者--encoding参数确定。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -==== external_pid_file -[cols="136,387"] -|=== -h| 参数名称 h| external_pid_file -| 数据类型 | string -| 默认值 | 空字符串 +#### server_version +| 参数名称 h| server_version | +| --- | --- | +| 数据类型 | string | +| 默认值 | 默认值是当前PostgreSQL版本,格式为主版本号.次版本号 | | 取值范围 | | 参数单位 | -| 参数含义 | 指定了将postmaster的pid写入哪个文件本参数值仅仅可以在PostgreSQL启动时设置。 postgres=# alter system set external_pid_file='/home/pg131/postmasterpid.txt'; ALTER SYSTEM postgres=# exit [pg131@VM-0-8-centos ~]$ pg_ctl restart waiting for server to shut down.... done server stopped waiting for server to start....2021-04-09 10:09:21.776 CST [5977] LOG: redirecting log output to logging collector process 2021-04-09 10:09:21.776 CST [5977] HINT: Future log output will appear in directory "log". done server started [pg131@VM-0-8-centos ~]$ cd [pg131@VM-0-8-centos ~]$ ll total 136260 -rw-rw-r-- 1 pg131 pg131 0 Mar 10 20:47 12345aa drwxrwxr-x 2 pg131 pg131 4096 Apr 9 10:09 archive drwx------ 20 pg131 pg131 4096 Apr 9 10:09 data -rw-rw-r-- 1 pg131 pg131 72 Mar 23 10:34 para.sql drwxrwxr-x 6 pg131 pg131 4096 Dec 20 14:32 postgresql-13.1 -rw-r--r-- 1 pg131 pg131 139499520 Dec 20 14:07 postgresql-13.1.tar -rw-r--r-- 1 pg131 pg131 5 Apr 9 10:09 postmasterpid.txt drwxrwxr-x 7 pg131 pg131 4096 Dec 20 14:45 soft drwx------ 3 pg131 pg131 4096 Dec 20 16:04 ts1 [pg131@VM-0-8-centos ~]$ cat postmasterpid.txt 5977 [pg131@VM-0-8-centos ~]$ pg_ctl status pg_ctl: server is running (PID: 5977) /home/pg131/soft/bin/postgres[pg131@VM-0-8-centos ~]$ -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 +| 参数含义 | 返回PostgreSQL的版本号 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -|=== +#### server_version_num +| 参数名称 h| server_version_num | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 130000,返回主版本号 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 返回PostgreSQL的版本号 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -=== Reporting and Logging / When to Log +#### ssl_library +| 参数名称 h| ssl_library | +| --- | --- | +| 数据类型 | string | +| 默认值 | OpenSSL | +| 取值范围 | +| 参数单位 | +| 参数含义 | 返回PostgreSQL软件编译时的SSL library。本参数值通过./configure的--with-openssl选项确定。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -==== log_min_messages -[cols="136,387"] -|=== -h| 参数名称 h| log_min_messages -| 数据类型 | enum -| 默认值 | warning -| 取值范围 | debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic +#### wal_block_size +| 参数名称 h| wal_block_size | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 8192 | +| 取值范围 | | 参数单位 | -| 参数含义 | 控制哪种message level写入系统日志。取值范围见上。在上面的取值范围中,前一个取值包括其后的取值。在上面的取值范围中,级别越在后边,写入系统日志中的messages就越少。注意: 本参数的参数值log的级别与client_min_messages配置参数的参数值log的级别不同。仅允许superuser可以修改本参数值。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 -| 修改后何时生效 | Session级别修改立即生效;其他级别修改reload生效 - -|=== +| 参数含义 | 返回WAL中disk block的大小。本参数值通过./configure的--with-wal-blocksize选项确定。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | +#### wal_segment_size +| 参数名称 h| wal_segment_size | +| --- | --- | +| 数据类型 | string | +| 默认值 | 16777216 | +| 取值范围 | +| 参数单位 | Byte | +| 参数含义 | 返回WAL Segments的大小。本参数值通过initdb的--wal-segsize选项确定。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 不可修改,只读参数 | -==== log_min_error_statement -[cols="136,387"] -|=== -h| 参数名称 h| log_min_error_statement -| 数据类型 | enum -| 默认值 | error,表示那些导致了errors、log messages、fatal errors、panics的SQL语句会被记录到日志中。 -| 取值范围 | debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic +### Client Connection Defaults / Locale and Formatting +#### DateStyle +| 参数名称 h| DateStyle | +| --- | --- | +| 数据类型 | string | +| 默认值 | ISO, MDY | +| 取值范围 | | 参数单位 | -| 参数含义 | 控制导致何种级别错误的SQL语句内容被记录到日志中。为了关闭对错误SQL语句的记录,请设置被参数值为panic仅允许superuser可以修改本参数值。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== +| 参数含义 | 本参数用于设置date和time的显示格式,以及解释不明确日期输入值的规则。由于历史原因,本参数值包括两个部分:第一部分:output format specification (ISO, Postgres, SQL, or German);第二部分:the input/output specification for year/month/day ordering (DMY, MDY, or YMD)。上述两者可以单独设置,也可以一起设置。请注意,关键词Euro和European是DMY的同义词;关键词US和NonEnro是MDY的同义词;Initdb生成配置参数文件时,会根据os的locale命令的lc_time结果来设置本参数值。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | +#### IntervalStyle +| 参数名称 h| IntervalStyle | +| --- | --- | +| 数据类型 | enum | +| 默认值 | postgres | +| 取值范围 | postgres,postgres_verbose,sql_standard,iso_8601 | +| 参数单位 | +| 参数含义 | 本参数用于设置interval values的显示格式。参数值sql_standard表示产生匹配SQL标准interval常量的输出;参数值postgres表示当DateStyle参数值设置为ISO时,产生匹配PostgreSQL8.4版本之前的输出;参数值postgres_verbose表示当DateStyle参数值设置为非ISO时,表示当DateStyle参数值设置为ISO时,参数值iso_8601表示产生匹配在ISO 8601标准的4.4.3.2章节中定义的时间间隔带"format with designators"匹配的输出。本参数值也会影响模糊的interval输入的解释。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== log_min_duration_statement -[cols="136,387"] -|=== -h| 参数名称 h| log_min_duration_statement -| 数据类型 | integer -| 默认值 | -1,-1表示禁用本功能。 -| 取值范围 | -1到2147483647 -| 参数单位 | 毫秒,若是不指定单位的话。 -| 参数含义 | 所有运行超过本参数值的SQL语句会打印到系统日志中。本参数对追踪未优化的SQL语句有很大帮助。本参数值为零表示打印所有的SQL语句。仅允许superuser可以修改本参数值。本参数会覆盖log_min_duration_sample参数,这意味持续时间超过本参数值的SQL语句将不进行采样,而是始终记录下来。对于使用扩展查询协议的客户端,Parse、Bind、Execute阶段会被各自独立记录下来。本参数与log_statement参数合用时,由于log_statement参数起作用而记录到log中的SQL文本不会被重复记录。在不使用syslog时,推荐使用log_line_prefix参数,以便记录PID或者Session ID。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 +#### TimeZone +| 参数名称 h| TimeZone | +| --- | --- | +| 数据类型 | String | +| 默认值 | 内置的默认值是GMT,一般情况下,本参数值依据initdb时的操作系统时区而定,即:initdb时的操作系统时区是什么,initdb后postgresql.conf中的本参数值就是什么。注意:CentoOS7/8的操作系统当前时区请使用操作系统命令timedatectl status查询。 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 为显示以及翻译timestamp设置时区。可用的时区名称可以通过pg_timezone_names视图进行查询。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### timezone_abbreviations +| 参数名称 h| timezone_abbreviations | +| --- | --- | +| 数据类型 | string | +| 默认值 | Default | +| 取值范围 | +| 参数单位 | +| 参数含义 | 被PostgreSQL接受的datetime输入的时区简写。默认值Default在世界上大部分地区都有效。另外的有效值是Australia和India。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | +#### extra_float_digits +| 参数名称 h| extra_float_digits | +| --- | --- | +| 数据类型 | string | +| 默认值 | 1 | +| 取值范围 | -15到3 | +| 参数单位 | +| 参数含义 | 设置浮点值(float4,float8以及地理数据类型)的显示的位数。extra_float_digits大于0时,原有精度最多增加3位, 小于0时, 精度最多减掉相应数值, 等于0时, float4精度为6位, float8精度为15 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== log_min_duration_sample -[cols="136,387"] -|=== -h| 参数名称 h| log_min_duration_sample -| 数据类型 | Integer -| 默认值 | -1,-1表示禁用本功能。 -| 取值范围 | -1到2147483647,参数值为零时,记录所有语句的sample -| 参数单位 | 毫秒 -| 参数含义 | 举例说明,如果本参数值设置为100ms,那么运行时间超过100ms的SQL语句会被考虑进行采样。仅允许superuser可以修改本参数值。当流量太大而无法记录所有查询时,启用此参数会很有帮助。本参数的优先级比log_min_duration_statement参数优先级要低。这意味着持续时间超过log_min_duration_statement参数值的SQL语句不受采样限制,并且总是被记录下来。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 +#### client_encoding +| 参数名称 h| client_encoding | +| --- | --- | +| 数据类型 | string | +| 默认值 | 取自Database encoding | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数用于设置客户端字符集。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效。 | -|=== +#### lc_messages +| 参数名称 h| lc_messages | +| --- | --- | +| 数据类型 | string | +| 默认值 | 与系统locale设置有关 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数用于设置消息显示的语言。可接受的参数值是跟系统相关的。本参数值会影响发送到服务器运行日志以及客户端的消息,不正确的本参数值会影响服务器日志的可读性。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效,且只有超级用户才能更改此设置。 | -==== log_statement_sample_rate -[cols="136,387"] -|=== -h| 参数名称 h| log_statement_sample_rate -| 数据类型 | Real -| 默认值 | 1 -| 取值范围 | 0到1 +#### lc_monetary +| 参数名称 h| lc_monetary | +| --- | --- | +| 数据类型 | string | +| 默认值 | 与系统locale设置有关 | +| 取值范围 | | 参数单位 | -| 参数含义 | 确定将记录的持续时间超过log_min_duration_sample参数值的的语句的比率。例如0.5意味着统计上每两个给定语句中就有一个被记录的机会。默认值为1.0,意味着记录所有采样语句。本参数值设置为0表示禁用sampled statement-duration logging。仅允许superuser可以修改本参数值。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 +| 参数含义 | 设置用于格式化货币金额的语言环境,可接受的参数值是跟系统相关的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### lc_numeric +| 参数名称 h| lc_numeric | +| --- | --- | +| 数据类型 | string | +| 默认值 | 与系统locale设置有关 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值用于设置格式化数字。可接受的参数值是跟系统相关的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== log_transaction_sample_rate -[cols="136,387"] -|=== -h| 参数名称 h| log_transaction_sample_rate -| 数据类型 | Real -| 默认值 | 0,参数值为0表示不记录任何其他事务的语句 -| 取值范围 | 0到1,参数值为1表示记录所有事物的所有语句 +#### lc_time +| 参数名称 h| lc_time | +| --- | --- | +| 数据类型 | string | +| 默认值 | +| 取值范围 | | 参数单位 | -| 参数含义 | 设置除其他原因记录的语句之外,所有记录语句的事务的百分比,本参数适用于每个新事务,而不考虑其语句的持续时间。采样是随机的,例如0.1意味着在统计上,每十个交易中有一个机会记录任何给定的事务。本参数值有助于构建一个事务的采样。仅允许superuser可以修改本参数值。另外请注意:与所有statement-logging选项一样,本参数会显著增加系统负载。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 +| 参数含义 | 本参数值用于设置格式化的日期和时间。可接受的参数值是跟系统相关的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### default_text_search_config +| 参数名称 h| default_text_search_config | +| --- | --- | +| 数据类型 | string | +| 默认值 | 依据initdb时的lc_ctype对应的设置而定 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值用于设置当全文检索函数中不明确指定配置项时所用的全文检索配置项。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -=== Checkpoints +### Write-Ahead Log / Settings +#### wal_level +| 参数名称 h| wal_level | +| --- | --- | +| 数据类型 | enum | +| 默认值 | replica | +| 取值范围 | {minimal,replica,logical} | +| 参数单位 | +| 参数含义 | +| 本参数定义了有多少信息被写入到WAL日志中。参数值replica表示WAL日志中写入了足够的信息以支持WAL Archiving和replicatin(包括在standby server上的read-only查询),参数值minimal表示WAL日志中移除了除了需要从crash或者immeidate shutdown进行recovery之外的信息。参数值logical添加了必要信息以支持逻辑解码(logical decoding),在本参数使用logical参数值的情况下,会使得WAL日志的数量变大,特别是很多表被配置为replica identity full并且很多delete和update被执行的情况下。本参数仅仅可以在PostgreSQL Start时修改。每个更高级别的参数值会包括更低级别参数值中记录的所有内容。但是最少的WAL不能包含足够的信息来从基本备份和WAL日志中重建数据,因此必须使用replica参数值来提供更多的信息以启用WAL归档(archive_mode)和流复制.在9.6之前的版本中,此参数值还可以是archive和hot_standby。在PG13版本中,这些仍被接受,但已映射到replica参数值上。当本参数设置为minimal时,如下操作会更快,因为如下操作在创建或重写它们的事务的其余部分中,没有记录永久关系的信息: ALTER ... SET TABLESPACE CLUSTER CREATE TABLE REFRESH MATERIALIZED VIEW(无CONCURRENTLY) REINDEX TRUNCATE + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | -==== checkpoint_timeout -[cols="136,387"] -|=== -h| 参数名称 h| checkpoint_timeout -| 数据类型 | Integer -| 默认值 | 300 -| 取值范围 | 30到86400 -| 参数单位 | 秒 -| 参数含义 | 设置两次automatic WAL checkpoints的时间间隔。增加本参数值会导致进行crash recovery的时间长度增大。本参数值仅能在postgresql.conf设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 +#### fsync +| 参数名称 h| fsync | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当本参数值为on时,通过发出fsync系统调用或者各种等价的方法(参见wal_sync_method配置参数),PostgreSQL会尝试确保更新被物理的写入disk。这就保证了PostgreSQL Cluster可以在操作系统或者硬件crash之后能recover(恢复)到一个一致的状态。当本参数值为off时,会带来性能优势,在电源故障或者系统crash时,这会导致不可恢复的数据损坏。仅仅当数据库的全部数据来源自外部数据的情况下,才建议将本参数值设置为off关闭fsync的场景包括:从备份文件中加载数据到PG中;使用PG进行数据的批处理,然后数据库会被废弃并重建;一个经常被重建的只读数据库克隆,并且不会用于failover.高质量的硬件不足以让本参数值设置为off基于可靠恢复的原因将本参数值从off改为on时,需要强制将kernel中修改过的buffer刷新到持久存储中,可以通过如下方法达到本目的: PostgreSQL Cluster关闭;当fsync参数值为on时运行initdb –sync-only,运行sync操作系统命令,unmount掉文件系统或者重启服务器操作系统。在很多场景中,针对非关键事务将synchronous_commit参数值设置为off可以提供比将fsync参数值设置为off更大的潜在优势,不会造成数据损坏等风险。本参数值只能在postgresql.conf文件或server command line中设置。如果关闭此参数,请考虑关闭full_page_writes。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -|=== +#### synchronous_commit +| 参数名称 h| synchronous_commit | +| --- | --- | +| 数据类型 | enum | +| 默认值 | on | +| 取值范围 | {local,remote_write,remote_apply,on,off} | +| 参数单位 | +| 参数含义 | +| 本参数值指定了在PostgreSQL数据库返回一个成功的提示给客户端之前,必须处理多少WAL数据。如果synchronous_standby_names是空,那么本参数有意义的参数值为on和off;remote_apply、remote_write、和local提供了与on参数值一样的本地同步级别。所有非off模式的本地行为是等待本地WAL刷新到Disk中。在off模式下,没有等待,因此存在一个延迟,这个延迟是给client报告成功与以后保证事务安全以防server crash之间的延迟(最大的延迟是三倍的wal_writer_delay参数值)。与fsync参数值不同,将此参数设置为off不会造成数据库不一致的任何风险。操作系统或者数据库的crash可能会导致一些最近据称已提交的事务丢失,但数据库状态将与这些事务完全中止时的状态相同,因此,当性能比事务持久性的精确确定性更重要时,将本参数设置为off是一个有用的选择。如果synchronous_standby_names是非空,本参数值用来控制事务提交是否等待在standby server上的WAL Record被处理。 + 当本参数值为remote_apply时,commit会等待直到从当前的同步standby指示它们已经收到事务的commit record并应用( applied),因此,它可以在standby 端被query可见,并且在standby端被写入持久性的存储中。这会导致比之前设置的更大的提交延迟,因为primary端会等standby端的WAL replay。 + 当本参数值为on时,commit会等待直到当前同步standby指示已经收到事务的commit record并且已经flush到持久性存储中。这确保了事务不会丢失,除非primary端和所有同步standby端的存储都发生损坏。 + 当本参数值为remote_write时,commit会等待直到当前同步standby指示已经收到事务的commit record并且已经写入到它们的文件系统中。本参数确保了在一个PostgreSQL 实例crash之后的数据持久,但是不针对standby端的操作系统级别的crash,因为,数据在standby端可能没有flush到持久性存储中。当参数值为local时,会导致commits一直在等待直到local flush到disk,而不是复制。当同步复制使用时,通常不需要这么做,但是为了完整而提供了这种方法。 + 此参数可随时更改;任何一个事务的行为都由提交时生效的设置决定。因此,让一些事务同步提交,而其他事务异步提交是可能的,也是有用的。例如,要在默认值相反时使单个多语句事务异步提交,请在事务中发出SET LOCAL synchronous_commit TO OFF | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | +#### wal_sync_method +| 参数名称 h| wal_sync_method | +| --- | --- | +| 数据类型 | enum | +| 默认值 | Linux和FreeBSD下默认值是fdatasyncWindows下默认值是open_datasync | +| 取值范围 | {fsync,fdatasync,open_sync,open_datasync} | +| 参数单位 | +| 参数含义 | +| 本参数值指定了强制将WAL写入Disk时使用的方法。当fsync参数值为off时,本参数值无关紧要。 open_datasync:使用open()的O_DSYNC选项写WAL Files fdatasync:每次commit时调用fdatasync() fsync:每次commit时调用fsync() fsync_writethrough:每次commit时调用fsync(),对disk write cache强制write-through open_sync:使用open()的O_SYNC选项写WAL Files + open_*选项使用O_DIRECT(若是可用),不是上述所有选项都在所有平台下可用。默认值是在该平台下支持的上述列表中的第一个方法,除了在Linux平台和FreeBSD平台下fdatasync是默认值。默认值不一定理想,可能有必要更次此设置或系统配置的其他方面,以创建crash的安全配置或实现最佳性能。本参数值只能在postgresql.conf文件或server command line中设置。 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== checkpoint_completion_target -[cols="136,387"] -|=== -h| 参数名称 h| checkpoint_completion_target -| 数据类型 | Real -| 默认值 | 0.5 -| 取值范围 | 0到1 +#### full_page_writes +| 参数名称 h| full_page_writes | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | +| 参数单位 | +| 参数含义 | +| 当本参数值为on时,在一个checkpoint发生之后,当第一个修改发生时,将full page(即:该修改所在的disk page中的全部内容)写入WAL日志中。这是需要的,因为在操作系统crash期间正在进行的page write可能仅部分完成,从而导致磁盘上的页包含新旧数据的混合。通常存储在WAL中的行级更改数据不足以在crash之后的恢复中完全还原一个page。存储full page image可以保证页面可以正确还原,但代价是增加必须写入WAL的数据量(因为WAL replay总是从检查点开始,所以在检查点之后的每个页面的第一次更改期间这样做就足够了。因此,降低整页写入成本的一种方法是增加checkpoint interval参数。)关闭此参数可加快正常操作,但在系统发生故障后,可能会导致不可恢复的数据损坏或静默数据损坏。风险类似于关闭fsync,虽然较小,但应该仅基于为fsync参数建议的相同情况关闭本参数。关闭此参数不会影响将WAL存档用于时间点恢复(PITR)。此参数只能在postgresql.conf文件或server command line中设置 + | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_log_hints +| 参数名称 h| wal_log_hints | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | +| 参数单位 | +| 参数含义 | 当本参数值设置为on时,在一个checkpoint发生之后,当第一个修改发生时,将full page(即:该修改所在的disk page中的全部内容)写入WAL日志中。即使对于所谓的提示位的非关键修改也是如此。如果data ckecksums被启用,hint bit updates总是被记录在wal中,此时本参数值被忽略。你可以使用本参数值来测试当数据库cluster启用checksum之后的会生成多少额外的wal-logging.本参数仅能在server start时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | PG instance重启生效 | + + +#### wal_compression +| 参数名称 h| wal_compression | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当本参数值为on时,在如下情况下PostgreSQL压缩一个全部的page image并写入到WAL中:full_page_writes参数值为on或者执行一次base backup。压缩的page image会在wal replay期间进行解压。启用本参数可以降低WAL日志的产生量而不会增加不可恢复的数据损坏的风险,但是在wal压缩以及解压过程中会有额外的cpu消耗。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Session级修改立即生效,非session修改relaod生效 | + + +#### wal_init_zero +| 参数名称 h| wal_init_zero | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当本参数值为on时,会导致新的wal file以零填充,在某些文件系统中,这确保了在需要写入wal records之前的空间已被分配。但是,Copy-On-Write (COW)文件系统不会从本参数中获益,因此可以选择跳过不必要的工作。如果设置为off,则在创建文件时仅写入最后一个字节,以使其具有预期的大小。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Session级修改立即生效,非session修改relaod生效 | + + +#### wal_recycle +| 参数名称 h| wal_recycle | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 本参数值为on时,会导致wal file被循环使用(通过renaming wal file的方式),避免了创建新wal file的需要。在COW文件系统中,本参数可能让create new wal file更快。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Session级修改立即生效,非session修改relaod生效 | + + +#### wal_buffers +| 参数名称 h| wal_buffers | +| --- | --- | +| 数据类型 | integer | +| 默认值 | -1,即:shared_buffers配置参数值的1/32大小,不小于64KB也不大于一个wal segment大小。请注意这是默认值的取值范围,不是手工设置本参数值的取值范围。 | +| 取值范围 | -1到262143 | +| 参数单位 | 8KB | +| 参数含义 | 分配给尚未写入到disk中的wal data的共享内存大小;如果自动选择太大或太小,则可以手动设置本参数值,但是任何小于32 KB的正数参数值.将被视为32 KB.如果指定的该值不带单位,则单位是WAL块的个数,即源码中符号常量XLOG_BLCKSZ,通常为8KB. 本参数值只能在服务器启动时设置。当每次事务提交时,wal buffer中的内容都会被写入disk中,因此,极大的本参数值不可能带来显著的益处。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | PG instance重启生效 | + + +#### wal_writer_delay +| 参数名称 h| wal_writer_delay | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 200 | +| 取值范围 | 1到10000 | +| 参数单位 | 毫秒 | +| 参数含义 | 指定了wal writer进程写wal buffer到disk中的频率,以时间去衡量,当wal writer进程flush wal之后,wal writer进程会休眠本参数值一段时间,除非被一个异步提交事务很快唤醒。如果最后一次flush在小于wal_writer_delay参数值之前发生 以及 小于wal_writer_flush_after参数值对应的WAL生成量,那么WAL被写入操作系统而不是flush到disk中。请注意,在很多操作系统中,sleep delays的有效精度是10毫秒, | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_writer_flush_after +| 参数名称 h| wal_writer_flush_after | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 128,即128*8KB=1MB | +| 取值范围 | 0到2147483647 | +| 参数单位 | 8KB | +| 参数含义 | 本参数值指定了wal writer进程flush wal的频率,以wal的大小来衡量。如果最后一次flush在小于wal_writer_delay参数值之前发生 以及 小于wal_writer_flush_after参数值对应的WAL生成量,那么WAL被写入操作系统而不是flush到disk中。本参数值为0代表wal data总是被立即被flush到disk中。如果指定的该值不带单位,则单位是WAL块的个数,即源码中符号常量XLOG_BLCKSZ,通常为8KB. 本参数值只能在postgresql.conf或者server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### wal_skip_threshold +| 参数名称 h| wal_skip_threshold | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 2048 | +| 取值范围 | 0到2147483647 | +| 参数单位 | KB | +| 参数含义 | 当wal_level参数值为minimal并且在create或者rewriting一个永久关系之后进行事务提交,本参数控制怎么持久化新的数据。如果数据小于本参数值,PostgreSQL会将这些数据写入wal log,否则,PostgreSQL会针对受影响的文件使用一个fsync。取决于你的存储属性,如果这些commit正在拖慢并发事务,增大或者降低本参数值可能会有帮助. 本参数值不带单位时,默认以KB为单位。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效。 | + + +#### commit_delay +| 参数名称 h| commit_delay | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,零表示没有延迟。 | +| 取值范围 | 0到100000 | +| 参数单位 | 毫秒 | +| 参数含义 | 设置本参数值会增加在wal flush启动之前的延迟。如果系统负载足够高以至于在给定的时间间隔内准备好提交其他事务,则这可以通过允许经由单个 WAL flush以提交大量事务来提高组提交吞吐量。但是,每次wal flush会增加延迟,最大延迟是本参数指指定的时间。如果没有其他事务会变成准备提交状态,延迟的时间是被浪费的,因此,如果当wal flush被初始化时,至少有commit_siblings个其他事务是active的情况下,延迟才被执行。同样,如果fsync被关闭,delay是不会被执行的。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Session级修改立即生效,其他修改reload生效 | + + +#### commit_siblings +| 参数名称 h| commit_siblings | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 5 | +| 取值范围 | 0到1000 | +| 参数单位 | +| 参数含义 | 在执行配置参数commit_delay指定的延迟之前,需要的最小的并发打开的事务数。值越大,在延迟间隔期间至少有一个其他事务准备好提交的可能性就越大 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +### Developer Options +#### allow_system_table_mods +| 参数名称 h| allow_system_table_mods | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 允许修改系统表的结构以及对系统表进行某些其他有风险的操作。否则即使对于超级用户也是不允许的。不明智地使用此设置可能会导致无法挽回的数据丢失或严重损坏数据库系统。只有超级用户才能更改此设置。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Session级修改立即生效,其他修改reload生效 | + + +#### backtrace_functions +| 参数名称 h| backtrace_functions | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 本参数值是以逗号分隔的C函数名称。如果一个错误被抛出并且错误发生地方的内部C函数名称与本参数值list中的值相匹配,然后backtrace与error message会被写入server log。不是所有的平台都支持backtrace功能,backtrace的质量取决于编译选项。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Session级修改立即生效,其他修改reload生效 | + + +#### ignore_system_indexes +| 参数名称 h| ignore_system_indexes | +| --- | --- | +| 数据类型 | boolean | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 当读取system table时忽略system index(但是当修改表时,依然会更新索引)。本参数用于从损坏的索引中恢复的场景中。本参数当session启动后无法改变 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效,但是仅仅针对reload之后的新session生效。 | + + +#### post_auth_delay +| 参数名称 h| post_auth_delay | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,零表示禁用延迟。 | +| 取值范围 | 0到2147 | +| 参数单位 | 秒 | +| 参数含义 | 在PostgreSQL构建认证阶段之后,当一个新server process被fork出来时的延迟的时间。本参数值用来给开发人员一个用debugger attach到server process的机会。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效,但是仅仅针对reload之后的新session生效。 | + + +#### pre_auth_delay +| 参数名称 h| pre_auth_delay | +| --- | --- | +| 数据类型 | Integer | +| 默认值 | 0,零表示禁用延迟。 | +| 取值范围 | 0到60 | +| 参数单位 | 秒 | +| 参数含义 | 在PostgreSQL构建认证阶段之前,在一个新server process被fork出来之后的延迟的时间。本参数值用来给开发人员一个使用debugger attach到server process以跟踪在认证阶段异常行为的机会。本参数只能在postgresql.conf中或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### trace_notify +| 参数名称 h| trace_notify | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 为LISTEN和NOTIFY命令生成大量的debugging输出。配置参数client_min_messages或者log_min_messages必须设置为DEBUG1或者更低才能发送该输出到client或者server log | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### trace_recovery_messages +| 参数名称 h| trace_recovery_messages | +| --- | --- | +| 数据类型 | enum | +| 默认值 | log,log不会影响log决策 | +| 取值范围 | {debug5,debug4,debug3,debug2,debug1,log,notice,warning,error} | +| 参数单位 | +| 参数含义 | 启用记录恢复相关的调试输出,否则将不会被记录。此参数允许用户覆盖log_min_messages的正常设置,但仅限于特定消息。本参数的目的是调试hot standby。其他值导致该优先级或更高优先级的与恢复相关的调试消息被记录,就好像它们具有LOG优先级一样。针对配置参数log_min_messages的通用设置会导致无条件发送messages到server log中。本参数只能在postgresql.conf中或者server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | + + +#### trace_sort +| 参数名称 h| trace_sort | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 当本参数值为on时,在sort操作期间,会发出有关资源使用的信息。本参数仅仅针对PostgreSQL编译时TRACE_SORT macro被定义时才有效(默认情况下,TRACE_SORT是被定义的) | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### trace_locks +| 参数名称 h| trace_locks | +| --- | --- | +| 数据类型 | bool | +| 默认值 | +| 取值范围 | | 参数单位 | -| 参数含义 | 指定了checkpoint 完成的目标,即:checkpoint需要在checkpoint_timeout\* checkpoint_completion_target的时间长度内完成。本参数值仅能在postgresql.conf设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | +| 是否可session级修改 | +| 修改后何时生效 | -|=== +#### trace_lwlocks +| 参数名称 h| trace_lwlocks | +| --- | --- | +| 数据类型 | +| 默认值 | +| 取值范围 | +| 参数单位 | +| 参数含义 | +| 是否可session级修改 | +| 修改后何时生效 | -==== checkpoint_flush_after - -[cols="136,387"] -|=== -h| 参数名称 h| checkpoint_flush_after -| 数据类型 | Integer -| 默认值 | 32,注意:linux平台下本参数默认值为32,Windows平台下本参数默认值为0 -| 取值范围 | 0到256,如果BLCKSZ符号常量值不是8KB,请根据比例进行修改。 -| 参数单位 | 8KB,若是指定参数值时不带单位,默认是BLCKSZ bytes,在不修改BLCKSZ符号常量值的情况下,该符号常量值为8KB。 -| 参数含义 | 每当在执行检查点时写入的数据量超过本参数值时,会尝试强制操作系统向底层存储发出这些写入操作。这样会限制kernel page cache中dirty data的总量,减少了在checkpoint的末尾发出fsync命令时,或者当操作系统在后台以更大的批写入数据时,PostgreSQL暂停的可能性。这通常会大大减少事务延迟,但也有一些情况,特别是在工作负载大于shared_buffers,但小于操作系统page cache的情况下,性能可能会降低。本参数值仅可以在postgresql.conf中设置或者在server command line进行设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== checkpoint_warning - -[cols="136,387"] -|=== -h| 参数名称 h| checkpoint_warning -| 数据类型 | integer -| 默认值 | 30 -| 取值范围 | 0到2147483647,0会禁用warning。 -| 参数单位 | 秒。若是指定本参数值不带单位,默认是秒 -| 参数含义 | 如果由于填充WAL段文件而导致的检查点发生的时间间隔比本参数值更小(这表明应该加大max_wal_size配置参数值),则向服务器日志写入一条消息。当checkpoint_timeout参数值小于checkpoint_warning参数值时,warning不会产生。本参数值仅可以在postgresql.conf中设置或者在server command line进行设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - - - - - - -==== max_wal_size - -[cols="136,387"] -|=== -h| 参数名称 h| max_wal_size -| 数据类型 | Integer -| 默认值 | 1024 -| 取值范围 | 2到2147483647 -| 参数单位 | MB -| 参数含义 | 触发automatic checkpoints的最大wal 大小。这是软限制,wal size可以在如下情况下超过本参数值的限制:重负载,失败的archive_command命令,以及高的wal_keep_size参数值设置。增加本参数值会导致进行crash recovery的时间长度增大。本参数值仅能在postgresql.conf设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== min_wal_size - -[cols="136,387"] -|=== -h| 参数名称 h| min_wal_size -| 数据类型 | Integer -| 默认值 | 80 -| 取值范围 | 2到2147483647 -| 参数单位 | MB -| 参数含义 | 只要WAL Disk的使用低于本参数值,旧的wal文件总是在checkpoint发生时被循环使用,而不是删除wal文件。这可以用来确保保留足够的WAL空间来处理WAL使用中的峰值,例如在运行大型批处理作业时。此参数只能在postgresql.conf文件文件或在server command line上。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -=== dynamic_library_path - -[cols="136,387"] -|=== -h| 参数名称 h| dynamic_library_path -| 数据类型 | string -| 默认值 | $libdir, $libdir代表的绝对路径请见pg_config --pkglibdir命令的输出 -| 取值范围 | -| 参数单位 | -| 参数含义 | 如果需要打开可动态加载的模块,并且create function 或LOAD命令中指定的文件名没有目录组件(即名称不包含斜杠),系统将在该路径中搜索所需的文件。本参数值必须是由冒号分隔(针对Linux平台)或者分号分隔(针对Windows平台)的绝对路径列表。如果本参数值以特殊字符串$libdir开头,那么编译后的PostgreSQL package library directory会取代$libdir, PostgreSQL package library directory请见pg_config --pkglibdir命令的结果。若是本参数值被设置为空字符串,表示自动path search功能会被关闭。superuser可以在运行时更改此参数,但这样做的设置只会持续到客户端连接结束,因此应将此方法保留用于开发目的。 -| 是否可session级修改 | 是,此时仅限于superuser在session级别修改。 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -=== gin_fuzzy_search_limit - -[cols="136,387"] -|=== -h| 参数名称 h| gin_fuzzy_search_limit -| 数据类型 | integer -| 默认值 | 0,0表示无限制 -| 取值范围 | 0到2147483647 -| 参数单位 | -| 参数含义 | GIN索引扫描返回的结果集大小的软上限。开发GIN索引的主要目的是在PostgreSQL中创建对高度可伸缩的全文搜索的支持,而且通常情况下,全文搜索会返回非常大的结果集。此外,当查询包含非常频繁的单词时,这种情况经常发生,因此大的结果集甚至没有用处。因为从磁盘读取许多元组并对它们进行排序可能需要花费大量时间,这对于生产来说是不可接受的。(请注意,索引搜索本身非常快。)为了便于此类查询的受控执行,GIN对返回的行数有一个可配置的软上限,这就是gin_fuzzy_search_limit配置参数。默认设置为0(表示无限制)。如果设置了非零限制,则返回的集是随机选择的整个结果集的子集。"软"意味着返回结果的实际数量可能与指定的限制有所不同,这取决于查询和系统随机数生成器的质量。从经验来看,以千为单位的本参数值(例如,5000-20000)工作正常。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload生效 - -|=== - - - -=== tcp_keepalives_count - -[cols="136,387"] -|=== -h| 参数名称 h| tcp_keepalives_count -| 数据类型 | -| 默认值 | 0,0表示取操作系统的默认值, -| 取值范围 | 0到2147483647 -| 参数单位 | -| 参数含义 | 指定在服务器与客户端的连接被视为已断开之前可以被丢弃的TCP keepalive messages.在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为零。本参数在Windows操作系统上不被支持,因此,在Windows操作系统上,本参数值必须为0。本参数仅仅支持符合如下条件的操作系统:那些支持TCP_KEEPCNT或者等价socket option的操作系统。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -=== tcp_keepalives_idle - -[cols="136,387"] -|=== -h| 参数名称 h| tcp_keepalives_idle -| 数据类型 | integer -| 默认值 | 0,0表示取操作系统的默认值 -| 取值范围 | 0到2147483647 -| 参数单位 | 秒 -| 参数含义 | 指定在没有网络活动的情况下,经过多长时间之后,操作系统应该向Client端发送TCP keepalive message.本参数仅仅支持符合如下条件的操作系统:那些支持TCP_KEEPIDLE或者等价socket option的操作系统。因此,在Windows以及其他操作系统中,本参数值必须为0,在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为0。在Windows操作系统上,本参数值为0时,本参数值将会被视为2小时,因为,Windows不提供读取系统默认值的方法。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - -=== tcp_keepalives_interval - -[cols="136,387"] -|=== -h| 参数名称 h| tcp_keepalives_interval -| 数据类型 | Integer -| 默认值 | 0,0表示取操作系统的默认值 -| 取值范围 | 0到2147483647 -| 参数单位 | 秒 -| 参数含义 | 指定TCP keepalive message重传的时间间隔。本参数仅仅支持符合如下条件的操作系统:那些支持TCP_KEEPINTVL或者等价socket option的操作系统。因此,在Windows以及其他操作系统中,本参数值必须为零,在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为零。在Windows操作系统上,本参数值为零时,本参数值将会被视为1秒,因为,Windows不提供读取系统默认值的方法。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - -=== tcp_user_timeout - -[cols="136,387"] -|=== -h| 参数名称 h| tcp_user_timeout -| 数据类型 | Integer -| 默认值 | 0,0表示取操作系统的默认值 -| 取值范围 | 0到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 指定在强制关闭TCP连接之前,传输的数据可能保持未确认状态的时间长度本参数仅仅支持符合如下条件的操作系统:那些支持TCP_USER_TIMEOUT或者等价socket option的操作系统。因此,在其他操作系统中,本参数值必须为零,在一个基于Unix-domain socket的session中,本参数会被忽略,此时本参数值被视为零。在Windows操作系统上,本参数不受支持,此时本参数值必须设置为零。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - - -=== Query Tuning / Genetic Query Optimizer - -==== geqo - -[cols="136,387"] -|=== -h| 参数名称 h| geqo -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 -a| 启用或者禁用genetic query optimization,生产环境中不应该将本参数设置为off。配置参数geqo_threshold提供了对GEQO更细粒度的控制。遗传查询优化器(GEQO)是一种使用启发式搜索进行查询计划的算法。这减少了用于复杂查询(那些包含许多关系的查询)的计划时间,但所产生的计划的成本有时不如普通穷举搜索算法所找到的计划。 + - -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== geqo_threshold - -[cols="136,387"] -|=== -h| 参数名称 h| geqo_threshold -| 数据类型 | integer -| 默认值 | 12 -| 取值范围 | 2到2147483647 -| 参数单位 | -| 参数含义 | 本参数是启用geqo的阈值,即:当from之后的关系数量至少有本参数值指定的个数时,才启用geqo。注意一个FULL OUTER JOIN只被计为一个FROM项。对于简单的SQL语句,通常最好使用常规的穷举搜索planner,但是对于具有许多表的查询,穷举搜索花费的时间太长,通常比执行次优计划的代价要长,因此,本阈值是管理geqo的一种方法。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== geqo_effort - -[cols="136,387"] -|=== -h| 参数名称 h| geqo_effort -| 数据类型 | Integer -| 默认值 | 5 -| 取值范围 | 1到10 -| 参数单位 | -| 参数含义 | 控制GEQO中计划时间和查询计划质量之间的权衡。此变量必须是1到10之间的整数。默认值为5。较大的值会增加生成查询计划所花费的时间,但也会增加选择高效查询计划的可能性。本参数实际上并不直接做任何事情;它只用于计算影响geqo行为的其他变量的默认值。如果愿意,可以手动设置其他参数。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== geqo_pool_size - -[cols="136,387"] -|=== -h| 参数名称 h| geqo_pool_size -| 数据类型 | Integer -| 默认值 | 0,0表示PostgreSQL会根据SQL语句中表的数量以及geqo_effort参数值选择一个合适的值。 -| 取值范围 | 0到2147483647 -| 参数单位 | -| 参数含义 | 控制GEQO使用的pool size,即:遗传群体中的个体数,至少是2,有用的值通常是100到1000. 参数值为0表示PostgreSQL会根据SQL语句中表的数量以及geqo_effort参数值选择一个合适的值。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== geqo_generations - -[cols="136,387"] -|=== -h| 参数名称 h| geqo_generations -| 数据类型 | Integer -| 默认值 | 0 -| 取值范围 | 0到2147483647 -| 参数单位 | -| 参数含义 | 控制GEQO使用的generations,即算法的迭代次数。它必须至少是一个,并且有用的值通常是100到1000。如果设置为零(默认设置),则PostgreSQL会根据geqo_pool_size选择合适的值。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== geqo_selection_bias - -[cols="136,387"] -|=== -h| 参数名称 h| geqo_selection_bias -| 数据类型 | real -| 默认值 | 2 -| 取值范围 | 1.5到2 -| 参数单位 | -| 参数含义 | 控制GEQO使用的选择偏差。选择偏差是population内部的选择压力 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - -==== geqo_seed - -[cols="136,387"] -|=== -h| 参数名称 h| geqo_seed -| 数据类型 | real -| 默认值 | 0 -| 取值范围 | 0到1 -| 参数单位 | -| 参数含义 | 控制GEQO用于通过连接顺序搜索空间选择随机路径的随机数生成器的初始值,更改该值将更改所探索的连接路径集。并可能导致找到更好或更差的最佳路径 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -=== Write-Ahead Log / Recovery Target - -==== recovery_target - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target -| 数据类型 | string -| 默认值 | 空串 -| 取值范围 | immediate -| 参数单位 | -| 参数含义 | 此参数指定恢复应在达到一致状态后尽快结束,即尽早结束。从联机备份还原时,这意味着在备份结束的时间点结束恢复。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 本参数不支持修改。 - -|=== - - - -==== recovery_target_name - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_name -| 数据类型 | string -| 默认值 | 空串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 此参数指定将继续恢复(recovery)到的命名还原点,该还原点由函数pg_create_restore_point()创建。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -==== recovery_target_time - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_time -| 数据类型 | string -| 默认值 | 空串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 此参数指定将继续恢复(recovery)到的time stamp,精确的停止点受到recovery_target_inclusive配置参数影响。此参数的值是一个时间戳,其格式与timestamp with time zone数据类型所接受的格式相同,只是您不能使用时区缩写(除非在配置文件的前面设置了timezone_abbreviations变量)。首选样式是使用UTC的数字偏移量,或者您可以编写完整的时区名称,例如,Europe/Helsinki,而不是EEST -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -==== recovery_target_xid - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_xid -| 数据类型 | string -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | 此参数指定将继续恢复(recovery)到的trasaction ID。请记住,虽然事务ID在事务开始时按顺序分配,但事务可以按不同的数字顺序完成。要恢复的事务是在指定事务之前提交的事务(也可以选择包括指定事务),精确的停止点受到recovery_target_inclusive配置参数影响。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -==== recovery_target_lsn - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_lsn -| 数据类型 | string -| 默认值 | 空串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 此参数指定将继续恢复(recovery)到的LSN,精确的停止点受到recovery_target_inclusive配置参数影响。本参数使用系统数据类型pg_lsn解析。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -==== recovery_target_inclusive - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_inclusive -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当本参数设置为on时指定到达指定的recovery target之后停止当本参数设置为off时指定到达指定的recovery target之前停止本参数与如下参数配合使用:recovery_target_lsn、recovery_target_time、recovery_target_xid。本参数控制含有精确recovery target(恢复目标)的LSN、commit time、或者trasaction id是否被包括恢复(recovery)之内。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -==== recovery_target_timeline - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_timeline -| 数据类型 | string -| 默认值 | latest -| 取值范围 | -| 参数单位 | -| 参数含义 | 指定recovery进入一个特定的timeline,本参数值可以是一个数字的timeline id或者一个特定的值,值current的含义:recover到做base backup时的那个timeline;值latest表示recover到在archive 中找到的最新的timeline,值latest适用于standby server。您通常只需要在复杂的重新恢复情况下设置本参数,在这种情况下,您需要返回到在时间点恢复之后达到的状态。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -==== recovery_target_action - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_target_action -| 数据类型 | enum -| 默认值 | pause -| 取值范围 | pause,promote,shutdown -| 参数单位 | -| 参数含义 | 指定了一旦达到recovery target,PostgreSQL该采取的操作。默认值pause表示恢复暂停(pause),值promote表示恢复过程完成并且PostgreSQL将会启动以接受外部连接,值shutdown表示在达到recovery target之后会stop PostgreSQL。pause值的预期用途是允许对数据库执行查询,以检查此恢复目标是否是最理想的恢复点,pg_wal_replay_resume()函数表示paused state resumed,这意味着恢复走到了终点。若是recovery target不是期望的那个stopping point,那么请关闭PostgreSQL,改变recovery target到更为之后的一个target,然后重启recovery即可。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG Instance生效 - -|=== - - - -=== Query Tuning / Other Planner Options - -==== default_statistics_target - -[cols="136,387"] -|=== -h| 参数名称 h| default_statistics_target -| 数据类型 | integer -| 默认值 | 100 -| 取值范围 | 1到10000 -| 参数单位 | -| 参数含义 | 为没有通过ALTER TABLE SET STATISTICS设置column-specific target的表列设置默认统计目标。较大的本参数值会增加analyze的时间,但也会提升planner估计的质量。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== constraint_exclusion - -[cols="136,387"] -|=== -h| 参数名称 h| constraint_exclusion -| 数据类型 | enum -| 默认值 | partition -| 取值范围 | partition,on,off on表示检查所有表的约束 off表示不检查约束partition表示仅仅对继承的子表以及union all子查询检查约束。 -| 参数单位 | -| 参数含义 -a| 控制planner是否使用constraints优化查询,如果表的约束保证没有与查询匹配的行,table scan会被跳过。本参数经常与传统的继承树一起使用以提高性能,比如如下的例子: CREATE TABLE parent(key integer, ...); CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent); CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent); ... SELECT \* FROM parent WHERE key = 2400;当本参数启用时,select语句就不会扫描child1000这个表。目前,默认情况下仅对经常用于通过继承树实现表分区的情况启用约束排除。为所有表启用它会带来额外的计划开销,这在简单查询中非常明显,而且对于简单查询通常不会产生任何好处。如果没有使用传统继承进行分区的表,则可能希望完全关闭它。(请注意,分区表的等效功能由单独的配置参数enable_partition_pruning控制。) + - -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== cursor_tuple_fraction - -[cols="136,387"] -|=== -h| 参数名称 h| cursor_tuple_fraction -| 数据类型 | real -| 默认值 | 0.1 -| 取值范围 | 0到1 -| 参数单位 | -| 参数含义 | 设置planner's估计,本参数设置较少的值时,会使planner倾向于对cursors使用"fast start" plan,这会快速的检索前几行,而获取所有行可能需要很长时间。较大的值更强调总的估计时间。在最大设置为1.0时,游标的规划与常规查询完全相同,只考虑总的估计时间,而不考虑第一行的交付时间。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== from_collapse_limit - -[cols="136,387"] -|=== -h| 参数名称 h| from_collapse_limit -| 数据类型 | integer -| 默认值 | 8 -| 取值范围 | 1到2147483647 -| 参数单位 | -| 参数含义 | 如果生成的FROM列表包含的项目不超过本参数值,那么planner将会把子查询合并到上面的查询中。较小的值会减少计划时间,但可能会产生较差的查询计划。设置本参数值为geqo_threshold参数值或者更大可能会触发GEQO Planner的使用,进而导致非优化的执行计划。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - -==== jit - -[cols="136,387"] -|=== -h| 参数名称 h| jit -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 确定jit编译是否被PostgreSQL使用。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - -==== join_collapse_limit - -[cols="136,387"] -|=== -h| 参数名称 h| join_collapse_limit -| 数据类型 | integer -| 默认值 | 8 -| 取值范围 | 1到2147483647 -| 参数单位 | -| 参数含义 | 每当生成的items列表不超过本参数值时,planner就会将explicit join结构(FULL JOINs除外)重写为FROM items列表。较小的值会减少计划时间,但可能会产生较差的查询计划.默认情况下,此参数值设置为与from_collapse_limit参数值相同,这适用于大多数用途。将其设置为1可防止explicit join的任何重新排序。因此,查询中指定的显式连接顺序将是连接关系的实际顺序。因为查询规划器并不总是选择最佳的连接顺序,所以高级用户可以选择将此参数值临时设置为1,然后显式指定所需的连接顺序。设置本参数值为geqo_threshold参数值或者更大可能会触发GEQO Planner的使用,进而导致非优化的执行计划。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - - - - -==== parallel_leader_participation - -[cols="136,387"] -|=== -h| 参数名称 h| parallel_leader_participation -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 允许leader进程在Gather和Gather Merge node下执行查询计划,而不是等待worker进程。将此值设置为off可降低worker进程被阻塞的可能性,因为leader进程读取元组的速度不够快,但需要leader进程等待工作进程启动,然后才能生成第一个元组。Leader进程能够帮助或阻碍性能的程度取决于计划类型、worker数量和查询持续时间。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - - -==== force_parallel_mode - -[cols="136,387"] -|=== -h| 参数名称 h| force_parallel_mode -| 数据类型 | enum -| 默认值 | off -| 取值范围 | off,on,regress off表示仅仅当预期能提升性能时,才使用parallel mode on表示对被视为safe的查询语句强制使用并行查询。regress表示除了有本参数值设置为"on"的相同的所有效果之外,还有一些旨在促进自动回归测试的附加效果 -| 参数单位 | -| 参数含义 | 是否使用parallel query功能。更具体地说,将此值设置为on将在任何查询计划的顶部添加一个Gather节点,这看起来是安全的,因此查询在并行worker进程中运行,即使并行worker进程不可用或无法使用,也将禁止在并行查询上下文中禁止的操作(如启动子事务),除非planner认为这将导致查询失败,如果设置此选项时出现故障或意外结果,则查询使用的某些函数可能需要标记为PARALLEL UNSAFE(或者,可能是PARALLEL RESTRICTED)通常,来自并行worker进程的消息包含一个context line,但是设置为regress会抑制该context line,以便输出与非并行执行中的输出相同。此外,通过此设置,添加到计划中的Gather nodes将隐藏在EXPLAIN的输出中,以便当本参数值设置为off时,输出与获得的结果相匹配。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== plan_cache_mode - -[cols="136,387"] -|=== -h| 参数名称 h| plan_cache_mode -| 数据类型 | enum -| 默认值 | auto -| 取值范围 | auto,force_generic_plan,force_custom_plan -| 参数单位 | -| 参数含义 | 可以使用自定义或generic的plan执行prepared statements(explicitly prepared或implicitly generated,例如通过PL/pgSQL),针对每一次的执行,自定义plan使用特定的一组参数值被重新生成,generic plans不依赖本plan_cache_mode参数值,可以被多次的执行重复使用。此外,使用generic plans会节省 planning time,但是,如果理想的plan强烈依靠本参数,那么,generic plan可能效率低下。这些选项之间的选择通常是自动进行的,但它可以被plan_cache_mode配置参数覆盖。在执行缓存的计划时,而不是在准备计划时,会考虑本参数值 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - - -=== Version and Platform Compatibility / Previous PostgreSQL Versions - -==== array_nulls - -[cols="136,387"] -|=== -h| 参数名称 h| array_nulls -| 数据类型 | bool -| 默认值 | on,本参数值为on时表示允许输入包括NULL的数组值 -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 本参数控制数组输入解析器是否将未加引号的NULL识别为指定NULL数组元素。8.2版本之前的PostgreSQL不支持数组中的null值,因此将null视为使用字符串值"null"指定普通数组元素。为了向后兼容需要旧行为的应用程序,可以关闭此参数。请注意,即使本参数值是off,也可以创建包含NULL的数组值 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== backslash_quote - -[cols="136,387"] -|=== -h| 参数名称 h| backslash_quote -| 数据类型 | enum -| 默认值 | safe_encoding -| 取值范围 | safe_encoding,on,off on表示始终允许\' off表示始终拒绝\'safe_encoding表示仅当客户端编码不允许在多字节字符中使用ASCII\时才允许. -| 参数单位 | -| 参数含义 | 本参数用于设置字符串的引用符是否是\'符号。SQL标准中是'',而PostgreSQL历史上也接受了\'符号,但是,使用\'会带来安全风险,这是因为,在一些客户端字符集编码中,存在多字节字符,其中最后一个字节在数字上等同于ASCII \.如果客户端没有正确的转义,那么SQL注入攻击是可能的。这种风险可以通过使PostgreSQL数据库拒绝引用符被backslash反斜杠转义的查询来防止。请注意,在标准一致性字符串文本中,无论如何,\仅仅表示\。此参数仅影响对非标准一致性文本的处理,包括转义字符串语法(E'…') -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== escape_string_warning - -[cols="136,387"] -|=== -h| 参数名称 h| escape_string_warning -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当设置为on时,表示当\出现在一个普通的字符串('…'这样的)中并且standard_conforming_strings参数值为off时,一个warning会发出。希望使用反斜杠作为转义的应用程序应该修改为使用转义字符串语法(E'…'). 因为根据SQL标准,普通字符串的默认行为现在是将反斜杠视为普通字符. 可以启用本参数来帮助定位需要更改的代码 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== lo_compat_privileges - -[cols="136,387"] -|=== -h| 参数名称 h| lo_compat_privileges -| 数据类型 | bool -| 默认值 | off -| 取值范围 | -| 参数单位 | -| 参数含义 | 对large object,为权限检查启用面向backward的兼容性模式。在PostgreSQL9.0之前,large object并不具有访问权限,因此,large object总是能被所有的user进行读和写。设置本参数值为on将会禁用新权限的检查,这会与PostgreSQL9.0之前的版本保持兼容。 -| 是否可session级修改 | 是,仅限于superuser进行修改 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== operator_precedence_warning - -[cols="136,387"] -|=== -h| 参数名称 h| operator_precedence_warning -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 启用此选项后,解析器将对自PostgreSQL 9.4以来由于运算符优先级的更改而可能已更改含义的任何构造发出警告。对于审核应用程序以查看优先级更改是否破坏了任何内容非常有用;但这并不意味着在生产环境中保持打开状态,因为它将警告某些完全有效、符合标准的SQL代码 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== quote_all_identifiers - -[cols="136,387"] -|=== -h| 参数名称 h| quote_all_identifiers -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 -a| 当数据库生成SQL语句时,即使标识符不是关键字,也会将标识符引用起来。这会影响explain的输出以及诸如pg_get_viewdef函数的结果,比如下面的例子: postgres=# select pg_get_viewdef('company_view'); -[RECORD 1]--+-------------------- pg_get_viewdef | SELECT company.id,+ | company.name, + | company.age + | FROM company; + - postgres=# set quote_all_identifiers=on; SET postgres=# select pg_get_viewdef('company_view'); -[RECORD 1]--+------------------------ pg_get_viewdef | SELECT "company"."id",+ | "company"."name", + | "company"."age" + | FROM "company"; + -postgres=# - -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== standard_conforming_strings - -[cols="136,387"] -|=== -h| 参数名称 h| standard_conforming_strings -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 本参数控制普通字符串文本('…')是否按SQL标准中的指定按字面含义处理反斜杠.从PostgreSQL9.1开始,默认值为on。此参数的存在也可以被视为表示支持转义字符串语法(E'…')如果应用程序希望反斜杠被视为转义字符,则应使用转义字符串语法 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -==== synchronize_seqscans - -[cols="136,387"] -|=== -h| 参数名称 h| synchronize_seqscans -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 这允许对大表的顺序扫描彼此同步,以便并发扫描在大约相同的时间读取相同的块,从而共享I/O工作负载。启用本参数后,扫描可能从表的中间开始,然后"环绕"结尾以覆盖所有行,以便与正在进行的扫描活动同步。这可能导致没有ORDERBY子句的查询返回的行顺序发生不可预知的更改。将此参数设置为off可确保与PostgreSQL 8.3之前的行为,即顺序扫描始终从表的开头开始 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效,其他级别修改reload生效 - -|=== - - - -=== Connections and Authentication / Connection Settings - -==== listen_addresses - -[cols="136,387"] -|=== -h| 参数名称 h| listen_addresses -| 数据类型 | string -| 默认值 | localhost -| 取值范围 | -| 参数单位 | -| 参数含义 | 设置数据库服务器监听的hostname或者IP地址,监听多个hostname或者IP地址时,请用逗号隔开。 \*号表示监听所有可用的IP地址, 0:0:0:0监听代表所有IPV4的地址, ::代表监听所有IPV6的地址。当本参数值为空时,PostgreSQL不会监听任何的IP,此时,只有Unix-domain sockets才可以用于连接到数据库中。本参数控制哪些IP地址上接受连接尝试,这可以帮助防止在不安全的IP地址上重复出现恶意连接请求。该参数只能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== port - -[cols="136,387"] -|=== -h| 参数名称 h| port -| 数据类型 | integer -| 默认值 | 5432 -| 取值范围 | 1到65535 -| 参数单位 | -| 参数含义 | PostgreSQL监听的TCP端口。请注意,PostgreSQL监听的所有IP地址都使用相同的端口号,本参数只能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== max_connections - -[cols="136,387"] -|=== -h| 参数名称 h| max_connections -| 数据类型 | integer -| 默认值 | 100 -| 取值范围 | 1到262143 -| 参数单位 | -| 参数含义 | 本参数值指定了PostgreSQL数据库的最大连接数。本参数只能在PostgreSQL启动时设置。在流复制备库上,必须将本参数值设置为与主库相同或者比主库参数值大,否则,后备服务器将不允许查询操作。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - - - -==== superuser_reserved_connections - -[cols="136,387"] -|=== -h| 参数名称 h| superuser_reserved_connections -| 数据类型 | integer -| 默认值 | 3 -| 取值范围 | 0到262143 -| 参数单位 | -| 参数含义 | 为superusers保留的connection "slots"的数量,当PostgreSQL的活跃的并发连接的数量等于max_connections参数值减去superuser_reserved_connections参数值之后,仅仅可以面向superuser建立新的连接,并且,replication connection也是建立不了的。本参数只能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== unix_socket_directories - -[cols="136,387"] -|=== -h| 参数名称 h| unix_socket_directories -| 数据类型 | string -| 默认值 | 在Linux中默认值为/tmp;在Windows中默认值为空 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数指定了PostgreSQL监听客户端连接的Unix-domain socket(s)目录,多个目录可以用逗号隔开,两个目录之间的空格会被忽略,如果你想在目录名中包括逗号或者空格,请使用双引号引起来。本参数值为空时表示不监听任何的Unix-domain socket(s)目录,这意味着只有TCP/IP sockets可以被用来连接到PostgreSQL中。本参数只能在PostgreSQL启动时设置。在本参数值指定的目录下,会有名为s.PGSQL.nnnn的socket file,nnnn是PostgreSQL使用的端口号,在该目录下,还有一个名为.s.PGSQL.nnnn.lock的文件。这两个文件请不要手工删除。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - - - -==== unix_socket_group - -[cols="136,387"] -|=== -h| 参数名称 h| unix_socket_group -| 数据类型 | string -| 默认值 | 空字符串,空字符串表示使用启动PostgreSQL 的user的默认组。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 设置Unix-domain socket(s).的owning group(请注意:socket的owning user总是启动PostgreSQL的user)。本参数与unix_socket_permissions结合使用可以将其作为Unix-domain connections的额外访问控制机制。本参数只能在PostgreSQL启动时设置。本参数不支持在Windows上使用,在Windows上,本参数取任何值都会被忽略。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== unix_socket_permissions - -[cols="136,387"] -|=== -h| 参数名称 h| unix_socket_permissions -| 数据类型 | integer -| 默认值 | 0777,0777表示任何人都可以连接 -| 取值范围 | 0到511 -| 参数单位 | -| 参数含义 | 本参数用于设置Unix-domain socket(s)的访问权限。Unix-domain socket使用通常的Unix文件系统权限集。参数值预计是被chmod和umask系统调用接受的数字模式。(要使用惯用的八进制格式,数字必须以0(零)开头。)合理的参数值是0770(仅用户和组,另请参见unix_socket_group)和0700(仅用户)。请注意,对于Unix-domain socket,仅写许可权是重要的,因此设置或撤消读或执行许可权没有意义。本参数只能在PostgreSQL启动时设置。在完全忽略socket permissions的操作系统上(特别是自solaris10起的Solaris),此参数是不相关的。在此类操作系统上,可以通过将unix目录指向一个搜索权限仅限于所需访问用户的目录来实现类似的效果。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - - - - -==== bonjour - -[cols="136,387"] -|=== -h| 参数名称 h| bonjour -| 数据类型 | boolean -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 本参数控制是否通过Bonjour机制通告PostgreSQL的存在。本参数只能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 - -|=== - - - - -==== bonjour_name - -[cols="136,387"] -|=== -h| 参数名称 h| bonjour_name -| 数据类型 | string -| 默认值 | 空字符串。空字符串表示使用计算机名 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数用于设置Bonjour service name。当PostgreSQL软件没有编译Bonjour support时,本参数会被忽略。本参数只能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效。 - -|=== - - - -=== Resource Usage / Asynchronous Behavior - -==== effective_io_concurrency - -[cols="136,387"] -|=== -h| 参数名称 h| effective_io_concurrency -| 数据类型 | integer -| 默认值 | 1 -| 取值范围 | 0到1000,0表示禁止发布异步I/O请求 -| 参数单位 | -| 参数含义 | 有效利用disk子系统的并发disk io的数量。目前,本参数仅仅影响bitmap heap scans。对于HDD(机械硬盘),本参数的起始值应该是PostgreSQL database用到的、组成raid 0 条带或者raid 1镜像的单独 disk drive的个数。但是,如果PostgreSQL数据库经常忙于并发会话中发出的多个查询,则较低的值可能足以使磁盘阵列保持繁忙。高于使磁盘保持忙碌的本参数值只会导致额外的CPU开销,固态盘(SSD)以及其他基于内存的存储可以经常处理很多并发请求,因此,此时最佳的值可能是几百。异步IO请求取决于一个有效的posix_fadvise函数,该函数在有些操作系统上是缺少的。在该函数缺少时,设置本参数为非零值会导致错误发生。在有些操作系统上(比如Solaris),本函数存在但是并没有实际的执行任何操作。在受到支持的操作系统上,本参数值的默认值为1,否则为零。本参数值可以被tablespace级别的同名参数值所覆盖。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 - -|=== - - - -==== maintenance_io_concurrency - -[cols="136,387"] -|=== -h| 参数名称 h| maintenance_io_concurrency -| 数据类型 | integer -| 默认值 | 10 -| 取值范围 | 0到1000 -| 参数单位 | -| 参数含义 | 本参数类似于effective_io_concurrency参数,但本参数用于代表许多客户端会话执行的维护工作。在受到支持的操作系统上,本参数值的默认值为10,否则为零。本参数值可以被tablespace级别的同名参数值所覆盖。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 - -|=== - - - -==== max_worker_processes - -[cols="136,387"] -|=== -h| 参数名称 h| max_worker_processes -| 数据类型 | integer -| 默认值 | 8 -| 取值范围 | 0到262143 -| 参数单位 | -| 参数含义 | 本参数值指定了PostgreSQL所能支持的并发worker进程的最大数量。本参数值仅能在PostgreSQL启动时设置。当运行在standby server环境中时,在standby server上的本参数值必须大于或者等于在master server上的本参数值。否则,query是不能运行在standby server上。当改变本参数值时,请考虑调整max_parallel_workers,参数,max_parallel_maintenance_workers参数,max_parallel_workers_per_gather参数 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - - - -==== max_parallel_workers_per_gather - -[cols="136,387"] -|=== -h| 参数名称 h| max_parallel_workers_per_gather -| 数据类型 | integer -| 默认值 | 2 -| 取值范围 | 0到1024,0表示禁用parallel query execution -| 参数单位 | -| 参数含义 | 本参数指定了可以被单个Gather或者Gather Merge Node启动的worker进程的最大数量。Parallel Workers进程从由max_worker_processes配置参数建立的进程池中获取,受限于max_parallel_workers配置参数。请注意,请求的workers的数量在运行时并不一定实际可用,如果这个情况发生,执行计划会以少于期望个数的workers去运行,这可能是低效的。请注意,parallel queries可能比非parallel queries消耗更多的资源,因为每个工作进程是一个完全独立的进程,其对系统的影响与附加用户会话大致相同。在为此设置选择值时,以及在配置控制资源利用率的其他设置(如work_mem)时,都应考虑到这一点。诸如work_mem之类的资源限制单独应用于每个worker,这意味着所有进程的总利用率可能比任何单个进程的正常利用率高得多。例如,一个使用4个worker的并行查询可能会使用多达5倍的CPU时间、内存、I/O带宽。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 - -|=== - - -==== max_parallel_maintenance_workers - -[cols="136,387"] -|=== -h| 参数名称 h| max_parallel_maintenance_workers -| 数据类型 | integer -| 默认值 | 2 -| 取值范围 | 0到1024,0表示禁用由实用命令使用的parallel workers -| 参数单位 | -| 参数含义 | 可以被单个实用命令启动的parallel worker的最大数量。当前,支持parallel workers的并行实用命令有如下几种: create index 建立B-Tree时; vacuum 不带full选项时; Parallel Workers进程从由max_worker_processes配置参数建立的进程池中获取,受限于max_parallel_workers配置参数。请注意,请求的workers的数量在运行时并不一定实际可用,如果这个情况发生,执行计划会以少于期望个数的workers去运行,这可能是低效的。注意,并行实用程序命令不应该比等效的非并行操作消耗更多的内存,这种策略不同于并行查询,在并行查询中资源限制通常适用于每个worker进程。并行实用命令将资源限制maintenance_work_mem视为应用于整个实用命令的限制,而不考虑并行工作进程的数量。然而,并行实用命令仍然可能消耗更多的CPU资源和I/O带宽。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 - -|=== - - - -==== max_parallel_workers - -[cols="136,387"] -|=== -h| 参数名称 h| max_parallel_workers -| 数据类型 | integer -| 默认值 | 8 -| 取值范围 | 0到1024 -| 参数单位 | -| 参数含义 | 本参数值指定了PostgreSQL支持的parallel操作的worker的最大数量。当增加或者减少本参数值时,请考虑同时调整max_parallel_maintenance_workers 配置参数和 max_parallel_workers_per_gather配置参数。请注意:当本参数值高于max_worker_processes参数值时不会有任何作用。因为,因为parallel workers是从max_worker_processes配置参数所建立的工作进程池中获取的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 - -|=== - - - -==== backend_flush_after - -[cols="136,387"] -|=== -h| 参数名称 h| backend_flush_after -| 数据类型 | integer -| 默认值 | 0,0表示禁用强制writeback -| 取值范围 | 0到256 -| 参数单位 | 8KB -| 参数含义 | 每当单个backend进程写入的数据超过本参数值时,尝试强制操作系统向底层存储发出这些写入操作。这样做将限制内核page cache中脏数据的数量,减少在检查点结束时发出fsync时,或者当操作系统在后台以更大的批写入数据时暂停的可能性。这通常会大大减少事务延迟,但也有一些情况,特别是在工作负载大于共享缓冲区,但小于操作系统page cache的情况下,性能可能会降低。此参数可能在某些平台下无效。如果指定该值时没有单位,则将其作为块,即源码中的符号常量BLCKSZ个字节,通常为8KB。如果BLCKSZ不是8KB,则最大值与之成比例缩放。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级别修改立即生效非session级修改reload生效 - -|=== - - - -==== old_snapshot_threshold - -[cols="136,387"] -|=== -h| 参数名称 h| old_snapshot_threshold -| 数据类型 | intger -| 默认值 | -1,-1代表禁用本特性,表示snapshot age 是无限制的。 -| 取值范围 | -1到86400 -| 参数单位 | 分钟 -| 参数含义 | 设置在使用snapshot时可以使用查询快照而不会出现"snapshot too old"错误的最短时间。处于dead状态的且超过本参数值的数据可以被vacuum掉。这有助于防止snapshot长期使用时出现表膨胀。为了防止由于清除快照可见的数据而产生不正确的结果,当快照早于本参数值并且快照用于读取自创建快照以来已修改的页面时,将生成一个错误。对生产环境有用的值可能从几个小时到几天不等。只允许使用较小的值(如0或1min),因为它们有时可能对测试有用。虽然允许高达60d的设置,但请注意,在许多工作负载中,在更短的时间内可能会出现极端膨胀或事务ID环绕(transaction ID wraparound)。启用本特性后,relation末尾释放的空间将无法释放给操作系统,因为这可能会删除检测"snapshot too old"条件所需的信息。分配给relation的所有空间都与该relation保持关联,以便仅在该relation中重用,除非显式释放(例如,使用VACUUM FULL)。此参数并不试图保证在任何特定情况下都会生成错误。事实上,如果正确的结果可以从一个已经物化的结果集中生成,则即使引用表中的底层行已被vacuum,也不会生成错误。某些表不能安全地提前vacuum,因此不受此设置的影响,例如系统目录(system catalogs)。对于这样的表,此设置既不会减少膨胀,也不会在扫描时产生"snapshot too old"错误的可能性。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -=== Replication / Standby Servers - -==== primary_conninfo - -[cols="136,387"] -|=== -h| 参数名称 h| primary_conninfo -| 数据类型 | string -| 默认值 | 空字符串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数值指定了连接到sending server的连接字符串(连接信息).在本连接字符串中缺少的option,PostgreSQL会到环境变量中取寻找。若是环境变量中也没有,那么就用默认值。连接字符串应该指定如下信息: Sending Server的主机名或者IP地址、 Sending Server的端口号(若是跟standby server端口号不同) Username(该用户在sending-server端有合适的权限) Password:请注意,密码可以在primary_conninfo中提供,也可以在standby server上的~/.pgpass文件中提供(此时,是用replication作为database name)。请不要在primary_conninfo中指定database的名字本参数仅能在postgresql.conf文件或者server command line中设置。当在wal receiver process正在运行的情况下修改本参数值,wal receiver process会被发信号通知关闭然后再以新参数值去启动,除非primary_conninfo配置参数为空字符串。当PostgreSQL没有处于standby mode的情况下,本参数无效。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== primary_slot_name - -[cols="136,387"] -|=== -h| 参数名称 h| primary_slot_name -| 数据类型 | string -| 默认值 | 空字符串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数指定了当要连接到sending-server端时,要使用的sending-server端的已经存在的replication slot,用来控制sending-server端的wal removal。本参数仅能在postgresql.conf文件或者server command line中设置。当在wal receiver process正在运行的情况下修改本参数值,wal receiver process会被发信号通知关闭然后再以新参数值去启动,本参数在如下情况下没有作用:PostgreSQL没有处于standby mode或者primary_conninfo参数值没有设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== promote_trigger_file - -[cols="136,387"] -|=== -h| 参数名称 h| promote_trigger_file -| 数据类型 | string -| 默认值 | 空字符串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数值指定了一个trigger file,该文件用于standby server结束recovery状态进行角色提升。本参数值没有设置时,你可以使用pg_ctl promote或者使用函数pg_promote()进行角色提升。本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== hot_standby - -[cols="136,387"] -|=== -h| 参数名称 h| hot_standby -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数控制standby server是否允许运行只读查询语句。本参数仅能在server start时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== max_standby_archive_delay - -[cols="136,387"] -|=== -h| 参数名称 h| max_standby_archive_delay -| 数据类型 | integer -| 默认值 | 30000 -| 取值范围 | -1到2147483647,-1表示允许standby server一直在等待直到冲突的query执行完毕。 -| 参数单位 | 毫秒 -| 参数含义 -a| 本参数为备库参数,本参数在sending-server端会被忽略。当hot standby在被启用的状态下,本参数决定了standby server在取消掉standby中运行的且与WAL日志应用有冲突的查询语句之前的等待时间。本参数适用于从wal 归档读取wal data的情况。当不指定单位时,本参数的单位是毫秒。本参数仅能在postgresql.conf文件或者server command line中设置。 + - + -本参数值与查询语句在取消之前可以运行的最长时间不同。相反,本参数值是:一旦standby server从sending-server收到wal data,所允许的应用wal data的最长时间。因此,如果一个查询在一个wal segment之前导致了显著的延迟,那么在standby server再次赶上之前,后续冲突查询的容忍时间(宽限时间)将少得多。 - -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - - -==== max_standby_streaming_delay - -[cols="136,387"] -|=== -h| 参数名称 h| max_standby_streaming_delay -| 数据类型 | integer -| 默认值 | 30000 -| 取值范围 | -1到2147483647,-1表示允许standby server一直在等待直到冲突的query执行完毕。 -| 参数单位 | 毫秒 -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。当hot standby在被启用的状态下,本参数决定了standby server在取消掉standby中运行的且与WAL日志应用有冲突的查询语句之前的等待时间。本参数适用于wal data通过流复制被接收的情况。当不指定单位时,本参数的单位是毫秒。本参数仅能在postgresql.conf文件或者server command line中设置。本参数值与查询语句在取消之前可以运行的最长时间不同。相反,本参数值是从主服务器接收到WAL数据后允许应用该数据的最长总时间,因此,如果一个查询导致了显著的延迟,那么在后备服务器再次赶上之前,后续冲突查询的容忍时间(宽限时间)将少得多 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== wal_receiver_create_temp_slot - -[cols="136,387"] -|=== -h| 参数名称 h| wal_receiver_create_temp_slot -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数用于指定当永久的复制槽没有配置(复制槽配置请见配置参数primary_slot_name)的情况下,wal receiver是否在远程PG Cluster上创建一个临时的复制槽。本参数仅能在postgresql.conf文件或者server command line中设置。当wal receiver进程正在运行的同时本参数被改变时,wal receiver进程会关闭并重启以读取到新值。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== wal_receiver_status_interval - -[cols="136,387"] -|=== -h| 参数名称 h| wal_receiver_status_interval -| 数据类型 | integer -| 默认值 | 10 -| 取值范围 | 0到2147483,0表示完全禁止状态更新。 -| 参数单位 | 秒 -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数指定了备库上的wal receiver 进程向 primary库或者sending-server库发送复制进度(replication progress)的最短时间频率。备库将报告它写到的wal的位置,它flush 到disk的位置以及它应用wal的位置。本参数值是两次报告之间的最大时间间隔。每次写入(write)或刷新(flush)位置更改时都会发送更新,或者至少与本参数指定的频率相同。因此,应用的位置可能稍微落后于真实位置。本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== hot_standby_feedback - -[cols="136,387"] -|=== -h| 参数名称 h| hot_standby_feedback -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。是否允许一个hot standby的备库发送关于正在备库执行的查询的feedback给primary库或者upstream库。本参数值可以消除由于cleanup records导致的query cancels,但是会导致primary库上发生膨胀。feedback信息的发送频率不会超过配置参数wal_receiver_status_interval。当是级联复制环境时,feedback会通过upstream(即:中间节点)会最终到达primary库。Standby节点除了向upstream反馈信息外,没有其他用途。本参数不会覆盖primary端的配置参数old_snapshot_threshold的行为。Standby端上超过primary端age阈值的snapshot会变为invalid,这导致standby端上的查询被取消。这是因为配置参数old_snapshot_threshold的目的是在时间上对dead row导致膨胀提供绝对的限制,否则会因为standby的配置违反该限制。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== wal_receiver_timeout - -[cols="136,387"] -|=== -h| 参数名称 h| wal_receiver_timeout -| 数据类型 | integer -| 默认值 | 60000 -| 取值范围 | 0到2147483647,0代表禁用本timeout检测机制。 -| 参数单位 | 毫秒 -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。当本备端与sending-server端或者primary端的inactive状态超过本参数值时,终止掉复制连接。本参数对receiving standby server检测primary node crash或者网络故障很有用。本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== wal_retrieve_retry_interval - -[cols="136,387"] -|=== -h| 参数名称 h| wal_retrieve_retry_interval -| 数据类型 | integer -| 默认值 | 5000 -| 取值范围 | 1到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。本参数控制standby server遇到从所有源头(streaming replication、本地pg_wal目录、WAL Archive位置)获取wal而获取不到时的等待时间。本参数对处于in recovery的节点需要控制等待新的wal data可用的时间很有用。比如,在archive recovery中,通过降低本参数值,在检测一个新wal log file时,可以使recovery更快响应。在一个wal file产生很少的PostgreSQL中,增加本参数值会减少访问wal archive的请求次数。这在那些基础设施的访问次数会被考虑在内的云环境中非常有用。本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== recovery_min_apply_delay - -[cols="136,387"] -|=== -h| 参数名称 h| recovery_min_apply_delay -| 数据类型 | integer -| 默认值 | 0,0代表无延迟。 -| 取值范围 | 0到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 本参数为备库参数,本参数在sending-server端会被忽略。默认情况下,standby server会及时的restore 来自于sending server端的WAL 记录。数据的延迟copy可能很有用,它提供了纠正数据丢失错误的机会。本参数值指定了允许你指定延迟recovery的时间长度。比如,你设置本参数值为5分钟,那么只有当standby端的系统时间比master端报告的提交时间至少晚5分钟时,standby端才会重放每个事物的提交。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -=== Query Tuning / Planner Cost Constants - -==== seq_page_cost - -[cols="136,387"] -|=== -h| 参数名称 h| seq_page_cost -| 数据类型 | real -| 默认值 | 1 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数设置了顺序读取磁盘上的page的成本。在table以及index上的表空间级别的同名本参数可以覆盖配置参数中的该参数值。增大本参数值会使索引扫描看起来相对更昂贵 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - - -==== random_page_cost - -[cols="136,387"] -|=== -h| 参数名称 h| random_page_cost -| 数据类型 | real -| 默认值 | 4 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数设置了非顺序读取磁盘上的page的成本。在table以及index上的表空间级别的同名本参数可以覆盖配置参数中的该参数值。相对于seq_page_cost减少本参数值会使PostgreSQL更倾向于使用索引扫描。随机访问机械硬盘要比四次顺序访问还要昂贵。但是,使用较低的默认值(4.0),因为大多数对磁盘的随机访问(如索引读取)都假定在cache中。默认值可以认为是将随机访问模型比顺序访问慢40倍,同时,期望90%的随机读取都是在cache中。如果您认为90%的缓存比率对于您的工作负载来说是一个不正确的假设,那么你可以增加本参数值以反映随机存储读取的真实成本。相应的,如果你的数据可能完全在cache中,比如在database大小小于服务器内存,减少本参数值是合适的。那些相对于顺序读具有低随机读成本的存储(比如固态驱动器),也可以使用较低本参数值(比如1.1) -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== cpu_tuple_cost - -[cols="136,387"] -|=== -h| 参数名称 h| cpu_tuple_cost -| 数据类型 | real -| 默认值 | 0.01 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数值设置在执行一个SQL语句时planner预计的处理每行数据的成本 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - - -==== cpu_index_tuple_cost - -[cols="136,387"] -|=== -h| 参数名称 h| cpu_index_tuple_cost -| 数据类型 | real -| 默认值 | 0.005 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数用于设置在索引扫描期间planner预计的处理每个index entry的成本。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== cpu_operator_cost - -[cols="136,387"] -|=== -h| 参数名称 h| cpu_operator_cost -| 数据类型 | real -| 默认值 | 0.0025 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数值设置在执行一个SQL语句时planner预计的处理执行的每个operator或者function的成本。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== parallel_setup_cost - -[cols="136,387"] -|=== -h| 参数名称 h| parallel_setup_cost -| 数据类型 | real -| 默认值 | 1000 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数值设置planner预估的启动parallel worker processes的成本。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - - -==== parallel_tuple_cost - -[cols="136,387"] -|=== -h| 参数名称 h| parallel_tuple_cost -| 数据类型 | real -| 默认值 | 0.1 -| 取值范围 | 0到1.79769e+308 -| 参数单位 | -| 参数含义 | 本参数值设置了从一个parallel worker进程将一个tuple传输到另外一个parallel worker进程的成本。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== min_parallel_table_scan_size - -[cols="136,387"] -|=== -h| 参数名称 h| min_parallel_table_scan_size -| 数据类型 | integer -| 默认值 | 1024,默认情况下是8MB -| 取值范围 | 0到715827882 -| 参数单位 | 8KB -| 参数含义 | 本参数设置了考虑使用parallel scan的table的数据(data)的最小大小,对于并行顺序扫描,table的数据(data)的最小大小总是等于table的大小。但是当index被用到时,table的数据(data)的最小大小通常会笑。如果本参数不带单位,取的是源码中符号常量BLCKSZ的值,通常为8KB。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== min_parallel_index_scan_size - -[cols="136,387"] -|=== -h| 参数名称 h| min_parallel_index_scan_size -| 数据类型 | integer -| 默认值 | 64,默认情况下是512KB -| 取值范围 | 0到715827882 -| 参数单位 | 8KB -| 参数含义 | 本参数设置了考虑使用parallel scan的index的数据(data)的最小大小,请注意:一个并行索引扫通常不会扫过整个index。本参数是planner认为扫描实际会涉及的页数,本参数也用来决定一个特定的索引是否可以参与并行vacuum。如果本参数不带单位,取的是源码中符号常量BLCKSZ的值。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== effective_cache_size - -[cols="136,387"] -|=== -h| 参数名称 h| effective_cache_size -| 数据类型 | integer -| 默认值 | 524288 -| 取值范围 | 1到2147483647 -| 参数单位 | 8KB -| 参数含义 | 本参数设置了planner对单个SQL语句可用的disk cache的有效大小。这被纳入使用索引的成本估算中。值越大,使用索引扫描的可能性越大;值越小,使用顺序扫描的可能性越大。设置本参数时,应该同时考虑PostgreSQL的shared buffers和kernel的page cache用于PostgreSQL数据文件的部分,虽然这两个位置都可能存在一些数据。另外,还要考虑在不同表上预计的并发SQL语句数量,因为他们必须共享可用空间。本参数不影响PostgreSQL分配的shared buffers大小,也不会保留kernel的page cache。它仅用于估算目的。系统也不坚定在两次查询之间数据扔保留在磁盘cache中。如果本参数不带单位,取的是源码中符号常量BLCKSZ的值。通常为8KB。如果BLCKSZ不是8KB,则默认值按照定比例缩放。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== jit_above_cost - -[cols="136,387"] -|=== -h| 参数名称 h| jit_above_cost -| 数据类型 | real -| 默认值 | 100000 -| 取值范围 | -1到1.79769e+308。-1表示禁用JIT编译 -| 参数单位 | -| 参数含义 | 当SQL语句的查询成本高于本参数值时,JIT编译会被激活,若是JIT编译被enable的情况下。执行JIT会消耗planning time但是可以加速查询执行。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - -==== jit_inline_above_cost - -[cols="136,387"] -|=== -h| 参数名称 h| jit_inline_above_cost -| 数据类型 | real -| 默认值 | 500000 -| 取值范围 | -1到1.79769e+308,-1表示禁用inline -| 参数单位 | -| 参数含义 | 当SQL语句的查询成本高于本参数值时,JIT编译会尝试inline functions and operators。Inlining会增加planning time,但是会提升执行速度。将本参数值设置为低于jit_above_cost是没有意义的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - -==== jit_optimize_above_cost - -[cols="136,387"] -|=== -h| 参数名称 h| jit_optimize_above_cost -| 数据类型 | real -| 默认值 | 500000 -| 取值范围 | -1到1.79769e+308,-1表示禁用expensive optimizations -| 参数单位 | -| 参数含义 | 当SQL语句的查询成本高于本参数值时,JIT编译会尝试进行expensive optimizations。这种优化会增加planning time,但是会提升执行速度。将本参数值设置为低于jit_above_cost是没有意义的,将本参数值设置为高于jit_inline_above_cost也是没有益处的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session修改立即生效;其他修改Reload即可生效 - -|=== - - - - - -=== autovacuum - -==== autovacuum - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 控制PostgreSQL是否允许autovacuum launcher daemon.autovacuum进程能正常工作的前提条件是配置参数track_counts设置为启用。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。即使本参数被禁用,若是需要防止事务id wraparound,PostgreSQL会启动autovacuum进程。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== log_autovacuum_min_duration - -[cols="136,387"] -|=== -h| 参数名称 h| log_autovacuum_min_duration -| 数据类型 | integer -| 默认值 | 0,0表示记录所有autovacuum操作到PostgreSQL运行日志中 -| 取值范围 | -1到2147483647,-1表示禁止autovacuum进程执行信息打印到PostgreSQL运行日志中。 -| 参数单位 | 毫秒 -| 参数含义 -a| 当autovacuum进程运行的时间长度大于等于本参数值时,autovacuum进程执行时的每个动作会被记录到PostgreSQL运行日志中。举例,若是本参数值设置为250ms,那么所有运行时间长度大于等于250ms的automatic vacuum 和analyze操作会记录到PostgreSQL运行日志中。当本参数值被设置为-1之外的值时,若是autovacumm由于冲突所或者并发dropped relation的原因被skipped掉,一条信息会打印到PostgreSQL运行日志中。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 + - -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== autovacuum_max_workers - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_max_workers -| 数据类型 | integer -| 默认值 | 3 -| 取值范围 | 1到262143 -| 参数单位 | -| 参数含义 | 本参数设置了同时可以运行的autovacuum worker进程的最大个数。本参数仅仅可以在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== autovacuum_naptime - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_naptime -| 数据类型 | integer -| 默认值 | 60 -| 取值范围 | 1·到2147483 -| 参数单位 | 秒 -| 参数含义 | 本参数指定了两次autovacuum进程运行的最小时间间隔。在每次autovacuum进程运行时,autovacuum守护进程检查数据库并针对需要的表发出vacuum和analyze命令。本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== autovacuum_vacuum_threshold - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_vacuum_threshold -| 数据类型 | integer -| 默认值 | 50 -| 取值范围 | 0到2147483647 -| 参数单位 | -| 参数含义 | 本参数用于设置作为vacuum操作候选表的条件,即:更新或者删除掉多少条记录可以被作为vacuum操作的候选表。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== autovacuum_vacuum_insert_threshold - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_vacuum_insert_threshold -| 数据类型 | integer -| 默认值 | 1000 -| 取值范围 | -1到2147483647,-1表示即使有本参数值数量的insert记录,autovacuum守护进程也不会针对该表触发vacuum操作。 -| 参数单位 | -| 参数含义 | 本参数用于设置作为vacuum操作候选表的条件,即:插入多少条记录可以触发针对该表的vacuum。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== autovacuum_analyze_threshold - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_analyze_threshold -| 数据类型 | integer -| 默认值 | 50 -| 取值范围 | 0到2147483647 -| 参数单位 | -| 参数含义 | 本参数用于设置作为analyze操作候选表的条件,即:插入、更新、删除多少条记录可以触发针对该表的analyze。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== autovacuum_vacuum_scale_factor - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_vacuum_scale_factor -| 数据类型 | real -| 默认值 | 0.2,0.2表示表大小的20% -| 取值范围 | 0到100 -| 参数单位 | -| 参数含义 | 本参数设置了表大小的一个比率,当决定一个表是否触发vacuum操作时,该比率会被配置参数autovacuum_vacuum_threshold考虑在内。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== autovacuum_vacuum_insert_scale_factor - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_vacuum_insert_scale_factor -| 数据类型 | real -| 默认值 | 0.2,0.2表示表大小的20% -| 取值范围 | 0到100 -| 参数单位 | -| 参数含义 | 本参数设置了表大小的一个比率,当决定一个表是否触发vacuum操作时,该比率会被配置参数autovacuum_vacuum_insert_threshold考虑在内。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== autovacuum_analyze_scale_factor - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_analyze_scale_factor -| 数据类型 | real -| 默认值 | 0.1 -| 取值范围 | 0到100 -| 参数单位 | -| 参数含义 | 本参数设置了表大小的一个比率,当决定一个表是否触发vacuum操作时,该比率会被配置参数autovacuum_analyze_threshold考虑在内。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== autovacuum_freeze_max_age - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_freeze_max_age -| 数据类型 | integer -| 默认值 | 200000000 -| 取值范围 | 100000到2000000000 -| 参数单位 | -| 参数含义 | 指定表的pg_class.relfrozenxid字段在强制执行vacuum操作以防止事务ID wraparound之前可以达到的最大年龄,请注意,即使autovacuum进程被禁用,PostgreSQL也会为了防止wraparound而启动autovacuum进程。Vacuum还允许从pg_xact子目录中删除旧文件,这就是为什么默认值是相对较低的2亿个事务的原因。此参数只能在服务器启动时设置,但是可以通过更改表存储参数来减少单个表的设置值。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== autovacuum_multixact_freeze_max_age - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_multixact_freeze_max_age -| 数据类型 | integer -| 默认值 | 400000000 -| 取值范围 | 10000到2000000000 -| 参数单位 | -| 参数含义 | 指定表的pg_class. relminmxid字段在强制执行vacuum操作以防止multixact ID wraparound之前可以达到的最大年龄,请注意,即使autovacuum进程被禁用,PostgreSQL也会为了防止wraparound而启动autovacuum进程。Vacuuming multixacts还允许从pg_multixact/members 和pg_multixact/offsets子目录中删除旧文件,这就是为什么默认值是相对较低的4亿个事务的原因。此参数只能在服务器启动时设置,但是可以通过更改表存储参数来减少单个表的设置值。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== autovacuum_vacuum_cost_delay - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_vacuum_cost_delay -| 数据类型 | real -| 默认值 | 2 -| 取值范围 | -1到100,-1表示使用配置参数vacuum_cost_delay的参数值。 -| 参数单位 | 毫秒 -| 参数含义 | 本参数是在autovacuum中vacuum操作用到的cost delay值。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== autovacuum_vacuum_cost_limit - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_vacuum_cost_limit -| 数据类型 | integer -| 默认值 | -1,-1表示使用配置参数vacuum_cost_limit的参数值。 -| 取值范围 | -1到10000 -| 参数单位 | -| 参数含义 | 本参数是在autovacuum中vacuum操作用到的cost limit值。请注意,如果有多个autovacuum workers,则本参数值按比例分布在运行中的autovacuum workers之间,以便每个autovacuum worker该值的总和不超过本参数值。本参数仅能在postgresql.conf文件或者server command line中设置。本参数可以在表级设置,在表级设置的优先级高于配置参数中的优先级。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - - - -=== Connections and Authentication / SSL - -==== ssl - -[cols="136,387"] -|=== -h| 参数名称 h| ssl -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 是否启用ssl连接 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_ca_file - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_ca_file -| 数据类型 | string -| 默认值 | 空字符串,空字符串表示没有CA File被加载,并且Client身份验证不会被执行。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数指定了包括SSL server certificate authority (CA)的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_cert_file - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_cert_file -| 数据类型 | string -| 默认值 | server.crt -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数指定了包括SSL server certificate的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_crl_file - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_crl_file -| 数据类型 | string -| 默认值 | 空字符串,空字符串表示没有CRL文件被加载。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数指定了包括SSL server certificate revocation list (CRL)的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== ssl_key_file - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_key_file -| 数据类型 | string -| 默认值 | server.key -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数指定了包括SSL server private key的文件名。本参数值是相对于data directory的相对路径,本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_ciphers - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_ciphers -| 数据类型 | string -| 默认值 | HIGH:MEDIUM:+3DES:!aNULL -| 取值范围 | -| 参数单位 | -| 参数含义 | 设置允许被SSL连接使用的SSL ciphers suites的清单。有关此设置的语法和支持值的列表,请参阅OpenSSL package中的ciphers manual page。有使用TLS版本1.2及更低版本的连接才会受到影响。当前没有控制TLS版本1.3连接使用的密码选择的设置。默认值通常是一个合理的选择,除非您有特定的安全要求。本参数仅能在postgresql.conf文件或者server command line中设置。下面解释一下默认值的含义: HIGH:使用HIGH Group的Cipher suites(例如,AES、Camellia、3DES)MEDIUM:使用MEDIUM Group的Cipher suites(例如,RC4, SEED) +3DES:针对HIGH的OpenSSL默认排序是存在问题的,因为3DES排序高于AES128.这是错误的,因为3DES比ASE128提供了少的安全性,并且3DES更慢。在所有除了HIGH和MEDIUM的ciphers外,+3DES进行了重新排序 !aNULL:禁用掉没有经过身份验证的匿名cipher suites。此类cipher suites易于遭受中间人攻击,因此不应该使用。可用的cipher suites在不同OpenSSL版本中的细节差异很大。使用操作系统命令openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'可以看到当前安装的OpenSSL库的实际细节。请注意:这个list会在运行时基于server key type被过滤 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_prefer_server_ciphers - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_prefer_server_ciphers -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 指定是否优先使用server端的SSL cipher,还是使用client端的。本参数仅能在postgresql.conf文件或者server command line中设置。更老的PostgreSQL版本没有本参数,更老的PostgreSQL版本总是优先使用client端的SSL cipher。本参数仅能在postgresql.conf文件或者server command line中设置。本参数的目的是用于向后兼容性。优先使用server端通常更好,因为更可能的是server端的配置是适当的 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_ecdh_curve - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_ecdh_curve -| 数据类型 | string -| 默认值 | prime256v1 -| 取值范围 | -| 参数单位 | -| 参数含义 | 指定要在ECDH密钥交换中使用的曲线的名称。它需要所有连接的客户端支持。它不需要与服务器的椭圆曲线密钥使用的曲线相同。本参数仅能在postgresql.conf文件或者server command line中设置。最常见曲线的OpenSSL名称是:prime256v1(NIST P-256)、secp384r1(NIST P-384)、secp521r1(NIST P-521)。可用曲线的完整列表可以通过操作系统命令openssl ecparam -list_curves显示。但并不是所有这些都可以在TLS中使用。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== ssl_min_protocol_version - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_min_protocol_version -| 数据类型 | enum -| 默认值 | TLSv1.2 -| 取值范围 | {TLSv1,TLSv1.1,TLSv1.2,TLSv1.3} -| 参数单位 | -| 参数含义 | 设置使用的SSL/TLS协议的最小版本。OpenSSLLibrary的更老的版本不支持所有的值。如果选择了不支持的设置,将引发错误。TLS 1.0之前的协议版本(即SSL version 2 和3)始终处于禁用状态。默认值是TLSv1.2,该默认值是满足本文档编写时的工业最佳实践。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_max_protocol_version - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_max_protocol_version -| 数据类型 | enum -| 默认值 | 空字符串,空字符串意味着运行任何的协议版本。 -| 取值范围 | {"",TLSv1,TLSv1.1,TLSv1.2,TLSv1.3} -| 参数单位 | -| 参数含义 | 设置使用的SSL/TLS协议的最大版本,这对测试或者有些组件使用新版本协议出现问题是有用的。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_dh_params_file - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_dh_params_file -| 数据类型 | string -| 默认值 | 空字符串,空字符串意味着使用默认DH参数编译。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 指定包含Diffie-Hellman参数的文件名,该参数用于所谓的临时DH SSL密码族。如果攻击者设法破解众所周知的编译在DH中的参数,那么使用自定义DH参数可以减少暴露。您可以使用操作系统命令openssl dhparam-out dhparams.pem 2048创建自己的DH参数文件本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== ssl_passphrase_command - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_passphrase_command -| 数据类型 | string -| 默认值 | 空字符串,空字符串表示使用内置的提示机制。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 设置需要获取用于解密SSL文件(如私钥)的密码短语时要调用的外部命令。命令必须将密码短语打印到标准输出,并以代码0退出。在参数值中,%p替换为提示字符串(写%%表示文本值%)。请注意提示字符串可能包含空格,因此请确保引用足够的引号。命令实际上不必提示用户输入密码短语,它可以从一个文件中读取它,从一个keychain工具中获取它,或者类似的。由用户来确定所选机制是否足够安全本参数仅能在postgresql.conf文件或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== ssl_passphrase_command_supports_reload - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_passphrase_command_supports_reload -| 数据类型 | bool -| 默认值 | off,off表示在reload时,ssl_passphrase_command配置参数会被忽略,并且在passphrase被需要时,SSL configuration不会被reload -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当一个key file需要passphrase时,本参数决定由ssl_passphrase_command配置参数设置的passphrase command在configuration reload期间是否被调用本参数仅能在postgresql.conf文件或者server command line中设置。该设置适用于需要TTY进行提示的命令,该命令在PostgreSQL运行时可能不可用。例如,如果密码短语是从文件获取的,则将本参数设置为on可能是合适的 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -=== Resource Usage / Memory - -==== shared_buffers - -[cols="136,387"] -|=== -h| 参数名称 h| shared_buffers -| 数据类型 | integer -| 默认值 | 16384,即:128MB -| 取值范围 | 16到1073741823 -| 参数单位 | 8KB,若是指定本参数值时不带单位,则取自源码中的符号常量BLCKSZ大小,默认是8KB。非默认的BLCKSZ大小会改变本参数的最小值。本参数值仅仅能在PostgreSQL启动时设置。建议将OS物理内存的25%分配给本参数值。因为PostgreSQL依赖于操作系统的cache(也就是文件系统的page cache),因此将超过40%的RAM分配给本参数值的情况不太可能比分配较小的缓冲区效果更好。较大的本参数值通常需要相应的增加max_wal_size, 以便在较长时间内分散写入大量新数据或更改数据的过程。 -| 参数含义 | -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== huge_pages - -[cols="136,387"] -|=== -h| 参数名称 h| huge_pages -| 数据类型 | enum -| 默认值 | try,try的含义是PostgreSQL会尝试使用huge pages,如果尝试失败将返回默认值。on的含义是请求huge pages失败将阻止PostgreSQL启动,off的含义是不会启用huge pages。目前,本参数值仅支持Linux和Windows平台。当在其他平台下本参数值设置为try时,本参数值会被忽略。 huge pages的使用导致了更小的page tables以及耗费在内存管理方面的更小的CPU时间,这提高了性能。在Windows平台上,huge pages被称之为large pages。开启large pages的步骤: 0.安装PostgreSQL 数据库 1.关闭windows uac控制面板--系统和安全--更改用户账户控制设置--改为'从不通知',点击确定。 2.在windows组策略编辑器,赋予运行PostgreSQL的操作系统用户'锁定内存页'的权力(Lock Pages in Memory)计算机配置\Windows 设置\安全设置\本地策略\用户权利分配\下的"锁定内存页"这个策略。 3.将windows服务中的postgresql-x64-11这个服务改为手动启动。 4.重新启动OS 5.设置postgresql.conf的配置参数huge_pages=on 6.设置postgresql.conf的配置参数shared_buffers=2048MB 7.以管理员身份打开cmd窗口,执行pg_ctl start -D e:\postgresql\11\data启动PostgreSQL 8.验证是否启用请注意:当启用large pages时,不能用Windows服务中的PostgreSQL服务启动postgresql。请注意,本参数设置仅影响main shared memory area. Linux、FreeBSD和Illumos等操作系统也可以自动使用huge pages(也称为"super" pages 或者 "large" pages)进行正常内存分配,而无需PostgreSQL的显式请求。在Linux上,这被称为"transparent huge pages"(THP)。众所周知,对于某些Linux版本的某些用户来说,该特性会导致PostgreSQL的性能下降,因此目前不鼓励使用它(与显式使用huge_pages)。 -| 取值范围 | {off,on,try} -| 参数单位 | -| 参数含义 | 控制shared_buffers是否使用huge pages。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== temp_buffers - -[cols="136,387"] -|=== -h| 参数名称 h| temp_buffers -| 数据类型 | integer -| 默认值 | 1024 -| 取值范围 | 100到1073741823 -| 参数单位 | 8KB -| 参数含义 | 设置每个session使用的temporary buffers的最大值,供临时表使用。指定本参数值时若是不带单位,以blocks为单位,取自源码中符号常量BLCKSZ,通常为8KB。若是BLCKSZ不为8KB,则本参数按照等比例变化。本参数值可以在单个session中更改,但只能在session中首次使用临时表之前更改;随后更改该值的尝试不会对该session产生任何影响。session将根据需要分配临时缓冲区,直到到达本参数值指定的限制。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== max_prepared_transactions - -[cols="136,387"] -|=== -h| 参数名称 h| max_prepared_transactions -| 数据类型 | integer -| 默认值 | 100 -| 取值范围 | 0到262143,0代表禁用prepared-transaction特性。 -| 参数单位 | 设置同时可以处于prepared状态的最大的事务个数。若是你不打算使用prepared transaction,请将本参数值设置为零以防止偶然建立prepared transaction。如果你使用prepared transaction,你可能希望本参数值与max_connections一样大。这样每个session都可以有一个prepared transaction pending。当有流复制环境是,你必须确保在备库上该参数值要大于等于在主库上的该参数值,否则,不能在备库上运行查询语句。 -| 参数含义 | -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== work_mem - -[cols="136,387"] -|=== -h| 参数名称 h| work_mem -| 数据类型 | integer -| 默认值 | 4096 -| 取值范围 | 64到2147483647 -| 参数单位 | KB -| 参数含义 -a| 在写入磁盘临时文件之前,被查询操作(比如sort或者hash table)使用的内存最大值。若是指定本参数值时不带单位,那么是以KB为单位。请注意,针对复杂的查询,sort或者hash操作可能以parallel去运行,在开始向磁盘的临时文件写入数据之前,每个操作被允许最多使用本参数值对应的内存大小。同事,正在运行的多个session会并发执行这些操作。因此,使用的所有内存可以是本参数值的若干倍,当设置本参数值时,需要明确记住这个事实。Sort操作被如下使用:order by、distinct、merge joins;hash table被如下使用:hash joins、hash-base aggregation、在in子句中的基于hash的处理。 + -基于哈希的操作通常比基于排序的等效操作对内存可用性更加敏感。哈希表可用的内存是通过work_mem*hash_mem_multiplier来计算的。这使得基于哈希的操作使用的内存量可能超过通常的work_mem数量。 - -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级修改立即生效其他修改Reload即可生效 - -|=== - - - -==== hash_mem_multiplier - -[cols="136,387"] -|=== -h| 参数名称 h| hash_mem_multiplier -| 数据类型 | real -| 默认值 | 1 -| 取值范围 | 1到1000 -| 参数单位 | -| 参数含义 | 本参数值用于计算hash-base操作可以使用的最大内存。该最大内存是由work_mem*hash_mem_multiplier决定的。在经常有大量查询操作的环境中,考虑增加本参数值,特别是当简单的增加work_mem会导致内存压力时(内存压力通常以间歇性内存不足的形式出现)。设置我1.5或者2.0可能对混合负载有效。在work_mem参数值已经增加到40MB或者更多时,2.0-8.0或者更大范文内的更高设置可能会有效。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级修改立即生效其他修改Reload即可生效 - -|=== - - - -==== maintenance_work_mem - -[cols="136,387"] -|=== -h| 参数名称 h| maintenance_work_mem -| 数据类型 | integer -| 默认值 | 65536 -| 取值范围 | 1024到2147483647 -| 参数单位 | KB -| 参数含义 | 指定用于维护操作(maintenance operations)的最大可用的内存。维护操作包括:vacuum,create index, ALTER TABLE ADD FOREIGN KEY.若指定本参数值时不带单位,那默认的单位是KB。较大的本参数值有助于提升vacuuming以及restore database时的性能。请注意:当autovacuum运行时,最多有本参数值\* autovacuum_max_workers的内存被使用,因此,请小心设置本参数值,不要设置太高。可以使用配置参数autovacuum_work_mem来单独控制autovacuum时的内存使用。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Session级修改立即生效其他修改Reload即可生效 - -|=== - - - - -==== autovacuum_work_mem - -[cols="136,387"] -|=== -h| 参数名称 h| autovacuum_work_mem -| 数据类型 | integer -| 默认值 | -1,-1表示使用maintenance_work_mem配置参数值 -| 取值范围 | -1到2147483647 -| 参数单位 | KB -| 参数含义 | 本参数用于设置每个autovacuum worker process使用的最大内存大小。若指定本参数值时不带单位,那默认的单位是KB。当vacuum的行为运行在其他上下文环境中时,本参数不生效。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== logical_decoding_work_mem - -[cols="136,387"] -|=== -h| 参数名称 h| logical_decoding_work_mem -| 数据类型 | integer -| 默认值 | 65536,即64MB -| 取值范围 | 64到2147483647 -| 参数单位 | KB -| 参数含义 | 本参数用于设置在解码后的变化写入到本地disk之前,逻辑解码使用的最大内存大小。本参数限制了逻辑流复制连接使用的内存大小。由于每个复制连接只使用此大小的单个buffer,并且通常不会有许多这样的连接(受到max_wal_senders配置参数限制)。因此可以将本参数值设置为比work_mem高,从而减少写入磁盘的解码变化量。 -| 是否可session级修改 | 是 -| 修改后何时生效 | session级修改立即生效其他修改Reload即可生效 - -|=== - - -==== max_stack_depth - -[cols="136,387"] -|=== -h| 参数名称 h| max_stack_depth -| 数据类型 | integer -| 默认值 | 2048 -| 取值范围 | 100到2147483647 -| 参数单位 | KB -| 参数含义 | 本参数值指定PostgreSQL execution stack的最大安全深度。本参数值的理想设置是kernel执行的实际stack size limit(可以用操作系统命令ulimit -s或者ulimit -a进行查看)减去大约1MB的安全裕度。所以需要安全裕度,是因为并不是在服务器中的每个例程中都检查stack depth,而是只在可能递归的关键例程中检查stack depth。若指定本参数值时不带单位,那默认的单位是KB。本参数默认值为2MB,该值相对保守,不太可能有crash的风险。但是,它可能太小,无法执行复杂的函数。只有superuser才能更改此设置。本参数值设置为高于kernel的限制将意味着一个失控的递归函数可以crash掉一个单独的backend process。在PostgreSQL可以确定内核限制的平台上,服务器将不允许把本参数值设置为不安全的值。但是并非所有平台都提供该信息。因此建议谨慎选择本参数值。 -| 是否可session级修改 | 是,仅限于superuser可进行session级修改。 -| 修改后何时生效 | session级修改立即生效其他修改Reload即可生效 - -|=== - - -==== shared_memory_type - -[cols="136,387"] -|=== -h| 参数名称 h| shared_memory_type -| 数据类型 | enum -| 默认值 | mmap -| 取值范围 | {sysv,mmap,windows}, sysv,mmap适用于Linux平台;windows适用于windows平台。 -| 参数单位 | -| 参数含义 | 指定shared memory的实现方式。 mmap是指使用mmap分配的anonymous shared memory; sysv是指通过shmget分配的 System V shared memory ;windows是指Windows shared memory。通常不鼓励使用sysv值,因为它通常需要非默认的内核设置来允许较大的分配,而sysv值在任何平台上都不是默认的。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== dynamic_shared_memory_type - -[cols="136,387"] -|=== -h| 参数名称 h| dynamic_shared_memory_type -| 数据类型 | enum -| 默认值 | posix -| 取值范围 | {posix,sysv,mmap,windows} 其中posix,sysv,mmap适用于Linux平台;windows适用于Windows平台 -| 参数单位 | -| 参数含义 | 指定PostgreSQL使用的dynamic shared memory的实现方式。 posix是指使用shm_open分配的POSIX shared memory; sysv是指使用shmget分配的System V shared memory; windows是指Windows shared memory; mmap是指使用存在的data directory中的memory-mapped files模拟的shared memory。通常不鼓励使用mmap值,这在任何平台上都不是默认值,因为操作系统可能会反复将修改过的页面写回磁盘,从而增加系统I/O负载;但是,当pg_dynshmem子目录存储在RAM磁盘上,或者其他共享内存工具不可用时,它可能对调试有用。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -=== Reporting and Logging / Where to Log - -==== log_destination - -[cols="136,387"] -|=== -h| 参数名称 h| log_destination -| 数据类型 | string -| 默认值 | stderr -| 取值范围 | Linux平台下的取值有:stderr、csvlog、syslogWindows平台下的取值有:stderr、csvlog、eventlog -| 参数单位 | -| 参数含义 -a| PostgreSQL支持多种记录PostgreSQL消息的方法。包括stderr、csvlog、syslog,在windows平台下还有eventlog。当本参数值是一个列表时,请使用逗号分隔每个值。本参数仅能在postgresql.conf中设置或者在server command line中设置。当本参数值中含有csvlog时,日志条目被输出为csv格式(comma separated value),这便于程序加载log内容。需要将配置参数logging_collector设置为on才可以生成csv格式的log。当本参数值含有stderr或者csvlog时,current_logfiles文件被建立用来记录当前正在被logging collector进程使用的logfile的位置。这提供了一个查找当前正在使用的log的简便方法。 current_logfiles文件的内容如下(举例): stderr log/postgresql.log csvlog log/postgresql.csv当新的logfile被建立或者log_destination被加载时,current_logfiles文件会被重建。当本参数值不含有stderr或者csvlog,以及logging collector被禁用时,current_logfiles文件会被删除掉。 + - -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== logging_collector - -[cols="136,387"] -|=== -h| 参数名称 h| logging_collector -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 本参数会启用logging collector进程,该进程是一个background process,用来捕获发送到stderr的log messages并重定向这些信息到log file中。这个方法比记录到syslog中要有用。因为有些类型的messages不会显示在syslog的输出中(一个例子是dynamic-linker failure messages,另外一个是脚本产生的error messages,比如archive_command).本参数仅仅可以在PostgreSQL启动时设置。logging collector设计为永不丢失消息。这意味着在负载极高的情况下,当logging collector落后时,服务器进程可能会在尝试发送额外日志消息时被阻止。相反,syslog更喜欢在无法写入消息时丢弃消息,这意味着在这种情况下它可能无法记录某些消息,但不会阻塞系统的其余部分。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - -==== log_directory - -[cols="136,387"] -|=== -h| 参数名称 h| log_directory -| 数据类型 | string -| 默认值 | log -| 取值范围 | -| 参数单位 | -| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数用于确定log file被建立在哪个目录下。本参数值可以是绝对路径,也可以是相对于data directory的相对路径。本参数仅能在postgresql.conf中设置或者在server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== log_filename - -[cols="136,387"] -|=== -h| 参数名称 h| log_filename -| 数据类型 | string -| 默认值 | postgresql-%Y-%m-%d_%H%M%S.log -| 取值范围 | -| 参数单位 | -| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数用于确定所创建的log file的文件名。本参数值被视为strftime pattern,因此可以使用%-escapes指定随时间变化的文件名(请注意,如果存在任何依赖于时区的%-转义,则计算将在配置参数log_timezone指定的时区中完成。)支持的%-转义与开放组的strftime规范中列出的那些类似。请注意,系统的strftime不是直接使用的,因此特定于平台(非标准)的扩展不起作用。如果本参数值中不带转义符,你应使用log rotation 工具以避免日志填充满整个磁盘。若是在log_destination配置参数中启用了csv格式的输出,那么会将.CSV附加到带时间戳的日志文件名. 以创建CSV格式输出的文件名(如果日志文件名以.log结尾,则替换后缀。)本参数仅能在postgresql.conf中设置或者在server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - - -==== log_file_mode - -[cols="136,387"] -|=== -h| 参数名称 h| log_file_mode -| 数据类型 | string -| 默认值 | 0600, 0600表示只有PostgreSQL的owner可以读取或者写入log files -| 取值范围 | 0到511 -| 参数单位 | -| 参数含义 | 在logging_collector配置参数设置为on的情况下,在Unix/Linux系统中本参数用于设置logfile的权限(在Microsoft Windows平台上,本参数被忽略)。 参数值应该是以chmod和umask系统调用接受的格式指定的数字模式。 0600表示只有PostgreSQL的owner可以读取或者写入log files.其他通常有用的设置是0640,0640允许owner的group的成员去读取log files。请注意,要使用这样的设置,您需要更改log_directory目录以将文件存储在data directory目录之外的某个位置。无论如何,让日志文件具有广泛的可读性是不明智的,因为它们可能包含敏感数据本参数仅能在postgresql.conf中设置或者在server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== log_rotation_age - -[cols="136,387"] -|=== -h| 参数名称 h| log_rotation_age -| 数据类型 | integer -| 默认值 | 1440 -| 取值范围 | 0到35791394,0表示禁用掉基于time的new log file创建。 -| 参数单位 | 分钟 -| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数确定了一个单独的log file能使用的最长时间。在将此数量的数据发送到日志文件后,将创建一个新的日志文件。若指定本参数值时不带单位,那默认的单位是分钟。默认值是24小时。本参数仅能在postgresql.conf中设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== log_rotation_size - -[cols="136,387"] -|=== -h| 参数名称 h| log_rotation_size -| 数据类型 | integer -| 默认值 | 10240 -| 取值范围 | 0到2097151,0表示禁用掉基于size的new log file创建 -| 参数单位 | -| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数确定了一个单独的log file能使用的最大大小。将此数量的数据发送到日志文件后,将创建一个新的日志文件。若指定本参数值时不带单位,那默认的单位是KB。默认值是10MB。本参数仅能在postgresql.conf中设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== log_truncate_on_rotation - -[cols="136,387"] -|=== -h| 参数名称 h| log_truncate_on_rotation -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 在logging_collector配置参数设置为on的情况下,本参数将导致PostgreSQL截断(覆盖)而不是附加到任何同名的现有日志文件。请注意,只有在由于基于time(时间)的rotate而打开新文件时才会发生截断,而不是在服务器启动或基于size的rotate期间。当本参数值设置off时,在所有情况下都会附加到已有文件中。将本参数值与日志文件名(如postgresql-%H.log)结合使用会生成24个每小时一次的日志文件,然后周期性地覆盖它们。本参数仅能在postgresql.conf中设置或者在server command line中设置。举例:为了达到如下目的:保留7天的log,每天的log文件的文件名是server_log.Mon,server_log.Tue等等,然后用本周的log自动覆盖上周的log。该需求需要设置log_filename为server_log.%a, log_truncate_on_rotation为on,log_rotation_age为1440举例:为了达到如下目的:保留24小时的log,每小时一个log file,如果log file大小超过1GB时也需要很快进行rotate。该需求需要设置log_filename为server_log.%H%M, log_truncate_on_rotation为on,log_rotation_age为60,log_rotation_size为1000000.在log_filename中包括%M允许任何基于size的且可能在同一个小时内有多个log file的rotate -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== syslog_facility - -[cols="136,387"] -|=== -h| 参数名称 h| syslog_facility -| 数据类型 | enum -| 默认值 | local0 -| 取值范围 | {local0,local1,local2,local3,local4,local5,local6,local7} -| 参数单位 | -| 参数含义 | 当配置参数log_destination被设置为syslog时,本参数用于确定使用的syslog facility。本参数仅能在postgresql.conf中设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== syslog_ident - -[cols="136,387"] -|=== -h| 参数名称 h| syslog_ident -| 数据类型 | string -| 默认值 | postgres -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数设置了在操作系统syslog日志中用于标识PostgreSQL消息的关键字。本参数仅仅适用于Linux平台,因为只有Linux平台才有syslog.虽然在Windows平台下也能修改本参数值,但是该修改没有任何意义。本参数仅能在postgresql.conf中设置或者在server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== syslog_sequence_numbers - -[cols="136,387"] -|=== -h| 参数名称 h| syslog_sequence_numbers -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 -a| 当配置参数log_destination被设置为syslog并且本参数值设置为on时,PostgreSQL会在每条消息的前面加一个依次增大的顺序号,同一个命令的多条输出会以[2-1],[2-2]之类的次序标出:(如下截取自linux的/var/log/messages)image::PostgreSQL13%E6%96%87%E6%A1%A3%E4%B9%8BPG%E5%8F%82%E6%95%B0%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C_html_b376f05a85e6462b.png["",357,140] + -本参数设置为off的效果如下:(如下截取自linux的/var/log/messages)image::PostgreSQL13%E6%96%87%E6%A1%A3%E4%B9%8BPG%E5%8F%82%E6%95%B0%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C_html_340e68e94edcda77.png["",361,131]本参数仅能在postgresql.conf中设置或者在server command line中设置。 + - -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== syslog_split_messages - -[cols="136,387"] -|=== -h| 参数名称 h| syslog_split_messages -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当配置参数log_destination被设置为syslog并且本参数值设置为on时,消息被按行分割,长的行会被分割,以便填满1024Bytes,这是传统syslog实现上的典型大小限制。当设置为off时,PostgreSQL日志消息将按照原样传递给syslog服务,并由syslog服务来处理可能非常庞大的消息。如果syslog最终记录到一个文本文件中,那么无论哪种方式,效果都是一样的,最好保持该设置处于on状态,因为大多数syslog实现要么不能处理大型消息,要么需要专门配置来处理它们。但是,如果syslog最终要写入其他介质,那么将消息逻辑地保持在一起可能是必要的或更有用的。本参数仅能在postgresql.conf中设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== event_source - -[cols="136,387"] -|=== -h| 参数名称 h| event_source -| 数据类型 | bool -| 默认值 | PostgreSQL -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数仅仅适用于Windows平台,因为只有Windows平台才有event log,本参数值会体现在Windows操作系统的事件查看器的"Windows日志"-"应用程序"-"来源"一列。虽然在Linux平台下也能修改本参数值,但是该修改没有任何意义。本参数仅能在postgresql.conf中设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -=== Preset Options - -==== block_size - -[cols="136,387"] -|=== -h| 参数名称 h| block_size -| 数据类型 | Integer -| 默认值 | 8192 -| 取值范围 | 8192 -| 参数单位 | -| 参数含义 | 数据库使用的disk block的大小,该参数也影响其他的配置参数,比如shared_buffers,该参数通过编译时./configure命令的--with-blocksize选项确定 -| 是否可session级修改 | 否,不可修改。 -| 修改后何时生效 | 不可修改。 - -|=== - - -==== data_checksums - -[cols="136,387"] -|=== -h| 参数名称 h| data_checksums -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 显示data checksums是否启用。本参数值通过initdb时的-k选项或者--data-checksums选项确定。本参数值可以使用pg_checksums进行修改,pg_checksums命令具体用法请见pg_checksums --help -| 是否可session级修改 | 否 -| 修改后何时生效 | 立即生效 - -|=== - - -==== data_directory_mode - -[cols="136,387"] -|=== -h| 参数名称 h| data_directory_mode -| 数据类型 | integer -| 默认值 | 0700 -| 取值范围 | 0到511 -| 参数单位 | -| 参数含义 | 在linux/unix中显示data_directory参数值对应的目录的权限;在windows系统中,本参数值总是显示为0700 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改 - -|=== - - -==== debug_assertions - -[cols="136,387"] -|=== -h| 参数名称 h| debug_assertions -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 显示PG在编译时是否启用assertion。本参数值通过编译时./configure命令的--enable-cassert选项确定。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改 - -|=== - - -==== integer_datetimes - -[cols="136,387"] -|=== -h| 参数名称 h| integer_datetimes -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 支持64bit整型的date和time。本参数通过编译时./configure命令确定。注意:configure的--disable-integer-datetimes选项,是"obsolete option, no longer supported" -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改 - -|=== - - -==== lc_collate - -[cols="136,387"] -|=== -h| 参数名称 h| lc_collate -| 数据类型 | string -| 默认值 | en_US.UTF-8(根据操作系统环境变量不同而不同,见os命令locale的返回结果) -| 取值范围 | -| 参数单位 | -| 参数含义 | 字符串的排序规则(String sort order)。本参数值通过initdb时的--lc-collate确定,若是不指定该选项,initdb会取环境变量 -| 是否可session级修改 | 否 -| 修改后何时生效 | 在PG Database级别确定,确定后不可修改,只读参数 - -|=== - - - -==== lc_ctype - -[cols="136,387"] -|=== -h| 参数名称 h| lc_ctype -| 数据类型 | string -| 默认值 | en_US.UTF-8(根据操作系统环境变量不同而不同,见os命令locale的返回结果) -| 取值范围 | -| 参数单位 | -| 参数含义 | 字符分类(是否区分大小写,什么是字符等)。本参数通过initdb时的--lc-ctype确定,若是不指定该选项,initdb会取环境变量 -| 是否可session级修改 | 否 -| 修改后何时生效 | 在PG Database级别确定,确定后不可修改,只读参数。 - -|=== - - - -==== max_function_args - -[cols="136,387"] -|=== -h| 参数名称 h| max_function_args -| 数据类型 | integer -| 默认值 | 100 -| 取值范围 | -| 参数单位 | -| 参数含义 | 返回函数参数的最大个数, -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== max_identifier_length - -[cols="136,387"] -|=== -h| 参数名称 h| max_identifier_length -| 数据类型 | integer -| 默认值 | 63 -| 取值范围 | -| 参数单位 | -| 参数含义 | 返回标识符的最大长度 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== max_index_keys - -[cols="136,387"] -|=== -h| 参数名称 h| max_index_keys -| 数据类型 | integer -| 默认值 | 32 -| 取值范围 | -| 参数单位 | -| 参数含义 | 一个index最多能含有多少列 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== segment_size - -[cols="136,387"] -|=== -h| 参数名称 h| segment_size -| 数据类型 | integer -| 默认值 | 131072 -| 取值范围 | -| 参数单位 | 8KB -| 参数含义 | 本参数值确定了每个disk file中的page的数量。本参数值通过编译时./configure命令执行的--with-segsize=SEGSIZE选项确定。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== server_encoding - -[cols="136,387"] -|=== -h| 参数名称 h| server_encoding -| 数据类型 | string -| 默认值 | UTF8 -| 取值范围 | -| 参数单位 | -| 参数含义 | 数据库的编码 (即:字符集),本参数通过initdb时的-E或者--encoding参数确定。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== server_version - -[cols="136,387"] -|=== -h| 参数名称 h| server_version -| 数据类型 | string -| 默认值 | 默认值是当前PostgreSQL版本,格式为主版本号.次版本号 -| 取值范围 | -| 参数单位 | -| 参数含义 | 返回PostgreSQL的版本号 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== server_version_num - -[cols="136,387"] -|=== -h| 参数名称 h| server_version_num -| 数据类型 | integer -| 默认值 | 130000,返回主版本号 -| 取值范围 | -| 参数单位 | -| 参数含义 | 返回PostgreSQL的版本号 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== ssl_library - -[cols="136,387"] -|=== -h| 参数名称 h| ssl_library -| 数据类型 | string -| 默认值 | OpenSSL -| 取值范围 | -| 参数单位 | -| 参数含义 | 返回PostgreSQL软件编译时的SSL library。本参数值通过./configure的--with-openssl选项确定。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - -==== wal_block_size - -[cols="136,387"] -|=== -h| 参数名称 h| wal_block_size -| 数据类型 | integer -| 默认值 | 8192 -| 取值范围 | -| 参数单位 | -| 参数含义 | 返回WAL中disk block的大小。本参数值通过./configure的--with-wal-blocksize选项确定。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -==== wal_segment_size - -[cols="136,387"] -|=== -h| 参数名称 h| wal_segment_size -| 数据类型 | string -| 默认值 | 16777216 -| 取值范围 | -| 参数单位 | Byte -| 参数含义 | 返回WAL Segments的大小。本参数值通过initdb的--wal-segsize选项确定。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 不可修改,只读参数 - -|=== - - - -=== Client Connection Defaults / Locale and Formatting - -==== DateStyle - -[cols="136,387"] -|=== -h| 参数名称 h| DateStyle -| 数据类型 | string -| 默认值 | ISO, MDY -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数用于设置date和time的显示格式,以及解释不明确日期输入值的规则。由于历史原因,本参数值包括两个部分:第一部分:output format specification (ISO, Postgres, SQL, or German);第二部分:the input/output specification for year/month/day ordering (DMY, MDY, or YMD)。上述两者可以单独设置,也可以一起设置。请注意,关键词Euro和European是DMY的同义词;关键词US和NonEnro是MDY的同义词;Initdb生成配置参数文件时,会根据os的locale命令的lc_time结果来设置本参数值。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== IntervalStyle - -[cols="136,387"] -|=== -h| 参数名称 h| IntervalStyle -| 数据类型 | enum -| 默认值 | postgres -| 取值范围 | postgres,postgres_verbose,sql_standard,iso_8601 -| 参数单位 | -| 参数含义 | 本参数用于设置interval values的显示格式。参数值sql_standard表示产生匹配SQL标准interval常量的输出;参数值postgres表示当DateStyle参数值设置为ISO时,产生匹配PostgreSQL8.4版本之前的输出;参数值postgres_verbose表示当DateStyle参数值设置为非ISO时,表示当DateStyle参数值设置为ISO时,参数值iso_8601表示产生匹配在ISO 8601标准的4.4.3.2章节中定义的时间间隔带"format with designators"匹配的输出。本参数值也会影响模糊的interval输入的解释。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== TimeZone - -[cols="136,387"] -|=== -h| 参数名称 h| TimeZone -| 数据类型 | String -| 默认值 | 内置的默认值是GMT,一般情况下,本参数值依据initdb时的操作系统时区而定,即:initdb时的操作系统时区是什么,initdb后postgresql.conf中的本参数值就是什么。注意:CentoOS7/8的操作系统当前时区请使用操作系统命令timedatectl status查询。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 为显示以及翻译timestamp设置时区。可用的时区名称可以通过pg_timezone_names视图进行查询。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== timezone_abbreviations - -[cols="136,387"] -|=== -h| 参数名称 h| timezone_abbreviations -| 数据类型 | string -| 默认值 | Default -| 取值范围 | -| 参数单位 | -| 参数含义 | 被PostgreSQL接受的datetime输入的时区简写。默认值Default在世界上大部分地区都有效。另外的有效值是Australia和India。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== extra_float_digits - -[cols="136,387"] -|=== -h| 参数名称 h| extra_float_digits -| 数据类型 | string -| 默认值 | 1 -| 取值范围 | -15到3 -| 参数单位 | -| 参数含义 | 设置浮点值(float4,float8以及地理数据类型)的显示的位数。extra_float_digits大于0时,原有精度最多增加3位, 小于0时, 精度最多减掉相应数值, 等于0时, float4精度为6位, float8精度为15 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== client_encoding - -[cols="136,387"] -|=== -h| 参数名称 h| client_encoding -| 数据类型 | string -| 默认值 | 取自Database encoding -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数用于设置客户端字符集。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效。 - -|=== - - - -==== lc_messages - -[cols="136,387"] -|=== -h| 参数名称 h| lc_messages -| 数据类型 | string -| 默认值 | 与系统locale设置有关 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数用于设置消息显示的语言。可接受的参数值是跟系统相关的。本参数值会影响发送到服务器运行日志以及客户端的消息,不正确的本参数值会影响服务器日志的可读性。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效,且只有超级用户才能更改此设置。 - -|=== - - - -==== lc_monetary - -[cols="136,387"] -|=== -h| 参数名称 h| lc_monetary -| 数据类型 | string -| 默认值 | 与系统locale设置有关 -| 取值范围 | -| 参数单位 | -| 参数含义 | 设置用于格式化货币金额的语言环境,可接受的参数值是跟系统相关的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== lc_numeric - -[cols="136,387"] -|=== -h| 参数名称 h| lc_numeric -| 数据类型 | string -| 默认值 | 与系统locale设置有关 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数值用于设置格式化数字。可接受的参数值是跟系统相关的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== lc_time - -[cols="136,387"] -|=== -h| 参数名称 h| lc_time -| 数据类型 | string -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数值用于设置格式化的日期和时间。可接受的参数值是跟系统相关的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== default_text_search_config - -[cols="136,387"] -|=== -h| 参数名称 h| default_text_search_config -| 数据类型 | string -| 默认值 | 依据initdb时的lc_ctype对应的设置而定 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数值用于设置当全文检索函数中不明确指定配置项时所用的全文检索配置项。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -=== Write-Ahead Log / Settings - -==== wal_level - -[cols="136,387"] -|=== -h| 参数名称 h| wal_level -| 数据类型 | enum -| 默认值 | replica -| 取值范围 | {minimal,replica,logical} -| 参数单位 | -| 参数含义 -a| 本参数定义了有多少信息被写入到WAL日志中。参数值replica表示WAL日志中写入了足够的信息以支持WAL Archiving和replicatin(包括在standby server上的read-only查询),参数值minimal表示WAL日志中移除了除了需要从crash或者immeidate shutdown进行recovery之外的信息。参数值logical添加了必要信息以支持逻辑解码(logical decoding),在本参数使用logical参数值的情况下,会使得WAL日志的数量变大,特别是很多表被配置为replica identity full并且很多delete和update被执行的情况下。本参数仅仅可以在PostgreSQL Start时修改。每个更高级别的参数值会包括更低级别参数值中记录的所有内容。但是最少的WAL不能包含足够的信息来从基本备份和WAL日志中重建数据,因此必须使用replica参数值来提供更多的信息以启用WAL归档(archive_mode)和流复制.在9.6之前的版本中,此参数值还可以是archive和hot_standby。在PG13版本中,这些仍被接受,但已映射到replica参数值上。当本参数设置为minimal时,如下操作会更快,因为如下操作在创建或重写它们的事务的其余部分中,没有记录永久关系的信息: ALTER ... SET TABLESPACE CLUSTER CREATE TABLE REFRESH MATERIALIZED VIEW(无CONCURRENTLY) REINDEX TRUNCATE + - -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - - - -==== fsync - -[cols="136,387"] -|=== -h| 参数名称 h| fsync -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当本参数值为on时,通过发出fsync系统调用或者各种等价的方法(参见wal_sync_method配置参数),PostgreSQL会尝试确保更新被物理的写入disk。这就保证了PostgreSQL Cluster可以在操作系统或者硬件crash之后能recover(恢复)到一个一致的状态。当本参数值为off时,会带来性能优势,在电源故障或者系统crash时,这会导致不可恢复的数据损坏。仅仅当数据库的全部数据来源自外部数据的情况下,才建议将本参数值设置为off关闭fsync的场景包括:从备份文件中加载数据到PG中;使用PG进行数据的批处理,然后数据库会被废弃并重建;一个经常被重建的只读数据库克隆,并且不会用于failover.高质量的硬件不足以让本参数值设置为off基于可靠恢复的原因将本参数值从off改为on时,需要强制将kernel中修改过的buffer刷新到持久存储中,可以通过如下方法达到本目的: PostgreSQL Cluster关闭;当fsync参数值为on时运行initdb –sync-only,运行sync操作系统命令,unmount掉文件系统或者重启服务器操作系统。在很多场景中,针对非关键事务将synchronous_commit参数值设置为off可以提供比将fsync参数值设置为off更大的潜在优势,不会造成数据损坏等风险。本参数值只能在postgresql.conf文件或server command line中设置。如果关闭此参数,请考虑关闭full_page_writes。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== synchronous_commit - -[cols="136,387"] -|=== -h| 参数名称 h| synchronous_commit -| 数据类型 | enum -| 默认值 | on -| 取值范围 | {local,remote_write,remote_apply,on,off} -| 参数单位 | -| 参数含义 -a| 本参数值指定了在PostgreSQL数据库返回一个成功的提示给客户端之前,必须处理多少WAL数据。如果synchronous_standby_names是空,那么本参数有意义的参数值为on和off;remote_apply、remote_write、和local提供了与on参数值一样的本地同步级别。所有非off模式的本地行为是等待本地WAL刷新到Disk中。在off模式下,没有等待,因此存在一个延迟,这个延迟是给client报告成功与以后保证事务安全以防server crash之间的延迟(最大的延迟是三倍的wal_writer_delay参数值)。与fsync参数值不同,将此参数设置为off不会造成数据库不一致的任何风险。操作系统或者数据库的crash可能会导致一些最近据称已提交的事务丢失,但数据库状态将与这些事务完全中止时的状态相同,因此,当性能比事务持久性的精确确定性更重要时,将本参数设置为off是一个有用的选择。如果synchronous_standby_names是非空,本参数值用来控制事务提交是否等待在standby server上的WAL Record被处理。 + -当本参数值为remote_apply时,commit会等待直到从当前的同步standby指示它们已经收到事务的commit record并应用( applied),因此,它可以在standby 端被query可见,并且在standby端被写入持久性的存储中。这会导致比之前设置的更大的提交延迟,因为primary端会等standby端的WAL replay。 + -当本参数值为on时,commit会等待直到当前同步standby指示已经收到事务的commit record并且已经flush到持久性存储中。这确保了事务不会丢失,除非primary端和所有同步standby端的存储都发生损坏。 + -当本参数值为remote_write时,commit会等待直到当前同步standby指示已经收到事务的commit record并且已经写入到它们的文件系统中。本参数确保了在一个PostgreSQL 实例crash之后的数据持久,但是不针对standby端的操作系统级别的crash,因为,数据在standby端可能没有flush到持久性存储中。当参数值为local时,会导致commits一直在等待直到local flush到disk,而不是复制。当同步复制使用时,通常不需要这么做,但是为了完整而提供了这种方法。 + -此参数可随时更改;任何一个事务的行为都由提交时生效的设置决定。因此,让一些事务同步提交,而其他事务异步提交是可能的,也是有用的。例如,要在默认值相反时使单个多语句事务异步提交,请在事务中发出SET LOCAL synchronous_commit TO OFF - -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== wal_sync_method - -[cols="136,387"] -|=== -h| 参数名称 h| wal_sync_method -| 数据类型 | enum -| 默认值 | Linux和FreeBSD下默认值是fdatasyncWindows下默认值是open_datasync -| 取值范围 | {fsync,fdatasync,open_sync,open_datasync} -| 参数单位 | -| 参数含义 -a| 本参数值指定了强制将WAL写入Disk时使用的方法。当fsync参数值为off时,本参数值无关紧要。 open_datasync:使用open()的O_DSYNC选项写WAL Files fdatasync:每次commit时调用fdatasync() fsync:每次commit时调用fsync() fsync_writethrough:每次commit时调用fsync(),对disk write cache强制write-through open_sync:使用open()的O_SYNC选项写WAL Files + - open_*选项使用O_DIRECT(若是可用),不是上述所有选项都在所有平台下可用。默认值是在该平台下支持的上述列表中的第一个方法,除了在Linux平台和FreeBSD平台下fdatasync是默认值。默认值不一定理想,可能有必要更次此设置或系统配置的其他方面,以创建crash的安全配置或实现最佳性能。本参数值只能在postgresql.conf文件或server command line中设置。 + - -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== full_page_writes - -[cols="136,387"] -|=== -h| 参数名称 h| full_page_writes -| 数据类型 | bool -| 默认值 | on -| 取值范围 | -| 参数单位 | -| 参数含义 -a| 当本参数值为on时,在一个checkpoint发生之后,当第一个修改发生时,将full page(即:该修改所在的disk page中的全部内容)写入WAL日志中。这是需要的,因为在操作系统crash期间正在进行的page write可能仅部分完成,从而导致磁盘上的页包含新旧数据的混合。通常存储在WAL中的行级更改数据不足以在crash之后的恢复中完全还原一个page。存储full page image可以保证页面可以正确还原,但代价是增加必须写入WAL的数据量(因为WAL replay总是从检查点开始,所以在检查点之后的每个页面的第一次更改期间这样做就足够了。因此,降低整页写入成本的一种方法是增加checkpoint interval参数。)关闭此参数可加快正常操作,但在系统发生故障后,可能会导致不可恢复的数据损坏或静默数据损坏。风险类似于关闭fsync,虽然较小,但应该仅基于为fsync参数建议的相同情况关闭本参数。关闭此参数不会影响将WAL存档用于时间点恢复(PITR)。此参数只能在postgresql.conf文件或server command line中设置 + - -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== wal_log_hints - -[cols="136,387"] -|=== -h| 参数名称 h| wal_log_hints -| 数据类型 | bool -| 默认值 | off -| 取值范围 | -| 参数单位 | -| 参数含义 | 当本参数值设置为on时,在一个checkpoint发生之后,当第一个修改发生时,将full page(即:该修改所在的disk page中的全部内容)写入WAL日志中。即使对于所谓的提示位的非关键修改也是如此。如果data ckecksums被启用,hint bit updates总是被记录在wal中,此时本参数值被忽略。你可以使用本参数值来测试当数据库cluster启用checksum之后的会生成多少额外的wal-logging.本参数仅能在server start时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | PG instance重启生效 - -|=== - - - - -==== wal_compression - -[cols="136,387"] -|=== -h| 参数名称 h| wal_compression -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当本参数值为on时,在如下情况下PostgreSQL压缩一个全部的page image并写入到WAL中:full_page_writes参数值为on或者执行一次base backup。压缩的page image会在wal replay期间进行解压。启用本参数可以降低WAL日志的产生量而不会增加不可恢复的数据损坏的风险,但是在wal压缩以及解压过程中会有额外的cpu消耗。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Session级修改立即生效,非session修改relaod生效 - -|=== - - - -==== wal_init_zero - -[cols="136,387"] -|=== -h| 参数名称 h| wal_init_zero -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当本参数值为on时,会导致新的wal file以零填充,在某些文件系统中,这确保了在需要写入wal records之前的空间已被分配。但是,Copy-On-Write (COW)文件系统不会从本参数中获益,因此可以选择跳过不必要的工作。如果设置为off,则在创建文件时仅写入最后一个字节,以使其具有预期的大小。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Session级修改立即生效,非session修改relaod生效 - -|=== - - - -==== wal_recycle - -[cols="136,387"] -|=== -h| 参数名称 h| wal_recycle -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 本参数值为on时,会导致wal file被循环使用(通过renaming wal file的方式),避免了创建新wal file的需要。在COW文件系统中,本参数可能让create new wal file更快。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Session级修改立即生效,非session修改relaod生效 - -|=== - - -==== wal_buffers - -[cols="136,387"] -|=== -h| 参数名称 h| wal_buffers -| 数据类型 | integer -| 默认值 | -1,即:shared_buffers配置参数值的1/32大小,不小于64KB也不大于一个wal segment大小。请注意这是默认值的取值范围,不是手工设置本参数值的取值范围。 -| 取值范围 | -1到262143 -| 参数单位 | 8KB -| 参数含义 | 分配给尚未写入到disk中的wal data的共享内存大小;如果自动选择太大或太小,则可以手动设置本参数值,但是任何小于32 KB的正数参数值.将被视为32 KB.如果指定的该值不带单位,则单位是WAL块的个数,即源码中符号常量XLOG_BLCKSZ,通常为8KB. 本参数值只能在服务器启动时设置。当每次事务提交时,wal buffer中的内容都会被写入disk中,因此,极大的本参数值不可能带来显著的益处。 -| 是否可session级修改 | 否 -| 修改后何时生效 | PG instance重启生效 - -|=== - - - -==== wal_writer_delay - -[cols="136,387"] -|=== -h| 参数名称 h| wal_writer_delay -| 数据类型 | integer -| 默认值 | 200 -| 取值范围 | 1到10000 -| 参数单位 | 毫秒 -| 参数含义 | 指定了wal writer进程写wal buffer到disk中的频率,以时间去衡量,当wal writer进程flush wal之后,wal writer进程会休眠本参数值一段时间,除非被一个异步提交事务很快唤醒。如果最后一次flush在小于wal_writer_delay参数值之前发生 以及 小于wal_writer_flush_after参数值对应的WAL生成量,那么WAL被写入操作系统而不是flush到disk中。请注意,在很多操作系统中,sleep delays的有效精度是10毫秒, -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== wal_writer_flush_after - -[cols="136,387"] -|=== -h| 参数名称 h| wal_writer_flush_after -| 数据类型 | Integer -| 默认值 | 128,即128*8KB=1MB -| 取值范围 | 0到2147483647 -| 参数单位 | 8KB -| 参数含义 | 本参数值指定了wal writer进程flush wal的频率,以wal的大小来衡量。如果最后一次flush在小于wal_writer_delay参数值之前发生 以及 小于wal_writer_flush_after参数值对应的WAL生成量,那么WAL被写入操作系统而不是flush到disk中。本参数值为0代表wal data总是被立即被flush到disk中。如果指定的该值不带单位,则单位是WAL块的个数,即源码中符号常量XLOG_BLCKSZ,通常为8KB. 本参数值只能在postgresql.conf或者server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== wal_skip_threshold - -[cols="136,387"] -|=== -h| 参数名称 h| wal_skip_threshold -| 数据类型 | Integer -| 默认值 | 2048 -| 取值范围 | 0到2147483647 -| 参数单位 | KB -| 参数含义 | 当wal_level参数值为minimal并且在create或者rewriting一个永久关系之后进行事务提交,本参数控制怎么持久化新的数据。如果数据小于本参数值,PostgreSQL会将这些数据写入wal log,否则,PostgreSQL会针对受影响的文件使用一个fsync。取决于你的存储属性,如果这些commit正在拖慢并发事务,增大或者降低本参数值可能会有帮助. 本参数值不带单位时,默认以KB为单位。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效。 - -|=== - - - - -==== commit_delay - -[cols="136,387"] -|=== -h| 参数名称 h| commit_delay -| 数据类型 | Integer -| 默认值 | 0,零表示没有延迟。 -| 取值范围 | 0到100000 -| 参数单位 | 毫秒 -| 参数含义 | 设置本参数值会增加在wal flush启动之前的延迟。如果系统负载足够高以至于在给定的时间间隔内准备好提交其他事务,则这可以通过允许经由单个 WAL flush以提交大量事务来提高组提交吞吐量。但是,每次wal flush会增加延迟,最大延迟是本参数指指定的时间。如果没有其他事务会变成准备提交状态,延迟的时间是被浪费的,因此,如果当wal flush被初始化时,至少有commit_siblings个其他事务是active的情况下,延迟才被执行。同样,如果fsync被关闭,delay是不会被执行的。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Session级修改立即生效,其他修改reload生效 - -|=== - - - -==== commit_siblings - -[cols="136,387"] -|=== -h| 参数名称 h| commit_siblings -| 数据类型 | Integer -| 默认值 | 5 -| 取值范围 | 0到1000 -| 参数单位 | -| 参数含义 | 在执行配置参数commit_delay指定的延迟之前,需要的最小的并发打开的事务数。值越大,在延迟间隔期间至少有一个其他事务准备好提交的可能性就越大 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -=== Developer Options - -==== allow_system_table_mods - -[cols="136,387"] -|=== -h| 参数名称 h| allow_system_table_mods -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 允许修改系统表的结构以及对系统表进行某些其他有风险的操作。否则即使对于超级用户也是不允许的。不明智地使用此设置可能会导致无法挽回的数据丢失或严重损坏数据库系统。只有超级用户才能更改此设置。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Session级修改立即生效,其他修改reload生效 - -|=== - - -==== backtrace_functions - -[cols="136,387"] -|=== -h| 参数名称 h| backtrace_functions -| 数据类型 | string -| 默认值 | 空字符串 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数值是以逗号分隔的C函数名称。如果一个错误被抛出并且错误发生地方的内部C函数名称与本参数值list中的值相匹配,然后backtrace与error message会被写入server log。不是所有的平台都支持backtrace功能,backtrace的质量取决于编译选项。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Session级修改立即生效,其他修改reload生效 - -|=== - - - - -==== ignore_system_indexes - -[cols="136,387"] -|=== -h| 参数名称 h| ignore_system_indexes -| 数据类型 | boolean -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 当读取system table时忽略system index(但是当修改表时,依然会更新索引)。本参数用于从损坏的索引中恢复的场景中。本参数当session启动后无法改变 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效,但是仅仅针对reload之后的新session生效。 - -|=== - - - -==== post_auth_delay - -[cols="136,387"] -|=== -h| 参数名称 h| post_auth_delay -| 数据类型 | Integer -| 默认值 | 0,零表示禁用延迟。 -| 取值范围 | 0到2147 -| 参数单位 | 秒 -| 参数含义 | 在PostgreSQL构建认证阶段之后,当一个新server process被fork出来时的延迟的时间。本参数值用来给开发人员一个用debugger attach到server process的机会。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效,但是仅仅针对reload之后的新session生效。 - -|=== - - - -==== pre_auth_delay - -[cols="136,387"] -|=== -h| 参数名称 h| pre_auth_delay -| 数据类型 | Integer -| 默认值 | 0,零表示禁用延迟。 -| 取值范围 | 0到60 -| 参数单位 | 秒 -| 参数含义 | 在PostgreSQL构建认证阶段之前,在一个新server process被fork出来之后的延迟的时间。本参数值用来给开发人员一个使用debugger attach到server process以跟踪在认证阶段异常行为的机会。本参数只能在postgresql.conf中或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== trace_notify - -[cols="136,387"] -|=== -h| 参数名称 h| trace_notify -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 为LISTEN和NOTIFY命令生成大量的debugging输出。配置参数client_min_messages或者log_min_messages必须设置为DEBUG1或者更低才能发送该输出到client或者server log -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== trace_recovery_messages - -[cols="68,199"] -|=== -h| 参数名称 h| trace_recovery_messages -| 数据类型 | enum -| 默认值 | log,log不会影响log决策 -| 取值范围 | {debug5,debug4,debug3,debug2,debug1,log,notice,warning,error} -| 参数单位 | -| 参数含义 | 启用记录恢复相关的调试输出,否则将不会被记录。此参数允许用户覆盖log_min_messages的正常设置,但仅限于特定消息。本参数的目的是调试hot standby。其他值导致该优先级或更高优先级的与恢复相关的调试消息被记录,就好像它们具有LOG优先级一样。针对配置参数log_min_messages的通用设置会导致无条件发送messages到server log中。本参数只能在postgresql.conf中或者server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== trace_sort - -[cols="136,387"] -|=== -h| 参数名称 h| trace_sort -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 当本参数值为on时,在sort操作期间,会发出有关资源使用的信息。本参数仅仅针对PostgreSQL编译时TRACE_SORT macro被定义时才有效(默认情况下,TRACE_SORT是被定义的) -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== trace_locks - -[cols="136,387"] -|=== -h| 参数名称 h| trace_locks -| 数据类型 | bool -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - - - -==== trace_lwlocks - -[cols="136,387"] -|=== -h| 参数名称 h| trace_lwlocks -| 数据类型 | -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - - -==== trace_userlocks - -[cols="136,387"] -|=== -h| 参数名称 h| trace_userlocks -| 数据类型 | -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - - -==== trace_lock_oidmin - -[cols="136,387"] -|=== -h| 参数名称 h| trace_lock_oidmin -| 数据类型 | -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - - -==== trace_lock_table - -[cols="136,387"] -|=== -h| 参数名称 h| trace_lock_table -| 数据类型 | -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - - -==== debug_deadlocks - -[cols="136,387"] -|=== -h| 参数名称 h| debug_deadlocks -| 数据类型 | -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - - -==== log_btree_build_stats - -[cols="136,387"] -|=== -h| 参数名称 h| log_btree_build_stats +#### trace_userlocks +| 参数名称 h| trace_userlocks | +| --- | --- | | 数据类型 | | 默认值 | | 取值范围 | | 参数单位 | | 参数含义 | | 是否可session级修改 | -| 修改后何时生效 | -|=== - - - -==== wal_consistency_checking - -[cols="136,387"] -|=== -h| 参数名称 h| wal_consistency_checking -| 数据类型 | String -| 默认值 | 空串,空串意味着禁用本特性。 -| 取值范围 | -| 参数单位 | -| 参数含义 | 本参数的目的是检查WAL redo routine中的错误。当启用本参数时,与WAL记录一起修改的任何buffer的full page image都会添加到记录中。如果该记录随后被重放,系统将首先应用每个记录,然后测试由该记录修改的buffer是否与存储的image匹配。在某些情况下(如提示位),可以接受较小的变化,并将被忽略。任何意外的差异都将导致致命错误,从而终止恢复。本参数值可以设置为all,all表示检查所有记录,本参数值也可以设置为逗号分隔的resource manager列表,受到支持的resource manager 是heap、heap2、btree、hash、gin、gist、sequence、spgist、brin、generic -| 是否可session级修改 | 是,仅限于superuser进行修改 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== wal_debug - -[cols="136,387"] -|=== -h| 参数名称 h| wal_debug -| 数据类型 | bool -| 默认值 | -| 取值范围 | -| 参数单位 | -| 参数含义 | 当设置为on时,发出与wal相关的debugging out。本参数仅仅当PostgreSQL编译时定义了WAL_DEBUG macro的情况下才适用。 -| 是否可session级修改 | -| 修改后何时生效 | -|=== - - -==== ignore_checksum_failure - -[cols="136,387"] -|=== -h| 参数名称 h| ignore_checksum_failure -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 本参数仅仅在data checksums启用的情况下才生效。在读取过程中检查到checksum失败通常会导致PostgreSQL报告一个error,从而中止当前事务。本参数值设置为on会导致PostgreSQL忽略故障(但是依然会报告警告)并继续处理。此行为可能导致crash、传播或隐藏corruption或其他严重问题。但是,如果block header是正常的,可能允许您越过错误并检索可能仍然存在于表中的未损坏的tuple。如果block header已损坏,那么即使启用本选项,也会报告错误。 -| 是否可session级修改 | 是,仅限于superuser在session级修改 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== zero_damaged_pages - -[cols="136,387"] -|=== -h| 参数名称 h| zero_damaged_pages -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 检测到一个损坏的page header通常会导致PostgreSQL报错一个error,并终止当前事务。设置本参数值为on会导致系统报告warning,将内存中损坏的页面清零,然后继续处理。这种行为会破坏数据,即:损坏页面上的所有行。但是,本参数确实允许您克服错误并从表中可能存在的任何未损坏的页面中检索行。如果由于硬件或软件错误而发生损坏,它对于恢复数据很有用。在您放弃从表的损坏页恢复数据的希望之前,您通常不应设置本参数。。清零页不会被强制写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。本参数值只能由超级用户更改。 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== ignore_invalid_pages - -[cols="136,387"] -|=== -h| 参数名称 h| ignore_invalid_pages -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当本参数值是off时,在recovery期间检测wal record中存在invalid pages之后,PostgreSQL会发出一个PANIC-level的error,进而会终止recovery。当本参数值设置为on时会导致PostgreSQL忽略wal record中的invalid pages(但是依然会报warning)继续进行recovery。本行为可能会导致crash,data loss,传播或者隐藏corruption,或者其他严重问题。但是,本参数会允许你绕过的PANIC-level的error,进而完成recovery,进而启动PostgreSQL。本参数仅能在PostgreSQL启动时设置。本参数仅仅在recovery或者standby mode下生效。 -| 是否可session级修改 | 否 -| 修改后何时生效 | 重启PG instance生效 - -|=== - - - -==== jit_debugging_support - -[cols="136,387"] -|=== -h| 参数名称 h| jit_debugging_support -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on -| 参数单位 | -| 参数含义 | 注册JIT编译函数给debugger使用,本参数仅能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可对新的connection生效 - -|=== - - - - -==== jit_dump_bitcode - -[cols="136,387"] -|=== -h| 参数名称 h| jit_dump_bitcode -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 写出LLVM的bitcode以便利于JIT debugging, -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 修改后何时生效 | -==== jit_expressions -[cols="136,387"] -|=== -h| 参数名称 h| jit_expressions -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### trace_lock_oidmin +| 参数名称 h| trace_lock_oidmin | +| --- | --- | +| 数据类型 | +| 默认值 | +| 取值范围 | | 参数单位 | -| 参数含义 | 当 JIT 编译被启用时,本参数用于确定表达式是否被 JIT 编译 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - +| 参数含义 | +| 是否可session级修改 | +| 修改后何时生效 | -==== jit_profiling_support -[cols="136,387"] -|=== -h| 参数名称 h| jit_profiling_support -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off +#### trace_lock_table +| 参数名称 h| trace_lock_table | +| --- | --- | +| 数据类型 | +| 默认值 | +| 取值范围 | | 参数单位 | -| 参数含义 | 如果 LLVM 具有所需的功能,则发出允许perf分析 JIT 生成的函数所需的数据。这会将文件写入$HOME/.debug/jit/下; 用户负责在需要时执行清理。默认设置是off。该参数只能在服务器启动时设置。本参数仅能在PostgreSQL启动时设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可对新的connection生效 - -|=== - - - +| 参数含义 | +| 是否可session级修改 | +| 修改后何时生效 | -==== jit_tuple_deforming -[cols="136,387"] -|=== -h| 参数名称 h| jit_tuple_deforming -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### debug_deadlocks +| 参数名称 h| debug_deadlocks | +| --- | --- | +| 数据类型 | +| 默认值 | +| 取值范围 | | 参数单位 | -| 参数含义 | 当JIT编译被启用的状态下,本参数用于确定允许不允许tuple deforming进行jit 编译 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload接口生效 - -|=== - - +| 参数含义 | +| 是否可session级修改 | +| 修改后何时生效 | -=== Query Tuning / Planner Method Configuration +#### log_btree_build_stats +| 参数名称 h| log_btree_build_stats | +| --- | --- | +| 数据类型 | +| 默认值 | +| 取值范围 | +| 参数单位 | +| 参数含义 | +| 是否可session级修改 | +| 修改后何时生效 | -==== enable_bitmapscan -[cols="136,387"] -|=== -h| 参数名称 h| enable_bitmapscan -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### wal_consistency_checking +| 参数名称 h| wal_consistency_checking | +| --- | --- | +| 数据类型 | String | +| 默认值 | 空串,空串意味着禁用本特性。 | +| 取值范围 | | 参数单位 | -| 参数含义 | 启用或禁用query planner对位图扫描计划类型的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 本参数的目的是检查WAL redo routine中的错误。当启用本参数时,与WAL记录一起修改的任何buffer的full page image都会添加到记录中。如果该记录随后被重放,系统将首先应用每个记录,然后测试由该记录修改的buffer是否与存储的image匹配。在某些情况下(如提示位),可以接受较小的变化,并将被忽略。任何意外的差异都将导致致命错误,从而终止恢复。本参数值可以设置为all,all表示检查所有记录,本参数值也可以设置为逗号分隔的resource manager列表,受到支持的resource manager 是heap、heap2、btree、hash、gin、gist、sequence、spgist、brin、generic | +| 是否可session级修改 | 是,仅限于superuser进行修改 | +| 修改后何时生效 | Reload即可生效 | +#### wal_debug +| 参数名称 h| wal_debug | +| --- | --- | +| 数据类型 | bool | +| 默认值 | +| 取值范围 | +| 参数单位 | +| 参数含义 | 当设置为on时,发出与wal相关的debugging out。本参数仅仅当PostgreSQL编译时定义了WAL_DEBUG macro的情况下才适用。 | +| 是否可session级修改 | +| 修改后何时生效 | +#### ignore_checksum_failure +| 参数名称 h| ignore_checksum_failure | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 本参数仅仅在data checksums启用的情况下才生效。在读取过程中检查到checksum失败通常会导致PostgreSQL报告一个error,从而中止当前事务。本参数值设置为on会导致PostgreSQL忽略故障(但是依然会报告警告)并继续处理。此行为可能导致crash、传播或隐藏corruption或其他严重问题。但是,如果block header是正常的,可能允许您越过错误并检索可能仍然存在于表中的未损坏的tuple。如果block header已损坏,那么即使启用本选项,也会报告错误。 | +| 是否可session级修改 | 是,仅限于superuser在session级修改 | +| 修改后何时生效 | Reload即可生效 | -==== enable_gathermerge -[cols="136,387"] -|=== -h| 参数名称 h| enable_gathermerge -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### zero_damaged_pages +| 参数名称 h| zero_damaged_pages | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对gather merge计划类型的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 检测到一个损坏的page header通常会导致PostgreSQL报错一个error,并终止当前事务。设置本参数值为on会导致系统报告warning,将内存中损坏的页面清零,然后继续处理。这种行为会破坏数据,即:损坏页面上的所有行。但是,本参数确实允许您克服错误并从表中可能存在的任何未损坏的页面中检索行。如果由于硬件或软件错误而发生损坏,它对于恢复数据很有用。在您放弃从表的损坏页恢复数据的希望之前,您通常不应设置本参数。。清零页不会被强制写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。本参数值只能由超级用户更改。 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Reload即可生效 | -|=== +#### ignore_invalid_pages +| 参数名称 h| ignore_invalid_pages | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当本参数值是off时,在recovery期间检测wal record中存在invalid pages之后,PostgreSQL会发出一个PANIC-level的error,进而会终止recovery。当本参数值设置为on时会导致PostgreSQL忽略wal record中的invalid pages(但是依然会报warning)继续进行recovery。本行为可能会导致crash,data loss,传播或者隐藏corruption,或者其他严重问题。但是,本参数会允许你绕过的PANIC-level的error,进而完成recovery,进而启动PostgreSQL。本参数仅能在PostgreSQL启动时设置。本参数仅仅在recovery或者standby mode下生效。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | 重启PG instance生效 | +#### jit_debugging_support +| 参数名称 h| jit_debugging_support | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 注册JIT编译函数给debugger使用,本参数仅能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可对新的connection生效 | -==== enable_hashagg -[cols="136,387"] -|=== -h| 参数名称 h| enable_hashagg -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### jit_dump_bitcode +| 参数名称 h| jit_dump_bitcode | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对hashed aggregation计划类型的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 写出LLVM的bitcode以便利于JIT debugging, | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Reload即可生效 | -|=== +#### jit_expressions +| 参数名称 h| jit_expressions | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 当 JIT 编译被启用时,本参数用于确定表达式是否被 JIT 编译 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | +#### jit_profiling_support +| 参数名称 h| jit_profiling_support | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 如果 LLVM 具有所需的功能,则发出允许perf分析 JIT 生成的函数所需的数据。这会将文件写入$HOME/.debug/jit/下; 用户负责在需要时执行清理。默认设置是off。该参数只能在服务器启动时设置。本参数仅能在PostgreSQL启动时设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可对新的connection生效 | -==== enable_hashjoin -[cols="136,387"] -|=== -h| 参数名称 h| enable_hashjoin -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### jit_tuple_deforming +| 参数名称 h| jit_tuple_deforming | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对hash-join计划类型的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 当JIT编译被启用的状态下,本参数用于确定允许不允许tuple deforming进行jit 编译 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload接口生效 | -|=== + +### Query Tuning / Planner Method Configuration +#### enable_bitmapscan +| 参数名称 h| enable_bitmapscan | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 启用或禁用query planner对位图扫描计划类型的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | +#### enable_gathermerge +| 参数名称 h| enable_gathermerge | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 启用或禁用query planner对gather merge计划类型的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### enable_hashagg +| 参数名称 h| enable_hashagg | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 启用或禁用query planner对hashed aggregation计划类型的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_incremental_sort +#### enable_hashjoin +| 参数名称 h| enable_hashjoin | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | +| 参数单位 | +| 参数含义 | 启用或禁用query planner对hash-join计划类型的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + -[cols="136,387"] -|=== -h| 参数名称 h| enable_incremental_sort -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_incremental_sort +| 参数名称 h| enable_incremental_sort | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 数单位 | -| 参数含义 | 启用或禁用query planner对incremental sort steps的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 启用或禁用query planner对incremental sort steps的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_indexscan - -[cols="136,387"] -|=== -h| 参数名称 h| enable_indexscan -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_indexscan +| 参数名称 h| enable_indexscan | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对index-scan的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 启用或禁用query planner对index-scan的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_indexonlyscan -[cols="136,387"] -|=== -h| 参数名称 h| enable_indexonlyscan -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_indexonlyscan +| 参数名称 h| enable_indexonlyscan | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对index-only-scan的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 启用或禁用query planner对index-only-scan的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - -==== enable_material - -[cols="136,387"] -|=== -h| 参数名称 h| enable_material -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_material +| 参数名称 h| enable_material | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对materialization的使用,完全抑制物化是不可能的,但是关闭本参数可以防止query planner插入物化节点,除非在需要正确性的情况下。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | 启用或禁用query planner对materialization的使用,完全抑制物化是不可能的,但是关闭本参数可以防止query planner插入物化节点,除非在需要正确性的情况下。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_mergejoin - -[cols="136,387"] -|=== -h| 参数名称 h| enable_mergejoin -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_mergejoin +| 参数名称 h| enable_mergejoin | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对merge-join的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 启用或禁用query planner对merge-join的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_nestloop - -[cols="136,387"] -|=== -h| 参数名称 h| enable_nestloop -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_nestloop +| 参数名称 h| enable_nestloop | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对nested-loop的使用。完全抑制nested-loop连接是不可能的,但是如果有其他方法可用,关闭本参数会阻止query planner使用nested-loop。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 启用或禁用query planner对nested-loop的使用。完全抑制nested-loop连接是不可能的,但是如果有其他方法可用,关闭本参数会阻止query planner使用nested-loop。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_parallel_append -[cols="136,387"] -|=== -h| 参数名称 h| enable_parallel_append -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_parallel_append +| 参数名称 h| enable_parallel_append | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对parallel-aware append的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 启用或禁用query planner对parallel-aware append的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== enable_parallel_hash - -[cols="136,387"] -|=== -h| 参数名称 h| enable_parallel_hash -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_parallel_hash +| 参数名称 h| enable_parallel_hash | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对parall hash join的使用,在hash-join被禁用的情况下,本参数值无效。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 启用或禁用query planner对parall hash join的使用,在hash-join被禁用的情况下,本参数值无效。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_partition_pruning - -[cols="136,387"] -|=== -h| 参数名称 h| enable_partition_pruning -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_partition_pruning +| 参数名称 h| enable_partition_pruning | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner的partitioned table中消除partition。这也控制计划器生成查询计划的能力。允许查询执行器在查询执行期间删除(忽略)分区 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 启用或禁用query planner的partitioned table中消除partition。这也控制计划器生成查询计划的能力。允许查询执行器在查询执行期间删除(忽略)分区 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_partitionwise_join -[cols="136,387"] -|=== -h| 参数名称 h| enable_partitionwise_join -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off +#### enable_partitionwise_join +| 参数名称 h| enable_partitionwise_join | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对partitionwise join的使用,这允许在partitioned table上的join在匹配的partition上执行join。Partitionwise 目前仅适用于连接条件包括所有分区键的情况,这些分区键必须是相同的数据类型并且具有一对一匹配的子分区集。由于分区连接规划在规划期间可以使用明显更多的 CPU 时间和内存,本参数默认值为off -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 启用或禁用query planner对partitionwise join的使用,这允许在partitioned table上的join在匹配的partition上执行join。Partitionwise 目前仅适用于连接条件包括所有分区键的情况,这些分区键必须是相同的数据类型并且具有一对一匹配的子分区集。由于分区连接规划在规划期间可以使用明显更多的 CPU 时间和内存,本参数默认值为off | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== enable_partitionwise_aggregate - -[cols="136,387"] -|=== -h| 参数名称 h| enable_partitionwise_aggregate -| 数据类型 | bool -| 默认值 | off -| 取值范围 | on和off +#### enable_partitionwise_aggregate +| 参数名称 h| enable_partitionwise_aggregate | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对partitionwise grouping or aggregation的使用,这允许在partitioned table上的partitionwise grouping or aggregation会在每个partition上单独执行。如果GROUP BY子句不包含分区键,则只能在每个分区的基础上执行部分聚合,并且必须稍后执行最终确定。由于partitionwise grouping or aggregation在规划期间可能会使用更多的 CPU 时间和内存,本参数值为off -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 启用或禁用query planner对partitionwise grouping or aggregation的使用,这允许在partitioned table上的partitionwise grouping or aggregation会在每个partition上单独执行。如果GROUP BY子句不包含分区键,则只能在每个分区的基础上执行部分聚合,并且必须稍后执行最终确定。由于partitionwise grouping or aggregation在规划期间可能会使用更多的 CPU 时间和内存,本参数值为off | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | - -==== enable_seqscan - -[cols="136,387"] -|=== -h| 参数名称 h| enable_seqscan -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_seqscan +| 参数名称 h| enable_seqscan | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对sequential scan的使用。完全抑制顺序扫描是不可能的,但是如果有其他方法可用,关闭本参数会阻止query planner使用sequential scan。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | 启用或禁用query planner对sequential scan的使用。完全抑制顺序扫描是不可能的,但是如果有其他方法可用,关闭本参数会阻止query planner使用sequential scan。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_sort - -[cols="136,387"] -|=== -h| 参数名称 h| enable_sort -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_sort +| 参数名称 h| enable_sort | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对explicit sort steps的使用。完全抑制显式排序是不可能的,但是如果有其他方法可用,关闭本参数会阻止query planner使用显式排序。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 启用或禁用query planner对explicit sort steps的使用。完全抑制显式排序是不可能的,但是如果有其他方法可用,关闭本参数会阻止query planner使用显式排序。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== enable_tidscan -[cols="136,387"] -|=== -h| 参数名称 h| enable_tidscan -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### enable_tidscan +| 参数名称 h| enable_tidscan | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 启用或禁用query planner对TID scan的使用 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 启用或禁用query planner对TID scan的使用 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -=== Reporting and Logging / What to Log - -==== application_name - -[cols="136,387"] -|=== -h| 参数名称 h| application_name -| 数据类型 | string -| 默认值 | psql +### Reporting and Logging / What to Log +#### application_name +| 参数名称 h| application_name | +| --- | --- | +| 数据类型 | string | +| 默认值 | psql | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数值的长度小于NAMEDATALEN值(NAMEDATALEN是源码中的符号常量,默认是64个字符)。本参数被连接到服务器上的应用程序设置,本参数值会显示在pg_stat_activity视图中,也会显示在csv log中。本参数值也可以被包括在配置参数log_line_prefix的参数值中。只有可打印的ASCII字符才可以用于本参数值。其他字符会被问号(?)取代。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 本参数值的长度小于NAMEDATALEN值(NAMEDATALEN是源码中的符号常量,默认是64个字符)。本参数被连接到服务器上的应用程序设置,本参数值会显示在pg_stat_activity视图中,也会显示在csv log中。本参数值也可以被包括在配置参数log_line_prefix的参数值中。只有可打印的ASCII字符才可以用于本参数值。其他字符会被问号(?)取代。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== debug_print_parse - -[cols="136,387"] -|=== -h| 参数名称 h| debug_print_parse -| 数据类型 | bool +#### debug_print_parse +| 参数名称 h| debug_print_parse | +| --- | --- | +| 数据类型 | bool | | 默认值 | | 取值范围 | | 参数单位 | -| 参数含义 | 在运行日志中记录query的parse tree。本消息在LOG消息级别的情况下被发出,因此,默认情况下,本消息会出现在运行日志中,但不会发给client。您可以通过调整client_min_messages配置参数、log_min_messages配置参数让消息发送给client。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 在运行日志中记录query的parse tree。本消息在LOG消息级别的情况下被发出,因此,默认情况下,本消息会出现在运行日志中,但不会发给client。您可以通过调整client_min_messages配置参数、log_min_messages配置参数让消息发送给client。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | - -==== debug_print_rewritten - -[cols="136,387"] -|=== -h| 参数名称 h| debug_print_rewritten -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### debug_print_rewritten +| 参数名称 h| debug_print_rewritten | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 在运行日志中记录query的query rewriter output,。本消息在LOG消息级别的情况下被发出,因此,默认情况下,本消息会出现在运行日志中,但不会发给client。您可以通过调整client_min_messages配置参数、log_min_messages配置参数让消息发送给client。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | 在运行日志中记录query的query rewriter output,。本消息在LOG消息级别的情况下被发出,因此,默认情况下,本消息会出现在运行日志中,但不会发给client。您可以通过调整client_min_messages配置参数、log_min_messages配置参数让消息发送给client。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== debug_print_plan - -[cols="136,387"] -|=== -h| 参数名称 h| debug_print_plan -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### debug_print_plan +| 参数名称 h| debug_print_plan | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 在运行日志中记录query的execution plan。本消息在LOG消息级别的情况下被发出,因此,默认情况下,本消息会出现在运行日志中,但不会发给client。您可以通过调整client_min_messages配置参数、log_min_messages配置参数让消息发送给client。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 在运行日志中记录query的execution plan。本消息在LOG消息级别的情况下被发出,因此,默认情况下,本消息会出现在运行日志中,但不会发给client。您可以通过调整client_min_messages配置参数、log_min_messages配置参数让消息发送给client。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== debug_pretty_print -[cols="136,387"] -|=== -h| 参数名称 h| debug_pretty_print -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### debug_pretty_print +| 参数名称 h| debug_pretty_print | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 本参数设置为on时,会将debug_print_parse, debug_print_rewritten, or debug_print_plan配置参数产生的消息进行缩进,这会导致比设置为off时的compact格式更具有可读性但输出会更长。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 本参数设置为on时,会将debug_print_parse, debug_print_rewritten, or debug_print_plan配置参数产生的消息进行缩进,这会导致比设置为off时的compact格式更具有可读性但输出会更长。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== log_checkpoints - -[cols="136,387"] -|=== -h| 参数名称 h| log_checkpoints -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_checkpoints +| 参数名称 h| log_checkpoints | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 将checkpoints 和restartpoints记录到运行日志中,一些统计信息被包括到消息中,如写入buffer的数量以及写buffer的耗时等。本参数仅能在postgresql.conf设置或者在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 将checkpoints 和restartpoints记录到运行日志中,一些统计信息被包括到消息中,如写入buffer的数量以及写buffer的耗时等。本参数仅能在postgresql.conf设置或者在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | - -==== log_connections - -[cols="136,387"] -|=== -h| 参数名称 h| log_connections -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_connections +| 参数名称 h| log_connections | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 当本参数值为on时,每一次尝试连接到PostgreSQL数据库以及客户端成功完成身份认证都会被记录到运行日志中。请注意:有些客户端程序(如psql)会连接两次以确定password是否需要,在该情况下,会有重复的"connection received"消息出现,该消息不一定表示有问题。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可对新的connection生效 - -|=== - +| 参数含义 | 当本参数值为on时,每一次尝试连接到PostgreSQL数据库以及客户端成功完成身份认证都会被记录到运行日志中。请注意:有些客户端程序(如psql)会连接两次以确定password是否需要,在该情况下,会有重复的"connection received"消息出现,该消息不一定表示有问题。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可对新的connection生效 | -==== log_disconnections - -[cols="136,387"] -|=== -h| 参数名称 h| log_disconnections -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_disconnections +| 参数名称 h| log_disconnections | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 当本参数值为on时, session终止的信息会被记录到运行日志中。日志输出类似log_connections配置参数的输出信息,以及session的持续时间。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可对新的connection生效 - -|=== - - +| 参数含义 | 当本参数值为on时, session终止的信息会被记录到运行日志中。日志输出类似log_connections配置参数的输出信息,以及session的持续时间。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可对新的connection生效 | -==== log_error_verbosity -[cols="136,387"] -|=== -h| 参数名称 h| log_error_verbosity -| 数据类型 | enum -| 默认值 | default -| 取值范围 | {terse,default,verbose} +#### log_error_verbosity +| 参数名称 h| log_error_verbosity | +| --- | --- | +| 数据类型 | enum | +| 默认值 | default | +| 取值范围 | {terse,default,verbose} | | 参数单位 | -| 参数含义 | 设置日志消息的详细程度。控制在PG运行日志中为记录的每条消息写入的详细程度。Terse排除了DETAIL、HINT、QUERY、和CONTEXT 级别的信息。Verbose输出包括SQLSTATE错误代码以及源码文件名称、函数名称、生成错误的行号。仅有superuser能修改本参数值 -| 是否可session级修改 | 是,仅限于superuser -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 设置日志消息的详细程度。控制在PG运行日志中为记录的每条消息写入的详细程度。Terse排除了DETAIL、HINT、QUERY、和CONTEXT 级别的信息。Verbose输出包括SQLSTATE错误代码以及源码文件名称、函数名称、生成错误的行号。仅有superuser能修改本参数值 | +| 是否可session级修改 | 是,仅限于superuser | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== log_hostname - -[cols="136,387"] -|=== -h| 参数名称 h| log_hostname -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_hostname +| 参数名称 h| log_hostname | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 默认情况下,在运行日志中显示连接主机的 IP 地址。打开此参数也会导致记录主机名。请注意,根据您的主机名解析设置,这可能会造成不可忽视的性能损失。此参数只能在postgresql.conf文件中或在server command line中设置。 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 默认情况下,在运行日志中显示连接主机的 IP 地址。打开此参数也会导致记录主机名。请注意,根据您的主机名解析设置,这可能会造成不可忽视的性能损失。此参数只能在postgresql.conf文件中或在server command line中设置。 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | -==== log_line_prefix - -[cols="136,387,50"] -|=== -h| 参数名称 h| log_line_prefix | -| 数据类型 | string | -| 默认值 | %m [%p] | +#### log_line_prefix +| 参数名称 h| log_line_prefix | | +| --- | --- | --- | +| 数据类型 | string | +| 默认值 | %m [%p] | | 取值范围 | -| - -| 参数单位 | -| - -| 参数含义 -a| 控制运行日志中每行开头的输出内容。 -| - -| 是否可session级修改 | 否 | -| 修改后何时生效 | Reload即可生效。 | - -|=== - - -==== log_lock_waits - -[cols="136,387"] -|=== -h| 参数名称 h| log_lock_waits -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +| | | 参数单位 | -| 参数含义 | 当一个session的等待时间长于配置参数deadlock_timeout参数值以获得锁时是否生成日志消息。这在锁定等待是否导致性能不佳时非常有用。只有superuser才能更改本设置。 -| 是否可session级修改 | 是,仅限于superuser进行修改 -| 修改后何时生效 | Reload即可生效。 - -|=== - - -==== log_parameter_max_length - -[cols="136,387"] -|=== -h| 参数名称 h| log_parameter_max_length -| 数据类型 | integer -| 默认值 | -1 -| 取值范围 | -1到1073741823 -| 参数单位 | Byte -| 参数含义 -a| 如果本参数值大于零,则使用非错误语句日志消息记录的每个绑定参数值将被修剪为本参数值个字节。零禁用非错误语句日志的绑定参数的日志记录。-1(默认)允许完整记录绑定参数。如果此值未指定单位,则将其视为字节。只有超级用户才能更改此设置。 + -此设置仅影响由于log_statement、log_duration和相关设置而打印的日志消息。此设置的非零值会增加一些开销,特别是如果参数以二进制形式发送,则需要转换为文本。 - -| 是否可session级修改 | 是,仅限于superuser进行修改 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== log_parameter_max_length_on_error - -[cols="136,387"] -|=== -h| 参数名称 h| log_parameter_max_length_on_error -| 数据类型 | integer -| 默认值 | 0 -| 取值范围 | -1到1073741823 -| 参数单位 | Byte -| 参数含义 | 如果大于零,错误消息中报告的每个绑定参数值都会被修剪到本参数值个字节。零(默认值)禁用在错误消息中包含绑定参数。-1允许完整打印绑定参数。如果此值未指定单位,则将其视为字节此设置的非零值会增加开销,因为PostgreSQL需要在每个语句开始时将参数值的文本表示存储在内存中,无论最终是否发生错误。以二进制形式发送绑定参数时的开销比以文本形式发送时要大,因为前者需要数据转换,而后者只需要复制字符串 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== +| | +| 参数含义 | +| 控制运行日志中每行开头的输出内容。 | +| | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效。 | + + +#### log_lock_waits +| 参数名称 h| log_lock_waits | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | +| 参数单位 | +| 参数含义 | 当一个session的等待时间长于配置参数deadlock_timeout参数值以获得锁时是否生成日志消息。这在锁定等待是否导致性能不佳时非常有用。只有superuser才能更改本设置。 | +| 是否可session级修改 | 是,仅限于superuser进行修改 | +| 修改后何时生效 | Reload即可生效。 | + + +#### log_parameter_max_length +| 参数名称 h| log_parameter_max_length | +| --- | --- | +| 数据类型 | integer | +| 默认值 | -1 | +| 取值范围 | -1到1073741823 | +| 参数单位 | Byte | +| 参数含义 | +| 如果本参数值大于零,则使用非错误语句日志消息记录的每个绑定参数值将被修剪为本参数值个字节。零禁用非错误语句日志的绑定参数的日志记录。-1(默认)允许完整记录绑定参数。如果此值未指定单位,则将其视为字节。只有超级用户才能更改此设置。 + 此设置仅影响由于log_statement、log_duration和相关设置而打印的日志消息。此设置的非零值会增加一些开销,特别是如果参数以二进制形式发送,则需要转换为文本。 | +| 是否可session级修改 | 是,仅限于superuser进行修改 | +| 修改后何时生效 | Reload即可生效 | +#### log_parameter_max_length_on_error +| 参数名称 h| log_parameter_max_length_on_error | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0 | +| 取值范围 | -1到1073741823 | +| 参数单位 | Byte | +| 参数含义 | 如果大于零,错误消息中报告的每个绑定参数值都会被修剪到本参数值个字节。零(默认值)禁用在错误消息中包含绑定参数。-1允许完整打印绑定参数。如果此值未指定单位,则将其视为字节此设置的非零值会增加开销,因为PostgreSQL需要在每个语句开始时将参数值的文本表示存储在内存中,无论最终是否发生错误。以二进制形式发送绑定参数时的开销比以文本形式发送时要大,因为前者需要数据转换,而后者只需要复制字符串 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== log_statement -[cols="136,387"] -|=== -h| 参数名称 h| log_statement -| 数据类型 | enum -| 默认值 | all -| 取值范围 | {none,ddl,mod,all} none是off的意思, ddl的含义是记录所有数据定义语句,如create、alter、drop; mod的含义是记录DDL语句之外,还会记录数据修改语句,如insert、update、delete、truncate以及copy from语句。PREPARE、EXECUTE和EXPLAIN ANALYZE语句所包含的命令的类型适当时,也会记录这些语句。all的含义是记录所有语句。 +#### log_statement +| 参数名称 h| log_statement | +| --- | --- | +| 数据类型 | enum | +| 默认值 | all | +| 取值范围 | {none,ddl,mod,all} none是off的意思, ddl的含义是记录所有数据定义语句,如create、alter、drop; mod的含义是记录DDL语句之外,还会记录数据修改语句,如insert、update、delete、truncate以及copy from语句。PREPARE、EXECUTE和EXPLAIN ANALYZE语句所包含的命令的类型适当时,也会记录这些语句。all的含义是记录所有语句。 | | 参数单位 | -| 参数含义 | 控制在PG的运行日志中写入哪些类型的SQL语句。对于使用扩展查询协议的客户端来说,记录到运行日志是从一个执行消息被收到开始的。绑定参数值也会被记录。请注意,即使是本参数值设置为all,运行日志中也不会显示那些包含简单语法错误的SQL语句。因为仅仅在基本的解析完成并确定SQL语句的type之后,log message才会被发出。在扩展查询协议的情况下,本参数值同样不会记录在执行阶段之前(即:在parser分析或planner期间)失败的语句。设置log_min_error_statement为error(或者更低)以记录此类语句 -| 是否可session级修改 | 是,仅限于superuser进行修改 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | 控制在PG的运行日志中写入哪些类型的SQL语句。对于使用扩展查询协议的客户端来说,记录到运行日志是从一个执行消息被收到开始的。绑定参数值也会被记录。请注意,即使是本参数值设置为all,运行日志中也不会显示那些包含简单语法错误的SQL语句。因为仅仅在基本的解析完成并确定SQL语句的type之后,log message才会被发出。在扩展查询协议的情况下,本参数值同样不会记录在执行阶段之前(即:在parser分析或planner期间)失败的语句。设置log_min_error_statement为error(或者更低)以记录此类语句 | +| 是否可session级修改 | 是,仅限于superuser进行修改 | +| 修改后何时生效 | Reload即可生效 | -==== log_replication_commands - -[cols="136,387"] -|=== -h| 参数名称 h| log_replication_commands -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### log_replication_commands +| 参数名称 h| log_replication_commands | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 是否将每个复制命令记录到PG运行日志中 -| 是否可session级修改 | 是,仅限于superuser修改 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 是否将每个复制命令记录到PG运行日志中 | +| 是否可session级修改 | 是,仅限于superuser修改 | +| 修改后何时生效 | Reload即可生效 | -==== log_temp_files -[cols="136,387"] -|=== -h| 参数名称 h| log_temp_files -| 数据类型 | integer -| 默认值 | -1,代表禁用本log功能 -| 取值范围 | -1到2147483647 -| 参数单位 | KB -| 参数含义 | 控制是否记录本临时文件的文件名和大小。临时文件被创建用以排序、hash以及临时查询结果。当本参数值被启用时,当临时文件被删除时,一个日志条目会被发出。本参数值为0时会记录所有的临时文件信息。本参数值为正数时表示仅仅会记录那些临时文件大小大于等于本参数值的临时文件。本参数值不指定单位时,默认值以KB为单位。本参数仅仅superuser可以修改。 -| 是否可session级修改 | 是,仅限于superuser进行修改。 -| 修改后何时生效 | Reload即可生效 +#### log_temp_files +| 参数名称 h| log_temp_files | +| --- | --- | +| 数据类型 | integer | +| 默认值 | -1,代表禁用本log功能 | +| 取值范围 | -1到2147483647 | +| 参数单位 | KB | +| 参数含义 | 控制是否记录本临时文件的文件名和大小。临时文件被创建用以排序、hash以及临时查询结果。当本参数值被启用时,当临时文件被删除时,一个日志条目会被发出。本参数值为0时会记录所有的临时文件信息。本参数值为正数时表示仅仅会记录那些临时文件大小大于等于本参数值的临时文件。本参数值不指定单位时,默认值以KB为单位。本参数仅仅superuser可以修改。 | +| 是否可session级修改 | 是,仅限于superuser进行修改。 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== log_timezone - -[cols="136,387"] -|=== -h| 参数名称 h| log_timezone -| 数据类型 | String -| 默认值 | 内置默认值是GMT,但该内置默认值通常在postgresql.conf中被覆盖; initdb将在会设置本参数值以便与系统环境相对应。 +#### log_timezone +| 参数名称 h| log_timezone | +| --- | --- | +| 数据类型 | String | +| 默认值 | 内置默认值是GMT,但该内置默认值通常在postgresql.conf中被覆盖; initdb将在会设置本参数值以便与系统环境相对应。 | | 取值范围 | | 参数单位 | -| 参数含义 | 设置在log message中使用的time zone。与TimeZone配置参数不同,此值是PostgreSQL Cluster范围的,因此所有会话将一致地报告时间戳。此参数只能在postgresql.conf文件中或在server command line中设置 -| 是否可session级修改 | 否 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 设置在log message中使用的time zone。与TimeZone配置参数不同,此值是PostgreSQL Cluster范围的,因此所有会话将一致地报告时间戳。此参数只能在postgresql.conf文件中或在server command line中设置 | +| 是否可session级修改 | 否 | +| 修改后何时生效 | Reload即可生效 | - -=== Client Connection Defaults / Statement Behavior - -==== client_min_messages - -[cols="68,199"] -|=== -h| 参数名称 h| client_min_messages -| 数据类型 | enum -| 默认值 | notice -| 取值范围 | {debug5,debug4,debug3,debug2,debug1,log,notice,warning,error} +### Client Connection Defaults / Statement Behavior +#### client_min_messages +| 参数名称 h| client_min_messages | +| --- | --- | +| 数据类型 | enum | +| 默认值 | notice | +| 取值范围 | {debug5,debug4,debug3,debug2,debug1,log,notice,warning,error} | | 参数单位 | -| 参数含义 | 控制将哪些消息级别发送到客户端。有效值为DEBUG5,DEBUG4,DEBUG3,DEBUG2,DEBUG1,LOG,NOTICE,WARNING和ERROR。每个级别包括其后的所有级别。级别越靠后,发送的消息就越少。请注意,本参数值log的级别与log_min_messages配置参数值log的级别是不同的。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== +| 参数含义 | 控制将哪些消息级别发送到客户端。有效值为DEBUG5,DEBUG4,DEBUG3,DEBUG2,DEBUG1,LOG,NOTICE,WARNING和ERROR。每个级别包括其后的所有级别。级别越靠后,发送的消息就越少。请注意,本参数值log的级别与log_min_messages配置参数值log的级别是不同的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | - -==== search_path - -[cols="136,387"] -|=== -h| 参数名称 h| search_path -| 数据类型 | string -| 默认值 | "$user", public +#### search_path +| 参数名称 h| search_path | +| --- | --- | +| 数据类型 | string | +| 默认值 | "$user", public | | 取值范围 | | 参数单位 | -| 参数含义 -a| 当一个object(table, data type, function等等)不带前面的schema name时,本参数用来指定哪个schema name会被搜索到。当在不同的schema name中有相同的object name时,在search_path中第一个匹配的object的那个schema会被使用。若是一个object没有被search_path中的任何schema匹配到,那么,这个object使用时需要带schema name(即:前面带上 "schema.").本参数值需要以逗号分隔,当本参数值包括不存在schema name 或者user没有对该schema name的usage权限时,此类参数值会被忽略。本参数值中出现的$user,其含义是current_user,若是存在与该user同名的schema name并且该user有对该schema name的usage权限(若不是这样,$user会被忽略)不论在本参数值中包括不包括pg_catalog,pg_catalog总会被搜索到,若是在本参数值中包括pg_catalog,那么会按照在本参数值中出现的顺序去搜,若是在本参数值中不包括pg_catalog,那么,PostgreSQL会在本参数值之前去搜索pg_catalog.类似的,当前的session临时表schema pg_temp_nnn 若是存在的话,会总被搜索到。可以在本参数值中使用pg_temp来明确指定要对pg_temp_nnn进行搜索。若是在本参数值中不明确列出,那么,PostgreSQL会首先搜索pg_temp_nnn(在pg_catalog之前)。临时schema name仅仅被用来搜索relation(表、视图、序列等等)和data type name,临时schema name不能用来搜索function name或者operator name当一个object被建立时其前面不指定任何schema name时,该object的schema name是在本参数值中搜索到的第一个有效的schema。当本参数值为空时,一个错误会被抛出。 + -本参数的默认值是"$user", public,该默认值支持对一个数据库的共享使用(即:没有user有私有的schemas,并且都对public共享使用)、每个user schema的私有使用以及混合使用。其他的影响可以通过alter语句修改本参数值来获得,这个修改可以是全局的也可以每个user的。可以通过函数current_schemas来检查当前使用的有效的schema name,这与search_path的参数值并不完全一致,因为函数current_schemas显示了在本参数值中出现的item是如何解析的。 - -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | +| 当一个object(table, data type, function等等)不带前面的schema name时,本参数用来指定哪个schema name会被搜索到。当在不同的schema name中有相同的object name时,在search_path中第一个匹配的object的那个schema会被使用。若是一个object没有被search_path中的任何schema匹配到,那么,这个object使用时需要带schema name(即:前面带上 "schema.").本参数值需要以逗号分隔,当本参数值包括不存在schema name 或者user没有对该schema name的usage权限时,此类参数值会被忽略。本参数值中出现的$user,其含义是current_user,若是存在与该user同名的schema name并且该user有对该schema name的usage权限(若不是这样,$user会被忽略)不论在本参数值中包括不包括pg_catalog,pg_catalog总会被搜索到,若是在本参数值中包括pg_catalog,那么会按照在本参数值中出现的顺序去搜,若是在本参数值中不包括pg_catalog,那么,PostgreSQL会在本参数值之前去搜索pg_catalog.类似的,当前的session临时表schema pg_temp_nnn 若是存在的话,会总被搜索到。可以在本参数值中使用pg_temp来明确指定要对pg_temp_nnn进行搜索。若是在本参数值中不明确列出,那么,PostgreSQL会首先搜索pg_temp_nnn(在pg_catalog之前)。临时schema name仅仅被用来搜索relation(表、视图、序列等等)和data type name,临时schema name不能用来搜索function name或者operator name当一个object被建立时其前面不指定任何schema name时,该object的schema name是在本参数值中搜索到的第一个有效的schema。当本参数值为空时,一个错误会被抛出。 + 本参数的默认值是"$user", public,该默认值支持对一个数据库的共享使用(即:没有user有私有的schemas,并且都对public共享使用)、每个user schema的私有使用以及混合使用。其他的影响可以通过alter语句修改本参数值来获得,这个修改可以是全局的也可以每个user的。可以通过函数current_schemas来检查当前使用的有效的schema name,这与search_path的参数值并不完全一致,因为函数current_schemas显示了在本参数值中出现的item是如何解析的。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== row_security -[cols="136,387"] -|=== -h| 参数名称 h| row_security -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off +#### row_security +| 参数名称 h| row_security | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 本参数控制是否抛出错误以代替应用行安全策略。on代表正常应用行安全策略,off代表查询失败除非应用了至少行安全策略。在限制了行可见性导致错误的结果的情况下,可以将本参数值改为off。在默认情况下,pg_dump会进行该修改(即:修改本参数值为off)。本参数对可以绕过行安全策略的roles是无效的,即:superuser和那些带有bypassrls属性的role。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | 本参数控制是否抛出错误以代替应用行安全策略。on代表正常应用行安全策略,off代表查询失败除非应用了至少行安全策略。在限制了行可见性导致错误的结果的情况下,可以将本参数值改为off。在默认情况下,pg_dump会进行该修改(即:修改本参数值为off)。本参数对可以绕过行安全策略的roles是无效的,即:superuser和那些带有bypassrls属性的role。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== default_table_access_method - -[cols="136,387"] -|=== -h| 参数名称 h| default_table_access_method -| 数据类型 | string -| 默认值 | heap +#### default_table_access_method +| 参数名称 h| default_table_access_method | +| --- | --- | +| 数据类型 | string | +| 默认值 | heap | | 取值范围 | | 参数单位 | -| 参数含义 | 本参数指定了create table或者create materialized views不带访问方法时table或者materialized views的访问方法,以及select …into语句使用时用到的访问方法。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 本参数指定了create table或者create materialized views不带访问方法时table或者materialized views的访问方法,以及select …into语句使用时用到的访问方法。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== default_tablespace - -[cols="136,387"] -|=== -h| 参数名称 h| default_tablespace -| 数据类型 | string -| 默认值 | 空字符串,空字符串代表当前database的默认tablespace +#### default_tablespace +| 参数名称 h| default_tablespace | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串代表当前database的默认tablespace | | 取值范围 | | 参数单位 | -| 参数含义 | 在create object(table和index)语句不明确指定tablespace情况下,本参数值指定了该object对应的tablespace。如果指定的本参数值与现有的任何tablespace不匹配,那么PostgreSQL会自动使用当前database的默认tablespace。如果一个非默认表空间被指定,那么user必须带有对该非默认表空间的create的权限,否则创建会失败本参数不适用于临时表。临时表对应的配置参数是temp_tablespaces。本参数也不适用于create database语句。默认情况下,一个新的database从template数据库中继承了tablespace。若是本参数值是非空字符串,然后partitioned table被创建,那么,该partitioned table的表空间被设置为该非空字符串,该非空字符串也是将来partition被建立的默认表空间,即使本配置参数值之后被更改。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效。 - -|=== - - +| 参数含义 | 在create object(table和index)语句不明确指定tablespace情况下,本参数值指定了该object对应的tablespace。如果指定的本参数值与现有的任何tablespace不匹配,那么PostgreSQL会自动使用当前database的默认tablespace。如果一个非默认表空间被指定,那么user必须带有对该非默认表空间的create的权限,否则创建会失败本参数不适用于临时表。临时表对应的配置参数是temp_tablespaces。本参数也不适用于create database语句。默认情况下,一个新的database从template数据库中继承了tablespace。若是本参数值是非空字符串,然后partitioned table被创建,那么,该partitioned table的表空间被设置为该非空字符串,该非空字符串也是将来partition被建立的默认表空间,即使本配置参数值之后被更改。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效。 | -==== temp_tablespaces -[cols="136,387"] -|=== -h| 参数名称 h| temp_tablespaces -| 数据类型 | string -| 默认值 | 空字符串,空字符串代表所有的temporary objects都会被创建在当前数据库的默认表空间中。 +#### temp_tablespaces +| 参数名称 h| temp_tablespaces | +| --- | --- | +| 数据类型 | string | +| 默认值 | 空字符串,空字符串代表所有的temporary objects都会被创建在当前数据库的默认表空间中。 | | 取值范围 | | 参数单位 | -| 参数含义 | 在create temporary object(temp tables 和temp tables 上的indexes)语句不明确指定tablespace情况下,本参数值指定了该object对应的temporary tablespace。诸如排序生成的临时文件也被建立到这个temp_tablespaces指定的临时表空间中。本参数值是一系列的tablespace name的清单,当有多个tablespace name的情况下,每次创建临时对象时,PostgreSQL 都会从列表中随机选择一个tablespace name。除了在事务中,连续创建的临时对象被放置在列表中的连续表空间中。如果列表中选定的是空字符串,PostgreSQL会自动使用当前数据库的默认表空间。当temp_tablespaces以交互方式设置时,指定不存在的表空间会报错,指定用户没有CREATE权限的表空间也会报错。但是,当使用先前设置的值时,将忽略不存在的表空间,以及用户缺乏CREATE权限的表空间。此规则适用于在postgresql.conf设置本参数值的情况下 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== check_function_bodies - -[cols="136,387"] -|=== -h| 参数名称 h| check_function_bodies -| 数据类型 | bool -| 默认值 | on -| 取值范围 | on和off -| 参数单位 | -| 参数含义 | 当设置为off时,它会在CREATE FUNCTION期间禁用函数体字符串的验证。禁用验证可避免验证过程的副作用,并避免由于前向引用等问题导致的误报。在代表其他用户加载函数之前,将此参数设置为off;pg_dump会自动执行此操作 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== default_transaction_isolation - -[cols="136,387"] -|=== -h| 参数名称 h| default_transaction_isolation -| 数据类型 | enum -| 默认值 | read committed -| 取值范围 | {serializable,"repeatable read","read committed","read uncommitted"} -| 参数单位 | -| 参数含义 | 本参数用来控制新事务的隔离级别 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - +| 参数含义 | 在create temporary object(temp tables 和temp tables 上的indexes)语句不明确指定tablespace情况下,本参数值指定了该object对应的temporary tablespace。诸如排序生成的临时文件也被建立到这个temp_tablespaces指定的临时表空间中。本参数值是一系列的tablespace name的清单,当有多个tablespace name的情况下,每次创建临时对象时,PostgreSQL 都会从列表中随机选择一个tablespace name。除了在事务中,连续创建的临时对象被放置在列表中的连续表空间中。如果列表中选定的是空字符串,PostgreSQL会自动使用当前数据库的默认表空间。当temp_tablespaces以交互方式设置时,指定不存在的表空间会报错,指定用户没有CREATE权限的表空间也会报错。但是,当使用先前设置的值时,将忽略不存在的表空间,以及用户缺乏CREATE权限的表空间。此规则适用于在postgresql.conf设置本参数值的情况下 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== default_transaction_read_only - -[cols="136,387"] -|=== -h| 参数名称 h| default_transaction_read_only -| 数据类型 | bool -| 默认值 | off,off的意思是read/write -| 取值范围 | off和on +#### check_function_bodies +| 参数名称 h| check_function_bodies | +| --- | --- | +| 数据类型 | bool | +| 默认值 | on | +| 取值范围 | on和off | | 参数单位 | -| 参数含义 | 本参数用来控制每个新事务的默认只读状态。一个只读事务不能改变(alter)一个非临时表. -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 当设置为off时,它会在CREATE FUNCTION期间禁用函数体字符串的验证。禁用验证可避免验证过程的副作用,并避免由于前向引用等问题导致的误报。在代表其他用户加载函数之前,将此参数设置为off;pg_dump会自动执行此操作 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== default_transaction_deferrable - -[cols="136,387"] -|=== -h| 参数名称 h| default_transaction_deferrable -| 数据类型 | bool -| 默认值 | off -| 取值范围 | off和on +#### default_transaction_isolation +| 参数名称 h| default_transaction_isolation | +| --- | --- | +| 数据类型 | enum | +| 默认值 | read committed | +| 取值范围 | {serializable,"repeatable read","read committed","read uncommitted"} | | 参数单位 | -| 参数含义 | 当运行在serializable隔离级别中时,一个deferrable的只读事务在它被允许继续处理之前可能会被延迟。然而,一旦它开始执行,它就不会产生任何确保可串行化所需的开销;所以序列化代码没有理由因为并发更新而强制中止该只读事务,这确保了对长时间运行的只读事务是很合适的。本参数控制每个新事务的默认的deferrable状态。当前,本参数对read-write事务是无效的,对隔离级别低于serializable的事务也是无效的 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - +| 参数含义 | 本参数用来控制新事务的隔离级别 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== session_replication_role - -[cols="136,387"] -|=== -h| 参数名称 h| session_replication_role -| 数据类型 | enum -| 默认值 | origin -| 取值范围 | {origin,replica,local} +#### default_transaction_read_only +| 参数名称 h| default_transaction_read_only | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off,off的意思是read/write | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 -a| 控制针对当前session的与复制相关的triggers和rules的触发(firing),设置本参数需要superuser权限,并且会导致之前cache起来的查询计划被丢弃掉。本参数的用意是逻辑复制系统在应用复制的更改时将本参数值设置为replica,这样做的结果是,触发器和规则(没有从默认配置更改)不会在复制副本上触发。详细信息,请参阅ALTER TABLE子句ENABLE TRIGGER和ENABLE RULE + - PostgreSQL在内部将参数值origin和local视为相同的值,第三方复制软件可能把这两个参数用于他们的目的,比如,使用local来指示一个session的变化不会被复制的session。因为外键是通过trigger实现的,因此,设置本参数为replica也会disable掉所有的外键约束检查。 - -| 是否可session级修改 | 是,仅限于superuser可进行修改。 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== statement_timeout - -[cols="136,387"] -|=== -h| 参数名称 h| statement_timeout -| 数据类型 | integer -| 默认值 | 0,零代表禁用超时机制 -| 取值范围 | 0到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 终止掉运行时间超过本参数值时间长度的SQL语句。如果log_min_error_statement配置参数被设置为error或者更低级别,超时的SQL语句也会被记录下来。超时时间是如下计算的:从SQL语句到PostgreSQL数据库服务器端开始算,直到该语句被服务器处理完成。如果单个简单查询消息(single simple-Query message)中出现多个SQL语句,则将分别对每条语句应用超时.( PostgreSQL13之前的版本通常将超时处理为应用于整个查询字符串),在扩展查询协议中,当任何与查询相关的消息(Parse、Bind、Execute、descripe)到达PostgreSQL数据库时,超时就开始计时,并通过完成Execute或Sync消息而取消。在postgresql.conf中设置本参数值是不推荐的,因为这会影响所有session -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - +| 参数含义 | 本参数用来控制每个新事务的默认只读状态。一个只读事务不能改变(alter)一个非临时表. | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -==== lock_timeout -[cols="136,387"] -|=== -h| 参数名称 h| lock_timeout -| 数据类型 | integer -| 默认值 | 0,零代表禁用超时机制 -| 取值范围 | 0到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 终止掉在尝试获取表、索引、行或其他数据库对象上的锁的等待时间超过本参数值的任何语句。时间限制分别适用于每次锁获取尝试,该限制既适用于显式锁定请求(如LOCK TABLE,或SELECT FOR UPDATE without NOWAIT),也适用于隐式获取的锁。如果指定的值没有单位,则以毫秒为单位。值为零(默认值)将禁用超时。与statement_timeout配置参数不同,本超时只能在锁等待时发生。请注意,如果statement_timeout非零,设置lock_timeout为相同或更大的值是毫无意义的,因为语句超时总是首先触发。如果log_min_error_statement设置为ERROR或更低,则将记录超时的语句。在postgresql.conf中设置本参数值是不推荐的,因为这会影响所有session -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== idle_in_transaction_session_timeout - -[cols="136,387"] -|=== -h| 参数名称 h| idle_in_transaction_session_timeout -| 数据类型 | integer -| 默认值 | 0,零代表禁用超时机制 -| 取值范围 | 0到2147483647 -| 参数单位 | 毫秒 -| 参数含义 | 终止掉那些处于open transaction状态的并且idle时间长度超过本参数值的任何会话。这允许释放该会话持有的任何锁,并重用连接槽;它还允许对仅对此事务可见的元组进行vacuum。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - - -==== vacuum_freeze_table_age - -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_freeze_table_age -| 数据类型 | integer -| 默认值 | 150000000 -| 取值范围 | 0到2000000000 +#### default_transaction_deferrable +| 参数名称 h| default_transaction_deferrable | +| --- | --- | +| 数据类型 | bool | +| 默认值 | off | +| 取值范围 | off和on | | 参数单位 | -| 参数含义 | 如果表的pg_class.relfrozenxid字段值已经达到本参数值,那么vacuum会执行一次侵略性的扫描(aggressive scan)。侵略性的扫描(aggressive scan)不同于常规vacuum(regular VACUUM), 侵略性的扫描(aggressive scan)会查看每个page以确定page中是否包括未冻结的xids或者mxids,而不是仅仅查看page中是否包括dead tuples。尽管用户可以将此值设置为 0 到 20 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_freeze_max_age 的95% ,以便有机会定期在为表启动反环绕自动清理(anti-wraparound autovacuum)之前手工运行VACUUM。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 +| 参数含义 | 当运行在serializable隔离级别中时,一个deferrable的只读事务在它被允许继续处理之前可能会被延迟。然而,一旦它开始执行,它就不会产生任何确保可串行化所需的开销;所以序列化代码没有理由因为并发更新而强制中止该只读事务,这确保了对长时间运行的只读事务是很合适的。本参数控制每个新事务的默认的deferrable状态。当前,本参数对read-write事务是无效的,对隔离级别低于serializable的事务也是无效的 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | -|=== - - -==== vacuum_freeze_min_age - -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_freeze_min_age -| 数据类型 | integer -| 默认值 | 50000000 -| 取值范围 | 0到1000000000 +#### session_replication_role +| 参数名称 h| session_replication_role | +| --- | --- | +| 数据类型 | enum | +| 默认值 | origin | +| 取值范围 | {origin,replica,local} | | 参数单位 | -| 参数含义 | 本参数用于指定VACUUM在扫描表时用于决定是否冻结行版本的截止年龄(cutoff age,以事物计算), 尽管用户可以将此值设置为 0 到 10 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_freeze_max_age参数值的一半,这样强制 autovacuum之间的时间不会过短。 +| 参数含义 | +| 控制针对当前session的与复制相关的triggers和rules的触发(firing),设置本参数需要superuser权限,并且会导致之前cache起来的查询计划被丢弃掉。本参数的用意是逻辑复制系统在应用复制的更改时将本参数值设置为replica,这样做的结果是,触发器和规则(没有从默认配置更改)不会在复制副本上触发。详细信息,请参阅ALTER TABLE子句ENABLE TRIGGER和ENABLE RULE + PostgreSQL在内部将参数值origin和local视为相同的值,第三方复制软件可能把这两个参数用于他们的目的,比如,使用local来指示一个session的变化不会被复制的session。因为外键是通过trigger实现的,因此,设置本参数为replica也会disable掉所有的外键约束检查。 | +| 是否可session级修改 | 是,仅限于superuser可进行修改。 | +| 修改后何时生效 | Reload即可生效 | + + +#### statement_timeout +| 参数名称 h| statement_timeout | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,零代表禁用超时机制 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 终止掉运行时间超过本参数值时间长度的SQL语句。如果log_min_error_statement配置参数被设置为error或者更低级别,超时的SQL语句也会被记录下来。超时时间是如下计算的:从SQL语句到PostgreSQL数据库服务器端开始算,直到该语句被服务器处理完成。如果单个简单查询消息(single simple-Query message)中出现多个SQL语句,则将分别对每条语句应用超时.( PostgreSQL13之前的版本通常将超时处理为应用于整个查询字符串),在扩展查询协议中,当任何与查询相关的消息(Parse、Bind、Execute、descripe)到达PostgreSQL数据库时,超时就开始计时,并通过完成Execute或Sync消息而取消。在postgresql.conf中设置本参数值是不推荐的,因为这会影响所有session | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### lock_timeout +| 参数名称 h| lock_timeout | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,零代表禁用超时机制 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 终止掉在尝试获取表、索引、行或其他数据库对象上的锁的等待时间超过本参数值的任何语句。时间限制分别适用于每次锁获取尝试,该限制既适用于显式锁定请求(如LOCK TABLE,或SELECT FOR UPDATE without NOWAIT),也适用于隐式获取的锁。如果指定的值没有单位,则以毫秒为单位。值为零(默认值)将禁用超时。与statement_timeout配置参数不同,本超时只能在锁等待时发生。请注意,如果statement_timeout非零,设置lock_timeout为相同或更大的值是毫无意义的,因为语句超时总是首先触发。如果log_min_error_statement设置为ERROR或更低,则将记录超时的语句。在postgresql.conf中设置本参数值是不推荐的,因为这会影响所有session | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### idle_in_transaction_session_timeout +| 参数名称 h| idle_in_transaction_session_timeout | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 0,零代表禁用超时机制 | +| 取值范围 | 0到2147483647 | +| 参数单位 | 毫秒 | +| 参数含义 | 终止掉那些处于open transaction状态的并且idle时间长度超过本参数值的任何会话。这允许释放该会话持有的任何锁,并重用连接槽;它还允许对仅对此事务可见的元组进行vacuum。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### vacuum_freeze_table_age +| 参数名称 h| vacuum_freeze_table_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 150000000 | +| 取值范围 | 0到2000000000 | +| 参数单位 | +| 参数含义 | 如果表的pg_class.relfrozenxid字段值已经达到本参数值,那么vacuum会执行一次侵略性的扫描(aggressive scan)。侵略性的扫描(aggressive scan)不同于常规vacuum(regular VACUUM), 侵略性的扫描(aggressive scan)会查看每个page以确定page中是否包括未冻结的xids或者mxids,而不是仅仅查看page中是否包括dead tuples。尽管用户可以将此值设置为 0 到 20 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_freeze_max_age 的95% ,以便有机会定期在为表启动反环绕自动清理(anti-wraparound autovacuum)之前手工运行VACUUM。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### vacuum_freeze_min_age +| 参数名称 h| vacuum_freeze_min_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 50000000 | +| 取值范围 | 0到1000000000 | +| 参数单位 | +| 参数含义 | 本参数用于指定VACUUM在扫描表时用于决定是否冻结行版本的截止年龄(cutoff age,以事物计算), 尽管用户可以将此值设置为 0 到 10 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_freeze_max_age参数值的一半,这样强制 autovacuum之间的时间不会过短。 | | 是否可session级修改 | | 修改后何时生效 | -|=== - - - - -==== vacuum_multixact_freeze_table_age - -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_multixact_freeze_table_age -| 数据类型 | integer -| 默认值 | 150000000 -| 取值范围 | 0到2000000000 -| 参数单位 | -| 参数含义 | 如果表的pg_class. relminmxid字段值已经达到本参数值,那么vacuum会执行一次侵略性的扫描(aggressive scan)。侵略性的扫描(aggressive scan)不同于常规vacuum(regular VACUUM), 侵略性的扫描(aggressive scan)会查看每个page以确定page中是否包括未冻结的xids或者mxids,而不是仅仅查看page中是否包括dead tuples。尽管用户可以将此值设置为 0 到 20 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_multixact_freeze_max_age的95% ,以便有机会定期在为表启动反环绕自动清理(anti-wraparound autovacuum)之前手工运行VACUUM。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== vacuum_multixact_freeze_min_age - -[cols="136,387"] -|=== -h| 参数名称 h| vacuum_multixact_freeze_min_age -| 数据类型 | integer -| 默认值 | 5000000 -| 取值范围 | 0到1000000000 -| 参数单位 | -| 参数含义 | 本参数用于指定VACUUM在扫描表时用于决定是否冻结行版本的multixacts截止年龄(cutoff age), 尽管用户可以将此值设置为 0 到 10 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_multixact_freeze_max_age参数值的一半,这样强制 autovacuum之间的时间不会过短。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - - -==== bytea_output - -[cols="136,387"] -|=== -h| 参数名称 h| bytea_output -| 数据类型 | enum -| 默认值 | hex -| 取值范围 | {escape,hex} -| 参数单位 | -| 参数含义 | 本配置参数定义了对数据类型bytea的输出格式。 bytea数据类型在输入时对两种格式(escape和hex)均接受。escape代表传统的PostgreSQL格式。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== xmlbinary - -[cols="136,387"] -|=== -h| 参数名称 h| xmlbinary -| 数据类型 | enum -| 默认值 | base64 -| 取值范围 | {base64,hex} -| 参数单位 | -| 参数含义 | 设置二进制值在 XML 中的编码方式。例如,这适用于通过函数xmlelement或xmlforest将bytea值转换为XML的情况。可能的值为base64和hex,它们都在 XML 模式标准中定义。 -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== xmloption - -[cols="136,387"] -|=== -h| 参数名称 h| xmloption -| 数据类型 | enum -| 默认值 | content -| 取值范围 | {content,document} -| 参数单位 | -| 参数含义 | 本参数用于设置在XML和字符串值之间转换时DOCUMENT或CONTENT是隐式的。在PostgreSQL中,也可以使用下面的SQL标准来设置:SET XML OPTION { DOCUMENT \| CONTENT }; -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 - -|=== - - -==== gin_pending_list_limit - -[cols="136,387"] -|=== -h| 参数名称 h| gin_pending_list_limit -| 数据类型 | integer -| 默认值 | 4096 -| 取值范围 | 64到2147483647 -| 参数单位 | KB -| 参数含义 | 设置GIN索引的挂起列表(pending list)的最大大小,该列表在启用fastupdate时使用。如果列表的大小超过此最大值,则通过将列表中的条目批量移动到索引的主数据结构来清除列表。如果指定此值时没有单位,则将其作为千字节。默认值为4MB。通过更改索引存储参数,可以为单个GIN索引重写此设置. -| 是否可session级修改 | 是 -| 修改后何时生效 | Reload即可生效 -|=== +#### vacuum_multixact_freeze_table_age +| 参数名称 h| vacuum_multixact_freeze_table_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 150000000 | +| 取值范围 | 0到2000000000 | +| 参数单位 | +| 参数含义 | 如果表的pg_class. relminmxid字段值已经达到本参数值,那么vacuum会执行一次侵略性的扫描(aggressive scan)。侵略性的扫描(aggressive scan)不同于常规vacuum(regular VACUUM), 侵略性的扫描(aggressive scan)会查看每个page以确定page中是否包括未冻结的xids或者mxids,而不是仅仅查看page中是否包括dead tuples。尽管用户可以将此值设置为 0 到 20 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_multixact_freeze_max_age的95% ,以便有机会定期在为表启动反环绕自动清理(anti-wraparound autovacuum)之前手工运行VACUUM。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### vacuum_multixact_freeze_min_age +| 参数名称 h| vacuum_multixact_freeze_min_age | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 5000000 | +| 取值范围 | 0到1000000000 | +| 参数单位 | +| 参数含义 | 本参数用于指定VACUUM在扫描表时用于决定是否冻结行版本的multixacts截止年龄(cutoff age), 尽管用户可以将此值设置为 0 到 10 亿之间的任何值,但VACUUM会默默地将有效值限制为autovacuum_multixact_freeze_max_age参数值的一半,这样强制 autovacuum之间的时间不会过短。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### bytea_output +| 参数名称 h| bytea_output | +| --- | --- | +| 数据类型 | enum | +| 默认值 | hex | +| 取值范围 | {escape,hex} | +| 参数单位 | +| 参数含义 | 本配置参数定义了对数据类型bytea的输出格式。 bytea数据类型在输入时对两种格式(escape和hex)均接受。escape代表传统的PostgreSQL格式。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### xmlbinary +| 参数名称 h| xmlbinary | +| --- | --- | +| 数据类型 | enum | +| 默认值 | base64 | +| 取值范围 | {base64,hex} | +| 参数单位 | +| 参数含义 | 设置二进制值在 XML 中的编码方式。例如,这适用于通过函数xmlelement或xmlforest将bytea值转换为XML的情况。可能的值为base64和hex,它们都在 XML 模式标准中定义。 | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### xmloption +| 参数名称 h| xmloption | +| --- | --- | +| 数据类型 | enum | +| 默认值 | content | +| 取值范围 | {content,document} | +| 参数单位 | +| 参数含义 | 本参数用于设置在XML和字符串值之间转换时DOCUMENT或CONTENT是隐式的。在PostgreSQL中,也可以使用下面的SQL标准来设置:SET XML OPTION { DOCUMENT \ | CONTENT }; | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | + + +#### gin_pending_list_limit +| 参数名称 h| gin_pending_list_limit | +| --- | --- | +| 数据类型 | integer | +| 默认值 | 4096 | +| 取值范围 | 64到2147483647 | +| 参数单位 | KB | +| 参数含义 | 设置GIN索引的挂起列表(pending list)的最大大小,该列表在启用fastupdate时使用。如果列表的大小超过此最大值,则通过将列表中的条目批量移动到索引的主数据结构来清除列表。如果指定此值时没有单位,则将其作为千字节。默认值为4MB。通过更改索引存储参数,可以为单个GIN索引重写此设置. | +| 是否可session级修改 | 是 | +| 修改后何时生效 | Reload即可生效 | diff --git a/CN/modules/ROOT/pages/110.adoc b/CN/modules/ROOT/pages/110.adoc deleted file mode 100644 index aa21df0a..00000000 --- a/CN/modules/ROOT/pages/110.adoc +++ /dev/null @@ -1,5063 +0,0 @@ -:sectnums: -:sectnumlevels: 16 - - -[.text-center] -== PostgreSQL 函数参考手册 - - -=== current_catalog - -[cols="145,378"] -|=== -h| 函数名称 h| current_catalog -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | Name -| 函数含义 | 获得当前的database 名称。 + -注意:在SQL标准中,databases被称之为catalogs。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_catalog; - current_catalog ------------------ - postgres -(1 row) - -postgres=# ----- -|=== - - -=== current_database() - -[cols="145,378"] -|=== -h| 函数名称 h| current_database() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | name -| 函数含义 | 获得当前的database 名称。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_database(); - current_database ------------------- - postgres -(1 row) - -postgres=# ----- -|=== - - -=== current_query() - -[cols="145,378"] -|=== -h| 函数名称 h| current_query() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | text -| 函数含义 | 获得client端提交的当前执行的SQL语句的文本 -| 使用举例 -a| -[source,sql] ----- -postgres=# BEGIN; -BEGIN -postgres=*# select 1,current_query(); - ?column? \| current_query -----------+--------------------------- - 1 \| select 1,current_query(); -(1 row) - -postgres=*# select 2,current_query(); - ?column? \| current_query -----------+--------------------------- - 2 \| select 2,current_query(); -(1 row) - -postgres=*# ROLLBACK; -ROLLBACK -postgres=# ----- -|=== - - -=== current_role - -[cols="145,378"] -|=== -h| 函数名称 h| current_role -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | name -| 函数含义 | 与current_user作用相同,获得当前执行上下文的username -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_role; - current_role --------------- - pg131 -(1 row) - -postgres=# ----- - -|=== - - - - -=== current_schema - -[cols="145,378"] -|=== -h| 函数名称 h| current_schema -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | name -| 函数含义 | 获得search path中的第一个schema名称(当search path为空时,返回空值)。当表或者其他对象建立不带schema名称时,本函数返回的schema就是该表或者该对象的schema -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_schema; - current_schema ----------------- - public -(1 row) - -postgres=# ----- - -|=== - - -=== current_schema() - -[cols="145,378"] -|=== -h| 函数名称 h| current_schema() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | name -| 函数含义 | 作用与current_schema函数相同:获得search path中的第一个schema名称(当search path为空时,返回空值)。当表或者其他对象建立不带schema名称时,本函数返回的schema就是该表或者该对象的schema -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_schema(); - current_schema ----------------- - public -(1 row) - -postgres=# ----- - -|=== - - -=== current_schemas(include_implicit boolean) - -[cols="145,378"] -|=== -h| 函数名称 h| current_schemas(include_implicit boolean) -| 参数数据类型 | bool -| 函数返回值数据类型 | name -| 函数含义 | 以优先级顺序返回有效search_path中当前所有模式名称,如果入参为true,那么在函数返回结果中会包括隐式搜索的系统模式pg_catalog -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_schemas(false); - current_schemas ------------------ - {public} -(1 row) - -postgres=# select current_schemas(true); - current_schemas ---------------------- - {pg_catalog,public} -(1 row) - -postgres=# ----- - -|=== - - -=== current_user - -[cols="145,378"] -|=== -h| 函数名称 h| current_user -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | name -| 函数含义 | 获得当前执行上下文的username -| 使用举例 -a| -[source,sql] ----- -postgres=# select current_user; - current_user --------------- - pg131 -(1 row) - -postgres=# ----- -|=== - - - - -=== inet_client_addr() - -[cols="145,378"] -|=== -h| 函数名称 h| inet_client_addr() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | inet -| 函数含义 | 获得当前client的ip地址。如果返回值为空,表示当前连接是经过Unix-domain socket的 -| 使用举例 -a| -[source,sql] ----- -postgres=# select inet_client_addr(); - inet_client_addr ------------------- - -(1 row) - -postgres=# ----- - -|=== - - -=== inet_client_port() - -[cols="145,378"] -|=== -h| 函数名称 h| inet_client_port() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | integer -| 函数含义 | 获得当前client的端口号。如果返回值为空,表示当前连接是经过Unix-domain socket的 -| 使用举例 -a| -[source,sql] ----- -postgres=# select inet_client_port(); - inet_client_port ------------------- - -(1 row) - -postgres=# ----- - -|=== - - - -=== inet_server_addr() - -[cols="145,378"] -|=== -h| 函数名称 h| inet_server_addr() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | inet -| 函数含义 | 获得当前连接的pg数据库服务器的ip地址。如果返回值为空,表示当前连接是经过Unix-domain socket的。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select inet_server_port(); - inet_server_port ------------------- - -(1 row) - -postgres=# ----- - -|=== - - - -=== inet_server_port() - -[cols="145,378"] -|=== -h| 函数名称 h| inet_server_port() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | integer -| 函数含义 | 获得当前连接的pg数据库服务器的端口号。如果返回值为空,表示当前连接是经过Unix-domain socket的。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select inet_server_port(); - inet_server_port ------------------- - -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_backend_pid() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_backend_pid() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | integer -| 函数含义 | 获得附加到当前session的backend进程的进程ID -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_backend_pid(); - pg_backend_pid ----------------- - 4068 -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_blocking_pids(integer) - -[cols="145,378"] -|=== -h| 函数名称 h| pg_blocking_pids(integer) -| 参数数据类型 | Integer -| 函数返回值数据类型 | Integer[] -| 函数含义 -a| 返回入参pid的blocking pid(即:阻塞者pid)若是本函数返回空值,表示不存在阻塞者若是本函数返回值是零,那么表示阻塞者是prepared transacion,见下面的输出: -[source,sql] ----- -postgres=# select pg_blocking_pids(12947); pg_blocking_pids ------------------- -{0} -(1 row) - postgres=# ----- -频繁调用本函数会对数据库性能有影响,因为本函数在短时间内对lock manager's shared state进行排他访问(exclusive accesss) - -| 使用举例 -a| -[source,sql] ----- -Session1: -postgres=# SELECT pg_backend_pid(); - pg_backend_pid ----------------- - 32262 -(1 row) - -postgres=# CREATE TABLE tbl_students(rno int, name character varying(10)); -CREATE TABLE -postgres=# BEGIN TRANSACTION; -BEGIN -postgres=*# LOCK tbl_students IN ACCESS EXCLUSIVE MODE; -LOCK TABLE -postgres=*# - - -session2: -postgres=# SELECT pg_backend_pid(); - pg_backend_pid ----------------- - 32439 -(1 row) - -postgres=# INSERT INTO tbl_students VALUES (1,'Anvesh'); - - -session3: -postgres=# SELECT pg_blocking_pids(32439); - pg_blocking_pids ------------------- - {32262} -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_conf_load_time() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_conf_load_time() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | timestamp with time zone -| 函数含义 | 返回PG配置参数文件最后一次被reload的时间 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_conf_load_time(); - pg_conf_load_time -------------------------------- - 2021-03-22 12:46:18.962643+08 -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_current_logfile([text]); - -[cols="145,378"] -|=== -h| 函数名称 h| pg_current_logfile([text]); -| 参数数据类型 | 无输入参数或者text型输入参数 (csvlog、stderr) -| 函数返回值数据类型 | Text -| 函数含义 | 返回正在被logging collector进程使用的log file的path(是log_directory的值)和文件名。当logging collector是被禁用时,本函数返回结果是null。当有不同格式的多种log files存在时,不带任何参数的pg_current_logfile()函数返回有序列表(stderr、csvlog)中找到的第一种格式的文件path和文件名。当没有这两个格式的文件时,本函数返回NULL -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_current_logfile(); - pg_current_logfile --------------------------------------- - log/postgresql-2021-03-22_124618.log -(1 row) - -postgres=# select pg_current_logfile('stderr'); - pg_current_logfile --------------------------------------- - log/postgresql-2021-03-22_124618.log -(1 row) - -postgres=# select pg_current_logfile('csvlog'); - pg_current_logfile --------------------- - -(1 row) - -postgres=# show log_destination ; - log_destination ------------------ - stderr -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_my_temp_schema() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_my_temp_schema() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | oid -| 函数含义 | 返回当前会话的临时schema的OID,如果没有临时schema,本函数返回0(即:数字零) -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_my_temp_schema(); - pg_my_temp_schema -------------------- - 0 -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_is_other_temp_schema(oid) - -[cols="145,378"] -|=== -h| 函数名称 h| pg_is_other_temp_schema(oid) -| 参数数据类型 | oid -| 函数返回值数据类型 | boolean -| 函数含义 | 当入参的oid是其他session中临时schema的oid时,本函数返回true。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_is_other_temp_schema(16426); - pg_is_other_temp_schema -------------------------- - f -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_jit_available() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_jit_available() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | boolean -| 函数含义 | 如果jit编译器扩展是可用的并且jit配置参数设置为on的话,本函数返回true -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_jit_available(); - pg_jit_available ------------------- - f -(1 row) - -postgres=# select * from pg_config where name='CONFIGURE' AND SETTING LIKE '%--with-llvm%'; - name \| setting -------+--------- -(0 rows) - -postgres=# show jit; - jit ------ - on -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_listening_channels() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_listening_channels() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | setof text -| 函数含义 | 当前session正在监听的异步通知通道的名称 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_listening_channels(); - pg_listening_channels ------------------------ -(0 rows) - -postgres=# ----- - -|=== - - - - -=== pg_notification_queue_usage() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_notification_queue_usage() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | double precision -| 函数含义 | 返回被正在等待处理的通知占据的异步通知队列最大大小的比例。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_notification_queue_usage(); - pg_notification_queue_usage ------------------------------ - 0 -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_postmaster_start_time() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_postmaster_start_time() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | timestamp with time zone -| 函数含义 | 返回PG intance 启动的时间点 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_postmaster_start_time(); - pg_postmaster_start_time -------------------------------- - 2021-03-23 14:01:33.352011+08 -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_safe_snapshot_blocking_pids(integer) - -[cols="145,378"] -|=== -h| 函数名称 h| pg_safe_snapshot_blocking_pids(integer) -| 参数数据类型 | Integer -| 函数返回值数据类型 | integer[] -| 函数含义 | 返回阻止指定服务器进程ID获取安全快照的进程ID若是没有阻塞,则返回空array。一个运行SERIALIZABLE事务的session阻塞了一个SERIALIZABLE READ ONLY DEFERRABLE事务,防止后者获得snapshot,直到后者确认可以安全的避免获取任何谓词锁。频繁调用本函数会对数据库性能有影响,因为它在短时间内需要访问谓词锁管理器的共享状态(predicate lock manager's shared state) -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_safe_snapshot_blocking_pids(1234); - pg_safe_snapshot_blocking_pids --------------------------------- - {} -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_trigger_depth() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_trigger_depth() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | integer -| 函数含义 | 返回PostgreSQL触发器的当前嵌套级别(如果没有从触发器内部直接或间接调用,则为返回值为0) -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_trigger_depth(); - pg_trigger_depth ------------------- - 0 -(1 row) - -postgres=# ----- - -|=== - - -=== user - -[cols="145,378"] -|=== -h| 函数名称 h| user -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | name -| 函数含义 | 获得当前执行上下文的username,等同于current_user函数 -| 使用举例 -a| -[source,sql] ----- -postgres=# select user; - user -------- - pg131 -(1 row) - -postgres=# ----- - -|=== - - - -=== Version() - -[cols="145,378"] -|=== -h| 函数名称 h| Version() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | text -| 函数含义 | 返回带有数据库版本号的字符串,您也可以查询server_version配置参数获得数据库版本号。对于机器可读的版本,请使用server_version_num配置参数。在软件开发过程中应该使用server_version_num配置参数或者PqserverVersion,而不是去解析文本的版本号(见下面的使用举例) -| 使用举例 -a| -[source,sql] ----- -postgres=# select version(); - version ---------------------------------------------------------------------------------------------------------- - PostgreSQL 13.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit -(1 row) - -postgres=# ----- -|=== - - -=== has_any_column_privilege(user, table, privilege) - -[cols="145,378"] -|=== -h| 函数名称 h| has_any_column_privilege(user, table, privilege) -| 参数数据类型 | user, table, privilege或者table, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 确定一个user是否对当前PG database中的某个table任一列有列权限确定当前user是否对当前PG database中的某个table任一列有列权限权限类型是SELECT, INSERT, UPDATE,REFERENCES的组合。 -| 使用举例 -a| -[source,sql] ----- -[pg131@VM-0-8-centos ~]$ psql -d cwbase3 -U lc0039999 -psql (13.1) -Type "help" for help. - -cwbase3=> \d - List of relations - Schema \| Name \| Type \| Owner ---------+-------+-------+----------- - public \| test1 \| table \| lc0039999 -(1 row) - -cwbase3=> select has_any_column_privilege('lc0039999','test1','select'); - has_any_column_privilege --------------------------- - t -(1 row) - -cwbase3=> -cwbase3=> select has_any_column_privilege('test1','select,insert'); - has_any_column_privilege --------------------------- - t -(1 row) - -cwbase3=> - -cwbase3=> select has_any_column_privilege('test1','select'); - has_any_column_privilege --------------------------- - t -(1 row) - -cwbase3=> ----- -|=== - - - - -=== has_column_privilege(user, table, column, privilege) - -[cols="145,378"] -|=== -h| 函数名称 h| has_column_privilege(user, table, column, privilege); -| 参数数据类型 | user, table, column, privilege或者table, column, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user对特定表的某一列是否具有某种权限当前user对特定表的某一列是否具有某种权限权限类型是SELECT, INSERT, UPDATE,REFERENCES的组合。 -| 使用举例 -a| -[source,sql] ----- -cwbase3=> \d test1 - Table "public.test1" - Column \| Type \| Collation \| Nullable \| Default ---------+---------+-----------+----------+--------- - id \| integer \| \| \| - -cwbase3=> -cwbase3=> select has_column_privilege('lc0039999','test1','id','select'); - has_column_privilege ----------------------- - t -(1 row) - -cwbase3=> -cwbase3=> select has_column_privilege('test1','id','select'); - has_column_privilege ----------------------- - t -(1 row) - -cwbase3=> ----- -|=== - - - -=== has_database_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_database_privilege -| 参数数据类型 | user, database, privilege或者database, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定database有某种权限当前user是否对特定database有某种权限权限类型是CREATE, CONNECT, TEMPORARY, or TEMP的组合。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_database_privilege('lc0039999','cwbase3','create,connect,temp'); - has_database_privilege ------------------------- - t -(1 row) - -postgres=# select has_database_privilege('lc0019999','cwbase3','create,connect,temp'); - has_database_privilege ------------------------- - t -(1 row) - -postgres=# ----- -|=== - - - -=== has_foreign_data_wrapper_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_foreign_data_wrapper_privilege -| 参数数据类型 | user, fdw, privilege或者fdw, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定fdw有usage权限当前user是否对特定fdw有usage权限此处的权限只能指定usage -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_foreign_data_wrapper_privilege('lc0019999','file_fdw','usage'); - has_foreign_data_wrapper_privilege ------------------------------------- - f -(1 row) - -postgres=# -postgres=# select has_foreign_data_wrapper_privilege('file_fdw','usage'); - has_foreign_data_wrapper_privilege ------------------------------------- - t -(1 row) - -postgres=# ----- -|=== - - - - -=== has_function_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_function_privilege -| 参数数据类型 | user, function, privilege或者function, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定function有EXECUTE权限当前user是否对特定function有EXECUTE权限此处的权限只能是EXECUTE -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_function_privilege('lc0039999','version()','execute'); -has_function_privilege ------------------------- -t -(1 row) - postgres=# postgres=# select has_function_privilege('version()','execute'); - has_function_privilege - ------------------------ - t - (1 row) -postgres=# ----- -|=== - - -=== has_language_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_language_privilege -| 参数数据类型 | user, language, privilege或者language, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定procedural language有usage权限当前user是否对特定procedural language有usage权限此处的权限必须是usage -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_language_privilege('lc0019999','sql','usage'); -has_language_privilege ------------------------- -t -(1 row) - postgres=# select has_language_privilege('plpgsql','usage'); - has_language_privilege - ------------------------ - t - (1 row) - postgres=# ----- - 注意:此处的language可以从pg_language系统表查询到。 - -|=== - - - -=== has_schema_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_schema_privilege -| 参数数据类型 | user, schema, privilege或者schema, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定schema有usage或者create权限当前user是否对特定schema有usage或者create权限此处的权限必须是create或者usage的组合 -| 使用举例 -a| -[source,sql] ----- -postgres=# \dnS - List of schemas - Name \| Owner ---------------------+------- - information_schema \| pg131 - pg_catalog \| pg131 - pg_toast \| pg131 - public \| pg131 - s_abc \| pg131 -(5 rows) - -postgres=# select has_schema_privilege('lc0019999','s_abc','usage'); - has_schema_privilege ----------------------- - f -(1 row) - -postgres=# select has_schema_privilege('lc0019999','s_abc','usage,create'); - has_schema_privilege ----------------------- - f -(1 row) - -postgres=# ----- -|=== - - - -=== has_sequence_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_sequence_privilege -| 参数数据类型 | user, sequence, privilege或者sequence, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定sequence有特定权限当前user是否对特定sequence有特定权限此处的权限是USAGE, SELECT, UPDATE的组合。 -| 使用举例 -a| -[source,sql] ----- -postgres=# \ds+ - List of relations - Schema \| Name \| Type \| Owner \| Persistence \| Size \| Description ---------+--------------+----------+-------+-------------+------------+------------- - public \| gen_y_c1_seq \| sequence \| pg131 \| permanent \| 8192 bytes \| -(1 row) - -postgres=# select has_sequence_privilege('pg131','gen_y_c1_seq','usage'); - has_sequence_privilege ------------------------- - t -(1 row) - -postgres=# select has_sequence_privilege('lc0039999','gen_y_c1_seq','usage'); - has_sequence_privilege ------------------------- - f -(1 row) - -postgres=# ----- -|=== - - -=== has_server_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_server_privilege -| 参数数据类型 | user, server, privilege或者server, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定foreign server有usage权限特定user是否对特定foreign server有usage权限此处的权限必须是usage -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_server_privilege('s1','usage'); -has_server_privilege ----------------------- -t -(1 row) -postgres=# select has_server_privilege('s1','USAGE'); -has_server_privilege ----------------------- -t -(1 row) -postgres=# select has_server_privilege('pg123','s1','USAGE'); -has_server_privilege ----------------------- -t -(1 row) -postgres=# ----- -|=== - - - -=== has_table_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_table_privilege -| 参数数据类型 | user, table, privilege或者table, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定table有特定权限当前user是否对特定table有特定权限此处的权限是指如下的组合: SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER,还可以带有WITH GRANT OPTION用来测试privilege是否带有grant option。当权限字符串有多个值(比如'insert, select')时,只要有任何一个权限是满足的,本函数会返回t有关对权限字符串的说明:权限字符串不区分大小写权限字符串的前后可以有一个或者多个空格(权限名字内部不能有空格) -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_table_privilege('t1',' select, insert '); - has_table_privilege ---------------------- - t -(1 row) - -postgres=# -[pg131@VM-0-8-centos ~]$ psql -d cwbase3 -U lc0039999 -psql (13.1) -Type "help" for help. - -cwbase3=> -cwbase3=> grant select on test1 to lc0019999; -GRANT -cwbase3=> exit -[pg131@VM-0-8-centos ~]$ psql -d cwbase3 -U lc0019999 -psql (13.1) -Type "help" for help. - -cwbase3=> select * from test1; - id - ---- - 1 - 2 - 3 - - 4 - 5 -(6 rows) - -cwbase3=> select has_table_privilege('test1','insert, select '); - has_table_privilege ---------------------- - t -(1 row) - -cwbase3=> select has_table_privilege('test1','insert'); - has_table_privilege ---------------------- - f -(1 row) - -cwbase3=> select has_table_privilege('test1',' insert '); - has_table_privilege ---------------------- - f -(1 row) - -cwbase3=> insert into test1 values(6); -ERROR: permission denied for table test1 -cwbase3=> ----- -|=== - - - -=== has_tablespace_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_tablespace_privilege -| 参数数据类型 | user, tablespace, privilege或者tablespace, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定tablesapce有特定权限当前user是否对特定tablespace有特定权限此处的权限必须是create -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_tablespace_privilege('ts1','create '); -has_tablespace_privilege --------------------------- -t -(1 row) -postgres=# select has_tablespace_privilege('lc0019999','ts1','create '); -has_tablespace_privilege --------------------------- -f -(1 row) -postgres=# ----- -|=== - - - -=== has_type_privilege - -[cols="145,378"] -|=== -h| 函数名称 h| has_type_privilege -| 参数数据类型 | user, type, privilege或者type, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定type有特定权限当前user是否对特定type有特定权限特定type可以使用type的name,也可以使用oid::regtype的形式此处的权限必须是USAGE -| 使用举例 -a| -[source,sql] ----- -postgres=# select has_type_privilege('bytea','usage'); -has_type_privilege --------------------- -t -(1 row) -postgres=# select has_type_privilege('lc0019999','bytea','usage'); -has_type_privilege --------------------- -t -(1 row) -postgres=# select has_type_privilege('lc0019999','17:regtype','usage'); -ERROR: syntax error at or near "17" -CONTEXT: invalid type name "17:regtype" -postgres=# select has_type_privilege('lc0019999',17::regtype,'usage'); -has_type_privilege --------------------- -t -(1 row) -postgres=# select has_type_privilege('lc0019999','17::regtype','usage'); -ERROR: syntax error at or near "17" -CONTEXT: invalid type name "17::regtype" -postgres=# ----- -|=== - - - -=== pg_has_role - -[cols="145,378"] -|=== -h| 函数名称 h| pg_has_role -| 参数数据类型 | user, role, privilege或者role, privilege -| 函数返回值数据类型 | boolean -| 函数含义 | 特定user是否对特定role group有特定权限当前user是否对特定role group有特定权限此处的权限必须是member或者usage当权限是member时,表示特定user是否是特定role group的member当权限是usage时,表示在不执行set role时,特定user是否有特定role的权限 -| 使用举例 -a| -[source,sql] ----- -postgres=# create role editors; -CREATE ROLE -postgres=# create user maxwell; -CREATE ROLE -postgres=# create user ernest; -CREATE ROLE -postgres=# grant authors to editors; --editors can do what authors can do -GRANT ROLE -postgres=# grant editors to maxwell; --maxwell is an editor -GRANT ROLE -postgres=# grant authors to ernest; --ernest is an author -GRANT ROLE -postgres=# select pg_has_role('maxwll','editors','member'); -ERROR: role "maxwll" does not exist -postgres=# select pg_has_role('maxwell','editors','member'); - pg_has_role -------------- - t -(1 row) - -postgres=# select pg_has_role('maxwell','editors','usage'); - pg_has_role -------------- - t -(1 row) - -postgres=# select pg_has_role('maxwell','ernest','usage'); - pg_has_role -------------- - f -(1 row) - -postgres=# select pg_has_role('maxwell','ernest','member'); - pg_has_role -------------- - f -(1 row) - -postgres=# ----- - -|=== - - -=== row_security_active - -[cols="145,378"] -|=== -h| 函数名称 h| row_security_active -| 参数数据类型 | Table,可以是table name,也可以是table的oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在current_user的上下文中,特定table是否已开启row security -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_class where relname='test'; - oid -------- - 16860 -(1 row) - -postgres=# select row_security_active('test'); - row_security_active ---------------------- - f -(1 row) - -postgres=# select row_security_active(16860); - row_security_active ---------------------- - f -(1 row) - -postgres=# ----- - - -|=== - - - -=== acldefault - -[cols="145,378"] -|=== -h| 函数名称 h| acldefault -| 参数数据类型 | type, ownerId -| 函数返回值数据类型 | aclitem[] -| 函数含义 | 返回属于某个user oid对象的默认访问权限。当一个对象的ACL条目为null时这些访问权限是该对象的默认权限Type参数的取值如下:'c' for COLUMN'r' for TABLE 以及类似对象's' for SEQUENCE'd' for DATABASE'f' for FUNCTION 或者PROCEDURE'l' for LANGUAGE'L' for LARGE OBJECT'n' for SCHEMA't' for TABLESPACE'F' for FOREIGN DATA WRAPPER'S' for FOREIGN SERVER'T' for TYPE or DOMAIN -| 使用举例 -a| -[source,sql] ----- -postgres=# select acldefault('f',16877); -acldefault --------------------------------------- -{=X/lc0039999,lc0039999=X/lc0039999} -(1 row) -postgres=# ----- -|=== - - - -=== aclexplode - -[cols="145,378"] -|=== -h| 函数名称 h| aclexplode -| 参数数据类型 | aclitem[] -| 函数返回值数据类型 | setof record -| 函数含义 | 解析 acl 权限 -| 使用举例 -a| -[source,sql] ----- -postgres=# select aclexplode('{=X/lc0039999,lc0039999=X/lc0039999}'); - aclexplode -------------------------- - (16877,0,EXECUTE,f) - (16877,16877,EXECUTE,f) - (2 rows) -postgres=# postgres=# select \* from aclexplode('{=X/lc0039999,lc0039999=X/lc0039999}'); - grantor \| grantee \| privilege_type \| is_grantable ----------+---------+----------------+-------------- - 16877 \| 0 \| EXECUTE \| f - 16877 \| 16877 \| EXECUTE \| f -(2 rows) -postgres=# ----- -|=== - - - -=== makeaclitem - -[cols="145,378"] -|=== -h| 函数名称 h| makeaclitem -| 参数数据类型 | grantee, grantor, privilege, grantable -| 函数返回值数据类型 | aclitem -| 函数含义 | 构建aclitem -| 使用举例 -a| -[source,sql] ----- -postgres=# select \* from makeaclitem(16877,16877,'EXECUTE',false); -makeaclitem ------------------------ -lc0039999=X/lc0039999 -(1 row) -postgres=# ----- -|=== - - - -=== pg_collation_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_collation_is_visible -| 参数数据类型 | collation_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定collation是否可见。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_collation where collname = 'zh_CN'; - oid \| collname \| collnamespace \| collowner \| collprovider \| collisdeterministic \| collencoding \| collcollate \| collctype \| collversion --------+----------+---------------+-----------+--------------+---------------------+--------------+-------------+------------+------------- - 13086 \| zh_CN \| 11 \| 10 \| c \| t \| 2 \| zh_CN \| zh_CN \| 2.17 - 13243 \| zh_CN \| 11 \| 10 \| c \| t \| 6 \| zh_CN.utf8 \| zh_CN.utf8 \| 2.17 -(2 rows) - -postgres=# select pg_collation_is_visible(13086); - pg_collation_is_visible -------------------------- - f -(1 row) - -postgres=# select pg_collation_is_visible(13243); - pg_collation_is_visible -------------------------- - t -(1 row) - -postgres=# -postgres=# select pg_collation_is_visible('"zh_CN"'::regcollation); - pg_collation_is_visible -------------------------- - t -(1 row) - -postgres=# ----- -|=== - - - -=== pg_conversion_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_conversion_is_visible -| 参数数据类型 | conversion_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定conversion是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_conversion where conname like '%cn%'; - oid \| conname \| connamespace \| conowner \| conforencoding \| contoencoding \| conproc \| condefault -------+----------------+--------------+----------+----------------+---------------+----------------+------------ - 4422 \| euc_cn_to_mic \| 11 \| 10 \| 2 \| 7 \| euc_cn_to_mic \| t - 4423 \| mic_to_euc_cn \| 11 \| 10 \| 7 \| 2 \| mic_to_euc_cn \| t - 4480 \| euc_cn_to_utf8 \| 11 \| 10 \| 2 \| 6 \| euc_cn_to_utf8 \| t - 4481 \| utf8_to_euc_cn \| 11 \| 10 \| 6 \| 2 \| utf8_to_euc_cn \| t -(4 rows) - -postgres=# select pg_conversion_is_visible(4480); - pg_conversion_is_visible --------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - -=== pg_function_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_function_is_visible -| 参数数据类型 | function_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定function、procedures、aggregates是否可见。对于函数,如果路径前面没有相同名称和参数数据类型的对象,则搜索路径中的对象可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_proc where proname='version'; - oid ------ - 89 -(1 row) - -postgres=# select pg_function_is_visible(89); - pg_function_is_visible ------------------------- - t -(1 row) - -postgres=# -postgres=# select pg_function_is_visible('version'::regproc); - pg_function_is_visible ------------------------- - t -(1 row) - -postgres=# select pg_function_is_visible('version()'::regprocedure); - pg_function_is_visible ------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - -=== pg_opclass_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_opclass_is_visible -| 参数数据类型 | opclass_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定operator class是否可见考虑因素是operator class name和相关的索引访问方法。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_opclass where opcname='array_ops'; - oid -------- - 10000 - 10001 - 10063 -(3 rows) - -postgres=# select pg_opclass_is_visible(10000); - pg_opclass_is_visible ------------------------ - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_operator_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_operator_is_visible -| 参数数据类型 | operator_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定operator 是否可见对于运算符,如果路径前面没有相同名称和参数数据类型的对象,则搜索路径中的对象可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oprname from pg_operator where oid=15; - oprname ---------- - = -(1 row) - -postgres=# select pg_operator_is_visible(15); - pg_operator_is_visible ------------------------- - t -(1 row) - -postgres=# -postgres=# select pg_operator_is_visible('=(integer,integer)'::regoperator); - pg_operator_is_visible ------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_opfamily_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_opfamily_is_visible -| 参数数据类型 | opclass_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定operator family是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_opfamily where oid='397'; - oid \| opfmethod \| opfname \| opfnamespace \| opfowner ------+-----------+-----------+--------------+---------- - 397 \| 403 \| array_ops \| 11 \| 10 -(1 row) - -postgres=# select pg_opfamily_is_visible(397); - pg_opfamily_is_visible ------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_statistics_obj_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_statistics_obj_is_visible -| 参数数据类型 | stat_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定operator class是否可见 -| 使用举例 | -|=== - - - -=== pg_table_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_table_is_visible -| 参数数据类型 | table_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定的table、views、materialized views、 indexes、 sequences、foreign tables是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_class where relname='data1'; - oid -------- - 16384 -(1 row) - -postgres=# select pg_table_is_visible(16384); - pg_table_is_visible ---------------------- - t -(1 row) - -postgres=# -postgres=# SELECT pg_table_is_visible('public.data1'::regclass); - pg_table_is_visible ---------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_ts_config_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_ts_config_is_visible -| 参数数据类型 | config_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定text search configuration是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_ts_config where cfgname='greek'; - oid -------- - 13861 -(1 row) - -postgres=# select pg_ts_config_is_visible(13861); - pg_ts_config_is_visible -------------------------- - t -(1 row) - -postgres=# -postgres=# select pg_ts_config_is_visible('greek'::regconfig); - pg_ts_config_is_visible -------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_ts_dict_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_ts_dict_is_visible -| 参数数据类型 | _dict_oid_ -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定text search dictionary是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid,dictname,dictinitoption from pg_ts_dict where dictname='greek_stem'; - oid \| dictname \| dictinitoption --------+------------+-------------------- - 13860 \| greek_stem \| language = 'greek' -(1 row) - -postgres=# select pg_ts_dict_is_visible(13860); - pg_ts_dict_is_visible ------------------------ - t -(1 row) - -postgres=# -postgres=# select pg_ts_dict_is_visible('greek_stem'::regdictionary); - pg_ts_dict_is_visible ------------------------ - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_ts_parser_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_ts_parser_is_visible -| 参数数据类型 | parser_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定text search parser是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_ts_parser ; - oid \| prsname \| prsnamespace \| prsstart \| prstoken \| prsend \| prsheadline \| prslextype -------+---------+--------------+------------+----------------+----------+---------------+-------------- - 3722 \| default \| 11 \| prsd_start \| prsd_nexttoken \| prsd_end \| prsd_headline \| prsd_lextype -(1 row) - -postgres=# select pg_ts_parser_is_visible(3722); - pg_ts_parser_is_visible -------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_ts_template_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_ts_template_is_visible -| 参数数据类型 | template_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定text search template是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_ts_template ; - oid \| tmplname \| tmplnamespace \| tmplinit \| tmpllexize --------+-----------+---------------+----------------+------------------ - 3727 \| simple \| 11 \| dsimple_init \| dsimple_lexize - 3730 \| synonym \| 11 \| dsynonym_init \| dsynonym_lexize - 3733 \| ispell \| 11 \| dispell_init \| dispell_lexize - 3742 \| thesaurus \| 11 \| thesaurus_init \| thesaurus_lexize - 13845 \| snowball \| 11 \| dsnowball_init \| dsnowball_lexize -(5 rows) - -postgres=# select pg_ts_temp - -postgres=# select pg_ts_template_is_visible(3730); - pg_ts_template_is_visible ---------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_type_is_visible - -[cols="145,378"] -|=== -h| 函数名称 h| pg_type_is_visible -| 参数数据类型 | type_oid -| 函数返回值数据类型 | boolean -| 函数含义 | 在当前schema search path中,特定type、domain是否可见 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid,typname from pg_type where typname='bool'; - oid \| typname ------+--------- - 16 \| bool -(1 row) - -postgres=# select pg_type_is_visible(16); - pg_type_is_visible --------------------- - t -(1 row) - -postgres=# -postgres=# SELECT pg_type_is_visible('pg_catalog.bool'::regtype); - pg_type_is_visible --------------------- - t -(1 row) - -postgres=# ----- - -|=== - -=== format_type - -[cols="145,378"] -|=== -h| 函数名称 h| format_type -| 参数数据类型 | type_oid, typemod -| 函数返回值数据类型 | Text -| 函数含义 | 得到一个data type的SQL Name -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_type where typname='bool'; --[ RECORD 1 ]--+--------- -oid \| 16 -typname \| bool -typnamespace \| 11 -typowner \| 10 -typlen \| 1 -typbyval \| t -typtype \| b -typcategory \| B -typispreferred \| t -typisdefined \| t -typdelim \| , -typrelid \| 0 -typelem \| 0 -typarray \| 1000 -typinput \| boolin -typoutput \| boolout -typreceive \| boolrecv -typsend \| boolsend -typmodin \| - -typmodout \| - -typanalyze \| - -typalign \| c -typstorage \| p -typnotnull \| f -typbasetype \| 0 -typtypmod \| -1 -typndims \| 0 -typcollation \| 0 -typdefaultbin \| -typdefault \| -typacl \| - -postgres=# -postgres=# select format_type(16,0); - format_type -------------- - boolean -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_get_constraintdef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_constraintdef -| 参数数据类型 | constraint_oid或者constraint_oid, pretty_bool -| 函数返回值数据类型 | text -| 函数含义 | 得到一个constraint的定义 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_constraintdef(16918); -pg_get_constraintdef ----------------------- -PRIMARY KEY (c1) -(1 row) -postgres=# ----- -|=== - - - -=== pg_get_expr - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_expr -| 参数数据类型 -a| pg_node_tree, relation_oid,或者 + -pg_node_tree, relation_oid, pretty_bool - -| 函数返回值数据类型 | Text -| 函数含义 | 反编译指定expression的内部格式,假设:其中的任何变量引用第二个参数指示的relation -| 使用举例 -a| -[source,sql] ----- -postgres=# CREATE TABLE tab1 (a int, b int) PARTITION BY RANGE(a); -CREATE TABLE -postgres=# CREATE TABLE tab1_p1 PARTITION OF tab1 FOR VALUES FROM (0) TO (100); -CREATE TABLE -postgres=# CREATE TABLE tab1_p2 PARTITION OF tab1 FOR VALUES FROM (100) TO (200); -CREATE TABLE -postgres=# select relname, pg_get_expr(relpartbound, oid) from pg_class where relispartition and relname ~ 'tab1' order by relname; - relname \| pg_get_expr ----------+-------------------------------- - tab1_p1 \| FOR VALUES FROM (0) TO (100) - tab1_p2 \| FOR VALUES FROM (100) TO (200) -(2 rows) - -postgres=# ----- - -|=== - - - -=== pg_get_functiondef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_functiondef -| 参数数据类型 | func_oid -| 函数返回值数据类型 | text -| 函数含义 -a| 获得function或者procedure的定义 + - + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_functiondef(89); -pg_get_functiondef -------------------------------------------------- -CREATE OR REPLACE FUNCTION pg_catalog.version()+ RETURNS text + LANGUAGE internal + STABLE PARALLEL SAFE STRICT + AS $function$pgsql_version$function$ - -(1 row) -postgres=# ----- -|=== - - - -=== pg_get_function_arguments - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_function_arguments -| 参数数据类型 | func_oid -| 函数返回值数据类型 | text -| 函数含义 -a| 获得function或者procedure的传入参数清单 + - + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_proc where proname='has_database_privilege'; --[ RECORD 1 ] -oid \| 2250 --[ RECORD 2 ] -oid \| 2251 --[ RECORD 3 ] -oid \| 2252 --[ RECORD 4 ] -oid \| 2253 --[ RECORD 5 ] -oid \| 2254 --[ RECORD 6 ] -oid \| 2255 - -postgres=# select pg_get_function_arguments(2250); --[ RECORD 1 ]-------------+----------------- -pg_get_function_arguments \| name, text, text - -postgres=# \x -Expanded display is off. -postgres=# select pg_get_function_arguments(2250); - pg_get_function_arguments ---------------------------- - name, text, text -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_get_function_identity_arguments - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_function_identity_arguments -| 参数数据类型 | func_oid -| 函数返回值数据类型 | text -| 函数含义 -a| 获得参数清单以标识出function或者procedure + - + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_function_identity_arguments(2250); -pg_get_function_identity_arguments ------------------------------------ -name, text, text -(1 row) -postgres=# ----- -|=== - - - - - -=== pg_get_function_result - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_function_result -| 参数数据类型 | func_oid -| 函数返回值数据类型 | text -| 函数含义 | 获得function,若是procedure,返回null -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_function_result(89); -pg_get_function_result ------------------------- -text -(1 row) -postgres=# ----- -|=== - - - -=== pg_get_indexdef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_indexdef -| 参数数据类型 | index_oid或者index_oid, column_no, pretty_bool -| 函数返回值数据类型 | text -| 函数含义 | 获得索引的定义语句获得某个索引上第n个索引列的名称 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid from pg_class where relname='idx_2'; - oid -------- - 16427 -(1 row) - -postgres=# select pg_get_indexdef(16427); - pg_get_indexdef ---------------------------------------------------------- - CREATE INDEX idx_2 ON public.data1 USING btree (c1, c3) -(1 row) - -postgres=# - -postgres=# select pg_get_indexdef(16427,2,true); - pg_get_indexdef ------------------ - c3 -(1 row) - -postgres=# select pg_get_indexdef(16427,1,true); - pg_get_indexdef ------------------ - c1 -(1 row) - -postgres=# ----- - -|=== - - -=== pg_get_keywords - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_keywords -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | setof record -| 函数含义 | 返回PostgreSQL数据库中的SQL关键字清单返回结果中有3列(以逗号分隔),第一列是关键字名称,第二列catcode是category code U for unreserved C for column name T for type or function name R for reserved第三列catdesc是描述 -| 使用举例 a| -[source,sql] ----- -postgres=# select pg_get_keywords(); -pg_get_keywords ------------------------------------------------------------------- - (abort,U,unreserved) - (absolute,U,unreserved) - (access,U,unreserved) - (action,U,unreserved) - (add,U,unreserved) - (admin,U,unreserved) - (after,U,unreserved) - (aggregate,U,unreserved) - (all,R,reserved) - (also,U,unreserved) - (alter,U,unreserved) - (always,U,unreserved) - (analyse,R,reserved) - (analyze,R,reserved) - (and,R,reserved) -限于篇幅,本函数的输出仅摘录到此处 ----- -|=== - - - -=== pg_get_ruledef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_ruledef -| 参数数据类型 | rule_oid或者rule_oid, pretty_bool -| 函数返回值数据类型 | Text -| 函数含义 | 获得rule的create rule语句 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid ,rulename from pg_rewrite where rulename='pg_settings_u'; - oid \| rulename --------+--------------- - 12168 \| pg_settings_u -(1 row) - -postgres=# select pg_get_ruledef(12168); - pg_get_ruledef ---------------------------------------------------------------------------------------------------- - CREATE RULE pg_settings_u AS + - ON UPDATE TO pg_catalog.pg_settings + - WHERE (new.name = old.name) DO SELECT set_config(old.name, new.setting, false) AS set_config; -(1 row) - -postgres=# ----- - -|=== - - -=== pg_get_serial_sequence - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_serial_sequence -| 参数数据类型 | table_name, column_name -| 函数返回值数据类型 | text -| 函数含义 | 获得自增列或者标识列使用的sequence的name -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_serial_sequence('gen_y','c1'); -pg_get_serial_sequence ------------------------- -public.gen_y_c1_seq -(1 row) -postgres=# ----- -|=== - - - -=== pg_get_statisticsobjdef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_statisticsobjdef -| 参数数据类型 | statobj_oid -| 函数返回值数据类型 | text -| 函数含义 | 获得extended statistics object的CREATE STATISTICS语句。 -| 使用举例 | - -|=== - - - -=== pg_get_triggerdef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_triggerdef -| 参数数据类型 | trigger_oid 或者trigger_oid, pretty_bool -| 函数返回值数据类型 | text -| 函数含义 | 获得trigger的create trigger语句 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_triggerdef(16992); -pg_get_triggerdef ------------------------------------------------------------------------------------------------------------- -CREATE TRIGGER example_trigger AFTER INSERT ON public.company FOR EACH ROW EXECUTE FUNCTION auditlogfunc() -(1 row) -postgres=# ----- -|=== - - - - - -=== pg_get_userbyid - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_userbyid -| 参数数据类型 | role_oid -| 函数返回值数据类型 | ~name~ -| 函数含义 | 获得特定role oid的role name -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_userbyid(16426); -pg_get_userbyid ------------------ -lc0029999 -(1 row) -postgres=# ----- -|=== - - -=== pg_get_viewdef - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_viewdef -| 参数数据类型 | view_name 或者 view_name, pretty_bool或者 view_oid或者 view_oid, pretty_bool或者view_oid, wrap_column_int -| 函数返回值数据类型 | text -| 函数含义 | 获得view的定义 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_viewdef('company_view'); -pg_get_viewdef ---------------------- -SELECT company.id,+ company.name, + company.age + FROM company; -(1 row) -postgres=# ----- -|=== - - -=== pg_index_column_has_property - -[cols="145,378"] -|=== -h| 函数名称 h| pg_index_column_has_property -| 参数数据类型 | index regclass, column integer, property text -| 函数返回值数据类型 | boolean -| 函数含义 -a| 测试索引列是否有特定的索引列属性。索引列属性见下: asc 索引列升序 desc 索引列降序 nulls_first null值在前 nulls_last null值在后 orderable 列是否具有任何定义的排序顺序? distance_orderable 列是否可以被"distance" operator 顺序扫描到, 比如 ORDER BY col <-> constant ? returnable index-only扫描是否可以返回列值 search_array 列是否原生支持 col = ANY(array)搜索 search_nulls 列是否支持IS NULL 和IS NOT NULL 搜索 + -注意:extension的访问方法可以为它们的indexes定义额外的属性名称。 + -本函数在如下情况下会返回NULL:属性名称未知(not known)或者不适用于特定的对象Oid或者column number不能标识出一个有效的对象。 - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_index_column_has_property('idx_2'::regclass,1,'desc'); -pg_index_column_has_property ------------------------------- -f -(1 row) -postgres=# select pg_index_column_has_property('idx_2'::regclass,1,'asc'); -pg_index_column_has_property ------------------------------- -t -(1 row) -postgres=# ----- -|=== - - - - - - -=== pg_index_has_property - -[cols="145,378"] -|=== -h| 函数名称 h| pg_index_has_property -| 参数数据类型 | index regclass, property text -| 函数返回值数据类型 | boolean -| 函数含义 -a| 测试一个index是否具有特定的索引属性。如下是索引属性的清单 clusterable 在cluster命令中是否可以用到index index_scan index 是否支持 plain (non-bitmap) scans? bitmap_scan index 是否支持 bitmap scans? backward_scan Can the scan direction be changed in mid-scan (to support FETCH BACKWARD on a cursor without needing materialization)? + -注意:extension的访问方法可以为它们的indexes定义额外的属性名称。 + -本函数在如下情况下会返回NULL:属性名称未知(not known)或者不适用于特定的对象oid不能标识出一个有效的对象。 - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_index_has_property('idx_2'::regclass,'index_scan'); -pg_index_has_property ------------------------ -t -(1 row) -postgres=# ----- -|=== - - - -=== pg_indexam_has_property - -[cols="145,378"] -|=== -h| 函数名称 h| pg_indexam_has_property -| 参数数据类型 | am oid, property text -| 函数返回值数据类型 | boolean -| 函数含义 -a| 测试一个index访问方法是否具有特定的属性。如下是索引访问方法属性清单: can_order 访问方法是否支持 ASC, DESC 以及CREATE INDEX的related keywords can_unique 访问方法是否支持unique indexes? can_multi_col 访问方法是否支持多列indexes? can_exclude 访问方法是否支持exclusion constraints? can_include 访问方法是否支持CREATE INDEX的 INCLUDE 子句 + - + -本函数在如下情况下会返回NULL:属性名称未知(not known)或者不适用于特定的对象 oid不能标识出一个有效的对象。 + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from pg_am; - oid \| amname \| amhandler \| amtype -------+--------+----------------------+-------- - 2 \| heap \| heap_tableam_handler \| t - 403 \| btree \| bthandler \| i - 405 \| hash \| hashhandler \| i - 783 \| gist \| gisthandler \| i - 2742 \| gin \| ginhandler \| i - 4000 \| spgist \| spghandler \| i - 3580 \| brin \| brinhandler \| i -(7 rows) - -postgres=# -postgres=# select pg_indexam_has_property(4000,'can_multi_col'); - pg_indexam_has_property -------------------------- - f -(1 row) - -postgres=# -postgres=# select pg_indexam_has_property(403,'can_unique'); - pg_indexam_has_property -------------------------- - t -(1 row) - -postgres=# ----- - -|=== - - - - -=== pg_options_to_table - -[cols="145,378"] -|=== -h| 函数名称 h| pg_options_to_table -| 参数数据类型 | options_array text[] -| 函数返回值数据类型 | setof record ( option_name text, option_value text ) -| 函数含义 | 返回pg_class.reloptions或者pg_attribute.attoptions表示的存储选项 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_options_to_table(reloptions) from pg_class where oid='16384'; -pg_options_to_table ---------------------------------------------- -(autovacuum_vacuum_insert_threshold,10000) -(autovacuum_vacuum_insert_scale_factor,0.1) -(2 rows) -postgres=# ----- -|=== - - - - -=== pg_tablespace_databases - -[cols="145,378"] -|=== -h| 函数名称 h| pg_tablespace_databases -| 参数数据类型 | tablespace oid -| 函数返回值数据类型 | setof oid -| 函数含义 | 返回特定tablespace中保存的object的database的oid,如果本函数返回任何值,那么就表示tablespace不为空并且不能被drop掉。若想查出在该表空间内有哪些对象,你需要连接到本函数返回的database中,并查询pg_class获得这些对象。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_tablespace_databases(1663); -pg_tablespace_databases -------------------------- -16424 -1 -16878 -14174 -14173 -(5 rows) -postgres=# ----- -|=== - - - - -=== pg_tablespace_location - -[cols="145,378"] -|=== -h| 函数名称 h| pg_tablespace_location -| 参数数据类型 | tablespace oid -| 函数返回值数据类型 | Text -| 函数含义 | 返回指定tablespace的文件系统路径 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_tablespace_location(16391); -pg_tablespace_location ------------------------- -/home/pg131/ts1 -(1 row) -postgres=# ----- -|=== - - - - -=== pg_typeof - -[cols="145,378"] -|=== -h| 函数名称 h| pg_typeof -| 参数数据类型 | any -| 函数返回值数据类型 | regtype -| 函数含义 | 指定值的数据类型的oid -| 使用举例 -a| -[source,sql] ----- -postgres=# SELECT pg_typeof(33.339999); --[ RECORD 1 ]------ -pg_typeof \| numeric - -postgres=# SELECT typlen FROM pg_type WHERE oid = pg_typeof(33.339999); --[ RECORD 1 ] -typlen \| -1 - -postgres=# ----- - -|=== - - - - -=== COLLATION FOR - -[cols="145,378"] -|=== -h| 函数名称 h| COLLATION FOR -| 参数数据类型 | "any" -| 函数返回值数据类型 | text -| 函数含义 | 返回指定值的collation的name,本函数的返回值是被双引号引起来的,如果入参表达式不能派生出collation,则返回null如果传入的参数不是可以collatable的data type,则会抛出错误 -| 使用举例 -a| -[source,sql] ----- -postgres=# select collation for(datname) from pg_database; -pg_collation_for ------------------- -"C" -"C" -"C" -"C" -"C" -(5 rows) -postgres=# ----- -|=== - - - - -=== to_regclass - -[cols="145,378"] -|=== -h| 函数名称 h| to_regclass -| 参数数据类型 | text -| 函数返回值数据类型 | Regclass -| 函数含义 | 将文本形式的relation name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_regclass('public.data1'); --[ RECORD 1 ]------ -to_regclass \| data1 - -postgres=# \x -Expanded display is off. -postgres=# select oid, relname from pg_class where oid=to_regclass('public.data1'); - oid \| relname --------+--------- - 16384 \| data1 -(1 row) - -postgres=# ----- -|=== - - - - - - - -=== to_regcollation - -[cols="145,378"] -|=== -h| 函数名称 h| to_regcollation -| 参数数据类型 | Text -| 函数返回值数据类型 | regcollation -| 函数含义 | 将文本形式的collation name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_regcollation('"POSIX"'); - to_regcollation ------------------ - "POSIX" -(1 行记录) - -postgres=# select * from pg_collation where oid=to_regcollation('"POSIX"'); - oid \| collname \| collnamespace \| collowner \| collprovider \| collisdeterministic \| collencoding \| collcollate \| collctype \| collversion ------+----------+---------------+-----------+--------------+---------------------+--------------+-------------+-----------+------------- - 951 \| POSIX \| 11 \| 10 \| c \| t \| -1 \| POSIX \| POSIX \| -(1 行记录) - -postgres=# select oid,collname from pg_collation where oid=to_regcollation('"POSIX"'); - oid \| collname ------+---------- - 951 \| POSIX -(1 行记录) - -postgres=# ----- - -|=== - - - - -=== to_regnamespace - -[cols="145,378"] -|=== -h| 函数名称 h| to_regnamespace -| 参数数据类型 | text -| 函数返回值数据类型 | regnamespace -| 函数含义 | 将文本形式的schema name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_regnamespace('public'); -to_regnamespace ------------------ -public -(1 行记录) -postgres=# ----- -|=== - - - -=== to_regoper - -[cols="145,378"] -|=== -h| 函数名称 h| to_regoper -| 参数数据类型 | text -| 函数返回值数据类型 | regoper -| 函数含义 | 将文本形式的operator name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name或者含义不明确,本函数会返回NULL -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid, oprname from pg_operator where oid=to_regoper('!'); - oid \| oprname ------+--------- - 388 \| ! -(1 row) - -postgres=# select to_regoper('!'); - to_regoper ------------- - ! -(1 row) - -postgres=# ----- -|=== - - - -=== to_regoperator - -[cols="145,378"] -|=== -h| 函数名称 h| to_regoperator -| 参数数据类型 | text -| 函数返回值数据类型 | regoperator -| 函数含义 | 将文本形式的operator name(带参数类型)转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL. -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid, oprname from pg_operator where oid=to_regoperator('+(integer,integer)'); - oid \| oprname ------+--------- - 551 \| + -(1 row) - -postgres=# select to_regoperator('+(int4,int4)'); - to_regoperator --------------------- - +(integer,integer) -(1 row) - -postgres=# ----- - -|=== - - - - - -=== to_regproc - -[cols="145,378"] -|=== -h| 函数名称 h| to_regproc -| 参数数据类型 | text -| 函数返回值数据类型 | regproc -| 函数含义 | 将文本的function或者procedure转换为其oid。如果本函数未找到输入参数指定的name或者含义不明确,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_regproc('pg_stat_statements'); - to_regproc --------------------- - pg_stat_statements -(1 row) - -postgres=# select oid,proname from pg_proc where oid=to_regproc('pg_stat_statements'); - oid \| proname --------+-------------------- - 16401 \| pg_stat_statements -(1 row) - -postgres=# ----- - -|=== - - - -=== to_regprocedure - -[cols="145,378"] -|=== -h| 函数名称 h| to_regprocedure -| 参数数据类型 | text -| 函数返回值数据类型 | regprocedure -| 函数含义 | 将文本的function或者procedure(带参数)转换为其oid。如果本函数未找到输入参数指定的name,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_regprocedure('pg_get_viewdef(text)'); - to_regprocedure ----------------------- - pg_get_viewdef(text) -(1 row) - -postgres=# select oid, proname from pg_proc where oid= to_regprocedure('pg_get_viewdef(text)'); - oid \| proname -------+---------------- - 1640 \| pg_get_viewdef -(1 row) - -postgres=# ----- - -|=== - - - -=== to_regrole - -[cols="145,378"] -|=== -h| 函数名称 h| to_regrole -| 参数数据类型 | text -| 函数返回值数据类型 | regrole -| 函数含义 | 将文本的role name转换为其oid。如果本函数未找到输入参数指定的name,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid,rolname from pg_roles where oid=to_regrole('lc0039999'); - oid \| rolname --------+----------- - 16877 \| lc0039999 -(1 row) - -postgres=# select to_regrole('lc0039999'); - to_regrole ------------- - lc0039999 -(1 row) - -postgres=# ----- - -|=== - - - -=== to_regtype - -[cols="145,378"] -|=== -h| 函数名称 h| to_regtype -| 参数数据类型 | text -| 函数返回值数据类型 | regtype -| 函数含义 -a| 将文本的type name转换为其oid。如果本函数未找到输入参数指定的name,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_regtype('int4'); -to_regtype ------------- -integer -(1 row) -postgres=# select oid, typname from pg_type where oid=to_regtype('int4'); -oid \| typname ------+--------- -23 \| int4 -(1 row) -postgres=# ----- -|=== - - - - -=== pg_describe_object - -[cols="145,378"] -|=== -h| 函数名称 h| pg_describe_object -| 参数数据类型 | classid oid, objid oid, objsubid integer -| 函数返回值数据类型 | text -| 函数含义 -a| 用于描述pg_depend系统表中保存的依赖对象。 + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select oid,relname from pg_class where oid in (select distinct classid from pg_depend) order by oid; - oid \| relname -------+------------------------- - 1247 \| pg_type - 1255 \| pg_proc - 1259 \| pg_class - 2328 \| pg_foreign_data_wrapper - 2602 \| pg_amop - 2603 \| pg_amproc - 2606 \| pg_constraint - 2612 \| pg_language - 2616 \| pg_opclass - 2617 \| pg_operator - 2618 \| pg_rewrite - 2620 \| pg_trigger - 2753 \| pg_opfamily - 3079 \| pg_extension - 3600 \| pg_ts_dict - 3602 \| pg_ts_config - 3764 \| pg_ts_template -(17 rows) - -postgres=# select * from pg_foreign_data_wrapper ; - oid \| fdwname \| fdwowner \| fdwhandler \| fdwvalidator \| fdwacl \| fdwoptions --------+----------+----------+------------+--------------+--------+------------ - 16954 \| file_fdw \| 10 \| 16952 \| 16953 \| \| -(1 row) - -postgres=# select pg_describe_object(2328,16954,0); - pg_describe_object -------------------------------- - foreign-data wrapper file_fdw -(1 row) - -postgres=# ----- - -|=== - - - -=== pg_identify_object - -[cols="145,378"] -|=== -h| 函数名称 h| pg_identify_object -| 参数数据类型 | classid oid, objid oid, objsubid integer -| 函数返回值数据类型 | record ( type text, schema text, name text, identity text ) -| 函数含义 -a| 返回一个数据库对象的详细信息 + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_identify_object(2328,16954,0); -pg_identify_object ---------------------------------------------- -("foreign-data wrapper",,file_fdw,file_fdw) -(1 row) -postgres=# ----- -|=== - - - -=== pg_identify_object_as_address - -[cols="145,378"] -|=== -h| 函数名称 h| pg_identify_object_as_address -| 参数数据类型 | classid oid, objid oid, objsubid integer -| 函数返回值数据类型 | record ( type text, object_names text[], object_args text[] ) -| 函数含义 -a| 返回一个数据库对象的足够信息以标识出数据库对象 + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_identify_object_as_address(2328,16954,0); -pg_identify_object_as_address ----------------------------------------- -("foreign-data wrapper",{file_fdw},{}) -(1 row) -postgres=# ----- -|=== - - - - - -=== pg_get_object_address - -[cols="145,378"] -|=== -h| 函数名称 h| pg_get_object_address -| 参数数据类型 | type text, object_names text[], object_args text[] -| 函数返回值数据类型 | record ( classid oid, objid oid, objsubid integer ) -| 函数含义 -a| 本函数是pg_identify_object_as_address的反函数 + - + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_get_object_address('foreign-data wrapper','{file_fdw}','{}'); -pg_get_object_address ------------------------ -(2328,16954,0) -(1 row) -postgres=# ----- -|=== - - -=== col_description - -[cols="145,378"] -|=== -h| 函数名称 h| col_description -| 参数数据类型 | table oid, column integer -| 函数返回值数据类型 | text -| 函数含义 -a| 获取某个表的某个列的comment + - + - -| 使用举例 -a| -[source,sql] ----- -postgres=# create table t_comment(c1 int ); -CREATE TABLE -postgres=# comment on column t_comment.c1 is 'this is c1 comment!'; -COMMENT -postgres=# select oid from pg_class where oid=to_regclass('t_comment') -postgres-# ; - oid -------- - 17001 -(1 row) -postgres=# select col_description(17001,1); - col_description ---------------------- - this is c1 comment! -(1 row) -postgres=# -postgres=# select col_description(to_regclass('t_comment'),1); - col_description ---------------------- - this is c1 comment! -(1 row) - -postgres=# ----- -|=== - - - - -=== obj_description - -[cols="145,378"] -|=== -h| 函数名称 h| obj_description -| 参数数据类型 | object oid, catalog name 或者object oid -| 函数返回值数据类型 | text -| 函数含义 -a| 返回特定数据库对象的注释信息 + - + - -| 使用举例 -a| -[source,sql] ----- -postgres=# comment on table t_comment is ' table-level test comment'; -COMMENT -postgres=# \dt+ data1 - List of relations - Schema \| Name \| Type \| Owner \| Persistence \| Size \| Description ---------+-------+-------+-------+-------------+-------+------------- - public \| data1 \| table \| pg131 \| permanent \| 42 MB \| -(1 row) - -postgres=# \dt+ t_comment; - List of relations - Schema \| Name \| Type \| Owner \| Persistence \| Size \| Description ---------+-----------+-------+-------+-------------+---------+--------------------------- - public \| t_comment \| table \| pg131 \| permanent \| 0 bytes \| table-level test comment -(1 row) - -postgres=# select obj_description(17001); - obj_description ---------------------------- - table-level test comment -(1 row) - -postgres=# ----- -|=== - - - -=== shobj_description - -[cols="145,378"] -|=== -h| 函数名称 h| shobj_description -| 参数数据类型 | object oid, catalog name -| 函数返回值数据类型 | text -| 函数含义 | 返回特定共享数据库对象(如databases, roles, and tablespaces)的注释信息. -| 使用举例 -a| -[source,sql] ----- -postgres=# select shobj_description(14174,'pg_database'); -shobj_description --------------------------------------------- -default administrative connection database -(1 row) -postgres=# ----- -|=== - - - -=== pg_current_xact_id - -[cols="145,378"] -|=== -h| 函数名称 h| pg_current_xact_id -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | xid8 -| 函数含义 | 返回当前的事务id,若是没有当前事务id,系统会自动指派一个新的事务id -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_current_xact_id(); -pg_current_xact_id --------------------- -720 -(1 row) -postgres=# ----- -|=== - - - -=== pg_current_xact_id_if_assigned() - -[cols="145,378"] -|=== -h| 函数名称 h| pg_current_xact_id_if_assigned() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | xid8 -| 函数含义 | 返回当前的current transaction's ID,若是没有transaction's ID被指派,本函数返回NULL。如果事务可能是只读的,最好使用本函数,以避免不必要的XID消耗。 -| 使用举例 -a| -[source,sql] ----- -postgres=*# select pg_current_xact_id_if_assigned(); -pg_current_xact_id_if_assigned --------------------------------- -(1 row) -postgres=*# update data1 set c2='data1_1' where c1=1; -UPDATE 1 -postgres=*# select pg_current_xact_id_if_assigned(); -pg_current_xact_id_if_assigned --------------------------------- -722 -(1 row) -postgres=*# ----- -|=== - - - -=== pg_xact_status - -[cols="145,378"] -|=== -h| 函数名称 h| pg_xact_status -| 参数数据类型 | xid8 -| 函数返回值数据类型 | text -| 函数含义 | 返回近期事务的提交状态。本函数的执行结果是下面三个中的一个:in progress、commited、aborted。当事务足够老而没有在PostgreSQL中保存下来时,commit status会被丢弃,此时本函数返回结果为NULL。请注意,针对prepared transactions,本函数的返回结果为in progress,应用程序必须检查pg_prepared_xacts以确定一个transaction ID是否属于prepared transaction -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_xact_status(pg_current_xact_id()); -pg_xact_status ----------------- -in progress -(1 row) -postgres=# postgres=# select pg_xact_status(722::text::xid8); -pg_xact_status ----------------- -committed -(1 row) -postgres=# ----- -|=== - - - -=== pg_current_snapshot - -[cols="145,378"] -|=== -h| 函数名称 h| pg_current_snapshot -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | pg_snapshot -| 函数含义 -a| 返回当前的snapshot,这是一种显示哪个transaction id是正处于in-progress状态的数据结构。注意:有关pg_snapshot数据类型: pg_snapshot数据类型用于存储在一个特定时间点上的transaction ID visibility信息。 pg_snapshot数据类型的表示方法是xmin:xmax:xip_list这个xmin:xmax:xip_list就是pg_snapshot数据类型组成。见下: xmin:处于active状态的最小的transaction id,所有小于xmin的transaction id要么是committed (visible),要么是rolled back(dead) xmax:大于或者等于本xmax值的transaction id是在snapshot结束时未完成的,因此,xmax是不可见的。 xip_list:在生成snapshot时,处于in progress状态的transactions。在xmin <= X < xmax范围内并且不在本xip_list中的transaction ID 表示在snapshot生成时是已经完成的transaction ID,因此,根据commit status,要么是visible的要么是dead,本列表中不包括subtransactions的transaction IDs + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_current_snapshot(); -pg_current_snapshot ---------------------- -727:727: -(1 row) -postgres=# ----- -|=== - - - -=== pg_snapshot_xip - -[cols="145,378"] -|=== -h| 函数名称 h| pg_snapshot_xip -| 参数数据类型 | pg_snapshot -| 函数返回值数据类型 | setof xid8 -| 函数含义 | 返回snapshot中处于in-progress状态的transaction id -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_snapshot_xip('10:20:10,14,15'); -pg_snapshot_xip ------------------ -10 -14 -15 -(3 rows) -postgres=# ----- -|=== - - - -=== pg_snapshot_xmax - -[cols="145,378"] -|=== -h| 函数名称 h| pg_snapshot_xmax -| 参数数据类型 | pg_snapshot -| 函数返回值数据类型 | xid8 -| 函数含义 | 返回snapshot的xmax -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_snapshot_xmax('10:20:10,14,15'); -pg_snapshot_xmax ------------------- -20 -(1 row) -postgres=# ----- -|=== - - - -=== pg_snapshot_xmin - -[cols="145,378"] -|=== -h| 函数名称 h| pg_snapshot_xmin -| 参数数据类型 | pg_snapshot -| 函数返回值数据类型 | xid8 -| 函数含义 | 返回snapshot的xmin -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_snapshot_xmin('10:20:10,14,15'); -pg_snapshot_xmin ------------------- -10 -(1 row) -postgres=# ----- -|=== - - - -=== pg_visible_in_snapshot - -[cols="145,378"] -|=== -h| 函数名称 h| pg_visible_in_snapshot -| 参数数据类型 | xid8, pg_snapshot -| 函数返回值数据类型 | bool -| 函数含义 | 给定的事务ID是否对snapshot可见,即:给定的事务ID是否在生成snapshot之前完成。本函数对subtransaction ID不能给出正确的结果。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_visible_in_snapshot(722::text::xid8,'10:20:10,14,15'); -pg_visible_in_snapshot ------------------------- -f -(1 row) -postgres=# select pg_visible_in_snapshot(12::text::xid8,'10:20:10,14,15'); -pg_visible_in_snapshot ------------------------- -t -(1 row) -postgres=# ----- -|=== - - - -=== txid_current - -[cols="145,378"] -|=== -h| 函数名称 h| txid_current -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | bigint -| 函数含义 | 返回当前的事务id,若是没有当前事务id,系统会自动指派一个新的事务id。本函数(返回值是bigint数据类型)的作用与pg_current_xact_id(返回值是xid8数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_current(); -txid_current --------------- -735 -(1 row) -postgres=# ----- -|=== - - - -=== txid_current_if_assigned() - -[cols="145,378"] -|=== -h| 函数名称 h| txid_current_if_assigned() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | bigint -| 函数含义 | 本函数(注意:返回值是bigint数据类型)的作用与pg_current_xact_id_if_assigned(注意:返回值是xid8数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 -| 使用举例 -a| -[source,sql] ----- -[pg131@VM-0-8-centos ~]$ psql -d postgres psql (13.1) -Type "help" for help. -postgres=# select txid_current_if_assigned(); -txid_current_if_assigned --------------------------- -(1 row) -postgres=# begin; -BEGIN -postgres=*# select txid_current_if_assigned(); -txid_current_if_assigned --------------------------- -(1 row) -postgres=*# select txid_current(); -txid_current --------------- -738 -(1 row) -postgres=*# select txid_current_if_assigned(); -txid_current_if_assigned --------------------------- -738 -(1 row) ----- -|=== - - - -=== txid_current_snapshot() - -[cols="145,378"] -|=== -h| 函数名称 h| txid_current_snapshot() -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | txid_snapshot -| 函数含义 | 返回当前的snapshot,这是一种显示哪个transaction id是正处于in-progress状态的数据结构。本函数(注意:返回值是txid_snapshot数据类型)的作用与pg_current_snapshot (注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_current_snapshot(); -txid_current_snapshot ------------------------ -741:741: -(1 row) - postgres=# \gdesc - Column \| Type - -----------------------+--------------- - txid_current_snapshot \| txid_snapshot - (1 row) -postgres=# ----- -|=== - - - -=== txid_snapshot_xip(txid_snapshot) - -[cols="145,378"] -|=== -h| 函数名称 h| txid_snapshot_xip(txid_snapshot) -| 参数数据类型 | txid_snapshot -| 函数返回值数据类型 | setof bigint -| 函数含义 | 返回snapshot中处于in-progress状态的transaction id。本函数(注意:返回值是txid_snapshot数据类型)的作用与pg_snapshot_xip (注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_snapshot_xip('10:20:10,14,15'); -txid_snapshot_xip -------------------- -10 -14 -15 -(3 rows) - postgres=# \gdesc - Column \| Type - -------------------+-------- - txid_snapshot_xip \| bigint - (1 row) ----- -|=== - - - -=== txid_snapshot_xmax - -[cols="145,378"] -|=== -h| 函数名称 h| txid_snapshot_xmax -| 参数数据类型 | txid_snapshot -| 函数返回值数据类型 | bigint -| 函数含义 | 返回snapshot的xmax。本函数(注意:返回值是bigint数据类型)的作用与pg_snapshot_xmax (注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_snapshot_xmax('10:20:10,14,15'); -txid_snapshot_xmax --------------------- -20 -(1 row) - postgres=# \gdesc - Column \| Type - --------------------+-------- - txid_snapshot_xmax \| bigint - (1 row) -postgres=# ----- -|=== - - - -=== txid_snapshot_xmin - -[cols="145,378"] -|=== -h| 函数名称 h| txid_snapshot_xmin -| 参数数据类型 | txid_snapshot -| 函数返回值数据类型 | bigint -| 函数含义 | 返回snapshot的xmin。本函数(注意:返回值是bigint数据类型)的作用与pg_snapshot_xmin(注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_snapshot_xmin('10:20:10,14,15'); -txid_snapshot_xmin --------------------- -10 -(1 row) - postgres=# \gdesc - Column \| Type - --------------------+-------- - txid_snapshot_xmin \| bigint - (1 row) -postgres=# ----- -|=== - - - -=== txid_visible_in_snapshot - -[cols="145,378"] -|=== -h| 函数名称 h| txid_visible_in_snapshot -| 参数数据类型 | bigint, txid_snapshot -| 函数返回值数据类型 | boolean -| 函数含义 | 给定的事务ID是否对snapshot可见,即:给定的事务ID是否在生成snapshot之前完成。本函数对subtransaction ID不能给出正确的结果。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_visible_in_snapshot(722,'10:20:10,14,15'); -txid_visible_in_snapshot --------------------------- -f -(1 row) - postgres=# select txid_visible_in_snapshot(12,'10:20:10,14,15'); - txid_visible_in_snapshot - -------------------------- - t - (1 row) -postgres=# ----- -|=== - - - -=== txid_status - -[cols="145,378"] -|=== -h| 函数名称 h| txid_status -| 参数数据类型 | bigint -| 函数返回值数据类型 | text -| 函数含义 | 返回近期事务的提交状态。本函数的执行结果是下面三个中的一个:in progress、commited、aborted。当事务足够老而没有在PostgreSQL中保存下来时,commit status会被丢弃,此时本函数返回结果为NULL。请注意,针对prepared transactions,本函数的返回结果为in progress,应用程序必须检查pg_prepared_xacts以确定一个transaction ID是否属于prepared transaction. -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_status(txid_current()); -txid_status -------------- -in progress -(1 row) - postgres=# select txid_current(); - txid_current - -------------- - 742 - (1 row) - postgres=# select txid_status(722); - txid_status - ------------- - committed - (1 row) -postgres=# ----- -|=== - - - - - -=== pg_xact_commit_timestamp - -[cols="145,378"] -|=== -h| 函数名称 h| pg_xact_commit_timestamp -| 参数数据类型 | xid -| 函数返回值数据类型 | timestamp with time zone -| 函数含义 a| 返回一个事务的提交时间。本函数能正常使用的前提就是配置参数track_commit_timestamp设置为on,否会有如下提示: -[source,sql] ----- -postgres=# select pg_xact_commit_timestamp(722::text::xid); -ERROR: could not get commit timestamp data -HINT: Make sure the configuration parameter "track_commit_timestamp" is set. -postgres=# ----- -| 使用举例 -a| -[source,sql] ----- -postgres=# select txid_current(); -txid_current --------------- -743 -(1 row) - postgres=# select pg_xact_commit_timestamp(743::text::xid); - pg_xact_commit_timestamp - ------------------------------ - 2021-04-29 16:52:37.19133+08 - (1 row) -postgres=# ----- -|=== - - - -=== pg_last_committed_xact - -[cols="145,378"] -|=== -h| 函数名称 h| pg_last_committed_xact -| 参数数据类型 | 无输入数据类型 -| 函数返回值数据类型 | record ( xid xid, timestamp timestamp with time zone ) -| 函数含义 | 返回最后一个提交事务的transaction id和commit timestamp -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_last_committed_xact(); -pg_last_committed_xact --------------------------------------- -(743,"2021-04-29 16:52:37.19133+08") -(1 row) -postgres=# ----- -|=== - - - - - -=== pg_control_checkpoint - -[cols="145,378"] -|=== -h| 函数名称 h| pg_control_checkpoint -| 参数数据类型 | 无输入数据类型 -| 函数返回值数据类型 | record -| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回当前checkpoint状态的相关信息 -| 使用举例 -a| - -|=== - - - -=== pg_control_system - -[cols="145,378"] -|=== -h| 函数名称 h| pg_control_system -| 参数数据类型 | 无输入数据类型 -| 函数返回值数据类型 | record -| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回当前控制文件状态的相关信息。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_control_system(); -pg_control_system ---------------------------------------------------------------- -(1300,202007201,6908228805274066467,"2021-04-29 16:57:56+08") -(1 row) -postgres=# ----- -|=== - - - -=== pg_control_init - -[cols="145,378"] -|=== -h| 函数名称 h| pg_control_init -| 参数数据类型 | 无输入数据类型 -| 函数返回值数据类型 | record -| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回cluster初始化时的相关信息 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_control_init(); -pg_control_init ---------------------------------------------------- -(8,8192,131072,8192,16777216,64,32,1996,2048,t,0) -(1 row) -postgres=# ----- -|=== - - -=== pg_control_recovery - -[cols="145,378"] -|=== -h| 函数名称 h| pg_control_recovery -| 参数数据类型 | 无输入数据类型 -| 函数返回值数据类型 | record -| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回恢复状态的信息。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pg_control_recovery(); -pg_control_recovery ---------------------- -(0/0,0,0/0,0/0,f) -(1 row) -postgres=# ----- -|=== - - -=== gen_random_uuid - -[cols="145,378"] -|=== -h| 函数名称 h| gen_random_uuid -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | uuid -| 函数含义 | 本函数返回version 4版本的uuid -| 使用举例 -a| -[source,sql] ----- -postgres=# select gen_random_uuid(); -gen_random_uuid --------------------------------------- -39158a63-f6d0-4883-8765-8b8e9c9cae62 -(1 row) -postgres=# ----- -|=== - - - -=== array_to_tsvector - -[cols="145,378"] -|=== -h| 函数名称 h| array_to_tsvector -| 参数数据类型 | text[] -| 函数返回值数据类型 | tsvector -| 函数含义 | 将array of lexemes转换为tsvector -| 使用举例 -a| -[source,sql] ----- -postgres=# select array_to_tsvector('{fat,cat,rat}'::text[]); -array_to_tsvector -------------------- -'cat' 'fat' 'rat' -(1 row) -postgres=# ----- -|=== - - -=== get_current_ts_config - -[cols="145,378"] -|=== -h| 函数名称 h| get_current_ts_config -| 参数数据类型 | 无输入参数 -| 函数返回值数据类型 | regconfig -| 函数含义 | 返回当前默认的text search配置的oid(参见配置参数default_text_search_config) -| 使用举例 -a| -[source,sql] ----- -postgres=# select get_current_ts_config(); -get_current_ts_config ------------------------ -english -(1 row) -postgres=# ----- -|=== - - -=== length - -[cols="145,378"] -|=== -h| 函数名称 h| length -| 参数数据类型 | tsvector -| 函数返回值数据类型 | integer -| 函数含义 | 返回lexemes的数量 -| 使用举例 -a| -[source,sql] ----- -postgres=# select length('fat:2,4 cat:3 rat:5A'::tsvector); -length --------- -3 -(1 row) -postgres=# ----- -|=== - - - -=== numnode - -[cols="145,378"] -|=== -h| 函数名称 h| numnode -| 参数数据类型 | tsquery -| 函数返回值数据类型 | integer -| 函数含义 | 返回lexemes加operator的数量 -| 使用举例 -a| -[source,sql] ----- -postgres=# select numnode('(fat & rat) \| cat'::tsquery) ; -numnode ---------- -5 -(1 row) -postgres=# ----- -|=== - - - - - -=== plainto_tsquery - -[cols="145,378"] -|=== -h| 函数名称 h| plainto_tsquery -| 参数数据类型 | [config regconfig,] query text -| 函数返回值数据类型 | tsquery -| 函数含义 | 将text转换为tsquery。其中,字符串中的任何标点都将被忽略 -| 使用举例 -a| -[source,sql] ----- -postgres=# select plainto_tsquery('english', 'The Fat Rats'); -plainto_tsquery ------------------ -'fat' & 'rat' -(1 row) -postgres=# ----- -|=== - - -=== phraseto_tsquery - -[cols="145,378"] -|=== -h| 函数名称 h| phraseto_tsquery -| 参数数据类型 | [config regconfig,] query text -| 函数返回值数据类型 | tsquery -| 函数含义 | 将text转换为tsquery。其中,字符串中的任何标点都将被忽略 -| 使用举例 -a| -[source,sql] ----- -postgres=# select phraseto_tsquery('english', 'The Fat Rats') ; -phraseto_tsquery ------------------- -'fat' <-> 'rat' -(1 row) -postgres=# ----- -|=== - - - -=== websearch_to_tsquery - -[cols="145,378"] -|=== -h| 函数名称 h| websearch_to_tsquery -| 参数数据类型 | [ _config_ regconfig, ] _query_ text -| 函数返回值数据类型 | tsquery -| 函数含义 | 将text转换为tsquery。引用的单词序列被转换成短语测试。"or"一词被理解为产生or运算符,破折号产生NOT运算符,忽略其他标点符号 -| 使用举例 -a| -[source,sql] ----- -postgres=# select websearch_to_tsquery('english', '"fat rat" or cat dog'); -websearch_to_tsquery ---------------------------------- -'fat' <-> 'rat' \| 'cat' & 'dog' -(1 row) -postgres=# ----- -|=== - - - -=== querytree - -[cols="145,378"] -|=== -h| 函数名称 h| querytree -| 参数数据类型 | tsquery -| 函数返回值数据类型 | text -| 函数含义 | 返回一个tsquery中的可索引部分。当返回结果为空或者T时,表示这是一个不可索引的query。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select querytree('foo & ! bar'::tsquery); -querytree ------------ -'foo' -(1 row) -postgres=# ----- -|=== - - - -=== setweight - -[cols="145,378"] -|=== -h| 函数名称 h| setweight -| 参数数据类型 | vector tsvector, weight "char"或者vector tsvector, weight "char", lexemes text[] -| 函数返回值数据类型 | tsvector -| 函数含义 | 为vector中的每个元素指定权重或者为在lexemes之内的vector中的每个元素指定权重 -| 使用举例 -a| -[source,sql] ----- -postgres=# select setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A'); -setweight -------------------------------- -'cat':3A 'fat':2A,4A 'rat':5A -(1 row) - postgres=# - postgres=# select setweight('fat:2,4 cat:3 rat:5,6B'::tsvector, 'A', '{cat,rat}'); - setweight - -------------------------------- - 'cat':3A 'fat':2,4 'rat':5A,6A - (1 row) -postgres=# ----- -|=== - - - -=== strip - -[cols="145,378"] -|=== -h| 函数名称 h| strip -| 参数数据类型 | tsvector -| 函数返回值数据类型 | tsvector -| 函数含义 | 从tsvector中抹掉position和weight -| 使用举例 -a| -[source,sql] ----- -postgres=# select strip('fat:2,4 cat:3 rat:5A'::tsvector); -strip -------------------- -'cat' 'fat' 'rat' -(1 row) -postgres=# ----- -|=== - - - -=== to_tsquery - -[cols="145,378"] -|=== -h| 函数名称 h| to_tsquery -| 参数数据类型 | regconfig, text 或者text -| 函数返回值数据类型 | tsquery -| 函数含义 | 将text转换为tsquery,本函数的返回结果必须由有效的tsquery operator进行连接。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_tsquery('english', 'The & Fat & Rats'); -to_tsquery ---------------- -'fat' & 'rat' -(1 row) - postgres=# select to_tsquery( 'The & Fat & Rats'); - to_tsquery - --------------- - 'fat' & 'rat' - (1 row) -postgres=# ----- -|=== - - - -=== to_tsvector - -[cols="145,378"] -|=== -h| 函数名称 h| to_tsvector -| 参数数据类型 | regconfig,text -| 函数返回值数据类型 | tsvector -| 函数含义 | 将text转换为tsvector ,结果中包括位置信息 -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_tsvector('english', 'The Fat Rats'); -to_tsvector ------------------ -'fat':2 'rat':3 -(1 row) -postgres=# ----- -|=== - - - - -=== to_tsvector - -[cols="145,378"] -|=== -h| 函数名称 h| to_tsvector -| 参数数据类型 | regconfig,json或者regconfig,jsonb -| 函数返回值数据类型 | tsvector -| 函数含义 | 将json文档中的每个字符串值转换为tsvector,结果值是按照文档顺序进行连接后输出的,当输入参数数据类型为jsonb时,json对象的字段的文档顺序是与实现相关的 -| 使用举例 -a| -[source,sql] ----- -postgres=# select to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::json); -to_tsvector ------------------------- -'dog':5 'fat':2 'rat':3 -(1 row) - postgres=# postgres=# select to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::jsonb); - to_tsvector - ------------------------- - 'dog':1 'fat':4 'rat':5 - (1 row) -postgres=# ----- -|=== - - -=== json_to_tsvector - -[cols="145,378"] -|=== -h| 函数名称 h| json_to_tsvector -| 参数数据类型 | [config regconfig,] json, jsonb -| 函数返回值数据类型 | tsvector -| 函数含义 | 将json文档中满足filter条件的每个item转换为一个tsvector。结果值是按照文档顺序进行连接后输出的,当输入参数数据类型为jsonb时,json对象的字段的文档顺序是与实现相关的。Filter条件必须是一个包括另个或者多个关键字的json 数组:string代表包括所有字符串值numeric代表包括所有数字值boolean代表包括所有boolean值key代表包括所有keyall代表包括上述所有。作为一个简单的例子,filter条件不可以是一个简单的并且是上述关键字之一的json值。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select json_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::json, '["string", "numeric"]'); -json_to_tsvector -------------------------- -'123':5 'fat':2 'rat':3 -(1 row) -postgres=# ----- -|=== - - -=== jsonb_to_tsvector - -[cols="145,378"] -|=== -h| 函数名称 h| jsonb_to_tsvector -| 参数数据类型 | [config regconfig,] jsonb,jsonb -| 函数返回值数据类型 | tsvector -| 函数含义 | 将json文档中满足filter条件的每个item转换为一个tsvector。结果值是按照文档顺序进行连接后输出的,当输入参数数据类型为jsonb时,json对象的字段的文档顺序是与实现相关的。Filter条件必须是一个包括另个或者多个关键字的json 数组:string代表包括所有字符串值numeric代表包括所有数字值boolean代表包括所有boolean值key代表包括所有keyall代表包括上述所有。作为一个简单的例子,filter条件不可以是一个简单的并且是上述关键字之一的json值。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select jsonb_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::jsonb, '["string", "numeric"]'); -jsonb_to_tsvector -------------------------- -'123':5 'fat':2 'rat':3 -(1 row) -postgres=# ----- -|=== - - - -=== ts_delete - -[cols="145,378"] -|=== -h| 函数名称 h| ts_delete -| 参数数据类型 | tsvector,text -| 函数返回值数据类型 | tsvector -| 函数含义 -a| 从vector中删除掉指定的lexeme + - -| 使用举例 -a| -[source,sql] ----- -postgres=# select ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat'); -ts_delete ------------------- -'cat':3 'rat':5A -(1 row) -postgres=# ----- -|=== - - -=== ts_delete - -[cols="145,378"] -|=== -h| 函数名称 h| ts_delete -| 参数数据类型 | tsvector,text[] -| 函数返回值数据类型 | tsvector -| 函数含义 -a| 从vector中删除掉指定的lexeme -| 使用举例 -a| -[source,sql] ----- -postgres=# select ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat']); -ts_delete ----------- -'cat':3 -(1 row) -postgres=# ----- -|=== - - - -=== ts_filter - -[cols="145,378"] -|=== -h| 函数名称 h| ts_filter -| 参数数据类型 | tsvector, "char"[] -| 函数返回值数据类型 | tsvector -| 函数含义 | 从vector中筛选出带有指定weights的元素 -| 使用举例 -a| -[source,sql] ----- -postgres=# select ts_filter('fat:2,4 cat:3b,7c rat:5A'::tsvector, '{a,b}'); -ts_filter -------------------- -'cat':3B 'rat':5A -(1 row) -postgres=# ----- -|=== - - - -=== ts_headline - -[cols="145,378"] -|=== -h| 函数名称 h| ts_headline -| 参数数据类型 | [config regconfig,] document text, query tsquery [, options text] -| 函数返回值数据类型 | text -| 函数含义 | 以简写的形式显示在document匹配到的query -| 使用举例 -a| -[source,sql] ----- -postgres=# select ts_headline('The fat cat ate the rat.', 'cat'); -ts_headline ---------------------------------- -The fat cat ate the rat. -(1 row) -postgres=# ----- -|=== - - -=== ts_headline - -[cols="145,378"] -|=== -h| 函数名称 h| ts_headline -| 参数数据类型 | [config regconfig,] document json, query tsquery [, options text] -| 函数返回值数据类型 | json -| 函数含义 | 以缩写的形式显示在json document匹配到的query -| 使用举例 -a| -[source,sql] ----- -postgres=# select ts_headline('{"cat":"raining cats and dogs"}'::json, 'cat'); -ts_headline ----------------------------------------- -{"cat":"raining cats and dogs"} -(1 row) ----- -|=== - - -=== ts_headline - -[cols="145,378"] -|=== -h| 函数名称 h| ts_headline -| 参数数据类型 | [config regconfig,] document jsonb, query tsquery [, options text] -| 函数返回值数据类型 | jsonb -| 函数含义 | 以缩写的形式显示在json document匹配到的query -| 使用举例 -a| -[source,sql] ----- -postgres=# select ts_headline('{"cat":"raining cats and dogs"}'::jsonb, 'cat'); -ts_headline ------------------------------------------ -{"cat": "raining cats and dogs"} -(1 row) -postgres=# ----- -|=== - - - -=== ts_rank - -[cols="145,378"] -|=== -h| 函数名称 h| ts_rank -| 参数数据类型 | [weights real[], ] vector tsvector, query tsquery [, normalization integer] -| 函数返回值数据类型 | real -| 函数含义 | 计算query与vector的匹配程度 -| 使用举例 -a| -[source,sql] ----- -postgres=# SELECT ts_rank(to_tsvector('The quick brown fox jumps over the lazy dog.'),to_tsquery('fox & dog')); ts_rank ------------- -0.09148999 -(1 row) -postgres=# ----- -|=== - - - -=== ts_rank_cd - -[cols="145,378"] -|=== -h| 函数名称 h| ts_rank_cd -| 参数数据类型 | [weights real[], ] vector tsvector, query tsquery [, normalization integer] -| 函数返回值数据类型 | real -| 函数含义 | 使用覆盖密度算法来计算query与vector的匹配程度 -| 使用举例 -a| -[source,sql] ----- -postgres=# SELECT ts_rank_cd('{0.1, 0.2, 0.4, 1.0}', to_tsvector('PostgreSQL full text search is a wonderful method'),to_tsquery('wonderful')); -ts_rank_cd ------------- -0.1 -(1 row) -postgres=# ----- -|=== - - -=== ts_rewrite - -[cols="145,378"] -|=== -h| 函数名称 h| ts_rewrite -| 参数数据类型 | query tsquery, target tsquery, substitute tsquery -| 函数返回值数据类型 | tsquery -| 函数含义 | 用substitute替换掉query中的target -| 使用举例 -a| -[source,sql] ----- -postgres=# SELECT ts_rewrite('c & b'::tsquery, 'b'::tsquery, 'bad\|bat'::tsquery); -ts_rewrite -------------------------- -( 'bad' \| 'bat' ) & 'c' -(1 row) -postgres=# ----- -|=== - - - -=== ts_rewrite - -[cols="145,378"] -|=== -h| 函数名称 h| ts_rewrite -| 参数数据类型 | query tsquery, select text -| 函数返回值数据类型 | tsquery -| 函数含义 | -| 使用举例 -a| -[source,sql] ----- -postgres=# CREATE TABLE test (col1 tsquery PRIMARY KEY, COL2 tsquery); -CREATE TABLE -postgres=# INSERT INTO test values ('p','q'); -INSERT 0 1 -postgres=# SELECT ts_rewrite('r & q'::tsquery, 'SELECT col1,col2 FROM test'); -ts_rewrite ------------- -'r' & 'q' -(1 row) -postgres=# ----- -|=== - - - -=== tsquery_phrase - -[cols="145,378"] -|=== -h| 函数名称 h| tsquery_phrase -| 参数数据类型 | query1 tsquery, query2 tsquery -| 函数返回值数据类型 | tsquery -| 函数含义 | 构造一个phrase query用于在连续的词位匹配query1和query2(同<->操作符) -| 使用举例 -a| -[source,sql] ----- -postgres=# select tsquery_phrase(to_tsquery('fat'), to_tsquery('cat')); -tsquery_phrase ------------------ -'fat' <-> 'cat' -(1 row) -postgres=# ----- -|=== - - -=== tsquery_phrase - -[cols="145,378"] -|=== -h| 函数名称 h| tsquery_phrase -| 参数数据类型 | query1 tsquery, query2 tsquery, distance integer -| 函数返回值数据类型 | tsquery -| 函数含义 | 构造一个词组查询,该词组搜索匹配query1且query2完全distance分开词素的匹配项 -| 使用举例 -a| -[source,sql] ----- -postgres=# select tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10); -tsquery_phrase ------------------- -'fat' <10> 'cat' -(1 row) -postgres=# ----- -|=== - - - - -=== tsvector_to_array - -[cols="145,378"] -|=== -h| 函数名称 h| tsvector_to_array -| 参数数据类型 | tsvector -| 函数返回值数据类型 | text[] -| 函数含义 | 将tsvector转换为词素数组 -| 使用举例 -a| -[source,sql] ----- -postgres=# select tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector) ; -tsvector_to_array -------------------- -{cat,fat,rat} -(1 row) -postgres=# ----- -|=== - - - -=== unnest - -[cols="145,378"] -|=== -h| 函数名称 h| unnest -| 参数数据类型 | tsvector -| 函数返回值数据类型 | setof record ( lexeme text, positions smallint[], weights text ) -| 函数含义 | 将tsvector扩展为一行一个词素 -| 使用举例 -a| -[source,sql] ----- -postgres=# select * from unnest('cat:3 fat:2,4 rat:5A'::tsvector); - lexeme \| positions \| weights ---------+-----------+--------- - cat \| {3} \| {D} - fat \| {2,4} \| {D,D} - rat \| {5} \| {A} -(3 rows) -postgres=# ----- -|=== - - - -=== abbrev - -[cols="145,378"] -|=== -h| 函数名称 h| abbrev -| 参数数据类型 | inet -| 函数返回值数据类型 | text -| 函数含义 | 将inet转换为text的缩写显示格式 -| 使用举例 -a| -[source,sql] ----- -postgres=# select abbrev(inet '10.1.1.3'); -abbrev ----------- -10.1.1.3 -(1 row) -postgres=# ----- -|=== - - - -=== abbrev - -[cols="145,378"] -|=== -h| 函数名称 h| abbrev -| 参数数据类型 | cidr -| 函数返回值数据类型 | text -| 函数含义 | 将cidr转换为text的缩写显示格式,返回结果中去掉了netmask中右边的零 -| 使用举例 -a| -[source,sql] ----- -postgres=# select abbrev(cidr '10.1.0.0/16'); -abbrev ---------- -10.1/16 -(1 row) -postgres=# ----- -|=== - - - -=== broadcast - -[cols="145,378"] -|=== -h| 函数名称 h| broadcast -| 参数数据类型 | inet -| 函数返回值数据类型 | inet -| 函数含义 | 计算一个ip地址的广播地址 -| 使用举例 -a| -[source,sql] ----- -postgres=# select broadcast(inet '192.168.1.5/24'); -broadcast ------------------- -192.168.1.255/24 -(1 row) -postgres=# ----- -|=== - - - -=== family - -[cols="145,378"] -|=== -h| 函数名称 h| family -| 参数数据类型 | inet -| 函数返回值数据类型 | integer -| 函数含义 | 返回一个地址是IPV4(返回4)还是IPV6(返回6) -| 使用举例 -a| -[source,sql] ----- -postgres=# select family('fe80::5054:ff:fe99:540c') ; -family --------- -6 -(1 row) - postgres=# select family(inet '172.1.0.23') ; - family - -------- - 4 - (1 row) -postgres=# ----- -|=== - - - -=== host - -[cols="145,378"] -|=== -h| 函数名称 h| host -| 参数数据类型 | inet -| 函数返回值数据类型 | text -| 函数含义 | 返回IP地址的text形式,且忽略掉netmask -| 使用举例 -a| -[source,sql] ----- -postgres=# select host(inet '192.168.1.0/24'); -host -------------- -192.168.1.0 -(1 row) -postgres=# ----- -|=== - - - -=== hostmask - -[cols="145,378"] -|=== -h| 函数名称 h| hostmask -| 参数数据类型 | Inet -| 函数返回值数据类型 | Inet -| 函数含义 | 返回ip地址的host mask -| 使用举例 -a| -[source,sql] ----- -postgres=# select hostmask(inet '192.168.23.20/30') ; -hostmask ----------- -0.0.0.3 -(1 row) -postgres=# ----- -|=== - - -=== inet_merge - -[cols="145,378"] -|=== -h| 函数名称 h| inet_merge -| 参数数据类型 | inet, inet -| 函数返回值数据类型 | cidr -| 函数含义 | 返回包含两个给定网络的最小网络 -| 使用举例 -a| -[source,sql] ----- -postgres=# select inet_merge(inet '192.168.1.5/24', inet '192.168.2.5/24'); -inet_merge ----------------- -192.168.0.0/22 -(1 row) -postgres=# ----- -|=== - - -=== inet_same_family - -[cols="145,378"] -|=== -h| 函数名称 h| inet_same_family -| 参数数据类型 | inet,inet -| 函数返回值数据类型 | bool -| 函数含义 | 返回两个ip地址是否属于同一个family -| 使用举例 -a| -[source,sql] ----- -postgres=# select inet_same_family(inet '192.168.1.5/24', inet '::1'); -inet_same_family ------------------- -f -(1 row) -postgres=# ----- -|=== - - - -=== masklen - -[cols="145,378"] -|=== -h| 函数名称 h| masklen -| 参数数据类型 | inet -| 函数返回值数据类型 | integer -| 函数含义 | 返回以位为单位的网络掩码长度 -| 使用举例 -a| -[source,sql] ----- -postgres=# select masklen(inet '192.168.1.5/24'); -masklen ---------- -24 -(1 row) -postgres=# ----- -|=== - - -=== netmask - -[cols="145,378"] -|=== -h| 函数名称 h| netmask -| 参数数据类型 | inet -| 函数返回值数据类型 | inet -| 函数含义 | 返回网络地址的网络掩码 -| 使用举例 -a| -[source,sql] ----- -postgres=# select netmask(inet '192.168.1.5/24'); -netmask ---------------- -255.255.255.0 -(1 row) -postgres=# ----- -|=== - - - -=== network - -[cols="145,378"] -|=== -h| 函数名称 h| network -| 参数数据类型 | inet -| 函数返回值数据类型 | inet -| 函数含义 | 返回地址的网络部分,将网络掩码右边的内容清零 -| 使用举例 -a| -[source,sql] ----- -postgres=# select network(inet '192.168.1.5/24') ; -network ----------------- -192.168.1.0/24 -(1 row) -postgres=# ----- -|=== - - - -=== set_masklen - -[cols="145,378"] -|=== -h| 函数名称 h| set_masklen -| 参数数据类型 | inet, integer -| 函数返回值数据类型 | inet -| 函数含义 | 为inet设置netmask长度,网络地址部分保持不变 -| 使用举例 -a| -[source,sql] ----- -postgres=# select set_masklen(inet '192.168.1.5/24', 16); -set_masklen ----------------- -192.168.1.5/16 -(1 row) -postgres=# ----- -|=== - - - -=== set_masklen - -[cols="145,378"] -|=== -h| 函数名称 h| set_masklen -| 参数数据类型 | cidr, integer -| 函数返回值数据类型 | cidr -| 函数含义 | 为cidr设置netmask长度,网络地址右边的设置为零 -| 使用举例 -a| -[source,sql] ----- -postgres=# select set_masklen(cidr '192.168.1.0/24', 16); -set_masklen ----------------- -192.168.0.0/16 -(1 row) -postgres=# ----- -|=== - - - -=== text - -[cols="145,378"] -|=== -h| 函数名称 h| text -| 参数数据类型 | inet -| 函数返回值数据类型 | text -| 函数含义 | 返回ip地址及其掩码的text形式 -| 使用举例 -a| -[source,sql] ----- -postgres=# select text(inet '192.168.1.5'); -text ----------------- -192.168.1.5/32 -(1 row) -postgres=# ----- -|=== - - -=== trunc - -[cols="145,378"] -|=== -h| 函数名称 h| trunc -| 参数数据类型 | macaddr -| 函数返回值数据类型 | macaddr -| 函数含义 | 将mac地址的最后三个字节清零,前缀可以与特定的网卡制造商关联 -| 使用举例 -a| -[source,sql] ----- -postgres=# select trunc(macaddr '12:34:56:78:90:ab') ; -trunc -------------------- -12:34:56:00:00:00 -(1 row) -postgres=# ----- -|=== - - -=== trunc - -[cols="145,378"] -|=== -h| 函数名称 h| trunc -| 参数数据类型 | macaddr8 -| 函数返回值数据类型 | macaddr8 -| 函数含义 | 将mac地址的最后五个字节清零,前缀可以与特定的网卡制造商关联 -| 使用举例 -a| -[source,sql] ----- -postgres=# select trunc(macaddr8 '12:34:56:78:90:ab:cd:ef') ; -trunc -------------------------- -12:34:56:00:00:00:00:00 -(1 row) -postgres=# ----- -|=== - - -=== macaddr8_set7bit - -[cols="145,378"] -|=== -h| 函数名称 h| macaddr8_set7bit -| 参数数据类型 | macaddr8 -| 函数返回值数据类型 | macaddr8 -| 函数含义 | 将地址的第7位设置为1,从而创建被称为修改后的EUI-64,以包含在IPv6地址中。 -| 使用举例 -a| -[source,sql] ----- -postgres=# select macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef'); -macaddr8_set7bit -------------------------- -02:34:56:ff:fe:ab:cd:ef -(1 row) -postgres=# ----- -|=== - - -=== area - -[cols="145,378"] -|=== -h| 函数名称 h| area -| 参数数据类型 | geometric_type -| 函数返回值数据类型 | double precision -| 函数含义 | 计算面积,针对box, path, circle适用,path必须是能closed,否则会返回NULL -| 使用举例 -a| -[source,sql] ----- -postgres=# select area(box '(2,2),(0,0)'); -area ------- -4 -(1 row) -postgres=# ----- -|=== - - - -=== center - -[cols="145,378"] -|=== -h| 函数名称 h| center -| 参数数据类型 | geometric_type -| 函数返回值数据类型 | point -| 函数含义 | 计算中点,针对box, circle适用 -| 使用举例 -a| -[source,sql] ----- -postgres=# select center(box '(1,2),(0,0)') ; - center - --------- - (0.5,1) - (1 row) -postgres=# ----- -|=== - - -=== diagonal - -[cols="145,378"] -|=== -h| 函数名称 h| diagonal -| 参数数据类型 | box -| 函数返回值数据类型 | lseg -| 函数含义 | 获取box的对角线作为一个line segment,作用与lseg(box)一样 -| 使用举例 -a| -[source,sql] ----- -postgres=# select diagonal(box '(1,2),(0,0)'); -diagonal ---------------- -[(1,2),(0,0)] -(1 row) -postgres=# ----- -|=== - - -=== diameter - -[cols="145,378"] -|=== -h| 函数名称 h| diameter -| 参数数据类型 | circle -| 函数返回值数据类型 | double precision -| 函数含义 | 计算circle的直径 -| 使用举例 -a| -[source,sql] ----- -postgres=# select diameter(circle '<(0,0),2>') ; -diameter - ---------- - 4 -(1 row) -postgres=# ----- -|=== - - - -=== height - -[cols="145,378"] -|=== -h| 函数名称 h| height -| 参数数据类型 | box -| 函数返回值数据类型 | double precision -| 函数含义 | 计算box的垂直大小 -| 使用举例 -a| -[source,sql] ----- -postgres=# select height(box '(1,2),(0,0)'); - height - -------- - 2 - (1 row) -postgres=# ----- -|=== - - -=== isclosed - -[cols="145,378"] -|=== -h| 函数名称 h| isclosed -| 参数数据类型 | path -| 函数返回值数据类型 | bool -| 函数含义 | path是否是closed的 -| 使用举例 -a| -[source,sql] ----- -postgres=# select isclosed(path '((0,0),(1,1),(2,0))'); - isclosed - ---------- - t - (1 row) -postgres=# ----- -|=== - - -=== isopen - -[cols="145,378"] -|=== -h| 函数名称 h| isopen -| 参数数据类型 | path -| 函数返回值数据类型 | bool -| 函数含义 | Path是否是open的 -| 使用举例 -a| -[source,sql] ----- -postgres=# select isopen(path '[(0,0),(1,1),(2,0)]'); -isopen - -------- - t -(1 row) -postgres=# ----- -|=== - - - -=== length - -[cols="145,378"] -|=== -h| 函数名称 h| length -| 参数数据类型 | geometric_type -| 函数返回值数据类型 | double precision -| 函数含义 | 计算总长度,对lseg以及path适用 -| 使用举例 -a| -[source,sql] ----- -postgres=# select length(path '((-1,0),(1,0))') ; - length - -------- - 4 -(1 row) -postgres=# ----- -|=== - - - -=== npoints - -[cols="145,378"] -|=== -h| 函数名称 h| npoints -| 参数数据类型 | geometric_type -| 函数返回值数据类型 | integer -| 函数含义 | 返回point的数量,对path以及polygon适用 -| 使用举例 -a| -[source,sql] ----- -postgres=# select npoints(path '[(0,0),(1,1),(2,0)]'); -npoints ---------- - 3 - (1 row) -postgres=# ----- -|=== - - - -=== pclose - -[cols="145,378"] -|=== -h| 函数名称 h| pclose -| 参数数据类型 | path -| 函数返回值数据类型 | path -| 函数含义 | 将patch转换为closed的形式 -| 使用举例 -a| -[source,sql] ----- -postgres=# select pclose(path '[(0,0),(1,1),(2,0)]'); -pclose ---------------------- -((0,0),(1,1),(2,0)) -(1 row) -postgres=# ----- -|=== - - - -=== popen - -[cols="145,378"] -|=== -h| 函数名称 h| popen -| 参数数据类型 | path -| 函数返回值数据类型 | path -| 函数含义 | 将patch转换为open的形式 -| 使用举例 -a| -[source,sql] ----- -postgres=# select popen(path '((0,0),(1,1),(2,0))'); -popen ---------------------- -[(0,0),(1,1),(2,0)] -(1 row) -postgres=# ----- -|=== - - - - - - -=== radius - -[cols="145,378"] -|=== -h| 函数名称 h| radius -| 参数数据类型 | circle -| 函数返回值数据类型 | double precision -| 函数含义 | 求一个圆形的半径 -| 使用举例 -a| -[source,sql] ----- -postgres=# select radius(circle '<(0,0),2>'); - radius - -------- - 2 - (1 row) -postgres=# ----- -|=== - - - -=== slope - -[cols="145,378"] -|=== -h| 函数名称 h| slope -| 参数数据类型 | point,point -| 函数返回值数据类型 | double precision -| 函数含义 | 计算通过两个点的直线的斜率 -| 使用举例 -a| -[source,sql] ----- -postgres=# select slope(point '(0,0)', point '(2,1)'); - slope - ------- - 0.5 -(1 row) -postgres=# ----- -|=== - - - - -=== width - -[cols="145,378"] -|=== -h| 函数名称 h| width -| 参数数据类型 | double precision -| 函数返回值数据类型 | box -| 函数含义 | 计算box的horizontal size -| 使用举例 -a| -[source,sql] ----- -postgres=# select width(box '(1,2),(0,0)') ; -width -------- -1 -(1 row) -postgres=# ----- -|=== - - - - -=== box - -[cols="145,378"] -|=== -h| 函数名称 h| box -| 参数数据类型 | circle -| 函数返回值数据类型 | box -| 函数含义 | 计算圆内切的box -| 使用举例 -a| -[source,sql] ----- -postgres=# select box(circle '<(0,0),2>'); -box -------------------------------------------------------------------------------- -(1.414213562373095,1.414213562373095),(-1.414213562373095,-1.414213562373095) -(1 row) -postgres=# ----- -|=== - diff --git a/CN/modules/ROOT/pages/110.md b/CN/modules/ROOT/pages/110.md new file mode 100644 index 00000000..0962b238 --- /dev/null +++ b/CN/modules/ROOT/pages/110.md @@ -0,0 +1,1627 @@ +## PostgreSQL 函数参考手册 +### current_catalog +| 函数名称 h| current_catalog | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | Name | +| 函数含义 | 获得当前的database 名称。 + 注意:在SQL标准中,databases被称之为catalogs。 | +| 使用举例 | +| postgres=# select current_catalog; current_catalog ----------------- postgres (1 row) postgres=# | + +### current_database() +| 函数名称 h| current_database() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | name | +| 函数含义 | 获得当前的database 名称。 | +| 使用举例 | +| postgres=# select current_database(); current_database ------------------ postgres (1 row) postgres=# | + +### current_query() +| 函数名称 h| current_query() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | text | +| 函数含义 | 获得client端提交的当前执行的SQL语句的文本 | +| 使用举例 | +| postgres=# BEGIN; BEGIN postgres=*# select 1,current_query(); ?column? \ | current_query ----------+--------------------------- 1 \ | select 1,current_query(); (1 row) postgres=*# select 2,current_query(); ?column? \ | current_query ----------+--------------------------- 2 \ | select 2,current_query(); (1 row) postgres=*# ROLLBACK; ROLLBACK postgres=# | + +### current_role +| 函数名称 h| current_role | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | name | +| 函数含义 | 与current_user作用相同,获得当前执行上下文的username | +| 使用举例 | +| postgres=# select current_role; current_role -------------- pg131 (1 row) postgres=# | + +### current_schema +| 函数名称 h| current_schema | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | name | +| 函数含义 | 获得search path中的第一个schema名称(当search path为空时,返回空值)。当表或者其他对象建立不带schema名称时,本函数返回的schema就是该表或者该对象的schema | +| 使用举例 | +| postgres=# select current_schema; current_schema ---------------- public (1 row) postgres=# | + +### current_schema() +| 函数名称 h| current_schema() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | name | +| 函数含义 | 作用与current_schema函数相同:获得search path中的第一个schema名称(当search path为空时,返回空值)。当表或者其他对象建立不带schema名称时,本函数返回的schema就是该表或者该对象的schema | +| 使用举例 | +| postgres=# select current_schema(); current_schema ---------------- public (1 row) postgres=# | + +### current_schemas(include_implicit boolean) +| 函数名称 h| current_schemas(include_implicit boolean) | +| --- | --- | +| 参数数据类型 | bool | +| 函数返回值数据类型 | name | +| 函数含义 | 以优先级顺序返回有效search_path中当前所有模式名称,如果入参为true,那么在函数返回结果中会包括隐式搜索的系统模式pg_catalog | +| 使用举例 | +| postgres=# select current_schemas(false); current_schemas ----------------- {public} (1 row) postgres=# select current_schemas(true); current_schemas --------------------- {pg_catalog,public} (1 row) postgres=# | + +### current_user +| 函数名称 h| current_user | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | name | +| 函数含义 | 获得当前执行上下文的username | +| 使用举例 | +| postgres=# select current_user; current_user -------------- pg131 (1 row) postgres=# | + +### inet_client_addr() +| 函数名称 h| inet_client_addr() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | inet | +| 函数含义 | 获得当前client的ip地址。如果返回值为空,表示当前连接是经过Unix-domain socket的 | +| 使用举例 | +| postgres=# select inet_client_addr(); inet_client_addr ------------------ (1 row) postgres=# | + +### inet_client_port() +| 函数名称 h| inet_client_port() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | integer | +| 函数含义 | 获得当前client的端口号。如果返回值为空,表示当前连接是经过Unix-domain socket的 | +| 使用举例 | +| postgres=# select inet_client_port(); inet_client_port ------------------ (1 row) postgres=# | + +### inet_server_addr() +| 函数名称 h| inet_server_addr() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | inet | +| 函数含义 | 获得当前连接的pg数据库服务器的ip地址。如果返回值为空,表示当前连接是经过Unix-domain socket的。 | +| 使用举例 | +| postgres=# select inet_server_port(); inet_server_port ------------------ (1 row) postgres=# | + +### inet_server_port() +| 函数名称 h| inet_server_port() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | integer | +| 函数含义 | 获得当前连接的pg数据库服务器的端口号。如果返回值为空,表示当前连接是经过Unix-domain socket的。 | +| 使用举例 | +| postgres=# select inet_server_port(); inet_server_port ------------------ (1 row) postgres=# | + +### pg_backend_pid() +| 函数名称 h| pg_backend_pid() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | integer | +| 函数含义 | 获得附加到当前session的backend进程的进程ID | +| 使用举例 | +| postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 4068 (1 row) postgres=# | + +### pg_blocking_pids(integer) +| 函数名称 h| pg_blocking_pids(integer) | +| --- | --- | +| 参数数据类型 | Integer | +| 函数返回值数据类型 | Integer[] | +| 函数含义 | +| 返回入参pid的blocking pid(即:阻塞者pid)若是本函数返回空值,表示不存在阻塞者若是本函数返回值是零,那么表示阻塞者是prepared transacion,见下面的输出: postgres=# select pg_blocking_pids(12947); pg_blocking_pids ------------------ {0} (1 row) postgres=# ---- 频繁调用本函数会对数据库性能有影响,因为本函数在短时间内对lock manager's shared state进行排他访问(exclusive accesss) | +| 使用举例 | +| Session1: postgres=# SELECT pg_backend_pid(); pg_backend_pid ---------------- 32262 (1 row) postgres=# CREATE TABLE tbl_students(rno int, name character varying(10)); CREATE TABLE postgres=# BEGIN TRANSACTION; BEGIN postgres=*# LOCK tbl_students IN ACCESS EXCLUSIVE MODE; LOCK TABLE postgres=*# session2: postgres=# SELECT pg_backend_pid(); pg_backend_pid ---------------- 32439 (1 row) postgres=# INSERT INTO tbl_students VALUES (1,'Anvesh'); session3: postgres=# SELECT pg_blocking_pids(32439); pg_blocking_pids ------------------ {32262} (1 row) postgres=# | + +### pg_conf_load_time() +| 函数名称 h| pg_conf_load_time() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | timestamp with time zone | +| 函数含义 | 返回PG配置参数文件最后一次被reload的时间 | +| 使用举例 | +| postgres=# select pg_conf_load_time(); pg_conf_load_time ------------------------------- 2021-03-22 12:46:18.962643+08 (1 row) postgres=# | + +### pg_current_logfile([text]); +| 函数名称 h| pg_current_logfile([text]); | +| --- | --- | +| 参数数据类型 | 无输入参数或者text型输入参数 (csvlog、stderr) | +| 函数返回值数据类型 | Text | +| 函数含义 | 返回正在被logging collector进程使用的log file的path(是log_directory的值)和文件名。当logging collector是被禁用时,本函数返回结果是null。当有不同格式的多种log files存在时,不带任何参数的pg_current_logfile()函数返回有序列表(stderr、csvlog)中找到的第一种格式的文件path和文件名。当没有这两个格式的文件时,本函数返回NULL | +| 使用举例 | +| postgres=# select pg_current_logfile(); pg_current_logfile -------------------------------------- log/postgresql-2021-03-22_124618.log (1 row) postgres=# select pg_current_logfile('stderr'); pg_current_logfile -------------------------------------- log/postgresql-2021-03-22_124618.log (1 row) postgres=# select pg_current_logfile('csvlog'); pg_current_logfile -------------------- (1 row) postgres=# show log_destination ; log_destination ----------------- stderr (1 row) postgres=# | + +### pg_my_temp_schema() +| 函数名称 h| pg_my_temp_schema() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | oid | +| 函数含义 | 返回当前会话的临时schema的OID,如果没有临时schema,本函数返回0(即:数字零) | +| 使用举例 | +| postgres=# select pg_my_temp_schema(); pg_my_temp_schema ------------------- 0 (1 row) postgres=# | + +### pg_is_other_temp_schema(oid) +| 函数名称 h| pg_is_other_temp_schema(oid) | +| --- | --- | +| 参数数据类型 | oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 当入参的oid是其他session中临时schema的oid时,本函数返回true。 | +| 使用举例 | +| postgres=# select pg_is_other_temp_schema(16426); pg_is_other_temp_schema ------------------------- f (1 row) postgres=# | + +### pg_jit_available() +| 函数名称 h| pg_jit_available() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | boolean | +| 函数含义 | 如果jit编译器扩展是可用的并且jit配置参数设置为on的话,本函数返回true | +| 使用举例 | +| postgres=# select pg_jit_available(); pg_jit_available ------------------ f (1 row) postgres=# select * from pg_config where name='CONFIGURE' AND SETTING LIKE '%--with-llvm%'; name \ | setting ------+--------- (0 rows) postgres=# show jit; jit ----- on (1 row) postgres=# | + +### pg_listening_channels() +| 函数名称 h| pg_listening_channels() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | setof text | +| 函数含义 | 当前session正在监听的异步通知通道的名称 | +| 使用举例 | +| postgres=# select pg_listening_channels(); pg_listening_channels ----------------------- (0 rows) postgres=# | + +### pg_notification_queue_usage() +| 函数名称 h| pg_notification_queue_usage() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | double precision | +| 函数含义 | 返回被正在等待处理的通知占据的异步通知队列最大大小的比例。 | +| 使用举例 | +| postgres=# select pg_notification_queue_usage(); pg_notification_queue_usage ----------------------------- 0 (1 row) postgres=# | + +### pg_postmaster_start_time() +| 函数名称 h| pg_postmaster_start_time() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | timestamp with time zone | +| 函数含义 | 返回PG intance 启动的时间点 | +| 使用举例 | +| postgres=# select pg_postmaster_start_time(); pg_postmaster_start_time ------------------------------- 2021-03-23 14:01:33.352011+08 (1 row) postgres=# | + +### pg_safe_snapshot_blocking_pids(integer) +| 函数名称 h| pg_safe_snapshot_blocking_pids(integer) | +| --- | --- | +| 参数数据类型 | Integer | +| 函数返回值数据类型 | integer[] | +| 函数含义 | 返回阻止指定服务器进程ID获取安全快照的进程ID若是没有阻塞,则返回空array。一个运行SERIALIZABLE事务的session阻塞了一个SERIALIZABLE READ ONLY DEFERRABLE事务,防止后者获得snapshot,直到后者确认可以安全的避免获取任何谓词锁。频繁调用本函数会对数据库性能有影响,因为它在短时间内需要访问谓词锁管理器的共享状态(predicate lock manager's shared state) | +| 使用举例 | +| postgres=# select pg_safe_snapshot_blocking_pids(1234); pg_safe_snapshot_blocking_pids -------------------------------- {} (1 row) postgres=# | + +### pg_trigger_depth() +| 函数名称 h| pg_trigger_depth() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | integer | +| 函数含义 | 返回PostgreSQL触发器的当前嵌套级别(如果没有从触发器内部直接或间接调用,则为返回值为0) | +| 使用举例 | +| postgres=# select pg_trigger_depth(); pg_trigger_depth ------------------ 0 (1 row) postgres=# | + +### user +| 函数名称 h| user | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | name | +| 函数含义 | 获得当前执行上下文的username,等同于current_user函数 | +| 使用举例 | +| postgres=# select user; user ------- pg131 (1 row) postgres=# | + +### Version() +| 函数名称 h| Version() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | text | +| 函数含义 | 返回带有数据库版本号的字符串,您也可以查询server_version配置参数获得数据库版本号。对于机器可读的版本,请使用server_version_num配置参数。在软件开发过程中应该使用server_version_num配置参数或者PqserverVersion,而不是去解析文本的版本号(见下面的使用举例) | +| 使用举例 | +| postgres=# select version(); version --------------------------------------------------------------------------------------------------------- PostgreSQL 13.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit (1 row) postgres=# | + +### has_any_column_privilege(user, table, privilege) +| 函数名称 h| has_any_column_privilege(user, table, privilege) | +| --- | --- | +| 参数数据类型 | user, table, privilege或者table, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 确定一个user是否对当前PG database中的某个table任一列有列权限确定当前user是否对当前PG database中的某个table任一列有列权限权限类型是SELECT, INSERT, UPDATE,REFERENCES的组合。 | +| 使用举例 | +| [pg131@VM-0-8-centos ~]$ psql -d cwbase3 -U lc0039999 psql (13.1) Type "help" for help. cwbase3=> \d List of relations Schema \ | Name \ | Type \ | Owner --------+-------+-------+----------- public \ | test1 \ | table \ | lc0039999 (1 row) cwbase3=> select has_any_column_privilege('lc0039999','test1','select'); has_any_column_privilege -------------------------- t (1 row) cwbase3=> cwbase3=> select has_any_column_privilege('test1','select,insert'); has_any_column_privilege -------------------------- t (1 row) cwbase3=> cwbase3=> select has_any_column_privilege('test1','select'); has_any_column_privilege -------------------------- t (1 row) cwbase3=> | + +### has_column_privilege(user, table, column, privilege) +| 函数名称 h| has_column_privilege(user, table, column, privilege); | +| --- | --- | +| 参数数据类型 | user, table, column, privilege或者table, column, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user对特定表的某一列是否具有某种权限当前user对特定表的某一列是否具有某种权限权限类型是SELECT, INSERT, UPDATE,REFERENCES的组合。 | +| 使用举例 | +| cwbase3=> \d test1 Table "public.test1" Column \ | Type \ | Collation \ | Nullable \ | Default --------+---------+-----------+----------+--------- id \ | integer \ | \ | \ cwbase3=> cwbase3=> select has_column_privilege('lc0039999','test1','id','select'); has_column_privilege ---------------------- t (1 row) cwbase3=> cwbase3=> select has_column_privilege('test1','id','select'); has_column_privilege ---------------------- t (1 row) cwbase3=> | + +### has_database_privilege +| 函数名称 h| has_database_privilege | +| --- | --- | +| 参数数据类型 | user, database, privilege或者database, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定database有某种权限当前user是否对特定database有某种权限权限类型是CREATE, CONNECT, TEMPORARY, or TEMP的组合。 | +| 使用举例 | +| postgres=# select has_database_privilege('lc0039999','cwbase3','create,connect,temp'); has_database_privilege ------------------------ t (1 row) postgres=# select has_database_privilege('lc0019999','cwbase3','create,connect,temp'); has_database_privilege ------------------------ t (1 row) postgres=# | + +### has_foreign_data_wrapper_privilege +| 函数名称 h| has_foreign_data_wrapper_privilege | +| --- | --- | +| 参数数据类型 | user, fdw, privilege或者fdw, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定fdw有usage权限当前user是否对特定fdw有usage权限此处的权限只能指定usage | +| 使用举例 | +| postgres=# select has_foreign_data_wrapper_privilege('lc0019999','file_fdw','usage'); has_foreign_data_wrapper_privilege ------------------------------------ f (1 row) postgres=# postgres=# select has_foreign_data_wrapper_privilege('file_fdw','usage'); has_foreign_data_wrapper_privilege ------------------------------------ t (1 row) postgres=# | + +### has_function_privilege +| 函数名称 h| has_function_privilege | +| --- | --- | +| 参数数据类型 | user, function, privilege或者function, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定function有EXECUTE权限当前user是否对特定function有EXECUTE权限此处的权限只能是EXECUTE | +| 使用举例 | +| postgres=# select has_function_privilege('lc0039999','version()','execute'); has_function_privilege ------------------------ t (1 row) postgres=# postgres=# select has_function_privilege('version()','execute'); has_function_privilege ------------------------ t (1 row) postgres=# | + +### has_language_privilege +| 函数名称 h| has_language_privilege | +| --- | --- | +| 参数数据类型 | user, language, privilege或者language, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定procedural language有usage权限当前user是否对特定procedural language有usage权限此处的权限必须是usage | +| 使用举例 | +| postgres=# select has_language_privilege('lc0019999','sql','usage'); has_language_privilege ------------------------ t (1 row) postgres=# select has_language_privilege('plpgsql','usage'); has_language_privilege ------------------------ t (1 row) postgres=# ---- 注意:此处的language可以从pg_language系统表查询到。 | + +### has_schema_privilege +| 函数名称 h| has_schema_privilege | +| --- | --- | +| 参数数据类型 | user, schema, privilege或者schema, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定schema有usage或者create权限当前user是否对特定schema有usage或者create权限此处的权限必须是create或者usage的组合 | +| 使用举例 | +| postgres=# \dnS List of schemas Name \ | Owner --------------------+------- information_schema \ | pg131 pg_catalog \ | pg131 pg_toast \ | pg131 public \ | pg131 s_abc \ | pg131 (5 rows) postgres=# select has_schema_privilege('lc0019999','s_abc','usage'); has_schema_privilege ---------------------- f (1 row) postgres=# select has_schema_privilege('lc0019999','s_abc','usage,create'); has_schema_privilege ---------------------- f (1 row) postgres=# | + +### has_sequence_privilege +| 函数名称 h| has_sequence_privilege | +| --- | --- | +| 参数数据类型 | user, sequence, privilege或者sequence, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定sequence有特定权限当前user是否对特定sequence有特定权限此处的权限是USAGE, SELECT, UPDATE的组合。 | +| 使用举例 | +| postgres=# \ds+ List of relations Schema \ | Name \ | Type \ | Owner \ | Persistence \ | Size \ | Description --------+--------------+----------+-------+-------------+------------+------------- public \ | gen_y_c1_seq \ | sequence \ | pg131 \ | permanent \ | 8192 bytes \ (1 row) postgres=# select has_sequence_privilege('pg131','gen_y_c1_seq','usage'); has_sequence_privilege ------------------------ t (1 row) postgres=# select has_sequence_privilege('lc0039999','gen_y_c1_seq','usage'); has_sequence_privilege ------------------------ f (1 row) postgres=# | + +### has_server_privilege +| 函数名称 h| has_server_privilege | +| --- | --- | +| 参数数据类型 | user, server, privilege或者server, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定foreign server有usage权限特定user是否对特定foreign server有usage权限此处的权限必须是usage | +| 使用举例 | +| postgres=# select has_server_privilege('s1','usage'); has_server_privilege ---------------------- t (1 row) postgres=# select has_server_privilege('s1','USAGE'); has_server_privilege ---------------------- t (1 row) postgres=# select has_server_privilege('pg123','s1','USAGE'); has_server_privilege ---------------------- t (1 row) postgres=# | + +### has_table_privilege +| 函数名称 h| has_table_privilege | +| --- | --- | +| 参数数据类型 | user, table, privilege或者table, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定table有特定权限当前user是否对特定table有特定权限此处的权限是指如下的组合: SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER,还可以带有WITH GRANT OPTION用来测试privilege是否带有grant option。当权限字符串有多个值(比如'insert, select')时,只要有任何一个权限是满足的,本函数会返回t有关对权限字符串的说明:权限字符串不区分大小写权限字符串的前后可以有一个或者多个空格(权限名字内部不能有空格) | +| 使用举例 | +| postgres=# select has_table_privilege('t1',' select, insert '); has_table_privilege --------------------- t (1 row) postgres=# [pg131@VM-0-8-centos ~]$ psql -d cwbase3 -U lc0039999 psql (13.1) Type "help" for help. cwbase3=> cwbase3=> grant select on test1 to lc0019999; GRANT cwbase3=> exit [pg131@VM-0-8-centos ~]$ psql -d cwbase3 -U lc0019999 psql (13.1) Type "help" for help. cwbase3=> select * from test1; id ---- 1 2 3 4 5 (6 rows) cwbase3=> select has_table_privilege('test1','insert, select '); has_table_privilege --------------------- t (1 row) cwbase3=> select has_table_privilege('test1','insert'); has_table_privilege --------------------- f (1 row) cwbase3=> select has_table_privilege('test1',' insert '); has_table_privilege --------------------- f (1 row) cwbase3=> insert into test1 values(6); ERROR: permission denied for table test1 cwbase3=> | + +### has_tablespace_privilege +| 函数名称 h| has_tablespace_privilege | +| --- | --- | +| 参数数据类型 | user, tablespace, privilege或者tablespace, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定tablesapce有特定权限当前user是否对特定tablespace有特定权限此处的权限必须是create | +| 使用举例 | +| postgres=# select has_tablespace_privilege('ts1','create '); has_tablespace_privilege -------------------------- t (1 row) postgres=# select has_tablespace_privilege('lc0019999','ts1','create '); has_tablespace_privilege -------------------------- f (1 row) postgres=# | + +### has_type_privilege +| 函数名称 h| has_type_privilege | +| --- | --- | +| 参数数据类型 | user, type, privilege或者type, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定type有特定权限当前user是否对特定type有特定权限特定type可以使用type的name,也可以使用oid::regtype的形式此处的权限必须是USAGE | +| 使用举例 | +| postgres=# select has_type_privilege('bytea','usage'); has_type_privilege -------------------- t (1 row) postgres=# select has_type_privilege('lc0019999','bytea','usage'); has_type_privilege -------------------- t (1 row) postgres=# select has_type_privilege('lc0019999','17:regtype','usage'); ERROR: syntax error at or near "17" CONTEXT: invalid type name "17:regtype" postgres=# select has_type_privilege('lc0019999',17::regtype,'usage'); has_type_privilege -------------------- t (1 row) postgres=# select has_type_privilege('lc0019999','17::regtype','usage'); ERROR: syntax error at or near "17" CONTEXT: invalid type name "17::regtype" postgres=# | + +### pg_has_role +| 函数名称 h| pg_has_role | +| --- | --- | +| 参数数据类型 | user, role, privilege或者role, privilege | +| 函数返回值数据类型 | boolean | +| 函数含义 | 特定user是否对特定role group有特定权限当前user是否对特定role group有特定权限此处的权限必须是member或者usage当权限是member时,表示特定user是否是特定role group的member当权限是usage时,表示在不执行set role时,特定user是否有特定role的权限 | +| 使用举例 | +| postgres=# create role editors; CREATE ROLE postgres=# create user maxwell; CREATE ROLE postgres=# create user ernest; CREATE ROLE postgres=# grant authors to editors; --editors can do what authors can do GRANT ROLE postgres=# grant editors to maxwell; --maxwell is an editor GRANT ROLE postgres=# grant authors to ernest; --ernest is an author GRANT ROLE postgres=# select pg_has_role('maxwll','editors','member'); ERROR: role "maxwll" does not exist postgres=# select pg_has_role('maxwell','editors','member'); pg_has_role ------------- t (1 row) postgres=# select pg_has_role('maxwell','editors','usage'); pg_has_role ------------- t (1 row) postgres=# select pg_has_role('maxwell','ernest','usage'); pg_has_role ------------- f (1 row) postgres=# select pg_has_role('maxwell','ernest','member'); pg_has_role ------------- f (1 row) postgres=# | + +### row_security_active +| 函数名称 h| row_security_active | +| --- | --- | +| 参数数据类型 | Table,可以是table name,也可以是table的oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在current_user的上下文中,特定table是否已开启row security | +| 使用举例 | +| postgres=# select oid from pg_class where relname='test'; oid ------- 16860 (1 row) postgres=# select row_security_active('test'); row_security_active --------------------- f (1 row) postgres=# select row_security_active(16860); row_security_active --------------------- f (1 row) postgres=# | + +### acldefault +| 函数名称 h| acldefault | +| --- | --- | +| 参数数据类型 | type, ownerId | +| 函数返回值数据类型 | aclitem[] | +| 函数含义 | 返回属于某个user oid对象的默认访问权限。当一个对象的ACL条目为null时这些访问权限是该对象的默认权限Type参数的取值如下:'c' for COLUMN'r' for TABLE 以及类似对象's' for SEQUENCE'd' for DATABASE'f' for FUNCTION 或者PROCEDURE'l' for LANGUAGE'L' for LARGE OBJECT'n' for SCHEMA't' for TABLESPACE'F' for FOREIGN DATA WRAPPER'S' for FOREIGN SERVER'T' for TYPE or DOMAIN | +| 使用举例 | +| postgres=# select acldefault('f',16877); acldefault -------------------------------------- {=X/lc0039999,lc0039999=X/lc0039999} (1 row) postgres=# | + +### aclexplode +| 函数名称 h| aclexplode | +| --- | --- | +| 参数数据类型 | aclitem[] | +| 函数返回值数据类型 | setof record | +| 函数含义 | 解析 acl 权限 | +| 使用举例 | +| postgres=# select aclexplode('{=X/lc0039999,lc0039999=X/lc0039999}'); aclexplode ------------------------- (16877,0,EXECUTE,f) (16877,16877,EXECUTE,f) (2 rows) postgres=# postgres=# select \* from aclexplode('{=X/lc0039999,lc0039999=X/lc0039999}'); grantor \ | grantee \ | privilege_type \ | is_grantable ---------+---------+----------------+-------------- 16877 \ | 0 \ | EXECUTE \ | f 16877 \ | 16877 \ | EXECUTE \ | f (2 rows) postgres=# | + +### makeaclitem +| 函数名称 h| makeaclitem | +| --- | --- | +| 参数数据类型 | grantee, grantor, privilege, grantable | +| 函数返回值数据类型 | aclitem | +| 函数含义 | 构建aclitem | +| 使用举例 | +| postgres=# select \* from makeaclitem(16877,16877,'EXECUTE',false); makeaclitem ----------------------- lc0039999=X/lc0039999 (1 row) postgres=# | + +### pg_collation_is_visible +| 函数名称 h| pg_collation_is_visible | +| --- | --- | +| 参数数据类型 | collation_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定collation是否可见。 | +| 使用举例 | +| postgres=# select * from pg_collation where collname = 'zh_CN'; oid \ | collname \ | collnamespace \ | collowner \ | collprovider \ | collisdeterministic \ | collencoding \ | collcollate \ | collctype \ | collversion -------+----------+---------------+-----------+--------------+---------------------+--------------+-------------+------------+------------- 13086 \ | zh_CN \ | 11 \ | 10 \ | c \ | t \ | 2 \ | zh_CN \ | zh_CN \ | 2.17 13243 \ | zh_CN \ | 11 \ | 10 \ | c \ | t \ | 6 \ | zh_CN.utf8 \ | zh_CN.utf8 \ | 2.17 (2 rows) postgres=# select pg_collation_is_visible(13086); pg_collation_is_visible ------------------------- f (1 row) postgres=# select pg_collation_is_visible(13243); pg_collation_is_visible ------------------------- t (1 row) postgres=# postgres=# select pg_collation_is_visible('"zh_CN"'::regcollation); pg_collation_is_visible ------------------------- t (1 row) postgres=# | + +### pg_conversion_is_visible +| 函数名称 h| pg_conversion_is_visible | +| --- | --- | +| 参数数据类型 | conversion_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定conversion是否可见 | +| 使用举例 | +| postgres=# select * from pg_conversion where conname like '%cn%'; oid \ | conname \ | connamespace \ | conowner \ | conforencoding \ | contoencoding \ | conproc \ | condefault ------+----------------+--------------+----------+----------------+---------------+----------------+------------ 4422 \ | euc_cn_to_mic \ | 11 \ | 10 \ | 2 \ | 7 \ | euc_cn_to_mic \ | t 4423 \ | mic_to_euc_cn \ | 11 \ | 10 \ | 7 \ | 2 \ | mic_to_euc_cn \ | t 4480 \ | euc_cn_to_utf8 \ | 11 \ | 10 \ | 2 \ | 6 \ | euc_cn_to_utf8 \ | t 4481 \ | utf8_to_euc_cn \ | 11 \ | 10 \ | 6 \ | 2 \ | utf8_to_euc_cn \ | t (4 rows) postgres=# select pg_conversion_is_visible(4480); pg_conversion_is_visible -------------------------- t (1 row) postgres=# | + +### pg_function_is_visible +| 函数名称 h| pg_function_is_visible | +| --- | --- | +| 参数数据类型 | function_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定function、procedures、aggregates是否可见。对于函数,如果路径前面没有相同名称和参数数据类型的对象,则搜索路径中的对象可见 | +| 使用举例 | +| postgres=# select oid from pg_proc where proname='version'; oid ----- 89 (1 row) postgres=# select pg_function_is_visible(89); pg_function_is_visible ------------------------ t (1 row) postgres=# postgres=# select pg_function_is_visible('version'::regproc); pg_function_is_visible ------------------------ t (1 row) postgres=# select pg_function_is_visible('version()'::regprocedure); pg_function_is_visible ------------------------ t (1 row) postgres=# | + +### pg_opclass_is_visible +| 函数名称 h| pg_opclass_is_visible | +| --- | --- | +| 参数数据类型 | opclass_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定operator class是否可见考虑因素是operator class name和相关的索引访问方法。 | +| 使用举例 | +| postgres=# select oid from pg_opclass where opcname='array_ops'; oid ------- 10000 10001 10063 (3 rows) postgres=# select pg_opclass_is_visible(10000); pg_opclass_is_visible ----------------------- t (1 row) postgres=# | + +### pg_operator_is_visible +| 函数名称 h| pg_operator_is_visible | +| --- | --- | +| 参数数据类型 | operator_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定operator 是否可见对于运算符,如果路径前面没有相同名称和参数数据类型的对象,则搜索路径中的对象可见 | +| 使用举例 | +| postgres=# select oprname from pg_operator where oid=15; oprname --------- = (1 row) postgres=# select pg_operator_is_visible(15); pg_operator_is_visible ------------------------ t (1 row) postgres=# postgres=# select pg_operator_is_visible('=(integer,integer)'::regoperator); pg_operator_is_visible ------------------------ t (1 row) postgres=# | + +### pg_opfamily_is_visible +| 函数名称 h| pg_opfamily_is_visible | +| --- | --- | +| 参数数据类型 | opclass_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定operator family是否可见 | +| 使用举例 | +| postgres=# select * from pg_opfamily where oid='397'; oid \ | opfmethod \ | opfname \ | opfnamespace \ | opfowner -----+-----------+-----------+--------------+---------- 397 \ | 403 \ | array_ops \ | 11 \ | 10 (1 row) postgres=# select pg_opfamily_is_visible(397); pg_opfamily_is_visible ------------------------ t (1 row) postgres=# | + +### pg_statistics_obj_is_visible +| 函数名称 h| pg_statistics_obj_is_visible | +| --- | --- | +| 参数数据类型 | stat_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定operator class是否可见 | +| 使用举例 | + +### pg_table_is_visible +| 函数名称 h| pg_table_is_visible | +| --- | --- | +| 参数数据类型 | table_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定的table、views、materialized views、 indexes、 sequences、foreign tables是否可见 | +| 使用举例 | +| postgres=# select oid from pg_class where relname='data1'; oid ------- 16384 (1 row) postgres=# select pg_table_is_visible(16384); pg_table_is_visible --------------------- t (1 row) postgres=# postgres=# SELECT pg_table_is_visible('public.data1'::regclass); pg_table_is_visible --------------------- t (1 row) postgres=# | + +### pg_ts_config_is_visible +| 函数名称 h| pg_ts_config_is_visible | +| --- | --- | +| 参数数据类型 | config_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定text search configuration是否可见 | +| 使用举例 | +| postgres=# select oid from pg_ts_config where cfgname='greek'; oid ------- 13861 (1 row) postgres=# select pg_ts_config_is_visible(13861); pg_ts_config_is_visible ------------------------- t (1 row) postgres=# postgres=# select pg_ts_config_is_visible('greek'::regconfig); pg_ts_config_is_visible ------------------------- t (1 row) postgres=# | + +### pg_ts_dict_is_visible +| 函数名称 h| pg_ts_dict_is_visible | +| --- | --- | +| 参数数据类型 | _dict_oid_ | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定text search dictionary是否可见 | +| 使用举例 | +| postgres=# select oid,dictname,dictinitoption from pg_ts_dict where dictname='greek_stem'; oid \ | dictname \ | dictinitoption -------+------------+-------------------- 13860 \ | greek_stem \ | language = 'greek' (1 row) postgres=# select pg_ts_dict_is_visible(13860); pg_ts_dict_is_visible ----------------------- t (1 row) postgres=# postgres=# select pg_ts_dict_is_visible('greek_stem'::regdictionary); pg_ts_dict_is_visible ----------------------- t (1 row) postgres=# | + +### pg_ts_parser_is_visible +| 函数名称 h| pg_ts_parser_is_visible | +| --- | --- | +| 参数数据类型 | parser_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定text search parser是否可见 | +| 使用举例 | +| postgres=# select * from pg_ts_parser ; oid \ | prsname \ | prsnamespace \ | prsstart \ | prstoken \ | prsend \ | prsheadline \ | prslextype ------+---------+--------------+------------+----------------+----------+---------------+-------------- 3722 \ | default \ | 11 \ | prsd_start \ | prsd_nexttoken \ | prsd_end \ | prsd_headline \ | prsd_lextype (1 row) postgres=# select pg_ts_parser_is_visible(3722); pg_ts_parser_is_visible ------------------------- t (1 row) postgres=# | + +### pg_ts_template_is_visible +| 函数名称 h| pg_ts_template_is_visible | +| --- | --- | +| 参数数据类型 | template_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定text search template是否可见 | +| 使用举例 | +| postgres=# select * from pg_ts_template ; oid \ | tmplname \ | tmplnamespace \ | tmplinit \ | tmpllexize -------+-----------+---------------+----------------+------------------ 3727 \ | simple \ | 11 \ | dsimple_init \ | dsimple_lexize 3730 \ | synonym \ | 11 \ | dsynonym_init \ | dsynonym_lexize 3733 \ | ispell \ | 11 \ | dispell_init \ | dispell_lexize 3742 \ | thesaurus \ | 11 \ | thesaurus_init \ | thesaurus_lexize 13845 \ | snowball \ | 11 \ | dsnowball_init \ | dsnowball_lexize (5 rows) postgres=# select pg_ts_temp postgres=# select pg_ts_template_is_visible(3730); pg_ts_template_is_visible --------------------------- t (1 row) postgres=# | + +### pg_type_is_visible +| 函数名称 h| pg_type_is_visible | +| --- | --- | +| 参数数据类型 | type_oid | +| 函数返回值数据类型 | boolean | +| 函数含义 | 在当前schema search path中,特定type、domain是否可见 | +| 使用举例 | +| postgres=# select oid,typname from pg_type where typname='bool'; oid \ | typname -----+--------- 16 \ | bool (1 row) postgres=# select pg_type_is_visible(16); pg_type_is_visible -------------------- t (1 row) postgres=# postgres=# SELECT pg_type_is_visible('pg_catalog.bool'::regtype); pg_type_is_visible -------------------- t (1 row) postgres=# | + +### format_type +| 函数名称 h| format_type | +| --- | --- | +| 参数数据类型 | type_oid, typemod | +| 函数返回值数据类型 | Text | +| 函数含义 | 得到一个data type的SQL Name | +| 使用举例 | +| postgres=# select * from pg_type where typname='bool'; -[ RECORD 1 ]--+--------- oid \ | 16 typname \ | bool typnamespace \ | 11 typowner \ | 10 typlen \ | 1 typbyval \ | t typtype \ | b typcategory \ | B typispreferred \ | t typisdefined \ | t typdelim \ | , typrelid \ | 0 typelem \ | 0 typarray \ | 1000 typinput \ | boolin typoutput \ | boolout typreceive \ | boolrecv typsend \ | boolsend typmodin \ | - typmodout \ | - typanalyze \ | - typalign \ | c typstorage \ | p typnotnull \ | f typbasetype \ | 0 typtypmod \ | -1 typndims \ | 0 typcollation \ | 0 typdefaultbin \ typdefault \ typacl \ postgres=# postgres=# select format_type(16,0); format_type ------------- boolean (1 row) postgres=# | + +### pg_get_constraintdef +| 函数名称 h| pg_get_constraintdef | +| --- | --- | +| 参数数据类型 | constraint_oid或者constraint_oid, pretty_bool | +| 函数返回值数据类型 | text | +| 函数含义 | 得到一个constraint的定义 | +| 使用举例 | +| postgres=# select pg_get_constraintdef(16918); pg_get_constraintdef ---------------------- PRIMARY KEY (c1) (1 row) postgres=# | + +### pg_get_expr +| 函数名称 h| pg_get_expr | +| --- | --- | +| 参数数据类型 | +| pg_node_tree, relation_oid,或者 + pg_node_tree, relation_oid, pretty_bool | +| 函数返回值数据类型 | Text | +| 函数含义 | 反编译指定expression的内部格式,假设:其中的任何变量引用第二个参数指示的relation | +| 使用举例 | +| postgres=# CREATE TABLE tab1 (a int, b int) PARTITION BY RANGE(a); CREATE TABLE postgres=# CREATE TABLE tab1_p1 PARTITION OF tab1 FOR VALUES FROM (0) TO (100); CREATE TABLE postgres=# CREATE TABLE tab1_p2 PARTITION OF tab1 FOR VALUES FROM (100) TO (200); CREATE TABLE postgres=# select relname, pg_get_expr(relpartbound, oid) from pg_class where relispartition and relname ~ 'tab1' order by relname; relname \ | pg_get_expr ---------+-------------------------------- tab1_p1 \ | FOR VALUES FROM (0) TO (100) tab1_p2 \ | FOR VALUES FROM (100) TO (200) (2 rows) postgres=# | + +### pg_get_functiondef +| 函数名称 h| pg_get_functiondef | +| --- | --- | +| 参数数据类型 | func_oid | +| 函数返回值数据类型 | text | +| 函数含义 | +| 获得function或者procedure的定义 + + | +| 使用举例 | +| postgres=# select pg_get_functiondef(89); pg_get_functiondef ------------------------------------------------- CREATE OR REPLACE FUNCTION pg_catalog.version()+ RETURNS text + LANGUAGE internal + STABLE PARALLEL SAFE STRICT + AS $function$pgsql_version$function$ (1 row) postgres=# | + +### pg_get_function_arguments +| 函数名称 h| pg_get_function_arguments | +| --- | --- | +| 参数数据类型 | func_oid | +| 函数返回值数据类型 | text | +| 函数含义 | +| 获得function或者procedure的传入参数清单 + + | +| 使用举例 | +| postgres=# select oid from pg_proc where proname='has_database_privilege'; -[ RECORD 1 ] oid \ | 2250 -[ RECORD 2 ] oid \ | 2251 -[ RECORD 3 ] oid \ | 2252 -[ RECORD 4 ] oid \ | 2253 -[ RECORD 5 ] oid \ | 2254 -[ RECORD 6 ] oid \ | 2255 postgres=# select pg_get_function_arguments(2250); -[ RECORD 1 ]-------------+----------------- pg_get_function_arguments \ | name, text, text postgres=# \x Expanded display is off. postgres=# select pg_get_function_arguments(2250); pg_get_function_arguments --------------------------- name, text, text (1 row) postgres=# | + +### pg_get_function_identity_arguments +| 函数名称 h| pg_get_function_identity_arguments | +| --- | --- | +| 参数数据类型 | func_oid | +| 函数返回值数据类型 | text | +| 函数含义 | +| 获得参数清单以标识出function或者procedure + + | +| 使用举例 | +| postgres=# select pg_get_function_identity_arguments(2250); pg_get_function_identity_arguments ------------------------------------ name, text, text (1 row) postgres=# | + +### pg_get_function_result +| 函数名称 h| pg_get_function_result | +| --- | --- | +| 参数数据类型 | func_oid | +| 函数返回值数据类型 | text | +| 函数含义 | 获得function,若是procedure,返回null | +| 使用举例 | +| postgres=# select pg_get_function_result(89); pg_get_function_result ------------------------ text (1 row) postgres=# | + +### pg_get_indexdef +| 函数名称 h| pg_get_indexdef | +| --- | --- | +| 参数数据类型 | index_oid或者index_oid, column_no, pretty_bool | +| 函数返回值数据类型 | text | +| 函数含义 | 获得索引的定义语句获得某个索引上第n个索引列的名称 | +| 使用举例 | +| postgres=# select oid from pg_class where relname='idx_2'; oid ------- 16427 (1 row) postgres=# select pg_get_indexdef(16427); pg_get_indexdef --------------------------------------------------------- CREATE INDEX idx_2 ON public.data1 USING btree (c1, c3) (1 row) postgres=# postgres=# select pg_get_indexdef(16427,2,true); pg_get_indexdef ----------------- c3 (1 row) postgres=# select pg_get_indexdef(16427,1,true); pg_get_indexdef ----------------- c1 (1 row) postgres=# | + +### pg_get_keywords +| 函数名称 h| pg_get_keywords | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | setof record | +| 函数含义 | 返回PostgreSQL数据库中的SQL关键字清单返回结果中有3列(以逗号分隔),第一列是关键字名称,第二列catcode是category code U for unreserved C for column name T for type or function name R for reserved第三列catdesc是描述 | +| 使用举例 a postgres=# select pg_get_keywords(); pg_get_keywords ------------------------------------------------------------------ (abort,U,unreserved) (absolute,U,unreserved) (access,U,unreserved) (action,U,unreserved) (add,U,unreserved) (admin,U,unreserved) (after,U,unreserved) (aggregate,U,unreserved) (all,R,reserved) (also,U,unreserved) (alter,U,unreserved) (always,U,unreserved) (analyse,R,reserved) (analyze,R,reserved) (and,R,reserved) 限于篇幅,本函数的输出仅摘录到此处 | + +### pg_get_ruledef +| 函数名称 h| pg_get_ruledef | +| --- | --- | +| 参数数据类型 | rule_oid或者rule_oid, pretty_bool | +| 函数返回值数据类型 | Text | +| 函数含义 | 获得rule的create rule语句 | +| 使用举例 | +| postgres=# select oid ,rulename from pg_rewrite where rulename='pg_settings_u'; oid \ | rulename -------+--------------- 12168 \ | pg_settings_u (1 row) postgres=# select pg_get_ruledef(12168); pg_get_ruledef --------------------------------------------------------------------------------------------------- CREATE RULE pg_settings_u AS + ON UPDATE TO pg_catalog.pg_settings + WHERE (new.name = old.name) DO SELECT set_config(old.name, new.setting, false) AS set_config; (1 row) postgres=# | + +### pg_get_serial_sequence +| 函数名称 h| pg_get_serial_sequence | +| --- | --- | +| 参数数据类型 | table_name, column_name | +| 函数返回值数据类型 | text | +| 函数含义 | 获得自增列或者标识列使用的sequence的name | +| 使用举例 | +| postgres=# select pg_get_serial_sequence('gen_y','c1'); pg_get_serial_sequence ------------------------ public.gen_y_c1_seq (1 row) postgres=# | + +### pg_get_statisticsobjdef +| 函数名称 h| pg_get_statisticsobjdef | +| --- | --- | +| 参数数据类型 | statobj_oid | +| 函数返回值数据类型 | text | +| 函数含义 | 获得extended statistics object的CREATE STATISTICS语句。 | +| 使用举例 | + +### pg_get_triggerdef +| 函数名称 h| pg_get_triggerdef | +| --- | --- | +| 参数数据类型 | trigger_oid 或者trigger_oid, pretty_bool | +| 函数返回值数据类型 | text | +| 函数含义 | 获得trigger的create trigger语句 | +| 使用举例 | +| postgres=# select pg_get_triggerdef(16992); pg_get_triggerdef ------------------------------------------------------------------------------------------------------------ CREATE TRIGGER example_trigger AFTER INSERT ON public.company FOR EACH ROW EXECUTE FUNCTION auditlogfunc() (1 row) postgres=# | + +### pg_get_userbyid +| 函数名称 h| pg_get_userbyid | +| --- | --- | +| 参数数据类型 | role_oid | +| 函数返回值数据类型 | ~name~ | +| 函数含义 | 获得特定role oid的role name | +| 使用举例 | +| postgres=# select pg_get_userbyid(16426); pg_get_userbyid ----------------- lc0029999 (1 row) postgres=# | + +### pg_get_viewdef +| 函数名称 h| pg_get_viewdef | +| --- | --- | +| 参数数据类型 | view_name 或者 view_name, pretty_bool或者 view_oid或者 view_oid, pretty_bool或者view_oid, wrap_column_int | +| 函数返回值数据类型 | text | +| 函数含义 | 获得view的定义 | +| 使用举例 | +| postgres=# select pg_get_viewdef('company_view'); pg_get_viewdef --------------------- SELECT company.id,+ company.name, + company.age + FROM company; (1 row) postgres=# | + +### pg_index_column_has_property +| 函数名称 h| pg_index_column_has_property | +| --- | --- | +| 参数数据类型 | index regclass, column integer, property text | +| 函数返回值数据类型 | boolean | +| 函数含义 | +| 测试索引列是否有特定的索引列属性。索引列属性见下: asc 索引列升序 desc 索引列降序 nulls_first null值在前 nulls_last null值在后 orderable 列是否具有任何定义的排序顺序? distance_orderable 列是否可以被"distance" operator 顺序扫描到, 比如 ORDER BY col <-> constant ? returnable index-only扫描是否可以返回列值 search_array 列是否原生支持 col = ANY(array)搜索 search_nulls 列是否支持IS NULL 和IS NOT NULL 搜索 + 注意:extension的访问方法可以为它们的indexes定义额外的属性名称。 + 本函数在如下情况下会返回NULL:属性名称未知(not known)或者不适用于特定的对象Oid或者column number不能标识出一个有效的对象。 | +| 使用举例 | +| postgres=# select pg_index_column_has_property('idx_2'::regclass,1,'desc'); pg_index_column_has_property ------------------------------ f (1 row) postgres=# select pg_index_column_has_property('idx_2'::regclass,1,'asc'); pg_index_column_has_property ------------------------------ t (1 row) postgres=# | + +### pg_index_has_property +| 函数名称 h| pg_index_has_property | +| --- | --- | +| 参数数据类型 | index regclass, property text | +| 函数返回值数据类型 | boolean | +| 函数含义 | +| 测试一个index是否具有特定的索引属性。如下是索引属性的清单 clusterable 在cluster命令中是否可以用到index index_scan index 是否支持 plain (non-bitmap) scans? bitmap_scan index 是否支持 bitmap scans? backward_scan Can the scan direction be changed in mid-scan (to support FETCH BACKWARD on a cursor without needing materialization)? + 注意:extension的访问方法可以为它们的indexes定义额外的属性名称。 + 本函数在如下情况下会返回NULL:属性名称未知(not known)或者不适用于特定的对象oid不能标识出一个有效的对象。 | +| 使用举例 | +| postgres=# select pg_index_has_property('idx_2'::regclass,'index_scan'); pg_index_has_property ----------------------- t (1 row) postgres=# | + +### pg_indexam_has_property +| 函数名称 h| pg_indexam_has_property | +| --- | --- | +| 参数数据类型 | am oid, property text | +| 函数返回值数据类型 | boolean | +| 函数含义 | +| 测试一个index访问方法是否具有特定的属性。如下是索引访问方法属性清单: can_order 访问方法是否支持 ASC, DESC 以及CREATE INDEX的related keywords can_unique 访问方法是否支持unique indexes? can_multi_col 访问方法是否支持多列indexes? can_exclude 访问方法是否支持exclusion constraints? can_include 访问方法是否支持CREATE INDEX的 INCLUDE 子句 + + 本函数在如下情况下会返回NULL:属性名称未知(not known)或者不适用于特定的对象 oid不能标识出一个有效的对象。 + | +| 使用举例 | +| postgres=# select * from pg_am; oid \ | amname \ | amhandler \ | amtype ------+--------+----------------------+-------- 2 \ | heap \ | heap_tableam_handler \ | t 403 \ | btree \ | bthandler \ | i 405 \ | hash \ | hashhandler \ | i 783 \ | gist \ | gisthandler \ | i 2742 \ | gin \ | ginhandler \ | i 4000 \ | spgist \ | spghandler \ | i 3580 \ | brin \ | brinhandler \ | i (7 rows) postgres=# postgres=# select pg_indexam_has_property(4000,'can_multi_col'); pg_indexam_has_property ------------------------- f (1 row) postgres=# postgres=# select pg_indexam_has_property(403,'can_unique'); pg_indexam_has_property ------------------------- t (1 row) postgres=# | + +### pg_options_to_table +| 函数名称 h| pg_options_to_table | +| --- | --- | +| 参数数据类型 | options_array text[] | +| 函数返回值数据类型 | setof record ( option_name text, option_value text ) | +| 函数含义 | 返回pg_class.reloptions或者pg_attribute.attoptions表示的存储选项 | +| 使用举例 | +| postgres=# select pg_options_to_table(reloptions) from pg_class where oid='16384'; pg_options_to_table --------------------------------------------- (autovacuum_vacuum_insert_threshold,10000) (autovacuum_vacuum_insert_scale_factor,0.1) (2 rows) postgres=# | + +### pg_tablespace_databases +| 函数名称 h| pg_tablespace_databases | +| --- | --- | +| 参数数据类型 | tablespace oid | +| 函数返回值数据类型 | setof oid | +| 函数含义 | 返回特定tablespace中保存的object的database的oid,如果本函数返回任何值,那么就表示tablespace不为空并且不能被drop掉。若想查出在该表空间内有哪些对象,你需要连接到本函数返回的database中,并查询pg_class获得这些对象。 | +| 使用举例 | +| postgres=# select pg_tablespace_databases(1663); pg_tablespace_databases ------------------------- 16424 1 16878 14174 14173 (5 rows) postgres=# | + +### pg_tablespace_location +| 函数名称 h| pg_tablespace_location | +| --- | --- | +| 参数数据类型 | tablespace oid | +| 函数返回值数据类型 | Text | +| 函数含义 | 返回指定tablespace的文件系统路径 | +| 使用举例 | +| postgres=# select pg_tablespace_location(16391); pg_tablespace_location ------------------------ /home/pg131/ts1 (1 row) postgres=# | + +### pg_typeof +| 函数名称 h| pg_typeof | +| --- | --- | +| 参数数据类型 | any | +| 函数返回值数据类型 | regtype | +| 函数含义 | 指定值的数据类型的oid | +| 使用举例 | +| postgres=# SELECT pg_typeof(33.339999); -[ RECORD 1 ]------ pg_typeof \ | numeric postgres=# SELECT typlen FROM pg_type WHERE oid = pg_typeof(33.339999); -[ RECORD 1 ] typlen \ | -1 postgres=# | + +### COLLATION FOR +| 函数名称 h| COLLATION FOR | +| --- | --- | +| 参数数据类型 | "any" | +| 函数返回值数据类型 | text | +| 函数含义 | 返回指定值的collation的name,本函数的返回值是被双引号引起来的,如果入参表达式不能派生出collation,则返回null如果传入的参数不是可以collatable的data type,则会抛出错误 | +| 使用举例 | +| postgres=# select collation for(datname) from pg_database; pg_collation_for ------------------ "C" "C" "C" "C" "C" (5 rows) postgres=# | + +### to_regclass +| 函数名称 h| to_regclass | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | Regclass | +| 函数含义 | 将文本形式的relation name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL | +| 使用举例 | +| postgres=# select to_regclass('public.data1'); -[ RECORD 1 ]------ to_regclass \ | data1 postgres=# \x Expanded display is off. postgres=# select oid, relname from pg_class where oid=to_regclass('public.data1'); oid \ | relname -------+--------- 16384 \ | data1 (1 row) postgres=# | + +### to_regcollation +| 函数名称 h| to_regcollation | +| --- | --- | +| 参数数据类型 | Text | +| 函数返回值数据类型 | regcollation | +| 函数含义 | 将文本形式的collation name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL | +| 使用举例 | +| postgres=# select to_regcollation('"POSIX"'); to_regcollation ----------------- "POSIX" (1 行记录) postgres=# select * from pg_collation where oid=to_regcollation('"POSIX"'); oid \ | collname \ | collnamespace \ | collowner \ | collprovider \ | collisdeterministic \ | collencoding \ | collcollate \ | collctype \ | collversion -----+----------+---------------+-----------+--------------+---------------------+--------------+-------------+-----------+------------- 951 \ | POSIX \ | 11 \ | 10 \ | c \ | t \ | -1 \ | POSIX \ | POSIX \ (1 行记录) postgres=# select oid,collname from pg_collation where oid=to_regcollation('"POSIX"'); oid \ | collname -----+---------- 951 \ | POSIX (1 行记录) postgres=# | + +### to_regnamespace +| 函数名称 h| to_regnamespace | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regnamespace | +| 函数含义 | 将文本形式的schema name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL | +| 使用举例 | +| postgres=# select to_regnamespace('public'); to_regnamespace ----------------- public (1 行记录) postgres=# | + +### to_regoper +| 函数名称 h| to_regoper | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regoper | +| 函数含义 | 将文本形式的operator name转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name或者含义不明确,本函数会返回NULL | +| 使用举例 | +| postgres=# select oid, oprname from pg_operator where oid=to_regoper('!'); oid \ | oprname -----+--------- 388 \ | ! (1 row) postgres=# select to_regoper('!'); to_regoper ------------ | +| ! (1 row) postgres=# | + +### to_regoperator +| 函数名称 h| to_regoperator | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regoperator | +| 函数含义 | 将文本形式的operator name(带参数类型)转换为oid,本函数的输入参数不可以是数字形式的oid。如果本函数未找到输入参数指定的name,本函数会返回NULL. | +| 使用举例 | +| postgres=# select oid, oprname from pg_operator where oid=to_regoperator('+(integer,integer)'); oid \ | oprname -----+--------- 551 \ | + (1 row) postgres=# select to_regoperator('+(int4,int4)'); to_regoperator -------------------- +(integer,integer) (1 row) postgres=# | + +### to_regproc +| 函数名称 h| to_regproc | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regproc | +| 函数含义 | 将文本的function或者procedure转换为其oid。如果本函数未找到输入参数指定的name或者含义不明确,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 | +| 使用举例 | +| postgres=# select to_regproc('pg_stat_statements'); to_regproc -------------------- pg_stat_statements (1 row) postgres=# select oid,proname from pg_proc where oid=to_regproc('pg_stat_statements'); oid \ | proname -------+-------------------- 16401 \ | pg_stat_statements (1 row) postgres=# | + +### to_regprocedure +| 函数名称 h| to_regprocedure | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regprocedure | +| 函数含义 | 将文本的function或者procedure(带参数)转换为其oid。如果本函数未找到输入参数指定的name,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 | +| 使用举例 | +| postgres=# select to_regprocedure('pg_get_viewdef(text)'); to_regprocedure ---------------------- pg_get_viewdef(text) (1 row) postgres=# select oid, proname from pg_proc where oid= to_regprocedure('pg_get_viewdef(text)'); oid \ | proname ------+---------------- 1640 \ | pg_get_viewdef (1 row) postgres=# | + +### to_regrole +| 函数名称 h| to_regrole | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regrole | +| 函数含义 | 将文本的role name转换为其oid。如果本函数未找到输入参数指定的name,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 | +| 使用举例 | +| postgres=# select oid,rolname from pg_roles where oid=to_regrole('lc0039999'); oid \ | rolname -------+----------- 16877 \ | lc0039999 (1 row) postgres=# select to_regrole('lc0039999'); to_regrole ------------ lc0039999 (1 row) postgres=# | + +### to_regtype +| 函数名称 h| to_regtype | +| --- | --- | +| 参数数据类型 | text | +| 函数返回值数据类型 | regtype | +| 函数含义 | +| 将文本的type name转换为其oid。如果本函数未找到输入参数指定的name,本函数会返回NULL。本函数的输入参数不可以是数字形式的oid。 + | +| 使用举例 | +| postgres=# select to_regtype('int4'); to_regtype ------------ integer (1 row) postgres=# select oid, typname from pg_type where oid=to_regtype('int4'); oid \ | typname -----+--------- 23 \ | int4 (1 row) postgres=# | + +### pg_describe_object +| 函数名称 h| pg_describe_object | +| --- | --- | +| 参数数据类型 | classid oid, objid oid, objsubid integer | +| 函数返回值数据类型 | text | +| 函数含义 | +| 用于描述pg_depend系统表中保存的依赖对象。 + | +| 使用举例 | +| postgres=# select oid,relname from pg_class where oid in (select distinct classid from pg_depend) order by oid; oid \ | relname ------+------------------------- 1247 \ | pg_type 1255 \ | pg_proc 1259 \ | pg_class 2328 \ | pg_foreign_data_wrapper 2602 \ | pg_amop 2603 \ | pg_amproc 2606 \ | pg_constraint 2612 \ | pg_language 2616 \ | pg_opclass 2617 \ | pg_operator 2618 \ | pg_rewrite 2620 \ | pg_trigger 2753 \ | pg_opfamily 3079 \ | pg_extension 3600 \ | pg_ts_dict 3602 \ | pg_ts_config 3764 \ | pg_ts_template (17 rows) postgres=# select * from pg_foreign_data_wrapper ; oid \ | fdwname \ | fdwowner \ | fdwhandler \ | fdwvalidator \ | fdwacl \ | fdwoptions -------+----------+----------+------------+--------------+--------+------------ 16954 \ | file_fdw \ | 10 \ | 16952 \ | 16953 \ | \ (1 row) postgres=# select pg_describe_object(2328,16954,0); pg_describe_object ------------------------------- foreign-data wrapper file_fdw (1 row) postgres=# | + +### pg_identify_object +| 函数名称 h| pg_identify_object | +| --- | --- | +| 参数数据类型 | classid oid, objid oid, objsubid integer | +| 函数返回值数据类型 | record ( type text, schema text, name text, identity text ) | +| 函数含义 | +| 返回一个数据库对象的详细信息 + | +| 使用举例 | +| postgres=# select pg_identify_object(2328,16954,0); pg_identify_object --------------------------------------------- ("foreign-data wrapper",,file_fdw,file_fdw) (1 row) postgres=# | + +### pg_identify_object_as_address +| 函数名称 h| pg_identify_object_as_address | +| --- | --- | +| 参数数据类型 | classid oid, objid oid, objsubid integer | +| 函数返回值数据类型 | record ( type text, object_names text[], object_args text[] ) | +| 函数含义 | +| 返回一个数据库对象的足够信息以标识出数据库对象 + | +| 使用举例 | +| postgres=# select pg_identify_object_as_address(2328,16954,0); pg_identify_object_as_address ---------------------------------------- ("foreign-data wrapper",{file_fdw},{}) (1 row) postgres=# | + +### pg_get_object_address +| 函数名称 h| pg_get_object_address | +| --- | --- | +| 参数数据类型 | type text, object_names text[], object_args text[] | +| 函数返回值数据类型 | record ( classid oid, objid oid, objsubid integer ) | +| 函数含义 | +| 本函数是pg_identify_object_as_address的反函数 + + | +| 使用举例 | +| postgres=# select pg_get_object_address('foreign-data wrapper','{file_fdw}','{}'); pg_get_object_address ----------------------- (2328,16954,0) (1 row) postgres=# | + +### col_description +| 函数名称 h| col_description | +| --- | --- | +| 参数数据类型 | table oid, column integer | +| 函数返回值数据类型 | text | +| 函数含义 | +| 获取某个表的某个列的comment + + | +| 使用举例 | +| postgres=# create table t_comment(c1 int ); CREATE TABLE postgres=# comment on column t_comment.c1 is 'this is c1 comment!'; COMMENT postgres=# select oid from pg_class where oid=to_regclass('t_comment') postgres-# ; oid ------- 17001 (1 row) postgres=# select col_description(17001,1); col_description --------------------- this is c1 comment! (1 row) postgres=# postgres=# select col_description(to_regclass('t_comment'),1); col_description --------------------- this is c1 comment! (1 row) postgres=# | + +### obj_description +| 函数名称 h| obj_description | +| --- | --- | +| 参数数据类型 | object oid, catalog name 或者object oid | +| 函数返回值数据类型 | text | +| 函数含义 | +| 返回特定数据库对象的注释信息 + + | +| 使用举例 | +| postgres=# comment on table t_comment is ' table-level test comment'; COMMENT postgres=# \dt+ data1 List of relations Schema \ | Name \ | Type \ | Owner \ | Persistence \ | Size \ | Description --------+-------+-------+-------+-------------+-------+------------- public \ | data1 \ | table \ | pg131 \ | permanent \ | 42 MB \ (1 row) postgres=# \dt+ t_comment; List of relations Schema \ | Name \ | Type \ | Owner \ | Persistence \ | Size \ | Description --------+-----------+-------+-------+-------------+---------+--------------------------- public \ | t_comment \ | table \ | pg131 \ | permanent \ | 0 bytes \ | table-level test comment (1 row) postgres=# select obj_description(17001); obj_description --------------------------- table-level test comment (1 row) postgres=# | + +### shobj_description +| 函数名称 h| shobj_description | +| --- | --- | +| 参数数据类型 | object oid, catalog name | +| 函数返回值数据类型 | text | +| 函数含义 | 返回特定共享数据库对象(如databases, roles, and tablespaces)的注释信息. | +| 使用举例 | +| postgres=# select shobj_description(14174,'pg_database'); shobj_description -------------------------------------------- default administrative connection database (1 row) postgres=# | + +### pg_current_xact_id +| 函数名称 h| pg_current_xact_id | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | xid8 | +| 函数含义 | 返回当前的事务id,若是没有当前事务id,系统会自动指派一个新的事务id | +| 使用举例 | +| postgres=# select pg_current_xact_id(); pg_current_xact_id -------------------- 720 (1 row) postgres=# | + +### pg_current_xact_id_if_assigned() +| 函数名称 h| pg_current_xact_id_if_assigned() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | xid8 | +| 函数含义 | 返回当前的current transaction's ID,若是没有transaction's ID被指派,本函数返回NULL。如果事务可能是只读的,最好使用本函数,以避免不必要的XID消耗。 | +| 使用举例 | +| postgres=*# select pg_current_xact_id_if_assigned(); pg_current_xact_id_if_assigned -------------------------------- (1 row) postgres=*# update data1 set c2='data1_1' where c1=1; UPDATE 1 postgres=*# select pg_current_xact_id_if_assigned(); pg_current_xact_id_if_assigned -------------------------------- 722 (1 row) postgres=*# | + +### pg_xact_status +| 函数名称 h| pg_xact_status | +| --- | --- | +| 参数数据类型 | xid8 | +| 函数返回值数据类型 | text | +| 函数含义 | 返回近期事务的提交状态。本函数的执行结果是下面三个中的一个:in progress、commited、aborted。当事务足够老而没有在PostgreSQL中保存下来时,commit status会被丢弃,此时本函数返回结果为NULL。请注意,针对prepared transactions,本函数的返回结果为in progress,应用程序必须检查pg_prepared_xacts以确定一个transaction ID是否属于prepared transaction | +| 使用举例 | +| postgres=# select pg_xact_status(pg_current_xact_id()); pg_xact_status ---------------- in progress (1 row) postgres=# postgres=# select pg_xact_status(722::text::xid8); pg_xact_status ---------------- committed (1 row) postgres=# | + +### pg_current_snapshot +| 函数名称 h| pg_current_snapshot | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | pg_snapshot | +| 函数含义 | +| 返回当前的snapshot,这是一种显示哪个transaction id是正处于in-progress状态的数据结构。注意:有关pg_snapshot数据类型: pg_snapshot数据类型用于存储在一个特定时间点上的transaction ID visibility信息。 pg_snapshot数据类型的表示方法是xmin:xmax:xip_list这个xmin:xmax:xip_list就是pg_snapshot数据类型组成。见下: xmin:处于active状态的最小的transaction id,所有小于xmin的transaction id要么是committed (visible),要么是rolled back(dead) xmax:大于或者等于本xmax值的transaction id是在snapshot结束时未完成的,因此,xmax是不可见的。 xip_list:在生成snapshot时,处于in progress状态的transactions。在xmin <= X < xmax范围内并且不在本xip_list中的transaction ID 表示在snapshot生成时是已经完成的transaction ID,因此,根据commit status,要么是visible的要么是dead,本列表中不包括subtransactions的transaction IDs + | +| 使用举例 | +| postgres=# select pg_current_snapshot(); pg_current_snapshot --------------------- 727:727: (1 row) postgres=# | + +### pg_snapshot_xip +| 函数名称 h| pg_snapshot_xip | +| --- | --- | +| 参数数据类型 | pg_snapshot | +| 函数返回值数据类型 | setof xid8 | +| 函数含义 | 返回snapshot中处于in-progress状态的transaction id | +| 使用举例 | +| postgres=# select pg_snapshot_xip('10:20:10,14,15'); pg_snapshot_xip ----------------- 10 14 15 (3 rows) postgres=# | + +### pg_snapshot_xmax +| 函数名称 h| pg_snapshot_xmax | +| --- | --- | +| 参数数据类型 | pg_snapshot | +| 函数返回值数据类型 | xid8 | +| 函数含义 | 返回snapshot的xmax | +| 使用举例 | +| postgres=# select pg_snapshot_xmax('10:20:10,14,15'); pg_snapshot_xmax ------------------ 20 (1 row) postgres=# | + +### pg_snapshot_xmin +| 函数名称 h| pg_snapshot_xmin | +| --- | --- | +| 参数数据类型 | pg_snapshot | +| 函数返回值数据类型 | xid8 | +| 函数含义 | 返回snapshot的xmin | +| 使用举例 | +| postgres=# select pg_snapshot_xmin('10:20:10,14,15'); pg_snapshot_xmin ------------------ 10 (1 row) postgres=# | + +### pg_visible_in_snapshot +| 函数名称 h| pg_visible_in_snapshot | +| --- | --- | +| 参数数据类型 | xid8, pg_snapshot | +| 函数返回值数据类型 | bool | +| 函数含义 | 给定的事务ID是否对snapshot可见,即:给定的事务ID是否在生成snapshot之前完成。本函数对subtransaction ID不能给出正确的结果。 | +| 使用举例 | +| postgres=# select pg_visible_in_snapshot(722::text::xid8,'10:20:10,14,15'); pg_visible_in_snapshot ------------------------ f (1 row) postgres=# select pg_visible_in_snapshot(12::text::xid8,'10:20:10,14,15'); pg_visible_in_snapshot ------------------------ t (1 row) postgres=# | + +### txid_current +| 函数名称 h| txid_current | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | bigint | +| 函数含义 | 返回当前的事务id,若是没有当前事务id,系统会自动指派一个新的事务id。本函数(返回值是bigint数据类型)的作用与pg_current_xact_id(返回值是xid8数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 | +| 使用举例 | +| postgres=# select txid_current(); txid_current -------------- 735 (1 row) postgres=# | + +### txid_current_if_assigned() +| 函数名称 h| txid_current_if_assigned() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | bigint | +| 函数含义 | 本函数(注意:返回值是bigint数据类型)的作用与pg_current_xact_id_if_assigned(注意:返回值是xid8数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 | +| 使用举例 | +| [pg131@VM-0-8-centos ~]$ psql -d postgres psql (13.1) Type "help" for help. postgres=# select txid_current_if_assigned(); txid_current_if_assigned -------------------------- (1 row) postgres=# begin; BEGIN postgres=*# select txid_current_if_assigned(); txid_current_if_assigned -------------------------- (1 row) postgres=*# select txid_current(); txid_current -------------- 738 (1 row) postgres=*# select txid_current_if_assigned(); txid_current_if_assigned -------------------------- 738 (1 row) | + +### txid_current_snapshot() +| 函数名称 h| txid_current_snapshot() | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | txid_snapshot | +| 函数含义 | 返回当前的snapshot,这是一种显示哪个transaction id是正处于in-progress状态的数据结构。本函数(注意:返回值是txid_snapshot数据类型)的作用与pg_current_snapshot (注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 | +| 使用举例 | +| postgres=# select txid_current_snapshot(); txid_current_snapshot ----------------------- 741:741: (1 row) postgres=# \gdesc Column \ | Type -----------------------+--------------- txid_current_snapshot \ | txid_snapshot (1 row) postgres=# | + +### txid_snapshot_xip(txid_snapshot) +| 函数名称 h| txid_snapshot_xip(txid_snapshot) | +| --- | --- | +| 参数数据类型 | txid_snapshot | +| 函数返回值数据类型 | setof bigint | +| 函数含义 | 返回snapshot中处于in-progress状态的transaction id。本函数(注意:返回值是txid_snapshot数据类型)的作用与pg_snapshot_xip (注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 | +| 使用举例 | +| postgres=# select txid_snapshot_xip('10:20:10,14,15'); txid_snapshot_xip ------------------- 10 14 15 (3 rows) postgres=# \gdesc Column \ | Type -------------------+-------- txid_snapshot_xip \ | bigint (1 row) | + +### txid_snapshot_xmax +| 函数名称 h| txid_snapshot_xmax | +| --- | --- | +| 参数数据类型 | txid_snapshot | +| 函数返回值数据类型 | bigint | +| 函数含义 | 返回snapshot的xmax。本函数(注意:返回值是bigint数据类型)的作用与pg_snapshot_xmax (注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 | +| 使用举例 | +| postgres=# select txid_snapshot_xmax('10:20:10,14,15'); txid_snapshot_xmax -------------------- 20 (1 row) postgres=# \gdesc Column \ | Type --------------------+-------- txid_snapshot_xmax \ | bigint (1 row) postgres=# | + +### txid_snapshot_xmin +| 函数名称 h| txid_snapshot_xmin | +| --- | --- | +| 参数数据类型 | txid_snapshot | +| 函数返回值数据类型 | bigint | +| 函数含义 | 返回snapshot的xmin。本函数(注意:返回值是bigint数据类型)的作用与pg_snapshot_xmin(注意:返回值是pg_snapshot数据类型)的作用是类似的,只是两个函数的返回值数据类型不同。 | +| 使用举例 | +| postgres=# select txid_snapshot_xmin('10:20:10,14,15'); txid_snapshot_xmin -------------------- 10 (1 row) postgres=# \gdesc Column \ | Type --------------------+-------- txid_snapshot_xmin \ | bigint (1 row) postgres=# | + +### txid_visible_in_snapshot +| 函数名称 h| txid_visible_in_snapshot | +| --- | --- | +| 参数数据类型 | bigint, txid_snapshot | +| 函数返回值数据类型 | boolean | +| 函数含义 | 给定的事务ID是否对snapshot可见,即:给定的事务ID是否在生成snapshot之前完成。本函数对subtransaction ID不能给出正确的结果。 | +| 使用举例 | +| postgres=# select txid_visible_in_snapshot(722,'10:20:10,14,15'); txid_visible_in_snapshot -------------------------- f (1 row) postgres=# select txid_visible_in_snapshot(12,'10:20:10,14,15'); txid_visible_in_snapshot -------------------------- t (1 row) postgres=# | + +### txid_status +| 函数名称 h| txid_status | +| --- | --- | +| 参数数据类型 | bigint | +| 函数返回值数据类型 | text | +| 函数含义 | 返回近期事务的提交状态。本函数的执行结果是下面三个中的一个:in progress、commited、aborted。当事务足够老而没有在PostgreSQL中保存下来时,commit status会被丢弃,此时本函数返回结果为NULL。请注意,针对prepared transactions,本函数的返回结果为in progress,应用程序必须检查pg_prepared_xacts以确定一个transaction ID是否属于prepared transaction. | +| 使用举例 | +| postgres=# select txid_status(txid_current()); txid_status ------------- in progress (1 row) postgres=# select txid_current(); txid_current -------------- 742 (1 row) postgres=# select txid_status(722); txid_status ------------- committed (1 row) postgres=# | + +### pg_xact_commit_timestamp +| 函数名称 h| pg_xact_commit_timestamp | +| --- | --- | +| 参数数据类型 | xid | +| 函数返回值数据类型 | timestamp with time zone | +| 函数含义 a | 返回一个事务的提交时间。本函数能正常使用的前提就是配置参数track_commit_timestamp设置为on,否会有如下提示: postgres=# select pg_xact_commit_timestamp(722::text::xid); ERROR: could not get commit timestamp data HINT: Make sure the configuration parameter "track_commit_timestamp" is set. postgres=# | +| 使用举例 | +| postgres=# select txid_current(); txid_current -------------- 743 (1 row) postgres=# select pg_xact_commit_timestamp(743::text::xid); pg_xact_commit_timestamp ------------------------------ 2021-04-29 16:52:37.19133+08 (1 row) postgres=# | + +### pg_last_committed_xact +| 函数名称 h| pg_last_committed_xact | +| --- | --- | +| 参数数据类型 | 无输入数据类型 | +| 函数返回值数据类型 | record ( xid xid, timestamp timestamp with time zone ) | +| 函数含义 | 返回最后一个提交事务的transaction id和commit timestamp | +| 使用举例 | +| postgres=# select pg_last_committed_xact(); pg_last_committed_xact -------------------------------------- (743,"2021-04-29 16:52:37.19133+08") (1 row) postgres=# | + +### pg_control_checkpoint +| 函数名称 h| pg_control_checkpoint | +| --- | --- | +| 参数数据类型 | 无输入数据类型 | +| 函数返回值数据类型 | record | +| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回当前checkpoint状态的相关信息 | +| 使用举例 | +| | + +### pg_control_system +| 函数名称 h| pg_control_system | +| --- | --- | +| 参数数据类型 | 无输入数据类型 | +| 函数返回值数据类型 | record | +| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回当前控制文件状态的相关信息。 | +| 使用举例 | +| postgres=# select pg_control_system(); pg_control_system --------------------------------------------------------------- (1300,202007201,6908228805274066467,"2021-04-29 16:57:56+08") (1 row) postgres=# | + +### pg_control_init +| 函数名称 h| pg_control_init | +| --- | --- | +| 参数数据类型 | 无输入数据类型 | +| 函数返回值数据类型 | record | +| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回cluster初始化时的相关信息 | +| 使用举例 | +| postgres=# select pg_control_init(); pg_control_init --------------------------------------------------- (8,8192,131072,8192,16777216,64,32,1996,2048,t,0) (1 row) postgres=# | + +### pg_control_recovery +| 函数名称 h| pg_control_recovery | +| --- | --- | +| 参数数据类型 | 无输入数据类型 | +| 函数返回值数据类型 | record | +| 函数含义 | 本函数是从PostgreSQL控制文件中获取数据。本函数返回恢复状态的信息。 | +| 使用举例 | +| postgres=# select pg_control_recovery(); pg_control_recovery --------------------- (0/0,0,0/0,0/0,f) (1 row) postgres=# | + +### gen_random_uuid +| 函数名称 h| gen_random_uuid | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | uuid | +| 函数含义 | 本函数返回version 4版本的uuid | +| 使用举例 | +| postgres=# select gen_random_uuid(); gen_random_uuid -------------------------------------- 39158a63-f6d0-4883-8765-8b8e9c9cae62 (1 row) postgres=# | + +### array_to_tsvector +| 函数名称 h| array_to_tsvector | +| --- | --- | +| 参数数据类型 | text[] | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 将array of lexemes转换为tsvector | +| 使用举例 | +| postgres=# select array_to_tsvector('{fat,cat,rat}'::text[]); array_to_tsvector ------------------- 'cat' 'fat' 'rat' (1 row) postgres=# | + +### get_current_ts_config +| 函数名称 h| get_current_ts_config | +| --- | --- | +| 参数数据类型 | 无输入参数 | +| 函数返回值数据类型 | regconfig | +| 函数含义 | 返回当前默认的text search配置的oid(参见配置参数default_text_search_config) | +| 使用举例 | +| postgres=# select get_current_ts_config(); get_current_ts_config ----------------------- english (1 row) postgres=# | + +### length +| 函数名称 h| length | +| --- | --- | +| 参数数据类型 | tsvector | +| 函数返回值数据类型 | integer | +| 函数含义 | 返回lexemes的数量 | +| 使用举例 | +| postgres=# select length('fat:2,4 cat:3 rat:5A'::tsvector); length -------- 3 (1 row) postgres=# | + +### numnode +| 函数名称 h| numnode | +| --- | --- | +| 参数数据类型 | tsquery | +| 函数返回值数据类型 | integer | +| 函数含义 | 返回lexemes加operator的数量 | +| 使用举例 | +| postgres=# select numnode('(fat & rat) \ | cat'::tsquery) ; numnode --------- 5 (1 row) postgres=# | + +### plainto_tsquery +| 函数名称 h| plainto_tsquery | +| --- | --- | +| 参数数据类型 | [config regconfig,] query text | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 将text转换为tsquery。其中,字符串中的任何标点都将被忽略 | +| 使用举例 | +| postgres=# select plainto_tsquery('english', 'The Fat Rats'); plainto_tsquery ----------------- 'fat' & 'rat' (1 row) postgres=# | + +### phraseto_tsquery +| 函数名称 h| phraseto_tsquery | +| --- | --- | +| 参数数据类型 | [config regconfig,] query text | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 将text转换为tsquery。其中,字符串中的任何标点都将被忽略 | +| 使用举例 | +| postgres=# select phraseto_tsquery('english', 'The Fat Rats') ; phraseto_tsquery ------------------ 'fat' <-> 'rat' (1 row) postgres=# | + +### websearch_to_tsquery +| 函数名称 h| websearch_to_tsquery | +| --- | --- | +| 参数数据类型 | [ _config_ regconfig, ] _query_ text | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 将text转换为tsquery。引用的单词序列被转换成短语测试。"or"一词被理解为产生or运算符,破折号产生NOT运算符,忽略其他标点符号 | +| 使用举例 | +| postgres=# select websearch_to_tsquery('english', '"fat rat" or cat dog'); websearch_to_tsquery --------------------------------- 'fat' <-> 'rat' \ | 'cat' & 'dog' (1 row) postgres=# | + +### querytree +| 函数名称 h| querytree | +| --- | --- | +| 参数数据类型 | tsquery | +| 函数返回值数据类型 | text | +| 函数含义 | 返回一个tsquery中的可索引部分。当返回结果为空或者T时,表示这是一个不可索引的query。 | +| 使用举例 | +| postgres=# select querytree('foo & ! bar'::tsquery); querytree ----------- 'foo' (1 row) postgres=# | + +### setweight +| 函数名称 h| setweight | +| --- | --- | +| 参数数据类型 | vector tsvector, weight "char"或者vector tsvector, weight "char", lexemes text[] | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 为vector中的每个元素指定权重或者为在lexemes之内的vector中的每个元素指定权重 | +| 使用举例 | +| postgres=# select setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A'); setweight ------------------------------- 'cat':3A 'fat':2A,4A 'rat':5A (1 row) postgres=# postgres=# select setweight('fat:2,4 cat:3 rat:5,6B'::tsvector, 'A', '{cat,rat}'); setweight -------------------------------- 'cat':3A 'fat':2,4 'rat':5A,6A (1 row) postgres=# | + +### strip +| 函数名称 h| strip | +| --- | --- | +| 参数数据类型 | tsvector | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 从tsvector中抹掉position和weight | +| 使用举例 | +| postgres=# select strip('fat:2,4 cat:3 rat:5A'::tsvector); strip ------------------- 'cat' 'fat' 'rat' (1 row) postgres=# | + +### to_tsquery +| 函数名称 h| to_tsquery | +| --- | --- | +| 参数数据类型 | regconfig, text 或者text | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 将text转换为tsquery,本函数的返回结果必须由有效的tsquery operator进行连接。 | +| 使用举例 | +| postgres=# select to_tsquery('english', 'The & Fat & Rats'); to_tsquery --------------- 'fat' & 'rat' (1 row) postgres=# select to_tsquery( 'The & Fat & Rats'); to_tsquery --------------- 'fat' & 'rat' (1 row) postgres=# | + +### to_tsvector +| 函数名称 h| to_tsvector | +| --- | --- | +| 参数数据类型 | regconfig,text | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 将text转换为tsvector ,结果中包括位置信息 | +| 使用举例 | +| postgres=# select to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3 (1 row) postgres=# | + +### to_tsvector +| 函数名称 h| to_tsvector | +| --- | --- | +| 参数数据类型 | regconfig,json或者regconfig,jsonb | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 将json文档中的每个字符串值转换为tsvector,结果值是按照文档顺序进行连接后输出的,当输入参数数据类型为jsonb时,json对象的字段的文档顺序是与实现相关的 | +| 使用举例 | +| postgres=# select to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::json); to_tsvector ------------------------- 'dog':5 'fat':2 'rat':3 (1 row) postgres=# postgres=# select to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::jsonb); to_tsvector ------------------------- 'dog':1 'fat':4 'rat':5 (1 row) postgres=# | + +### json_to_tsvector +| 函数名称 h| json_to_tsvector | +| --- | --- | +| 参数数据类型 | [config regconfig,] json, jsonb | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 将json文档中满足filter条件的每个item转换为一个tsvector。结果值是按照文档顺序进行连接后输出的,当输入参数数据类型为jsonb时,json对象的字段的文档顺序是与实现相关的。Filter条件必须是一个包括另个或者多个关键字的json 数组:string代表包括所有字符串值numeric代表包括所有数字值boolean代表包括所有boolean值key代表包括所有keyall代表包括上述所有。作为一个简单的例子,filter条件不可以是一个简单的并且是上述关键字之一的json值。 | +| 使用举例 | +| postgres=# select json_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::json, '["string", "numeric"]'); json_to_tsvector ------------------------- '123':5 'fat':2 'rat':3 (1 row) postgres=# | + +### jsonb_to_tsvector +| 函数名称 h| jsonb_to_tsvector | +| --- | --- | +| 参数数据类型 | [config regconfig,] jsonb,jsonb | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 将json文档中满足filter条件的每个item转换为一个tsvector。结果值是按照文档顺序进行连接后输出的,当输入参数数据类型为jsonb时,json对象的字段的文档顺序是与实现相关的。Filter条件必须是一个包括另个或者多个关键字的json 数组:string代表包括所有字符串值numeric代表包括所有数字值boolean代表包括所有boolean值key代表包括所有keyall代表包括上述所有。作为一个简单的例子,filter条件不可以是一个简单的并且是上述关键字之一的json值。 | +| 使用举例 | +| postgres=# select jsonb_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::jsonb, '["string", "numeric"]'); jsonb_to_tsvector ------------------------- '123':5 'fat':2 'rat':3 (1 row) postgres=# | + +### ts_delete +| 函数名称 h| ts_delete | +| --- | --- | +| 参数数据类型 | tsvector,text | +| 函数返回值数据类型 | tsvector | +| 函数含义 | +| 从vector中删除掉指定的lexeme + | +| 使用举例 | +| postgres=# select ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat'); ts_delete ------------------ 'cat':3 'rat':5A (1 row) postgres=# | + +### ts_delete +| 函数名称 h| ts_delete | +| --- | --- | +| 参数数据类型 | tsvector,text[] | +| 函数返回值数据类型 | tsvector | +| 函数含义 | +| 从vector中删除掉指定的lexeme | +| 使用举例 | +| postgres=# select ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat']); ts_delete ----------- 'cat':3 (1 row) postgres=# | + +### ts_filter +| 函数名称 h| ts_filter | +| --- | --- | +| 参数数据类型 | tsvector, "char"[] | +| 函数返回值数据类型 | tsvector | +| 函数含义 | 从vector中筛选出带有指定weights的元素 | +| 使用举例 | +| postgres=# select ts_filter('fat:2,4 cat:3b,7c rat:5A'::tsvector, '{a,b}'); ts_filter ------------------- 'cat':3B 'rat':5A (1 row) postgres=# | + +### ts_headline +| 函数名称 h| ts_headline | +| --- | --- | +| 参数数据类型 | [config regconfig,] document text, query tsquery [, options text] | +| 函数返回值数据类型 | text | +| 函数含义 | 以简写的形式显示在document匹配到的query | +| 使用举例 | +| postgres=# select ts_headline('The fat cat ate the rat.', 'cat'); ts_headline --------------------------------- The fat cat ate the rat. (1 row) postgres=# | + +### ts_headline +| 函数名称 h| ts_headline | +| --- | --- | +| 参数数据类型 | [config regconfig,] document json, query tsquery [, options text] | +| 函数返回值数据类型 | json | +| 函数含义 | 以缩写的形式显示在json document匹配到的query | +| 使用举例 | +| postgres=# select ts_headline('{"cat":"raining cats and dogs"}'::json, 'cat'); ts_headline ---------------------------------------- {"cat":"raining cats and dogs"} (1 row) | + +### ts_headline +| 函数名称 h| ts_headline | +| --- | --- | +| 参数数据类型 | [config regconfig,] document jsonb, query tsquery [, options text] | +| 函数返回值数据类型 | jsonb | +| 函数含义 | 以缩写的形式显示在json document匹配到的query | +| 使用举例 | +| postgres=# select ts_headline('{"cat":"raining cats and dogs"}'::jsonb, 'cat'); ts_headline ----------------------------------------- {"cat": "raining cats and dogs"} (1 row) postgres=# | + +### ts_rank +| 函数名称 h| ts_rank | +| --- | --- | +| 参数数据类型 | [weights real[], ] vector tsvector, query tsquery [, normalization integer] | +| 函数返回值数据类型 | real | +| 函数含义 | 计算query与vector的匹配程度 | +| 使用举例 | +| postgres=# SELECT ts_rank(to_tsvector('The quick brown fox jumps over the lazy dog.'),to_tsquery('fox & dog')); ts_rank ------------ 0.09148999 (1 row) postgres=# | + +### ts_rank_cd +| 函数名称 h| ts_rank_cd | +| --- | --- | +| 参数数据类型 | [weights real[], ] vector tsvector, query tsquery [, normalization integer] | +| 函数返回值数据类型 | real | +| 函数含义 | 使用覆盖密度算法来计算query与vector的匹配程度 | +| 使用举例 | +| postgres=# SELECT ts_rank_cd('{0.1, 0.2, 0.4, 1.0}', to_tsvector('PostgreSQL full text search is a wonderful method'),to_tsquery('wonderful')); ts_rank_cd ------------ 0.1 (1 row) postgres=# | + +### ts_rewrite +| 函数名称 h| ts_rewrite | +| --- | --- | +| 参数数据类型 | query tsquery, target tsquery, substitute tsquery | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 用substitute替换掉query中的target | +| 使用举例 | +| postgres=# SELECT ts_rewrite('c & b'::tsquery, 'b'::tsquery, 'bad\ | bat'::tsquery); ts_rewrite ------------------------- ( 'bad' \ | 'bat' ) & 'c' (1 row) postgres=# | + +### ts_rewrite +| 函数名称 h| ts_rewrite | +| --- | --- | +| 参数数据类型 | query tsquery, select text | +| 函数返回值数据类型 | tsquery | +| 函数含义 | +| 使用举例 | +| postgres=# CREATE TABLE test (col1 tsquery PRIMARY KEY, COL2 tsquery); CREATE TABLE postgres=# INSERT INTO test values ('p','q'); INSERT 0 1 postgres=# SELECT ts_rewrite('r & q'::tsquery, 'SELECT col1,col2 FROM test'); ts_rewrite ------------ 'r' & 'q' (1 row) postgres=# | + +### tsquery_phrase +| 函数名称 h| tsquery_phrase | +| --- | --- | +| 参数数据类型 | query1 tsquery, query2 tsquery | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 构造一个phrase query用于在连续的词位匹配query1和query2(同<->操作符) | +| 使用举例 | +| postgres=# select tsquery_phrase(to_tsquery('fat'), to_tsquery('cat')); tsquery_phrase ----------------- 'fat' <-> 'cat' (1 row) postgres=# | + +### tsquery_phrase +| 函数名称 h| tsquery_phrase | +| --- | --- | +| 参数数据类型 | query1 tsquery, query2 tsquery, distance integer | +| 函数返回值数据类型 | tsquery | +| 函数含义 | 构造一个词组查询,该词组搜索匹配query1且query2完全distance分开词素的匹配项 | +| 使用举例 | +| postgres=# select tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10); tsquery_phrase ------------------ 'fat' <10> 'cat' (1 row) postgres=# | + +### tsvector_to_array +| 函数名称 h| tsvector_to_array | +| --- | --- | +| 参数数据类型 | tsvector | +| 函数返回值数据类型 | text[] | +| 函数含义 | 将tsvector转换为词素数组 | +| 使用举例 | +| postgres=# select tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector) ; tsvector_to_array ------------------- {cat,fat,rat} (1 row) postgres=# | + +### unnest +| 函数名称 h| unnest | +| --- | --- | +| 参数数据类型 | tsvector | +| 函数返回值数据类型 | setof record ( lexeme text, positions smallint[], weights text ) | +| 函数含义 | 将tsvector扩展为一行一个词素 | +| 使用举例 | +| postgres=# select * from unnest('cat:3 fat:2,4 rat:5A'::tsvector); lexeme \ | positions \ | weights --------+-----------+--------- cat \ | {3} \ | {D} fat \ | {2,4} \ | {D,D} rat \ | {5} \ | {A} (3 rows) postgres=# | + +### abbrev +| 函数名称 h| abbrev | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | text | +| 函数含义 | 将inet转换为text的缩写显示格式 | +| 使用举例 | +| postgres=# select abbrev(inet '10.1.1.3'); abbrev ---------- 10.1.1.3 (1 row) postgres=# | + +### abbrev +| 函数名称 h| abbrev | +| --- | --- | +| 参数数据类型 | cidr | +| 函数返回值数据类型 | text | +| 函数含义 | 将cidr转换为text的缩写显示格式,返回结果中去掉了netmask中右边的零 | +| 使用举例 | +| postgres=# select abbrev(cidr '10.1.0.0/16'); abbrev --------- 10.1/16 (1 row) postgres=# | + +### broadcast +| 函数名称 h| broadcast | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | inet | +| 函数含义 | 计算一个ip地址的广播地址 | +| 使用举例 | +| postgres=# select broadcast(inet '192.168.1.5/24'); broadcast ------------------ 192.168.1.255/24 (1 row) postgres=# | + +### family +| 函数名称 h| family | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | integer | +| 函数含义 | 返回一个地址是IPV4(返回4)还是IPV6(返回6) | +| 使用举例 | +| postgres=# select family('fe80::5054:ff:fe99:540c') ; family -------- 6 (1 row) postgres=# select family(inet '172.1.0.23') ; family -------- 4 (1 row) postgres=# | + +### host +| 函数名称 h| host | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | text | +| 函数含义 | 返回IP地址的text形式,且忽略掉netmask | +| 使用举例 | +| postgres=# select host(inet '192.168.1.0/24'); host ------------- 192.168.1.0 (1 row) postgres=# | + +### hostmask +| 函数名称 h| hostmask | +| --- | --- | +| 参数数据类型 | Inet | +| 函数返回值数据类型 | Inet | +| 函数含义 | 返回ip地址的host mask | +| 使用举例 | +| postgres=# select hostmask(inet '192.168.23.20/30') ; hostmask ---------- 0.0.0.3 (1 row) postgres=# | + +### inet_merge +| 函数名称 h| inet_merge | +| --- | --- | +| 参数数据类型 | inet, inet | +| 函数返回值数据类型 | cidr | +| 函数含义 | 返回包含两个给定网络的最小网络 | +| 使用举例 | +| postgres=# select inet_merge(inet '192.168.1.5/24', inet '192.168.2.5/24'); inet_merge ---------------- 192.168.0.0/22 (1 row) postgres=# | + +### inet_same_family +| 函数名称 h| inet_same_family | +| --- | --- | +| 参数数据类型 | inet,inet | +| 函数返回值数据类型 | bool | +| 函数含义 | 返回两个ip地址是否属于同一个family | +| 使用举例 | +| postgres=# select inet_same_family(inet '192.168.1.5/24', inet '::1'); inet_same_family ------------------ f (1 row) postgres=# | + +### masklen +| 函数名称 h| masklen | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | integer | +| 函数含义 | 返回以位为单位的网络掩码长度 | +| 使用举例 | +| postgres=# select masklen(inet '192.168.1.5/24'); masklen --------- 24 (1 row) postgres=# | + +### netmask +| 函数名称 h| netmask | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | inet | +| 函数含义 | 返回网络地址的网络掩码 | +| 使用举例 | +| postgres=# select netmask(inet '192.168.1.5/24'); netmask --------------- 255.255.255.0 (1 row) postgres=# | + +### network +| 函数名称 h| network | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | inet | +| 函数含义 | 返回地址的网络部分,将网络掩码右边的内容清零 | +| 使用举例 | +| postgres=# select network(inet '192.168.1.5/24') ; network ---------------- 192.168.1.0/24 (1 row) postgres=# | + +### set_masklen +| 函数名称 h| set_masklen | +| --- | --- | +| 参数数据类型 | inet, integer | +| 函数返回值数据类型 | inet | +| 函数含义 | 为inet设置netmask长度,网络地址部分保持不变 | +| 使用举例 | +| postgres=# select set_masklen(inet '192.168.1.5/24', 16); set_masklen ---------------- 192.168.1.5/16 (1 row) postgres=# | + +### set_masklen +| 函数名称 h| set_masklen | +| --- | --- | +| 参数数据类型 | cidr, integer | +| 函数返回值数据类型 | cidr | +| 函数含义 | 为cidr设置netmask长度,网络地址右边的设置为零 | +| 使用举例 | +| postgres=# select set_masklen(cidr '192.168.1.0/24', 16); set_masklen ---------------- 192.168.0.0/16 (1 row) postgres=# | + +### text +| 函数名称 h| text | +| --- | --- | +| 参数数据类型 | inet | +| 函数返回值数据类型 | text | +| 函数含义 | 返回ip地址及其掩码的text形式 | +| 使用举例 | +| postgres=# select text(inet '192.168.1.5'); text ---------------- 192.168.1.5/32 (1 row) postgres=# | + +### trunc +| 函数名称 h| trunc | +| --- | --- | +| 参数数据类型 | macaddr | +| 函数返回值数据类型 | macaddr | +| 函数含义 | 将mac地址的最后三个字节清零,前缀可以与特定的网卡制造商关联 | +| 使用举例 | +| postgres=# select trunc(macaddr '12:34:56:78:90:ab') ; trunc ------------------- 12:34:56:00:00:00 (1 row) postgres=# | + +### trunc +| 函数名称 h| trunc | +| --- | --- | +| 参数数据类型 | macaddr8 | +| 函数返回值数据类型 | macaddr8 | +| 函数含义 | 将mac地址的最后五个字节清零,前缀可以与特定的网卡制造商关联 | +| 使用举例 | +| postgres=# select trunc(macaddr8 '12:34:56:78:90:ab:cd:ef') ; trunc ------------------------- 12:34:56:00:00:00:00:00 (1 row) postgres=# | + +### macaddr8_set7bit +| 函数名称 h| macaddr8_set7bit | +| --- | --- | +| 参数数据类型 | macaddr8 | +| 函数返回值数据类型 | macaddr8 | +| 函数含义 | 将地址的第7位设置为1,从而创建被称为修改后的EUI-64,以包含在IPv6地址中。 | +| 使用举例 | +| postgres=# select macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef'); macaddr8_set7bit ------------------------- 02:34:56:ff:fe:ab:cd:ef (1 row) postgres=# | + +### area +| 函数名称 h| area | +| --- | --- | +| 参数数据类型 | geometric_type | +| 函数返回值数据类型 | double precision | +| 函数含义 | 计算面积,针对box, path, circle适用,path必须是能closed,否则会返回NULL | +| 使用举例 | +| postgres=# select area(box '(2,2),(0,0)'); area ------ 4 (1 row) postgres=# | + +### center +| 函数名称 h| center | +| --- | --- | +| 参数数据类型 | geometric_type | +| 函数返回值数据类型 | point | +| 函数含义 | 计算中点,针对box, circle适用 | +| 使用举例 | +| postgres=# select center(box '(1,2),(0,0)') ; center --------- (0.5,1) (1 row) postgres=# | + +### diagonal +| 函数名称 h| diagonal | +| --- | --- | +| 参数数据类型 | box | +| 函数返回值数据类型 | lseg | +| 函数含义 | 获取box的对角线作为一个line segment,作用与lseg(box)一样 | +| 使用举例 | +| postgres=# select diagonal(box '(1,2),(0,0)'); diagonal --------------- [(1,2),(0,0)] (1 row) postgres=# | + +### diameter +| 函数名称 h| diameter | +| --- | --- | +| 参数数据类型 | circle | +| 函数返回值数据类型 | double precision | +| 函数含义 | 计算circle的直径 | +| 使用举例 | +| postgres=# select diameter(circle '<(0,0),2>') ; diameter ---------- 4 (1 row) postgres=# | + +### height +| 函数名称 h| height | +| --- | --- | +| 参数数据类型 | box | +| 函数返回值数据类型 | double precision | +| 函数含义 | 计算box的垂直大小 | +| 使用举例 | +| postgres=# select height(box '(1,2),(0,0)'); height -------- 2 (1 row) postgres=# | + +### isclosed +| 函数名称 h| isclosed | +| --- | --- | +| 参数数据类型 | path | +| 函数返回值数据类型 | bool | +| 函数含义 | path是否是closed的 | +| 使用举例 | +| postgres=# select isclosed(path '((0,0),(1,1),(2,0))'); isclosed ---------- t (1 row) postgres=# | + +### isopen +| 函数名称 h| isopen | +| --- | --- | +| 参数数据类型 | path | +| 函数返回值数据类型 | bool | +| 函数含义 | Path是否是open的 | +| 使用举例 | +| postgres=# select isopen(path '[(0,0),(1,1),(2,0)]'); isopen -------- t (1 row) postgres=# | + +### length +| 函数名称 h| length | +| --- | --- | +| 参数数据类型 | geometric_type | +| 函数返回值数据类型 | double precision | +| 函数含义 | 计算总长度,对lseg以及path适用 | +| 使用举例 | +| postgres=# select length(path '((-1,0),(1,0))') ; length -------- 4 (1 row) postgres=# | + +### npoints +| 函数名称 h| npoints | +| --- | --- | +| 参数数据类型 | geometric_type | +| 函数返回值数据类型 | integer | +| 函数含义 | 返回point的数量,对path以及polygon适用 | +| 使用举例 | +| postgres=# select npoints(path '[(0,0),(1,1),(2,0)]'); npoints --------- 3 (1 row) postgres=# | + +### pclose +| 函数名称 h| pclose | +| --- | --- | +| 参数数据类型 | path | +| 函数返回值数据类型 | path | +| 函数含义 | 将patch转换为closed的形式 | +| 使用举例 | +| postgres=# select pclose(path '[(0,0),(1,1),(2,0)]'); pclose --------------------- ((0,0),(1,1),(2,0)) (1 row) postgres=# | + +### popen +| 函数名称 h| popen | +| --- | --- | +| 参数数据类型 | path | +| 函数返回值数据类型 | path | +| 函数含义 | 将patch转换为open的形式 | +| 使用举例 | +| postgres=# select popen(path '((0,0),(1,1),(2,0))'); popen --------------------- [(0,0),(1,1),(2,0)] (1 row) postgres=# | + +### radius +| 函数名称 h| radius | +| --- | --- | +| 参数数据类型 | circle | +| 函数返回值数据类型 | double precision | +| 函数含义 | 求一个圆形的半径 | +| 使用举例 | +| postgres=# select radius(circle '<(0,0),2>'); radius -------- 2 (1 row) postgres=# | + +### slope +| 函数名称 h| slope | +| --- | --- | +| 参数数据类型 | point,point | +| 函数返回值数据类型 | double precision | +| 函数含义 | 计算通过两个点的直线的斜率 | +| 使用举例 | +| postgres=# select slope(point '(0,0)', point '(2,1)'); slope ------- 0.5 (1 row) postgres=# | + +### width +| 函数名称 h| width | +| --- | --- | +| 参数数据类型 | double precision | +| 函数返回值数据类型 | box | +| 函数含义 | 计算box的horizontal size | +| 使用举例 | +| postgres=# select width(box '(1,2),(0,0)') ; width ------- 1 (1 row) postgres=# | + +### box +| 函数名称 h| box | +| --- | --- | +| 参数数据类型 | circle | +| 函数返回值数据类型 | box | +| 函数含义 | 计算圆内切的box | +| 使用举例 | +| postgres=# select box(circle '<(0,0),2>'); box ------------------------------------------------------------------------------- (1.414213562373095,1.414213562373095),(-1.414213562373095,-1.414213562373095) (1 row) postgres=# | diff --git a/CN/modules/ROOT/pages/2.adoc b/CN/modules/ROOT/pages/2.md similarity index 82% rename from CN/modules/ROOT/pages/2.adoc rename to CN/modules/ROOT/pages/2.md index 5688a4c7..a3de8e8c 100644 --- a/CN/modules/ROOT/pages/2.adoc +++ b/CN/modules/ROOT/pages/2.md @@ -1,32 +1,22 @@ - -:sectnums: -:sectnumlevels: 5 - - -== IvorySQL简介 - -=== 概述 - +## IvorySQL简介 +### 概述 IvorySQL是一款以PostgreSQL为基础进行开发,并且兼容Oracle的开源数据库。 IvorySQL社区始终承诺与PostgreSQL数据库保持100%兼容,并且可以直接替换最新版本的PostgreSQL。 IvorySQL增加了一个名为 `ivorysql.compatible_mode` 的GUC参数用以控制IvorySQL的兼容模式,该参数有 `oracle` 和 `pg` 两种值。在初始化数据目录的时候,通过指定 `-m` 参数来指定数据目录的兼容模式,`-m pg` 则数据目录为PostgreSQL模式,该模式下 `ivorysql.compatible_mode` 参数将会失效,`-m oracle` 或者不指定 `-m` 参数则数据目录为兼容Oracle模式,该模式下 `ivorysql.compatible_mode` 参数初始值为 `oracle` 并且不支持部分PostgreSQL的语法,通过 `set ivorysql.compatible_mode to pg` 就可以使得数据库100%支持PostgreSQL的语法及功能。 -IvorySQL的亮点之一是PL/iSQL过程语言,它支持Oracle的PL/SQL语法。同时,IvorySQL通过增加与内核绑定的插件 *ivorysql_ora* 来实现兼容Oracle的功能,目前实现的功能包括内置函数、数据类型、系统视图、merge以及GUC参数的增加,未来将会继续以绑定内核的插件的形式来实现新的兼容功能。 +IvorySQL的亮点之一是PL/iSQL过程语言,它支持Oracle的PL/SQL语法。同时,IvorySQL通过增加与内核绑定的插件 **ivorysql_ora** 来实现兼容Oracle的功能,目前实现的功能包括内置函数、数据类型、系统视图、merge以及GUC参数的增加,未来将会继续以绑定内核的插件的形式来实现新的兼容功能。 IvorySQL项目是在Apache 2.0许可证下发布的,社区鼓励且欢迎所有类型的贡献和参与。 -=== 产品目标和范围 - -我们致力于遵守 https://opensource.com/open-source-way[开源方式]的原则,我们坚信建立一个健康和包容的社区。我们坚持认为,好的想法可以来自任何地方。虽然IvorySQL目前的版本主要关注Oracle兼容性功能,但未来的路线图和功能集将由社区以开源方式确定。 - -=== 核心特性 +### 产品目标和范围 +我们致力于遵守 [开源方式](https://opensource.com/open-source-way)的原则,我们坚信建立一个健康和包容的社区。我们坚持认为,好的想法可以来自任何地方。虽然IvorySQL目前的版本主要关注Oracle兼容性功能,但未来的路线图和功能集将由社区以开源方式确定。 +### 核心特性 IvorySQL基于PostgreSQL数据库开发,与Oracle数据库兼容,具有强大的兼容性。适用于PostgreSQL数据库和Oracle数据库场景。 -=== 竞争优势 - +### 竞争优势 * **核心开源**:IvorySQL的核心代码包括兼容功能全部在开源协议下公开,没有厂商的限制。并应用于瀚高股份数据库公司实例,且拥有一个活跃的开发者社区。 * **兼容Oracle**:可以将Oracle数据库迁移到IvorySQL。 * **可定制化**:只需下载代码,并按照你的想法自定义。 @@ -35,12 +25,10 @@ IvorySQL基于PostgreSQL数据库开发,与Oracle数据库兼容,具有强 * **瀚高支持**:由领先的PostgreSQL数据库提供商瀚高股份提供支持。 -=== 技术生态 - +### 技术生态 IvorySQL基于PostgreSQL,具有完整的SQL、坚如磐石的可靠性和庞大的生态系统。 -=== 核心应用场景 - +### 核心应用场景 IvorySQL数据库的主要应用场景: * 企业数据库 @@ -63,12 +51,10 @@ IvorySQL数据库的主要应用场景: 如果需要将Oracle数据库迁移到PostgreSQL数据库,可以直接使用IvorySQL数据库进行迁移。 -== 主要、基本功能 - +## 主要、基本功能 IvorySQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS)。 用于安全地存储数据,支持最佳做法,并允许在处理请求时检索它们。除此之外,还兼容了Oracle的语法,适用于使用Oracle的场景。 -== 与Oracle的兼容性 - +## 与Oracle的兼容性 * 大小写转换 * LIKE操作符 * 匿名块 diff --git a/CN/modules/ROOT/pages/23.adoc b/CN/modules/ROOT/pages/23.md similarity index 82% rename from CN/modules/ROOT/pages/23.adoc rename to CN/modules/ROOT/pages/23.md index e4396802..7c27e8c9 100644 --- a/CN/modules/ROOT/pages/23.adoc +++ b/CN/modules/ROOT/pages/23.md @@ -1,46 +1,32 @@ - -:sectnums: -:sectnumlevels: 5 - -:imagesdir: ./_images -= **IvorySQL社区贡献指南** - -== **概述** - -=== 说明 - +# IvorySQL社区贡献指南 +## 概述 +### 说明 IvorySQL由一个核心开发团队维护,该团队拥有对GitHub上的IvorySQL主存储库的提交权限。同时,我们非常渴望从更广泛的IvorySQL社区中的成员那里获得贡献。如果您希望看到您的代码或文档更改被添加到IvorySQL并出现在将来的版本中,本节的内容介绍是您需要知道的。 ​IvorySQL社区欢迎并赞赏所有类型的贡献,期待您的加入! -=== 行为准则 - -作为成员,贡献者和领导者,我们每个人都应阅读我们的 *行为准则*。我们承诺让每个人都能参与社区,成为一种无骚扰的体验,无论年龄、体型、有形或无形的残疾、种族、性特征、性别认同和表达、经验水平、教育、社会经济地位、国籍、个人外表、种族、宗教或性身份和取向如何。 +### 行为准则 +作为成员,贡献者和领导者,我们每个人都应阅读我们的 **行为准则**。我们承诺让每个人都能参与社区,成为一种无骚扰的体验,无论年龄、体型、有形或无形的残疾、种族、性特征、性别认同和表达、经验水平、教育、社会经济地位、国籍、个人外表、种族、宗教或性身份和取向如何。 ​ 我们承诺以有助于建立一个开放,热情,多样化,包容和健康社区的方式采取行动和互动。 -=== 管理说明 - +### 管理说明 团队是持续开放的团队,专注于IvorySQL项目的一部分。一个团队有其审查者、提交者和维护者,并拥有一个或多个存储库。团队级别的决策来自其维护者。IvorySQL开发人员的典型提升路径是从用户到审查者,然后是提交者和维护者。但获得更多的角色并不意味着你对其他社区成员拥有任何特权。IvorySQL社区中的每个人都是平等的,都有责任与其他贡献者进行建设性合作,建立一个友好的社区。这些角色是对您在IvorySQL开发中做出重大贡献的自然奖励,并为您在开发工作流中提供更多权利,以提高您的效率。同时,他们要求你承担一些额外的责任: ​ 团队荣誉:现在您已经是团队评审员/提交者/维护者的成员,意味着您代表着项目和您的团队成员。所以,请做一个好人来捍卫球队的声誉。 ​ 责任:提交者/维护者有权合并拉取请求,因此承担额外的责任来处理接受代码库或文档更改的后果。这包括在它导致问题时恢复或修复它,以及帮助发布经理解决发布前测试周期中发现的任何问题。 -== **贡献者指南** - -在贡献之前,我们需要了解下IvorySQL目前的版本以及文档的版本。目前,我们维护着{ivorysql-version}等版本,我们的版本紧跟PG的更新步伐,贡献之前请更新至最新版本。之后我们需要细心浏览一下贡献的样式风格,熟悉代码贡献风格、提Issue样式、拉取PR标题样式、代码注释样式、文档贡献样式、文章贡献样式,这可以帮助您尽快成为IvorySQL的贡献者奥~。 - -=== 贡献前的准备 - -==== 开始 +## 贡献者指南 +在贡献之前,我们需要了解下IvorySQL目前的版本以及文档的版本。目前,我们维护着5.3等版本,我们的版本紧跟PG的更新步伐,贡献之前请更新至最新版本。之后我们需要细心浏览一下贡献的样式风格,熟悉代码贡献风格、提Issue样式、拉取PR标题样式、代码注释样式、文档贡献样式、文章贡献样式,这可以帮助您尽快成为IvorySQL的贡献者奥~。 +### 贡献前的准备 +#### 开始 IvorySQL是在GitHub上开发的,任何希望对其作出贡献的人都必须拥有GitHub帐户,并熟悉Git工具和工作流。还建议您遵循开发人员的邮件列表,因为一些贡献可能会在那里产生更详细的讨论。 如果您有GitHub帐户,fork这个存储库至您的个人仓库中,这样您就可以拥有您的私人副本来开始hacking,并将其用作拉取请求的来源。 -==== IvorySQL贡献的许可 - +#### IvorySQL贡献的许可 如果您提交的贡献是原创作品,那么您可以假设IvorySQL将作为整个IvorySQL版本的一部分发布给下游用户,该版本将遵循**Apache许可证2.0版本**。 ​ 如果您提交的内容不是原创作品,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布。***\*请注意需要满足如下条件\****: @@ -56,42 +42,33 @@ IvorySQL是在GitHub上开发的,任何希望对其作出贡献的人都必须 ​ 最后,请记住,从非原始的工作中删除许可标头从来都不是一个好主意。即使您使用的文件部分最初在顶部有许可标头,您也应该保留它。与往常一样,如果您不太确定您的贡献所涉及的许可问题,请随时在开发人员邮件列表中联系我们。 -=== 您可以做什么贡献 - -==== 贡献代码 - +### 您可以做什么贡献 +#### 贡献代码 可以将自己修改的bug、新增的功能等代码上传至个人仓库,最后提交PR请求合并至官网:https://github.com/IvorySQL/IvorySQL 。 -==== 文档贡献 - +#### 文档贡献 IvorySQL社区提供的是中英文文档。英文文档保存在...文档存储库中,中文文档保存在i18n文档存储库中。您可以为任一文档存储库做出贡献。 -如果您新增或更新某个插件适配文档,请同步更新 xref:./5.0.adoc[IvorySQL生态插件适配列表] 概述页面中的插件表格,至少补充或更新插件名称、版本、功能描述、适用场景以及详情页链接,确保概述页与插件详情页信息一致。 - -==== 测试IvorySQL和报告问题 +如果您新增或更新某个插件适配文档,请同步更新 [IvorySQL生态插件适配列表](./5.0.md) 概述页面中的插件表格,至少补充或更新插件名称、版本、功能描述、适用场景以及详情页链接,确保概述页与插件详情页信息一致。 -GitHub: https://github.com/IvorySQL/IvorySQL +#### 测试IvorySQL和报告问题 +GitHub: https://github.com/IvorySQL/IvorySQL ​码云:https://gitee.com/IvorySQL/ -==== 参与IvorySQL网站建设 - +#### 参与IvorySQL网站建设 IvorySQL官网下载:https://github.com/IvorySQL/Ivory-www -==== 回答邮件列表问题 - +#### 回答邮件列表问题 邮件列表位于 官网下:https://lists.ivorysql.org/ -==== 贡献文章 - +#### 贡献文章 您可以在IvorySQL-WWW代码仓库自己提交至blog贡献,也可以联系我们IvorySQL小助理发送至邮箱ivorysql@highgo.com 。 -=== 如何做出贡献 - -==== 编码指南 - +### 如何做出贡献 +#### 编码指南 您获得反馈和看到代码合并到项目中的机会在很大程度上取决于更改的粒度。如果您的想法发生了更大的变化,我们强烈建议您在花大量时间编写代码之前,先加入开发人员的邮件列表,并与我们分享您的建议。即使您的建议得到社区的验证,我们仍然建议您将实际工作作为一系列小型的、独立的提交来完成。这使得评审员的工作更加容易,并提高了反馈的及时性。 ​ 当谈到IvorySQL的C和C++部分时,我们尝试遵循PostgreSQL编码约定。除此之外: @@ -102,16 +79,13 @@ IvorySQL官网下载:https://github.com/IvorySQL/Ivory-www ​ 至少,您应该始终运行make install check world,以确保您没有破坏任何东西。 -==== 适用于上游PostgreSQL的更改 - +#### 适用于上游PostgreSQL的更改 如果您正在进行的更改涉及PostgreSQL和IvorySQL之间的通用功能,则可能会要求您将其转发到PostgreSQL。这不仅是为了我们不断减少两个项目之间的差异,而且是为了让与PostgreSQL相关的任何变化都能从对上游PostgreSQL社区更广泛的审查中受益。一般来说,将这两个代码库都放在手边是个好主意,这样您就可以确定您的更改是否需要前移。 -==== 补丁提交 - +#### 补丁提交 一旦您准备好与IvorySQL核心团队和IvorySQL社区的其他成员共享您的工作,请先创建或认领对应的 GitHub Issue,然后将所有提交推送到从官方IvorySQL派生的您自己的存储库中,并向我们发送 Pull Request。所有 PR 都必须至少对应一个 Issue,用于关联需求、缺陷、讨论、评审和合并结果。 -==== 补丁审查 - +#### 补丁审查 假定提交的拉取请求通过验证检查,可供同行审查。同行审查是确保对IvorySQL的贡献具有高质量并与路线图和社区期望保持一致的过程。我们鼓励IvorySQL社区的每个成员审查请求并提供反馈。由于您不必成为核心团队成员就可以做到这一点,因此我们建议您向有兴趣成为IvorySQL长期贡献者的任何人提供一系列拉动式评论。 ​ 同行评审的一个结果可能是达成共识,即您需要以某些方式修改pull请求。GitHub允许您将其他提交推送到从中发送请求的分支中。这些额外的提交将对所有审阅者可见。 @@ -120,23 +94,19 @@ IvorySQL官网下载:https://github.com/IvorySQL/Ivory-www 在补丁审查期间的任何时候,您都可能会因审查人员和核心团队成员的工作效率而遇到延迟。请耐心点,也不要气馁。如果您在几天内没有收到预期的反馈,请添加一条评论,要求更新pull请求本身,或者向邮件列表发送一封电子邮件。 -==== 直接提交到存储库 - +#### 直接提交到存储库 有时,您会看到核心团队成员直接提交到存储库,而无需执行pull请求工作流。这仅适用于小的更改,我们使用的经验法则是:如果更改涉及任何可能导致测试失败的功能,那么它必须通过pull请求工作流。另一方面,如果更改发生在代码库的非功能部分(例如在注释块中修复打字错误),则核心团队成员可以决定直接提交到存储库。 -== **提Issue** - -=== 第1步 进入New issue 页面: - -1、进入 IvorySql官网:https://github.com/IvorySQL/IvorySQL +## 提Issue +### 第1步 进入New issue 页面: +1、进入 IvorySql官网:https://github.com/IvorySQL/IvorySQL ​2、点击New issue -image::p3.png[] +![](../images/p3.png) -=== 第2步:选择需要填写的issue类型 - +### 第2步:选择需要填写的issue类型 **1、bug report** ``` @@ -194,71 +164,59 @@ Title: 标题 ``` -=== 第3步:提交 - +### 第3步:提交 点击 submit new issue 按钮, 提交即可 -== **贡献代码** - -=== 第1步: Fork https://ivorysql.org/[ivorysql.org]仓库 - -1、打开ivorysql仓库 https://github.com/IvorySQL/IvorySQL +## 贡献代码 +### 第1步: Fork [ivorysql.org](https://ivorysql.org/)仓库 +1、打开ivorysql仓库 https://github.com/IvorySQL/IvorySQL 2、点击右上角fork按钮,等待fork完成 -=== 第2步:将fork的仓库克隆至本地 - +### 第2步:将fork的仓库克隆至本地 ``` cd $working_dir # 将 $working_dir 替换为你想放置 repo 的目录。例如,`cd ~/Documents/GitHub` git clone git@github.com:$user/IvorySQL.git # 将 `$user` 替换为你的 GitHub ID ``` -=== 第3步:创建一个新的Branch - +### 第3步:创建一个新的Branch ``` cd $working_dir/IvorySQL git checkout -b new-branch-name ``` -=== 第4步:编辑文档或修改代码 - +### 第4步:编辑文档或修改代码 在新建的new-branch-name中修改代码。 -=== 第5步:生成commit - +### 第5步:生成commit ``` Git add Git commit -m “commit-message” ``` -=== 第6步:将修改推送至远端 - +### 第6步:将修改推送至远端 ``` Git push -u origin new-branch-name ``` -=== 第7步:创建一个Pull Request - -1、打开你 Fork 的仓库: https://github.com/$user/docs-cn[https://github.com/$user/IvorySQL](将 $user 替换为你的 GitHub ID)。 +### 第7步:创建一个Pull Request +1、打开你 Fork 的仓库: [https://github.com/$user/IvorySQL](https://github.com/$user/docs-cn)(将 $user 替换为你的 GitHub ID)。 2、点击 Compare & pull request 按钮即可创建 PR。 -== **提交PR** - +## 提交PR 对于提交一个PR应该保持一个功能,或者一个bug提交一次。禁止多个功能一次提交。 -=== 第1步:创建一个Pull Request - -1、打开你 Fork 的仓库: https://github.com/$user/docs-cn[https://github.com/$user/IvorySQL](将 $user 替换为你的 GitHub ID)。 +### 第1步:创建一个Pull Request +1、打开你 Fork 的仓库: [https://github.com/$user/IvorySQL](https://github.com/$user/docs-cn)(将 $user 替换为你的 GitHub ID)。 ​ 2、点击 Compare & pull request 按钮 -=== 第2步:填写PR信息 - +### 第2步:填写PR信息 ``` Fix test 功能描述 @@ -269,14 +227,11 @@ leave a comment 对该提交功能进行比较详细的描述 ``` -=== 第3步:提交PR - +### 第3步:提交PR 点击Create pull request 按钮即可提交。 -== **编写文档** - -=== 准备工作 - +## 编写文档 +### 准备工作 (1)下载Markdown或者Typora文档编辑器。 (2)检查源仓库是否有更新,如果有更新请先更新并同步到自己的仓库。如有更新请参阅以下步骤,更新至最新版本: @@ -293,8 +248,7 @@ git push (3)熟悉样式风格(规范说明) -=== 贡献地方 - +### 贡献地方 IvorySQL社区提供双语文档。英文文档保存在IvorySQL/文档存储库(文档存储库)中,中文文档保存在 IvorySQL/文档-i18n存储库(文档-i18n 存储库)中。您可以为任何一方文档做出贡献,当然您也可以为两方同时做出贡献。 ​ 您可以从以下任何一项开始,以帮助改进IvorySQL网站(英文和 -i18n)上的 IvorySQL文档: @@ -313,8 +267,7 @@ IvorySQL社区提供双语文档。英文文档保存在IvorySQL/文档存储库 ​ (7) (高级)查看其他人创建的拉取请求 -=== 规范说明 - +### 规范说明 IvorySQL文档是用“markdown”编写的。为确保格式的质量和一致性,在修改更新文档时应遵循某些 Markdown 规则。 ​ **Markdown规范** @@ -363,8 +316,7 @@ IvorySQL文档是用“markdown”编写的。为确保格式的质量和一致 ​ 22、链接必须有链接路径。如不能出现[空链接]()或[空链接](#)等情况。 -=== 示例 - +### 示例 1、标题从一级开始递增使用,禁止跳级使用。 ``` @@ -375,7 +327,6 @@ We skipped out a 2nd level heading in this document ``` - 2、标题必须统一使用 ATX 风格,即在标题前加 # 号来表示标题级别。 ``` @@ -388,7 +339,6 @@ We skipped out a 2nd level heading in this document ``` - 3、标题的引导符号 # 后必须空一格再接标题内容。禁止#后多个空格,禁止#前出现空格 错误示范: @@ -406,8 +356,7 @@ We skipped out a 2nd level heading in this document ``` - -4、标题末尾仅能出现中英文问号、反引号、中英文单双引号等符号。 +4、标题末尾仅能出现中英文问号、反引号、中英文单双引号等符号。 错误示范 @@ -422,7 +371,6 @@ We skipped out a 2nd level heading in this document ``` - 5、标题上面空一行 错误示范 @@ -444,7 +392,6 @@ Some more text ``` - 6、文档中不能连续出现内容重复的标题,如一级标题为 # IvorySQL 描述,紧接着的二级标题就不能是 ## IvorySQL 描述。如果不是连续的标题,则标题内容可重复。 错误示范 @@ -464,7 +411,6 @@ Some more text ``` - 7、文档中只能出现一个一级标题。 错误示范 @@ -486,7 +432,6 @@ Some more text ``` - 8、一般来说,除 TOC.md 文件可缩进 2 个空格外,其余所有 .md 文件每缩进一级,默认须缩进 4 个空格。 错误示范 @@ -504,7 +449,6 @@ Some more text ``` - 9、文档中(包括代码块内)禁止出现 Tab 制表符,如需缩进,必须统一用空格代替 错误示范: @@ -522,7 +466,6 @@ Some text ``` - 10、禁止出现连续的空行 错误示范 @@ -543,7 +486,6 @@ Some more text here ``` - 11、块引用符号 > 后禁止出现多个空格,只能使用一个空格,后接引用内容。 错误示范 @@ -559,7 +501,6 @@ Some more text here ``` - 12、使用有序列表时,必须从 1 开始,按顺序递增。 错误示范: @@ -585,7 +526,6 @@ Some more text here ``` - 13、使用列表时,每一列表项的标识符(+、-、* 或数字)后只能空一格,后接列表内容。 正确示范 @@ -601,7 +541,6 @@ Some more text here ``` - 14、列表(包括有序和无序列表)前后必须各空一行。 错误示范 @@ -629,7 +568,6 @@ Some text ``` - 15、代码块前后必须各空一行。 错误示范 @@ -662,7 +600,6 @@ Some more text ``` - 16、文档中禁止出现裸露的 URL。如果希望用户能直接点击并打开该 URL,则使用一对尖括号 () 包裹该 URL。如果由于特殊情况必须使用裸露的 URL,不需要用户通过点击打开,则使用一对反引号 (`URL`) 包裹该 URL。 错误示范 @@ -678,7 +615,6 @@ For more information, see . ``` - 17、使用加粗、斜体等强调效果时,在强调标识符内禁止出现多余的空格。如不能出现 `** 加粗文本 **`。 错误示范 @@ -706,13 +642,12 @@ Here is some more _italic_ text. ``` - 18、单个反引号包裹的代码块内禁止出现多余的空格。如不能出现 ` 示例文本 `。 错误示范: ``` -some text +some text some text ``` @@ -723,7 +658,6 @@ some text ``` - 19、链接文本两边禁止出现多余的空格。如不能出现 [ 某链接 ](https://www.example.com/)。 错误示范 @@ -739,7 +673,6 @@ some text ``` - 20、链接必须有链接路径。如不能出现[空链接]()或[空链接](#)等情况。 错误示范 @@ -759,7 +692,6 @@ some text ``` - 21文档中的代码块统一使用三个反引号进行包裹,禁止使用缩进四格风格的代码块。 错误示范: @@ -781,79 +713,73 @@ More text. More text. ``` -=== 环境准备 - +### 环境准备 为了测试您所做的修改是否修改,您需要准备以下环境 * `Node.js` 安装 * `Antora` 安装 -环境安装请参考 https://docs.antora.org/antora/latest/[Antora docs]。 +环境安装请参考 [Antora docs](https://docs.antora.org/antora/latest/)。 安装成功后,在终端上显示如下即为成功安装。 -image::14.png[] +![](../images/14.png) -=== 网页生成 - +### 网页生成 通过阅读之前内容,相信您已经有了充足的准备,包括 `fork` 我们文档中心相关的三个仓库到个人仓库中,`Antora` 工具的安装准备等环境的搭建。 * 首先,您要知道网页对应的ui的位置,如下图: -image::15.png[] +![](../images/15.png) 中英文的网页ui模板基本一致,因此修改时应该尽量保证同时修改两个模板,将修改过后的ui再上传至个人Github上,完成了这些,就可以考虑在本地生成您修改过后的网页了。 文档中心是由 `Antora` 进行搭建的,在运行 `Antora` 之前,记得修改对应 `playbook.yml` 文件 -image::16.png[] -image::17.png[] +![](../images/16.png) +![](../images/17.png) 完成上述流程之后,请在终端运行命令 `antora antora-playbook.yml --stacktrace`,然后耐心等待,当成功运行结束后,你就可以查看自己生成的网页了。 -在检查之后,你就可以开始着手上传至我们的 *ivorysql_web* 仓库中,提交PR的流程和之前的流程相同,感谢您对社区的贡献^_^,我们会在审核过后,考虑是否更新网站。 - -== 提交blog - -=== 准备工作 +在检查之后,你就可以开始着手上传至我们的 **ivorysql_web** 仓库中,提交PR的流程和之前的流程相同,感谢您对社区的贡献^_^,我们会在审核过后,考虑是否更新网站。 -1、下载 https://markdown.com.cn/tools.html#%E7%BC%96%E8%BE%91%E5%99%A8[Markdown]或者 https://typoraio.cn/[Typora]文档编辑器。 +## 提交blog +### 准备工作 +1、下载 [Markdown](https://markdown.com.cn/tools.html#%E7%BC%96%E8%BE%91%E5%99%A8)或者 [Typora](https://typoraio.cn/)文档编辑器。 ​ 2、先下载博客源码到本地,检查源仓库(https://github.com/IvorySQL/Ivory-www)是否有更新, 如果有更新请先更新并同步到自己的仓库。请参阅以下步骤,更新至最新版本: -``` bash +``` # 拉取网站源码 git clone https://github.com/IvorySQL/Ivory-www.git # 同步更新仓库 git pull ``` -​ 3、熟悉样式风格 (<<#_规范说明_2>>) - -=== 贡献地方 +​ 3、熟悉样式风格 ([#_规范说明_2](##_规范说明_2)) +### 贡献地方 IvorySQL社区提供双语文档。英文博客保存在源码目录**Ivory-www/blog**中,中文博客保存在源码目录**Ivory-www/i18n/zh-CN/docusaurus-plugin-content-blog**中。您可以为任何一方博客做出贡献,当然您也可以为两方同时做出贡献。 -=== 如何贡献 - +### 如何贡献 在贡献之前,让我们快速浏览一下有关IvorySQL博客维护的信息。这可以帮助您尽快成功的提交blog成为贡献者。blog提交规范 ​ (1)将代码克隆到本地仓库 -``` bash +``` git clone https://github.com/IvorySQL/Ivory-www.git ``` ​ (2)创建一个分支 -```bash +``` git checkout -b ``` -​ (3)在博客目录中创建自己文章的目录,目录名字规则参照 (<<#_规范说明_2>>)。 +​ (3)在博客目录中创建自己文章的目录,目录名字规则参照 ([#_规范说明_2](##_规范说明_2))。 -```bash +``` # 生成英文博客目录及文件 cd Ivory-www/blog mkdir @@ -870,16 +796,14 @@ touch index.md ​ (5)提交发布博客 -```bash +``` git add git commit -m "" git push origin : ``` -=== 规范说明 - -==== blog提交规范 - +### 规范说明 +#### blog提交规范 (1)文件夹命名格式:**年-月-日-名称** 示例:2022-1-28-ivorysql-arrived @@ -892,13 +816,12 @@ git push origin : ​ 示例:po-one.png -==== blog编写规范 - -博客是用markdown或者Typora来编写,您可以阅读 https://docusaurus.io/zh-CN/docs/blog[博客 | Docusaurus]来了解博客的设计方式。 +#### blog编写规范 +博客是用markdown或者Typora来编写,您可以阅读 [博客 | Docusaurus](https://docusaurus.io/zh-CN/docs/blog)来了解博客的设计方式。 (1)文章头部部署包括以下信息 -```vim +``` --- slug: IvorySQL title: 欢迎来到IvorySQL社区 @@ -931,63 +854,59 @@ tags: [IvorySQL, Welcome, Database, Join Us] ​ [Github page](https://github.com/IvorySQL/) 下载源代码或发布的软件包。 -== 网站贡献指南 - -https://docs.ivorysql.org[IvorySQL的文档中心] 采用开源工具 https://antora.org/[`Antora`] 进行搭建,同样的,我们的文档中心也是开源的。文档中心由三部分组成,分别是 https://github.com/IvorySQL/ivorysql_docs[文档文件], https://github.com/IvorySQL/ivorysql_web[静态网页文件] 以及生成网页所用到的 https://github.com/IvorySQL/ivory-doc-builder[网页模板文件] 。 +## 网站贡献指南 +[IvorySQL的文档中心](https://docs.ivorysql.org) 采用开源工具 [`Antora`](https://antora.org/) 进行搭建,同样的,我们的文档中心也是开源的。文档中心由三部分组成,分别是 [文档文件](https://github.com/IvorySQL/ivorysql_docs), [静态网页文件](https://github.com/IvorySQL/ivorysql_web) 以及生成网页所用到的 [网页模板文件](https://github.com/IvorySQL/ivory-doc-builder) 。 我们的文档中心同样欢迎每一位愿意参与到开源工作中的小伙伴的加入,记得遵守我们的行为准则^_^。 -=== 如何贡献 - +### 如何贡献 由于我们的文档中心全部托管于Github上,这使得任何用户都可以将我们的文档仓库 `fork` 到个人仓库中,然后对其进行修改,之后提交PR,由我们的开源团队的人员审核过后就可以将修改更新到我们的文档中心中。 为了更加便捷地使您达到纠正文档错误的目的,首先需要您按照想要更新的大小来建立个人仓库,如下: -* 如果您想修改原有的内容或者添加新的页面,仅需要 `fork` https://github.com/IvorySQL/ivorysql_docs[文档文件] 到个人仓库中。 - -image::7.png[] +* 如果您想修改原有的内容或者添加新的页面,仅需要 `fork` [文档文件](https://github.com/IvorySQL/ivorysql_docs) 到个人仓库中。 -* 如果您想更深度地参与到文档中心的建设工作中来,除了文档文件外,还需要 `fork` https://github.com/IvorySQL/ivorysql_web[静态网页文件] 和 https://github.com/IvorySQL/ivory-doc-builder[网页模板文件] 到个人仓库中。 +![](../images/7.png) -image::8.png[] -image::9.png[] +* 如果您想更深度地参与到文档中心的建设工作中来,除了文档文件外,还需要 `fork` [静态网页文件](https://github.com/IvorySQL/ivorysql_web) 和 [网页模板文件](https://github.com/IvorySQL/ivory-doc-builder) 到个人仓库中。 -=== 修改内容 +![](../images/8.png) +![](../images/9.png) +### 修改内容 本小节将会介绍发现网页内容不适宜之后,对网页内容进行修改的流程。 * 在有错误内容的网页的右上角,有一个 `edit this page` 的按钮,点击按钮。如图: -image::10.png[] +![](../images/10.png) -* 点击之后,就会跳转到我们存放当前页面源 `.adoc` 文件的编辑页面,请按照 `Asciidoc` 格式对内容进行修改。如图: +* 点击之后,就会跳转到我们存放当前页面源 `.md` 文件的编辑页面,请按照 `Markdown` 格式对内容进行修改。如图: -image::11.png[] +![](../images/11.png) * 编辑完成后,如图: -image::12.png[] +![](../images/12.png) * 确认更新后,如图: -image::13.png[] +![](../images/13.png) * 接下来会由开源团队的相关人员负责审核您提交的内容,审核完成后您所提交的更新就会出现在对应页面上。 -=== 添加页面 - +### 添加页面 本小节会介绍如何在网站上添加新的页面组件,添加新页面涉及的修改主要包括以下几种: -* `CN/modules/ROOT/pages/vX.X` 目录下的 `.adoc` 文件添加 +* `CN/modules/ROOT/pages/vX.X` 目录下的 `.md` 文件添加 * `CN/modules/ROOT/nav.adoc` 的修改,如果修改涉及到图片的修改或者添加,请修改 `images` 中的图片 -* `EN/modules/ROOT/pages/vX.X` 目录下的 `.adoc` 文件添加 +* `EN/modules/ROOT/pages/vX.X` 目录下的 `.md` 文件添加 * `EN/modules/ROOT/nav.adoc` 的修改,如果修改涉及到图片的修改或者添加,请修改 `images` 中的图片 1. 首先,您需要把您 `fork` 的仓库,clone到本地 git clone https://github.com/$username$/ivorysql_docs.git -2. 然后,将要添加的 `.adoc` 文件放至正确目录下,切记中英文的都应该准备(*中英文文件应该同名*),并且各自放至正确目录下,同时,修改对应的 `nav.adoc` 文件(修改方式可以参照文件已有内容进行修改)。 +2. 然后,将要添加的 `.md` 文件放至正确目录下,切记中英文的都应该准备(**中英文文件应该同名**),并且各自放至正确目录下,同时,修改对应的 `nav.adoc` 文件(修改方式可以参照文件已有内容进行修改)。 3. 上述修改完成后,先提交至个人仓库 git add . @@ -996,19 +915,15 @@ image::13.png[] 4. 之后按照如下提交PR即可 -image::13.png[] - -=== 测试 +![](../images/13.png) +### 测试 如果您不满足于简单的在网页端进行提交或者仅修改网页内容,又或者您想要修改网页ui,本小节内容将会帮助到您。 -在阅读本小节内容之前,您需要确认您的Github个人仓库是否已经 `fork` 了网页模板文件仓库和静态网页文件仓库,如果没有请参考<<#_如何贡献>>。 - -=== 部署网页 +在阅读本小节内容之前,您需要确认您的Github个人仓库是否已经 `fork` 了网页模板文件仓库和静态网页文件仓库,如果没有请参考[#_如何贡献](##_如何贡献)。 +### 部署网页 部署网页这部分工作,暂时还是由开源团队的人员负责,我们重视每一次提交和每一个issue,所以请不要担心自己对于社区的贡献被埋没^_^ -=== Tip - -本章节主要介绍了如何自己主动去更新我们的文档中心,但是我们明确地知道山高路远,时不我待。因此对于没有太多时间的小伙伴来说,可以发邮件到我们的 **ivorysql-docs@ivorysql.org**,我们会有专门的工作人员进行处理您的每一封来信,期待您的邮件。 - +### Tip +本章节主要介绍了如何自己主动去更新我们的文档中心,但是我们明确地知道山高路远,时不我待。因此对于没有太多时间的小伙伴来说,可以发邮件到我们的 **ivorysql-docs@ivorysql.org**,我们会有专门的工作人员进行处理您的每一封来信,期待您的邮件。 \ No newline at end of file diff --git a/CN/modules/ROOT/pages/3.1.adoc b/CN/modules/ROOT/pages/3.1.md similarity index 59% rename from CN/modules/ROOT/pages/3.1.adoc rename to CN/modules/ROOT/pages/3.1.md index dd650ac2..7f182588 100644 --- a/CN/modules/ROOT/pages/3.1.adoc +++ b/CN/modules/ROOT/pages/3.1.md @@ -1,49 +1,36 @@ +# 快速开始 +## 环境要求 + * **硬件要求 ** +| 配置参数 | 最低配置 | 推荐配置 | +| --- | --- | --- | +| CPU | 4核 | 16核 | +| 内存 | 4GB | 64GB | +| 存储 | 800MB,机械硬盘 | 5GB以上,SSD或NvMe | +| 网络 | 千兆网络 | 万兆网络 | -:sectnums: -:sectnumlevels: 5 -:imagesdir: ./_images + * **软件要求** -= **快速开始** - -== 环境要求 - -** 硬件要求 -|==== -|配置参数|最低配置|推荐配置 -|CPU|4核|16核 -|内存|4GB|64GB -|存储|800MB,机械硬盘|5GB以上,SSD或NvMe -|网络|千兆网络|万兆网络 -|==== - -** 软件要求 - -+ IvorySQL数据库目前支持的操作系统包括但不限于CentOS 8.X、CentOS Stream 9以及Ubuntu系统。 -[[快速安装]] -== 快速安装 -.... + +## 快速安装 +``` 快速开始示例所使用的操作系统为CentOS Stream 9。 -.... -=== 从yum源安装IvorySQL数据库 - -** 安装前准备 +``` +### 从yum源安装IvorySQL数据库 + * **安装前准备** -+ 安装前请先创建一个用户,并赋予其root权限,安装和使用均以该用户执行。这里以ivorysql用户为例。 -https://www.ionos.com/help/server-cloud-infrastructure/server-administration/creating-a-sudo-enabled-user[如何创建sudo用户] +[如何创建sudo用户](https://www.ionos.com/help/server-cloud-infrastructure/server-administration/creating-a-sudo-enabled-user) -** 下载安装 + * **下载安装** -+ 创建或编辑IvorySQL yum源配置文件/etc/yum.repos.d/ivorysql.repo -[source,bash,subs="attributes"] -``` +```bash vim /etc/yum.repos.d/ivorysql.repo [ivorysql5] name=IvorySQL Server 5 $releasever - $basearch @@ -52,23 +39,21 @@ enabled=1 gpgcheck=0 ``` 保存退出后,安装IvorySQL5 -[source,bash,subs="attributes"] +```bash +$ sudo dnf install -y ivorysql5-5.3 ``` -$ sudo dnf install -y ivorysql5-{ivorysql-version} ``` -.... - 正确安装后,数据库将被安装在/usr/ivory-5/路径下的IvorySQL-version(如:IvorySQL-{ivorysql-version})文件夹内 -.... + 正确安装后,数据库将被安装在/usr/ivory-5/路径下的IvorySQL-version(如:IvorySQL-5.3)文件夹内 +``` 执行以下命令为ivorysql用户赋权: ``` $ sudo chown -R ivorysql:ivorysql /usr/ivory-5 ``` -[[配置环境变量]] -** 配置环境变量 + + * **配置环境变量** -+ 将以下配置写入~/.bash_profile文件并使用source命令该文件使环境变量生效: ``` @@ -81,80 +66,74 @@ export PGDATA $ source ~/.bash_profile ``` -** 数据库初始化 + * **数据库初始化** ``` $ initdb -D /usr/ivory-5/data ``` -.... +``` 其中-D参数用来指定数据库的数据目录。更多参数使用方法,请使用initdb --help命令获取。 -.... +``` -** 启动数据库服务 + * **启动数据库服务** ``` -$ pg_ctl -D /usr/ivory-5/data -l ivory.log start +$ pg_ctl -D /usr/ivory-5/data -l ivory.log start ``` -其中-D参数用来指定数据库的数据目录,如果<<配置环境变量>> 配置了PGDATA,则该参数可以省略。-l参数用来指定日志文件。更多参数使用方法,请使用pg_ctl --help命令获取。 +其中-D参数用来指定数据库的数据目录,如果[配置环境变量](#配置环境变量) 配置了PGDATA,则该参数可以省略。-l参数用来指定日志文件。更多参数使用方法,请使用pg_ctl --help命令获取。 查看确认数据库启动成功: ``` $ ps -ef | grep postgres ivorysql 3214 1 0 20:35 ? 00:00:00 /usr/ivory-5/bin/postgres -D /usr/ivory-5/data -ivorysql 3215 3214 0 20:35 ? 00:00:00 postgres: checkpointer -ivorysql 3216 3214 0 20:35 ? 00:00:00 postgres: background writer -ivorysql 3218 3214 0 20:35 ? 00:00:00 postgres: walwriter -ivorysql 3219 3214 0 20:35 ? 00:00:00 postgres: autovacuum launcher -ivorysql 3220 3214 0 20:35 ? 00:00:00 postgres: logical replication launcher +ivorysql 3215 3214 0 20:35 ? 00:00:00 postgres: checkpointer +ivorysql 3216 3214 0 20:35 ? 00:00:00 postgres: background writer +ivorysql 3218 3214 0 20:35 ? 00:00:00 postgres: walwriter +ivorysql 3219 3214 0 20:35 ? 00:00:00 postgres: autovacuum launcher +ivorysql 3220 3214 0 20:35 ? 00:00:00 postgres: logical replication launcher ivorysql 3238 1551 0 20:35 pts/0 00:00:00 grep --color=auto postgres ``` -=== docker方式运行 - -** 从Docker Hub上获取IvorySQL镜像 +### docker方式运行 + * **从Docker Hub上获取IvorySQL镜像** -[source,bash,subs="attributes"] -``` -$ docker pull ivorysql/ivorysql:{ivorysql-version}-ubi8 +```bash +$ docker pull ivorysql/ivorysql:5.3-ubi8 ``` -** 运行IvorySQL + * **运行IvorySQL** -[source,bash,subs="attributes"] -``` -$ docker run --name ivorysql -p 5434:5432 -e IVORYSQL_PASSWORD=your_password -d ivorysql/ivorysql:{ivorysql-version}-ubi8 +```bash +$ docker run --name ivorysql -p 5434:5432 -e IVORYSQL_PASSWORD=your_password -d ivorysql/ivorysql:5.3-ubi8 ``` -** 查看IvorySQL容器运行是否成功 + * **查看IvorySQL容器运行是否成功** -[source,bash,subs="attributes"] -``` +```bash $ docker ps | grep ivorysql CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -6faa2d0ed705 ivorysql:{ivorysql-version}-ubi8 "docker-entrypoint.s…" 50 seconds ago Up 49 seconds 5866/tcp, 0.0.0.0:5434->5432/tcp ivorysql +6faa2d0ed705 ivorysql:5.3-ubi8 "docker-entrypoint.s…" 50 seconds ago Up 49 seconds 5866/tcp, 0.0.0.0:5434->5432/tcp ivorysql ``` -== 数据库连接 - +## 数据库连接 psql连接数据库: -[source,bash,subs="attributes"] -``` +```bash $ psql -d YOUR_DATABASE -psql ({pg-version}) +psql (18.3) Type "help" for help. ivorysql=# ``` -.... +``` 其中-d参数用来指定想要连接到的数据库名称。IvorySQL默认使用ivorysql数据库,但较低版本的IvorySQL首次使用时需用户先连接postgres数据库,然后自己创建ivorysql数据库。较高版本的IvorySQL则已为用户创建好ivorysql数据库,可以直接连接。 更多参数使用方法,请使用psql --help命令获取。 -.... +``` TIP: Docker运行IvorySQL时,需要添加额外参数,如 psql -d ivorysql -U ivorysql -h 127.0.0.1 -p 5434 现在可以开始使用IvorySQL啦!就是这么简单! -想要获得更多安装方式,请参考xref:4.1.adoc[安装指南] +想要获得更多安装方式,请参考[安装指南](4.1.md) \ No newline at end of file diff --git a/CN/modules/ROOT/pages/3.2.adoc b/CN/modules/ROOT/pages/3.2.adoc deleted file mode 100644 index 2ff69046..00000000 --- a/CN/modules/ROOT/pages/3.2.adoc +++ /dev/null @@ -1,1285 +0,0 @@ - -:sectnums: -:sectnumlevels: 5 - -= **日常监控** - -== 监控数据活动 - -=== 标准Unix工具 - -在大部分 Unix 平台上,IvorySQL会修改由`ps`报告的命令标题,这样个体服务器进程可以被标识。一个显示样例 - -``` -$ ps auxww | grep ^postgres -postgres 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 postgres -i -postgres 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 postgres: background writer -postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer -postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: walwriter -postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: autovacuum launcher -postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres: stats collector -postgres 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 postgres: joe runbug 127.0.0.1 idle -postgres 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 postgres: tgl regression [local] SELECT waiting -postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl regression [local] idle in transaction -``` - -(`ps`的调用方式随不同的平台而变,但是显示的细节都差不多。这个例子来自于一个最近的 Linux 系统)。列在这里的第一个进程是主服务器进程。为它显示的命令参数是当它被启动时使用的那些。接下来的五个进程是由主进程自动启动的后台工作者进程(如果你已经设置系统为不启动统计收集器,“统计收集器”进程将不会出现;同样“自动清理发动”进程也可以被禁用)。剩余的每一个进程都是一个处理一个客户端连接的服务器进程。每个这种进程都会把它的命令行显示设置为这种形式 - -``` -postgres: user database host activity -``` - -在该客户端连接的生命期中,用户、数据库以及(客户端)主机项保持不变,但是活动指示器会改变。活动可以是`闲置`(即等待一个客户端命令)、`在事务中闲置`(在一个`BEGIN`块里等待客户端)或者一个命令类型名,例如`SELECT`。还有,如果服务器进程正在等待一个其它会话持有的锁, `等待中`会被追加到上述信息中。在上面的例子中,我们可以推断:进程 15606 正在等待进程 15610 完成其事务并且因此释放一些锁(进程 15610 必定是阻塞者,因为没有其他活动会话。在更复杂的情况中,可能需要查看pg_locks系统视图来决定谁阻塞了谁)。 - -如果配置了cluster_name,则集簇的名字 也将会显示在`ps`的输出中: - -``` -$ psql -c 'SHOW cluster_name' - cluster_name --------------- - server1 -(1 row) - -$ ps aux|grep server1 -postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: server1: background writer -... -``` - -如果你已经关闭了update_process_title,那么活动指示器将不会被更新,进程标题仅在新进程被启动的时候设置一次。 在某些平台上这样做可以为每个命令节省可观的开销,但在其它平台上却不明显。 - -.提示 -**** -Solaris需要特别的处理。你必需使用`/usr/ucb/ps`而不是`/bin/ps`。 你还必需使用两个`w`标志,而不是一个。另外,你对`postgres`命令的最初调用必须用一个比服务器进程提供的短的`ps`状态显示。如果你没有满足全部三个要求,每个服务器进程的`ps`输出将是原始的`postgres`命令行。 -**** - -=== 统计收集器 - -IvorySQL的 _统计收集器_ 是一个支持收集和报告服务器活动信息的子系统。 目前,这个收集器可以对表和索引的访问计数,计数可以按磁盘块和个体行来进行。它还跟踪每个表中的总行数、每个表的清理和分析动作的信息。它也统计调用用户定义函数的次数以及在每次调用中花费的总时间。 - -IvorySQL也支持报告有关系统正在干什么的 动态信息,例如当前正在被其他服务器进程执行的命令以及系统中存在哪些其他连接。 这个功能是独立于收集器进程存在的。 - -==== 统计收集配置 - -因为统计收集给查询执行增加了一些负荷,系统可以被配置为收集或不收集信息。这由配置参数控制,它们通常在`postgresql.conf`中设置。 - -参数track_activities允许监控当前被任意服务器进程执行的命令。 - -参数track_counts控制是否收集关于表和索引访问的统计信息。 - -参数track_functions启用对用户定义函数使用的跟踪。 - -参数track_io_timing启用对块读写次数的监控。 - -通常这些参数被设置在`postgresql.conf`中,这样它们会应用于所有服务器进程,但是可以在单个会话中使用SET命令打开或关闭它们(为了阻止普通用户对管理员隐藏他们的活动,只有超级用户被允许使用`SET`来改变这些参数)。 - -统计收集器通过临时文件将收集到的信息传送给其他IvorySQL进程。这些文件被存储在名字由stats_temp_directory参数指定的目录中,默认是`pg_stat_tmp`。为了得到更好的性能,`stats_temp_directory`可以被指向一个基于 RAM 的文件系统来降低物理 I/O 需求。当服务器被干净地关闭时,一份统计数据的永久拷贝被存储在`pg_stat`子目录中,这样在服务器重启后统计信息能被保持。当在服务器启动时执行恢复时(例如立即关闭、服务器崩溃以及时间点恢复之后),所有统计计数器会被重置。 - -==== 查看统计信息 - -表 1 中列出了一些预定义视图 可以用来显示系统的当前状态。 表 2 中列出了另一些视图可以 显示统计收集的结果。你也可以使用底层统计函数来建立自定义的视图。 - -在使用统计信息监控收集到的数据时,你必须了解这些信息并非是实时更新的。每个独立的服务器进程只在进入闲置状态之前才向收集器传送新的统计计数;因此正在进行的查询或事务并不影响显示出来的总数。同样,收集器本身也最多每`PGSTAT_STAT_INTERVAL`毫秒(缺省为 500ms,除非在编译服务器的时候修改过)发送一 次新的报告。因此显示的信息总是落后于实际活动。但是由`track_activities`收集的当前查询信息总是最新的。 - -另一个重点是当一个服务器进程被要求显示任何这些统计信息时,它首先取得收集器进程最近发出的报告并且接着为所有统计视图和函数使用这个快照,直到它的当前事务的结尾。因此只要你继续当前事务,统计数据将会一直显示静态信息。相似地,当任何关于所有会话的当前查询的信息在一个事务中第一次被请求时,这样的信息将被收集。并且在整个事务期间将显示相同的信息。这是一种特性而非缺陷,因为它允许你在该统计信息上执行多个查询并且关联结果而不用担心那些数字会在你不知情的情况下改变。但是如果你希望用每个查询都看到新结果,要确保在任何事务块之外做那些查询。或者,你可以调用`pg_stat_clear_snapshot`(),那将丢弃当前事务的统计快照(如果有)。下一次对统计性信息的使用将导致获取一个新的快照。 - -一个事务也可以在视图`pg_stat_xact_all_tables`、`pg_stat_xact_sys_tables`、`pg_stat_xact_user_tables`和`pg_stat_xact_user_functions`中看到它自己的统计信息(还没有被传送给收集器)。这些数字并不像上面所述的那样行动,相反它们在事务期间持续被更新。 - -表 1中显示的动态统计视图中的一些信息是有安全限制的。 普通用户只能看到关于他们自己的会话的所有信息(属于他们是成员的角色的会话)。 在关于其他会话的行中,许多列将为空。 但是,请注意,一个会话的存在和它的一般属性,例如会话用户和数据库,对所有用户都是可见的。 超级用户和内置角色`pg_read_all_stats`的成员可以看到所有会话的所有信息。 - -**表1.动态统计视图** -|==== -| 视图名称 | 描述 -| `pg_stat_activity` | 每个服务器进程一行,显示与那个进程的当前活动相关的信息,例如状态和当前查询。 -| `pg_stat_replication` | 每一个 WAL 发送进程一行,显示有关到该发送进程连接的后备服务器的复制的统计信息。 -| `pg_stat_wal_receiver` | 只有一行,显示来自 WAL 接收器所连接服务器的有关该接收器的统计信息。 -| `pg_stat_subscription` | 每个订阅至少一行,显示有关该订阅的工作者的信息。 -| `pg_stat_ssl` | 每个连接(常规的或者复制)一行,显示在这个连接上使用的SSL的信息。 -| `pg_stat_gssapi` | 每个连接(常规和复制)有一行,显示关于GSSAPI验证和加密的信息。 -| `pg_stat_progress_analyze` | 每个运行`ANALYZE`的后端(包括自动清理工作者进程)的行,显示当前进度。 -| `pg_stat_progress_create_index` | 每个后台运行`CREATE INDEX`或`REINDEX`的后端都有一行,显示当前的进度。 -| `pg_stat_progress_vacuum` | 每个运行着`VACUUM`的后端(包括autovacuum工作者进程)一行,显示当前的进度。 -| `pg_stat_progress_cluster` | 每个运行着`CLUSTER`或`VACUUM FULL`的后端一行,显示当前进度。 -| `pg_stat_progress_basebackup` | 每一个WAL发送者进程的行显示一个基础备份,显示当前进度。 -|==== - -**表2.已收集统计信息的视图** -|==== -|视图名称 | 描述 -| `pg_stat_archiver` | 只有一行,显示有关 WAL 归档进程活动的统计信息。 -| `pg_stat_bgwriter` | 只有一行,显示有关后台写进程的活动的统计信息。 -| `pg_stat_database` | 每个数据库一行,显示数据库范围的统计信息。 -| `pg_stat_database_conflicts` | 每个数据库一行,显示数据库范围的统计信息, 这些信息的内容是关于由于与后备服务器的恢复过程 发生冲突而被取消的查询。 -| `pg_stat_all_tables` | 当前数据库中每个表一行,显示有关访问指定表的统计信息。 -| `pg_stat_sys_tables` | 和`pg_stat_all_tables`一样,但只显示系统表。 -| `pg_stat_user_tables` | 和`pg_stat_all_tables`一样,但只显示用户表。 -| `pg_stat_xact_all_tables` | 和`pg_stat_all_tables`相似,但计数动作只在当前事务内发生,用于生存和死亡行数量的列以及清理和分析动作在此视图中不出现。 -| `pg_stat_xact_sys_tables` | 和`pg_stat_xact_all_tables`一样,但只显示系统表。 -| `pg_stat_xact_user_tables` | 和`pg_stat_xact_all_tables`一样,但只显示用户表。 -| `pg_stat_all_indexes` | 当前数据库中的每个索引一行,显示:表OID、索引OID、模式名、表名、索引名、 使用了该索引的索引扫描总数、索引扫描返回的索引记录数、使用该索引的简 单索引扫描抓取的活表(livetable)中数据行数。 当前数据库中的每个索引一行,显示与访问指定索引有关的统计信息。 -| `pg_stat_sys_indexes` | 和`pg_stat_all_indexes`一样,但只显示系统表上的索引。 -| `pg_stat_user_indexes` | 和`pg_stat_all_indexes`一样,但只显示用户表上的索引。 -| `pg_statio_all_tables` | 当前数据库中每个表一行(包括TOAST表),显示:表OID、模式名、表名、 从该表中读取的磁盘块总数、缓冲区命中次数、该表上所有索引的磁盘块读取总数、 该表上所有索引的缓冲区命中总数、在该表的辅助TOAST表(如果存在)上的磁盘块读取总数、 在该表的辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表的索引的磁盘块读 取总数、TOAST表的索引的缓冲区命中总数。 当前数据库中的每个表一行,显示有关在指定表上 I/O 的统计信息。 -| `pg_statio_sys_tables` | 和`pg_statio_all_tables`一样,但只显示系统表。 -| `pg_statio_user_tables` | 和`pg_statio_all_tables`一样,但只显示用户表。 -| `pg_statio_all_indexes` | 当前数据库中每个索引一行,显示:表OID、索引OID、模式名、 表名、索引名、该索引的磁盘块读取总数、该索引的缓冲区命中总数。 当前数据库中的每个索引一行,显示与指定索引上的 I/O 有关的统计信息。 -| `pg_statio_sys_indexes` | 和`pg_statio_all_indexes`一样,但只显示系统表上的索引。 -| `pg_statio_user_indexes` | 和`pg_statio_all_indexes`一样,但只显示用户表上的索引。 -| `pg_statio_all_sequences` | 当前数据库中每个序列对象一行,显示:序列OID、模式名、序列名、序列的磁盘读取总数、序列的缓冲区命中总数。 当前数据库中的每个序列一行,显示与指定序列上的 I/O 有关的统计信息。 -| `pg_statio_sys_sequences` | 和`pg_statio_all_sequences`一样,但只显示系统序列(目前没有定义系统序列,因此这个视图总是为空)。 -| `pg_statio_user_sequences` | 和`pg_statio_all_sequences`一样,但只显示用户序列。 -| `pg_stat_user_functions` | 对于所有跟踪功能,函数的OID,模式,名称,数量 通话总时间,和自我的时间。自我时间是 在函数本身所花费的时间量,总时间包括 它调用函数所花费的时间。时间值以毫秒为单位。 每一个被跟踪的函数一行,显示与执行该函数有关的统计信息。 -| `pg_stat_xact_user_functions` | 和`pg_stat_user_functions`相似,但是只统计在当前事务期间的调用 -| `pg_stat_slru` | 每个SLRU一行, 显示操作的统计信息。 -|==== - -针对每个索引的统计信息对于判断哪个索引正被使用以及它们的效果特别有用。 - -`pg_statio_`系列视图主要用于判断缓冲区的效果。当实际磁盘读取数远小于缓冲区命中时,这个缓冲能满足大部分读请求而无需进行内核调用。但是,这些统计信息并没有给出所有的事情:由于IvorySQL处理磁盘 I/O 的方式,不在IvorySQL缓冲区中的数据库仍然驻留在内核的 I/O 缓存中,并且因此可以被再次读取而不需要物理磁盘读取。我们建议希望了解IvorySQL I/O 行为更多细节的用户将IvorySQL统计收集器和操作系统中允许观察内核处理 I/O 的工具一起使用。 - -=== `pg_stat_activity` - -`pg_stat_activity`视图每个服务器进程将有一行,显示与该进程当前活动相关的信息。 - -**表3.`pg_stat_activity` 视图** -|==== -|列|类型|描述 -| `datid` | `oid` | 这个后端连接到的数据库的OID -| `datname` | `name`| 这个后端连接到的数据库的名称 -| `pid` | `integer` | 这个后端的进程 ID -| `leader_pid` | `integer` | 并行组组长的进程ID,如果该进程是并行查询工作者。如果该进程是一个并行组的组长或不参与并行查询,则为`NULL`。 -| `usesysid` | `oid` | 登录到这个后端的用户的 OID -| `usename` | `name` | 登录到这个后端的用户的 名称 -| `application_name` | `text` | 连接到这个后端的应用的名称 -| `client_addr` | `inet` | 连接到这个后端的客户端的 IP 地址。如果这个字段为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。 -| `client_hostname` | `text` | 已连接的客户端的主机名,由 `client_addr` 的反向 DNS 查找报告。 这个字段将只对 IP 连接非空,并且只有log_hostname被启用时才会非空。 -| `client_port` | `integer` | 客户端用于与此后端通信的TCP端口号,如果使用Unix套接字,则为`-1`。如果该字段为空,它表示这是一个内部服务器进程。 -| `backend_start` | `timestamp with time zone` | 这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。 -| `xact_start` | `timestamp with time zone` | 这个进程的当前事务被启动的时间,如果没有活动事务则为空。 如果当前查询是它的第一个事务,这一列等于 `query_start` 列。 -| `query_start` | `timestamp with time zone` | 当前活动查询被开始的时间,如果 `state` 不是 `active`,则为上一个查询开始的时间 -| `state_change` | `timestamp with time zone` | `state` 上一次被改变的时间 -| `wait_event_type` | `text` | 后端等待的事件类型,如果有的话;否则NULL。 -| `wait_event` | `text` | 如果后端当前正在等待,则等待事件名称,否则为NULL。 -| `state` | `text` | 这个后端的当前总体状态。可能的值为:`active`: 后端正在执行一个查询。`idle`: 后端正在等待一个新的客户端命令。`idle in transaction`: 后端在一个事务中,但是当前没有正在执行一个查询。`idle in transaction (aborted)`: 这个状态与 `idle in transaction` 相似,除了在该事务中的一个语句导致了一个错误。`fastpath function call`: 后端正在执行一个 fast-path 函数。`disabled`: 如果在这个后端中track_activities被禁用,则报告这个状态。 -| `backend_xid` | `xid` | 这个后端的顶层事务标识符,如果存在。 -| `backend_xmin` | `xid` | 当前后端的 `xmin` 范围。 -| `query` | `text` | 这个后端最近查询的文本。如果 `state` 为 `active`,这个字段显示当前正在执行的查询。 在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至1024个字节,这个值可以通过参数track_activity_query_size更改。 -| `backend_type` | `text` | 当前后端的类型。可能的类型为 `autovacuum launcher`, `autovacuum worker`, `logical replication launcher`, `logical replication worker`, `parallel worker`, `background writer`, `client backend`, `checkpointer`, `startup`, `walreceiver`, `walsender` and `walwriter`. 除此以外,由扩展注册的后台Worker可能有额外的类型。 -|==== - -`wait_event`和`state`列是独立的。如果一个后端处于`active`状态,它可能是也可能不是某个事件上的`waiting`。如果状态是`active`并且`wait_event`为非空,它意味着一个查询正在被执行,但是它被阻塞在系统中某处。 - -**表4.等待事件类型** -|==== -| 等待事件类型 | 描述 -| `Activity` | 服务器进程空闲。此事件类型表示在其主处理循环中等待活动的进程。 `wait_event`将识别特定的等待点。 -| `BufferPin` | 服务器进程正在等待对数据缓冲的独占访问。 如果另一个进程持有一个打开的游标,该游标最后一次从相关缓冲区读取数据,则缓冲区销等待可能是漫长的。 -| `Client` | 服务器进程正在等待连接到用户应用程序的套接字上的活动。 因此,服务器预计发生一些独立于其内部进程的事情。`wait_event`将识别特定的等待点。 -| `Extension` | 服务器进程正在等待扩展模块定义的某个条件。 -| `IO` | 服务器进程正在等待一个I/O操作完成。`wait_event`将识别特定的等待点。 -| `IPC` | 服务器进程正在等待与另一个服务器进程进行交互。`wait_event`将识别特定的等待点。 -| `Lock` | 服务器进程正在等待一个重量级锁。重量级锁,也称为锁管理器锁或简单锁,主要保护表等SQL可见对象。 然而,它们也用于确保某些内部操作的互斥,例如关系扩展。`wait_event`将识别等待的锁的类型。 -| `LWLock` | 服务器进程正在等待一个轻量级锁。大多数这样的锁保护共享内存中的特定数据结构。 `wait_event`将包含标识轻量级锁用途的名称。 (有些锁有特定的名称;其他锁是一组锁的一部分,每个锁具有类似的目的。) -| `Timeout` | 服务器进程正在等待超时过期。`wait_event`将识别特定的等待点。 -|==== - -**表5.`Activity`类型的等待事件** -|==== -| `Activity` 等待事件 | 描述 -| `ArchiverMain` | 在归档进程的主循环中等待。 -| `AutoVacuumMain` | 在自动清理启动过程的主循环中等待。 -| `BgWriterHibernate` | 在后台写进程中等待,休眠状态。 -| `BgWriterMain` | 在后台写进程主循环中等待。 -| `CheckpointerMain` | 在校验指针进程的主循环中等待。 -| `LogicalApplyMain` | 在逻辑复制应用进程的主循环中等待。 -| `LogicalLauncherMain` | 在逻辑复制启动器进程的主循环中等待。 -| `PgStatMain` | 在统计收集器进程的主循环中等待。 -| `RecoveryWalStream` | 流恢复期间,在启动进程主循环等待WAL到达。 -| `SysLoggerMain` | 在syslogger进程的主循环中等待。 -| `WalReceiverMain` | 在WAL接收器进程的主循环中等待。 -| `WalSenderMain` | 在WAL发送者进程的主循环中等待。 -| `WalWriterMain` | 在WAL写入进程的主循环中等待。 -|==== - -**表6.`BufferPin`类型的等待事件** -|==== -| `BufferPin` 等待事件 | 描述 -| `BufferPin` | 等待获得缓冲区上的独占销。 -|==== - -**表7.`Client`类型的等待事件** -|==== -| `Client` 等待事件 | 描述 -| `ClientRead` | 等待从客户端读取数据。 -| `ClientWrite` | 等待写入数据到客户端。 -| `GSSOpenServer` | 在建立GSSAPI会话时等待从客户端读取数据。 -| `LibPQWalReceiverConnect` | 在WAL接收器等待与远程服务器建立连接。 -| `LibPQWalReceiverReceive` | 在WAL接收器中等待从远程服务器接收数据。 -| `SSLOpenServer` | 在尝试连接时等待SSL。 -| `WalReceiverWaitStart` | 等待启动进程发送用于流复制的初始数据。 -| `WalSenderWaitForWAL` | 在WAL发送器进程中等待WAL被刷新。 -| `WalSenderWriteData` | 在WAL发送器进程中处理WAL接收器的回复时,等待任何活动。 -|==== - -**表8.`Extension`类型的等待事件** -|==== -| `Extension` 等待事件 | 描述 -| `Extension` | 在扩展中等待。 -|==== - -**表9.`IO`类型的等待事件** -|==== -| `IO` 等待事件 | 描述 -| `BufFileRead` | 等待从缓冲文件中读取。 -| `BufFileWrite` | 等待对缓冲文件的写入。 -| `ControlFileRead` | 等待读取`pg_control`文件。 -| `ControlFileSync` | 等待`pg_control`文件到达持久存储。 -| `ControlFileSyncUpdate` | 等待更新`pg_control`文件以达到持久存储。 -| `ControlFileWrite` | 等待写入`pg_control`文件。 -| `ControlFileWriteUpdate` | 等待写入更新`pg_control`文件。 -| `CopyFileRead` | 在文件复制操作期间等待读取。 -| `CopyFileWrite` | 在文件拷贝操作期间等待写入。 -| `DSMFillZeroWrite` | 等待用零填充动态共享内存备份(backing)文件。 -| `DataFileExtend` | 等待关系数据文件被扩展。 -| `DataFileFlush` | 等待关系数据文件达到持久存储。 -| `DataFileImmediateSync` | 等待关系数据文件到持久存储的立即同步。 -| `DataFilePrefetch` | 等待关系数据文件的异步预取。 -| `DataFileRead` | 等待对关系数据文件的读取。 -| `DataFileSync` | 等待对关系数据文件的更改达到持久存储。 -| `DataFileTruncate` | 等待关系数据文件被截断。 -| `DataFileWrite` | 等待对关系数据文件的写入。 -| `LockFileAddToDataDirRead` | 在向数据目录锁文件中添加一行时等待读取。 -| `LockFileAddToDataDirSync` | 等待数据到达持久存储,同时向数据目录锁文件添加一行。 -| `LockFileAddToDataDirWrite` | 在向数据目录锁文件中添加一行时等待写操作。 -| `LockFileCreateRead` | 创建数据目录锁文件时等待读取。 -| `LockFileCreateSync` | 在创建数据目录锁文件时等待数据到达持久存储。 -| `LockFileCreateWrite` | 在创建数据目录锁文件时等待写操作。 -| `LockFileReCheckDataDirRead` | 在重新检查数据目录锁文件期间等待读取。 -| `LogicalRewriteCheckpointSync` | 等待逻辑重写映射到在检查点到达持久存储。 -| `LogicalRewriteMappingSync` | 在逻辑重写期间等待映射数据到达持久存储 -| `LogicalRewriteMappingWrite` | 在逻辑重写期间等待映射数据的写入。 -| `LogicalRewriteSync` | 等待逻辑重写映射到达持久存储。 -| `LogicalRewriteTruncate` | 等待在逻辑重写期间截断映射数据。 -| `LogicalRewriteWrite` | 等待逻辑重写映射的写入。 -| `RelationMapRead` | 等待关系映射文件的读取。 -| `RelationMapSync` | 等待关系映射文件到达持久存储。 -| `RelationMapWrite` | 等待对关系映射文件的写入。 -| `ReorderBufferRead` | 在重新排序缓冲区管理期间等待读取。 -| `ReorderBufferWrite` | 在重新排序缓冲区管理期间等待写操作。 -| `ReorderLogicalMappingRead` | 在重新排序缓冲区管理期间等待读取逻辑映射。 -| `ReplicationSlotRead` | 等待从复制槽位控制文件读取。 -| `ReplicationSlotRestoreSync` | 等待复制槽控制文件到达持久存储,同时将其恢复到内存中。 -| `ReplicationSlotSync` | 等待复制槽控制文件到达持久存储。 -| `ReplicationSlotWrite` | 等待对复制槽控制文件的写入。 -| `SLRUFlushSync` | 在检查点或数据库关闭期间等待SLRU数据到达持久存储。 -| `SLRURead` | 等待读取SLRU页面。 -| `SLRUSync` | 在写页面后等待SLRU数据到达持久存储。 -| `SLRUWrite` | 等待SLRU页面的写入。 -| `SnapbuildRead` | 等待读取序列化的历史目录快照。 -| `SnapbuildSync` | 等待序列化历史目录快照到达持久存储。 -| `SnapbuildWrite` | 等待串行历史目录快照的写入。 -| `TimelineHistoryFileSync` | 等待通过流复制接收的时间线历史文件到达持久存储。 -| `TimelineHistoryFileWrite` | 等待通过流复制接收的时间线历史文件的写入。 -| `TimelineHistoryRead` | 等待读取时间线历史文件。 -| `TimelineHistorySync` | 等待新创建的时间线历史文件到达持久存储。 -| `TimelineHistoryWrite` | 等待写入新创建的时间线历史文件。 -| `TwophaseFileRead` | 等待读取两阶段状态文件。 -| `TwophaseFileSync` | 等待两阶段状态文件到达持久存储。 -| `TwophaseFileWrite` | 等待对两阶段状态文件的写入。 -| `WALBootstrapSync` | 在引导过程中等待WAL达到持久存储。 -| `WALBootstrapWrite` | 在引导过程中等待WAL页面的写入。 -| `WALCopyRead` | 通过复制一个已有WAL段来创建一个新的WAL段时等待读取。 -| `WALCopySync` | 等待通过复制一个已有WAL段到持久存储来创建一个新的WAL段。 -| `WALCopyWrite` | 通过复制一个已有WAL段来创建一个新的WAL段时等待写入。 -| `WALInitSync` | 等待一个新初始化的WAL文件到持久存储。 -| `WALInitWrite` | 在初始化一个新的WAL文件时等待写入。 -| `WALRead` | 等待WAL文件的读取。 -| `WALSenderTimelineHistoryRead` | 在walsender时间线命令期间等待从时间线历史文件读取。 -| `WALSync` | 等待WAL文件到达持久存储。 -| `WALSyncMethodAssign` | 等待数据到达持久存储,同时分配一个新的WAL同步方法。 -| `WALWrite` | 等待写入WAL文件。 -|==== - -**表10.`IPC`类型的等待事件** -|==== -| `IPC` 等待事件 | 描述 -| `BackupWaitWalArchive` | 等待备份所需的WAL文件成功存档。 -| `BgWorkerShutdown` | 等待后台工作者关闭。 -| `BgWorkerStartup` | 等待后台工作者启动。 -| `BtreePage` | 正等待继续并行B-树扫描所需的页号变得可用。 -| `CheckpointDone` | 等待检查点完成。 -| `CheckpointStart` | 等待检查点开始。 -| `ExecuteGather` | 在执行`Gather` 计划节点时,等待子进程的活动。 -| `HashBatchAllocate` | 等待一个选定的并行哈希参与者分配哈希表。 -| `HashBatchElect` | 等待选择一个并行哈希参与者来分配哈希表。 -| `HashBatchLoad` | 等待其他并行哈希参与者完成哈希表的加载。 -| `HashBuildAllocate` | 等待一个选定的并行哈希参与者分配初始哈希表。 -| `HashBuildElect` | 等待选择一个并行哈希参与者来分配初始哈希表。 -| `HashBuildHashInner` | 等待其他并行哈希参与者完成内部关系的散列。 -| `HashBuildHashOuter` | 等待其他Parallel 哈希参与者完成对外部关系的分区。 -| `HashGrowBatchesAllocate` | 等待选定的并行哈希参与者分配更多批处理。 -| `HashGrowBatchesDecide` | 等待选择一个并行哈希参与者来决定未来的批处理增长。 -| `HashGrowBatchesElect` | 等待选择一个Parallel 哈希参与者来分配更多批处理。 -| `HashGrowBatchesFinish` | 等待一个选定的并行哈希参与者决定未来的批量增长。 -| `HashGrowBatchesRepartition` | 等待一个选定的并行哈希参与者决定未来的批处理增长。 -| `HashGrowBucketsAllocate` | 等待选定的并行哈希参与者完成更多bucket的分配。 -| `HashGrowBucketsElect` | 等待选择一个并行哈希参与者来分配更多的buckets。 -| `HashGrowBucketsReinsert` | 等待其他Parallel 哈希参与者完成将元组插入到新buckets中。 -| `LogicalSyncData` | 等待逻辑复制远程服务器发送用于初始表同步的数据。 -| `LogicalSyncStateChange` | 等待逻辑复制远程服务器更改状态。 -| `MessageQueueInternal` | 等待另一个进程附加到共享消息队列。 -| `MessageQueuePutMessage` | 等待将协议消息写入共享消息队列。 -| `MessageQueueReceive` | 等待从共享消息队列接收字节。 -| `MessageQueueSend` | 等待将字节发送到共享消息队列。 -| `ParallelBitmapScan` | 等待并行位图扫描被初始化。 -| `ParallelCreateIndexScan` | 等待并行`CREATE INDEX` 工作者完成堆扫描。 -| `ParallelFinish` | 等待并行工作人员完成计算。 -| `ProcArrayGroupUpdate` | 等待组领导在并行操作结束时清除事务ID。 -| `ProcSignalBarrier` | 等待屏障事件被所有后端处理。 -| `Promote` | 等待备用系统提升。 -| `RecoveryConflictSnapshot` | 等待vacuum清理的恢复冲突解决。 -| `RecoveryConflictTablespace` | 等待恢复冲突解决删除表空间。 -| `RecoveryPause` | 等待恢复继续进行。 -| `ReplicationOriginDrop` | 等待复制源变为非活动状态,以便可以删除它。 -| `ReplicationSlotDrop` | 等待复制槽变为非活动状态,以便可以删除它。 -| `SafeSnapshot` | 等待获取`READ ONLY DEFERRABLE`事务的有效快照。 -| `SyncRep` | 在同步复制期间等待远程服务器的确认。 -| `XactGroupUpdate` | 等待分组组长在并行操作结束时更新事务状态。 -|==== - -**表11.`Lock`类型的等待事件** -|==== -| `Lock` 等待事件 | 描述 -| `advisory` | 等待获得一个建议用户锁。 -| `extend` | 等待扩展一个关系。 -| `frozenid` | 等待升级 `pg_database`.`datfrozenxid` 和 `pg_database`.`datminmxid`. -| `object` | 等待获取非关系数据库对象上的锁。 -| `page` | 等待获取一个关系页面上的锁。 -| `relation` | 等待获得一个关系的锁。 -| `spectoken` | 等待获取推测的插入锁。 -| `transactionid` | 等待事务完成。 -| `tuple` | 等待获取元组上的锁。 -| `userlock` | 等待获取用户锁。 -| `virtualxid` | 等待获取虚拟事务ID锁。 -|==== - -**表12.`LWLock`类型的等待事件** -|==== -| `LWLock` 等待事件 | 描述 -| `AddinShmemInit` | 等待管理共享内存中的扩展空间分配。 -| `AutoFile` | 等待更新`postgresql.auto.conf`文件。 -| `Autovacuum` | 等待读取或更新自动清理工作者的当前状态。 -| `AutovacuumSchedule` | 等待确保选择为自动清理的表仍然需要清理。 -| `BackgroundWorker` | 等待读取或更新后台工作者状态。 -| `BtreeVacuum` | 等待读取或更新b-树索引的清理相关信息。 -| `BufferContent` | 等待访问内存中的数据页。 -| `BufferIO` | 等待数据页上的I/O。 -| `BufferMapping` | 等待将数据块与缓冲池中的缓冲区关联。 -| `Checkpoint` | 等待开始一个检查点。 -| `CheckpointerComm` | 等待管理fsync请求。 -| `CommitTs` | 等待读取或更新事务提交时间戳的最后一个值集。 -| `CommitTsBuffer` | 在提交时间戳SLRU缓冲区上等待I/O。 -| `CommitTsSLRU` | 等待访问提交时间戳SLRU缓存。 -| `ControlFile` | 等待读取或更新`pg_control`文件或创建一个新的WAL文件。 -| `DynamicSharedMemoryControl` | 等待读取或更新动态共享内存分配信息。 -| `LockFastPath` | 等待读取或更新进程的快速路径锁信息。 -| `LockManager` | 等待读取或更新关于“heavyweight”锁。 -| `LogicalRepWorker` | 等待读取或更新逻辑复制工作器的状态。 -| `MultiXactGen` | 等待读取或更新共享的multixact状态。 -| `MultiXactMemberBuffer` | 在multixact成员SLRU缓冲区上等待I/O。 -| `MultiXactMemberSLRU` | 等待访问multixact成员SLRU缓存。 -| `MultiXactOffsetBuffer` | 在multixact 偏移 SLRU缓冲区上等待I/O。 -| `MultiXactOffsetSLRU` | 等待访问multixact 偏移 SLRU缓存。 -| `MultiXactTruncation` | 等待读取或截断multixact信息。 -| `NotifyBuffer` | 在`NOTIFY` 消息 SLRU缓冲区上等待I/O。 -| `NotifyQueue` | 等待读取或更新`NOTIFY` 消息。 -| `NotifyQueueTail` | 等待`NOTIFY`消息存储上的更新限制。 -| `NotifySLRU` | 等待访问`NOTIFY`消息SLRU缓存。 -| `OidGen` | 等待分配一个新的OID。 -| `OldSnapshotTimeMap` | 等待读取或更新旧的快照控制信息。 -| `ParallelAppend` | 在并行附加计划执行期间等待选择下一个子计划。 -| `ParallelHashJoin` | 在并行哈希连接计划执行期间等待同步工作器。 -| `ParallelQueryDSA` | 等待并行查询动态共享内存分配。 -| `PerSessionDSA` | 等待并行查询动态共享内存分配。 -| `PerSessionRecordType` | 等待访问有关复合类型的并行查询信息。 -| `PerSessionRecordTypmod` | 等待访问有关标识匿名记录类型的类型修饰符的并行查询信息。 -| `PerXactPredicateList` | 在并行查询期间等待访问当前可序列化事务持有的谓词锁列表。 -| `PredicateLockManager` | 等待访问可序列化事务使用的谓词锁信息。 -| `ProcArray` | 等待访问每个进程共享的数据结构(通常情况,是获取快照或报告会话的事务ID)。 -| `RelationMapping` | 等待读取或更新`pg_filenode.map`文件(用于跟踪某些系统目录的文件节点分配)。 -| `RelCacheInit`| 等待读取或更新`pg_internal.init`关系缓存初始化文件。 -| `ReplicationOrigin` | 等待创建、删除或使用复制源。 -| `ReplicationOriginState` | 等待读取或更新一个复制源的进度。 -| `ReplicationSlotAllocation` | 等待分配或释放复制槽。 -| `ReplicationSlotControl` | 等待读取或更新复制槽状态。 -| `ReplicationSlotIO` | 在复制槽位上等待I/O。 -| `SerialBuffer` | 在可串行事务冲突的SLRU缓冲区上等待I/O。 -| `SerializableFinishedList` | 等待访问已完成的可序列化事务列表。 -| `SerializablePredicateList` | 等待访问可序列化事务持有的谓词锁列表。 -| `SerializableXactHash` | 等待读取或更新关于可序列化事务的信息。 -| `SerialSLRU` | 等待访问可序列化事务冲突SLRU缓存。 -| `SharedTidBitmap`| 在并行位图索引扫描期间等待访问共享的TID位图。 -| `SharedTupleStore` | 在并行查询期间等待访问共享元组存储。 -| `ShmemIndex` | 等待在共享内存中找到或分配空间。 -| `SInvalRead` | 等待从共享目录失效队列中检索消息。 -| `SInvalWrite` | 等待向共享编目失效队列添加消息。 -| `SubtransBuffer`| 在子事务SLRU缓冲区上等待I/O。 -| `SubtransSLRU` | 等待访问子事务SLRU缓存。 -| `SyncRep` | 等待读取或更新有关同步复制状态的信息。 -| `SyncScan` | 等待选择同步表扫描的起始位置。 -| `TablespaceCreate` | 等待创建或删除表空间。 -| `TwoPhaseState` | 等待读取或更新已准备事务的状态。 -| `WALBufMapping` | 等待在WAL缓冲区中替换一个页面。 -| `WALInsert` | 等待将WAL数据插入内存缓冲区。 -| `WALWrite` | 等待WAL缓冲区写入磁盘。 -| `WrapLimitsVacuum` | 等待更新事务id和multixact消费的限制。 -| `XactBuffer` | 在事务状态的SLRU缓冲区上等待I/O。 -| `XactSLRU` | 等待访问事务状态的SLRU缓存。 -| `XactTruncation` | 等待执行`pg_xact_status`或更新它可用的最早的事务ID。 -| `XidGen` | 等待分配新的事务ID。 -|==== - -**表13.`Timeout`类型的等待事件** -|==== -| `Timeout` 等待事件 | 描述 -| `BaseBackupThrottle` | 当有限流活动时在基础备份期间等待。 -| `PgSleep` | 由于调用`pg_sleep`或同类函数而等待。 -| `RecoveryApplyDelay` | 由于延迟设置,在恢复期间等待应用WAL。 -| `RecoveryRetrieveRetryInterval` | 当WAL数据无法从任何来源(`pg_wal`,存档或流)获得时,在恢复期间等待。 -| `VacuumDelay` | 在一个基于代价的清理延迟点。 -|==== - -下面的例子展示了如何查看等待事件: - -``` -SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL; - pid | wait_event_type | wait_event -------+-----------------+------------ - 2540 | Lock | relation - 6644 | LWLock | ProcArray -(2 rows) -``` - -==== `pg_stat_replication` - -`pg_stat_replication`视图将在每个WAL发送方进程中包含一行,显示关于复制到发送方连接的后备服务器的统计信息。 只有直接连接的备用设备被列出;没有关于下游后备服务器的信息。 - -**表14.`pg_stat_replication` 视图** -|==== -| 列 | 类型 | 描述 -| `pid` | `integer` | 一个 WAL 发送进程的进程 ID -| `usesysid` | `oid` | 登录到这个 WAL 发送进程的用户的 OID -| `usename` | `name` | 登录到这个 WAL 发送进程的用户的名称 -| `application_name` | `text` | 连接到这个 WAL 发送进程的应用的名称 -| `client_addr` | `inet` | 连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个Unix 套接字连接。 -| `client_hostname` | `text` | 连接上的客户端的主机名,由一次对`client_addr`的逆向 DNS 查找报告。 这个域将只对 IP 连接非空,并且只有在 log_hostname被启用时非空。 -| `client_port` | `integer` | 客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为`-1` -| `backend_start` | `timestamp with time zone` | 这个进程开始的时间,即客户端是何时连接到这个WAL 发送进程的。 -| `backend_xmin` | `xid` | 由hot_standby_feedback报告的这个后备机的`xmin`水平线。 -| `state` | `text` | 当前的 WAL 发送进程状态。 可能的值是:`startup`: 这个WAL发送器正在启动。`catchup`: 这个WAL发送者连接的后备服务器正在赶上主服务器。`streaming`: 在其连接的后备服务器赶上主服务器之后,这个WAL发送方正在流化变化。`backup`: 这个WAL发送器正在发送一个备份。`stopping`: 这个WAL发送器正在停止。 -| `sent_lsn` | `pg_lsn` | 在这个连接上发送的最后一个预写式日志的位置 -| `write_lsn` | `pg_lsn` | 被这个后备服务器写入到磁盘的最后一个预写式日志的位置 -| `flush_lsn` | `pg_lsn` | 被这个后备服务器刷入到磁盘的最后一个预写式日志的位置 -| `replay_lsn` | `pg_lsn` | 被重放到这个后备服务器上的数据库中的最后一个预写式日志的位置 -| `write_lag` | `interval` | 从本地刷新近期的WAL与接收到此后备服务器已写入WAL的通知(但尚未刷新或应用它)之间的时间经过。 如果将此服务器配置为同步后备服务器,则可以使用此参数来衡量在提交时`synchronous_commit`级别`remote_write`所导致的延迟。 -| `flush_lag` | `interval` | 在本地刷写近期的WAL与接收到后备服务器已经写入并且刷写它(但还没有应用)的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时`synchronous_commit`的级别`on`所导致的延迟。 -| `replay_lag` | `interval` | 在本地刷写近期的WAL与接收到后备服务器已经写入它、刷写它并且应用它的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时`synchronous_commit`的级别`remote_apply`所导致的延迟。 -| `sync_priority` | `integer` | 在基于优先的同步复制中,这台后备服务器被选为同步后备的优先级。在基于规定数量的同步复制中,这个值没有效果。 -| `sync_state` | `text` | 这一台后备服务器的同步状态。 可能的值是:`async`: 这台后备服务器是异步的。`potential`: 这台后备服务器现在是异步的,但可能在当前的同步后备失效时变成同步的。`sync`: 这台后备服务器是同步的。`quorum`: 这台后备服务器被当做规定数量后备服务器的候选。 -| `reply_time` | `带时区的时间戳` | 从后备服务器收到的最后一条回复信息的发送时间 -|==== - - -`pg_stat_replication`视图中报告的滞后时间近期的WAL被写入、刷写并且重放以及发送器知道这一切所花的时间的度量。如果远程服务器被配置为一台同步后备,这些时间表示由每一种同步提交级别所带来(或者是可能带来)的提交延迟。对于一台异步后备,`replay_lag`列是最近的事务变得对查询可见的延迟时间的近似值。如果后备服务器已经完全追上了发送服务器并且没有WAL活动,在短时间内将继续显示最近测到的滞后时间,再然后就会显示为NULL。 - -对于物理复制会自动测量滞后时间。逻辑解码插件可能会选择性地发出跟踪消息,如果它们没有这样做,跟踪机制将把滞后显示为NULL。 - -.注意 -**** -报告的滞后时间并非按照当前的重放速率该后备还有多久才能追上发送服务器的预测。在新的WAL被生成期间,这样一种系统将显示类似的时间,但是当发送器变为闲置时会显示不同的值。特别是当后备服务器完全追上时,`pg_stat_replication`显示的是写入、刷写及重放最近报告的WAL位置所花的时间而不是一些用户可能预期的零。这种做法与为近期的写事务测量同步提交和事务可见性延迟的目的一致。为了降低用户预期一种不同的滞后模型带来的混淆,在一个完全重放完的闲置系统上,lag列会在一段比较短的时间后回复成NULL。监控系统应该选择将这种情况表示为缺失数据、零或者继续显示最近的已知值。 -**** - -==== `pg_stat_wal_receiver` - -`pg_stat_wal_receiver`事务只包含一行,它显示了从 WAL 接收器所连接的服务器得到的有关该接收器的统计信息。 - -**表15.`pg_stat_wal_receiver` 视图** -|==== -|列|类型|描述 -|pid|integer|WAL接收器进程的进程ID -|status|text|WAL接收进程的活动状态 -|receive_start_lsn|pg_lsn|WAL接收器启动时使用的第一个写前日志位置 -|receive_start_tli|integer|WAL接收器启动时使用的第一个时间线数字 -|written_lsn|pg_lsn|已经接收并写入磁盘的最后一个预写式日志位置,但没有刷入。这不能用于数据完整性检查。 -|flushed_lsn|pg_lsn|已经接收并刷入到磁盘的最后一个预写式日志位置,该字段的初始值是启动WAL接收器时使用的第一个日志位置 -|received_tli|integer|接收并刷入到磁盘的最后一个预写式日志位置的时间线数字,该字段的初始值为启动WAL接收器时使用的第一个日志位置的时间线数字 -|last_msg_send_time|timestamp with time zone|从源头WAL发送器收到的最后一条信息的发送时间 -|last_msg_receipt_time|timestamp with time zone|从源头WAL发送器收到的最后一条信息的接收时间 -|latest_end_lsn|pg_lsn|向源头WAL发送器报告的最后的预写式日志位置 -|latest_end_time|timestamp with time zone|向源头WAL发送方报告的最后一次写前日志位置的时间 -|slot_name|text|这个WAL接收器使用的复制槽的名称 -|sender_host|text|这个WAL接收器连接到的IvorySQL实例的主机。这可以是主机名、IP地址,或者目录路径,如果连接是通过Unix套接字进行的。(路径的情况可以区分,因为它总是以/开头的绝对路径。) -|sender_port|integer|这个WAL接收器连接的IvorySQL实例的端口号。 -|conninfo|text|这个WAL接收器使用的连接字符串,对安全敏感的字段进行了模糊处理。 -|==== - -==== `pg_stat_subscription` - -每一个订阅的主工作者都在`pg_stat_subscription`视图中有一行(如果工作者没有运行则PID为空),处理被订阅表的初始数据拷贝操作的工作者还会有额外的行。 - -**表16.`pg_stat_subscription` 视图** -|==== -|列|类型|描述 -|subid|oid|订阅的OID -|subname|name|订阅的名称 -|pid|integer|订阅工作者进程的进程ID -|relid|oid|工作器正在同步的关系的OID;Null用于主应用工作器 -|received_lsn|pg_lsn|接收到的最后一个预写式日志位置,该字段的初始值为0 -|last_msg_send_time|timestamp with time zone|从WAL发送器收到的最后一条信息的发送时间 -|last_msg_receipt_time|timestamp with time zone|从WAL发送器收到的最后一条信息的接收时间 -|latest_end_lsn|pg_lsn|向WAL发送器报告的最后预写式日志位置 -|latest_end_time|timestamp with time zone|向WAL发送器报告的最后一次预写式日志位置的时间 -|==== - -==== `pg_stat_ssl` - -`pg_stat_ssl`视图将为每一个后端或者 WAL 发送进程包含一行,用来显示这个连接上的 SSL 使用情况。 可以把它与`pg_stat_activity`或者`pg_stat_replication`通过`pid`列连接来得到更多有关该连接的细节。 - -**表17.`pg_stat_ssl` 视图** -|==== -|列|类型|描述 -|pid|integer|后端或WAL发送器进程ID -|ssl|boolean|如果在此连接上使用SSL,则为真 -|version|text|使用SSL的版本,如果此连接上没有使用SSL则为NULL -|cipher|text|正在使用的SSL密码的名称,如果此连接上没有使用SSL则为NULL -|bits|integer|使用的加密算法中的位数,如果此连接上没有使用SSL则为NULL -|compression|boolean|如果使用SSL压缩则为真,否则为假,如果此连接未使用SSL则为NULL -|client_dn|text|区别名称(DN,Distinguished Name)字段与使用的客户端证书,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 如果DN字段长于NAMEDATALEN(标准构建中为64个字符),则该字段将被截断。 -|client_serial|numeric|客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。 -|issuer_dn|text|客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。该字段像client_dn一样被截断。 -|==== - -==== `pg_stat_gssapi` - -`pg_stat_gssapi`视图将包含每一个后端一个行,显示该连接上的GSSAPI使用情况。 它可以加入到`pg_stat_activity`或`pg_stat_replication`上的`pid`列,获取更多关于连接的详细信息。 - -**表18.`pg_stat_gssapi` 视图** -|==== -|列|类型|描述 -|`pid`|`integer`|后端进程ID -|`gss_authenticated`|`boolean`|如果此连接使用了GSSAPI身份验证,则为True -|`principal`|`text`|用于验证此连接的主体,如果未使用GSSAPI对此连接进行身份验证,则为NULL。 如果主体长度超过`NAMEDATALEN`(标准构建中为64个字符),则该字段被截断。 -|`encrypted`|`boolean`|如果在此连接上使用了GSSAPI加密,则为真 -|==== - -==== `pg_stat_archiver` - -`pg_stat_archiver`视图总是有一行,其中包含关于集群的存档进程的数据。 - -**表19.`pg_stat_archiver` 视图** -|==== -|列|类型|描述 -|`archived_count`|`bigint`|已成功存档的WAL文件数 -|`last_archived_wal`|`text`|最后一个成功存档的WAL文件的名称 -|`last_archived_time`|`timestamp with time zone`|最后一次成功存档操作的时间 -|`failed_count`|`bigint`|记录WAL文件归档失败次数 -|`last_failed_wal`|`text`|最后一次失败的存档操作的WAL文件的名称 -|`last_failed_time`|`timestamp with time zone`|上次存档操作失败的时间 -|`stats_reset`|`timestamp with time zone`|这些统计数据最后一次重置的时间 -|==== - -==== `pg_stat_bgwriter` - -`pg_stat_bgwriter`视图始终只有一行,其中包含集群的全局数据。 - -**表20.`pg_stat_bgwriter` 视图** -|==== -| 列 | 类型 | 描述 -| `checkpoints_timed` | `bigint` | 已执行的预定检查点数 -| `checkpoints_req` | `bigint` | 请求已执行的检查点数 -| `checkpoint_write_time` | `double precision` | 检查点处理中将文件写入磁盘的部分所花费的总时间,以毫秒为单位 -| `checkpoint_sync_time` | `double precision` | 检查点处理中将文件同步到磁盘的部分所花费的总时间,以毫秒为单位 -| `buffers_checkpoint` | `bigint` | 检查点期间写入的缓冲区数 -| `buffers_clean` | `bigint` | 后台写入器写入的缓冲区数 -| `maxwritten_clean` | `bigint` | 后台写入器因为写入太多缓冲区而停止清理扫描的次数 -| `buffers_backend` | `bigint` | 后端直接写入的缓冲区数 -| `buffers_backend_fsync` | `bigint` | 后端必须执行自己的 `fsync` 调用的次数(通常后台写入器处理这些,即使后端执行自己的写入) -| `buffers_alloc` | `bigint` | 分配的缓冲区数 -| `stats_reset` | `timestamp with time zone` | 这些统计数据最后一次重置的时间 -|==== - -==== `pg_stat_database` - -`pg_stat_database`视图将包含一行用于集群中的每个数据库,加一行用于共享对象,显示数据库范围的统计信息。 - -**表21. `pg_stat_database` 视图** -|==== -| 列 | 类型 | 描述 -| `datid` | `oid` | 该数据库的 OID,属于共享关系的对象为 0 -| `datname` | `name` | 这个数据库的名称,或者共享对象为 `NULL` -| `numbackends` | `integer` | 当前连接到此数据库的后端数,对于共享对象则为 `NULL`。这是该视图中唯一返回反映当前状态的值的列;所有其他列返回自上次重置以来累积的值 -| `xact_commit` | `bigint` | 此数据库中已提交的事务数 -| `xact_rollback` | `bigint` | 该数据库中已回滚的事务数 -| `blks_read` | `bigint` | 在该数据库中读取的磁盘块数 -| `blks_hit` | `bigint` | 在缓存中发现磁盘块的次数,因此读取不是必需的(这只包括在 IvorySQL 缓存中,而不是在操作系统的文件系统缓存中) -| `tup_returned` | `bigint` | 这个数据库中查询返回的行数 -| `tup_fetched` | `bigint` | 这个数据库中查询获取的行数 -| `tup_inserted` | `bigint` | 查询在该数据库中插入的行数 -| `tup_updated` | `bigint` | 这个数据库中查询更新的行数 -| `tup_deleted` | `bigint` | 这个数据库中被查询删除的行数 -| `conflicts` | `bigint` | 由于与此数据库中的恢复冲突而取消的查询数(冲突只发生在后备服务器上) -| `temp_files` | `bigint` | 这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或散列),也不考虑 log_temp_files 设置 -| `temp_bytes` | `bigint` | 这个数据库中的查询写入临时文件的数据总量。所有临时文件都将被计数,而不考虑临时文件为什么被创建,也不考虑 log_temp_files 设置 -| `deadlocks` | `bigint` | 在此数据库中检测到的死锁数 -| `checksum_failures` | `bigint` | 在此数据库(或共享对象)中检测到的数据页校验码失败数,如果没有启用数据校验码则为 NULL -| `checksum_last_failure` | `timestamp with time zone` | 在此数据库(或共享对象)中检测到最后一个数据页校验码失败的时间,如果没有启用数据校验码则为 NULL -| `blk_read_time` | `double precision` | 在这个数据库中通过后端读取数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) -| `blk_write_time` | `double precision` | 在这个数据库中通过后端写数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) -| `stats_reset` | `timestamp with time zone` | 这些统计数据最后一次重置的时间 -|==== - -==== `pg_stat_database_conflicts` - -`pg_stat_database_conflicts`视图为每一个数据库包含一行, 用来显示数据库范围内由于与后备服务器上的恢复过程冲突而被取消的查询的统计信息。 这个视图将只包含后备服务器上的信息,因为冲突会不发生在主服务器上。 - -**表22.`pg_stat_database_conflicts` 视图** -|==== -| 列 | 类型 | 描述 -|`datid`|`oid`|数据库的OID -|`datname`|`name`|数据库的名称 -|`confl_tablespace`|`bigint`|这个数据库中由于删除表空间而取消的查询的数量 -|`confl_lock`|`bigint`|此数据库中由于锁定超时而被取消的查询数 -|`confl_snapshot`|`bigint`|此数据库中由于旧快照而取消的查询数 -|`confl_bufferpin`|`bigint`|此数据库中由于固定缓冲区而被取消的查询数 -|`confl_deadlock`|`bigint`|此数据库中由于死锁而被取消的查询数 -|==== - -==== `pg_stat_all_tables` - -`pg_stat_all_tables`视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。 `pg_stat_user_tables`和`pg_stat_sys_tables`视图包含相同的信息,但是被过滤得分别只显示用户和系统表。 - -**表23.`pg_stat_all_tables` 视图** -|==== -| 列 | 类型 | 描述 -| relid | oid | 表的OID -| schemaname | name | 该表所在的模式的名称 -| relname | name | 这个表的名称 -| seq_scan | bigint | 在此表上启动的顺序扫描数 -| seq_tup_read | bigint | 连续扫描获取的实时行数 -| idx_scan | bigint | 对这个表发起的索引扫描数 -| idx_tup_fetch | bigint | 索引扫描获取的实时行数 -| n_tup_ins | bigint | 插入的行数 -| n_tup_upd | bigint | 更新的行数(包括HOT更新的行) -| n_tup_del | bigint | 删除的行数 -| n_tup_hot_upd | bigint | HOT更新的行数(即不需要单独的索引更新) -| n_live_tup | bigint | 活的行的估计数量 -| n_dead_tup | bigint | 僵死行的估计数量 -| n_mod_since_analyze | bigint | 自上次分析此表以来修改的行的估计数量 -| n_ins_since_vacuum | bigint | 自上次清空此表以来插入的行的估计数量 -| last_vacuum | timestamp with time zone | 最后一次手动清理这个表(不包括VACUUM FULL) -| last_autovacuum | timestamp with time zone | 这个表最后一次被自动清理守护进程清理的时间 -| last_analyze | timestamp with time zone | 上一次手动分析这个表 -| last_autoanalyze | timestamp with time zone | 自动清理守护进程最后一次分析这个表 -| vacuum_count | bigint | 这个表被手动清理的次数(VACUUM FULL不计数) -| autovacuum_count | bigint | 这个表被autovacuum守护进程清理的次数 -| analyze_count | bigint | 手动分析这个表的次数 -| autoanalyze_count | bigint | 这个表被autovacuum守护进程分析的次数 -|==== - -==== `pg_stat_all_indexes` - -`pg_stat_all_indexes`视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。`pg_stat_user_indexes`和`pg_stat_sys_indexes`视图包含相同的信息,但是被过滤得只分别显示用户和系统索引。 - -**表24.`pg_stat_all_indexes` 视图** -|==== -| 列 | 类型 | 描述 -| relid | oid | 这个索引所在表的OID -| indexrelid | oid | 这个索引的OID -| schemaname | name | 这个索引所在的模式名称 -| relname | name | 这个索引所在表的名称 -| indexrelname | name | 这个索引的名称 -| idx_scan | bigint | 在这个索引上开启的索引扫描的数量 -| idx_tup_read | bigint | 扫描此索引返回的索引项数 -| idx_tup_fetch | bigint | 使用此索引进行简单索引扫描获取的活动表行数 -|==== - -索引可以被简单索引扫描、“位图”索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以被通过 AND 或 OR 规则组合,因此当使用一次位图扫描时难以将取得的个体堆行与特定的索引关联起来。因此,一次位图扫描会增加它使用的索引的`pg_stat_all_indexes`.`idx_tup_read`计数,并且为每个表增加`pg_stat_all_tables`.`idx_tup_fetch`计数,但是它不影响`pg_stat_all_indexes`.`idx_tup_fetch`。如果所提供的常量值不在优化器统计信息记录的范围之内,优化器也会访问索引来检查,因为优化器统计信息可能已经“不新鲜”了。 - -.注意 -**** -即使不用位图扫描,`idx_tup_read`和`idx_tup_fetch`计数也可能不同,因为`idx_tup_read`统计从该索引取得的索引项而`idx_tup_fetch`统计从表取得的活着的行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。 -**** - -==== `pg_statio_all_tables` - -`pg_statio_all_tables`视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。`pg_statio_user_tables`和`pg_statio_sys_tables`视图包含相同的信息,但是被过滤得分别只显示用户表和系统表。 - -**表25.`pg_statio_all_tables` 视图** -|==== -| 列 | 类型 | 描述 -| `relid` | `oid` | 表的OID -| `schemaname` | `name` | 该表所在的模式名 -| `relname` | `name` | 这个表的名称 -| `heap_blks_read` | `bigint` | 从该表中读取的磁盘块的数量 -| `heap_blks_hit` | `bigint` | 该表中的缓冲区命中数 -| `idx_blks_read` | `bigint` | 从这个表上所有索引读取的磁盘块数 -| `idx_blks_hit` | `bigint` | 这个表上所有索引中的缓冲区命中数 -| `toast_blks_read` | `bigint` | 从这个表的TOAST表中读取的磁盘块的数量(如果有的话) -| `toast_blks_hit` | `bigint` | 这个表的TOAST表中的缓冲区命中数(如果有的话) -| `tidx_blks_read` | `bigint` | 从这个表的TOAST表索引中读取的磁盘块的数量(如果有的话) -| `tidx_blks_hit` | `bigint` | 这个表的TOAST表索引中的缓冲区命中数(如果有的话) -|==== - -==== `pg_statio_all_indexes` - -`pg_statio_all_indexes`视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。 `pg_statio_user_indexes`和`pg_statio_sys_indexes`视图包含相同的信息,但是被过滤得分别只显示用户索引和系统索引。 - -**表26.`pg_statio_all_indexes` 视图** -|==== -| 列 | 类型 | 描述 -| `relid` | `oid` | 这个索引所在表的OID -| `indexrelid` | `oid` | 这个索引的OID -| `schemaname` | `name` | 索引所在的模式名称 -| `relname` | `name` | 这个索引所在表的名称 -| `indexrelname` | `name` | 这个索引的名称 -| `idx_blks_read` | `bigint` | 从这个索引中读取的磁盘块数量 -| `idx_blks_hit` | `bigint` | 这个索引中的缓冲区命中数 -|==== - -==== `pg_statio_all_sequences` - -`pg_statio_all_sequences`视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。 - -**表27.`pg_statio_all_sequences` 视图** -|==== -| 列 | 类型 | 描述 -| relid | oid | 序列的OID -| schemaname | name | 此序列所在的模式的名称 -| relname | name | 此序列的名称 -| blks_read | bigint | 从这个序列中读取的磁盘块的数量 -| blks_hit | bigint | 在此序列中的缓冲区命中数 -|==== - -==== `pg_stat_user_functions` - -`pg_stat_user_functions`视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。 track_functions参数控制到底哪些函数被跟踪。 - -**表28.`pg_stat_user_functions` 视图** -|==== -| 列 | 类型 | 描述 -| funcid | oid | 函数的OID -| schemaname | name | 这个函数所在的模式的名称 -| funcname | name | 这个函数的名称 -| calls | bigint | 这个函数已经被调用的次数 -| total_time | double precision | 在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计 -| self_time | double precision | 在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计 -|==== - -==== `pg_stat_slru` - -IvorySQL通过*SLRU*(simple least-recently-used,简单的最近-最少-使用)缓存访问某些磁盘上的信息。 `pg_stat_slru`视图将为每个被跟踪的SLRU缓存包含一行,显示关于访问缓存页面的统计信息。 - -**表29.`pg_stat_slru` 视图** -|==== -| 列 | 类型 | 描述 -| name | text | SLRU的名称 -| blks_zeroed | bigint | 初始化期间被置零的块数 -| blks_hit | bigint | 已经在SLRU中的磁盘块被发现的次数,因此不需要读取(这只包括SLRU中的命中,而不是操作系统的文件系统缓存) -| blks_read | bigint | 为这个SLRU读取的磁盘块数 -| blks_written | bigint | 为这个SLRU写入的磁盘块数 -| blks_exists | bigint | 为这个SLRU检查是否存在的块数 -| flushes | bigint | 此SLRU的脏数据刷新数 -| truncates | bigint | 这个SLRU的截断数 -| stats_reset | timestamp with time zone | 这些统计数据最后一次重置的时间 -|==== - -==== Statistics Functions - -其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。 如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出`\d+ pg_stat_activity`)。 针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。 针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。 - -更多统计集合的函数列在 表 30 中。 - -**表30.Additional Statistics Functions** -|==== -| 函数 | 描述 -| pg_backend_pid () → integer | 返回附加到当前会话的服务器进程的进程ID。 -| pg_stat_get_activity ( integer ) → setof record | 使用指定的进程ID返回有关后端信息的记录,如果指定了NULL,则返回系统中每个活动后端的一条记录。返回的字段是pg_stat_activity视图中字段的子集。 -| pg_stat_get_snapshot_timestamp () → timestamp with time zone | 返回当前统计快照的时间戳。 -| pg_stat_clear_snapshot () → void | 丢弃当前的统计快照。 -| pg_stat_reset () → void | 将当前数据库的所有统计计数器重置为零。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 -| pg_stat_reset_shared ( text ) → void | 根据参数的不同,将一些集群范围的统计计数器重置为零。参数可以是bgwriter来重置pg_stat_bgwriter视图中显示的所有计数器,或者archiver来重置pg_stat_archiver视图中显示的所有计数器。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 -| pg_stat_reset_single_table_counters ( oid ) → void | 将当前数据库中单个表或索引的统计信息重置为零。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 -| pg_stat_reset_single_function_counters ( oid ) → void | 将当前数据库中单个函数的统计信息重置为零。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 -| pg_stat_reset_slru ( text ) → void | 将单个SLRU缓存或集群中所有SLRU的统计信息重置为零。如果该参数为NULL,则所有SLRU缓存的pg_stat_slru视图中显示的计数器将被重置。参数可以是CommitTs、MultiXactMember、MultiXactOffset、Notify、Serial、Subtrans或Xact中的一个,以便只重置该条目的计数器。如果参数是other(或实际上,任何无法识别的名称),那么所有其他SLRU缓存的计数器,如扩展定义的缓存,将被重置。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 -|==== - -`pg_stat_get_activity`是`pg_stat_activity`视图的底层函数, 它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。 在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在 表 31中。 这些访问函数使用一个后端 ID 号,范围从 1 到当前活动后端数目。 函数`pg_stat_get_backend_idset`提供了一种方便的方法为每个活动后端产生一行来调用这些函数。 例如,要显示PID以及所有后端当前的查询: - -``` -SELECT pg_stat_get_backend_pid(s.backendid) AS pid, - pg_stat_get_backend_activity(s.backendid) AS query - FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s; -``` - -**表31.Per-Backend Statistics Functions** -|==== -| 函数 | 描述 -| pg_stat_get_backend_idset () → setof integer | 返回当前活动后端ID号的集合(从1到活动后端数)。 -| pg_stat_get_backend_activity ( integer ) → text | 返回此后端最近查询的文本。 -| pg_stat_get_backend_activity_start ( integer ) → timestamp with time zone | 返回后端最近一次查询开始的时间。 -| pg_stat_get_backend_client_addr ( integer ) → inet | 返回连接到此后端的客户端的IP地址。 -| pg_stat_get_backend_client_port ( integer ) → integer | 返回客户端用于通信的TCP端口号。 -| pg_stat_get_backend_dbid ( integer ) → oid | 返回此后端连接的数据库的OID。 -| pg_stat_get_backend_pid ( integer ) → integer | 返回此后端进程ID。 -| pg_stat_get_backend_start ( integer ) → timestamp with time zone | 返回该进程开始的时间。 -| pg_stat_get_backend_userid ( integer ) → oid | 返回登录到此后端的用户的OID。 -| pg_stat_get_backend_wait_event_type ( integer ) → text | 如果后端当前正在等待,返回等待事件类型名称,否则返回NULL。 -| pg_stat_get_backend_wait_event ( integer ) → text | 如果后端当前正在等待,则返回等待事件名称,否则为NULL。 -| pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone | 返回后端当前事务开始的时间。 -|==== - -== 查看锁 - -监控数据库活动的另外一个有用的工具是`pg_locks`系统表。这样就允许数据库管理员查看在锁管理器里面未解决的锁的信息。例如,这个功能可以被用于: - -- 查看当前所有未解决的锁、在一个特定数据库中的关系上所有的锁、在一个特定关系上所有的锁,或者由一个特定IvorySQL会话持有的所有的锁。 -- 判断当前数据库中带有最多未授予锁的关系(它很可能是数据库客户端的竞争源)。 -- 判断锁竞争给数据库总体性能带来的影响,以及锁竞争随着整个数据库流量的变化范围。 - -== Progress Reporting - -IvorySQL具有在命令执行过程中报告某些命令进度的能力。 目前,支持进度报告的命令只有`ANALYZE`,`CLUSTER`,`CREATE INDEX`, `VACUUM`, 和 BASE_BACKUP例如 pg_basebackup发出的进行基础备份的复制命令。未来可能还会扩展。 - -=== ANALYZE Progress Reporting - -每当`ANALYZE`运行时,`pg_stat_progress_analyze`视图将包含当前运行该命令的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它们的信息。 - -**表32.`pg_stat_progress_analyze` 视图** -|==== -|列 | 类型 | 描述 -|pid | integer | 后端的进程ID。 -|datid | oid | 后端连接到的数据库的OID。 -|datname | name | 后端连接到的数据库的名称。 -|relid | oid | 被分析的表的OID。 -|phase | text | 当前处理阶段。参见 表 33。 -|sample_blks_total | bigint | 将被采样的堆块的总数。 -|sample_blks_scanned | bigint | 扫描的堆块数量。 -|ext_stats_total | bigint | 扩展统计信息的数量。 -|ext_stats_computed | bigint | 已经计算的扩展统计的数量。此计数器仅在 computing extended statistics 阶段增进。 -|child_tables_total | bigint | 子表的数量。 -|child_tables_done | bigint | 扫描的子表数。此计数器只有在 acquiring inherited sample rows 阶段才会增进。 -|current_child_table_relid | oid | 当前正在扫描的子表的 OID。此字段仅在 acquiring inherited sample rows 时有效。 -|==== - -**表33.ANALYZE phases** -|==== -| 阶段 | 描述 -| `initializing` | 命令正在准备开始扫描堆。这个阶段预计会非常短暂。 -| `acquiring sample rows` | 该命令当前正在扫描`relid`给出的表以获得示例行。 -| `acquiring inherited sample rows` | 该命令当前正在扫描子表以获得示例行。列`child_tables_total`,`child_tables_done`, 和`current_child_table_relid`包含此阶段的进度信息。 -| `computing statistics` | 该命令从表扫描期间获得的样例行计算统计信息。 -| `computing extended statistics` | 该命令从表扫描期间获得的样例行计算扩展统计信息。 -| `finalizing analyze` | 该命令在更新`pg_class`。当此阶段完成时,`ANALYZE` 将结束。 -|==== - -.注意 -**** -当在分区表上运行`ANALYZE`时,它的所有分区也会被递归分析,如在ANALYZE中曾提到过。 在这种情况下,首先报告父表的`ANALYZE`进度,收集它的继承统计信息,然后是每个分区的(继承统计信息)。 -**** - -=== CREATE INDEX Progress Reporting - -每当运行`CREATE INDEX`或`REINDEX`时,`pg_stat_progress_create_index`视图将包含当前正在创建索引的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。 - -**表34.`pg_stat_progress_create_index` 视图** -|==== -| 列 | 类型 | 描述 -| `pid` | `integer` | 后端的进程ID。 -| `datid` | `oid` | 后端连接到的数据库的OID。 -| `datname` | `name` | 后端连接到的数据库的名称。 -| `relid` | `oid` | 正在创建索引的表的OID。 -| `index_relid` | `oid` | 正在创建或重建索引的OID。在非并发 `CREATE INDEX` 的时候,此为 0。 -| `command` | `text` | 在运行的命令:`CREATE INDEX`、`CREATE INDEX CONCURRENTLY`、`REINDEX` 或 `REINDEX CONCURRENTLY`。 -| `phase` | `text` | 索引创建的当前处理阶段。参见 [表 35](http://www.postgresql.org/docs/17/progress-reporting.html#CREATE-INDEX-PHASES)。 -| `lockers_total` | `bigint` | 在适用的情况下,需要等待的储物柜总数。 -| `lockers_done` | `bigint` | 已经等待的储物柜数量。 -| `current_locker_pid` | `bigint` | 目前正在等待的储物柜的进程ID。 -| `blocks_total` | `bigint` | 本阶段要处理的区块总数。 -| `blocks_done` | `bigint` | 当前阶段已经处理的区块数量。 -| `tuples_total` | `bigint` | 当前阶段要处理的元组总数。 -| `tuples_done` | `bigint` | 在当前阶段已经处理的元组数量。 -| `partitions_total` | `bigint` | 在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。 -| `partitions_done` | `bigint` | 当在分区表上创建索引时,该列被设置为在其上完成索引的分区数。 -|==== - -**表35.CREATE INDEX 的阶段** -|==== -| 阶段 | 描述 -| `初始化` | `CREATE INDEX`或`REINDEX`正在准备创建索引。 这个阶段预计会非常短暂。 -| `构建前等待读写器` | `CREATE INDEX CONCURRENTLY`或`REINDEX CONCURRENTLY`正在等待有可能看到表的写锁的事务完成。 当不在并发模式时,这个阶段会被跳过。`lockers_total`、 `lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 -| `新建索引` | 索引是由访问方法专用代码建立的。 在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。 通常情况下,`blocks_total`和`blocks_done`将包含进度数据,也可能包含`tuples_total`和`tuples_done`。 -| `在验证前等待读写器` | `CREATE INDEX CONCURRENTLY`或`REINDEX CONCURRENTLY`正在等待有可能写入表的事务完成写锁的事务。当不在并发模式时,这个阶段会被跳过。`lockers_total`、 `lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 -| `索引验证:扫描索引` | `CREATE INDEX CONCURRENTLY`正在扫描索引,搜索需要验证的图元组。如果不是在并发模式下,这个阶段会被跳过。列 `blocks_total`(设置为索引的总大小)和 `blocks_done`包含了这个阶段的进度信息。 -| `指数验证:排序元组` | `CREATE INDEX CONCURRENTLY`正在对索引扫描阶段的输出进行排序。 -| `索引验证:扫描表` | `CREATE INDEX CONCURRENTLY`正在扫描表,以验证前两个阶段收集的索引图元。当不在并发模式时,这个阶段被跳过。`blocks_total`列(设置为表的总大小)和`blocks_done`列包含这个阶段的进度信息。 -| `等待旧照` | `CREATE INDEX CONCURRENTLY`或`REINDEX CONCURRENTLY`正在等待可能看到表的事务释放快照。 当不处于并发模式时,这个阶段会被跳过。 `lockers_total`、`lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 -| `标记 dead之前等待readers` | `REINDEX CONCURRENTLY`等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。`lockers_total`、`lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 -| `在 dropping之前等待readers` | `REINDEX CONCURRENTLY`等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 `lockers_total`、`lockers_done` 和 `current_locker_pid`包含了这个阶段的进度信息。 -|==== - -=== VACUUM进度报告 - -只要`VACUUM`正在运行,每一个当前正在清理的后端(包括autovacuum工作者进程)在`pg_stat_progress_vacuum`视图中都会有一行。下面的表描述了将被报告的信息并且提供了如何解释它们的信息。`VACUUM FULL`命令的进度是通过`pg_stat_progress_cluster`报告的,因为`VACUUM FULL`和`CLUSTER`都是重写表,而普通的`VACUUM`只是原地修改表。 - -**表36.`pg_stat_progress_vacuum` 视图** -|==== -| 列 | 类型 | 描述 -| pid | integer | 后端的进程ID。 -| datid | oid | 这个后端连接的数据库的OID。 -| datname | name | 这个后端连接的数据库的名称。 -| relid | oid | 被vacuum的表的OID。 -| phase | text | vacuum的当前处理阶段。 -| heap_blks_total | bigint | 该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个VACUUM访问。 -| heap_blks_scanned | bigint | 被扫描的堆块数量。由于visibility map被用来优化扫描,一些块将被跳过而不做检查,被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total。仅当处于扫描堆阶段时这个计数器才会前进。 -| heap_blks_vacuumed | bigint | 被清理的堆块数量。除非表没有索引,这个计数器仅在处于清理堆阶段时才会前进。不包含死亡元组的块会被跳过,因此这个计数器可能有时会向前跳跃一个比较大的增量。 -| index_vacuum_count | bigint | 已完成的索引清理周期数。 -| max_dead_tuples | bigint | 在需要执行一个索引清理周期之前我们可以存储的死亡元组数,取决于maintenance_work_mem。 -| num_dead_tuples | bigint | 从上一个索引清理周期以来收集的死亡元组数。 -|==== - -**表37.VACUUM的阶段** -|==== -| 阶段 | 描述 -| `初始化` | `VACUUM`正在准备开始扫描堆。这个阶段应该很简短。 -| `扫描堆` | `VACUUM`正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。`heap_blks_scanned`列可以用来监控扫描的进度。 -| `清理索引` | `VACUUM`当前正在清理索引。如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。如果maintenance_work_mem不足以存放找到的死亡元组,则每次清理时会多次清理索引。 -| `清理堆` | `VACUUM`当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果`heap_blks_scanned`小于`heap_blks_total`,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。 -| `清除索引` | `VACUUM`当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。 -| `截断堆` | `VACUUM`正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。 -| `执行最后的清除` | `VACUUM`在执行最终的清除。在这个阶段中,`VACUUM`将清理空闲空间映射、更新`pg_class`中的统计信息并且将统计信息报告给统计收集器。当这个阶段完成时,`VACUUM`也就结束了。 -|==== - - -=== CLUSTER进度报告 - -每当`CLUSTER`或`VACUUM FULL`运行时,`pg_stat_progress_cluster`视图将包含当前正在运行的每一个后台的记录。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。 - -**表38.`pg_stat_progress_cluster` 视图** -|==== -| 列 | 类型 | 描述 -| `pid` | `integer` | 后台的进程ID。 -| `datid` | `oid` | 该后端连接的数据库的OID。 -| `datname` | `name` | 与此后端连接的数据库的名称。 -| `relid` | `oid` | 被集群的表的OID。 -| `command` | `text` | 正在运行的命令。`CLUSTER`或`VACUUM FULL`。 -| `phase` | `text` | 当前处理阶段。 -| `cluster_index_relid` | `oid` | 如果正在使用索引对表进行扫描,这就是正在使用的索引的OID;否则为0。 -| `heap_tuples_scanned` | `bigint` | 扫描的堆元组数。这个计数器只有在阶段为`seq scanning heap`、`index scanning heap`或`writing new heap`时才会增进。 -| `heap_tuples_written` | `bigint` | 写入的堆元组的数量。这个计数器只有在阶段为`seq scanning heap`、`index scanning heap`或`writing new heap`时才会前进。 -| `heap_blks_total` | `bigint` | 表中的堆块总数。这个数字是在`seq scanning heap`的开始时报告的。 -| `heap_blks_scanned` | `bigint` | 扫描的堆块数量。这个计数器只有在阶段为`seq scanning heap`时才会增进。 -| `index_rebuild_count` | `bigint` | 重建的索引数。该计数器仅在`重建索引`阶段时才会增进。 -|==== - -**表39.CLUSTER 和 VACUUM FULL 阶段** -|==== -| 阶段 | 描述 -| `初始化` | 该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。 -| `seq扫描堆` | 该命令目前采用顺序扫描的方式对表进行扫描。 -| `索引扫描堆` | `CLUSTER`目前正在使用索引扫描表。 -| `元组排序` | `CLUSTER`目前正在对元组进行排序。 -| `新写入堆` | `CLUSTER`目前正在编写新的堆。 -| `交换关系文件` | 目前,该命令正在将新建立的文件调换到位。 -| `重建索引` | 该命令目前正在重建一个索引。 -| `清理` | 该命令正在执行最后的清理工作。 当此阶段完成后,`CLUSTER`或`VACUUM FULL`将结束。 -|==== - -=== 基础备份进度报告 - -每当像pg_basebackup这样的应用程序进行基本备份时, `pg_stat_progress_basebackup`视图将包含当前运行`BASE_BACKUP`复制命令和流备份的每个WAL发送进程的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。 - -**表40.`pg_stat_progress_basebackup` 视图** -|==== -| 列 | 类型 | 描述 -| pid | integer | WAL发送方进程ID。 -| phase | text | 目前的处理阶段。 -| backup_total | bigint | 将被流输送的数据总量。这是在streaming database files阶段开始时的估计和报告。注意,这只是一个近似值,因为在streaming database files阶段,数据库可能会改变,而WAL日志可能会在稍后的备份中包含。一旦流数据量超过了估计的总大小,该值始终与backup_streamed相同。如果在pg_basebackup中禁用估算(也就是说,指定了--no-estimate-size选项),这为NULL。 -| backup_streamed | bigint | 数据流的总量。这个计数器只在streaming database files阶段或transferring wal files时增进。 -| tablespaces_total | bigint | 要流输送的表空间总数。 -| tablespaces_streamed | bigint | 流输送的表空间数。此计数器仅在streaming database files阶段增进。 -|==== - -**表41.基础备份阶段** -|==== -| 阶段 | 描述 -| `initializing` | WAL发送器进程正在准备开始备份。这个阶段预计会非常短暂。 -| `waiting for checkpoint to finish` | WAL发送器进程目前正在执行`pg_start_backup`以准备进行基础备份,并等待启动备份检查点完成。 -| `estimating backup size` | WAL发送程序目前正在估计将作为基础备份流传输的数据库文件的总量。 -| `streaming database files` | WAL发送器当前正在流数据库文件作为基础备份。 -| `waiting for wal archiving to finish` | WAL发送方进程目前正在执行`pg_stop_backup`以完成备份,并等待基础备份所需的所有WAL文件成功存档。 如果在pg_basebackup中指定了`--wal-method=none`或`--wal-method=stream`,则备份将在此阶段完成后结束。 -| `transferring wal files` | WAL发送器进程正在传输备份过程中产生的所有WAL日志。 如果pg_basebackup中指定了`--wal-method=fetch`, 则该阶段发生在`waiting for wal archiving to finish`阶段之后。当此阶段完成时备份将结束。 -|==== - -== 动态追踪 - -IvorySQL提供了功能来支持数据库服务器的动态追踪。这样就允许在代码中的特定点上调用外部工具来追踪执行过程。 - -一些探针或追踪点已经被插入在源代码中。这些探针的目的是被数据库开发者和管理员使用。默认情况下,探针不被编译到IvorySQL中;用户需要显式地告诉配置脚本使得探针可用。 - -目前,DTrace已被支持,它在 Solaris、macOS、FreeBSD、NetBSD 和 Oracle Linux 上可用。 Linux 的SystemTap项目提供了一种可用的 DTrace 等价物。支持其他动态追踪工具在理论上可以通过改变`src/include/utils/probes.h`中的宏定义实现。 - -=== 动态追踪的编译 - -默认情况下,探针是不可用的,因此你将需要显式地告诉配置脚本让探针在IvorySQL中可用。要包括 DTrace 支持,在配置时指定`--enable-dtrace`。 - -=== 内建探针 - -如表 42所示,源代码中提供了一些标准探针。表 43显示了在探针中使用的类型。当然,可以增加更多探针来增强IvorySQL的可观测性。 - -**表42.内建 DTrace 探针** -|==== -| 名称 | 参数 | 描述 -| `transaction-start` | `(LocalTransactionId)` | 在一个新事务开始时触发的探针。arg0 是事务 ID。 -| `transaction-commit` | `(LocalTransactionId)` | 在一个事务成功完成时触发的探针。arg0 是事务 ID。 -| `transaction-abort` | `(LocalTransactionId)` | 当一个事务失败完成时触发的探针。arg0 是事务 ID。 -| `query-start` | `(const char *)` | 当一个查询的处理被开始时触发的探针。arg0 是查询字符串。 -| `query-done` | `(const char *)` | 当一个查询的处理完成时触发的探针。arg0 是查询字符串。 -| `query-parse-start` | `(const char *)` | 当一个查询的解析被开始时触发的探针。arg0 是查询字符串。 -| `query-parse-done` | `(const char *)` | 当一个查询的解析完成时触发的探针。arg0 是查询字符串。 -| `query-rewrite-start` | `(const char *)` | 当一个查询的重写被开始时触发的探针。arg0 是查询字符串。 -| `query-rewrite-done` | `(const char *)` | 当一个查询的重写完成时触发的探针。arg0 是查询字符串。 -| `query-plan-start` | `()` | 当一个查询的规划被开始时触发的探针。 -| `query-plan-done` | `()` | 当一个查询的规划完成时触发的探针。 -| `query-execute-start` | `()` | 当一个查询的执行被开始时触发的探针。 -| `query-execute-done` | `()` | 当一个查询的执行完成时触发的探针。 -| `statement-status` | `(const char *)` | 任何时候当服务器进程更新它的`pg_stat_activity`.`status`时触发的探针。arg0 是新的状态字符串。 -| `checkpoint-start` | `(int)` | 当一个检查点被开始时触发的探针。arg0 传递位标志来区分不同的检查点类型,例如关闭(shutdown)、立即(immediate)或强制(force)。 -| `checkpoint-done` | `(int, int, int, int, int)` | 当一个检查点完成时触发的探针(检查点处理过程中序列中列出的下一个触发的探针)。arg0 是要写的缓冲区数量。arg1 是缓冲区的总数。arg2、arg3 和 arg4 分别包含了增加、删除和循环回收的 WAL 文件的数量。 -| `clog-checkpoint-start` | `(bool)` | 当一个检查点的 CLOG 部分被开始时触发的探针。arg0 为真表示正常检查点,为假表示关闭检查点。 -| `clog-checkpoint-done` | `(bool)` | 当一个检查点的 CLOG 部分完成时触发的探针。arg0 的含义与`clog-checkpoint-start`中相同。 -| `subtrans-checkpoint-start` | `(bool)` | 当一个检查点的 SUBTRANS 部分被开始时触发的探针。arg0 为真表示正常检查点,为假表示关闭检查点。 -| `subtrans-checkpoint-done` | `(bool)` | 当一个检查点的 SUBTRANS 部分完成时触发的探针。arg0 的含义与`subtrans-checkpoint-start`中相同。 -| `multixact-checkpoint-start` | `(bool)` | 当一个检查点的 MultiXact 部分被开始时触发的探针。arg0 为真表示正常检查点,为假表示关闭检查点。 -| `multixact-checkpoint-done` | `(bool)` | 当一个检查点的 MultiXact 部分完成时触发的探针。arg0 的含义与`multixact-checkpoint-start`中相同。 -| `buffer-checkpoint-start` | `(int)` | 当一个检查点的写缓冲区部分被开始时触发的探针。arg0 传递位标志来区分不同的检查点类型,例如关闭(shutdown)、立即(immediate)或强制(force)。 -| `buffer-sync-start` | `(int, int)` | 当我们在检查点期间开始写脏缓冲区时(在标识哪些缓冲区必须被写之后)触发的探针。arg0 是缓冲区总数,arg1 是当前为脏并且需要被写的缓冲区数量。 -| `buffer-sync-written` | `(int)` | 在检查点期间当每个缓冲区被写完之后触发的探针。arg0 是缓冲区的 ID。 -| `buffer-sync-done` | `(int, int, int)` | 当所有脏缓冲区被写之后触发的探针。arg0 是缓冲区总数。arg1 是检查点进程实际写的缓冲区数量。arg2 是期望写的数目(`buffer-sync-start`的 arg1);arg1 和 arg2 的任何的不同反映在该检查点期间有其他进程刷写了缓冲区。 -| `buffer-checkpoint-sync-start` | `()` | 在脏缓冲区被写入到内核之后并且在开始发出 fsync 请求之前触发的探针。 -| `buffer-checkpoint-done` | `()` | 当同步缓冲区到磁盘完成时触发的探针。 -| `twophase-checkpoint-start` | `()` | 当一个检查点的两阶段部分被开始时触发的探针。 -| `twophase-checkpoint-done` | `()` | 当一个检查点的两阶段部分完成时触发的探针。 -| `buffer-read-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool)` | 当一次缓冲区读被开始时触发的探针。arg0 和 arg1 包含该页的分叉号和块号(如果这是一次关系扩展请求,arg1 为 -1)。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是 `InvalidBackendId`(-1)。arg6 为真表示一次关系扩展请求,为假表示正常读。 -| `buffer-read-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool, bool)` | 当一次缓冲区读完成时触发的探针。arg0 和 arg1 包含该页的分叉号和块号(如果这是一次关系扩展请求,arg1 现在包含新增加块的块号)。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是 `InvalidBackendId`(-1)。arg6 为真表示一次关系扩展请求,为假表示正常读。arg7 为真表示在池中找到该缓冲区,为假表示没有找到。 -| `buffer-flush-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 在发出对一个共享缓冲区的任意写请求之前触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。 -| `buffer-flush-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 当一个写请求完成时触发的探针(注意这只反映传递数据给内核的时间,它通常并没有实际地被写入到磁盘)。参数和`buffer-flush-start`的相同。 -| `buffer-write-dirty-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 当一个服务器进程开始写一个脏缓冲区时触发的探针(如果这经常发生,表示shared_buffers太小,或需要调整后台写入器的控制参数)。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。 -| `buffer-write-dirty-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 当一次脏缓冲区写完成时触发的探针。参数与`buffer-write-dirty-start`相同。 -| `wal-buffer-write-dirty-start` | `()` | 当一个服务器进程因为没有可用 WAL 缓冲区空间开始写一个脏 WAL 缓冲区时触发的探针(如果这经常发生,表示wal_buffers太小)。 -| `wal-buffer-write-dirty-done` | `()` | 当一次脏 WAL 缓冲区完成时触发的探针。 -| `wal-insert` | `(unsigned char, unsigned char)` | 当一个 WAL 记录被插入时触发的探针。arg0 是该记录的资源管理者(rmid)。arg1 包含 info 标志。 -| `wal-switch` | `()` | 当请求一次 WAL 段切换时触发的探针。 -| `smgr-md-read-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int)` | 当开始从一个关系读取一块时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。 -| `smgr-md-read-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int)` | 当一次块读取完成时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。arg6 是实际读取的字节数,而 arg7 是请求读取的字节数(如果两者不同就意味着麻烦)。 -| `smgr-md-write-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int)` | 当开始向一个关系中写入一个块时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。 -| `smgr-md-write-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int)` | 当一个块写操作完成时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3和arg4 包含表空间、数据库和关系 OID来标识该关系。对于一个本地缓冲区,arg5 是创建临时关系的后端 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。arg6 是实际写的字节数,而 arg7 是要求写的字节数(如果这两者不同,则意味着麻烦)。 -| `sort-start` | `(int, bool, int, int, bool, int)` | 当一次排序操作开始时触发的探针。arg0 指示是堆排序、索引排序或数据排序。arg1 为真表示唯一值强制。arg2 是键列的数目。arg3 是允许使用的工作内存数(以千字节计)。如果要求随机访问排序结果,那么 arg4 为真。arg5为`0`时表示串行,为`1`时表示并行工作者,为`2`时表示并行领袖。 -| `sort-done` | `(bool, long)` | 当一次排序完成时触发的探针。arg0 为真表示外排序,为假表示内排序。arg1 是用于一次外排序的磁盘块的数目,或用于一次内排序的以千字节计的内存。 -| `lwlock-acquire` | `(char *, LWLockMode)` | 当成功获得一个 LWLock 时触发的探针。 arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 -| `lwlock-release` | `(char *)` | 当一个 LWLock 被释放时(但是注意还没有唤醒任何一个被释放的等待者)触发的探针。 arg0 是该 LWLock 所在的切片(Tranche)。 -| `lwlock-wait-start` | `(char *, LWLockMode)` | 当一个 LWLock不是当即可用并且一个服务器进程因此开始等待该锁变为可用时触发的探针。 arg0 是该 LWLock 所在的切片(Tranche)。 arg1 请求的锁模式,是排他或共享。 -| `lwlock-wait-done` | `(char *, LWLockMode)` | 当一个进程从对一个 LWLock 的等待中被释放时(它实际还没有得到该锁)时触发的探针。arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 -| `lwlock-condacquire` | `(char *, LWLockMode)` | 当调用者指定无需等待而成功获得一个 LWLock 时触发的探针。arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 -| `lwlock-condacquire-fail` | `(char *, LWLockMode)` | 当调用者指定无需等待而没有成功获得一个 LWLock 时触发的探针。arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 -| `lock-wait-start` | `(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE)` | 当一个重量级锁(lmgr锁)的请求由于锁不可用开始等待时触发的探针。arg0 到 arg3 是标识被锁定对象的标签域。arg4 指示被锁对象的类型。arg5 表示被请求的锁类型。 -| `lock-wait-done` | `(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE)` | 当一个重量级锁(lmgr 锁)的请求结束等待时(即已经得到锁)触发的探针。参数与`lock-wait-start`一样。 -| `deadlock-found` | `()` | 当死锁检测器发现死锁时触发的探针。 -|==== - -**表43.定义用在探针参数中的类型** -|==== -| 类型 | 定义 -| `LocalTransactionId` | `unsigned int` -| `LWLockMode` | `int` -| `LOCKMODE` | `int` -| `BlockNumber` | `unsigned int` -| `Oid` | `unsigned int` -| `ForkNumber` | `int` -| `bool` | `unsigned char` -|==== - -=== 使用探针 - -下面的例子展示了一个分析系统中事务计数的 DTrace 脚本,可以用来代替一次性能测试之前和之后的`pg_stat_database`快照: - -``` -#!/usr/sbin/dtrace -qs - -postgresql$1:::transaction-start -{ - @start["Start"] = count(); - self->ts = timestamp; -} - -postgresql$1:::transaction-abort -{ - @abort["Abort"] = count(); -} - -postgresql$1:::transaction-commit -/self->ts/ -{ - @commit["Commit"] = count(); - @time["Total time (ns)"] = sum(timestamp - self->ts); - self->ts=0; -} -``` - -当被执行时,该例子 D 脚本给出这样的输出: - -``` -# ./txn_count.d `pgrep -n postgres` or ./txn_count.d -^C - -Start 71 -Commit 70 -Total time (ns) 2312105013 -``` - -.注意 -**** -SystemTap 为追踪脚本使用一个不同于 DTrace 的标记,但是底层的探针是兼容的。值得注意的是,在这样写的时候,SystemTap 脚本必须使用双下划线代替连字符来引用探针名。在未来的 SystemTap 发行中这很可能会被修复。你应该记住,DTrace 脚本需要细心地编写和调试,否则被收集的追踪信息可能会毫无意义。在大部分发现问题的情况中,它就是发生问题的部件,而不是底层系统。当讨论使用动态追踪发现的信息时,一定要附上使用的脚本以便其也被检查和讨论。 -**** - -=== 定义新探针 - -开发者可以在代码中任意位置定义新的探针,当然这要重新编译之后才能生效。下面是插入新探针的步骤: - -1. 决定探针名称以及探针可用的数据 -2. 把该探针定义加入到`src/backend/utils/probes.d` -3. 如果`pg_trace.h`还不存在于包含该探针点的模块中,包括它,并且在源代码中期望的位置插入`TRACE_POSTGRESQL`探针宏 -4. 重新编译并验证新探针是可用的 - -**例子:.** 这里是一个如何增加一个探针来用事务 ID 追踪所有新事务的例子。 - -1. 决定探针将被命名为`transaction-start`并且需要一个`LocalTransactionId`类型的参数 - -2. 将该探针定义加入到`src/backend/utils/probes.d`: - - ``` - probe transaction__start(LocalTransactionId); - ``` - - 注意探针名字中双下划线的使用。在一个使用探针的 DTrace 脚本中,双下划线需要被替换为一个连字符,因此 ,对用户而言`transaction-start`是文档名。 - -3. 在编译时,`transaction__start`被转换成一个宏调用`TRACE_POSTGRESQL_TRANSACTION_START`(注意这里是单下划线),可以通过包括头文件`pg_trace.h`获得。将宏调用加入到源代码中的合适位置。在这种情况下,看起来类似: - - ``` - TRACE_POSTGRESQL_TRANSACTION_START(vxid.localTransactionId); - ``` - -4. 在重新编译和运行新的二进制文件之后,通过运行下面的 DTrace 命令来检查新增的探针是否可用。你应该看到类似下面的输出: - - ``` - # dtrace -ln transaction-start - ID PROVIDER MODULE FUNCTION NAME - 18705 postgresql49878 postgres StartTransactionCommand transaction-start - 18755 postgresql49877 postgres StartTransactionCommand transaction-start - 18805 postgresql49876 postgres StartTransactionCommand transaction-start - 18855 postgresql49875 postgres StartTransactionCommand transaction-start - 18986 postgresql49873 postgres StartTransactionCommand transaction-start - ``` - -向C代码中添加追踪宏时,有一些事情需要注意: - -- 需要小心的是,为探针参数指定的数据类型要匹配宏中使用的变量的数据类型,否则会发生编译错误。 - -- 在大多数平台上,如果用`--enable-dtrace`编译了IvorySQL,无论何时当控制经过一个追踪宏时,都会评估该宏的参数,即使没有进行追踪也会这样做。通常不需要担心你是否只在报告一些局部变量的值。但是要注意不要将开销大的函数调用放入参数中。如果你需要这样做,考虑通过检查追踪是否真的被启用来保护该宏: - - ``` - if (TRACE_POSTGRESQL_TRANSACTION_START_ENABLED()) - TRACE_POSTGRESQL_TRANSACTION_START(some_function(...)); - ``` - -每个追踪宏有一个对应的`ENABLED`宏。 - -== 监控磁盘的使用 - -=== 判断磁盘用量 - -每个表都有一个主要的堆磁盘文件,大多数数据都存储在其中。如果一个表有着可能会很宽(尺寸大)的列, 则另外还有一个TOAST文件与这个表相关联, 它用于存储因为太宽而不能存储在主表里面的值。如果有这个附属文件,那么TOAST表上会有一个可用的索引。 当然,同时还可能有索引和基表关联。每个表和索引都存放在单独的磁盘文件里 — 如果文件超过 1G 字节,甚至可能多于一个文件。 - -你可以以三种方式监视磁盘空间:使用oid2name模块或者人工观察系统目录。SQL函数是最容易使用的方法,同时也是我们通常推荐的方法。本节剩余的部分将展示如何通过观察系统目录来监视磁盘空间。 - -在一个最近清理过或者分析过的数据库上使用psql,你可以发出查询来查看任意表的磁盘用量: - -``` -SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer'; - - pg_relation_filepath | relpages -----------------------+---------- - base/16384/16806 | 60 -(1 row) -``` - -每个页通常都是 8K 字节(记住,`relpages`只会由`VACUUM`、`ANALYZE`和少数几个 DDL 命令如`CREATE INDEX`所更新)。如果你想直接检查表的磁盘文件,那么文件路径名应该有用。 - -要显示TOAST表使用的空间,我们可以使用一个类似下面这样的查询: - -``` -SELECT relname, relpages -FROM pg_class, - (SELECT reltoastrelid - FROM pg_class - WHERE relname = 'customer') AS ss -WHERE oid = ss.reltoastrelid OR - oid = (SELECT indexrelid - FROM pg_index - WHERE indrelid = ss.reltoastrelid) -ORDER BY relname; - - relname | relpages -----------------------+---------- - pg_toast_16806 | 0 - pg_toast_16806_index | 1 -``` - -你也可以很容易地显示索引的尺寸: - -``` -SELECT c2.relname, c2.relpages -FROM pg_class c, pg_class c2, pg_index i -WHERE c.relname = 'customer' AND - c.oid = i.indrelid AND - c2.oid = i.indexrelid -ORDER BY c2.relname; - - relname | relpages --------------------+---------- - customer_id_index | 26 -``` - -我们很容易用下面的信息找出最大的表和索引: - -``` -SELECT relname, relpages -FROM pg_class -ORDER BY relpages DESC; - - relname | relpages -----------------------+---------- - bigtable | 3290 - customer | 3144 -``` - -=== 磁盘满失败 - -一个数据库管理员最重要的磁盘监控任务就是确保磁盘不会写满。一个写满了的数据磁盘可能不会导致数据的崩溃,但它肯定会让系统变得不可用。如果保存 WAL 文件的磁盘变满,会发生数据库服务器致命错误并且可能发生关闭。 - -如果你不能通过删除一些其他的东西来释放一些磁盘空间,那么你可以通过使用表空间把一些数据库文件移动到其他文件系统上去。 - -.提示 -**** -有些文件系统在快满的时候性能会急剧恶化,因此不要等到磁盘完全满的时候才采取行动。 -**** - -如果你的系统支持每用户的磁盘份额,那么数据库将自然地受制于用户所处的服务器给他的份额限制。超过份额的负面影响和完全用光磁盘是完全一样的。 diff --git a/CN/modules/ROOT/pages/3.2.md b/CN/modules/ROOT/pages/3.2.md new file mode 100644 index 00000000..4ea48c6a --- /dev/null +++ b/CN/modules/ROOT/pages/3.2.md @@ -0,0 +1,1240 @@ +# 日常监控 +## 监控数据活动 +### 标准Unix工具 +在大部分 Unix 平台上,IvorySQL会修改由`ps`报告的命令标题,这样个体服务器进程可以被标识。一个显示样例 + +``` +$ ps auxww | grep ^postgres +postgres 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 postgres -i +postgres 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 postgres: background writer +postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer +postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: walwriter +postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: autovacuum launcher +postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres: stats collector +postgres 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 postgres: joe runbug 127.0.0.1 idle +postgres 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 postgres: tgl regression [local] SELECT waiting +postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl regression [local] idle in transaction +``` + +(`ps`的调用方式随不同的平台而变,但是显示的细节都差不多。这个例子来自于一个最近的 Linux 系统)。列在这里的第一个进程是主服务器进程。为它显示的命令参数是当它被启动时使用的那些。接下来的五个进程是由主进程自动启动的后台工作者进程(如果你已经设置系统为不启动统计收集器,“统计收集器”进程将不会出现;同样“自动清理发动”进程也可以被禁用)。剩余的每一个进程都是一个处理一个客户端连接的服务器进程。每个这种进程都会把它的命令行显示设置为这种形式 + +``` +postgres: user database host activity +``` + +在该客户端连接的生命期中,用户、数据库以及(客户端)主机项保持不变,但是活动指示器会改变。活动可以是`闲置`(即等待一个客户端命令)、`在事务中闲置`(在一个`BEGIN`块里等待客户端)或者一个命令类型名,例如`SELECT`。还有,如果服务器进程正在等待一个其它会话持有的锁, `等待中`会被追加到上述信息中。在上面的例子中,我们可以推断:进程 15606 正在等待进程 15610 完成其事务并且因此释放一些锁(进程 15610 必定是阻塞者,因为没有其他活动会话。在更复杂的情况中,可能需要查看pg_locks系统视图来决定谁阻塞了谁)。 + +如果配置了cluster_name,则集簇的名字 也将会显示在`ps`的输出中: + +``` +$ psql -c 'SHOW cluster_name' + cluster_name +-------------- + server1 +(1 row) + +$ ps aux|grep server1 +postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: server1: background writer +... +``` + +如果你已经关闭了update_process_title,那么活动指示器将不会被更新,进程标题仅在新进程被启动的时候设置一次。 在某些平台上这样做可以为每个命令节省可观的开销,但在其它平台上却不明显。 + +.提示 +**** +Solaris需要特别的处理。你必需使用`/usr/ucb/ps`而不是`/bin/ps`。 你还必需使用两个`w`标志,而不是一个。另外,你对`postgres`命令的最初调用必须用一个比服务器进程提供的短的`ps`状态显示。如果你没有满足全部三个要求,每个服务器进程的`ps`输出将是原始的`postgres`命令行。 +**** + +### 统计收集器 +IvorySQL的 _统计收集器_ 是一个支持收集和报告服务器活动信息的子系统。 目前,这个收集器可以对表和索引的访问计数,计数可以按磁盘块和个体行来进行。它还跟踪每个表中的总行数、每个表的清理和分析动作的信息。它也统计调用用户定义函数的次数以及在每次调用中花费的总时间。 + +IvorySQL也支持报告有关系统正在干什么的 动态信息,例如当前正在被其他服务器进程执行的命令以及系统中存在哪些其他连接。 这个功能是独立于收集器进程存在的。 + +#### 统计收集配置 +因为统计收集给查询执行增加了一些负荷,系统可以被配置为收集或不收集信息。这由配置参数控制,它们通常在`postgresql.conf`中设置。 + +参数track_activities允许监控当前被任意服务器进程执行的命令。 + +参数track_counts控制是否收集关于表和索引访问的统计信息。 + +参数track_functions启用对用户定义函数使用的跟踪。 + +参数track_io_timing启用对块读写次数的监控。 + +通常这些参数被设置在`postgresql.conf`中,这样它们会应用于所有服务器进程,但是可以在单个会话中使用SET命令打开或关闭它们(为了阻止普通用户对管理员隐藏他们的活动,只有超级用户被允许使用`SET`来改变这些参数)。 + +统计收集器通过临时文件将收集到的信息传送给其他IvorySQL进程。这些文件被存储在名字由stats_temp_directory参数指定的目录中,默认是`pg_stat_tmp`。为了得到更好的性能,`stats_temp_directory`可以被指向一个基于 RAM 的文件系统来降低物理 I/O 需求。当服务器被干净地关闭时,一份统计数据的永久拷贝被存储在`pg_stat`子目录中,这样在服务器重启后统计信息能被保持。当在服务器启动时执行恢复时(例如立即关闭、服务器崩溃以及时间点恢复之后),所有统计计数器会被重置。 + +#### 查看统计信息 +表 1 中列出了一些预定义视图 可以用来显示系统的当前状态。 表 2 中列出了另一些视图可以 显示统计收集的结果。你也可以使用底层统计函数来建立自定义的视图。 + +在使用统计信息监控收集到的数据时,你必须了解这些信息并非是实时更新的。每个独立的服务器进程只在进入闲置状态之前才向收集器传送新的统计计数;因此正在进行的查询或事务并不影响显示出来的总数。同样,收集器本身也最多每`PGSTAT_STAT_INTERVAL`毫秒(缺省为 500ms,除非在编译服务器的时候修改过)发送一 次新的报告。因此显示的信息总是落后于实际活动。但是由`track_activities`收集的当前查询信息总是最新的。 + +另一个重点是当一个服务器进程被要求显示任何这些统计信息时,它首先取得收集器进程最近发出的报告并且接着为所有统计视图和函数使用这个快照,直到它的当前事务的结尾。因此只要你继续当前事务,统计数据将会一直显示静态信息。相似地,当任何关于所有会话的当前查询的信息在一个事务中第一次被请求时,这样的信息将被收集。并且在整个事务期间将显示相同的信息。这是一种特性而非缺陷,因为它允许你在该统计信息上执行多个查询并且关联结果而不用担心那些数字会在你不知情的情况下改变。但是如果你希望用每个查询都看到新结果,要确保在任何事务块之外做那些查询。或者,你可以调用`pg_stat_clear_snapshot`(),那将丢弃当前事务的统计快照(如果有)。下一次对统计性信息的使用将导致获取一个新的快照。 + +一个事务也可以在视图`pg_stat_xact_all_tables`、`pg_stat_xact_sys_tables`、`pg_stat_xact_user_tables`和`pg_stat_xact_user_functions`中看到它自己的统计信息(还没有被传送给收集器)。这些数字并不像上面所述的那样行动,相反它们在事务期间持续被更新。 + +表 1中显示的动态统计视图中的一些信息是有安全限制的。 普通用户只能看到关于他们自己的会话的所有信息(属于他们是成员的角色的会话)。 在关于其他会话的行中,许多列将为空。 但是,请注意,一个会话的存在和它的一般属性,例如会话用户和数据库,对所有用户都是可见的。 超级用户和内置角色`pg_read_all_stats`的成员可以看到所有会话的所有信息。 + +**表1.动态统计视图** +| 视图名称 | 描述 | +| --- | --- | +| `pg_stat_activity` | 每个服务器进程一行,显示与那个进程的当前活动相关的信息,例如状态和当前查询。 | +| `pg_stat_replication` | 每一个 WAL 发送进程一行,显示有关到该发送进程连接的后备服务器的复制的统计信息。 | +| `pg_stat_wal_receiver` | 只有一行,显示来自 WAL 接收器所连接服务器的有关该接收器的统计信息。 | +| `pg_stat_subscription` | 每个订阅至少一行,显示有关该订阅的工作者的信息。 | +| `pg_stat_ssl` | 每个连接(常规的或者复制)一行,显示在这个连接上使用的SSL的信息。 | +| `pg_stat_gssapi` | 每个连接(常规和复制)有一行,显示关于GSSAPI验证和加密的信息。 | +| `pg_stat_progress_analyze` | 每个运行`ANALYZE`的后端(包括自动清理工作者进程)的行,显示当前进度。 | +| `pg_stat_progress_create_index` | 每个后台运行`CREATE INDEX`或`REINDEX`的后端都有一行,显示当前的进度。 | +| `pg_stat_progress_vacuum` | 每个运行着`VACUUM`的后端(包括autovacuum工作者进程)一行,显示当前的进度。 | +| `pg_stat_progress_cluster` | 每个运行着`CLUSTER`或`VACUUM FULL`的后端一行,显示当前进度。 | +| `pg_stat_progress_basebackup` | 每一个WAL发送者进程的行显示一个基础备份,显示当前进度。 | + + +**表2.已收集统计信息的视图** +| 视图名称 | 描述 | +| --- | --- | +| `pg_stat_archiver` | 只有一行,显示有关 WAL 归档进程活动的统计信息。 | +| `pg_stat_bgwriter` | 只有一行,显示有关后台写进程的活动的统计信息。 | +| `pg_stat_database` | 每个数据库一行,显示数据库范围的统计信息。 | +| `pg_stat_database_conflicts` | 每个数据库一行,显示数据库范围的统计信息, 这些信息的内容是关于由于与后备服务器的恢复过程 发生冲突而被取消的查询。 | +| `pg_stat_all_tables` | 当前数据库中每个表一行,显示有关访问指定表的统计信息。 | +| `pg_stat_sys_tables` | 和`pg_stat_all_tables`一样,但只显示系统表。 | +| `pg_stat_user_tables` | 和`pg_stat_all_tables`一样,但只显示用户表。 | +| `pg_stat_xact_all_tables` | 和`pg_stat_all_tables`相似,但计数动作只在当前事务内发生,用于生存和死亡行数量的列以及清理和分析动作在此视图中不出现。 | +| `pg_stat_xact_sys_tables` | 和`pg_stat_xact_all_tables`一样,但只显示系统表。 | +| `pg_stat_xact_user_tables` | 和`pg_stat_xact_all_tables`一样,但只显示用户表。 | +| `pg_stat_all_indexes` | 当前数据库中的每个索引一行,显示:表OID、索引OID、模式名、表名、索引名、 使用了该索引的索引扫描总数、索引扫描返回的索引记录数、使用该索引的简 单索引扫描抓取的活表(livetable)中数据行数。 当前数据库中的每个索引一行,显示与访问指定索引有关的统计信息。 | +| `pg_stat_sys_indexes` | 和`pg_stat_all_indexes`一样,但只显示系统表上的索引。 | +| `pg_stat_user_indexes` | 和`pg_stat_all_indexes`一样,但只显示用户表上的索引。 | +| `pg_statio_all_tables` | 当前数据库中每个表一行(包括TOAST表),显示:表OID、模式名、表名、 从该表中读取的磁盘块总数、缓冲区命中次数、该表上所有索引的磁盘块读取总数、 该表上所有索引的缓冲区命中总数、在该表的辅助TOAST表(如果存在)上的磁盘块读取总数、 在该表的辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表的索引的磁盘块读 取总数、TOAST表的索引的缓冲区命中总数。 当前数据库中的每个表一行,显示有关在指定表上 I/O 的统计信息。 | +| `pg_statio_sys_tables` | 和`pg_statio_all_tables`一样,但只显示系统表。 | +| `pg_statio_user_tables` | 和`pg_statio_all_tables`一样,但只显示用户表。 | +| `pg_statio_all_indexes` | 当前数据库中每个索引一行,显示:表OID、索引OID、模式名、 表名、索引名、该索引的磁盘块读取总数、该索引的缓冲区命中总数。 当前数据库中的每个索引一行,显示与指定索引上的 I/O 有关的统计信息。 | +| `pg_statio_sys_indexes` | 和`pg_statio_all_indexes`一样,但只显示系统表上的索引。 | +| `pg_statio_user_indexes` | 和`pg_statio_all_indexes`一样,但只显示用户表上的索引。 | +| `pg_statio_all_sequences` | 当前数据库中每个序列对象一行,显示:序列OID、模式名、序列名、序列的磁盘读取总数、序列的缓冲区命中总数。 当前数据库中的每个序列一行,显示与指定序列上的 I/O 有关的统计信息。 | +| `pg_statio_sys_sequences` | 和`pg_statio_all_sequences`一样,但只显示系统序列(目前没有定义系统序列,因此这个视图总是为空)。 | +| `pg_statio_user_sequences` | 和`pg_statio_all_sequences`一样,但只显示用户序列。 | +| `pg_stat_user_functions` | 对于所有跟踪功能,函数的OID,模式,名称,数量 通话总时间,和自我的时间。自我时间是 在函数本身所花费的时间量,总时间包括 它调用函数所花费的时间。时间值以毫秒为单位。 每一个被跟踪的函数一行,显示与执行该函数有关的统计信息。 | +| `pg_stat_xact_user_functions` | 和`pg_stat_user_functions`相似,但是只统计在当前事务期间的调用 | +| `pg_stat_slru` | 每个SLRU一行, 显示操作的统计信息。 | + + +针对每个索引的统计信息对于判断哪个索引正被使用以及它们的效果特别有用。 + +`pg_statio_`系列视图主要用于判断缓冲区的效果。当实际磁盘读取数远小于缓冲区命中时,这个缓冲能满足大部分读请求而无需进行内核调用。但是,这些统计信息并没有给出所有的事情:由于IvorySQL处理磁盘 I/O 的方式,不在IvorySQL缓冲区中的数据库仍然驻留在内核的 I/O 缓存中,并且因此可以被再次读取而不需要物理磁盘读取。我们建议希望了解IvorySQL I/O 行为更多细节的用户将IvorySQL统计收集器和操作系统中允许观察内核处理 I/O 的工具一起使用。 + +### `pg_stat_activity` +`pg_stat_activity`视图每个服务器进程将有一行,显示与该进程当前活动相关的信息。 + +**表3.`pg_stat_activity` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `datid` | `oid` | 这个后端连接到的数据库的OID | +| `datname` | `name` | 这个后端连接到的数据库的名称 | +| `pid` | `integer` | 这个后端的进程 ID | +| `leader_pid` | `integer` | 并行组组长的进程ID,如果该进程是并行查询工作者。如果该进程是一个并行组的组长或不参与并行查询,则为`NULL`。 | +| `usesysid` | `oid` | 登录到这个后端的用户的 OID | +| `usename` | `name` | 登录到这个后端的用户的 名称 | +| `application_name` | `text` | 连接到这个后端的应用的名称 | +| `client_addr` | `inet` | 连接到这个后端的客户端的 IP 地址。如果这个字段为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。 | +| `client_hostname` | `text` | 已连接的客户端的主机名,由 `client_addr` 的反向 DNS 查找报告。 这个字段将只对 IP 连接非空,并且只有log_hostname被启用时才会非空。 | +| `client_port` | `integer` | 客户端用于与此后端通信的TCP端口号,如果使用Unix套接字,则为`-1`。如果该字段为空,它表示这是一个内部服务器进程。 | +| `backend_start` | `timestamp with time zone` | 这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。 | +| `xact_start` | `timestamp with time zone` | 这个进程的当前事务被启动的时间,如果没有活动事务则为空。 如果当前查询是它的第一个事务,这一列等于 `query_start` 列。 | +| `query_start` | `timestamp with time zone` | 当前活动查询被开始的时间,如果 `state` 不是 `active`,则为上一个查询开始的时间 | +| `state_change` | `timestamp with time zone` | `state` 上一次被改变的时间 | +| `wait_event_type` | `text` | 后端等待的事件类型,如果有的话;否则NULL。 | +| `wait_event` | `text` | 如果后端当前正在等待,则等待事件名称,否则为NULL。 | +| `state` | `text` | 这个后端的当前总体状态。可能的值为:`active`: 后端正在执行一个查询。`idle`: 后端正在等待一个新的客户端命令。`idle in transaction`: 后端在一个事务中,但是当前没有正在执行一个查询。`idle in transaction (aborted)`: 这个状态与 `idle in transaction` 相似,除了在该事务中的一个语句导致了一个错误。`fastpath function call`: 后端正在执行一个 fast-path 函数。`disabled`: 如果在这个后端中track_activities被禁用,则报告这个状态。 | +| `backend_xid` | `xid` | 这个后端的顶层事务标识符,如果存在。 | +| `backend_xmin` | `xid` | 当前后端的 `xmin` 范围。 | +| `query` | `text` | 这个后端最近查询的文本。如果 `state` 为 `active`,这个字段显示当前正在执行的查询。 在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至1024个字节,这个值可以通过参数track_activity_query_size更改。 | +| `backend_type` | `text` | 当前后端的类型。可能的类型为 `autovacuum launcher`, `autovacuum worker`, `logical replication launcher`, `logical replication worker`, `parallel worker`, `background writer`, `client backend`, `checkpointer`, `startup`, `walreceiver`, `walsender` and `walwriter`. 除此以外,由扩展注册的后台Worker可能有额外的类型。 | + + +`wait_event`和`state`列是独立的。如果一个后端处于`active`状态,它可能是也可能不是某个事件上的`waiting`。如果状态是`active`并且`wait_event`为非空,它意味着一个查询正在被执行,但是它被阻塞在系统中某处。 + +**表4.等待事件类型** +| 等待事件类型 | 描述 | +| --- | --- | +| `Activity` | 服务器进程空闲。此事件类型表示在其主处理循环中等待活动的进程。 `wait_event`将识别特定的等待点。 | +| `BufferPin` | 服务器进程正在等待对数据缓冲的独占访问。 如果另一个进程持有一个打开的游标,该游标最后一次从相关缓冲区读取数据,则缓冲区销等待可能是漫长的。 | +| `Client` | 服务器进程正在等待连接到用户应用程序的套接字上的活动。 因此,服务器预计发生一些独立于其内部进程的事情。`wait_event`将识别特定的等待点。 | +| `Extension` | 服务器进程正在等待扩展模块定义的某个条件。 | +| `IO` | 服务器进程正在等待一个I/O操作完成。`wait_event`将识别特定的等待点。 | +| `IPC` | 服务器进程正在等待与另一个服务器进程进行交互。`wait_event`将识别特定的等待点。 | +| `Lock` | 服务器进程正在等待一个重量级锁。重量级锁,也称为锁管理器锁或简单锁,主要保护表等SQL可见对象。 然而,它们也用于确保某些内部操作的互斥,例如关系扩展。`wait_event`将识别等待的锁的类型。 | +| `LWLock` | 服务器进程正在等待一个轻量级锁。大多数这样的锁保护共享内存中的特定数据结构。 `wait_event`将包含标识轻量级锁用途的名称。 (有些锁有特定的名称;其他锁是一组锁的一部分,每个锁具有类似的目的。) | +| `Timeout` | 服务器进程正在等待超时过期。`wait_event`将识别特定的等待点。 | + + +**表5.`Activity`类型的等待事件** +| `Activity` 等待事件 | 描述 | +| --- | --- | +| `ArchiverMain` | 在归档进程的主循环中等待。 | +| `AutoVacuumMain` | 在自动清理启动过程的主循环中等待。 | +| `BgWriterHibernate` | 在后台写进程中等待,休眠状态。 | +| `BgWriterMain` | 在后台写进程主循环中等待。 | +| `CheckpointerMain` | 在校验指针进程的主循环中等待。 | +| `LogicalApplyMain` | 在逻辑复制应用进程的主循环中等待。 | +| `LogicalLauncherMain` | 在逻辑复制启动器进程的主循环中等待。 | +| `PgStatMain` | 在统计收集器进程的主循环中等待。 | +| `RecoveryWalStream` | 流恢复期间,在启动进程主循环等待WAL到达。 | +| `SysLoggerMain` | 在syslogger进程的主循环中等待。 | +| `WalReceiverMain` | 在WAL接收器进程的主循环中等待。 | +| `WalSenderMain` | 在WAL发送者进程的主循环中等待。 | +| `WalWriterMain` | 在WAL写入进程的主循环中等待。 | + + +**表6.`BufferPin`类型的等待事件** +| `BufferPin` 等待事件 | 描述 | +| --- | --- | +| `BufferPin` | 等待获得缓冲区上的独占销。 | + + +**表7.`Client`类型的等待事件** +| `Client` 等待事件 | 描述 | +| --- | --- | +| `ClientRead` | 等待从客户端读取数据。 | +| `ClientWrite` | 等待写入数据到客户端。 | +| `GSSOpenServer` | 在建立GSSAPI会话时等待从客户端读取数据。 | +| `LibPQWalReceiverConnect` | 在WAL接收器等待与远程服务器建立连接。 | +| `LibPQWalReceiverReceive` | 在WAL接收器中等待从远程服务器接收数据。 | +| `SSLOpenServer` | 在尝试连接时等待SSL。 | +| `WalReceiverWaitStart` | 等待启动进程发送用于流复制的初始数据。 | +| `WalSenderWaitForWAL` | 在WAL发送器进程中等待WAL被刷新。 | +| `WalSenderWriteData` | 在WAL发送器进程中处理WAL接收器的回复时,等待任何活动。 | + + +**表8.`Extension`类型的等待事件** +| `Extension` 等待事件 | 描述 | +| --- | --- | +| `Extension` | 在扩展中等待。 | + + +**表9.`IO`类型的等待事件** +| `IO` 等待事件 | 描述 | +| --- | --- | +| `BufFileRead` | 等待从缓冲文件中读取。 | +| `BufFileWrite` | 等待对缓冲文件的写入。 | +| `ControlFileRead` | 等待读取`pg_control`文件。 | +| `ControlFileSync` | 等待`pg_control`文件到达持久存储。 | +| `ControlFileSyncUpdate` | 等待更新`pg_control`文件以达到持久存储。 | +| `ControlFileWrite` | 等待写入`pg_control`文件。 | +| `ControlFileWriteUpdate` | 等待写入更新`pg_control`文件。 | +| `CopyFileRead` | 在文件复制操作期间等待读取。 | +| `CopyFileWrite` | 在文件拷贝操作期间等待写入。 | +| `DSMFillZeroWrite` | 等待用零填充动态共享内存备份(backing)文件。 | +| `DataFileExtend` | 等待关系数据文件被扩展。 | +| `DataFileFlush` | 等待关系数据文件达到持久存储。 | +| `DataFileImmediateSync` | 等待关系数据文件到持久存储的立即同步。 | +| `DataFilePrefetch` | 等待关系数据文件的异步预取。 | +| `DataFileRead` | 等待对关系数据文件的读取。 | +| `DataFileSync` | 等待对关系数据文件的更改达到持久存储。 | +| `DataFileTruncate` | 等待关系数据文件被截断。 | +| `DataFileWrite` | 等待对关系数据文件的写入。 | +| `LockFileAddToDataDirRead` | 在向数据目录锁文件中添加一行时等待读取。 | +| `LockFileAddToDataDirSync` | 等待数据到达持久存储,同时向数据目录锁文件添加一行。 | +| `LockFileAddToDataDirWrite` | 在向数据目录锁文件中添加一行时等待写操作。 | +| `LockFileCreateRead` | 创建数据目录锁文件时等待读取。 | +| `LockFileCreateSync` | 在创建数据目录锁文件时等待数据到达持久存储。 | +| `LockFileCreateWrite` | 在创建数据目录锁文件时等待写操作。 | +| `LockFileReCheckDataDirRead` | 在重新检查数据目录锁文件期间等待读取。 | +| `LogicalRewriteCheckpointSync` | 等待逻辑重写映射到在检查点到达持久存储。 | +| `LogicalRewriteMappingSync` | 在逻辑重写期间等待映射数据到达持久存储 | +| `LogicalRewriteMappingWrite` | 在逻辑重写期间等待映射数据的写入。 | +| `LogicalRewriteSync` | 等待逻辑重写映射到达持久存储。 | +| `LogicalRewriteTruncate` | 等待在逻辑重写期间截断映射数据。 | +| `LogicalRewriteWrite` | 等待逻辑重写映射的写入。 | +| `RelationMapRead` | 等待关系映射文件的读取。 | +| `RelationMapSync` | 等待关系映射文件到达持久存储。 | +| `RelationMapWrite` | 等待对关系映射文件的写入。 | +| `ReorderBufferRead` | 在重新排序缓冲区管理期间等待读取。 | +| `ReorderBufferWrite` | 在重新排序缓冲区管理期间等待写操作。 | +| `ReorderLogicalMappingRead` | 在重新排序缓冲区管理期间等待读取逻辑映射。 | +| `ReplicationSlotRead` | 等待从复制槽位控制文件读取。 | +| `ReplicationSlotRestoreSync` | 等待复制槽控制文件到达持久存储,同时将其恢复到内存中。 | +| `ReplicationSlotSync` | 等待复制槽控制文件到达持久存储。 | +| `ReplicationSlotWrite` | 等待对复制槽控制文件的写入。 | +| `SLRUFlushSync` | 在检查点或数据库关闭期间等待SLRU数据到达持久存储。 | +| `SLRURead` | 等待读取SLRU页面。 | +| `SLRUSync` | 在写页面后等待SLRU数据到达持久存储。 | +| `SLRUWrite` | 等待SLRU页面的写入。 | +| `SnapbuildRead` | 等待读取序列化的历史目录快照。 | +| `SnapbuildSync` | 等待序列化历史目录快照到达持久存储。 | +| `SnapbuildWrite` | 等待串行历史目录快照的写入。 | +| `TimelineHistoryFileSync` | 等待通过流复制接收的时间线历史文件到达持久存储。 | +| `TimelineHistoryFileWrite` | 等待通过流复制接收的时间线历史文件的写入。 | +| `TimelineHistoryRead` | 等待读取时间线历史文件。 | +| `TimelineHistorySync` | 等待新创建的时间线历史文件到达持久存储。 | +| `TimelineHistoryWrite` | 等待写入新创建的时间线历史文件。 | +| `TwophaseFileRead` | 等待读取两阶段状态文件。 | +| `TwophaseFileSync` | 等待两阶段状态文件到达持久存储。 | +| `TwophaseFileWrite` | 等待对两阶段状态文件的写入。 | +| `WALBootstrapSync` | 在引导过程中等待WAL达到持久存储。 | +| `WALBootstrapWrite` | 在引导过程中等待WAL页面的写入。 | +| `WALCopyRead` | 通过复制一个已有WAL段来创建一个新的WAL段时等待读取。 | +| `WALCopySync` | 等待通过复制一个已有WAL段到持久存储来创建一个新的WAL段。 | +| `WALCopyWrite` | 通过复制一个已有WAL段来创建一个新的WAL段时等待写入。 | +| `WALInitSync` | 等待一个新初始化的WAL文件到持久存储。 | +| `WALInitWrite` | 在初始化一个新的WAL文件时等待写入。 | +| `WALRead` | 等待WAL文件的读取。 | +| `WALSenderTimelineHistoryRead` | 在walsender时间线命令期间等待从时间线历史文件读取。 | +| `WALSync` | 等待WAL文件到达持久存储。 | +| `WALSyncMethodAssign` | 等待数据到达持久存储,同时分配一个新的WAL同步方法。 | +| `WALWrite` | 等待写入WAL文件。 | + + +**表10.`IPC`类型的等待事件** +| `IPC` 等待事件 | 描述 | +| --- | --- | +| `BackupWaitWalArchive` | 等待备份所需的WAL文件成功存档。 | +| `BgWorkerShutdown` | 等待后台工作者关闭。 | +| `BgWorkerStartup` | 等待后台工作者启动。 | +| `BtreePage` | 正等待继续并行B-树扫描所需的页号变得可用。 | +| `CheckpointDone` | 等待检查点完成。 | +| `CheckpointStart` | 等待检查点开始。 | +| `ExecuteGather` | 在执行`Gather` 计划节点时,等待子进程的活动。 | +| `HashBatchAllocate` | 等待一个选定的并行哈希参与者分配哈希表。 | +| `HashBatchElect` | 等待选择一个并行哈希参与者来分配哈希表。 | +| `HashBatchLoad` | 等待其他并行哈希参与者完成哈希表的加载。 | +| `HashBuildAllocate` | 等待一个选定的并行哈希参与者分配初始哈希表。 | +| `HashBuildElect` | 等待选择一个并行哈希参与者来分配初始哈希表。 | +| `HashBuildHashInner` | 等待其他并行哈希参与者完成内部关系的散列。 | +| `HashBuildHashOuter` | 等待其他Parallel 哈希参与者完成对外部关系的分区。 | +| `HashGrowBatchesAllocate` | 等待选定的并行哈希参与者分配更多批处理。 | +| `HashGrowBatchesDecide` | 等待选择一个并行哈希参与者来决定未来的批处理增长。 | +| `HashGrowBatchesElect` | 等待选择一个Parallel 哈希参与者来分配更多批处理。 | +| `HashGrowBatchesFinish` | 等待一个选定的并行哈希参与者决定未来的批量增长。 | +| `HashGrowBatchesRepartition` | 等待一个选定的并行哈希参与者决定未来的批处理增长。 | +| `HashGrowBucketsAllocate` | 等待选定的并行哈希参与者完成更多bucket的分配。 | +| `HashGrowBucketsElect` | 等待选择一个并行哈希参与者来分配更多的buckets。 | +| `HashGrowBucketsReinsert` | 等待其他Parallel 哈希参与者完成将元组插入到新buckets中。 | +| `LogicalSyncData` | 等待逻辑复制远程服务器发送用于初始表同步的数据。 | +| `LogicalSyncStateChange` | 等待逻辑复制远程服务器更改状态。 | +| `MessageQueueInternal` | 等待另一个进程附加到共享消息队列。 | +| `MessageQueuePutMessage` | 等待将协议消息写入共享消息队列。 | +| `MessageQueueReceive` | 等待从共享消息队列接收字节。 | +| `MessageQueueSend` | 等待将字节发送到共享消息队列。 | +| `ParallelBitmapScan` | 等待并行位图扫描被初始化。 | +| `ParallelCreateIndexScan` | 等待并行`CREATE INDEX` 工作者完成堆扫描。 | +| `ParallelFinish` | 等待并行工作人员完成计算。 | +| `ProcArrayGroupUpdate` | 等待组领导在并行操作结束时清除事务ID。 | +| `ProcSignalBarrier` | 等待屏障事件被所有后端处理。 | +| `Promote` | 等待备用系统提升。 | +| `RecoveryConflictSnapshot` | 等待vacuum清理的恢复冲突解决。 | +| `RecoveryConflictTablespace` | 等待恢复冲突解决删除表空间。 | +| `RecoveryPause` | 等待恢复继续进行。 | +| `ReplicationOriginDrop` | 等待复制源变为非活动状态,以便可以删除它。 | +| `ReplicationSlotDrop` | 等待复制槽变为非活动状态,以便可以删除它。 | +| `SafeSnapshot` | 等待获取`READ ONLY DEFERRABLE`事务的有效快照。 | +| `SyncRep` | 在同步复制期间等待远程服务器的确认。 | +| `XactGroupUpdate` | 等待分组组长在并行操作结束时更新事务状态。 | + + +**表11.`Lock`类型的等待事件** +| `Lock` 等待事件 | 描述 | +| --- | --- | +| `advisory` | 等待获得一个建议用户锁。 | +| `extend` | 等待扩展一个关系。 | +| `frozenid` | 等待升级 `pg_database`.`datfrozenxid` 和 `pg_database`.`datminmxid`. | +| `object` | 等待获取非关系数据库对象上的锁。 | +| `page` | 等待获取一个关系页面上的锁。 | +| `relation` | 等待获得一个关系的锁。 | +| `spectoken` | 等待获取推测的插入锁。 | +| `transactionid` | 等待事务完成。 | +| `tuple` | 等待获取元组上的锁。 | +| `userlock` | 等待获取用户锁。 | +| `virtualxid` | 等待获取虚拟事务ID锁。 | + + +**表12.`LWLock`类型的等待事件** +| `LWLock` 等待事件 | 描述 | +| --- | --- | +| `AddinShmemInit` | 等待管理共享内存中的扩展空间分配。 | +| `AutoFile` | 等待更新`postgresql.auto.conf`文件。 | +| `Autovacuum` | 等待读取或更新自动清理工作者的当前状态。 | +| `AutovacuumSchedule` | 等待确保选择为自动清理的表仍然需要清理。 | +| `BackgroundWorker` | 等待读取或更新后台工作者状态。 | +| `BtreeVacuum` | 等待读取或更新b-树索引的清理相关信息。 | +| `BufferContent` | 等待访问内存中的数据页。 | +| `BufferIO` | 等待数据页上的I/O。 | +| `BufferMapping` | 等待将数据块与缓冲池中的缓冲区关联。 | +| `Checkpoint` | 等待开始一个检查点。 | +| `CheckpointerComm` | 等待管理fsync请求。 | +| `CommitTs` | 等待读取或更新事务提交时间戳的最后一个值集。 | +| `CommitTsBuffer` | 在提交时间戳SLRU缓冲区上等待I/O。 | +| `CommitTsSLRU` | 等待访问提交时间戳SLRU缓存。 | +| `ControlFile` | 等待读取或更新`pg_control`文件或创建一个新的WAL文件。 | +| `DynamicSharedMemoryControl` | 等待读取或更新动态共享内存分配信息。 | +| `LockFastPath` | 等待读取或更新进程的快速路径锁信息。 | +| `LockManager` | 等待读取或更新关于“heavyweight”锁。 | +| `LogicalRepWorker` | 等待读取或更新逻辑复制工作器的状态。 | +| `MultiXactGen` | 等待读取或更新共享的multixact状态。 | +| `MultiXactMemberBuffer` | 在multixact成员SLRU缓冲区上等待I/O。 | +| `MultiXactMemberSLRU` | 等待访问multixact成员SLRU缓存。 | +| `MultiXactOffsetBuffer` | 在multixact 偏移 SLRU缓冲区上等待I/O。 | +| `MultiXactOffsetSLRU` | 等待访问multixact 偏移 SLRU缓存。 | +| `MultiXactTruncation` | 等待读取或截断multixact信息。 | +| `NotifyBuffer` | 在`NOTIFY` 消息 SLRU缓冲区上等待I/O。 | +| `NotifyQueue` | 等待读取或更新`NOTIFY` 消息。 | +| `NotifyQueueTail` | 等待`NOTIFY`消息存储上的更新限制。 | +| `NotifySLRU` | 等待访问`NOTIFY`消息SLRU缓存。 | +| `OidGen` | 等待分配一个新的OID。 | +| `OldSnapshotTimeMap` | 等待读取或更新旧的快照控制信息。 | +| `ParallelAppend` | 在并行附加计划执行期间等待选择下一个子计划。 | +| `ParallelHashJoin` | 在并行哈希连接计划执行期间等待同步工作器。 | +| `ParallelQueryDSA` | 等待并行查询动态共享内存分配。 | +| `PerSessionDSA` | 等待并行查询动态共享内存分配。 | +| `PerSessionRecordType` | 等待访问有关复合类型的并行查询信息。 | +| `PerSessionRecordTypmod` | 等待访问有关标识匿名记录类型的类型修饰符的并行查询信息。 | +| `PerXactPredicateList` | 在并行查询期间等待访问当前可序列化事务持有的谓词锁列表。 | +| `PredicateLockManager` | 等待访问可序列化事务使用的谓词锁信息。 | +| `ProcArray` | 等待访问每个进程共享的数据结构(通常情况,是获取快照或报告会话的事务ID)。 | +| `RelationMapping` | 等待读取或更新`pg_filenode.map`文件(用于跟踪某些系统目录的文件节点分配)。 | +| `RelCacheInit` | 等待读取或更新`pg_internal.init`关系缓存初始化文件。 | +| `ReplicationOrigin` | 等待创建、删除或使用复制源。 | +| `ReplicationOriginState` | 等待读取或更新一个复制源的进度。 | +| `ReplicationSlotAllocation` | 等待分配或释放复制槽。 | +| `ReplicationSlotControl` | 等待读取或更新复制槽状态。 | +| `ReplicationSlotIO` | 在复制槽位上等待I/O。 | +| `SerialBuffer` | 在可串行事务冲突的SLRU缓冲区上等待I/O。 | +| `SerializableFinishedList` | 等待访问已完成的可序列化事务列表。 | +| `SerializablePredicateList` | 等待访问可序列化事务持有的谓词锁列表。 | +| `SerializableXactHash` | 等待读取或更新关于可序列化事务的信息。 | +| `SerialSLRU` | 等待访问可序列化事务冲突SLRU缓存。 | +| `SharedTidBitmap` | 在并行位图索引扫描期间等待访问共享的TID位图。 | +| `SharedTupleStore` | 在并行查询期间等待访问共享元组存储。 | +| `ShmemIndex` | 等待在共享内存中找到或分配空间。 | +| `SInvalRead` | 等待从共享目录失效队列中检索消息。 | +| `SInvalWrite` | 等待向共享编目失效队列添加消息。 | +| `SubtransBuffer` | 在子事务SLRU缓冲区上等待I/O。 | +| `SubtransSLRU` | 等待访问子事务SLRU缓存。 | +| `SyncRep` | 等待读取或更新有关同步复制状态的信息。 | +| `SyncScan` | 等待选择同步表扫描的起始位置。 | +| `TablespaceCreate` | 等待创建或删除表空间。 | +| `TwoPhaseState` | 等待读取或更新已准备事务的状态。 | +| `WALBufMapping` | 等待在WAL缓冲区中替换一个页面。 | +| `WALInsert` | 等待将WAL数据插入内存缓冲区。 | +| `WALWrite` | 等待WAL缓冲区写入磁盘。 | +| `WrapLimitsVacuum` | 等待更新事务id和multixact消费的限制。 | +| `XactBuffer` | 在事务状态的SLRU缓冲区上等待I/O。 | +| `XactSLRU` | 等待访问事务状态的SLRU缓存。 | +| `XactTruncation` | 等待执行`pg_xact_status`或更新它可用的最早的事务ID。 | +| `XidGen` | 等待分配新的事务ID。 | + + +**表13.`Timeout`类型的等待事件** +| `Timeout` 等待事件 | 描述 | +| --- | --- | +| `BaseBackupThrottle` | 当有限流活动时在基础备份期间等待。 | +| `PgSleep` | 由于调用`pg_sleep`或同类函数而等待。 | +| `RecoveryApplyDelay` | 由于延迟设置,在恢复期间等待应用WAL。 | +| `RecoveryRetrieveRetryInterval` | 当WAL数据无法从任何来源(`pg_wal`,存档或流)获得时,在恢复期间等待。 | +| `VacuumDelay` | 在一个基于代价的清理延迟点。 | + + +下面的例子展示了如何查看等待事件: + +``` +SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL; + pid | wait_event_type | wait_event +------+-----------------+------------ + 2540 | Lock | relation + 6644 | LWLock | ProcArray +(2 rows) +``` + +#### `pg_stat_replication` +`pg_stat_replication`视图将在每个WAL发送方进程中包含一行,显示关于复制到发送方连接的后备服务器的统计信息。 只有直接连接的备用设备被列出;没有关于下游后备服务器的信息。 + +**表14.`pg_stat_replication` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `pid` | `integer` | 一个 WAL 发送进程的进程 ID | +| `usesysid` | `oid` | 登录到这个 WAL 发送进程的用户的 OID | +| `usename` | `name` | 登录到这个 WAL 发送进程的用户的名称 | +| `application_name` | `text` | 连接到这个 WAL 发送进程的应用的名称 | +| `client_addr` | `inet` | 连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个Unix 套接字连接。 | +| `client_hostname` | `text` | 连接上的客户端的主机名,由一次对`client_addr`的逆向 DNS 查找报告。 这个域将只对 IP 连接非空,并且只有在 log_hostname被启用时非空。 | +| `client_port` | `integer` | 客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为`-1` | +| `backend_start` | `timestamp with time zone` | 这个进程开始的时间,即客户端是何时连接到这个WAL 发送进程的。 | +| `backend_xmin` | `xid` | 由hot_standby_feedback报告的这个后备机的`xmin`水平线。 | +| `state` | `text` | 当前的 WAL 发送进程状态。 可能的值是:`startup`: 这个WAL发送器正在启动。`catchup`: 这个WAL发送者连接的后备服务器正在赶上主服务器。`streaming`: 在其连接的后备服务器赶上主服务器之后,这个WAL发送方正在流化变化。`backup`: 这个WAL发送器正在发送一个备份。`stopping`: 这个WAL发送器正在停止。 | +| `sent_lsn` | `pg_lsn` | 在这个连接上发送的最后一个预写式日志的位置 | +| `write_lsn` | `pg_lsn` | 被这个后备服务器写入到磁盘的最后一个预写式日志的位置 | +| `flush_lsn` | `pg_lsn` | 被这个后备服务器刷入到磁盘的最后一个预写式日志的位置 | +| `replay_lsn` | `pg_lsn` | 被重放到这个后备服务器上的数据库中的最后一个预写式日志的位置 | +| `write_lag` | `interval` | 从本地刷新近期的WAL与接收到此后备服务器已写入WAL的通知(但尚未刷新或应用它)之间的时间经过。 如果将此服务器配置为同步后备服务器,则可以使用此参数来衡量在提交时`synchronous_commit`级别`remote_write`所导致的延迟。 | +| `flush_lag` | `interval` | 在本地刷写近期的WAL与接收到后备服务器已经写入并且刷写它(但还没有应用)的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时`synchronous_commit`的级别`on`所导致的延迟。 | +| `replay_lag` | `interval` | 在本地刷写近期的WAL与接收到后备服务器已经写入它、刷写它并且应用它的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时`synchronous_commit`的级别`remote_apply`所导致的延迟。 | +| `sync_priority` | `integer` | 在基于优先的同步复制中,这台后备服务器被选为同步后备的优先级。在基于规定数量的同步复制中,这个值没有效果。 | +| `sync_state` | `text` | 这一台后备服务器的同步状态。 可能的值是:`async`: 这台后备服务器是异步的。`potential`: 这台后备服务器现在是异步的,但可能在当前的同步后备失效时变成同步的。`sync`: 这台后备服务器是同步的。`quorum`: 这台后备服务器被当做规定数量后备服务器的候选。 | +| `reply_time` | `带时区的时间戳` | 从后备服务器收到的最后一条回复信息的发送时间 | + + +`pg_stat_replication`视图中报告的滞后时间近期的WAL被写入、刷写并且重放以及发送器知道这一切所花的时间的度量。如果远程服务器被配置为一台同步后备,这些时间表示由每一种同步提交级别所带来(或者是可能带来)的提交延迟。对于一台异步后备,`replay_lag`列是最近的事务变得对查询可见的延迟时间的近似值。如果后备服务器已经完全追上了发送服务器并且没有WAL活动,在短时间内将继续显示最近测到的滞后时间,再然后就会显示为NULL。 + +对于物理复制会自动测量滞后时间。逻辑解码插件可能会选择性地发出跟踪消息,如果它们没有这样做,跟踪机制将把滞后显示为NULL。 + +.注意 +**** +报告的滞后时间并非按照当前的重放速率该后备还有多久才能追上发送服务器的预测。在新的WAL被生成期间,这样一种系统将显示类似的时间,但是当发送器变为闲置时会显示不同的值。特别是当后备服务器完全追上时,`pg_stat_replication`显示的是写入、刷写及重放最近报告的WAL位置所花的时间而不是一些用户可能预期的零。这种做法与为近期的写事务测量同步提交和事务可见性延迟的目的一致。为了降低用户预期一种不同的滞后模型带来的混淆,在一个完全重放完的闲置系统上,lag列会在一段比较短的时间后回复成NULL。监控系统应该选择将这种情况表示为缺失数据、零或者继续显示最近的已知值。 +**** + +#### `pg_stat_wal_receiver` +`pg_stat_wal_receiver`事务只包含一行,它显示了从 WAL 接收器所连接的服务器得到的有关该接收器的统计信息。 + +**表15.`pg_stat_wal_receiver` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| pid | integer | WAL接收器进程的进程ID | +| status | text | WAL接收进程的活动状态 | +| receive_start_lsn | pg_lsn | WAL接收器启动时使用的第一个写前日志位置 | +| receive_start_tli | integer | WAL接收器启动时使用的第一个时间线数字 | +| written_lsn | pg_lsn | 已经接收并写入磁盘的最后一个预写式日志位置,但没有刷入。这不能用于数据完整性检查。 | +| flushed_lsn | pg_lsn | 已经接收并刷入到磁盘的最后一个预写式日志位置,该字段的初始值是启动WAL接收器时使用的第一个日志位置 | +| received_tli | integer | 接收并刷入到磁盘的最后一个预写式日志位置的时间线数字,该字段的初始值为启动WAL接收器时使用的第一个日志位置的时间线数字 | +| last_msg_send_time | timestamp with time zone | 从源头WAL发送器收到的最后一条信息的发送时间 | +| last_msg_receipt_time | timestamp with time zone | 从源头WAL发送器收到的最后一条信息的接收时间 | +| latest_end_lsn | pg_lsn | 向源头WAL发送器报告的最后的预写式日志位置 | +| latest_end_time | timestamp with time zone | 向源头WAL发送方报告的最后一次写前日志位置的时间 | +| slot_name | text | 这个WAL接收器使用的复制槽的名称 | +| sender_host | text | 这个WAL接收器连接到的IvorySQL实例的主机。这可以是主机名、IP地址,或者目录路径,如果连接是通过Unix套接字进行的。(路径的情况可以区分,因为它总是以/开头的绝对路径。) | +| sender_port | integer | 这个WAL接收器连接的IvorySQL实例的端口号。 | +| conninfo | text | 这个WAL接收器使用的连接字符串,对安全敏感的字段进行了模糊处理。 | + + +#### `pg_stat_subscription` +每一个订阅的主工作者都在`pg_stat_subscription`视图中有一行(如果工作者没有运行则PID为空),处理被订阅表的初始数据拷贝操作的工作者还会有额外的行。 + +**表16.`pg_stat_subscription` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| subid | oid | 订阅的OID | +| subname | name | 订阅的名称 | +| pid | integer | 订阅工作者进程的进程ID | +| relid | oid | 工作器正在同步的关系的OID;Null用于主应用工作器 | +| received_lsn | pg_lsn | 接收到的最后一个预写式日志位置,该字段的初始值为0 | +| last_msg_send_time | timestamp with time zone | 从WAL发送器收到的最后一条信息的发送时间 | +| last_msg_receipt_time | timestamp with time zone | 从WAL发送器收到的最后一条信息的接收时间 | +| latest_end_lsn | pg_lsn | 向WAL发送器报告的最后预写式日志位置 | +| latest_end_time | timestamp with time zone | 向WAL发送器报告的最后一次预写式日志位置的时间 | + + +#### `pg_stat_ssl` +`pg_stat_ssl`视图将为每一个后端或者 WAL 发送进程包含一行,用来显示这个连接上的 SSL 使用情况。 可以把它与`pg_stat_activity`或者`pg_stat_replication`通过`pid`列连接来得到更多有关该连接的细节。 + +**表17.`pg_stat_ssl` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| pid | integer | 后端或WAL发送器进程ID | +| ssl | boolean | 如果在此连接上使用SSL,则为真 | +| version | text | 使用SSL的版本,如果此连接上没有使用SSL则为NULL | +| cipher | text | 正在使用的SSL密码的名称,如果此连接上没有使用SSL则为NULL | +| bits | integer | 使用的加密算法中的位数,如果此连接上没有使用SSL则为NULL | +| compression | boolean | 如果使用SSL压缩则为真,否则为假,如果此连接未使用SSL则为NULL | +| client_dn | text | 区别名称(DN,Distinguished Name)字段与使用的客户端证书,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 如果DN字段长于NAMEDATALEN(标准构建中为64个字符),则该字段将被截断。 | +| client_serial | numeric | 客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。 | +| issuer_dn | text | 客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。该字段像client_dn一样被截断。 | + + +#### `pg_stat_gssapi` +`pg_stat_gssapi`视图将包含每一个后端一个行,显示该连接上的GSSAPI使用情况。 它可以加入到`pg_stat_activity`或`pg_stat_replication`上的`pid`列,获取更多关于连接的详细信息。 + +**表18.`pg_stat_gssapi` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `pid` | `integer` | 后端进程ID | +| `gss_authenticated` | `boolean` | 如果此连接使用了GSSAPI身份验证,则为True | +| `principal` | `text` | 用于验证此连接的主体,如果未使用GSSAPI对此连接进行身份验证,则为NULL。 如果主体长度超过`NAMEDATALEN`(标准构建中为64个字符),则该字段被截断。 | +| `encrypted` | `boolean` | 如果在此连接上使用了GSSAPI加密,则为真 | + + +#### `pg_stat_archiver` +`pg_stat_archiver`视图总是有一行,其中包含关于集群的存档进程的数据。 + +**表19.`pg_stat_archiver` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `archived_count` | `bigint` | 已成功存档的WAL文件数 | +| `last_archived_wal` | `text` | 最后一个成功存档的WAL文件的名称 | +| `last_archived_time` | `timestamp with time zone` | 最后一次成功存档操作的时间 | +| `failed_count` | `bigint` | 记录WAL文件归档失败次数 | +| `last_failed_wal` | `text` | 最后一次失败的存档操作的WAL文件的名称 | +| `last_failed_time` | `timestamp with time zone` | 上次存档操作失败的时间 | +| `stats_reset` | `timestamp with time zone` | 这些统计数据最后一次重置的时间 | + + +#### `pg_stat_bgwriter` +`pg_stat_bgwriter`视图始终只有一行,其中包含集群的全局数据。 + +**表20.`pg_stat_bgwriter` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `checkpoints_timed` | `bigint` | 已执行的预定检查点数 | +| `checkpoints_req` | `bigint` | 请求已执行的检查点数 | +| `checkpoint_write_time` | `double precision` | 检查点处理中将文件写入磁盘的部分所花费的总时间,以毫秒为单位 | +| `checkpoint_sync_time` | `double precision` | 检查点处理中将文件同步到磁盘的部分所花费的总时间,以毫秒为单位 | +| `buffers_checkpoint` | `bigint` | 检查点期间写入的缓冲区数 | +| `buffers_clean` | `bigint` | 后台写入器写入的缓冲区数 | +| `maxwritten_clean` | `bigint` | 后台写入器因为写入太多缓冲区而停止清理扫描的次数 | +| `buffers_backend` | `bigint` | 后端直接写入的缓冲区数 | +| `buffers_backend_fsync` | `bigint` | 后端必须执行自己的 `fsync` 调用的次数(通常后台写入器处理这些,即使后端执行自己的写入) | +| `buffers_alloc` | `bigint` | 分配的缓冲区数 | +| `stats_reset` | `timestamp with time zone` | 这些统计数据最后一次重置的时间 | + + +#### `pg_stat_database` +`pg_stat_database`视图将包含一行用于集群中的每个数据库,加一行用于共享对象,显示数据库范围的统计信息。 + +**表21. `pg_stat_database` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `datid` | `oid` | 该数据库的 OID,属于共享关系的对象为 0 | +| `datname` | `name` | 这个数据库的名称,或者共享对象为 `NULL` | +| `numbackends` | `integer` | 当前连接到此数据库的后端数,对于共享对象则为 `NULL`。这是该视图中唯一返回反映当前状态的值的列;所有其他列返回自上次重置以来累积的值 | +| `xact_commit` | `bigint` | 此数据库中已提交的事务数 | +| `xact_rollback` | `bigint` | 该数据库中已回滚的事务数 | +| `blks_read` | `bigint` | 在该数据库中读取的磁盘块数 | +| `blks_hit` | `bigint` | 在缓存中发现磁盘块的次数,因此读取不是必需的(这只包括在 IvorySQL 缓存中,而不是在操作系统的文件系统缓存中) | +| `tup_returned` | `bigint` | 这个数据库中查询返回的行数 | +| `tup_fetched` | `bigint` | 这个数据库中查询获取的行数 | +| `tup_inserted` | `bigint` | 查询在该数据库中插入的行数 | +| `tup_updated` | `bigint` | 这个数据库中查询更新的行数 | +| `tup_deleted` | `bigint` | 这个数据库中被查询删除的行数 | +| `conflicts` | `bigint` | 由于与此数据库中的恢复冲突而取消的查询数(冲突只发生在后备服务器上) | +| `temp_files` | `bigint` | 这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或散列),也不考虑 log_temp_files 设置 | +| `temp_bytes` | `bigint` | 这个数据库中的查询写入临时文件的数据总量。所有临时文件都将被计数,而不考虑临时文件为什么被创建,也不考虑 log_temp_files 设置 | +| `deadlocks` | `bigint` | 在此数据库中检测到的死锁数 | +| `checksum_failures` | `bigint` | 在此数据库(或共享对象)中检测到的数据页校验码失败数,如果没有启用数据校验码则为 NULL | +| `checksum_last_failure` | `timestamp with time zone` | 在此数据库(或共享对象)中检测到最后一个数据页校验码失败的时间,如果没有启用数据校验码则为 NULL | +| `blk_read_time` | `double precision` | 在这个数据库中通过后端读取数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) | +| `blk_write_time` | `double precision` | 在这个数据库中通过后端写数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) | +| `stats_reset` | `timestamp with time zone` | 这些统计数据最后一次重置的时间 | + + +#### `pg_stat_database_conflicts` +`pg_stat_database_conflicts`视图为每一个数据库包含一行, 用来显示数据库范围内由于与后备服务器上的恢复过程冲突而被取消的查询的统计信息。 这个视图将只包含后备服务器上的信息,因为冲突会不发生在主服务器上。 + +**表22.`pg_stat_database_conflicts` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `datid` | `oid` | 数据库的OID | +| `datname` | `name` | 数据库的名称 | +| `confl_tablespace` | `bigint` | 这个数据库中由于删除表空间而取消的查询的数量 | +| `confl_lock` | `bigint` | 此数据库中由于锁定超时而被取消的查询数 | +| `confl_snapshot` | `bigint` | 此数据库中由于旧快照而取消的查询数 | +| `confl_bufferpin` | `bigint` | 此数据库中由于固定缓冲区而被取消的查询数 | +| `confl_deadlock` | `bigint` | 此数据库中由于死锁而被取消的查询数 | + + +#### `pg_stat_all_tables` +`pg_stat_all_tables`视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。 `pg_stat_user_tables`和`pg_stat_sys_tables`视图包含相同的信息,但是被过滤得分别只显示用户和系统表。 + +**表23.`pg_stat_all_tables` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| relid | oid | 表的OID | +| schemaname | name | 该表所在的模式的名称 | +| relname | name | 这个表的名称 | +| seq_scan | bigint | 在此表上启动的顺序扫描数 | +| seq_tup_read | bigint | 连续扫描获取的实时行数 | +| idx_scan | bigint | 对这个表发起的索引扫描数 | +| idx_tup_fetch | bigint | 索引扫描获取的实时行数 | +| n_tup_ins | bigint | 插入的行数 | +| n_tup_upd | bigint | 更新的行数(包括HOT更新的行) | +| n_tup_del | bigint | 删除的行数 | +| n_tup_hot_upd | bigint | HOT更新的行数(即不需要单独的索引更新) | +| n_live_tup | bigint | 活的行的估计数量 | +| n_dead_tup | bigint | 僵死行的估计数量 | +| n_mod_since_analyze | bigint | 自上次分析此表以来修改的行的估计数量 | +| n_ins_since_vacuum | bigint | 自上次清空此表以来插入的行的估计数量 | +| last_vacuum | timestamp with time zone | 最后一次手动清理这个表(不包括VACUUM FULL) | +| last_autovacuum | timestamp with time zone | 这个表最后一次被自动清理守护进程清理的时间 | +| last_analyze | timestamp with time zone | 上一次手动分析这个表 | +| last_autoanalyze | timestamp with time zone | 自动清理守护进程最后一次分析这个表 | +| vacuum_count | bigint | 这个表被手动清理的次数(VACUUM FULL不计数) | +| autovacuum_count | bigint | 这个表被autovacuum守护进程清理的次数 | +| analyze_count | bigint | 手动分析这个表的次数 | +| autoanalyze_count | bigint | 这个表被autovacuum守护进程分析的次数 | + + +#### `pg_stat_all_indexes` +`pg_stat_all_indexes`视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。`pg_stat_user_indexes`和`pg_stat_sys_indexes`视图包含相同的信息,但是被过滤得只分别显示用户和系统索引。 + +**表24.`pg_stat_all_indexes` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| relid | oid | 这个索引所在表的OID | +| indexrelid | oid | 这个索引的OID | +| schemaname | name | 这个索引所在的模式名称 | +| relname | name | 这个索引所在表的名称 | +| indexrelname | name | 这个索引的名称 | +| idx_scan | bigint | 在这个索引上开启的索引扫描的数量 | +| idx_tup_read | bigint | 扫描此索引返回的索引项数 | +| idx_tup_fetch | bigint | 使用此索引进行简单索引扫描获取的活动表行数 | + + +索引可以被简单索引扫描、“位图”索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以被通过 AND 或 OR 规则组合,因此当使用一次位图扫描时难以将取得的个体堆行与特定的索引关联起来。因此,一次位图扫描会增加它使用的索引的`pg_stat_all_indexes`.`idx_tup_read`计数,并且为每个表增加`pg_stat_all_tables`.`idx_tup_fetch`计数,但是它不影响`pg_stat_all_indexes`.`idx_tup_fetch`。如果所提供的常量值不在优化器统计信息记录的范围之内,优化器也会访问索引来检查,因为优化器统计信息可能已经“不新鲜”了。 + +.注意 +**** +即使不用位图扫描,`idx_tup_read`和`idx_tup_fetch`计数也可能不同,因为`idx_tup_read`统计从该索引取得的索引项而`idx_tup_fetch`统计从表取得的活着的行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。 +**** + +#### `pg_statio_all_tables` +`pg_statio_all_tables`视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。`pg_statio_user_tables`和`pg_statio_sys_tables`视图包含相同的信息,但是被过滤得分别只显示用户表和系统表。 + +**表25.`pg_statio_all_tables` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `relid` | `oid` | 表的OID | +| `schemaname` | `name` | 该表所在的模式名 | +| `relname` | `name` | 这个表的名称 | +| `heap_blks_read` | `bigint` | 从该表中读取的磁盘块的数量 | +| `heap_blks_hit` | `bigint` | 该表中的缓冲区命中数 | +| `idx_blks_read` | `bigint` | 从这个表上所有索引读取的磁盘块数 | +| `idx_blks_hit` | `bigint` | 这个表上所有索引中的缓冲区命中数 | +| `toast_blks_read` | `bigint` | 从这个表的TOAST表中读取的磁盘块的数量(如果有的话) | +| `toast_blks_hit` | `bigint` | 这个表的TOAST表中的缓冲区命中数(如果有的话) | +| `tidx_blks_read` | `bigint` | 从这个表的TOAST表索引中读取的磁盘块的数量(如果有的话) | +| `tidx_blks_hit` | `bigint` | 这个表的TOAST表索引中的缓冲区命中数(如果有的话) | + + +#### `pg_statio_all_indexes` +`pg_statio_all_indexes`视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。 `pg_statio_user_indexes`和`pg_statio_sys_indexes`视图包含相同的信息,但是被过滤得分别只显示用户索引和系统索引。 + +**表26.`pg_statio_all_indexes` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `relid` | `oid` | 这个索引所在表的OID | +| `indexrelid` | `oid` | 这个索引的OID | +| `schemaname` | `name` | 索引所在的模式名称 | +| `relname` | `name` | 这个索引所在表的名称 | +| `indexrelname` | `name` | 这个索引的名称 | +| `idx_blks_read` | `bigint` | 从这个索引中读取的磁盘块数量 | +| `idx_blks_hit` | `bigint` | 这个索引中的缓冲区命中数 | + + +#### `pg_statio_all_sequences` +`pg_statio_all_sequences`视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。 + +**表27.`pg_statio_all_sequences` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| relid | oid | 序列的OID | +| schemaname | name | 此序列所在的模式的名称 | +| relname | name | 此序列的名称 | +| blks_read | bigint | 从这个序列中读取的磁盘块的数量 | +| blks_hit | bigint | 在此序列中的缓冲区命中数 | + + +#### `pg_stat_user_functions` +`pg_stat_user_functions`视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。 track_functions参数控制到底哪些函数被跟踪。 + +**表28.`pg_stat_user_functions` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| funcid | oid | 函数的OID | +| schemaname | name | 这个函数所在的模式的名称 | +| funcname | name | 这个函数的名称 | +| calls | bigint | 这个函数已经被调用的次数 | +| total_time | double precision | 在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计 | +| self_time | double precision | 在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计 | + + +#### `pg_stat_slru` +IvorySQL通过**SLRU**(simple least-recently-used,简单的最近-最少-使用)缓存访问某些磁盘上的信息。 `pg_stat_slru`视图将为每个被跟踪的SLRU缓存包含一行,显示关于访问缓存页面的统计信息。 + +**表29.`pg_stat_slru` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| name | text | SLRU的名称 | +| blks_zeroed | bigint | 初始化期间被置零的块数 | +| blks_hit | bigint | 已经在SLRU中的磁盘块被发现的次数,因此不需要读取(这只包括SLRU中的命中,而不是操作系统的文件系统缓存) | +| blks_read | bigint | 为这个SLRU读取的磁盘块数 | +| blks_written | bigint | 为这个SLRU写入的磁盘块数 | +| blks_exists | bigint | 为这个SLRU检查是否存在的块数 | +| flushes | bigint | 此SLRU的脏数据刷新数 | +| truncates | bigint | 这个SLRU的截断数 | +| stats_reset | timestamp with time zone | 这些统计数据最后一次重置的时间 | + + +#### Statistics Functions +其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。 如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出`\d+ pg_stat_activity`)。 针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。 针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。 + +更多统计集合的函数列在 表 30 中。 + +**表30.Additional Statistics Functions** +| 函数 | 描述 | +| --- | --- | +| pg_backend_pid () → integer | 返回附加到当前会话的服务器进程的进程ID。 | +| pg_stat_get_activity ( integer ) → setof record | 使用指定的进程ID返回有关后端信息的记录,如果指定了NULL,则返回系统中每个活动后端的一条记录。返回的字段是pg_stat_activity视图中字段的子集。 | +| pg_stat_get_snapshot_timestamp () → timestamp with time zone | 返回当前统计快照的时间戳。 | +| pg_stat_clear_snapshot () → void | 丢弃当前的统计快照。 | +| pg_stat_reset () → void | 将当前数据库的所有统计计数器重置为零。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 | +| pg_stat_reset_shared ( text ) → void | 根据参数的不同,将一些集群范围的统计计数器重置为零。参数可以是bgwriter来重置pg_stat_bgwriter视图中显示的所有计数器,或者archiver来重置pg_stat_archiver视图中显示的所有计数器。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 | +| pg_stat_reset_single_table_counters ( oid ) → void | 将当前数据库中单个表或索引的统计信息重置为零。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 | +| pg_stat_reset_single_function_counters ( oid ) → void | 将当前数据库中单个函数的统计信息重置为零。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 | +| pg_stat_reset_slru ( text ) → void | 将单个SLRU缓存或集群中所有SLRU的统计信息重置为零。如果该参数为NULL,则所有SLRU缓存的pg_stat_slru视图中显示的计数器将被重置。参数可以是CommitTs、MultiXactMember、MultiXactOffset、Notify、Serial、Subtrans或Xact中的一个,以便只重置该条目的计数器。如果参数是other(或实际上,任何无法识别的名称),那么所有其他SLRU缓存的计数器,如扩展定义的缓存,将被重置。默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。 | + + +`pg_stat_get_activity`是`pg_stat_activity`视图的底层函数, 它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。 在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在 表 31中。 这些访问函数使用一个后端 ID 号,范围从 1 到当前活动后端数目。 函数`pg_stat_get_backend_idset`提供了一种方便的方法为每个活动后端产生一行来调用这些函数。 例如,要显示PID以及所有后端当前的查询: + +``` +SELECT pg_stat_get_backend_pid(s.backendid) AS pid, + pg_stat_get_backend_activity(s.backendid) AS query + FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s; +``` + +**表31.Per-Backend Statistics Functions** +| 函数 | 描述 | +| --- | --- | +| pg_stat_get_backend_idset () → setof integer | 返回当前活动后端ID号的集合(从1到活动后端数)。 | +| pg_stat_get_backend_activity ( integer ) → text | 返回此后端最近查询的文本。 | +| pg_stat_get_backend_activity_start ( integer ) → timestamp with time zone | 返回后端最近一次查询开始的时间。 | +| pg_stat_get_backend_client_addr ( integer ) → inet | 返回连接到此后端的客户端的IP地址。 | +| pg_stat_get_backend_client_port ( integer ) → integer | 返回客户端用于通信的TCP端口号。 | +| pg_stat_get_backend_dbid ( integer ) → oid | 返回此后端连接的数据库的OID。 | +| pg_stat_get_backend_pid ( integer ) → integer | 返回此后端进程ID。 | +| pg_stat_get_backend_start ( integer ) → timestamp with time zone | 返回该进程开始的时间。 | +| pg_stat_get_backend_userid ( integer ) → oid | 返回登录到此后端的用户的OID。 | +| pg_stat_get_backend_wait_event_type ( integer ) → text | 如果后端当前正在等待,返回等待事件类型名称,否则返回NULL。 | +| pg_stat_get_backend_wait_event ( integer ) → text | 如果后端当前正在等待,则返回等待事件名称,否则为NULL。 | +| pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone | 返回后端当前事务开始的时间。 | + + +## 查看锁 +监控数据库活动的另外一个有用的工具是`pg_locks`系统表。这样就允许数据库管理员查看在锁管理器里面未解决的锁的信息。例如,这个功能可以被用于: + +- 查看当前所有未解决的锁、在一个特定数据库中的关系上所有的锁、在一个特定关系上所有的锁,或者由一个特定IvorySQL会话持有的所有的锁。 +- 判断当前数据库中带有最多未授予锁的关系(它很可能是数据库客户端的竞争源)。 +- 判断锁竞争给数据库总体性能带来的影响,以及锁竞争随着整个数据库流量的变化范围。 + +## Progress Reporting +IvorySQL具有在命令执行过程中报告某些命令进度的能力。 目前,支持进度报告的命令只有`ANALYZE`,`CLUSTER`,`CREATE INDEX`, `VACUUM`, 和 BASE_BACKUP例如 pg_basebackup发出的进行基础备份的复制命令。未来可能还会扩展。 + +### ANALYZE Progress Reporting +每当`ANALYZE`运行时,`pg_stat_progress_analyze`视图将包含当前运行该命令的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它们的信息。 + +**表32.`pg_stat_progress_analyze` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| pid | integer | 后端的进程ID。 | +| datid | oid | 后端连接到的数据库的OID。 | +| datname | name | 后端连接到的数据库的名称。 | +| relid | oid | 被分析的表的OID。 | +| phase | text | 当前处理阶段。参见 表 33。 | +| sample_blks_total | bigint | 将被采样的堆块的总数。 | +| sample_blks_scanned | bigint | 扫描的堆块数量。 | +| ext_stats_total | bigint | 扩展统计信息的数量。 | +| ext_stats_computed | bigint | 已经计算的扩展统计的数量。此计数器仅在 computing extended statistics 阶段增进。 | +| child_tables_total | bigint | 子表的数量。 | +| child_tables_done | bigint | 扫描的子表数。此计数器只有在 acquiring inherited sample rows 阶段才会增进。 | +| current_child_table_relid | oid | 当前正在扫描的子表的 OID。此字段仅在 acquiring inherited sample rows 时有效。 | + + +**表33.ANALYZE phases** +| 阶段 | 描述 | +| --- | --- | +| `initializing` | 命令正在准备开始扫描堆。这个阶段预计会非常短暂。 | +| `acquiring sample rows` | 该命令当前正在扫描`relid`给出的表以获得示例行。 | +| `acquiring inherited sample rows` | 该命令当前正在扫描子表以获得示例行。列`child_tables_total`,`child_tables_done`, 和`current_child_table_relid`包含此阶段的进度信息。 | +| `computing statistics` | 该命令从表扫描期间获得的样例行计算统计信息。 | +| `computing extended statistics` | 该命令从表扫描期间获得的样例行计算扩展统计信息。 | +| `finalizing analyze` | 该命令在更新`pg_class`。当此阶段完成时,`ANALYZE` 将结束。 | + + +.注意 +**** +当在分区表上运行`ANALYZE`时,它的所有分区也会被递归分析,如在ANALYZE中曾提到过。 在这种情况下,首先报告父表的`ANALYZE`进度,收集它的继承统计信息,然后是每个分区的(继承统计信息)。 +**** + +### CREATE INDEX Progress Reporting +每当运行`CREATE INDEX`或`REINDEX`时,`pg_stat_progress_create_index`视图将包含当前正在创建索引的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。 + +**表34.`pg_stat_progress_create_index` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `pid` | `integer` | 后端的进程ID。 | +| `datid` | `oid` | 后端连接到的数据库的OID。 | +| `datname` | `name` | 后端连接到的数据库的名称。 | +| `relid` | `oid` | 正在创建索引的表的OID。 | +| `index_relid` | `oid` | 正在创建或重建索引的OID。在非并发 `CREATE INDEX` 的时候,此为 0。 | +| `command` | `text` | 在运行的命令:`CREATE INDEX`、`CREATE INDEX CONCURRENTLY`、`REINDEX` 或 `REINDEX CONCURRENTLY`。 | +| `phase` | `text` | 索引创建的当前处理阶段。参见 [表 35](http://www.postgresql.org/docs/17/progress-reporting.html#CREATE-INDEX-PHASES)。 | +| `lockers_total` | `bigint` | 在适用的情况下,需要等待的储物柜总数。 | +| `lockers_done` | `bigint` | 已经等待的储物柜数量。 | +| `current_locker_pid` | `bigint` | 目前正在等待的储物柜的进程ID。 | +| `blocks_total` | `bigint` | 本阶段要处理的区块总数。 | +| `blocks_done` | `bigint` | 当前阶段已经处理的区块数量。 | +| `tuples_total` | `bigint` | 当前阶段要处理的元组总数。 | +| `tuples_done` | `bigint` | 在当前阶段已经处理的元组数量。 | +| `partitions_total` | `bigint` | 在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。 | +| `partitions_done` | `bigint` | 当在分区表上创建索引时,该列被设置为在其上完成索引的分区数。 | + + +**表35.CREATE INDEX 的阶段** +| 阶段 | 描述 | +| --- | --- | +| `初始化` | `CREATE INDEX`或`REINDEX`正在准备创建索引。 这个阶段预计会非常短暂。 | +| `构建前等待读写器` | `CREATE INDEX CONCURRENTLY`或`REINDEX CONCURRENTLY`正在等待有可能看到表的写锁的事务完成。 当不在并发模式时,这个阶段会被跳过。`lockers_total`、 `lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 | +| `新建索引` | 索引是由访问方法专用代码建立的。 在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。 通常情况下,`blocks_total`和`blocks_done`将包含进度数据,也可能包含`tuples_total`和`tuples_done`。 | +| `在验证前等待读写器` | `CREATE INDEX CONCURRENTLY`或`REINDEX CONCURRENTLY`正在等待有可能写入表的事务完成写锁的事务。当不在并发模式时,这个阶段会被跳过。`lockers_total`、 `lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 | +| `索引验证:扫描索引` | `CREATE INDEX CONCURRENTLY`正在扫描索引,搜索需要验证的图元组。如果不是在并发模式下,这个阶段会被跳过。列 `blocks_total`(设置为索引的总大小)和 `blocks_done`包含了这个阶段的进度信息。 | +| `指数验证:排序元组` | `CREATE INDEX CONCURRENTLY`正在对索引扫描阶段的输出进行排序。 | +| `索引验证:扫描表` | `CREATE INDEX CONCURRENTLY`正在扫描表,以验证前两个阶段收集的索引图元。当不在并发模式时,这个阶段被跳过。`blocks_total`列(设置为表的总大小)和`blocks_done`列包含这个阶段的进度信息。 | +| `等待旧照` | `CREATE INDEX CONCURRENTLY`或`REINDEX CONCURRENTLY`正在等待可能看到表的事务释放快照。 当不处于并发模式时,这个阶段会被跳过。 `lockers_total`、`lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 | +| `标记 dead之前等待readers` | `REINDEX CONCURRENTLY`等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。`lockers_total`、`lockers_done` 和 `current_locker_pid` 列包含了这个阶段的进度信息。 | +| `在 dropping之前等待readers` | `REINDEX CONCURRENTLY`等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 `lockers_total`、`lockers_done` 和 `current_locker_pid`包含了这个阶段的进度信息。 | + + +### VACUUM进度报告 +只要`VACUUM`正在运行,每一个当前正在清理的后端(包括autovacuum工作者进程)在`pg_stat_progress_vacuum`视图中都会有一行。下面的表描述了将被报告的信息并且提供了如何解释它们的信息。`VACUUM FULL`命令的进度是通过`pg_stat_progress_cluster`报告的,因为`VACUUM FULL`和`CLUSTER`都是重写表,而普通的`VACUUM`只是原地修改表。 + +**表36.`pg_stat_progress_vacuum` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| pid | integer | 后端的进程ID。 | +| datid | oid | 这个后端连接的数据库的OID。 | +| datname | name | 这个后端连接的数据库的名称。 | +| relid | oid | 被vacuum的表的OID。 | +| phase | text | vacuum的当前处理阶段。 | +| heap_blks_total | bigint | 该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个VACUUM访问。 | +| heap_blks_scanned | bigint | 被扫描的堆块数量。由于visibility map被用来优化扫描,一些块将被跳过而不做检查,被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total。仅当处于扫描堆阶段时这个计数器才会前进。 | +| heap_blks_vacuumed | bigint | 被清理的堆块数量。除非表没有索引,这个计数器仅在处于清理堆阶段时才会前进。不包含死亡元组的块会被跳过,因此这个计数器可能有时会向前跳跃一个比较大的增量。 | +| index_vacuum_count | bigint | 已完成的索引清理周期数。 | +| max_dead_tuples | bigint | 在需要执行一个索引清理周期之前我们可以存储的死亡元组数,取决于maintenance_work_mem。 | +| num_dead_tuples | bigint | 从上一个索引清理周期以来收集的死亡元组数。 | + + +**表37.VACUUM的阶段** +| 阶段 | 描述 | +| --- | --- | +| `初始化` | `VACUUM`正在准备开始扫描堆。这个阶段应该很简短。 | +| `扫描堆` | `VACUUM`正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。`heap_blks_scanned`列可以用来监控扫描的进度。 | +| `清理索引` | `VACUUM`当前正在清理索引。如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。如果maintenance_work_mem不足以存放找到的死亡元组,则每次清理时会多次清理索引。 | +| `清理堆` | `VACUUM`当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果`heap_blks_scanned`小于`heap_blks_total`,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。 | +| `清除索引` | `VACUUM`当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。 | +| `截断堆` | `VACUUM`正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。 | +| `执行最后的清除` | `VACUUM`在执行最终的清除。在这个阶段中,`VACUUM`将清理空闲空间映射、更新`pg_class`中的统计信息并且将统计信息报告给统计收集器。当这个阶段完成时,`VACUUM`也就结束了。 | + + +### CLUSTER进度报告 +每当`CLUSTER`或`VACUUM FULL`运行时,`pg_stat_progress_cluster`视图将包含当前正在运行的每一个后台的记录。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。 + +**表38.`pg_stat_progress_cluster` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| `pid` | `integer` | 后台的进程ID。 | +| `datid` | `oid` | 该后端连接的数据库的OID。 | +| `datname` | `name` | 与此后端连接的数据库的名称。 | +| `relid` | `oid` | 被集群的表的OID。 | +| `command` | `text` | 正在运行的命令。`CLUSTER`或`VACUUM FULL`。 | +| `phase` | `text` | 当前处理阶段。 | +| `cluster_index_relid` | `oid` | 如果正在使用索引对表进行扫描,这就是正在使用的索引的OID;否则为0。 | +| `heap_tuples_scanned` | `bigint` | 扫描的堆元组数。这个计数器只有在阶段为`seq scanning heap`、`index scanning heap`或`writing new heap`时才会增进。 | +| `heap_tuples_written` | `bigint` | 写入的堆元组的数量。这个计数器只有在阶段为`seq scanning heap`、`index scanning heap`或`writing new heap`时才会前进。 | +| `heap_blks_total` | `bigint` | 表中的堆块总数。这个数字是在`seq scanning heap`的开始时报告的。 | +| `heap_blks_scanned` | `bigint` | 扫描的堆块数量。这个计数器只有在阶段为`seq scanning heap`时才会增进。 | +| `index_rebuild_count` | `bigint` | 重建的索引数。该计数器仅在`重建索引`阶段时才会增进。 | + + +**表39.CLUSTER 和 VACUUM FULL 阶段** +| 阶段 | 描述 | +| --- | --- | +| `初始化` | 该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。 | +| `seq扫描堆` | 该命令目前采用顺序扫描的方式对表进行扫描。 | +| `索引扫描堆` | `CLUSTER`目前正在使用索引扫描表。 | +| `元组排序` | `CLUSTER`目前正在对元组进行排序。 | +| `新写入堆` | `CLUSTER`目前正在编写新的堆。 | +| `交换关系文件` | 目前,该命令正在将新建立的文件调换到位。 | +| `重建索引` | 该命令目前正在重建一个索引。 | +| `清理` | 该命令正在执行最后的清理工作。 当此阶段完成后,`CLUSTER`或`VACUUM FULL`将结束。 | + + +### 基础备份进度报告 +每当像pg_basebackup这样的应用程序进行基本备份时, `pg_stat_progress_basebackup`视图将包含当前运行`BASE_BACKUP`复制命令和流备份的每个WAL发送进程的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。 + +**表40.`pg_stat_progress_basebackup` 视图** +| 列 | 类型 | 描述 | +| --- | --- | --- | +| pid | integer | WAL发送方进程ID。 | +| phase | text | 目前的处理阶段。 | +| backup_total | bigint | 将被流输送的数据总量。这是在streaming database files阶段开始时的估计和报告。注意,这只是一个近似值,因为在streaming database files阶段,数据库可能会改变,而WAL日志可能会在稍后的备份中包含。一旦流数据量超过了估计的总大小,该值始终与backup_streamed相同。如果在pg_basebackup中禁用估算(也就是说,指定了--no-estimate-size选项),这为NULL。 | +| backup_streamed | bigint | 数据流的总量。这个计数器只在streaming database files阶段或transferring wal files时增进。 | +| tablespaces_total | bigint | 要流输送的表空间总数。 | +| tablespaces_streamed | bigint | 流输送的表空间数。此计数器仅在streaming database files阶段增进。 | + + +**表41.基础备份阶段** +| 阶段 | 描述 | +| --- | --- | +| `initializing` | WAL发送器进程正在准备开始备份。这个阶段预计会非常短暂。 | +| `waiting for checkpoint to finish` | WAL发送器进程目前正在执行`pg_start_backup`以准备进行基础备份,并等待启动备份检查点完成。 | +| `estimating backup size` | WAL发送程序目前正在估计将作为基础备份流传输的数据库文件的总量。 | +| `streaming database files` | WAL发送器当前正在流数据库文件作为基础备份。 | +| `waiting for wal archiving to finish` | WAL发送方进程目前正在执行`pg_stop_backup`以完成备份,并等待基础备份所需的所有WAL文件成功存档。 如果在pg_basebackup中指定了`--wal-method=none`或`--wal-method=stream`,则备份将在此阶段完成后结束。 | +| `transferring wal files` | WAL发送器进程正在传输备份过程中产生的所有WAL日志。 如果pg_basebackup中指定了`--wal-method=fetch`, 则该阶段发生在`waiting for wal archiving to finish`阶段之后。当此阶段完成时备份将结束。 | + + +## 动态追踪 +IvorySQL提供了功能来支持数据库服务器的动态追踪。这样就允许在代码中的特定点上调用外部工具来追踪执行过程。 + +一些探针或追踪点已经被插入在源代码中。这些探针的目的是被数据库开发者和管理员使用。默认情况下,探针不被编译到IvorySQL中;用户需要显式地告诉配置脚本使得探针可用。 + +目前,DTrace已被支持,它在 Solaris、macOS、FreeBSD、NetBSD 和 Oracle Linux 上可用。 Linux 的SystemTap项目提供了一种可用的 DTrace 等价物。支持其他动态追踪工具在理论上可以通过改变`src/include/utils/probes.h`中的宏定义实现。 + +### 动态追踪的编译 +默认情况下,探针是不可用的,因此你将需要显式地告诉配置脚本让探针在IvorySQL中可用。要包括 DTrace 支持,在配置时指定`--enable-dtrace`。 + +### 内建探针 +如表 42所示,源代码中提供了一些标准探针。表 43显示了在探针中使用的类型。当然,可以增加更多探针来增强IvorySQL的可观测性。 + +**表42.内建 DTrace 探针** +| 名称 | 参数 | 描述 | +| --- | --- | --- | +| `transaction-start` | `(LocalTransactionId)` | 在一个新事务开始时触发的探针。arg0 是事务 ID。 | +| `transaction-commit` | `(LocalTransactionId)` | 在一个事务成功完成时触发的探针。arg0 是事务 ID。 | +| `transaction-abort` | `(LocalTransactionId)` | 当一个事务失败完成时触发的探针。arg0 是事务 ID。 | +| `query-start` | `(const char *)` | 当一个查询的处理被开始时触发的探针。arg0 是查询字符串。 | +| `query-done` | `(const char *)` | 当一个查询的处理完成时触发的探针。arg0 是查询字符串。 | +| `query-parse-start` | `(const char *)` | 当一个查询的解析被开始时触发的探针。arg0 是查询字符串。 | +| `query-parse-done` | `(const char *)` | 当一个查询的解析完成时触发的探针。arg0 是查询字符串。 | +| `query-rewrite-start` | `(const char *)` | 当一个查询的重写被开始时触发的探针。arg0 是查询字符串。 | +| `query-rewrite-done` | `(const char *)` | 当一个查询的重写完成时触发的探针。arg0 是查询字符串。 | +| `query-plan-start` | `()` | 当一个查询的规划被开始时触发的探针。 | +| `query-plan-done` | `()` | 当一个查询的规划完成时触发的探针。 | +| `query-execute-start` | `()` | 当一个查询的执行被开始时触发的探针。 | +| `query-execute-done` | `()` | 当一个查询的执行完成时触发的探针。 | +| `statement-status` | `(const char *)` | 任何时候当服务器进程更新它的`pg_stat_activity`.`status`时触发的探针。arg0 是新的状态字符串。 | +| `checkpoint-start` | `(int)` | 当一个检查点被开始时触发的探针。arg0 传递位标志来区分不同的检查点类型,例如关闭(shutdown)、立即(immediate)或强制(force)。 | +| `checkpoint-done` | `(int, int, int, int, int)` | 当一个检查点完成时触发的探针(检查点处理过程中序列中列出的下一个触发的探针)。arg0 是要写的缓冲区数量。arg1 是缓冲区的总数。arg2、arg3 和 arg4 分别包含了增加、删除和循环回收的 WAL 文件的数量。 | +| `clog-checkpoint-start` | `(bool)` | 当一个检查点的 CLOG 部分被开始时触发的探针。arg0 为真表示正常检查点,为假表示关闭检查点。 | +| `clog-checkpoint-done` | `(bool)` | 当一个检查点的 CLOG 部分完成时触发的探针。arg0 的含义与`clog-checkpoint-start`中相同。 | +| `subtrans-checkpoint-start` | `(bool)` | 当一个检查点的 SUBTRANS 部分被开始时触发的探针。arg0 为真表示正常检查点,为假表示关闭检查点。 | +| `subtrans-checkpoint-done` | `(bool)` | 当一个检查点的 SUBTRANS 部分完成时触发的探针。arg0 的含义与`subtrans-checkpoint-start`中相同。 | +| `multixact-checkpoint-start` | `(bool)` | 当一个检查点的 MultiXact 部分被开始时触发的探针。arg0 为真表示正常检查点,为假表示关闭检查点。 | +| `multixact-checkpoint-done` | `(bool)` | 当一个检查点的 MultiXact 部分完成时触发的探针。arg0 的含义与`multixact-checkpoint-start`中相同。 | +| `buffer-checkpoint-start` | `(int)` | 当一个检查点的写缓冲区部分被开始时触发的探针。arg0 传递位标志来区分不同的检查点类型,例如关闭(shutdown)、立即(immediate)或强制(force)。 | +| `buffer-sync-start` | `(int, int)` | 当我们在检查点期间开始写脏缓冲区时(在标识哪些缓冲区必须被写之后)触发的探针。arg0 是缓冲区总数,arg1 是当前为脏并且需要被写的缓冲区数量。 | +| `buffer-sync-written` | `(int)` | 在检查点期间当每个缓冲区被写完之后触发的探针。arg0 是缓冲区的 ID。 | +| `buffer-sync-done` | `(int, int, int)` | 当所有脏缓冲区被写之后触发的探针。arg0 是缓冲区总数。arg1 是检查点进程实际写的缓冲区数量。arg2 是期望写的数目(`buffer-sync-start`的 arg1);arg1 和 arg2 的任何的不同反映在该检查点期间有其他进程刷写了缓冲区。 | +| `buffer-checkpoint-sync-start` | `()` | 在脏缓冲区被写入到内核之后并且在开始发出 fsync 请求之前触发的探针。 | +| `buffer-checkpoint-done` | `()` | 当同步缓冲区到磁盘完成时触发的探针。 | +| `twophase-checkpoint-start` | `()` | 当一个检查点的两阶段部分被开始时触发的探针。 | +| `twophase-checkpoint-done` | `()` | 当一个检查点的两阶段部分完成时触发的探针。 | +| `buffer-read-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool)` | 当一次缓冲区读被开始时触发的探针。arg0 和 arg1 包含该页的分叉号和块号(如果这是一次关系扩展请求,arg1 为 -1)。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是 `InvalidBackendId`(-1)。arg6 为真表示一次关系扩展请求,为假表示正常读。 | +| `buffer-read-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool, bool)` | 当一次缓冲区读完成时触发的探针。arg0 和 arg1 包含该页的分叉号和块号(如果这是一次关系扩展请求,arg1 现在包含新增加块的块号)。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是 `InvalidBackendId`(-1)。arg6 为真表示一次关系扩展请求,为假表示正常读。arg7 为真表示在池中找到该缓冲区,为假表示没有找到。 | +| `buffer-flush-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 在发出对一个共享缓冲区的任意写请求之前触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。 | +| `buffer-flush-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 当一个写请求完成时触发的探针(注意这只反映传递数据给内核的时间,它通常并没有实际地被写入到磁盘)。参数和`buffer-flush-start`的相同。 | +| `buffer-write-dirty-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 当一个服务器进程开始写一个脏缓冲区时触发的探针(如果这经常发生,表示shared_buffers太小,或需要调整后台写入器的控制参数)。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。 | +| `buffer-write-dirty-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid)` | 当一次脏缓冲区写完成时触发的探针。参数与`buffer-write-dirty-start`相同。 | +| `wal-buffer-write-dirty-start` | `()` | 当一个服务器进程因为没有可用 WAL 缓冲区空间开始写一个脏 WAL 缓冲区时触发的探针(如果这经常发生,表示wal_buffers太小)。 | +| `wal-buffer-write-dirty-done` | `()` | 当一次脏 WAL 缓冲区完成时触发的探针。 | +| `wal-insert` | `(unsigned char, unsigned char)` | 当一个 WAL 记录被插入时触发的探针。arg0 是该记录的资源管理者(rmid)。arg1 包含 info 标志。 | +| `wal-switch` | `()` | 当请求一次 WAL 段切换时触发的探针。 | +| `smgr-md-read-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int)` | 当开始从一个关系读取一块时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。 | +| `smgr-md-read-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int)` | 当一次块读取完成时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。arg6 是实际读取的字节数,而 arg7 是请求读取的字节数(如果两者不同就意味着麻烦)。 | +| `smgr-md-write-start` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int)` | 当开始向一个关系中写入一个块时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3 和 arg4 包含表空间、数据库和关系 OID 用以识别该关系。对一个本地缓冲区,arg5 是创建临时关系的后端的 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。 | +| `smgr-md-write-done` | `(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int)` | 当一个块写操作完成时触发的探针。arg0 和 arg1 包含该页的分叉号和块号。arg2、arg3和arg4 包含表空间、数据库和关系 OID来标识该关系。对于一个本地缓冲区,arg5 是创建临时关系的后端 ID;对于一个共享缓冲区,arg5 是`InvalidBackendId`(-1)。arg6 是实际写的字节数,而 arg7 是要求写的字节数(如果这两者不同,则意味着麻烦)。 | +| `sort-start` | `(int, bool, int, int, bool, int)` | 当一次排序操作开始时触发的探针。arg0 指示是堆排序、索引排序或数据排序。arg1 为真表示唯一值强制。arg2 是键列的数目。arg3 是允许使用的工作内存数(以千字节计)。如果要求随机访问排序结果,那么 arg4 为真。arg5为`0`时表示串行,为`1`时表示并行工作者,为`2`时表示并行领袖。 | +| `sort-done` | `(bool, long)` | 当一次排序完成时触发的探针。arg0 为真表示外排序,为假表示内排序。arg1 是用于一次外排序的磁盘块的数目,或用于一次内排序的以千字节计的内存。 | +| `lwlock-acquire` | `(char *, LWLockMode)` | 当成功获得一个 LWLock 时触发的探针。 arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 | +| `lwlock-release` | `(char *)` | 当一个 LWLock 被释放时(但是注意还没有唤醒任何一个被释放的等待者)触发的探针。 arg0 是该 LWLock 所在的切片(Tranche)。 | +| `lwlock-wait-start` | `(char *, LWLockMode)` | 当一个 LWLock不是当即可用并且一个服务器进程因此开始等待该锁变为可用时触发的探针。 arg0 是该 LWLock 所在的切片(Tranche)。 arg1 请求的锁模式,是排他或共享。 | +| `lwlock-wait-done` | `(char *, LWLockMode)` | 当一个进程从对一个 LWLock 的等待中被释放时(它实际还没有得到该锁)时触发的探针。arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 | +| `lwlock-condacquire` | `(char *, LWLockMode)` | 当调用者指定无需等待而成功获得一个 LWLock 时触发的探针。arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 | +| `lwlock-condacquire-fail` | `(char *, LWLockMode)` | 当调用者指定无需等待而没有成功获得一个 LWLock 时触发的探针。arg0 是该 LWLock 所在的切片(Tranche)。 arg1 所请求的锁模式,是排他或共享。 | +| `lock-wait-start` | `(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE)` | 当一个重量级锁(lmgr锁)的请求由于锁不可用开始等待时触发的探针。arg0 到 arg3 是标识被锁定对象的标签域。arg4 指示被锁对象的类型。arg5 表示被请求的锁类型。 | +| `lock-wait-done` | `(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE)` | 当一个重量级锁(lmgr 锁)的请求结束等待时(即已经得到锁)触发的探针。参数与`lock-wait-start`一样。 | +| `deadlock-found` | `()` | 当死锁检测器发现死锁时触发的探针。 | + + +**表43.定义用在探针参数中的类型** +| 类型 | 定义 | +| --- | --- | +| `LocalTransactionId` | `unsigned int` | +| `LWLockMode` | `int` | +| `LOCKMODE` | `int` | +| `BlockNumber` | `unsigned int` | +| `Oid` | `unsigned int` | +| `ForkNumber` | `int` | +| `bool` | `unsigned char` | + + +### 使用探针 +下面的例子展示了一个分析系统中事务计数的 DTrace 脚本,可以用来代替一次性能测试之前和之后的`pg_stat_database`快照: + +``` +#!/usr/sbin/dtrace -qs + +postgresql$1:::transaction-start +{ + @start["Start"] = count(); + self->ts = timestamp; +} + +postgresql$1:::transaction-abort +{ + @abort["Abort"] = count(); +} + +postgresql$1:::transaction-commit +/self->ts/ +{ + @commit["Commit"] = count(); + @time["Total time (ns)"] = sum(timestamp - self->ts); + self->ts=0; +} +``` + +当被执行时,该例子 D 脚本给出这样的输出: + +``` +# ./txn_count.d `pgrep -n postgres` or ./txn_count.d +^C + +Start 71 +Commit 70 +Total time (ns) 2312105013 +``` + +.注意 +**** +SystemTap 为追踪脚本使用一个不同于 DTrace 的标记,但是底层的探针是兼容的。值得注意的是,在这样写的时候,SystemTap 脚本必须使用双下划线代替连字符来引用探针名。在未来的 SystemTap 发行中这很可能会被修复。你应该记住,DTrace 脚本需要细心地编写和调试,否则被收集的追踪信息可能会毫无意义。在大部分发现问题的情况中,它就是发生问题的部件,而不是底层系统。当讨论使用动态追踪发现的信息时,一定要附上使用的脚本以便其也被检查和讨论。 +**** + +### 定义新探针 +开发者可以在代码中任意位置定义新的探针,当然这要重新编译之后才能生效。下面是插入新探针的步骤: + +1. 决定探针名称以及探针可用的数据 +2. 把该探针定义加入到`src/backend/utils/probes.d` +3. 如果`pg_trace.h`还不存在于包含该探针点的模块中,包括它,并且在源代码中期望的位置插入`TRACE_POSTGRESQL`探针宏 +4. 重新编译并验证新探针是可用的 + +**例子:.** 这里是一个如何增加一个探针来用事务 ID 追踪所有新事务的例子。 + +1. 决定探针将被命名为`transaction-start`并且需要一个`LocalTransactionId`类型的参数 + +2. 将该探针定义加入到`src/backend/utils/probes.d`: + +``` + probe transaction__start(LocalTransactionId); +``` + + 注意探针名字中双下划线的使用。在一个使用探针的 DTrace 脚本中,双下划线需要被替换为一个连字符,因此 ,对用户而言`transaction-start`是文档名。 + +3. 在编译时,`transaction__start`被转换成一个宏调用`TRACE_POSTGRESQL_TRANSACTION_START`(注意这里是单下划线),可以通过包括头文件`pg_trace.h`获得。将宏调用加入到源代码中的合适位置。在这种情况下,看起来类似: + +``` + TRACE_POSTGRESQL_TRANSACTION_START(vxid.localTransactionId); +``` + +4. 在重新编译和运行新的二进制文件之后,通过运行下面的 DTrace 命令来检查新增的探针是否可用。你应该看到类似下面的输出: + +``` + # dtrace -ln transaction-start + ID PROVIDER MODULE FUNCTION NAME + 18705 postgresql49878 postgres StartTransactionCommand transaction-start + 18755 postgresql49877 postgres StartTransactionCommand transaction-start + 18805 postgresql49876 postgres StartTransactionCommand transaction-start + 18855 postgresql49875 postgres StartTransactionCommand transaction-start + 18986 postgresql49873 postgres StartTransactionCommand transaction-start +``` + +向C代码中添加追踪宏时,有一些事情需要注意: + +- 需要小心的是,为探针参数指定的数据类型要匹配宏中使用的变量的数据类型,否则会发生编译错误。 + +- 在大多数平台上,如果用`--enable-dtrace`编译了IvorySQL,无论何时当控制经过一个追踪宏时,都会评估该宏的参数,即使没有进行追踪也会这样做。通常不需要担心你是否只在报告一些局部变量的值。但是要注意不要将开销大的函数调用放入参数中。如果你需要这样做,考虑通过检查追踪是否真的被启用来保护该宏: + +``` + if (TRACE_POSTGRESQL_TRANSACTION_START_ENABLED()) + TRACE_POSTGRESQL_TRANSACTION_START(some_function(...)); +``` + +每个追踪宏有一个对应的`ENABLED`宏。 + +## 监控磁盘的使用 +### 判断磁盘用量 +每个表都有一个主要的堆磁盘文件,大多数数据都存储在其中。如果一个表有着可能会很宽(尺寸大)的列, 则另外还有一个TOAST文件与这个表相关联, 它用于存储因为太宽而不能存储在主表里面的值。如果有这个附属文件,那么TOAST表上会有一个可用的索引。 当然,同时还可能有索引和基表关联。每个表和索引都存放在单独的磁盘文件里 — 如果文件超过 1G 字节,甚至可能多于一个文件。 + +你可以以三种方式监视磁盘空间:使用oid2name模块或者人工观察系统目录。SQL函数是最容易使用的方法,同时也是我们通常推荐的方法。本节剩余的部分将展示如何通过观察系统目录来监视磁盘空间。 + +在一个最近清理过或者分析过的数据库上使用psql,你可以发出查询来查看任意表的磁盘用量: + +``` +SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer'; + + pg_relation_filepath | relpages +----------------------+---------- + base/16384/16806 | 60 +(1 row) +``` + +每个页通常都是 8K 字节(记住,`relpages`只会由`VACUUM`、`ANALYZE`和少数几个 DDL 命令如`CREATE INDEX`所更新)。如果你想直接检查表的磁盘文件,那么文件路径名应该有用。 + +要显示TOAST表使用的空间,我们可以使用一个类似下面这样的查询: + +``` +SELECT relname, relpages +FROM pg_class, + (SELECT reltoastrelid + FROM pg_class + WHERE relname = 'customer') AS ss +WHERE oid = ss.reltoastrelid OR + oid = (SELECT indexrelid + FROM pg_index + WHERE indrelid = ss.reltoastrelid) +ORDER BY relname; + + relname | relpages +----------------------+---------- + pg_toast_16806 | 0 + pg_toast_16806_index | 1 +``` + +你也可以很容易地显示索引的尺寸: + +``` +SELECT c2.relname, c2.relpages +FROM pg_class c, pg_class c2, pg_index i +WHERE c.relname = 'customer' AND + c.oid = i.indrelid AND + c2.oid = i.indexrelid +ORDER BY c2.relname; + + relname | relpages +-------------------+---------- + customer_id_index | 26 +``` + +我们很容易用下面的信息找出最大的表和索引: + +``` +SELECT relname, relpages +FROM pg_class +ORDER BY relpages DESC; + + relname | relpages +----------------------+---------- + bigtable | 3290 + customer | 3144 +``` + +### 磁盘满失败 +一个数据库管理员最重要的磁盘监控任务就是确保磁盘不会写满。一个写满了的数据磁盘可能不会导致数据的崩溃,但它肯定会让系统变得不可用。如果保存 WAL 文件的磁盘变满,会发生数据库服务器致命错误并且可能发生关闭。 + +如果你不能通过删除一些其他的东西来释放一些磁盘空间,那么你可以通过使用表空间把一些数据库文件移动到其他文件系统上去。 + +.提示 +**** +有些文件系统在快满的时候性能会急剧恶化,因此不要等到磁盘完全满的时候才采取行动。 +**** + +如果你的系统支持每用户的磁盘份额,那么数据库将自然地受制于用户所处的服务器给他的份额限制。超过份额的负面影响和完全用光磁盘是完全一样的。 \ No newline at end of file diff --git a/CN/modules/ROOT/pages/3.3.adoc b/CN/modules/ROOT/pages/3.3.md similarity index 91% rename from CN/modules/ROOT/pages/3.3.adoc rename to CN/modules/ROOT/pages/3.3.md index 54d3428d..2be9536e 100644 --- a/CN/modules/ROOT/pages/3.3.adoc +++ b/CN/modules/ROOT/pages/3.3.md @@ -1,16 +1,8 @@ - -:sectnums: -:sectnumlevels: 5 - - -= **日常维护** - -== 日常清理 - +# 日常维护 +## 日常清理 IvorySQL数据库要求周期性的清理维护。对于很多安装,让自动清理守护进程来执行清理已经足够,你也可能需要调整其中描述的自动清理参数来获得最佳结果。某些数据库管理员会希望使用手动管理的`VACUUM`命令来对后台进程的活动进行补充或者替换,这通常使用cron或任务计划程序脚本来执行。要正确地设置手动管理的清理。 -=== 清理的基础知识 - +### 清理的基础知识 IvorySQL的 VACUUM命令出于几个原因必须定期处理每一个表: 1. 恢复或重用被已更新或已删除行所占用的磁盘空间。 @@ -24,8 +16,7 @@ IvorySQL的 VACUUM命令出于几个原因必须定期处理每一个表: `VACUUM`会产生大量I/O流量,这将导致其他活动会话性能变差。可以调整一些配置参数来后台清理活动造成的性能冲击. -=== 恢复磁盘空间 - +### 恢复磁盘空间 在IvorySQL中,一次行的`UPDATE`或`DELETE`不会立即移除该行的旧版本。这种方法对于从多版本并发控制获益是必需的:当旧版本仍可能对其他事务可见时,它不能被删除。但是最后,任何事务都不会再对一个过时的或者被删除的行版本感兴趣。它所占用的空间必须被回收来用于新行,这样可避免磁盘空间需求的无限制增长。这通过运行`VACUUM`完成。 `VACUUM`的标准形式移除表和索引中的死亡行版本并将该空间标记为可在未来重用。不过,它将不会把该空间交还给操作系统,除非在特殊的情况中表尾部的一个或多个页面变成完全空闲并且能够很容易地得到一个排他表锁。相反,`VACUUM FULL`通过把死亡空间之外的内容写成一个完整的新版本表文件来主动紧缩表。这将最小化表的尺寸,但是要花较长的时间。它也需要额外的磁盘空间用于表的新副本,直到操作完成。 @@ -46,8 +37,7 @@ IvorySQL的 VACUUM命令出于几个原因必须定期处理每一个表: 如果你有一个表,它的整个内容会被周期性删除,考虑用TRUNCATE而不是先用`DELETE`再用`VACUUM`。`TRUNCATE`会立刻移除该表的整个内容,而不需要一次后续的`VACUUM`或`VACUUM FULL`来回收现在未被使用的磁盘空间。其缺点是会违背严格的 MVCC 语义。 **** -=== 更新规划器统计信息 - +### 更新规划器统计信息 IvorySQL查询规划器依赖于有关表内容的统计信息来为查询产生好的计划。这些统计信息由ANALYZE命令收集,它除了直接被调用之外还可以作为`VACUUM`的一个可选步骤被调用。拥有适度准确的统计信息很重要,否则差的计划可能降低数据库性能。 自动清理守护进程如果被启用,当一个表的内容被改变得足够多时,它将自动发出`ANALYZE`命令。不过,管理员可能更喜欢依靠手动的`ANALYZE`操作,特别是如果知道一个表上的更新活动将不会影响“感兴趣的”列的统计信息时。守护进程严格地按照一个被插入或更新行数的函数来计划`ANALYZE`,它不知道那是否将导致有意义的统计信息改变。 @@ -71,15 +61,13 @@ IvorySQL查询规划器依赖于有关表内容的统计信息来为查询产生 autovacuum守护进程不会对分区表发出ANALYZE命令。继承性父表只有在父表本身发生变化时才会被分析--对子表的变化不会触发对父表的自动分析。如果你的查询需要对父表进行统计以进行正确的规划,那么有必要定期对这些表运行手动ANALYZE以保持统计的最新性。 **** -=== 更新可见性映射 - +### 更新可见性映射 清理机制为每一个表维护着一个可见性映射,它被用来跟踪哪些页面只包含对所有活动事务(以及所有未来的事务,直到该页面被再次修改)可见的元组。这样做有两个目的。第一,清理本身可以在下一次运行时跳过这样的页面,因为其中没有什么需要被清除。 -第二,这允许IvorySQL回答一些只用索引的查询,而不需要引用底层表。因为IvorySQL的索引不包含元组的可见性信息,一次普通的索引扫描会为每一个匹配的索引项获取堆元组,用来检查它是否能被当前事务所见。另一方面,一次*只用索引的扫描*会首先检查可见性映射。如果它了解到在该页面上的所有元组都是可见的,堆获取就可以被跳过。这对大数据集很有用,因为可见性映射可以防止磁盘访问。可见性映射比堆小很多,因此即使堆非常大,可见性映射也可以很容易地被缓存起来。 +第二,这允许IvorySQL回答一些只用索引的查询,而不需要引用底层表。因为IvorySQL的索引不包含元组的可见性信息,一次普通的索引扫描会为每一个匹配的索引项获取堆元组,用来检查它是否能被当前事务所见。另一方面,一次**只用索引的扫描**会首先检查可见性映射。如果它了解到在该页面上的所有元组都是可见的,堆获取就可以被跳过。这对大数据集很有用,因为可见性映射可以防止磁盘访问。可见性映射比堆小很多,因此即使堆非常大,可见性映射也可以很容易地被缓存起来。 -=== 防止事务ID回卷失败 - -IvorySQL的 MVCC 事务语义依赖于能够比较事务 ID(XID)数字:如果一个行版本的插入 XID 大于当前事务的 XID,它就是“属于未来的”并且不应该对当前事务可见。但是因为事务 ID 的尺寸有限(32位),一个长时间(超过 40 亿个事务)运行的集簇会遭受到*事务 ID 回卷*问题:XID 计数器回卷到 0,并且本来属于过去的事务突然间就变成了属于未来 — 这意味着它们的输出变成不可见。简而言之,灾难性的数据丢失(实际上数据仍然在那里,但是如果你不能得到它也无济于事)。为了避免发生这种情况,有必要至少每 20 亿个事务就清理每个数据库中的每个表。 +### 防止事务ID回卷失败 +IvorySQL的 MVCC 事务语义依赖于能够比较事务 ID(XID)数字:如果一个行版本的插入 XID 大于当前事务的 XID,它就是“属于未来的”并且不应该对当前事务可见。但是因为事务 ID 的尺寸有限(32位),一个长时间(超过 40 亿个事务)运行的集簇会遭受到**事务 ID 回卷**问题:XID 计数器回卷到 0,并且本来属于过去的事务突然间就变成了属于未来 — 这意味着它们的输出变成不可见。简而言之,灾难性的数据丢失(实际上数据仍然在那里,但是如果你不能得到它也无济于事)。为了避免发生这种情况,有必要至少每 20 亿个事务就清理每个数据库中的每个表。 周期性的清理能够解决该问题的原因是,VACUUM会把行标记为 冻结,这表示它们是被一个在足够远的过去提交的事务所插入,这样从 MVCC 的角度来看,效果就是该插入事务对所有当前和未来事务来说当然都 是可见的。IvorySQL保留了一个特殊的 XID (FrozenTransactionId),这个 XID 并不遵循普通 XID 的比较规则 并且总是被认为比任何普通 XID 要老。普通 XID 使用模-232算 法来比较。这意味着对于每一个普通 XID都有 20 亿个 XID “更老”并且 有 20 亿个“更新”,另一种解释的方法是普通 XID 空间是没有端点的环。因此,一旦一个行版本创建时被分配了一个特定的普通 XID,该行版本将成为接下 来 20 亿个事务的“过去”(与我们谈论的具体哪个普通 XID 无关)。如果在 20 亿个事务之后该行版本仍然存在,它将突然变得好像在未来。要阻止这一切 发生,被冻结行版本会被看成其插入 XID 为`FrozenTransactionId`, 这样它们对所有普通事务来说都是“在过去”,而不管回卷问题。并且这样的行版本将一直有效直到被删除,不管它有多旧。 @@ -129,7 +117,7 @@ HINT: Stop the postmaster and vacuum that database in single-user mode. 这 3 百万个事务的安全余量是为了让管理员能通过手动执行所要求的`VACUUM`命令进行恢复而不丢失数据。但是,由于一旦系统进入到安全关闭模式,它将不会执行命令。做这个操作的唯一方法是停止服务器并且以单一用户启动服务器来执行`VACUUM`。单一用户模式中不会强制该关闭模式。 -*Multixact ID*被用来支持被多个事务锁定的行。由于在一个元组头部 只有有限的空间可以用来存储锁信息,所以只要有多于一个事务并发地锁住一个行, 锁信息将使用一个“多个事务 ID”(或简称多事务 ID)来编码。任何特定 多事务 ID 中包括的事务 ID 的信息被独立地存储在`pg_multixact`子目 录中,并且只有多事务 ID 出现在元组头部的`xmax`域中。和事务 ID 类似,多事务 ID 也是用一个 32 位计数器实现,并且也采用了相似的存储,这些都要 求仔细的年龄管理、存储清除和回卷处理。在每个多事务中都有一个独立的存储区域 保存成员列表,它也使用一个 32 位计数器并且也应被管理。 +**Multixact ID**被用来支持被多个事务锁定的行。由于在一个元组头部 只有有限的空间可以用来存储锁信息,所以只要有多于一个事务并发地锁住一个行, 锁信息将使用一个“多个事务 ID”(或简称多事务 ID)来编码。任何特定 多事务 ID 中包括的事务 ID 的信息被独立地存储在`pg_multixact`子目 录中,并且只有多事务 ID 出现在元组头部的`xmax`域中。和事务 ID 类似,多事务 ID 也是用一个 32 位计数器实现,并且也采用了相似的存储,这些都要 求仔细的年龄管理、存储清除和回卷处理。在每个多事务中都有一个独立的存储区域 保存成员列表,它也使用一个 32 位计数器并且也应被管理。 在一次`VACUUM`表扫描(部分或者全部)期间,任何比 vacuum_multixact_freeze_min_age 要老的多事务 ID 会被替换为一个不同的值,该值可以是零值、 一个单一事务 ID 或者一个更新的多事务 ID。 对于每一个表,`pg_class`.`relminmxid` 存储了在该表任意元组中仍然存在的最老可能多事务 ID。如果这个值比 vacuum_multixact_freeze_table_age老, 将强制一次全表扫描。可以在 `pg_class`.`relminmxid` 上使用`mxid_age()`来找到它的年龄。 @@ -137,11 +125,10 @@ HINT: Stop the postmaster and vacuum that database in single-user mode. 作为一种安全设备,对任何多事务年龄超过 autovacuum_multixact_freeze_max_age的表, 都将发生一次全表清理扫描。当多事务成员占用的存储超过 2GB 时,从那些具有最老多事务年龄的表开始,全表清理扫描也将逐步在所有表上进行。即使自动清理被 在名义上被禁用,也会发生这两种主动扫描。 -=== 自动清理后台进程 - -IvorySQL有一个可选的但是被高度推荐的特性*autovacuum*,它的目的是自动执行`VACUUM`和`ANALYZE`命令。当它被启用时,自动清理会检查被大量插入、更新或删除元组的表。这些检查会利用统计信息收集功能,因此除非track_counts被设置为`true`,自动清理不能被使用。在默认配置下,自动清理是被启用的并且相关配置参数已被正确配置。 +### 自动清理后台进程 +IvorySQL有一个可选的但是被高度推荐的特性**autovacuum**,它的目的是自动执行`VACUUM`和`ANALYZE`命令。当它被启用时,自动清理会检查被大量插入、更新或删除元组的表。这些检查会利用统计信息收集功能,因此除非track_counts被设置为`true`,自动清理不能被使用。在默认配置下,自动清理是被启用的并且相关配置参数已被正确配置。 -“自动清理后台进程”实际上由多个进程组成。有一个称为 *自动清理启动器*的常驻后台进程, 它负责为所有数据库启动*自动清理工作者*进程。 启动器将把工作散布在一段时间上,它每隔 autovacuum_naptime秒尝试在每个数据库中启动一个工作者 (因此,如果安装中有*`N`*个数据库,则每 `autovacuum_naptime`/*N秒将启动一个新的工作者)。 在同一时间只允许最多autovacuum_max_workers个工作者进程运行。如果有超过`autovacuum_max_workers` 个数据库需要被处理,下一个数据库将在第一个工作者结束后马上被处理。 每一个工作者进程将检查其数据库中的每一个表并且在需要时执行 `VACUUM`和/或`ANALYZE`。 可以设置log_autovacuum_min_duration来监控自动清理工作者的活动。 +“自动清理后台进程”实际上由多个进程组成。有一个称为 **自动清理启动器**的常驻后台进程, 它负责为所有数据库启动**自动清理工作者**进程。 启动器将把工作散布在一段时间上,它每隔 autovacuum_naptime秒尝试在每个数据库中启动一个工作者 (因此,如果安装中有*`N`*个数据库,则每 `autovacuum_naptime`/*N秒将启动一个新的工作者)。 在同一时间只允许最多autovacuum_max_workers个工作者进程运行。如果有超过`autovacuum_max_workers` 个数据库需要被处理,下一个数据库将在第一个工作者结束后马上被处理。 每一个工作者进程将检查其数据库中的每一个表并且在需要时执行 `VACUUM`和/或`ANALYZE`。 可以设置log_autovacuum_min_duration来监控自动清理工作者的活动。 如果在一小段时间内多个大型表都变得可以被清理,所有的自动清理工作者可能都会被占用来在一段长的时间内清理这些表。这将会造成其他的表和数据库无法被清理,直到一个工作者变得可用。对于一个数据库中的工作者数量并没有限制,但是工作者确实会试图避免重复已经被其他工作者完成的工作。注意运行着的工作者的数量不会被计入max_connections或superuser_reserved_connections限制。 @@ -159,7 +146,7 @@ IvorySQL有一个可选的但是被高度推荐的特性*autovacuum*,它的目 清理插入阈值 = 清理基础插入阈值 + 清理插入缩放系数 * 元组数 ``` -清理插入基础阈值为autovacuum_vacuum_insert_threshold,清理插入缩放系数为autovacuum_vacuum_insert_scale_factor。 这样的清理可以允许部分的表被标识为*all visible*,并且也可以允许元组被冻结,可以减小后续清理的工作需要。 对于可以接收`INSERT`操作但是不能或几乎不能`UPDATE`/`DELETE`操作的表, 可能会从降低表的autovacuum_freeze_min_age中受益,因为这可能允许元组在早期清理中被冻结。 废弃元组的数量和插入元组的数量可从统计收集器中获得;它是一个半精确的计数,由每个`UPDATE`、`DELETE` 和 `INSERT` 操作进行更新。 (它只是半精确的,因为一些信息可能会在重负载情况下丢失。) 如果表的`relfrozenxid`值大于`vacuum_freeze_table_age` 事务老的, 执行一个主动的清理来冻结旧的元组,并推进`relfrozenxid`;否则,只有上次清理以后修改过的页面被扫描。 +清理插入基础阈值为autovacuum_vacuum_insert_threshold,清理插入缩放系数为autovacuum_vacuum_insert_scale_factor。 这样的清理可以允许部分的表被标识为**all visible**,并且也可以允许元组被冻结,可以减小后续清理的工作需要。 对于可以接收`INSERT`操作但是不能或几乎不能`UPDATE`/`DELETE`操作的表, 可能会从降低表的autovacuum_freeze_min_age中受益,因为这可能允许元组在早期清理中被冻结。 废弃元组的数量和插入元组的数量可从统计收集器中获得;它是一个半精确的计数,由每个`UPDATE`、`DELETE` 和 `INSERT` 操作进行更新。 (它只是半精确的,因为一些信息可能会在重负载情况下丢失。) 如果表的`relfrozenxid`值大于`vacuum_freeze_table_age` 事务老的, 执行一个主动的清理来冻结旧的元组,并推进`relfrozenxid`;否则,只有上次清理以后修改过的页面被扫描。 对于分析,也使用了一个相似的阈值: @@ -171,7 +158,7 @@ IvorySQL有一个可选的但是被高度推荐的特性*autovacuum*,它的目 临时表不能被自动清理访问。因此,临时表的清理和分析操作必须通过会话期间的SQL命令来执行。 -默认的阈值和缩放系数都取自于`postgresql.conf`,但是可以为每一个表重写它们(和许多其他自动清理控制参数), 详情参见Storage Parameters。 如果一个设置已经通过一个表的存储参数修改,那么在处理该表时使用该值,否则使用全局设置。 +默认的阈值和缩放系数都取自于`postgresql.conf`,但是可以为每一个表重写它们(和许多其他自动清理控制参数), 详情参见Storage Parameters。 如果一个设置已经通过一个表的存储参数修改,那么在处理该表时使用该值,否则使用全局设置。 当多个工作者运行时,在所有运行着的工作者之间自动清理代价延迟参数是 “平衡的”,这样不管实际运行的工作者数量是多少, 对于系统的总体 I/O 影响总是相同的。不过,任何正在处理已经设置了每表 `autovacuum_vacuum_cost_delay`或 `autovacuum_vacuum_cost_limit` 存储参数的表的工作者不会被考虑在均衡算法中。 @@ -182,8 +169,7 @@ autovacuum工作进程通常不会阻止其他命令。如果某个进程尝试 定期运行需要获取与`SHARE UPDATE EXCLUSIVE`锁冲突的锁的命令(例如ANALYZE)可能会让autovacuum始终无法完成。 **** -== 日常重建索引 - +## 日常重建索引 在某些情况下值得周期性地使用REINDEX命令或一系列独立重构步骤来重建索引。 已经完全变成空的B树索引页面被收回重用。但是,还是有一种低效的空间利用的可能性:如果一个页面上除少量索引键之外的全部键被删除,该页面仍然被分配。因此,在这种每个范围中大部分但不是全部键最终被删除的使用模式中,可以看到空间的使用是很差的。对于这样的使用模式,推荐使用定期重索引。 @@ -194,8 +180,7 @@ autovacuum工作进程通常不会阻止其他命令。如果某个进程尝试 REINDEX在所有情况下都可以安全和容易地使用。 默认情况下,此命令需要一个`ACCESS EXCLUSIVE`锁,因此通常最好使用`CONCURRENTLY`选项执行它,该选项仅需要获取`SHARE UPDATE EXCLUSIVE`锁。 -== 日志文件维护 - +## 日志文件维护 把数据库服务器的日志输出保存在一个地方是个好主意, 而不是仅仅通过`/dev/null`丢弃它们。 在进行问题诊断的时候,日志输出是非常宝贵的。不过,日志输出可能很庞大(特别是在比较高的调试级别上), 因此你不会希望无休止地保存它们。你需要轮转日志文件, 这样在一段合理的时间后会开始新的日志文件并且移除旧的。 如果你简单地把`postgres`的stderr定向到一个文件中,你会得到日志输出,但是截断该日志文件的唯一方法是停止并重起服务器。这样做对于开发环境中使用的IvorySQL可能是可接受的,但是你肯定不想在生产环境上这么干。 @@ -221,69 +206,59 @@ pg_ctl start | rotatelogs /var/log/pgsql_log 86400 请注意上面描述的所有解决方案关注的是在可配置的间隔上开始一个新的日志文件, 但它们并没有处理对旧的、不再需要的日志文件的删除。你可能还需要设置一个批处理任务来定期地删除旧日志文件。 另一种可能的方法是配置日志轮转程序,让它循环地覆盖旧的日志文件。 -https://pgbadger.darold.net/[pgBadger] 是一个外部项目,它可以进行日志文件的深度分析。check_postgres可在重要消息出现在日志文件中时向Nagios提供警告,也可以探测很多其他的特别情况。 - -== 高可用、负载均衡和复制 - -=== 不同方案的比较 - -==== 共享磁盘故障转移 +[pgBadger](https://pgbadger.darold.net/) 是一个外部项目,它可以进行日志文件的深度分析。check_postgres可在重要消息出现在日志文件中时向Nagios提供警告,也可以探测很多其他的特别情况。 +## 高可用、负载均衡和复制 +### 不同方案的比较 +#### 共享磁盘故障转移 共享磁盘故障转移避免了只使用一份数据库拷贝带来的同步开销。它使用一个由多个服务器共享的单一磁盘阵列。如果主数据库服务器失效,后备服务器则可以挂载并启动数据库,就好像它从一次数据库崩溃中恢复过来了。这是一种快速的故障转移,并且不存在数据丢失。 共享硬件功能在网络存储设备中很常见。也可以使用一个网络文件系统,但是要注意的是该文件系统应具有完全的POSIX行为。这种方法的一个重大限制是如果共享磁盘阵列失效或损坏,主要和后备服务器都会变得无法工作。另一个问题是在主要服务器运行时,后备服务器永远不能访问共享存储。 -==== 文件系统(块设备)复制 - +#### 文件系统(块设备)复制 共享硬件功能的一种修改版本是文件系统复制,在其中对一个文件系统的所有改变会被镜像到位于另一台计算机上的一个文件系统。唯一的限制是该镜像过程必须能保证后备服务器有一份该文件系统的一致的拷贝 — 特别是对后备服务器的写入必须按照主控机上相同的顺序进行。DRBD是用于 Linux 的一种流行的文件系统复制方案。 -==== 预写式日志传送 - +#### 预写式日志传送 温备和热备服务器能够通过读取一个预写式日志(WAL)记录的流来保持为当前状态。如果主服务器失效,后备服务器拥有主服务器的几乎所有数据,并且能够快速地被变成新的主数据库服务器。这可以是同步的或异步的,并且只能用于整个数据库服务器。 可以使用基于文件的日志传送、流复制或两者的组合来实现一个后备服务器。 -==== 逻辑复制 - +#### 逻辑复制 逻辑复制允许数据库服务器发送数据更新流给另一台服务器。IvorySQL逻辑复制从WAL构建出逻辑数据更新流。逻辑复制允许您逐个表复制数据更改。此外,发布数据更新的服务器可以同时订阅其他服务器的更改,从而允许数据在多个方向流动。第三方扩展也能提供类似的功能。 -==== 基于触发器的主-备复制 - +#### 基于触发器的主-备复制 基于触发器的复制通常会将修改数据的查询发送到指定的主服务器。它在逐个表的基础上工作,主服务器(通常)将数据更改异步发送到后备服务器。 主服务器运行时,后备服务器可以响应查询,并执行本地数据修改或写入操作。这种形式的复制通常用于减轻大数据分析型平台或者数据仓库查询负荷。 Slony-I是这种复制类型的一个例子。它使用表粒度,并且支持多个后备服务器。因为它会异步更新后备服务器(批量),在故障转移时可能会有数据丢失。 -==== 基于SQL的复制中间件 - +#### 基于SQL的复制中间件 通过基于SQL的复制中间件,一个程序拦截每一个 SQL 查询并把它发送给一个或所有服务器。每一个服务器独立地操作。读写查询必须被发送给所有服务器,这样每一个服务器都能接收到任何修改。但只读查询可以只发送给一个服务器,这样允许读负载在服务器之间分布。 如果查询未经修改发送,则函数`random()`函数的随机值和`CURRENT_TIMESTAMP`函数的当前时间和序列值可能因不同服务器而异。 因为每个服务器独立运行,并且它发送 SQL 查询而没有真正的更改数据。如果这是不可接受的,那么中间件或应用程序必须从单一服务器源确定此类值,并将结果用于写入查询。 还必须注意确保所有服务器在提交或中止事务时都是相同的。这将涉及使用 两阶段提交PREPARE TRANSACTION和COMMIT PREPARED。 Pgpool-II和Continuent Tungsten就是这种复制的例子。 -==== 异步多主控机复制 - +#### 异步多主控机复制 对于不会被定期连接或通讯链路较慢的服务器,如笔记本或远程服务器,保持服务器间的数据一致是一个挑战。通过使用异步的多主控机复制,每一个服务器独立工作并且定期与其他服务器通信来确定冲突的事务。这些冲突可以由用户或冲突解决规则来解决。Bucardo 是这种复制类型的一个例子。 -==== 同步多主控机复制 - +#### 同步多主控机复制 在同步多主控机复制中,每一个服务器能够接受写请求,并且在每一个事务提交之前,被修改的数据会被从原始服务器传送给每一个其他服务器。繁重的写活动可能导致过多的锁定和提交延迟,进而导致很差的性能。读请求可以被发送给任意服务器。某些实现使用共享磁盘来减少通信负荷。同步多主控机复制主要对于读负载最好,尽管它的大优点是任意服务器都能接受写请求 — 没有必要在主服务器和后备服务器之间划分负载,并且因为数据修改被从一个服务器发送到另一个服务器,不会有非确定函数(如`random()`)的问题。 IvorySQL不提供这种复制类型,尽管在应用代码或中间件中可以使用 IvorySQL 的两阶段提交PREPARE TRANSACTION和COMMIT PREPARED来实现这种复制。 下表总结了上述多种方案的能力。 -|==== -| 特性 | 共享磁盘 | 文件系统复制 | 预写式日志传送 | 逻辑复制 | 基于触发器的复制 | SQL复制中间件 | 异步多主控机复制 | 同步多主控机复制 -| 常用的示例 | NAS | DRBD | 内建流复制 | 内建逻辑复制,pglogical | Londiste,Slony | pgpool-II | Bucardo | -| 通信方法 | 共享磁盘 | 磁盘块 | WAL | 逻辑解码 | 表行 | SQL | 表行 | 表行和行锁 -| 不要求特殊硬件 | | • | • | • | • | • | • | • -| 允许多个主控机服务器 | | | | • | | • | • | • -| 无主服务器负载 | • | | • | • | | • | | -| 不等待多个服务器 | • | | with sync off | with sync off | • | | • | -| 主控机失效将永不丢失数据 | • | • | with sync on | with sync on | | • | | • -| 复制体接受只读查询 | | | with hot | • | • | • | • | • -| 每个表粒度 | | | | • | • | | • | • -| 不需要冲突解决 | • | • | • | | • | • | | • -|==== +| 特性 | 共享磁盘 | 文件系统复制 | 预写式日志传送 | 逻辑复制 | 基于触发器的复制 | SQL复制中间件 | 异步多主控机复制 | 同步多主控机复制 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 常用的示例 | NAS | DRBD | 内建流复制 | 内建逻辑复制,pglogical | Londiste,Slony | pgpool-II | Bucardo | +| 通信方法 | 共享磁盘 | 磁盘块 | WAL | 逻辑解码 | 表行 | SQL | 表行 | 表行和行锁 | +| 不要求特殊硬件 | | • | • | • | • | • | • | • | +| 允许多个主控机服务器 | | | | • | | • | • | • | +| 无主服务器负载 | • | | • | • | | • | | +| 不等待多个服务器 | • | | with sync off | with sync off | • | | • | +| 主控机失效将永不丢失数据 | • | • | with sync on | with sync on | | • | | • | +| 复制体接受只读查询 | | | with hot | • | • | • | • | • | +| 每个表粒度 | | | | • | • | | • | • | +| 不需要冲突解决 | • | • | • | | • | • | | • | + 有一些方案不适合上述的类别: @@ -295,16 +270,13 @@ IvorySQL不提供这种复制类型,尽管在应用代码或中间件中可以 上述的很多方案允许多个服务器来处理多个查询,但是没有一个允许一个单一查询使用多个服务器来更快完成。 这种方案允许多个服务器在一个单一查询上并发工作。 这通常通过把数据在服务器之间划分并且让每一个服务器执行该查询中属于它的部分,然后将结果返回给一个中心服务器,由它整合结果并发回给用户。 这也可以使用PL/Proxy工具集来实现这种方案。 -=== 日志传送后备服务器 - -==== 规划 - +### 日志传送后备服务器 +#### 规划 创建主服务器和后备服务器通常是明智的,因此它们可以尽可能相似,至少从数据库服务器的角度来看是这样。特别地,与表空间相关的路径名将被未经修改地传递,因此如果该特性被使用,主、备服务器必须对表空间具有完全相同的挂载路径。记住如果CREATE TABLESPACE在主服务器上被执行,在命令被执行前,它所需要的任何新挂载点必须在主服务器和所有后备服务器上先创建好。硬件不需要完全相同,但是经验显示,在应用和系统的生命期内维护两个相同的系统比维护两个不相似的系统更容易。在任何情况下硬件架构必须相同 — 从一个 32 位系统传送到一个 64 位系统将不会工作。 通常,不能在两个运行着不同主版本IvorySQL的服务器之间传送日志。IvorySQL 全球开发组的策略是不在次版本升级中改变磁盘格式,因此在主服务器和后备服务器上运行不同次版本将会成功地工作。不过,在这方面并没有提供正式的支持,因此我们建议让主备服务器上运行的版本尽可能相同。当升级到一个新的次版本时,最安全的策略是先升级后备服务器 — 一个新的次版本发行更可能兼容从前一个次版本读取 WAL 文件。 -==== 后备服务器操作 - +#### 后备服务器操作 服务器启动时,数据目录中存在 `standby.signal` 文件,服务器进入standby模式。 在后备模式中,服务器持续地应用从主控服务器接收到的 WAL。后备服务器可以从一个 WAL 归档restore_command或者通过一个 TCP 连接直接从主控机(流复制)读取 WAL。后备服务器将也尝试恢复在后备集簇的`pg_wal`目录中找到的 WAL。那通常在一次数据库重启后发生,那时后备机将在重启之前重播从主控机流过来的 WAL,但是你也可以在任何时候手动拷贝文件到`pg_wal`让它们被重播。 @@ -313,14 +285,12 @@ IvorySQL不提供这种复制类型,尽管在应用代码或中间件中可以 当`pg_ctl promote`被运行,`pg_promote()`被调用,或一个触发器文件被找到(`promote_trigger_file`),后备模式会退出并且服务器会切换到普通操作。 在故障转移之前,在归档或`pg_wal`中立即可用的任何 WAL 将被恢复,但不会尝试连接到主控机。 -==== 为后备服务器准备主控机 - +#### 为后备服务器准备主控机 在主服务器上设置连续归档到一个后备服务器可访问的归档目录。即使主服务器垮掉该归档位置也应当是后备服务器可访问的,即它应当位于后备服务器本身或者另一个可信赖的服务器,而不是位于主控服务器上。 如果你想要使用流复制,在主服务器上设置认证来允许来自后备服务器的复制连接。即创建一个角色并且在`pg_hba.conf`中提供一个或多个数据库域被设置为`replication`的项。还要保证在主服务器的配置文件中`max_wal_senders`被设置为足够大的值。如果要使用复制槽,请确保`max_replication_slots`也被设置得足够高。 -==== 建立一个后备服务器 - +#### 建立一个后备服务器 要建立后备服务器,恢复从主服务器取得的基础备份。在后备服务器的集簇数据目录中创建一个文件standby.signal。将restore_command设置为一个从 WAL 归档中复制文件的简单命令。 如果你计划为了高可用性目的建立多个后备服务器,确认`recovery_target_timeline`被设置为`latest` (默认)来使得该后备服务器遵循发生在故障转移到另一个后备服务器之后发生的时间线改变。 .注意 @@ -344,8 +314,7 @@ archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r' 你可以有任意数量的后备服务器,但是如果你使用流复制,确保你在主服务器上将`max_wal_senders`设置得足够高,这样可以允许它们能同时连接。 -==== 流复制 - +#### 流复制 流复制允许一台后备服务器比使用基于文件的日志传送更能保持为最新的状态。后备服务器连接到主服务器,主服务器则在 WAL 记录产生时即将它们以流式传送给后备服务器而不必等到 WAL 文件被填充。 默认情况下流复制是异步的,在这种情况下主服务器上提交一个事务与该变化在后备服务器上变得可见之间存在短暂的延迟。不过这种延迟比基于文件的日志传送方式中要小得多,在后备服务器的能力足以跟得上负载的前提下延迟通常低于一秒。在流复制中,不需要`archive_timeout`来缩减数据丢失窗口。 @@ -360,8 +329,7 @@ archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r' 当后备服务器被启动并且`primary_conninfo`被正确设置,后备服务器将在重放完归档中所有可用的 WAL 文件之后连接到主服务器。 如果连接被成功建立,你将在后备服务器中看到一个 `walreceiver`,并且在主服务器中有一个相应的 `walsender` 进程。 -===== 认证 - +##### 认证 设置好用于复制的访问权限非常重要,这样只有受信的用户可以读取 WAL 流,因为很容易从 WAL 流中抽取出需要特权才能访问的信息。 后备服务器必须作为一个具有`REPLICATION`特权的账户或一个超级用户来向主服务器认证。 推荐为复制创建一个专用的具有`REPLICATION`和`LOGIN`特权的用户账户。 虽然`REPLICATION`特权给出了非常高的权限,但它不允许用户修改主系统上的任何数据,而`SUPERUSER`特权则可以。 复制的客户端认证由一个在*`database`*域中指定`replication`的`pg_hba.conf`记录控制。例如,如果后备服务器运行在主机 IP `192.168.1.100`并且用于复制的账户名为`foo`,管理员可以在主服务器上向`pg_hba.conf`文件增加下列行: @@ -375,7 +343,6 @@ host replication foo 192.168.1.100/32 md5 ``` - 主服务器的主机名和端口号、连接用户名和口令在primary_conninfo中指定。在后备服务器上还可以在`~/.pgpass`文件中设置口令(在*`database`*域中指定`replication`)。例如,如果主服务器运行在主机 IP `192.168.1.50`、端口`5432`上,并且口令为`foopass`,管理员可以在后备服务器的`postgresql.conf`文件中增加下列行: ``` @@ -384,32 +351,28 @@ host replication foo 192.168.1.100/32 md5 primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' ``` -===== 监控 - +##### 监控 流复制的一个重要健康指标是在主服务器上产生但还没有在后备服务器上应用的 WAL 记录数。你可以通过比较主服务器上的当前 WAL 写位置和后备服务器接收到的最后一个 WAL 位置来计算这个滞后量。这些位置分别可以用主服务器上的`pg_current_wal_lsn`和后备服务器上的`pg_last_wal_receive_lsn`来检索。后备服务器的最后 WAL 接收位置也被显示在 WAL 接收者进程的进程状态中,即使用`ps`命令显示的状态。 你可以通过pg_stat_replication视图检索 WAL 发送者进程的列表。 `pg_current_wal_lsn`与`sent_lsn`域之间的巨大差异表示主服务器承受着巨大的负载,而`sent_lsn`和后备服务器上`pg_last_wal_receive_lsn`之间的差异可能表示网络延迟或者后备服务器正承受着巨大的负载。 在一台热后备上,WAL接收者进程的状态可以通过pg_stat_wal_receiver`视图检索到。 `pg_last_wal_replay_lsn`和该视图的`flushed_lsn`的差别表示WAL的接收速度大于它被重放的速度。 -==== 复制槽 - +#### 复制槽 复制槽提供了一种自动化的方法来确保主控机在所有的后备机收到 WAL 段 之前不会移除它们,并且主控机也不会移除可能导致恢复冲突的行,即使后备机断开也是如此。 作为复制槽的替代,也可以使用wal_keep_size阻止移除旧的 WAL 段,或者使用archive_command把段保存在一个归档中。 不过,这些方法常常会导致保留的 WAL 段比需要的更多,而复制槽只保留已知所需要的段。 另一方面,复制槽可以保留很多的WAL段以至于它们填满了分配给`pg_wal`的空间; max_slot_wal_keep_size限制复制槽所保留的WAL文件的大小。 类似地,hot_standby_feedback和 vacuum_defer_cleanup_age保护了相关行不被 vacuum 移除,但是前者在后备机断开期间无法提供保护,而后者则需要被设置为一个很高 的值已提供足够的保护。复制槽克服了这些缺点。 -===== 查询和操纵复制槽 - +##### 查询和操纵复制槽 每个复制槽都有一个名字,名字可以包含小写字母、数字和下划线字符。 已有的复制槽和它们的状态可以在 pg_replication_slots视图中看到。 槽可以通过流复制协议 或者 SQL 函数创建并且移除。 -===== 配置实例 - +##### 配置实例 你可以这样创建一个复制槽: ``` @@ -419,7 +382,7 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot'); node_a_slot | postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots; - slot_name | slot_type | active + slot_name | slot_type | active -------------+-----------+-------- node_a_slot | physical | f (1 row) @@ -432,8 +395,7 @@ primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' primary_slot_name = 'node_a_slot' ``` -==== 级联复制 - +#### 级联复制 级联复制特性允许一台后备服务器接收复制连接并且把 WAL 记录流式传送给其他后备服务器,就像一个转发器一样。这可以被用来减小对于主控机的直接连接数并且使得站点间的带宽开销最小化。 一台同时扮演着接收者和发送者角色的后备服务器被称为一台级联后备服务器。“更直接”(通过更少的级联后备服务器)连接到主控机的后备服务器被称为上游服务器,而那些离得更远的后备服务器被称为下游服务器。级联复制并没有对下游服务器的数量或布置设定限制。 @@ -448,8 +410,7 @@ primary_slot_name = 'node_a_slot' 要使用级联复制,需配置级联后备服务器以允许接收复制连接(即设置max_wal_senders和hot_standby,并且配置基于主机的认证)。你还将需要设置下游后备服务器中的`primary_conninfo`指向级联后备服务器。 -==== 同步复制 - +#### 同步复制 PostgreSQL流复制默认是异步的。如果主服务器崩溃,则某些已被提交的事务可能还没有被复制到后备服务器,这会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。 同步复制能够保证一个事务的所有修改都能被传送到一台或者多台同步后备服务器。这扩大了由一次事务提交所提供的标准持久化级别。在计算机科学理论中这种保护级别被称为 2-safe 复制。而当`synchronous_commit`被设置为`remote_write`时,则是 group-1-safe (group-safe 和 1-safe)。 @@ -460,8 +421,7 @@ PostgreSQL流复制默认是异步的。如果主服务器崩溃,则某些已 同步后备可以是物理复制后备或者是逻辑复制订阅者。它还可以是任何其他物理或者逻辑WAL复制流的消费者,它懂得如何发送恰当的反馈消息。除内建的物理和逻辑复制系统之外,还包括`pg_receivewal`和`pg_recvlogical`之类的特殊程序,以及一些第三方复制系统和定制程序。同步复制支持的细节请查看相应的文档。 -===== 基本配置 - +##### 基本配置 一旦流复制已经被配置,配置同步复制就只需要一个额外的配置步骤:synchronous_standby_names必须被设置为一个非空值。`synchronous_commit`也必须被设置为`on`,但由于这是默认值,通常不需要改变。这样的配置将导致每一次提交都等待确认消息,以保证后备服务器已经将提交记录写入到持久化存储中。`synchronous_commit`可以由个体用户设置,因此它可以在配置文件中配置、可以为特定用户或数据库配置或者由应用动态配置,这样可以在一种每事务基础上控制持久性保证。 在一个提交记录已经在主服务器上被写入到磁盘后,WAL 记录接着被发送到后备服务器。每次一批新的 WAL 数据被写入到磁盘后,后备服务器会发送回复消息,除非在后备服务器上`wal_receiver_status_interval`被设置为零。如果`synchronous_commit`被设置为`remote_apply`,当提交记录被重放时后备服务器会发送回应消息,这会让该事务变得可见。如果根据主服务器的`synchronous_standby_names`设置选中该后备服务器作为一个同步后备,将会根据来自该后备服务器和其他同步后备的回应消息来决定何时释放正在等待确认提交记录被收到的事务。这些参数允许管理员指定哪些后备服务器应该是同步后备。注意同步复制的配置主要在主控机上。命名的后备服务器必须直接连接到主控机,主控机对使用级联复制的下游后备服务器一无所知。 @@ -472,8 +432,7 @@ PostgreSQL流复制默认是异步的。如果主服务器崩溃,则某些已 如果请求一次快速关闭,用户将停止等待。不过,在使用异步复制时,在所有未解决的 WAL 记录被传输到当前连接的后备服务器之前,服务器将不会完全关闭。 -===== 多个同步后备 - +##### 多个同步后备 同步复制支持一个或者更多个同步后备服务器,事务将会等待,直到所有同步后备服务器都确认收到了它们的数据为止。事务必须等待其回复的同步后备的数量由`synchronous_standby_names`指定。这个参数还指定一个后备服务器名称及方法(`FIRST`和`ANY`)的列表来从列出的后备中选取同步后备。 方法`FIRST`指定一种基于优先的同步复制并且让事务提交等待,直到它们的WAL记录被复制到基于优先级选中的所要求数量的同步后备上为止。在列表中出现较早的后备被给予较高的优先级,并且将被考虑为同步后备。其他在这个列表中位置靠后的后备服务器表示可能的同步后备。如果任何当前的同步后备由于任何原因断开连接,它将立刻被下一个最高优先级的后备所替代。 @@ -498,8 +457,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' 后备服务器的同步状态可以使用`pg_stat_replication`视图查看。 -===== 性能规划 - +##### 性能规划 同步复制通常要求仔细地规划和放置后备服务器来保证应用能令人满意地工作。等待并不利用系统资源,但是事务锁会持续保持直到传输被确认。其结果是,不小心使用同步复制将由于响应时间增加以及较高的争用率而降低数据库应用的性能。 IvorySQL允许应用开发者通过复制来指定所要求的持久性级别。这可以为整个系统指定,不过它也能够为特定的用户或连接指定,甚至还可以为单个事务指定。 @@ -510,8 +468,7 @@ IvorySQL允许应用开发者通过复制来指定所要求的持久性级别。 你应该认为网络带宽必须比 WAL 数据的产生率高。 -===== 高可用性规划 - +##### 高可用性规划 当`synchronous_commit`被设置为`on`、`remote_apply`或者`remote_write`时, `synchronous_standby_names`指定产生的事务提交要等待其回应的同步后备的数量和名称。如果任一同步后备崩溃,这类事务提交可能无法完成。 高可用的最佳方案是确保有所要求数量的同步后备。这可以通过使用`synchronous_standby_names`指定多个潜在后备服务器来实现。 @@ -530,14 +487,12 @@ IvorySQL允许应用开发者通过复制来指定所要求的持久性级别。 如果在事务等待时你需要重建一台后备服务器,确保命令 pg_start_backup() 和 pg_stop_backup() 被运行在一个`synchronous_commit` = `off`的会话中,否则那些请求将永远等待后备服务器出现。 -==== 在后备机上连续归档 - +#### 在后备机上连续归档 当在一个后备机上使用连续归档时,有两种不同的情景:WAL 归档在主服务器 和后备机之间共享,或者后备机有自己的 WAL 归档。当后备机拥有其自身的 WAL 归档时,将`archive_mode`设置为 `always`,后备机将在收到每个 WAL 段时调用归档命令, 不管它是从归档恢复还是使用流复制恢复。共享归档可以类似地处理,但是 `archive_command`必须测试要被归档的文件是否 已经存在,以及现有的文件是否有相同的内容。这要求 `archive_command`中有更多处理,因为它必须当心 不要覆盖具有不同内容的已有文件,但是如果完全相同的文件被归档两次时 应返回成功。并且如果两个服务器尝试同时归档同一个文件,所有这些都必须 在没有竞争情况的前提下完成。 如果`archive_mode`被设置为`on`,归档器在恢复或者后备模式中无法启用。 如果后备服务器被提升,它将在被提升后开始归档,但是它将不会归档任何不是它自身产生的 WAL或时间线历史文件。 要在归档中得到完整的一系列 WAL 文件,你必须确保所有 WAL 在到达后备机之前都被归档。 对于基于文件的日志传输来说天然就是这样,因为后备机只能恢复在归档中找到的文件,而启用了流复制时则不是这样。 当一台服务器不在恢复模式中时,在`on`和`always`模式之间没有差别。 -=== 故障转移 - +### 故障转移 如果主服务器失效,则后备服务器应该开始故障转移过程。 如果后备服务器失效,则不会有故障转移发生。如果后备服务器可以被重启(即使晚一点),由于可重启恢复的优势,那么恢复处理也能被立即重启。如果后备服务器不能被重启,则一个全新的后备服务器实例应该被创建。 @@ -554,17 +509,15 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 要触发一台日志传送后备服务器的故障转移,运行`pg_ctl promote`,调用 `pg_promote()`,或者创建一个触发器文件,其文件名和路径由`promote_trigger_file`设置指定。 如果你正在规划使用`pg_ctl promote`或调用`pg_promote()`以进行故障转移,`promote_trigger_file`就不是必要的。 如果你正在建立只用于从主服务器分流只读查询而不是高可用性目的的报告服务器,你不需要提升它。 -=== 热备 - +### 热备 术语热备用来描述处于归档恢复或后备模式中的服务器连接到服务器并运行只读查询的能力。这有助于复制目的以及以高精度恢复一个备份到一个期望的状态。术语热备也指服务器从恢复转移到正常操作而用户能继续运行查询并且保持其连接打开的能力。 在热备模式中运行查询与正常查询操作相似,尽管如下所述存在一些用法和管理上的区别。 -==== 用户概览 - +#### 用户概览 当hot_standby参数在一台后备服务器上被设置为真时,一旦恢复将系统带到一个一致的状态它将开始接受连接。所有这些连接都被限制为只读,甚至临时表都不能被写入。 -后备服务器上的数据需要一些时间从主服务器到达后备服务器,因此在主服务器和后备服务器之间将有一段可以度量的延迟。近乎同时在主服务器和后备服务器上运行相同的查询可能因此而返回不同的结果。我们说后备服务器上的数据与主服务器是*最终一致*的。一旦一个事务的提交记录在后备服务器上被重播,那个事务所作的修改将对后备服务器上所有新取得的快照可见。快照可以在每个查询或每个事务的开始时取得,这取决于当前的事务隔离级别。 +后备服务器上的数据需要一些时间从主服务器到达后备服务器,因此在主服务器和后备服务器之间将有一段可以度量的延迟。近乎同时在主服务器和后备服务器上运行相同的查询可能因此而返回不同的结果。我们说后备服务器上的数据与主服务器是**最终一致**的。一旦一个事务的提交记录在后备服务器上被重播,那个事务所作的修改将对后备服务器上所有新取得的快照可见。快照可以在每个查询或每个事务的开始时取得,这取决于当前的事务隔离级别。 在热备期间开始的事务可能发出下列命令: @@ -580,7 +533,6 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 * `SAVEPOINT`、`RELEASE`、`ROLLBACK TO SAVEPOINT` * `EXCEPTION`块或其他内部子事务 - - `LOCK TABLE`,不过只在下列模式之一中明确发出: `ACCESS SHARE`、`ROW SHARE` 或 `ROW EXCLUSIVE`. @@ -591,7 +543,6 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 - `UNLISTEN` - 在热备期间开始的事务将不会被分配一个事务 ID 并且不能被写入到系统的预写式日志。因此,下列动作将产生错误消息: - 数据操纵语言(DML): `INSERT`、 `UPDATE`、`DELETE`、`COPY FROM`、 `TRUNCATE`。注意不允许在恢复期间导致一个触发器被执行的动作。这个限制甚至被应用到临时表,因为不分配事务 ID 表行就不能被读或写,而当前不可能在一个热备环境中分配事务 ID。 @@ -612,7 +563,6 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 * `SET TRANSACTION READ WRITE`, `SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE` * `SET transaction_read_only = off` - - 两阶段提交命令: `PREPARE TRANSACTION`、 `COMMIT PREPARED`、`ROLLBACK PREPARED`,因为即使只读事务也需要在准备阶段(两阶段提交中的第一个阶段)写 WAL。 @@ -621,15 +571,13 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 - `LISTEN`,`NOTIFY` - 在正常操作中,“只读”事务被允许使用`LISTEN`和`NOTIFY`,因此热备会话在比普通只读会话更紧一点的限制下操作。这些限制中的某些可能会在一个未来的发行中被放松。 在热备期间,参数`transaction_read_only`总是为真并且不可以被改变。但是只要不尝试修改数据库,热备期间的连接工作起来更像其他数据库连接。如果发生故障转移或切换,该数据库将切换到正常处理模式。当服务器改变模式时会话将保持连接。一旦热备结束,它将可以发起读写事务(即使是一个在热备期间启动的会话)。 用户可以通过`SHOW in_hot_standby`来检查hot standby会话是否是活跃的 (在服务器版本 14 之前该参数`in_hot_standby`不存在。对于更早版本的服务器,可行的替代方法是 `SHOW transaction_read_only`。) 此外, 还有一些函数允许用户访问有关后备服务器的信息。 它们允许您编写程序来识别数据库当前的状态。用于监控恢复进度, 或者您可以编写复杂的程序将数据库恢复到特定状态。 -==== 处理查询冲突 - +#### 处理查询冲突 主服务器和后备服务器在多方面都松散地连接在一起。主服务器上的动作将在后备服务器上产生效果。结果是在它们之间有潜在的负作用或冲突。最容易理解的冲突是性能:如果在主服务器上发生一次大数据量的载入,那么着将在后备服务器上产生一个相似的 WAL 记录流,因而后备服务器查询可能要竞争系统资源(例如 I/O)。 随着热备发生的还可能有其他类型的冲突。对于可能需要被取消的查询和(某些情况中)解决它们的已断开会话来说,这些冲突是硬冲突。用户可以用几种方式来处理这种冲突。冲突情况包括: @@ -641,7 +589,6 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 - 从 WAL 清除记录的应用与在后备服务器上访问该目标页的查询冲突,不管要被移除的数据是否为可见。 - 在主服务器上,这些情况仅仅会导致等待;并且用户可以选择取消这些冲突动作中间的一个。但是,在后备服务器上则没有选择:已被 WAL 记录的动作已经在主服务器上发生,那么后备服务器不能在应用它时失败。此外,允许 WAL 应用无限等待是非常不可取的,因为后备服务器的状态将变得逐渐远远落后于主服务器的状态。因此,提供了一种机制来强制性地取消与要被应用的 WAL 记录冲突的后备查询。 该问题情形的一个例子是主服务器上的一位管理员在一个表上运行`DROP TABLE`,而该表正在后备服务器上被查询。如果`DROP TABLE`被应用在后备服务器上,很明显该后备查询不能继续。如果这种情况在主服务器上发生,`DROP TABLE`将等待直到其他查询结束。但是当`DROP TABLE`被运行在主服务器上,主服务器没有关于运行在后备服务器上查询的信息,因此它将不会等待任何这样的后备查询。WAL 改变记录在后备查询还在运行时来到后备服务器上,导致一个冲突。后备服务器必须要么延迟 WAL 记录的应用(还有它们之后的任何事情),要么取消冲突查询这样`DROP TABLE`可以被应用。 @@ -670,8 +617,7 @@ IvorySQL并不提供在主服务器上标识失败并且通知后备数据库服 当 WAL 重放由于冲突而需要比`deadlock_timeout`更长时间时,用户可以控制是否打印日志消息。由参数 log_recovery_conflict_waits控制。 -==== 管理员概览 - +#### 管理员概览 如果`hot_standby`在`postgresql.conf`中被设置为`on`并且存在一个standby.signal文件,服务器将运行在热备模式。但是,可能需要一些时间来允许热备连接,因为在服务器完成足够的恢复来为查询提供一个一致的状态之前,它将不会接受连接。在此期间,尝试连接的客户端将被一个错误消息拒绝。要确认服务器已经可连接,要么循环地从应用尝试连接,要么在服务器日志中查找这些消息: ``` @@ -756,17 +702,15 @@ WAL 文件控制命令在恢复期间将不会工作,如`pg_start_backup`、`p 检查点进程和后台写入进程在恢复期间是活动状态的。检查点进程将执行重启动点(与主服务器上的检查点相似),后台写入进程将执行正常的块清理活动。 这可以包括存储在后备服务器上的提示位信息的更新。在恢复期间,`CHECKPOINT`命令会被接受,然而它会执行一个重启点而不是一个新的检查点。 -==== 热备参数参考 - +#### 热备参数参考 在主服务器上,可以使用参数wal_level和vacuum_defer_cleanup_age。在主服务器上设置max_standby_archive_delay和max_standby_streaming_delay不会产生效果。 在主服务器上,可以使用参数hot_standby、max_standby_archive_delay和max_standby_streaming_delay。只要服务器保持在后备模式vacuum_defer_cleanup_age就没有效果,然而当后备服务器变成主服务器时它将变得相关。 -==== 警告 - +#### 警告 热备有一些限制。这些限制很可能在未来的发行中被修复: - 在能够取得快照之前,需要正在运行的事务的完整知识。使用大量子事务(目前指超过 64 个)的事务将延迟只读连接的启动,直到最长的运行着的写事务完成。如果发生这种情况,说明消息将被发送到服务器日志。 - 主服务器上的每一个检查点将产生用于后备查询的可用启动点。如果后备服务器在主控机处于关闭状态时被关闭,就没有办法在主服务器启动之前重新进入热后备,因此它在 WAL 日志中产生一个进一步启动点。这种情况在它可能发生的大部分常见情况中不是一个问题。通常,如果主服务器被关闭并且不再可用,这可能是由于某种严重错误要求后备服务器被转变成为一个新的主服务器来操作。并且在主服务器被故意关闭的情况下,协调保证后备服务器平滑地过渡为新的主服务器也是一种标准过程。 - 在恢复尾声,由预备事务持有的`AccessExclusiveLocks`将要求两倍的正常锁表项。如果你计划运行大量并发的通常要求`AccessExclusiveLocks`的预备事务,或者你计划运行一个需要很多`AccessExclusiveLocks`的大型事务,我们建议你为`max_locks_per_transaction`选择一个更大的值,也许是主服务器上该参数值的两倍。如果你的`max_prepared_transactions`设置为 0,你根本不需要考虑这个问题。 -- 可序列化事务隔离级别目前在热备中不可用。尝试在热备模式中将一个事务设置为可序列化隔离级别将产生一个错误。 +- 可序列化事务隔离级别目前在热备中不可用。尝试在热备模式中将一个事务设置为可序列化隔离级别将产生一个错误。 \ No newline at end of file diff --git a/CN/modules/ROOT/pages/33.adoc b/CN/modules/ROOT/pages/33.md similarity index 79% rename from CN/modules/ROOT/pages/33.adoc rename to CN/modules/ROOT/pages/33.md index 97fb7e04..c90adc66 100644 --- a/CN/modules/ROOT/pages/33.adoc +++ b/CN/modules/ROOT/pages/33.md @@ -1,29 +1,21 @@ - -:sectnums: -:sectnumlevels: 5 - -:imagesdir: ./_images -= **问题提交指南** +# 问题提交指南 发现并提交问题,也是对社区良好的贡献方式。 本文详细描述如何提交一个问题。 以IvorySQL为例,提交一个bug report -== 确认问题所属仓库 -IvorySQL仓库: https://github.com/IvorySQL/IvorySQL - -== **创建新的Issue** - -=== 第1步 进入New issue 页面: +## 确认问题所属仓库 +IvorySQL仓库: https://github.com/IvorySQL/IvorySQL +## 创建新的Issue +### 第1步 进入New issue 页面: 点击New issue -image::p3.png[] - +![](../images/p3.png) -=== 第2步:选择需要填写的issue类型 +### 第2步:选择需要填写的issue类型 **1、bug report** ``` @@ -81,8 +73,7 @@ Title: 标题 ``` -=== 第3步:提交 - +### 第3步:提交 点击 submit new issue 按钮, 提交即可。 -提交问题以后,如果问题的描述和复现步骤清晰明确和可定位,会有人直接定位和解决该问题。但也有可能会出现,负责跟进该问题的开发者需要您提供更加详细的信息的情况,也感谢您的配合。 +提交问题以后,如果问题的描述和复现步骤清晰明确和可定位,会有人直接定位和解决该问题。但也有可能会出现,负责跟进该问题的开发者需要您提供更加详细的信息的情况,也感谢您的配合。 \ No newline at end of file diff --git a/CN/modules/ROOT/pages/4.1.adoc b/CN/modules/ROOT/pages/4.1.md similarity index 59% rename from CN/modules/ROOT/pages/4.1.adoc rename to CN/modules/ROOT/pages/4.1.md index 3d0bc440..63541378 100644 --- a/CN/modules/ROOT/pages/4.1.adoc +++ b/CN/modules/ROOT/pages/4.1.md @@ -1,26 +1,19 @@ - -:sectnums: -:sectnumlevels: 5 - -= **安装指南** - -== 概述 - +# 安装指南 +## 概述 IvorySQL安装方式包括以下5种: -- <> -- <> -- <> -- <<源码安装>> -- <> +- [yum源安装](#yum源安装) +- [docker安装](#docker安装) +- [rpm安装](#rpm安装) +- [源码安装](#源码安装) +- [deb安装](#deb安装) -本章将详细介绍每种方式的安装、运行及卸载过程。想要更快获得IvorySQL,请参阅xref:3.1.adoc#快速开始[快速开始]。 +本章将详细介绍每种方式的安装、运行及卸载过程。想要更快获得IvorySQL,请参阅[快速开始](3.1.md#快速开始)。 同样,安装前请先创建一个用户,并赋予其root权限,安装、使用和卸载均以该用户执行。这里以ivorysql用户为例。 -[[yum源安装]] -== yum源安装 - + +## yum源安装 创建或编辑IvorySQL yum源配置文件/etc/yum.repos.d/ivorysql.repo ``` vim /etc/yum.repos.d/ivorysql.repo @@ -31,70 +24,63 @@ enabled=1 gpgcheck=0 ``` 保存退出后,安装IvorySQL5 -[source,bash,subs="attributes"] -``` -$ sudo dnf install -y ivorysql5-{ivorysql-version} +```bash +$ sudo dnf install -y ivorysql5-5.3 ``` -[[docker安装]] -== docker安装 + +## docker安装 + * **从Docker Hub上获取IvorySQL镜像** -** 从Docker Hub上获取IvorySQL镜像 - -[source,bash,subs="attributes"] -``` -$ docker pull ivorysql/ivorysql:{ivorysql-version}-ubi8 +```bash +$ docker pull ivorysql/ivorysql:5.3-ubi8 ``` -** 运行IvorySQL + * **运行IvorySQL** -[source,bash,subs="attributes"] -``` -$ docker run --name ivorysql -p 5434:5432 -e IVORYSQL_PASSWORD=your_password -d ivorysql/ivorysql:{ivorysql-version}-ubi8 +```bash +$ docker run --name ivorysql -p 5434:5432 -e IVORYSQL_PASSWORD=your_password -d ivorysql/ivorysql:5.3-ubi8 ``` -e参数说明 -|==== -| 参数名 | 是否必填 | 描述 -| IVORYSQL_USER | 否 | 数据库用户,默认 ivorysql -| IVORYSQL_PASSWORD | 是 | 数据库用户密码 -| IVORYSQL_DB | 否 | 数据库名称,默认 ivorysql -| POSTGRES_HOST_AUTH_METHOD | 否 | 修改主机身份验证方式,参考值:md5 -| POSTGRES_INITDB_ARGS | 否 | 为initdb是添加额外参数,参考值:"--data-checksums" -| PGDATA | 否 | 将数据目录定义到其他路径文件夹下(例如子目录),默认 /var/lib/ivorysql/data -| POSTGRES_INITDB_WALDIR | 否 | 定义IvorySQL transaction文件夹路径,默认在数据目录(PGDATA)的子目录中。 -|==== - -[TIP] -==== -. 不推荐将POSTGRES_HOST_AUTH_METHOD参数填写为trust,这样将会使IVORYSQL_PASSWORD设置失效。 -. 如果POSTGRES_HOST_AUTH_METHOD参数设置为scram-sha-256,同时需将POSTGRES_INITDB_ARGS设置为--auth-host=scram-sha-256,才会使数据库正确进行初始化。 -==== - -[[rpm安装]] -== rpm安装 -** 安装依赖 +| 参数名 | 是否必填 | 描述 | +| --- | --- | --- | +| IVORYSQL_USER | 否 | 数据库用户,默认 ivorysql | +| IVORYSQL_PASSWORD | 是 | 数据库用户密码 | +| IVORYSQL_DB | 否 | 数据库名称,默认 ivorysql | +| POSTGRES_HOST_AUTH_METHOD | 否 | 修改主机身份验证方式,参考值:md5 | +| POSTGRES_INITDB_ARGS | 否 | 为initdb是添加额外参数,参考值:"--data-checksums" | +| PGDATA | 否 | 将数据目录定义到其他路径文件夹下(例如子目录),默认 /var/lib/ivorysql/data | +| POSTGRES_INITDB_WALDIR | 否 | 定义IvorySQL transaction文件夹路径,默认在数据目录(PGDATA)的子目录中。 | + + +> **TIP:** +> . 不推荐将POSTGRES_HOST_AUTH_METHOD参数填写为trust,这样将会使IVORYSQL_PASSWORD设置失效。 +> . 如果POSTGRES_HOST_AUTH_METHOD参数设置为scram-sha-256,同时需将POSTGRES_INITDB_ARGS设置为--auth-host=scram-sha-256,才会使数据库正确进行初始化。 + + + +## rpm安装 + * **安装依赖** ``` $ sudo dnf install -y lz4 libicu libxslt python3 ``` -** 获取rpm包 + * **获取rpm包** -[source,bash,subs="attributes"] -``` -$ sudo wget https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_{ivorysql-version}/IvorySQL-{ivorysql-version}-9d890e9-20251120.x86_64.rpm +```bash +$ sudo wget https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_5.3/IvorySQL-5.3-9d890e9-20251120.x86_64.rpm ``` -** 安装rpm包 + * **安装rpm包** -+ 使用以下命令安装所有rpm包: ``` -$ sudo yum --disablerepo=* localinstall *.rpm +$ sudo yum --disablerepo=* localinstall *.rpm ``` 数据库将被安装在/usr/ivory-5/路径下。 -[[源码安装]] -== 源码安装 -** 安装依赖 + +## 源码安装 + * **安装依赖** ``` # CentOS $ sudo dnf install -y bison readline-devel zlib-devel openssl-devel uuid-devel @@ -105,80 +91,72 @@ $ sudo apt install -y bison libreadline-dev zlib1g-dev libssl-dev $ sudo apt install -y build-essential $ sudo apt install -y pkg-config uuid-dev ``` -** 获取IvorySQL源代码 + * **获取IvorySQL源代码** ``` $ git clone https://github.com/IvorySQL/IvorySQL.git $ cd IvorySQL $ git checkout -b IVORY_REL_5_STABLE origin/IVORY_REL_5_STABLE ``` -** 配置 + * **配置** -+ 在IvorySQL目录下,执行以下命令进行配置,请使用--prefix指定安装目录: ``` $ ./configure --prefix=/usr/local/ivorysql/ivorysql-5 ``` -** 编译 + * **编译** -+ 执行以下命令进行编译: ``` $ make ``` -[TIP] -==== -编译完毕,安装之前可先执行make check或make all-check-world测试刚刚编译的结果。 -==== +> **TIP:** +> 编译完毕,安装之前可先执行make check或make all-check-world测试刚刚编译的结果。 -** 安装 -+ + * **安装** + 执行以下命令安装,数据库将被安装在上述由--prefix指定的路径下: ``` $ sudo make install ``` -[[deb安装]] -== deb安装 -** 安装依赖 + +## deb安装 + * **安装依赖** ``` $ sudo apt -y install pkg-config libreadline-dev libicu-dev libldap2-dev uuid-dev tcl-dev libperl-dev python3-dev bison flex openssl libssl-dev libpam-dev libxml2-dev libxslt-dev libossp-uuid-dev libselinux-dev gettext ``` -** 获取deb包 + * **获取deb包** -[source,bash,subs="attributes"] -``` -$ sudo wget https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_{ivorysql-version}/IvorySQL-{ivorysql-version}-a50789d-20250304.amd64.deb +```bash +$ sudo wget https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_5.3/IvorySQL-5.3-a50789d-20250304.amd64.deb ``` -** 安装deb包 + * **安装deb包** -[source,bash,subs="attributes"] -``` -$ sudo dpkg -i IvorySQL-{ivorysql-version}-a50789d-20250304.amd64.deb +```bash +$ sudo dpkg -i IvorySQL-5.3-a50789d-20250304.amd64.deb ``` 数据库将被安装在/usr/ivory-5/路径下。 -== 启动数据库 -参考<>、<>、<<源码安装>>、<>的用户,需要手动启动数据库。 +## 启动数据库 +参考[yum源安装](#yum源安装)、[rpm安装](#rpm安装)、[源码安装](#源码安装)、[deb安装](#deb安装)的用户,需要手动启动数据库。 -** 赋权 + * **赋权** -+ 执行以下命令为安装用户赋权,示例用户为ivorysql,安装目录为/usr/ivory-5/: ``` $ sudo chown -R ivorysql:ivorysql /usr/ivory-5/ ``` -[[配置环境变量]] -** 配置环境变量 + + * **配置环境变量** -+ 将以下配置写入用户的~/.bash_profile文件并使用source命令该文件使环境变量生效: ``` @@ -190,91 +168,82 @@ export PGDATA ``` $ source ~/.bash_profile ``` -** 数据库初始化 + * **数据库初始化** ``` $ mkdir /usr/ivory-5/data $ initdb -D /usr/ivory-5/data ``` -.... +``` 其中-D参数用来指定数据库的数据目录。更多参数使用方法,请使用initdb --help命令获取。 -.... +``` -** 启动数据库服务 + * **启动数据库服务** ``` -$ pg_ctl -D /usr/ivory-5/data -l ivory.log start +$ pg_ctl -D /usr/ivory-5/data -l ivory.log start ``` -其中-D参数用来指定数据库的数据目录,如果<<配置环境变量>> 配置了PGDATA,则该参数可以省略。-l参数用来指定日志文件。更多参数使用方法,请使用pg_ctl --help命令获取。 +其中-D参数用来指定数据库的数据目录,如果[配置环境变量](#配置环境变量) 配置了PGDATA,则该参数可以省略。-l参数用来指定日志文件。更多参数使用方法,请使用pg_ctl --help命令获取。 查看确认数据库启动成功: ``` $ ps -ef | grep postgres ivorysql 130427 1 0 02:45 ? 00:00:00 /usr/ivory-5/bin/postgres -D /usr/ivory-5/data -ivorysql 130428 130427 0 02:45 ? 00:00:00 postgres: checkpointer -ivorysql 130429 130427 0 02:45 ? 00:00:00 postgres: background writer -ivorysql 130431 130427 0 02:45 ? 00:00:00 postgres: walwriter -ivorysql 130432 130427 0 02:45 ? 00:00:00 postgres: autovacuum launcher -ivorysql 130433 130427 0 02:45 ? 00:00:00 postgres: logical replication launcher +ivorysql 130428 130427 0 02:45 ? 00:00:00 postgres: checkpointer +ivorysql 130429 130427 0 02:45 ? 00:00:00 postgres: background writer +ivorysql 130431 130427 0 02:45 ? 00:00:00 postgres: walwriter +ivorysql 130432 130427 0 02:45 ? 00:00:00 postgres: autovacuum launcher +ivorysql 130433 130427 0 02:45 ? 00:00:00 postgres: logical replication launcher ivorysql 130445 130274 0 02:45 pts/1 00:00:00 grep --color=auto postgres ``` -== 数据库连接 - +## 数据库连接 psql连接数据库: -[source,bash,subs="attributes"] -``` +```bash $ psql -d YOUR_DATABASE -psql ({pg-version}) +psql (18.3) Type "help" for help. ivorysql=# ``` -.... +``` 其中-d参数用来指定想要连接到的数据库名称。IvorySQL默认使用ivorysql数据库,但较低版本的IvorySQL首次使用时需用户先连接postgres数据库,然后自己创建ivorysql数据库。较高版本的IvorySQL则已为用户创建好ivorysql数据库,可以直接连接。 更多参数使用方法,请使用psql --help命令获取。 -.... +``` TIP: Docker运行IvorySQL时,需要添加额外参数,参考:psql -d ivorysql -U ivorysql -h 127.0.0.1 -p 5434 -== 卸载IvorySQL - -[CAUTION] -==== -使用任何一种方法卸载前请先停止数据库服务并做好数据备份。 -==== +## 卸载IvorySQL +> **CAUTION:** +> 使用任何一种方法卸载前请先停止数据库服务并做好数据备份。 -=== yum源安装的卸载 +### yum源安装的卸载 执行以下命令依次卸载: ``` $ sudo dnf remove -y ivorysql5-5.0 ``` -=== docker安装的卸载 - +### docker安装的卸载 执行以下命令,使IvorySQL容器停止运行,并删除IvorySQL容器和镜像: -[source,bash,subs="attributes"] -``` +```bash $ docker stop ivorysql $ docker rm ivorysql -$ docker rmi ivorysql/ivorysql:{ivorysql-version}-ubi8 +$ docker rmi ivorysql/ivorysql:5.3-ubi8 ``` -=== rpm安装的卸载 - +### rpm安装的卸载 执行以下命令卸载并清理文件夹: ``` -$ sudo yum remove --disablerepo=* ivorysql5\* +$ sudo yum remove --disablerepo=* ivorysql5\* $ sudo rm -rf /usr/ivory-5 ``` -=== 源码安装的卸载 - +### 源码安装的卸载 执行以下命令卸载数据库并清理文件夹: ``` $ sudo make uninstall @@ -282,12 +251,10 @@ $ make clean $ sudo rm -rf /usr/ivory-5 ``` -=== deb安装的卸载 - +### deb安装的卸载 执行以下命令卸载数据库并清理文件夹: -[source,bash,subs="attributes"] -``` -$ sudo dpkg -P IvorySQL-{ivorysql-version} +```bash +$ sudo dpkg -P IvorySQL-5.3 $ sudo rm -rf /usr/ivory-5 -``` +``` \ No newline at end of file diff --git a/CN/modules/ROOT/pages/4.2.adoc b/CN/modules/ROOT/pages/4.2.md similarity index 74% rename from CN/modules/ROOT/pages/4.2.adoc rename to CN/modules/ROOT/pages/4.2.md index 4597e4d7..7c9601fd 100644 --- a/CN/modules/ROOT/pages/4.2.adoc +++ b/CN/modules/ROOT/pages/4.2.md @@ -1,78 +1,74 @@ - -:sectnums: -:sectnumlevels: 5 - -= **集群搭建** +# 集群搭建 这里以最简单的一主一备(异步备)集群为例,介绍IvorySQL数据库集群的搭建方法。 -== 主节点 +## 主节点 +### 安装并启动数据库 +yum源快速安装数据库,请参考[从yum源安装ivorysql数据库](3.1.md#从yum源安装ivorysql数据库)。 -=== 安装并启动数据库 -yum源快速安装数据库,请参考xref:3.1.adoc#从yum源安装ivorysql数据库[从yum源安装ivorysql数据库]。 +想要获取更多安装方式,请参考[安装指南](4.1.md)。 -想要获取更多安装方式,请参考xref:4.1.adoc[安装指南]。 +> **NOTE:** +> 主节点数据库需要安装并**启动** +> -[NOTE] -主节点数据库需要安装并**启动** - -=== 关闭防火墙 +### 关闭防火墙 集群中各节点均需关闭防火墙才能正常通信。 ``` -$ sudo systemctl stop firewalld +$ sudo systemctl stop firewalld ``` -=== 配置文件 +### 配置文件 为了从主节点向备节点搭建流复制,主节点需要对data目录下的postgresql.conf和pg_hba.conf两个文件进行配置。 -** postgresql.conf + * **postgresql.conf** -+ 将以下配置追加到postgresql.conf文件末尾: ``` -listen_addresses = '*' +listen_addresses = '*' max_connections = 100 wal_level = replica max_wal_senders = 5 hot_standby = on ``` -** pg_hba.conf + * **pg_hba.conf** -+ 将以下配置追加到pg_hba.conf文件末尾: ``` host all all 0.0.0.0/0 trust host replication all 0.0.0.0/0 trust ``` -[CAUTION] -示例中的pg_hba的配置,仅作为demo用来测试,这种配置会导致数据库密码失效,请根据环境实际情况进行配置 +> **CAUTION:** +> 示例中的pg_hba的配置,仅作为demo用来测试,这种配置会导致数据库密码失效,请根据环境实际情况进行配置 +> -=== 重启主节点数据库服务 +### 重启主节点数据库服务 ``` -$ pg_ctl restart +$ pg_ctl restart ``` -== 备节点 -=== 安装数据库 -Yum源快速安装数据库,请参考xref:3.1.adoc#从yum源安装ivorysql数据库[从yum源安装ivorysql数据库]。 +## 备节点 +### 安装数据库 +Yum源快速安装数据库,请参考[从yum源安装ivorysql数据库](3.1.md#从yum源安装ivorysql数据库)。 -想要获取更多安装方式,请参考xref:4.1.adoc[安装指南]。 +想要获取更多安装方式,请参考[安装指南](4.1.md)。 -[NOTE] -备节点数据库只需要安装,**不需要启动** +> **NOTE:** +> 备节点数据库只需要安装,**不需要启动** +> -=== 关闭防火墙 +### 关闭防火墙 集群中各节点均需关闭防火墙才能正常通信。 ``` -$ sudo systemctl stop firewalld +$ sudo systemctl stop firewalld ``` -=== 搭建流复制 +### 搭建流复制 在备节点上执行以下命令,创建一个主节点的基础备份,即搭建流复制: ``` -$ sudo pg_basebackup -F p -P -X fetch -R -h -p -U ivorysql -D /usr/local/ivorysql/ivorysql-5/data +$ sudo pg_basebackup -F p -P -X fetch -R -h -p -U ivorysql -D /usr/local/ivorysql/ivorysql-5/data ``` - -h为主节点ip; - -p为主节点数据库端口号,默认为5432; @@ -81,8 +77,7 @@ $ sudo pg_basebackup -F p -P -X fetch -R -h -p -U iv 其他参数使用方法,请使用pg_basebackup --help命令获取。 -=== 配置环境变量 - +### 配置环境变量 将以下配置写入~/.bash_profile文件: ``` PATH=/usr/local/ivorysql/ivorysql-5/bin:$PATH @@ -95,13 +90,13 @@ source该文件使环境变量生效: $ source ~/.bash_profile ``` -=== 启动备节点数据库服务 +### 启动备节点数据库服务 ``` $ pg_ctl -D /usr/local/ivorysql/ivorysql-5/data start ``` -== 集群的使用 -=== 查看集群状态 +## 集群的使用 +### 查看集群状态 在主节点上执行以下命令可以看到walsender: ``` $ ps -ef |grep postgres @@ -116,64 +111,61 @@ ivorysql 6567 6139 0 21:54 ? 00:00:00 postgres: walreceiver streaming ... ``` 在主节点上psql连接数据库,并查看集群状态: -[source,bash,subs="attributes"] -``` +```bash $ psql -d ivorysql -psql ({pg-version}) +psql (18.3) Type "help" for help. ivorysql=# select * from pg_stat_replication; pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_ -xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state | - reply_time +xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state | + reply_time -------+----------+----------+------------------+----------------+-----------------+-------------+-------------------------------+--------- -----+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------+------ ------------------------- - 11176 | 10 | ivorysql | walreceiver | 192.168.31.102 | | 53416 | 2024-12-18 21:54:52.041847-05 | + 11176 | 10 | ivorysql | walreceiver | 192.168.31.102 | | 53416 | 2024-12-18 21:54:52.041847-05 | | streaming | 0/7000148 | 0/7000148 | 0/7000148 | 0/7000148 | | | | 0 | async | 2024- 12-18 22:52:07.325111-05 (1 row) ``` 这里192.168.31.102为备节点的ip,async表示数据同步方式为异步流复制。 -=== 使用集群 +### 使用集群 集群中所有的写操作均在主节点执行,读操作则主备节点都可以执行。主节点的数据通过流复制同步到备节点。主节点写操作的结果在任何一个备节点都能够查询到。 例如,在主节点创建一个新的数据库test,并在主节点进行查询: -[source,bash,subs="attributes"] -``` +```bash $ psql -d ivorysql -psql ({pg-version}) +psql (18.3) Type "help" for help. ivorysql=# create database test; CREATE DATABASE ivorysql=# \l List of databases - Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges + Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges -----------+----------+----------+-----------------+-------------+-------------+------------+-----------+----------------------- - ivorysql | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | + ivorysql | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | template0 | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/ivorysql + | | | | | | | | ivorysql=CTc/ivorysql template1 | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/ivorysql + | | | | | | | | ivorysql=CTc/ivorysql - test | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | + test | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | (4 rows) ``` 在备节点查询: -[source,bash,subs="attributes"] -``` +```bash $ psql -d ivorysql -psql ({pg-version}) +psql (18.3) Type "help" for help. ivorysql=# \l List of databases - Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges + Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges -----------+----------+----------+-----------------+-------------+-------------+------------+-----------+----------------------- - ivorysql | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | + ivorysql | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | template0 | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/ivorysql + | | | | | | | | ivorysql=CTc/ivorysql template1 | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/ivorysql + | | | | | | | | ivorysql=CTc/ivorysql - test | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | + test | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | (4 rows) -``` +``` \ No newline at end of file diff --git a/CN/modules/ROOT/pages/4.3.adoc b/CN/modules/ROOT/pages/4.3.md similarity index 67% rename from CN/modules/ROOT/pages/4.3.adoc rename to CN/modules/ROOT/pages/4.3.md index 54a0a5a6..3fa7875e 100644 --- a/CN/modules/ROOT/pages/4.3.adoc +++ b/CN/modules/ROOT/pages/4.3.md @@ -1,13 +1,5 @@ - -:sectnums: -:sectnumlevels: 5 - -:imagesdir: ./_images - -= 开发者指南 - -== 概览 - +# 开发者指南 +## 概览 IvorySQL在开源PostgreSQL数据库的基础上提供独特的附加功能。 IvorySQL致力于通过创新和建立在开源数据库解决方案之上为其终端用户提供价值。我们的目标是为中小型企业提供一个具有高性能、可扩展性、可靠性和易于使用的解决方案。 @@ -18,19 +10,17 @@ IvorySQL提供的扩展功能将使用户能够建立高性能和可扩展的Pos 在对原有的PostgreSQL改动最小的前提下,实现对Oracle的兼容。我们需要实现双parser、双端口、模式PL/pgSQL实现PL/iSQL的框架。实现流程图如下: -image::p4.png[] -image::p5.png[] +![](../images/p4.png) +![](../images/p5.png) ### 系统表的变化 下图描述了对PostgreSQL现有系统表的变化以及所做的补充。 -image::p6.png[] - -== 数据库建模(第一章创建库+第二章创建表) - -=== 创建一个数据库 +![](../images/p6.png) +## 数据库建模(第一章创建库+第二章创建表) +### 创建一个数据库 看看你能否访问数据库服务器的第一个例子就是试着创建一个数据库。一台运行着的IvorySQL服务器可以管理许多数据库。通常我们会为每个项目和每个用户单独使用一个数据库。 你的站点管理员可能已经为你创建了可以使用的数据库。如果这样你就可以省略这一步,并且跳到下一节。 @@ -72,7 +62,7 @@ createdb: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No createdb: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "joe" does not exist ``` -在这里提到了你自己的登录名。如果管理员没有为你创建IvorySQL用户帐号,就会发生这些现象。(IvorySQL用户帐号和操作系统用户帐号是不同的。) 如果你是管理员,参阅 http://www.postgresql.org/docs/17/user-manag.html[第 22 章] 获取创建用户帐号的帮助。你需要变成安装IvorySQL的操作系统用户的身份(通常是 `postgres`)才能创建第一个用户帐号。也有可能是赋予你的IvorySQL用户名和你的操作系统用户名不同;这种情况下,你需要使用`-U`选项或者使用`PGUSER`环境变量指定你的IvorySQL用户名。 +在这里提到了你自己的登录名。如果管理员没有为你创建IvorySQL用户帐号,就会发生这些现象。(IvorySQL用户帐号和操作系统用户帐号是不同的。) 如果你是管理员,参阅 [第 22 章](http://www.postgresql.org/docs/17/user-manag.html) 获取创建用户帐号的帮助。你需要变成安装IvorySQL的操作系统用户的身份(通常是 `postgres`)才能创建第一个用户帐号。也有可能是赋予你的IvorySQL用户名和你的操作系统用户名不同;这种情况下,你需要使用`-U`选项或者使用`PGUSER`环境变量指定你的IvorySQL用户名。 如果你有个数据库用户帐号,但是没有创建数据库所需要的权限,那么你会看到下面的信息: @@ -80,7 +70,7 @@ createdb: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FAT createdb: error: database creation failed: ERROR: permission denied to create database ``` -并非所有用户都被许可创建新数据库。如果IvorySQL拒绝为你创建数据库,那么你需要让站点管理员赋予你创建数据库的权限。出现这种情况时请咨询你的站点管理员。如果你自己安装了IvorySQL,那么你应该以你启动数据库服务器的用户身份登录然后参考手册完成权限的赋予工作。http://www.postgresql.org/docs/17/tutorial-createdb.html#ftn.id-1.4.3.4.10.4[[1\]] +并非所有用户都被许可创建新数据库。如果IvorySQL拒绝为你创建数据库,那么你需要让站点管理员赋予你创建数据库的权限。出现这种情况时请咨询你的站点管理员。如果你自己安装了IvorySQL,那么你应该以你启动数据库服务器的用户身份登录然后参考手册完成权限的赋予工作。[[1\](http://www.postgresql.org/docs/17/tutorial-createdb.html#ftn.id-1.4.3.4.10.4)] 你还可以用其它名字创建数据库。IvorySQL允许你在一个站点上创建任意数量的数据库。数据库名必须是以字母开头并且小于63个字符长。一个方便的做法是创建和你当前用户名同名的数据库。许多工具假设该数据库名为缺省数据库名,所以这样可以节省你的敲键。要创建这样的数据库,只需要键入: @@ -96,10 +86,9 @@ $ dropdb mydb (对于这条命令而言,数据库名不是缺省的用户名,因此你就必须声明它)。这个动作将在物理上把所有与该数据库相关的文件都删除并且不可取消,因此做这中操作之前一定要考虑清楚。 -更多关于 `createdb` 和 `dropdb` 的信息可以分别在 http://www.postgresql.org/docs/17/app-createdb.html[createdb]和 http://www.postgresql.org/docs/17/app-dropdb.html[dropdb]中找到。 - -=== 创建一个新表 +更多关于 `createdb` 和 `dropdb` 的信息可以分别在 [createdb](http://www.postgresql.org/docs/17/app-createdb.html)和 [dropdb](http://www.postgresql.org/docs/17/app-dropdb.html)中找到。 +### 创建一个新表 你可以通过指定表的名字和所有列的名字及其类型来创建表∶ ``` @@ -137,11 +126,10 @@ CREATE TABLE cities ( DROP TABLE tablename; ``` -== 写入数据(SQL写入)参考第 6 章 数据操纵 - +## 写入数据(SQL写入)参考第 6 章 数据操纵 当一个表被创建后,它不包含任何数据。在数据库发挥作用之前,首先要做的是插入数据。一次插入一行数据。你也可以在一个命令中插入多行,但不能插入不完整的行。即使只知道其中一些列的值,也必须创建完整的行。 -要创建一个新行,使用 http://www.postgresql.org/docs/17/sql-insert.html[INSERT]命令。这条命令要求提供表的名字和其中列的值。例如,考虑 http://www.postgresql.org/docs/17/ddl.html[第 5 章]中的产品表: +要创建一个新行,使用 [INSERT](http://www.postgresql.org/docs/17/sql-insert.html)命令。这条命令要求提供表的名字和其中列的值。例如,考虑 [第 5 章](http://www.postgresql.org/docs/17/ddl.html)中的产品表: ``` CREATE TABLE products ( @@ -154,7 +142,7 @@ CREATE TABLE new_products ( product_no int , name varchar(255), price DECIMAL(10, 2), - release_date DATE + release_date DATE ); ``` @@ -213,17 +201,15 @@ INSERT INTO products (product_no, name, price) WHERE release_date = '2025-05-29'; ``` -这提供了用于计算要插入的行的SQL查询机制( http://www.postgresql.org/docs/17/queries.html[第 7 章])的全部功能。 +这提供了用于计算要插入的行的SQL查询机制( [第 7 章](http://www.postgresql.org/docs/17/queries.html))的全部功能。 .提示 **** -在一次性插入大量数据时,考虑使用 http://www.postgresql.org/docs/17/sql-copy.html[COPY]命令。它不如 http://www.postgresql.org/docs/17/sql-insert.html[INSERT]命令那么灵活,但是更高效。 +在一次性插入大量数据时,考虑使用 [COPY](http://www.postgresql.org/docs/17/sql-copy.html)命令。它不如 [INSERT](http://www.postgresql.org/docs/17/sql-insert.html)命令那么灵活,但是更高效。 **** -== 查询数据 参考 第七章查询的组合查询 第十五章 并行查询 - -=== 组合查询 - +## 查询数据 参考 第七章查询的组合查询 第十五章 并行查询 +### 组合查询 两个查询的结果可以用集合操作并、交、差进行组合。语法是: ``` @@ -232,7 +218,7 @@ query1 INTERSECT [ALL] query2 query1 EXCEPT [ALL] query2 ``` -*`query1`*和*`query2`*都是可以使用以上所有特性的查询。集合操作也可以嵌套和级连,例如: +*`query1`**和**`query2`*都是可以使用以上所有特性的查询。集合操作也可以嵌套和级连,例如: ``` query1 UNION query2 UNION query3 @@ -244,23 +230,21 @@ query1 UNION query2 UNION query3 (query1 UNION query2) UNION query3 ``` -`UNION`有效地把*`query2`*的结果附加到*`query1`*的结果上(不过我们不能保证这就是这些行实际被返回的顺序)。此外,它将删除结果中所有重复的行,就像`DISTINCT`做的那样,除非你使用了`UNION ALL`。 - -`INTERSECT`返回那些同时存在于*`query1`*和*`query2`*的结果中的行,除非声明了`INTERSECT ALL`,否则所有重复行都被消除。 +`UNION`有效地把*`query2`**的结果附加到**`query1`*的结果上(不过我们不能保证这就是这些行实际被返回的顺序)。此外,它将删除结果中所有重复的行,就像`DISTINCT`做的那样,除非你使用了`UNION ALL`。 -`EXCEPT`返回所有在*`query1`*的结果中但是不在*`query2`*的结果中的行(有时侯这叫做两个查询的*差*)。同样的,除非声明了`EXCEPT ALL`,否则所有重复行都被消除。 +`INTERSECT`返回那些同时存在于*`query1`**和**`query2`*的结果中的行,除非声明了`INTERSECT ALL`,否则所有重复行都被消除。 -为了计算两个查询的并、交、差,这两个查询必须是“并操作兼容的”,也就意味着它们都返回同样数量的列,并且对应的列有兼容的数据类型,如 http://www.postgresql.org/docs/17/typeconv-union-case.html[第 10.5 节]中描述的那样。 +`EXCEPT`返回所有在*`query1`**的结果中但是不在**`query2`**的结果中的行(有时侯这叫做两个查询的**差*)。同样的,除非声明了`EXCEPT ALL`,否则所有重复行都被消除。 -=== 并行查询 +为了计算两个查询的并、交、差,这两个查询必须是“并操作兼容的”,也就意味着它们都返回同样数量的列,并且对应的列有兼容的数据类型,如 [第 10.5 节](http://www.postgresql.org/docs/17/typeconv-union-case.html)中描述的那样。 -==== 并行查询如何工作 - -当优化器判断对于某一个特定的查询,并行查询是最快的执行策略时,优化器将创建一个查询计划。该计划包括一个 *Gather*或者*Gather Merge*节点。下面是一个简单的例子: +### 并行查询 +#### 并行查询如何工作 +当优化器判断对于某一个特定的查询,并行查询是最快的执行策略时,优化器将创建一个查询计划。该计划包括一个 **Gather**或者**Gather Merge**节点。下面是一个简单的例子: ``` EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; - QUERY PLAN + QUERY PLAN ------------------------------------------------------------------------------------- Gather (cost=1000.00..217018.43 rows=1 width=97) Workers Planned: 2 @@ -269,41 +253,38 @@ EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; (4 rows) ``` -在所有的情形下,`Gather`或*Gather Merge*节点都只有一个子计划,它是将被并行执行的计划的一部分。如果`Gather`或*Gather Merge*节点位于计划树的最顶层,那么整个查询将并行执行。如果它位于计划树的其他位置,那么只有查询中在它之下的那一部分会并行执行。在上面的例子中,查询只访问了一个表,因此除`Gather`节点本身之外只有一个计划节点。因为该计划节点是`Gather`节点的孩子节点,所以它会并行执行。 +在所有的情形下,`Gather`或**Gather Merge**节点都只有一个子计划,它是将被并行执行的计划的一部分。如果`Gather`或**Gather Merge**节点位于计划树的最顶层,那么整个查询将并行执行。如果它位于计划树的其他位置,那么只有查询中在它之下的那一部分会并行执行。在上面的例子中,查询只访问了一个表,因此除`Gather`节点本身之外只有一个计划节点。因为该计划节点是`Gather`节点的孩子节点,所以它会并行执行。 -http://www.postgresql.org/docs/17/using-explain.html[使用 EXPLAIN]命令, 你能看到规划器选择的工作者数量。当查询执行期间到达`Gather`节点时,实现用户会话的进程将会请求和规划器选中的工作者数量一样多的 http://www.postgresql.org/docs/17/bgworker.html[后台工作者进程]。规划器将考虑使用的后台工作者的数量被限制为最多 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER[max_parallel_workers_per_gather]个。任何时候能够存在的后台工作者进程的总数由 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-WORKER-PROCESSES[max_worker_processes]和 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS[max_parallel_workers]限制。因此,一个并行查询可能会使用比规划中少的工作者来运行,甚至有可能根本不使用工作者。最优的计划可能取决于可用的工作者的数量,因此这可能会导致不好的查询性能。如果这种情况经常发生,那么就应当考虑一下提高`max_worker_processes`和`max_parallel_workers`的值,这样更多的工作者可以同时运行;或者降低`max_parallel_workers_per_gather`,这样规划器会要求少一些的工作者。 +[使用 EXPLAIN](http://www.postgresql.org/docs/17/using-explain.html)命令, 你能看到规划器选择的工作者数量。当查询执行期间到达`Gather`节点时,实现用户会话的进程将会请求和规划器选中的工作者数量一样多的 [后台工作者进程](http://www.postgresql.org/docs/17/bgworker.html)。规划器将考虑使用的后台工作者的数量被限制为最多 [max_parallel_workers_per_gather](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER)个。任何时候能够存在的后台工作者进程的总数由 [max_worker_processes](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-WORKER-PROCESSES)和 [max_parallel_workers](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS)限制。因此,一个并行查询可能会使用比规划中少的工作者来运行,甚至有可能根本不使用工作者。最优的计划可能取决于可用的工作者的数量,因此这可能会导致不好的查询性能。如果这种情况经常发生,那么就应当考虑一下提高`max_worker_processes`和`max_parallel_workers`的值,这样更多的工作者可以同时运行;或者降低`max_parallel_workers_per_gather`,这样规划器会要求少一些的工作者。 为一个给定并行查询成功启动的后台工作者进程都将会执行计划的并行部分。这些工作者的领导者也将执行该计划,不过它还有一个额外的任务:它还必须读取所有由工作者产生的元组。当整个计划的并行部分只产生了少量元组时,领导者通常将表现为一个额外的加速查询执行的工作者。反过来,当计划的并行部分产生大量的元组时,领导者将几乎全用来读取由工作者产生的元组并且执行`Gather`或`Gather Merge`节点上层计划节点所要求的任何进一步处理。在这些情况下,领导者所作的执行并行部分的工作将会很少。 当计划的并行部分的顶层节点是`Gather Merge`而不是`Gather`时,它表示每个执行计划并行部分的进程会产生有序的元组,并且领导者执行一种保持顺序的合并。相反,`Gather`会以任何方便的顺序从工作者读取元组,这会破坏可能已经存在的排序顺序。 -==== 何时会用到并行查询? - +#### 何时会用到并行查询? 有几种设置会导致查询规划器在任何情况下都不生成并行查询计划。为了让并行查询计划能够被生成,必须配置好下列设置。 -- http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER[max_parallel_workers_per_gather]必须被设置为大于零的值。这是一种特殊情况,更加普遍的原则是所用的工作者数量不能超过`max_parallel_workers_per_gather`所配置的数量。 +- [max_parallel_workers_per_gather](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER)必须被设置为大于零的值。这是一种特殊情况,更加普遍的原则是所用的工作者数量不能超过`max_parallel_workers_per_gather`所配置的数量。 此外,系统一定不能运行在单用户模式下。因为在单用户模式下,整个数据库系统运行在单个进程中,没有后台工作者进程可用。 如果下面的任一条件为真,即便对一个给定查询通常可以产生并行查询计划,规划器都不会为它产生并行查询计划: - 查询要写任何数据或者锁定任何数据库行。如果一个查询在顶层或者CTE中包含了数据修改操作,那么不会为该查询产生并行计划。一种例外是,`CREATE TABLE ... AS`、`SELECT INTO`以及`CREATE MATERIALIZED VIEW`这些创建新表并填充它的命令可以使用并行计划。 -- 查询可能在执行过程中被暂停。只要在系统认为可能发生部分或者增量式执行,就不会产生并行计划。例如:用 http://www.postgresql.org/docs/17/sql-declare.html[DECLARE CURSOR]创建的游标将永远不会使用并行计划。类似地,一个`FOR x IN query LOOP .. END LOOP`形式的 PL/pgSQL 循环也永远不会使用并行计划,因为当并行查询进行时,并行查询系统无法验证循环中的代码执行起来是安全的。 -- 使用了任何被标记为`PARALLEL UNSAFE`的函数的查询。大多数系统定义的函数都被标记为`PARALLEL SAFE`,但是用户定义的函数默认被标记为`PARALLEL UNSAFE`。参见 http://www.postgresql.org/docs/17/parallel-safety.html[第 15.4 节]中的讨论。 +- 查询可能在执行过程中被暂停。只要在系统认为可能发生部分或者增量式执行,就不会产生并行计划。例如:用 [DECLARE CURSOR](http://www.postgresql.org/docs/17/sql-declare.html)创建的游标将永远不会使用并行计划。类似地,一个`FOR x IN query LOOP .. END LOOP`形式的 PL/pgSQL 循环也永远不会使用并行计划,因为当并行查询进行时,并行查询系统无法验证循环中的代码执行起来是安全的。 +- 使用了任何被标记为`PARALLEL UNSAFE`的函数的查询。大多数系统定义的函数都被标记为`PARALLEL SAFE`,但是用户定义的函数默认被标记为`PARALLEL UNSAFE`。参见 [第 15.4 节](http://www.postgresql.org/docs/17/parallel-safety.html)中的讨论。 - 该查询运行在另一个已经存在的并行查询内部。例如,如果一个被并行查询调用的函数自己发出一个 SQL 查询,那么该查询将不会使用并行计划。这是当前实现的一个限制,但是或许不值得移除这个限制,因为它会导致单个查询使用大量的进程。 即使对于一个特定的查询已经产生了并行查询计划,在一些情况下执行时也不会并行执行该计划。如果发生这种情况,那么领导者将会自己执行该计划在`Gather`节点之下的部分,就好像`Gather`节点不存在一样。上述情况将在满足下面的任一条件时发生: -- 因为后台工作者进程的总数不能超过 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-WORKER-PROCESSES[max_worker_processes],导致不能得到后台工作者进程。 -- 由于为并行查询目的启动的后台工作者数量不能超过 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS[max_parallel_workers]这一限制而不能得到后台工作者。 -- 客户端发送了一个执行消息,并且消息中要求取元组的数量不为零。执行消息可见 http://www.postgresql.org/docs/17/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY[扩展查询协议]中的讨论。因为 http://www.postgresql.org/docs/17/libpq.html[libpq]当前没有提供方法来发送这种消息,所以这种情况只可能发生在不依赖 libpq 的客户端中。如果这种情况经常发生,那在它可能发生的会话中设置 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER[max_parallel_workers_per_gather]为零是一个很好的主意,这样可以避免产生连续运行时次优的查询计划。 - -==== 并行计划 +- 因为后台工作者进程的总数不能超过 [max_worker_processes](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-WORKER-PROCESSES),导致不能得到后台工作者进程。 +- 由于为并行查询目的启动的后台工作者数量不能超过 [max_parallel_workers](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS)这一限制而不能得到后台工作者。 +- 客户端发送了一个执行消息,并且消息中要求取元组的数量不为零。执行消息可见 [扩展查询协议](http://www.postgresql.org/docs/17/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY)中的讨论。因为 [libpq](http://www.postgresql.org/docs/17/libpq.html)当前没有提供方法来发送这种消息,所以这种情况只可能发生在不依赖 libpq 的客户端中。如果这种情况经常发生,那在它可能发生的会话中设置 [max_parallel_workers_per_gather](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER)为零是一个很好的主意,这样可以避免产生连续运行时次优的查询计划。 -因为每个工作者只执行完成计划的并行部分,所以不可能简单地产生一个普通查询计划并使用多个工作者运行它。每个工作者都会产生输出结果集的一个完全,因而查询并不会比普通查询运行得更快甚至还会产生不正确的结果。相反,计划的并行部分一定被查询优化器在内部当作一个*部分计划*,即它必须被构建出来,这样每一个执行该计划的进程将以无重复地方式产生输出行的一个子集,即保证每一个所需要的输出行正好只被一个合作进程生成。通常,这意味着该查询的驱动表上的扫描必须是一种可并行的扫描。 - -===== 并行扫描 +#### 并行计划 +因为每个工作者只执行完成计划的并行部分,所以不可能简单地产生一个普通查询计划并使用多个工作者运行它。每个工作者都会产生输出结果集的一个完全,因而查询并不会比普通查询运行得更快甚至还会产生不正确的结果。相反,计划的并行部分一定被查询优化器在内部当作一个**部分计划**,即它必须被构建出来,这样每一个执行该计划的进程将以无重复地方式产生输出行的一个子集,即保证每一个所需要的输出行正好只被一个合作进程生成。通常,这意味着该查询的驱动表上的扫描必须是一种可并行的扫描。 +##### 并行扫描 当前支持下列可并行的表扫描。 - 在一个***并行顺序扫描\***中,表块将在合作进程之间被划分。一次会分发一个块,这样对表的访问还是保持顺序方式。 @@ -312,84 +293,70 @@ http://www.postgresql.org/docs/17/using-explain.html[使用 EXPLAIN]命令, 你 其他扫描类型(例如非B-树索引的扫描)可能会在未来支持并行扫描。 -===== 并行连接 - +##### 并行连接 正如在非并行计划中那样,驱动表可能被使用嵌套循环、哈希连接或者归并连接连接到一个或者多个其他表。连接的内侧可以是任何类型的被规划器支持的非并行计划,假设它能够安全地在并行工作者中运行。根据连接类型,内侧还可以是一种并行计划。 - 在一个***嵌套循环连接\***中,内侧总是非并行的。尽管它会被完全执行,如果内侧是一个索引扫描也会很高效,因为外侧元组以及在索引中查找值的循环会被划分到多个合作进程。 - 在一个***归并连接\***中,内侧总是一个非并行计划并且因此会被完全执行。这可能是不太高效的,特别是在排序必须被执行时,因为在每一个合作进程中工作数据和结果数据是重复的。 - 在一个***哈希连接\***(没有“并行”前缀)中,每个合作进程都会完全执行内侧以构建哈希表的相同。如果哈希表很大或者该计划开销很大,这种方式就很低效。在一个***并行哈希连接\***中,内侧是一个***并行哈希\***,它把构建共享哈希表的工作划分到多个合作进程。 -===== 并行聚集 - +##### 并行聚集 IvorySQL通过按两个阶段进行聚集来支持并行聚集。首先,每个参与到查询并行部分的进程执行一个聚集步骤,为该进程注意到的每个分组产生一个部分结果。这在计划中反映为一个`Partial Aggregate`节点。然后,部分结果通过`Gather`或者`Gather Merge`被传输到领导者。最后,领导者对来自所有工作者的结果进行重新聚集得到最终的结果。这在计划中反映为一个`Finalize Aggregate`节点。 因为`Finalize Aggregate`节点运行在领导者进程上,如果查询产生的分组数相对于其输入行数来说比较大,则查询规划器不会喜欢它。例如,在最坏的情况下,`Finalize Aggregate`节点看到的分组数可能与所有工作者进程在`Partial Aggregate`阶段看到的输入行数一样多。对于这类情况,使用并行聚集显然得不到性能收益。查询规划器会在规划过程中考虑这一点并且不太会在这种情况下选择并行聚集。 -并行聚集并非在所有情况下都被支持。每一个聚集都必须是对并行 http://www.postgresql.org/docs/17/parallel-safety.html[安全的]并且必须有一个组合函数。如果该聚集有一个类型为`internal`的转移状态,它必须有序列化和反序列化函数。更多细节请参考 http://www.postgresql.org/docs/17/sql-createaggregate.html[CREATE AGGREGATE]。如果任何聚集函数调用包含`DISTINCT`或`ORDER BY`子句,则不支持并行聚集。对于有序集聚集或者当查询涉及`GROUPING SETS`时,也不支持并行聚集。只有在查询中涉及的所有连接也是该计划并行部分的组成部分时,才能使用并行聚集。 - -===== 并行Append +并行聚集并非在所有情况下都被支持。每一个聚集都必须是对并行 [安全的](http://www.postgresql.org/docs/17/parallel-safety.html)并且必须有一个组合函数。如果该聚集有一个类型为`internal`的转移状态,它必须有序列化和反序列化函数。更多细节请参考 [CREATE AGGREGATE](http://www.postgresql.org/docs/17/sql-createaggregate.html)。如果任何聚集函数调用包含`DISTINCT`或`ORDER BY`子句,则不支持并行聚集。对于有序集聚集或者当查询涉及`GROUPING SETS`时,也不支持并行聚集。只有在查询中涉及的所有连接也是该计划并行部分的组成部分时,才能使用并行聚集。 +##### 并行Append 只要当IvorySQL需要从多个源中整合行到一个单一结果集时,它会使用`Append`或`MergeAppend`计划节点。在实现`UNION ALL`或扫描分区表时常常会发生这种情况。就像这些节点可以被用在任何其他计划中一样,它们可以被用在并行计划中。不过,在并行计划中,规划器使用的是`Parallel Append`节点。 当一个`Append`节点被用在并行计划中时,每个进程将按照子计划出现的顺序执行子计划,这样所有的参与进程会合作执行第一个子计划直到它被完成,然后同时移动到第二个计划。而在使用`Parallel Append`时,执行器将把它的子计划尽可能均匀地散布在参与进程中,这样多个子计划会被同时执行。这避免了竞争,也避免了子计划在那些不执行它的进程中产生启动代价。 此外,和常规的`Append`节点不同(在并行计划中使用时仅有部分子计划),`Parallel Append`节点既可以有部分子计划也可以有非部分子计划。非部分子计划将仅被单个进程扫描,因为扫描它们不止一次会产生重复的结果。因此涉及到追加多个结果集的计划即使在没有有效的部分计划可用时,也能实现粗粒度的并行。例如,考虑一个针对分区表的查询,它只能通过使用一个不支持并行扫描的索引来实现。规划器可能会选择常规`Index Scan`计划的`Parallel Append`。每个索引扫描必须被单一的进程执行完,但不同的扫描可以由不同的进程同时执行。 -http://www.postgresql.org/docs/17/runtime-config-query.html#GUC-ENABLE-PARALLEL-APPEND[enable_parallel_append]可以被用来禁用这种特性。 - -===== 并行计划小贴士 +[enable_parallel_append](http://www.postgresql.org/docs/17/runtime-config-query.html#GUC-ENABLE-PARALLEL-APPEND)可以被用来禁用这种特性。 -如果我们想要一个查询能产生并行计划但事实上又没有产生,可以尝试减小 http://www.postgresql.org/docs/17/runtime-config-query.html#GUC-PARALLEL-SETUP-COST[parallel_setup_cost]或者 http://www.postgresql.org/docs/17/runtime-config-query.html#GUC-PARALLEL-TUPLE-COST[parallel_tuple_cost]。当然,这个计划可能比规划器优先产生的顺序计划还要慢,但也不总是如此。如果将这些设置为很小的值(例如把它们设置为零)也不能得到并行计划,那就可能是有某种原因导致查询规划器无法为你的查询产生并行计划。可能的原因可见 http://www.postgresql.org/docs/17/when-can-parallel-query-be-used.html[第 15.2 节]和 http://www.postgresql.org/docs/17/parallel-safety.html[第 15.4 节]。 +##### 并行计划小贴士 +如果我们想要一个查询能产生并行计划但事实上又没有产生,可以尝试减小 [parallel_setup_cost](http://www.postgresql.org/docs/17/runtime-config-query.html#GUC-PARALLEL-SETUP-COST)或者 [parallel_tuple_cost](http://www.postgresql.org/docs/17/runtime-config-query.html#GUC-PARALLEL-TUPLE-COST)。当然,这个计划可能比规划器优先产生的顺序计划还要慢,但也不总是如此。如果将这些设置为很小的值(例如把它们设置为零)也不能得到并行计划,那就可能是有某种原因导致查询规划器无法为你的查询产生并行计划。可能的原因可见 [第 15.2 节](http://www.postgresql.org/docs/17/when-can-parallel-query-be-used.html)和 [第 15.4 节](http://www.postgresql.org/docs/17/parallel-safety.html)。 在执行一个并行计划时,可以用`EXPLAIN (ANALYZE,VERBOSE)`来显示每个计划节点在每个工作者上的统计信息。这些信息有助于确定是否所有的工作被均匀地分发到所有计划节点以及从总体上理解计划的性能特点。 -== 事务(参考Sql命令) - -=== ABORT — 中止当前事务 - -==== 大纲 - +## 事务(参考Sql命令) +### ABORT — 中止当前事务 +#### 大纲 ``` ABORT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] ``` -==== 描述 - -`ABORT`回滚当前事务并且导致由该事务所作的所有更新被丢弃。这个命令的行为与标准SQL命令 http://www.postgresql.org/docs/17/sql-rollback.html[`ROLLBACK`]的行为一样,并且只是为了历史原因存在。 - -==== 参数 +#### 描述 +`ABORT`回滚当前事务并且导致由该事务所作的所有更新被丢弃。这个命令的行为与标准SQL命令 [`ROLLBACK`](http://www.postgresql.org/docs/17/sql-rollback.html)的行为一样,并且只是为了历史原因存在。 +#### 参数 - `WORK` `TRANSACTION` 可选关键词。它们没有效果。 - `AND CHAIN` - 如果规定了`AND CHAIN` ,新事务立即启动,具有与刚刚完成的事务相同的事务特征(参见 http://www.postgresql.org/docs/17/sql-set-transaction.html[`SET TRANSACTION`])。否则,不会启动新事务。 - -==== 注解 + 如果规定了`AND CHAIN` ,新事务立即启动,具有与刚刚完成的事务相同的事务特征(参见 [`SET TRANSACTION`](http://www.postgresql.org/docs/17/sql-set-transaction.html))。否则,不会启动新事务。 -使用 http://www.postgresql.org/docs/17/sql-commit.html[`COMMIT`]成功地终止一个事务。 +#### 注解 +使用 [`COMMIT`](http://www.postgresql.org/docs/17/sql-commit.html)成功地终止一个事务。 在一个事务块之外发出`ABORT`会发出一个警告消息并且不会产生效果。 -==== 例子 - +#### 例子 中止所有更改: ``` ABORT; ``` -==== 兼容性 - +#### 兼容性 这个命令是一个因为历史原因而存在的IvorySQL扩展。`ROLLBACK`是等效的标准SQL命令。 -=== BEGIN — 开始一个事务块 - -==== 大纲 - +### BEGIN — 开始一个事务块 +#### 大纲 ``` BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ] @@ -400,311 +367,258 @@ BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ] [ NOT ] DEFERRABLE ``` -==== 描述 - -`BEGIN` 开始一个事务块,也就是说所有 `BEGIN` 命令之后的所有语句将被在一个事务中执行,直到给出一个显式的 http://www.postgresql.org/docs/17/sql-commit.html[`COMMIT`]或者 http://www.postgresql.org/docs/17/sql-rollback.html[`ROLLBACK`]。默认情况下(没有 `BEGIN` ),IvorySQL在“自动提交”模式中执行事务,也就是说每个语句都在自己的事务中执行并且在语句结束时隐式地执行一次提交(如果执行成功,否则会完成一次回滚)。 +#### 描述 +`BEGIN` 开始一个事务块,也就是说所有 `BEGIN` 命令之后的所有语句将被在一个事务中执行,直到给出一个显式的 [`COMMIT`](http://www.postgresql.org/docs/17/sql-commit.html)或者 [`ROLLBACK`](http://www.postgresql.org/docs/17/sql-rollback.html)。默认情况下(没有 `BEGIN` ),IvorySQL在“自动提交”模式中执行事务,也就是说每个语句都在自己的事务中执行并且在语句结束时隐式地执行一次提交(如果执行成功,否则会完成一次回滚)。 在一个事务块内的语句会执行得更快,因为事务的开始/提交也要求可观的CPU和磁盘活动。在进行多个相关更改时,在一个事务内执行多个语句也有助于保证一致性:在所有相关更新还没有完成之前,其他会话将不能看到中间状态。 -如果指定了隔离级别、读/写模式或者延迟模式,新事务也会有那些特性,就像执行了 http://www.postgresql.org/docs/17/sql-set-transaction.html[`SET TRANSACTION`]一样。 - -==== 参数 +如果指定了隔离级别、读/写模式或者延迟模式,新事务也会有那些特性,就像执行了 [`SET TRANSACTION`](http://www.postgresql.org/docs/17/sql-set-transaction.html)一样。 +#### 参数 - `WORK``TRANSACTION` 可选的关键词。它们没有效果。 -这个语句其他参数的含义请参考 http://www.postgresql.org/docs/17/sql-set-transaction.html[SET TRANSACTION]。 - -==== 注解 +这个语句其他参数的含义请参考 [SET TRANSACTION](http://www.postgresql.org/docs/17/sql-set-transaction.html)。 -http://www.postgresql.org/docs/17/sql-start-transaction.html[`START TRANSACTION`]具有和`BEGIN` 相同的功能。 +#### 注解 +[`START TRANSACTION`](http://www.postgresql.org/docs/17/sql-start-transaction.html)具有和`BEGIN` 相同的功能。 -使用 http://www.postgresql.org/docs/17/sql-commit.html[`COMMIT`]或者 http://www.postgresql.org/docs/17/sql-rollback.html[`ROLLBACK`]来终止一个事务块。 +使用 [`COMMIT`](http://www.postgresql.org/docs/17/sql-commit.html)或者 [`ROLLBACK`](http://www.postgresql.org/docs/17/sql-rollback.html)来终止一个事务块。 -在已经在一个事务块中时发出`BEGIN`将惹出一个警告消息。事务状态不会被影响。要在一个事务块中嵌套事务,可以使用保存点(见 http://www.postgresql.org/docs/17/sql-savepoint.html[SAVEPOINT])。 +在已经在一个事务块中时发出`BEGIN`将惹出一个警告消息。事务状态不会被影响。要在一个事务块中嵌套事务,可以使用保存点(见 [SAVEPOINT](http://www.postgresql.org/docs/17/sql-savepoint.html))。 由于向后兼容的原因,连续的 *`transaction_modes`* 之间的逗号可以被省略。 -==== 示例 - +#### 示例 开始一个事务块: ``` BEGIN; ``` -==== 兼容性 - -`BEGIN` 是一种IvorySQL语言扩展。它等效于SQL标准的命令 http://www.postgresql.org/docs/17/sql-start-transaction.html[`START TRANSACTION`],它的参考页包含额外的兼容性信息。 +#### 兼容性 +`BEGIN` 是一种IvorySQL语言扩展。它等效于SQL标准的命令 [`START TRANSACTION`](http://www.postgresql.org/docs/17/sql-start-transaction.html),它的参考页包含额外的兼容性信息。 `DEFERRABLE` *`transaction_mode`* 是一种IvorySQL语言扩展。 附带地,`BEGIN`关键词被用于嵌入式SQL中的一种不同目的。在移植数据库应用时,我们建议小心对待事务语义。 -=== COMMIT — 提交当前事务 - -==== 大纲 - +### COMMIT — 提交当前事务 +#### 大纲 `COMMIT`提交当前事务。所有由该事务所作的更改会变得对他人可见并且被保证在崩溃发生时仍能持久。 -==== 参数 - +#### 参数 `WORK` `TRANSACTION`:: 可选的关键词。它们没有效果。 `AND CHAIN`:: -如果指定了 `AND CHAIN`,则立即启动与刚刚完成的事务具有相同事务特征(参见 http://www.postgresql.org/docs/17/sql-set-transaction.html[SET TRANSACTION])的新事务。否则,没有新事务被启动。 - -==== 注解 +如果指定了 `AND CHAIN`,则立即启动与刚刚完成的事务具有相同事务特征(参见 [SET TRANSACTION](http://www.postgresql.org/docs/17/sql-set-transaction.html))的新事务。否则,没有新事务被启动。 -使用 http://www.postgresql.org/docs/17/sql-rollback.html[ROLLBACK]中止一个事务。 +#### 注解 +使用 [ROLLBACK](http://www.postgresql.org/docs/17/sql-rollback.html)中止一个事务。 当不在一个事务内时发出 `COMMIT` 不会产生危害,但是它会产生一个警告消息。当`COMMIT AND CHAIN`不在事务内时是一个错误。 -==== 示例 - +#### 示例 要提交当前事务并且让所有更改持久化: ``` COMMIT; ``` -==== 兼容性 - +#### 兼容性 命令 `COMMIT`符合SQL标准。表单`COMMIT TRANSACTION`为IvorySQL扩展。 -=== COMMIT PREPARED — 提交一个早前为两阶段提交预备的事务 - -==== 大纲 - +### COMMIT PREPARED — 提交一个早前为两阶段提交预备的事务 +#### 大纲 ``` COMMIT PREPARED transaction_id ``` -==== 描述 - +#### 描述 `COMMIT PREPARED`提交一个处于预备状态的事务。 -==== 参数 - +#### 参数 *`transaction_id`*:: 要被提交的事务的事务标识符。 -==== 注解 - +#### 注解 要提交一个预备的事务,你必须是原先执行该事务的同一用户或者超级用户。但是不需要处于执行该事务的同一会话中。 这个命令不能在一个事务块中执行。该预备事务将被立刻提交。 -http://www.postgresql.org/docs/17/view-pg-prepared-xacts.html[`pg_prepared_xacts`]系统视图中列出了所有当前可用的预备事务。 - -==== 例子 +[`pg_prepared_xacts`](http://www.postgresql.org/docs/17/view-pg-prepared-xacts.html)系统视图中列出了所有当前可用的预备事务。 +#### 例子 提交由事务标识符`foobar`标识的事务: ``` COMMIT PREPARED 'foobar'; ``` -==== 兼容性 - +#### 兼容性 `COMMIT PREPARED` 是一种IvorySQL扩展。其意图是用于外部事务管理系统,其中有些已经被标准涵盖(例如 X/Open XA),但是那些系统的SQL方面未被标准化。 -=== END - 提交当前事务 - -==== 大纲 - +### END - 提交当前事务 +#### 大纲 ``` END [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] ``` -==== 描述 - -`END` 提交当前事务。所有该事务做的更改便得对他人可见并且被保证发生崩溃时仍然是持久的。这个命令是一种IvorySQL扩展,它等效于 http://www.postgresql.org/docs/17/sql-commit.html[`COMMIT`]。 - -==== 参数 +#### 描述 +`END` 提交当前事务。所有该事务做的更改便得对他人可见并且被保证发生崩溃时仍然是持久的。这个命令是一种IvorySQL扩展,它等效于 [`COMMIT`](http://www.postgresql.org/docs/17/sql-commit.html)。 +#### 参数 `WORK` `TRANSACTION`:: 可选关键词,它们没有效果。 `AND CHAIN`:: -如果规定了`AND CHAIN`,则立即启动与刚完成事务具有相同事务特征(参见 http://www.postgresql.org/docs/17/sql-set-transaction.html[SET TRANSACTION])的新事务。否则,没有新事务被启动。 - -==== 注解 +如果规定了`AND CHAIN`,则立即启动与刚完成事务具有相同事务特征(参见 [SET TRANSACTION](http://www.postgresql.org/docs/17/sql-set-transaction.html))的新事务。否则,没有新事务被启动。 -使用 http://www.postgresql.org/docs/17/sql-rollback.html[`ROLLBACK`]可以中止一个事务。 +#### 注解 +使用 [`ROLLBACK`](http://www.postgresql.org/docs/17/sql-rollback.html)可以中止一个事务。 当不在一个事务中时发出`END`没有危害,但是会产生一个警告消息。 -==== 示例 - +#### 示例 要提交当前事务并且让所有更改持久化: ``` END; ``` -==== 兼容性 - -`END` 是一种IvorySQL扩展,它提供和 http://www.postgresql.org/docs/17/sql-commit.html[`COMMIT`]等效的功能,后者在SQL标准中指定。 - -=== PREPARE TRANSACTION — 为两阶段提交准备当前事务 - -==== 大纲 +#### 兼容性 +`END` 是一种IvorySQL扩展,它提供和 [`COMMIT`](http://www.postgresql.org/docs/17/sql-commit.html)等效的功能,后者在SQL标准中指定。 +### PREPARE TRANSACTION — 为两阶段提交准备当前事务 +#### 大纲 ``` PREPARE TRANSACTION transaction_id ``` -==== 描述 - +#### 描述 `PREPARE TRANSACTION`为两阶段提交准备当前事务。在这个命令之后,该事务不再与当前会话关联。相反,它的状态被完全存储在磁盘上,并且有很高的可能性它会被提交成功(即便在请求提交前发生数据库崩溃)。 -一旦被准备好,事务稍后就可以分别用 http://www.postgresql.org/docs/17/sql-commit-prepared.html[`COMMIT PREPARED`]或者 http://www.postgresql.org/docs/17/sql-rollback-prepared.html[`ROLLBACK PREPARED`]提交或者回滚。可以从任何会话而不仅仅是执行原始事务的会话中发出这些命令。 +一旦被准备好,事务稍后就可以分别用 [`COMMIT PREPARED`](http://www.postgresql.org/docs/17/sql-commit-prepared.html)或者 [`ROLLBACK PREPARED`](http://www.postgresql.org/docs/17/sql-rollback-prepared.html)提交或者回滚。可以从任何会话而不仅仅是执行原始事务的会话中发出这些命令。 从发出命令的会话的角度来看,`PREPARE TRANSACTION`不像`ROLLBACK`命令:在执行它之后,就没有活跃的当前事务,并且该预备事务的效果也不再可见(如果该事务被提交,效果将重新变得可见)。 如果由于任何原因`PREPARE TRANSACTION`命令失败,它会变成一个`ROLLBACK`:当前事务会被取消。 -==== 参数 - +#### 参数 *`transaction_id`*:: 一个任意的事务标识符,`COMMIT PREPARED`或者`ROLLBACK PREPARED`以后将用这个标识符来标识这个事务。该标识符必须写成一个字符串,并且长度必须小于200字节。它也不能与任何当前已经准备好的事务的标识符相同。 -==== 注解 - +#### 注解 `PREPARE TRANSACTION`并不是设计为在应用或者交互式会话中使用。它的目的是允许一个外部事务管理器在多个数据库或者其他事务性来源之间执行原子的全局事务。除非你在编写一个事务管理器,否则你可能不会用到`PREPARE TRANSACTION`。 -这个命令必须在一个事务块中使用。事务块用 http://www.postgresql.org/docs/17/sql-begin.html[`BEGIN`]开始。 +这个命令必须在一个事务块中使用。事务块用 [`BEGIN`](http://www.postgresql.org/docs/17/sql-begin.html)开始。 当前在已经执行过任何涉及到临时表或者会话的临时命名空间、创建带`WITH HOLD`的游标或者执行`LISTEN`、`UNLISTEN`或 `NOTIFY`的事务中,不允许`PREPARE`该事务。这些特性与当前会话绑定得太过紧密,所以对一个要被准备的事务来说没有什么用处。 如果用`SET`(不带`LOCAL`选项)修改过事务的任何运行时参数,这些效果会持续到`PREPARE TRANSACTION`之后,并且将不会被后续的任何`COMMIT PREPARED`或`ROLLBACK PREPARED`所影响。因此,在这一 方面`PREPARE TRANSACTION`的行为更像`COMMIT`而不是`ROLLBACK`。 -所有当前可用的准备好事务被列在 http://www.postgresql.org/docs/17/view-pg-prepared-xacts.html[`pg_prepared_xacts`]系统视图中。 - -==== 小心 - -让一个事务处于准备好状态太久是不明智的。这将会干扰`VACUUM`回收存储的能力,并且在极限情况下可能导致数据库关闭以阻止事务ID回卷(见 http://www.postgresql.org/docs/17/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND[第 25.1.5 节])。还要记住,该事务会继续持有它已经持有的锁。该特性的设计用法是,只要一个外部事务管理器已经验证其他数据库也准备好了要提交,一个准备好的事务将被正常地提交或者回滚。 +所有当前可用的准备好事务被列在 [`pg_prepared_xacts`](http://www.postgresql.org/docs/17/view-pg-prepared-xacts.html)系统视图中。 -如果没有建立一个外部事务管理器来跟踪准备好的事务并且确保它们被迅速地结束,最好禁用准备好事务特性(设置 http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PREPARED-TRANSACTIONS[max_prepared_transactions]为零)。这将防止意外地创建准备好事务,不然该事务有可能被忘记并且最终导致问题。 +#### 小心 +让一个事务处于准备好状态太久是不明智的。这将会干扰`VACUUM`回收存储的能力,并且在极限情况下可能导致数据库关闭以阻止事务ID回卷(见 [第 25.1.5 节](http://www.postgresql.org/docs/17/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND))。还要记住,该事务会继续持有它已经持有的锁。该特性的设计用法是,只要一个外部事务管理器已经验证其他数据库也准备好了要提交,一个准备好的事务将被正常地提交或者回滚。 -==== 例子 +如果没有建立一个外部事务管理器来跟踪准备好的事务并且确保它们被迅速地结束,最好禁用准备好事务特性(设置 [max_prepared_transactions](http://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAX-PREPARED-TRANSACTIONS)为零)。这将防止意外地创建准备好事务,不然该事务有可能被忘记并且最终导致问题。 +#### 例子 为两阶段提交准备当前事务,使用`foobar`作为事务标识符: ``` PREPARE TRANSACTION 'foobar'; ``` -==== 兼容性 - +#### 兼容性 `PREPARE TRANSACTION`是一种IvorySQL扩展。其意图是用于外部事务管理系统,其中有些已经被标准涵盖(例如 X/Open XA),但是那些系统的SQL方面未被标准化。 -=== ROLLBACK — 中止当前事务 - -==== 大纲 - +### ROLLBACK — 中止当前事务 +#### 大纲 ``` ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] ``` -==== 描述 - +#### 描述 `ROLLBACK`回滚当前事务并且导致该事务所作的所有更新都被抛弃。 -==== 参数 - +#### 参数 `WORK` `TRANSACTION`:: 可选关键词,没有效果。 `AND CHAIN`:: -如果指定了`AND CHAIN`,则立即启动与刚刚完成事务具有相同事务特征(参见 http://www.postgresql.org/docs/17/sql-set-transaction.html[SET TRANSACTION])的新事务。否则,不会启动任何新事务。 - -==== 注解 +如果指定了`AND CHAIN`,则立即启动与刚刚完成事务具有相同事务特征(参见 [SET TRANSACTION](http://www.postgresql.org/docs/17/sql-set-transaction.html))的新事务。否则,不会启动任何新事务。 -使用 http://www.postgresql.org/docs/17/sql-commit.html[`COMMIT`]可成功地终止一个事务。 +#### 注解 +使用 [`COMMIT`](http://www.postgresql.org/docs/17/sql-commit.html)可成功地终止一个事务。 在一个事务块之外发出`ROLLBACK`会发出一个警告并且不会有效果。事务块之外的`ROLLBACK AND CHAIN`是一个错误。 -==== 示例 - +#### 示例 要中止所有更改: ``` ROLLBACK; ``` -==== 兼容性 - +#### 兼容性 命令`ROLLBACK`符合SQL标准。窗体`ROLLBACK TRANSACTION`是一个IvorySQL扩展。 -=== ROLLBACK PREPARED — 取消一个之前为两阶段提交准备好的事务 - -==== 大纲 - +### ROLLBACK PREPARED — 取消一个之前为两阶段提交准备好的事务 +#### 大纲 ``` ROLLBACK PREPARED transaction_id ``` -==== 描述 - +#### 描述 `ROLLBACK PREPARED`回滚一个处于准备好状态的事务。 -==== 参数 - +#### 参数 *`transaction_id`*:: 要被回滚的事务的事务标识符。 -==== 注解 - +#### 注解 要回滚一个准备好的事务,你必须是原先执行该事务的同一个用户或者是一个超级用户。但是你必须处在执行该事务的同一个会话中。 这个命令不能在一个事务块内被执行。准备好的事务会被立刻回滚。 -http://www.postgresql.org/docs/17/view-pg-prepared-xacts.html[`pg_prepared_xacts`]系统视图中列出了当前可用的所有准备好的事务。 - -==== 例子 +[`pg_prepared_xacts`](http://www.postgresql.org/docs/17/view-pg-prepared-xacts.html)系统视图中列出了当前可用的所有准备好的事务。 +#### 例子 用事务标识符`foobar`回滚对应的事务: ``` ROLLBACK PREPARED 'foobar'; ``` -==== 兼容性 - +#### 兼容性 `ROLLBACK PREPARED`是一种IvorySQL扩展。其意图是用于外部事务管理系统,其中有些已经被标准涵盖(例如 X/Open XA),但是那些系统的SQL方面未被标准化。 -=== SAVEPOINT — 在当前事务中定义一个新的保存点 - -==== 大纲 - +### SAVEPOINT — 在当前事务中定义一个新的保存点 +#### 大纲 ``` SAVEPOINT savepoint_name ``` -==== 描述 - +#### 描述 `SAVEPOINT`在当前事务中建立一个新保存点。 保存点是事务内的一种特殊标记,它允许所有在它被建立之后执行的命令被回滚,把该事务的状态恢复到它处于保存点时的样子。 -==== 参数 - +#### 参数 *`savepoint_name`*:: 给新保存点的名字。 -==== 注解 - -使用 http://www.postgresql.org/docs/17/sql-rollback-to.html[`ROLLBACK TO`]回滚到一个保存点。使用 http://www.postgresql.org/docs/17/sql-release-savepoint.html[`RELEASE SAVEPOINT`]销毁一个保存点,但保持在它被建立之后执行的命令的效果。 +#### 注解 +使用 [`ROLLBACK TO`](http://www.postgresql.org/docs/17/sql-rollback-to.html)回滚到一个保存点。使用 [`RELEASE SAVEPOINT`](http://www.postgresql.org/docs/17/sql-release-savepoint.html)销毁一个保存点,但保持在它被建立之后执行的命令的效果。 保存点只能在一个事务块内建立。可以在一个事务内定义多个保存点。 -==== 示例 - +#### 示例 要建立一个保存点并且后来撤销在它建立之后执行的所有命令的效果: ``` @@ -732,20 +646,16 @@ COMMIT; 上面的事务将插入 3 和 4。 -==== 兼容性 - +#### 兼容性 当建立另一个同名保存点时,SQL要求之前的那个保存点自动被销毁。在IvorySQL中,旧的保存点会被保留,不过在进行回滚或释放时只能使用最近的那一个(用 `RELEASE SAVEPOINT`释放较新的保存点将会导致较旧的保存点再次变得可以被`ROLLBACK TO SAVEPOINT`和`RELEASE SAVEPOINT`访问)。在其他方面,`SAVEPOINT`完全符合SQL。 -=== SET CONSTRAINTS — 为当前事务设置约束检查时机 - -==== 大纲 - +### SET CONSTRAINTS — 为当前事务设置约束检查时机 +#### 大纲 ``` SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE } ``` -==== 描述 - +#### 描述 `SET CONSTRAINTS`设置当前事务内约束检查的行为。`IMMEDIATE`约束在每个语句结束时被检查。`DEFERRED`约束直到事务提交时才被检查。每个约束都有自己的`IMMEDIATE`或`DEFERRED`模式。 在创建时,一个约束会被给定三种特性之一:`DEFERRABLE INITIALLY DEFERRED`、`DEFERRABLE INITIALLY IMMEDIATE`或者`NOT DEFERRABLE`。第三类总是`IMMEDIATE`并且不会受到`SET CONSTRAINTS`命令的影响。前两类在每个事务开始时都处于指定的模式,但是它们的行为可以在一个事务内用`SET CONSTRAINTS`更改。 @@ -758,20 +668,16 @@ SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE } 被声明为“约束触发器”的触发器的引发也受到这个设置的控制 — 它们会在相关约束被检查的同时被引发。 -==== 注解 - +#### 注解 因为IvorySQL并不要求约束名称在模式内唯一(但是在表内要求唯一),可能有多于一个约束匹配指定的约束名称。在这种情况下`SET CONSTRAINTS`将会在所有的匹配上操作。对于一个非模式限定的名称,一旦在搜索路径中的某个模式中发现一个或者多个匹配,路径中后面的模式将不会被搜索。 这个命令只修改当前事务内约束的行为。在事务块外部发出这个命令会产生一个警告并且也不会有任何效果。 -==== 兼容性 - +#### 兼容性 这个命令符合SQL标准中定义的行为,但有一点限制:在 IvorySQL中,它不会应用在`NOT NULL`和`CHECK`约束上。还有,IvorySQL会立刻检查非可延迟的唯一约束,而不是按照标准建议的在语句结束时检查。 -=== SET TRANSACTION — 设置当前事务的特性 - -==== 大纲 - +### SET TRANSACTION — 设置当前事务的特性 +#### 大纲 ``` SET TRANSACTION transaction_mode [, ...] SET TRANSACTION SNAPSHOT snapshot_id @@ -784,8 +690,7 @@ SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...] [ NOT ] DEFERRABLE ``` -==== 描述 - +#### 描述 `SET TRANSACTION`命令设置当前会话的特性。`SET SESSION CHARACTERISTICS`设置一个会话后续事务的默认事务特性。在个体事务中可以用`SET TRANSACTION`覆盖这些默认值。 可用的事务特性是事务隔离级别、事务访问模式(读/写或只读)以及可延迟模式。此外,可以选择一个快照,不过只能用于当前事务而不能作为会话默认值。 @@ -803,26 +708,24 @@ SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...] SQL标准定义了一种额外的级别:`READ UNCOMMITTED`。在IvorySQL中`READ UNCOMMITTED`被视作`READ COMMITTED`。 -一个事务执行了第一个查询或者数据修改语句(`SELECT`、`INSERT`、`DELETE`、`UPDATE`、`FETCH`或`COPY`)之后就无法更改事务隔离级别。更多有关事务隔离级别和并发控制的信息可见 http://www.postgresql.org/docs/17/mvcc.html[第 13 章]。 +一个事务执行了第一个查询或者数据修改语句(`SELECT`、`INSERT`、`DELETE`、`UPDATE`、`FETCH`或`COPY`)之后就无法更改事务隔离级别。更多有关事务隔离级别和并发控制的信息可见 [第 13 章](http://www.postgresql.org/docs/17/mvcc.html)。 事务的访问模式决定该事务是否为读/写或者只读。读/写是默认值。当一个事务为只读时,如果SQL命令`INSERT`、`UPDATE`、`DELETE`和`COPY FROM`要写的表不是一个临时表,则它们不被允许。不允许`CREATE`、`ALTER`以及`DROP`命令。不允许`COMMENT`、`GRANT`、`REVOKE`、`TRUNCATE`。如果`EXPLAIN ANALYZE`和`EXECUTE`要执行的命令是上述命令之一,则它们也不被允许。这是一种高层的只读概念,它不能阻止所有对磁盘的写入。 只有事务也是`SERIALIZABLE`以及`READ ONLY`时,`DEFERRABLE`事务属性才会有效。当一个事务的所有这三个属性都被选择时,该事务在第一次获取其快照时可能会阻塞,在那之后它运行时就不会有`SERIALIZABLE`事务的开销并且不会有任何牺牲或者被一次序列化失败取消的风险。这种模式很适合于长时间运行的报表或者备份。 -`SET TRANSACTION SNAPSHOT`命令允许新的事务使用与一个现有事务相同的*快照*运行。已经存在的事务必须已经把它的快照用`pg_export_snapshot` 函数(见 http://www.postgresql.org/docs/17/functions-admin.html#FUNCTIONS-SNAPSHOT-SYNCHRONIZATION[第 9.27.5 节])导出。该函数会返回一个快照标识符,`SET TRANSACTION SNAPSHOT`需要被给定一个快照标识符来指定要导入的快照。在这个命令中该标识符必须被写成一个字符串,例如`'000003A1-1'`。`SET TRANSACTION SNAPSHOT`只能在一个事务的开始执行,并且要在该事务的第一个查询或者数据修改语句(`SELECT`、`INSERT`、`DELETE`、`UPDATE`、`FETCH`或 `COPY`)之前执行。此外,该事务必须已经被设置为`SERIALIZABLE`或者`REPEATABLE READ`隔离级别(否则,该快照将被立刻抛弃,因为`READ COMMITTED`模式会为每一个命令取一个新快照)。如果导入事务使用了`SERIALIZABLE`隔离级别,那么导入快照的事务必须也使用该隔离级别。还有,一个非只读可序列化事务不能导入来自只读事务的快照。 - -==== 注解 +`SET TRANSACTION SNAPSHOT`命令允许新的事务使用与一个现有事务相同的**快照**运行。已经存在的事务必须已经把它的快照用`pg_export_snapshot` 函数(见 [第 9.27.5 节](http://www.postgresql.org/docs/17/functions-admin.html#FUNCTIONS-SNAPSHOT-SYNCHRONIZATION))导出。该函数会返回一个快照标识符,`SET TRANSACTION SNAPSHOT`需要被给定一个快照标识符来指定要导入的快照。在这个命令中该标识符必须被写成一个字符串,例如`'000003A1-1'`。`SET TRANSACTION SNAPSHOT`只能在一个事务的开始执行,并且要在该事务的第一个查询或者数据修改语句(`SELECT`、`INSERT`、`DELETE`、`UPDATE`、`FETCH`或 `COPY`)之前执行。此外,该事务必须已经被设置为`SERIALIZABLE`或者`REPEATABLE READ`隔离级别(否则,该快照将被立刻抛弃,因为`READ COMMITTED`模式会为每一个命令取一个新快照)。如果导入事务使用了`SERIALIZABLE`隔离级别,那么导入快照的事务必须也使用该隔离级别。还有,一个非只读可序列化事务不能导入来自只读事务的快照。 +#### 注解 如果执行`SET TRANSACTION`之前没有`START TRANSACTION`或者`BEGIN`,它会发出一个警告并且不会有任何效果。 可以通过在`BEGIN`或者`START TRANSACTION`中指定想要的`*transaction_modes*`来省掉`SET TRANSACTION`。但是在`SET TRANSACTION SNAPSHOT`中该选项不可用。 -会话默认的事务模式也可以通过配置参数 http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-ISOLATION[default_transaction_isolation]、http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-READ-ONLY[default_transaction_read_only]和 http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-DEFERRABLE[default_transaction_deferrable]来设置或检查(实际上`SET SESSION CHARACTERISTICS`只是用`SET`设置这些变量的等效体)。这意味着可以通过配置文件、`ALTER DATABASE` 等方式设置默认值。详见 http://www.postgresql.org/docs/17/runtime-config.html[第 20 章]。 - -当前事务的模式可以类似的通过配置参数 http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-TRANSACTION-ISOLATION[transaction_isolation]、 http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-TRANSACTION-READ-ONLY[transaction_read_only]、和 http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-TRANSACTION-DEFERRABLE[transaction_deferrable]来设置或检查。设置这其中一个参数的作用与相应的`SET TRANSACTION`选项相同,在它何时可以完成方面,也有相同的限制。但是,这些参数不能在配置文件中设置,或者从活动SQL以外的任何来源来设置。 +会话默认的事务模式也可以通过配置参数 [default_transaction_isolation](http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-ISOLATION)、[default_transaction_read_only](http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-READ-ONLY)和 [default_transaction_deferrable](http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-DEFERRABLE)来设置或检查(实际上`SET SESSION CHARACTERISTICS`只是用`SET`设置这些变量的等效体)。这意味着可以通过配置文件、`ALTER DATABASE` 等方式设置默认值。详见 [第 20 章](http://www.postgresql.org/docs/17/runtime-config.html)。 -==== 示例 +当前事务的模式可以类似的通过配置参数 [transaction_isolation](http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-TRANSACTION-ISOLATION)、 [transaction_read_only](http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-TRANSACTION-READ-ONLY)、和 [transaction_deferrable](http://www.postgresql.org/docs/17/runtime-config-client.html#GUC-TRANSACTION-DEFERRABLE)来设置或检查。设置这其中一个参数的作用与相应的`SET TRANSACTION`选项相同,在它何时可以完成方面,也有相同的限制。但是,这些参数不能在配置文件中设置,或者从活动SQL以外的任何来源来设置。 +#### 示例 要用一个已经存在的事务的同一快照开始一个新事务,首先要从该现有事务导出快照。这将会返回快照标识符,例如: ``` @@ -841,8 +744,7 @@ BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT '00000003-0000001B-1'; ``` -==== 兼容性 - +#### 兼容性 SQL标准中定义了这些命令,不过`DEFERRABLE`事务模式和`SET TRANSACTION SNAPSHOT`形式除外,这两者是IvorySQL扩展。 `SERIALIZABLE`是标准中默认的事务隔离级别。在IvorySQL中默认值是普通的`READ COMMITTED`,但是你可以按上述的方式更改。 @@ -851,10 +753,8 @@ SQL标准中定义了这些命令,不过`DEFERRABLE`事务模式和`SET TRANSA SQL标准要求连续的 *`transaction_modes`* 之间有逗号,但是出于历史原因IvorySQL允许省略逗号。 -=== START TRANSACTION — 开始一个事务块 - -==== 大纲 - +### START TRANSACTION — 开始一个事务块 +#### 大纲 ``` START TRANSACTION [ transaction_mode [, ...] ] @@ -865,29 +765,24 @@ START TRANSACTION [ transaction_mode [, ...] ] [ NOT ] DEFERRABLE ``` -==== 描述 - -这个命令开始一个新的事务块。如果指定了隔离级别、读写模式或者可延迟模式,新的事务将会具有这些特性,就像执行了 http://www.postgresql.org/docs/17/sql-set-transaction.html[`SET TRANSACTION`]一样。这和 http://www.postgresql.org/docs/17/sql-begin.html[`BEGIN`]命令一样。 +#### 描述 +这个命令开始一个新的事务块。如果指定了隔离级别、读写模式或者可延迟模式,新的事务将会具有这些特性,就像执行了 [`SET TRANSACTION`](http://www.postgresql.org/docs/17/sql-set-transaction.html)一样。这和 [`BEGIN`](http://www.postgresql.org/docs/17/sql-begin.html)命令一样。 -==== 参数 - -这些参数对于这个语句的含义可参考 http://www.postgresql.org/docs/17/sql-set-transaction.html[SET TRANSACTION]。 - -==== 兼容性 +#### 参数 +这些参数对于这个语句的含义可参考 [SET TRANSACTION](http://www.postgresql.org/docs/17/sql-set-transaction.html)。 +#### 兼容性 在标准中,没有必要发出`START TRANSACTION`来开始一个事务块:任何SQL命令会隐式地开始一个块。IvorySQL的行为可以被视作在每个命令之后隐式地发出一个没有跟随在`START TRANSACTION`(或者`BEGIN`)之后的`COMMIT`并且因此通常被称作 “自动提交”。为了方便,其他关系型数据库系统也可能会提供自动提交特性。 `DEFERRABLE` *`transaction_mode`* 是一种IvorySQL语言扩展。 SQL标准要求在连续的 *`transaction_modes`* 之间有逗号,但是由于历史原因IvorySQL允许省略逗号。 -== Sql参考(第 4 章 SQL语法) - -=== 词法结构 +## Sql参考(第 4 章 SQL语法) +### 词法结构 +SQL输入由一个 **命令** 序列组成。一个命令由一个 **记号** 的序列构成,并由一个分号(“;”)终结。输入流的末端也会标志一个命令的结束。具体哪些记号是合法的与具体命令的语法有关。 -SQL输入由一个 *命令* 序列组成。一个命令由一个 *记号* 的序列构成,并由一个分号(“;”)终结。输入流的末端也会标志一个命令的结束。具体哪些记号是合法的与具体命令的语法有关。 - -一个记号可以是一个 *关键词*、一个 *标识符*、一个 *带引号的标识符*、一个 *literal*(或常量)或者一个特殊字符符号。记号通常以空白(空格、制表符、新行)来分隔,但在无歧义时并不强制要求如此(唯一的例子是一个特殊字符紧挨着其他记号)。 +一个记号可以是一个 **关键词**、一个 **标识符**、一个 **带引号的标识符**、一个 **literal**(或常量)或者一个特殊字符符号。记号通常以空白(空格、制表符、新行)来分隔,但在无歧义时并不强制要求如此(唯一的例子是一个特殊字符紧挨着其他记号)。 例如,下面是一个(语法上)合法的SQL输入: @@ -899,13 +794,12 @@ INSERT INTO MY_TABLE VALUES (3, 'hi there'); 这是一个由三个命令组成的序列,每一行一个命令(尽管这不是必须地,在同一行中可以有超过一个命令,而且命令还可以被跨行分割)。 -另外,*注释* 也可以出现在SQL输入中。它们不是记号,它们和空白完全一样。 - -根据标识命令、操作符、参数的记号不同,SQL的语法不很一致。最前面的一些记号通常是命令名,因此在上面的例子中我们通常会说一个“SELECT”、一个“UPDATE”和一个“INSERT”命令。但是例如`UPDATE`命令总是要求一个`SET`记号出现在一个特定位置,而`INSERT`则要求一个`VALUES`来完成命令。每个命令的精确语法规则在 http://www.postgresql.org/docs/17/reference.html[第 VI 部分]中介绍。 +另外,**注释** 也可以出现在SQL输入中。它们不是记号,它们和空白完全一样。 -==== 标识符和关键词 +根据标识命令、操作符、参数的记号不同,SQL的语法不很一致。最前面的一些记号通常是命令名,因此在上面的例子中我们通常会说一个“SELECT”、一个“UPDATE”和一个“INSERT”命令。但是例如`UPDATE`命令总是要求一个`SET`记号出现在一个特定位置,而`INSERT`则要求一个`VALUES`来完成命令。每个命令的精确语法规则在 [第 VI 部分](http://www.postgresql.org/docs/17/reference.html)中介绍。 -上例中的`SELECT`、`UPDATE`或`VALUES`记号是 *关键词* 的例子,即SQL语言中具有特定意义的词。记号`MY_TABLE`和`A`则是 *标识符* 的例子。它们标识表、列或者其他数据库对象的名字,取决于使用它们的命令。因此它们有时也被简称为“名字”。关键词和标识符具有相同的词法结构,这意味着我们无法在没有语言知识的前提下区分一个标识符和关键词。一个关键词的完整列表可以在 http://www.postgresql.org/docs/17/sql-keywords-appendix.html[附录 C]中找到。 +#### 标识符和关键词 +上例中的`SELECT`、`UPDATE`或`VALUES`记号是 **关键词** 的例子,即SQL语言中具有特定意义的词。记号`MY_TABLE`和`A`则是 **标识符** 的例子。它们标识表、列或者其他数据库对象的名字,取决于使用它们的命令。因此它们有时也被简称为“名字”。关键词和标识符具有相同的词法结构,这意味着我们无法在没有语言知识的前提下区分一个标识符和关键词。一个关键词的完整列表可以在 [附录 C](http://www.postgresql.org/docs/17/sql-keywords-appendix.html)中找到。 SQL标识符和关键词必须以一个字母(`a`-`z`,也可以是带变音符的字母和非拉丁字母)或一个下划线( _ )开始。后续字符可以是字母、下划线(`_`)、数字(`0`-`9`)或美元符号(`$`)。注意根据SQL标准的字母规定,美元符号是不允许出现在标识符中的,因此它们的使用可能会降低应用的可移植性。SQL标准不会定义包含数字或者以下划线开头或结尾的关键词,因此这种形式的标识符不会与未来可能的标准扩展冲突。 @@ -929,7 +823,7 @@ uPDaTE my_TabLE SeT a = 5; UPDATE my_table SET a = 5; ``` -这里还有第二种形式的标识符:*受限标识符*或*被引号修饰的标识符*。它是由双引号(`"`)包围的一个任意字符序列。一个受限标识符总是一个标识符而不会是一个关键字。因此`"select"`可以用于引用一个名为“select”的列或者表,而一个没有引号修饰的`select`则会被当作一个关键词,从而在本应使用表或列名的地方引起解析错误。在上例中使用受限标识符的例子如下: +这里还有第二种形式的标识符:**受限标识符**或**被引号修饰的标识符**。它是由双引号(`"`)包围的一个任意字符序列。一个受限标识符总是一个标识符而不会是一个关键字。因此`"select"`可以用于引用一个名为“select”的列或者表,而一个没有引号修饰的`select`则会被当作一个关键词,从而在本应使用表或列名的地方引起解析错误。在上例中使用受限标识符的例子如下: ``` UPDATE "my_table" SET "a" = 5; @@ -966,12 +860,10 @@ U&"d!0061t!+000061" UESCAPE '!' 如果服务器编码不是UTF-8,则由其中一个转义序列标识的Unicode代码点转换为实际的服务器编码;如果不可能,则报告错误。 -==== 常量 - -在IvorySQL中有三种 *隐式类型常量*:字符串、位串和数字。常量也可以被指定显式类型,这可以使得它被更精确地展示以及更有效地处理。这些选择将会在后续小节中讨论。 - -===== 字符串常量 +#### 常量 +在IvorySQL中有三种 **隐式类型常量**:字符串、位串和数字。常量也可以被指定显式类型,这可以使得它被更精确地展示以及更有效地处理。这些选择将会在后续小节中讨论。 +##### 字符串常量 在SQL中,一个字符串常量是一个由单引号( `'` )包围的任意字符序列,例如`'This is a string'`。为了在一个字符串中包括一个单引号,可以写两个相连的单引号,例如`'Dianne''s horse'`。注意这和一个双引号(`"`)**不**同。 两个只由空白及**至少一个新行**分隔的字符串常量会被连接在一起,并且将作为一个写在一起的字符串常量来对待。例如: @@ -995,34 +887,32 @@ SELECT 'foo' 'bar'; 则不是合法的语法(这种有些奇怪的行为是SQL指定的,IvorySQL遵循了该标准)。 -===== C风格转义的字符串常量 - -IvorySQL也接受“转义”字符串常量,这也是SQL标准的一个扩展。一个转义字符串常量可以通过在开单引号前面写一个字母`E`(大写或小写形式)来指定,例如`E'foo'`(当一个转义字符串常量跨行时,只在第一个开引号之前写`E`)。在一个转义字符串内部,一个反斜线字符(`\`)会开始一个C风格的 *反斜线转义* 序列,在其中反斜线和后续字符的组合表示一个特殊的字节值(如 http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-BACKSLASH-TABLE[表 4.1]中所示)。 +##### C风格转义的字符串常量 +IvorySQL也接受“转义”字符串常量,这也是SQL标准的一个扩展。一个转义字符串常量可以通过在开单引号前面写一个字母`E`(大写或小写形式)来指定,例如`E'foo'`(当一个转义字符串常量跨行时,只在第一个开引号之前写`E`)。在一个转义字符串内部,一个反斜线字符(`\`)会开始一个C风格的 **反斜线转义** 序列,在其中反斜线和后续字符的组合表示一个特殊的字节值(如 [表 4.1](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-BACKSLASH-TABLE)中所示)。 **表 4.1. 反斜线转义序列** -|==== -| 反斜线转义序列 | 解释 -| `\b` | 退格 -| `\f` | 换页 -| `\n` | 换行 -| `\r` | 回车 -| `\t` | 制表符 -| `\*`o`*`, `\*`oo`*`, `\*`ooo`*` (*`o`* = 0–7) | 八进制字节值 -| `\x*`h`*`, `\x*`hh`*` (*`h`* = 0–9, A–F) | 十六进制字节值 -| `\u*`xxxx`*`, `\U*`xxxxxxxx`*` (*`x`* = 0–9, A–F) | 16 或 32-位十六进制 Unicode 字符值 -|==== +| 反斜线转义序列 | 解释 | +| --- | --- | +| `\b` | 退格 | +| `\f` | 换页 | +| `\n` | 换行 | +| `\r` | 回车 | +| `\t` | 制表符 | +| `\*`o`*`, `\*`oo`*`, `\*`ooo`*` (*`o`* = 0–7) | 八进制字节值 | +| `\x*`h`*`, `\x*`hh`*` (*`h`* = 0–9, A–F) | 十六进制字节值 | +| `\u*`xxxx`*`, `\U*`xxxxxxxx`*` (*`x`* = 0–9, A–F) | 16 或 32-位十六进制 Unicode 字符值 | + 跟随在一个反斜线后面的任何其他字符被当做其字面意思。因此,要包括一个反斜线字符,请写两个反斜线(`\\`)。在一个转义字符串中包括一个单引号除了普通方法`''`之外,还可以写成`\'`。 -你要负责保证你创建的字节序列由服务器字符集编码中合法的字符组成,特别是在使用八进制或十六进制转义时。一个有用的替代方法是使用Unicode转义或替代的Unicode转义语法,如 http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE[第 4.1.2.3 节]中所述;然后服务器将检查字符转换是否可行。 +你要负责保证你创建的字节序列由服务器字符集编码中合法的字符组成,特别是在使用八进制或十六进制转义时。一个有用的替代方法是使用Unicode转义或替代的Unicode转义语法,如 [第 4.1.2.3 节](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE)中所述;然后服务器将检查字符转换是否可行。 .小心 **** -如果配置参数 http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS[standard_conforming_strings]为`off`,那么IvorySQL对常规字符串常量和转义字符串常量中的反斜线转义都识别。不过,在IvorySQL中该参数的默认值为`on`,意味着只在转义字符串常量中识别反斜线转义。这种行为更兼容标准,但是可能打断依赖于历史行为(反斜线转义总是会被识别)的应用。作为一种变通,你可以设置该参数为`off`,但是最好迁移到符合新的行为。如果你需要使用一个反斜线转义来表示一个特殊字符,为该字符串常量写上一个`E`。在`standard_conforming_strings`之外,配置参数 http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-ESCAPE-STRING-WARNING[escape_string_warning]和 http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-BACKSLASH-QUOTE[backslash_quote]也决定了如何对待字符串常量中的反斜线。代码零的字符不能出现在一个字符串常量中。 +如果配置参数 [standard_conforming_strings](http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS)为`off`,那么IvorySQL对常规字符串常量和转义字符串常量中的反斜线转义都识别。不过,在IvorySQL中该参数的默认值为`on`,意味着只在转义字符串常量中识别反斜线转义。这种行为更兼容标准,但是可能打断依赖于历史行为(反斜线转义总是会被识别)的应用。作为一种变通,你可以设置该参数为`off`,但是最好迁移到符合新的行为。如果你需要使用一个反斜线转义来表示一个特殊字符,为该字符串常量写上一个`E`。在`standard_conforming_strings`之外,配置参数 [escape_string_warning](http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-ESCAPE-STRING-WARNING)和 [backslash_quote](http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-BACKSLASH-QUOTE)也决定了如何对待字符串常量中的反斜线。代码零的字符不能出现在一个字符串常量中。 **** -===== 带有 Unicode 转义的字符串常量 - +##### 带有 Unicode 转义的字符串常量 IvorySQL也支持另一种类型的字符串转义语法,它允许用代码点指定任意Unicode字符。一个Unicode转义字符串常量开始于`U&`(大写或小写形式的字母U,后跟花号),后面紧跟着开引号,之间没有任何空白,例如`U&'foo'`(注意这产生了与操作符`&`的混淆。在操作符周围使用空白来避免这个问题)。在引号内,Unicode字符可以通过写一个后跟4位十六进制代码点编号或者一个前面有加号的6位十六进制代码点编号的反斜线来指定。例如,字符串`'data'`可以被写为 ``` @@ -1050,10 +940,9 @@ U&'d!0061t!+000061' UESCAPE '!' 如果服务器编码不是UTF-8,则由这些转义序列之一标识的Unicode代码点将转换为实际的服务器编码;如果不可能,则会报告错误。 -此外,字符串常量的Unicode转义语法仅在配置参数 http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS[standard_conforming_strings]开启时才有效。这是因为否则这种语法可能会混淆解析SQL语句的客户端,可能导致SQL注入和类似的安全问题。如果该参数设置为off,则此语法将被拒绝并显示错误消息。 - -===== 美元引用的字符串常量 +此外,字符串常量的Unicode转义语法仅在配置参数 [standard_conforming_strings](http://www.postgresql.org/docs/17/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS)开启时才有效。这是因为否则这种语法可能会混淆解析SQL语句的客户端,可能导致SQL注入和类似的安全问题。如果该参数设置为off,则此语法将被拒绝并显示错误消息。 +##### 美元引用的字符串常量 虽然用于指定字符串常量的标准语法通常都很方便,但是当字符串中包含了很多单引号或反斜线时很难理解它,因为每一个都需要被双写。要在这种情形下允许可读性更好的查询,IvorySQL提供了另一种被称为“美元引用”的方式来书写字符串常量。一个美元引用的字符串常量由一个美元符号(`$`)、一个可选的另个或更多字符的“标签”、另一个美元符号、一个构成字符串内容的任意字符序列、一个美元符号、开始这个美元引用的相同标签和一个美元符号组成。例如,这里有两种不同的方法使用美元引用指定字符串“Dianne's horse”: ``` @@ -1081,16 +970,14 @@ $function$ 美元引用不是SQL标准的一部分,但是在书写复杂字符串文字方面,它常常是一种比兼容标准的单引号语法更方便的方法。当要表示的字符串常量位于其他常量中时它特别有用,这种情况常常在过程函数定义中出现。如果用单引号语法,上一个例子中的每个反斜线将必须被写成四个反斜线,这在解析原始字符串常量时会被缩减到两个反斜线,并且接着在函数执行期间重新解析内层字符串常量时变成一个。 -===== 位串常量 - +##### 位串常量 位串常量看起来像常规字符串常量在开引号之前(中间无空白)加了一个`B`(大写或小写形式),例如`B'1001'`。位串常量中允许的字符只有`0`和`1`。 作为一种选择,位串常量可以用十六进制记号法指定,使用一个前导`X`(大写或小写形式),例如`X'1FF'`。这种记号法等价于一个用四个二进制位取代每个十六进制位的位串常量。 两种形式的位串常量可以以常规字符串常量相同的方式跨行继续。美元引用不能被用在位串常量中。 -===== 数字常量 - +##### 数字常量 在这些一般形式中可以接受数字常量: ``` @@ -1104,14 +991,14 @@ digitse[+-]digits 这些是合法数字常量的例子: ----- +``` 42 3.5 4. .001 5e2 1.925e-3 ----- +``` 如果一个不包含小数点和指数的数字常量的值适合类型`integer`(32 位),它首先被假定为类型`integer`。否则如果它的值适合类型`bigint`(64 位),它被假定为类型`bigint`。再否则它会被取做类型`numeric`。包含小数点和/或指数的常量总是首先被假定为类型`numeric`。 @@ -1125,8 +1012,7 @@ REAL '1.23' -- string style 这些实际上只是接下来要讨论的一般造型记号的特例。 -===== 其他类型的常量 - +##### 其他类型的常量 一种**任意**类型的一个常量可以使用下列记号中的任意一种输入: ``` @@ -1145,19 +1031,18 @@ CAST ( 'string' AS type ) typename ( 'string' ) ``` -但是并非所有类型名都可以用在这种方法中,详见 http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS[第 4.2.9 节]。 +但是并非所有类型名都可以用在这种方法中,详见 [第 4.2.9 节](http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS)。 -如 http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS[第 4.2.9 节]中讨论的,`::`、`CAST()`以及函数调用语法也可以被用来指定任意表达式的运行时类型转换。要避免语法歧义,`*type 'string'*`语法只能被用来指定简单文字常量的类型。`*type 'string'*` 语法上的另一个限制是它无法对数组类型工作,指定一个数组常量的类型可使用`::`或`CAST()`。 +如 [第 4.2.9 节](http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS)中讨论的,`::`、`CAST()`以及函数调用语法也可以被用来指定任意表达式的运行时类型转换。要避免语法歧义,`*type 'string'*`语法只能被用来指定简单文字常量的类型。`*type 'string'*` 语法上的另一个限制是它无法对数组类型工作,指定一个数组常量的类型可使用`::`或`CAST()`。 `CAST()`语法符合SQL。`type 'string'`语法是该标准的一般化:SQL指定这种语法只用于一些数据类型,但是IvorySQL允许它用于所有类型。带有`::`的语法是IvorySQL的历史用法,就像函数调用语法一样。 -==== 操作符 - +#### 操作符 一个操作符名是最多`NAMEDATALEN`-1(默认为63)的一个字符序列,其中的字符来自下面的列表: ----- +``` \+ - * / < > = ~ ! @ # % ^ & | ` ? ----- +``` 不过,在操作符名上有一些限制: @@ -1165,7 +1050,7 @@ typename ( 'string' ) - 一个多字符操作符名不能以`+`或`-`结尾,除非该名称也至少包含这些字符中的一个: - + ~ ! @ # % ^ & | ` ? 例如,`@-`是一个被允许的操作符名,但`*-`不是。这些限制允许IvorySQL解析SQL兼容的查询而不需要在记号之间有空格。 @@ -1173,21 +1058,19 @@ typename ( 'string' ) 当使用非SQL标准的操作符名时,你通常需要用空格分隔相邻的操作符来避免歧义。例如,如果你定义了一个名为`@`的前缀操作符,你不能写`X*@Y`,你必须写`X* @Y`来确保IvorySQL把它读作两个操作符名而不是一个。 -==== 特殊字符 - +#### 特殊字符 一些不是数字字母的字符有一种不同于作为操作符的特殊含义。这些字符的详细用法可以在描述相应语法元素的地方找到。这一节只是为了告知它们的存在以及总结这些字符的目的。 - 跟随在一个美元符号( `$` )后面的数字被用来表示在一个函数定义或一个预备语句中的位置参数。在其他上下文中该美元符号可以作为一个标识符或者一个美元引用字符串常量的一部分。 - 圆括号( `()` )具有它们通常的含义,用来分组表达式并且强制优先。在某些情况中,圆括号被要求作为一个特定 SQL 命令的固定语法的一部分。 -- 方括号( `[]` )被用来选择一个数组中的元素。更多关于数组的信息见 http://www.postgresql.org/docs/17/arrays.html[第 8.15 节]。 +- 方括号( `[]` )被用来选择一个数组中的元素。更多关于数组的信息见 [第 8.15 节](http://www.postgresql.org/docs/17/arrays.html)。 - 逗号( `,` )被用在某些语法结构中来分割一个列表的元素。 - 分号( `;` )结束一个 SQL 命令。它不能出现在一个命令中间的任何位置,除了在一个字符串常量中或者一个被引用的标识符中。 -- 冒号( `:` )被用来从数组中选择“切片”(见 http://www.postgresql.org/docs/17/arrays.html[第 8.15 节])。在某些 SQL 的“方言”(例如嵌入式 SQL)中,冒号被用来作为变量名的前缀。 +- 冒号( `:` )被用来从数组中选择“切片”(见 [第 8.15 节](http://www.postgresql.org/docs/17/arrays.html))。在某些 SQL 的“方言”(例如嵌入式 SQL)中,冒号被用来作为变量名的前缀。 - 星号( `*` )被用在某些上下文中标记一个表的所有域或者组合值。当它被用作一个聚集函数的参数时,它还有一种特殊的含义,即该聚集不要求任何显式参数。 - 句点( `.` )被用在数字常量中,并且被用来分割模式、表和列名。 -==== 注释 - +#### 注释 一段注释是以双横杠开始并且延伸到行结尾的一个字符序列,例如: ``` @@ -1206,28 +1089,27 @@ typename ( 'string' ) 在进一步的语法分析前,注释会被从输入流中被移除并且实际被替换为空白。 -===== 操作符优先级 - -http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE[表 4.2]显示了IvorySQL中操作符的优先级和结合性。大部分操作符具有相同的优先并且是左结合的。操作符的优先级和结合性被硬写在解析器中。如果您希望以不同于优先级规则所暗示的方式解析具有多个运算符的表达式,请添加括号。 +##### 操作符优先级 +[表 4.2](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE)显示了IvorySQL中操作符的优先级和结合性。大部分操作符具有相同的优先并且是左结合的。操作符的优先级和结合性被硬写在解析器中。如果您希望以不同于优先级规则所暗示的方式解析具有多个运算符的表达式,请添加括号。 **表 4.2. 操作符优先级(从高到低)** -|==== -| 操作符/元素 | 结合性 | 描述 -| `.` | 左 | 表/列名分隔符 -| `::` | 左 | IvorySQL-风格的类型转换 -| `[` `]` | 左 | 数组元素选择 -| `+` `-` | 右 | 一元加、一元减 -| `^` | 左 | 指数 -| `*` `/` `%` | 左 | 乘、除、模 -| `+` `-` | 左 | 加、减 -| (任意其他操作符) | 左 | 所有其他本地以及用户定义的操作符 -| `BETWEEN` `IN` `LIKE` `ILIKE` `SIMILAR` | | 范围包含、集合成员关系、字符串匹配 -| `<` `>` `=` `<=` `>=` `<>` | | 比较操作符 -| `IS` `ISNULL` `NOTNULL` | | `IS TRUE`、`IS FALSE`、`IS NULL`、`IS DISTINCT FROM`等 -| `NOT` | 右 | 逻辑否定 -| `AND` | 左 | 逻辑合取 -| `OR` | 左 | 逻辑析取 -|==== +| 操作符/元素 | 结合性 | 描述 | +| --- | --- | --- | +| `.` | 左 | 表/列名分隔符 | +| `::` | 左 | IvorySQL-风格的类型转换 | +| `[` `]` | 左 | 数组元素选择 | +| `+` `-` | 右 | 一元加、一元减 | +| `^` | 左 | 指数 | +| `*` `/` `%` | 左 | 乘、除、模 | +| `+` `-` | 左 | 加、减 | +| (任意其他操作符) | 左 | 所有其他本地以及用户定义的操作符 | +| `BETWEEN` `IN` `LIKE` `ILIKE` `SIMILAR` | | 范围包含、集合成员关系、字符串匹配 | +| `<` `>` `=` `<=` `>=` `<>` | | 比较操作符 | +| `IS` `ISNULL` `NOTNULL` | | `IS TRUE`、`IS FALSE`、`IS NULL`、`IS DISTINCT FROM`等 | +| `NOT` | 右 | 逻辑否定 | +| `AND` | 左 | 逻辑合取 | +| `OR` | 左 | 逻辑析取 | + 注意该操作符有限规则也适用于与上述内建操作符具有相同名称的用户定义的操作符。例如,如果你为某种自定义数据类型定义了一个“+”操作符,它将具有和内建的“+”操作符相同的优先级,不管你的操作符要做什么。 @@ -1237,16 +1119,15 @@ http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE[ SELECT 3 OPERATOR(pg_catalog.+) 4; ``` -`OPERATOR`结构被用来为“任意其他操作符”获得 http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE[表 4.2]中默认的优先级。不管出现在`OPERATOR()`中的是哪个指定操作符,这都是真的。 +`OPERATOR`结构被用来为“任意其他操作符”获得 [表 4.2](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE)中默认的优先级。不管出现在`OPERATOR()`中的是哪个指定操作符,这都是真的。 .注意 **** 版本9.5之前的PostgreSQL使用的操作符优先级规则略有不同。特别是,`<=`、`>=` 和 `<>`习惯于被当作普通操作符,`IS`测试习惯于具有较高的优先级。并且在一些认为`NOT`比`BETWEEN`优先级高的情况下,`NOT BETWEEN`和相关的结构的行为不一致。为了更好地兼容SQL标准并且减少对 逻辑上等价的结构不一致的处理,这些规则也得到了修改。在大部分情况下,这些变化不会导致行为上的变化,或者可能会产生“no such operator”错误,但可以通过增加圆括号解决。不过在一些极端情况中,查询可能在没有被报告解析错误的情况下发生行为的改变。 **** -=== 值表达式 - -值表达式被用于各种各样的环境中,例如在`SELECT`命令的目标列表中、作为`INSERT`或`UPDATE`中的新列值或者若干命令中的搜索条件。为了区别于一个表表达式(是一个表)的结果,一个值表达式的结果有时候被称为一个 *标量*。值表达式因此也被称为 *标量表达式*(或者甚至简称为 *表达式*)。表达式语法允许使用算数、逻辑、集合和其他操作从原始部分计算值。 +### 值表达式 +值表达式被用于各种各样的环境中,例如在`SELECT`命令的目标列表中、作为`INSERT`或`UPDATE`中的新列值或者若干命令中的搜索条件。为了区别于一个表表达式(是一个表)的结果,一个值表达式的结果有时候被称为一个 **标量**。值表达式因此也被称为 **标量表达式**(或者甚至简称为 **表达式**)。表达式语法允许使用算数、逻辑、集合和其他操作从原始部分计算值。 一个值表达式是下列之一: @@ -1266,12 +1147,11 @@ SELECT 3 OPERATOR(pg_catalog.+) 4; - 一个行构造器 - 另一个在圆括号(用来分组子表达式以及重载优先级)中的值表达式 -在这个列表之外,还有一些结构可以被分类为一个表达式,但是它们不遵循任何一般语法规则。这些通常具有一个函数或操作符的语义并且在 http://www.postgresql.org/docs/17/functions.html[第 9 章]中的合适位置解释。一个例子是`IS NULL`子句。 - -我们已经在 http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS[第 4.1.2 节]中讨论过常量。下面的小节会讨论剩下的选项。 +在这个列表之外,还有一些结构可以被分类为一个表达式,但是它们不遵循任何一般语法规则。这些通常具有一个函数或操作符的语义并且在 [第 9 章](http://www.postgresql.org/docs/17/functions.html)中的合适位置解释。一个例子是`IS NULL`子句。 -==== 列引用 +我们已经在 [第 4.1.2 节](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS)中讨论过常量。下面的小节会讨论剩下的选项。 +#### 列引用 一个列可以以下面的形式被引用: ``` @@ -1279,10 +1159,9 @@ correlation.columnname ``` -*`correlation`* 是一个表(有可能以一个模式名限定)的名字,或者是在`FROM`子句中为一个表定义的别名。如果列名在当前索引所使用的表中都是唯一的,关联名称和分隔用的句点可以被忽略(另见 http://www.postgresql.org/docs/17/queries.html[第 7 章])。 - -==== 位置参数 +*`correlation`* 是一个表(有可能以一个模式名限定)的名字,或者是在`FROM`子句中为一个表定义的别名。如果列名在当前索引所使用的表中都是唯一的,关联名称和分隔用的句点可以被忽略(另见 [第 7 章](http://www.postgresql.org/docs/17/queries.html))。 +#### 位置参数 一个位置参数引用被用来指示一个由SQL语句外部提供的值。参数被用于SQL函数定义和预备查询中。某些客户端库还支持独立于SQL命令字符串来指定数据值,在这种情况中参数被用来引用那些线外数据值。一个参数引用的形式是: ``` @@ -1300,8 +1179,7 @@ CREATE FUNCTION dept(text) RETURNS dept 这里 `$1` 引用函数被调用时第一个函数参数的值。 -==== 下标 - +#### 下标 如果一个表达式得到了一个数组类型的值,那么可以抽取出该数组值的一个特定元素: ``` @@ -1325,10 +1203,9 @@ $1[10:42] (arrayfunction(a,b))[42] ``` -最后一个例子中的圆括号是必需的。详见 http://www.postgresql.org/docs/17/arrays.html[第 8.15 节]。 - -==== 域选择 +最后一个例子中的圆括号是必需的。详见 [第 8.15 节](http://www.postgresql.org/docs/17/arrays.html)。 +#### 域选择 如果一个表达式得到一个组合类型(行类型)的值,那么可以抽取该行的指定域: ``` @@ -1336,7 +1213,6 @@ expression.fieldname ``` - 通常行 *`表达式`* 必须被加上括号,但是当该表达式是仅从一个表引用或位置参数选择时,圆括号可以被忽略。例如: ``` @@ -1360,26 +1236,24 @@ $1.somecolumn (compositecol).* ``` -这种记法的行为根据上下文会有不同,详见 http://www.postgresql.org/docs/17/rowtypes.html#ROWTYPES-USAGE[第 8.16.5 节]。 - -==== 操作符调用 +这种记法的行为根据上下文会有不同,详见 [第 8.16.5 节](http://www.postgresql.org/docs/17/rowtypes.html#ROWTYPES-USAGE)。 +#### 操作符调用 对于一次操作符调用,有两种可能的语法: -|==== -| *`expression`* *`operator`* *`expression`*(二元中缀操作符) -| *`operator`* *`expression`*(一元前缀操作符) -|==== +| *`expression`** **`operator`** **`expression`*(二元中缀操作符) | +| --- | +| *`operator`** **`expression`*(一元前缀操作符) | + -其中 *`operator`* 记号遵循 http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-OPERATORS[第 4.1.3 节] 的语法规则,或者是关键词`AND`、`OR`和`NOT`之一,或者是一个如下形式的受限定操作符名: +其中 *`operator`* 记号遵循 [第 4.1.3 节](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-OPERATORS) 的语法规则,或者是关键词`AND`、`OR`和`NOT`之一,或者是一个如下形式的受限定操作符名: ``` OPERATOR(schema.operatorname) ``` -哪个特定操作符存在以及它们是一元的还是二元的取决于由系统或用户定义的那些操作符。 http://www.postgresql.org/docs/17/functions.html[第 9 章] 描述了内建操作符。 - -==== 函数调用 +哪个特定操作符存在以及它们是一元的还是二元的取决于由系统或用户定义的那些操作符。 [第 9 章](http://www.postgresql.org/docs/17/functions.html) 描述了内建操作符。 +#### 函数调用 一个函数调用的语法是一个函数的名称(可能受限于一个模式名)后面跟上封闭于圆括号中的参数列表: ``` @@ -1394,11 +1268,11 @@ sqrt(2) ``` -当在一个某些用户不信任其他用户的数据库中发出查询时,在编写函数调用时应遵守 http://www.postgresql.org/docs/17/typeconv-func.html[第 10.3 节] 中的安全防范措施。 +当在一个某些用户不信任其他用户的数据库中发出查询时,在编写函数调用时应遵守 [第 10.3 节](http://www.postgresql.org/docs/17/typeconv-func.html) 中的安全防范措施。 -内建函数的列表在 http://www.postgresql.org/docs/17/functions.html[第 9 章] 中。其他函数可以由用户增加。 +内建函数的列表在 [第 9 章](http://www.postgresql.org/docs/17/functions.html) 中。其他函数可以由用户增加。 -参数可以有选择地被附加名称。详见 http://www.postgresql.org/docs/17/sql-syntax-calling-funcs.html[第 4.3 节]。 +参数可以有选择地被附加名称。详见 [第 4.3 节](http://www.postgresql.org/docs/17/sql-syntax-calling-funcs.html)。 .注意 **** @@ -1406,9 +1280,8 @@ sqrt(2) **** -==== 聚集表达式 - -一个 *聚集表达式* 表示在由一个查询选择的行上应用一个聚集函数。一个聚集函数将多个输入减少到一个单一输出值,例如对输入的求和或平均。一个聚集表达式的语法是下列之一: +#### 聚集表达式 +一个 **聚集表达式** 表示在由一个查询选择的行上应用一个聚集函数。一个聚集函数将多个输入减少到一个单一输出值,例如对输入的求和或平均。一个聚集表达式的语法是下列之一: ``` aggregate_name (expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ] @@ -1418,15 +1291,15 @@ aggregate_name ( * ) [ FILTER ( WHERE filter_clause ) ] aggregate_name ( [ expression [ , ... ] ] ) WITHIN GROUP ( order_by_clause ) [ FILTER ( WHERE filter_clause ) ] ``` -这里 *`aggregate_name`* 是一个之前定义的聚集(可能带有一个模式名限定),并且 *`expression`* 是任意自身不包含聚集表达式的值表达式或一个窗口函数调用。可选的 *`order_by_clause`* 和 *`filter_clause`* 描述如下。 +这里 *`aggregate_name`** 是一个之前定义的聚集(可能带有一个模式名限定),并且 **`expression`** 是任意自身不包含聚集表达式的值表达式或一个窗口函数调用。可选的 **`order_by_clause`** 和 **`filter_clause`* 描述如下。 -第一种形式的聚集表达式为每一个输入行调用一次聚集。第二种形式和第一种相同,因为 `ALL` 是默认选项。第三种形式为输入行中表达式的每一个可区分值(或者对于多个表达式是值的可区分集合)调用一次聚集。第四种形式为每一个输入行调用一次聚集,因为没有特定的输入值被指定,它通常只对于 `count(*)` 聚集函数有用。最后一种形式被用于 *有序集* 聚集函数,其描述如下。 +第一种形式的聚集表达式为每一个输入行调用一次聚集。第二种形式和第一种相同,因为 `ALL` 是默认选项。第三种形式为输入行中表达式的每一个可区分值(或者对于多个表达式是值的可区分集合)调用一次聚集。第四种形式为每一个输入行调用一次聚集,因为没有特定的输入值被指定,它通常只对于 `count(*)` 聚集函数有用。最后一种形式被用于 **有序集** 聚集函数,其描述如下。 大部分聚集函数忽略空输入,这样其中一个或多个表达式得到空值的行将被丢弃。除非另有说明,对于所有内建聚集都是这样。 例如,`count(*)` 得到输入行的总数。 `count(f1)` 得到输入行中 `f1` 为非空的数量,因为 `count` 忽略空值。而 `count(distinct f1)` 得到 `f1` 的非空可区分值的数量。 -一般地,交给聚集函数的输入行是未排序的。在很多情况中这没有关系,例如不管接收到什么样的输入, `min` 总是产生相同的结果。但是,某些聚集函数(例如 `array_agg` 和 `string_agg` )依据输入行的排序产生结果。当使用这类聚集时,可选的 *`order_by_clause`* 可以被用来指定想要的顺序。*`order_by_clause`* 与查询级别的 `ORDER BY` 子句(如 http://www.postgresql.org/docs/17/queries-order.html[第 7.5 节] 所述)具有相同的语法,除非它的表达式总是仅有表达式并且不能是输出列名称或编号。例如: +一般地,交给聚集函数的输入行是未排序的。在很多情况中这没有关系,例如不管接收到什么样的输入, `min` 总是产生相同的结果。但是,某些聚集函数(例如 `array_agg` 和 `string_agg` )依据输入行的排序产生结果。当使用这类聚集时,可选的 *`order_by_clause`** 可以被用来指定想要的顺序。**`order_by_clause`* 与查询级别的 `ORDER BY` 子句(如 [第 7.5 节](http://www.postgresql.org/docs/17/queries-order.html) 所述)具有相同的语法,除非它的表达式总是仅有表达式并且不能是输出列名称或编号。例如: ``` SELECT array_agg(a ORDER BY b DESC) FROM table; @@ -1451,7 +1324,7 @@ SELECT string_agg(a ORDER BY a, ',') FROM table; -- 不正确 .注意 **** -在一个聚集函数中指定 `DISTINCT` 以及 `ORDER BY` 的能力是一种IvorySQL扩展。按照到目前为止的描述,如果一般目的和统计性聚集中 排序是可选的,在要为它排序输入行时可以在该聚集的常规参数 列表中放置 `ORDER BY` 。有一个聚集函数的子集叫做 *有序集聚集* ,它**要求**一个 *`order_by_clause`*,通常是因为该聚集的计算只对其输入行的特定顺序有意义。有序集聚集的典 型例子包括排名和百分位计算。按照上文的最后一种语法,对于 一个有序集聚集, *`order_by_clause`* 被写在 `WITHIN GROUP (...)` 中。 *`order_by_clause`* 中的表达式 会像普通聚集参数一样对每一个输入行计算一次,按照每个 *`order_by_clause`* 的要求排序并 且交给该聚集函数作为输入参数(这和非 `WITHIN GROUP` *`order_by_clause`* 的情况不同,在其中表达 式的结果不会被作为聚集函数的参数)。如果有在 `WITHIN GROUP` 之前的参数表达式,会把它们称 为 *直接参数* 以便与列在 *`order_by_clause`* 中的 *聚集参数* 相区分。与普通聚集参数不同,针对 每次聚集调用只会计算一次直接参数,而不是为每一个输入行 计算一次。这意味着只有那些变量被 `GROUP BY` 分组时,它们才能包含这些变量。这个限制同样适用于根本不在 一个聚集表达式内部的直接参数。直接参数通常被用于百分数 之类的东西,它们只有作为每次聚集计算用一次的单一值才有意 义。直接参数列表可以为空,在这种情况下,写成 `()` 而不是 `(*)`(实际上 IvorySQL接受两种拼写,但是只有第一种符合 SQL 标准)。 +在一个聚集函数中指定 `DISTINCT` 以及 `ORDER BY` 的能力是一种IvorySQL扩展。按照到目前为止的描述,如果一般目的和统计性聚集中 排序是可选的,在要为它排序输入行时可以在该聚集的常规参数 列表中放置 `ORDER BY` 。有一个聚集函数的子集叫做 **有序集聚集** ,它**要求**一个 *`order_by_clause`**,通常是因为该聚集的计算只对其输入行的特定顺序有意义。有序集聚集的典 型例子包括排名和百分位计算。按照上文的最后一种语法,对于 一个有序集聚集, **`order_by_clause`* 被写在 `WITHIN GROUP (...)` 中。 *`order_by_clause`** 中的表达式 会像普通聚集参数一样对每一个输入行计算一次,按照每个 **`order_by_clause`* 的要求排序并 且交给该聚集函数作为输入参数(这和非 `WITHIN GROUP` *`order_by_clause`* 的情况不同,在其中表达 式的结果不会被作为聚集函数的参数)。如果有在 `WITHIN GROUP` 之前的参数表达式,会把它们称 为 **直接参数** 以便与列在 *`order_by_clause`** 中的 **聚集参数* 相区分。与普通聚集参数不同,针对 每次聚集调用只会计算一次直接参数,而不是为每一个输入行 计算一次。这意味着只有那些变量被 `GROUP BY` 分组时,它们才能包含这些变量。这个限制同样适用于根本不在 一个聚集表达式内部的直接参数。直接参数通常被用于百分数 之类的东西,它们只有作为每次聚集计算用一次的单一值才有意 义。直接参数列表可以为空,在这种情况下,写成 `()` 而不是 `(*)`(实际上 IvorySQL接受两种拼写,但是只有第一种符合 SQL 标准)。 **** 有序集聚集的调用例子: @@ -1478,15 +1351,14 @@ FROM generate_series(1,10) AS s(i); (1 row) ``` -预定义的聚集函数在 http://www.postgresql.org/docs/17/functions-aggregate.html[第 9.21 节] 中描述。其他聚集函数可以由用户增加。 +预定义的聚集函数在 [第 9.21 节](http://www.postgresql.org/docs/17/functions-aggregate.html) 中描述。其他聚集函数可以由用户增加。 一个聚集表达式只能出现在 `SELECT` 命令的结果列表或是 `HAVING` 子句中。在其他子句(如 `WHERE` )中禁止使用它,因为那些子句的计算在逻辑上是在聚集的结果被形成之前。 -当一个聚集表达式出现在一个子查询中(见 http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-SCALAR-SUBQUERIES[第 4.2.11 节] 和 http://www.postgresql.org/docs/17/functions-subquery.html[第 9.23 节]),聚集通常在该子查询的行上被计算。但是如果该聚集的参数(以及 *`filter_clause`*,如果有)只包含外层变量则会产生一个异常:该聚集则属于最近的那个外层,并且会在那个查询的行上被计算。该聚集表达式从整体上则是对其所出现于的子查询的一种外层引用,并且在那个子查询的任意一次计算中都作为一个常量。只出现在结果列表或 `HAVING` 子句的限制适用于该聚集所属的查询层次。 - -==== 窗口函数调用 +当一个聚集表达式出现在一个子查询中(见 [第 4.2.11 节](http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-SCALAR-SUBQUERIES) 和 [第 9.23 节](http://www.postgresql.org/docs/17/functions-subquery.html)),聚集通常在该子查询的行上被计算。但是如果该聚集的参数(以及 *`filter_clause`*,如果有)只包含外层变量则会产生一个异常:该聚集则属于最近的那个外层,并且会在那个查询的行上被计算。该聚集表达式从整体上则是对其所出现于的子查询的一种外层引用,并且在那个子查询的任意一次计算中都作为一个常量。只出现在结果列表或 `HAVING` 子句的限制适用于该聚集所属的查询层次。 -一个*窗口函数调用*表示在一个查询选择的行的某个部分上应用一个聚集类的函数。和非窗口聚集函数调用不同,这不会被约束为将被选择的行分组为一个单一的输出行 — 在查询输出中每一个行仍保持独立。不过,窗口函数能够根据窗口函数调用的分组声明( `PARTITION BY` 列表)访问属于当前行所在分组中的所有行。一个窗口函数调用的语法是下列之一: +#### 窗口函数调用 +一个**窗口函数调用**表示在一个查询选择的行的某个部分上应用一个聚集类的函数。和非窗口聚集函数调用不同,这不会被约束为将被选择的行分组为一个单一的输出行 — 在查询输出中每一个行仍保持独立。不过,窗口函数能够根据窗口函数调用的分组声明( `PARTITION BY` 列表)访问属于当前行所在分组中的所有行。一个窗口函数调用的语法是下列之一: ``` function_name ([expression [, expression ... ]]) [ FILTER ( WHERE filter_clause ) ] OVER window_name @@ -1511,7 +1383,7 @@ function_name ( * ) [ FILTER ( WHERE filter_clause ) ] OVER ( window_definition { RANGE | ROWS | GROUPS } BETWEEN frame_start AND frame_end [ frame_exclusion ] ``` -其中 *`frame_start`* 和 *`frame_end`* 可以是下面形式中的一种 +其中 *`frame_start`** 和 **`frame_end`* 可以是下面形式中的一种 ``` UNBOUNDED PRECEDING @@ -1531,24 +1403,23 @@ EXCLUDE NO OTHERS ``` - 这里,*`expression`* 表示任何自身不含有窗口函数调用的值表达式。 -*`window_name`* 是对定义在查询的 `WINDOW` 子句中的一个命名窗口声明的引用。还可以使用在 `WINDOW` 子句中定义命名窗口的相同语法在圆括号内给定一个完整的 *`window_definition`*,详见 http://www.postgresql.org/docs/17/sql-select.html[SELECT] 参考页。值得指出的是,`OVER wname` 并不严格地等价于 `OVER (wname ...)`,后者表示复制并修改窗口定义,并且在被引用窗口声明包括一个帧子句时会被拒绝。 +*`window_name`* 是对定义在查询的 `WINDOW` 子句中的一个命名窗口声明的引用。还可以使用在 `WINDOW` 子句中定义命名窗口的相同语法在圆括号内给定一个完整的 *`window_definition`*,详见 [SELECT](http://www.postgresql.org/docs/17/sql-select.html) 参考页。值得指出的是,`OVER wname` 并不严格地等价于 `OVER (wname ...)`,后者表示复制并修改窗口定义,并且在被引用窗口声明包括一个帧子句时会被拒绝。 -`PARTITION BY` 选项将查询的行分组成为 *分区*,窗口函数会独立地处理它们。`PARTITION BY` 工作起来类似于一个查询级别的 `GROUP BY` 子句,不过它的表达式总是只是表达式并且不能是输出列的名称或编号。如果没有 `PARTITION BY`,该查询产生的所有行被当作一个单一分区来处理。`ORDER BY` 选项决定被窗口函数处理的一个分区中的行的顺序。它工作起来类似于一个查询级别的 `ORDER BY` 子句,但是同样不能使用输出列的名称或编号。如果没有 `ORDER BY`,行将被以未指定的顺序被处理。 +`PARTITION BY` 选项将查询的行分组成为 **分区**,窗口函数会独立地处理它们。`PARTITION BY` 工作起来类似于一个查询级别的 `GROUP BY` 子句,不过它的表达式总是只是表达式并且不能是输出列的名称或编号。如果没有 `PARTITION BY`,该查询产生的所有行被当作一个单一分区来处理。`ORDER BY` 选项决定被窗口函数处理的一个分区中的行的顺序。它工作起来类似于一个查询级别的 `ORDER BY` 子句,但是同样不能使用输出列的名称或编号。如果没有 `ORDER BY`,行将被以未指定的顺序被处理。 -*`frame_clause`* 指定构成 *窗口帧* 的行集合,它是当前分区的一个子集,窗口函数将作用在该帧而不是整个分区。帧中的行集合会随着哪一行是当前行而变化。在 `RANGE`、`ROWS` 或者 `GROUPS` 模式中可以指定帧,在每一种情况下,帧的范围都是从 *`frame_start`* 到 *`frame_end`*。如果 *`frame_end`* 被省略,则末尾默认为 `CURRENT ROW`。 +*`frame_clause`** 指定构成 **窗口帧* 的行集合,它是当前分区的一个子集,窗口函数将作用在该帧而不是整个分区。帧中的行集合会随着哪一行是当前行而变化。在 `RANGE`、`ROWS` 或者 `GROUPS` 模式中可以指定帧,在每一种情况下,帧的范围都是从 *`frame_start`** 到 **`frame_end`**。如果 **`frame_end`* 被省略,则末尾默认为 `CURRENT ROW`。 `UNBOUNDED PRECEDING` 的一个 *`frame_start`* 表示该帧开始于分区的第一行,类似地 `UNBOUNDED FOLLOWING` 的一个 *`frame_end`* 表示该帧结束于分区的最后一行。 -在 `RANGE` 或 `GROUPS` 模式中,`CURRENT ROW` 的一个 *`frame_start`* 表示帧开始于当前行的第一个 *平级* 行(被窗口的 `ORDER BY` 子句排序为与当前行等效的行),而 `CURRENT ROW` 的一个 *`frame_end`* 表示帧结束于当前行的最后一个平级行。在 `ROWS` 模式中,`CURRENT ROW` 就表示当前行。 +在 `RANGE` 或 `GROUPS` 模式中,`CURRENT ROW` 的一个 *`frame_start`** 表示帧开始于当前行的第一个 **平级* 行(被窗口的 `ORDER BY` 子句排序为与当前行等效的行),而 `CURRENT ROW` 的一个 *`frame_end`* 表示帧结束于当前行的最后一个平级行。在 `ROWS` 模式中,`CURRENT ROW` 就表示当前行。 -在 *`offset`* `PRECEDING` 以及 *`offset`* `FOLLOWING` 帧选项中,*`offset`* 必须是一个不包含任何变量、聚集函数或者窗口函数的表达式。*`offset`* 的含义取决于帧模式: +在 *`offset`* `PRECEDING` 以及 *`offset`* `FOLLOWING` 帧选项中,*`offset`** 必须是一个不包含任何变量、聚集函数或者窗口函数的表达式。**`offset`* 的含义取决于帧模式: - 在 `ROWS` 模式中, *`offset`* 必须得到一个非空、非负的整数,并且该选项表示帧开始于当前行之前或者之后指定数量的行。 -- 在 `GROUPS` 模式中,*`offset`* 也必须得到一个非空、非负的整数,并且该选项表示帧开始于当前行的平级组之前或者之后指定数量的*平级组*,这里平级组是在 `ORDER BY` 顺序中等效的行集合(要使用 `GROUPS` 模式,在窗口定义中就必须有一个 `ORDER BY` 子句)。 -- 在 `RANGE` 模式中,这些选项要求 `ORDER BY` 子句正好指定一列。*`offset`* 指定当前行中那一列的值与它在该帧中前面或后面的行中的列值的最大差值。*`offset`* 表达式的数据类型会随着排序列的数据类型而变化。对于数字的排序列,它通常是与排序列相同的类型,但对于日期时间排序列它是一个 `interval`。例如,如果排序列是类型 `date` 或者 `timestamp`,我们可以写 `RANGE BETWEEN '1 day' PRECEDING AND '10 days' FOLLOWING`。*`offset`* 仍然要求是非空且非负,不过“非负”的含义取决于它的数据类型。 +- 在 `GROUPS` 模式中,*`offset`** 也必须得到一个非空、非负的整数,并且该选项表示帧开始于当前行的平级组之前或者之后指定数量的**平级组*,这里平级组是在 `ORDER BY` 顺序中等效的行集合(要使用 `GROUPS` 模式,在窗口定义中就必须有一个 `ORDER BY` 子句)。 +- 在 `RANGE` 模式中,这些选项要求 `ORDER BY` 子句正好指定一列。*`offset`** 指定当前行中那一列的值与它在该帧中前面或后面的行中的列值的最大差值。**`offset`* 表达式的数据类型会随着排序列的数据类型而变化。对于数字的排序列,它通常是与排序列相同的类型,但对于日期时间排序列它是一个 `interval`。例如,如果排序列是类型 `date` 或者 `timestamp`,我们可以写 `RANGE BETWEEN '1 day' PRECEDING AND '10 days' FOLLOWING`。*`offset`* 仍然要求是非空且非负,不过“非负”的含义取决于它的数据类型。 在任何一种情况下,到帧末尾的距离都受限于到分区末尾的距离,因此对于离分区末尾比较近的行来说,帧可能会包含比较少的行。 @@ -1558,20 +1429,19 @@ EXCLUDE NO OTHERS 默认的帧选项是 `RANGE UNBOUNDED PRECEDING`,它和 `RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW` 相同。如果使用 `ORDER BY`,这会把该帧设置为从分区开始一直到当前行的最后一个 `ORDER BY` 平级行的所有行。如果不使用 `ORDER BY`,就意味着分区中所有的行都被包括在窗口帧中,因为所有行都成为了当前行的平级行。 -限制是 *`frame_start`* 不能是 `UNBOUNDED FOLLOWING` 、*`frame_end`* 不能是 `UNBOUNDED PRECEDING`,并且在上述 *`frame_start`* 和 *`frame_end`* 选项的列表中 *`frame_end`* 选择不能早于 *`frame_start`* 选择出现 — 例如不允许 `RANGE BETWEEN CURRENT ROW AND *offset* PRECEDING`,但允许 `ROWS BETWEEN 7 PRECEDING AND 8 PRECEDING` ,虽然它不会选择任何行。 +限制是 *`frame_start`* 不能是 `UNBOUNDED FOLLOWING` 、*`frame_end`* 不能是 `UNBOUNDED PRECEDING`,并且在上述 *`frame_start`** 和 **`frame_end`** 选项的列表中 **`frame_end`** 选择不能早于 **`frame_start`* 选择出现 — 例如不允许 `RANGE BETWEEN CURRENT ROW AND *offset* PRECEDING`,但允许 `ROWS BETWEEN 7 PRECEDING AND 8 PRECEDING` ,虽然它不会选择任何行。 如果指定了 `FILTER` ,那么只有对 *`filter_clause`* 计算为真的输入行会被交给该窗口函数,其他行会被丢弃。只有是聚集的窗口函数才接受 `FILTER` 。 -内建的窗口函数在 http://www.postgresql.org/docs/17/functions-window.html#FUNCTIONS-WINDOW-TABLE[表 9.60] 中介绍。用户可以加入其他窗口函数。此外,任何内建的或者用户定义的通用聚集或者统计性聚集都可以被用作窗口函数(有序集和假想集聚集当前不能被用作窗口函数)。 +内建的窗口函数在 [表 9.60](http://www.postgresql.org/docs/17/functions-window.html#FUNCTIONS-WINDOW-TABLE) 中介绍。用户可以加入其他窗口函数。此外,任何内建的或者用户定义的通用聚集或者统计性聚集都可以被用作窗口函数(有序集和假想集聚集当前不能被用作窗口函数)。 使用 `\*` 的语法被用来把参数较少的聚集函数当作窗口函数调用,例如 `count(*) OVER (PARTITION BY x ORDER BY y)`。星号(`*`)通常不被用于窗口相关的函数。窗口相关的函数不允许在函数参数列表中用 `DISTINCT` 或 `ORDER BY`。 只有在 `SELECT` 列表和查询的 `ORDER BY` 子句中才允许窗口函数调用。 -更多关于窗口函数的信息可以在 http://www.postgresql.org/docs/17/tutorial-window.html[第 3.5 节]、 http://www.postgresql.org/docs/17/functions-window.html[第 9.22 节] 以及 http://www.postgresql.org/docs/17/queries-table-expressions.html#QUERIES-WINDOW[第 7.2.5 节] 中找到。 - -==== 类型转换 +更多关于窗口函数的信息可以在 [第 3.5 节](http://www.postgresql.org/docs/17/tutorial-window.html)、 [第 9.22 节](http://www.postgresql.org/docs/17/functions-window.html) 以及 [第 7.2.5 节](http://www.postgresql.org/docs/17/queries-table-expressions.html#QUERIES-WINDOW) 中找到。 +#### 类型转换 一个类型造型指定从一种数据类型到另一种数据类型的转换。IvorySQL接受两种等价的类型造型语法: ``` @@ -1581,7 +1451,7 @@ expression::type `CAST` 语法遵从 SQL,而用 `::` 的语法是IvorySQL的历史用法。 -当一个造型被应用到一种未知类型的值表达式上时,它表示一种运行时类型转换。只有已经定义了一种合适的类型转换操作时,该造型才会成功。注意这和常量的造型(如 http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-GENERIC[第 4.1.2.7 节] 中所示)使用不同。应用于一个未修饰串文字的造型表示一种类型到一个文字常量值的初始赋值,并且因此它将对任意类型都成功(如果该串文字的内容对于该数据类型的输入语法是可接受的)。 +当一个造型被应用到一种未知类型的值表达式上时,它表示一种运行时类型转换。只有已经定义了一种合适的类型转换操作时,该造型才会成功。注意这和常量的造型(如 [第 4.1.2.7 节](http://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-GENERIC) 中所示)使用不同。应用于一个未修饰串文字的造型表示一种类型到一个文字常量值的初始赋值,并且因此它将对任意类型都成功(如果该串文字的内容对于该数据类型的输入语法是可接受的)。 如果一个值表达式必须产生的类型没有歧义(例如当它被指派给一个表列),通常可以省略显式类型造型,在这种情况下系统会自动应用一个类型造型。但是,只有对在系统目录中被标记为“OK to apply implicitly”的造型才会执行自动造型。其他造型必须使用显式造型语法调用。这种限制是为了防止出人意料的转换被无声无息地应用。 @@ -1595,11 +1465,10 @@ typename ( expression ) .注意 **** -函数风格的语法事实上只是一次函数调用。当两种标准造型语法之一被用来做一次运行时转换时,它将在内部调用一个已注册的函数来执行该转换。简而言之,这些转换函数具有和它们的输出类型相同的名字,并且因此“函数风格的语法”无非是对底层转换函数的一次直接调用。显然,一个可移植的应用不应当依赖于它。详见 http://www.postgresql.org/docs/17/sql-createcast.html[CREATE CAST]。 +函数风格的语法事实上只是一次函数调用。当两种标准造型语法之一被用来做一次运行时转换时,它将在内部调用一个已注册的函数来执行该转换。简而言之,这些转换函数具有和它们的输出类型相同的名字,并且因此“函数风格的语法”无非是对底层转换函数的一次直接调用。显然,一个可移植的应用不应当依赖于它。详见 [CREATE CAST](http://www.postgresql.org/docs/17/sql-createcast.html)。 **** -==== 排序规则表达式 - +#### 排序规则表达式 `COLLATE` 子句会重载一个表达式的排序规则。它被追加到它适用的表达式: ``` @@ -1622,7 +1491,7 @@ SELECT a, b, c FROM tbl WHERE ... ORDER BY a COLLATE "C"; SELECT * FROM tbl WHERE a > 'foo' COLLATE "C"; ``` -注意在后一种情况中,`COLLATE` 子句被附加到我们希望影响的操作符的一个输入参数上。`COLLATE` 子句被附加到该操作符或函数调用的哪个参数上无关紧要,因为被操作符或函数应用的排序规则是考虑所有参数得来的,并且一个显式的 `COLLATE` 子句将重载所有其他参数的排序规则(不过,附加非匹配 `COLLATE` 子句到多于一个参数是一种错误。详见 http://www.postgresql.org/docs/17/collation.html[第 24.2 节])。因此,这会给出和前一个例子相同的结果: +注意在后一种情况中,`COLLATE` 子句被附加到我们希望影响的操作符的一个输入参数上。`COLLATE` 子句被附加到该操作符或函数调用的哪个参数上无关紧要,因为被操作符或函数应用的排序规则是考虑所有参数得来的,并且一个显式的 `COLLATE` 子句将重载所有其他参数的排序规则(不过,附加非匹配 `COLLATE` 子句到多于一个参数是一种错误。详见 [第 24.2 节](http://www.postgresql.org/docs/17/collation.html))。因此,这会给出和前一个例子相同的结果: ``` SELECT * FROM tbl WHERE a COLLATE "C" > 'foo'; @@ -1636,9 +1505,8 @@ SELECT * FROM tbl WHERE (a > 'foo') COLLATE "C"; 因为它尝试把一个排序规则应用到 `>` 操作符的结果,而它的数据类型是非可排序数据类型 `boolean`。 -==== 标量子查询 - -一个标量子查询是一种圆括号内的普通 `SELECT` 查询,它刚好返回一行一列(关于书写查询可见 http://www.postgresql.org/docs/17/queries.html[第 7 章])。`SELECT`查询被执行并且该单一返回值被使用在周围的值表达式中。将一个返回超过一行或一列的查询作为一个标量子查询使用是一种错误(但是如果在一次特定执行期间该子查询没有返回行则不是错误,该标量结果被当作为空)。该子查询可以从周围的查询中引用变量,这些变量在该子查询的任何一次计算中都将作为常量。对于其他涉及子查询的表达式还可见 http://www.postgresql.org/docs/17/functions-subquery.html[第 9.23 节]。 +#### 标量子查询 +一个标量子查询是一种圆括号内的普通 `SELECT` 查询,它刚好返回一行一列(关于书写查询可见 [第 7 章](http://www.postgresql.org/docs/17/queries.html))。`SELECT`查询被执行并且该单一返回值被使用在周围的值表达式中。将一个返回超过一行或一列的查询作为一个标量子查询使用是一种错误(但是如果在一次特定执行期间该子查询没有返回行则不是错误,该标量结果被当作为空)。该子查询可以从周围的查询中引用变量,这些变量在该子查询的任何一次计算中都将作为常量。对于其他涉及子查询的表达式还可见 [第 9.23 节](http://www.postgresql.org/docs/17/functions-subquery.html)。 例如,下列语句会寻找每个州中最大的城市人口: @@ -1647,8 +1515,7 @@ SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name) FROM states; ``` -==== 数组构造器 - +#### 数组构造器 一个数组构造器是一个能构建一个数组值并且将值用于它的成员元素的表达式。一个简单的数组构造器由关键词 `ARRAY`、一个左方括号 `[` 、一个用于数组元素值的表达式列表(用逗号分隔)以及最后的一个右方括号 `]` 组成。例如: ``` @@ -1659,7 +1526,7 @@ SELECT ARRAY[1,2,3+4]; (1 row) ``` -默认情况下,数组元素类型是成员表达式的公共类型,使用和 `UNION` 或 `CASE` 结构(见 http://www.postgresql.org/docs/17/typeconv-union-case.html[第 10.5 节])相同的规则决定。你可以通过显式将数组构造器造型为想要的类型来重载,例如: +默认情况下,数组元素类型是成员表达式的公共类型,使用和 `UNION` 或 `CASE` 结构(见 [第 10.5 节](http://www.postgresql.org/docs/17/typeconv-union-case.html))相同的规则决定。你可以通过显式将数组构造器造型为想要的类型来重载,例如: ``` SELECT ARRAY[1,2,22.7]::integer[]; @@ -1669,7 +1536,7 @@ SELECT ARRAY[1,2,22.7]::integer[]; (1 row) ``` -这和把每一个表达式单独地造型为数组元素类型的效果相同。关于造型的更多信息请见 http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS[第 4.2.9 节]。 +这和把每一个表达式单独地造型为数组元素类型的效果相同。关于造型的更多信息请见 [第 4.2.9 节](http://www.postgresql.org/docs/17/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS)。 多维数组值可以通过嵌套数组构造器来构建。在内层的构造器中,关键词 `ARRAY` 可以被忽略。例如,这些语句产生相同的结果: @@ -1704,7 +1571,6 @@ SELECT ARRAY[f1, f2, '{{9,10},{11,12}}'::int[]] FROM arr; ``` - 你可以构造一个空数组,但是因为无法得到一个无类型的数组,你必须显式地把你的空数组造型成想要的类型。例如: ``` @@ -1716,7 +1582,6 @@ SELECT ARRAY[]::integer[]; ``` - 也可以从一个子查询的结果构建一个数组。在这种形式中,数组构造器被写为关键词 `ARRAY` 后跟着一个加了圆括号(不是方括号)的子查询。例如: ``` @@ -1735,10 +1600,9 @@ SELECT ARRAY(SELECT ARRAY[i, i*2] FROM generate_series(1,5) AS a(i)); 子查询必须返回一个单一列。如果子查询的输出列是非数组类型, 结果的一维数组将为该子查询结果中的每一行有一个元素, 并且有一个与子查询的输出列匹配的元素类型。如果子查询的输出列 是一种数组类型,结果将是同类型的一个数组,但是要高一个维度。 在这种情况下,该子查询的所有行必须产生同样维度的数组,否则结果 就不会是矩形形式。 -用 `ARRAY` 构建的一个数组值的下标总是从一开始。更多关于数组的信息,请见 http://www.postgresql.org/docs/17/arrays.html[第 8.15 节]。 - -==== 行构造器 +用 `ARRAY` 构建的一个数组值的下标总是从一开始。更多关于数组的信息,请见 [第 8.15 节](http://www.postgresql.org/docs/17/arrays.html)。 +#### 行构造器 一个行构造器是能够构建一个行值(也称作一个组合类型)并用值作为其成员域的表达式。一个行构造器由关键词 `ROW`、一个左圆括号、用于行的域值的零个或多个表达式(用逗号分隔)以及最后的一个右圆括号组成。例如: ``` @@ -1747,7 +1611,7 @@ SELECT ROW(1,2.5,'this is a test'); 当在列表中有超过一个表达式时,关键词 `ROW` 是可选的。 -一个行构造器可以包括语法 *`rowvalue`* `.\*`,它将被扩展为该行值的元素的一个列表,就像在一个顶层 `SELECT` 列表(见 http://www.postgresql.org/docs/17/rowtypes.html#ROWTYPES-USAGE[第 8.16.5 节])中使用 `.*` 时发生的事情一样。例如,如果表 `t` 有列 `f1` 和 `f2`,那么这些是相同的: +一个行构造器可以包括语法 *`rowvalue`* `.\*`,它将被扩展为该行值的元素的一个列表,就像在一个顶层 `SELECT` 列表(见 [第 8.16.5 节](http://www.postgresql.org/docs/17/rowtypes.html#ROWTYPES-USAGE))中使用 `.*` 时发生的事情一样。例如,如果表 `t` 有列 `f1` 和 `f2`,那么这些是相同的: ``` SELECT ROW(t.*, 42) FROM t; @@ -1757,7 +1621,7 @@ SELECT ROW(t.f1, t.f2, 42) FROM t; .注意 **** 在PostgreSQL 8.2 以前,`.\*` 语法不会在行构造器中被扩展,这样写 `ROW(t.*, 42)` 会创建一个有两个域的行,其第一个域是另一个行值。新的行为通常更有用。如果你需要嵌套行值的旧行为,写内层行值时不要用 `.*`,例如 `ROW(t, 42)`。 -**** +**** 默认情况下,由一个 `ROW` 表达式创建的值是一种匿名记录类型。如果必要,它可以被造型为一种命名的组合类型 — 或者是一个表的行类型,或者是一种用 `CREATE TYPE AS` 创建的组合类型。为了避免歧义,可能需要一个显式造型。例如: @@ -1795,7 +1659,6 @@ SELECT getf1(CAST(ROW(11,'this is a test',2.5) AS myrowtype)); ``` - 行构造器可以被用来构建存储在一个组合类型表列中的组合值,或者被传递给一个接受组合参数的函数。还有,可以比较两个行值,或者用 `IS NULL` 或 `IS NOT NULL` 测试一个行,例如: ``` @@ -1804,10 +1667,9 @@ SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows ``` -详见 http://www.postgresql.org/docs/17/functions-comparisons.html[第 9.24 节]。如 http://www.postgresql.org/docs/17/functions-subquery.html[第 9.23 节] 中所讨论的,行构造器也可以被用来与子查询相连接。 - -==== 表达式计算规则 +详见 [第 9.24 节](http://www.postgresql.org/docs/17/functions-comparisons.html)。如 [第 9.23 节](http://www.postgresql.org/docs/17/functions-subquery.html) 中所讨论的,行构造器也可以被用来与子查询相连接。 +#### 表达式计算规则 子表达式的计算顺序没有被定义。特别地,一个操作符或函数的输入不必按照从左至右或其他任何固定顺序进行计算。 此外,如果一个表达式的结果可以通过只计算其一部分来决定,那么其他子表达式可能完全不需要被计算。例如,如果我们写: @@ -1826,7 +1688,7 @@ SELECT somefunc() OR true; 因此,在复杂表达式中使用带有副作用的函数是不明智的。在 `WHERE` 和 `HAVING` 子句中依赖副作用或计算顺序尤其危险,因为在建立一个执行计划时这些子句会被广泛地重新处理。这些子句中布尔表达式( `AND` / `OR` / `NOT` 的组合)可能会以布尔代数定律所允许的任何方式被重组。 -当有必要强制计算顺序时,可以使用一个 `CASE` 结构(见 http://www.postgresql.org/docs/17/functions-conditional.html[第 9.18 节])。例如,在一个 `WHERE` 子句中使用下面的方法尝试避免除零是不可靠的: +当有必要强制计算顺序时,可以使用一个 `CASE` 结构(见 [第 9.18 节](http://www.postgresql.org/docs/17/functions-conditional.html))。例如,在一个 `WHERE` 子句中使用下面的方法尝试避免除零是不可靠的: ``` SELECT ... WHERE x > 0 AND y/x > 1.5; @@ -1840,7 +1702,7 @@ SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END; 一个以这种风格使用的 `CASE` 结构将使得优化尝试失败,因此只有必要时才这样做(在这个特别的例子中,最好通过写 `y > 1.5*x` 来回避这个问题)。 -不过,`CASE` 不是这类问题的万灵药。上述技术的一个限制是, 它无法阻止常量子表达式的提早计算。如 http://www.postgresql.org/docs/17/xfunc-volatility.html[第 38.7 节] 中所述,当查询被规划而不是被执行时,被标记成 `IMMUTABLE` 的函数和操作符可以被计算。因此 +不过,`CASE` 不是这类问题的万灵药。上述技术的一个限制是, 它无法阻止常量子表达式的提早计算。如 [第 38.7 节](http://www.postgresql.org/docs/17/xfunc-volatility.html) 中所述,当查询被规划而不是被执行时,被标记成 `IMMUTABLE` 的函数和操作符可以被计算。因此 ``` SELECT CASE WHEN x > 0 THEN x ELSE 1/0 END FROM tab; @@ -1861,13 +1723,12 @@ SELECT CASE WHEN min(employees) > 0 `min()` 和 `avg()` 聚集会在所有输入行上并行地计算, 因此如果任何行有 `employees` 等于零,在有机会测试 `min()` 的结果之前,就会发生除零错误。取而代之的是,可以使用 一个 `WHERE` 或 `FILTER` 子句来首先阻止有问题的输入行到达一个聚集函数。 -=== 调用函数 - -IvorySQL允许带有命名参数的函数被使用 *位置* 或 *命名* 记号法调用。命名记号法对于有大量参数的函数特别有用,因为它让参数和实际参数之间的关联更明显和可靠。在位置记号法中,书写一个函数调用时,其参数值要按照它们在函数声明中被定义的顺序书写。在命名记号法中,参数根据名称匹配函数参数,并且可以以任何顺序书写。对于每一种记法,还要考虑函数参数类型的效果,这些在 http://www.postgresql.org/docs/17/typeconv-func.html[第 10.3 节] 有介绍。 +### 调用函数 +IvorySQL允许带有命名参数的函数被使用 **位置** 或 **命名** 记号法调用。命名记号法对于有大量参数的函数特别有用,因为它让参数和实际参数之间的关联更明显和可靠。在位置记号法中,书写一个函数调用时,其参数值要按照它们在函数声明中被定义的顺序书写。在命名记号法中,参数根据名称匹配函数参数,并且可以以任何顺序书写。对于每一种记法,还要考虑函数参数类型的效果,这些在 [第 10.3 节](http://www.postgresql.org/docs/17/typeconv-func.html) 有介绍。 在任意一种记号法中,在函数声明中给出了默认值的参数根本不需要在调用中写出。但是这在命名记号法中特别有用,因为任何参数的组合都可以被忽略。而在位置记号法中参数只能从右往左忽略。 -IvorySQL也支持 *混合* 记号法,它组合了位置和命名记号法。在这种情况中,位置参数被首先写出并且命名参数出现在其后。 +IvorySQL也支持 **混合** 记号法,它组合了位置和命名记号法。在这种情况中,位置参数被首先写出并且命名参数出现在其后。 下列例子将展示所有三种记号法的用法: @@ -1884,15 +1745,14 @@ $$ LANGUAGE SQL IMMUTABLE STRICT; ``` -函数 `concat_lower_or_upper` 有两个强制参数,`a` 和 `b`。此外,有一个可选的参数 `uppercase`,其默认值为 `false`。`a` 和 `b` 输入将被串接,并且根据 `uppercase` 参数被强制为大写或小写形式。这个函数的剩余细节对这里并不重要(详见 http://www.postgresql.org/docs/17/extend.html[第 38 章])。 - -==== 使用位置记号 +函数 `concat_lower_or_upper` 有两个强制参数,`a` 和 `b`。此外,有一个可选的参数 `uppercase`,其默认值为 `false`。`a` 和 `b` 输入将被串接,并且根据 `uppercase` 参数被强制为大写或小写形式。这个函数的剩余细节对这里并不重要(详见 [第 38 章](http://www.postgresql.org/docs/17/extend.html))。 +#### 使用位置记号 在IvorySQL中,位置记号法是给函数传递参数的传统机制。一个例子: ``` SELECT concat_lower_or_upper('Hello', 'World', true); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) @@ -1902,7 +1762,7 @@ SELECT concat_lower_or_upper('Hello', 'World', true); ``` SELECT concat_lower_or_upper('Hello', 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- hello world (1 row) @@ -1910,13 +1770,12 @@ SELECT concat_lower_or_upper('Hello', 'World'); 这里,`uppercase` 参数被忽略,因此它接收它的默认值 `false`,并导致小写形式的输出。在位置记号法中,参数可以按照从右往左被忽略并且因此而得到默认值。 -==== 使用命名记号 - +#### 使用命名记号 在命名记号法中,每一个参数名都用 `=>` 指定来把它与参数表达式分隔开。例如: ``` SELECT concat_lower_or_upper(a => 'Hello', b => 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- hello world (1 row) @@ -1926,37 +1785,35 @@ SELECT concat_lower_or_upper(a => 'Hello', b => 'World'); ``` SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) ``` - 为了向后兼容性,基于 ":=" 的旧语法仍被支持: ``` SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) ``` -==== 使用混合记号 - +#### 使用混合记号 混合记号法组合了位置和命名记号法。不过,正如已经提到过的,命名参数不能超越位置参数。例如: ``` SELECT concat_lower_or_upper('Hello', 'World', uppercase => true); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) @@ -1969,13 +1826,10 @@ SELECT concat_lower_or_upper('Hello', 'World', uppercase => true); 命名的和混合的调用记号法当前不能在调用聚集函数时使用(但是当聚集函数被用作窗口函数时它们可以被使用)。 **** -== Oracle兼容功能 - -=== 更改表 - -==== 语法 - -```undefined +## Oracle兼容功能 +### 更改表 +#### 语法 +``` ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action; @@ -1994,8 +1848,7 @@ alter_using: USING expression ``` -==== **参数** - +#### 参数 `name` 表名. `column_name` 列名. @@ -2012,9 +1865,8 @@ alter_using: `USING keyword` 修改列的值. -==== 示例 - -```undefined +#### 示例 +``` ADD: create table tb_test1(id int, flg char(10)); @@ -2027,14 +1879,14 @@ ALTER TABLE tb_test1 \d tb_test1 Table "public.tb_test1" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+-----------------+-----------+----------+--------- - id | pg_catalog.int4 | | | - flg | char(10) | | | - name | varchar2(4000) | | | - adress | varchar2(4000) | | | - num | pg_catalog.int4 | | | - flg1 | char(1) | | | + id | pg_catalog.int4 | | | + flg | char(10) | | | + name | varchar2(4000) | | | + adress | varchar2(4000) | | | + num | pg_catalog.int4 | | | + flg1 | char(1) | | | MODIFY: create table tb_test2(id int, flg char(10), num varchar); @@ -2045,11 +1897,11 @@ ALTER TABLE tb_test2 ALTER COLUMN id TYPE char; \d tb_test2 Table "public.tb_test2" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+----------------+-----------+----------+--------- - id | char(1) | | | - flg | char(10) | | | - num | varchar2(4000) | | | + id | char(1) | | | + flg | char(10) | | | + num | varchar2(4000) | | | DROP: create table tb_test3(id int, flg1 char(10), flg2 char(11), flg3 char(12), flg4 char(13), @@ -2059,21 +1911,19 @@ ALTER TABLE tb_test3 DROP id; \d tb_test3 Table "public.tb_test3" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+----------+-----------+----------+--------- - flg1 | char(10) | | | - flg2 | char(11) | | | - flg3 | char(12) | | | - flg4 | char(13) | | | - flg5 | char(14) | | | - flg6 | char(15) | | | + flg1 | char(10) | | | + flg2 | char(11) | | | + flg3 | char(12) | | | + flg4 | char(13) | | | + flg5 | char(14) | | | + flg6 | char(15) | | | ``` -=== 删除表 - -==== 语法 - -```undefined +### 删除表 +#### 语法 +``` [ WITH [ RECURSIVE ] with_query [, ...] ] DELETE [ FROM ] [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ USING using_list ] @@ -2081,8 +1931,7 @@ DELETE [ FROM ] [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] ``` -==== 参数 - +#### 参数 `table_name` 表名. `alias` 表别名. @@ -2097,9 +1946,8 @@ DELETE [ FROM ] [ ONLY ] table_name [ * ] [ [ AS ] alias ] `output_name` 被返回列的名称. -==== 使用 - -```undefined +#### 使用 +``` create table tb_test4(id int, flg char(10)); insert into tb_test4 values(1, '2'), (5, '6'); @@ -2107,20 +1955,18 @@ insert into tb_test4 values(1, '2'), (5, '6'); delete from tb_test4 where id = 1; table tb_test4; - id | flg + id | flg ----+------------ - 5 | 6 + 5 | 6 (1 row) ``` -=== 更新表 - -==== 语法 - -```undefined +### 更新表 +#### 语法 +``` [ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] - SET { [ table_name | alias ] column_name = { expression | DEFAULT } + SET { [ table_name | alias ] column_name = { expression | DEFAULT } | ( [ table_name | alias ] column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | ( [ table_name | alias ] column_name [, ...] ) = ( sub-SELECT ) } [, ...] @@ -2129,8 +1975,7 @@ UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] ``` -==== **参数** - +#### 参数 `table_name` 表名. `alias` 表别名. @@ -2151,9 +1996,8 @@ UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] `output_name` 被返回列的名称. -==== 示例 - -```undefined +#### 示例 +``` create table tb_test5(id int, flg char(10)); insert into tb_test5 values(1, '2'), (3, '4'), (5, '6'); @@ -2169,11 +2013,9 @@ Id | flg (3 rows) ``` -=== GROUP BY - -==== 示例 - -```undefined +### GROUP BY +#### 示例 +``` set compatible_mode to oracle; create table students(student_id varchar(20) primary key , @@ -2184,13 +2026,11 @@ select student_id,student_name from students group by student_id; ERROR: column "students.student_name" must appear in the GROUP BY clause or be used in an aggregate function ``` -=== UNION - -==== 示例 - -```undefined +### UNION +#### 示例 +``` SELECT 100 AS value FROM DUAL UNION SELECT 200 AS value FROM DUAL UNION SELECT 100 AS value FROM DUAL; - value + value ------- 100 200 @@ -2198,42 +2038,35 @@ SELECT 100 AS value FROM DUAL UNION SELECT 200 AS value FROM DUAL UNION SELECT 1 ``` -=== Minus Operator - -==== 语法 - -```undefined +### Minus Operator +#### 语法 +``` select_statement MINUS [ ALL | DISTINCT ] select_statement; ``` -==== **参数** - +#### 参数 `select_statement` 任何没有ORDER BY、LIMIT、 FOR NO KEY UPDATE、FOR UPDATE、 FOR SHARE和FOR KEY SHARE子句的 SELECT语句. `ALL keyword` 包含重复行结果. `DISTINCT keyword` 显示的消除重复行. -==== 示例 - -```undefined +#### 示例 +``` select * from generate_series(1, 3) g(i) MINUS select * from generate_series(1, 3) g(i) where i = 1; - i + i --- 2 3 (2 rows) ``` -=== 转义字符 - -==== 概述 - +### 转义字符 +#### 概述 使用 q\' 转义特殊字符。q\' 转义字符通常在! [] {} () \<> 和其他转义字符之后使用, 您也可以使用 \, 也可以使用字母, 数字, \=, +, -, *, \&, \$, \%, #, 等, 不允许使用空格。 -==== 示例 - -```undefined +#### 示例 +``` select q''' is goog ''; ?column? ------------ @@ -2241,21 +2074,17 @@ select q''' is goog ''; (1 row) ``` -=== 序列 - -==== 语法 - -```undefined +### 序列 +#### 语法 +``` SELECT [ database {schema} | schema ] sequence {nextval | currval}; ``` -==== **参数** - +#### 参数 `sequence` 序列名. -==== 示例 - -```undefined +#### 示例 +``` create sequence sq; select sq.nextval; @@ -2271,27 +2100,22 @@ select sq.currval; (1 row) ``` -=== 兼容时间和日期函数 - -==== from_tz - -===== 目的 - -```undefined +### 兼容时间和日期函数 +#### from_tz +##### 目的 +``` 将给定的不带时区的时间戳转换为指定的带时区的时间戳,如果指定时区或者时间戳为NULL,则返回NULL。 ``` -===== 参数描述 - -|==== -| 参数 | 描述 -| day | 不带时区的时间戳 -| tz | 指定的时区 -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| day | 不带时区的时间戳 | +| tz | 指定的时区 | -===== 例子 -```SQL +##### 例子 +``` select from_tz('2021-11-08 09:12:39','Asia/Shanghai') from dual; from_tz @@ -2300,34 +2124,31 @@ select from_tz('2021-11-08 09:12:39','Asia/Shanghai') from dual; (1 row) select from_tz('2021-11-08 09:12:39','SAST') from dual; - from_tz + from_tz -------------------------- 2021-11-08 09:12:39 SAST select from_tz(NULL,'SAST') from dual; - from_tz + from_tz --------- - + (1 row) select from_tz('2021-11-08 09:12:31',NULL) from dual; - from_tz + from_tz --------- - + (1 row) ``` -==== systimestamp - -===== 目的 - -```undefined +#### systimestamp +##### 目的 +``` 获取当前数据库系统的时间戳。 ``` -===== 例子 - -```SQL +##### 例子 +``` select systimestamp(); systimestamp @@ -2341,50 +2162,44 @@ select systimestamp; 2021-12-02 14:39:33.262828+08 ``` -==== sys_extract_utc - -===== 目的 - -```undefined +#### sys_extract_utc +##### 目的 +``` 将给定的带时区的时间戳转换为不带时区的UTC时间。 ``` -===== 参数描述 -|==== -| 参数 | 描述 -| day | 需要转化带时区的时间戳 -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| day | 需要转化带时区的时间戳 | -===== 例子 -```SQL +##### 例子 +``` select sys_extract_utc('2018-03-28 11:30:00.00 +09:00'::timestamptz) from dual; - sys_extract_utc + sys_extract_utc --------------------- 2018-03-28 02:30:00 (1 row) select sys_extract_utc(NULL) from dual; - sys_extract_utc + sys_extract_utc ----------------- - + (1 row) ``` -==== sessiontimezone - -===== 目的 - -```undefined +#### sessiontimezone +##### 目的 +``` 获取当前会话的时区。 ``` -===== 例子 - -```SQL +##### 例子 +``` select sessiontimezone() from dual; - sessiontimezone + sessiontimezone ----------------- PRC (1 row) @@ -2399,26 +2214,23 @@ set timezone to UTC; ``` -==== next_day - -===== 目的 - -```undefined +#### next_day +##### 目的 +``` next_day 返回由格式名相同的第一个工作日的日期,该日期晚于当前日期。 无论日期的数据类型如何,返回类型始终为 DATE。 返回值具有与参数日期相同的小时、分钟和秒部分。 ``` -===== 参数描述 -|==== -| 参数 | 描述 -| value | 开始时间戳 -| weekday | 星期几,可以是 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 或者 0,1,2,3,4,5,6,0代表星期天 -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| value | 开始时间戳 | +| weekday | 星期几,可以是 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 或者 0,1,2,3,4,5,6,0代表星期天 | -===== 例子 -```SQL +##### 例子 +``` select next_day(to_timestamp('2020-02-29 14:40:50', 'YYYY-MM-DD HH24:MI:SS'), 'Tuesday') from dual; - next_day + next_day --------------------- 2020-03-03 14:40:50 (1 row) @@ -2430,80 +2242,70 @@ select next_day('2020-07-01 19:43:51 +8'::timestamptz, 1) from dual; (1 row) ``` -==== last_day - -===== 目的 - -```undefined -last_day返回档期日期所在月份的最后一天。 +#### last_day +##### 目的 +``` +last_day返回档期日期所在月份的最后一天。 ``` -===== 参数描述 -|==== -| 参数 | 描述 -| value | 指定的时间戳 -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| value | 指定的时间戳 | -===== 例子 -```SQL +##### 例子 +``` select last_day(timestamp '2020-05-17 13:27:19') from dual; - last_day + last_day --------------------- 2020-05-31 13:27:19 (1 row) select last_day('2020-11-29 19:20:40 +08'::timestamptz) from dual; - last_day + last_day --------------------- 2020-11-30 19:20:40 (1 row) ``` -==== add_months - -===== 目的 - -```undefined -add_months 返回日期加上整数月份。 date 参数可以是日期时间值或任何可以隐式转换为 DATE 的值。 整数参数可以是整数或任何可以隐式转换为整数的值。 +#### add_months +##### 目的 +``` +add_months 返回日期加上整数月份。 date 参数可以是日期时间值或任何可以隐式转换为 DATE 的值。 整数参数可以是整数或任何可以隐式转换为整数的值。 ``` -===== 参数描述 - -|==== -| 参数 | 描述 -| day | oracle.date类型,需要被改变的时间戳 -| value | 一个整形数据,需要增加的月数 -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| day | oracle.date类型,需要被改变的时间戳 | +| value | 一个整形数据,需要增加的月数 | -===== 例子 -```SQL +##### 例子 +``` select add_months(date '2020-02-15',7) from dual; - add_months + add_months --------------------- 2020-09-15 00:00:00 (1 row) select add_months(timestamp '2018-12-15 19:12:09',12) from dual; - add_months + add_months --------------------- 2019-12-15 19:12:09 (1 row) ``` -==== sysdate - -===== 目的 - -```undefined +#### sysdate +##### 目的 +``` sysdate 返回数据库服务器的操作系统时间。 ``` -===== 例子 - -```SQL +##### 例子 +``` select sysdate; statement_sysdate --------------------- @@ -2517,621 +2319,569 @@ select sysdate(); (1 row) ``` -==== new_time - -===== 目的 - -```undefined +#### new_time +##### 目的 +``` 转换第一个时区的时间到第二个时区的时间. 时区包括了 "ast", "adt", "bst", "bdt", "cst", "cdt", "est", "edt", "gmt", "hst", "hdt", "mst", "mdt", "nst", "pst", "pdt", "yst", "ydt". ``` -===== 参数描述 -|==== -| 参数 | 描述 -| day | 需要被转换的时间戳 -| tz1 | 时间戳的时区 -| tz2 | 目标时区 -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| day | 需要被转换的时间戳 | +| tz1 | 时间戳的时区 | +| tz2 | 目标时区 | -===== 例子 -```SQL +##### 例子 +``` select new_time(timestamp '2020-12-12 17:45:18', 'AST', 'ADT') from dual; - new_time + new_time --------------------- 2020-12-12 18:45:18 (1 row) select new_time(timestamp '2020-12-12 17:45:18', 'BST', 'BDT') from dual; - new_time + new_time --------------------- 2020-12-12 18:45:18 (1 row) select new_time(timestamp '2020-12-12 17:45:18', 'CST', 'CDT') from dual; - new_time + new_time --------------------- 2020-12-12 18:45:18 (1 row) ``` -==== trunc - -===== 目的 - -```undefined +#### trunc +##### 目的 +``` trunc函数返回一个日期, 按照指定格式被截断, fmt包括 "Y", "YY", "YYY", "YYYY","YEAR", "SYYYY", "SYEAR", "I", "IY", "IYY", "IYYY", "Q", "WW", "Iw", "W", "DAY", "DY", "D", "MONTH", "MONn", "MM", "RM", "CC", "SCC", "DDD", "DD", "J", "HH", "HH12", "HH24", "MI". ``` -===== 参数描述 -|==== -| 参数 | 描述 -| value | 指定的日期(oracle.date, timestamp, timestamptz) -| fmt | 指定的格式, 如果被省略, 默认为 "DDD" -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| value | 指定的日期(oracle.date, timestamp, timestamptz) | +| fmt | 指定的格式, 如果被省略, 默认为 "DDD" | -===== 例子 -```SQL +##### 例子 +``` select trunc(timestamp '2020-07-28 19:16:12', 'Q'); - trunc + trunc --------------------- 2020-07-01 00:00:00 (1 row) select trunc(timestamptz '2020-09-27 18:30:21 + 08', 'MONTH'); - trunc + trunc ------------------------ 2020-09-01 00:00:00+08 (1 row) ``` -==== round - -===== 目的 - -```undefined +#### round +##### 目的 +``` round函数返回一个日期,按照指定的格式四舍五入, fmt 包括了 "Y", "YY", "YYY", "YYYY","YEAR", "SYYYY", "SYEAR", "I", "IY", "IYY", "IYYY", "Q", "WW", "Iw", "W", "DAY", "DY", "D", "MONTH", "MONn", "MM", "RM", "CC", "SCC", "DDD", "DD", "J", "HH", "HH12", "HH24", "MI". ``` -===== 参数描述 -|==== -| 参数 | 描述 -| value | 被转换的日期(oracle.date, timestamp, timestamptz) -| fmt | 指定的格式, 如果被省略, 默认为 "DDD" -|==== +##### 参数描述 +| 参数 | 描述 | +| --- | --- | +| value | 被转换的日期(oracle.date, timestamp, timestamptz) | +| fmt | 指定的格式, 如果被省略, 默认为 "DDD" | -===== 例子 -```SQL +##### 例子 +``` select round(timestamp '2050-06-12 16:40:55', 'IYYY'); - round + round --------------------- 2050-01-03 00:00:00 (1 row) ``` -=== 兼容转换和比较以及与NULL相关的函数 - -==== TO_CHAR - -===== 目的 - +### 兼容转换和比较以及与NULL相关的函数 +#### TO_CHAR +##### 目的 TO_CHAR(str,[fmt]) 根据给定的格式将输入参数转换为 TEXT 数据类型的值。 如果省略 fmt,则数据将转换为系统默认格式的 TEXT 值。 如果 str 为 null,则该函数返回 null。 -===== **参数** - +##### 参数 `str` 输入参数 (任意类型)。 `fmt` 输入格式参数,详见格式fmt。 -===== 示例 - -```undefined +##### 示例 +``` select to_char('3 2:20:05'); - to_char + to_char ----------------- 3 days 02:20:05 (1 row) - + select to_char('4.00'::numeric); - to_char + to_char --------- 4 (1 row) - + select to_char(NULL); - to_char + to_char --------- - + (1 row) - + select to_char(123,'xx'); - to_char + to_char --------- 7b (1 row) ``` -==== TO_NUMBER - -===== 目的 - +#### TO_NUMBER +##### 目的 TO_NUMBER(str,[fmt1]) 根据给定的格式将输入参数 str 转换为 NUMREIC 数据类型的值。 如果省略 fmt1,则数据将转换为系统默认格式的 NUMERIC 值。 如果 str 是 NUMERIC,则该函数返回 str。如果 str 计算结果为 null,则该函数返回 null。 如果它不能转换为 NUMERIC 数据类型,则该函数返回错误。 -===== **参数** - +##### 参数 `str` 输入参数包括以下数据类型(double precision,numeric,text,integer等,但必须隐式转换为numeric)。 `fmt1` 输入格式参数,详见格式fmt1。 -===== 示例 - -```undefined +##### 示例 +``` select to_number(1210.73::numeric, 9999.99::numeric); - to_number + to_number ----------- 1210.73 (1 row) select to_number(NULL); - to_number + to_number ----------- - + (1 row) select to_number('123'::text); - to_number + to_number ----------- 123 (1 row) ``` -==== TO_DATE - -===== 目的 - +#### TO_DATE +##### 目的 TO_DATE(str,[fmt]) 根据给定的格式将输入参数 str 转换为日期数据类型的值。 如果省略 fmt,则数据将转换为系统默认格式的日期值。 如果 str 为 null,则该函数返回 null。 如果 fmt 是 J,对于 Julian,则 char 必须是整数。 如果无法转换为 DATE,则该函数返回错误。 -===== **参数** - +##### 参数 `str` 输入参数(integer,text,可以隐式转换为上述类型,符合日期格式的字符串)。 `fmt` 输入格式参数,详见格式fmt。 -===== 示例 - -```undefined +##### 示例 +``` select to_date('50-11-28 ','RR-MM-dd '); - to_date + to_date --------------------- 1950-11-28 00:00:00 (1 row) select to_date(2454336, 'J'); - to_date + to_date --------------------- 2007-08-23 00:00:00 (1 row) select to_date('2019/11/22', 'yyyy-mm-dd'); - to_date + to_date --------------------- 2019-11-22 00:00:00 (1 row) select to_date('20-11-28 10:14:22','YY-MM-dd hh24:mi:ss'); - to_date + to_date --------------------- 2020-11-28 10:14:22 (1 row) -select to_date('2019/11/22'); - to_date +select to_date('2019/11/22'); + to_date --------------------- 2019-11-22 00:00:00 (1 row) select to_date('2019/11/27 10:14:22'); - to_date + to_date --------------------- 2019-11-27 10:14:22 (1 row) select to_date('2020','RR'); - to_date + to_date --------------------- 2020-01-01 00:00:00 (1 row) select to_date(NULL); - to_date + to_date --------- - + (1 row) select to_date('-4712-07-23 14:31:23', 'syyyy-mm-dd hh24:mi:ss'); - to_date + to_date ---------------------- -4712-07-23 14:31:23 (1 row) ``` -==== TO_TIMESTAMP - -===== 目的 - +#### TO_TIMESTAMP +##### 目的 TO_TIMESTAMP(str,[fmt]) 根据给定的格式将输入参数 str 转换为不带时区的时间戳。 如果省略 fmt,则数据将转换为系统默认格式中不带时区值的时间戳。 如果 str 为 null,则该函数返回 null。 如果无法转换为不带时区的时间戳,则该函数返回错误。 -===== **参数** - +##### 参数 `str` 输入参数(double precision,text,可以隐式转换为上述类型)。 `fmt` 输入格式参数,详见格式fmt。 -===== 示例 - -```undefined +##### 示例 +``` select to_timestamp(1212121212.55::numeric); - to_timestamp + to_timestamp --------------------------- 2008-05-30 12:20:12.55 (1 row) select to_timestamp('2020/03/03 10:13:18 +5:00', 'YYYY/MM/DD HH:MI:SS TZH:TZM'); - to_timestamp + to_timestamp ------------------------ 2020-03-03 13:13:18 (1 row) select to_timestamp(NULL,NULL); - to_timestamp + to_timestamp -------------- - + (1 row) ``` -==== TO_YMINTERVAL - -===== 目的 - +#### TO_YMINTERVAL +##### 目的 TO_YMINTERVAL(str) 将输入参数 str 时间间隔转换为年到月范围内的时间间隔。 只处理年月,其他部分省略。 如果输入参数为NULL,函数返回NULL,如果输入参数格式错误,函数返回错误。 -===== **参数** - +##### 参数 `str` 输入参数(text,可以隐式转换为文本类型,必须是时间间隔格式。 兼容 SQL 标准的 SQL 间隔格式, ISO 持续时间格式与 ISO 8601:2004 标准兼容)。 -===== 示例 - -```undefined +##### 示例 +``` select to_yminterval('P1Y-2M2D'); - to_yminterval + to_yminterval --------------- +000000000-10 (1 row) select to_yminterval('P1Y2M2D'); - to_yminterval + to_yminterval --------------- +000000001-02 (1 row) select to_yminterval('-01-02'); - to_yminterval + to_yminterval --------------- -000000001-02 (1 row) ``` -==== TO_DSINTERVAL - -===== 目的 - +#### TO_DSINTERVAL +##### 目的 TO_DSINTERVAL(str) 将输入参数 str 的时间间隔转换为天到秒范围内的时间间隔。 输入参数包括:日、时、分、秒和微秒。 如果输入参数为NULL,函数返回NULL,如果输入参数包含年月或格式错误,函数返回错误。 -===== **参数** - +##### 参数 `str` 输入参数(text,可以隐式转换为文本类型,必须是时间间隔格式。 兼容 SQL 标准的 SQL 间隔格式, ISO 持续时间格式与 ISO 8601:2004 标准兼容)。 -===== 示例 - -```undefined +##### 示例 +``` select to_dsinterval('100 00 :02 :00'); - to_dsinterval + to_dsinterval ------------------------------- +000000100 00:02:00.000000000 (1 row) select to_dsinterval('-100 00:02:00'); - to_dsinterval + to_dsinterval ------------------------------- -000000100 00:02:00.000000000 (1 row) select to_dsinterval(NULL); - to_dsinterval + to_dsinterval --------------- - + (1 row) ``` -==== TO_TIMESTAMP_TZ - -===== 目的 - +#### TO_TIMESTAMP_TZ +##### 目的 TO_TIMESTAMP_TZ(str,[fmt]) 根据给定的格式将输入参数 str 转换为带时区的时间戳。 如果省略 fmt,则数据将转换为具有系统默认格式带时区值的时间戳。 如果 str 为 null,则该函数返回 null。 如果无法转换为带时区的时间戳,则该函数返回错误。 -===== **参数** - +##### 参数 `str` 输入参数(text,可以隐式转换为文本类型)。 `fmt` 输入格式参数,详见格式fmt。 -===== 示例 - -```undefined +##### 示例 +``` select to_timestamp_tz('2019','yyyy'); - to_timestamp_tz + to_timestamp_tz ------------------------ 2019-01-01 00:00:00+08 (1 row) select to_timestamp_tz('2019-11','yyyy-mm'); - to_timestamp_tz + to_timestamp_tz ------------------------ 2019-11-01 00:00:00+08 (1 row) select to_timestamp_tz('2003/12/13 10:13:18 +7:00'); - to_timestamp_tz + to_timestamp_tz ------------------------ 2003-12-13 11:13:18+08 (1 row) select to_timestamp_tz('2019/12/13 10:13:18 +5:00', 'YYYY/MM/DD HH:MI:SS TZH:TZM'); - to_timestamp_tz + to_timestamp_tz ------------------------ 2019-12-13 13:13:18+08 (1 row) select to_timestamp_tz(NULL); - to_timestamp_tz + to_timestamp_tz ----------------- - + (1 row) ``` -==== GREATEST - -===== 目的 - +#### GREATEST +##### 目的 GREATEST(expr1,expr2,...) 获取一个或多个表达式的输入列表中的最大值。 如果任何 expr 的计算结果为 NULL,则该函数返回 NULL。 -===== **参数** - +##### 参数 ``` expr1` 输入参数(任意类型)。 `expr2` 输入参数(任意类型)。 `... ``` -===== 示例 - -```undefined +##### 示例 +``` select greatest('a','b','A','B'); - greatest + greatest ---------- b (1 row) select greatest(',','.','/',';','!','@','?'); - greatest + greatest ---------- @ (1 row) select greatest('瀚','高','数','据','库'); - greatest + greatest ---------- 高 (1 row) SELECT greatest('HARRY', 'HARRIOT', 'HARRA'); - greatest + greatest ---------- HARRY (1 row) SELECT greatest('HARRY', 'HARRIOT', NULL); - greatest + greatest ---------- - + (1 row) SELECT greatest(1.1, 2.22, 3.33); - greatest + greatest ---------- 3.33 (1 row) SELECT greatest('A', 6, 7, 5000, 'E', 'F','G') A; - a + a --- G (1 row) ``` -==== LEAST - -===== 目的 - +#### LEAST +##### 目的 LEAST(expr1,expr2,...) 获取一个或多个表达式的输入列表中的最小值。 如果任何 expr 的计算结果为 NULL,则该函数返回 NULL。 -===== **参数** - +##### 参数 ``` expr1` 输入参数(任意类型)。 `expr2` 输入参数(任意类型)。 `... ``` -===== 示例 - -```undefined +##### 示例 +``` SELECT least(1,' 2', '3' ); - least + least ------- 1 (1 row) SELECT least(NULL, NULL, NULL); - least + least ------- - + (1 row) SELECT least('A', 6, 7, 5000, 'E', 'F','G') A; - a + a ------ 5000 (1 row) select least(1,3,5,10); - least + least ------- 1 (1 row) select least('a','A','b','B'); - least + least ------- A (1 row) select least(',','.','/',';','!','@'); - least + least ------- ! (1 row) select least('瀚','高','据','库'); - least + least ------- 库 (1 row) SELECT least('HARRY', 'HARRIOT', NULL); - least + least ------- - -(1 row) -``` - -===== **fmt(日期/时间格式的模板模式)** -|==== -| 模式 | 描述 -| HH | 一天中的小时 (01-12) -| HH12 | 一天中的小时 (01-12) -| HH24 | 一天中的小时 (00-23) -| MI | 分钟 (00-59)minute (00-59) -| SS | 秒(00-59) -| MS | 毫秒(000-999) -| US | 微秒(000000-999999) -| SSSS | 午夜后的秒(0-86399) -| AM, am, PM or pm | 正午指示器(不带句号) -| A.M., a.m., P.M. or p.m. | 正午指示器(带句号) -| Y,YYY | 带逗号的年(4 位或者更多位) -| YYYY | 年(4 位或者更多位) -| YYY | 年的后三位 -| YY | 年的后两位 -| Y | 年的最后一位 -| IYYY | ISO 8601 周编号方式的年(4 位或更多位) -| IYY | ISO 8601 周编号方式的年的最后 3 位 -| IY | ISO 8601 周编号方式的年的最后 2 位 -| I | ISO 8601 周编号方式的年的最后一位 -| BC, bc, AD或者ad | 纪元指示器(不带句号) -| B.C., b.c., A.D.或者a.d. | 纪元指示器(带句号) -| MONTH | 全大写形式的月名(空格补齐到 9 字符) -| Month | 全首字母大写形式的月名(空格补齐到 9 字符) -| month | 全小写形式的月名(空格补齐到 9 字符) -| MON | 简写的大写形式的月名(英文 3 字符,本地化长度可变) -| Mon | 简写的首字母大写形式的月名(英文 3 字符,本地化长度可变) -| mon | 简写的小写形式的月名(英文 3 字符,本地化长度可变) -| MM | 月编号(01-12) -| DAY | 全大写形式的日名(空格补齐到 9 字符) -| Day | 全首字母大写形式的日名(空格补齐到 9 字符) -| day | 全小写形式的日名(空格补齐到 9 字符) -| DY | 简写的大写形式的日名(英语 3 字符,本地化长度可变) -| Dy | 简写的首字母大写形式的日名(英语 3 字符,本地化长度可变) -| dy | 简写的小写形式的日名(英语 3 字符,本地化长度可变) -| DDD | 一年中的日(001-366) -| IDDD | ISO 8601 周编号方式的年中的日(001-371,年的第 1 日时第一个 ISO 周的周一) -| DD | 月中的日(01-31) -| D | 周中的日,周日(1)到周六(7) -| ID | 周中的 ISO 8601 日,周一(1)到周日(7) -| W | 月中的周(1-5)(第一周从该月的第一天开始) -| WW | 年中的周数(1-53)(第一周从该年的第一天开始) -| IW | ISO 8601 周编号方式的年中的周数(01 - 53;新的一年的第一个周四在第一周) -| CC | 世纪(2 位数)(21 世纪开始于 2001-01-01) -| J | 儒略日(从午夜 UTC 的公元前 4714 年 11 月 24 日开始的整数日数) -| Q | 季度(to_date和to_timestamp会忽略) -| RM | 大写形式的罗马计数法的月(I-XII;I 是 一月) -| rm | 小写形式的罗马计数法的月(i-xii;i 是 一月) -| TZ | 大写形式的时区名称 -| tz | 小写形式的时区名称 -| OF | 时区偏移量 -|==== - -===== **fmt1(数字格式的模板模式)** -|==== -| 模式 | 描述 -| 9 | 带有指定位数的值 -| 0 | 带前导零的值 -| . (period) | 小数点 -| , (comma) | 分组(千)分隔符 -| PR | 尖括号内的负值 -| S | 带符号的数字(使用区域) -| L | 货币符号(使用区域) -| D | 小数点(使用区域) -| G | 分组分隔符(使用区域) -| MI | 在指定位置的负号(如果数字 < 0) -| PL | 在指定位置的正号(如果数字 > 0) -| SG | 在指定位置的正/负号 -| RN | 罗马数字(输入在 1 和 3999 之间) -| TH or th | 序数后缀 -| V | 移动指定位数(参阅注解) -| EEEE | 科学记数的指数 -|==== - -=== NLS_LENGTH_SEMANTICS参数 - -==== 概述 -NLS_LENGTH_SEMANTICS 使您能够使用字节或字符长度语义创建 CHAR 和 VARCHAR2 列。 现有列不受影响。 在这种情况下,默认语义是 BYTE。 +(1 row) +``` -==== 语法 +##### fmt(日期/时间格式的模板模式) +| 模式 | 描述 | +| --- | --- | +| HH | 一天中的小时 (01-12) | +| HH12 | 一天中的小时 (01-12) | +| HH24 | 一天中的小时 (00-23) | +| MI | 分钟 (00-59)minute (00-59) | +| SS | 秒(00-59) | +| MS | 毫秒(000-999) | +| US | 微秒(000000-999999) | +| SSSS | 午夜后的秒(0-86399) | +| AM, am, PM or pm | 正午指示器(不带句号) | +| A.M., a.m., P.M. or p.m. | 正午指示器(带句号) | +| Y,YYY | 带逗号的年(4 位或者更多位) | +| YYYY | 年(4 位或者更多位) | +| YYY | 年的后三位 | +| YY | 年的后两位 | +| Y | 年的最后一位 | +| IYYY | ISO 8601 周编号方式的年(4 位或更多位) | +| IYY | ISO 8601 周编号方式的年的最后 3 位 | +| IY | ISO 8601 周编号方式的年的最后 2 位 | +| I | ISO 8601 周编号方式的年的最后一位 | +| BC, bc, AD或者ad | 纪元指示器(不带句号) | +| B.C., b.c., A.D.或者a.d. | 纪元指示器(带句号) | +| MONTH | 全大写形式的月名(空格补齐到 9 字符) | +| Month | 全首字母大写形式的月名(空格补齐到 9 字符) | +| month | 全小写形式的月名(空格补齐到 9 字符) | +| MON | 简写的大写形式的月名(英文 3 字符,本地化长度可变) | +| Mon | 简写的首字母大写形式的月名(英文 3 字符,本地化长度可变) | +| mon | 简写的小写形式的月名(英文 3 字符,本地化长度可变) | +| MM | 月编号(01-12) | +| DAY | 全大写形式的日名(空格补齐到 9 字符) | +| Day | 全首字母大写形式的日名(空格补齐到 9 字符) | +| day | 全小写形式的日名(空格补齐到 9 字符) | +| DY | 简写的大写形式的日名(英语 3 字符,本地化长度可变) | +| Dy | 简写的首字母大写形式的日名(英语 3 字符,本地化长度可变) | +| dy | 简写的小写形式的日名(英语 3 字符,本地化长度可变) | +| DDD | 一年中的日(001-366) | +| IDDD | ISO 8601 周编号方式的年中的日(001-371,年的第 1 日时第一个 ISO 周的周一) | +| DD | 月中的日(01-31) | +| D | 周中的日,周日(1)到周六(7) | +| ID | 周中的 ISO 8601 日,周一(1)到周日(7) | +| W | 月中的周(1-5)(第一周从该月的第一天开始) | +| WW | 年中的周数(1-53)(第一周从该年的第一天开始) | +| IW | ISO 8601 周编号方式的年中的周数(01 - 53;新的一年的第一个周四在第一周) | +| CC | 世纪(2 位数)(21 世纪开始于 2001-01-01) | +| J | 儒略日(从午夜 UTC 的公元前 4714 年 11 月 24 日开始的整数日数) | +| Q | 季度(to_date和to_timestamp会忽略) | +| RM | 大写形式的罗马计数法的月(I-XII;I 是 一月) | +| rm | 小写形式的罗马计数法的月(i-xii;i 是 一月) | +| TZ | 大写形式的时区名称 | +| tz | 小写形式的时区名称 | +| OF | 时区偏移量 | + + +##### fmt1(数字格式的模板模式) +| 模式 | 描述 | +| --- | --- | +| 9 | 带有指定位数的值 | +| 0 | 带前导零的值 | +| . (period) | 小数点 | +| , (comma) | 分组(千)分隔符 | +| PR | 尖括号内的负值 | +| S | 带符号的数字(使用区域) | +| L | 货币符号(使用区域) | +| D | 小数点(使用区域) | +| G | 分组分隔符(使用区域) | +| MI | 在指定位置的负号(如果数字 < 0) | +| PL | 在指定位置的正号(如果数字 > 0) | +| SG | 在指定位置的正/负号 | +| RN | 罗马数字(输入在 1 和 3999 之间) | +| TH or th | 序数后缀 | +| V | 移动指定位数(参阅注解) | +| EEEE | 科学记数的指数 | + + +### NLS_LENGTH_SEMANTICS参数 +#### 概述 +NLS_LENGTH_SEMANTICS 使您能够使用字节或字符长度语义创建 CHAR 和 VARCHAR2 列。 现有列不受影响。 在这种情况下,默认语义是 BYTE。 -```undefined +#### 语法 +``` SET NLS_LENGTH_SEMANTICS TO [NONE | BYTE | CHAR]; ``` -===== **取值范围说明** - -```undefined +##### 取值范围说明 +``` BYTE:数据以字节长度来存储。 CHAR:数据以字符长度来存储。 NONE:数据使用原生PostgreSQL存储方式。 ``` -==== 用例 - -===== --测试“CHAR” - -```undefined +#### 用例 +##### --测试“CHAR” +``` create table test(a varchar2(5)); CREATE TABLE @@ -3148,9 +2898,8 @@ insert into test values ('李老师您好'); INSERT 0 1 ``` -===== --测试“BYTE” - -```undefined +##### --测试“BYTE” +``` SET NLS_LENGTH_SEMANTICS TO BYTE; SET @@ -3166,21 +2915,17 @@ insert into test values ('李老师您好'); ERROR: value too long for type varchar2(5 byte) ``` -=== VARCHAR2(size)类型 - -==== 概述 - +### VARCHAR2(size)类型 +#### 概述 具有最大长度大小字节或字符的可变长度字符串。 您必须为 VARCHAR2 指定大小。 最小大小为 1 个字节或 1 个字符。 -==== 语法 - -```undefined +#### 语法 +``` VARCHAR2(size) ``` -==== 用例 - -```undefined +#### 用例 +``` create table test(a varchar2(5)); CREATE TABLE @@ -3197,15 +2942,13 @@ insert into test values ('李老师您好'); INSERT 0 1 ``` -=== PL/iSQL - +### PL/iSQL PL/iSQL 是 IvorySQL 的过程语言,用于为 IvorySQL 编写自定义函数、过程和包。 PL/iSQL 派生自 PostgreSQL 的 PL/pgsql,并增加了一些功能,但在语法上 PL/iSQL 更接近 Oracle 的 PL/SQL。 本文档描述了 PL/iSQL 程序的基本结构和构造。 -==== PL/iSQL 程序的结构 - +#### PL/iSQL 程序的结构 iSQL 是一种程序化的块结构语言,支持四种不同的 程序类型,即 **PACKAGES**、**PROCEDURES**、**FUNCTIONS** 和 **TRIGGERS**。 iSQL 对每种类型的受支持程序使用相同的块结构。 一个块最多由三个部分组成:声明部分,可执行文件,和异常部分。 而声明和异常部分是可选的。 -```SQL +``` [DECLARE declarations] BEGIN @@ -3218,7 +2961,7 @@ iSQL 是一种程序化的块结构语言,支持四种不同的 程序类型 一个块至少可以由一个可执行部分组成 在 **BEGIN** 和 **END** 关键字中包含一个或多个 iSQL 语句。 -```SQL +``` CREATE OR REPLACE FUNCTION null_func() RETURN VOID AS BEGIN NULL; @@ -3228,7 +2971,7 @@ END; 所有关键字都不区分大小写。 标识符被隐式转换为小写,除非双引号, 就像它们在普通 SQL 命令中一样。 声明部分可用于声明变量和游标,并取决于使用块的上下文, 声明部分可以以关键字 **DECLARE** 开头。 -```SQL +``` CREATE OR REPLACE FUNCTION null_func() RETURN VOID AS DECLARE quantity integer := 30; @@ -3243,7 +2986,7 @@ end; 可选的异常部分也可以包含在 **BEGIN - END** 块中。 异常部分以关键字 **EXCEPTION** 开始,一直持续到它出现的块的末尾。 如果块内的语句抛出异常,程序控制转到异常部分,根据异常和异常部分的内容,可能会或不会处理抛出的异常。 -```SQL +``` CREATE OR REPLACE FUNCTION reraise_test() RETURN void AS BEGIN @@ -3272,11 +3015,10 @@ END; 与 PL/pgSQL 类似,PL/iSQL 使用 **BEGIN/END** 对语句进行分组, 并且不要将它们与用于事务控制的同名 SQL 命令混淆。 PL/iSQL 的 BEGIN/END 仅用于分组; 他们不开始或结束事务 **** -==== **psql** 对 PL/iSQL 程序的支持 - +#### **psql** 对 PL/iSQL 程序的支持 要从 psql 客户端创建 PL/iSQL 程序,您可以使用类似于 PL/pgSQL 的**$$**语法 -```SQL +``` CREATE FUNCTION func() RETURNS void as $$ .. @@ -3285,18 +3027,16 @@ end$$ language plisql; 或者,您可以使用不带 **$$** 的 Oracle 兼容语法的引用和语言规范, 并使用 **/(正斜杠)** 结束程序定义。 /(正斜杠)必须在换行符上 -```SQL +``` CREATE FUNCTION func() RETURN void AS … END; / ``` -==== PL/iSQL 程序语法 - -===== PROCEDURES - -```SQL +#### PL/iSQL 程序语法 +##### PROCEDURES +``` CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_list)] is [DECLARE] @@ -3307,9 +3047,8 @@ END; / ``` -===== FUNCTIONS - -```SQL +##### FUNCTIONS +``` CREATE [OR REPLACE] FUNCTION function_name ([parameter_list]) RETURN return_type AS [DECLARE] @@ -3321,12 +3060,10 @@ END; / ``` -===== PACKAGES - -====== PACKAGE HEADER - -```SQL -CREATE [ OR REPLACE ] PACKAGE [schema.] *package_name* [invoker_rights_clause] [IS | AS] +##### PACKAGES +###### PACKAGE HEADER +``` +CREATE [ OR REPLACE ] PACKAGE [schema.] *package_name* [invoker_rights_clause] [IS | AS] item_list[, item_list ...] END [*package_name*]; @@ -3334,12 +3071,12 @@ END [*package_name*]; invoker_rights_clause: AUTHID [CURRENT_USER | DEFINER] -item_list: +item_list: [ - function_declaration | - procedure_declaration | - type_definition | - cursor_declaration | + function_declaration | + procedure_declaration | + type_definition | + cursor_declaration | item_declaration ] @@ -3382,11 +3119,10 @@ parameter_declaration: parameter_name [IN] datatype [[:= | DEFAULT] expr] ``` -====== PACKAGE BODY - -```SQL +###### PACKAGE BODY +``` CREATE [ OR REPLACE ] PACKAGE BODY [schema.] package_name [IS | AS] - [item_list[, item_list ...]] | + [item_list[, item_list ...]] | item_list_2 [, item_list_2 ...] [initialize_section] END [package_name]; @@ -3395,12 +3131,12 @@ END [package_name]; initialize_section: BEGIN statement[, ...] -item_list: +item_list: [ - function_declaration | - procedure_declaration | - type_definition | - cursor_declaration | + function_declaration | + procedure_declaration | + type_definition | + cursor_declaration | item_declaration ] @@ -3418,7 +3154,7 @@ function_definition: [declare_section] body; procedure_definition: - PROCEDURE procedure_name [(parameter_declaration[, ...])] [IS | AS] + PROCEDURE procedure_name [(parameter_declaration[, ...])] [IS | AS] [declare_section] body; cursor_definition: @@ -3431,11 +3167,9 @@ statement: [<