From 7c8085a2a343ba365b2de1162214b514554188ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cgongsiyi150=E2=80=9D?= <“623965126@qq.comm> Date: Thu, 18 Jun 2020 11:46:27 +0800 Subject: [PATCH 1/2] Add legal notice. --- ...263\225\345\276\213\345\243\260\346\230\216.md" | 14 ++++++++++++++ content/zh/menu/index.md | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 "content/zh/docs/Releasenotes/\346\263\225\345\276\213\345\243\260\346\230\216.md" diff --git "a/content/zh/docs/Releasenotes/\346\263\225\345\276\213\345\243\260\346\230\216.md" "b/content/zh/docs/Releasenotes/\346\263\225\345\276\213\345\243\260\346\230\216.md" new file mode 100644 index 000000000..504c57dd2 --- /dev/null +++ "b/content/zh/docs/Releasenotes/\346\263\225\345\276\213\345\243\260\346\230\216.md" @@ -0,0 +1,14 @@ +# 法律声明 + +**版权所有 © 2020 华为技术有限公司。** + +您对“本文档”的复制、使用、修改及分发受知识共享\(Creative Commons\)署名—相同方式共享4.0国际公共许可协议\(以下简称“CC BY-SA 4.0”\)的约束。为了方便用户理解,您可以通过访问[https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) 了解CC BY-SA 4.0的概要 \(但不是替代\)。CC BY-SA 4.0的完整协议内容您可以访问如下网址获取:[https://creativecommons.org/licenses/by-sa/4.0/legalcode](https://creativecommons.org/licenses/by-sa/4.0/legalcode)。 + +**商标声明** + +openGauss为华为技术有限公司的商标。本文档提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**免责声明** + +本文档仅作为使用指导,除非适用法强制规定或者双方有明确书面约定, 华为技术有限公司对本文档中的所有陈述、信息和建议不做任何明示或默示的声明或保证,包括但不限于不侵权,时效性或满足特定目的的担保。 + diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index 1e3c1d50a..938728490 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -1,6 +1,7 @@ ---- +--- headless: true --- +- [法律声明]({{< relref "./docs/Releasenotes/法律声明.md" >}}) - [产品描述]({{< relref "./docs/Description/Description.md" >}}) - [产品定位]({{< relref "./docs/Description/产品定位.md" >}}) - [系统架构]({{< relref "./docs/Description/系统架构.md" >}}) -- Gitee From ce70450d065462cd76912af23a3441eccbc5b2bb Mon Sep 17 00:00:00 2001 From: gongsiyi150 <“623965126@qq.comm> Date: Wed, 24 Jun 2020 17:43:49 +0800 Subject: [PATCH 2/2] Add legal notice, administrator guide, technical white paper and other documents. --- .../Administratorguide/Administratorguide.md | 4 + .../WAL\346\227\245\345\277\227.md" | 29 + .../zh/docs/Administratorguide/gs_backup.md | 141 ++++ .../docs/Administratorguide/gs_basebackup.md | 125 ++++ content/zh/docs/Administratorguide/gs_dump.md | 561 +++++++++++++++ .../zh/docs/Administratorguide/gs_dumpall.md | 253 +++++++ .../zh/docs/Administratorguide/gs_restore.md | 387 +++++++++++ .../public_sys-resources/icon-caution.gif | Bin .../public_sys-resources/icon-danger.gif | Bin .../public_sys-resources/icon-note.gif | Bin .../public_sys-resources/icon-notice.gif | Bin .../public_sys-resources/icon-tip.gif | Bin .../public_sys-resources/icon-warning.gif | Bin ...13\350\241\214\347\273\264\346\212\244.md" | 23 + ...14\347\273\264\346\212\244\350\241\250.md" | 106 +++ ...15\345\273\272\347\264\242\345\274\225.md" | 64 ++ .../\345\220\257\345\201\234openGauss.md" | 62 ++ ...75\344\270\216\346\201\242\345\244\215.md" | 9 + ...73\345\244\207\345\210\207\346\215\242.md" | 119 ++++ ...41\350\256\241\346\227\245\345\277\227.md" | 6 + ...\345\270\270\345\244\204\347\220\206-1.md" | 363 ++++++++++ ...\345\270\270\345\244\204\347\220\206-3.md" | 124 ++++ ...02\345\270\270\345\244\204\347\220\206.md" | 106 +++ ...47\350\203\275\346\227\245\345\277\227.md" | 22 + ...15\344\275\234\346\227\245\345\277\227.md" | 30 + ...64\346\212\244\345\273\272\350\256\256.md" | 23 + ...45\345\277\227\345\217\202\350\200\203.md" | 15 + ...73\345\236\213\347\256\200\344\273\213.md" | 55 ++ ...44\346\243\200\346\237\245\351\241\271.md" | 170 +++++ ...45\345\272\267\347\212\266\346\200\201.md" | 7 + ...20\350\241\214\346\227\245\345\277\227.md" | 111 +++ ...\346\237\245\345\212\236\346\263\225-0.md" | 350 ++++++++++ ...\346\237\245\345\212\236\346\263\225-2.md" | 40 ++ ...00\346\237\245\345\212\236\346\263\225.md" | 60 ++ ...05\347\220\206\346\227\245\345\277\227.md" | 11 + ...50\350\277\236\346\216\245\346\225\260.md" | 126 ++++ ...73\347\273\237\345\217\202\346\225\260.md" | 7 + ...73\347\273\237\346\227\245\345\277\227.md" | 14 + ...56\345\272\223\346\200\247\350\203\275.md" | 7 + ...64\344\270\200\350\207\264\346\200\247.md" | 46 ++ .../\346\246\202\350\277\260.md" | 103 +++ ...20\350\241\214\346\227\245\345\277\227.md" | 25 + ...07\344\273\275\346\201\242\345\244\215.md" | 5 + ...66\346\200\201\346\237\245\350\257\242.md" | 220 ++++++ ...15\347\275\256\346\226\207\344\273\266.md" | 61 ++ ...73\347\273\237\346\227\245\345\277\227.md" | 25 + ...07\344\273\275\346\201\242\345\244\215.md" | 11 + ...34\344\270\200\350\247\210\350\241\250.md" | 98 +++ .../Compilation.md | 0 content/zh/docs/Compilation/FAQ.md | 11 + .../build-sh\344\273\213\347\273\215.md" | 75 ++ .../figures/\347\273\230\345\233\2761.png" | Bin 0 -> 30588 bytes .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes ...05\345\214\205\347\274\226\350\257\221.md" | 46 ++ ...43\347\240\201\344\270\213\350\275\275.md" | 24 + ...64\346\227\266\346\226\207\344\273\266.md" | 2 +- ...e-executables-\346\212\245\351\224\231.md" | 12 + ...ogram-cclplus-\346\212\245\351\224\231.md" | 12 + ...-of-xxx-bytes-\346\212\245\351\224\231.md" | 12 + ...26\350\257\221\346\236\204\345\273\272.md" | 76 +++ ...26\350\257\221\347\216\257\345\242\203.md" | 0 ...73\347\273\237\350\246\201\346\261\202.md" | 0 .../Compilation/\346\246\202\350\277\260.md" | 4 + ...10\346\234\254\347\274\226\350\257\221.md" | 4 +- ...30\351\207\217\351\205\215\347\275\256.md" | 0 .../Compilation/\347\233\256\347\232\204.md" | 4 + ...54\344\273\266\350\246\201\346\261\202.md" | 0 .../Compilation/\347\256\200\344\273\213.md" | 7 + ...21\345\211\215\345\207\206\345\244\207.md" | 4 + ...35\350\265\226\350\246\201\346\261\202.md" | 27 +- ...11\350\243\205\347\274\226\350\257\221.md" | 55 +- ...57\344\273\266\350\246\201\346\261\202.md" | 0 content/zh/docs/Compilationguide/FAQ.md | 7 - ...05\345\214\205\347\274\226\350\257\221.md" | 41 -- ...43\347\240\201\344\270\213\350\275\275.md" | 19 - ...e-executables-\346\212\245\351\224\231.md" | 12 - ...7\345\255\230\345\274\225\346\223\216.png" | Bin 0 -> 123232 bytes ...1\346\236\266\346\236\204\345\233\276.png" | Bin 20522 -> 37204 bytes ...\241\214\345\274\225\346\223\216(png).png" | Bin 0 -> 12657 bytes ...7\350\241\214\345\274\225\346\223\216.jpg" | Bin 9128 -> 0 bytes ...7\345\255\230\345\274\225\346\223\216.jpg" | Bin 37733 -> 0 bytes ...73\345\244\207\345\217\214\346\234\272.md" | 2 +- ...67\345\220\210\345\274\225\346\223\216.md" | 8 +- ...75\345\222\214\347\211\271\346\200\247.md" | 3 +- ...60\346\215\256\345\210\206\345\214\272.md" | 3 +- .../AI\347\211\271\346\200\247.md" | 6 +- .../docs/Developerguide/ALTER-DATA-SOURCE.md | 16 +- .../zh/docs/Developerguide/ALTER-DATABASE.md | 2 +- .../ALTER-DEFAULT-PRIVILEGES.md | 2 +- .../zh/docs/Developerguide/ALTER-DIRECTORY.md | 2 +- content/zh/docs/Developerguide/ALTER-GROUP.md | 15 +- content/zh/docs/Developerguide/ALTER-INDEX.md | 2 +- content/zh/docs/Developerguide/ALTER-ROLE.md | 4 +- .../ALTER-ROW-LEVEL-SECURITY-POLICY.md | 2 +- .../zh/docs/Developerguide/ALTER-SCHEMA.md | 2 +- .../zh/docs/Developerguide/ALTER-SEQUENCE.md | 2 +- .../zh/docs/Developerguide/ALTER-SESSION.md | 6 +- .../zh/docs/Developerguide/ALTER-SYNONYM.md | 58 ++ .../ALTER-SYSTEM-KILL-SESSION.md | 9 +- .../Developerguide/ALTER-TABLE-PARTITION.md | 4 +- content/zh/docs/Developerguide/ALTER-TABLE.md | 8 +- .../docs/Developerguide/ALTER-TABLESPACE.md | 5 +- .../ALTER-TEXT-SEARCH-CONFIGURATION.md | 6 +- .../ALTER-TEXT-SEARCH-DICTIONARY.md | 2 +- .../zh/docs/Developerguide/ALTER-TRIGGER.md | 2 +- content/zh/docs/Developerguide/ALTER-TYPE.md | 2 +- content/zh/docs/Developerguide/ALTER-USER.md | 6 +- content/zh/docs/Developerguide/ALTER-VIEW.md | 2 +- content/zh/docs/Developerguide/BEGIN.md | 6 +- .../zh/docs/Developerguide/BGWRITER_STAT.md | 95 +++ .../docs/Developerguide/CLASS_VITAL_INFO.md | 47 ++ content/zh/docs/Developerguide/CLOSE.md | 2 +- content/zh/docs/Developerguide/COMMENT.md | 1 - .../zh/docs/Developerguide/COMMIT-PREPARED.md | 9 +- .../zh/docs/Developerguide/CONFIG_SETTINGS.md | 130 ++++ content/zh/docs/Developerguide/COPY.md | 24 +- content/zh/docs/Developerguide/CPU.md | 117 ++++ .../docs/Developerguide/CREATE-DATA-SOURCE.md | 2 +- .../zh/docs/Developerguide/CREATE-DATABASE.md | 6 +- .../docs/Developerguide/CREATE-DIRECTORY.md | 6 +- .../zh/docs/Developerguide/CREATE-FUNCTION.md | 26 +- .../zh/docs/Developerguide/CREATE-GROUP.md | 17 +- .../zh/docs/Developerguide/CREATE-INDEX.md | 9 + .../docs/Developerguide/CREATE-PROCEDURE.md | 2 +- content/zh/docs/Developerguide/CREATE-ROLE.md | 13 +- ...md => CREATE-ROW-LEVEL-SECURITY-POLICY.md} | 4 +- .../zh/docs/Developerguide/CREATE-SCHEMA.md | 2 +- .../zh/docs/Developerguide/CREATE-SEQUENCE.md | 4 +- .../zh/docs/Developerguide/CREATE-SYNONYM.md | 107 +++ .../zh/docs/Developerguide/CREATE-TABLE-AS.md | 5 - .../Developerguide/CREATE-TABLE-PARTITION.md | 16 +- .../zh/docs/Developerguide/CREATE-TABLE.md | 18 +- .../docs/Developerguide/CREATE-TABLESPACE.md | 2 +- .../CREATE-TEXT-SEARCH-CONFIGURATION.md | 2 +- .../CREATE-TEXT-SEARCH-DICTIONARY.md | 8 +- content/zh/docs/Developerguide/CREATE-TYPE.md | 153 +---- content/zh/docs/Developerguide/CREATE-USER.md | 6 +- content/zh/docs/Developerguide/CREATE-VIEW.md | 2 +- content/zh/docs/Developerguide/CURSOR.md | 2 +- content/zh/docs/Developerguide/Cache-IO.md | 61 ++ .../zh/docs/Developerguide/Configuration.md | 7 + ...er\347\261\273\347\256\200\344\273\213.md" | 2 +- .../zh/docs/Developerguide/DBE_PERF-Schema.md | 41 ++ ...25\344\270\200\350\247\210\350\241\250.md" | 10 +- content/zh/docs/Developerguide/DECLARE.md | 2 +- ...25\344\270\200\350\247\210\350\241\250.md" | 8 +- content/zh/docs/Developerguide/DO.md | 2 +- .../docs/Developerguide/DROP-DATA-SOURCE.md | 14 +- .../zh/docs/Developerguide/DROP-DATABASE.md | 3 +- .../zh/docs/Developerguide/DROP-DIRECTORY.md | 6 +- .../zh/docs/Developerguide/DROP-FUNCTION.md | 8 +- content/zh/docs/Developerguide/DROP-GROUP.md | 2 +- content/zh/docs/Developerguide/DROP-INDEX.md | 2 +- content/zh/docs/Developerguide/DROP-OWNED.md | 2 +- content/zh/docs/Developerguide/DROP-ROLE.md | 2 +- .../DROP-ROW-LEVEL-SECURITY-POLICY.md | 2 +- content/zh/docs/Developerguide/DROP-SCHEMA.md | 2 +- .../zh/docs/Developerguide/DROP-SEQUENCE.md | 2 +- .../zh/docs/Developerguide/DROP-SYNONYM.md | 39 ++ .../zh/docs/Developerguide/DROP-TABLESPACE.md | 2 +- .../DROP-TEXT-SEARCH-CONFIGURATION.md | 2 +- .../DROP-TEXT-SEARCH-DICTIONARY.md | 2 +- .../zh/docs/Developerguide/DROP-TRIGGER.md | 4 +- content/zh/docs/Developerguide/DROP-TYPE.md | 2 +- content/zh/docs/Developerguide/DROP-USER.md | 1 - content/zh/docs/Developerguide/DROP-VIEW.md | 2 +- content/zh/docs/Developerguide/FETCH.md | 6 +- content/zh/docs/Developerguide/FILE_IOSTAT.md | 109 +++ .../docs/Developerguide/FILE_REDO_IOSTAT.md | 67 ++ content/zh/docs/Developerguide/File.md | 21 + .../Developerguide/GET_GTM_LITE_STATUS.md | 32 - .../Developerguide/GLOBAL_BGWRITER_STAT.md | 102 +++ .../docs/Developerguide/GLOBAL_CKPT_STATUS.md | 67 ++ .../Developerguide/GLOBAL_CONFIG_SETTINGS.md | 137 ++++ .../GLOBAL_DOUBLE_WRITE_STATUS.md | 95 +++ .../docs/Developerguide/GLOBAL_FILE_IOSTAT.md | 116 ++++ .../Developerguide/GLOBAL_FILE_REDO_IOSTAT.md | 74 ++ .../Developerguide/GLOBAL_INSTANCE_TIME.md | 46 ++ .../zh/docs/Developerguide/GLOBAL_LOCKS.md | 131 ++++ .../GLOBAL_MEMORY_NODE_DETAIL.md | 40 ++ .../Developerguide/GLOBAL_OPERATOR_HISTORY.md | 173 +++++ .../GLOBAL_OPERATOR_HISTORY_TABLE.md | 4 + .../Developerguide/GLOBAL_OPERATOR_RUNTIME.md | 180 +++++ .../docs/Developerguide/GLOBAL_OS_RUNTIME.md | 60 ++ .../docs/Developerguide/GLOBAL_OS_THREADS.md | 53 ++ .../GLOBAL_PAGEWRITER_STATUS.md | 74 ++ .../GLOBAL_RECORD_RESET_TIME.md | 32 + .../Developerguide/GLOBAL_RECOVERY_STATUS.md | 81 +++ .../docs/Developerguide/GLOBAL_REDO_STATUS.md | 179 +++++ .../docs/Developerguide/GLOBAL_REL_IOSTAT.md | 53 ++ .../GLOBAL_REPLICATION_SLOTS.md | 95 +++ .../Developerguide/GLOBAL_REPLICATION_STAT.md | 131 ++++ .../Developerguide/GLOBAL_SESSION_MEMORY.md | 53 ++ .../GLOBAL_SESSION_MEMORY_DETAIL.md | 81 +++ .../Developerguide/GLOBAL_SESSION_STAT.md | 60 ++ .../GLOBAL_SESSION_STAT_ACTIVITY.md | 171 +++++ .../Developerguide/GLOBAL_SESSION_TIME.md | 53 ++ .../GLOBAL_SHARED_MEMORY_DETAIL.md | 67 ++ .../GLOBAL_STATEMENT_COMPLEX_HISTORY.md | 496 ++++++++++++++ .../GLOBAL_STATEMENT_COMPLEX_HISTORY_TABLE.md | 4 + .../GLOBAL_STATEMENT_COMPLEX_RUNTIME.md | 356 ++++++++++ .../Developerguide/GLOBAL_STATEMENT_COUNT.md | 200 ++++++ .../GLOBAL_STATIO_ALL_INDEXES.md | 74 ++ .../GLOBAL_STATIO_ALL_SEQUENCES.md | 60 ++ .../GLOBAL_STATIO_ALL_TABLES.md | 102 +++ .../GLOBAL_STATIO_SYS_INDEXES.md | 74 ++ .../GLOBAL_STATIO_SYS_SEQUENCES.md | 60 ++ .../GLOBAL_STATIO_SYS_TABLES.md | 102 +++ .../GLOBAL_STATIO_USER_INDEXES.md | 74 ++ .../GLOBAL_STATIO_USER_SEQUENCES.md | 60 ++ .../GLOBAL_STATIO_USER_TABLES.md | 102 +++ .../Developerguide/GLOBAL_STAT_ALL_INDEXES.md | 81 +++ .../Developerguide/GLOBAL_STAT_ALL_TABLES.md | 172 +++++ .../Developerguide/GLOBAL_STAT_BAD_BLOCK.md | 74 ++ .../Developerguide/GLOBAL_STAT_DATABASE.md | 158 +++++ .../GLOBAL_STAT_DATABASE_CONFLICTS.md | 74 ++ .../docs/Developerguide/GLOBAL_STAT_DB_CU.md | 53 ++ .../Developerguide/GLOBAL_STAT_SESSION_CU.md | 39 ++ .../Developerguide/GLOBAL_STAT_SYS_INDEXES.md | 81 +++ .../Developerguide/GLOBAL_STAT_SYS_TABLES.md | 172 +++++ .../GLOBAL_STAT_USER_FUNCTIONS.md | 67 ++ .../GLOBAL_STAT_USER_INDEXES.md | 81 +++ .../Developerguide/GLOBAL_STAT_USER_TABLES.md | 172 +++++ .../GLOBAL_STAT_XACT_ALL_TABLES.md | 102 +++ .../GLOBAL_STAT_XACT_SYS_TABLES.md | 102 +++ .../GLOBAL_STAT_XACT_USER_FUNCTIONS.md | 67 ++ .../GLOBAL_STAT_XACT_USER_TABLES.md | 102 +++ .../GLOBAL_THREADPOOL_STATUS.md | 4 + .../GLOBAL_THREAD_WAIT_STATUS.md | 106 +++ .../GLOBAL_TRANSACTIONS_PREPARED_XACTS.md | 53 ++ .../docs/Developerguide/GLOBAL_WAIT_EVENTS.md | 81 +++ .../GLOBAL_WORKLOAD_TRANSACTION.md | 116 ++++ .../GOTO\350\257\255\345\217\245.md" | 128 ++++ content/zh/docs/Developerguide/GRANT.md | 19 +- .../zh/docs/Developerguide/GS_OPT_MODEL.md | 255 ++++--- .../GS_SESSION_CPU_STATISTICS.md | 8 +- .../GS_SESSION_MEMORY_CONTEXT.md | 76 --- .../GS_SESSION_MEMORY_STATISTICS.md | 14 +- .../zh/docs/Developerguide/GS_STAT_DB_CU.md | 2 +- .../docs/Developerguide/GS_STAT_SESSION_CU.md | 2 +- ..._CONTEXT.md => GS_THREAD_MEMORY_DETAIL.md} | 6 +- .../Developerguide/GS_TOTAL_MEMORY_DETAIL.md | 2 +- .../Developerguide/GS_WLM_INSTANCE_HISTORY.md | 14 +- .../Developerguide/GS_WLM_OPERATOR_HISTORY.md | 4 +- .../Developerguide/GS_WLM_OPERATOR_INFO.md | 12 +- .../GS_WLM_OPERATOR_STATISTICS.md | 22 +- .../GS_WLM_PLAN_ENCODING_TABLE.md | 33 +- .../GS_WLM_PLAN_OPERATOR_HISTORY.md | 2 +- .../GS_WLM_PLAN_OPERATOR_INFO.md | 80 +-- .../Developerguide/GS_WLM_RESOURCE_POOL.md | 2 +- .../Developerguide/GS_WLM_SESSION_HISTORY.md | 52 +- .../GS_WLM_SESSION_QUERY_INFO_ALL.md | 154 +---- .../GS_WLM_SESSION_STATISTICS.md | 42 +- ...02\346\225\260\350\257\264\346\230\216.md" | 6 +- ...01\345\217\212\345\221\212\350\255\246.md" | 63 ++ content/zh/docs/Developerguide/I-O.md | 76 +++ content/zh/docs/Developerguide/INSERT.md | 8 +- .../zh/docs/Developerguide/INSTANCE_TIME.md | 50 ++ content/zh/docs/Developerguide/Instance.md | 7 + .../Ispell\350\257\215\345\205\270.md" | 4 +- ...14\347\216\257\345\242\203\347\261\273.md" | 65 ++ ...45\345\217\243\345\217\202\350\200\203.md" | 4 + .../JSON\345\207\275\346\225\260.md" | 2 +- .../JSON\347\261\273\345\236\213.md" | 2 +- ...46\226\271\345\274\217\347\232\204Hint.md" | 35 + ...51\241\272\345\272\217\347\232\204Hint.md" | 62 ++ ...77\347\224\250\345\273\272\350\256\256.md" | 12 + ...57\344\270\216\351\231\220\345\210\266.md" | 35 + .../docs/Developerguide/LOCAL_REL_IOSTAT.md | 46 ++ .../Developerguide/LOCAL_THREADPOOL_STATUS.md | 69 ++ content/zh/docs/Developerguide/LOCK.md | 305 +-------- content/zh/docs/Developerguide/LOCKS.md | 138 ++++ ...56\346\225\260\346\215\256\346\272\220.md" | 446 ++++++++++++ .../docs/Developerguide/MEMORY_NODE_DETAIL.md | 40 ++ content/zh/docs/Developerguide/MERGE-INTO.md | 2 +- content/zh/docs/Developerguide/MOVE.md | 4 +- content/zh/docs/Developerguide/Memory.md | 11 + content/zh/docs/Developerguide/ODBC.md | 2 +- ...14\345\244\264\346\226\207\344\273\266.md" | 6 + ...45\345\217\243\345\217\202\350\200\203.md" | 4 + .../docs/Developerguide/OPERATOR_HISTORY.md | 4 + .../Developerguide/OPERATOR_HISTORY_TABLE.md | 173 +++++ .../docs/Developerguide/OPERATOR_RUNTIME.md | 180 +++++ content/zh/docs/Developerguide/OS.md | 11 + content/zh/docs/Developerguide/OS_RUNTIME.md | 53 ++ content/zh/docs/Developerguide/OS_THREADS.md | 53 ++ content/zh/docs/Developerguide/Object.md | 87 +++ content/zh/docs/Developerguide/Operator.md | 15 + .../zh/docs/Developerguide/PG_AGGREGATE.md | 4 +- content/zh/docs/Developerguide/PG_AM.md | 4 +- content/zh/docs/Developerguide/PG_AMOP.md | 12 +- content/zh/docs/Developerguide/PG_AMPROC.md | 6 +- content/zh/docs/Developerguide/PG_AUTHID.md | 2 +- .../zh/docs/Developerguide/PG_COLLATION.md | 2 +- .../zh/docs/Developerguide/PG_CONSTRAINT.md | 23 +- .../zh/docs/Developerguide/PG_CONVERSION.md | 2 +- content/zh/docs/Developerguide/PG_DEPEND.md | 4 +- .../zh/docs/Developerguide/PG_DESCRIPTION.md | 4 +- content/zh/docs/Developerguide/PG_ENUM.md | 2 +- .../zh/docs/Developerguide/PG_EXT_STATS.md | 6 +- .../docs/Developerguide/PG_FOREIGN_SERVER.md | 2 +- content/zh/docs/Developerguide/PG_INDEXES.md | 4 +- content/zh/docs/Developerguide/PG_JOB_PROC.md | 4 +- .../zh/docs/Developerguide/PG_LARGEOBJECT.md | 2 +- content/zh/docs/Developerguide/PG_LOCKS.md | 2 +- .../zh/docs/Developerguide/PG_NAMESPACE.md | 4 +- content/zh/docs/Developerguide/PG_OBJECT.md | 2 +- content/zh/docs/Developerguide/PG_OPCLASS.md | 10 +- content/zh/docs/Developerguide/PG_OPERATOR.md | 12 +- content/zh/docs/Developerguide/PG_OPFAMILY.md | 6 +- .../docs/Developerguide/PG_PREPARED_XACTS.md | 2 +- content/zh/docs/Developerguide/PG_PROC.md | 4 +- content/zh/docs/Developerguide/PG_RANGE.md | 10 +- .../docs/Developerguide/PG_RESOURCE_POOL.md | 2 +- content/zh/docs/Developerguide/PG_ROLES.md | 4 +- .../docs/Developerguide/PG_RUNNING_XACTS.md | 88 --- content/zh/docs/Developerguide/PG_SECLABEL.md | 2 +- .../zh/docs/Developerguide/PG_SECLABELS.md | 6 +- .../docs/Developerguide/PG_SESSION_IOSTAT.md | 4 +- .../docs/Developerguide/PG_SESSION_WLMSTAT.md | 4 +- content/zh/docs/Developerguide/PG_SHADOW.md | 2 +- content/zh/docs/Developerguide/PG_SHDEPEND.md | 6 +- .../zh/docs/Developerguide/PG_SHSECLABEL.md | 6 +- .../Developerguide/PG_STATIO_ALL_TABLES.md | 10 +- .../Developerguide/PG_STATIO_SYS_TABLES.md | 10 +- .../Developerguide/PG_STATIO_USER_TABLES.md | 10 +- .../zh/docs/Developerguide/PG_STATISTIC.md | 2 +- .../docs/Developerguide/PG_STATISTIC_EXT.md | 2 +- content/zh/docs/Developerguide/PG_STATS.md | 4 +- .../docs/Developerguide/PG_STAT_ACTIVITY.md | 2 +- .../Developerguide/PG_STAT_ALL_INDEXES.md | 2 +- .../docs/Developerguide/PG_STAT_ALL_TABLES.md | 14 +- .../docs/Developerguide/PG_STAT_DATABASE.md | 2 +- .../Developerguide/PG_STAT_SYS_INDEXES.md | 2 +- .../docs/Developerguide/PG_STAT_SYS_TABLES.md | 8 +- .../Developerguide/PG_STAT_USER_INDEXES.md | 2 +- .../Developerguide/PG_STAT_USER_TABLES.md | 8 +- .../Developerguide/PG_STAT_XACT_ALL_TABLES.md | 6 +- .../Developerguide/PG_STAT_XACT_SYS_TABLES.md | 6 +- .../PG_STAT_XACT_USER_TABLES.md | 6 +- content/zh/docs/Developerguide/PG_TABLES.md | 4 +- content/zh/docs/Developerguide/PG_TDE_INFO.md | 2 +- .../Developerguide/PG_THREAD_WAIT_STATUS.md | 415 +++++++++--- .../Developerguide/PG_TOTAL_MEMORY_DETAIL.md | 39 -- .../PG_TOTAL_USER_RESOURCE_INFO.md | 24 +- .../PG_TOTAL_USER_RESOURCE_INFO_OID.md | 2 +- .../zh/docs/Developerguide/PG_TS_CONFIG.md | 6 +- .../docs/Developerguide/PG_TS_CONFIG_MAP.md | 6 +- content/zh/docs/Developerguide/PG_TS_DICT.md | 4 +- .../zh/docs/Developerguide/PG_TS_PARSER.md | 4 +- .../zh/docs/Developerguide/PG_TS_TEMPLATE.md | 2 +- content/zh/docs/Developerguide/PG_TYPE.md | 3 +- content/zh/docs/Developerguide/PG_USER.md | 4 +- .../zh/docs/Developerguide/PG_USER_MAPPING.md | 4 +- .../docs/Developerguide/PG_USER_MAPPINGS.md | 8 +- content/zh/docs/Developerguide/PG_VIEWS.md | 2 +- .../docs/Developerguide/PG_WLM_STATISTICS.md | 2 +- ...55\350\250\200\345\207\275\346\225\260.md" | 20 + content/zh/docs/Developerguide/PQcancel.md | 2 +- content/zh/docs/Developerguide/PQclear.md | 2 +- content/zh/docs/Developerguide/PQconnectdb.md | 4 +- .../docs/Developerguide/PQconnectdbParams.md | 2 +- .../zh/docs/Developerguide/PQerrorMessage.md | 2 +- content/zh/docs/Developerguide/PQexec.md | 2 +- .../zh/docs/Developerguide/PQexecParams.md | 5 + .../docs/Developerguide/PQexecParamsBatch.md | 5 + content/zh/docs/Developerguide/PQfinish.md | 2 +- content/zh/docs/Developerguide/PQflush.md | 2 +- content/zh/docs/Developerguide/PQfname.md | 2 +- .../zh/docs/Developerguide/PQfreeCancel.md | 2 +- content/zh/docs/Developerguide/PQgetCancel.md | 2 +- content/zh/docs/Developerguide/PQgetvalue.md | 2 +- content/zh/docs/Developerguide/PQnfields.md | 2 +- content/zh/docs/Developerguide/PQntuples.md | 2 +- content/zh/docs/Developerguide/PQprepare.md | 4 +- content/zh/docs/Developerguide/PQreset.md | 2 +- .../zh/docs/Developerguide/PQresultStatus.md | 4 +- .../zh/docs/Developerguide/PQsendPrepare.md | 4 +- content/zh/docs/Developerguide/PQsendQuery.md | 2 +- .../docs/Developerguide/PQsendQueryParams.md | 4 +- .../Developerguide/PQsendQueryPrepared.md | 6 +- .../zh/docs/Developerguide/PQsetdbLogin.md | 12 +- content/zh/docs/Developerguide/PQstatus.md | 2 +- .../Developerguide/PREPARE-TRANSACTION.md | 4 +- content/zh/docs/Developerguide/PREPARE.md | 4 +- ...03\344\274\230\346\246\202\350\277\260.md" | 260 +++++++ .../zh/docs/Developerguide/Predictor.md | 8 +- content/zh/docs/Developerguide/Query-22.md | 74 ++ content/zh/docs/Developerguide/Query.md | 73 +- ...47\350\241\214\346\265\201\347\250\213.md" | 75 ++ .../docs/Developerguide/RELEASE-SAVEPOINT.md | 2 +- .../docs/Developerguide/REPLICATION_SLOTS.md | 88 +++ .../docs/Developerguide/REPLICATION_STAT.md | 123 ++++ .../RETURN-NEXT\345\217\212RETURN-QUERY.md" | 64 ++ content/zh/docs/Developerguide/RETURN.md | 17 + .../docs/Developerguide/ROLLBACK-PREPARED.md | 2 +- .../Developerguide/ROLLBACK-TO-SAVEPOINT.md | 2 +- content/zh/docs/Developerguide/ROLLBACK.md | 2 +- .../Retry\347\256\241\347\220\206.md" | 21 + content/zh/docs/Developerguide/SAVEPOINT.md | 2 +- .../SEQUENCE\345\207\275\346\225\260.md" | 16 +- .../Developerguide/SESSION_CPU_RUNTIME.md | 88 +++ .../zh/docs/Developerguide/SESSION_MEMORY.md | 46 ++ .../Developerguide/SESSION_MEMORY_DETAIL.md | 74 ++ .../Developerguide/SESSION_MEMORY_RUNTIME.md | 89 +++ .../zh/docs/Developerguide/SESSION_STAT.md | 53 ++ .../Developerguide/SESSION_STAT_ACTIVITY.md | 164 +++++ .../zh/docs/Developerguide/SESSION_TIME.md | 46 ++ .../zh/docs/Developerguide/SET-CONSTRAINTS.md | 2 +- .../SET-SESSION-AUTHORIZATION.md | 2 +- .../zh/docs/Developerguide/SET-TRANSACTION.md | 7 +- .../Developerguide/SHARED_MEMORY_DETAIL.md | 60 ++ .../docs/Developerguide/SNAPSHOT-SNAPSHOT.md | 47 ++ .../SNAPSHOT-TABLES_SNAP_TIMESTAMP.md | 65 ++ .../zh/docs/Developerguide/SQLAllocConnect.md | 2 +- content/zh/docs/Developerguide/SQLAllocEnv.md | 2 +- .../zh/docs/Developerguide/SQLAllocHandle.md | 4 +- .../zh/docs/Developerguide/SQLAllocStmt.md | 2 +- content/zh/docs/Developerguide/SQLBindCol.md | 8 +- .../docs/Developerguide/SQLBindParameter.md | 10 +- .../zh/docs/Developerguide/SQLColAttribute.md | 6 +- content/zh/docs/Developerguide/SQLConnect.md | 4 +- .../zh/docs/Developerguide/SQLDisconnect.md | 4 +- .../zh/docs/Developerguide/SQLExecDirect.md | 4 +- content/zh/docs/Developerguide/SQLExecute.md | 4 +- content/zh/docs/Developerguide/SQLFetch.md | 4 +- .../zh/docs/Developerguide/SQLFreeConnect.md | 2 +- content/zh/docs/Developerguide/SQLFreeEnv.md | 2 +- .../zh/docs/Developerguide/SQLFreeHandle.md | 2 +- content/zh/docs/Developerguide/SQLFreeStmt.md | 2 +- content/zh/docs/Developerguide/SQLGetData.md | 4 +- .../zh/docs/Developerguide/SQLGetDiagRec.md | 2 +- content/zh/docs/Developerguide/SQLPrepare.md | 4 +- .../docs/Developerguide/SQLSetConnectAttr.md | 4 +- .../zh/docs/Developerguide/SQLSetEnvAttr.md | 4 +- .../zh/docs/Developerguide/SQLSetStmtAttr.md | 4 +- .../SQL\345\217\202\350\200\203.md" | 2 +- ...41\345\210\222\344\273\213\347\273\215.md" | 7 + ...41\345\210\222\346\246\202\350\277\260.md" | 27 + ...QL\350\207\252\350\257\212\346\226\255.md" | 54 ++ .../SQL\350\257\255\346\263\225.md" | 8 +- ...02\346\225\260\350\260\203\346\225\264.md" | 74 ++ ...03\344\274\230\346\214\207\345\215\227.md" | 25 + ...\344\271\246\347\256\241\347\220\206-6.md" | 9 - ...01\344\271\246\347\256\241\347\220\206.md" | 2 +- .../docs/Developerguide/START-TRANSACTION.md | 7 +- content/zh/docs/Developerguide/STATEMENT.md | 228 +++++++ .../STATEMENT_COMPLEX_HISTORY.md | 4 + .../STATEMENT_COMPLEX_HISTORY_TABLE.md | 4 + .../STATEMENT_COMPLEX_RUNTIME.md | 356 ++++++++++ .../zh/docs/Developerguide/STATEMENT_COUNT.md | 203 ++++++ .../STATEMENT_IOSTAT_COMPLEX_RUNTIME.md | 81 +++ .../STATEMENT_RESPONSETIME_PERCENTILE.md | 32 + .../STATEMENT_USER_COMPLEX_HISTORY.md | 4 + .../STATEMENT_WLMSTAT_COMPLEX_RUNTIME.md | 181 +++++ .../docs/Developerguide/STATIO_ALL_INDEXES.md | 67 ++ .../Developerguide/STATIO_ALL_SEQUENCES.md | 53 ++ .../docs/Developerguide/STATIO_ALL_TABLES.md | 95 +++ .../docs/Developerguide/STATIO_SYS_INDEXES.md | 67 ++ .../Developerguide/STATIO_SYS_SEQUENCES.md | 53 ++ .../docs/Developerguide/STATIO_SYS_TABLES.md | 95 +++ .../Developerguide/STATIO_USER_INDEXES.md | 67 ++ .../Developerguide/STATIO_USER_SEQUENCES.md | 53 ++ .../docs/Developerguide/STATIO_USER_TABLES.md | 95 +++ .../docs/Developerguide/STAT_ALL_INDEXES.md | 74 ++ .../zh/docs/Developerguide/STAT_ALL_TABLES.md | 165 +++++ .../zh/docs/Developerguide/STAT_BAD_BLOCK.md | 81 +++ .../zh/docs/Developerguide/STAT_DATABASE.md | 151 +++++ .../Developerguide/STAT_DATABASE_CONFLICTS.md | 67 ++ .../docs/Developerguide/STAT_SYS_INDEXES.md | 74 ++ .../zh/docs/Developerguide/STAT_SYS_TABLES.md | 165 +++++ .../Developerguide/STAT_USER_FUNCTIONS.md | 60 ++ .../docs/Developerguide/STAT_USER_INDEXES.md | 74 ++ .../docs/Developerguide/STAT_USER_TABLES.md | 165 +++++ .../Developerguide/STAT_XACT_ALL_TABLES.md | 95 +++ .../Developerguide/STAT_XACT_SYS_TABLES.md | 95 +++ .../STAT_XACT_USER_FUNCTIONS.md | 60 ++ .../Developerguide/STAT_XACT_USER_TABLES.md | 95 +++ .../Developerguide/SUMMARY_FILE_IOSTAT.md | 109 +++ .../SUMMARY_FILE_REDO_IOSTAT.md | 67 ++ .../docs/Developerguide/SUMMARY_REL_IOSTAT.md | 46 ++ .../docs/Developerguide/SUMMARY_STATEMENT.md | 228 +++++++ .../Developerguide/SUMMARY_STATEMENT_COUNT.md | 193 ++++++ .../SUMMARY_STATIO_ALL_INDEXES.md | 53 ++ .../SUMMARY_STATIO_ALL_SEQUENCES.md | 46 ++ .../SUMMARY_STATIO_ALL_TABLES.md | 88 +++ .../SUMMARY_STATIO_SYS_INDEXES.md | 53 ++ .../SUMMARY_STATIO_SYS_SEQUENCES.md | 46 ++ .../SUMMARY_STATIO_SYS_TABLES.md | 88 +++ .../SUMMARY_STATIO_USER_INDEXES.md | 53 ++ .../SUMMARY_STATIO_USER_SEQUENCES.md | 46 ++ .../SUMMARY_STATIO_USER_TABLES.md | 88 +++ .../SUMMARY_STAT_ALL_INDEXES.md | 60 ++ .../Developerguide/SUMMARY_STAT_ALL_TABLES.md | 158 +++++ .../Developerguide/SUMMARY_STAT_BAD_BLOCK.md | 67 ++ .../Developerguide/SUMMARY_STAT_DATABASE.md | 144 ++++ .../SUMMARY_STAT_DATABASE_CONFLICTS.md | 60 ++ .../SUMMARY_STAT_SYS_INDEXES.md | 60 ++ .../Developerguide/SUMMARY_STAT_SYS_TABLES.md | 158 +++++ .../SUMMARY_STAT_USER_FUNCTIONS.md | 53 ++ .../SUMMARY_STAT_USER_INDEXES.md | 60 ++ .../SUMMARY_STAT_USER_TABLES.md | 158 +++++ .../SUMMARY_STAT_XACT_ALL_TABLES.md | 88 +++ .../SUMMARY_STAT_XACT_SYS_TABLES.md | 88 +++ .../SUMMARY_STAT_XACT_USER_FUNCTIONS.md | 53 ++ .../SUMMARY_STAT_XACT_USER_TABLES.md | 88 +++ .../SUMMARY_TRANSACTIONS_PREPARED_XACTS.md | 53 ++ .../docs/Developerguide/SUMMARY_USER_LOGIN.md | 53 ++ .../SUMMARY_WORKLOAD_SQL_COUNT.md | 81 +++ .../SUMMARY_WORKLOAD_SQL_ELAPSE_TIME.md | 144 ++++ .../SUMMARY_WORKLOAD_TRANSACTION.md | 109 +++ ...46\226\271\345\274\217\347\232\204Hint.md" | 42 ++ content/zh/docs/Developerguide/Schema.md | 10 +- .../zh/docs/Developerguide/Session-Thread.md | 37 + .../Simple\350\257\215\345\205\270.md" | 2 +- .../Snowball\350\257\215\345\205\270.md" | 4 +- .../Sqldiag.md | 12 +- .../Synonym\350\257\215\345\205\270.md" | 6 +- .../docs/Developerguide/THREAD_WAIT_STATUS.md | 102 +++ ...17\347\232\204\351\227\256\351\242\230.md" | 14 + .../TRANSACTIONS_PREPARED_XACTS.md | 53 ++ content/zh/docs/Developerguide/TRUNCATE.md | 4 +- .../Thesaurus\350\257\215\345\205\270.md" | 2 +- content/zh/docs/Developerguide/Transaction.md | 9 + content/zh/docs/Developerguide/UPDATE.md | 1 - content/zh/docs/Developerguide/USER_LOGIN.md | 53 ++ content/zh/docs/Developerguide/Utility.md | 33 + content/zh/docs/Developerguide/VACUUM.md | 1 + content/zh/docs/Developerguide/WAIT_EVENTS.md | 81 +++ .../Developerguide/WDR-Snapshot-Schema.md | 11 + ...37\344\277\241\346\201\257\350\241\250.md" | 7 + ...t-\346\225\260\346\215\256\350\241\250.md" | 6 + .../WLM_USER_RESOURCE_CONFIG.md | 88 +++ .../WLM_USER_RESOURCE_RUNTIME.md | 95 +++ .../docs/Developerguide/WORKLOAD_SQL_COUNT.md | 74 ++ .../WORKLOAD_SQL_ELAPSE_TIME.md | 137 ++++ .../Developerguide/WORKLOAD_TRANSACTION.md | 109 +++ content/zh/docs/Developerguide/Wait-Events.md | 7 + .../docs/Developerguide/Workload-Manager.md | 7 + content/zh/docs/Developerguide/Workload.md | 17 + content/zh/docs/Developerguide/X-Tuner.md | 13 + ...\350\260\203\346\225\2641\357\274\211.png" | Bin 0 -> 76589 bytes ...\350\260\203\346\225\2642\357\274\211.png" | Bin 0 -> 83041 bytes ...47\244\272\344\276\2133-1\357\274\211.png" | Bin 0 -> 64246 bytes ...\347\244\272\344\276\2133\357\274\211.png" | Bin 0 -> 65673 bytes ...XECUTE-IMMEDIATE-dynamic_select_clause.png | Bin 0 -> 5564 bytes .../Developerguide/figures/FOR_AS_loop.png | Bin 0 -> 3924 bytes .../docs/Developerguide/figures/IF_THEN.jpg | Bin 0 -> 7459 bytes .../Developerguide/figures/IF_THEN_ELSE.jpg | Bin 0 -> 9206 bytes .../figures/IF_THEN_ELSIF_ELSE.png | Bin 0 -> 5987 bytes ...7\347\232\204\346\265\201\347\250\213.png" | Bin 0 -> 8359 bytes ...3\347\273\237\346\234\272\346\236\204.png" | Bin 0 -> 18351 bytes ...5\347\232\204\346\265\201\347\250\213.png" | Bin 0 -> 24378 bytes ...1\345\210\222\347\244\272\344\276\213.png" | Bin 0 -> 15359 bytes .../figures/anonymous_block.png | Bin 0 -> 3905 bytes .../figures/assignment_value.png | Bin 0 -> 1525 bytes .../figures/call_anonymous_block.png | Bin 0 -> 8713 bytes .../Developerguide/figures/call_clause.png | Bin 0 -> 3274 bytes .../Developerguide/figures/call_procedure.png | Bin 0 -> 5805 bytes .../docs/Developerguide/figures/case_when.png | Bin 0 -> 7223 bytes .../Developerguide/figures/close_cursor.jpg | Bin 0 -> 3457 bytes .../figures/cursor_typename.png | Bin 0 -> 2365 bytes .../figures/declare_variable.png | Bin 0 -> 2823 bytes .../figures/dynamic_cursor_define.png | Bin 0 -> 1502 bytes .../Developerguide/figures/fetch_cursor.png | Bin 0 -> 3142 bytes .../docs/Developerguide/figures/for_loop.png | Bin 0 -> 5430 bytes .../Developerguide/figures/for_loop_query.png | Bin 0 -> 3913 bytes .../zh/docs/Developerguide/figures/forall.png | Bin 0 -> 3745 bytes .../zh/docs/Developerguide/figures/loop.png | Bin 0 -> 2180 bytes .../docs/Developerguide/figures/noselect.png | Bin 0 -> 3258 bytes ...3\344\274\230\346\265\201\347\250\213.png" | Bin 0 -> 27594 bytes .../figures/open_dynamic_cursor.png | Bin 0 -> 4313 bytes .../docs/Developerguide/figures/open_for.png | Bin 0 -> 3940 bytes .../figures/open_static_cursor.png | Bin 0 -> 3070 bytes .../zh/docs/Developerguide/figures/raise.png | Bin 0 -> 927 bytes .../figures/raise_condition.png | Bin 0 -> 4070 bytes .../Developerguide/figures/raise_format.png | Bin 0 -> 5233 bytes .../Developerguide/figures/raise_option.png | Bin 0 -> 3000 bytes .../Developerguide/figures/raise_sqlstate.png | Bin 0 -> 4553 bytes ...3\347\232\204\350\257\255\346\263\225.png" | Bin 0 -> 20418 bytes .../Developerguide/figures/return_clause.jpg | Bin 0 -> 2263 bytes .../figures/static_cursor_define.jpg | Bin 0 -> 11369 bytes .../Developerguide/figures/using_clause-0.png | Bin 0 -> 2437 bytes .../Developerguide/figures/using_clause-1.png | Bin 0 -> 4831 bytes .../Developerguide/figures/using_clause-2.png | Bin 0 -> 4831 bytes .../Developerguide/figures/using_clause.png | Bin 0 -> 3702 bytes .../Developerguide/figures/when_clause.png | Bin 0 -> 2805 bytes .../Developerguide/figures/while_loop.png | Bin 0 -> 3453 bytes .../figures/zh-cn_image_0118861065.jpg | Bin 0 -> 66854 bytes .../figures/zh-cn_image_0246254080.png | Bin 0 -> 38952 bytes .../figures/zh-cn_image_0246254081.png | Bin 0 -> 35366 bytes .../figures/zh-cn_image_0246254082.png | Bin 0 -> 27239 bytes .../figures/zh-cn_image_0252660975.png | Bin 0 -> 52545 bytes .../figures/zh-cn_image_0252663634.png | Bin 0 -> 15359 bytes .../figures/zh-cn_image_0253028833.png | Bin 0 -> 77804 bytes .../figures/zh-cn_image_0253030479.png | Bin 0 -> 77957 bytes .../figures/zh-cn_image_0253032870.png | Bin 0 -> 79715 bytes .../figures/zh-cn_image_0253036670.png | Bin 0 -> 77939 bytes .../figures/zh-cn_image_0253037239.png | Bin 0 -> 75433 bytes .../figures/zh-cn_image_0253038757.png | Bin 0 -> 15090 bytes .../figures/zh-cn_image_0253082069.png} | Bin .../figures/zh-cn_image_0253403489.png | Bin 0 -> 2587 bytes .../figures/zh-cn_image_0253403490.png | Bin 0 -> 2406 bytes .../figures/zh-cn_image_0253404022.png | Bin 0 -> 2002 bytes .../figures/zh-cn_image_0253404023.png | Bin 0 -> 1908 bytes ...7\347\232\204\346\265\201\347\250\213.png" | Bin 0 -> 6809 bytes .../java-sql-PreparedStatement.md | 7 - content/zh/docs/Developerguide/libpq.md | 2 +- .../openGauss\344\272\213\345\212\241.md" | 5 +- content/zh/docs/Developerguide/record.md | 114 ++++ ...11\346\235\203\345\210\206\347\253\213.md" | 18 +- ...73\346\234\215\345\212\241\345\231\250.md" | 6 +- ...13\345\212\241\346\216\247\345\210\266.md" | 4 +- ...13\345\212\241\347\233\221\346\216\247.md" | 29 - ...33\345\210\266\347\261\273\345\236\213.md" | 1 + ...31\351\207\214\345\274\200\345\247\213.md" | 11 +- ...74\345\205\245\346\225\260\346\215\256.md" | 2 +- ...61\345\261\202\345\244\215\345\210\266.md" | 2 +- ...61\345\261\202\345\244\215\345\210\266.md" | 2 +- ...17\345\206\231\346\227\245\345\277\227.md" | 70 +- ...33\350\241\214\350\260\203\344\274\230.md" | 17 + ...74\345\207\272\346\225\260\346\215\256.md" | 2 +- ...74\345\205\245\346\225\260\346\215\256.md" | 7 +- ...47\224\250gsql\350\277\236\346\216\245.md" | 10 +- ...50\345\210\206\345\214\272\350\241\250.md" | 12 + ...22\345\205\245\346\225\260\346\215\256.md" | 5 +- ...00\351\203\250\350\201\232\347\260\207.md" | 9 + ...347\224\250\346\214\207\345\257\274-12.md" | 2 +- ...\347\224\250\346\214\207\345\257\274-9.md" | 30 + ...77\347\224\250\346\214\207\345\257\274.md" | 23 +- ...50\346\226\207\346\243\200\347\264\242.md" | 2 - ...00\347\264\242\346\246\202\350\277\260.md" | 2 +- ...74\345\205\245\346\225\260\346\215\256.md" | 2 +- ...16\346\234\254\346\226\207\346\241\243.md" | 79 +++ .../\345\205\263\351\224\256\345\255\227.md" | 55 +- ...63\351\227\255\350\277\236\346\216\245.md" | 6 + ...26\345\231\250\351\200\211\351\241\271.md" | 18 - ...75\347\232\204\345\275\261\345\223\215.md" | 17 + ...73\347\273\237\345\207\275\346\225\260.md" | 91 ++- ...66\344\273\226\350\257\255\345\217\245.md" | 7 + ...66\345\256\203\351\200\211\351\241\271.md" | 28 +- ...QL\350\260\203\344\274\230\347\202\271.md" | 13 + .../\345\206\205\345\255\230-21.md" | 279 ++++++++ .../\345\206\205\345\255\230.md" | 312 ++------- .../\345\206\205\345\255\230\350\241\250.md" | 67 -- ...14\346\223\215\344\275\234\347\254\246.md" | 2 +- ...40\344\275\225\347\261\273\345\236\213.md" | 2 +- ...14\346\223\215\344\275\234\347\254\246.md" | 8 +- ...06\346\224\257\350\257\255\345\217\245.md" | 56 ++ ...46\350\242\253\351\230\273\345\241\236.md" | 70 ++ ...\222\214\347\256\241\347\220\206schema.md" | 4 +- ...06\345\210\206\345\214\272\350\241\250.md" | 1 + ...06\346\225\260\346\215\256\345\272\223.md" | 2 +- ...41\347\220\206\347\264\242\345\274\225.md" | 5 +- ...06\350\241\250\347\251\272\351\227\264.md" | 3 +- ...40\350\275\275\351\251\261\345\212\250.md" | 13 + ...50\346\200\201\350\257\255\345\217\245.md" | 11 + ...50\345\214\277\345\220\215\345\235\227.md" | 23 + ...30\345\202\250\350\277\207\347\250\213.md" | 22 + ...14\346\240\274\345\274\217\345\214\226.md" | 4 +- .../\345\214\277\345\220\215\345\235\227.md" | 21 + ...54\345\205\274\345\256\271\346\200\247.md" | 2 +- ...57\346\234\215\345\212\241\345\231\250.md" | 4 +- ...344\273\244\345\217\202\350\200\203-14.md" | 10 +- ...75\344\273\244\345\217\202\350\200\203.md" | 22 +- ...44\272\216JDBC\345\274\200\345\217\221.md" | 31 + ...44\272\216ODBC\345\274\200\345\217\221.md" | 61 ++ ...4\272\216libpq\345\274\200\345\217\221.md" | 6 + ...05\347\220\206\345\273\266\350\277\237.md" | 2 +- ...07\346\234\254\345\214\271\351\205\215.md" | 2 +- ...72\346\234\254\347\273\223\346\236\204.md" | 47 ++ ...72\346\234\254\350\257\255\345\217\245.md" | 14 + ...60\346\230\216\350\257\255\346\263\225.md" | 9 + ...06\347\273\223\346\236\234\351\233\206.md" | 186 +++++ ...47\345\210\266\345\207\275\346\225\260.md" | 16 +- ...07\346\234\215\345\212\241\345\231\250.md" | 12 +- ...66\346\200\201\351\227\256\351\242\230.md" | 14 + ...45\350\257\242\350\260\203\344\274\230.md" | 501 ++++++++++++++ .../\345\255\220\347\250\213\345\272\217.md" | 4 + ...45\235\227\345\220\215\347\232\204hint.md" | 31 + ...14\346\223\215\344\275\234\347\254\246.md" | 22 +- ...27\347\254\246\347\261\273\345\236\213.md" | 4 +- ...345\202\250\350\277\207\347\250\213-18.md" | 10 + ...30\345\202\250\350\277\207\347\250\213.md" | 27 + ...11\345\205\250\345\207\275\346\225\260.md" | 9 +- ...357\274\210postgresql-conf\357\274\211.md" | 18 +- ...32\344\271\211\345\217\230\351\207\217.md" | 56 ++ ...71\350\241\250\345\256\232\344\271\211.md" | 13 + ...32\344\271\211\346\246\202\350\277\260.md" | 9 + ...41\350\256\241\346\246\202\350\277\260.md" | 8 +- ...\345\205\245\350\256\244\350\257\201-0.md" | 15 - ...45\345\205\245\350\256\244\350\257\201.md" | 2 +- ...74\345\205\245\346\225\260\346\215\256.md" | 8 +- ...50\345\261\200\345\257\271\350\261\241.md" | 2 +- ...\346\225\260\346\215\256\345\272\223-6.md" | 6 +- ...11\346\225\260\346\215\256\345\272\223.md" | 2 +- ...32\344\275\215\346\214\207\345\215\227.md" | 4 + ...351\242\230\345\244\204\347\220\206-10.md" | 2 +- ...351\242\230\345\244\204\347\220\206-15.md" | 2 +- ...56\351\242\230\345\244\204\347\220\206.md" | 9 + ...00\345\217\221\346\225\231\347\250\213.md" | 13 + ...13\345\272\217\346\216\245\345\217\243.md" | 4 +- ...72\345\221\230\351\200\211\351\241\271.md" | 17 +- ...\345\217\221\346\265\201\347\250\213-1.md" | 104 +++ ...00\345\217\221\346\265\201\347\250\213.md" | 5 + ...00\345\217\221\350\247\204\350\214\203.md" | 9 + ...52\347\216\257\350\257\255\345\217\245.md" | 131 ++++ ...47\350\203\275\347\273\237\350\256\241.md" | 2 +- ...47\350\203\275\350\260\203\344\274\230.md" | 11 + ...03\344\274\230\346\200\235\350\267\257.md" | 46 ++ ...350\241\214SQL\350\257\255\345\217\245.md" | 162 +++++ ...45\350\257\242\350\257\255\345\217\245.md" | 50 ++ ...45\350\257\242\350\257\255\345\217\245.md" | 56 ++ ...51\345\261\225\345\207\275\346\225\260.md" | 4 - ...51\345\261\225\350\257\255\346\263\225.md" | 27 +- ...07\346\234\254\346\220\234\347\264\242.md" | 2 - ...47\345\210\266\350\257\255\345\217\245.md" | 17 + ...15\344\275\234\345\256\241\350\256\241.md" | 19 +- .../\346\223\215\344\275\234\347\254\246.md" | 2 +- ...02\346\225\260\350\260\203\344\274\230.md" | 152 +++++ ...60\345\200\274\347\261\273\345\236\213.md" | 8 +- ...14\346\223\215\344\275\234\347\254\246.md" | 6 +- ...56\345\272\223\344\275\277\347\224\250.md" | 2 - ...02\346\225\260\350\260\203\344\274\230.md" | 26 + ...02\346\225\260\350\260\203\344\274\230.md" | 20 + ...02\346\225\260\350\260\203\344\274\230.md" | 9 + ...346\215\256\347\261\273\345\236\213-19.md" | 4 + ...60\346\215\256\347\261\273\345\236\213.md" | 4 +- ...73\345\236\213\350\275\254\346\215\242.md" | 156 +++++ .../\346\225\260\347\273\204.md" | 29 + ...14\346\223\215\344\275\234\347\254\246.md" | 14 +- ...\225\260\347\273\204\345\222\214record.md" | 7 + ...45\345\277\227\345\233\236\346\224\276.md" | 10 +- ...66\351\227\264\347\261\273\345\236\213.md" | 2 +- ...14\346\223\215\344\275\234\347\254\246.md" | 9 +- ...76\345\274\217\346\270\270\346\240\207.md" | 81 +++ ...37\350\256\241\344\277\241\346\201\257.md" | 41 ++ ...\344\270\255\346\225\260\346\215\256-4.md" | 0 ...76\345\274\217\345\207\275\346\225\260.md" | 22 - ...41\344\273\266\350\257\255\345\217\245.md" | 102 +++ ...41\350\256\241\347\273\223\346\236\234.md" | 34 +- ...\350\277\236\346\216\245\346\225\260-5.md" | 116 ---- ...23\350\277\236\346\216\245\346\225\260.md" | 28 +- ...41\346\224\266\351\233\206\345\231\250.md" | 8 +- ...346\200\247\350\203\275\347\232\204SQL.md" | 83 +++ .../\346\243\200\346\237\245\347\202\271.md" | 16 +- .../\346\246\202\350\277\260-11.md" | 2 +- .../\346\246\202\350\277\260-14.md" | 4 - .../\346\246\202\350\277\260-16.md" | 2 +- .../\346\246\202\350\277\260-5.md" | 18 +- .../\346\246\202\350\277\260-7.md" | 6 +- .../\346\246\202\350\277\260-8.md" | 2 +- ...15\346\223\215\344\275\234\347\254\246.md" | 16 +- ...07\346\234\254\346\220\234\347\264\242.md" | 2 - .../\346\270\270\346\240\207.md" | 11 + ...70\346\240\207\345\276\252\347\216\257.md" | 18 + ...70\346\240\207\346\223\215\344\275\234.md" | 8 + ...70\346\240\207\346\246\202\350\277\260.md" | 36 + ...57\345\242\203\351\203\250\347\275\262.md" | 89 ++- ...32\204TCP-IP\350\277\236\346\216\245-4.md" | 30 - ...\232\204TCP-IP\350\277\236\346\216\245.md" | 2 +- ...32\204TCP-IP\350\277\236\346\216\245-3.md" | 544 --------------- ...\232\204TCP-IP\350\277\236\346\216\245.md" | 52 +- .../\347\224\250\346\210\267.md" | 14 +- ...32\344\271\211\345\207\275\346\225\260.md" | 5 + ...70\345\205\263\346\246\202\345\277\265.md" | 2 +- ...10\347\202\271\345\210\206\346\236\220.md" | 13 + ...03\344\274\230\350\214\203\345\233\264.md" | 46 ++ .../\347\244\272\344\276\213-2.md" | 339 +++++++++ .../\347\244\272\344\276\213-3.md" | 0 ...60\346\215\256\350\277\201\347\247\273.md" | 91 +++ ...70\347\224\250\346\223\215\344\275\234.md" | 218 ++++++ ...74\345\207\272\346\225\260\346\215\256.md" | 113 +++ ...350\241\214\345\272\224\347\224\250SQL.md" | 199 ++++++ .../\347\244\272\344\276\213.md" | 2 +- ...60\346\215\256\350\277\201\347\247\273.md" | 12 +- .../\347\251\272\350\257\255\345\217\245.md" | 20 + ...25\350\241\250\350\276\276\345\274\217.md" | 4 +- ...20\347\272\247\350\260\203\344\274\230.md" | 54 ++ ...41\347\220\206\344\272\213\345\212\241.md" | 2 +- .../\347\256\241\347\220\206\345\221\230.md" | 4 +- ...56\345\272\223\345\256\211\345\205\250.md" | 2 +- ...73\345\236\213\350\275\254\346\215\242.md" | 2 +- ...41\346\201\257\345\207\275\346\225\260.md" | 22 +- ...73\347\273\237\346\223\215\344\275\234.md" | 8 +- ...73\347\273\237\350\247\206\345\233\276.md" | 12 +- ...03\344\274\230\346\214\207\345\215\227.md" | 11 + ...71\345\206\231\350\247\204\345\210\231.md" | 57 ++ ...41\346\201\257\345\207\275\346\225\260.md" | 336 +++------ ...41\346\201\257\350\260\203\344\274\230.md" | 93 +++ ...41\350\256\241\346\227\245\345\277\227.md" | 6 +- .../\347\275\221\347\273\234.md" | 60 ++ ...60\345\235\200\347\261\273\345\236\213.md" | 2 +- ...32\351\233\206\345\207\275\346\225\260.md" | 57 -- ...345\217\226\345\270\256\345\212\251-13.md" | 2 +- ...67\345\217\226\345\270\256\345\212\251.md" | 45 ++ ...50\241\214\346\225\260\347\232\204Hint.md" | 42 ++ .../\350\247\222\350\211\262.md" | 6 +- ...43\346\236\220\346\226\207\346\241\243.md" | 4 +- ...43\346\236\220\346\237\245\350\257\242.md" | 2 +- ...27\347\232\204\344\275\215\347\275\256.md" | 4 +- ...27\347\232\204\345\206\205\345\256\271.md" | 2 +- ...27\347\232\204\346\227\266\351\227\264.md" | 2 +- .../\350\256\276\347\275\256.md" | 7 +- ...11\345\205\250\347\255\226\347\225\245.md" | 14 +- ...67\346\234\211\346\225\210\346\234\237.md" | 2 +- ...11\345\205\250\347\255\226\347\225\245.md" | 4 +- ...56\345\272\223\345\256\241\350\256\241.md" | 2 +- ...\345\205\250\347\255\226\347\225\245-9.md" | 211 ------ ...11\345\205\250\347\255\226\347\225\245.md" | 9 +- ...\344\271\246\346\233\277\346\215\242-8.md" | 62 -- ...01\344\271\246\346\233\277\346\215\242.md" | 6 +- ...\344\271\246\347\224\237\346\210\220-7.md" | 269 -------- ...01\344\271\246\347\224\237\346\210\220.md" | 8 +- ...15\345\205\270\346\246\202\350\277\260.md" | 2 +- .../\350\257\246\350\247\243.md" | 99 +++ ...55\345\217\245\350\241\214\344\270\272.md" | 3 +- ...03\344\274\230\346\265\201\347\250\213.md" | 12 + ...03\347\224\250\350\257\255\345\217\245.md" | 38 ++ .../\350\260\203\350\257\225-20.md" | 122 ++++ .../\350\260\203\350\257\225.md" | 160 +++++ ...37\350\275\275\347\256\241\347\220\206.md" | 21 +- ...04\346\272\220\346\266\210\350\200\227.md" | 2 +- ...13\345\200\274\350\257\255\345\217\245.md" | 26 + ...24\345\233\236\350\257\255\345\217\245.md" | 9 + ...\346\225\260\346\215\256\345\272\223-0.md" | 140 ++++ ...SL\346\226\271\345\274\217\357\274\211.md" | 136 ++++ ...36\346\216\245\350\256\276\347\275\256.md" | 10 +- ...30\345\202\250\346\250\241\345\236\213.md" | 27 + ...60\346\215\256\347\261\273\345\236\213.md" | 17 + ...41\345\272\223\345\217\202\346\225\260.md" | 2 +- ...77\351\227\256\345\207\275\346\225\260.md" | 2 +- ...31\345\205\245\346\225\260\346\215\256.md" | 8 +- ...61\345\261\202\345\244\215\345\210\266.md" | 2 +- .../\351\205\215\347\275\256LLVM.md" | 13 + ...\345\205\245\350\256\244\350\257\201-1.md" | 115 ---- ...45\345\205\245\350\256\244\350\257\201.md" | 4 +- ...\344\273\266\345\217\202\350\200\203-2.md" | 133 ---- ...07\344\273\266\345\217\202\350\200\203.md" | 10 +- ...34\347\250\213\350\277\236\346\216\245.md" | 6 +- ...15\347\275\256\347\244\272\344\276\213.md" | 2 +- ...15\350\256\276\345\217\202\346\225\260.md" | 4 +- ...76\346\216\245\345\255\227\347\254\246.md" | 9 +- .../\351\224\201\346\223\215\344\275\234.md" | 4 + ...25\350\216\267\350\257\255\345\217\245.md" | 112 +++ .../\351\231\204\345\275\225-16.md" | 9 - .../\351\231\204\345\275\225.md" | 8 +- ...20\345\274\217\346\270\270\346\240\207.md" | 50 ++ ...03\351\231\220\346\234\272\345\210\266.md" | 6 +- content/zh/docs/Glossary/Glossary.md | 641 ++++++++++++++++++ .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes ...77\347\224\250\350\257\264\346\230\216.md" | 2 +- ...02\346\225\260\350\257\264\346\230\216.md" | 8 +- ...16\351\251\261\345\212\250\347\261\273.md" | 11 +- content/zh/docs/Quickstart/Query.md | 58 +- ...4\347\275\221\347\244\272\344\276\213.png" | Bin 0 -> 47731 bytes ...\346\236\266\346\236\204\345\233\2761.png" | Bin 0 -> 37204 bytes ...4\347\275\221\347\244\272\344\276\213.png" | Bin 31137 -> 0 bytes ...67\347\253\257\350\277\236\346\216\245.md" | 2 +- .../openGauss\344\272\213\345\212\241.md" | 7 +- ...15\347\275\256\346\226\207\344\273\266.md" | 13 +- ...73\346\234\215\345\212\241\345\231\250.md" | 26 +- ...06\350\247\243\344\272\247\345\223\201.md" | 2 +- ...11\350\243\205\346\265\201\347\250\213.md" | 46 +- ...12\347\224\250\346\210\267\347\273\204.md" | 34 +- ...13\345\212\241\347\233\221\346\216\247.md" | 29 - ...47\345\223\201\347\211\271\347\202\271.md" | 2 +- ...00\351\224\200\345\270\270\351\207\217.md" | 16 +- ...71\346\263\225\351\205\215\347\275\256.md" | 2 +- ...17\345\206\231\346\227\245\345\277\227.md" | 82 ++- ...54\345\234\260\350\277\236\346\216\245.md" | 29 +- ...73\347\273\237\351\205\215\347\275\256.md" | 2 +- ...44\346\215\242\345\206\205\345\255\230.md" | 2 +- ...37\351\230\262\347\201\253\345\242\231.md" | 49 +- ...26\345\231\250\351\200\211\351\241\271.md" | 20 +- ...66\344\273\226\347\274\272\347\234\201.md" | 2 +- ...66\345\256\203\351\200\211\351\241\271.md" | 32 +- ...70\345\236\213\347\273\204\347\275\221.md" | 4 +- .../Quickstart/\345\206\205\345\255\230.md" | 10 +- ...04\346\272\220\344\275\277\347\224\250.md" | 6 +- ...67\345\217\212\347\216\257\345\242\203.md" | 106 +-- ...11\350\243\205\347\216\257\345\242\203.md" | 2 +- ...15\347\275\256\346\226\207\344\273\266.md" | 2 +- ...72\346\225\260\346\215\256\345\272\223.md" | 27 +- ...33\345\273\272\347\224\250\346\210\267.md" | 19 +- .../\345\210\233\345\273\272\350\241\250.md" | 481 ++++++++++++- ...33\345\273\272\350\247\222\350\211\262.md" | 12 +- ...11\350\243\205\347\216\257\345\242\203.md" | 2 +- ...35\345\247\213\351\205\215\347\275\256.md" | 7 + ...40\350\275\275\351\251\261\345\212\250.md" | 5 +- ...14\346\240\274\345\274\217\345\214\226.md" | 8 +- ...07\347\272\247\345\217\202\346\225\260.md" | 2 +- ...15\347\275\256\346\226\207\344\273\266.md" | 13 +- ...54\345\205\274\345\256\271\346\200\247.md" | 4 +- ...14\346\234\272\345\244\215\345\210\266.md" | 2 +- ...57\346\234\215\345\212\241\345\231\250.md" | 6 +- ...57\345\206\231\350\277\233\347\250\213.md" | 8 +- ...12\350\255\246\346\243\200\346\265\213.md" | 12 +- ...05\347\220\206\345\273\266\350\277\237.md" | 14 +- ...42\344\274\230\345\214\226\345\231\250.md" | 16 +- ...07\346\234\215\345\212\241\345\231\250.md" | 36 +- ...357\274\210postgresql-conf\357\274\211.md" | 20 +- ...45\346\225\260\346\215\256\345\272\223.md" | 15 +- .../\345\256\211\350\243\205openGauss.md" | 6 +- ...11\350\243\205\345\207\206\345\244\207.md" | 2 +- ...11\350\243\205\351\252\214\350\257\201.md" | 5 + .../Quickstart/\345\256\241\350\256\241.md" | 2 +- ...41\350\256\241\345\274\200\345\205\263.md" | 20 +- ...72\347\234\201\350\256\276\347\275\256.md" | 2 +- .../\345\256\271\351\224\231\346\200\247.md" | 2 +- ...57\345\205\274\345\256\271\346\200\247.md" | 2 +- ...66\350\241\214\345\257\274\345\205\245.md" | 2 +- ...72\345\221\230\351\200\211\351\241\271.md" | 19 +- ...77\347\224\250\344\272\247\345\223\201.md" | 2 +- .../Quickstart/\345\274\202\346\255\245IO.md" | 22 +- .../Quickstart/\345\275\222\346\241\243.md" | 2 +- ...47\350\203\275\347\273\237\350\256\241.md" | 6 +- ...72\347\253\213\344\272\222\344\277\241.md" | 16 +- ...350\241\214\345\215\225\346\235\241SQL.md" | 2 +- ...47\350\241\214\345\256\211\350\243\205.md" | 158 +++-- ...71\351\207\217\346\226\207\344\273\266.md" | 2 +- ...15\344\275\234\345\256\241\350\256\241.md" | 21 +- ...07\344\273\266\344\275\215\347\275\256.md" | 2 +- ...45\345\277\227\345\233\236\346\224\276.md" | 12 +- ...03\351\231\220\350\265\213\344\272\210.md" | 80 +-- ...23\345\211\215\345\217\226\345\200\274.md" | 2 +- ...41\346\224\266\351\233\206\345\231\250.md" | 10 +- ...45\350\257\242\350\247\204\345\210\222.md" | 2 +- ...45\345\272\267\347\212\266\346\200\201.md" | 61 ++ .../\346\243\200\346\237\245\347\202\271.md" | 36 +- ...60\345\205\274\345\256\271\346\200\247.md" | 2 +- ...03\351\231\220\345\256\241\350\256\241.md" | 12 +- ...22\344\277\241\344\270\242\345\244\261.md" | 14 +- ...36\346\216\245\344\277\241\346\201\257.md" | 25 +- ...01\347\233\230\347\251\272\351\227\264.md" | 2 +- .../Quickstart/\347\244\272\344\276\213-0.md" | 1 - .../Quickstart/\347\244\272\344\276\213.md" | 2 +- ...11\345\276\205\344\272\213\344\273\266.md" | 4 +- ...47\350\203\275\345\277\253\347\205\247.md" | 10 +- ...52\345\212\250\346\270\205\347\220\206.md" | 34 +- ...14\345\256\211\350\243\205\345\214\205.md" | 50 +- ...27\347\232\204\344\275\215\347\275\256.md" | 8 +- ...27\347\232\204\345\206\205\345\256\271.md" | 6 +- ...27\347\232\204\346\227\266\351\227\264.md" | 20 +- .../Quickstart/\350\256\276\347\275\256.md" | 9 +- ...34\347\250\213\347\231\273\345\275\225.md" | 2 +- ...46\351\233\206\345\217\202\346\225\260.md" | 2 +- ...72\345\222\214\346\227\266\351\227\264.md" | 4 +- ...347\275\221\345\215\241MTU\345\200\274.md" | 2 +- ...55\345\217\245\350\241\214\344\270\272.md" | 41 +- ...37\350\275\275\347\256\241\347\220\206.md" | 27 +- ...04\346\272\220\346\266\210\350\200\227.md" | 2 +- ...57\344\273\266\346\236\266\346\236\204.md" | 6 +- ...57\345\242\203\350\246\201\346\261\202.md" | 123 +++- ...14\346\227\266\347\273\237\350\256\241.md" | 2 +- ...45\345\222\214\350\256\244\350\257\201.md" | 2 +- ...45\346\225\260\346\215\256\345\272\223.md" | 98 ++- ...45\346\261\240\345\217\202\346\225\260.md" | 37 + ...36\346\216\245\350\256\276\347\275\256.md" | 12 +- ...41\345\272\223\345\217\202\346\225\260.md" | 4 +- ...56\347\231\275\345\220\215\345\215\225.md" | 39 +- ...72\346\234\254\344\277\241\346\201\257.md" | 32 +- ...14\345\255\227\347\254\246\351\233\206.md" | 119 ++++ ...73\347\273\237\345\217\202\346\225\260.md" | 383 +++++------ ...02\347\202\271\344\277\241\346\201\257.md" | 64 +- ...04\351\241\271\347\233\256\345\275\225.md" | 76 +-- ...20\350\241\214\345\217\202\346\225\260.md" | 2 +- ...15\350\256\276\345\217\202\346\225\260.md" | 8 +- .../\351\224\201\347\256\241\347\220\206.md" | 24 +- ...12\345\222\214\346\227\245\345\277\227.md" | 2 +- ...31\345\274\217\346\227\245\345\277\227.md" | 2 +- ...07\346\234\272\345\217\257\350\257\273.md" | 6 +- .../CVE\346\274\217\346\264\236.md" | 4 + .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes ...30\345\214\226\347\211\271\346\200\247.md" | 4 + ...02\344\270\216\350\264\241\347\214\256.md" | 24 + ...56\345\244\215\351\227\256\351\242\230.md" | 4 + ...62\347\237\245\351\227\256\351\242\230.md" | 13 + ...60\345\242\236\347\211\271\346\200\247.md" | 4 + .../\346\272\220\344\273\243\347\240\201.md" | 11 + ...10\346\234\254\344\273\213\347\273\215.md" | 9 + ...50\346\204\217\344\272\213\351\241\271.md" | 8 + ...71\346\200\247\344\273\213\347\273\215.md" | 32 + ...50\346\210\267\351\241\273\347\237\245.md" | 6 + .../Releasenotes/\350\207\264\350\260\242.md" | 4 + ...BO\344\274\230\345\214\226\345\231\250.md" | 6 + ...71\351\224\231\346\234\272\345\210\266.md" | 4 + ...45\345\217\243\345\205\274\345\256\271.md" | 4 + .../docs/Technicalwhitepaper/SQL-by-pass.md | 4 + .../Technicalwhitepaper.md | 3 + ...1\346\236\266\346\236\204\345\233\276.png" | Bin .../figures/zh-cn_image_0253069486.png | Bin 0 -> 18055 bytes .../figures/zh-cn_image_0253141769.png | Bin 0 -> 28267 bytes ...2\345\275\242\346\200\201\345\233\276.png" | Bin 0 -> 24589 bytes ...2\345\275\242\346\200\201\345\233\276.png" | Bin 0 -> 21335 bytes ...0\347\244\272\346\204\217\345\233\276.png" | Bin 0 -> 112355 bytes ...4\347\275\221\347\244\272\344\276\213.png" | Bin 0 -> 47731 bytes ...4\344\274\230\345\214\226\345\233\276.png" | Bin 0 -> 38180 bytes .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes ...32\345\244\207\351\203\250\347\275\262.md" | 14 + .../\344\270\273\345\244\207\346\234\272.md" | 8 + ...73\345\244\207\351\203\250\347\275\262.md" | 7 + ...13\345\212\241\346\224\257\346\214\201.md" | 36 + ...47\345\223\201\345\256\232\344\275\215.md" | 8 + ...70\345\236\213\347\273\204\347\275\221.md" | 45 ++ ...07\347\250\213\346\224\257\346\214\201.md" | 16 + .../\345\210\206\345\214\272.md" | 19 + ...25\346\234\272\351\203\250\347\275\262.md" | 9 + ...57\347\273\264\346\212\244\346\200\247.md" | 9 + ...70\347\224\250\346\246\202\345\277\265.md" | 21 + ...24\347\224\250\345\234\272\346\231\257.md" | 11 + ...346\205\242SQL\350\257\212\346\226\255.md" | 14 + ...00\346\234\257\346\214\207\346\240\207.md" | 97 +++ ...00\346\234\257\347\211\271\347\202\271.md" | 20 + ...56\346\235\203\345\210\206\347\246\273.md" | 8 + .../\346\224\257\346\214\201SQL-hint.md" | 6 + ...12\346\226\255\346\212\245\345\221\212.md" | 125 ++++ ...12\346\226\255\344\277\241\346\201\257.md" | 16 + ...346\214\201\346\240\207\345\207\206SQL.md" | 8 + ...00\345\217\221\346\216\245\345\217\243.md" | 6 + ...40\345\257\206\350\256\244\350\257\201.md" | 10 + ...56\345\272\223\345\256\211\345\205\250.md" | 15 + ...56\345\272\223\345\256\241\350\256\241.md" | 10 + ...70\345\277\203\346\212\200\346\234\257.md" | 15 + .../\346\234\257\350\257\255\350\241\250.md" | 641 ++++++++++++++++++ ...51\347\220\206\345\244\207\344\273\275.md" | 6 + ...15\347\275\256\350\246\201\346\261\202.md" | 43 ++ ...40\351\253\230\345\271\266\345\217\221.md" | 8 + ...11\345\205\250\347\211\271\346\200\247.md" | 88 +++ ...02\345\272\224\345\216\213\347\274\251.md" | 79 +++ ...67\345\220\210\345\255\230\345\202\250.md" | 47 ++ ...77\351\227\256\346\216\247\345\210\266.md" | 8 + ...77\351\227\256\346\216\247\345\210\266.md" | 10 + ...57\344\273\266\346\236\266\346\236\204.md" | 42 ++ ...57\344\273\266\350\246\201\346\261\202.md" | 35 + ...15\347\275\256\350\246\201\346\261\202.md" | 7 + ...73\350\276\221\345\244\207\344\273\275.md" | 4 + ...42\346\200\201\346\261\207\346\200\273.md" | 101 +++ ...50\347\275\262\346\226\271\346\241\210.md" | 11 + ...71\346\241\210\344\273\213\347\273\215.md" | 11 + ...72\346\234\254\345\212\237\350\203\275.md" | 17 + .../\351\253\230\345\217\257\347\224\250.md" | 9 + .../\351\253\230\346\200\247\350\203\275.md" | 15 + .../\351\253\230\346\211\251\345\261\225.md" | 5 + ...66\346\236\204\344\274\230\345\214\226.md" | 9 + content/zh/docs/Toolreference/FAQ.md | 4 +- content/zh/docs/Toolreference/Predictor.md | 9 - content/zh/docs/Toolreference/X-Tuner.md | 13 - content/zh/docs/Toolreference/gaussdb.md | 27 +- content/zh/docs/Toolreference/gs_backup.md | 2 +- .../zh/docs/Toolreference/gs_basebackup.md | 55 +- content/zh/docs/Toolreference/gs_check.md | 89 +-- content/zh/docs/Toolreference/gs_checkos.md | 13 +- content/zh/docs/Toolreference/gs_checkperf.md | 5 +- content/zh/docs/Toolreference/gs_collector.md | 30 +- ...06\345\233\276\345\210\227\350\241\250.md" | 22 +- ...42\345\244\215\346\226\271\346\263\225.md" | 47 ++ content/zh/docs/Toolreference/gs_ctl.md | 61 +- content/zh/docs/Toolreference/gs_dump.md | 8 +- content/zh/docs/Toolreference/gs_dumpall.md | 4 +- content/zh/docs/Toolreference/gs_guc.md | 6 +- content/zh/docs/Toolreference/gs_initdb.md | 9 + .../gs_initdb\347\256\200\344\273\213.md" | 19 + content/zh/docs/Toolreference/gs_install.md | 53 +- content/zh/docs/Toolreference/gs_om.md | 33 +- .../zh/docs/Toolreference/gs_postuninstall.md | 2 +- .../zh/docs/Toolreference/gs_preinstall.md | 5 +- content/zh/docs/Toolreference/gs_restore.md | 22 +- content/zh/docs/Toolreference/gs_ssh.md | 2 +- content/zh/docs/Toolreference/gs_sshexkey.md | 65 +- content/zh/docs/Toolreference/gs_uninstall.md | 2 +- .../zh/docs/Toolreference/gs_upgradectl.md | 6 +- content/zh/docs/Toolreference/gsql.md | 2 +- .../gsql\346\246\202\350\277\260.md" | 8 +- content/zh/docs/Toolreference/gstrace.md | 19 +- content/zh/docs/Toolreference/kadmin-local.md | 2 +- content/zh/docs/Toolreference/kdb5_util.md | 2 +- content/zh/docs/Toolreference/kdestroy.md | 2 +- content/zh/docs/Toolreference/kinit.md | 2 +- content/zh/docs/Toolreference/klist.md | 2 +- content/zh/docs/Toolreference/krb5kdc.md | 2 +- content/zh/docs/Toolreference/pg_config.md | 4 +- .../zh/docs/Toolreference/pg_controldata.md | 2 +- content/zh/docs/Toolreference/pg_resetxlog.md | 6 +- ...\347\224\250\346\214\207\345\257\274-0.md" | 59 +- ...77\347\224\250\346\214\207\345\257\274.md" | 20 +- ...75\344\273\244\345\217\202\350\200\203.md" | 14 +- ...\344\273\244\345\217\202\350\200\203-1.md" | 240 +++++++ ...75\344\273\244\345\217\202\350\200\203.md" | 61 +- ...67\347\253\257\345\267\245\345\205\267.md" | 8 +- ...67\344\270\200\350\247\210\350\241\250.md" | 20 +- ...351\242\230\345\244\204\347\220\206-11.md" | 7 - ...56\351\242\230\345\244\204\347\220\206.md" | 16 +- ...51\224\231-Failed-to-obtain-the-GPHOME.md" | 2 +- ...41\347\253\257\345\267\245\345\205\267.md" | 2 +- ...50\347\232\204\345\267\245\345\205\267.md" | 4 +- ...\345\217\226\345\270\256\345\212\251-1.md" | 50 -- ...67\345\217\226\345\270\256\345\212\251.md" | 16 +- .../completing-the-installation.md | 1 - .../configurations-during-installation.md | 1 - .../installation/figures/installation.jpg | Bin 41177 -> 0 bytes .../installation/starting-installation.md | 1 - ...15\347\275\256\346\226\207\344\273\266.md" | 13 +- ...57\345\242\203\346\270\205\347\220\206.md" | 20 +- ...11\350\243\205\346\265\201\347\250\213.md" | 2 +- ...12\347\224\250\346\210\267\347\273\204.md" | 4 +- ...73\347\273\237\351\205\215\347\275\256.md" | 2 +- ...44\346\215\242\345\206\205\345\255\230.md" | 2 +- ...37\351\230\262\347\201\253\345\242\231.md" | 3 +- ...67\345\217\212\347\216\257\345\242\203.md" | 62 +- ...11\350\243\205\347\216\257\345\242\203.md" | 2 +- ...15\347\275\256\346\226\207\344\273\266.md" | 2 +- ...11\350\243\205\347\216\257\345\242\203.md" | 2 +- ...35\345\247\213\351\205\215\347\275\256.md" | 2 +- ...15\347\275\256\346\226\207\344\273\266.md" | 13 +- .../\345\215\270\350\275\275openGauss.md" | 2 +- .../\345\256\211\350\243\205openGauss.md" | 2 +- ...11\350\243\205\345\207\206\345\244\207.md" | 2 +- ...11\350\243\205\346\246\202\350\277\260.md" | 7 +- ...11\350\243\205\351\252\214\350\257\201.md" | 4 +- ...72\347\253\213\344\272\222\344\277\241.md" | 6 +- ...47\350\241\214\345\215\270\350\275\275.md" | 2 +- ...47\350\241\214\345\256\211\350\243\205.md" | 58 +- ...45\345\272\267\347\212\266\346\200\201.md" | 3 +- .../installation/\347\244\272\344\276\213.md" | 2 +- ...14\345\256\211\350\243\205\345\214\205.md" | 46 +- ...34\347\250\213\347\231\273\345\275\225.md" | 2 +- ...46\351\233\206\345\217\202\346\225\260.md" | 2 +- ...72\345\222\214\346\227\266\351\227\264.md" | 4 +- ...347\275\221\345\215\241MTU\345\200\274.md" | 2 +- ...57\345\242\203\350\246\201\346\261\202.md" | 77 ++- ...72\346\234\254\344\277\241\346\201\257.md" | 2 +- ...14\345\255\227\347\254\246\351\233\206.md" | 6 +- ...73\347\273\237\345\217\202\346\225\260.md" | 5 +- ...02\347\202\271\344\277\241\346\201\257.md" | 24 +- ...04\351\241\271\347\233\256\345\275\225.md" | 16 +- ...07\346\234\272\345\217\257\350\257\273.md" | 2 +- content/zh/menu/index.md | 598 +++++++++++++--- 1158 files changed, 35543 insertions(+), 6683 deletions(-) create mode 100644 content/zh/docs/Administratorguide/Administratorguide.md create mode 100644 "content/zh/docs/Administratorguide/WAL\346\227\245\345\277\227.md" create mode 100644 content/zh/docs/Administratorguide/gs_backup.md create mode 100644 content/zh/docs/Administratorguide/gs_basebackup.md create mode 100644 content/zh/docs/Administratorguide/gs_dump.md create mode 100644 content/zh/docs/Administratorguide/gs_dumpall.md create mode 100644 content/zh/docs/Administratorguide/gs_restore.md rename content/zh/docs/{Compilationguide => Administratorguide}/public_sys-resources/icon-caution.gif (100%) rename content/zh/docs/{Compilationguide => Administratorguide}/public_sys-resources/icon-danger.gif (100%) rename content/zh/docs/{Compilationguide => Administratorguide}/public_sys-resources/icon-note.gif (100%) rename content/zh/docs/{Compilationguide => Administratorguide}/public_sys-resources/icon-notice.gif (100%) rename content/zh/docs/{Compilationguide => Administratorguide}/public_sys-resources/icon-tip.gif (100%) rename content/zh/docs/{Compilationguide => Administratorguide}/public_sys-resources/icon-warning.gif (100%) create mode 100644 "content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244.md" create mode 100644 "content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244\350\241\250.md" create mode 100644 "content/zh/docs/Administratorguide/\344\276\213\350\241\214\351\207\215\345\273\272\347\264\242\345\274\225.md" create mode 100644 "content/zh/docs/Administratorguide/\345\220\257\345\201\234openGauss.md" create mode 100644 "content/zh/docs/Administratorguide/\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" create mode 100644 "content/zh/docs/Administratorguide/\345\256\236\344\276\213\344\270\273\345\244\207\345\210\207\346\215\242.md" create mode 100644 "content/zh/docs/Administratorguide/\345\256\241\350\256\241\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-1.md" create mode 100644 "content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-3.md" create mode 100644 "content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206.md" create mode 100644 "content/zh/docs/Administratorguide/\346\200\247\350\203\275\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\346\223\215\344\275\234\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\346\225\260\346\215\256\345\256\211\345\205\250\347\273\264\346\212\244\345\273\272\350\256\256.md" create mode 100644 "content/zh/docs/Administratorguide/\346\227\245\345\277\227\345\217\202\350\200\203.md" create mode 100644 "content/zh/docs/Administratorguide/\346\227\245\345\277\227\347\261\273\345\236\213\347\256\200\344\273\213.md" create mode 100644 "content/zh/docs/Administratorguide/\346\227\245\347\273\264\346\212\244\346\243\200\346\237\245\351\241\271.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\350\277\220\350\241\214\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-0.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-2.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\222\214\346\270\205\347\220\206\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\272\224\347\224\250\350\277\236\346\216\245\346\225\260.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\225\260\346\215\256\345\272\223\346\200\247\350\203\275.md" create mode 100644 "content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\227\266\351\227\264\344\270\200\350\207\264\346\200\247.md" create mode 100644 "content/zh/docs/Administratorguide/\346\246\202\350\277\260.md" create mode 100644 "content/zh/docs/Administratorguide/\346\270\205\347\220\206\350\277\220\350\241\214\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\347\211\251\347\220\206\345\244\207\344\273\275\346\201\242\345\244\215.md" create mode 100644 "content/zh/docs/Administratorguide/\347\212\266\346\200\201\346\237\245\350\257\242.md" create mode 100644 "content/zh/docs/Administratorguide/\347\224\237\346\210\220\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Administratorguide/\347\263\273\347\273\237\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Administratorguide/\351\200\273\350\276\221\345\244\207\344\273\275\346\201\242\345\244\215.md" create mode 100644 "content/zh/docs/Administratorguide/\351\253\230\345\215\261\346\223\215\344\275\234\344\270\200\350\247\210\350\241\250.md" rename content/zh/docs/{Compilationguide => Compilation}/Compilation.md (100%) create mode 100644 content/zh/docs/Compilation/FAQ.md create mode 100644 "content/zh/docs/Compilation/build-sh\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/Compilation/figures/\347\273\230\345\233\2761.png" create mode 100644 content/zh/docs/Compilation/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Compilation/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Compilation/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Compilation/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Compilation/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Compilation/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Compilation/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" create mode 100644 "content/zh/docs/Compilation/\344\273\243\347\240\201\344\270\213\350\275\275.md" rename "content/zh/docs/Compilationguide/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" => "content/zh/docs/Compilation/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" (78%) create mode 100644 "content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-C-compiler-cannot-create-executables-\346\212\245\351\224\231.md" create mode 100644 "content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-g++-fatal-error-Killed-signal-terminated-program-cclplus-\346\212\245\351\224\231.md" create mode 100644 "content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-out-of-memory-allocating-xxx-bytes-after-a-total-of-xxx-bytes-\346\212\245\351\224\231.md" create mode 100644 "content/zh/docs/Compilation/\345\274\200\346\272\220\350\275\257\344\273\266\347\274\226\350\257\221\346\236\204\345\273\272.md" rename "content/zh/docs/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" => "content/zh/docs/Compilation/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" (100%) rename "content/zh/docs/Compilationguide/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" => "content/zh/docs/Compilation/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" (100%) create mode 100644 "content/zh/docs/Compilation/\346\246\202\350\277\260.md" rename "content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" => "content/zh/docs/Compilation/\347\211\210\346\234\254\347\274\226\350\257\221.md" (80%) rename "content/zh/docs/Compilationguide/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" => "content/zh/docs/Compilation/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" (100%) create mode 100644 "content/zh/docs/Compilation/\347\233\256\347\232\204.md" rename "content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" => "content/zh/docs/Compilation/\347\241\254\344\273\266\350\246\201\346\261\202.md" (100%) create mode 100644 "content/zh/docs/Compilation/\347\256\200\344\273\213.md" rename "content/zh/docs/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" => "content/zh/docs/Compilation/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" (46%) rename "content/zh/docs/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" => "content/zh/docs/Compilation/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" (62%) rename "content/zh/docs/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" => "content/zh/docs/Compilation/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" (46%) rename "content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" => "content/zh/docs/Compilation/\350\275\257\344\273\266\350\246\201\346\261\202.md" (100%) delete mode 100644 content/zh/docs/Compilationguide/FAQ.md delete mode 100644 "content/zh/docs/Compilationguide/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" delete mode 100644 "content/zh/docs/Compilationguide/\344\273\243\347\240\201\344\270\213\350\275\275.md" delete mode 100644 "content/zh/docs/Compilationguide/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-Ccompiler-cannot-create-executables-\346\212\245\351\224\231.md" create mode 100644 "content/zh/docs/Description/figures/openGauss\350\241\214\345\210\227\346\267\267\345\255\230\345\274\225\346\223\216.png" create mode 100644 "content/zh/docs/Description/figures/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\274\225\346\223\216(png).png" delete mode 100644 "content/zh/docs/Description/figures/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\274\225\346\223\216.jpg" delete mode 100644 "content/zh/docs/Description/figures/\350\241\214\345\210\227\346\267\267\345\255\230\345\274\225\346\223\216.jpg" create mode 100644 content/zh/docs/Developerguide/ALTER-SYNONYM.md create mode 100644 content/zh/docs/Developerguide/BGWRITER_STAT.md create mode 100644 content/zh/docs/Developerguide/CLASS_VITAL_INFO.md create mode 100644 content/zh/docs/Developerguide/CONFIG_SETTINGS.md create mode 100644 content/zh/docs/Developerguide/CPU.md rename content/zh/docs/Developerguide/{CREATE-ROW-LEVLEL-SECURITY-POLICY.md => CREATE-ROW-LEVEL-SECURITY-POLICY.md} (99%) create mode 100644 content/zh/docs/Developerguide/CREATE-SYNONYM.md create mode 100644 content/zh/docs/Developerguide/Cache-IO.md create mode 100644 content/zh/docs/Developerguide/Configuration.md create mode 100644 content/zh/docs/Developerguide/DBE_PERF-Schema.md create mode 100644 content/zh/docs/Developerguide/DROP-SYNONYM.md create mode 100644 content/zh/docs/Developerguide/FILE_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/FILE_REDO_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/File.md delete mode 100644 content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_BGWRITER_STAT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_CKPT_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_CONFIG_SETTINGS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_DOUBLE_WRITE_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_FILE_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_FILE_REDO_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_INSTANCE_TIME.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_LOCKS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_MEMORY_NODE_DETAIL.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY_TABLE.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_OPERATOR_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_OS_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_OS_THREADS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_PAGEWRITER_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_RECORD_RESET_TIME.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_RECOVERY_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_REDO_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_REL_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_REPLICATION_SLOTS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_REPLICATION_STAT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_SESSION_STAT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_SESSION_STAT_ACTIVITY.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_SESSION_TIME.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_SHARED_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY_TABLE.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATEMENT_COUNT.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_USER_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STATIO_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_BAD_BLOCK.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE_CONFLICTS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_DB_CU.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_SESSION_CU.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_XACT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_XACT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_THREADPOOL_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_THREAD_WAIT_STATUS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_TRANSACTIONS_PREPARED_XACTS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_WAIT_EVENTS.md create mode 100644 content/zh/docs/Developerguide/GLOBAL_WORKLOAD_TRANSACTION.md create mode 100644 "content/zh/docs/Developerguide/GOTO\350\257\255\345\217\245.md" delete mode 100644 content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md rename content/zh/docs/Developerguide/{GS_THREAD_MEMORY_CONTEXT.md => GS_THREAD_MEMORY_DETAIL.md} (96%) create mode 100644 "content/zh/docs/Developerguide/Hint\347\232\204\351\224\231\350\257\257-\345\206\262\347\252\201\345\217\212\345\221\212\350\255\246.md" create mode 100644 content/zh/docs/Developerguide/I-O.md create mode 100644 content/zh/docs/Developerguide/INSTANCE_TIME.md create mode 100644 content/zh/docs/Developerguide/Instance.md create mode 100644 "content/zh/docs/Developerguide/JDBC\345\214\205-\351\251\261\345\212\250\347\261\273\345\222\214\347\216\257\345\242\203\347\261\273.md" create mode 100644 "content/zh/docs/Developerguide/JDBC\346\216\245\345\217\243\345\217\202\350\200\203.md" create mode 100644 "content/zh/docs/Developerguide/Join\346\226\271\345\274\217\347\232\204Hint.md" create mode 100644 "content/zh/docs/Developerguide/Join\351\241\272\345\272\217\347\232\204Hint.md" create mode 100644 "content/zh/docs/Developerguide/LLVM\344\275\277\347\224\250\345\273\272\350\256\256.md" create mode 100644 "content/zh/docs/Developerguide/LLVM\351\200\202\347\224\250\345\234\272\346\231\257\344\270\216\351\231\220\345\210\266.md" create mode 100644 content/zh/docs/Developerguide/LOCAL_REL_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/LOCAL_THREADPOOL_STATUS.md create mode 100644 content/zh/docs/Developerguide/LOCKS.md create mode 100644 "content/zh/docs/Developerguide/Linux\344\270\213\351\205\215\347\275\256\346\225\260\346\215\256\346\272\220.md" create mode 100644 content/zh/docs/Developerguide/MEMORY_NODE_DETAIL.md create mode 100644 content/zh/docs/Developerguide/Memory.md create mode 100644 "content/zh/docs/Developerguide/ODBC\345\214\205\345\217\212\344\276\235\350\265\226\347\232\204\345\272\223\345\222\214\345\244\264\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Developerguide/ODBC\346\216\245\345\217\243\345\217\202\350\200\203.md" create mode 100644 content/zh/docs/Developerguide/OPERATOR_HISTORY.md create mode 100644 content/zh/docs/Developerguide/OPERATOR_HISTORY_TABLE.md create mode 100644 content/zh/docs/Developerguide/OPERATOR_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/OS.md create mode 100644 content/zh/docs/Developerguide/OS_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/OS_THREADS.md create mode 100644 content/zh/docs/Developerguide/Object.md create mode 100644 content/zh/docs/Developerguide/Operator.md delete mode 100644 content/zh/docs/Developerguide/PG_RUNNING_XACTS.md delete mode 100644 content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md create mode 100644 "content/zh/docs/Developerguide/PL-pgSQL\350\257\255\350\250\200\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/Plan-Hint\350\260\203\344\274\230\346\246\202\350\277\260.md" rename "content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\346\227\266\351\227\264\351\242\204\346\265\213\347\211\271\346\200\247.md" => content/zh/docs/Developerguide/Predictor.md (38%) create mode 100644 content/zh/docs/Developerguide/Query-22.md create mode 100644 "content/zh/docs/Developerguide/Query\346\211\247\350\241\214\346\265\201\347\250\213.md" create mode 100644 content/zh/docs/Developerguide/REPLICATION_SLOTS.md create mode 100644 content/zh/docs/Developerguide/REPLICATION_STAT.md create mode 100644 "content/zh/docs/Developerguide/RETURN-NEXT\345\217\212RETURN-QUERY.md" create mode 100644 content/zh/docs/Developerguide/RETURN.md create mode 100644 "content/zh/docs/Developerguide/Retry\347\256\241\347\220\206.md" create mode 100644 content/zh/docs/Developerguide/SESSION_CPU_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/SESSION_MEMORY.md create mode 100644 content/zh/docs/Developerguide/SESSION_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/SESSION_MEMORY_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/SESSION_STAT.md create mode 100644 content/zh/docs/Developerguide/SESSION_STAT_ACTIVITY.md create mode 100644 content/zh/docs/Developerguide/SESSION_TIME.md create mode 100644 content/zh/docs/Developerguide/SHARED_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/SNAPSHOT-SNAPSHOT.md create mode 100644 content/zh/docs/Developerguide/SNAPSHOT-TABLES_SNAP_TIMESTAMP.md create mode 100644 "content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\346\246\202\350\277\260.md" create mode 100644 "content/zh/docs/Developerguide/SQL\350\207\252\350\257\212\346\226\255.md" create mode 100644 "content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\345\205\263\351\224\256\345\217\202\346\225\260\350\260\203\346\225\264.md" create mode 100644 "content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\346\214\207\345\215\227.md" delete mode 100644 "content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206-6.md" create mode 100644 content/zh/docs/Developerguide/STATEMENT.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY_TABLE.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_COMPLEX_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_COUNT.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_IOSTAT_COMPLEX_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_RESPONSETIME_PERCENTILE.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_USER_COMPLEX_HISTORY.md create mode 100644 content/zh/docs/Developerguide/STATEMENT_WLMSTAT_COMPLEX_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/STATIO_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/STATIO_ALL_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/STATIO_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/STATIO_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/STATIO_SYS_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/STATIO_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/STATIO_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/STATIO_USER_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/STATIO_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/STAT_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/STAT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/STAT_BAD_BLOCK.md create mode 100644 content/zh/docs/Developerguide/STAT_DATABASE.md create mode 100644 content/zh/docs/Developerguide/STAT_DATABASE_CONFLICTS.md create mode 100644 content/zh/docs/Developerguide/STAT_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/STAT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/STAT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/STAT_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/STAT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/STAT_XACT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/STAT_XACT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/STAT_XACT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/STAT_XACT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_FILE_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_FILE_REDO_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_REL_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATEMENT.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATEMENT_COUNT.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_USER_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STATIO_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_BAD_BLOCK.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE_CONFLICTS.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_XACT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_XACT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_TRANSACTIONS_PREPARED_XACTS.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_USER_LOGIN.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_COUNT.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_ELAPSE_TIME.md create mode 100644 content/zh/docs/Developerguide/SUMMARY_WORKLOAD_TRANSACTION.md create mode 100644 "content/zh/docs/Developerguide/Scan\346\226\271\345\274\217\347\232\204Hint.md" create mode 100644 content/zh/docs/Developerguide/Session-Thread.md rename content/zh/docs/{Toolreference => Developerguide}/Sqldiag.md (77%) create mode 100644 content/zh/docs/Developerguide/THREAD_WAIT_STATUS.md create mode 100644 "content/zh/docs/Developerguide/TPCC\350\277\220\350\241\214\346\227\266-\346\263\250\345\205\245\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234-TPCC\345\215\241\344\275\217\347\232\204\351\227\256\351\242\230.md" create mode 100644 content/zh/docs/Developerguide/TRANSACTIONS_PREPARED_XACTS.md create mode 100644 content/zh/docs/Developerguide/Transaction.md create mode 100644 content/zh/docs/Developerguide/USER_LOGIN.md create mode 100644 content/zh/docs/Developerguide/Utility.md create mode 100644 content/zh/docs/Developerguide/WAIT_EVENTS.md create mode 100644 content/zh/docs/Developerguide/WDR-Snapshot-Schema.md create mode 100644 "content/zh/docs/Developerguide/WDR-Snapshot-\345\216\237\344\277\241\346\201\257\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/WDR-Snapshot-\346\225\260\346\215\256\350\241\250.md" create mode 100644 content/zh/docs/Developerguide/WLM_USER_RESOURCE_CONFIG.md create mode 100644 content/zh/docs/Developerguide/WLM_USER_RESOURCE_RUNTIME.md create mode 100644 content/zh/docs/Developerguide/WORKLOAD_SQL_COUNT.md create mode 100644 content/zh/docs/Developerguide/WORKLOAD_SQL_ELAPSE_TIME.md create mode 100644 content/zh/docs/Developerguide/WORKLOAD_TRANSACTION.md create mode 100644 content/zh/docs/Developerguide/Wait-Events.md create mode 100644 content/zh/docs/Developerguide/Workload-Manager.md create mode 100644 content/zh/docs/Developerguide/Workload.md create mode 100644 content/zh/docs/Developerguide/X-Tuner.md create mode 100644 "content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\2641\357\274\211.png" create mode 100644 "content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\2642\357\274\211.png" create mode 100644 "content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\264\347\244\272\344\276\2133-1\357\274\211.png" create mode 100644 "content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\264\347\244\272\344\276\2133\357\274\211.png" create mode 100644 content/zh/docs/Developerguide/figures/EXECUTE-IMMEDIATE-dynamic_select_clause.png create mode 100644 content/zh/docs/Developerguide/figures/FOR_AS_loop.png create mode 100644 content/zh/docs/Developerguide/figures/IF_THEN.jpg create mode 100644 content/zh/docs/Developerguide/figures/IF_THEN_ELSE.jpg create mode 100644 content/zh/docs/Developerguide/figures/IF_THEN_ELSIF_ELSE.png create mode 100644 "content/zh/docs/Developerguide/figures/ODBC\345\274\200\345\217\221\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\346\265\201\347\250\213.png" create mode 100644 "content/zh/docs/Developerguide/figures/ODBC\347\263\273\347\273\237\346\234\272\346\236\204.png" create mode 100644 "content/zh/docs/Developerguide/figures/SQL\345\274\225\346\223\216\346\211\247\350\241\214\346\237\245\350\257\242\347\261\273SQL\350\257\255\345\217\245\347\232\204\346\265\201\347\250\213.png" create mode 100644 "content/zh/docs/Developerguide/figures/SQL\346\211\247\350\241\214\350\256\241\345\210\222\347\244\272\344\276\213.png" create mode 100644 content/zh/docs/Developerguide/figures/anonymous_block.png create mode 100644 content/zh/docs/Developerguide/figures/assignment_value.png create mode 100644 content/zh/docs/Developerguide/figures/call_anonymous_block.png create mode 100644 content/zh/docs/Developerguide/figures/call_clause.png create mode 100644 content/zh/docs/Developerguide/figures/call_procedure.png create mode 100644 content/zh/docs/Developerguide/figures/case_when.png create mode 100644 content/zh/docs/Developerguide/figures/close_cursor.jpg create mode 100644 content/zh/docs/Developerguide/figures/cursor_typename.png create mode 100644 content/zh/docs/Developerguide/figures/declare_variable.png create mode 100644 content/zh/docs/Developerguide/figures/dynamic_cursor_define.png create mode 100644 content/zh/docs/Developerguide/figures/fetch_cursor.png create mode 100644 content/zh/docs/Developerguide/figures/for_loop.png create mode 100644 content/zh/docs/Developerguide/figures/for_loop_query.png create mode 100644 content/zh/docs/Developerguide/figures/forall.png create mode 100644 content/zh/docs/Developerguide/figures/loop.png create mode 100644 content/zh/docs/Developerguide/figures/noselect.png create mode 100644 "content/zh/docs/Developerguide/figures/openGauss\346\200\247\350\203\275\350\260\203\344\274\230\346\265\201\347\250\213.png" create mode 100644 content/zh/docs/Developerguide/figures/open_dynamic_cursor.png create mode 100644 content/zh/docs/Developerguide/figures/open_for.png create mode 100644 content/zh/docs/Developerguide/figures/open_static_cursor.png create mode 100644 content/zh/docs/Developerguide/figures/raise.png create mode 100644 content/zh/docs/Developerguide/figures/raise_condition.png create mode 100644 content/zh/docs/Developerguide/figures/raise_format.png create mode 100644 content/zh/docs/Developerguide/figures/raise_option.png create mode 100644 content/zh/docs/Developerguide/figures/raise_sqlstate.png create mode 100644 "content/zh/docs/Developerguide/figures/record\347\261\273\345\236\213\347\232\204\350\257\255\346\263\225.png" create mode 100644 content/zh/docs/Developerguide/figures/return_clause.jpg create mode 100644 content/zh/docs/Developerguide/figures/static_cursor_define.jpg create mode 100644 content/zh/docs/Developerguide/figures/using_clause-0.png create mode 100644 content/zh/docs/Developerguide/figures/using_clause-1.png create mode 100644 content/zh/docs/Developerguide/figures/using_clause-2.png create mode 100644 content/zh/docs/Developerguide/figures/using_clause.png create mode 100644 content/zh/docs/Developerguide/figures/when_clause.png create mode 100644 content/zh/docs/Developerguide/figures/while_loop.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0118861065.jpg create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0246254080.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0246254081.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0246254082.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0252660975.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0252663634.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253028833.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253030479.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253032870.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253036670.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253037239.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253038757.png rename content/zh/docs/{Toolreference/figures/zh-cn_image_0245423148.png => Developerguide/figures/zh-cn_image_0253082069.png} (100%) create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253403489.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253403490.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253404022.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0253404023.png create mode 100644 "content/zh/docs/Developerguide/figures/\351\207\207\347\224\250JDBC\345\274\200\345\217\221\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\346\265\201\347\250\213.png" create mode 100644 content/zh/docs/Developerguide/record.md delete mode 100644 "content/zh/docs/Developerguide/\344\272\213\345\212\241\347\233\221\346\216\247.md" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250Plan-Hint\350\277\233\350\241\214\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250\345\210\206\345\214\272\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250\345\261\200\351\203\250\350\201\232\347\260\207.md" rename "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" => "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-12.md" (98%) create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-9.md" rename "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\215\227.md" => "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274.md" (89%) create mode 100644 "content/zh/docs/Developerguide/\345\205\263\344\272\216\346\234\254\346\226\207\346\241\243.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\263\351\227\255\350\277\236\346\216\245.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\266\344\273\226\345\233\240\347\264\240\345\257\271LLVM\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.md" rename "content/zh/docs/Developerguide/\345\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" => "content/zh/docs/Developerguide/\345\205\266\344\273\226\347\263\273\347\273\237\345\207\275\346\225\260.md" (85%) create mode 100644 "content/zh/docs/Developerguide/\345\205\266\344\273\226\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\270\345\236\213SQL\350\260\203\344\274\230\347\202\271.md" create mode 100644 "content/zh/docs/Developerguide/\345\206\205\345\255\230-21.md" delete mode 100644 "content/zh/docs/Developerguide/\345\206\205\345\255\230\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\206\346\224\257\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\206\346\236\220\344\275\234\344\270\232\346\230\257\345\220\246\350\242\253\351\230\273\345\241\236.md" create mode 100644 "content/zh/docs/Developerguide/\345\212\240\350\275\275\351\251\261\345\212\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\212\250\346\200\201\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\214\277\345\220\215\345\235\227.md" create mode 100644 "content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\214\277\345\220\215\345\235\227.md" rename "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" => "content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203-14.md" (83%) rename "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" => "content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203.md" (83%) create mode 100644 "content/zh/docs/Developerguide/\345\237\272\344\272\216JDBC\345\274\200\345\217\221.md" create mode 100644 "content/zh/docs/Developerguide/\345\237\272\344\272\216ODBC\345\274\200\345\217\221.md" create mode 100644 "content/zh/docs/Developerguide/\345\237\272\344\272\216libpq\345\274\200\345\217\221.md" create mode 100644 "content/zh/docs/Developerguide/\345\237\272\346\234\254\347\273\223\346\236\204.md" create mode 100644 "content/zh/docs/Developerguide/\345\237\272\346\234\254\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\345\243\260\346\230\216\350\257\255\346\263\225.md" create mode 100644 "content/zh/docs/Developerguide/\345\244\204\347\220\206\347\273\223\346\236\234\351\233\206.md" create mode 100644 "content/zh/docs/Developerguide/\345\244\207\346\234\272\345\244\204\344\272\216need-repair(WAL)\347\212\266\346\200\201\351\227\256\351\242\230.md" create mode 100644 "content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\345\255\220\347\250\213\345\272\217.md" create mode 100644 "content/zh/docs/Developerguide/\345\255\220\351\223\276\346\216\245\345\235\227\345\220\215\347\232\204hint.md" create mode 100644 "content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213-18.md" create mode 100644 "content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\232\344\271\211\345\217\230\351\207\217.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211\346\246\202\350\277\260.md" delete mode 100644 "content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-0.md" rename "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-13.md" => "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-6.md" (93%) rename "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" => "content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-10.md" (80%) rename "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" => "content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-15.md" (78%) create mode 100644 "content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\345\274\200\345\217\221\346\225\231\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213-1.md" create mode 100644 "content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\274\200\345\217\221\350\247\204\350\214\203.md" create mode 100644 "content/zh/docs/Developerguide/\345\276\252\347\216\257\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\346\200\247\350\203\275\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\346\200\273\344\275\223\350\260\203\344\274\230\346\200\235\350\267\257.md" create mode 100644 "content/zh/docs/Developerguide/\346\211\247\350\241\214SQL\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\346\237\245\350\257\242\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\351\235\236\346\237\245\350\257\242\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\346\216\247\345\210\266\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\206\205\345\255\230\345\217\202\346\225\260\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\230\237\345\210\227\345\217\202\346\225\260\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213-19.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213\350\275\254\346\215\242.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\347\273\204.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\347\273\204\345\222\214record.md" create mode 100644 "content/zh/docs/Developerguide/\346\230\276\345\274\217\346\270\270\346\240\207.md" create mode 100644 "content/zh/docs/Developerguide/\346\233\264\346\226\260\347\273\237\350\256\241\344\277\241\346\201\257.md" rename "content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-11.md" => "content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-4.md" (100%) create mode 100644 "content/zh/docs/Developerguide/\346\235\241\344\273\266\350\257\255\345\217\245.md" delete mode 100644 "content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260-5.md" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\350\257\242\346\234\200\350\200\227\346\200\247\350\203\275\347\232\204SQL.md" rename "content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md" => "content/zh/docs/Developerguide/\346\246\202\350\277\260-11.md" (82%) delete mode 100644 "content/zh/docs/Developerguide/\346\246\202\350\277\260-14.md" rename "content/zh/docs/Developerguide/\346\246\202\350\277\260-15.md" => "content/zh/docs/Developerguide/\346\246\202\350\277\260-16.md" (98%) rename "content/zh/docs/Developerguide/\346\246\202\350\277\260-12.md" => "content/zh/docs/Developerguide/\346\246\202\350\277\260-5.md" (81%) rename "content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" => "content/zh/docs/Developerguide/\346\246\202\350\277\260-7.md" (41%) rename "content/zh/docs/Toolreference/\346\246\202\350\277\260.md" => "content/zh/docs/Developerguide/\346\246\202\350\277\260-8.md" (80%) create mode 100644 "content/zh/docs/Developerguide/\346\270\270\346\240\207.md" create mode 100644 "content/zh/docs/Developerguide/\346\270\270\346\240\207\345\276\252\347\216\257.md" create mode 100644 "content/zh/docs/Developerguide/\346\270\270\346\240\207\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/Developerguide/\346\270\270\346\240\207\346\246\202\350\277\260.md" rename "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" => "content/zh/docs/Developerguide/\347\216\257\345\242\203\351\203\250\347\275\262.md" (53%) delete mode 100644 "content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-4.md" delete mode 100644 "content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-3.md" create mode 100644 "content/zh/docs/Developerguide/\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\241\254\344\273\266\347\223\266\351\242\210\347\202\271\345\210\206\346\236\220.md" create mode 100644 "content/zh/docs/Developerguide/\347\241\256\345\256\232\346\200\247\350\203\275\350\260\203\344\274\230\350\214\203\345\233\264.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213-2.md" rename "content/zh/docs/Developerguide/\347\244\272\344\276\213-10.md" => "content/zh/docs/Developerguide/\347\244\272\344\276\213-3.md" (100%) create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213-\344\273\216MY\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213-\345\270\270\347\224\250\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\200\232\350\277\207\346\234\254\345\234\260\346\226\207\344\273\266\345\257\274\345\205\245\345\257\274\345\207\272\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\207\215\346\226\260\346\211\247\350\241\214\345\272\224\347\224\250SQL.md" rename "content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MySQL\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" => "content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MY\345\220\221openGauss\346\225\260\346\215\256\345\272\223\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" (89%) create mode 100644 "content/zh/docs/Developerguide/\347\251\272\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\350\260\203\344\274\230\346\214\207\345\215\227.md" create mode 100644 "content/zh/docs/Developerguide/\347\273\217\351\252\214\346\200\273\347\273\223-SQL\350\257\255\345\217\245\346\224\271\345\206\231\350\247\204\345\210\231.md" create mode 100644 "content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/Developerguide/\347\275\221\347\273\234.md" rename "content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" => "content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251-13.md" (93%) create mode 100644 "content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251.md" create mode 100644 "content/zh/docs/Developerguide/\350\241\214\346\225\260\347\232\204Hint.md" delete mode 100644 "content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245-9.md" delete mode 100644 "content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242-8.md" delete mode 100644 "content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220-7.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\246\350\247\243.md" create mode 100644 "content/zh/docs/Developerguide/\350\260\203\344\274\230\346\265\201\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\350\260\203\347\224\250\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\350\260\203\350\257\225-20.md" create mode 100644 "content/zh/docs/Developerguide/\350\260\203\350\257\225.md" create mode 100644 "content/zh/docs/Developerguide/\350\265\213\345\200\274\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\224\345\233\236\350\257\255\345\217\245.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223-0.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223\357\274\210\344\273\245SSL\346\226\271\345\274\217\357\274\211.md" create mode 100644 "content/zh/docs/Developerguide/\351\200\211\346\213\251\345\255\230\345\202\250\346\250\241\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\351\200\211\346\213\251\346\225\260\346\215\256\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\351\205\215\347\275\256LLVM.md" delete mode 100644 "content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-1.md" delete mode 100644 "content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203-2.md" create mode 100644 "content/zh/docs/Developerguide/\351\224\201\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/Developerguide/\351\224\231\350\257\257\346\215\225\350\216\267\350\257\255\345\217\245.md" delete mode 100644 "content/zh/docs/Developerguide/\351\231\204\345\275\225-16.md" create mode 100644 "content/zh/docs/Developerguide/\351\232\220\345\274\217\346\270\270\346\240\207.md" create mode 100644 content/zh/docs/Glossary/Glossary.md create mode 100644 content/zh/docs/Glossary/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Glossary/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Glossary/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Glossary/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Glossary/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Glossary/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Quickstart/figures/openGauss\347\275\221\347\273\234\347\273\204\347\275\221\347\244\272\344\276\213.png" create mode 100644 "content/zh/docs/Quickstart/figures/openGauss\351\200\273\350\276\221\346\236\266\346\236\204\345\233\2761.png" delete mode 100644 "content/zh/docs/Quickstart/figures/\346\225\260\346\215\256\345\272\223\347\256\241\347\220\206\345\255\230\345\202\250\347\275\221\347\273\234\347\273\204\347\275\221\347\244\272\344\276\213.png" rename "content/zh/docs/Quickstart/gsql\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245openGauss.md" => "content/zh/docs/Quickstart/gsql\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245.md" (72%) delete mode 100644 "content/zh/docs/Quickstart/\344\272\213\345\212\241\347\233\221\346\216\247.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\235\345\247\213\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\211\350\243\205\351\252\214\350\257\201.md" create mode 100644 "content/zh/docs/Quickstart/\346\243\200\346\237\245\345\201\245\345\272\267\347\212\266\346\200\201.md" create mode 100644 "content/zh/docs/Quickstart/\350\277\236\346\216\245\346\261\240\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\351\205\215\347\275\256\345\214\272\345\237\237\345\222\214\345\255\227\347\254\246\351\233\206.md" create mode 100644 "content/zh/docs/Releasenotes/CVE\346\274\217\346\264\236.md" create mode 100644 content/zh/docs/Releasenotes/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Releasenotes/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Releasenotes/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Releasenotes/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Releasenotes/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Releasenotes/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Releasenotes/\344\274\230\345\214\226\347\211\271\346\200\247.md" create mode 100644 "content/zh/docs/Releasenotes/\345\217\202\344\270\216\350\264\241\347\214\256.md" create mode 100644 "content/zh/docs/Releasenotes/\345\267\262\344\277\256\345\244\215\351\227\256\351\242\230.md" create mode 100644 "content/zh/docs/Releasenotes/\345\267\262\347\237\245\351\227\256\351\242\230.md" create mode 100644 "content/zh/docs/Releasenotes/\346\226\260\345\242\236\347\211\271\346\200\247.md" create mode 100644 "content/zh/docs/Releasenotes/\346\272\220\344\273\243\347\240\201.md" create mode 100644 "content/zh/docs/Releasenotes/\347\211\210\346\234\254\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/Releasenotes/\347\211\210\346\234\254\344\275\277\347\224\250\346\263\250\346\204\217\344\272\213\351\241\271.md" create mode 100644 "content/zh/docs/Releasenotes/\347\211\271\346\200\247\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/Releasenotes/\347\224\250\346\210\267\351\241\273\347\237\245.md" create mode 100644 "content/zh/docs/Releasenotes/\350\207\264\350\260\242.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/CBO\344\274\230\345\214\226\345\231\250.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/Copy\346\216\245\345\217\243\346\224\257\346\214\201\345\256\271\351\224\231\346\234\272\345\210\266.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/PG\346\216\245\345\217\243\345\205\274\345\256\271.md" create mode 100644 content/zh/docs/Technicalwhitepaper/SQL-by-pass.md create mode 100644 content/zh/docs/Technicalwhitepaper/Technicalwhitepaper.md rename content/zh/docs/Quickstart/figures/zh-cn_image_0241993991.png => "content/zh/docs/Technicalwhitepaper/figures/openGauss\351\200\273\350\276\221\346\236\266\346\236\204\345\233\276.png" (100%) create mode 100644 content/zh/docs/Technicalwhitepaper/figures/zh-cn_image_0253069486.png create mode 100644 content/zh/docs/Technicalwhitepaper/figures/zh-cn_image_0253141769.png create mode 100644 "content/zh/docs/Technicalwhitepaper/figures/\344\270\200\344\270\273\345\244\232\345\244\207\351\203\250\347\275\262\345\275\242\346\200\201\345\233\276.png" create mode 100644 "content/zh/docs/Technicalwhitepaper/figures/\344\270\273\345\244\207\351\203\250\347\275\262\345\275\242\346\200\201\345\233\276.png" create mode 100644 "content/zh/docs/Technicalwhitepaper/figures/\345\210\227\345\255\230\345\202\250\347\244\272\346\204\217\345\233\276.png" create mode 100644 "content/zh/docs/Technicalwhitepaper/figures/\346\225\260\346\215\256\345\272\223\347\256\241\347\220\206\345\255\230\345\202\250\347\275\221\347\273\234\347\273\204\347\275\221\347\244\272\344\276\213.png" create mode 100644 "content/zh/docs/Technicalwhitepaper/figures/\351\262\262\351\271\217NUMA\346\236\266\346\236\204\344\274\230\345\214\226\345\233\276.png" create mode 100644 content/zh/docs/Technicalwhitepaper/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Technicalwhitepaper/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Technicalwhitepaper/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Technicalwhitepaper/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Technicalwhitepaper/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Technicalwhitepaper/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Technicalwhitepaper/\344\270\200\344\270\273\345\244\232\345\244\207\351\203\250\347\275\262.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\344\270\273\345\244\207\346\234\272.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\344\270\273\345\244\207\351\203\250\347\275\262.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\344\272\213\345\212\241\346\224\257\346\214\201.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\344\272\247\345\223\201\345\256\232\344\275\215.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\205\270\345\236\213\347\273\204\347\275\221.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\207\275\346\225\260\345\217\212\345\255\230\345\202\250\350\277\207\347\250\213\346\224\257\346\214\201.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\210\206\345\214\272.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\215\225\346\234\272\351\203\250\347\275\262.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\217\257\347\273\264\346\212\244\346\200\247.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\270\270\347\224\250\346\246\202\345\277\265.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\345\272\224\347\224\250\345\234\272\346\231\257.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\205\242SQL\350\257\212\346\226\255.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\212\200\346\234\257\346\214\207\346\240\207.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\212\200\346\234\257\347\211\271\347\202\271.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\216\247\345\210\266\346\235\203\345\222\214\350\256\277\351\227\256\346\235\203\345\210\206\347\246\273.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\224\257\346\214\201SQL-hint.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\224\257\346\214\201WDR\350\257\212\346\226\255\346\212\245\345\221\212.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\224\257\346\214\201\344\270\200\351\224\256\345\274\217\346\224\266\351\233\206\350\257\212\346\226\255\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\224\257\346\214\201\346\240\207\345\207\206SQL.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\224\257\346\214\201\346\240\207\345\207\206\345\274\200\345\217\221\346\216\245\345\217\243.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\225\260\346\215\256\345\272\223\345\212\240\345\257\206\350\256\244\350\257\201.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\225\260\346\215\256\345\272\223\345\256\211\345\205\250.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\225\260\346\215\256\345\272\223\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\346\234\257\350\257\255\350\241\250.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\347\211\251\347\220\206\345\244\207\344\273\275.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\347\241\254\344\273\266\351\205\215\347\275\256\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\347\272\277\347\250\213\346\261\240\351\253\230\345\271\266\345\217\221.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\347\275\221\347\273\234\351\200\232\344\277\241\345\256\211\345\205\250\347\211\271\346\200\247.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\207\252\351\200\202\345\272\224\345\216\213\347\274\251.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\241\214\345\210\227\346\267\267\345\220\210\345\255\230\345\202\250.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\241\214\347\272\247\350\256\277\351\227\256\346\216\247\345\210\266.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\256\277\351\227\256\346\216\247\345\210\266.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\275\257\344\273\266\346\236\266\346\236\204.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\275\257\344\273\266\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\350\275\257\347\241\254\344\273\266\351\205\215\347\275\256\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\200\273\350\276\221\345\244\207\344\273\275.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\203\250\347\275\262\345\275\242\346\200\201\346\261\207\346\200\273.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\203\250\347\275\262\346\226\271\346\241\210.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\203\250\347\275\262\346\226\271\346\241\210\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\235\242\345\220\221\345\272\224\347\224\250\345\274\200\345\217\221\347\232\204\345\237\272\346\234\254\345\212\237\350\203\275.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\253\230\345\217\257\347\224\250.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\253\230\346\200\247\350\203\275.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\253\230\346\211\251\345\261\225.md" create mode 100644 "content/zh/docs/Technicalwhitepaper/\351\262\262\351\271\217NUMA\346\236\266\346\236\204\344\274\230\345\214\226.md" delete mode 100644 content/zh/docs/Toolreference/Predictor.md delete mode 100644 content/zh/docs/Toolreference/X-Tuner.md create mode 100644 "content/zh/docs/Toolreference/gs_ctl-\351\207\215\345\273\272\345\244\207\345\256\236\344\276\213\350\277\207\347\250\213\350\242\253\344\270\255\346\226\255\345\257\274\350\207\264\347\247\230\351\222\245\346\226\207\344\273\266\344\270\215\345\256\214\346\225\264\346\201\242\345\244\215\346\226\271\346\263\225.md" create mode 100644 content/zh/docs/Toolreference/gs_initdb.md create mode 100644 "content/zh/docs/Toolreference/gs_initdb\347\256\200\344\273\213.md" create mode 100644 "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-1.md" delete mode 100644 "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-11.md" delete mode 100644 "content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-1.md" delete mode 100644 content/zh/docs/installation/completing-the-installation.md delete mode 100644 content/zh/docs/installation/configurations-during-installation.md delete mode 100644 content/zh/docs/installation/figures/installation.jpg delete mode 100644 content/zh/docs/installation/starting-installation.md rename "content/zh/docs/installation/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" => "content/zh/docs/installation/\346\243\200\346\237\245\345\201\245\345\272\267\347\212\266\346\200\201.md" (95%) diff --git a/content/zh/docs/Administratorguide/Administratorguide.md b/content/zh/docs/Administratorguide/Administratorguide.md new file mode 100644 index 000000000..f78958062 --- /dev/null +++ b/content/zh/docs/Administratorguide/Administratorguide.md @@ -0,0 +1,4 @@ +# 管理员指南 + +本文档提供了openGauss数据库常用的管理员操作,方便管理员更好地使用openGauss。 本文档适用于所有使用openGauss数据库的管理员。 + diff --git "a/content/zh/docs/Administratorguide/WAL\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/WAL\346\227\245\345\277\227.md" new file mode 100644 index 000000000..d86948ea6 --- /dev/null +++ "b/content/zh/docs/Administratorguide/WAL\346\227\245\345\277\227.md" @@ -0,0 +1,29 @@ +# WAL日志 + +预写式日志WAL(Write Ahead Log,也称为Xlog)是指如果要修改数据文件,必须是在这些修改操作已经记录到日志文件之后才能进行修改,即在描述这些变化的日志记录刷新到永久存储器之后。在系统崩溃时,可以使用WAL日志对openGauss进行恢复操作。 + +## 日志文件存储路径 + +以一个数据库节点为例,默认在“/gaussdb/data/data\_dn/pg\_xlog”目录下。 + +其中“/gaussdb/data/data\_dn”代表openGauss节点的数据目录。 + +## 日志文件命名格式 + +日志文件以段文件的形式存储的,每个段为16MB,并分割成若干页,每页8KB。对WAL日志的命名说明如下:一个段文件的名称由24个十六进制组成,分为三个部分,每个部分由8个十六进制字符组成。第一部分表示时间线,第二部分表示日志文件标号,第三部分表示日志文件的段标号。时间线由1开始,日志文件标号和日志文件的段标号由0开始。 + +例如,系统中的第一个事务日志文件是000000010000000000000000。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>这些数字一般情况下是顺序增长使用的(要把所有可用数字都用光也需要非常长的时间),但也存在循环使用的情况。 + +## 日志内容说明 + +WAL日志的内容取决于记录事务的类型,在系统崩溃时可以利用WAL日志进行恢复。 + +默认配置下,openGauss每次启动时会先读取WAL日志进行恢复。 + +## 维护建议 + +WAL日志对数据库异常恢复有重要的作用,建议定期对WAL日志进行备份。 + diff --git a/content/zh/docs/Administratorguide/gs_backup.md b/content/zh/docs/Administratorguide/gs_backup.md new file mode 100644 index 000000000..349bd0ed1 --- /dev/null +++ b/content/zh/docs/Administratorguide/gs_backup.md @@ -0,0 +1,141 @@ +# gs\_backup + +## 背景信息 + +openGauss部署成功后,在数据库运行的过程中,会遇到各种问题及异常状态。openGauss提供了gs\_backup工具帮助openGauss备份、恢复重要数据、显示帮助信息和版本号信息。 + +## 前提条件 + +- 可以正常连接openGauss数据库。 +- 在进行还原时,需要保证各节点备份目录中存在备份文件,若备份文件丢失,则需要从其他节点进行拷贝(二进制文件需修改文件名中的节点名)。 +- 需以操作系统用户omm执行gs\_backup命令。 + +## 语法 + +- 备份数据库主机 + + ``` + gs_backup -t backup --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter] [--binary] [--all] [-l LOGFILE] + ``` + +- 恢复数据库主机 + + ``` + gs_backup -t restore --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter] [--binary] [--all] [-l LOGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_backup -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_backup -V | --version + ``` + + +## 参数说明 + +gs\_backup参数可以分为如下几类: + +- 备份数据库主机参数: + - -h + + 指定存储备份文件的主机名称。 + + 取值范围:主机名称。如果不指定主机名称,则分发到openGauss。 + + - --backup-dir=BACKUPDIR + + 备份文件保存路径。 + + - --parameter + + 备份参数文件,不指定--parameter、--binary、--all参数时默认只备份参数文件。 + + - --binary + + 备份二进制文件。 + + - --all + + 备份二进制和参数文件。 + + - -l + + 指定日志文件及存放路径。 + + 默认值:$GAUSSLOG/om/gs\_backup-YYYY-MM-DD\_hhmmss.log + + +- 恢复数据库主机参数: + - -h + + 指定需要恢复主机的名称。 + + 取值范围:主机名称。如果不指定主机,则恢复openGauss。 + + - --backup-dir=BACKUPDIR + + 恢复文件提取路径。 + + - --parameter + + 恢复参数文件,不指定--parameter、--binary、--all参数时默认只恢复参数文件。 + + - --binary + + 恢复二进制文件。 + + - --all + + 恢复二进制和参数文件。 + + - -l + + 指定日志文件及存放路径。 + + 默认值:$GAUSSLOG/om/gs\_backup-YYYY-MM-DD\_hhmmss.log + + +- 其他参数: + - -?, --help + + 显示帮助信息。 + + - -V, --version + + 显示版本号信息。 + + + +## 示例 + +- 使用gs\_backup脚本备份数据库主机。 + + ``` + gs_backup -t backup --backup-dir=/opt/software/gaussdb/backup_dir -h plat1 --parameter + Backing up openGauss. + Parsing configuration files. + Successfully parsed the configuration file. + Performing remote backup. + Remote backup succeeded. + Successfully backed up openGauss. + ``` + +- 使用gs\_backup脚本恢复数据库主机。 + + ``` + gs_backup -t restore --backup-dir=/opt/software/gaussdb/backup_dir -h plat1 --parameter + Restoring openGauss. + Parsing the configuration file. + Successfully parsed configuration files. + Performing remote restoration. + Remote restoration succeeded. + Successfully restored openGauss. + ``` + + diff --git a/content/zh/docs/Administratorguide/gs_basebackup.md b/content/zh/docs/Administratorguide/gs_basebackup.md new file mode 100644 index 000000000..0dcdbfe82 --- /dev/null +++ b/content/zh/docs/Administratorguide/gs_basebackup.md @@ -0,0 +1,125 @@ +# gs\_basebackup + +## 背景信息 + +openGauss部署成功后,在数据库运行的过程中,会遇到各种问题及异常状态。openGauss提供了gs\_basebackup工具做基础的物理备份。gs\_basebackup的实现目标是对服务器数据库文件的二进制进行拷贝,其实现原理使用了复制协议。远程执行gs\_basebackup时,需要使用系统管理员账户。gs\_basebackup当前仅支持热备份模式,不支持压缩格式备份。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- gs\_basebackup仅支持全量备份,不支持增量。 +>- gs\_basebackup当前仅支持热备份模式,不支持压缩格式备份。 +>- gs\_basebackup在备份包含绝对路径的表空间时,不能在同一台机器上进行备份。对于同一台机器,绝对路径是唯一的,因此会产生冲突。可以在不同的机器上备份含绝对路径的表空间。 +>- 若打开增量检测点功能且打开双写, gs\_basebackup也会备份双写文件。 +>- 若pg\_xlog目录为软链接,备份时将不会建立软链接,会直接将数据备份到目的路径的pg\_xlog目录下。 + +## 前提条件 + +- 可以正常连接openGauss数据库,pg\_hba.conf中需要配置允许复制链接, 需要配置max\_wal\_senders的数量, 至少有一个可用。 +- 在进行还原时,需要保证各节点备份目录中存在备份文件,若备份文件丢失,则需要从其他节点进行拷贝。 + +## 语法 + +- 显示帮助信息 + + ``` + gs_basebackup -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_basebackup -V | --version + ``` + + +## 参数说明 + +gs\_basebackup参数可以分为如下几类: + +- -D directory + + 备份文件输出的目录,必选项。 + + +- 常用参数: + - -c,--checkpoint=fast|spread + + 设置检查点模式为fast或者spread\(默认\) + + - -l,--label=LABEL + + 为备份设置标签 + + - -P,--progress + + 启用进展报告 + + - -v, --verbose + + 启用冗长模式 + + - -V, --version + + 打印版本后退出 + + - -?,--help + + 显示gs\_basebackup命令行参数 + + +- 连接参数 + - -h, --host=HOSTNAME + + 指定正在运行服务器的主机名或者Unix域套接字的路径。 + + - -p,--port=PORT + + 指定数据库服务器的端口号。 + + 可以通过port参数修改默认端口号。 + + - -U,--username=USERNAME + + 指定连接数据库的用户。 + + - -s, --status-interval=INTERVAL + + 发送到服务器的状态包的时间\(以秒为单位\) + + - -w,--no-password + + 不出现输入密码提示。 + + - -W, --password + + 当使用-U参数连接本地数据库或者连接远端数据库时,可通过指定该选项出现输入密码提示。 + + + +## 示例 + +``` +gs_basebackup -D /home/test/trunk/install/data/backup -h 127.0.0.1 -p 21233 +INFO: The starting position of the xlog copy of the full build is: 0/1B800000. The slot minimum LSN is: 0/1B800000. +``` + +## 从备份文件恢复数据 + +当数据库发生故障需要从备份文件进行恢复。因为gs\_basebackup是对数据库按二进制进行备份,因此恢复时可以直接拷贝替换原有的文件, 或者直接在备份的库上启动数据库。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 若当前数据库实例正在运行,直接从备份文件启动数据库可能会存在端口冲突,这是需要修配置文件的port参数,或者在启动数据库时指定一下端口。 +>- 若当前备份文件为主备数据库,可能需要修改一下主备之间的复制连接。即配置文件中的postgre.conf中的replconninfo1, replconninfo2等 + +若要在原库的地方恢复数据库,参考步骤如下: + +1. 停止数据库服务器, 具体操作请参见<管理员指南\> +2. 将原数据库库和所有表空间复制到另外一个位置, 以备后面需要 +3. 清理原库中的所有或部分文件 +4. 使用数据库系统用户权限从备份中还原需要的数据库文件 +5. 若数据库中存在链接文件, 需要修改使其链接到正确的文件. +6. 重启数据库服务器, 并检查数据库内容,确保数据库已经恢复到所需的状态。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 暂不支持备份文件增量恢复 +>- 恢复后需要检查数据库中的链接文件是否链接到正确的文件 + diff --git a/content/zh/docs/Administratorguide/gs_dump.md b/content/zh/docs/Administratorguide/gs_dump.md new file mode 100644 index 000000000..ad2a4bc20 --- /dev/null +++ b/content/zh/docs/Administratorguide/gs_dump.md @@ -0,0 +1,561 @@ +# gs\_dump + +## 背景信息 + +gs\_dump是openGauss用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等)。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。 + +gs\_dump工具由操作系统用户omm执行。 + +gs\_dump工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。 + +gs\_dump工具支持导出完整一致的数据。例如,T1时刻启动gs\_dump导出A数据库,那么导出数据结果将会是T1时刻A数据库的数据状态,T1时刻之后对A数据库的修改不会被导出。 + +gs\_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。 + +- 纯文本格式的SQL脚本文件:包含将数据库恢复为其保存时的状态所需的SQL语句。通过[gsql](zh-cn_topic_0249632261.md)运行该SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。 +- 归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见[表1](#zh-cn_topic_0249632271_zh-cn_topic_0237152335_zh-cn_topic_0058967678_t17db29a12e7342cfbf02b2f6e50ff1a5)。该导出结果必须与[gs\_restore](gs_restore.md#ZH-CN_TOPIC_0256377138)配合使用来恢复数据库,gs\_restore工具在导入时,系统允许用户选择需要导入的内容,甚至可以在导入之前对等待导入的内容进行排序。 + +## 主要功能 + +gs\_dump可以创建四种不同的导出文件格式,通过**\[**-F或者--format=**\]**选项指定,具体如[表1](#zh-cn_topic_0249632271_zh-cn_topic_0237152335_zh-cn_topic_0058967678_t17db29a12e7342cfbf02b2f6e50ff1a5)所示。 + +**表 1** 导出文件格式 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

格式名称

+

-F的参数值

+

说明

+

建议

+

对应导入工具

+

纯文本格式

+

p

+

纯文本脚本文件包含SQL语句和命令。命令可以由gsql命令行终端程序执行,用于重新创建数据库对象并加载表数据。

+

小型数据库,一般推荐纯文本格式。

+

使用gsql工具恢复数据库对象前,可根据需要使用文本编辑器编辑纯文本导出文件。

+

自定义归档格式

+

c

+

一种二进制文件。支持从导出文件中恢复所有或所选数据库对象。

+

中型或大型数据库,推荐自定义归档格式。

+

使用gs_restore可以选择要从自定义归档导出文件中导入相应的数据库对象。

+

目录归档格式

+

d

+

该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。

+

-

+

tar归档格式

+

t

+

tar归档文件支持从导出文件中恢复所有或所选数据库对象。tar归档格式不支持压缩且对于单独表大小应小于8GB。

+

-

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>可以使用gs\_dump程序将文件压缩为纯文本或自定义归档导出文件,减少导出文件的大小。生成纯文本导出文件时,默认不压缩。生成自定义归档导出文件时,默认进行中等级别的压缩。gs\_dump程序无法压缩已归档导出文件。通过压缩方式导出纯文本格式文件,gsql无法成功导入数据对象。 + +## 注意事项 + +禁止修改导出的文件和内容,否则可能无法恢复成功。 + +为了保证数据一致性和完整性,gs\_dump会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs\_dump会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 + +## 语法 + +``` +gs_dump [OPTION]... [DBNAME] +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>“dbname”前面不需要加短或长选项。“dbname”指定要连接的数据库。 +>例如: +>不需要-d,直接指定“dbname”。 +>``` +>gs_dump -p port_number postgres -f dump1.sql +>``` +>或者 +>``` +>export PGDATABASE=postgres +>``` +>``` +> gs_dump -p port_number -f dump1.sql +>``` +>环境变量: PGDATABASE + +## 参数说明 + +通用参数: + +- -f, --file=FILENAME + + 将输出发送至指定文件或目录。如果省略该参数,则使用标准输出。如果输出格式为\(-F c/-F d/-F t\)时,必须指定-f参数。如果-f的参数值含有目录,要求当前用户对该目录具有读写权限,并且不能指定已有目录。 + +- -F, --format=c|d|t|p + + 选择输出格式。格式如下: + + - p|plain:输出一个文本SQL脚本文件(默认)。 + - c|custom:输出一个自定义格式的归档,并且以目录形式输出,作为gs\_restore输入信息。该格式是最灵活的输出格式,因为能手动选择,而且能在恢复过程中将归档项重新排序。该格式默认状态下会被压缩。 + - d|directory:该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。 + - t|tar:输出一个tar格式的归档形式,作为gs\_restore输入信息。tar格式与目录格式兼容;tar格式归档形式在提取过程中会生成一个有效的目录格式归档形式。但是,tar格式不支持压缩且对于单独表有8GB的大小限制。此外,表数据项的相应排序在恢复过程中不能更改。 + + 输出一个tar格式的归档形式,也可以作为gsql输入信息。 + + +- -v, --verbose + + 指定verbose模式。该选项将导致gs\_dump向转储文件输出详细的对象注解和启动/停止次数,向标准错误流输出处理信息。 + +- -V, --version + + 打印gs\_dump版本,然后退出。 + +- -Z, --compress=0-9 + + 指定使用的压缩比级别。 + + 取值范围:0\~9 + + - 0表示无压缩。 + - 1表示压缩比最小,处理速度最快。 + - 9表示压缩比最大,处理速度最慢。 + + 针对自定义归档格式,该选项指定单个表数据片段的压缩,默认方式是以中等级别进行压缩。p、tar归档格式目前不支持压缩。 + +- --lock-wait-timeout=TIMEOUT + + 请勿在转储刚开始时一直等待以获取共享表锁。如果无法在指定时间内锁定某个表,就选择失败。可以以任何符合SET statement\_timeout的格式指定超时时间。 + +- -?, --help + + 显示gs\_dump命令行参数帮助,然后退出。 + + +转储参数: + +- -a, --data-only + + 只输出数据,不输出模式\(数据定义\)。转储表数据、大对象和序列值。 + +- -b, --blobs + + 该参数为扩展预留接口,不建议使用。 + +- -c, --clean + + 在将创建数据库对象的指令输出到备份文件之前,先将清理(删除)数据库对象的指令输出到备份文件中。(如果目标数据库中没有任何对象,gs\_restore工具可能会输出一些提示性的错误信息) + + 该选项只对文本格式有意义。针对归档格式,可以调用gs\_restore时指定选项。 + +- -C, --create + + 备份文件以创建数据库和连接到创建的数据库的命令开始。(如果命令脚本是这种方式执行,无所谓在运行脚本之前连接的是哪个数据库。) + + 该选项只对文本格式有意义。针对归档格式,可以在调用gs\_restore时指定选项。 + +- -E, --encoding=ENCODING + + 以指定的字符集编码创建转储。默认情况下,以数据库编码创建转储。(得到相同结果的另一个办法是将环境变量“PGCLIENTENCODING”设置为所需的转储编码。) + +- -n, --schema=SCHEMA + + 只转储与模式名称匹配的模式,此选项包括模式本身和所有它包含的对象。如果该选项没有指定,所有在目标数据库中的非系统模式将会被转储。写入多个-n选项来选择多个模式。此外,根据gsql的\\d命令所使用的相同规则,模式参数可被理解成一个pattern,所以多个模式也可以通过在该pattern中写入通配符来选择。使用通配符时,注意给pattern打引号,防止shell扩展通配符。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 当-n已指定时,gs\_dump不会转储已选模式所附着的任何其他数据库对象。因此,无法保证某个指定模式的转储结果能够自行成功地储存到一个空数据库中。 + >- 当-n指定时,非模式对象不会被转储。 + + 转储支持多个模式的转储。多次输入-n schemaname转储多个模式。 + + 例如: + + ``` + gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -n sch1 -n sch2 + ``` + + 在上面这个例子中,sch1和sch2会被转储。 + +- -N, --exclude-schema=SCHEMA + + 不转储任何与模式pattern匹配的模式。Pattern将参照针对-n的相同规则来理解。可以通过输入多次-N,不转储与任何pattern匹配的模式。 + + 当同时输入-n和-N时,会转储与至少一个-n选项匹配、与-N选项不匹配的模式。如果有-N没有-n,则不转储常规转储中与-N匹配的模式。 + + 转储过程支持排除多个模式。 + + 在转储过程中,输入-N exclude schema name排除多个模式。 + + 例如: + + ``` + gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -N sch1 -N sch2 + ``` + + 在上面这个例子中,sch1和sch2在转储过程中会被排除。 + +- -o, --oids + + 转储每个表的对象标识符(OIDs),作为表的一部分数据。该选项用于应用以某种方式参照了OID列的情况。如果不是以上这种情况,请勿使用该选项。 + +- -O, --no-owner + + 不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs\_dump会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的数据库对象的归属。如果脚本正在运行,该语句不会执行成功,除非是由系统管理员触发(或是拥有脚本中所有对象的同一个用户)。通过指定-O,编写一个任何用户都能存储的脚本,且该脚本会授予该用户拥有所有对象的权限。 + + 该选项只对文本格式有意义。针对归档格式,可以在调用gs\_restore时指定选项。 + +- -s, --schema-only + + 只转储对象定义(模式),而非数据。 + +- -S, --sysadmin=NAME + + 该参数为扩展预留接口,不建议使用。 + +- -t, --table=TABLE + + 指定转储的表(或视图、或序列、或外表)对象列表,可以使用多个-t选项来选择多个表,也可以使用通配符指定多个表对象。 + + 当使用通配符指定多个表对象时,注意给pattern打引号,防止shell扩展通配符。 + + 当使用-t时,-n和-N没有任何效应,这是因为由-t选择的表的转储不受那些选项的影响。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- -t参数选项个数必须小于等于100。 + >- 如果-t参数选项个数大于100,建议使用参数--include-table-file来替换。 + >- 当-t已指定时,gs\_dump不会转储已选表所附着的任何其他数据库对象。因此,无法保证某个指定表的转储结果能够自行成功地储存到一个空数据库中。 + >- -t tablename只转储在默认搜索路径中可见的表。-t '\*.tablename'转储数据库下所有模式下的tablename表。-t schema.table转储特定模式中的表。 + >- -t tablename不会导出表上的触发器信息。 + + 例如: + + ``` + gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -t schema1.table1 -t schema2.table2 + ``` + + 在上面这个例子中,schema1.table1和schema2.table2会被转储。 + +- --include-table-file=FILENAME + + 指定需要dump的表文件。 + +- -T, --exclude-table=TABLE + + 不转储的表(或视图、或序列、或外表)对象列表,可以使用多个-t选项来选择多个表,也可以使用通配符指定多个表对象。 + + 当同时输入-t和-T时,会转储在-t列表中,而不在-T列表中的表对象。 + + 例如: + + ``` + gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -T table1 -T table2 + ``` + + 在上面这个例子中,table1和table2在转储过程中会被排除。 + +- --exclude-table-file=FILENAME + + 指定不需要dump的表文件。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >同--include-table-file,其内容格式如下: + >schema1.table1 + >schema2.table2 + >...... + +- -x, --no-privileges|--no-acl + + 防止转储访问权限(授权/撤销命令)。 + +- --binary-upgrade + + 该参数为扩展预留接口,不建议使用。 + +- --binary-upgrade-usermap="USER1=USER2" + + 该参数为扩展预留接口,不建议使用。 + +- --column-inserts|--attribute-inserts + + 以INSERT命令带列名(INSERT INTO表(列、…)值…)方式导出数据。这会导致恢复缓慢。但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。 + +- --disable-dollar-quoting + + 该选项将禁止在函数体前使用美元符号$,并强制使用SQL标准字符串语法对其进行引用。 + +- --disable-triggers + + 该参数为扩展预留接口,不建议使用。 + +- --exclude-table-data=TABLE + + 指定不转储任何匹配表pattern的表这方面的数据。依照针对-t的相同规则理解该pattern。 + + 可多次输入--exclude-table-data来排除匹配任何pattern的表。当用户需要特定表的定义但不需要其中的数据时,这个选项很有帮助。 + + 排除数据库中所有表的数据,参见[--schema-only](#zh-cn_topic_0249632271_zh-cn_topic_0237152335_zh-cn_topic_0059777770_l35ed3d5a093e42ab8fc945dd3ca80ecd)。 + +- --inserts + + 发出INSERT命令(而非COPY命令)时转储数据。这会导致恢复缓慢。 + + 但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。注意如果重排列顺序,可能会导致恢复整个失败。列顺序改变时,--column-inserts选项不受影响,虽然会更慢。 + +- --no-security-labels + + 该参数为扩展预留接口,不建议使用。 + +- --no-tablespaces + + 不输出选择表空间的命令。使用该选项,无论默认表空间是哪个,在恢复过程中所有对象都会被创建。 + + 该选项只对文本格式有意义。针对归档格式,可以在调用gs\_restore时指定选项。 + +- --no-unlogged-table-data + + 该参数为扩展预留接口,不建议使用。 + +- --non-lock-table + + 该参数为扩展预留接口,不建议使用。 + +- --include-alter-table + + 转储表删除列。该选项会记录列的删除。 + +- --quote-all-identifiers + + 强制对所有标识符加引号。为了向后续版本迁移,且其中可能涉及引入额外关键词,在转储相应数据库时该选项会有帮助。 + +- --section=SECTION + + 指定已转储的名称区段(pre-data、data、和post-data)。 + +- --serializable-deferrable + + 转储过程中使用可串行化事务,以确保所使用的快照与之后的数据库状态一致;要实现该操作需要在无异常状况的事务流中等待某个点,因为这样才能保证转储成功,避免引起其他事务出现serialization\_failure要重新再做。 + + 但是该选项对于灾难恢复没有益处。对于在原始数据库进行升级的时候,加载一个数据库的拷贝作为报告或其他只读加载共享的转储是有帮助的。没有这个选项,转储会反映一个与任何事务最终提交的序列化执行不一致的状态。 + + 如果当gs\_dump启动时,读写事务仍处于非活动状态,即便使用该选项也不会对其产生影响。如果读写事务处于活动状态,转储的开始时间可能会延迟一段不确定的时间。 + +- --use-set-session-authorization + + 输出符合SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象所有权。这样令转储更加符合标准,但是如果转储文件中的对象的历史有些问题,那么可能不能正确恢复。并且,使用SET SESSION AUTHORIZATION的转储需要数据库系统管理员的权限才能转储成功,而ALTER OWNER需要的权限则低得多。 + +- --with-encryption=AES128 + + 指定转储数据需用AES128进行加密。 + +- --with-key=KEY + + AES128密钥长度必须是16字节。 + +- --include-depend-objs + + 备份结果包含依赖于指定对象的对象信息。该参数需要同-t/--include-table-file参数关联使用才会生效。 + +- --exclude-self + + 备份结果不包含指定对象自身的信息。该参数需要同-t/--include-table-file参数关联使用才会生效。 + +- --dont-overwrite-file + + 文本、tar、以及自定义格式情况下会重写现有文件。这对目录格式不适用。 + + 例如: + + 设想这样一种情景,即当前目录下backup.sql已存在。如果在输入命令中输入-f backup.sql选项时,当前目录恰好也生成backup.sql,文件就会被重写。 + + 如果备份文件已存在,且输入--dont-overwrite-file选项,则会报告附带‘转储文件已经存在’信息的错误。 + + ``` + gs_dump -p port_number postgres -f backup.sql -F plain --dont-overwrite-file + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>- -s/--schema-only和-a/--data-only不能同时使用。 +>- -c/--clean和-a/--data-only不能同时使用。 +>- --inserts/--column-inserts和-o/--oids不能同时使用,因为INSERT命令不能设置OIDS。 +>- --role和--rolepassword必须一起使用。 +>- --binary-upgrade-usermap和--binary-upgrade必须一起使用。 +>- --include-depend-objs/--exclude-self需要同-t/--include-table-file参数关联使用才会生效 +>- --exclude-self必须同--include-depend-objs一起使用。 + +连接参数: + +- -h, --host=HOSTNAME + + 指定主机名称。如果数值以斜杠开头,则被用作到Unix域套接字的路径。缺省从PGHOST环境变量中获取(如果已设置),否则,尝试一个Unix域套接字连接。 + + 该参数只针对openGauss外,对openGauss内本机只能用127.0.0.1。 + + 例如:主机名 + + 环境变量:PGHOST + +- -p, --port=PORT + + 指定主机端口。在开启线程池情况下,建议使用 pooler port,即主机端口+1。 + + 环境变量:PGPORT + +- -U, --username=NAME + + 指定所连接主机的用户名。 + + 不指定连接主机的用户名时,用户默认系统管理员。 + + 环境变量:PGUSER + +- -w, --no-password + + 不出现输入密码提示。如果主机要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。 + +- -W, --password=PASSWORD + + 指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,“Dump Restore工具”会提示用户输入密码。 + +- --role=ROLENAME + + 指定创建转储使用的角色名。选择该选项,会使gs\_dump连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有gs\_dump要求的权限时,该选项会起到作用,即切换到具备相应权限的角色。某些安装操作规定不允许直接以超系统管理员身份登录,而使用该选项能够在不违反该规定的情况下完成转储。 + +- --rolepassword=ROLEPASSWORD + + 指定角色名的密码。 + + +## 说明 + +如果openGauss有任何本地数据要添加到template1数据库,请谨慎将gs\_dump的输出恢复到一个真正的空数据库中,否则可能会因为被添加对象的定义被复制,出现错误。要创建一个无本地添加的空数据库,需从template0而非template1复制,例如: + +``` +CREATE DATABASE foo WITH TEMPLATE template0; +``` + +tar归档形式的文件大小不得超过8GB(tar文件格式的固有限制)。tar文档整体大小和任何其他输出格式没有限制,操作系统可能对此有要求。 + +由gs\_dump生成的转储文件不包含优化程序用来做执行计划决定的统计数据。因此,最好从某转储文件恢复之后运行ANALYZE以确保最佳效果。转储文件不包含任何ALTER DATABASE…SET命令,这些设置由gs\_dumpall转储,还有数据库用户和其他完成安装设置。 + +## 示例 + +使用gs\_dump转储数据库为SQL文本文件或其它格式的操作,如下所示。 + +示例中“Bigdata@123”表示数据库用户密码;“backup/MPPDB\_backup.sql”表示导出的文件,其中backup表示相对于当前目录的相对目录;“37300”表示数据库服务器端口;“postgres”表示要访问的数据库名。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>导出操作时,请确保该目录存在并且当前的操作系统用户对其具有读写权限。 + +示例1:执行gs\_dump,导出postgres数据库全量信息,导出的MPPDB\_backup.sql文件格式为纯文本格式。 + +``` +gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup.sql -p 37300 postgres -F p +gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: The total objects number is 356. +gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: [100.00%] 356 objects have been dumped. +gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: dump database postgres successfully +gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: total time: 1274 ms +``` + +使用gsql程序从纯文本导出文件中导入数据。 + +示例2:执行gs\_dump,导出postgres数据库全量信息,导出的MPPDB\_backup.tar文件格式为tar格式。 + +``` +gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup.tar -p 37300 postgres -F t +gs_dump[port='37300'][postgres][2018-06-27 10:02:24]: The total objects number is 1369. +gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: [100.00%] 1369 objects have been dumped. +gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: dump database postgres successfully +gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: total time: 50086 ms +``` + +示例3:执行gs\_dump,导出postgres数据库全量信息,导出的MPPDB\_backup.dmp文件格式为自定义归档格式。 + +``` +gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup.dmp -p 37300 postgres -F c +gs_dump[port='37300'][postgres][2018-06-27 10:05:40]: The total objects number is 1369. +gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: [100.00%] 1369 objects have been dumped. +gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: dump database postgres successfully +gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: total time: 36620 ms +``` + +示例4:执行gs\_dump,导出postgres数据库全量信息,导出的MPPDB\_backup文件格式为目录格式。 + +``` +gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup -p 37300 postgres -F d +gs_dump[port='37300'][postgres][2018-06-27 10:16:04]: The total objects number is 1369. +gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: [100.00%] 1369 objects have been dumped. +gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: dump database postgres successfully +gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: total time: 33977 ms +``` + +示例5:执行gs\_dump,导出postgres数据库信息,但不导出/home/MPPDB\_temp.sql中指定的表信息。导出的MPPDB\_backup.sql文件格式为纯文本格式。 + +``` +gs_dump -U omm -W Bigdata@123 -p 37300 postgres --exclude-table-file=/home/MPPDB_temp.sql -f backup/MPPDB_backup.sql +gs_dump[port='37300'][postgres][2018-06-27 10:37:01]: The total objects number is 1367. +gs_dump[port='37300'][postgres][2018-06-27 10:37:22]: [100.00%] 1367 objects have been dumped. +gs_dump[port='37300'][postgres][2018-06-27 10:37:22]: dump database postgres successfully +gs_dump[port='37300'][postgres][2018-06-27 10:37:22]: total time: 37017 ms +``` + +示例6:执行gs\_dump,仅导出依赖于指定表testtable的视图信息。然后创建新的testtable表,再恢复依赖其上的视图。 + +- 备份仅依赖于testtable的视图。 + + ``` + gs_dump -s -p 37300 postgres -t PUBLIC.testtable --include-depend-objs --exclude-self -f backup/MPPDB_backup.sql -F p + gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: The total objects number is 331. + gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: [100.00%] 331 objects have been dumped. + gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: dump database postgres successfully + gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: total time: 327 ms + ``` + +- 修改testtable名称。 + + ``` + gsql -p 37300 postgres -r -c "ALTER TABLE PUBLIC.testtable RENAME TO testtable_bak;" + ``` + +- 创建新的testtable表。 + + ``` + CREATE TABLE PUBLIC.testtable(a int, b int, c int); + ``` + +- 还原依赖于testtable的视图。 + + ``` + gsql -p 37300 postgres -r -f backup/MPPDB_backup.sql + ``` + + +## 相关命令 + +[gs\_dumpall](gs_dumpall.md#ZH-CN_TOPIC_0256377137),[gs\_restore](gs_restore.md#ZH-CN_TOPIC_0256377138) + diff --git a/content/zh/docs/Administratorguide/gs_dumpall.md b/content/zh/docs/Administratorguide/gs_dumpall.md new file mode 100644 index 000000000..63b771baa --- /dev/null +++ b/content/zh/docs/Administratorguide/gs_dumpall.md @@ -0,0 +1,253 @@ +# gs\_dumpall + +## 背景信息 + +gs\_dumpall是openGauss用于导出所有数据库相关信息工具,它可以导出openGauss数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据、以及openGauss所有数据库公共的全局对象。 + +gs\_dumpall工具由操作系统用户omm执行。 + +gs\_dumpall工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。 + +gs\_dumpall工具支持导出完整一致的数据。例如,T1时刻启动gs\_dumpall导出openGauss数据库,那么导出数据结果将会是T1时刻该openGauss数据库的数据状态,T1时刻之后对openGauss的修改不会被导出。 + +gs\_dumpall在导出openGauss所有数据库时分为两部分: + +- gs\_dumpall自身对所有数据库公共的全局对象进行导出,包括有关数据库用户和组,表空间以及属性(例如,适用于数据库整体的访问权限)信息。 +- gs\_dumpall通过调用gs\_dump来完成openGauss中各数据库的SQL脚本文件导出,该脚本文件包含将数据库恢复为其保存时的状态所需要的全部SQL语句。 + +以上两部分导出的结果为纯文本格式的SQL脚本文件,使用[gsql](zh-cn_topic_0249632261.md)运行该脚本文件可以恢复openGauss数据库。 + +## 注意事项 + +- 禁止修改导出的文件和内容,否则可能无法恢复成功。 +- 为了保证数据一致性和完整性,gs\_dumpall会对需要转储的表设置共享锁。如果某张表在别的事务中设置了共享锁,gs\_dumpall会等待此表的锁释放后锁定此表。如果无法在指定时间内锁定某张表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 +- 由于gs\_dumpall读取所有数据库中的表,因此必须以openGauss管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。 + +## 语法 + +``` +gs_dumpall [OPTION]... +``` + +## 参数说明 + +通用参数: + +- -f, --filename=FILENAME + + 将输出发送至指定文件。如果这里省略,则使用标准输出。 + +- -v, --verbose + + 指定verbose模式。该选项将导致gs\_dumpall向转储文件输出详细的对象注解和启动/停止次数,向标准错误流输出处理信息。 + +- -V, --version + + 打印gs\_dumpall版本,然后退出。 + +- --lock-wait-timeout=TIMEOUT + + 请勿在转储刚开始时一直等待以获取共享表锁。如果无法在指定时间内锁定某个表,就选择失败。可以以任何符合SET statement\_timeout的格式指定超时时间。 + +- -?, --help + + 显示gs\_dumpall命令行参数帮助,然后退出。 + + +转储参数: + +- -a, --data-only + + 只转储数据,不转储模式(数据定义)。 + +- -c, --clean + + 在重新创建数据库之前,执行SQL语句清理(删除)这些数据库。针对角色和表空间的转储命令已添加。 + +- -g, --globals-only + + 只转储全局对象(角色和表空间),无数据库。 + +- -o, --oids + + 转储每个表的对象标识符(OIDs),作为表的一部分数据。该选项用于应用以某种方式参照了OID列的情况。如果不是以上这种情况,请勿使用该选项。 + +- -O, --no-owner + + 不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs\_dumpall会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的模式元素的所属。如果脚本正在运行,该语句不会执行成功,除非是由系统管理员触发(或是拥有脚本中所有对象的同一个用户)。通过指定-O,编写一个任何用户都能存储的脚本,且该脚本会授予该用户拥有所有对象的权限。 + +- -r, --roles-only + + 只转储角色,不转储数据库或表空间。 + +- -s, --schema-only + + 只转储对象定义(模式),而非数据。 + +- -S, --sysadmin=NAME + + 在转储过程中使用的系统管理员名称。 + +- -t, --tablespaces-only + + 只转储表空间,不转储数据库或角色。 + +- -x, --no-privileges + + 防止转储访问权限(授权/撤销命令)。 + +- --column-inserts|--attribute-inserts + + 以INSERT命令带列名(INSERT INTO表(列、…)值…)方式导出数据。这会导致恢复缓慢。但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。 + +- --disable-dollar-quoting + + 该选项将禁止在函数体前使用美元符号$,并强制使用SQL标准字符串语法对其进行引用。 + +- --disable-triggers + + 该参数为扩展预留接口,不建议使用。 + +- --inserts + + 发出INSERT命令(而非COPY命令)时转储数据。这会导致恢复缓慢。注意如果重排列顺序,可能会导致恢复整个失败。--column-inserts选项更加安全,虽然可能更慢些。 + +- --no-security-labels + + 该参数为扩展预留接口,不建议使用。 + +- --no-tablespaces + + 请勿输出创建表空间的命令,也请勿针对对象选择表空间。使用该选项,无论默认表空间是哪个,在恢复过程中所有对象都会被创建。 + +- --no-unlogged-table-data + + 该参数为扩展预留接口,不建议使用。 + +- --quote-all-identifiers + + 强制对所有标识符加引号。为了向后续版本迁移,且其中可能涉及引入额外关键词,在转储相应数据库时该选项会有帮助。 + +- --dont-overwrite-file + + 不重写当前文件。 + +- --use-set-session-authorization + + 输出符合SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象所有权。这样令转储更加符合标准,但是如果转储文件中的对象的历史有些问题,那么可能不能正确恢复。并且,使用SET SESSION AUTHORIZATION的转储需要数据库系统管理员的权限才能转储成功,而ALTER OWNER需要的权限则低得多。 + +- --with-encryption=AES128 + + 指定转储数据需用AES128进行加密。 + +- --with-key=KEY + + AES128密钥长度必须是16字节。 + +- --include-templatedb + + 转储过程中包含模板库。 + +- --binary-upgrade + + 该参数为扩展预留接口,不建议使用。 + +- --binary-upgrade-usermap="USER1=USER2" + + 该参数为扩展预留接口,不建议使用。 + +- --tablespaces-postfix + + 该参数为扩展预留接口,不建议使用。 + +- --parallel-jobs + + 指定备份进程并发数,取值范围为1\~1000。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>- -g/--globals-only和-r/--roles-only不能同时使用。 +>- -g/--globals-only和-t/--tablespaces-only不能同时使用。 +>- -r/--roles-only和-t/--tablespaces-only不能同时使用。 +>- -s/--schema-only和-a/--data-only不能同时使用。 +>- -r/--roles-only和-a/--data-only不能同时使用。 +>- -t/--tablespaces-only和-a/--data-only不能同时使用。 +>- -g/--globals-only和-a/--data-only不能同时使用。 +>- --tablespaces-postfix和--binary-upgrade必须一起使用。 +>- --binary-upgrade-usermap和--binary-upgrade必须一起使用。 +>- --parallel-jobs和-f/--file必须一起使用。 + +连接参数: + +- -h, --host + + 指定主机的名称。如果取值是以斜线开头,它将用作Unix域套接字的目录。默认值取自PGHOST环境变量;如果没有设置,将启动某个Unix域套接字建立连接。 + + 该参数只针对openGauss外,对openGauss内本机只能用127.0.0.1。 + + 环境变量:PGHOST + +- -l, --database + + 指定所连接的转储全局对象的数据库名称,并去寻找还有其他哪些数据库需要被转储。如果没有指定,会使用postgres数据库,如果postgres数据库不存在,会使用template1。 + +- -p, --port + + 指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。默认值设置为PGPORT环境变量。 + + 在开启线程池情况下,建议使用 pooler port,即监听端口+1。 + + 环境变量:PGPORT + +- -U, --username + + 所连接的用户名。 + + 环境变量:PGUSER + +- -w, --no-password + + 不出现输入密码提示。如果服务器要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。 + +- -W, --password + + 指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,“Dump Restore工具”会提示用户输入密码。 + +- --role + + 指定创建转储使用的角色名。选择该选项,会使gs\_dumpall连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有gs\_dumpall要求的权限时,该选项会起到作用,即切换到具备相应权限的角色。某些安装操作规定不允许直接以系统管理员身份登录,而使用该选项能够在不违反该规定的情况下完成转储。 + +- --rolepassword + + 指定具体角色用户的角色密码。 + + +## 说明 + +由于gs\_dumpall内部调用gs\_dump,所以一些诊断信息参见[gs\_dump](gs_dump.md#ZH-CN_TOPIC_0256377136)。 + +一旦恢复,最好在每个数据库上运行ANALYZE,优化程序提供有用的统计数据。 + +gs\_dumpall恢复前需要所有必要的表空间目录才能退出;否则,对于处在非默认位置的数据库,数据库创建会失败。 + +## 示例 + +使用gs\_dumpall一次导出openGauss的所有数据库。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_dumpall仅支持纯文本格式导出。所以只能使用gsql恢复gs\_dumpall导出的转储内容。 + +``` +gs_dumpall -f backup/bkp2.sql -p 37300 +gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:09]: The total objects number is 2371. +gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:35]: [100.00%] 2371 objects have been dumped. +gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:46]: dump database dbname='postgres' successfully +gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:46]: total time: 55567 ms +gs_dumpall[port='37300'][2018-06-27 09:55:46]: dumpall operation successful +gs_dumpall[port='37300'][2018-06-27 09:55:46]: total time: 56088 ms +``` + +## 相关命令 + +[gs\_dump](gs_dump.md#ZH-CN_TOPIC_0256377136),[gs\_restore](gs_restore.md#ZH-CN_TOPIC_0256377138) + diff --git a/content/zh/docs/Administratorguide/gs_restore.md b/content/zh/docs/Administratorguide/gs_restore.md new file mode 100644 index 000000000..9a6b72495 --- /dev/null +++ b/content/zh/docs/Administratorguide/gs_restore.md @@ -0,0 +1,387 @@ +# gs\_restore + +## 背景信息 + +gs\_restore是openGauss提供的针对gs\_dump导出数据的导入工具。通过此工具可由gs\_dump生成的导出文件进行导入。 + +gs\_restore工具由操作系统用户omm执行。 + +主要功能包含: + +- 导入到数据库 + + 如果连接参数中指定了数据库,则数据将被导入到指定的数据库中。其中,并行导入必须指定连接的密码。 + +- 导入到脚本文件 + + 如果未指定导入数据库,则创建包含重建数据库所必须的SQL语句脚本并写入到文件或者标准输出。等效于直接使用gs\_dump导出为纯文本格式。 + + +## 命令格式 + +``` +gs_restore [OPTION]... FILE +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>- FILE没有短选项或长选项。用来指定归档文件所处的位置。 +>- 作为前提条件,需输入dbname或-l选项。不允许用户同时输入dbname和-l选项。 +>- gs\_restore默认是以追加的方式进行数据导入。为避免多次导入造成数据异常,在进行导入时,建议使用"-c" 参数,在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象。 +>- 日志打印无开关,若需隐藏日志,请将日志重定向到日志文件。 + +## 参数说明 + +通用参数: + +- -d, --dbname=NAME + + 连接数据库dbname并直接导入到该数据库中。 + +- -f, --file=FILENAME + + 指定生成脚本的输出文件,或使用-l时列表的输出文件。 + + 默认是标准输出。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >-f不能同-d一起使用。 + +- -F, --format=c|d|t + + 指定归档格式。由于gs\_restore会自动决定格式,因此不需要指定格式。 + + 取值范围: + + - c/custom:该归档形式为[gs\_dump](gs_dump.md#ZH-CN_TOPIC_0256377136)的自定义格式。 + - d/directory:该归档形式是一个目录归档形式。 + - t/tar:该归档形式是一个tar归档形式。 + +- -l, --list + + 列出归档形式内容。这一操作的输出可用作-L选项的输入。注意如果像-n或-t的过滤选项与-l使用,过滤选项将会限制列举的项目(即归档形式内容)。 + +- -v, --verbose + + 指定verbose模式。 + +- -V, --version + + 打印gs\_restore版本,然后退出。 + +- -?, --help + + 显示gs\_restore命令行参数帮助,然后退出。 + + +导入参数: + +- -a, -data-only + + 只导入数据,不导入模式(数据定义)。gs\_restore的导入是以追加方式进行的。 + +- -c, --clean + + 在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象 + +- -C, --create + + 导入到数据库之前请创建数据库。(选择该选项后,以-d打头的数据库将被用作发布首个CREATE DATABASE命令。所有数据将被导入到出现在归档文件的数据库中。) + +- -e, --exit-on-error + + 当发送SQL语句到数据库时如果出现错误,请退出。默认状态下会继续,且在导入后会显示一系列错误信息。 + +- -I, --index=NAME + + 只导入已列举的index的定义。允许导入多个index。如果多次输入-I index导入多个index。 + + 例如: + + ``` + gs_restore -h host_name -p port_number -d postgres -I Index1 -I Index2 backup/MPPDB_backup.tar + ``` + + 在上面这个例子中,Index1和Index2会被导入。 + +- -j, --jobs=NUM + + 运行gs\_restore最耗时的部分(如加载数据、创建index、或创建约束)使用并发任务。该选项能大幅缩短导入时间,即将一个大型数据库导入到某一多处理器的服务器上。 + + 每个任务可能是一个进程或一个线程,这由操作系统决定;每个任务与服务器进行单独连接。 + + 该选项的最优值取决于服务器的硬件设置、客户端、以及网络。还包括这些因素,如CPU核数量、硬盘设置。建议是从增加服务器上的CPU核数量入手,更大的值(服务器上CPU核数量)在很多情况下也能导致数据文件更快的被导入。当然,过高的值会由于超负荷反而导致性能降低。 + + 该选项只支持自定义归档格式。输入文件必须是常规文件(不能是像pipe的文件)。如果是通过脚本文件,而非直接连接数据库服务器,该选项可忽略。而且,多任务不能与--single-transaction选项一起使用。 + +- -L, --use-list=FILENAME + + 只导入列举在list-file中的那些归档形式元素,导入顺序以它们在文件中的顺序为准。注意如果像-n或-t的过滤选项与-L使用,它们将会进一步限制导入的项目。 + + 一般情况下,list-file是通过编辑前面提到的某个-l参数的输出创建的。文件行的位置可更改或直接删除行,也可使用分号(;)在行的开始注出。见下文的举例。 + +- -n, --schema=NAME + + 只导入已列举的模式中的对象。 + + 该选项可与-t选项一起用以导入某个指定的表。 + + 多次输入-n _schemaname_可以导入多个模式。 + + 例如: + + ``` + gs_restore -h host_name -p port_number -d postgres -n sch1 -n sch2 backup/MPPDB_backup.tar + ``` + + 在上面这个例子中,sch1和sch2会被导入。 + +- -O, --no-owner + + 不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs\_restore会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的模式元素的所属。除非是由系统管理员(或是拥有脚本中所有对象的同一个用户)进行数据库首次连接的操作,否则语句会失败。使用-O选项,任何用户名都可用于首次连接,且该用户拥有所有已创建的对象。 + +- -P, --function=NAME\(args\) + + 只导入已列举的函数。请按照函数所在转储文件中的目录,准确拼写函数名称和参数。 + + 当-P单独使用时,表示导入文件中所有'function-name\(args\)'函数;当-P同-n一起使用时,表示导入指定模式下的'function-name\(args\)'函数;多次输入-P,而仅指定一次-n,表示所有导入的函数默认都是位于-n模式下的。 + + 可以多次输入-n schema-name -P 'function-name\(args\)'同时导入多个指定模式下的函数。 + + 例如: + + ``` + ./gs_restore -h host_name -p port_number -d postgres -n test1 -P 'Func1(integer)' -n test2 -P 'Func2(integer)' backup/MPPDB_backup.tar + ``` + + 在上面这个例子中,test1模式下的函数Func1\(i integer\)和test2模式下的函数Func2\(j integer\)会被一起导入。 + +- -s, --schema-only + + 只导入模式(数据定义),不导入数据(表内容)。当前的序列值也不会导入。 + +- -S, --sysadmin=NAME + + 该参数为扩展预留接口,不建议使用。 + +- -t, --table=NAME + + 只导入已列举的表定义、数据或定义和数据。该选项与-n选项同时使用时,用来指定某个模式下的表对象。-n参数不输入时,默认为PUBLIC模式。多次输入-n -t 可以导入指定模式下的多个表。 + + 例如: + + 导入PUBLIC模式下的table1 + + ``` + gs_restore -h host_name -p port_number -d postgres -t table1 backup/MPPDB_backup.tar + ``` + + 导入test1模式下的test1和test2模式下test2 + + ``` + gs_restore -h host_name -p port_number -d postgres -n test1 -t test1 -n test2 -t test2 backup/MPPDB_backup.tar + ``` + + 导入PUBLIC模式下的table1和test1 模式下test1 + + ``` + gs_restore -h host_name -p port_number -d postgres -n PUBLIC -t table1 -n test1 -t table1 backup/MPPDB_backup.tar + ``` + + >![](public_sys-resources/icon-notice.gif) **须知:** + >-t不支持schema\_name.table\_name的输入格式。 + +- -T, --trigger=NAME + + 该参数为扩展预留接口。 + +- -x, --no-privileges/--no-acl + + 防止导入访问权限(grant/revoke命令)。 + +- -1, --single-transaction + + 执行导入作为一个单独事务(即把命令包围在BEGIN/COMMIT中)。 + + 该选项确保要么所有命令成功完成,要么没有改变应用。该选项意为--exit-on-error。 + +- --disable-triggers + + 该参数为扩展预留接口,不建议使用。 + +- --no-data-for-failed-tables + + 默认状态下,即使创建表的命令失败(如表已经存在),表数据仍会被导入。使用该选项,像这种表的数据会被跳过。如果目标数据库已包含想要的表内容,这种行为会有帮助。 + + 该选项只有在直接导入到某数据库中时有效,不针对生成SQL脚本文件输出。 + +- --no-security-labels + + 该参数为扩展预留接口,不建议使用。 + +- --no-tablespaces + + 不输出选择表空间的命令。使用该选项,无论默认表空间是哪个,在导入过程中所有对象都会被创建。 + +- --section=SECTION + + 导入已列举的区段(如pre-data、data、或post-data)。 + +- --use-set-session-authorization + + 该选项用来进行文本格式的备份。 + + 输出SET SESSION AUTHORIZATION命令,而非ALTER OWNER命令,用以决定对象归属。该选项使转储更加兼容标准,但通过参考转储中对象的记录,导入过程可能会有问题。使用SET SESSION AUTHORIZATION的转储要求必须是系统管理员,同时在导入前还需参考"SET SESSION AUTHORIZATION",手工对导出文件的密码进行修改验证,只有这样才能进行正确的导入操作,相比之下,ALTER OWNER对权限要求较低。 + +- --with-key=KEY + + AES128密钥长度必须是16字节。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果转储被加密,则必须在gs\_restore命令中输入--with-key 选项。如果未输入,用户会收到错误信息。 + >应该输入转储时所输入的相同的key。 + >转储格式为c或t时,转储内容已被处理,因此转储格式为c或t是输入不受加密限制。 + + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果安装过程中有任何本地数据要添加到template1数据库,请谨慎将gs\_restore的输出载入到一个真正的空数据库中;否则可能会因为被添加对象的定义被复制,而出现错误。要创建一个无本地添加的空数据库,需从template0而非template1复制,例如: +>``` +>CREATE DATABASE foo WITH TEMPLATE template0; +>``` +>- gs\_restore不能选择性地导入大对象;例如只能导入那些指定表的对象。如果某个归档形式包含大对象,那所有大对象都会被导入,或一个都不会被导入,如果它们通过-L、-t或其他选项被排除。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>1.-d/--dbname 和 -f/--file 不能同时使用; +>2. -s/--schema-only 和 -a/--data-only不能同时使用; +>3. -c/--clean 和 -a/--data-only不能同时使用; +>4. 使用--single-transaction时,-j/--jobs必须为单任务; +>5. --role 和 --rolepassword必须一起使用。 + +连接参数: + +- -h, --host=HOSTNAME + + 指定的主机名称。如果取值是以斜线开头,他将用作Unix域套接字的目录。默认值取自PGHOST环境变量;如果没有设置,将启动某个Unix域套接字建立连接。 + + 该参数只针对openGauss外,对openGauss内本机只能用127.0.0.1。 + +- -p, --port=PORT + + 指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。默认值设置为PGPORT环境变量。 + + 在开启线程池情况下,建议使用 pooler port,即监听端口+1。 + +- -U, --username=NAME + + 所连接的用户名。 + +- -w, --no-password + + 不出现输入密码提示。如果服务器要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。 + +- -W, --password=PASSWORD + + 指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W参数;如果没有-W参数,并且不是系统管理员,“gs\_restore”会提示用户输入密码。 + +- --role=ROLENAME + + 指定导入操作使用的角色名。选择该参数,会使gs\_restore连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有gs\_restore要求的权限时,该参数会起到作用,即切换到具备相应权限的角色。某些安装操作规定不允许直接以初始用户身份登录,而使用该参数能够在不违反该规定的情况下完成导入。 + +- --rolepassword=ROLEPASSWORD + + 指定具体角色用户的角色密码。 + + +## 示例 + +特例:执行gsql程序,使用如下选项导入由gs\_dump/gs\_dumpall生成导出文件夹(纯文本格式)的MPPDB\_backup.sql文件到postgres数据库。 + +``` +gsql -d postgres -p 5432 -W Bigdata@123 -f /home/omm/test/MPPDB_backup.sql +SET +SET +SET +SET +SET +ALTER TABLE +ALTER TABLE +ALTER TABLE +ALTER TABLE +ALTER TABLE +CREATE INDEX +CREATE INDEX +CREATE INDEX +SET +CREATE INDEX +REVOKE +REVOKE +GRANT +GRANT +total time: 30476 ms +``` + +gs\_restore用来导入由gs\_dump生成的导出文件。 + +示例1:执行gs\_restore,将导出的MPPDB\_backup.dmp文件(自定义归档格式)导入到postgres数据库。 + +``` +gs_restore -W Bigdata@123 backup/MPPDB_backup.dmp -p 5432 -d postgres +gs_restore: restore operation successful +gs_restore: total time: 13053 ms +``` + +示例2:执行gs\_restore,将导出的MPPDB\_backup.tar文件(tar格式)导入到postgres数据库。 + +``` +gs_restore backup/MPPDB_backup.tar -p 5432 -d postgres +gs_restore[2017-07-21 19:16:26]: restore operation successful +gs_restore[2017-07-21 19:16:26]: total time: 21203 ms +``` + +示例3:执行gs\_restore,将导出的MPPDB\_backup文件(目录格式)导入到postgres数据库。 + +``` +gs_restore backup/MPPDB_backup -p 5432 -d postgres +gs_restore[2017-07-21 19:16:26]: restore operation successful +gs_restore[2017-07-21 19:16:26]: total time: 21003 ms +``` + +示例4:执行gs\_restore,使用自定义归档格式的MPPDB\_backup.dmp文件来进行如下导入操作。 导入PUBLIC模式下所有对象的定义和数据。在导入时会先删除已经存在的对象,如果原对象存在跨模式的依赖则需手工强制干预。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 5432 -d postgres -e -c -n PUBLIC +gs_restore: [archiver (db)] Error while PROCESSING TOC: +gs_restore: [archiver (db)] Error from TOC entry 313; 1259 337399 TABLE table1 gaussdba +gs_restore: [archiver (db)] could not execute query: ERROR: cannot drop table table1 because other objects depend on it +DETAIL: view t1.v1 depends on table table1 +HINT: Use DROP ... CASCADE to drop the dependent objects too. + Command was: DROP TABLE public.table1; +``` + +手工删除依赖,导入完成后再重新创建。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 5432 -d postgres -e -c -n PUBLIC +gs_restore[2017-07-21 19:16:26]: restore operation successful +gs_restore[2017-07-21 19:16:26]: total time: 2203 ms +``` + +示例5:执行gs\_restore,使用自定义归档格式的MPPDB\_backup.dmp文件来进行如下导入操作。只导入PUBLIC模式下表table1的定义。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 5432 -d postgres -e -c -s -n PUBLIC -t table1 +gs_restore[2017-07-21 19:16:26]: restore operation successful +gs_restore[2017-07-21 19:16:26]: total time: 21000 ms +``` + +示例6:执行gs\_restore,使用自定义归档格式的MPPDB\_backup.dmp文件来进行如下导入操作。只导入PUBLIC模式下表table1的数据。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 5432 -d postgres -e -a -n PUBLIC -t table1 +gs_restore[2017-07-21 19:16:26]: restore operation successful +gs_restore[2017-07-21 19:16:26]: total time: 20203 ms +``` + +## 相关命令 + +[gs\_dump](gs_dump.md#ZH-CN_TOPIC_0256377136),[gs\_dumpall](gs_dumpall.md#ZH-CN_TOPIC_0256377137) + diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-caution.gif b/content/zh/docs/Administratorguide/public_sys-resources/icon-caution.gif similarity index 100% rename from content/zh/docs/Compilationguide/public_sys-resources/icon-caution.gif rename to content/zh/docs/Administratorguide/public_sys-resources/icon-caution.gif diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-danger.gif b/content/zh/docs/Administratorguide/public_sys-resources/icon-danger.gif similarity index 100% rename from content/zh/docs/Compilationguide/public_sys-resources/icon-danger.gif rename to content/zh/docs/Administratorguide/public_sys-resources/icon-danger.gif diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-note.gif b/content/zh/docs/Administratorguide/public_sys-resources/icon-note.gif similarity index 100% rename from content/zh/docs/Compilationguide/public_sys-resources/icon-note.gif rename to content/zh/docs/Administratorguide/public_sys-resources/icon-note.gif diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-notice.gif b/content/zh/docs/Administratorguide/public_sys-resources/icon-notice.gif similarity index 100% rename from content/zh/docs/Compilationguide/public_sys-resources/icon-notice.gif rename to content/zh/docs/Administratorguide/public_sys-resources/icon-notice.gif diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-tip.gif b/content/zh/docs/Administratorguide/public_sys-resources/icon-tip.gif similarity index 100% rename from content/zh/docs/Compilationguide/public_sys-resources/icon-tip.gif rename to content/zh/docs/Administratorguide/public_sys-resources/icon-tip.gif diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-warning.gif b/content/zh/docs/Administratorguide/public_sys-resources/icon-warning.gif similarity index 100% rename from content/zh/docs/Compilationguide/public_sys-resources/icon-warning.gif rename to content/zh/docs/Administratorguide/public_sys-resources/icon-warning.gif diff --git "a/content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244.md" "b/content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244.md" new file mode 100644 index 000000000..2eadbd4d7 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244.md" @@ -0,0 +1,23 @@ +# 例行维护 + +- **[日维护检查项](日维护检查项.md)** + +- **[检查操作系统参数](检查操作系统参数.md)** + +- **[检查openGauss健康状态](检查openGauss健康状态.md)** + +- **[检查数据库性能](检查数据库性能.md)** + +- **[检查和清理日志](检查和清理日志.md)** + +- **[检查时间一致性](检查时间一致性.md)** + +- **[检查应用连接数](检查应用连接数.md)** + +- **[例行维护表](例行维护表.md)** + +- **[例行重建索引](例行重建索引.md)** + +- **[数据安全维护建议](数据安全维护建议.md)** +为保证openGauss数据库中的数据安全,避免丢失数据,非法访问数据等事故发生,请仔细阅读以下内容。 + diff --git "a/content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244\350\241\250.md" "b/content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244\350\241\250.md" new file mode 100644 index 000000000..9a286fbc1 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\344\276\213\350\241\214\347\273\264\346\212\244\350\241\250.md" @@ -0,0 +1,106 @@ +# 例行维护表 + +为了保证数据库的有效运行,数据库必须在插入/删除操作后,基于客户场景,定期做VACUUM FULL和ANALYZE,更新统计信息,以便获得更优的性能。 + +## 相关概念 + +使用VACUUM、VACUUM FULL和ANALYZE命令定期对每个表进行维护,主要有以下原因: + +- VACUUM FULL可回收已更新或已删除的数据所占据的磁盘空间,同时将小数据文件合并。 +- VACUUM对每个表维护了一个可视化映射来跟踪包含对别的活动事务可见的数组的页。一个普通的索引扫描首先通过可视化映射来获取对应的数组,来检查是否对当前事务可见。若无法获取,再通过堆数组抓取的方式来检查。因此更新表的可视化映射,可加速唯一索引扫描。 +- VACUUM可避免执行的事务数超过数据库阈值时,事务ID重叠造成的原有数据丢失。 +- ANALYZE可收集与数据库中表内容相关的统计信息。统计结果存储在系统表PG\_STATISTIC中。查询优化器会使用这些统计数据,生成最有效的执行计划。 + +## 操作步骤 + +1. 使用VACUUM或VACUUM FULL命令,进行磁盘空间回收。 + - **VACUUM**: + + 对表执行VACUUM操作 + + ``` + postgres=# VACUUM customer; + ``` + + ``` + VACUUM + ``` + + 可以与数据库操作命令并行运行。(执行期间,可正常使用的语句:SELECT、INSERT、UPDATE和DELETE。不可正常使用的语句:ALTER TABLE)。 + + 对表分区执行VACUUM操作 + + ``` + postgres=# VACUUM customer_par PARTITION ( P1 ); + ``` + + ``` + VACUUM + ``` + + - **VACUUM FULL**: + + ``` + postgres=# VACUUM FULL customer; + ``` + + ``` + VACUUM + ``` + + 需要向正在执行的表增加排他锁,且需要停止其他所有数据库操作。 + +2. 使用ANALYZE语句更新统计信息。 + + ``` + postgres=# ANALYZE customer; + ``` + + ``` + ANALYZE + ``` + + 使用ANALYZE VERBOSE语句更新统计信息,并输出表的相关信息。 + + ``` + postgres=# ANALYZE VERBOSE customer; + ``` + + ``` + ANALYZE + ``` + + 也可以同时执行VACUUM ANALYZE命令进行查询优化。 + + ``` + postgres=# VACUUM ANALYZE customer; + ``` + + ``` + VACUUM + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >VACUUM和ANALYZE会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,建议通过“vacuum\_cost\_delay”参数设置《开发者指南》中“GUC参数说明 \> 资源消耗 \> 基于开销的清理延迟”。 + +3. 删除表 + + ``` + postgres=# DROP TABLE customer; + postgres=# DROP TABLE customer_par; + postgres=# DROP TABLE part; + ``` + + 当结果显示为如下信息,则表示删除成功。 + + ``` + DROP TABLE + ``` + + +## 维护建议 + +- 定期对部分大表做VACUUM FULL,在性能下降后为全库做VACUUM FULL,目前暂定每月做一次VACUUM FULL。 +- 定期对系统表做VACUUM FULL,主要是PG\_ATTRIBUTE。 +- 启用系统自动清理进程(AUTOVACUUM)自动执行VACUUM和ANALYZE,回收被标识为删除状态的记录空间,并更新表的统计数据。 + diff --git "a/content/zh/docs/Administratorguide/\344\276\213\350\241\214\351\207\215\345\273\272\347\264\242\345\274\225.md" "b/content/zh/docs/Administratorguide/\344\276\213\350\241\214\351\207\215\345\273\272\347\264\242\345\274\225.md" new file mode 100644 index 000000000..b1085694c --- /dev/null +++ "b/content/zh/docs/Administratorguide/\344\276\213\350\241\214\351\207\215\345\273\272\347\264\242\345\274\225.md" @@ -0,0 +1,64 @@ +# 例行重建索引 + +## 背景信息 + +数据库经过多次删除操作后,索引页面上的索引键将被删除,造成索引膨胀。例行重建索引,可有效的提高查询效率。 + +数据库支持的索引类型为B-tree索引,例行重建索引可有效的提高查询效率。 + +- 如果数据发生大量删除后,索引页面上的索引键将被删除,导致索引页面数量的减少,造成索引膨胀。重建索引可回收浪费的空间。 +- 新建的索引中逻辑结构相邻的页面,通常在物理结构中也是相邻的,所以一个新建的索引比更新了多次的索引访问速度要快。 + +## 重建索引 + +重建索引有以下两种方式: + +- 先删除索引(DROP INDEX),再创建索引(CREATE INDEX)。 + + 在删除索引过程中,会在父表上增加一个短暂的排他锁,阻止相关读写操作。在创建索引过程中,会锁住写操作但是不会锁住读操作,此时读操作只能使用顺序扫描。 + +- 使用REINDEX语句重建索引。 + - 使用REINDEX TABLE语句重建索引,会在重建过程中增加排他锁,阻止相关读写操作。 + - 使用REINDEX INTERNAL TABLE语句重建desc表(包括列存表的cudesc表)的索引,会在重建过程中增加排他锁,阻止相关读写操作。 + + +## 操作步骤 + +假定在导入表“areaS”上的“area\_id”字段上存在普通索引“areaS\_idx”。重建索引有以下两种方式: + +- 先删除索引(DROP INDEX),再创建索引(CREATE INDEX) + 1. 删除索引。 + + ``` + postgres=# DROP INDEX areaS_idx; + DROP INDEX + ``` + + 2. 创建索引。 + + ``` + postgres=# CREATE INDEX areaS_idx ON areaS (area_id); + CREATE INDEX + ``` + + +- 使用REINDEX重建索引。 + - 使用REINDEX TABLE语句重建索引。 + + ``` + postgres=# REINDEX TABLE areaS; + REINDEX + ``` + + - 使用REINDEX INTERNAL TABLE重建desc表(包括列存表的cudesc表)的索引。 + + ``` + postgres=# REINDEX INTERNAL TABLE areaS; + REINDEX + ``` + + + +>![](public_sys-resources/icon-note.gif) **说明:** +>在重建索引前,用户可以通过临时增大maintenance\_work\_mem和psort\_work\_mem的取值来加快索引的重建。 + diff --git "a/content/zh/docs/Administratorguide/\345\220\257\345\201\234openGauss.md" "b/content/zh/docs/Administratorguide/\345\220\257\345\201\234openGauss.md" new file mode 100644 index 000000000..3d47f2023 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\220\257\345\201\234openGauss.md" @@ -0,0 +1,62 @@ +# 启停openGauss + +## 启动openGauss + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用以下命令启动openGauss。 + + ``` + gs_om -t start + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >双机启动必须以双机模式启动, 若中间过程以单机模式启动, 则必须修复才能恢复双机关系, 用gs\_ctl build进行修复,gs\_ctl的使用方法请参见《openGauss 工具参考》。 + + +## 停止openGauss + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用以下命令停止openGauss。 + + ``` + gs_om -t stop + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >启停节点及AZ的操作请参见《openGauss 工具参考》中“服务端工具 \> gs\_om”章节。 + + +## 示例 + +启动openGauss: + +``` +gs_om -t start +Starting cluster. +========================================= +========================================= +Successfully started. + +``` + +停止openGauss: + +``` +gs_om -t stop +Stopping cluster. +========================================= +Successfully stopped cluster. +========================================= +End stop cluster. +``` + +## 错误排查 + +如果启动openGauss或者停止openGauss服务失败,请根据日志文件中的日志信息排查错误,参见[日志参考](日志参考.md)。 + +如果是超时导致启动失败,可以执行如下命令,设置启动超时时间,默认超时时间为300s。 + +``` +gs_om -t start --time-out=300 +``` + diff --git "a/content/zh/docs/Administratorguide/\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" "b/content/zh/docs/Administratorguide/\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" new file mode 100644 index 000000000..ec12e72a5 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" @@ -0,0 +1,9 @@ +# 备份与恢复 + +- **[概述](概述.md)** + +- **[物理备份恢复](物理备份恢复.md)** + +- **[逻辑备份恢复](逻辑备份恢复.md)** + + diff --git "a/content/zh/docs/Administratorguide/\345\256\236\344\276\213\344\270\273\345\244\207\345\210\207\346\215\242.md" "b/content/zh/docs/Administratorguide/\345\256\236\344\276\213\344\270\273\345\244\207\345\210\207\346\215\242.md" new file mode 100644 index 000000000..b749e97eb --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\256\236\344\276\213\344\270\273\345\244\207\345\210\207\346\215\242.md" @@ -0,0 +1,119 @@ +# 实例主备切换 + +## 操作场景 + +openGauss在运行过程中,数据库管理员可能需要手工对数据库节点做主备切换。例如发现数据库节点主备failover后需要恢复原有的主备角色,或怀疑硬件故障需要手动进行主备切换。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>主备切换为维护操作,确保openGauss状态正常,所有业务结束后,再进行切换操作。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库任意节点,执行如下命令,查看主备情况。 + + ``` + gs_om -t status --detail + ``` + +2. 以操作系统用户omm登录准备切换为主节点的备节点,执行如下命令。 + + ``` + gs_ctl switchover -D /home/omm/cluster/dn1/ + ``` + + /home/omm/cluster/dn1/为备数据库节点的数据目录。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >对于同一集群,上一次主备切换未完成,不能执行下一次切换。对于业务正在操作时,发起switchover,可能主机的线程无法停止导致switchover显示超时,实际后台仍然在运行,等主机线程停止后,switchover即可完成。比如在主机删除一个大的分区表时,可能无法响应switchover发起的信号。 + +3. switchover成功后,执行如下命令记录当前主备机器信息。 + + ``` + gs_om -t refreshconf + ``` + + +## 示例 + +将数据库节点备实例切换为主实例。 + +1.查询集群状态。 + +``` +gs_om -t status --detail +[ Cluster State ] + +cluster_state : Normal +redistributing : No +current_az : AZ_ALL + +[ Datanode State ] + +node node_ip instance state | node node_ip instance state +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +1 pekpopgsci00234 10.244.60.70 6001 /home/wuqw/cluster/dn1 P Primary Normal | 2 pekpopgsci00238 10.244.61.81 6002 /home/wuqw/cluster/dn1 S Standby Normal +``` + +2.登录备节点,进行主备切换。 + +``` +gs_ctl switchover -D /home/wuqw/cluster/dn1/ +[2020-06-17 14:28:01.730][24438][][gs_ctl]: gs_ctl switchover ,datadir is -D "/home/wuqw/cluster/dn1" +[2020-06-17 14:28:01.730][24438][][gs_ctl]: switchover term (1) +[2020-06-17 14:28:01.768][24438][][gs_ctl]: waiting for server to switchover............ +[2020-06-17 14:28:11.175][24438][][gs_ctl]: done +[2020-06-17 14:28:11.175][24438][][gs_ctl]: switchover completed (/home/wuqw/cluster/dn1) +``` + +3.保存集群主备机器信息。 + +``` +gs_om -t refreshconf +Generating dynamic configuration file for all nodes. +Successfully generated dynamic configuration file. +``` + +## 错误排查 + +如果switchover过程中出现失败,请根据日志文件中的日志信息排查错误,参见[日志参考](日志参考.md)。 + +## 异常处理 + +异常判断标准如下: + +- 业务压力下,主备实例切换时间长,这种情况不需要处理。 +- 其他备机正在build的情况下,主机需要发送日志到备机后,才能降备,导致主备切换时间长。这种情况不需要处理,但应尽量避免build过程中进行主备切换。 +- 切换过程中,因网络故障、磁盘满等原因造成主备实例连接断开,出现双主现象时,此时请参考如下步骤修复。 + + >![](public_sys-resources/icon-warning.gif) **警告:** + >出现双主状态后,请按如下步骤恢复成正常的主备状态。否则可能会造成数据丢失。 + + +1. 执行以下命令查询数据库当前的实例状态。 + + ``` + gs_om -t status --detail + ``` + + 若查询结果显示两个实例的状态都为Primary,这种状态为异常状态。 + +2. 确定降为备机的节点,在节点上执行如下命令关闭服务。 + + ``` + gs_ctl stop -D /home/omm/cluster/dn1/ + ``` + +3. 执行以下命令,以standby模式启动备节点。 + + ``` + gs_ctl start -D /home/omm/cluster/dn1/ -M standby + ``` + +4. 保存集群主备机器信息。 + + ``` + gs_om -t refreshconf + ``` + +5. 查看集群状态,确认实例状态恢复。 + diff --git "a/content/zh/docs/Administratorguide/\345\256\241\350\256\241\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\345\256\241\350\256\241\346\227\245\345\277\227.md" new file mode 100644 index 000000000..accfb1f91 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\256\241\350\256\241\346\227\245\345\277\227.md" @@ -0,0 +1,6 @@ +# 审计日志 + +审计功能开启时会不断产生大量的审计日志,占用磁盘空间。用户可以根据磁盘空间的大小设置审计日志维护策略。 + +关于如何设置审计日志维护策略请参见《开发者指南》中“管理数据库安全 \> 设置数据库审计 \> 维护审计日志”章节。 + diff --git "a/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-1.md" "b/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-1.md" new file mode 100644 index 000000000..50e179e72 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-1.md" @@ -0,0 +1,363 @@ +# 异常处理 + +如果发现检查结果异常,可以根据以下内容进行修复。 + +**表 1** 检查openGauss运行状态 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

检查项

+

异常状态

+

处理方法

+

CheckClusterState(检查openGauss状态)

+

openGauss未启动或openGauss实例未启动

+

使用以下命令启动openGauss及实例。

+
gs_om -t start
+

openGauss状态异常或openGauss实例异常

+

检查各主机、实例状态,根据状态信息进行排查。

+
gs_check -i CheckClusterState
+

CheckDBParams(检查数据库参数)

+

数据库参数错误

+

通过gs_guc工具修改数据库参数为指定值。

+

CheckDebugSwitch(检查调试日志)

+

日志级别不正确

+

使用gs_guc工具将log_min_messages改为指定内容。

+

CheckDirPermissions(检查目录权限)

+

路径权限错误

+

修改对应目录权限为指定数值(750/700)。

+
chmod 750 DIR
+

CheckReadonlyMode(检查只读模式)

+

只读模式被打开

+

确认数据库节点所在磁盘使用率未超阈值(默认60%)且未在执行其他运维操作。

+
gs_check -i CheckDataDiskUsage
+ps ux
+

使用gs_guc工具关闭openGauss只读模式

+
gs_guc reload -N all -I all -c 'default_transaction_read_only = off' 
+gs_guc reload -N all -I all -c 'default_transaction_read_only = off' 
+

CheckEnvProfile(检查环境变量)

+

环境变量不一致

+

重新执行前置更新环境变量信息。

+

CheckBlockdev(检查磁盘预读块)

+

磁盘预读块大小不为16384

+

使用gs_checkos设置预读块大小为16384KB,并写入自启动文件。

+
gs_checkos -i B3
+

CheckCursorNum(检查游标数)

+

检查游标数失败

+

检查数据库能否正常连接,openGauss状态是否正常。

+

CheckPgxcgroup(检查重分布状态)

+

有未完成重分布的pgxc_group表

+

继续完成扩容或缩容的数据重分布操作。

+
gs_expand、gs_shrink
+

CheckDiskFormat(检查磁盘配置)

+

各节点磁盘配置不一致

+

将各节点的磁盘规格改为相同。

+

CheckSpaceUsage(检查磁盘空间使用率)

+

磁盘可用空间不足

+

清理或扩展对应目录所在的磁盘。

+

CheckInodeUsage(检查磁盘索引使用率)

+

磁盘可用索引不足

+

清理或扩展对应目录所在的磁盘。

+

CheckSwapMemory(检查交换内存)

+

交换内存大于物理内存

+

将交换内存调小或关闭。

+

CheckLogicalBlock(检查磁盘逻辑块)

+

磁盘逻辑块大小不为512

+

使用gs_checkos修改磁盘逻辑块大小为512KB,并写入开机自启动文件。

+
gs_checkos -i B4
+

CheckIOrequestqueue(检查IO请求)

+

IO请求值不为32768

+

使用gs_checkos设置IO请求值为32768,并写入开机自启动文件。

+
gs_checkos -i B4
+

CheckCurConnCount(检查当前连接数)111

+

当前连接数超过最大连接数的90%

+

断开未使用的数据库主节点连接。

+

CheckMaxAsyIOrequests(检查最大异步请求)

+

最大异步请求值小于104857600或当前节点数据库实例数)*1048576

+

使用gs_checkos设置最大异步请求值为104857600和当前节点数据库实例数*1048576中的最大值。

+
gs_checkos -i B4
+

CheckMTU(检查MTU值)

+

MTU值不一致

+

设置各节点的MTU一致为1500或8192。

+
ifconfig eth* MTU 1500
+

CheckIOConfigure(检查IO配置)

+

IO配置不是deadline

+

使用gs_checkos设置IO配置为deadline,并写入开机自启动文件。

+
gs_checkos -i B4
+

CheckRXTX(检查RXTX值)

+

网卡RX/TX值不是4096

+

使用checkos设置openGauss使用的物理网卡RX/TX值为4096

+
gs_checkos -i B5
+

CheckPing(检查网络通畅)

+

存在openGauss IP无法ping通

+

检查异常ip间网络设置和状态、防火墙状态。

+

CheckNetWorkDrop(检查网络丢包率)

+

网络通信丢包率高于1%

+

检查对应IP间网络负载、状态。

+

CheckMultiQueue(检查网卡多队列)

+

未开启网卡多队列并未将网卡中断绑定到不同CPU核心

+

开启网卡多队列并将网卡队列中断绑定到不同的CPU核心。

+

CheckEncoding(检查编码格式)

+

各节点编码格式不一致

+

在/etc/profile中写入一致的编码信息。

+
echo "export LANG=XXX" >> /etc/profile
+

CheckFirewall(检查防火墙)

+

防火墙未关闭

+

关闭防火墙服务。

+
redHat(CentOS)7.x:systemctl status firewalld.service
+redHat(CentOS)6.x:service iptables down
+SuSE:SuSEfirewall2 down
+

CheckKernelVer(检查内核版本)

+

内核版本不一致

+

使用gs_replace替换不一致的节点。

+
gs_replace
+

CheckMaxHandle(检查最大文件句柄数)

+

最大文件句柄数小于1000000

+

设置91-nofile.conf/90-nofile.conf最大文件句柄数软硬限制为1000000。

+
gs_checkos -i B2
+

CheckNTPD(检查时间同步服务)

+

NTPD服务未开启或时间误差超过一分钟

+

开启NTPD服务并设置时钟一致。

+

CheckOSVer(检查操作系统版本)

+

操作系统不被支持或不在同一混搭列表

+

使用gs_replace将异常节点替换为受支持系统或在同一混搭列表内的系统的节点。

+
gs_replace
+

CheckSysParams(检查操作系统参数)

+

操作系统参数设置不满足要求

+

使用gs_checkos进行参数设置或手动设置。

+
gs_checkos -i B1
+vim /etc/sysctl.conf
+

CheckTHP(检查THP服务)

+

THP服务未开启

+

使用gs_checkos设置THP服务

+
gs_checkos -i B6
+

CheckTimeZone(检查时区)

+

时区不一致

+

设置各节点为同一时区

+
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
+

CheckCPU(检查CPU)

+

CPU占用过高或IO等待过高

+

进行CPU配置升级或磁盘性能升级

+

CheckSshdService(检查SSHD服务)

+

未开启SSHD服务

+

启动SSHD服务并写入开机自启动文件

+
server sshd start
+echo "server sshd start" >> initFile
+

CheckSshdConfig(检查SSHD配置)

+

SSHD服务配置错误

+

设置SSHD服务,

+
PasswordAuthentication=no;
+MaxStartups=1000;
+UseDNS=yes;
+ClientAliveInterval=10800/ClientAliveInterval=0
+

并重启服务:

+
server sshd start
+

CheckCrondService(检查Crond服务)

+

Crond服务未启动

+

安装Crond服务并启用

+

CheckStack(检查堆栈大小)

+

堆栈大小小于3072

+

使用gs_checkos设置为3072并重启堆栈值过小进程。

+
gs_checkos -i B2
+

CheckNoCheckSum(检查NoCheckSum参数)

+

NoCheckSum设置错误或不一致

+

设置各节点的NoCheckSum值一致(存在redHat6.4/6.5且为bond0时全部设为Y,否则全部设为N)

+
echo Y > /sys/module/sctp/parameters/no_checksums
+

CheckSysPortRange(检查系统端口设置)

+

系统ip端口不在预期范围内或openGauss端口在系统ip端口内

+

设置系统ip端口范围参数到26000-65535之中;设置openGauss端口在系统ip端口范围外

+
vim /etc/sysctl.conf
+

CheckMemInfo(检查内存信息)

+

各节点内存大小不一致

+

使用相同规格的物理内存

+

CheckHyperThread(检查超线程)

+

未开启CPU超线程

+

开启CPU超线程

+

CheckTableSpace(检查表空间)

+

表空间路径和openGauss路径存在嵌套或表空间路径相互存在嵌套

+

将表空间数据迁移到路径合法的表空间中

+

CheckSctpService(检查SCTP服务)

+

未开启SCTP服务

+

部署并开启SCTP服务

+
modprobe sctp
+
+ diff --git "a/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-3.md" "b/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-3.md" new file mode 100644 index 000000000..394795494 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206-3.md" @@ -0,0 +1,124 @@ +# 异常处理 + +使用gs\_checkperf工具检查openGauss性能状态后,如果发现检查结果发现异常,可以根据以下内容进行修复。 + +**表 1** 检查openGauss级别性能状态 + + + + + + + + + + + + + + + + + + + + + + + + + +

异常状态

+

处理方法

+

主机CPU占有率高

+

1、更换和增加高性能的CPU。

+

2、使用top命令查看系统哪些进程的CPU占有率高,然后使用kill命令关闭没有使用的进程。

+
top
+

openGauss CPU占有率高

+

1、更换和增加高性能的CPU。

+

2、使用top命令查看数据库哪些进程的CPU占有率高,然后使用kill命令关闭没有使用的进程。

+
top
+

3、使用gs_expand工具扩容,增加新的主机均衡CPU占有率。

+

共享内存命中率低

+

1、扩大内存。

+

2、使用如下命令查看操作系统配置文件/etc/sysctl.conf,调大共享内存kernel.shmmax值。

+
vim /etc/sysctl.conf
+

内存中排序比率低

+

扩大内存。

+

I/O、磁盘使用率高

+

1、更换高性能的磁盘。

+

2、调整数据布局,尽量将I/O请求较合理的分配到所有物理磁盘中。

+

3、全库进行VACUUM FULL操作。

+
vacuum full;
+

4、进行磁盘整理。

+

5、降低并发数。

+

事务统计

+

查询pg_stat_activity系统表,将不必要的连接断开。(登录数据库后查询:postgres=# \d+ pg_stat_activity;)

+
+ +**表 2** 检查节点级别性能状态 + + + + + + + + + + + + + + + + +

异常状态

+

处理方法

+

CPU占有率高

+

1、更换和增加高性能的CPU。

+

2、使用top命令查看系统哪些进程的CPU占有率高,然后使用kill命令关闭没有使用的进程。

+
top
+

内存使用率过高情况

+

扩大或清理内存。

+

I/O使用率过高情况

+

1、更换高性能的磁盘。

+

2、进行磁盘清理。

+

3、尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或数据放入内存中进行操作处理。

+
+ +**表 3** 会话/进程级别性能状态 + + + + + + + + + + +

异常状态

+

处理方法

+

CPU、内存、I/O使用率过高情况

+

查看哪个进程占用CPU/内存高或I/O使用率高,若是无用的进程,则kill掉,否则排查具体原因。例如SQL执行占用内存大,查看是否SQL语句需要优化。

+
+ +**表 4** SSD性能状态 + + + + + + + + + + +

异常状态

+

处理方法

+

SSD读写性能故障

+

使用以下命令查看SSD是否有故障,排查具体故障原因。

+
gs_checkperf -i SSD -U omm
+
+ diff --git "a/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206.md" "b/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206.md" new file mode 100644 index 000000000..7996b92a7 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\345\274\202\345\270\270\345\244\204\347\220\206.md" @@ -0,0 +1,106 @@ +# 异常处理 + +使用gs\_checkos检查或设置状态为Abnormal,可以使用如下命令查看详细的错误信息。 + +``` +gs_checkos -i A --detail +``` + +其中,Abnormal为必须处理项,影响openGauss安装。Warning可以不处理,不会影响openGauss安装。 + +- 如果操作系统版本(A1)检查项检查结果为Abnormal,需要将不属于混编范围的操作系统版本替换为混编范围内的操作系统版本。 +- 如果内核版本(A2)检查项检查结果为Warning,则表示openGauss内平台的内核版本不一致。 +- 如果Unicode状态(A3)检查项检查结果为Abnormal,需要将各主机的字符集设置为相同的字符集,可以在/etc/profile文件中添加"export LANG=XXX"(XXX为Unicode编码)。 + + ``` + vim /etc/profile + ``` + +- 如果时区状态(A4)检查项检查结果为Abnormal,需要将各主机的时区设置为相同时区,可以将/usr/share/zoneinfo/目录下的时区文件拷贝为/etc/localtime文件。 + + ``` + cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime + ``` + +- 如果交换内存状态(A5)检查项检查结果为Abnormal,可能是因为swap空间大于mem空间,可减小Swap解决或者增大Mem空间解决。 +- 如果系统控制参数(A6)检查项检查结果为Abnormal,可以使用以下两种方法进行设置。 + - 可以使用如下命令进行设置。 + + ``` + gs_checkos -i B1 + ``` + + - 根据错误提示信息,在/etc/sysctl.conf文件中进行设置。然后执行sysctl -p使其生效。 + + ``` + vim /etc/sysctl.conf + ``` + + + +- 如果文件系统配置状态(A7)检查项检查结果为Abnormal,可以使用如下命令进行设置。 + + ``` + gs_checkos -i B2 + ``` + +- 如果磁盘配置状态(A8)检查项检查结果为Abnormal,需修改磁盘挂载格式为:“rw,noatime,inode64,allocsize=16m”。 + + 使用linux的man mount命令挂载XFS选项: + + ``` + rw,noatime,inode64,allocsize=16m + ``` + + 也可以在/etc/fstab文件中设定XFS选项。如下示例: + + ``` + /dev/data /data xfs rw,noatime,inode64,allocsize=16m 0 0 + ``` + +- 如果预读块大小(A9)检查项检查结果为Abnormal,可以使用如下命令进行设置。 + + ``` + gs_checkos -i B3 + ``` + +- 如果IO调度状态(A10)检查项检查结果为Abnormal,可以使用如下命令进行设置。 + + ``` + gs_checkos -i B4 + ``` + +- 如果网卡配置状态(A11)检查项检查结果为Warning,可以使用如下命令进行设置。 + + ``` + gs_checkos -i B5 + ``` + +- 如果时间一致性(A12)检查项检查结果为Abnormal,需检查是否安装ntp服务,以及ntp服务是否启动;并与ntp时钟源同步。 +- 如果防火墙状态(A13)检查项检查结果为Abnormal,需关闭防火墙服务。使用如下命令进行设置。 + - SuSE: + + ``` + SuSEfirewall2 stop + ``` + + - RedHat7: + + ``` + systemctl disable firewalld + ``` + + - RedHat6: + + ``` + service iptables stop + ``` + + +- 如果THP服务(A14)检查项检查结果为Abnormal,可以使用如下命令进行设置。 + + ``` + gs_checkos -i B6 + ``` + + diff --git "a/content/zh/docs/Administratorguide/\346\200\247\350\203\275\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\346\200\247\350\203\275\346\227\245\345\277\227.md" new file mode 100644 index 000000000..aa269c76f --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\200\247\350\203\275\346\227\245\345\277\227.md" @@ -0,0 +1,22 @@ +# 性能日志 + +性能日志主要关注外部资源的访问性能问题。性能日志指的是数据库系统在运行时检测物理资源的运行状态的日志,在对外部资源进行访问时的性能检测,包括磁盘、Hadoop openGauss等外部资源的访问检测信息。在出现性能问题时,可以借助性能日志及时的定位问题发生的原因,能极大地提升问题解决效率。 + +## 日志文件存储路径 + +数据库节点的性能日志目录在“$GAUSSLOG/gs\_profile”中各自对应的目录下。 + +## 日志文件命名格式 + +数据库节点的性能日志的命名规则: + +postgresql-创建时间.prf + +默认情况下,每日0点或者日志文件大于20MB或者数据库实例(数据库节点)重新启动后,会生成新的日志文件。 + +## 日志内容说明 + +数据库节点每一行日志内容的默认格式: + +主机名称+日期+时间+实例名称+线程号+日志内容 + diff --git "a/content/zh/docs/Administratorguide/\346\223\215\344\275\234\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\346\223\215\344\275\234\346\227\245\345\277\227.md" new file mode 100644 index 000000000..06d2df942 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\223\215\344\275\234\346\227\245\345\277\227.md" @@ -0,0 +1,30 @@ +# 操作日志 + +操作日志是指数据库管理员使用工具操作数据库时以及工具被openGauss调用时产生的日志。如果openGauss发生故障,可以通过这些日志信息跟踪用户对数据库进行了哪些操作,重现故障场景。 + +## 日志文件存储路径 + +默认在“$GAUSSLOG/bin”目录下,如果环境变量$GAUSSLOG不存在或者变量值为空,则工具日志信息不会记录到对应的工具日志文件中,日志信息只会打印到屏幕上。 + +其中$GAUSSLOG默认为“/var/log/gaussdb/_用户名_”。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果使用om脚本部署时,则日志路径为 “/var/log/gaussdb/_用户名_”。 + +## 日志文件命名格式 + +日志文件命名格式为: + +- 工具名-日志创建时间.log +- 工具名-日志创建时间-current.log + +其中,“工具名-日志创建时间.log”是历史日志文件,“工具名-日志创建时间-current.log”是当前日志文件。 + +如果日志大小超过16MB,在下一次调用该工具时,会重命名当前日志文件为历史日志文件,并以当前时间生成新的当前日志文件。 + +例如将“gs\_guc-2015-01-16\_183728-current.log”重命名为“gs\_guc-2015-01-16\_183728.log”,然后重新生成“gs\_guc-2015-01-17\_142216-current.log”。 + +## 维护建议 + +建议定时对过期的日志文件进行转储,以避免大量日志占用太多的磁盘空间和避免重要日志丢失。 + diff --git "a/content/zh/docs/Administratorguide/\346\225\260\346\215\256\345\256\211\345\205\250\347\273\264\346\212\244\345\273\272\350\256\256.md" "b/content/zh/docs/Administratorguide/\346\225\260\346\215\256\345\256\211\345\205\250\347\273\264\346\212\244\345\273\272\350\256\256.md" new file mode 100644 index 000000000..9ae26bc51 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\225\260\346\215\256\345\256\211\345\205\250\347\273\264\346\212\244\345\273\272\350\256\256.md" @@ -0,0 +1,23 @@ +# 数据安全维护建议 + +为保证openGauss数据库中的数据安全,避免丢失数据,非法访问数据等事故发生,请仔细阅读以下内容。 + +## 避免数据被丢失 + +建议用户规划周期性的物理备份,且对备份文件进行可靠的保存。在系统发生严重错误的情况下,可以利用备份文件,将系统恢复到备份前的状态。 + +## 避免数据被非法访问 + +- 建议对数据库用户进行权限分级管理。数据库管理员根据业务需要,建立用户并赋予权限,保证各用户对数据库的合理访问。 +- 对于openGauss的服务端和客户端(或基于客户端库开发的应用程序),最好也部署在可信任的内网中。如果服务端和客户端一定要部署在非信任的网络中,需要在服务启动前,打开SSL加密,保证数据在非信任网络上的传输安全。需要注意的是,打开SSL加密会降低数据库的性能。 + +## 避免系统日志泄露个人数据 + +- 将调试日志发给他人进行分析前,请删除个人数据。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >因为日志级别(log\_min\_messages)设置为DEBUGx(x为DEBUG级别,取值范围为1\~5)时,调试日志中记录的信息可能包含用户的个人数据。 + +- 将系统日志发给其他人进行分析前,请删除个人数据。因为在默认配置下,当SQL语句执行错误时,日志中会记录出错的SQL语句,而这些SQL语句中可能包含用户个人数据。 +- 将log\_min\_error\_statement参数的值设置为PANIC可以避免在系统日志中记录出错的SQL语句,但是关闭此功能将导致发生错误时难以定位。 + diff --git "a/content/zh/docs/Administratorguide/\346\227\245\345\277\227\345\217\202\350\200\203.md" "b/content/zh/docs/Administratorguide/\346\227\245\345\277\227\345\217\202\350\200\203.md" new file mode 100644 index 000000000..0c746436f --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\227\245\345\277\227\345\217\202\350\200\203.md" @@ -0,0 +1,15 @@ +# 日志参考 + +- **[日志类型简介](日志类型简介.md)** + +- **[系统日志](系统日志.md)** + +- **[操作日志](操作日志.md)** + +- **[审计日志](审计日志.md)** + +- **[WAL日志](WAL日志.md)** + +- **[性能日志](性能日志.md)** + + diff --git "a/content/zh/docs/Administratorguide/\346\227\245\345\277\227\347\261\273\345\236\213\347\256\200\344\273\213.md" "b/content/zh/docs/Administratorguide/\346\227\245\345\277\227\347\261\273\345\236\213\347\256\200\344\273\213.md" new file mode 100644 index 000000000..335079c6d --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\227\245\345\277\227\347\261\273\345\236\213\347\256\200\344\273\213.md" @@ -0,0 +1,55 @@ +# 日志类型简介 + +在数据库运行过程中,会出现大量日志,既有保证数据库安全可靠的WAL日志(预写式日志,也称为Xlog),也有用于数据库日常维护的运行和操作日志等。在数据库发生故障时,可以参考这些日志进行问题定位和数据库恢复的操作。 + +## 日志类型 + +日志类型的详细说明请参见下表。 + +**表 1** 日志类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类型

+

说明

+

系统日志

+

数据库系统进程运行时产生的日志,记录系统进程的异常信息。

+

操作日志

+

通过客户端工具(例如gs_guc)操作数据库时产生的日志。

+

Trace日志

+

打开数据库的调试开关后,会记录大量的Trace日志。这些日志可以用来分析数据库的异常信息。

+

黑匣子日志

+

数据库系统崩溃的时候,通过故障现场堆、栈信息可以分析出故障发生时的进程上下文,方便故障定位。黑匣子具有在系统崩溃时,dump出进程和线程的堆、栈、寄存器信息的功能。

+

审计日志

+

开启数据库审计功能后,将数据库用户的某些操作记录在日志中,这些日志称为审计日志。

+

WAL日志

+

又称为REDO日志,在数据库异常损坏时,可以利用WAL日志进行恢复。由于WAL日志的重要性,所以需要经常备份这些日志。

+

性能日志

+

数据库系统在运行时检测物理资源的运行状态的日志,在对外部资源进行访问时的性能检测,包括磁盘、Hadoop openGauss等外部资源的访问检测信息。

+
+ diff --git "a/content/zh/docs/Administratorguide/\346\227\245\347\273\264\346\212\244\346\243\200\346\237\245\351\241\271.md" "b/content/zh/docs/Administratorguide/\346\227\245\347\273\264\346\212\244\346\243\200\346\237\245\351\241\271.md" new file mode 100644 index 000000000..e405bc148 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\227\245\347\273\264\346\212\244\346\243\200\346\237\245\351\241\271.md" @@ -0,0 +1,170 @@ +# 日维护检查项 + +## 检查openGauss状态 + +通过openGauss提供的工具查询数据库和实例状态,确认数据库和实例都处于正常的运行状态,可以对外提供数据服务。 + +- 检查实例状态 + + ``` + gs_check -U omm -i CheckClusterState + ``` + +- 检查参数 + + ``` + postgres=# SHOW parameter_name; + ``` + +- 修改参数 + + ``` + gs_guc reload -D /gaussdb/data/dbnode -c "paraname=value" + ``` + + +## 检查锁信息 + +锁机制是数据库保证数据一致性的重要手段,检查相关信息可以检查数据库的事务和运行状况。 + +- 查询数据库中的锁信息。 + + ``` + postgres=# SELECT * FROM pg_locks; + ``` + +- 查询等待锁的线程状态信息。 + + ``` + postgres=# SELECT * FROM pg_thread_wait_status WHERE wait_status = 'acquire lock'; + ``` + +- 查询等待锁的事件信息。 + + ``` + postgres=# SELECT node_name, thread_name, tid, wait_status, query_id FROM pgxc_thread_wait_status WHERE wait_status = 'acquire lock'; + ``` + +- 结束系统进程 + + 查找正在运行的系统进程,然后使用kill命令结束此进程。 + + ``` + ps ux + kill -9 pid + ``` + + +## 统计事件数据 + +SQL语句长时间运行会占用大量系统资源,用户可以通过查看事件发生的时间,占用内存大小来了解现在数据库运行状态。 + +- 查询事件的时间 + + 查询事件的线程启动时间、事务启动时间、SQL启动时间以及状态变更时间。 + + ``` + postgres=# SELECT backend_start,xact_start,query_start,state_change FROM pg_stat_activity; + ``` + +- 查询当前服务器的会话计数信息 + + ``` + postgres=# SELECT count(*) FROM pg_stat_activity; + ``` + +- 系统级统计信息 + + 查询当前使用内存最多的会话信息。 + + ``` + postgres=# SELECT * FROM pv_session_memory_detail() ORDER BY usedsize desc limit 10; + ``` + + +## 对象检查 + +表、索引、分区、约束等是数据库的核心存储对象,其核心信息和对象维护是DBA重要的日常工作。 + +- 查看表的详细信息 + + ``` + postgres=# \d+ table_name + ``` + +- 查询表统计信息 + + ``` + postgres=# SELECT * FROM pg_statistic; + ``` + +- 查看索引的详细信息 + + ``` + postgres=# \d+ index_name + ``` + +- 查询分区表信息 + + ``` + postgres=# SELECT * FROM pg_partition; + ``` + +- 收集统计信息 + + 使用ANALYZE语句收集数据库相关的统计信息。 + + 使用VACUUM语句可以回收空间并更新统计信息。 + +- 查询约束信息 + + ``` + postgres=# SELECT * FROM pg_constraint; + ``` + + +## SQL报告检查 + +使用EXPLAIN语句查看执行计划。 + +## 备份 + +数据备份重于一切,日常应检查备份执行情况,并检查备份有效性,确保备份能够保障数据安全,备份安全加密也应兼顾。 + +- 指定用户导出数据库: + + ``` + gs_dump dbname -p port -f out.sql -U user_name -W password + ``` + +- 导出schema: + + ``` + gs_dump dbname -p port -n schema_name -f out.sql + ``` + +- 导出table: + + ``` + gs_dump dbname -p port -t table_name -f out.sql + ``` + + +## 基本信息检查 + +基本信息包括版本、组件、补丁集等信息,定期检查数据库信息并登记在案是数据库生命周期管理的重要内容之一。 + +- 版本信息 + + ``` + postgres=# SELECT version(); + ``` + +- 容量检查 + + ``` + postgres=# SELECT pg_table_size('table_name'); + postgres=# SELECT pg_database_size('database_name'); + ``` + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" new file mode 100644 index 000000000..b853bb9eb --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" @@ -0,0 +1,7 @@ +# 检查openGauss健康状态 + +- **[检查办法](检查办法-0.md)** + +- **[异常处理](异常处理-1.md)** + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\350\277\220\350\241\214\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\350\277\220\350\241\214\346\227\245\345\277\227.md" new file mode 100644 index 000000000..4691a8f7f --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245openGauss\350\277\220\350\241\214\346\227\245\345\277\227.md" @@ -0,0 +1,111 @@ +# 检查openGauss运行日志 + +数据库运行时,某些操作在执行过程中可能会出现错误,数据库依然能够运行。但是此时数据库中的数据可能已经发生不一致的情况。建议按月检查openGauss运行日志,及时发现隐患。 + +## 前提条件 + +- 收集日志的主机网络通畅且未宕机,数据库安装用户互信正常。 +- 日志收集工具依赖操作系统工具如gstack,如果未安装该工具,则提示错误后,跳过该收集项。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 执行如下命令收集数据库日志。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" + ``` + + 20160616 01:01为日志的开始时间,20160616 23:59为日志的结束时间。 + +3. 根据[2](#zh-cn_topic_0237088806_zh-cn_topic_0059778412_l87490fc259434bc6ac7800ec9881a6ab)的界面输出提示,进入相应的日志收集目录,解压收集的日志,并检查数据库日志。 + + 以下以日志收集路径“/opt/gaussdb/tmp/gaussdba\_mppdb/collector\_20160726\_105158.tar.gz”为例进行操作。 + + ``` + tar -xvzf /opt/gaussdb/tmp/gaussdba_mppdb/collector_20160726_105158.tar.gz + cd /opt/gaussdb/tmp/gaussdba_mppdb/collector_20160726_105158 + ``` + + +## 示例 + +- 以--begin-time与--end-time为参数执行gs\_collector命令。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" + ``` + + 当显示类似如下信息表示日志已经归档。 + + ``` + Successfully collected files + All results are stored in /tmp/gaussdba_mppdb/collector_20160616_175615.tar.gz. + ``` + +- 以--begin-time,--end-time与-h为参数执行gs\_collector命令。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" -h plat2 + ``` + + 当显示类似如下信息表示日志已经归档。 + + ``` + Successfully collected files + All results are stored in /tmp/gaussdba_mppdb/collector_20160616_190225.tar.gz. + ``` + +- 以--begin-time,--end-time与-f为参数执行gs\_collector命令。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" -f /opt/software/gaussdb/output + ``` + + 当显示类似如下信息表示日志已经归档。 + + ``` + Successfully collected files + All results are stored in /opt/software/gaussdb/output/collector_20160616_190511.tar.gz. + ``` + +- 以--begin-time,--end-time与--keyword为参数执行gs\_collector命令。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" --keyword="os" + ``` + + 当显示类似如下信息表示日志已经归档。 + + ``` + Successfully collected files. + All results are stored in /tmp/gaussdba_mppdb/collector_20160616_190836.tar.gz. + ``` + +- 以--begin-time,--end-time与-o为参数执行gs\_collector命令。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" -o /opt/software/gaussdb/output + ``` + + 当显示类似如下信息表示日志已经归档。 + + ``` + Successfully collected files. + All results are stored in /opt/software/gaussdb/output/collector_20160726_113711.tar.gz. + ``` + +- 以--begin-time,--end-time与-l为参数(文件名必须以.log为后缀)执行gs\_collector命令。 + + ``` + gs_collector --begin-time="20160616 01:01" --end-time="20160616 23:59" -l /opt/software/gaussdb/logfile.log + ``` + + 当显示类似如下信息表示日志已经归档。 + + ``` + Successfully collected files. + All results are stored in /opt/software/gaussdb/output/collector_20160726_113711.tar.gz. + ``` + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-0.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-0.md" new file mode 100644 index 000000000..89474315b --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-0.md" @@ -0,0 +1,350 @@ +# 检查办法 + +通过openGauss提供的gs\_check工具可以开展openGauss健康状态检查。 + +## 注意事项 + +- 扩容新节点检查只能在root用户下执行,其他场景都必须在omm用户下执行。 +- 必须指定-i或-e参数,-i会检查指定的单项,-e会检查对应场景配置中的多项。 +- 如果-i参数中不包含root类检查项或-e场景配置列表中没有root类检查项,则不需要交互输入root权限的用户及其密码。 +- 可使用--skip-root-items跳过检查项中包含的root类检查,以免需要输入root权限用户及密码。 +- 检查扩容新节点与现有节点之间的一致性,在现有节点执行gs\_check命令指定--hosts参数进行检查,其中hosts文件中需要写入新节点ip。 + +## 操作步骤 + +方式1: + +1. 以操作系统用户omm登录数据库主节点。 +2. 执行如下命令对openGauss数据库状态进行检查。 + + ``` + gs_check -i CheckClusterState + ``` + + 其中,-i指定检查项,注意区分大小写。格式:-i CheckClusterState、-i CheckCPU或-i CheckClusterState,CheckCPU。 + + 取值范围为所有支持的检查项名称,详细列表请参见《openGauss 工具参考》中“服务端工具 \> gs\_checkos \> openGauss状态检查表”,用户可以根据需求自己编写新检查项。 + + +方式2: + +1. 以操作系统用户omm登录数据库主节点。 +2. 执行如下命令对openGauss数据库进行健康检查。 + + ``` + gs_check -e inspect + ``` + + 其中,-e指定场景名,注意区分大小写。格式:-e inspect或-e upgrade。 + + 取值范围为所有支持的巡检场景名称,默认列表包括:inspect(例行巡检)、upgrade(升级前巡检)、expand(扩容前巡检)、binary\_upgrade(就地升级前巡检)、health(健康检查巡检),用户可以根据需求自己编写场景。 + + +方式3: + +1. 以操作系统用户omm登录数据库主节点。 +2. 将巡检工具gs\_check及相关目录inspection拷贝分发到所有扩容新节点。 +3. 将扩容新节点ip写到文件_ipListFile_中,以换行符进行分隔。 +4. 执行如下命令对扩容新节点进行扩容前检查。 + + ``` + gs_check -e expand_new_node --hosts ipListFile + ``` + + -e必须为expand\_new\_node,即扩容前新节点检查。 + + +openGauss巡检的主要作用是在openGauss运行过程中,检查整个openGauss状态是否正常,或者重大操作前(升级、扩容),确保openGauss满足操作所需的环境条件和状态条件。详细的巡检项目和场景请参见《openGauss 工具参考》中“服务端工具 \> gs\_checkos \> openGauss状态检查表”。 + +## 示例 + +执行单项检查结果: + +``` +perfadm@lfgp000700749:/opt/huawei/perfadm/tool/script> gs_check -i CheckCPU +Parsing the check items config file successfully +Distribute the context file to remote hosts successfully +Start to health check for the cluster. Total Items:1 Nodes:3 + +Checking... [=========================] 1/1 +Start to analysis the check result +CheckCPU....................................OK +The item run on 3 nodes. success: 3 + +Analysis the check result successfully +Success. All check items run completed. Total:1 Success:1 Failed:0 +For more information please refer to /opt/huawei/wisequery/script/gspylib/inspection/output/CheckReport_201902193704661604.tar.gz +``` + +本地执行结果: + +``` +perfadm@lfgp000700749:/opt/huawei/perfadm/tool/script> gs_check -i CheckCPU -L + +2017-12-29 17:09:29 [NAM] CheckCPU +2017-12-29 17:09:29 [STD] 检查主机CPU占用率,如果idle 大于30%并且iowait 小于 30%.则检查项通过,否则检查项不通过 +2017-12-29 17:09:29 [RST] OK + +2017-12-29 17:09:29 [RAW] +Linux 4.4.21-69-default (lfgp000700749) 12/29/17 _x86_64_ + +17:09:24 CPU %user %nice %system %iowait %steal %idle +17:09:25 all 0.25 0.00 0.25 0.00 0.00 99.50 +17:09:26 all 0.25 0.00 0.13 0.00 0.00 99.62 +17:09:27 all 0.25 0.00 0.25 0.13 0.00 99.37 +17:09:28 all 0.38 0.00 0.25 0.00 0.13 99.25 +17:09:29 all 1.00 0.00 0.88 0.00 0.00 98.12 +Average: all 0.43 0.00 0.35 0.03 0.03 99.17 +``` + +执行场景检查结果: + +``` +[perfadm@SIA1000131072 Check]$ gs_check -e inspect +Parsing the check items config file successfully +The below items require root privileges to execute:[CheckBlockdev CheckIOrequestqueue CheckIOConfigure CheckCheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckNoCheckSum CheckSctpSeProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] +Please enter root privileges user[root]:root +Please enter password for user[root]: +Please enter password for user[root] on the node[10.244.57.240]: +Check root password connection successfully +Distribute the context file to remote hosts successfully +Start to health check for the cluster. Total Items:59 Nodes:2 + +Checking... [ ] 21/59 +Checking... [=========================] 59/59 +Start to analysis the check result +CheckClusterState...........................OK +The item run on 2 nodes. success: 2 + +CheckDBParams...............................OK +The item run on 1 nodes. success: 1 + +CheckDebugSwitch............................OK +The item run on 2 nodes. success: 2 + +CheckDirPermissions.........................OK +The item run on 2 nodes. success: 2 + +CheckReadonlyMode...........................OK +The item run on 1 nodes. success: 1 + +CheckEnvProfile.............................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +GAUSSHOME /usr1/gaussdb/app +LD_LIBRARY_PATH /usr1/gaussdb/app/lib +PATH /usr1/gaussdb/app/bin + + +CheckBlockdev...............................OK +The item run on 2 nodes. success: 2 + +CheckCurConnCount...........................OK +The item run on 1 nodes. success: 1 + +CheckCursorNum..............................OK +The item run on 1 nodes. success: 1 + +CheckPgxcgroup..............................OK +The item run on 1 nodes. success: 1 + +CheckDiskFormat.............................OK +The item run on 2 nodes. success: 2 + +CheckSpaceUsage.............................OK +The item run on 2 nodes. success: 2 + +CheckInodeUsage.............................OK +The item run on 2 nodes. success: 2 + +CheckSwapMemory.............................OK +The item run on 2 nodes. success: 2 + +CheckLogicalBlock...........................OK +The item run on 2 nodes. success: 2 + +CheckIOrequestqueue.....................WARNING +The item run on 2 nodes. warning: 2 +The warning[host240,host157] value: +On device (vdb) 'IO Request' RealValue '256' ExpectedValue '32768' +On device (vda) 'IO Request' RealValue '256' ExpectedValue '32768' + +CheckMaxAsyIOrequests.......................OK +The item run on 2 nodes. success: 2 + +CheckIOConfigure............................OK +The item run on 2 nodes. success: 2 + +CheckMTU....................................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +1500 + +CheckPing...................................OK +The item run on 2 nodes. success: 2 + +CheckRXTX...................................NG +The item run on 2 nodes. ng: 2 +The ng[host240,host157] value: +NetWork[eth0] +RX: 256 +TX: 256 + + +CheckNetWorkDrop............................OK +The item run on 2 nodes. success: 2 + +CheckMultiQueue.............................OK +The item run on 2 nodes. success: 2 + +CheckEncoding...............................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +LANG=en_US.UTF-8 + +CheckFirewall...............................OK +The item run on 2 nodes. success: 2 + +CheckKernelVer..............................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +3.10.0-957.el7.x86_64 + +CheckMaxHandle..............................OK +The item run on 2 nodes. success: 2 + +CheckNTPD...................................OK +host240: NTPD service is running, 2020-06-02 17:00:28 +host157: NTPD service is running, 2020-06-02 17:00:06 + + +CheckOSVer..................................OK +host240: The current OS is centos 7.6 64bit. +host157: The current OS is centos 7.6 64bit. + + +CheckSysParams..........................WARNING +The item run on 2 nodes. warning: 2 +The warning[host240,host157] value: +Warning reason: variable 'net.ipv4.tcp_retries1' RealValue '3' ExpectedValue '5'. +Warning reason: variable 'net.ipv4.tcp_syn_retries' RealValue '6' ExpectedValue '5'. +Warning reason: variable 'net.sctp.path_max_retrans' RealValue '5' ExpectedValue '10'. +Warning reason: variable 'net.sctp.max_init_retransmits' RealValue '8' ExpectedValue '10'. + + +CheckTHP....................................OK +The item run on 2 nodes. success: 2 + +CheckTimeZone...............................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: ++0800 + +CheckCPU....................................OK +The item run on 2 nodes. success: 2 + +CheckSshdService............................OK +The item run on 2 nodes. success: 2 + +CheckSshdConfig.........................WARNING +The item run on 2 nodes. warning: 2 +The warning[host240,host157] value: + +Warning reason: UseDNS parameter is not set; expected: no + +CheckCrondService...........................OK +The item run on 2 nodes. success: 2 + +CheckStack..................................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +8192 + +CheckNoCheckSum.............................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +Nochecksum value is N,Check items pass. + +CheckSysPortRange...........................OK +The item run on 2 nodes. success: 2 + +CheckMemInfo................................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +totalMem: 31.260929107666016G + +CheckHyperThread............................OK +The item run on 2 nodes. success: 2 + +CheckTableSpace.............................OK +The item run on 1 nodes. success: 1 + +CheckSctpService............................OK +The item run on 2 nodes. success: 2 + +CheckSysadminUser...........................OK +The item run on 1 nodes. success: 1 + +CheckGUCConsistent..........................OK +All DN instance guc value is consistent. + +CheckMaxProcMemory..........................OK +The item run on 1 nodes. success: 1 + +CheckBootItems..............................OK +The item run on 2 nodes. success: 2 + +CheckHashIndex..............................OK +The item run on 1 nodes. success: 1 + +CheckPgxcRedistb............................OK +The item run on 1 nodes. success: 1 + +CheckNodeGroupName..........................OK +The item run on 1 nodes. success: 1 + +CheckTDDate.................................OK +The item run on 1 nodes. success: 1 + +CheckDilateSysTab...........................OK +The item run on 1 nodes. success: 1 + +CheckKeyProAdj..............................OK +The item run on 2 nodes. success: 2 + +CheckProStartTime.......................WARNING +host157: +STARTED COMMAND +Tue Jun 2 16:57:18 2020 /usr1/dmuser/dmserver/metricdb1/server/bin/gaussdb --single_node -D /usr1/dmuser/dmb1/data -p 22204 +Mon Jun 1 16:15:15 2020 /usr1/gaussdb/app/bin/gaussdb -D /usr1/gaussdb/data/dn1 -M standby + + +CheckFilehandle.............................OK +The item run on 2 nodes. success: 2 + +CheckRouting................................OK +The item run on 2 nodes. success: 2 + +CheckNICModel...............................OK +The item run on 2 nodes. success: 2 (consistent) +The success on all nodes value: +version: 1.0.0 +model: Red Hat, Inc. Virtio network device + + +CheckDropCache..........................WARNING +The item run on 2 nodes. warning: 2 +The warning[host240,host157] value: +No DropCache process is running + +CheckMpprcFile..............................NG +The item run on 2 nodes. ng: 2 +The ng[host240,host157] value: +There is no mpprc file + +Analysis the check result successfully +Failed. All check items run completed. Total:59 Success:52 Warning:5 NG:2 +For more information please refer to /usr1/gaussdb/tool/script/gspylib/inspection/output/CheckReport_inspect611.tar.gz + +``` + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-2.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-2.md" new file mode 100644 index 000000000..3fada42dc --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225-2.md" @@ -0,0 +1,40 @@ +# 检查办法 + +通过openGauss提供的性能统计工具gs\_checkperf可以对硬件性能进行检查。 + +## 前提条件 + +- openGauss运行状态正常。 +- 运行在数据库之上的业务运行正常。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 执行如下命令对openGauss数据库进行性能检查。 + + ``` + gs_checkperf + ``` + + +具体的性能统计项目请参见《openGauss 工具参考》中“服务端工具 \> gs\_checkperf \> 性能检查项”。 + +## 示例 + +以简要格式在屏幕上显示性能统计结果。 + +``` +gs_checkperf -i pmk -U omm +Cluster statistics information: + Host CPU busy time ratio : 1.43 % + MPPDB CPU time % in busy time : 1.88 % + Shared Buffer Hit ratio : 99.96 % + In-memory sort ratio : 100.00 % + Physical Reads : 4 + Physical Writes : 25 + DB size : 70 MB + Total Physical writes : 25 + Active SQL count : 2 + Session count : 3 +``` + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225.md" new file mode 100644 index 000000000..bdcd4d55c --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\212\236\346\263\225.md" @@ -0,0 +1,60 @@ +# 检查办法 + +通过openGauss提供的gs\_checkos工具可以完成操作系统状态检查。 + +## 前提条件 + +- 当前的硬件和网络环境正常。 +- 各主机间root互信状态正常。 +- 只能使用root用户执行gs\_checkos命令。 + +## 操作步骤 + +1. 以root用户身份登录任意一台服务器。 +2. 执行如下命令对openGauss节点服务器的OS参数进行检查。 + + ``` + gs_checkos -i A + ``` + + 检查节点服务器的OS参数的目的是为了保证openGauss正常通过预安装,并且在安装成功后可以安全高效的运行。详细的检查项目请参见《openGauss 工具参考》中“服务端工具 \> gs\_checkos”章节。 + + +## 示例 + +执行gs\_checkos前需要先使用gs\_preinstall工具执行前置脚本,准备环境。以参数"A"为例。 + +``` +gs_checkos -i A +Checking items: + A1. [ OS version status ] : Normal + A2. [ Kernel version status ] : Normal + A3. [ Unicode status ] : Normal + A4. [ Time zone status ] : Normal + A5. [ Swap memory status ] : Normal + A6. [ System control parameters status ] : Normal + A7. [ File system configuration status ] : Normal + A8. [ Disk configuration status ] : Normal + A9. [ Pre-read block size status ] : Normal + A10.[ IO scheduler status ] : Normal + A11.[ Network card configuration status ] : Normal + A12.[ Time consistency status ] : Warning + A13.[ Firewall service status ] : Normal + A14.[ THP service status ] : Normal +Total numbers:14. Abnormal numbers:0. Warning number:1. +``` + +以参数"B"为例。 + +``` +gs_checkos -i B +Setting items: + B1. [ Set system control parameters ] : Normal + B2. [ Set file system configuration value ] : Normal + B3. [ Set pre-read block size value ] : Normal + B4. [ Set IO scheduler value ] : Normal + B5. [ Set network card configuration value ] : Normal + B6. [ Set THP service ] : Normal +Total numbers:6. Abnormal numbers:0. Warning number:0. +``` + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\222\214\346\270\205\347\220\206\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\222\214\346\270\205\347\220\206\346\227\245\345\277\227.md" new file mode 100644 index 000000000..bfc8ef841 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\222\214\346\270\205\347\220\206\346\227\245\345\277\227.md" @@ -0,0 +1,11 @@ +# 检查和清理日志 + +日志是检查系统运行及故障定位的关键手段。建议按月度例行查看操作系统日志及数据库的运行日志。同时,随着时间的推移,日志的增加会占用较多的磁盘空间。建议按月度清理数据库的运行日志。 + +- **[检查操作系统日志](检查操作系统日志.md)** + +- **[检查openGauss运行日志](检查openGauss运行日志.md)** + +- **[清理运行日志](清理运行日志.md)** + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\272\224\347\224\250\350\277\236\346\216\245\346\225\260.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\272\224\347\224\250\350\277\236\346\216\245\346\225\260.md" new file mode 100644 index 000000000..ec6d1e51e --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\345\272\224\347\224\250\350\277\236\346\216\245\346\225\260.md" @@ -0,0 +1,126 @@ +# 检查应用连接数 + +如果应用程序与数据库的连接数超过最大值,则新的连接无法建立。建议每天检查连接数,及时释放空闲的连接或者增加最大连接数。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,8000为数据库主节点的端口号。 + + 连接成功后,系统显示类似如下信息: + + ``` + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + Non-SSL connection (SSL connection is recommended when requiring high-security) + Type "help" for help. + + postgres=# + ``` + +3. 执行如下SQL语句查看连接数。 + + ``` + postgres=# SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s; + ``` + + 显示类似如下的信息,其中2表示当前有两个应用连接到数据库。 + + ``` + count + ------- + 2 + (1 row) + ``` + +4. 查看现有最大连接数。 + + ``` + postgres=# SHOW max_connections; + ``` + + 显示信息如下,其中200为现在的最大连接数。 + + ``` + max_connections + ----------------- + 200 + (1 row) + ``` + + +## 异常处理 + +如果显示的连接数接近数据库的最大连接数max\_connections,则需要考虑清理现有连接数或者增加新的连接数。 + +1. 执行如下SQL语句,查看state字段等于idle,且state\_change字段长时间没有更新过的连接信息。 + + ``` + postgres=# SELECT * FROM pg_stat_activity where state='idle' order by state_change; + ``` + + 显示类似如下的信息: + + ``` + datid | datname | pid | usesysid | usename | application_name | client_addr + | client_hostname | client_port | backend_start | xact_start | quer + y_start | state_change | waiting | enqueue | state | resource_pool + | query + -------+----------+-----------------+----------+----------+------------------+--------------- + -+-----------------+-------------+-------------------------------+------------+-------------- + -----------------+-------------------------------+---------+---------+-------+--------------- + +---------------------------------------------- + 13626 | postgres | 140390162233104 | 10 | gaussdba | | + | | -1 | 2016-07-15 14:08:59.474118+08 | | 2016-07-15 14 + :09:04.496769+08 | 2016-07-15 14:09:04.496975+08 | f | | idle | default_pool + | select count(group_name) from pgxc_group; + 13626 | postgres | 140390132872976 | 10 | gaussdba | cn_5002 | 10.180.123.163 + | | 48614 | 2016-07-15 14:11:16.014871+08 | | 2016-07-15 14 + :21:17.346045+08 | 2016-07-15 14:21:17.346095+08 | f | | idle | default_pool + | SET SESSION AUTHORIZATION DEFAULT;RESET ALL; + (2 rows) + ``` + +2. 释放空闲的连接数。 + + 查看每个连接,并与此连接的使用者确认是否可以断开连接,或执行如下SQL语句释放连接。其中,pid为上一步查询中空闲连接所对应的pid字段值。 + + ``` + postgres=# SELECT pg_terminate_backend(140390132872976); + ``` + + 显示类似如下的信息: + + ``` + postgres=# SELECT pg_terminate_backend(140390132872976); + pg_terminate_backend + ---------------------- + t + (1 row) + ``` + + 如果没有可释放的连接,请执行下一步。 + +3. 增加最大连接数。 + + ``` + gs_guc set -D /gaussdb/data/dbnode -c "max_connections= 800" + ``` + + 其中800为新修改的连接数。 + +4. 重启数据库服务使新的设置生效。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >重启openGauss操作会导致用户执行操作中断,请在操作之前规划好合适的执行窗口。 + + ``` + gs_om -t stop && gs_om -t start + ``` + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" new file mode 100644 index 000000000..6d8b5520b --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" @@ -0,0 +1,7 @@ +# 检查操作系统参数 + +- **[检查办法](检查办法.md)** + +- **[异常处理](异常处理.md)** + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\346\227\245\345\277\227.md" new file mode 100644 index 000000000..6f349e852 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\223\215\344\275\234\347\263\273\347\273\237\346\227\245\345\277\227.md" @@ -0,0 +1,14 @@ +# 检查操作系统日志 + +建议按月检查操作系统日志,排除操作系统运行异常隐患。 + +## 操作步骤 + +执行如下命令查看操作系统日志文件。 + +``` +vim /var/log/messages +``` + +关注其中近一个月出现的kernel、error、fatal等字样,根据系统报警信息进行处理。 + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\225\260\346\215\256\345\272\223\346\200\247\350\203\275.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\225\260\346\215\256\345\272\223\346\200\247\350\203\275.md" new file mode 100644 index 000000000..8304f6c30 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\225\260\346\215\256\345\272\223\346\200\247\350\203\275.md" @@ -0,0 +1,7 @@ +# 检查数据库性能 + +- **[检查办法](检查办法-2.md)** + +- **[异常处理](异常处理-3.md)** + + diff --git "a/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\227\266\351\227\264\344\270\200\350\207\264\346\200\247.md" "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\227\266\351\227\264\344\270\200\350\207\264\346\200\247.md" new file mode 100644 index 000000000..77045f05d --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\243\200\346\237\245\346\227\266\351\227\264\344\270\200\350\207\264\346\200\247.md" @@ -0,0 +1,46 @@ +# 检查时间一致性 + +数据库事务一致性通过逻辑时钟保证,与操作系统时间无关,但是系统时间不一致会导致诸多潜在问题,主要是后台运维和监控功能异常,因此在月度检查时建议检查各个节点的时间一致性。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 创建记录openGauss各节点的配置文件(_mpphosts文件目录_用户可随意指定,建议放在/tmp下)。 + + ``` + vim /tmp/mpphosts + ``` + + 增加各节点的主机名称。 + + ``` + plat1 + plat2 + plat3 + ``` + +3. 保存配置文件。 + + ``` + :wq! + ``` + +4. 执行如下命令,输出各节点上的时间到“/tmp/sys\_ctl-os1.log”文件中。 + + ``` + for ihost in `cat /tmp/mpphosts`; do ssh -n -q $ihost "hostname;date"; done > /tmp/sys_ctl-os1.log + ``` + +5. 根据输出确认各个节点的时间一致性,节点之间时间差异不能超过30秒。 + + ``` + cat /tmp/sys_ctl-os1.log + plat1 + Thu Feb 9 16:46:38 CST 2017 + plat2 + Thu Feb 9 16:46:49 CST 2017 + plat3 + Thu Feb 9 16:46:14 CST 2017 + ``` + + diff --git "a/content/zh/docs/Administratorguide/\346\246\202\350\277\260.md" "b/content/zh/docs/Administratorguide/\346\246\202\350\277\260.md" new file mode 100644 index 000000000..60b8376b5 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\246\202\350\277\260.md" @@ -0,0 +1,103 @@ +# 概述 + +数据备份是保护数据安全的重要手段之一,为了更好的保护数据安全,openGauss数据库支持两种备份恢复类型、多种备份恢复方案,备份和恢复过程中提供数据的可靠性保障机制。 + +备份与恢复类型可分为逻辑备份与恢复、物理备份与恢复。 + +- 逻辑备份与恢复:通过逻辑导出对数据进行备份,逻辑备份只能基于备份时刻进行数据转储,所以恢复时也只能恢复到备份时保存的数据。对于故障点和备份点之间的数据,逻辑备份无能为力,逻辑备份适合备份那些很少变化的数据,当这些数据因误操作被损坏时,可以通过逻辑备份进行快速恢复。如果通过逻辑备份进行全库恢复,通常需要重建数据库,导入备份数据来完成,对于可用性要求很高的数据库,这种恢复时间太长,通常不被采用。由于逻辑备份具有平台无关性,所以更为常见的是,逻辑备份被作为一个数据迁移及移动的主要手段。 +- 物理备份与恢复:通过物理文件拷贝的方式对数据库进行备份,以磁盘块为基本单位将数据从主机复制到备机。通过备份的数据文件及归档日志等文件,数据库可以进行完全恢复。物理备份速度快,一般被用作对数据进行备份和恢复,用于全量备份的场景。通过合理规划,可以低成本进行备份与恢复。 + + 以下为openGauss支持的两类数据备份恢复方案,备份方案也决定了当异常发生时该如何恢复。 + + **表 1** 两种备份恢复类型对比 + + + + + + + + + + + + + + + + + + +

备份类型

+

应用场景

+

支持的介质

+

优缺点

+

逻辑备份与恢复

+

适合于数据量小的场景。

+

目前用于表备份恢复,可以备份恢复单表和多表。

+
  • 磁盘
  • SSD
+

可按用户需要进行指定对象的备份和恢复,灵活度高。

+

当数据量大时,备份效率低。

+

物理备份与恢复

+

适用于数据量大的场景,主要用于全量数据备份恢复,也可对整个数据库中的WAL归档日志和运行日志进行备份恢复。

+

数据量大时,备份效率高。

+
+ + 当需要进行备份恢复操作时,主要从以下四个方面考虑数据备份方案。 + + - 备份对业务的影响在可接受范围。 + - 数据库恢复效率。 + + 为尽量减小数据库故障的影响,要使恢复时间减到最少,从而使恢复的效率达到最高。 + + - 数据可恢复程度。 + + 当数据库失效后,要尽量减少数据损失。 + + - 数据库恢复成本。 + + 在现网选择备份策略时参考的因素比较多,如备份对象、数据大小、网络配置等,[表2](#zh-cn_topic_0237088826_zh-cn_topic_0100209712_table1179095017218)列出了可用的备份策略和每个备份策略的适用场景。 + + **表 2** 备份策略典型场景 + + + + + + + + + + + + + + + + + + + +

备份策略

+

关键性能因素

+

典型数据量

+

性能规格

+

集群备份

+
  • 数据大小
  • 网络配置
+

数据:PB级

+

对象:约100万个

+

备份:

+
  • 每个主机80 Mbit/s(NBU/EISOO+磁盘)
  • 约90%磁盘I/O速率(SSD/HDD)
+

表备份

+
  • 表所在模式
  • 网络配置(NBU)
+

数据:10 TB级

+

备份:基于查询性能速度+I/O速度

+
说明:

多表备份时,备份耗时计算方式:

+
总时间 = 表数量 x 起步时间 + 数据总量 /  数据备份速度
+

其中:

+
  • 磁盘起步时间为5s左右,NBU起步时间比DISK长(取决于NBU部署方案)。
  • 数据备份速度为单节点50MB/s左右(基于1GB大小的表,物理机备份到本地磁盘得出此速率)。
+

表越小,备份性能更低。

+
+
+ + diff --git "a/content/zh/docs/Administratorguide/\346\270\205\347\220\206\350\277\220\350\241\214\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\346\270\205\347\220\206\350\277\220\350\241\214\346\227\245\345\277\227.md" new file mode 100644 index 000000000..9d4501d17 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\346\270\205\347\220\206\350\277\220\350\241\214\346\227\245\345\277\227.md" @@ -0,0 +1,25 @@ +# 清理运行日志 + +数据库运行过程中会产生大量运行日志,占用大量的磁盘空间,建议清理过期日志文件,只保留一个月的日志。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 清理日志。 + 1. 将超过1个月的日志备份到其他磁盘。 + 2. 进入日志存放目录。 + + ``` + cd $GAUSSLOG + ``` + + 3. 进入相应的子目录,使用如下方式删除1个月之前产生的日志。 + + ``` + rm 日志名称 + ``` + + 日志文件的命名格式为“postgresql-年-月-日\_HHMMSS”。 + + + diff --git "a/content/zh/docs/Administratorguide/\347\211\251\347\220\206\345\244\207\344\273\275\346\201\242\345\244\215.md" "b/content/zh/docs/Administratorguide/\347\211\251\347\220\206\345\244\207\344\273\275\346\201\242\345\244\215.md" new file mode 100644 index 000000000..4e4c4a460 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\347\211\251\347\220\206\345\244\207\344\273\275\346\201\242\345\244\215.md" @@ -0,0 +1,5 @@ +# 物理备份恢复 + +- **[gs\_basebackup](gs_basebackup.md)** + + diff --git "a/content/zh/docs/Administratorguide/\347\212\266\346\200\201\346\237\245\350\257\242.md" "b/content/zh/docs/Administratorguide/\347\212\266\346\200\201\346\237\245\350\257\242.md" new file mode 100644 index 000000000..70c51dae9 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\347\212\266\346\200\201\346\237\245\350\257\242.md" @@ -0,0 +1,220 @@ +# 状态查询 + +## 背景信息 + +openGauss支持查看整个openGauss的状态,通过查询结果确认openGauss或者单个主机的运行状态是否正常。 + +## 前提条件 + +openGauss已经启动。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令查询openGauss状态: + + ``` + gs_om -t status --detail + ``` + + openGauss状态显示结果的参数说明请参见[表1](#zh-cn_topic_0237088790_table9610118112610)。 + + 若要查询某主机上的实例状态,请在命令中增加“-h”项。示例如下: + + ``` + gs_om -t status -h plat2 + ``` + + 其中,plat2为待查询主机的名称。 + + +## 参数说明 + +**表 1** 节点角色说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

字段

+

字段含义

+

字段值

+

cluster_state

+

openGauss状态。显示整个openGauss是否运行正常。

+
  • Normal:表示openGauss可用,且数据有冗余备份。所有进程都在运行,主备关系正常。
  • Unavailable:表示openGauss不可用。
  • Degraded:表示openGauss可用,但存在故障的数据库节点数据库主节点实例。
+

node

+

主机名称

+

表示该实例所在的主机名称。多AZ时会显示AZ编号。

+

node_ip

+

主机IP

+

表示该实例所在的主机IP。

+

instance

+

实例ID

+

表示该实例的ID。

+

state

+

实例角色

+
  • Normal: 表示单主机实例
  • Primary:表示实例为主实例。
  • Standby:表示实例为备实例。
  • Secondary:表示实例为从备实例。
  • Pending:表示该实例在仲裁阶段。
  • Unknown:表示实例状态未知。
  • Down: 表示实例处于宕机状态
  • Abnormal: 表示节点处于异常状态
  • Manually stopped: 表示节点已经被手动停止
+
+ +每个角色也存在不同的状态, 例如启动, 连接等, 其各个状态说明如下 + +**表 2** 节点状态说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

状态

+

字段含义

+

Normal

+

表示节点启动正常

+

Need repair

+

当前节点需要修复

+

Starting

+

节点正在启动中

+

Wait promoting

+

节点正等待升级中, 例如备机向主机发送升级请求后, 正在等待主机回应时的状态

+

Promoting

+

备节点正在升级为主节点的状态

+

Demoting

+

节点正在降级中, 如主机正在降为备机中

+

Building

+

备机启动失败, 需要重建,

+

Catchup

+

备节点正在追赶主节点

+

Coredump

+

节点程序崩溃

+

Unknown

+

节点状态未知

+
+ +当节点出现Need repair状态时, 可能需要对该节点进行重建使其恢复正常, 通常情况下, 节点重建原因说明如下: + +表3 节点重建原因说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

状态

+

字段含义

+

Normal

+

表示节点启动正常

+

WAL segment removed

+

主机日志WAL日志不存在, 备机日志比主机日志新

+

Disconnect

+

备机不能连接主机

+

Version not matched

+

主备二进制版本不一致

+

Mode not matched

+

主备角色不匹配, 例如两个备机互联

+

System id not matched

+

主备数据库系统id不一致, 主备双机要求System ID必须一致

+

Timeline not matched

+

日志时间线不一致

+

Unknown

+

其他原因

+
+ +1. + +## 示例 + +查看openGauss详细状态信息,含实例状态信息。 + +``` +gs_om -t status --detail +[ Cluster State ] + +cluster_state : Normal +redistributing : No +current_az : AZ_ALL + +[ Datanode State ] + +node node_ip instance state | node node_ip instance state +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +1 pekpopgsci00235 10.244.62.204 6001 /opt/gaussdb/cluster/data/dn1 P Primary Normal | 2 pekpopgsci00238 10.244.61.81 6002 /opt/gaussdb/cluster/data/dn1 S Standby Normal +``` + diff --git "a/content/zh/docs/Administratorguide/\347\224\237\346\210\220\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Administratorguide/\347\224\237\346\210\220\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..e8f34b4bb --- /dev/null +++ "b/content/zh/docs/Administratorguide/\347\224\237\346\210\220\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,61 @@ +# 生成配置文件 + +## 背景信息 + +在openGauss使用过程中,如果静态配置文件无意损坏后,会影响openGauss感知openGauss拓扑结构和主备关系gs\_om工具生成静态配置文件,替换已经损坏的配置文件,openGauss的正常运行。 + +## 前置条件 + +无。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 执行如下命令会在本服务器指定目录下生成配置文件。 + + ``` + gs_om -t generateconf -X /opt/software/openGauss/clusterconfig.xml --distribute + ``` + + /opt/software/openGauss/clusterconfig.xml为openGauss安装时XML配置文件的存放目录。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >1. 执行命令后,日志信息中会有新文件的存放的目录。以一主两备环境为例,打开新文件存放目录,会出现3个以主机名命名的配置文件,需要用这3个文件分别替换对应主机的配置文件。 + >2. 若不使用--distribute参数,需执行[3](#zh-cn_topic_0237088792_zh-cn_topic_0059777801_lc1ce55d572e44beea3e47b1b427fae3e)将静态配置文件分配到对应节点;若使用--distribute参数,则会将生成的静态配置文件自动分配到对应节点,无需执行[3](#zh-cn_topic_0237088792_zh-cn_topic_0059777801_lc1ce55d572e44beea3e47b1b427fae3e)。 + +3. (可选)分别替换3台主机的/opt/gaussdb/app/bin目录下损坏的静态配置文件。 + + 这里以其中一台主机为例进行介绍。 + + ``` + mv /opt/huawei/wisequery/script/static_config_files/cluster_static_config_SIA1000056771 /opt/gaussdb/app/bin/cluster_static_config + ``` + + +## 示例 + +在openGauss中的任意主机上执行如下命令,生成配置文件: + +``` +gs_om -t generateconf -X /opt/software/openGauss/clusterconfig.xml --distribute +Generating static configuration files for all nodes. +Creating temp directory to store static configuration files. +Successfully created the temp directory. +Generating static configuration files. +Successfully generated static configuration files. +Static configuration files for all nodes are saved in /opt/huawei/Bigdata/mppdb/wisequery/script/static_config_files. +Distributing static configuration files to all nodes. +Successfully distributed static configuration files. +``` + +打开生成的配置文件目录,会看到新生成的3个文件: + +``` +cd /opt/huawei/Bigdata/mppdb/wisequery/script/static_config_files +ll +total 456 +-rwxr-xr-x 1 omm dbgrp 155648 2016-07-13 15:51 cluster_static_config_plat1 +-rwxr-xr-x 1 omm dbgrp 155648 2016-07-13 15:51 cluster_static_config_plat2 +-rwxr-xr-x 1 omm dbgrp 155648 2016-07-13 15:51 cluster_static_config_plat3 +``` + diff --git "a/content/zh/docs/Administratorguide/\347\263\273\347\273\237\346\227\245\345\277\227.md" "b/content/zh/docs/Administratorguide/\347\263\273\347\273\237\346\227\245\345\277\227.md" new file mode 100644 index 000000000..df5cac2f4 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\347\263\273\347\273\237\346\227\245\345\277\227.md" @@ -0,0 +1,25 @@ +# 系统日志 + +openGauss运行时数据库节点以及openGauss安装部署时产生的日志统称为系统日志。如果openGauss在运行时发生故障,可以通过这些系统日志及时定位故障发生的原因,根据日志内容制定恢复openGauss的方法。 + +## 日志文件存储路径 + +数据库节点的运行日志放在“/var/log/gaussdb/用户名/pg\_log”中各自对应的目录下。 + +OM openGauss安装卸载时产生的日志放在“/var/log/gaussdb/用户名/om”目录下。 + +## 日志文件命名格式 + +数据库节点运行日志的命名规则: + +postgresql-创建时间.log + +默认情况下,每日0点或者日志文件大于16MB或者数据库实例(数据库节点)重新启动后,会生成新的日志文件。 + +## 日志内容说明 + +- 数据库节点每一行日志内容的默认格式: + + 日期+时间+时区+用户名称+数据库名称+会话ID+日志级别+日志内容 + + diff --git "a/content/zh/docs/Administratorguide/\351\200\273\350\276\221\345\244\207\344\273\275\346\201\242\345\244\215.md" "b/content/zh/docs/Administratorguide/\351\200\273\350\276\221\345\244\207\344\273\275\346\201\242\345\244\215.md" new file mode 100644 index 000000000..70811ad09 --- /dev/null +++ "b/content/zh/docs/Administratorguide/\351\200\273\350\276\221\345\244\207\344\273\275\346\201\242\345\244\215.md" @@ -0,0 +1,11 @@ +# 逻辑备份恢复 + +- **[gs\_dump](gs_dump.md)** + +- **[gs\_dumpall](gs_dumpall.md)** + +- **[gs\_restore](gs_restore.md)** + +- **[gs\_backup](gs_backup.md)** + + diff --git "a/content/zh/docs/Administratorguide/\351\253\230\345\215\261\346\223\215\344\275\234\344\270\200\350\247\210\350\241\250.md" "b/content/zh/docs/Administratorguide/\351\253\230\345\215\261\346\223\215\344\275\234\344\270\200\350\247\210\350\241\250.md" new file mode 100644 index 000000000..15c487fdd --- /dev/null +++ "b/content/zh/docs/Administratorguide/\351\253\230\345\215\261\346\223\215\344\275\234\344\270\200\350\247\210\350\241\250.md" @@ -0,0 +1,98 @@ +# 高危操作一览表 + +各项操作请严格遵守指导书操作,同时如下高危操作禁止随意执行。 + +[表1](#zh-cn_topic_0237088894_zh-cn_topic_0059777750_t725e2ece7f7a4d5f962b2c314e7e836b)中描述在产品的操作与维护阶段,进行日常操作时应注意的严禁操作。 + +**表 1** 禁用操作 + + + + + + + + + + + + + +

操作名称

+

操作风险

+

严禁修改数据目录下文件名,权限,内容不能修改,不能删除内容。

+

导致数据库节点实例出现严重错误,并且无法修复。

+

严禁删除数据库系统表或系统表数据。

+

删除系统表将导致无法正常进行业务操作。

+
+ +[表2](#zh-cn_topic_0237088894_zh-cn_topic_0059777750_tf7f1e2a0747f496baffa365814127a3c)中描述在产品的操作与维护阶段,进行日常操作时应注意的高危操作。 + +**表 2** 高危操作 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

操作分类

+

操作名称

+

操作风险

+

风险等级

+

规避措施

+

重大操作观察项目

+

数据库

+

不能直接在配置文件中手动修改端口号。

+

导致数据库启动不了或者连接不上。

+

▲▲▲▲▲

+

尽量使用工具修改,不要手动操作

+

无。

+

不能随意修改pg_hba.conf配置文件中的内容。

+

导致客户端连接不上。

+

▲▲▲▲▲

+

严格根据产品手册操作。

+

无。

+

不能手动修改pg_xlog的内容。

+

导致数据库无法启动,数据不一致。

+

▲▲▲▲▲

+

尽量使用工具修改,不要手动操作。

+

无。

+

作业

+

使用kill -9终止作业进程。

+

导致作业占用的系统资源无法释放。

+

▲▲▲

+

尽量登录数据库使用pg_terminate_backend,pg_cancel_backend操作终止作业,或使用Ctrl+C终止作业进程。

+

观察资源使用情况。

+
+ diff --git a/content/zh/docs/Compilationguide/Compilation.md b/content/zh/docs/Compilation/Compilation.md similarity index 100% rename from content/zh/docs/Compilationguide/Compilation.md rename to content/zh/docs/Compilation/Compilation.md diff --git a/content/zh/docs/Compilation/FAQ.md b/content/zh/docs/Compilation/FAQ.md new file mode 100644 index 000000000..b3357af9d --- /dev/null +++ b/content/zh/docs/Compilation/FAQ.md @@ -0,0 +1,11 @@ +# FAQ + +- **[如何清除编译过程中生成的临时文件](如何清除编译过程中生成的临时文件.md)** + +- **[如何解决“Configure error: C compiler cannot create executables”报错](如何解决-Configure-error-C-compiler-cannot-create-executables-报错.md)** + +- **[如何解决 "g++: fatal error: Killed signal terminated program cclplus" 报错](如何解决-g++-fatal-error-Killed-signal-terminated-program-cclplus-报错.md)** + +- **[如何解决"out of memory allocating xxx bytes after a total of xxx bytes"报错](如何解决-out-of-memory-allocating-xxx-bytes-after-a-total-of-xxx-bytes-报错.md)** + + diff --git "a/content/zh/docs/Compilation/build-sh\344\273\213\347\273\215.md" "b/content/zh/docs/Compilation/build-sh\344\273\213\347\273\215.md" new file mode 100644 index 000000000..885363774 --- /dev/null +++ "b/content/zh/docs/Compilation/build-sh\344\273\213\347\273\215.md" @@ -0,0 +1,75 @@ +# build.sh介绍 + +openGauss-server/build.sh是编译过程中的重要脚本工具。其集成了软件安装编译、产品安装包编译两种功能,可快速进行代码编译和打包。 + +详细参数选项如下表所示: + +**表 1** build.sh参数功能选项介绍。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能选项

+

缺省值

+

参数

+

功能

+

-h

+

不使用此选项

+

-

+

帮助菜单。

+

-m

+

release

+

[debug | release | memcheck]

+

选择编译目标版本。

+

-3rd

+

${代码路径}/binarylibs

+

[binarylibs path]

+

指定binarylibs的路径,需绝对路径。

+

-pkg

+

不使用此功能

+

-

+

将代码编译结果压缩封装成安装包。

+

--no_om_adapt

+

不使用此选项

+

-

+

安装包不去适配om,仅在添加-pkg选项时生效。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>1. -m \[debug | release | memcheck\] 表示可选择三种目标版本: +> - release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 +> - debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境。 +> - memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 +>2. -3rd \[binarylibs path\] 为binarylibs的路径。缺省情况下,当前代码文件夹下存在binarylibs。如果将binarylibs移动到openGauss-server下,或在openGauss-server下创建了指向binarylibs的软链接,可不指定此选项。但需要注意其容易被git clean等操作删除。 +>3. 此脚本每个参数选项都设置了缺省值,且数量并不多,依赖关系简单,因此使用时非常方便。如果用户需求值与缺省值不同,请根据实际情况进行设置。 + diff --git "a/content/zh/docs/Compilation/figures/\347\273\230\345\233\2761.png" "b/content/zh/docs/Compilation/figures/\347\273\230\345\233\2761.png" new file mode 100644 index 0000000000000000000000000000000000000000..8faf34a3f75974cb6b4c5f3f081f384691e5db48 GIT binary patch literal 30588 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⪻Jcoz(aYcfCR+Rf;XixAQp{{jpa|b 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Compilation/public_sys-resources/icon-danger.gif b/content/zh/docs/Compilation/public_sys-resources/icon-danger.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Compilation/public_sys-resources/icon-note.gif b/content/zh/docs/Compilation/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/content/zh/docs/Compilation/public_sys-resources/icon-notice.gif b/content/zh/docs/Compilation/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 GIT binary patch literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Compilation/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" "b/content/zh/docs/Compilation/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" new file mode 100644 index 000000000..e0f814c2d --- /dev/null +++ "b/content/zh/docs/Compilation/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" @@ -0,0 +1,46 @@ +# 产品安装包编译 + +安装包编译即将代码编译生成软件安装包,安装包的编译打包过程也集成在build.sh之中。 + +## 前提条件 + +- 已按照[搭建编译环境](搭建编译环境.md)的要求准备好相关软硬件,并且已经参考[代码下载](代码下载.md) 下载了代码。 +- 已完成开源软件编译构建,具体请参见[开源软件编译构建](开源软件编译构建.md)。 +- 了解 [build.sh](build-sh介绍.md) 脚本的参数选项和功能。 +- 代码环境干净,没有以前编译生成的文件。具体请参见[FAQ 4.1](如何清除编译过程中生成的临时文件.md)。 + +## 操作步骤 + +1. 执行如下命令进入到代码目录。 + + ``` + [user@linux sda]$ cd /sda/openGauss-server + ``` + +2. 执行如下命令编译出openGauss产品安装包。 + + ``` + [user@linux openGauss-server]$ sh build.sh -m [debug | release | memcheck] -3rd [binarylibs path] -pkg + ``` + + 例如: + + ``` + sh build.sh -pkg # 生成release版本的openGauss安装包。需代码目录下有binarylibs或者其软链接,否则将会失败。 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >可通过添加 --no\_om\_adapt 选项指定安装包不适配om。 + >此步骤会经历上一章节所介绍的一键式编译最终生成软件的过程、与将软件封装成安装包的过程。 + +3. 显示如下内容,表示安装包编译成功。 + + ``` + success! + ``` + + - 生成的安装包会存放在./package目录下。 + - 编译日志为:make\_compile.log + - 安装包打包日志为:./package/make\_package.log + + diff --git "a/content/zh/docs/Compilation/\344\273\243\347\240\201\344\270\213\350\275\275.md" "b/content/zh/docs/Compilation/\344\273\243\347\240\201\344\270\213\350\275\275.md" new file mode 100644 index 000000000..0d7ffe6c2 --- /dev/null +++ "b/content/zh/docs/Compilation/\344\273\243\347\240\201\344\270\213\350\275\275.md" @@ -0,0 +1,24 @@ +# 代码下载 + +## 前提条件 + +已在本地安装并配置git和git-lfs。 + +## 操作步骤 + +1. 执行如下命令下载代码和开源第三方软件仓库等,其中_\[git ssh address\]_表示实际代码下载地址,可在openGauss社区获取这些地址。 + + ``` + [user@linux sda]$ git clone [git ssh address] openGauss-server + [user@linux sda]$ git clone [git ssh address] openGauss-third_party + [user@linux sda]$ git clone [git ssh address] openGauss-third_party_binarylibs + [user@linux sda]$ mv openGauss-third_party_binarylibs binarylibs + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- openGauss-server:openGauss的代码仓库。 + >- openGauss-third\_party:openGauss依赖的开源第三方软件仓库。 + >- openGauss-third\_party\_binarylibs:编译好的开源第三方软件仓库。用户可以通过[开源软件编译构建](开源软件编译构建.md)获取这些文件,也可在直接在此仓库下载获取。在这里为了缩短名称,并且和开源第三方软件仓库编译输出的目标位置保持一致,将其重命名为binarylibs。 + +2. 下载项进度均显示为100%时表示下载成功。 + diff --git "a/content/zh/docs/Compilationguide/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" "b/content/zh/docs/Compilation/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" similarity index 78% rename from "content/zh/docs/Compilationguide/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" rename to "content/zh/docs/Compilation/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" index 7c3964f9e..01899f02b 100644 --- "a/content/zh/docs/Compilationguide/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" +++ "b/content/zh/docs/Compilation/\345\246\202\344\275\225\346\270\205\351\231\244\347\274\226\350\257\221\350\277\207\347\250\213\344\270\255\347\224\237\346\210\220\347\232\204\344\270\264\346\227\266\346\226\207\344\273\266.md" @@ -6,7 +6,7 @@ ## 回答 -进入/sda/openGauss-server目录,执行如下命令清除编译过程中生成的临时文件。 +进入/sda/openGauss-server目录,选择执行如下命令清除编译过程中生成的临时文件。 - 删除由configure和make生成的文件。 diff --git "a/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-C-compiler-cannot-create-executables-\346\212\245\351\224\231.md" "b/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-C-compiler-cannot-create-executables-\346\212\245\351\224\231.md" new file mode 100644 index 000000000..831a453b8 --- /dev/null +++ "b/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-C-compiler-cannot-create-executables-\346\212\245\351\224\231.md" @@ -0,0 +1,12 @@ +# 如何解决“Configure error: C compiler cannot create executables”报错 + +## 问题 + +如何解决版本编译时出现的“Configure error: C compiler cannot create executables”报错。 + +## 回答 + +报错原因:binarylibs文件不完整或者被损坏。 + +解决办法:若binarylibs是通过开源软件构建而来,请重新构建开源第三方软件。若binarylibs是代码下载而来,可以进入binarylibs文件夹内, 执行命令**git pull && git lfs pull**下载缺失的文件。重新执行当前脚本或命令。 + diff --git "a/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-g++-fatal-error-Killed-signal-terminated-program-cclplus-\346\212\245\351\224\231.md" "b/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-g++-fatal-error-Killed-signal-terminated-program-cclplus-\346\212\245\351\224\231.md" new file mode 100644 index 000000000..704d0eece --- /dev/null +++ "b/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-g++-fatal-error-Killed-signal-terminated-program-cclplus-\346\212\245\351\224\231.md" @@ -0,0 +1,12 @@ +# 如何解决 "g++: fatal error: Killed signal terminated program cclplus" 报错 + +## 问题 + +如何解决编译过程中出现的 "g++: fatal error: Killed signal terminated program cclplus" 报错。 + +## 回答 + +报错原因:脚本中的编译过程都添加了-sj参数,并发数太大导致错误。 + +解决办法:编译过程中降低make 并发数,或者直接使用make命令。使用一键式脚本的话需要修改脚本。 + diff --git "a/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-out-of-memory-allocating-xxx-bytes-after-a-total-of-xxx-bytes-\346\212\245\351\224\231.md" "b/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-out-of-memory-allocating-xxx-bytes-after-a-total-of-xxx-bytes-\346\212\245\351\224\231.md" new file mode 100644 index 000000000..22505dbd7 --- /dev/null +++ "b/content/zh/docs/Compilation/\345\246\202\344\275\225\350\247\243\345\206\263-out-of-memory-allocating-xxx-bytes-after-a-total-of-xxx-bytes-\346\212\245\351\224\231.md" @@ -0,0 +1,12 @@ +# 如何解决"out of memory allocating xxx bytes after a total of xxx bytes"报错 + +## 问题 + +如何解决编译过程中出现的"out of memory allocating xxx bytes after a total of xxx bytes"报错。 + +## 回答 + +报错原因:脚本中的编译过程都添加了-sj参数,同时机器配置较低,内存不足,并发数太大导致错误 + +解决办法:编译过程中降低make 并发数,或者直接使用make命令。使用一键式脚本的话需要修改脚本。 + diff --git "a/content/zh/docs/Compilation/\345\274\200\346\272\220\350\275\257\344\273\266\347\274\226\350\257\221\346\236\204\345\273\272.md" "b/content/zh/docs/Compilation/\345\274\200\346\272\220\350\275\257\344\273\266\347\274\226\350\257\221\346\236\204\345\273\272.md" new file mode 100644 index 000000000..efcc33779 --- /dev/null +++ "b/content/zh/docs/Compilation/\345\274\200\346\272\220\350\275\257\344\273\266\347\274\226\350\257\221\346\236\204\345\273\272.md" @@ -0,0 +1,76 @@ +# 开源软件编译构建 + +## 开源软件编译构建 + +openGauss的编译,需要提前把所依赖的开源第三方软件进行编译和构建。这些开源第三方软件存放在代码openGauss-third\_party代码仓中,并且用户通常只需要构建一次。若存在开源软件版本更新,则需要重新构建。 + +用户也可以直接在binarylibs仓库中直接获取开源软件编译构建的输出文件,则可以跳过这一个步骤,参考[3.1.1代码下载](代码下载.md)。 + +**表 1** openGauss开源三方件编译前置软件要求 + + + + + + + + + + + + + + + + + + + + + + + + + +

所需软件

+

建议版本

+

python3

+

建议版本:3.6

+

python3-dev

+

建议版本:3.x

+

pam-devl

+

建议版本:1.1.8-1.3.1

+

ncurses-devel

+

建议版本:5.9-13.20130511

+

libffi-dev

+

建议版本:3.1

+

patch

+

建议版本:2.7.1-10

+
+ +执行如下命令进入内核依赖的开源第三方软件目录,进行开源第三方软件的编译和构建,产生相应的二进制程序或库文件。/sda/openGauss-third\_party为开源第三方软件下载目录。 + +``` +[user@linux sda]$ cd /sda/openGauss-third_party/build +[user@linux sda]$ sh build.sh +``` + +用户执行以上命令之后,可以自动生成数据库编译所需的开源第三方软件,如果想单独的生成某个开源三方软件,可以进入对应的目录,执行build.sh脚本,如: + +``` +[user@linux sda]$ cd /sda/openGauss-third_party/dependency/openssl +[user@linux sda]$ sh build.sh +``` + +即可编译生成openssl + +>![](public_sys-resources/icon-note.gif) **说明:** +>相关的报错日志可以查看对应的build目录下对应名字的log以及对应模块下的log,如dependency模块下的openssl的相关编译安装日志可以查看: +>- /sda/openGauss-third\_party/build/dependency\_build.log +>- /sda/openGauss-third\_party/dependency/build/openssl\_build.log +>- /sda/openGauss-third\_party/dependency/openssl/build\_openssl.log + +## 编译构建结果 + +执行上述脚本,最终编译构建出的结果会存放在openGauss-third\_party同级的binarylibs目录。这些文件会在后面编译openGauss-server时使用到。 + diff --git "a/content/zh/docs/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" "b/content/zh/docs/Compilation/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" similarity index 100% rename from "content/zh/docs/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" rename to "content/zh/docs/Compilation/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" diff --git "a/content/zh/docs/Compilationguide/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" "b/content/zh/docs/Compilation/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" similarity index 100% rename from "content/zh/docs/Compilationguide/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" rename to "content/zh/docs/Compilation/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" diff --git "a/content/zh/docs/Compilation/\346\246\202\350\277\260.md" "b/content/zh/docs/Compilation/\346\246\202\350\277\260.md" new file mode 100644 index 000000000..8e6899102 --- /dev/null +++ "b/content/zh/docs/Compilation/\346\246\202\350\277\260.md" @@ -0,0 +1,4 @@ +# 概述 + +本文档介绍了openGauss对于操作系统的要求、编译环境的要求、软件依赖、编译方法以及编译结果的存放位置等。 + diff --git "a/content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" "b/content/zh/docs/Compilation/\347\211\210\346\234\254\347\274\226\350\257\221.md" similarity index 80% rename from "content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" rename to "content/zh/docs/Compilation/\347\211\210\346\234\254\347\274\226\350\257\221.md" index 0b3d9b971..0765a845f 100644 --- "a/content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" +++ "b/content/zh/docs/Compilation/\347\211\210\346\234\254\347\274\226\350\257\221.md" @@ -2,7 +2,9 @@ openGauss的编译过程和生成安装包的过程已经写成了两个一键式的脚本,可以方便的通过脚本进行编译操作。也可以自己配置环境变量,通过命令进行编译。 -本章节会介绍openGauss编译需要满足的前提条件,编译的操作步骤等。 +本章节会介绍openGauss编译需要满足的前提条件,编译的操作步骤等,下图是对编译流程的大致概括,详细内容见下文。 + +![](figures/绘图1.png) - **[编译前准备](编译前准备.md)** diff --git "a/content/zh/docs/Compilationguide/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" "b/content/zh/docs/Compilation/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" similarity index 100% rename from "content/zh/docs/Compilationguide/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" rename to "content/zh/docs/Compilation/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" diff --git "a/content/zh/docs/Compilation/\347\233\256\347\232\204.md" "b/content/zh/docs/Compilation/\347\233\256\347\232\204.md" new file mode 100644 index 000000000..09a6c1585 --- /dev/null +++ "b/content/zh/docs/Compilation/\347\233\256\347\232\204.md" @@ -0,0 +1,4 @@ +# 目的 + +本文档帮助读者快速了解编译openGauss所需的软硬件要求、环境配置,以及如何从源码编译出软件或者安装包。 + diff --git "a/content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" "b/content/zh/docs/Compilation/\347\241\254\344\273\266\350\246\201\346\261\202.md" similarity index 100% rename from "content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" rename to "content/zh/docs/Compilation/\347\241\254\344\273\266\350\246\201\346\261\202.md" diff --git "a/content/zh/docs/Compilation/\347\256\200\344\273\213.md" "b/content/zh/docs/Compilation/\347\256\200\344\273\213.md" new file mode 100644 index 000000000..fb53df15e --- /dev/null +++ "b/content/zh/docs/Compilation/\347\256\200\344\273\213.md" @@ -0,0 +1,7 @@ +# 简介 + +- **[目的](目的.md)** + +- **[概述](概述.md)** + + diff --git "a/content/zh/docs/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" "b/content/zh/docs/Compilation/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" similarity index 46% rename from "content/zh/docs/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" rename to "content/zh/docs/Compilation/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" index 1b2d6fdcd..f775e8a78 100644 --- "a/content/zh/docs/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" +++ "b/content/zh/docs/Compilation/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" @@ -2,4 +2,8 @@ - **[代码下载](代码下载.md)** +- **[开源软件编译构建](开源软件编译构建.md)** + +- **[build.sh介绍](build-sh介绍.md)** + diff --git "a/content/zh/docs/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" "b/content/zh/docs/Compilation/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" similarity index 62% rename from "content/zh/docs/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" rename to "content/zh/docs/Compilation/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" index 8562aa09a..306e023f8 100644 --- "a/content/zh/docs/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" +++ "b/content/zh/docs/Compilation/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" @@ -13,12 +13,7 @@ -

libaio

- -

建议版本:0.3.109-13

- - -

libaio-devel

+

libaio-devel

建议版本:0.3.109-13

@@ -38,29 +33,19 @@

建议版本:5.9-13.20130511

-

zlib-devel

- -

建议版本:1.2.7-15

- - -

glibc

+

glibc.devel

建议版本:2.17-111

-

glibc.i686

- -

建议版本:2.17-111

- - -

glibc.devel*

+

patch

-

建议版本:2.17-111

+

建议版本:2.7.1-10

-

patch

+

lsb_release

-

建议版本:2.7.1-10

+

建议版本:4.1

diff --git "a/content/zh/docs/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" "b/content/zh/docs/Compilation/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" similarity index 46% rename from "content/zh/docs/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" rename to "content/zh/docs/Compilation/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" index e8e37ae64..c564e8906 100644 --- "a/content/zh/docs/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" +++ "b/content/zh/docs/Compilation/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" @@ -4,9 +4,10 @@ ## 前提条件 -- 已按照[搭建编译环境](搭建编译环境.md)的要求准备好相关软硬件。 -- 已下载代码和子仓库。具体请参见[代码下载](代码下载.md)。 -- 已完成开源软件编译构建。 +- 已按照[搭建编译环境](搭建编译环境.md)的要求准备好相关软硬件,并且已参考[代码下载](代码下载.md) 下载了代码。 +- 已完成开源软件编译构建,具体请参见[开源软件编译构建](开源软件编译构建.md)。 +- 了解 [build.sh](build-sh介绍.md) 脚本的参数选项和功能。 +- 代码环境干净,没有以前编译生成的文件。具体请参见[FAQ 4.1](如何清除编译过程中生成的临时文件.md)。 ## 一键式脚本编译 @@ -19,14 +20,14 @@ 2. 执行如下命令,编译安装openGauss。 ``` - [user@linux openGauss-server]$ sh build.sh [debug | release | memcheck] + [user@linux openGauss-server]$ sh build.sh -m [debug | release | memcheck] -3rd [binarylibs path] ``` - >![](public_sys-resources/icon-note.gif) **说明:** - >_\[debug | release | memcheck\]_表示可选择三种目标版本,三种目标版本如下所示: - >- release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 - >- debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境; - >- memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 + 例如: + + ``` + sh build.sh -pkg # 生成release版本的openGauss安装包。需代码目录下有binarylibs或者其软链接,否则将会失败。 + ``` 3. 显示如下内容,表示编译成功。 @@ -55,19 +56,19 @@ >![](public_sys-resources/icon-note.gif) **说明:** >- 显示的结果表示openGauss当前支持的操作系统,openGauss支持的操作系统为centos7.6\_x86\_64、openeuler\_aarch64。 - >- 如果结果显示为 Failed,表示当前操作系统不支持。 + >- 如果结果显示为 Failed 或者其他版本,表示openGauss不支持当前操作系统。 -3. 配置环境变量,将[步骤2](#li1666842982511)获取到的结果替换下面的**\*\*\***。 +3. 配置环境变量,根据自己的代码下载位置补充两处"\_\_\_\_",将[步骤2](#li1666842982511)获取到的结果替换下面的**\*\*\***。 ``` - export CODE_BASE=`pwd` - export GCC_PATH=$CODE_BASE/binarylibs/buildtools/***/gcc8.2/ + export CODE_BASE=________ # openGauss-server的路径 + export BINARYLIBS=________ # binarylibs的路径 + export GAUSSHOME=$CODE_BASE/dest/ + export GCC_PATH=$BINARYLIBS/buildtools/***/gcc8.2/ export CC=$GCC_PATH/gcc/bin/gcc export CXX=$GCC_PATH/gcc/bin/g++ - export LD_LIBRARY_PATH=$GCC_PATH/gcc/lib64:$GCC_PATH/isl/lib:$GCC_PATH/mpc/lib/:$GCC_PATH/mpfr/lib/:$GCC_PATH/gmp/lib/:$LD_LIBRARY_PATH - export PATH=$CODE_BASE/dest/bin:$GCC_PATH/gcc/bin:$PATH - export LD_LIBRARY_PATH=$CODE_BASE/dest/lib:$LD_LIBRARY_PATH - export GAUSSHOME=$CODE_BASE/dest/ + export LD_LIBRARY_PATH=$GAUSSHOME/lib:$GCC_PATH/gcc/lib64:$GCC_PATH/isl/lib:$GCC_PATH/mpc/lib/:$GCC_PATH/mpfr/lib/:$GCC_PATH/gmp/lib/:$LD_LIBRARY_PATH + export PATH=$GAUSSHOME/bin:$GCC_PATH/gcc/bin:$PATH ``` 4. 选择版本进行configure。 @@ -75,27 +76,29 @@ debug版: ``` - ./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib + ./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib ``` release版: ``` - ./configure --gcc-version=8.2.0 CC=g++ CFLAGS="-O2 -g3" --prefix=$GAUSSHOME --enable-thread-safety --without-readline --without-zlib + ./configure --gcc-version=8.2.0 CC=g++ CFLAGS="-O2 -g3" --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-thread-safety --without-readline --without-zlib ``` memcheck版: ``` - ./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib --enable-memory-check + ./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib --enable-memory-check ``` >![](public_sys-resources/icon-note.gif) **说明:** - >_\[debug | release | memcheck\]_表示可选择三种目标版本,三种目标版本如下所示: - >- release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 - >- debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境; - >- memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 - >在ARM平台上,release版本的CFLAGS需要添加 -D\_\_USE\_NUMA 。 + >1. _\[debug | release | memcheck\]_ 表示可选择三种目标版本,三种目标版本如下所示: + > - release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 + > - debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境; + > - memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 + >2. 在ARM平台上,CFLAGS需要添加 -D\_\_USE\_NUMA 。 + >3. 在ARMv8.1或者更高的平台上\(例如鲲鹏920\),CFLAGS需要添加 -D\_\_ARM\_LSE 。 + >4. 若将binarylibs移动到openGauss-server下,或在openGauss-server下创建了指向binarylibs的软链接,可不指定--3rd参数。但这样做的话需要注意其容易被git clean等操作删除。 5. 执行如下命令,编译安装。 @@ -107,7 +110,7 @@ 6. 显示如下内容,表示编译安装成功。 ``` - PostgreSQL installation complete. + openGauss installation complete. ``` - 编译后软件安装路径为:$GAUSSHOME diff --git "a/content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" "b/content/zh/docs/Compilation/\350\275\257\344\273\266\350\246\201\346\261\202.md" similarity index 100% rename from "content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" rename to "content/zh/docs/Compilation/\350\275\257\344\273\266\350\246\201\346\261\202.md" diff --git a/content/zh/docs/Compilationguide/FAQ.md b/content/zh/docs/Compilationguide/FAQ.md deleted file mode 100644 index d457fe0d3..000000000 --- a/content/zh/docs/Compilationguide/FAQ.md +++ /dev/null @@ -1,7 +0,0 @@ -# FAQ - -- **[如何清除编译过程中生成的临时文件](如何清除编译过程中生成的临时文件.md)** - -- **[如何解决“Configure error: Ccompiler cannot create executables”报错](如何解决-Configure-error-Ccompiler-cannot-create-executables-报错.md)** - - diff --git "a/content/zh/docs/Compilationguide/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" "b/content/zh/docs/Compilationguide/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" deleted file mode 100644 index 4b81d5742..000000000 --- "a/content/zh/docs/Compilationguide/\344\272\247\345\223\201\345\256\211\350\243\205\345\214\205\347\274\226\350\257\221.md" +++ /dev/null @@ -1,41 +0,0 @@ -# 产品安装包编译 - -安装包编译即将代码编译生成软件安装包。 - -## 前提条件 - -- 已按照[搭建编译环境](搭建编译环境.md)的要求准备好相关软硬件。 -- 已下载代码和子仓库,具体请参见[代码下载](代码下载.md)。 -- 已完成开源软件编译构建。 - -## 操作步骤 - -1. 执行如下命令进入到安装包代码编译脚本目录。 - - ``` - [user@linux sda]$ cd /sda/openGauss-server/package - ``` - -2. 执行如下命令,编译出openGauss安装包。 - - ``` - [user@linux package]$ sh package_gaussdb_single.sh -m [debug | release | memcheck] - ``` - - >![](public_sys-resources/icon-note.gif) **说明:** - >_\[debug | release | memcheck\]_可选择三种目标版本,三种目标版本如下所示: - >- release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 - >- debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境; - >- memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 - -3. 显示如下内容,表示编译成功。 - - ``` - success! - ``` - - - 更多详细命令参数可参照 –h。 - - 生成的安装包会存放在当前目录下。 - - 编译日志为:make\_package.log - - diff --git "a/content/zh/docs/Compilationguide/\344\273\243\347\240\201\344\270\213\350\275\275.md" "b/content/zh/docs/Compilationguide/\344\273\243\347\240\201\344\270\213\350\275\275.md" deleted file mode 100644 index e437de429..000000000 --- "a/content/zh/docs/Compilationguide/\344\273\243\347\240\201\344\270\213\350\275\275.md" +++ /dev/null @@ -1,19 +0,0 @@ -# 代码下载 - -## 前提条件 - -已在本地安装并配置git和git-lfs,熟悉git submodule的应用。 - -## 操作步骤 - -1. 执行如下命令下载代码和子仓库,其中_\[git ssh address\]_表示实际代码下载地址,_openGauss-server_表示代码下载后的存放位置。此处举例代码下载到的本地路径为 /sda/openGauss-server, 下文将直接使用此路径。 - - ``` - [user@linux sda]$ git clone [git ssh address] openGauss-server - [user@linux sda]$ cd openGauss-server - [user@linux openGauss-server]$ git submodule init - [user@linux openGauss-server]$ git submodule update - ``` - -2. 下载项进度均显示为100%时表示下载成功。 - diff --git "a/content/zh/docs/Compilationguide/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-Ccompiler-cannot-create-executables-\346\212\245\351\224\231.md" "b/content/zh/docs/Compilationguide/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-Ccompiler-cannot-create-executables-\346\212\245\351\224\231.md" deleted file mode 100644 index d5d42c1f5..000000000 --- "a/content/zh/docs/Compilationguide/\345\246\202\344\275\225\350\247\243\345\206\263-Configure-error-Ccompiler-cannot-create-executables-\346\212\245\351\224\231.md" +++ /dev/null @@ -1,12 +0,0 @@ -# 如何解决“Configure error: Ccompiler cannot create executables”报错 - -## 问题 - -如何解决版本编译时出现的“Configure error: Ccompiler cannot create executables”报错。 - -## 回答 - -报错原因:子仓库文件不完整或者被删除。 - -解决办法:进入/sda/openGauss-server/binarylibs, 执行命令**git pull && git lfs pull**下载缺失的文件,并重新执行当前脚本或命令。 - diff --git "a/content/zh/docs/Description/figures/openGauss\350\241\214\345\210\227\346\267\267\345\255\230\345\274\225\346\223\216.png" "b/content/zh/docs/Description/figures/openGauss\350\241\214\345\210\227\346\267\267\345\255\230\345\274\225\346\223\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..5548dd618a66f9b849bb1ce2f61c5df4ac8f7cf9 GIT binary patch literal 123232 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

_=h+`xg^lKd4mkTh5Hz%X2nh8oc{3VyiZR zUZ&pnoLj2Wa3?PNh-4Oj2!lcNVoUQ^iRk7fJeqw2R{p>+q5TH6B2|UjfV0Of&$*%X znZiG7VSlTmjXt>GWqw&e1^oniSaI;u70FcPsy20Fe_LBp-)x<$tL;E(6}QS47OV4s z;vem&fvgeM{BJtE?02pghqen1Bc)o0Y{l(k7B|sY5Oznr-!zPLduDC<*RtOsBWkFQn>w@!=kP= z7U4?3Hy>>2;IhBMUKbl3#>?qd4H7@^n3T~RJ@*$gX&+hob?c;DJ!-*=(oxX zQZW$U1Dn*C7&WhRM;Fw6u7Vm_Tm^^fxF6-E^S&R$E53}70SUFZv|^T?o?}AXxZylX zq1d!i@i~4rsJL0T{ft#uwYx>`#LTlc6x3Pap9TW&FLnk6l*DHXfR3E>)cxqkRrW!&5DvH4Y3H$J~HT$)p|Y`qa)UNSF z8PqhVdL5l&(Cp&W!TD9Cd`urpGVD*NGvqpFI{?qCH~xm^p*ckG|5ZSmvm#`@rr%tM zr7gjWI&WOxrQpHgeY>R%6OQwx4#N+}!|jR+`@rsGdlid)5F<=B^waUeEGnyQe%@Tg3BTj z!}{@Vlmq;NzqY*aKJCl!B z^Yg(pMLyb}5M-1?#Jandq5CdGumUh2=w>mjm~{xZIEJ6N8NV}%wlG-@p2Ium12O=x zssO+s8|X%`kP;Zn+z>Xdi6zBe+XXsr!^IXfpKf%A()^XxT#e92V3#;}|KKhSH5U|E z3a-+@bUG4CY8ep%IWleuDx_Bt4lDfi@RHT)xMPOR8sv^KkhGmd~b}9(n_-98fFKB zQFGEu$s5FqN#no)GexAA!8Emt04PIx7b3=EGi)LcH8yIupGdlUfO=fQz`2VbGwijo zhY!H_rD+~pe$};A- z-+TaO254IhhzF|=Nkh|nzd|L~{WqT8prn9~FTotK<(So-omP=kTv}K6ILQ3cJ$>U; z4(Cz!qa&P_+|~RUgZ<`%#S)+5y+-=I3J9K-w^05i)$=uBBipV0{U>UkRaajxs=R6& zZOX=?%Tp`t@|5|lsqjAE@Kf)4f0JW>N6S0J{g(9`->5CNlkXUPZWNilim|877~2*V zRaMcK8))>y$2zMkXWJ*6@!WS9`(vA>?H*~^Uv_$x9gBE%qoKeJu@<;wbHu+{i{qL9 z_4cy`{rD(hWA~`22)e-Kk)A(`8|53A&8-Xh_9X=*xEul}qmxJb)5fR^viZ6pPdE+} zt~N#mMP0KE7^k>;`gZ7hxq9^RH^&Bt5)fnA3nQj$YR-(i;Ah?(f{)S(xRCs`@OUXC3i|7bTK7Oj~ zJ6)=Q0lldsH4YK{SMr10RDBomWviZKOQ%K4(}Snlza1;^z2_3&>hf9H=et_=;;%YC zL>K`>I@EJ~|Nh0OC*D#vgXEB8^cd1UuGo5_0V~K~yzx@dx>UH(Ay>q9$#1dpMxBy; zZ^^=9(nW)m{CpAW8iv@paQ2;VYU4PaUHAR5s+J8V*y9W-{yUfF${~7Xby7FXLH6wN zYy>+mM(U>DYebO8w>?D?VsHC`->u#ETlM$5hCoa$Im8>K=1XMVl3!V=^dXwWYtTLn zD9@;Jz>Bzy{ySl&51y_*9A$y^Uu?i-lmx#Q1_|Att3G{d?QHMA6tLI_hm!}upS9%4 zCdFg<_nHptj=?X6Dg_baHiI6VJUo=7;_#hK(F2d_X?a&AqG7KxN5ZR}N|Tbtz3?w=?(AV!~D8?hQ9c^iD5Qb6x>SoRr zaOO|Xy|;b*Y4k?L%Dj-d+t?AJwEgNe#)uki77h&SUh8TXPoFaLW8567c^JRTrouK_ z6eifxHQN({+kH;kQooPA;*hdW5DDGrw}9A&uw8&P0h|Z=kNoNxob|hs709J$OC;Ut zbAn|y-97)V(vCSoBVz2oyterM{ox69G)cDzD!J>?#?!y6t~CvKn_?) zHCwyl2BEO?x`?W3b0AzwQgT0kYG@!hE-vvT92YY?XE?hNx~Txn%Z8=#h((-j0}nXQ ztR((osLyfDy`I*gbMJ9;erA=w=m;(vMzTasM=k zkpP{#Xvwmo*9&GkaltV$!?#T*{ie)NvPnsMJ4X7_znzGM!A1i=x7|Zau{L=*cXph9 zr)&Q~W2e3oe%|6X1!fQZib<{@a*1bVI$SrqvxaZkmjDLw#=@6s1_tV9B2PwR zM1D@YwW>~^$ha(`p^-!snr7mZj*n0?kzqcPGv9i+n^*!;)?8s$NE2+ja0kp zhGBxo$}YVY!hy3{OZeH(wlqBK0ekBS-8O7;-AA{faY{`CJsN#Dlv<3gbQ`%ybEZU0 zwUwY{lHR}Ly3KI}DXk2HU1FXqAIxi`M~0*^-6fF8j}gp>4$EyoG`>phSCxUE#q)rW z=8LS{>oXnS_?)WeS%mw$#<09){1Ka?*ftYvshw3l&^Jq1tedHSazRj+Yzr|+`TYXov)YT=Jo^wJNUEw`_-7vmRkXcdhKkG$9FjmkS>nf z?#*99=P|=#vwJKlHKr?eQ@7_*8!ND^Zv?2+#jm~8*|x;rH(Q1Z?soim$yCMg(2ok} z!xj9xzY_HLQt(zF?X*EcleU05-0OzMNXD_(SCJnx;$Y$1w@^RLZ7&-Cn#r%(ny?DV z{dND4%du8?z(Sme8ph=YgE?% zpn~|i%rSJVEKR}fJ!WgJKs~CPdFDfOoWfag@i#)>&fz%4P(b~J9e-K#`Xuj4-5JS5 zhheQxEpGi->~{UDn`g1=WQ$G8kHq)yxkCo|kq`vDL@e}Rp%%}H>>Gp6>x4)D9 zNwXN5iHc&eon;cD-kck8)N1HpZ&{sVWi=r%qjZ&aOLWdkce2 z%Lsiw?VXpmT(5L;u}eMyn#xj!)ZXtPf#3xf_waBfVteb#^Ta^*Z$4~hYyH8}Z7%bd z-naUl_zm%oxNl)qiH;Cc{^t#QS0dTrk&F#39x0B zyR;&_f-5twfMu-A{HSTE?TF=O(Snro@uZs+7%Rbcr0AlOud?3!ep< zwts%y6%VbijU2zx(D?9)Sfw_HkW>rYfdSIg7p*ibh--hX@V$Pux8Am7BhfR0p@_DG zD>UzAp6cVR7vkO?UA(7pw9zuT&^)xHyhn}O0@>_cZlx%pWC=JnZ1H4Ab#>)!Ye(Vv zN9`>1XF;pX__e6j8PcMdDP16vn{}c{I!&CxeEQ7U@LIcKiM>f+(SUMZYp}H zYh0=!JYzOLcFe^oo%LGhbtXEAf!J<6UNl@SS*p!){?ZvOew0-F6vY)UckgLAOCqYs zJEg!VwWt3zJHTC{nV$P#hhNuAU@C_^5SisB;)f1p3d;RN*b=YWPRD==3jjEMQt2VR zau{7t58bhH&J8}$0bVQg;YPW7ZOD*&3V7SP=jMu)Rn%Z-ME83!`r;yxm(&o2hM;3ffoRpxsQ# z*&4MeQQ6kOqbVWlI}d%WxM*I3hwXPU+rmi%Xr++gz>JueNhLubyW(dtb%Vue;T*wd30Pc$l(re zKMJTX#`;(=w7}5&Ah2b!v(*oHV-`2!nKv&1_?Ok!mM25emRSD?@k=B05rY(ahqz*Ct<>1rVaPk>+ti9+JC39 zo1Ap!jRAA{2#hi1;jWJlVqX&Xrk-mxmAPIeBA|w}iz5eR0$oo35anWG_D`rIDV@Rg2KE3Lpd?(=*H=rrpzDw_(o=D95XgBZ zDkdhkKCV6*>~gUHv?a3^Ig9J@xi>Hyu0s7D++uwJVF8FyL}hjDV96i%?u8n6ch90Q zJJT%IjtwEy-x(bz^=5!h;598MP4XY0-+j1)02t=&>-;-}cDNVr=e*y|$)^n6P|W)B z2EMLCj!#R9b2H`6m??oZ=J6Lhi(FvF@fepx(R0oM@v+g+AVRZok1HmH{%Kp?T&t5d zyvmmKX{;{)b(%&AxQ1r@t@(sRSE0{j$lAyCPd`uR(Vq0Kp7zwXO9Rr7G^40UH@tqm zYk>*2?{&S$EJ?2OX9|5&ViU8t(ZGA7UB=kRtOb2>ea*dOL+zS++MM2;+?<^7fQS91 zc8Qkxjb!+4$|dKfotp186EgQh5GErTx@K`Wat0dDlPZ6`|2+ zx5w$`!NsxI0=U-OmSf9xX#jwz^kAwD>5%O_ubv9d&rv2{j;j0Bb@wV zW@dU0;CNR+NC@vg*9uyba;+GmY+*v_i7g6uRb~tmAL4z0k-q9a)(e=!0>EcGsp5=4 zfVQc?y5d=KUYqBo)TnPui9h(=g|ZJdgKrLjQjaUd+;wlG22#)3sxvm+dU`iYb+0GNeA2iIhez3eD3{Loc& zMh9_x5Fn)B*PkE1B4Z#8E-4j2=$4R6dLl?ab_ln`iTg`0`(DL!r4+0(gpA=17jy;o z79LJu`^WK!B9yk=H>tZM8m1Sr+AcyY&DRT^Dr^1>UqC zIepWBS8cdNX0Tu0MOULSOYfYKInepu^P_nvKfkP=y$4`k3V^3O<#|}0;=Qo$k@**Z z8v%+9mcFij2{G|J0@}Y0H&i%hz%rNvYqh>>AZL0g&au4ElWf zo!I!xpK3E5yzi2D2dX#Q6jieoG&C;E(0=-rg=e@~0E-D?HDI8#yInU&)*kxW+upt_ zo9YZE-;!t^MSkqiR;G4IBlEfvm*zSt{qADpa(O2Vn zQ2-lw3wSvQ?mydr83Q>V@Uj7g_NN8_wq4=7Se1pbI|E-hw7GA5uMZoCrM1mTQ_%A5 z-8oU$Un7b;1JuNt0VTaY`%76K`*YUKvQM*rg`#Xu;LNOiS-gRnhbpS7$yL7|fw7>@6 zc0S0Ah1_rXzwXENjfjr}Z5`Mi{I{p(GvovS?i{NLiSI!2&jA>i*Wwm4+vx+aGw{_^ z`7HlQys*!vfqzdDT>Jw)>_o{)^+M3+Q1D?oC>YyScR9&?w4V@lXQ$%Dsox_w+$EuM0fvus#tD@!Lvk{Hf#pgmnhl2{_{bvcyVz`N_*w z0_UDci>(drlH&e;Q209jx$U&OsX+`7GPOmHf69uZMdsvS6IaI%iX;NCS^4)F_kD0b zkXArsK108Ou#3hWj1AZ(_z|JCJ1b(N$2#K#|F-#u-eBJQH_mjN_*8NvCHu(eBC`+rN z*am9hFtrwTs`Nf+7-%0+K37m(oaxC?z3M(%s$Ow4{PGqEb>)(kU$|(%m3} zA`MbXp1H;6d7tn1d*AVW=lplh9**JQuD$kJbIp0pYtA(%vIQ1mUys|1pK2(g5WmH0 zw{QESmv%=gKVm#GZ|}A1%{G(%Z+j~bozS~szHz`%VoiLDf0%xCGQ_+58Cnt%I=r8I z0@v8&0P-P|YnheV0}_K!Fh4RM9;m&)Nd$aL`J6wF;qU-B+dCRL5r`9^WKeKY(D)+i zjVJ8ThcU|spHI}PWDAe=p0_`{(P*wodZynHbfpBY{|(7SLw1RXM++BRkhzQeAb-7b zqRM@ObECTyPlO$Yzgc-FV7wu9KfcRo`{#NV`lqfTATzcV;7wvzE9GFBR-J2Wno4MP z$Q40WD47|1gJZ3?AIX0+GBCMoTfi7fVNZcx_7|}3^YcIK zc8uc^V;2wi(QemKt4bEbZKCxBLb( z^x%!Py||xypdm<&EbpJmA>l5xn0;j_Fe9SH3Un+BP>3)NQ^Hr|D zYpXS0?@BlUo5M%V=G(K5w=zmfqiX78-I_fJeAW47w^PFkH|el6>t(riZ&O{v0Pv!+ zYDVwA8^W^Y9VD`{sQ~v_s;IK4kAe3JXH)h&$otL)K)RnwxbH^?c4T*Ef-d=`eV3#; z+;=U1w&pAw-#aS7^Kl+@a49eG)YLU@=}=qTm$dbSQ_Uub;zhV< znFjw;g1wFQ(=GDy01PBSG-xQ8x-ozF>gLvR?QZrPf2;D9)La%; zJTu2;@OVSn)KbS}uJ26rgEI6eqXoYKd8uuA86m-dn?;CRz|jt+C5|7J$)Z!Yb8~N( zWdZ=mooPXI-mcrxJ$k8YP3QI4x`4T)bclt$nI+^XC8wzDuko%Eq6&z6Q^k(!IIIFT z3&H?G&s*DZU2iY9Zdj`4LS~{x$U}a56O9GM(zdU|!XB5n- zVS4%^wsr0DMYV6K>DW`l)UTNl0|}>tahtf4 zE;?ONba}~Uo~<)6FK@yzW>3}wfWLYDq0Uc%oz6*oq3-51X&)iEvh2c?NxX=andxjH8ASrQ&<Q-sA!7Y79*8CVA~)lE_V!n|Pd!RvR-B3W=t%4MXbtF~HK2p6sGllp_}yst5xvTL;$lWm#f9ZX zJ;MxTqH_V`!ND1mO>@>zBH5>6>6*6(vES$nYt*WiayKQ3<0BK~7dXT!|4Q2>VEsEc z_58nbfPMd!<*J)+@>e?JPlK{pL-tJ}{@=CQkle&TX@mfmzTsN)jpFz2M_zYojhQlW z@{M*vZ6cUkFR{5-;-8yue|~zUz@YWKqk}_6dOF>x3@wQ`ll@YcZ>fIvHQ0ly(b0Xv_IGFg0YSpBxowg)B7{%##K*5V-3!ejlPB*<>VKU!9)38d_o&xXtdipRV<@Z`I6av>fgBk^uG43g|K}U)Kg^&tLM8Mx z{3Vc8H%LCw~5u9)TPk9UV9E z$$1HujWmE`7~vqUhY4@=87VRrfNley(f6M@xuU3(hL?>}zYTEB5@?yVCzvPgV4u^w&7hi>M>wb|No)?9RuHk>gN`&O(d8Y~}C@S*vkNPG^ z)~S~z7KJh7Mg6t$56;joIp|)whB__#uOMgVsge2PlLR99^@L6p-F+8OPjvo`&}*>8 z{TZ3Vq~PB>uuh!@?t_Lqn~?M(2f9!qsH>#MV_EyNdDr^nedAeu;eZnPAN9P?9tFRZ z1odP?j@6deZLw=h4$wcvtL~3(VD~cd|NW)UNbNo3+9f=D{H34Bc~Rt|(qlOO(uY4! z-7U_1{3UkwKVQ1lXm>nSvOw+iJ_OaKAk}~Q_g)nVej1S9*K`q0$!kN+Flq_)P)BO4 zUO$Q$+2Hzzt+6_}PINpixpM=5%dbdsP)mNFUqS-v^K-sq9mP`&p>xgeP*s)+DIp5i zc>eh-#{<+tjHJZrv&5{NrH^uUXw!|NXh{{)$Cd@lGR9u$vwzcADA4Sbk&-m$AW-8@0>P&+j>d+y?d0U-dH??YCjY2lfk<42$fa%8$dt-! z0wcVItybogX+-)(AHv)QbyshV_Bk$hJt8F?n{?ZdQ7;}lN9{qwM?Suf;iY;$+iz!S zqzJ+RdMmE_opF5TQ4s}M>3wQ??M!Ao-#R|szx*OIYBT%>iG5UD!nMjACBagotzk8T zvXYOJ9wSBvZwmV+-8){)c1sIt4tZD>s2-9pCxUe2#;fMMuQ!CP^DM2q2wF!)wnDG# z!SK|t{{6T!GG(myrMW}y-y|uDwrE!_G1PKbst*6 z$HOuM3pJ&Wj}8yI?(P|55bWu#)L%qdITWb5wWxjOtDNohlv3C^lA&@oj3 z#&Qd$Ts&2hSj5ZEHo)be<+l2yA_reZMP)Tq#2(I<;65EdGmYzA*<@yAO^A)+ck9dV z>1)9yb9B|(9ZpW24d%e0YH>OYvq;}j9qU?>bfo{fh@G{w?@4IF>cy-0U(6;*SRhw{ znpca|=SPYPg^ghrZbI%$OYaD8s^H5>NuF)96=18$e&Hi*zC3Rsp!2<^)CeAhuHH@u z7V{z0+}tTGE9=@Y9-Hq=FWdh@T>CM^Ar^CM$Ma~1WwmB6S9=-iyiP$k7%t&n%LQ{N z<^K>J5iHD+`ut_Ipt;gEjJ&~4L)mRz70o4 z3`(QT_R8K0F>Jj$mR*r|^zS!TR?|b{H*^L!Yj36*gq&L}2zZ{r+9yaRKHRAkqb+zi znj7&r@u%`uO_>M9U?g&gYOLDTnR;6L{x$&`&eIjKT#|0bRarIf+?UIh=&W$Ov)%tp zvbg|iO*$z^y|$AYG;-4Biy3j+Kq+JXoO{n&P)GI1H7(6m_K1C<}WjxqjN_=RvJ1ageZhYy8>T z#0dK_eEYTp9M|D_23q@f_c~o0qc|QA{u+huKpU!h_`FruAo_)Y}?aNH6nTpEwwOb$0pofO&)gIS)@}`o<>;`<1G_ zrUTbW7wXR^P!jZ;pr{&Czx*=PmL{`r5rmZ>J(!q_mA2dZ_@e;5s#tkw+ZOV^TTn!5;ekK3;v?o zUmp3DInOiiJXJ1}Qm9b8^*jjqHO2(Kw=wO+QCzp~!jFA7HmAcHcoEzh6l|)Gv%-*| zyS){gu9?%U9;%4qY2=`tYN?e37Ho zfqWsen~AuIKNxDW$K_;dB~O(Znr$pTKd^e}*!$Kwq*NlJ@P@)x2km=|GV`DPweL&X zIF{%zR^c>cm>05-Nrg)EB5KE`oQLQodrR%oa`;>nDElE+vh!+_N z9J!=^+YV)1q&rCjxh(G|P3A#Bv)VB5h{DWnp1nv=b>e8-O)7Le~uCg_gzo};_!0X-(XNT43jW~*+B zFt^e0_j!!voxu-KNvbxkbhpG^-1z9u6!uMvennDi)^-L~RxOgv+o(otz{T?nb15_o zv}VsSP;c<>EXd%$4T-yKV>Z%bsxr#%)6D0J-c9M?Ut8Pp#wFw8%3G`t?~+0@efNRq zY0RAMj};QI=r8tC@!p>dx$bT)-sd$IC3~YHF|nqb(q-mWYDkq}-c0>8Hf=R&uQ#f( z_;0MYf*j{Ph0@93UD{4FeOwfQIniaYo>x|PaF^;_BL9F6nNFKG>Bh4Na!ELxhj_7p z`XMwda#ZR>Hqg-c7ZurxN6n&$y+n&tTWs`f{#cCv=ylY3OZKq`;+4b>9X?1+U-6`; z8N9@t+!2qC*-H7;=3~XPSQ?7+J!^Cjqm*3r(^_nFRNRXPP&(Yz(Q#|ty={JEch}QxM@^zdx|O|^o%xz2boIH3N5SvFNp5+P zfa)cnd4dZHy}gJ0?h21=n9lr40)^%JWFJ<+Uqi(BevRwPYYboW8hW^4!CZ7DWHjCS zQvGyuMsQkE7nr_Y+xlqSEE#cFoF{p-8|$A>E^sjDXUbq|+HX;J&L2Tg93R3WY>n-9 zKL(ykNZd2XO`Uu%Ky}bG5*BLA{wXds~UlC((YQNvB;| zLE%$s82(A>T=rB7m=J(o5AA$0yReVUg8BKE(c8|(^$NVw3U=ra@{n9Fl_*%CLRh%e$TF<`+8dTOEF&nfNP&GNZT+`HBtgM_at7f^bl z0PPE(8HWfy0T}Xpd?i zK->h7kl8_DlKP#Dmcgrc6wGGA;t53VBlJ+?$$;v;RKdo&jl<;oENo;cqqQ2OoJ-@o zU1k0btnf^Q&YlFlh;{pNAAT%3V)7U7YB`H}-7?5`MPk{b$|w9WK@)>l15)-3B(O0E zoDt`T<3rCx&DiARIN{P^T4ZoVty^%XhRIOv;alB0%d;)1S<7b5`RNffTf?l*4$fK= z6o2ku-QmQS@tTDxh3Dha_XSd$O4BluiLOw0lXKq`t+uz@N)xP@xX5gL5I>{QHz7Af z_>r747KO{&VecR&3ukOs}rAH->@1irm~@>5L!5f08`{ zgNfmE3FHHDk4O!Xt<;(%8+A(>jI?&*uc$aAg3&Zm{FcgmRpwQG{v3*l!Mb$S-ER>Z zAVhuNhC0txEQ6qAeJ;HpZ;r#SuCz0-VdvniiVu2&`B;%AK{?1Ok(y zPy&^jCth=-K)RP|N27oG><4_))l%+HJ*LaZU9j8>9-6N;73F;RB4PLa>l=Jn8iJMxa&+cF+*j#_bmlV| zM%nzPksi+XLfwqw4mS=B4s1Q`SIrmV6TYv!dc>HJkONPASU#us@vOWPC%FR+DQ+$P zJT>aed1TKR4OiwK6fXWKkdyR`C!V+GDm_W%;-rPHO{#3$U1aBmjZJN}>7cpiIG47w zIuJ#xe`2C+Ayr0+>?k=eDzyJurTF4H$Nb6;vfzo^T=Sr%8+to)+Z^YX!CxYM;e!## z^czw>c=&L`sI{uFEj}jX>p3#6fz<=X1k#G|uN1_gSsPzm=U6Vaso!yegZy43df;Yh z+^Ag=oojM#!6OqC%+TNTe?5JM+kL*u;eP3cI4jibts*UmLDB*S%dc$kL7*c;@FwAgLVNs2d$h^Rc5XpD<~Nw!l?vq7TYUr zqk{NsEfaF}^UL2{=F4qV1&3ZwmMu*k&6$*)5}CF9JI&+|fp&+5D^tH?Kz~d)*hyfw z@bGIW-EzETcFF{>30|sU{r1aeRYH%}4S>QK8kq6iXXnZ^mjS+p8eN6ih1lFOPxFPy zP6NEZD(nUQ))Pge$S9--ea2*;*O zT#EU2AZ#{oarn6woK|}pU;+pPe@~tymurXcQpL|nS@VOV(d3C2rK8%~%NBxrMX#OP zYo9x*Bf3Qr@scJ+cBj8Fm9S~Si|@9M%onRv_tIZif1|or$%0Bo>J||cZLdyljbyJL z9R@D93yBwx+LWw(UD+;jJt{-*Nc?ye?C|pG6mz)3f*kcE>GCYHQ36>Z;t25}lc;7VN=LHbx$J zP8N*sPREYrk-M*dl25EWP*gH*OPZ5g%0s(%$|sVESRf^G8><$ozm2JxmnoJ~{2B;5 z7hR#TMa42C6{1(w%gzn(VKfRMdO{;3 zH%p_}AA1FY}#)22iVKT zQ%{EO_pj1gNBL+NS#S97K&MKpE-#S;uIEvuK8mpArDoOUoxwa}W>xtKr!`~Y_diywgNlp~X99Io z(gVH@hpgb0sCuB&W~$OkTCCI!q0o(rDjqJi2b>v*7;MuCqbcgATYEPwuX5cd>Aq9t z_8s8nt6`#nm`LGDJu!5(gqjqw>6IASt& zTaP(>PG~R}(YBXx(3;;vMF!Y-`Eheqa%$8x54KxX$VNcF2RgLmpglp6Hcd#Y z$aClITG?fh%QoRU08XMom=B%*?Tv5-2t_ocJq$E58dm8r4q`PA9s;NVtg{F@~9y|~R5wCQv7BQLM{ zaHtC|#~7AzWv3q$qWMSrdu-OSaz5Ba>Z&%^q$X?=n`P|?6E7#85n0lQ_ylga7`|Y@ zjit?E&!fXR8bK8ejW{#&TOgM|*8Ogz67enxmeFiE%#s9;#JF0pq(mtAms|(L5L3P9 zv(lMexjYdsfS5502{KS_Ha>Qf8XnTUF;Jb|s`kfWwx^|pq&D@PPdRwvLmeS2orJB; zOVUp2Z4%;kYW5LVe!ZKR)XcV8jFpr`XQEdVE0Ygyq5`Qv-?RIk=h_Tb9-hy9`}VDL zZ&2qEls=u!GDZ+((;yfuJ2^y3qQVtFITO=8o>609)NYy>$g>ph*yG1bP+5VcpaeCw@ zK5YKISUeF(m=Zxtc;ao$GHJm)dGTY2svsrdwo?(cZf1=M*GKXw?@T1Fa*di!5?`MBaHGCY{+4_Bcl z=I`q~R`&lq#+8a&^ZNnen~e#`5i*!=2r!rB#Tvc%{&(Rbt=~FRfQoi&etI5hobvnf za+y9pd35|IYW)e{E$r~9C{Az@Br|^-apWB<7tIK6KJt*Z9xI7=SJ%kL870Y*C;k+h zsxz%fz1U+VhPv1CU~fom?1^zeqYI-NYOXq z+)@62#Y|9MKM}U)_w}FR+d)X9M&t^V`&a((@he{C#gIr;L{l_pKI#3>V3(iD=YKx& zhvd7*UqJnbK>a@=rVI$Nd3+V5Bd78pg=u8jXzs}p!sh+H2-1J2HN}TU>~8+E^ikV0A&FkFWnWT>kIlZ2vj3{^xg}==~k;{xj(R$I}Y_{X9whjz|8U6KeYZ+k}KX zf#dD__c9$FEIn3O1S(K1zkgtWV%Z3FTGY%etD>SJc>vcRE9T zaNW&jPM)&wREN5E;g!bdqhE!`sLr42v%Ao5}=L!DaLjULCb1V9s zoE-E<2hTNh2=o=kE1XAqV~mCFOqpAA%)ldHex z5{IB}IOeEvV;~_^(Cmjw%_s1#A2=?La^*m+A7VDGP4hkB{b~HyJl0x`KB~Xh(Mzld z$r0SPmT|WOjAu0TXNTK7KKwQ3xHMdlPq_gNJa>CzYEs!e)`QUNO~fZgcb?KEbpQT+ zK`NKe7|Ua2a!`XEZ?Ef`BviNW3naX@xgP52)-7LBQlbR4?W1T0hK2&FS(3_K){|>~ zMCbja7(d=fjZcW+aPjq|ZyCiWIr4IHWT5i3T9MK7d%+}xFZ7j_l-{3c6Q^=lRIsMz zBT)$}H|n?yIR$xBmN;k6y4UP%_Q@^6Si(AtHhy`Sn`iS22yj82_S<7$+7nWjl0cTm^U#)Ua4w;Yl zyuZSy&#|aU=CCLh?En`M4B8_SgNV3Z+%Y*_2&Zc{NlwW z%dt|KzI3^mRs)<}UhRVgm92q14V{|o*jE*uEjl6^P-xHKGb#<-0#HRHQWEb7*TuMVatYor1fgBS|7}=p%L+RKsrTI_7%~vTQUwPqVQc{k#6~U~qB!^PQVx=3G9|WCDWv*-pRb=GM=hDNNs9D+*7i>xWXmM`n-DgdRHzp>w}Y&8&-lstnfr`U@O{Byyo9OB`q+>T0N+1%_pC!W^OgKf;`*cBqorctNlnWROlafAIwRb>8R!mf9ya0Cgz(Rr9!%W3`y#gI* zR{xUIG@_4nE|;DNr!4wiy}NX#6LejP*3gv_JH9v#ni>sG(BHj}3sr=DFy)M&(myDt zXJu{P-CCr0QU{Wa5>Zl$Zg?3V9UU#7si<1x#&?;F?18H4X%uw$!bE*{;4i@8;DRc*Ju`}BAj=*J7B1^fj4 zM7{g_6&010MY9JW6#?@CovfIG!uk8xFZ7$0X!1CH0A2b$y{DWjkEUk_04P@z#TN++chn2r546ZFwoHjB+(HbUw&Lz2}BC_QhIbTuNp&7 z_$Qm24wWlk(bbgTDe>CP1~&YFUxSIs$jr2@)U4K8Wxt-0$EsCz8n*Ga6Ur)PetCIo z*Q2kucMZCOQ40xCf)^tj1AD<+EyrIftsW#TZW0Uk7FB1du=9#W-q_tgQ$~b?dyByU z7wd$bot?bA{AXLcH&IbUm5ld;nw}7AxnQW}Tsm{+3|<=*uMG;t?!N0#xoFvv#2MR> zk(FhavAgLw-U)LPz#(QyA>>8^&pMO4+ZXNYdopyn8okBnhBdI3WHX zKYpy6ZV2FjGPji+xBXVeL}?9*PkKQe|8tHP{@OH8o_N#!x}T}|QFen;2SNdC2CD0T@Mu$ zy8HWmB_prjPU#8M{OWTzy-%{j9XhhJ#t>2ljr;Cxb5@~{34Fl0u)5kZb-2w#1M*YB zFpIq+el-H_A?fsERuWZ%oq*$q3Eh7`c6K@m*oNMOs=q*NV4#-9%J9KjqOh({x57-m zwZ8XK0Kx~cTTkA)|C0SmzsyxC8{zZeiX2H+sJnPM%8Pap)R|xr&pp34 zQ~Igr73gtHl9vwjf`SyW+?G$2vzwsDJiGZIb832eN=*$VyoiJ5arGv@k|vturIjbH zrImooa@hvrekhUKx4kXKXs#x&>6NH0U!P9FxD<2>%jZge$7z0DdNOCsfoxxTl8VYo zcP;0x1VL4BZ$NbzS`hwvvKJm`V85&;;Pu1$5WB7}lIDC3k+GrSuabBWQBF?IH-&}g zvsLo^oAknqwIDE5ti}TWp#2dA<3(s(k?*pu*LpD+_VK*1_H|VSdZOSv;5|7KW3-mztWIC`0{Tym;Z|J8M+Lr!%IMJ#fcNIKqBw zYYXIs{ndS~93HcN`t=`Ban_K9oqE+4COmFi=w^-ks%Kivvb&L6rA@qh%(nT^DB*<@ zV`5RKQJsmx_#z39YK%Kx)5!&>S1UHn+CUo3%Xcw)}u@q`E9dWC>gi1Y+;QinW!>fPMhQ3R@^8E9+A> zl|lVpX_+9>qexy=H83uYytu5aZPz7EQckX=*t8FHtk07tnD4Zz)wZ=RfsjI9js{Sh zYXEI_s}2$pD1%8jL%JOx9a_*jClsXm`xYAL9Tc>_^04e0D`3!ke#MMCRxnpxMJ0f(=4XBO-icHhHG{?3 z*2pi!XkEXS1vBwkP@DKObR4ZPY)tnKE#v}8djSY3S9hvX=n0C6QY|!i zsy#;Nt9OI`YO+piS69rkePiqnTD{VF6|9Th`4NU0~cri8^t|6FQoH$*o+e2U|c$OdL>CBLof*#}}U}iSf`a|A%TsG66ztZS8qaBMbIP}d3nUHP8fAFp~95w-gE?y_tp<~rm)!w zWXF`#t%mb4;2ViQ%Lt^(%F6TyvXtmqSej1Y-y+!DJ|DhM;u0Yaa2r4xYo+&|)Umy# zWV+vObQ5qy@V%7byYguYSJ>F(wmF6{=V24wu4ME1;8kBQ3gSHC(T!Qx6h!<$U43!G zC7I}!Xv}SOboFHR+L&3%7bqU@P(Jxc<<8jNhT#u3?UB+4Im%;7cd_^Q-XvY4qr-;T zSRBfWDKY+#t6BL*IeP-H5~TSFJZPd&z$?g)8TAH8nL+UM-Za_kZvs7(^?tr9bnbCaZpl+O;nR zYJ1h(#Wt`XmGr8AqB+xp!Y%{=kvm;D~3+|&Ir+dBN-KArd8 zSLn;`-`L1MT|tGt$}|R~FKi0}5JBj$W?*cL7(3{!(*gvYDCOw+a8H;{bwGE1etsBa zxZp3NB> zdJYm?t!19+0DImd%NelOw^*s3cVYPXgNg0(JhUH~JlkP(laYz3X=mgENY7xd=2;X8 zx5djLeOt90Wl+Y!s229^j(#lx!>H}3?2KZ zQ2FpD;C@h2;_fQ*62qYhpu=0s41O; zTu|nu!`6ZlYKGRH|w>(+fg~vAX5eC)Y619K z?3CRMKh%7_w6(Jnq_4xORxI(t2KoS!gLfCnLO)jPDO_qj6_TES{*=9D4tqo|dM-xW zgLJ^#m}W^l6QnoaY=9Bg0gMW+bOf_ojPqRG`{D zJZz%!N>y7M-%s=kgDOEycg1Dn_CaVh+4zWuO{?m=O=X-gBgRls2R`%)9Nar|JxQu5 zCO4#>IR{)Fz^d!zZdzJeVn_7kX1=zofW;DASNK{d&im=#R-KBMcU&(O)S8GVIMZw| zGRvg<@ddz{5lw4=(fav_hZ-31mxoHnz^up^t;f!5+Dns8*HpFqgx;-&i3sOW_95(t zT&?Pbb(-`Z6QZ%Dg)N5Qpb9{GBLUye@K8`tplad+Pm}ztDbjDjL)H~kwU+fwZtg+W zHxAnr9k0OGhV_}4aX$6@o)175$UbbIIYdm9m6es)_Kzz=vWY@0S_wSX3Cv^T`MN$9 zN{^wzG4T{zb-Xh*D=Qu#bb2RJOCbLFu_~TebhA&1Gvq#gO7^ za3Chl_3LCJ40?K~Hxwj9F8tDBrr$>k^sy1o=rBGkjDSm@$G=dZ6woUdbFnIOMsBXZ zXi^yG^{kuF2djLeQ$UwHR+sa#CM)zx@&+k&G7e=2gR4iCA{GcmuXh^Hbc<}|BHfzEfW{o?`X?-ma@zl3( zpDlt{fq{Zt12;;2%lugDnny2|Pb2U`O$`U!=KX!QblqII3rT<_{RMw&Oe|U1JkZPF zQc6fjoZiLX0%tR?h7JIkWEc6w*Eo+s<`&J^OU>GudgwP^@pA!VVYx4uZFq%rALZI z`CkWDhR^<+*go+mP|f@rkYN7RDLyNUvFyaoUJ9rUXl)X2F=lRV-T;~^JTYIX&PG!?GAJ?^(W4zqEnMxBDvPpYR|# zFHdgi$1;QbIBaC-w*$S^{k9f|1ROZ<#I{mf4bE4ZLN~<;A=2x1sjO{N3yYKN-O&OXo{Annrvtti%4v(HZ1KJM_*R}C!Bv1S5gnzdsPm=q zDKIflS`D740)=6oo;)V2rhPtJUt*`fAAn?XJqC*W5OL=02G9Uya`evQ?UNMW8QkzS}Q5$wd~8asmJ+ z0IfE8@!qXf!#?ZEC97eY47ngZy$X2e5?c(^YT|#I)Hjc!roU<8x!EI*!eX2`AZ@Vy z6vf~&7w}{I*s17%qgKiHyQH(S^a3P#@G|62&?A89J$k zB_vo4RcnCb1#SgU$F{1IW+l*s{XBF`w<^mXTBK+`86C@h^4YTa_(ky2C)lrVYH{q8&X?jlqj0Q;2Bzm3HlEj>K+Kr|T2 z3!BoVF3*ydj!xWBhpKb0M_a!+n2;?|z&S)IL5$Gfn~t!DKu4fQRYfJHCBJI~ZO6dE zak`BX7ASp>e^e19V)@joaHw0)5CgpGdNdadrem$T0Ve|!ydRz#G zz%aBrdTQAALK3~=%U+m~@iA{M6*wj^6S7lnXjfN2=i><^1hOXw`ujhkmlVFgx_`ak zll64HA7$l@vsXsIf2Z|a*_#=EZ~x^hYdZ5#XLtml;efmUwhL%@YVe+DaLtn z`0x$1&2reIefW~TsSp2wb~%oK<@^>Jw#J+6?6$A?KS9o(#;k&iEV)DReGWK?Gfc|w z!iwLmkznIjBZ{0O7{~)wx~pU5wkfK7&_wZy>3xNW&QkOsg6^cpoB1O$XfuvKfTx(fKSy7RMArNNv>D-!8Usz6Nv_Aw!togaZUY1JB@8?XIH4A z|0o-XZ%)p@E^%XHV-XLUvloN`lZo}a3P0Ba&^z2}Zi%Uu#ljEgVR+6Fi z@koKLVUm42`z#7)8ee!n%-cBXF$C{XxQeIHIN`oCgkguTR`bAR42qeVnenkp45uI8 zNvX9E&P#qwuAFSrR2La&5=hYO+_$*J%Jho)QV>b`sjG?vm~W14v?i`O^QE(sE;HvU zS6;HPu&|D;4XRr|jj29Ehq*-#&TeHs;3`b}xlYH7ap=7JQu7qZS@wi`YHI46w{P!_ zD?fhBmzABpypo-h(~&Ds+h4FH!Jnouf5QT+=A6kaW$gR^LN4Ckfw0K8?i$d1VA9fs z`TcNOPo2H=@w^j`Qnx}GUGZL00Ob$Wr@SvMdCLsjE?I!91vVCI%*?_VjER@GWC$LW z(2^bLG*@(F{6Kg2=f0OSe;9xkt3skj z7IY`n%59QbzFPVe>O9{uaZMc3_H>tDx!EgL@39$U*_5>`PbEe~O5$>!@El>O{v;_b zR{E7D2pcxGdGqeAn7wNST8yLof@l{cvGSfHXSozKQJy$?y5F8!(HGN(?}NCgC?*gT zr*f3fmZ+Vp`=#IB(Q)^f22C0;3y+Mvrpyh{w36x&2)&4Yp&wfL0jJqXaOs(u9r&%% zb%3V%QZQ}y<)qwnipIpc?;Be%4U{n#MaAoE?P#q@aIt7;X`f!vu(HZ+vHA{dMQ^G= zIPc8fVqR?sbeDG7io>~`TX{jssEAZVM;86-)5NSe(PQ5%5gnZ;%yJej^?1tiMr2mM zZt6bZ4DvmoPlxn47cM+5LO-qh8Dt`2Vjno1mQ>dZEk%s8tE)Au$OCccjFn7FEtpPf zJilp7CShc3?CN;rjmGn}z3A>0jEfeQw*Xp z1y>ca2l)4gOO^*8J$OJE#_fVbkft~=f)z2ToPBD64@)rP$>BG@UMSpsKMaIG(=I^ zV>=M=T7ceK$j@-N;O`F3P1t4}Fqjx9h@!jK$Q6wMeYeQ|C{m#Q{6R7fDi&Knn#WlW)8ZI#>Mtz31yte@v!`Z%O>y|G84sFd zi8|J0F|j)zfz@ad$pej;JDQ)JEnUT&7MsO3n;}t5QQI4{d}@ym60H%u7y|a~%i46q zmsysCcIdzik%cei!J@<9R1c>~8P(4U9I95MxvtA41cSSkx7`IQx~bI{nw=s=4+3T? zii?Rruth~hpQx^rN&(P7c>$Lpt#$~`7Ha=&x6|_IsS-7o#~B!aPVlG*Ep_QWPj#cf z_+hZK=VlglZ-UhdKS))%ch6rABPZKdh2h5XR4o-mjld~*$*zm(Wi4#p*4DTl+Onp0yZ|){JM0@ zle>Jd<#-*w696YJ*eS6p>ER*dz#l(Rt^#nqP%*q0mGp@RKvdrHX{GmOm>B)}-ZYob-q?+c2xs!{ z9W!97cbb)#;QaX)*CuEgKXQ)09eL35(Y^McPN?P5p%Lr^+4B#s;@nE<`IxIuLvT+(rhP`Lsd@qHc0-)FNbF-B`C-2ehHedugbN-elDZ-y2%L%bJ**?$G_ zC<#)ztzl@nZz)ygYnwT5H#gq{#SRaao@B4CJ{CrKzTQa~H(_%g&JLkwsTv;dtV{?g znM>sarmsPFdM|j&*||A^@fWXNF{~`s?tf*|a|9OjBeYsSnVvK|C_fnr32rzL!}=)g zNfO+cFDXmj__4uD5Mkc96 z$HPMmthtGWg&0D1o9gca!$x%JQZmE<48v|&46}oKLI~s4jb{43f%=mR;A%%l5_j&b z9(U}C8~z&rgu`CF0uZB|JuvMaeYFd`E8FS%Q@{sL&M()qpDo?p+k@SXr$cRm1AQE% zV_2IIiXS(QgpA8fQGQjJ{O%X9X6#s8pZC`ZAGqkpI6X4~g8+|4NJVs=hDK*=VF1x< zPEOllxwn$)iq0`Y&dwV}#$`t9dPfUd-DIM=BSyvdi9TQ+C#*!T0F>Q1Lz2>CGL)m3 zrf?gebzx!e-1^$b2h!4KA;xQwcm>jfzYJ#|92^u{*xOvx$^e~rCrv>Y?xdANSH+zg zQftb@#)c2h-xo1~1R$PL09SzT#~Sk>Q<2yH8!lLJaH_b)mRc3G&$RRcBSLOvZfbf) z!g;%~Q7kcJI*D9D94ZHPrGV}QmgPD^rnBnrO;Y)LQ!lsC)gha2e9kjTvbl$A z99}_n0J>KDDFTh|44=RH1;h%J{SlK(24c5 z&j(aW&v*F;)XY3T6K^WS6h()HdBLUuDlny>pl7k=4vmtO)HBszH00*>N0aw)&Rdjf zI;KOe!cgg~2cB>48Y#i(%@+oE{UM0@W(BYkcQL9Wo?hwvp6_z z723MNN(|gqL}dc_e_ckAoCa`892C2PzqQ|Ojk7|iCF>gBN8E5{{g8-qQ9q&=@!FP zKteDAUGU7curGjiBTv;vVzGC?1%UIoJ^&|eja0@~Y+z%8EqQtC@eMC;seSEIpW~4wLJ*G_-w8YU_oSNc@g9q6$m1> z$Mu1X%yU(DB~48hrwiAnic3pH(-c~@SO87aR`0}i7_HO9vhzhtrHN{3Q5to|k#a`| zz>24_zzK)3!Wj&>ynj{ZAzFDxwNWDJ<=LCaKL^d>#$<#SnCS^oXTxkdULpq()0 zJMnPcrjnD=^YZXvhf@0F4iBqVe!8uD$wmaN^hV?27Umf15=7J;UpkJHO-xL%Uw-Zs zxi1zWF&TPTC^+8?rZzmlo9-?-xVPY*gC0z*?}Qkj-iIfr@GeqAgi0#yJh&1he0DSt zqgaR3qY=mS!fIi;9hUJG=@JbHE+Uo{Zd=>pdCjib30D#XN9zSYg9JTfS3HaPdiu$% z8=mh|GcWIaJDV6MAZ|iJ@NAhyfgm4Pale<5dIGCrax`S<6~xeF%N5ntgG~G0t_#+S z9~0<>vNsH+T~>*OoIic~L|!in93<8-%(L!Dwc5}2oUE)L^QsW-#QwY|Pg<(KSOJq3 zhydMoUe;y>TKIqheOTW;!^BM^^ zB#b>L;~A~qd1&x7D9B!&kk{pr&Sx&hxN?{M^%mM%=V9e9t-6rg^yMo&!>ym6eT1yD z!RsMr)d)*@bcL`Ld}1VCg@FRvn7k#L9+P7&H4u(FA)!(bx5SD9pq8&OFtqAB^CT^# z0JvFRdhZ<(7Dlc7s!P&t)Z8m=g@C_lrfgiL^aZN^AI!IN}yg=3F>!*u(Wz(it-vG!>2IT{3 zCm_0bt8=iT5P2#aw+phkou0iiQq$hc>KmUR6abhNh1!{P&C{ed0uVb?-}v-Gb&Y48 z`)5K&P9TF(+6P zhsT&AyqCbGl&dzMy^cFixZo7F@3cC3PKR0tNum2V3P~10cY`kJg2UK7@8BV$0R%he zY*t)@q44hF*BEUqufUv6+RIY^CYLDr= zlUPq;0PG>V9~20Ad7^>Jg9o}i+XlSObH(Qb-OkCzg)j2SGe#pBFKQo5r9tgC_@5iD zdR#=pyt%m<=$&TiJPs?Cenk~B2rgf~+(;z{gu|1zPuzB$dIh|`0$`cs>4_kRWv$!; zqL`>XTSLu9kh#dq7i?*mB(l;)qN2n(*&c?6domrE`xitRY}z#%abn$%hF80W>qLp` zBkAP$$Bp)O^Cx1!BERIeybL5OjS>y(qe2?S?9(il&N?j(PY>{mn%sK1whvqLoyPkc zsY%A=et9&BKrGrCZ2}kDs^sT=12Q&1A7i6zmWDYJF}vVRz+wB}cxuBdAL}xWZ>Qv0 z2+w@oUy&5UIDaAX+#4be4pcWDF3zoZ+GMfmWXQX;)0w|7BXbUxYu2n4p5v+Jy6FF6 z>?@$EYP)qeA`%LSiXaLof`CDHs(?s|pn!Bqx1=-%B_SXsB_T*lcS%Wi$fi-rO?Te8 z(C@qdIpd6T?;7e**?XKNu+vh-lS%GV(IKU2sn4%q)8qht^=lS8N zoGa@xDNvD)WE1Nay~BaTNRc@5b`gt_8pm?c&;a0G5KRM?lLpQ#C}_|U;($hsNSq9n zeB0eEABPSJ5BCCb6U}emK8pzy+>9tzLk#cGTtuDEb5P*vwgaF!4vfos+W~d@*`!p= z@}<$?8zywmFS>AcE8+!z@^a$f^Fjw!LlE>#eiCuV^ zithk}&h9_GL98_){tWCXpkO`wB@rw!8wUOet^L?~esmeS0z)%rx-&OtoSjbo`rrx* zo74a%OjX+m95F8p^jm*vtCI-p`*TSy=({NwQrL!s`n}&3-tGxL**Gg84Vcr9{&fea zT-N2{;^O{-XZOJGqXI6Jazlh|k^d!j{qHZRUpFoUh=MHzVOAh$Ud%q-V3qasrq}vo z)XypiYnQJ!-$I@GMyFXu%&d}+2L#?)Sd8Z;Xv7=!vA0_s_Cb!>{NixQd6Xr<&Q1NX zmKOp3Qw1$p7c1xl>sFuB?L$Lemj6T)6b#s&8n|JF^VqA3o;Xs#_5frFh`C@(&yb@y{&i5?R~}N(SMLpnL#k zhcT(oSqCOVP_`sfbW`D9_b~vt$Jbd|yQWS)fJnn&g%dXt_5u@7eUs~LA^_r}+rSZ) zQ&aN;s~xdM)6+C)2$+E%M}z0_3ykOk72$J@?@3Cb-KulMu?t2v8=5LA`l{wyBzIp( z4eisLVd3FZ^<-+%?9#5W#erYL(sE6c5nev*ym5Z+4Van3IZvw(DQnMa`Q+=Em>9d-GQ4{mhX;FDsLNcYmAvyL^=Z7LUtp=%<~jHZO>*odQ=_JD`Mlc~LpyJxC-;k&U}(a2@wl zLuNFOmCnP)*fYtnYU~E>HjWi6slnqbjnv}K&H}4zYu6ov>1bZmRfo`g1AJ3t;(=pkH0tI)8E zCg*-g(lO3Z3sbrO;K3<(4^~y@NQW-~>VxM5mLQ4!jZRZ8Y!nc@yjAZbt4TXDTH(}% zM!%zvb7q?f*#!SB*Fb9`jTK^zES-~;26`zmkAfJgwZ7>MlK@B)HJdscn(d?G1AcY1To z`(j@{;zkw+4u==uwO-V&-owyEVu0+XsLYKJCDMdH!N;xL!=Jsw!)M0Pjev@Yie6Zx z0^j^GR7_-XTsH(L_v>C>;4yV*0eEHn?sn*TorN&+hxc2|&dViO<^Z`KXf3|#J z5JO>mq&$6)$oiA|3kVNb8Sv6!0K`VB$J|UB8QA9URXrg`aL4beb{^BC1`S0^2ifbn z7Qu1}U)g{M2yzst&Mot{=g*x3M+K^QoJjAxX%qty283ELzjqGcTKG`h0IoYiOhql% zK`+Jv%HxxT8~~bzH5$+I3TL38Z|JV1r#HcB|!dxE#Rl3EQby%z$-%uD1NlF zv!j8?5L(|Carpa;Atk+b?$O_S(fA+>2n^bL;QoP~a^}?Qf%*R4UafjxQuBd=XSYH3 zv%@Km8D)CvQVCI3rXq;5<^Y}xxV%H(0}n71eMxUYSnF3$#Ajr6kxPUWTh^BcOk}{J zA7FM*lApLUk+@8BtXk-^K~425UZHizD-$Xbu)G`R>4@L4dS zK#u^x3f?R}Xbx|G|F;l80Whm^Z)t80+CnDEX=*Z?CxXF*qBW~UIG|wPPv$gI=?+T# znT6=j*GrzISfZ8i1W?Ae033(8SIq4K#o~Qb)H|3EKs|dlM=wlk6;)L)gAwO16UD_# z$^YRWn(l(&_Wb!D-abtY1tyqpq6-;d_lEs(LF*bDoz!P9Jp$_+oMlfKt!K>N=ZeZ7 z6UYyKyP;m+JhnxG?tYekTZ-@Mv%Y!$&znv1_Vgb``}dzfm`&0OxBF*XX?!Wp2>hjX zdwVk&vnH4sYp=Snz*E&I<;{{O$!U@tO)`uA%zacX7#0TB@%M^*oMYnpE4 z=wlleRkRB&+XQ=``*)~f1ZCAd$~2NSq-!H?wVN2ic=J);Y!7rMvcD zqV8TemtDSo?(oIj(=So1KlinUc`_VVn;vt&HhicBK=JYQh?V@b|6N>NH(px;i|JoD zrh7k!%NrUVb9)$m|1TdRJf$ltdgz01i~Y}Xd3*o-M(`gC_K^5+SCmUfC)Wz2vd4Ws zH}Bj3U0Rx_($ZY+-N43W`SJ~!?mycrdVz7_mOu<`!oU9kB3pgvzin57w{?69*`CJU zlP^*C{(Mr~J1_q{iCi7;;BbJI{RqjNKCBH%PrpOX_7YOSZ6 z#c18|`LNyP8^ez2NoI`PX6KkM_h)UC-Z{*Y6`gp8=m@b3^Yua;7CnJ+mV0BXLZj#nF4XuT z-P)(-NFQ`#N>hJjB4teHh3x9(C>?bs>m7OF05`+xi7n!IYfW5~)?Bpo^VV`QdzmMt z>I0El0!$Q+ih6>RR*`$*t+i%j)bCcF(9;MpcBNy=6VQxKPN#YGzG>x&8leo z&AaZQ?(ufeX36C!(cA)BDqvMA9)KjJ(SNF5hUg8bLFLRyF2irIHd}Hh%m}ohEC{dX9bHXwTeF zvQoi0b7yMxvnz+`7c13~m%DH9p>(Fz-ZsZDJO6nGr*q-V8&m8(mljfg`1Gr{J=;mQ zeeCx^k@c)!qnJp~thnPZxou7z=lLp^K8Jl#zr1MPOzp7#MR=%I z<F z)~Yyeg1epub|0DE;O@c$Qy07Iio!?vjglQ&f=m>prr7m06A6~XSx4$P#w{B6U7Do4 zWhHG?lo!nTUlcTM?(z~J;c=g#_Vgs=oZ;QL6x=ZKd(Gt>3H~!2@)!+MGt#Y8{YlZE z2KqEY{VV*>oK0`%%0G#hmi%^$kCFmm5t|BGqB?}PwH~9TMS}u8=m{Cy_z%5Fe6CY| zYp-#QK4NKYc(UDU)1VicVy09R`y_5cDez*`kYa+?`zfBv&YpL>!Qr16H70W3ZPm)& zu3u|$^XbK(6~etPpT@scu}Lo-Ayoeh;~Qk9qe{e8ROZ5r*FQxQJn0qqGXYNP`kf`O zw#Nj@C3#jGtEAEUz2B$ey!RV!R?j3sL(h!wF&`tmQ>I&2ird?`hu!yErCFCvxgwX{ zgpZ=*xkz5p-RLE}N)XmVFYRD4fZm?CUP2X4348Qgc=vpSe+sQxl<+zO#kS)WYEyGu zlyrq#X^S4Re^$*lUoSc(b07JNdz`yg5N_55}rfn}ZwVOyQgmCL+?H+F4M(Ajv?203cam^XK9G&9Sfou$dg#$N(Bk@6?k ztVqQ80(7NB4__$a%w)9W-H9i7+-b@-(bFMJY{=ilpM08Z;YQSI;Rz+%Jxr%`w0Cp# zmD`b%rMSc-UH@8I6&-#SWLeNe9FehIpQd{aW`+kmKu9?iP|;tdd9eiVA<7c%ul7Dz zhzLci^a#y2WJNx;WG5(9aJ6buqE$0FEWZs#YyDF7D-~H#QF6OgbUwo%k0&QdlfQy{ zSCh>InhHfcY~?jDKjvIZ=-}9XrIk{6G`>6B`}_GaR)H#s`)HBwa|x(9-abN9F=kI! zWcXad49y$oq5#S%s~@W8a4WyWE-lt1wVugdOnKQzy)ww2F37~q^15K}?##N62f;ae zZGGh7Prq3?O$&w~IXb?lz`ugL)xI+og&xyyx)Kq5 zoWhsKh=dUT{`kwOHtx5@bfR6qKr*4Kx3a3*r*iKPSXy}bzE>Gx>?`AsvOEfYXrAWbqR-hgj{LKdYXQRd zcia{?E3LSYXU(3!(HmCrMy{#I@k$mAdEmS6A#hZz@~2qR;#{e&pA*;lmEHgH$`h_m zjM3;yuDeF%V3b}n!UZ`P{} z36h=hb^P-WXahb7{D@#LoFZ)3Om2wwa-$XR@qRvSYTCNf((AD8^VzlH)K61l60tzw z;Y@C?Onp^>cqcIJ$eR@;{sme986H4YCjz1zDL#;`qb#k_f0%x-ccLbIUge#B z8+m4NvBAP^Pj$cJXkQjjrhdgfu>po#ka7ta{0$xSL%KLoP`?AxbGLUbl-xR z@Rp7@jX%amR`N}<1J0b3#y8AV4^JWUTRNE)0#J7~HAO=~q5S;4Z6tL5r!l7OqA&Kw zUlW;*ma{_MQY4^K&JewMWU&X7n`Q8vaZAK5$e2^J-Y+-ZS(Q>;J|{O0DVf*|_0>M* zc3O|ecgC}2pI-+)C`gtiaLJr3RmCsxY%xcAZP`^2&evDIw?=KSzu%T#y0!*jNLe{%cRsrjDEwA4o$>C4+O8@TA7!vB_`tXdjem9_^1}yO4KDR! z_xx>#?4p(WzI2Dh5&IxsyW2PD=y*+ajdc=6zT%CVqwV-bFQ_l*H22ih5jc zHQo!%t|YRO@=kcioqb395@Vk9<->heM64fCOnW}=d%2uxmr{f~XGJ1G3VWMs&4z{A z4cihKrf_=QxJjGv-3E|rwKBW5iCq9>uK`q0wO!A=oELX+dmKZqhV!sXcmIpr6-qhaRPjM3qyCuGr>vvM}$Jj1T@ZQSp| zJJd^m_7w^X0=8-A&A`X9oOJCT9!3No znbhw~OP|rv(OCvDd$ww)%>sGzhXS;oVx7o1c_#G8sY7t`7a4lUGG22Rzg+OtYo6hn z-a66YnCOMCt(5rqlfMSk7Mzq!1G$ga8T<*6S31wHB)2!!ffA-wYI5#%Jo_X!8K+oJ zG{|gQCMTjw`cCSJ%)A3^P&;<$4RqYxBdt$5Jqq5u+pZ`rP?jl0EeFNk&aC^%&u+U; z%Av5eE2F^{e4a`{sv#wM;Uym*U!4_SoZI0`fDgE7F?bJ1uU1P|KaRAV&zwBOEMUaC zE?Yb#h~5Hnl93tdkw%t$$#CUkTeK;gcHq4s{BJedb8l2FLi54ACqm5o{paK zXTbtPef<{l@YUXL18fxE*k1K7HgSHUsSh;_O!Lk3rNpdGP0n#>Hn&KX?p=7>u-wrh z6fcCBXf$0kd8w-JMld^bHBHnWxLx#eT4}8LZAUbH_kssdHK63nn?`E4D@eq93)IQ` zLi$bxchoH`k=fKAdG(KT^NPsUj>e8^!LAcJ*tag5IKi~OH8r(pE>K~gtv;9<$wQ)? zn#xpUaoIC0zYsZ3D^~VJwN^HT*&VZ+1JL7sOP4lbc}>0J-B~fO?Ih8kN&-G$+ntU3 zF!Q2872F=gY&Uex5%_+G)>pbPI}^;jhZOcvBbfeoE{3Bk;)cFT#ezPT;Evc?jCzc5 z4eSkv!7{wlPQH~Q8v#afgRaw0M>WyIVi#u$FnOT2N!^N6h5z6`Tma%go-1CJEUquE zlyNUr=kec!%t>$^+R*vMZgPfc-@L!u1K{_p%GKpd)U|VIs3@5mIRwikIHy@|FtuYG z<>@KDf4epI4%O+l8zIFV0;v&#XuXGzM1%ZEV>yx#U*u?Kvd6)7hdJKF`0d7I(Fh~r zSIC**77CS-5N9jjEODCqC3Vor>9QwgGG^j7`SaWbt9`+MrN|h3koWs@T{Psvyi6L1 z>w}p0i>mMaK^d7Bb?uDef*ZG-ZsOo9Ph-A!_-y8*3T5fgX7uiv(qu(M4eY&7 zqx210#KxzgVLYLZgZK3u%ZEu_-5ll2hMQ5w8nQR7UkG@{yb_b7bKRPvmKxoJm(o5@~kXl5|TkVTrf3)8xS;9D8MzPpFy76>PU*}-yCasx)LjUzg*<%$i zy+)E4vuEsf#|#rtL2Eqi%`yIPI<~)Td?NocT=kra%2g+|#n-q7mdSAN@syHn%J}Ar z(Zeh36fsLK?pYrb!Q8}x2&pUBZOiEcTuur>vmH}3FASFFvmGYfP?pXWBdj|>fzKlr zp7`pQjwxn;6uD^mq9z%{)j9#u)9H}T-KUm#_~PM@amRTG&pzrJV)Bd@9h4N#L}LAup&UOJAK;C zU680Mnx2O#h|kT-va+>fa$i&g?36qZjlb~}i|gSTJ`azZ)g@DnQk8+Q1CxMkAMN~( z3J!|{hli70pXF+ZoU>_0afc#~)}B2*{ky&S9h7ODHw`v|J`pg+ms;0et|GR50yqmp z-Jk7!@69mxUvZ`T%{HyxV6R=l1&hdA^v@bS6uoc~CuVPx{DWW8(D+{1R3EC65yko> zIFotp&vO&pDS#LpF)&Czr+<*UmYa`_Alru!O?A|oZ_LXatmFC_w7c{Fb5IS5D z&x&xHx{?J8(dF%7fZ%H;-cdnU09F$FP>DU_JaSfyq0*I+VwopE?MxcrQwir~jsAu4 znzA+W$Q)aPwg_toRPzt#Sa@FGq~bUb;r)@`)~ zR`SQ)Lv!neU{$o;IPdOpuwUnQiTpenS?g~SxeGa`kCD|sqpbP%`1Y>a%#t`FR%;6A zzquZYXv8YjaFGPL{{zf1{3Q1kqc_+q_}{P=_TC#b*{q0vaE#u?%?Q_)GM=3W@$op5|;d>M{aUb5Iw-TGthxA1N~ zuYP>nv2S)`^4Ijm+waRY5T#@NqOK}R=-_F;9f{mJ5YZ@dAH}iMEKdi55e{jVDbkHD zr*o~)TaA;YU`L1dGrt%5#T1C%)~v<1DRgsxa_agq>bLCj%VC&P#%F@NW+qJp7nFK2Rgc=<2n^ej-|bsblvt;JRVOAa35u1w_>V#<8+|UJAg# z{AytanoH3_+UEk@EKYQQvrEU!znHbO*UeG3XFT}$HP{(tYQMo{Wm;dK1f_zA>BpP2 zh|_40%s%)e?>yWrXH{wb6Z!0+lsyYI8KDeJ_nTu5asBBdY}D5Y|1mUWcwwVittSQ8 zJiM0DP9>BjL)QUbg!bh}exPs1$5k;99r(_CramEj_8ZR1Dz^Rb#Ktb7Y+_^C#oKR? z$mRR`G@W|v8$pgT#65)*+kQ?i!SFxuL!ywFGgXWiivndu?)?ZEykyUgz`9IFIwd`l zUlS?4Vh(4X`uWuYx{;I=Sle&FJ-PF%st&ZT@~nh*OSo@V4KkyBJ>!+1_paJjZh4^R z+D{8sY%jQV@SJ3+weS_&{ZRH5rulW_hd%-&X1E?21u7)eII3~j{5a+Nx>jtWSpBGs z0D%wwnsw`4?K(*pa~hgqD-!E8XlAH=Nd*pd*fv4?P}Go;RKA8v`beG78?HXE?gMVA*8bSGQO1C=ix*#e8yF;tPTI6)Y@)H$NVt5v; z7Vg%6=V^6Yr$?PSL6Km&;cK3}2Fs96P78qzQ0|q#4$c<+R0XgwXWK{IYW0ckm#F)q8ho~M7mSUKk<{*J zK_{*xGi`>86^Pbv;U2LR!Gp-F2nqe2glki9NMO+mw-dW!K&R^*CJKA}aA=<3IzTT; zr43%V-}Ty}z-dG=;qh|8{rMJVrfWuOxviO2Heml;6khp)9vE{f8*SKGq$)y_q)ma5 zJ7HG>AT15!o2gB3>AZ^RHh;rH?ql|GI!*&8yQ#HR6nrB{`1HS{S~$K{btHKEqSV77 zke!bBBBUtn&|(C80UN{5-kwW4noWH*;$sLKyJdXJz{GC53nkBx)!@|beTM7O`l1&y znGOz4s|nv;*3?n8=hT(#=Ll?hNx=4*0Ps{_n=6|h3~UDgiZlRO#S7S4lgw^Ar(O5Z zV>-ZGDz=%Ge~hkqEKLPua`@F4NG%SPM-Cy8$+Hyn?zMV}cZLrU{Frac_U@DNZ|NIq zGQ+C?m25d~s?w~EbOqFsyA{nVr{Ms;o-qBiD9LQJ>Ur!Hnd<~;sn%B-1BnVj8ZEQG zXCUySzjgPoO+}{12uJ^s`<_lx@_<3m-+IgBj!f_bDS3MPcGs3o%~O5xLa5?0m%wx3<-ObZl!o(#Lsa$5lwg&zuZZ z4z0OH?mvOrKaSGjCU-QpiX~6K;}gg-vYQ!cA+y_wb{9_16iQh+kJcP0OwZ*u>k>() z#w-^%wABp}zX>2yrjt0IGSazdRq3Gao(?6z2V`QNThgOmL9L}Xl?R)uUVEloQSeLX zVEu{9<_`n5sJ2tKxb`x@Z-VsT0Vu1bpsIRHg3s-+9O|}YL$V_fO`bu1s3Nf5^zwc< zcRx{i`XM*dUl_PJmL8YNQO-~(7KS|j!)@H1Y2f3>;29gQ%`jgAB8lLHDcv&XN7ZpI zw#kw?_*TIb20B!u*435mTKA0;k~_+kL(b9LmsY0d@v9eDuMxFHaOc&=mLHU&lsJ3) zZm~}h`oD|oTufH4e5|UjJF|n8Z@06mha}}frgQ>Y6RL4+KtZ?sv>z9|m2Y3n-jZeb z&8wfM3<(B9Rc=+4dyD*DjUV-0B>nU5xo9tpQ*#9i?6q??o#E!qbSXxFFrlyoeTA|o4>BYqJ~DUcoHq~cK$v`LfJH$FE-mk zJtOZ%XuFXnpb#GuWk2&#j)WQEF8D#}g16XI(@C3T*hhyzLxf5q4jYp0F5ec@TCn$tg536lnaqTvYj!)!4H1I9pgP~Vxyyl1}8n(Bn3 z3sncwg@D7Vm?z-0J`?ZljW^=DhY`XT(9JGsaNVm7J~u)!e;8^(XV7sIZLCn(mxg0y zr4spZZh1SuD-kp0n3nwD`YFN}C3fn0Rxwz)pG-?8tQjJBo<+s?@U-HczNn6>-y8y_9qn!WHZA*cwy9OgZ3=14w-laQK0Jyo zd=^;#HMh2(zA165Y?we#^_FwPIf^hIG8mGjqWhSP#xj=LY& z%@qt3Itu8F-`&Ibmhu%fY*>oD?cqbc!uFsazXyYL+-V|I*$JP<6Yewz+*Qkbm~PxHX8;SH`=iXSSulVPp!E)i|Gt9QYllSuIzOR$(dDuTj+N zm(Qj}O%LB6_xZ$TrjoE&u|<`LW&v(4{e^Sq5`eS3fk7()-?_JzSUAIyxpfy|Q`VAU#Gtq?1fsN41_IIedEaJ#SP@1;B{$nM(xCVZ4i zHr*=s?2AcDp6Q+2`NG`S1k|29@He)VZvCpgiH-zXwP5lc>aY(ynb=oRKTJ#5A}Ojg zwAsE=Uj4$+_Wjy|sQpy)Lf$=X|9NXle)+i<>awkiHaBjwsUdqlZ*rKFwpz$+w$?v? zLM=zDPhO(C(XE5CFz6ypqd!L}4vH!`JUj)`CDMVhUWzG1ulGKY-4R$YeR0&Ax`}4q zUyDmi%eLPs$$FzBKd;qFc}VUD#mygPSMH`E={$s&*hG(3sE^{E7E8phKk$1`D-$cA z?6S8RO8fTBo0%|G^Bm#dQm~C5F7|C(B))-!kNRxNu}1s9-Op@l%5kfDzPrvf z&wYpey;*^=iFUk{OM&xP@#S3XWoG4cUF$qoc5So%xxwM&y(`!q4Ycb;ZRh2#lD9^1 zKMCHl3#VH+IW&;pC0Uc@93CL7@w~63**M!J_M@F9^G%-K&wPuOOw|f9OI^Be>o;_VBQ}|$3mJm~qj(^s}dqR*L)b7&ygcr3jR4&>586x{3IywUq<4u4= zHuobhr8WnuVnCg-irzc}SzvlTU}S7izq9;Y()VDg@>8z75g_CmInQji*Nwb3m(zgprZ&iBbxzy%R&B>D<$iE2N+0 zUgM(eEwaMPu0WRw6heCJg%=B6c({E(gV`xg>@=P9P6(0P*r3= z&P8uYqaxSd!mGo~M5g~Ytb>WVq_1F|sR~sM>AbxBaOoMUyW?7fvNoruvI2u>V}z`l zscedM)}$_@M_fu67u3oZt*Uk#8OCopS+6R%W=Q9er8s5iE4=*dyGc3sw5@`7CoOfi z`B%(fAn8RA$(KQt53EOWr)w!y+Eqa>ZRSTsN2^3Aftt8)kDB)4BQ7}93<8JpCKO4N zfIdduuW(KeJ08A0O|~92w%>3$v*gZgj;EKbr{`qI8lMJhlw-KUxpPX{g*3De_R!dv z0NOWR^EpY-!1Ss&i9>=axuAA5?X0x&OD}$QZbsovy|M{IGh2T)_R-E)3R38i?WDxc z3wY17vv)#hZOPAYWrju;ewk9&6mD#B%Z4G)XWy@*G7HiShcW>h0 z<xzbe{`ArT!Nl{o~zKyT!QB2=b35Uu_5#rtRmVwQG5!*RO}B}YdwD$Y?L+& zxRw(rWpq~Nvbo5~#lI#cCGxNX1L+1Kb=JHmG5yTRQmhlOH%i2mNpR9CLUJUyKhu?Q zNa_+)7~B7wHP%`Et^p!z%fgv^`7cF%ShFh>$L<)Kqu}fE`1!Z=NtOmNB6u#aX`>f3NtFiJ!5|@F4xtrjVV7};*mn?2>^n5rc8o?@^JGJId zNmb-D|45>HgS(-~X&9@;Kr%ACf7Z48Vw)|av*}RAm&{SYgHrc)-vEn!+=-lTI-%5i z-MVE-ZkrS0o4+(lC#M$F>L2;6-4#cTe}_RocV^i<_|-C`A)kPuqw}2^)67dqEa*24 zqdjnAGEX~+vTW~NxpvnQ@7`$ja(zhbL_-%KOcp2e*SIlfdX2Zm+S z{2I>{Hk0pA?cmalXPfUA#SI$p7S`up7sn}EJ=SII4(4Cd2VfyfFHnts2+KH4IE@zk z4fc+O(9y?>87f1+nK=b^O5L-_p{QeAf%DJ24ng_6?P?NaM@77d=jAC|0R@P4?N0l-(A(kg>F5Cof|sX+zUqDAep$Ad9DYme1WkR4;>=J=doh*TLs2u50;*r z=6cZtulwp*M{$0msU-!`{(5Jx09Inpz!(NYM=RUYTqOX7SmiLAU5}Nrx#Qeq;0YDy zv%f(`BE#E2@~l@QPV4n1xNzn*<);kxOH)JEP4yp?T@HS^YKw(2+SyU%oDL6GaU0cf zwTU^f>tRNJr0!9S+4KW9WiI@5Olr?4Uoi@m`uiJ>8S@=@gMDrgQ)kr+?*`rQTv@_K zEps(qLXwHEl5fDPo66{ecuSi^a~K@qyPsBm?!A>@h2^Q@dRO zv#7HR#n3KK>r3*Fm<|i4z8OWRU|ss$t1m4h_#EK^S_x`@73?NQ`I+ORO6j0-w|jhs zmv3mHA=5nS1j^lgT~9rxFgy%MMm~$=!Wu`iItdLLE(Kj?Sa*w%Rv;|Bk-0BMK7^Ut zAU%}KcV=3cLlsog@(2k(Qc`9v#2u*#Iu*A0+wh+h2?f3RorTh-#y$b%yGd^fj5Ra7bApW5Z_PeugEosMSYD%{q;bac#Pv@&+1 zEY=SNw;VRE7-sUjg`qT|p9nHY9@2%HL9r+qxPLx8CJ~I<=m_!=auRJD)swoYaiXX@ zN;jTN4ctQJ57&s~Y>D-dhDuuWR3j(nWu-IC^IaQK*>r1$n;t?sO zIO1yIRu#<;w?i0}xl|WJ34h@K*`33BWrqF~S!%JjUi16ET0XMANIDd-PCoVaP4Uw} ztyW=hFnT{mUr7nnQ_XBHRH5VajB5!A=FsW9s#%D8^>L(hQ*dlh6Rkvv{5ym~O@J)C zdv^YrdMGZQ0^E=${k+*{3ZYDD#h<299;N1{`98jV_i5k2ypI`rA&-~8`-1BsCe}$U z7K4v!<84QH*~cvh#?9J9a=?9t(l$?_>R=DlD6j>zRK3)uX~N-tPWAZh1-0cGtU$xnF`QCjql=)P!-SK$hKi z^YnM}4Nx8(&uxyoy1OsV?|+tZoIKdFO%o@6>*;Ac^i_LEz#yQXmY)AjOgC}-vxeak zm9u09Rl?VqI|j^Zal#VCG4n5Oyzw&8GfwOInpfg+?V3t-gyE48+PH6`C#7PD-hEu; zPZyZwlB2`9TNT^0DUxHQ3ZFSS`J6U08aC%X6B-%4(YZIt9OtZ4bubLY+V;!A1+H*F zn{6)HUlCg9szjX>W-`J>CcoX-b_vbF%SG&)Ox*PtF$NYD)mQrm+W5%jhIUt!i z^|mbq_Ys0pmh$OSY{0Af@YO)?aTfO-QYB++z5Nr+dr3DCtC47I3YkCLoXN?xsU{ycX{2P*@$jGf3*b zCE<7!>r`%+6&C;ODSbcI!R|L4!6NIFbB%soaLW|VbKhzyxgNeKa$V!Ilv&^$7_@ME zCZC|Ht2>e<_hK_6H&YQN2q!)THl8R@_OjrRP*#euF(NR+O$InG4;UqimyKLT9W|Ue ze)i071aBo4+P({Ym7XFP2+tqgd6(N3 zs%sw%xE+K;YF!F&eP)pkDI&yzNf8m`anWM{Gl{b3e?WkiG1rN>qo)ck6)hbjD$fix z$2bv?CHnT~v+Sl32X^|Gwe3|u;x4q!qwt9S=#tJh=hY^9M<|b)Z#%CDCBJj^PH0-z7aA(KmvfOkXm3!Otz>sI`M#>Hqn2uu7B7#W89lD(uqtLKVnv z>-=1)QfYDHfoSo%0P4^PF_o38ZfWqFxX8Weamo18)oSFft!)7m-h!>;umv9-+#3q$ zWYT5!LnOyEy^qRQ(0&g?nbkOB%+PNWkZdcEm#Ij1@#0+j_BN5zb@KUA`X}->$ytwZ zLPKwU$#^=Xd6cI2BxUaR7Y2U{fx${ACz$>t=Z#P{;wxW|Vx+oX74t+k23q7D2G90v zeBZ~R z7oRVBOe5w$TV$|a-Y@;kfVK@Y`{Uy*ixicBsXz+tb!Z+k9p|P|;kYv}OlIMwbFL;r z4y5wNWHhg%4w`H4lt}i%NV?MIB4)Xyo$ID?6F8&&pOXe_my%@y)N+{UKDQ~?piV?h z$@2a+DXxBn0@PhXQP#l!1LVK-aChF{JY8m#sGjx}>-D#9J#XqRs#VNRMo4zQD;oK| z+P-Mt(0D7u&CTi4NYI;QOTn-YbrC1-wN|-i9?R63{M=kN!0bq&0=X&Iao3pl*C3G5 zLihKUglF)(*z%Nx;{=p(pzM#Lf>B3P$fmn$aF|R?8g<~M#0c%$g*-=fJt|=h(9njO z%8`{{zI4|35_sL^zjISE#FKcyw$_V1_Ad8dvkuFAX|w`5BkmsVE$MMZ*+NeniV^t~ z#J9(5@Vj`C!k9QU{AK*%2f4(BsluAm8(1e#{gHHdccEYfd=q{_fzci)pqC0&$0$a^ z#Q%I5bv5FTw7rYkL3+W!yrAlKlPQ-8AX)^ob<*M})T_Tu%eHx;Fh*P(ufwtylp2Gk zJ%fl9w=DJN4H!>>T9A-}mI62}@?+&((TRzP2Sqq2cQ77BAM=1as^4%qIBESCF;pIS z`nVSi#JgKIkR=EyajBJ+8j$$6J4JnDXd?v;=guIqF7`bHAp%G*&Og)65i~sG$p^<} zMhNN^ZvZ=41aR|y4{Tf;h>e&)t?b<Jn*$ew%)W8zV}Pjwr5(xc9n3mtCj!kA{$(zCiD){=os z?c6yNhC<=-An+pHFRrQ%)?-`6L(A0k19)bopVGl3a36mGm8#*3j8LKy3Nn=*9qy5m zAeJ$ViPY;~3u)#fpn^ByGf?j_&*FY>qBwCP`UDikw30Y(_~TGhH0BER_!9sd_NU;K zge2CFEZVQY2|=A*|6^BIzkU?Wa}7QMwY_1nGoe7*>r;emrFW{$4UY~#?)0lZDC)wT z(PL+;Hu(DuY$W;x+q*H-B?9pxD7np2`kCoEIlE`k>zp}@%C5bw;i*3BPn<$h?n{3~ zCOy(}35w~!=_!TM$s7o9L?t*hQz+o6)k+TbekbSO%}<8v>i4013(OwD$H4yU1G^HL z)+cmiK_!FojVHOLg~PWl=brzwH@BG7OP`OuVGs~dgV8`|7Y?wxQKj5qqIR>hMba`V z8IvG|cM&h*6aOCY{q=I5<=Zc5z;p#yzh9@|v-yIoh&vb0zjotYd!$Vi%uyX$Zoypv zrRE0T0X2T&k2&Oi3kql~M4eT)AF=%ih246Q%(417Nr$Xya3sFNXSHH0fp82 zvNeT~S)gM6yo#UD#zSumtKG4XpF{39;z*)wNRGSuxtkkx#5!**jyxe2Tz{Wc@|z+N z8YG~o{#ZYsR6lavk(+7^t^>^2qLVBr7d!eE4>adZHXs}UYxab}<2u(-f((?WtKUgnIvF4erw!O@}xalRZ3xb=gg@vtc|#XIaB14kNr z^nHp0+Y99ize0yXcVau*r=>snhqA*z`68;uQgn~?)q^N_|6cYl`3|&$4>)W?4NrD> z25>W1RlXdnaB2ID;&85Z)05z&SL!>v3$=mHcB6rL*0yb59>&FFm)xaH4{Hu|Nlobq zpZ`VAZP*vBIp+}6hsZ-1KDTu8bBPYMogoLMwZ>y>c7T#O_vV`L*kcGj*lcv(dr&kL zc48ckOgOgtP#Nn#;46^bl6O^LD+gd14Pj zJ!V(%-Mafbl9g^p@hezZJgU^tT%!*UlvU+Wg5W`!Z9v+pq+m>?8U#J%A%b6qra|Si z{cD`71m1gdJXA{R6DKR-9>^FJtX&x;9J$ycZpBb&Y8HQ*wp)BU8NvGT!ll{# z2lpL{Yj5x^_FHJ+X06l@vSp!$zEQ-^aD6O`uXXbgB6YMf5g|Qi89dn8xs$H)W^W}KnRdzdGji)PD81GmXdG;lF%e`W*H znM3zb*%x5@K2JJX+v1*;TVZXR!m<{QUE-AAH1#ZoXi}}PsQ@K@T{c?|Zw9CCXe$%* zQfCl=jQH%yFE<3*PqsYc&HGhQ#c0;0mK{jFFWWS&$pC+kbPMbL&05gMiEJK4_zSDG zya9k=7i3f;1kY4Yfnkd=5!6@BlSWj9Eq8cpUMSz@%QkAOgGl~d+q7oSXmmAXVF3WF5URBM zT-oz_9O>NRuhT9&Y~A{f*@U{e+oqjfWeR_I z`v7Mm4Zjd{6tnqn0bSM8r$f!m%K2{n2{^xSRQnTfHfud$Cbjm%r)~a|?kLq?9p!Nm zaNIr!l-zWhDx+*)Jvk)rn$bFQaX1(F0E7gWC-XQBtw-B8qokU#%`&1>GqbuDGx-sm zU+?EVnQLkT0ehO5O^4Ffm zm2_M1_%vumHJSsPEfL%uEX!y z^&u>Jng$4zL$rQ!Q<~gHc1`Ja_xBmr-8tz{os_y9PaXchq$tjX{TePsgXU&Vm_?Ua zbs(~45Ys#-e}2TZO4aTs18nu1SyVX_ge#fbBNOQh&GME?51L0S9QBq)iQ>v&Xt$m` z;TLHC$F0f&Us9+g`#Na(p>j1U%-SX*1EQ}jpNuvvz5Ugw(YTrvV|KASXcAleY5vlC z2(y?}F<;}90}@u!n@c@vmC`?+*p}DN{D_e$Wm5zx#J8#(4=jrXensvB%CaW|Pju_` z8fG3I`vzrUqx1c1z%kjVAARlUfSDRKJdIMpKTW6rP?}>;J&W{laCL;@^870AqFQOJY5$!7F_pS;xdiA7gIryxVi2ILM$;k zsymoce-3mfgHz8%m;Eg@!TjAWJCXaceJh3VZt~emWLEw4SA1j6rSz`zFC4ir2ycEq z>^Pl0J5@D3*F|^>O?V4iFXQYLqTfpcAXGo!`8dD1XVhZiX3bBFUX*I^L{lyH{N%|0ToU@(;<5#2ZC^8K763SabYh0^@qY`rp%9PQkZ7v?2+XWSoYaJ z?4?r+bUz`Q*$eV*7NmhH#*>oQJn678L~3K<8-4z*wF*0CR^m4~_bm;-fN!0ACphVn z{pei3H8ISscs>z-1dIFz`1e9(7LnoYta`l+PRkHVp1x~x{KC(;<|;P+mTWe2jhjjq z^Ou;hh@uB;Yv~e%xf|+b4cAtZZPz|B#cbM9S`3xE^fHe;Vy|rf z5oPCbZ*Ub&R!R#8*i1|P4q&3_%wJ2oZ^wa2mxx5Zfj?gL_@I_?@gAQ|zR+iePku z6&u(R-Pf7(tCCHn>Tv@e5)5k|w_OLLZv3gj%c*Zaa-K|{Sv)y%?@x5H3n(;w~*5wS>4BxzYOloVDTnN^vOX$`G%l`93-eHpOx2L%W zXEmvYrb|-I*mEwK@gwdtDRJP(G<6AXkgj*oFiyPV7>8#vzO)#*rzIc(yDn^vA!QOa zCY@-wh(7}w62{5ANIbzMI$czNDYbUQX^cjuwM7x8r)j%4V$LOX~TNJjyqp&J??9+=>+k zrkhFN&Y1YdMP!NGpW$y3G3aa)qpAvse-WzR7!eUPCfw+54P zrrNUEnLce3@i{+X`R$N$0kWL(LCDTcHQIOrl8;)$j`D2P@ZXF8ykN+x8rc zBw<{t8&LUUqyYYI6)T;Grc??CHfhVX$(V#vlgIKP*D54*pH)*)r>t5~OCA#8&I~>m zQEjR#ollowOMm_D<#r15sCVM_7+za-!mOk;IFM^_exe5$3E)l1IdOkms3J%fyO<7U!RjflBKYq zG8pR-FMv1gr{ml{p2Ze%pFgM~v$1KaMW*P6gd09iw27T0t|ll60K^3{rSBHZ_-9B$`89PPba+Y}7<+>`!*>)srrCiS}!^A%vA$bVuxe`(9$K|0 zi_G!{1qr1%%MQVZw8$e!if?QG*REI1s~+!yKpG4o?oMh)?|~OEzcM@0CqnJk5X)M} zL@q?Z2tV(g@HA}X8SW1nGAzXZsVQzb%q=}Skhq;3lFNo&(2ap5%^nn+e28O^B#Zfs zxf-ug{T6w}D#$=6Djdq#sF>7Dy)A07RKQ;`5Bb-2g274o#b@5Y8(4VU)=)qB(LJ|! zAO=V_Ms@WScUMQ%*!JiDcJ59xQTm5mP1aeJxY6SCD~~;Ek_3U8x;7d8m+iGsl;@jt zyYc%{OkkzqY4d;^)J>wq#{B@!3L(qvY*`;GS58VdwCy7$g}^a!K9ymoc%6w;0-`2K z@Av6ROv4ou_K8l0(J$iWQ@y(HV{yZiX@T`JtLXbrv%}@HT!0ubv{pDexDbwKC3Q!^ zNt$(iLkaSf3L7SbFc`xgLTyDj(+E*lOfmy#o1qP0gh;*wp3wTJvUC;;eyu*JBP&}3 zLX$VBEQ}9204g_e2AuGTNaa?$t9=7UN%{bO*cC`u?xR6M>x2K|9hFsSw5&HU%mBuz zFM@G!;SVV;Y0B&27nBi)uiIe#Ri*Y_coq2#*dQT^lC0d%!%wr97IQdmmK$&R;p%N+ zkDUVwx2*CoUwKI%Z!dZ2xPJZg)58XZQaW9i54t2+`*)CQ*!N=&CqFu`7VQR>`I}y@ z-I~iSx1y9V1QgfM|A$VZ5W+ti&qsW;QB3^t_8e1Ykwm1eg2SL3>kfI8e#Gkb=W!Yf z5DHAgX9mhANuxEFs9TsJ-V|P1gtxUVxGynQU5go_hLo6-a$2(1oj04gM;Es(Ofw6G z71kCtY9NoSMk_2)R~ba~>#|jT-S4YD-`bUdnA1 zEJd4Oc^tUmcXlTufW0UK84J-)&=5TI8eJip{jk<6z!ECs-O9pO{L{9b*e91OMH?z8 zHUZ634&w(R(#s+^bV0r`kS*k#^z5D&(JbV(h86)(sBX`Km`2s^e-q)it|!O|P#A(m5YFQJ@ksn$fQhB*uKsYcBs{ zeUBP@M-4ul#$~Ab$r`NvOxWpUIjq8{nu9a1_!T)00kk(Z{zbqodG-}MT{xpi`J$ct zPo&S(m#fc-WqVX57}ov=`N~WZ#LB#JO5SQK7AKlPKKM}41|6CqcM{5FD$?B`SyjyzsZN{JR1^D>b#-CtJ@qZ zBY%9p{rd}F4!z_zrm?3+`J(O1!|f-JTqy64-53_A3!@|x9k%UeU+CTZs?r;}F#=q7 z(^-}+Oqf_oM5m@cy?R9vs_--_ni=%E?lTldTcZo2c&#qikxE3zT@Iz&15^G4UjtcD literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Description/figures/openGauss\351\200\273\350\276\221\346\236\266\346\236\204\345\233\276.png" "b/content/zh/docs/Description/figures/openGauss\351\200\273\350\276\221\346\236\266\346\236\204\345\233\276.png" index b9f5fabba75f4afadc909a3e0383263f2cf03cf6..27620cd425fe1d95d3ddcef802b04a4d9814e0c6 100644 GIT binary patch literal 37204 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≪aEJe2(Efk*0vLA!Di`tuETp$N1@tn4 z=|v?Yph6GmRoL^g1$aVj{R4RN4R|8)PDTuu-XIW$F#G>T7^d(Y?*H;xYx>`Hm{`rX zbP8Sow&(!1M0hfY2+t8pPIi9-js_4<%z&ej0FK6;K!XIoWVt_%0)lvs(Xj)~1VA%O zTrQUr0wAXf1?zu_KmFqeIJu%QfRs#nGk}yPfK;V)-0%c&Y&B`_-{`cLbh8n!I7n*O zY&e|3&(+|qe>XQxr}2kzE>%FW+$MT)tBVclULy3kTU?%oDSSV=Q2#lHP<|%;*!}wW ztJ~c{-B8m}tJUNE$kW38h5l2`&00A7|2g)AEub@LnD-m>!WS6SqEu=7e~ z_)B20emNS?2~S_I{6uv4^vS^MJcq&tgM|t+HXK+$fkoQ~_#-a__7?*v+1D;dOY%&u zadz}4Tj_RbR?}sajjrE*qWoQ?VGCc0=gQVlx^u<$$$D>Jm&VvCo7On(c(^=TyaV7{ z{}FdB!X|Y5TZ$reeSMv#gZai8=cw(el@-eNiV+2a6n0b#)43fb4Ju-`V^Yi39j&L! zZpV~+>vpr5e2|VHkH0~N@juio?2rA4?|hwIy71$=umV+NT-zkWH#WkU1b@lM|JMW? zD0uPEz z*{Ip85M~cs^JTKSlhSq1Dz15sf)~-`f@J9rp0+f=ZFdWS(7Ny~kT{VQQ*##guQS~Q+*6@m@w z0~XIVhNDJ93$FfC3oy$bIuO4XAiJZD{jES@_CqHv7qe1&;C9g|%eeMDMZYO6xobo> ziZT$9Y^l()`9nbLB&(VvtJ}NSI1tefpLHWHzrQ-UtHtM8ip^&q6gv)hCZ?o|-|@{E z5_OcJ9Y!GE=A0=dS5Ix{u3!9to7|#!>O)SENT1r9+Nur&tH+XA8!DCfGK=^7VOW<~%O}AfH*&>HZGIzfD<*FJlO%z77HB=-p z86SOkLZ1@tQUZOSkJ`vxSK!n~`g$$ATXivXn~%45AU31hQ|LoA7NG*9b@=qtGMAH^ z^@}S)YNK!iXDTyw2j>B5YRzGgMr>OMm%dvYC`3hOy&fx+9=%BDXv@QXc%VIhlaw-n zyQrC9=k^T$WOHVwH`!Rua}AM}Ld10yi#Awuu`mP4u`Dof8b#GrP4c}XYkU|3{!98^ zQUO<)@q?9QYPDc9j*e<$=P4X?%6T<$WsV~1z5b$(91GUj6T{B5QlD+D2W1gNid5bb zc?SZgb5JermeY&gy8t~ zXWt3otf+LQ1;SlK3aM#v7pRm6Ki#fBJYY9g=-Ltw}St~H@74FfJQ-N-LWDi0y80CnlQXj1e-?fgF(5&w1As{E4ExO zRoS^sTQ`q@yq2+cL=N-(mkim@^nVn)G89U)K$Y$~-~Z^enNb=& zJm2JrCRzU`m-qYCz#?llJNwnlw^n*FHGLxyAY!!JL1Ytd?JV2}LRZ3hnNc|6le8jC zRiO8pLNN?6HF%W=y>h`D7Df6jGQ!ob;j5+|LEU&8gZtdp4+esW*~j*hrMpJ&B&4L_ zWK!=tiWylw%9!M=9>=>1EV_!Z+630{@gU)Z@C46qF632874upzB|rg$ejPUcP`f=$ zAYP87F2pexL?vr3^>a1zhg@=nN^T^~2>AWz!4#2|xuVhAp`cKOX#R znlfK7*BZt+{3!NR8&n-DiGCAl*j3CqNrVLn?*EN8LhfMM(3ZN)7F>V@=}KnpO130@ zxpGuk{o&+OuQLv}9Ld%O^b1vU((@^&u5RT1K%$x1WtZBRW0&LSUhWTl=c|?EPA8zU z_uwQOB9k`8qqOqhpz{9j>Y<{P&5q(jQw^McdD9xMEHkfX125k;T$Z+W{OPF@0I_G7 z8~>qP8QpR9Y{!Sp#m;wM3^!8!Az>aYVE{QEJ8!(tzYY@?%~kQ0rL3!G=S!?>9yVrY z)jy#R*$+w1Z(HMPHk0jNpQxGfXVDZIk_!CritgDp-ZXpv;g-%s9bGk(*x*okM^56g z4icPXxX}6ZU15g}Ny}7wloKz+s;4vVnt&O#c(rq9(E04B7rG_2Q&Fx%xyc{q`p7g$^_TcNZhm&N;90R zuuxgc*b6?C>FXUQj>zi#ZY$QrSI=`+eKjroNd6cv8t&fLSl_uxL6%I2SLAJ_+>ia; z?pP6hasa|aZ3DfwAtQDEVWQnu}5*J@T!;3&)bR^P8r2mboa*ga}4 zb8PV_K;?SMyJ_Fg`Kbk8r}2;0Iz^ul@9MJ)iN~p=tmaGsZZuJWkG)Ui=^dtHx_?pl zVkqBem?+*o0sRWN+1^xBEkWVZ&A_rN9*2u&nyq8^hXw~LvXe21D<&%Ixw`@3h=Z!H zphOkt@UVD^NBZf|7_E?mO^TXY>i4UsJ1sVn&F9)e1H3^fZ-Ta9X`?5DY$6{p0Y`(T zM(Na+cmk8d61$}poIGQ%8>12e@4YCklc+_Ra?i)PCN)VDnQHSi^DC(lim}`{$JFoV zmxXKi*m7(Ie?$f*X-L(ayJ!j1d5g@Evoan2t`7fQB_Y5xvoW3-gfW@A9&f3#C)D-H za|-hjm=xG;GYWnyA}Aa@6cstI_dv;q*_ecuC@8Lr2N=Au~I<#T5C@#2nv6Y2BGq z3b+~c5s4dWa4n>i=DtsWR}Ami5a0ArB~dK7ytbvs`n;`^kb5E!Xypm>GSEGpWlrxa7w=#ksg>3L6T7t= zK*5Q}?^`pwJdRq-A9u?iEnj_c>tAI=`A^`MQu{C1EN{KFjQh-Z$En1mMo&v%dbJu% zLDlTq|9{1cqSx(-%o-)mGGAdq%gOd{Y9Iz}cchNA!HSG5Sg;V@H1ghuoiIHeV?G%; z4fvyADsQvJ>$=Jm{yA%Kd$^b$0;&ggpx6fg6RE;jhCIxWZFg8utmu6^PV-F`N4_;P zAnE>(@Kb|Y%#Z2eNYd9okcQ)5C<^@NqxN$sEN+!N@4GqsGxR6hyKIbh_7BS@347fH z>}(Dep2A|!$c?_X)mN^-5pV^e5G+29KY=$|`gB`Bq`fx3{8&3le|5C%Vk-ONXy*~4 z^n)t?(=w8YLfYS2MHNbs!St}ayK?hWATun-;m-$)V7(VjK1NMCp6veMoegdv5vsZ_fQJJohPN7+NUjB)rW6=eOk{{=j#MAj#zj*X+t z4mkavOq%E_rv}L{z<(D)qLcJVdClQ}rMb8SB+HcwCW$_9q73k=aRI=2Fs;boz!Y~5 z1Cdp;q+w5WA{dmnDZ2|~J`kWMw^?KBJi~0CN-b_tPmmbumpB@rB7ha%2vVC*4E;Hy zV028kUx0x0)r&9wIq(Dpc=FPj$e6LKF2#~8$CP?H6pTmA&A)y6^{x$K?R=B1rb?rXs+`pclMMJh%(U0j{%9FJw0I1qF5&z#k>sqyjM#?7I@;h z87Ghqa{`bLbYW4mAkWK0jDBY<694}IcsGFeK}s{w(MCugtN7e>4X}9JAgSR2!laieLwnv==I5PlJ!3_(%wP_g4kt7BUFYMva=C#iRiN*THkpcMd0QgL85j(Dy z9C!Rgw&{eRMMt0erOE-?$pPANa&&>heUC}Leo#>j1t<71SpYpX06lG5rmiLf@llXn zC&Uuy=^0llPz8_*^kixj5=-FE1EJ=z9<;;`FdCy_1q^Zl3|e62-aoC(?5a4Jmfb-W zYcZh11)ksnPvp=!I*ckZyFig?-`*pA#Z#5R{ae$)!LBiY-ln^zBggY%IjYYJaQ&zh zbU?QVm~Naszru_H319GX7SnxyAr$vtIH0fcxZ+-_!22l)XY@S-2<@&B7 z-rTkyHQyv}ty4f2H5WGAsX18nv#DPiq$dbrQRmYxD~J(f_NTGs6I!4%k|J9C+0o|| ze+oviOYyim+${P!#YV`%s;EzmY>+Gj1xw1wKB}(+>-S)r$H85Mv%HCWA!aXqwBa*N zw@}F?gO>xC95$MdQqApR48RDcIk-Tx=B4f5H?u%sQWLqWrHCtU|GklZyqpUd;FE^}JSKqSz)G2f`O@%q|Y0n2EpIcM)R7J8l&UIE;};**Qg8 z03k&|di6ND<14qv>eQhu-m2%Fs388+LlT%E{V1=u&769?RrJ}sRe#uU&jc^;^o&U6 zWgG*9n}ej_^yke+-bP;U&L}h@0mvjLNbLTo#dO+`^6DyO5E|u8(yI@RF8^5d_nQ(Q z((c)V?|p+TOD06^2j4b`x7s73Q+J%X+Is@g#X`!A)V!NIH{$L|^gchHlroXt$}cg+@N@`~;w zKz&Ak-tKGpE4A{>l_MD5%v`H^9AX8_Jd#-BoCM6tgx{>x$m(j}W`2HqYVjOUuY=i? z{$utl=$?O=q4RK~z(!<%z>??gl zz60aHL_%!>ut1?nPyyw6gJwjilXdKi`GijVbhGyKT!enj@XyUk{neI44=!(AIMZM0ydy4TQ7 zC2_SQMiN}YA44A(U4xC6!)(toL6jxjh+qY4h zSi4OTnN5MKpq5Oh@fTK;0`t|(9kMCGQP2HNwKf}#^fGiHHM0WKyKmE>jhAy9kD<%s zJiv@;bivyTWl{8+LoPbd@zfc?9pCMMX7bex*Yta3j+lB=cNDvRnqsBH(s!DFHUqes zH9fWu39EFVr1S#VbO4LwGt<@|*`Eq!7a(G6Z7S${H{`LJ8$k@yF)55P$L@U3!)D#8~cz*0kh&YysQ7 z(bLiqr?N??hUa^|;^~R~JZBqCLUnoLj<$jbj$$LF{j)Cai-&&m(#U|9SmCiy7o_wQ zXB-EkZf?U}HpEy)DSd0^Zdz>19|7GBuP3Gx4vVilkcOQ?Eduq%hIkctr9E}u93+az ztY_>YF=9(hf@`dm8e98sSa=ddj*G*xVvcbrYX)WW;mALH6C224&lfW78e%QxZnuQY zF}&+tbg~sdD!ZBx%Dlj0E_b?~9{cUk{eAVv@QdluN=r|F3#*socl$WGM$Ze%cCg1Y zh*oX|I9SQ{YVpVSCk%fR2CgMv)e9w{SRc%Jep_zp;s$Dr3m65C<3RQT3u&XMAR5MO zMc2Tw(n zWe%lFRXqh$b=;9U3nPso@dX!YdIS-`dRHdKc=<4n59zAjly+rs4vb=-?-uxMnQ4`7 zq-FT}>g#Nh)NRmv-Q@LJJLT2Mgv06)04!_zN^30C4C$bVcR7?izBpLY%B{OKlgp%g zSkiR_U=qKgmMNPrUxW4;ixWzdG=2&=E@)(H6O-%%&f3}x?X^yuyl}uUJnrk=GW`IyPCyBZH&n)l&t43pW?t+ourd2^^l)VNwW2wPFRK;lcW^u%A|`A+I)x? zm57OZEu-qXUDHZGXxSK-4NBd`%f(2@GBhqHVj}tIl#VteJCJ8bE7P!G{KGV`>?H0y z`Q5xkqwTB-d_frn^Q6{g@`)VtoToX{#i)Sla^s0!@#W0<_?8;BS9(6r&pTj4PU$GL z(vBy9tTmBfRxes)*w5Epd^VaBbF~r7$3K~FN@A`Ks==|MC#q6Mtz_ef1QNGT40lN( z0|+0Mc;Er8+s%A@S&W1J`2d<=$sj|`t&v^V)=ZDn-HRksk zY~y>zTouQQr)&Z=#vgF;blCP1ILy@0!#uN6rg$&0#us=iT8=>Fc>7IV)kaE`i`LYl zMW!)7$OSu_7)hjyxr=jr4nNKdEVtzNvw9kIt(C~egt2Bc=1a+0?TmC)C)(ZBhRJ8H zBdA0&^0|asfXasz7CAvYn<@wAJI!^t6^&7vPAzSHQpjFqvN5|%2}aA&$ClV-u^?&}o)H>_^e&>Fzp6$h-kDbbVdm%WTwB+U&>SG>t7`|+ znK)-N?$aIa)35W5Rxx3Wfc}BU-xe`i-YP#H3N65TMWQATc?ShIU^=2I>jf(B-(f=* z1z82Wh+ZtBGxE$kM8o5soBca>qO-O|^fWx^1rSfju2eGFvSF5l9&KU@ zrntw=6hy$JNcoNl-MnjiW&XI`UFJ@oeiv%-KYGog7(`ErxCf5G z3-t^h8N;j7%T2}*_k*TcP(j%<%KYw==W~Q)!MlhYM%us`R+)aAt=CnJA{KB812y<2 zbUYuNof_@^DX(~`Z_CSw#Lw`%pRaxI$zs`Gm97pKxxB9rH2#LdW25Wb=adc$f=^|@ zRSE@OzzES0i|g~4d1}+6!?u6HGtDp0`_AGmm!*5zF2c3v6e%f~&;!M%spiMwt47Pr z{X_bEr=w;pxL0J~FuOu5`j#ydLT;{4jL#yI^|_vIy&v@jmO`DH-&t!W@GAs^pDR5L z)U_JF6oRH?e%jRr8)=hKd@cR?Sy~8-IsXEvdHU6NeE)petNVUxKAXA~OaHq4m*)zs zf+Vc$=`8xJjD&t3KrSSRG8DOgZb;v_r+Q;vrvAejaPed70JGKZaV4>C$gcIqnA#3` z1${9C-s^av8^!BjY~jtt)Stg;7yr|gU=G=i{dy{tKL7Wly@huIbt`**goR99{C8xg z8&9CD<4X8(qSc5kJ?4bn8(Hz~1)g(<2C3&tdU>%k!`-Egeig+9FbIzv){9<2 zDX)dn%k~f%jbVc#Np3^0%AXp)g#x6F?W#a3oNu)AxR(kQ41FvXk75L21t=@g$^*Hz z29R6pvU1(qhuU2TP4Ypl$BW@bKf-QQV5M*Z98^MScI_dIu&|(vrgVaupsVM;08&&K z`%s%(Z>tAfm2e7`KX>;V6~|Dlp?viLco0g`8f; zA<2wb{wu(=kf`JrgG3p~b(DdNIH%MApE5#c%!GZ16w#L!x+{kD9x2HLAh1{f0_z9& z00SDpE9bm2zI~4sFvdlP0w_)abOg2LsErG;V*;DW#d^0Nm34?Gg zZQo@A)byK(1LR07hom}Q!1OQlv?2kduc{_8z~$Osu|VoCRUDBc2c-Tl1nJ73i8AmT zaRNCvCl#RFFCuCdG=SIoI5DF}1?r}I?+$=44CLwjI_B4=KzZ)!{3|yMkXRpfJUn12 zHejh_50TaffNe5CmRBS9Q)2p&`y3!=q=Ei()OtS9ov`MU^coK2)__5@-Lh+dI5R+8 zDzS-pcO^i`k;Y2ksy(BS`7aoNs;5BWaScCkLKX)h zfH<9T^i~6ym-yEipQ5c$|2GU+5NfWEMZ194#nS2lgC_+H9$6`86ekc5@a?BG6Z|(x zR>4qm0#HiE8UX8;&aeZpe*6IIw`rZZnhb1~0Hw6S1K=hlhYVOM30O)@Y-}Q7C>R<` z%&q1G68m?(B!(IohA4GnsnowDVlZp`6aX9^dnj<9Dis^xq0C~i@q1w;qBw!PDn69v zzhUTrF>Cq&v*zBj0XWabJ7DmlS$ouR{xNHl0J8>S=>zyKEf}+Ak@Oocj0cj#VcHl5 zxar@^NMK>W(tB&pd>p{il#Z(`IP?N6;Mo)#P{pST|ub$!sQtmX7NppAanDE@JHJP z88|r1S=jFac&*{qdq1_>9M6sFa(w+M9uU9_ws5qiPWZBcmV8Z1CKaadbz>Sj4&1y? zB3s06b@(&P>Yp6OgI`FJakSX<`US%T0)h@0jQJX;%5h?m+(sFDQ|J{hDzc1}IEkenO07ONtKVSX9ma65G6LMq_bwM`;3o2_ zl@;mMuJNx2E&$@2Glfh#X^TYU7 zlRtfm9>iY_fPH2nv8%3Yffa)%HHk5MwGojlcI@hpbc;w4muRi&a_mwzgQMvQ4M`G; zswZ5gDLJt;U?MMeY~{oVIpgt3`^D&K>DXQ8D2?+yg&;KqH=;SMHHDr^_9gf6Ni3Xx{lbmk9@c zF%9~~9odSnCD;cn-wMDCZ1Ck|$%=3Wq`n5O$+ye-#e8?wYNEEQ>f8IhX3$(o1jqZc zbB*E$d0+|rM2*j>Ga)qu*D(lNwSnYpBaq7Nm}V=oy&k(*WMS_``~eLD`r@$4l$!+# zGnHIm3QMk8c062rEI9!Mmd-#DB~`Tvw`x}snmwxI?fPxhOW>Yx1Ma5>^?N-C!x)O< ziPPdrYD#hw?Rui(de*rU&R*`3!+KW6G{v;{IZ?JDP`kBiIKCl%io_r$2dSL$RB*H- zUF1_5#{KdJnDn`#l24BDppqg_)05^1DDQ#J#D*ZTM)o)P43YTde*eJQ=Qg;FEm3Hk z7KAuwM3kgS)S))rwqxdf^Uhtl zH!T9@@pXDopSqGxR~F63WWw2_VGZ@fIorst<+o9>Uv4~La(d`ZYQ2={(7vOs^zV9I zDKn`sDeCWZm+SOkZrwax7(D~Ox=BeeAG#s)6GPdympxKMz_U-~F%)amXA_wf1A?J-7ZWK+5?s5y zD;-v?W8=Uyocnh7UExMCX8xRlsfpH6tfEGR1=&XuAWihpchmFIHrEhACCqgCV0(+j zD0d;MJY4ua&ZGJ%WQe`?={hB1lL+udmIirx9Lg^kLm1j5A?KkIqyRh9A>V)a=uqy^ z))e_+JnDvV@7=v6k_pQ`ia zC3zFhtl4D-<9uJJd2LI^k4~K{AsP>k`{KANnVfcwCE|5-;`aEF%<3H|nA^^X)5+$eGAK7la}IPHLK0bZspz zN03*ST~Q8`=Z@lxczfs9yc91~>W@7P-&mIrRDcHTtc^1r%nB!GvSv+C+*pu*qt z;=V(#Cc0Mi=ma=FAAAKoxX#r?q~pxQkb3Ytgln51Nn)kg)Bz!hLHAGZDJ~*A9(UJO@s|u_mJ)Ew7Qp>qPHLZJGqV_9e3T~(yH{F- zA;+i39ieZO_$I>OTF23F2~8#8+J*+fh|Dh@$CnHM2FoB2_gVWVS6Vqe# zUq2wL(%cucRJs;(v@?;?r%?dEk)fwT)IVs}WOlUj3;3CbRJSktWJ_$m)=={%qFkcWP>#tw-nTYMdn4z6W=#9Cp7Bt398H3El$JbA}m(KCYl`7SdFsdxq#jo+2k9@O0m4 zrrvzOR<2V*&OD+tJoIxZYj%E~r>TjnN@q}?t!t6$VbO9f>;Ea^%;TYKyEsm%2H8cZ z7;9tAgdR&w_6dVzlqIsg##(0ZSVn|5``#N_i!hXROfi@eP5r?b!zU#+f4s>Eq5dV5Q^ITr%k~ba9oyzUd(?v3up` zQc>NF9ykZ7m;DYpYC5$N-r`$`aEg04#x*&avv=AX+@wEC6JX!>NyU_E(L8bzhZ~?? z-}x(E(j1(uEDJu&E3Q?R#(m|^Mmi)Go^v~$iMNbye$zSVzl&}F2Q;sUCQ zxVRA@9xR+0UpP%S4RHZ;3K>-&D#p-d~XCyLD3R>Y7>Gu=(pBpx*q~vP9UDH$_ zDwNj)S7TeHD7dP#3KV$5+clk=e&-8-1F43zowwZmjTR%A{6vHzJ6C@mMRqM$#tfWr z{PT9NQd4m*9cP#V5g-+4&ryhfM7d1vh=<8t#~c z2b!FPtQ{0?As6P|nD3sH-j7z_5AGrG_zpKNJGPI(=M$cB+*z>zcT{nYCo(AyEFzPN zR@Dy?y;i&%*-=OD7JK%H4s~a$8{_<)#EB#&h8V$D#u8NXZ-}v7#^Max{@ci+BVQ}G zL6S(BfEU4&T{Frmx^}Kyu25h#wI6QFlw@P$SF7Y3w#r=80ZKLyG=~HTZMq6OT!N`mfHnJhkCbS4 zj<=Z3=a1ht+K3DNZr`R@37kLfFoQ#rF1daPDIL(UzkO`_IO9OEi;l9)%_`7hjlI~R z4Sfz#%Sbkeeu_^3ijxV1k%s8qO_{NclaV-H?iW&Ag~FSXqj1f%aT%^+e|ttxR2d$^ z<9DzChkcVcDo*jNE!}$9-uzB&;Z5f|Egw(bT*>v=t1G0J$?5RabR1;QfkBPUwyz*% zk;Oo^IYLG;nGZ6lu={dHuI)D)5(;_kx^;N&`r8{`UDTl70jcEFELEa-Q-{J)e&o@G z_g3Ug`Jq%b=>qaLrroqMK-6?G+%VygnoQ4pZH79(Le(*8KbFW~VX@_X5EGf41t(%eO4#MC;gq{*&j~BfQ{uerb+nL&pxKV2eQ-v1G$7l-1XnjT<3ApjLU~* zaQq(NcG6@G`}Kan%$9xx&}(zTOzm$($FZ5Y7_NW5=l_<$3<5=FmnrR)>I8Nidb`KZ zUFkpPMCe%LeEqiZqG9`Kc3q=ieEd;c3*R;q_d(8X*xuR2P6J;eRwL+Ml-t x2Z$wyaSVP5F_THO?+y1vd&PTA9&$TJ%uZRaG~xG0Edd4~6WjoyU#aW#_J?%u$EOhx2}`{FZvtV-$TZ=LejXPWjm0!VVT5VBf#>^}x-D9L_=+@j@| z4c21oXwoXSAf9;nO3w=S*TrRexbj22dxFQ=db5?Q{dr%fr}vc~=6ICO0=tKj%_<4B+A6V6zSPbC=z5?v_SBALr z$_2MHo-aE2+NM%<{=t0%KbyfVu2OT_KuGnVrPt!@8fbrS))-hF>G8fno)~0jtb7xk zwzRB|e|B=lCFK(FH00~}=0toAVuU5AOS9&}BjQ0A5sovX>{Fo{LM4&R1^5Sj+>Vh> z;mnmJI+@S0q@N>Y7GCrSQM^N_2s!CaFg$w z($L~*nfz=QC;tCFm)8@#?+m@admy}rpSkeAn*IA;*>nn@+2uTN;gkn}JseLHZ zXrulo7x|apeCsOs&@npoh2A;hf9mbOAHiFn0Y8Rp9G~jXUhEimcDu^56asz+bjLJW zB3RUY-K*tzuRrc}qn-u`Nn^4*aw>Yc&phNqLZ6b{fP?|Ng25|q)LxS_Pu3e<_vXXv>?LO*)4TLr^XM7g5N{69aL{J$zn(LzhOzvJ8pJSJv}BhM!WJG{hd|Cy`$P#MY~N5V-U*&M z(TD7j{T-nHF*x7gM6v>y3=M(YP-uyrz5TSCg+-x_$TVhkWM5%;ANx*{n|uG*x8jIsMKt=&~sU)U)3=OnO7>6bSN?>!?!$RsBx zzl=)QX+nMcWY&41m`$>QzCtBdRXLAa;MYy+lg8iXEjIYGm^4X2V1CpSQ@DnYk1tfZ z!9Lg7aVQ9dLitkC(!OO0*cmm~5+4`yMk2oS&%PFNYB_V$>Wi;jUR{;>*u=WW0^aFI zrE&X4bGO%wnElD`vcRCZ1OD;D=Yzsd2+iizrI{<<(?5|ekrXUvFFd63S@F=6vCJZl zXDfpqd{z#=m2%CVTUu#yjt%Z>)P-|FULFk)*X{VNDRdb!a%|D3L7G>{qjTN(u<2+# z&HyE7k9}@!eP6gW%l!9`iq+Dw+UPPZw4AL=#70+d(X%g%4`0d;1WIGDsRusNqax|om>q8-+f$C zLi2)>@gaM-DYG}&X7(~Zmjm9=LY2wTAZXPyKp6aSWT>4Mof+BqJOWGsNtS zBtmn$#K%1nk3_q)|MoD#ygy?T4nC3(AW<`dF8Pgxg-tr9rVIGvb%~zWZG?HZ8&4A? z`(u9GXgm$_{fk>%-15!3xRL=GqGv$0&<1-(IsXmvg_CoR$@Pz!Ueong_U_@-)YK6( z&gMB!Tf9ZXBNgY-=s9mO0f9ei*LE2iNP7Cb-i!T?H+@sOac7R-dN=FMpFcBJ#mLaw zt`6c zd*gHU=XPCYGSJU8jF4*#6++mM{`BMTkH#%d${lBX@34a}D0Gbg?13;t!|Sk!h*@d- z?)yWP1TWmnshk{!M|{&?K*e7aH{Hk)@n3F8Y-$pBxZH%SfQ=c*B4)u+$*7#;HE5$Q z)2ZmF&LfiuqN1CeHF>0P_`;CTCN!i>Nj_|0G94p2)W;~`N~VyY+%=$++FVz=yVAe( z1@Y-iH7cX=<;^xppXn7;QQJ9PnNI66#`6sC?VpK4?##38fdHB;v{h@J(S};ww*3ym z_~@u2z7pzp{vyH7QQ2Mfwm1Vh+D4iR`nf|}9!y<7eh4(h9?rA<`uJNH;wqIkPPDvfH2YfrTn5I5S z0n4i^?B)x&z(ge!{PU9c$5AV>fIu}B(OSvcoqRGpoi~&EPh*Wj{0@cC3xBw>dp;G! ztPhDBiXG0>f6;9KGz-X2Rr@3-#m?oNB*K3ib`+S8%kZHBsF7guO+JHrNyCMKrGuF^}5Zh8`u zQUCyJh9H}cvD*sY)V7rGVy@Ue4sb3#v*g`Uf@d17+<)EO3r@H2!Br_!wxDe`wkJE% zB4}ne@RNg9Uh~wH6l$K)eaAG*-gD;%O#)9<;7&X(>%p%yO?6fK+uW%cY8m9RDt{J* zUdO6Glc@8=UfFssmIRQG_}ueZZ+3Fg(I;UITGYF^Y_s95x7(U54LHAOK}cTyMgX!f zvxji5>9}mEN|?XDj-sxRj;39IzhKyE5Z|}FTC#nSn zE*2K|e%F-)W5)Un58b`aa`eq>%h63#_>hA$yD{WVL;dzmG)!@GvFyj-=$?M=;8n5nbAMA3gf2^}=!_U^-qy zBmKNj@sFt^#ooRvvy{vfN^L3?Pj1HVpc^!4a+Dca?HGFa;b&x{SoW<=n48cfTaD9b z>edz$t4S@JuHQwp)fC*bEM2vLD29k{+#Z0x4k?S0pV7M&LaIwiH*dZlP zA|K>R`>HZYe;xX~3+Y!mG*=`?9%DAe z_6;33cq|I3wX|P|1Z}gP@(>`|$H&LH?Cf}ifMi5=wYe5;;Wz&;D>jBS_hv(lug(bk ztK6EG;&8#|%)N5J6R^i9xyQbCwZ9HfQ-fj0+uWkT7Edc%pz~m~I=Gt*v$oCZS~_bl zC6|oyJ6_1Ah5X(=0;=Zwt!~~rBrP|pyS8Myc|zO}@SQ5b&MCgftOR_C{~iA7q?&gj zkX)~{6URsq`@p&4Cc0Af1kLsg*SVd0S{bUG%8K!~PxX&KE4zVCkq@e)!Szy=!SKcX z(x(tMm&*%1U2aRkE@5W@=UWd!sYA&o{-KF%?`9+=Yw!<-lp=7!qrlV2U0mF^JKmYn z%xj|9BPTrCsetlIH>-KDk?BC)^N!qFAW|CgvDHL{CyuQj;e?le)u9Dt&Gf9eg!Anqx>v zXuOq#l$5U+8D87Ph%{47VCC61;kR6UX%{4dv-j-h)NJ?Y@>e zG_%?++5%VfGiDLn=Y}309?Q`*T(;Wa62C}>CZwgM9h3LiJQ?^EXNPfqY$-RfQI{p| z;rqsv`8FsW*kxp{-be*~JHH$$cnXeAR=S;S)y`X~tJzk+WAjowNC3ZcfRb{5P@h`+ z)wV6TQcD*Wsh6HEMDFKlqaUA{&Yva9MN$MXJ4R)`uikZOV`T5(@jugWdr8=}+1c5t z37WuyCca*4ryMCiOKk6&tT?DTIu0eE(7e>E1I?dZf>uLzX~Hf^>#kqIHyw7&hL|fSJl4n7p0t&O zWC}QAzkkn_;~{1wsF114s$_4 zwoG%#r{v)8bX{Ft{oPf+evGlOSZi;)>>Ugxm}7hgst@;#2{{j&#|syyHKP8z0LA8< z!Tu2X%6_gy^Wf~$!_k_Sb$X%j5av77G&DQ02|LnxrKRkgpa3!R9>9R|`?(yrnwy!K zRj^gNM8(Hz7?v7C9|(Td(#HkU&^=A)fGTIzm{IAa-z-u*rpI2GDR1v}%r~Tj=O%`A zye?_Se4gL~s1KRf*VhS{;xt+%Kw&@}cJS!^P&M7tXGIvyFz4!U)>=W6g3jxh7?;yM zi-XOdnjTOfczeb#o0kVGzze2vGhKP_l3+JBuJ4J76@&;h`CXiKycGx@_draLeq;;9?5L~qFF37{+RagUomG<-&K17eXpfD)7o zh@yk-rY_JvXK2XR>Z+=H3zsG~X{Y)qt86OIG|$8f9o51JV}1z(%_fFsCzVEZH*G=$ z5%7;frlbITAQV92I3tJzloBSRYQgiAnL1(nt^8yQ_y8|pLoVb8qj#2uVwB9-p> z^MS-6HAG%C_%C291GD^btI-R1`E#NKO2qH1>^4hbP=qzYn|}b*D?!!0Jyuz%VYdPP zs_>z^<%5(mc;2KPzEF!d6LoLI$q*ySFHEOQVwZr2`N=zW!cp(Ts04v>z{Gx~=z{D6 zwQODTr}viOZ{Ub7&Y|BoQNW#o7RHX9Fe-IB@kGB_y!qiQu}Pe$8_sI)UBA$Scc<|U zugFT?a|GVNqMkL8VQ`@<>VR6)A1EDgl?Xo?Exx;lLx$KBZ|#~;Q#mCImV|WQG$eG? zrwd+xVQ+=wEU)5I)_a&}2Hvj{ehWoztAtxcI3dU|{GdFKG7&z37bt!2(wApA<2>*uuKHG zEMIDnzIi?PBv1=4K%ErA3fCPV&<(B2WztQf4#b(~gmkmHSG-Q%eMbQKCKkTsUKH7< z4E3^+M5>27$ibqt0bXS&+YA09Z9whA<(la@ARQuPzqPtPfy2OCFkNOBlK)`X8Bdbi?*INbCwf4;D&?>;ASRlICkxF;Q+B+U8AD}VxyH%W&()FNxx++R*_;ep7}bTpnQ?i~XapLSOBB&WURh};JZC@(*loycmt=tIX^ig+XXhcM21e_x34ob z=*zNf=IG+nMw^ckcZ{R1C<%AlsMw#FN-g7qd-cy%qC;@29EOmKP>J`91GB1OQ z6bHQ344*6$6Cf$~>#H27K6wDMVL~r)K5&#D@8~ZL>DQSxZ+E&ty8EP`54M|Tt!3jo zGjzxo;A_0cznIKy-%G2y1q%bxZ`fsVn6yfH_Z6bj;Ag*lVKnx3h3`#TQI6q@`bdK3 zW`0lkPa(t30g0876;$l}(wtKxG#b3Y>RR+5MP4BFIP>J$-aRvLA4O=d4DQ zdvGKIAJ8N-xa#dV6lh~b2_Gf0P{;yNwmqxXZJBq%bjdav%gS1BH?0;VYXC1uAcekm z?X><4`SWrYckLlz81fAd1o?Js-iqrhDt7XTsyaWs4tuAdxv;}~DRWcXIlnZ+sQ#cv z`@blHCl(wRoc1`fD(`UT1#7nnqCNHbxHf}@UT#@_9uzbL65+Fi9~6lGWQ!bcKq1`^ z0b?SFZy7Q?1MC~lB`wO+F~SkQ+=|<}_b4EPJOFl#4>*xR;{Dv(9XP|haXQR_OUmGc za4M1eywMpQocKK#0$^S%(jFxB&B`)44@5?Qaa5~s)Ii)JV5uSTS0+HlwVb6ch5ZzK5*PBZ8CWHo307=;T!s=LV-8U1}6tJdgA0z1|K6vL>_TUwn&Y)@!q|0>sEWCnj* zRH|Pr!1`!Z<4zb)um|9X?_89;=T9^BlQJJmW|Hxm(J|E5T_Vwv*@-In7ze>uz`cKT zX`m-poV=Ixy1K-M43Tx?IY!#V@3$R*m!DjC4>d<_cfbDF+JsMoswvA9%NmygXFWK& z?3Zy-eoTnNfC6@*!S}43P%GgftmKOu z;jt=O_?I|vl>(P8>A9TY3}e9i@LWajV^gXLC{QC9P;H7k?~o2(*MNaAs-HZL9z?XxT!>2Ank#5HSMoTY**O#&o#(fYAJI#1dOt8iq&oDdGc^OI%P44?9w z&HL)z39lG!lQYR;AefGM^5pkqFP5Z(20n1RqSxAT(;cvLS>c-w1r$_zylROE$Pj!a z-BsiSByu9m9gnA6Ly_Q8XWAOoBISOp1dUuXRIFNHLZ8BR6O0P>`ePqj>W z@2b&2I^hOO$`Ei_=tcfHDsCPBdWtziWpH(Q3TnOcgoE;(3*S?iq$axtzc7C!cq9qT zDMMw({5DNM5&1kgtO7e$X$S-ke%GdMs{ee3ZGWtCYFyC^sRM&F1Rym47)VVbtj148 z!UstSaS(X(4O{wTw85fX4tW5X!5!J*nnMC@LBlD`IbfdzxAiq(A7Qg@=uUbeHtp#zmVF})wif)c)>B%7jxQq26VI6Q5{ z)WE1G2BaenJuXpHom|MXUpov9YW9Nd-@>SP`7&7UfNN?cuBh30P=tdZZRGYGP)-ZG zc=~ug4#%YZ`-KyZJsqsp&eG489LgzU&jx@C0Zn=R{eHXM%;3Wrv5__NTlSBOO`pMI za%h6pfb8#0m$Ii-*b8H)-TffLgdMhW!cktF2IbXCv6|25bGl%vaT(H}%lXHGT(BsA zpv&Q^oWNODMeJd)C2AQbg>b}viH&eKGkH&{qR*9S{|T_4#X3o}VJNwNPzp(`dgow2 zNStPx)sNBc@=ZVrnqa8?+1=}LPY^1nuO`gJ;!ghxZbSvC05ti@5(i8&iO%H5ua&E2 zN2cE4bZk{2O@E#~!`Qa=GQ`@;cyZc+QNDvi1r5XGAL^=IMm-pWk}{$k`WTbrs%As& zFlH+*s z^qQLBkiJ1(8Eq(PbW|NurO}onc(@+X5}TN47RCAu44O96p{nXm!xbes)BH_*7VZac1Mx(V?J-}; zz1w(bTk+ud3d}Gt@97kYBrtuyeXwhb5SxE&^b0T708+3?F>eFuzFpDB@$Ckd30VQ1 zmg*^B>X3%6So6hJu1tC8;HBsFWtdfIwieoznQ{gX!UrM`84{-Z7#%lKX_(F!WnUNJ z`JIkcvH}WX*mDnldyhQd>!!THJGJ^p?B4{O4carG<80Unu;D1B!F>;e6`gXd9u!v0CuA?-Bsgh31QoVKq@JujUFbCIw8(4`(OmGI+S&r3ntO+I^h89Kvn8zgWz#G z!Qgd>MO27Oe`?u%s=GrWDXVhY$Z8HBd=(HOK`iSN+P8T%9D2wT3sVuBWb32@@{_F? zQMRXFRF7rgDtN)%knUFBSY;m4qmC?`J0yp4o)J7R6@4DO+&b}`nO{);O#*Q|G-Ig; zlxSctz3pqh6tDg$6q{jOl5}dyB*2Z_q?L95zV|z-k9@(QpbMP%Iql?R^mU9U_Bz?lXE9x< z3g-IplnWY!?jONbo>5d0L)gJ}(iF@*^>pTmc4UY+e*6Ag^ttCW!Tg9u*(5`;@;J0 zipoyV4yE17v}GbO5dvFt zn2deU1Iz&S8R z1bJjELvb(jUELdn`W`3_KbRiE`|y*#)eIr5I(>yel`}((BzG zQbR-T&H@?wnf}bc^e>NHHS))m(eEl9tsXqm(Dc*&X5y`@()d)Hh5shbjpsq6Q+cpxO70ZgM1n&NAyPr&;U1&JdUb|&gAvC z9yKg1Q2>mnpf=FX=}qX0`E@QhDna(lIY&(4#yOpc(#i66rCz+DGW(~J&@@btF_{+* zb+Wx9I|Zs>-uK;9`E=vu!(D?f?EeJ-vJ+DM^M+ z%C}b6!(mza=&io~(Obok_x~FdRkvfO9GlR0UUq&w^O`teCXel0WV4iwWMS4|rj99$hv7pgRzyuq2ao=>;@(y1py#0V=^YTl=_x4+M(VMr+y zhh08z`JwJe=y**8cc|w)R;w2BDz9Nh*W|*9hUENSor7y^ch1p6->wU#^4ziZ4-v+Tix2Z5T;pYQUG*WF-0(sZ^# z<{*Zhuj%u1vd^lVHM68w+P3F4!lOtbr z$e8@CUi$kVGnQ`b>TGhk{+d>Y0ME6x-;K0i$ySnIQ`g^qZ-qsu#$D&0iB(RJ07Eq;*nFB02jT%D6a{}oF+a-Ckl=zl)@VYu!qXAJ*Nt_|jsSlR5- zH8us=$rl8*cVAkQ$3{pL__{vD)Iu*hVbq66j{-@E$;n#-zzT{M-#4T`r|QiHe{rk6 z6DOZ?^<3JgDPmy*KbQ|_ZIE(-P;|V&cV_p^5)3>9Z4r4!O1)WBSe>&@5b+OKi*Ry< zTrvqVp(lFpL%arZQORJVR%M&X+fqR1C)_1C~4vxC?6CSyw-bnuUd@UfK5 z;Bi&ONAtz+pRF5^D?I&-=OrtvuNrf@zi8yOd!M}Fx^gmu2UTuOUp@huse4}EHCqNr zTAcLiIQoA#04t}t^^>ii&wCeDRnxs!P^0QR=?NgG zs#=+0`8~602~5zVK~f9?D&%n&YR79}%%4>X{zOpHm_B_R>jx z^PHUeZKz~a3g6Y?{`54ZNb(vy*$UHEZFULYrBk&$1;ZiC+xs%AyR zhLf&iEwhhh5^#abj8jQ)urxG`;@d5yDFNM!PUDR&zs_zye!pS=Ym*?=zOAT9xp{R1 zBzi8Vhv1|%~-wnON)XEz`ORI(4`}WA}*U{18 zKkefWCn-X2oJV7qU$^GKxGe|yKAInFlv!m5w9Pu9OuH0tWn1U?6-g+?QCqWlT)+pv zglup7&w^mrtLA~=-VGRtINi&Mx6a+wTl>;@jH5rAhoAgXm;dozhg(qURV*a~=eW)Wg zXEV4f7!g6F^ek=x8LD<|*By@w?SYT>+ewg7Z*m>IeQ*>=z0_Njt>1hZ)auJ_7kV;gX%et49)N0T&Ku7GeV?TDd^&bEz)_(+u-cDNV z?zhUC`nLv%HpetYV!H!fduG+QI5;@?GE|<5pPiF-&&&lsFxHFzVLr0kMcIR?HRZWX zYWz4Wd^G0_&aU-daVb{4kmr5P8DRNl_t0ye*cres0%tx)ec^P|y?o{VXi zx&CmfsT}vFoS@Db}X< z*GsN3pS$!J z_x3|~QNUzYZgh8|uv|e=qg~SH_Mo6K0I24iKCh|MNlsf5npzVnq1kpk5E4aW!HlJQ za$r6b6zXpBFa;*tB<-&H?4KiZUOF%kl=9Bsj(xQG+fcmQjlOuMP4A1pL2`bzSI+x4 z)uJ?vr1YW_iJ6>t?=5XBYXZ8)FZWq92!Mv2kO%Z#O@1S^*Gw5i?Y%BW#>cEu)nL|1 ze<*f6O}4Iv)?k)893I~Q(@>uQZI&HjFjTW>Tq4rt=U$5U#g9hb4U_~}SyCZw{Np`{ z!ir1F9VPKUT2|*^)RCBTXns@E*-M9t0)=A|eJ~Sr>7x7#mcGTr_Pjd*Wfj6v!gNt; zg6-GXgKr6}ZzI6V-fJl$H|f!g!0!6sAj`L(>LUcf4GqIzbThA`_3)B*9qh>_-wEzD zp5J1wYSXQ6X~wHrm7Ffl##fh)(J>ypb}pctZv?a!H&Fm)Ma>;MRj?#wNnJ9=L9DrY zBQF35p7Cj{IC1pJ`6oPo=`8biz?kiDxeW5uA8b?4ZS6)3?J%ck!KByP=AIQldZ&^U ze_L#?Ze9OE83w~Wk7l~|O%077X`mWTCGA<&M$1btf}F8R_p4<@#W_ZOEYVFS90>kl zJsoiJ9cSF*O~N&TjO{I!1ogs$BN{O`P!9n2d8OMu!O}qK`fYjJ+nDzH!iJMgu=49a zwE&9^Ps)O_$to)9iYsE1YjnS!{MraY$$*eCJGK6v4o3YYx+>>(y-WN*(R$O!7y8>g zlDcT9xNqya_yx;(bZ{^B?&eO4x{AvB&#uFDvOr>Vq5%ommE%*<0h zXcoE1<0hGa7sXR4N!!Bz4b`8}9lgE!lb3h+VXXkeu zES&u4?Pk5}keWqme0$Hx+y1d-asYe8AntA*_W8T1p@qdtH&}l7kQ;i6O5Am3C4Am* zCa`3^klS=C==^B~Sf;UczN7wZY03kOciw;O-JByyf@oe|UOoYLflufM2S$PduyJXG z=Q+2R=>YH43wVPa( zH;^@8$(h8`Qu8;kGEpfSRILoz4~6e?bB|H6&_t%E>uxC8-~O0q-XiY!;lck0#$U=} z!X-UdW-dMJ-w4?N%P`j>nwpwI6wI}DC=|Lpa3NAdmTu+X5)Tzdx%D@?S^3%sdjo6# zQIyQK)Y-+s7x5%4jpU1I`fTo}oJ*O0^!Htk2!Chre<%Ru MCu;IYn8~aE16B{X2LJ#7 literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Description/figures/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\274\225\346\223\216.jpg" "b/content/zh/docs/Description/figures/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\274\225\346\223\216.jpg" deleted file mode 100644 index 71c11fb4e6eecbd8f6d78f77fba7cf3521603537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9128 zcmcJUcT`i~w(mEDUW^DxC-fq{O9}M{h=_pnt^(3Qq&GtmM1&wkKzi>*5QreX7m?n3 zuR`c8keA;%@7;TUXWTpPIcJQwGv*(AW$%@I*P3h1IX??MgLG8$Tx#3ok1@J(mPG zub_~qs3?R}68cbBhF?Tf_|HzT2nh*Eh)JkPNvVaI>6wN9ckP%@17X*aG0$`J2 zfyl7X9RLIXuy8T0m<#y77Zx@M2Nw^YfRKn7^FYmA02>Pg!o~sN;^N?7o({l#58#mD z-eVS0z$4dwfzRSfAsiHwMZl_9*-H6r7|AB`@=Y)y(S0gv8d`P^PA={TqGI9_4<)6P z{!ms?eWdnSM^{hZz|hFp(#rakjjf%%o4bdnm$#2^$h*+6_u(HRV&mdJCnP3)NzTs6 z&C4$+EGn-0R$Wtz_+D4v*51+C)!ozEH!?alJ~25pJ+r*By0*TtxwXA>cyxSndUk$s zdG)6*ECBR(S^uHzA9RsnbYbJ*fN=2t)P;rZg)tBr4lc70-aQ3v{1>j|EW$wq6pArf zm92!VBF~VNFW(Fk-DeYBW+TWD@bHalEEoJ{9>_2tQ03;wR%;bT{06F0NiYq&i z=zp><4jUt+3236q4*DO@RO%2GI*QUesiD!A2e_h8z>u+9l?by$ML5dLDHxrwdDsRcql#N$f2z=f4~%-NpUT%bv4|2Iwmkkp>~Z zQDj+Z93xlzJ5!HGRL^2_yVEnBK#|9%9Ca1+{+bzWvf{%iImSeWpI*CUcF8aEBzkm$ zLQ*ZowkZH@<$vD{1`{lfJmX*uXy8iCLSgd1-pWH1hLtI>jwib^E_u_*(ZHKUH1L?V zDYQc9@SvSfwX;cj*yGw{*O2L}VMsTZ(?Hd;O={{bhtWa+GhhF<{dMviyDcVpQ4-m6 z_LD0vRVIN}LMmqQ_wZgzyAAk{I;{>62}F;0*X5^NGk*z>>yxfS9NivRG|EGCwRJ@` zUQSvJmwA{l3rsuf_^TN937Ia@Gj`K3PL-Sh+UCrM7M-;F(T6(izHift=Z&Z5*zgQ3 z{dwXoOn`33Q%|`A==Jy_q5=7I?f_ z4VOP)vv9TOfdFt@ZgvE4xx1=~O3)-k19dKFAdl2SaZ;$l8`OTwK3Q5*_H@Qbz_Bgd z=#@3d;XVzhf}`FS;KIE1uUiV+2MQ-PcwsoPh)@gQ!8Qac!G=-WIk>Xdgx8JpTS}Wl zWyuAVwtmSf%XWrpN6!(-n+q+=*X!S<9SUn}5#JE% zeuk{U1YP$YetJ-N0=(t|fv^3HoGpPo4Rr|FqDJYEP@iy0Lsi=R0|*akB$FpHzN`sWqV*NHd#AoTzJMhK)Tpfl2H%i z8qro^CeZ|KR6>z0LZ3=&ZWf`&{JKBm3H)~a)mJe&Ql9yylI*^E&&sjBlItJQXRj2_ zTTidsD@%;;SBv@i#CnsKXW8HC&F6?e(TofRAM)JM`w=n~4B(YfXv^dNv*u>bp;Kb9 zy+B8EBtUFxVcA&i-3PJpRF>P@FHfkO6=c5%Es+K%lS)m9%KkhizbZr(g0cWEOt@Ua zQvY*M(aITB9d@nkq@3_&g!Ox!7S=M4Jjy`sGR;!{9}M6ao`n?2-7x=;nfbGVBv#}I=S|!@Po>;DJ>s>fBrpBhaXS)3=Ip5^ zsXPr_yeK)*m2|9jb8yKwQlcw7=F_^j`$-Ke>60o>#6eCJOB8DqC96E8 zo(cfU#7{V@^7X+tvkCZOCUtNLBu$UFt0`b|B*H5P9mboW$ zCUk97zs@E5K>693N`A>rgSZNsOi!4G@SlcPW@nQ;2n0?jcDORJBmQ|K(J*LVv~Qv< z|Kjd`V?@E3UQ)-QJi2k*QsTIg-4_o>*3 zo`$Aw<#6?-%PCJ`nbS)eA8SXfTh5t4q3&oIk?0g%UD;S=7D!K_XfrbH!typ4i3S$= zZYfP#VRzj%8Ojbv(v=<5JVo6|OMBk#1;X5q54sCfKQ1A670c}_^zyMaq@RCV}8&MIiY%gd+CDAxg~EVfeo2M zuGgE}GLOYzL};K~g0?GMZoOP$ekS@XaKnl*XOrRFqdctdYVz5)h@-w0>5q0QYYF0g zU$2Jn1W=rBsnI}YgWP#PER++)ksQ#{^~Isc{uy~-?SwOx?EbRWTRt-eB`*)ssMJX> zfhvN#y{ymEit*H1HuC_tid_39_SFtt-jiR=)1D&-B7Pbicm_A2OXs`~%fFDZL|I1Z zk;&`nQ3H1ZiP}d|PRmYO;7afJ8cFF9{JIirPaRwtth9Ps<4>5@v_OUbN>I%Ik*i%D zE1b>6`?DLs8jCY$T^)qumOl+yvXVfIAQI2UG?pZC)uU6dPfiAnfrAFGLjffudluE3 zfC6ogpZY?A3k!R&(15`uQttuy`&AdXRI$BO_3sy%Dr?SSk!R0WxwxHCg!h*lTP}%ywrTm2k z^bq)A(1!LS`0Njs?d10nNgCxH6Ui!G%DMZO8w^pckc@;oat$V#+Z;7v4%~c1@u90i zl#%gmF_G9(uG=Gl+}l@gzbp^P^@Q{z-n;s+C1@tALe1vkM$vCHUN|&U$Uv4)Bj+7F zM@9Nrg=QXcSPdQuK6?ae^v_uh;L#pJnH6sPzDs;2N-p?e-->^bMp9+azX-4KxD^fH zo*3QIDp*z+t?FP>RW-kNbgvLEW%clTB46Lpb$hf|A>W($H^#V2iUY9JoXv*rO_cX(RYYY)3y%Jd2lF25mn`Z?J` z)|y}qa_cGAC$cv@b25~N_)3T4(JA?ZRofIad+SVUkmdP+Zj4q@_h>Su!a1?fxqEh3 z)eiOQ+&#VKDXY%0oYzW+z@Z5a9?o3?nY;F371>j}p8ceIe^fg)(d4|0ZM*qG|E6FL z_MnTlHfK43%wcVQJ8)UddlXM-%9QE4`E>ZLg;q7zF}PC>w>bpm>T2gg9uS7SJTp;6 zR<7gMr$*;P9Tu7hydP`c@n&~Ea7t%T(sB{&i1gxxwTPnuFixt+W`@Gt!dCLrI%SBeOszawvly2c$BX1~DO*_@&u{~CUTs$Cd@0!*R)zk)#d+m@n8G4u>&5D7LTKg` zn=eU>{Y>QH`{)-pV+vskZ=^9!FL~PODobynO#fbsWhjL_crI7_NCt z!E)S`TQX2ocoE%|L04liQZ4QEbx1ofkyjCGmnXWx?;Rwj%VEkN7uk(jkX4QK0VO)t z9f*;Np8<;CWs4VsMPg&y#!oY{wukMmtaJ5iV@TMv`GNCu+08h^Zw_Adr~~We0^K0$ zysq-?dQqmOQl>-J)6M+~|BQq{{#{09b>jHZQm0w1@pZG|>8`1n=EazLmGsRDdBT;P z5tPife|_yYsl}ZsW{5LO4SsQ3!T!~KIT5diOJ>6->U{U6v#V7ESY6V6O#Ht!pQlCh z!V(pNI=!2tZ@ImrjSfk>Lu6{RHByD7G_C=$9yN>=*=O};AnsbsX8sMEhxpJ>~b!p}&9CM0e06N59R{6M^l)lDQ zIf0EzbgfuCxd&chyiu*NKPn^dS`fI9F7D3sE}k%HgygDv{w}%MGChUtrDyC7;n((N zE^OUvoD389A?e&0VR!o4{N{z+QEzm?9JFQEI9ayQri|?)_zUS64)I6z&}mW5;l!ac zR;DwKxb|Dtkp}I&?!v9}n7P^JX9XKdHxmrH*R;-+%hzURIo}uA^Rs}?#?v}tUi0a# zKED!da2_Dh(R6kJ>Lrw8Xc&}O zv1tsg$hK@j#I0{JWaM3Q+eGr@6lc|O>&;lh$-}<%9Y1=a#e8Lo*NUIoX}c-xDar6C z<(B|_1yeNe!QX8e4G@}5nK(%FyRh$4Mo0bzU8F!f+=4QY4}q<%d}Us@j@V9?Ub;dn zcS#bkBEb$frbhlB$bvzC2A#jQ+sXkoDfwf#NeUlV(jgJmqU7~v^b;o(xGX?byB$Y- zx0X6qjPs!~V1vvAr@kfh7GGKH`0cg=Ay}jk+OPgmAC&OW)Gf9YPi@bqmGKhthrQJ2 z^f*iQ-#2Y0vt6<_ZkK>mtS=xbrfzhIL#rEOtW1(vpVz{%&_&|nI_gH=#soD)LI)`g zo+44l7OEu|!G`;%6dMFukZ+jbn-ug#l)jIfwOt8(a1*V4=rvHJDw~p(@xwALZa&&5 zeElvO7!>NgWkrd(=^bjmm*Eyq%U?8~HG=k+-k;bJ3L1JXyK~mtQXzHm;jos0WkUnp z7V~l5#OK52bRCQTs(tjT|1HG)bIei&#^>k%=JR(slkGNMFje^wdSQ~Gg0E=6>TMbq zXkn+?*dw0y-T9%hd}1O|iRdmhn8_UA8w=8>)FacDC&~ftv?cr%ll__$Wf15{Hcj@d zuwfW4P1Eas5TJXCKc^psAu^uLOOX5i?BiC4R3ZBt^&{QF`4YmM=hh1C71v4y2;-9s zY=6rke-m5FrdX(e&IjUtlEHVc@zhxvbDF@ci)Fsb{_ThDZ3+739B>U#`{Yn!WUr5? z`0ukS!QUFoX<3{jQfPOfjXW5m#y=q}W_&4EF2h9|`+(J|)nkI$hJ>LYvA zX2Odaqh%utBlF_Q_uRE_H2u@7v7G->P;kfg)8B0vmBOq_qj@-XP%qmV1#q>waR^Vc z@e7dTud!Q|HgmstQd}_9+XmV*E^K#lU4719(J%`GONdX%$NP={W-BOE8dIHnGw%s6 zCiZrE{)le{PHjo|?BUp-DWjruf%so5aRdGzW0NAdlTuhgKglm-9IuN=>6P#bw?A9TD%$;R6! z8VU$CAf%rPK90J0<`>h8+Rb#KtSLZ+iZYmY0{!Z1WgQNuLLy|REcFk#uxr9{tcz#( zCNexo$A7rTQjv&kcf;(z8PaBiC8#6D-R%sXPDp*xgL%2${_K&xIR8)3qHp_m(6XLG zpOitfga+=#1eeW0Oark>{xMs5^s_K8DO5{X?IEBmfvBDFh(AZf@rn;I$Ewj~7t(Ol zeHZ$`1ZXSj%%)VsVgQY$HEk_jDb3Zpw!#>L;M>eD%b_x zpG0fiOyxjlyfpV)Gg9XK{=qoo(PG6*S^r>ZvYztV2w>SgWs%0t4O-m<`O!2Qyg|q> zka_*Y<~ma8#pE!YZW8KXaqZOsIpH!x14~ZLXn@L$fdcCn%=seZHk7y-MT$TJE88%H z2MP`JWMTHDpxVDNGF>fvsRe%csNBqqN>P3$M0BKuJv_jir3LI3F<0{g(NqiH81XI$ zR)~+~Bq@c47nP)p$w>00btD&r%}7J#(?({~`3|7D+UF)C^1{;l^ji38$~Lyi9a0Oa z{Mo8uf4EVc9YxCAt5{HB%sFBTe#la73zR!_e7vbBwrir_b#blVLBV_pdfG4;OFlqX z5QDM$K^rLfiRsCW;I0u-xxH^sx=(L)v4(?!g8nvxJ_7G$TwEDzeEj5QT%2kg`X{RN z>sX{6Osub$H31PTo5;7+nzz%-`YvUF9I={#kY7JgQZ-vfWDSEOIUnI3U6Yd(3Q_vXQe|gP~ zs>(-Ij$O^V4>p#sv59@CSe`%H%(}#v@hEU|WG&2Y7<}4TZ$ZD4%o%=gN^G+6Ln14)q%#kseMlyTAFB{&zJv-tc>EVayiwzRJ9DT3k8DZd5v2`X zIrE(RgDU{RBP+L^JgIKF|1Jxqv+^NDy0hbMBs}6PE7nPWCCVWigH_-w-oKslzJCc; zzDMN=jVFmSS6#MXoZt54O*D>_@H$>FGTTjx-HLH?EZ67i+FQE&Q1)hvA^LgtcMaGI z@NLLBotV>P>g01%8m&h2D?62`9JV`VNlSNRw`E-8M`fN}J<*q?gY!gL>VLaGF*!o> z!9`r2IQ5gd6U{45fP`diC9UQw{3v4mq~gAreSO+|u!p14jJZ**QzqKT=QO@UF1Q=aDZ1UA6Avici5`5YihK ziJx%|HGYm@?~xcno_^peimL0raU_hd zwp97^)bCAPK9USmJf+?Elk()cLHZ1VwgaivpTRpbRZ!s^&oY<+v-!#t~8OVssg$7y6{*zJ(?E{|GZ1!Xv>tWrF9| z7juEqHSz6`I|$#X#(|rL$xpck*mS{JXWY6jW-W}FW6v(A)RLF?X&ul&wZ=w%Bar0cj8+Q5w>z=2f80R>d`Lp)H=RUHT z&JQW`vTZ$$apMzeSrq8wdZm5friq@s-JEk1pD6$X=~XX*AVRiun58JEt#+Xrv=g^PBG86&wsg<6z~ zL4kNc-apW$O5 z`)bdHlJbr+94KYT(x>V5$x$*xR-@&6X8guHCF*_>vaTe|@An_X4EbK2mt(-}`Y8mk z_02mSpKqHd_|{p#rm;%=UcXF+ zVBlK3SteGjTdECoH!C|(viU;MePZ;aU#;AOFf8SD+^jl#??Rq#Aq~UVN3zw)EzyB@^eQv@n;Zw~g}9Du=x6K#>y-+R^qavGUK)>5XSOdOF~StCDLOWwzSd zbEZmmE_|IGMHFP*K5U*d#hF&InhNsNjQlU$?kDE*)2iPn-Zi-W(y`!{(I*pNXrO93 z5gfZ~oSV*37quFiEok?(Cs(-T5g#{x&LhQCPd)Rsh;7?H&pAP0J>>a}OIS(18H1d@ z9)XSCTwLK+Y{6lLDSa42_@K4_D z20DghtgYW<+IdQ)=WYfveRDUx?q$-2q`A9m;qzaK7p(|`!;Ph#q$O|rY6IFVu6}di zE#I~UHsyu7?-Yj@Mo{WL2Lv&`{MX9m&%^%KF@HJ1<^U6=dJ|H$mg5kPE&jkQb_?wx zspY^^di_&Of+Fx?zqHw_Y|Cq+RBF(U=11Uln8J7PdAyd4-*UF(SZ#(%u(Di?@&5Hh9x-a??ECeUG2O78F4j}{&!GgQHy9EpG5FmJPclY29!QI{6rB7#OpFQ(^ z``nrDp0)42f85ioclDyEuC7PxkzWCx1+M~VlA;o#02CAypab~; zJUl!C!pm1kn8-+oh)8%CuTe3H@JWb?@CgY?L5x(SWc1{Ogw&ig^lzEj*w{#@xcRwQ z_!wE)Sbi@8g@Ay7gouQTjEu|jhVTu`|Lqs}CxHGE$_}aq8j1{ffer!M&E# zg(tJcWbuj4cuD@gq8&?q>=eYRXXlIX3L6I(51)dPikgO&jh%y&iDi6F!UnOeQJnoI?QfL*HNt%Vw&$V?LkSE-+jTy7FoS_zR4o%3E%Wh? zv9D{c9?w1D8WFwCHeDHKN#p90|SUmT`Lzy*IWi=_+ zHrF(&tLi1eP=tuigR{P=$K_5gopPt}AwFhAlI5a*2~yZEyfMvWC`BPEM%!3204I#l zUWq}kGJcsZ)MczX-^z+&imdT#RneU*OfViv^O@e&v+49=YwG)6tw@J&cqf@>>ygrr~Z>-?# zzh>j8Rr?TA$a?r{wH%ttgz19N36EX>8Do?L4E$=d1_R#qVBkzKO@|@NCH*LBo_#8| z{Z&75BdI)v&VrNA%uE3mWyRVs%K(v$dh#fz^f^a$OcCAPSEpCZVfPc)4rS(EYF^*% zCu>fg%%49DZg>&!FU&JW8_Y0=kG`z^-Wb76*F2sD%LrZl8+Kv40H^haXvnnlH452JTpfAX{8x@h?k%$V|y-w7o%qSF+_B=fRrk2h2I`>Vic{UUvdj%-Hp4LDb1R-NF93;iC`*+ zxCJ7dX+MiJp+3Cq1p`0$T{HMy%bce!H3hY*)TJd?MtwBIaoibkUqB5+xhHi&P7muf zrh6DLusPKBsOYqICYOVv6rnarA+P-LoW<=z2=Z}_Kg}XJEqSB>1Mkuw6BEEdNXc^> z%24mV-LWg)-*jT8)T^WJG~wxm*SV4QGi~Ip(lZ8RD>Ba?2O$Tb+|{jD}{*m|XeM(cB=-;%H{UH61-<|c0 z)%LY*_ca)ZWq}y>XU{K0-#tHRj*^dR$*4i}%`G7P6by9Y(AgMHaJo99;(KLFzWuR^ zg8#=oCie>Qs`_?F6fOQmnsff&p#ox$5WBe={UZyNJeFUbMkkgOJ198Xs)^%#*lJyP5iqo@;X-q5yRijX_yR@>S2f;*mKPEBEhLw^sb6%{zA(9{yFs)XH7^OcJsV2}`MhHwLG=3nW65{XLA&Mp1}-W{P*tU#n?mbQwf8AI~i zx&+6EpCFU1(1P|pa-XP|RM8RUb|*a?$`gCa@bXR7=cSst0k{zpB;PrL1#}^w~ zj?@MJwMs~~(C}7+0aT$vc8topbsMGmAr39h1jR^;a)JU?DU2-hW2i_NpMcT#=8_v4 z<7Mnc63D%C7S)*`pEorfi(HnY)y6dSKHhe~W|T{5*&h{7QF3PO#(!(ldfk(i29Z?g zI@o2v*DG|oV4X%vogZDGCv*Hj$xfvCtsIK|3N)x8WPmgHeyX^TD$(b-vT{}fkM8UX z#o*CT0Pd=OnFJVkwbG$|i2w%r6TNN=|7ePiKyTtE>^qgcPsoquiAMTX(NN>wZ_5}fXT)vkZL7;S|F`@a6ah087We-y*# z-`W-h2EHrH+`InvNm&P{hn@fAlJcZh!2r80*k@zs-%NG3@Q;D`53iC-S)ll>kv|C5oQDDNW-qc`ijk?LZ^Jg29GO zgR5;{w+k)ExBLrPh|R3c1x{}LRd@AgcKp%%{kM5&vz9wBARN0dnCedTCqGVt{7Cr{ z3$6CMv!eLA1py&ZJQ`LPvDuADez1*H{WwZ~7e_ zVlGQYS-5gk^)#hJe?hX!iVbta2QI9!HI`=|wS3QNRM-}{TKfdX3hs=S5bD}qy)RIr zdoDN3mM4lt$>G>lon7Adf(kFGE#te<|De67DuTzwp>J3rU%J9l`FiABomNp?ZkJ@1 zNASA$y6svq@;d$T`6-p}q^a&?!+B|=>=SL%=aJ_TF!0q&@&Pq@=PCJ6?(T~b z$H_vNRWIH_2yo%`72ol|T&??o{+gqpmV}l7_h_wwhJ8S{Z7h=_%5r3pFg=-Me;_A*|Ri^cxJ6KfRQG z?kBfj@Uf5DQu&V3#CVK5@k?yitTm(2m5veHb6dPHEUa%oV{pw?(^>)k4wf?ha+L8N z!u(6$;uFj&s-wj8#+ZE!>d(Kwk1sz48E-?)RrI~*P|ozy*#!fauOP`tq)a&&=xy}s zZF@Z1doFuQOPe%JLW#_DZJXm!3=d3=WIc@E!+tczn}@TFotgXvAEJuGuT35VUe0S$~? zm;c;Arax?ADD%%_l^7X2i40Rrp99LFqZjK0Mcl^>TM;G{4bdAh97v_vn`mM%=p*Jz zm6u#u0f_CGW+5|GwU{~v4fJ2KH`DFa;uLNZnP;gpLt=cRzmvu5d&5cO+|LNj zIC;}W1wbLJc_YseVB|T^e-x z!W&L5?MW#Wj?{Hy_wnoU$Nd0KSP30WxGmr4Ho#VC98xTR1OkIIed2En-^;6QijI1aLH)m*(OQiYa%~qbA*Yx2rHi* zcUDfrHN$yTq(~5IQ_UT*QnYoI>*&`&_B4v9Td_5j(5WSl@6Kz8lh=^7mdB@AbMKTZ zRQ5TXZnA&kPxe#p63~PpXP5Og6NUjM-&#*@p>VT)IjXxF)JcUJ4o_9NR-m3Z(cSur z&A`{F)z(KG&(j5|JJ{tr3iLE+1G@?)PRc>o%JFgoyGn@hHH7}1Z>0=hHt-q5^x|=q zG|5~de^SS=MS94q8`V!wg)l{$GoZimCl#^AF6Tt+O93vn7uVii@zWo=h z$@E8@x9Vm|S)**WjJJ2uzLE9(W*b${jj;@4B_hUNRw{z`!JvlA2R3PH!4O|THGvg( zru%SO9bWdXU|hjy{d@V%1leuTaIDlSmE;p?Lkr%o;W>gn6k>Z~*BUWiy(2m9)clHs z9|V!TNv0zdr~Fs+1=X4w6V&R)GbTq85Ncxf&GWmA-ebkRFZ*8n!=tN$)?FWO*kEs& z9s8zYkJCO}RL+aydy~K2NGNI&VYZI%N{0>52LiZCO2pb5;Ywchy6YLzN~n6=VJnWx zf{+NI7meXtM66e>QRnt-O>1jo)#p1o(_eMEvarci7f`o%QVMauddJN@B8?bl4aslS zke9%KmiD&&g@<$ltBQ#Jnx*Jbp1*PWpaj8ys9jNbbgj(5io4E6!IASb#*xO)gai%_ zo-b)L3hH>vPO0B|o2?9AdB4yn_2|tnNjUxTb$#qhmmC8cNUoPJ$RFD3)jlo)Ch_}n zQn^AGGsGuGenuurI%o$*MzR=kn%J8((^pa+*=-(#FWy1>Vz{~b*F3kC^qQ7y@AFvJ zOkEufVMt^2O`pNYCgQd8IvaSJ{rYuzZqEj{dIbg~qH`fa>@Rsm)6nX>r70?cBugru zCH~9dvn>3c48$NKyp-#k8)g_TLoG$BXTysVTKUQ}_zZqv^jewh>n*uU~b{4_%r&a~#lykijk@w6`y zSBL1O&dXJA8~14o0hrUH+NdPOmT%>Ay-cYXBF-$h-wWjB{Ejtz?Vy0o9d5SOqqeKE zI};kZqbJj6BaJpRLyTE5%S?^M>QjoYgICft!FY3UD~yydk6~ZzaW@KfaI(%E`f;0E zC)R5x)Q-*NY#61=&u_wqngHN?9|`k5O}rM?*w-=BI_#2E{?F>LX&+Qcmm099R1jX& zisGX2Y;2bxD|E_g@7eCzx-zQ}WZ2qbM&o@c2+@+vWe)DksXV>P z_P5hg?HP`fEgjh#>S9c$MZearLwL?bIF&@55e|zf_wLURx+Y)6{Kr#~?V7fUi8Se$kTzCEhu(}YOK=J-bc${)snc0eK@<{F>gWL zLfGEyx{NKkEr>o-1o{_7V6JDr`pU#9;-2+E-W{P+$r@3T=9Yi0KYe^?p=aU1_%wmC zk8;16qPwC`*+cGpGwHWu-ZfE zopi3*mo-HST53AxHRnZmx!&^CmXKwhMGb)Ddr$0MT@e!6)sF4cz?L^Q*2Ej?Uk8TF zWvRlUyr78=Aw1fQA3=rYLzMDpgVk}%Z7Vsp{dFs1dCZnP^Xo^_F~8CJ_PTThn-A{b zR-bC*8)s1)6j3-hQM%^h2XV)5t*IwWhm_Tp%O7Ru`0S|otnBIFey*-5Q>F1JFp?)`q1G1$8 zJzEdW$a#LFd_txurSZwu*2P8*7eW_rs$3=p`v#6!Dwe`mI1Z5_P~N^{8dF^-(tptC zvo8LWIKQaMm7Mo@b>VcibL_CO9NOoYP_0ZfJ@lAqtt z5#WUh7}#g@Iym-vLYfZOH=%JU=S=5Atu^g>cth7J{m8O4GPTyKP=799g<@FcrzPc{ z(=u5-muJvj)tT2UMWA!OZ=|=u>jLXW?7E(J#-e|kB_Gl|WyOxDeqgFMS*%+{A-o`A za3RAyIz(<5XCwZTgk0y`jw_$B#PLafewAXYHL3LH&v0n*b{iHD9ohL8>-xd4h)*aY z#Ko4EY>e#es!8)B^|+EDsS4MI+C>mJqP00#+N()2ZiO1UbnOD6a`jt<1(WuF`UfJj03uk7l&Y zq8VDhU!UE%YLw0yZUrp`Ecry)*a*okGbAXRzJ8!3qK_a=qGI)nJSmFf+k6`9CBD2P zk+UcNQK*(vw5S&7jau`rLj~da^yreD)-zmolAce*(Xw__v$`tXNy^LkF0^g}?w$Qa z$}@2yr?Z<=q9;~bg}aw0pHik&1#&$M_v`92x6A{i{ z!Zj~qOR@O2IOHWpy*z&q|ASugQ;h{Ar8>cy>Ob0gw;=QQ(z~rhch{+o$2Eq%aomvS ztEf3alR8;6-O*m%u-<^^^iSLLgJk;W0Ne(>g+9Kde|x=70f(oS@#4;f}IhpZs%nQ?F@l^$z|w-mzf7lbIY05am|i zI0xr<=4sC}OujBQ8J}+|79?X>5JAQi5(b<%tqk*+qX&Aq+ zd6hO1H{+o>W(i`|GMokiT8BZVuOQ@HxO>`o&8PGTQeTG@<(kI7-Jg$^5*HE+R}6U} z)`zMv>Q-loQl9i})X`I)A$Vy^7%R4y_M&GGsh9woy94RLp}5*l)4i#?a?)YfSoQT0 zD!<=AB?%3;$ZHy*zniqF#N0j=mV?7LMOXRLyXDWPjCx(_84R_bz8KvFY(2D5x34}f zo@tE`88YBmTOU$3TwoSQ&GCu9Ca3*8&{aWD?yO^AW9ye_{ntC)G zo7j5t54(;(Cel3OnA2A2wBL^1mNq)4N{IEJr%-4j_+mNB#fP*CXlE96Bos0{K7=~c z;k`ce&b`?{YOt^QaszL>Y2V9Ezd9pN7ww+EHz7V4>J-qvj$X%C&&qK&;jNsplLoNu z7C+QGCbaq-o*cfZ)@*f9Q00peC9dg$8~Un z#DjK*N&8-oEve2OSB0Mqq3Bj$Yv;J{lD7#Gjvuq&{Vwc(!iLZZj1cMmD?a=3@w89H ze`u}1w|2KT*w*j;2aCONKKn{XFRRm-C(EmTc8o?{mgz#_|5;=sLp0oM-_f2GElh{9 zIwe)_Xk2Yr)lwO-GYpboPww;OOJN+NO%%V>x;i_^bBF`G=m(&5A~)&ZY!+*#Pu4JsfiR=1#&EYZi+@??$sAZSn1X%<&EDe zHC9ymb?mp=iDI*hM)9Hsgf_?` zBFYZU0!IC-8r?xR?>|AL5IMrqBA|r|zr7POZF4|la^UWz%ieDzFK&?rLWqunD0+%< zY9}7#NQTN1F>e09lmSG|Rgds2PAoDSE+jA@YEBwSg;*__=PZ-#1kv(Ss4pSD14?Nf z^U6thbL&bh?aw9sz_FIhfLjDaN|;dmMlN zHzhnHzZiGgPL~s09jzEjtr*DSRbIrQ^O927xZ;AsNF;%=%!V?YrIq%lP)l7ehET1Q z?-WUx;VGnbNgq*}Rli)CFXWo@9`ejQq2TvE-Bv=%?`{d8@HdhQ%3_uxwt~9TZM!zp zUMJm9*U~NYVhJR}7qvQTUz9e_&eMg(c$oGtcn9bLVpbG` z*CqJO3$q3m$dy9+a4fKYKJ`+)>LvERS9tC$@%pt^?6nfg^emQ@3O}{&G^HSy=C00B z?*o%2hqMp(tiM(}3>tcTV?812 zjj|x~&B)4obN}Rad!|v#BI#}Dlzw~~D((@*_mS-`d1ZmeYLcAT z^Yx~0^kc-KQ)1qgCXR$RWRAGVmVHqrudHhtD>iacpK5H@4FB7WGl+o^QF85UsV+27 zY}deT)q4%&kTdDQoo}8-GNCcMB=br`n=jsJd$O?~)Ya2FisWaqh(N+~yis4KPz-4+ z1%Ig=yR2&+EXy2%Cx3>?5>&KS%Pu4E=vt89er_V9xbd@A84a@xTmX^-O7`lzn;!0NkG&NmH3| zV4y6{cLCN|#j8(25e$^}gMrNHYIB~>=l4lvPfjvV*ww$2_Tb}ieCo{XADJQ4z(1ag zRH&LK_0A-t9L`Y3&+*6OG)wxvL$p;t^x$-;@c8?)=S4b_(|WVyG-PHS%kBx;(;vjd9Ehy{{HW@6&QG{2P{vwYJZ!nD z{#n)V9JJJkH}|P;lfWg@rCr%2P=>j{K~&@C4B!T8WNKuABh=hLDgY#SQ&H zk+d=X`Px%pWgU5|ds67@^w^Wn(p#t6Ei?n26v7*}4LK@1En-WRgX(bUD}tt!$09=8 zZSu&aR*ko#lS(zNOKE`|33g{{E@ko%zz>{~NW>^34iJ@#1aLzABylm$FIxG7j!vYC za~>a}cYdzTvlOuzQ{S)3aPcrN?DI)P1Sx%hlUEExbA&+?(?dpUFI;RVJaw5-jK{;| zvjZu8EY3DS`+!RtamBY=Ry1^MQcCqlcOvj#J<+7{>%a5L`0u&Vl0=58G-=PTMt_&($sT(_{+-E&w6CC@MTWhK2#yad7PV8tYdML@D z)F_O4zAy|?)Eq311bd?GXhTQjv8E6cj1Tp+m_s>2sNQg_DI3rwm{3-Qrq0aErr64| zO9b_~J|HRIjE@7K(QW~K?vb}VQ;j)U^X>YXDr)NL{npm7)wUu?c})0)-dKG3$z)@YZ}vx24y#7?OjG`lt|R7#7CN!=@c9UB!ZH{3jPb-n+LOTIO}u zq{>m448}G*{ya}{HMFlLe)y23x;#%9AG=N?SRGGYbL*_SqBc9Pz`VMbs}YStaUUaC$u|P&uYtO`^fLaNY8?GfeMorQx;ZMlvS!&bt)2| zcM|2N(kZ*WTZCcgeLJ96`-a8?$GW#Xh(R6_u*Z>xI>Q|4G#?VR#*D(6sfLuLUi$f* zg8}ywU*-{asfD9u)_{5P>w{32oOF-U0gDBjKX$RyT|Fi#0wNZ#(m#!Rh97;fISNyjWN7&gu>pO{R%1i4x+ z#BeQkabIy!O~)?gYkzC6jT8w~G_hZ?F1A$FByrgGp!Pr>ndT?xss!A z1HkfG^P%MGd5%GtuV9N`fYJ-ZC;aJ?u3EI=Tw#tB3u})}7w8WLt|cqmF#5KJMmsS= z{P_(UjkwqNn!_XY(>U19bVzi`$)R4DD^i;kKq1f1ky_Me;3rA_ari}Df-_w`M#N|Tb_%;ra%irs z0uCo`rG~VPUYvErC)(w`Bs$d}0yHVCt%gjPI(ZrceqTH6(26$mN@o&BbIh*qbEcY= zlG0~;%JMkqk5(i43K@PFz3dvov=Fq3)BN$eQ#n_5ATOt*im7eW@U-mdYxdtPW1@KQ z`2-Q{1E@POhbgm7{q>BgI7oU={o@&-LISv+GV z9(edrSNvGBBhk3&bFkD2zsmEVn8l|%x*C>AvlqF_1v^67+x%c%=)MlB6AuwW5^Dnt z)+(wWkpFld6*4Km;iqpa3DeY88Nc+x-BZ|iOU=n<%F`&6cH|K)b?$Hhd4Ga)DL!b! zSmX@B;I*{kA9c1S%8mD>R39`}Wa8qLDu+rrR(i$PDyDWqov)@o_;{==>Ka!U<`{5B zT!DmRyDVB;S7K@Yje+o2y`nJw4?_@!QzBtGL3!d&!}u)1dH>Dp#(ndkaZ_=tWoi|B zo7J+u3_I3df^Ro{!*2eVVp6W^7xnyBHuFXqB~Ps##~Vs9>vY4C=fCE@>#0nUvs#e) zqc+{>V5mR>nVrHDK61F9zseDyPj3V~s++Oz?hP2Y9nu>=7 zg~}%ww;KJ9N$wlnzp9No#CxR&pr2+3JxG4g`YCQQd zv|Y;2c>QT$QbxZBv56DmCuRK;_J9nQ$%b0|lTWqFpF%2ZJl1C}Z>(Pg97oV?^2#;v+BF4RRH zG4wiS?PQv+Ko^c8{YL(E96W9xJP`};=lPbYO)d6u(i%JAInB1H@oy1g+Dul5(EG0K zJu;YeS_Dlzl*yRN+Xo60M(W>>nec*=WWK+(Fer=~f@7_VKw*~V5y;Emw=;7qDNXyR z1o1dJvDFn)+h{6%N4Tp;h~a_IRB68PV1V<^D-q@Tj%oBUf?PHYbo!W-9t6QHpe!~k zv}|RKdO&NJBTcYr8HjlpxXO`X3DOpz*b>Z$t%W}D25*diD#>9(G@7ohy~YOvDf$uFXz9=eCjvum+r4AMGQz9G7 zPC6nJl`&zAf3Eb_IH)TR&t;F7kbkEd(t7KSJO4qqlQ3lL7lW2L@9?M3ZPg(Z)|HFu z2g=IphO_o$B4lfUf{b!?=ut1{)m+&^5lSD0or`v9@=mU`c&t~TE~ zaqToGwKNYkrcN4XzBF5OK+^eRe0XpOGu($*Cxb;PEP0Mc-dxq;LNRyKHEE9dWiT)t zeoUVo!%aVAHpZPNZTSrtZ^E!oHx41s{?~e_-)f1_BBF(~n zcARO#C<0pi_L?ML-%QdwgnybiRCr%ILto2r6WtEqrzh6VajapodQk z|5)K$A7nrc&k$A_7VpB-u_GC`kuEa5YHHk|&pwh_^*-plIr!Vf!gkLu6&l{)er{0F z?kjg|x|LX30evmyX@10X$&N&m`h_3NBB;K@!i${@;?a=07Wdk^gJKU<8w z!^cYhv9LVv;{LIAGWVivtvZA^(HVP%`W;@S+vetWH63ebLX;UX&bYN@iGNK?_cxYq zfE%5T^oVMyIqb>{Umdnwg3R77_a(i4`yyz_(?pHj(TUUWNnU3_= zSME*jQYG@ZIW?)m9NqJ~s5WBo#NSK%wx$fK)lRJPKvm+suBJ8jMArX$+cUjngZO=c zc5jjLCh;9@&&i7*NKe}pqkpDtGRowcym6-5z373Tc7D2J>zHt1rJuD{C!X}hcUi|M z!krqY&vFA_52TAYFy%z#zW;8tLLMls`(Ijf{ZM-T0dl>cb?l1y+kpwTh1%vy<>>dH zva|aH{d8)QkJQezE(f=d>J?$37*BEeZzReaSG3FYIa|8s-^+01BdVA(6Kx zr1C3LVlwTNK9W~NBJs;>69fkE$sxI)-x5BXoQQENn$8oh z=+{Q93_VXJIv>h5^v;d2hHX$b-P5q8ZHd|icKn%Q&xAkdgtEQ};|Eg+ww~*x%BAz! zhlk`Dc^gvDF%ua4XB8`|$c*^#8?hhp!1>R*mUY2^|H3{LiHt?gzLaI`?+?iY z4UBHx&XI*Xc@&R|8DLwwQ&_rRb4ZetzL7ZbewSGSsSxliJc->yLeEIAD^GX`w9a^9 zJ_M+cRmJAO-b%yK$JkoM4Ugc-@4xfp=KFk=ymr6^3Am9>m6WR3rmwGUx-pCE8AH6` z$SX*p-{F6j69L|EDO{E@Ph5?nwX}p!&To#x*Nq=%haR5#>)UgOPkil@%_4_)lF_i$ zN*6&C^AftO*s9Z_J415IZN*Wj44dzEk?$SCkb2Q0==dh+{i}exPg?TD1m0XPAP6b; zrY8g=Um1*kbN1F0<7(4PKc@_4hI;fWcpZfEAMo4#ePzPM!%{-!Q+W~UqcvRb;J+or zioN!>4-8i!kG%2e+sHwbLbx)fu`fH2I>TaH^D>6bj|W8zNO;GrQ--mMR|Kgpz}qZ> z6basnm3fL_I+QzdS-*0DFfcOUsPx2xH+ymE<2YNaj3Gf&I&%ZPGU&-%q1~zWnj@(u zCmVfXLAdZ!g)j!}2SP&H2w?NFzyloupM&(;AW_R$xR}4!HpFG>s)B)QHQ<5?$7JRn zbR#}JE@4h;P3x#p0OLSaaX-!E>yRoB2Bga;R;%nmw*Jw5cdsYo_q2t_v@(ay7%WRl z?1x?%Yn{0@9Vl0xW)EbE-yXh6ljA=KG#|54VV2J)F0K|MS326LmgD-ZCwIB6|*QOA0Zo%rZ zgy+dmOGRz5eAmcdBXa2TsStAYdup->>fR6G?|p7xT@vdS=U^4brRxW95m0xxylzXR zz?9Q6-Tj~F0K8V>DnFUi={Q4kR%vT%V_`l;Nk| z2df4U+12F_lAC!{|*Mc#^8dhLJ#2>!i&3-V6%1LgcLPOIRP z%9JWre>Z)jY%6WCHBD`8R4dVrOMUbj`jT(;!j}b=9}K)aDtiP22kEzb&0t`o+N*=t z91IBF?>wV23Emz74$nk99&T((^B#6WShafYt|`?~<(ozEpx6=n*eD?wUt~QMllaE; zAi-L;JL{ujm~FeUl@apRgbZEmr!?)>m6QkpEp@Vub~nqRuoKr3RA#47ZSyxE4a%1< zAF@IDi=Vh2gRv|2-sZ~LU6aB2ktHXIeIBQx6HVe8 zm*2GQG-4hMj6OF&4)wv&XI^P-B$ceDlI3cmQ_X-H7epQX^yLe+o;-R&3u9X6n7EPq zzoJ*g;eT2G{>pNHU7P|mL*61Fmoopf9MrPh z|D&^}6MQ}TM%qkfI2F1r3tp~qa-#CmCYun3k4Wj;R~#&R|As|-Q}5Q0+~I+(IZZgP=d)SCALdP+*CtE&5IZ&7_=) z!mU_G{HX-%t+6Bxeu7St9j^}3X<>HkA)K_a>fSO;TeG{mC$v~}SF0LkdGNH{W_HtL zz98kCtQ8lY4sWS($_j*n899yRL@gjr?V7?!tLP~tY9rXs z&<}8l4$HVzkd|d!-TaRb2At8@!HyV}58+|1L8umK)%Jl?EA};+4bq(Ar=mrCr|K?d z?M6Own-LqL=eTs(uWUi)QIeeG{~nrHQwBP1U&NXJjJQMY_U#YCjZr ztD72fZMj~xk8YAEU+}8YMUP#cKpiZAfvQKr+}6IVA8J{??hh z)Ge&O-6Usk4-uqu(|vVt4X2etjxVdtgMq6LKE{l%Elt` zYuk9}Cb`Cvc_ObZpcRDo>b(gOJfuy(7qfgvBn?qHNSs;iDG12}za`K)QnaKnvv;Hf zOa6duKS?n@%Zxj)5YjGu$Iv-S_sNpS)N&GRPa#UN1o7{h=eabOv zB}I#>opkE?KZ7b?$fC@S2)-IGY&7i9+*5L9USe3Ze;32hQ94FV`_hKjxRihQ#guKG z*SYMK-~+6x*X}~$VNrM!1ZEIe00w4h2f={ok}NC+a|g- zBu}D4eWDAfGp9-Yu9>)OZTKX$=22kITOnkzo&3tQSu~;BwkjY z%-(-K0bemb&w+ux1Y^i0;6c77bu)?WTafrgEe_yaL{$At$8&>t9f(TWFKwny3cs9j zzH#wl9je2&DHc$F;SbVtW{cpfe?B`OjZci+!ZNeOP|b_EU1{8x>^+=-<$d$73R73?&`)Ixp<_&FNBVT|y>r%TTM@U_<;Np8iV$=fq#}1{Nqn zdy4F#p)hCUrgr-rsCqh$Aufy_`VLq@E|Um$C_U}ATjwa+R9ic(EvK7x_a#SNHwD*H zHMJp9j$eKC{Il)Cx`T9%C<(UOKbEpMzv2|Yoz59&=O-gF>fj~VZlwB>azsmieAsF8 z{e{@~cf9T>)b%NNeB;`^8w_&Q2j=F%ZB>VU4BegYGdu=cooNL=+4cw$(%!jLF_&DE<_PQ^5zcD_ouuq=n!1cCW2l2gSZ87Q2F>@6;Bw^c=00+sEW`cT2~rwq6(foRHt zb-GmSrHl#V`e=GeRQhEV*@p>N*~%ZFB5X!COWwv*?auKPQ=Ul)FMIZ-tCZ_sPnmk< zT}0xFv)+tQf-Xe@T#I5@k@+r^`xjl#YK7q>H%W0h^L(|2rAl1Q;q69C=f(pbjN>S7 z;l1XK6g{F&ao4tItQu3~503AwJ+ec@y&uHm?KZD2^kXCO$>ga@ilwTYNIi%f%O)GPYyz<*^LfMB?ly=MT z48yZbRhT@EhR(J7;|*$-FSg+z7!h_NE=&s&Q>tKxG2jP9pzFEH*#O@_tm3WG_)J)IiT?< z=QPm58-$1e(Cd1#9JSaF>YxZuJbA==94nBX(w3b{c1b^|iWLDxRW;P3JyoNAk-(^1 z_h985=XCVx>k8z80VADV`PIoC;;r#>2gH7}6EL&t_aBkwAtiD9;a8C0?LVJx$k`IT z0r^KE<(3K0VT~n)e;O!=@0k<~3MD3Adh&C?8R?&AMNMz9>)d{Ux=iRepKXjwAp~+g z_Rs6iA9P`}G}j2&zA|t(Zi_kcIIu^OB}l17-$Z`s?)joD`<^J5NqpKe?MAe@T1v&L z`8G@%=AxQZKz;Ww)x=~ta%aqL944xHm9IaM{aE)KgOiE&w}fqWg=O}H4Y1zg??o1d`7 z$O4pgV~;d^1=l8`(QG*<>~}}+6t3BqwkeN7R30m!>tIOYTIF^*)Yu^nx#@eu4vmh1 zN~VQuy=RkG1QcQtfDuDjaoA|!QjJ~qsUxIbWSCm59N%Nffk9;DaWO>ii_`JiLGcpY;!RrbY z$h(FtqnubO*H)d)iEs8TfZdmgIfjmvP_A045mF%*w@v>>HbAgtbI1?N7KxU#T;_D| z@29ym*KTRe$8m(_T{Ix|&B(L+LzDLiZg`%_U14}a=P>!FGw6QH92GAE38OP9q#xYQ zl*omjOJC*tIjIISk(0PF`o$}WL_+(psrk>1A6ux8#!NHQWr&2($k8aFZR;ts-1+-GM$Lt>(K7EYMoJIY4?YU}ZNtTccSoFx2IM*H#yHR~* z`0=cdE4D&hcsqG|`x{j?!N=?fxxX9{u0mb(>q57LviIdB=qu^4n2TV80vTVx!c#;{ zLPFyQA(WQsCaHhN{*W4Lmq?nLLCSW=tLzpvw0SJI@AfIVKxKJZ z#?@7qWr;JHx~?jQk_GkylGMiy0$C)0mqcTu%;(73Sgu&bv<|J?-qwbsAC~3#vy%?-^4q!S?0#kx ziOmg1d!B&rp{x8VOS6jyRebl~I4Y&F3LZeY>z|PtUM^(Y=uy0j+NJ(<|%RY+0%%E@Re&FgRV`$eiw6D%ioJOQ&$9OV3<)KH8IuxiEaFg8*Z}`L)%k9ErBih= zOu6BkF|2n`EkB_JE@ff&vohy}bTdq+ohqcTnz6^aG3`CCL}USL8(_3WtN7^^-7X)0 zu5h8mwi){ThdP;*<8P!W_AA@NfXTm27b#0}bIbCQ#nMa!T``O3d7ZO*4#=YG(Qm#v z!a<^&eZfl(bCR3=2`~_*w1in4A|EsNJ$=?K@(DSq_vs!|Oy0o!FSArp=Vh9h1Eor2#L^TyS?E2$y)&nYpjTu$Hv3pACk9xJc znSK1(4^^-KG#+`#FZLWTtpEI^=5-dbkQqvP9eX?^^M}ztem|X62)*C`?zS?SP=}u~ z44s`z_m$fWq6RS)7#efW!xDMP6mB$|rk5~P5k_Q0J0O@&@&D+c{qCXxO8nbjZ+ME6 z!fVUCblJ+qV0@Q!4IM?D6dw8(VDJcX>GVS2l0WVKTOQ;XC|9RD>HU$D1ooxx!a!rp7IU28qhT5C`I^-QDx-xf^oQ!1s%>EfZK%r0Va zmT%Ui@)mBEUxyd1IHi$QWxmY)3|Y%npy}j47{mYG&P)0%?tvaq(&iv7)b&VEDtcuv zq3;b+x7+zh3ZRkNxbbmTG|Ik|5FZi0?j(FVazDt+kFgF3IS|s9H-)b!mgQ_BQ(Nkn zTwYP^ubJ|){fQAOlkheMQM%eXY@X5*k$RyFa;8t~d^h36D;uK3EJ=gz%-qly2T~3R zvI>c^&KvW@DaZv`-5m;_$iwVt?P*Kx2^G@@(;HC8k6mJ{L4BTY2Fmmgr1}4=er@qHxv-H^kBK+-oZbAUuAOP zDh_B-EJzE;pBGp|_;1)DEC2?Upnla7y!VDOZ*_BF60p>X|{@O#40fve06} zSczLKA=!zUYu@?-$2lD{>25ItneVhYzDS}Z@woXo_fUi+{Dv@Zr20n5$QObX#{<4K zgE{$>%z>i?AXt|1j%S(bE{3cS^?6MC^}cQOao9_-W#3!!EGn;Y@rQFpNh8lk?QilO z7OLm%XqvrPwUrvi*W;e~5u$^*xmI{eUfOeZWO5lY{7+i0ie>pYzEFQ{MkLSg4(spp zS|lB9_5d}mWv6)YTVI`zOSJOJtge~@E&p|Q_fbHU(N$eiUzyc{j6lf$p8^?9uO)N1 zKl|J2%n+a9&lKHp?$i#)mk|F-yI-Cgp}_c#&doy7dB4OUay+{s{z$WJUGU4+w`DV< z{vEILsyK6YhFcUyd(HMUUy7S}JAW=U8N3iK*?jT~E?CO=>{K`MFwWIYslOUhgpH)!*h*R91HLHcg z?Lq3hVD;H@Nw5?DVgPbPKkO;WuP!=Jt>Nl2ap3wNJWKM0(Zxc=0(aC8R}XcnLrdhi zhhr+rqr<)5s44Qa)aGgjLO=xtNFfNYp;@y&pk9qc0PbvXpW5ysNx_`CFd%Qb|C~Er zOZ!K^&e%vJq4L-1DrN|2NRt=tf1x@5mU9Gu^zUg!kV6J~{rf+bq@DWnK$59Luqh>= z_C%c)iMRVRhDe&2QhrTMCM$8-jiuJ))Z3>%I5E;2_j09p-GNkG2yd$e=Gkys{V7ta z7}(8DPeHnZRQ*1ZlCFiTn;E8KWo6*>#}sc3cFtWKH+c~&44OGBymg3;WTPHI|33fH zfI&aknc!JE#)>g=D}@x^6GKz-%K4&&&}0Y%H&|A_e9->n)u!slG}5-|>~+bCLYg52 z#;Ue|L5$<*-n|wciB8%lZMDZ(F6S=IZfZn%EZx{q!Z?`{x81wUZ9##Er=BEULPw!) zE(>q=^p7Rs*}^@$1z!W1%~cbm?c^q+uxv7^H1m-I?`N_8T@(NAJ5!`M#dbSR&K-Wj zT&86)(tAnZ*0{M+7RwuAzvdypUfcjpYo3!3)byzU%yn$>9O~_|P|Lg43>H7X(iorw z=e@QWqfrJic!M^L z$0)mn^gBmh-28~X=+|;KCY&eX!W9#A(D=}pLiGOfbT@9ITAU|YlVid^EEI!v^c{+( z6Y-AWvt$mK8FjKzZqX_>4tDsFetHnqgBJMd;O6$D=);{x((e+V3Ehyqm6hb{7}O%( z_uf@%Y>BkA0%k#h-RqPqStNgCl%T-GqEF#?E0N~mC$4Xz!@2t`TSjD%=P2u5^~(2J zP1pY{IqTFij-GTgT?mw}J4?M!Q(lQ`G8qV|RkhctVBd#|><(!emnV+$8$?*wEq7o* zH^s<~atHrCk)wDcr=fNyB=|*^u4cz@pRUdqEx)ojJAqUpJS5XO*BBXcpw-c6=_IiN*+d#hsLZp(N_a46pi*2A9rC$Oc(`X*h>~jZC*P}0M zh!B=UTTu3Kc112p3CK*_Tbn}wt@&o_$!|!aYbyei9ezAWeXY5?=zy8gljL!2OoQ-L zQ;|W&xLSFvw?|ftv|dO(uLgF_JkbJKT#Rpt6E#trg-A0-sdS!*8Z^y_u_l|4F(PLs z3XTu{%qg*f+rSaGYi}c5)~Ju^0AM=@YCJimzd(!ySG0M39MbGE)9kp6 z-qG$YXwlMy@7=u{6Xxpuw7;bAhWRiWHj5eEhr5m{hkn0M2pg?h`YSb`Pj5Rn3w{<* zBibU#IJI0AVJA3Nr<8vtBM8;9T6mVvcu2n`%ptn_1@pU)XggMAHyYcujB`2UQ`fYub?x$UtN_4}q)36kxpK)8`v)agO3VZ4!H7-Xpo@PW{`^apaQQk&I zP7q7T<@1*|x#yvl1be?B!N3#2oP75iB6JXXPM`2NnrA^oECK@3Py5%$}dgJmcQOh+{;-uSaJjU5Yg#hR+E0!j=+&8SW!H zh2WMvXLMye-y4E$O9M2!CHuuT+;3B{hWH&bnh|RZ+c%E*TaABY@G#TPB%ue3nk@?2 zxGJ_m>wZnXP&(IfGNA}DMOHYL-&Z(U%7afw9Q{jiji^Ysg9itj^J^4kZC;5c-rt-^ zyeA?0oSY@R2h`oX8HxuiIv6k_+d=6+MbztSFZJpatFfQorJ@9z9gdKUysYB&PYp=6 z#*)&!8scz;H%06vo%>xIWiGAywx=)kyBcAFUo-U4ujjfWcVh`rZztjERlyH9j}7J1uSKvLkyRv)t@z zogfnm;U|02?|y?V{USbMl)U~y(>;>V=rE6YY98!D<oQ+k7bE&Q2=DVTI@+{mm_;1xe-C@_b7P&ue0$k!V@{Fg@Blo zs~aoy>ZGfhG*S`XE`b>e4vD|3cVR<`8b`AW`FP%%mE&3$Gu?$J6><1|%f2S7+-G&J zj(@k&aEz~u1m*G7slC2?bItUqwxdg5TIJ<2JVYCHpRvJ4@$y`o2|%Taa{H%gzrJp+ zomtuN8I0|%3l!iU2qm4X*(KtY2M#ydh+}Pt2_2I$BDCxCA=cM+@wHI`X31z(d(%5> zm3Vl~VOCc5t*DT%5D9Wqod+!aMimB-P$eY0z-J8HutX?unt&+bgKt>20)`$dH) ztrmw|KL)R@Y*i&u^s5^Zc-B{^51>5%bQ)Y+HNfHj%TfH#2r~J#wtV0fv@oBJU`)5E zSeypcN&=GIuoNc#e4q{$a9l1kNoO~-fybAgjOPPzUJ50}ge0J%}Q6q0bq;jPfk43c`3#Ll4;qn%hpsWu9dP zIYv7g7jFP60g$qdwYOh^=@rwge@GAt@ZOCq6q%TB>$e-C3v3_N%uf@*hw5JpMI=ls zoZJT9?^N7xh@>#&b+Ke_s@YMj`{@Aht=fSuax;!sUY!iTA*?Ua=)yFu1i#VP6J^c{ z;~i-azT(be-THo!c;f{tiqjNX8-c$%QoIcn+Tv2hehv%1LH^4g*)tg#8Kpou{Y|Tj z@P#^}-csON;9AVij?Qq)o|$g&uG-00Qt6R>T~)a8aT>?O%ce_Z+uGZqmbU3P#M(pf zsp{8HVV(&4sVeRpVPC%(lZga4O1!?|dO$cxnvwp?nk(0=8A`u4Iu*WHNAq=%om(e& z0$O^U2Ti2^bfdZN(?mMjV+!NqA{E*NQo%aCsL^9bYe7kgGw8w>0;yce`3Rx7$6=(O zM64w6@So0=n)hm8*v1bQvE_54mF?~F*P~Z6`Wn~=ryINZ&_3d5?eavEA`_X%T1xHX zu9mwq)XOFN&N8K{tlEFX*h?D4T0LCe2-{2faU;b^4*KJem(Nz^ zz%n_8$<~B0dVw0Ws!bqkb&`tnX;ic$ey7z?99z}}WiZh&*KCrR=k$%MRa90pSIlpS zDZ$u;IO)fe`{`d8AD4VBIteAyO|>O~e^=KoP0V&4K6FiU-1{6cK4}g!-Ie?}RrO+# zw=3wua}1<1D?!@{4?-xckj2yM;F8JVzc4{a)Z@a3bwV!)1`-)6c7wm{9k4v-r7kf$ z#J9T_@c@F%k1jMH#dk=jyawClKDIzqjl-9t3w$CqP`dNy2HD)1Tr%jYCN2gTZc!&0 zA36rHjpsxj8b8MndWTO+GvLbYw^8_>HE;73TiuVhKeWWZ>m*Z|Vtw&5g`9mnIWmM8 zQ6x#He5A5qf5T;wpxv_ADyf5-ILqiiBuqdboD%G9^05ZBsfpyhNC*!$(Ra1>vZLfW%f;xIh+IW=Yy^J-vVaAdwF&XP3Qm^}ON0ABt21-wvT;v2?L!wQ5nVEQy{%jgT0$ z7Yj1n3^JkHm3MW$pJO$jZbbC$SO+2c5V%<`e=IK#U3|a#c@*jkCxBf^3g3<6x(pg< za?Vs7u-`Cn$v=QT|D~f@IkCCe`D~lgK$ZqAbSYKFn=&q<0B#2ysA^WY1;_$Fw> z6qV3^GJqn0`X*32O%e?OL9^}A2ClHCawVbQ*S$sRf>8q!)!rxpD@o=Ki{W&h_xcN< z&to+g1`1{bxpP0tOe9^Ck#(qN3L!OO5} zFG?4mtnje9toPfg>i*;`me2M#Rx8|rNx6!5L0?ZYpzlI-oM{Tskr^m_wTV}5M;DIDcdHYdGMmmo zO{Mc@Z{qo|xQm0GiS=xIKHHs1_=bhOmYQ1NrcbXlk~dj{uvq?kYkV;-*R-nm2em_m zHv+>i4 zG*p}eb6g+qb~{kwtMHxgow1lw<+eyGj1{(Sv4kmumV zzF5Z64)tWw)zZnYt@mxRVUt2p(o36xeP;2+W!uw3c+Yl(hfd0E72ULDz<(Am<5(DJNb zGFf9s{42wgNyD$t_J9UTmHtWt?3ajP0y>MZdf;y1RgJ@DUh9K?0ZSM~1R_-LpB_@5 z{Io3|wD8_8KlcIvLjiEkmzVOcO;qi)TTIP%LVi=23zRidq-&<=ljcFbnE{hpJ#9s- zg@XTVLTJym^l%de6EWi`tmk)hvJCA&}3#qeU)@Ef?9yLOzmZG z2M@}R{NN5r8hap%l{svm88D%T{UAfB&snVR8I~5UvAw0lMbwA+n^ueSDx2JKBc&|w zDXA6wS2lRwf3mU)x|RB%P4p4}%LdeK2&!Eonw8a|AZ>tepk**(9I&CPfDPRMZBwV7 z*#WTOv&tpyS(bF}nPgE|+uR*z&6XgXS8n#uK7J;}v<=nu0soA51F7)pk2{4)v*a5r z?PG^J&M)_zmYhE78j{YD3%i{u{b)UKb~1)-bV(xoql@t}qI982$mJKvJ+Jga>00kHVX7BSc_6u@{Cq`qOxe^b8dp~DQHKwmP zx%z#x!_8wC@*O|oO^Pjl2O)4q zj!*B9yCajn`2v1LdA%2vm&9c@ATGxg5HPjjrr4e;br!V)w}Kq<+mS~du|=ra+vT@IxdZIr^+VyG>RP<H!e$O;xtd@$`=(%GApRq6|kzwTb={XX(Y2d(ETD zEx&pz0Viw++s-d8>BO2B5d^A3Y%hmN<9;U)HOoZb3D0fohWSzJ|LjYge`sFxqc_TD zu05)(m8Z9;_H-WK7R}8ud!ry?SxQmh#L7@`*sSevKPT2{47#zgo>s;(pDdAN`{6m? ziKyUL=T$WR{l#a(#_H93&z*grYB>=JdZQ#_?r#O|Fp}nu?QsoMixaA&T-xvV0jaTz z6IwV4zrf9IRDLto`9Ru+!XKLc`o{2M?bg^)WM`6;Lk`?s_FGcqWrURHot zUhblI)|7ExY*e)JcX15y&k}TRi)fbk&>K%gek1GVfKcwVF9jCj=699Ybcf5&Fqr7L z(Bt0AWy2WPA?sGq^Y_EBK){C&2DrIDe`55b4~ht>Bs?uN#MT*UB~OY+)}chAi$Gse zXCb4DlLGL3Hkrg0;*qP9ek~)y%WT-yyR;&ZsH7rcUY%v()yDAFgNzBlK`O|v9i@SN zfvYk2YN58aR5S*eUK&M?(A$v!LfwQ(VPEhztDMR*?>9v0c5|*c=P1VKPeTjXEMCcM z0zR1N`{_x_rq*{xSPNb{1c?|voI?+teQus;HCOS~xGzJsTv9?amZruFZMMh(*>i4`jx^OSw)doQMRJ{lAM4;!<1u&d9dLY#9;U6L9 zj#RiiR0$R{g5*zJ*a~lZu31R^_{y|LPF}X1w0-Y}&B1aaL{0yO*_kTN$(y;#J@VMY zuhxNZS^>XMSd(_ZX`F>6^X+pd=n}}*cE5`S+bTO%m&l#LSc-v-MbjbX?;|Gm8qZiHs_osi-1=6X82tPVeQhk1(#MTS4&U}~n^Jfd~ z4~L_=r@ZXk>i#%eTVgco@UD-b z!Fxp1{Wn3Jho7~-L3?Z|SYCKRi$f2 zcOsrx-*f`8xR$MmKy&?d=w-}}3E~2Xv=it+VE!YB#r%-7WNsFhjFN1}W&JIif9?o?2BQtqj-m=W-Jq4VV@;mDO(MLKr8augmSuLYf=z`9~=J+Op z&eWShd%Hl9ZVxF->_EiH2e|0&V0qc7*J#PhRr8Bn;;t0>ra`?-Y#EKZXjo8 z{!ReE#KttWvEAPD83!`F`XC|tC~^woEv|i;1n*FO8hRiNo}~bFc~9{x5j~lugh&Rt zzy4*~bDp~Of8b3)4$v)d-O{oL*00l3Bf`gkUwoZLqBFV`!8xwsqq8zX@Eejb8KeLl z5FL=od#84{Mu33{w-F+(l}Y1@*vakaic?Ls0xKTpq<5-WcXcY5F=6DkHy+dOCey>jIH_#*0WQgl`?_rG#3D z%ovi$^dGG(Pra(q|8z_+?J=kEr!Y$3s&C^EsdoVeI!{(Iz_qMD%SP`BEviL4O-P>e z_IWrkN1AWK#NVk`p9KwP|FhFSTTp@WN}J)3r@w32{tc-$;a3)GeArG#6LgsKQ_{vJ zQ&$Y7hwvRgn&2n$*QDrH2e0-Ty5%{i2;D{}MRothV2WO@(SN}EJgCi0BS`$B)z$^3 z9b4?ckWg@gdVT8D6EI`-1Mt6(Gj~Awuy~XBp;gI6m7mYW*X@O*NOsxQgkN^~9+!yBxO+J38p@xWsD;$9?n_ zIVN5!>(xUNSpdlWea4mkY`7q0UHsV(#~`ElSnbA9*@|_gKUJVwasjiOgl9YpF2~`E zDMZP)9Hivknt~5^!s&B^rENPEzx+Awf0*CY(Vhy;)IU4;-;%oq3g?~q1;R$^_b&h= z2G1Q3p=w=lrdD{i36gN}bmxCV^33-}*Urg2@}y@3Sv&+~6mu6*99$kq^=y$xsde(s zm9OcwC@?a~BP1N~Rx2mm^gIL>`SRJ<@3`9;>`1frQ8hm?`a->pq71Cu3BA4CH4A`WH#*cRE)-KXXY zzgjwe$e%;xA(Whvsx|C+D^)z{nCAA7PSIg0gQ3mJI8HWrS^c#8qyzQNoyr1VW zisMK;beKCUsFj~)W>_66Q*BmW=2T4L=S$q)JuTUfLR`|NAk%MDnNUANQ(axjvZOn1 zIxP6>{#^+IB1JR>2wqyEOR|#=rR579c-uh^FoAhGFOz9hc|8Sw=H1fUDP^&D#LDN1 zviB-lMl)Q~&F^oRO(HTsl9cknwh+XAJ?uL89{n9kck^tpmjTA6%tg0|r%wv0$F^_gm6}8V{KSC7ekx<=)>MIs{Lub0 z=I<;lvT|lG-cnfgv6BJ-CBm?sE<*Y!SARQd1-w-XtdHqf;1UNbyM;h?Y_2;jnj-j7 zCO?fnq4Ml9BoylBMd9a0Eu$VwM>WVRrw3$TlC{cxj2(0wEyD>Y@J0sh(SDEezBwC1q4lQ7cbNJ3G}+7_dy z_P+zENq=LEoC-OZjy{b>tzXut>0tu5RzJtXgF^Shn`LLk4!~i5SHEwl5fxXGEwNU( z{7m>qTUVa)r`rkxgz+;H8#xNfxz$*%yO326GfS$;P7%3~^fuZhw&Nv6@{e;OgGJ)b zY^D3~IPN0JGX+FExT%1Trx&^bJGH$$;Po$DYsD3~;2*GHqwxI&aC&*xpYFrW!0i^b zbpddcwZYZ@%+V9iy9Pe1cL|w)P2NC(V7Pjg)coL~dMM8k+`?1m zZ}vCqT@@}MgR6Zi(h{ASa2_;FpHABcMT4rzf;_VK-k^U$I;OCvP@2~Yz+-h#dtPlD z(UwWpW3m*V)KZ?6I#v&>^$R-Q8X}G0TW43h^(bq%3TZ4~@E>$tsHC+g`GpV;T>6!c zBg6&#U^O}^Ys0N)U$8jNUr4gwyJ4|xH6-q6tA1^vK4P#%X(8I{9|m=8HkdC*sDuDW zPA1FL*#TfDQm=F-d2KQeR;lrg_uTO_%UTrEV23KcMg*>#<9&NUD&X!cP;bNDjf9UJ{hVr zbGFDM<;jug_V3p+NEI+Z?HE!$4a@wVMzkYhcqhc$X{VAmEr_8qyZ!ou^`)g4?%dXJ z=5cZ8h=PFBcji};bS>#J5t2V7HhuG-59RF}vWV%lt!3`K46wct-<3t1zFMr~BGX4! z6y%46$(Wb`r&To^;+C^kOj7tNmiE?An$9h4%BJY(26K{)U1{A8o#6+f_r_=esUVSU zqc*LKhl9IA!NWEES?BY-2u_NeA{?<-IA5l%^7HX#DP@~SyEBcMbv1=cOKy!fjirVU zbZD~Rk&_SeEjw?>H&(w)2nbjQ9L9(ioAuj<>MA&gelnvURR`oSXJ~3y*u4G_7m&Zb zsb*7Tk&)m@c8m5$s-lD%t>+FkY0AMLouC3b3cY}CC%%URxfw8ngj4Jm4 zy7yC8NWuQhFtWp?xyB#Wea_-3NvBE#8a57v-Vl5c_-5loYcM1|dI|ryE2CIDK zWD6N|>>Tbj6{I{!W4Y}kM&ae$c0dHBvu6U%lD_~8`I)5*c+y0A@d=&tdrR6y3FgLl zduDO10(gUsG>QLU`n$Qk0xJ`72j(#<69+mf2{E)PtUJX;N=_ONYOdi;nu!1e4HIv@ zc(VnJ-U98h{OHyg=&!$^LHcj~1Y`-4q5Sopyi`1rY0FHer;OyNwJ$0O2esbyp2tfc_(4gdAKxw-frtK~O}Tm%2PW2&Am zP|N0@em>v^e~tT6`hWHFP?JTkf5c<{)Q_wJqJPTe%P73H(W-m1g2*PI>Oj=8_y4eE zz4z1XCj=#1X-TIKb36a8Vhy|Ld``828hV5B*iU6eCx;C$K17Js)}5!#JI(MUxgK)7 z9aR}FN_d=8zjMRSuXV&p+Rj}-*0md{{kVnqm87 zy`c1<8auF+dJpvhxAW6P62xt))}KczK6c0*Gau#l|7?TO&gvv$C;Cy#(el?Xq3nis z$Q<1PX)bZh5yx?>+7}l)iyH|gMH#)j#U-CZT;n(NJHoX!6}}#4B76m42&{A6_870hyAqz z8N4lc7XJ(lggRtoUK6?hI%ZF2Lt(XXq)GtCa-fWA`<^@Aa>gDAU*-g>dOAlRAq{Hb z0m~}6I}{kx+3*vFVsINDOM&cmT-#yIUB=2_E9km5Y1fy>9jOT!kEB)`0vKtY8QFAXqA83qbvz$HHVyVk{WP&DbO8cndOuH%xgn*&L*AW008)y891R4rdK;n-!8rA zPEQqX9#1q%*)&>oD6^6gP?b!FZBf#}26O~Y8W^vqr)=yf(pErCM9ZWoy|2_SNJz0=|_j_>6zNt#X= zWvX{S-wG&OcbPc!9|{?msXgPEVcX9Y{J0st$)7AuJfmUyfe4k4vUr$kAIbc`bAIB# z`4VEA3P4d%n%KQ%OK&P(BS1&$4p}0P#*coYlL}bPE4vjvbxRUvrLT4MpY4zCH{_0& z@Enm4+q7D8qT*95bP&AezzV^f^D#dsk%LbBK)dHdSz+*P6V>6{N?$Q_ojtK{v}0+# zx8XL6pd^c+$j~?%Rsnx2KWxTxl0Q>+;(o`&&>=g z_FgKmSbW>rBFHszSmtYiQGYMi?l^dEnkvh&+|>N=l?e9c<{PG?ldlr51$FyoVnK}& zY@bAfC3@=D{B)=I`ZBhSrR3@GH5+~9jlZeIa6R+9aPxjTFdgm+3l>gBf}*HgCz}iJ z70b#rl_HD{blb#q9p)$wD4Qi68_#6rmyQ7mBFYt0G*Nm`a@cOQMo@82I*>qzD$s+) zSVkd=Zy%oJt6X386=z4gmDN1gXOEDzDU3)|C9=OiU&dOC&C+s`RhBv8Oy?dbr72|c z`8?-CxOs$Lqfoe(R1p&s^(fh+%2m&qZgiAPm9@r{ek~>&}u+T&(9y zZPG=w-15Xv|F%9tjbRJ$*Uc%BuMbke*NDQ2{y6e*$}u+LNxt9;BOs^t5*mkUNxtFa zPv^tT(5asD37-R7oAFI5(}W{umVJqmxLbw<`_)riC-}}OrSdEYFB+gJwMfSOp}~`3 z@2CiI7+qHT^1y}0ix2f>G#vBTcF~0~sqs{`Sf+VWnsx4_qfmr28N(-#lVj~yzpQj7>ZvHEy*-#Gih2lJFY<2=L0l89SCYTkvK^&=EWgSzam%YeZ_cjocb!xUR#Ezhn^V~EpQV>4DvtiS90;hcBL+*{ z0$dy4Nb8Sd-F;8LZyd*!`dy`CrLPNBXg10dlZJ^FmoYNpQn4q}h1^~uO>h^Tf+8{=FMgqZ+aCmh`TbdP$_ze(`;YZz26kOyJzhAT z%Yrcx2dB3h6NcVb?%oyQ6)Yxx$u}1voqOPWT>&xIG>JztG^ZJ7_WT;YFJ@w5kvW>4 zA63FLw2~11$orP9?Q3+D2ss6H+j6JZ*KrP|>sECJ?d6*!$Ylw9RsB#lVvxEWO=x3t z^Sca|Z>@wp(kj2OX_md9tQ#(hTycq3^yuW!{S>W%cgV~T6l64Vh>16-j_8@STo$Hj zs_l@Fr`-I<8x<5&9!jbZ@^J{~mPT$;zcqI->}hYF^?vT!Sb#I(Il@&}i;09Sz>dh8sV^ zSIRZ;u_574deP!<^2>EYQ0Uy76*_DZIikzUNr;Db+tVk;gbLJVqf($4kn^t6HkxUV zzSczwhi_<@+m`L9)WmCVs8TzNFEdhm-p_ahJ$ySi zL8I?R7@jqPC_VE6?EwEA6;LDd=CB!UZTL@XMX(8E@j-p(I-Pfhdu1aEj4>o1tF>Ux z&rS{iy{oe$KH}#^$(Rg%qLs}FjS$@s| zMS+{%GaG9604RnI$B&7%Xgn{ z)P!HIgcjsB{luEAqh^R5^>#iKw#=IapQaB0gca~xu=@HDzODfXWKB@<+dd{XeWA3p zrpQzvc&r1{`9;Jy7i`NqN);>w=@s?KMYX+$#)9kbe~@d5I4;eTS=WAB^P9IDhEN1t zRmA}OdkHW`lP5p_hImC&gVNvJiRlh@rhBp}`lC_>gkqfEo_W(Qf>rXZeN}9Fnu?<^ zYl1DW%uu4v6kq3$`QOD!G$|in+vtMW=5NfNE^GNH}H67S^rqa(p%+;4=E|e4=AP5gB>p zgoiK8fz^2b;UsC_z-{7Y{}Sf1~k>qycjmaNsvY))=s z81%AlrhY))`@W6(o{{>23sH!`dGeV_I>Zk4pLOpL15OKEa9Rv&;9`=~zDvR75j~5G zM+!=+(fHir+-YfDzy?i@e#X2zGH;uYlYh%J0LE$QsQX%Eg)zKU7h+p~wSAS_;G{6_ zun_Q?9E-akXa#G_YjSW$QR9Rr##oLiUtM2WUh0z4$8MFTg@tj~ z`SBOTG5fuOsciJo%RKNahfI!}0wfOG#@cMw(f~s>f`ISU2V{8#hksQM6l`Rchd}WatE5HQS=k|)wyr!Us__mdV&~>=?<+qCF3j~8SlwZLB{lls zWzUfl9}4vb(aNOPgX@{o*Yn(MhfZf_hnS4}tf2|>zkdGMjtR2c<7p?e*{9p<`-GP2 zz?Mm$x;*^z+ov%X+HVH#t~bK!MOI<|qCUXYoc4UTF8R&TAu@xXrP$?>f}j018k-S^ zCu;Dm2=jj34qk%}$0oh!jf_90#;JKHPtR)(lJP+P(SJ_eFJnDmsgBcPhCq8 z05*R^>kllMPVdBdDuFv%+~jG4%3byrD>ScO9_ZoIJ8$CnC|D7AJ^ZU|f2&Qz;^g4s zd#T#0aHBtVeB;@4O<=WW8nt-@c4fM(!Kud&24ngmiJ*@d>u0+2Nrz7Ou8?mam*`53 zgzGwxliysF^^18t0DU6*!6gxy;qX~R5gEvkfReZ-Oq4{g5eH;F!xUxPuC2Ivb~&N& zuXnsS{%X!VXE#j^D^2&$KK&3S{A0q6$ER`NB^ohOEQjRDE&eC6a<|(zs<*zmp>+xtf8^jeLVx zu=uK-=(rx#Ak7^a?B-0L-4-RgHr@$Fxd6%Db^B^ZN1yIVLFds&*hJ!3m^65=g_#vf zWPd|MRDMHp_C$6)wl+Ps0K*b;HmD;EbTp)u4%Ug}BjiTTv6x8Vfwa6Dw{TGEUERGZ zc)&G9o9(>^D{jza>bHBkr@l0v!XNqz3O6k`jAEe-hbw(@?{U~MoT#U6%&WBy_-=^e z{!~#6Z5%Z)@2XbTk@6ceqUii$Eo5_4+#ks7A?#>Ymi0VhJnz2HC!@)oZ4vcX2~GBl Vj3S^2L-F6ADfoZ%9sT#n{{oOL;N<`S diff --git "a/content/zh/docs/Description/\344\270\273\345\244\207\345\217\214\346\234\272.md" "b/content/zh/docs/Description/\344\270\273\345\244\207\345\217\214\346\234\272.md" index 526316dcc..2e51eaea3 100644 --- "a/content/zh/docs/Description/\344\270\273\345\244\207\345\217\214\346\234\272.md" +++ "b/content/zh/docs/Description/\344\270\273\345\244\207\345\217\214\346\234\272.md" @@ -1,6 +1,6 @@ # 主备双机 -主备双机支持同步和异步复制,应用可以根据业务场景选择合适的部署方式。同步复制保证数据的高可靠,一般需要一主两备部署,同时对性能有一定影响。异步复制一主一备部署即可,对性能影响小,但异常时可能存在数据丢失。openGauss支持页面损坏的自动修复,在主机页面发生损坏时,能够自动从备机修复损坏页面。openGauss支持备机并行日志恢复,尽量降低主机宕机时业务不可用的时间。 +主备双机支持同步和异步复制,应用可以根据业务场景选择合适的部署方式。同步复制保证数据的高可靠,一般需要一主两备部署,同时对性能有一定影响。异步复制一主一备部署即可,对性能影响小,但异常时可能存在数据丢失。openGauss支持页面损坏的自动修复,在主机页面发生损坏时,能够自动从备机修复损坏页面。openGauss支持备机并行日志恢复,尽量降低主机故障时业务不可用的时间。 同时,如果按照主备模式部署,并打开备机可读功能后,备机将能够提供读操作,但不支持写操作(如建表、插入数据、删除数据等),从而缓解主机上的压力。 diff --git "a/content/zh/docs/Description/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\222\214\350\241\214\345\210\227\346\267\267\345\220\210\345\274\225\346\223\216.md" "b/content/zh/docs/Description/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\222\214\350\241\214\345\210\227\346\267\267\345\220\210\345\274\225\346\223\216.md" index ec81a7f9f..9f68c7c90 100644 --- "a/content/zh/docs/Description/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\222\214\350\241\214\345\210\227\346\267\267\345\220\210\345\274\225\346\223\216.md" +++ "b/content/zh/docs/Description/\345\220\221\351\207\217\345\214\226\346\211\247\350\241\214\345\222\214\350\241\214\345\210\227\346\267\267\345\220\210\345\274\225\346\223\216.md" @@ -11,7 +11,9 @@ 而向量化执行相对于传统的执行模式改变是对于一次一元组的模型修改为一次一批元组,配合列存特性,可以带来巨大的性能提升。 **图 1** 向量化执行引擎 -![](figures/向量化执行引擎.jpg "向量化执行引擎") + + +![](figures/向量化执行引擎(png).png) ## 行列混合存储引擎 @@ -22,7 +24,9 @@ openGauss支持行存储和列存储两种存储模型,用户可以根据应 如[图2](#zh-cn_topic_0237080624_zh-cn_topic_0231764690_zh-cn_topic_0059777898_fbb2af39ce12a419cb437829aaf1cf4fb)所示,行列混合存储引擎可以同时为用户提供更优的数据压缩比(列存)、更好的索引性能(列存)、更好的点更新和点查询(行存)性能。 **图 2** 行列混存引擎 -![](figures/行列混存引擎.jpg "行列混存引擎") + + +![](figures/openGauss行列混存引擎.png) 当前列存储引擎有以下约束: diff --git "a/content/zh/docs/Description/\345\237\272\346\234\254\345\212\237\350\203\275\345\222\214\347\211\271\346\200\247.md" "b/content/zh/docs/Description/\345\237\272\346\234\254\345\212\237\350\203\275\345\222\214\347\211\271\346\200\247.md" index e27610557..3b760aa9f 100644 --- "a/content/zh/docs/Description/\345\237\272\346\234\254\345\212\237\350\203\275\345\222\214\347\211\271\346\200\247.md" +++ "b/content/zh/docs/Description/\345\237\272\346\234\254\345\212\237\350\203\275\345\222\214\347\211\271\346\200\247.md" @@ -27,6 +27,7 @@ openGauss是一个单机数据库,具备关系型数据库的基本功能, 提供安装部署工具、实例启停工具、备份恢复工具。 - 安全管理 - - 支持SSL安全网络连接、用户权限管理、密码管理、安全审计等功能,保证数据库在管理层、应用层、系统层和网络层的安全性。 + + 支持SSL安全网络连接、用户权限管理、密码管理、安全审计等功能,保证数据库在管理层、应用层、系统层和网络层的安全性。 diff --git "a/content/zh/docs/Description/\346\225\260\346\215\256\345\210\206\345\214\272.md" "b/content/zh/docs/Description/\346\225\260\346\215\256\345\210\206\345\214\272.md" index f08d444d4..9becf870c 100644 --- "a/content/zh/docs/Description/\346\225\260\346\215\256\345\210\206\345\214\272.md" +++ "b/content/zh/docs/Description/\346\225\260\346\215\256\345\210\206\345\214\272.md" @@ -44,6 +44,5 @@ openGauss支持范围分区(Range Partitioning)功能,即根据表的一 分区剪枝:分区剪枝(也称为分区消除)是openGauss在执行时过滤掉不需要扫描的分区,只对相关的分区进行扫描的技术。分区剪枝通常可以将查询性能提高若干数量级。 - 智能化分区联接:通过使用一种称为智能化分区联接的技术,分区还可以改善多表联接的性能。当将两个表联接在一起,并且至少其中一个表使用联接键进行分区时,可以应用智能化分区联接。智能化分区联接将一个大型联接分为多个较小的联接,这些较小的联接包含与联接的表“相同”的数据集。这里,“相同”定义为恰好包含联接的两端中相同的分区键值集,因此可以确保只有这些“相同”数据集的联接才会有效,而不必考虑其他数据集。 - +- **智能化分区联接:**通过使用一种称为智能化分区联接的技术,分区还可以改善多表联接的性能。当将两个表联接在一起,并且至少其中一个表使用联接键进行分区时,可以应用智能化分区联接。智能化分区联接将一个大型联接分为多个较小的联接,这些较小的联接包含与联接的表“相同”的数据集。这里,“相同”定义为恰好包含联接的两端中相同的分区键值集,因此可以确保只有这些“相同”数据集的联接才会有效,而不必考虑其他数据集。 diff --git "a/content/zh/docs/Developerguide/AI\347\211\271\346\200\247.md" "b/content/zh/docs/Developerguide/AI\347\211\271\346\200\247.md" index f3de1de37..42d5c2390 100644 --- "a/content/zh/docs/Developerguide/AI\347\211\271\346\200\247.md" +++ "b/content/zh/docs/Developerguide/AI\347\211\271\346\200\247.md" @@ -1,5 +1,9 @@ # AI特性 -- **[SQL执行时间预测特性](SQL执行时间预测特性.md)** +- **[Predictor](Predictor.md)** + +- **[X-Tuner](X-Tuner.md)** + +- **[Sqldiag](Sqldiag.md)** diff --git a/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md b/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md index 123c50d1d..45cebbdc6 100644 --- a/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md +++ b/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md @@ -1,18 +1,18 @@ # ALTER DATA SOURCE -## **功能描述** +## 功能描述 修改Data Source对象的属性和内容。 属性有:名称和属主;内容有:类型、版本和连接选项。 -## **注意选项** +## 注意选项 - 只有初始用户/系统管理员/属主才拥有修改Data Source的权限。 - 修改属主时,新的属主用户必须是初始用户或系统管理员。 -- 当在OPTIONS中出现password选项时,需要保证openGauss每个节点的$GAUSSHOME/bin目录下存在datasource.key.cipher和datasource.key.rand文件,如果不存在这两个文件,请使用gs\_guc工具生成并使用gs\_ssh工具发布到openGauss每个节点的$GAUSSHOME/bin目录下。 +- 当在OPTIONS中出现password选项时,需要保证openGauss每个节点的$GAUSSHOME/bin目录下存在datasource.key.cipher和datasource.key.rand文件,如果不存在这两个文件,请使用gs\_guc工具生成并使用gs\_ssh工具发布到每个节点的$GAUSSHOME/bin目录下。 -## **语法格式** +## 语法格式 ``` ALTER DATA SOURCE src_name @@ -23,7 +23,7 @@ ALTER DATA SOURCE src_name RENAME TO src_new_name; ALTER DATA SOURCE src_name OWNER TO new_owner; ``` -## **参数说明** +## 参数说明 - **src\_name** @@ -66,7 +66,7 @@ ALTER DATA SOURCE src_name OWNER TO new_owner; 取值范围:字符串,有效的用户名。 -## **示例** +## 示例 ``` --创建一个空Data Source对象。 @@ -97,7 +97,7 @@ postgres=# DROP DATA SOURCE ds_test; postgres=# DROP USER user_test1; ``` -## **相关链接** +## 相关链接 -**[CREATE DATA SOURCE](CREATE-DATA-SOURCE.md#ZH-CN_TOPIC_0242370564)**,**[DROP DATA SOURCE](DROP-DATA-SOURCE.md#ZH-CN_TOPIC_0242370599)** +[CREATE DATA SOURCE](CREATE-DATA-SOURCE.md),[DROP DATA SOURCE](DROP-DATA-SOURCE.md) diff --git a/content/zh/docs/Developerguide/ALTER-DATABASE.md b/content/zh/docs/Developerguide/ALTER-DATABASE.md index 625676483..67ac84fd7 100644 --- a/content/zh/docs/Developerguide/ALTER-DATABASE.md +++ b/content/zh/docs/Developerguide/ALTER-DATABASE.md @@ -138,5 +138,5 @@ ## 相关链接 -[CREATE DATABASE](CREATE-DATABASE.md),[DROP DATABASE](DROP-DATABASE.md#ZH-CN_TOPIC_0242370597) +[CREATE DATABASE](CREATE-DATABASE.md),[DROP DATABASE](DROP-DATABASE.md) diff --git a/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md b/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md index c80963f50..f772fa858 100644 --- a/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md +++ b/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md @@ -1,4 +1,4 @@ -# ALTER DEFAULT PRIVILEGES +# ALTER DEFAULT PRIVILEGES ## 功能描述 diff --git a/content/zh/docs/Developerguide/ALTER-DIRECTORY.md b/content/zh/docs/Developerguide/ALTER-DIRECTORY.md index ec687d8d7..7172605b1 100644 --- a/content/zh/docs/Developerguide/ALTER-DIRECTORY.md +++ b/content/zh/docs/Developerguide/ALTER-DIRECTORY.md @@ -37,5 +37,5 @@ postgres=# DROP DIRECTORY dir; ## 相关链接 -[CREATE DIRECTORY](CREATE-DIRECTORY.md#ZH-CN_TOPIC_0242370565),[DROP DIRECTORY](DROP-DIRECTORY.md#ZH-CN_TOPIC_0242370600) +[CREATE DIRECTORY](CREATE-DIRECTORY.md),[DROP DIRECTORY](DROP-DIRECTORY.md) diff --git a/content/zh/docs/Developerguide/ALTER-GROUP.md b/content/zh/docs/Developerguide/ALTER-GROUP.md index 0ac879efc..7271cbaa7 100644 --- a/content/zh/docs/Developerguide/ALTER-GROUP.md +++ b/content/zh/docs/Developerguide/ALTER-GROUP.md @@ -37,7 +37,20 @@ ALTER GROUP是ALTER ROLE的别名,非SQL标准语法,不推荐使用,建 请参考ALTER ROLE的[参数说明](ALTER-ROLE.md#zh-cn_topic_0237122068_zh-cn_topic_0059778744_s50961af6143d4aafaf8fa02febbbf331)。 +## 示例 + +``` +--向用户组中添加用户。 +postgres=# ALTER GROUP super_users ADD USER lche, jim; + +--从用户组中删除用户。 +postgres=# ALTER GROUP super_users DROP USER jim; + +--修改用户组的名称。 +postgres=# ALTER GROUP super_users RENAME TO normal_users; +``` + ## 相关链接 -[CREATE GROUP](CREATE-GROUP.md#ZH-CN_TOPIC_0242370569),[DROP GROUP](DROP-GROUP.md#ZH-CN_TOPIC_0242370603),[ALTER ROLE](ALTER-ROLE.md#ZH-CN_TOPIC_0242370532) +[ALTER GROUP](ALTER-GROUP.md),[DROP GROUP](DROP-GROUP.md),[ALTER ROLE](ALTER-ROLE.md) diff --git a/content/zh/docs/Developerguide/ALTER-INDEX.md b/content/zh/docs/Developerguide/ALTER-INDEX.md index ffceb2467..8991a8fb8 100644 --- a/content/zh/docs/Developerguide/ALTER-INDEX.md +++ b/content/zh/docs/Developerguide/ALTER-INDEX.md @@ -161,5 +161,5 @@ ALTER INDEX用于修改现有索引的定义。 ## 相关链接 -[CREATE INDEX](CREATE-INDEX.md),[DROP INDEX](DROP-INDEX.md#ZH-CN_TOPIC_0242370604),[REINDEX](REINDEX.md) +[CREATE INDEX](CREATE-INDEX.md),[DROP INDEX](DROP-INDEX.md),[REINDEX](REINDEX.md) diff --git a/content/zh/docs/Developerguide/ALTER-ROLE.md b/content/zh/docs/Developerguide/ALTER-ROLE.md index d28804a9f..a7ddeaf4e 100644 --- a/content/zh/docs/Developerguide/ALTER-ROLE.md +++ b/content/zh/docs/Developerguide/ALTER-ROLE.md @@ -40,9 +40,7 @@ | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' - | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' - | NODE GROUP logic_cluster_name | ACCOUNT { LOCK | UNLOCK } | PGUSER ``` @@ -116,5 +114,5 @@ ## 相关链接 -[CREATE ROLE](CREATE-ROLE.md),[DROP ROLE](DROP-ROLE.md#ZH-CN_TOPIC_0242370611),[SET](SET.md) +[CREATE ROLE](CREATE-ROLE.md),[DROP ROLE](DROP-ROLE.md),[SET](SET.md) diff --git a/content/zh/docs/Developerguide/ALTER-ROW-LEVEL-SECURITY-POLICY.md b/content/zh/docs/Developerguide/ALTER-ROW-LEVEL-SECURITY-POLICY.md index b8139d66e..b6d7b0e14 100644 --- a/content/zh/docs/Developerguide/ALTER-ROW-LEVEL-SECURITY-POLICY.md +++ b/content/zh/docs/Developerguide/ALTER-ROW-LEVEL-SECURITY-POLICY.md @@ -103,5 +103,5 @@ Options: orientation=row, compression=no, enable_rowsecurity=true ## 相关链接 -[CREATE ROW LEVLEL SECURITY POLICY](CREATE-ROW-LEVLEL-SECURITY-POLICY.md),[DROP ROW LEVEL SECURITY POLICY](DROP-ROW-LEVEL-SECURITY-POLICY.md) +[CREATE ROW LEVEL SECURITY POLICY](CREATE-ROW-LEVEL-SECURITY-POLICY.md),[DROP ROW LEVEL SECURITY POLICY](DROP-ROW-LEVEL-SECURITY-POLICY.md) diff --git a/content/zh/docs/Developerguide/ALTER-SCHEMA.md b/content/zh/docs/Developerguide/ALTER-SCHEMA.md index 35d3f29cb..1ced6650a 100644 --- a/content/zh/docs/Developerguide/ALTER-SCHEMA.md +++ b/content/zh/docs/Developerguide/ALTER-SCHEMA.md @@ -72,5 +72,5 @@ postgres=# DROP USER jack; ## 相关链接 -[CREATE SCHEMA](CREATE-SCHEMA.md#ZH-CN_TOPIC_0242370577),[DROP SCHEMA](DROP-SCHEMA.md#ZH-CN_TOPIC_0242370612) +[CREATE SCHEMA](CREATE-SCHEMA.md),[DROP SCHEMA](DROP-SCHEMA.md) diff --git a/content/zh/docs/Developerguide/ALTER-SEQUENCE.md b/content/zh/docs/Developerguide/ALTER-SEQUENCE.md index e1e9ff711..61f8cda18 100644 --- a/content/zh/docs/Developerguide/ALTER-SEQUENCE.md +++ b/content/zh/docs/Developerguide/ALTER-SEQUENCE.md @@ -72,5 +72,5 @@ postgres=# DROP TABLE T1; ## 相关链接 -[CREATE SEQUENCE](CREATE-SEQUENCE.md#ZH-CN_TOPIC_0242370578),[DROP SEQUENCE](DROP-SEQUENCE.md#ZH-CN_TOPIC_0242370613) +[CREATE SEQUENCE](CREATE-SEQUENCE.md),[DROP SEQUENCE](DROP-SEQUENCE.md) diff --git a/content/zh/docs/Developerguide/ALTER-SESSION.md b/content/zh/docs/Developerguide/ALTER-SESSION.md index 4e8637afc..e5490d840 100644 --- a/content/zh/docs/Developerguide/ALTER-SESSION.md +++ b/content/zh/docs/Developerguide/ALTER-SESSION.md @@ -15,7 +15,7 @@ ALTER SESSION命令用于定义或修改那些对当前会话有影响的条件 ``` ALTER SESSION SET [ SESSION CHARACTERISTICS AS ] TRANSACTION - { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED } | { READ ONLY | READ WRITE } } [, ...] ; + { ISOLATION LEVEL { READ COMMITTED } | { READ ONLY | READ WRITE } } [, ...] ; ``` - 设置会话的其他运行时参数。 @@ -23,9 +23,9 @@ ALTER SESSION命令用于定义或修改那些对当前会话有影响的条件 ``` ALTER SESSION SET {{config_parameter { { TO | = } { value | DEFAULT } - | FROM CURRENT }} | CURRENT_SCHEMA [ TO | = ] { schema | DEFAULT } + | FROM CURRENT }} | TIME ZONE time_zone - | SCHEMA schema + | CURRENT_SCHEMA schema | NAMES encoding_name | ROLE role_name PASSWORD 'password' | SESSION AUTHORIZATION { role_name PASSWORD 'password' | DEFAULT } diff --git a/content/zh/docs/Developerguide/ALTER-SYNONYM.md b/content/zh/docs/Developerguide/ALTER-SYNONYM.md new file mode 100644 index 000000000..993ce783e --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-SYNONYM.md @@ -0,0 +1,58 @@ +# ALTER SYNONYM + +## 功能描述 + +修改SYNONYM对象的属性。 + +## 注意事项 + +- 目前仅支持修改SYNONYM对象的属主。 +- 只有系统管理员有权限修改SYNONYM对象的属主信息。 +- 新属主必须具有SYNONYM对象所在模式的CREATE权限。 + +## 语法格式 + +``` +ALTER SYNONYM synonym_name + OWNER TO new_owner; +``` + +## 参数描述 + +- **synonym** + + 待修改的同义词名字,可以带模式名。 + + 取值范围:字符串,需要符合标识符的命名规范。 + + +- **new\_owner** + + 同义词对象的新所有者。 + + 取值范围:字符串,有效的用户名。 + + +## 示例 + +``` +--创建同义词t1。 +postgres=# CREATE OR REPLACE SYNONYM t1 FOR ot.t1; + +--创建新用户u1。 +postgres=# CREATE USER u1 PASSWORD 'user@111'; + +--修改同义词t1的owner为u1。 +postgres=# ALTER SYNONYM t1 OWNER TO u1; + +--删除同义词t1。 +postgres=# DROP SYNONYM t1; + +--删除用户u1。 +postgres=# DROP USER u1; +``` + +## 相关链接 + +[CREATE SYNONYM](CREATE-SYNONYM.md),[DROP SYNONYM](DROP-SYNONYM.md) + diff --git a/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md b/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md index 4230891f8..6627b91eb 100644 --- a/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md +++ b/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md @@ -18,9 +18,7 @@ ALTER SYSTEM KILL SESSION 'session_sid, serial' [ IMMEDIATE ]; - **session\_sid, serial** - 会话的SID和SERIAL(格式请参考示例)。 - - 取值范围:通过查看系统表V$SESSION可查看所有会话的SID和SERIAL。 + 会话的SID和SERIAL(获取方法请参考示例)。 - **IMMEDIATE** @@ -31,8 +29,9 @@ ALTER SYSTEM KILL SESSION 'session_sid, serial' [ IMMEDIATE ]; ``` --查询会话信息。 -postgres=# SELECT sid,serial#,username FROM V$SESSION; - +postgres=# +SELECT sa.sessionid AS sid,0::integer AS serial#,ad.rolname AS username FROM pg_stat_get_activity(NULL) AS sa +LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid)WHERE sa.application_name <> 'JobScheduler'; sid | serial# | username -----------------+---------+---------- 140131075880720 | 0 | omm diff --git a/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md b/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md index 443df8e04..74207a743 100644 --- a/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md +++ b/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md @@ -199,7 +199,7 @@ - ENABLE:打开行迁移开关。 - DISABLE:关闭行迁移开关。 - 默认是关闭状态。 + 默认是打开状态。 - **ordinary\_table\_name** @@ -240,5 +240,5 @@ ## 相关链接 -[CREATE TABLE PARTITION](CREATE-TABLE-PARTITION.md),[DROP TABLE](DROP-TABLE.md#ZH-CN_TOPIC_0242370616) +[CREATE TABLE PARTITION](CREATE-TABLE-PARTITION.md),[DROP TABLE](DROP-TABLE.md) diff --git a/content/zh/docs/Developerguide/ALTER-TABLE.md b/content/zh/docs/Developerguide/ALTER-TABLE.md index ce296029c..608007e1c 100644 --- a/content/zh/docs/Developerguide/ALTER-TABLE.md +++ b/content/zh/docs/Developerguide/ALTER-TABLE.md @@ -10,7 +10,6 @@ - 不能修改分区表的tablespace,但可以修改分区的tablespace。 - 不支持修改存储参数ORIENTATION。 - SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。 -- 不允许对表的分布列(distribute column)进行修改。 - 列存表只支持PARTIAL CLUSTER KEY表级约束,不支持主外键等表级约束。 - 列存表只支持添加字段ADD COLUMN、修改字段的数据类型ALTER TYPE、设置单个字段的收集目标SET STATISTICS、支持更改表名称、支持更改表空间,支持删除字段DROP COLUMN。对于添加的字段和修改的字段类型要求是列存支持的[数据类型](数据类型.md)。ALTER TYPE的USING选项只支持常量表达式和涉及本字段的表达式,暂不支持涉及其他字段的表达式。 - 列存表支持的字段约束包括NULL、NOT NULL和DEFAULT常量值;对字段约束的修改当前只支持对DEFAULT值的修改(SET DEFAULT)和删除(DROP DEFAULT),暂不支持对非空约束NULL/NOT NULL的修改。 @@ -44,7 +43,6 @@ | OWNER TO new_owner | SET TABLESPACE new_tablespace | SET {COMPRESS|NOCOMPRESS} - | TO { GROUP groupname | NODE ( nodename [, ... ] ) } | ADD NODE ( nodename [, ... ] ) | DELETE NODE ( nodename [, ... ] ) @@ -64,7 +62,7 @@ >- **ADD table\_constraint\_using\_index** > 根据已有唯一索引为表增加主键约束或唯一约束。 >- **VALIDATE CONSTRAINT constraint\_name** - > 验证一个外键或是一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 + > 验证一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 >- **DROP CONSTRAINT \[ IF EXISTS \] constraint\_name \[ RESTRICT | CASCADE \]** > 删除一个表上的约束。 >- **CLUSTER ON index\_name** @@ -110,7 +108,7 @@ 开启或关闭表的行访问控制开关。 - 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见[CREATE ROW LEVLEL SECURITY POLICY](CREATE-ROW-LEVLEL-SECURITY-POLICY.md)章节。 + 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见[CREATE ROW LEVEL SECURITY POLICY](CREATE-ROW-LEVEL-SECURITY-POLICY.md)章节。 - **| NO FORCE/FORCE ROW LEVEL SECURITY** @@ -147,7 +145,7 @@ >- **MODIFY \( \{ column\_name data\_type | column\_name \[ CONSTRAINT constraint\_name \] NOT NULL \[ ENABLE \] | column\_name \[ CONSTRAINT constraint\_name \] NULL \} \[, ...\] \)** > 修改表已存在字段的数据类型。 >- **DROP \[ COLUMN \] \[ IF EXISTS \] column\_name \[ RESTRICT | CASCADE \]** - > 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如外键参考、视图等。 + > 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 > DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。 >- **ALTER \[ COLUMN \] column\_name \[ SET DATA \] TYPE data\_type \[ COLLATE collation \] \[ USING expression \]** > 改变表字段的数据类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 diff --git a/content/zh/docs/Developerguide/ALTER-TABLESPACE.md b/content/zh/docs/Developerguide/ALTER-TABLESPACE.md index a6f27d397..c10a1c072 100644 --- a/content/zh/docs/Developerguide/ALTER-TABLESPACE.md +++ b/content/zh/docs/Developerguide/ALTER-TABLESPACE.md @@ -6,7 +6,6 @@ ## 注意事项 -- 当前版本禁止使用ALTER TABLESPACE语法。 - 只有表空间的所有者有权限执行ALTER TABLESPACE命令,系统管理员默认拥有此权限。 - 要修改表空间的所有者A为B,则A必须是B的直接或者间接成员。 @@ -98,7 +97,7 @@ 取值范围: - - UNLIMITED,此表空间不设置限额。 + - UNLIMITED,该表空间不设置限额。 - 由space\_size来确定,其格式参考[CREATE TABLESPACE](CREATE-TABLESPACE.md)。 >![](public_sys-resources/icon-note.gif) **说明:** @@ -116,5 +115,5 @@ ## 相关链接 -[CREATE TABLESPACE](CREATE-TABLESPACE.md),[DROP TABLESPACE](DROP-TABLESPACE.md#ZH-CN_TOPIC_0242370617) +[CREATE TABLESPACE](CREATE-TABLESPACE.md),[DROP TABLESPACE](DROP-TABLESPACE.md) diff --git a/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md index 39d94e630..e0ab9a717 100644 --- a/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md +++ b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md @@ -92,7 +92,7 @@ ALTER TEXT SEARCH CONFIGURATION name RESET ( {configuration_option} [, ...] ); - **token\_type** - 与配置的语法解析器关联的字串类型的名称。详细信息参见[解析器](解析器.md#ZH-CN_TOPIC_0242370496)。 + 与配置的语法解析器关联的字串类型的名称。详细信息参见[解析器](解析器.md)。 - **dictionary\_name** @@ -120,7 +120,7 @@ ALTER TEXT SEARCH CONFIGURATION name RESET ( {configuration_option} [, ...] ); - **configuration\_option** - 文本搜索配置项。详细信息参见[CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370585)。 + 文本搜索配置项。详细信息参见[CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md)。 - **value** @@ -171,5 +171,5 @@ postgres=# SELECT b.cfgname,a.maptokentype,a.mapseqno,a.mapdict,c.dictname FROM ## 相关链接 -[CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370585), [DROP TEXT SEARCH CONFIGURATION](DROP-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370618) +[CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md), [DROP TEXT SEARCH CONFIGURATION](DROP-TEXT-SEARCH-CONFIGURATION.md) diff --git a/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md index 57acbc734..00f6d1280 100644 --- a/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md +++ b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md @@ -97,5 +97,5 @@ postgres=# ALTER TEXT SEARCH DICTIONARY my_dict ( dummy ); ## 相关链接 -[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586),[DROP TEXT SEARCH DICTIONARY](DROP-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370619) +[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md),[DROP TEXT SEARCH DICTIONARY](DROP-TEXT-SEARCH-DICTIONARY.md) diff --git a/content/zh/docs/Developerguide/ALTER-TRIGGER.md b/content/zh/docs/Developerguide/ALTER-TRIGGER.md index 6fa9244bc..76c8e2d9d 100644 --- a/content/zh/docs/Developerguide/ALTER-TRIGGER.md +++ b/content/zh/docs/Developerguide/ALTER-TRIGGER.md @@ -41,5 +41,5 @@ ALTER TRIGGER trigger_name ON table_name RENAME TO new_name; ## 相关链接 -[CREATE TRIGGER](CREATE-TRIGGER.md),[DROP TRIGGER](DROP-TRIGGER.md#ZH-CN_TOPIC_0242370620),[ALTER TABLE](ALTER-TABLE.md) +[CREATE TRIGGER](CREATE-TRIGGER.md),[DROP TRIGGER](DROP-TRIGGER.md),[ALTER TABLE](ALTER-TABLE.md) diff --git a/content/zh/docs/Developerguide/ALTER-TYPE.md b/content/zh/docs/Developerguide/ALTER-TYPE.md index 9d911b7dd..7a1445b23 100644 --- a/content/zh/docs/Developerguide/ALTER-TYPE.md +++ b/content/zh/docs/Developerguide/ALTER-TYPE.md @@ -148,5 +148,5 @@ ## 相关链接 -[CREATE TYPE](CREATE-TYPE.md#ZH-CN_TOPIC_0242370588),[DROP TYPE](DROP-TYPE.md#ZH-CN_TOPIC_0242370621) +[CREATE TYPE](CREATE-TYPE.md),[DROP TYPE](DROP-TYPE.md) diff --git a/content/zh/docs/Developerguide/ALTER-USER.md b/content/zh/docs/Developerguide/ALTER-USER.md index 2f6b547fc..e0554aa08 100644 --- a/content/zh/docs/Developerguide/ALTER-USER.md +++ b/content/zh/docs/Developerguide/ALTER-USER.md @@ -38,9 +38,7 @@ ALTER USER中修改的会话参数只针对指定的用户,且在下一次会 | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' - | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' - | NODE GROUP logic_cluster_name | ACCOUNT { LOCK | UNLOCK } | PGUSER ``` @@ -101,7 +99,7 @@ ALTER USER中修改的会话参数只针对指定的用户,且在下一次会 当前版本不允许修改用户的PGUSER属性。 -其他参数请参见[CREATE ROLE](CREATE-ROLE.md)和[ALTER ROLE](ALTER-ROLE.md#ZH-CN_TOPIC_0242370532)的参数说明。 +其他参数请参见[CREATE ROLE](CREATE-ROLE.md)和[ALTER ROLE](ALTER-ROLE.md)的参数说明。 ## 示例 @@ -109,5 +107,5 @@ ALTER USER中修改的会话参数只针对指定的用户,且在下一次会 ## 相关链接 -[CREATE ROLE](CREATE-ROLE.md),[CREATE USER](CREATE-USER.md#ZH-CN_TOPIC_0242370589),[DROP USER](DROP-USER.md) +[CREATE ROLE](CREATE-ROLE.md),[CREATE USER](CREATE-USER.md),[DROP USER](DROP-USER.md) diff --git a/content/zh/docs/Developerguide/ALTER-VIEW.md b/content/zh/docs/Developerguide/ALTER-VIEW.md index 0e99a5fe6..52e27853e 100644 --- a/content/zh/docs/Developerguide/ALTER-VIEW.md +++ b/content/zh/docs/Developerguide/ALTER-VIEW.md @@ -126,5 +126,5 @@ postgres=# DROP VIEW public.customer_details_view_v2; ## 相关链接 -[CREATE VIEW](CREATE-VIEW.md#ZH-CN_TOPIC_0242370590),[DROP VIEW](DROP-VIEW.md#ZH-CN_TOPIC_0242370623) +[CREATE VIEW](CREATE-VIEW.md),[DROP VIEW](DROP-VIEW.md) diff --git a/content/zh/docs/Developerguide/BEGIN.md b/content/zh/docs/Developerguide/BEGIN.md index e68a86b4d..6be543bc0 100644 --- a/content/zh/docs/Developerguide/BEGIN.md +++ b/content/zh/docs/Developerguide/BEGIN.md @@ -28,7 +28,7 @@ BEGIN可以用于开始一个匿名块,也可以用于开始一个事务。本 BEGIN [ WORK | TRANSACTION ] [ { - ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ]; @@ -48,6 +48,10 @@ BEGIN可以用于开始一个匿名块,也可以用于开始一个事务。本 取值范围:已存在的函数名称。 +## 示例 + +无 + ## 相关链接 [START TRANSACTION](START-TRANSACTION.md) diff --git a/content/zh/docs/Developerguide/BGWRITER_STAT.md b/content/zh/docs/Developerguide/BGWRITER_STAT.md new file mode 100644 index 000000000..2ec727593 --- /dev/null +++ b/content/zh/docs/Developerguide/BGWRITER_STAT.md @@ -0,0 +1,95 @@ +# BGWRITER\_STAT + +BGWRITER\_STAT视图显示关于后端写进程活动的统计信息。 + +**表 1** BGWRITER\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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

+

这些统计被重置的时间。

+
+ diff --git a/content/zh/docs/Developerguide/CLASS_VITAL_INFO.md b/content/zh/docs/Developerguide/CLASS_VITAL_INFO.md new file mode 100644 index 000000000..504317792 --- /dev/null +++ b/content/zh/docs/Developerguide/CLASS_VITAL_INFO.md @@ -0,0 +1,47 @@ +# CLASS\_VITAL\_INFO + +CLASS\_VITAL\_INFO视图用于做WDR时校验相同的表或者索引的Oid是否一致。 + +**表 1** CLASS\_VITAL\_INFO字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

表的oid。

+

schemaname

+

name

+

schema名称。

+

relname

+

name

+

表名。

+

relkind

+

"char"

+
表示对象类型,取值范围如下:
  • r:表示普通表。
  • t:表示toast表。
  • i:表示索引。
+
+
+ diff --git a/content/zh/docs/Developerguide/CLOSE.md b/content/zh/docs/Developerguide/CLOSE.md index e9cdaee8f..c73632fd8 100644 --- a/content/zh/docs/Developerguide/CLOSE.md +++ b/content/zh/docs/Developerguide/CLOSE.md @@ -36,5 +36,5 @@ CLOSE { cursor_name | ALL } ; ## 相关链接 -[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629),[MOVE](MOVE.md#ZH-CN_TOPIC_0242370633) +[FETCH](FETCH.md),[MOVE](MOVE.md) diff --git a/content/zh/docs/Developerguide/COMMENT.md b/content/zh/docs/Developerguide/COMMENT.md index 93d9a245e..6d0c2e866 100644 --- a/content/zh/docs/Developerguide/COMMENT.md +++ b/content/zh/docs/Developerguide/COMMENT.md @@ -34,7 +34,6 @@ COMMENT ON OPERATOR FAMILY object_name USING index_method | [ PROCEDURAL ] LANGUAGE object_name | ROLE object_name | - RULE rule_name ON table_name | SCHEMA object_name | SERVER object_name | TABLE object_name | diff --git a/content/zh/docs/Developerguide/COMMIT-PREPARED.md b/content/zh/docs/Developerguide/COMMIT-PREPARED.md index 69867890d..8c746c37a 100644 --- a/content/zh/docs/Developerguide/COMMIT-PREPARED.md +++ b/content/zh/docs/Developerguide/COMMIT-PREPARED.md @@ -29,7 +29,14 @@ COMMIT PREPARED transaction_id WITH CSN; 待提交事务的序列号。它是一个64位递增无符号数。 +## 示例 + +``` +--提交标识符为的trans_test的事务。 +postgres=# COMMIT PREPARED 'trans_test'; +``` + ## 相关链接 -[PREPARE TRANSACTION](PREPARE-TRANSACTION.md#ZH-CN_TOPIC_0242370636),[ROLLBACK PREPARED](ROLLBACK-PREPARED.md#ZH-CN_TOPIC_0242370645)。 +[PREPARE TRANSACTION](PREPARE-TRANSACTION.md),[ROLLBACK PREPARED](ROLLBACK-PREPARED.md)。 diff --git a/content/zh/docs/Developerguide/CONFIG_SETTINGS.md b/content/zh/docs/Developerguide/CONFIG_SETTINGS.md new file mode 100644 index 000000000..b3ddf778c --- /dev/null +++ b/content/zh/docs/Developerguide/CONFIG_SETTINGS.md @@ -0,0 +1,130 @@ +# CONFIG\_SETTINGS + +CONFIG\_SETTINGS视图显示数据库运行时参数的相关信息。 + +**表 1** CONFIG\_SETTINGS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

name

+

text

+

参数名称。

+

setting

+

text

+

参数当前值。

+

unit

+

text

+

参数的隐式结构。

+

category

+

text

+

参数的逻辑组。

+

short_desc

+

text

+

参数的简单描述。

+

extra_desc

+

text

+

参数的详细描述。

+

context

+

text

+

设置参数值的上下文,包括internal,postmaster,sighup,backend,superuser,user。

+

vartype

+

text

+

参数类型,包括bool,enum,integer,real,string。

+

source

+

text

+

参数的赋值方式。

+

min_val

+

text

+

参数最大值。如果参数类型不是数值型,那么该字段值为null。

+

max_val

+

text

+

参数最小值。如果参数类型不是数值型,那么该字段值为null。

+

enumvals

+

text[]

+

enum类型参数合法值。如果参数类型不是enum型,那么该字段值为null。

+

boot_val

+

text

+

数据库启动时参数默认值。

+

reset_val

+

text

+

数据库重置时参数默认值。

+

sourcefile

+

text

+

设置参数值的配置文件。如果参数不是通过配置文件赋值,那么该字段值为null。

+

sourceline

+

integer

+

设置参数值的配置文件的行号。如果参数不是通过配置文件赋值,那么该字段值为null。

+
+ diff --git a/content/zh/docs/Developerguide/COPY.md b/content/zh/docs/Developerguide/COPY.md index 161743010..e8313cb4e 100644 --- a/content/zh/docs/Developerguide/COPY.md +++ b/content/zh/docs/Developerguide/COPY.md @@ -235,17 +235,6 @@ COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据 缺省值:TEXT - - OIDS - - 为每行拷贝内部对象标识(oid)。 - - >![](public_sys-resources/icon-note.gif) **说明:** - >若COPY FROM对象为query或者对于没有oid的表,指定oids标识报错。 - - 取值范围:true/on,false/off。 - - 缺省值:false - - DELIMITER 指定数据文件行数据的字段分隔符。 @@ -385,7 +374,7 @@ COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据 取值范围:合法DATE格式。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 >![](public_sys-resources/icon-note.gif) **说明:** - >对于指定为A兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp\_format参数。 + >对于DATE类型内建为TIMESTAMP类型的数据库,在导入的时候,若需指定格式,可以参考下面的timestamp\_format参数。 - TIME\_FORMAT @@ -410,13 +399,6 @@ COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据 用于指定COPY原生的各类参数。 - - OIDS - - 为每行拷贝内部对象标识(oid)。 - - >![](public_sys-resources/icon-note.gif) **说明:** - >若COPY FROM对象为query或者对于没有oid的表,指定oids标识报错。 - - NULL null\_string 用来指定数据文件中空值的表示。 @@ -467,7 +449,7 @@ COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据 - FORCE NOT NULL column\_name \[, ...\] - 在CSV COPY FROM模式下,指定的字段输入不能为空。 + 在CSV COPY FROM模式下,指定的字段不为空。若输入为空,则将视为长度为0的字符串。 取值范围:已存在的字段。 @@ -561,7 +543,7 @@ COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据 取值范围:合法DATE格式。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md) >![](public_sys-resources/icon-note.gif) **说明:** - >对于指定为A兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp\_format参数。 + >对于DATE类型内建为TIMESTAMP类型的数据库,在导入的时候,若需指定格式,可以参考下面的timestamp\_format参数。 - TIME\_FORMAT 'time\_format\_string' diff --git a/content/zh/docs/Developerguide/CPU.md b/content/zh/docs/Developerguide/CPU.md new file mode 100644 index 000000000..245347bf5 --- /dev/null +++ b/content/zh/docs/Developerguide/CPU.md @@ -0,0 +1,117 @@ +# CPU + +通过top命令查看openGauss内节点CPU使用情况,分析是否存在由于CPU负载过高导致的性能瓶颈。 + +## 查看CPU状况 + +查询服务器CPU的使用情况主要通过以下方式: + +在所有存储节点,逐一执行**top**命令,查看CPU占用情况。执行该命令后,按“1”键,可查看每个CPU核的使用率。 + +``` +top - 17:05:04 up 32 days, 20:34, 5 users, load average: 0.02, 0.02, 0.00 +Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie +Cpu0 : 0.0%us, 0.3%sy, 0.0%ni, 69.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st +Cpu1 : 0.3%us, 0.3%sy, 0.0%ni, 69.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st +Cpu2 : 0.3%us, 0.3%sy, 0.0%ni, 69.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st +Cpu3 : 0.3%us, 0.3%sy, 0.0%ni, 69.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st +Mem: 8038844k total, 7165272k used, 873572k free, 530444k buffers +Swap: 4192924k total, 4920k used, 4188004k free, 4742904k cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + + 35184 omm 20 0 822m 421m 128m S 0 5.4 5:28.15 gaussdb + 1 root 20 0 13592 820 784 S 0 0.0 1:16.62 init +``` + +分析时,请主要关注进程占用的CPU利用率。 + +其中,统计信息中“us”表示用户空间占用CPU百分比,“sy”表示内核空间占用CPU百分比,“id”表示空闲CPU百分比。如果“id”低于10%,即表明CPU负载较高,可尝试通过降低本节点任务量等手段降低CPU负载。 + +## 性能参数分析 + +1. 使用“top -H”命令查看CPU,显示内容如下所示。 + + ``` + 14 root 20 0 0 0 0 S 0 0.0 0:16.41 events/3 + top - 14:22:49 up 5 days, 21:51, 2 users, load average: 0.08, 0.08, 0.06 + Tasks: 312 total, 1 running, 311 sleeping, 0 stopped, 0 zombie + Cpu(s): 1.3%us, 0.7%sy, 0.0%ni, 95.0%id, 2.4%wa, 0.5%hi, 0.2%si, 0.0%st + Mem: 8038844k total, 5317668k used, 2721176k free, 180268k buffers + Swap: 4192924k total, 0k used, 4192924k free, 2886860k cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + + 3105 root 20 0 50492 11m 2708 S 3 0.1 22:22.56 acc-snf + + 4015 gdm 20 0 232m 23m 11m S 0 0.3 11:34.70 gdm-simple-gree + 51001 omm 20 0 12140 1484 948 R 0 0.0 0:00.94 top + + 54885 omm 20 0 615m 396m 116m S 0 5.1 0:09.44 gaussdb + + + 1 root 20 0 13592 944 792 S 0 0.0 0:08.54 init + ``` + +2. 根据查询结果中“Cpu\(s\)”分析是系统CPU(sy)还是用户CPU(us)占用过高。 + - 如果是系统CPU占用过高,需要查找异常系统进程进行处理。 + - 如果是“USER”为omm的openGauss进程CPU占用过高,请根据目前运行的业务查询内容,对业务SQL进行优化。请根据以下步骤,并结合当前正在运行的业务特征进行分析,是否该程序处于死循环逻辑。 + 1. 使用“top -H -p pid”查找进程内占用的CPU百分比较高的线程,进行分析。 + + ``` + top -H -p 54952 + ``` + + 查询结果如下所示,top中可以看到占用CPU很高的线程,下面以线程54775为主,分析其为何占用CPU过高。 + + ``` + top - 14:23:27 up 5 days, 21:52, 2 users, load average: 0.04, 0.07, 0.05 + Tasks: 13 total, 0 running, 13 sleeping, 0 stopped, 0 zombie + Cpu(s): 0.9%us, 0.4%sy, 0.0%ni, 97.3%id, 1.1%wa, 0.2%hi, 0.1%si, 0.0%st + Mem: 8038844k total, 5322180k used, 2716664k free, 180316k buffers + Swap: 4192924k total, 0k used, 4192924k free, 2889860k cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 54775 omm 20 0 684m 424m 131m S 0 5.4 0:00.32 gaussdb + 54951 omm 20 0 684m 424m 131m S 0 5.4 0:00.84 gaussdb + 54732 omm 20 0 684m 424m 131m S 0 5.4 0:00.24 gaussdb + 54758 omm 20 0 684m 424m 131m S 0 5.4 0:00.00 gaussdb + 54759 omm 20 0 684m 424m 131m S 0 5.4 0:00.02 gaussdb + 54773 omm 20 0 684m 424m 131m S 0 5.4 0:02.79 gaussdb + 54780 omm 20 0 684m 424m 131m S 0 5.4 0:00.04 gaussdb + 54781 omm 20 0 684m 424m 131m S 0 5.4 0:00.21 gaussdb + 54782 omm 20 0 684m 424m 131m S 0 5.4 0:00.02 gaussdb + 54798 omm 20 0 684m 424m 131m S 0 5.4 0:16.70 gaussdb + 54952 omm 20 0 684m 424m 131m S 0 5.4 0:07.51 gaussdb + 54953 omm 20 0 684m 424m 131m S 0 5.4 0:00.81 gaussdb + 54954 omm 20 0 684m 424m 131m S 0 5.4 0:06.54 gaussdb + ``` + + 2. 使用“gstack ”查看进程内各线程的函数调用栈。查找上一步骤中占用CPU较高的线程ID对应的线程号。 + + ``` + gstack 54954 + ``` + + 查询结果如下所示,其中线程ID54775对应线程号是10。 + + ``` + 192.168.0.11:~ # gstack 54954 + Thread 10 (Thread 0x7f95a5fff710 (LWP 54775)): + #0 0x00007f95c41d63c6 in poll () from /lib64/libc.so.6 + #1 0x0000000000d3d2d3 in WaitLatchOrSocket(Latch volatile*, int, int, long) () + #2 0x000000000095ed25 in XLogPageRead(XLogRecPtr*, int, bool, bool) () + #3 0x000000000095f6dd in ReadRecord(XLogRecPtr*, int, bool) () + #4 0x000000000096aef0 in StartupXLOG() () + #5 0x0000000000d5607a in StartupProcessMain() () + #6 0x00000000009e19f9 in AuxiliaryProcessMain(int, char**) () + #7 0x0000000000d50135 in SubPostmasterMain(int, char**) () + #8 0x0000000000d504ec in MainStarterThreadFunc(void*) () + #9 0x00007f95c79b85f0 in start_thread () from /lib64/libpthread.so.0 + #10 0x00007f95c41df84d in clone () from /lib64/libc.so.6 + #11 0x0000000000000000 in ?? () + ``` + + + + diff --git a/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md b/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md index 211019c49..06c11970c 100644 --- a/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md +++ b/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md @@ -88,5 +88,5 @@ postgres=# DROP DATA SOURCE ds_test4; ## 相关链接 -**[ALTER DATA SOURCE](ALTER-DATA-SOURCE.md#ZH-CN_TOPIC_0242370520), [DROP DATA SOURCE](DROP-DATA-SOURCE.md#ZH-CN_TOPIC_0242370599)** +[ALTER DATA SOURCE](ALTER-DATA-SOURCE.md), [DROP DATA SOURCE](DROP-DATA-SOURCE.md) diff --git a/content/zh/docs/Developerguide/CREATE-DATABASE.md b/content/zh/docs/Developerguide/CREATE-DATABASE.md index 08e9b2cd1..565c5e31b 100644 --- a/content/zh/docs/Developerguide/CREATE-DATABASE.md +++ b/content/zh/docs/Developerguide/CREATE-DATABASE.md @@ -74,7 +74,7 @@ CREATE DATABASE database_name 指定兼容的数据库的类型。 - 取值范围:A、B、C。分别表示兼容Oracle、Mysql和TD。 + 取值范围:A、B、C。分别表示兼容O、MY和TD。 - **TABLESPACE \[ = \] tablespace\_name** @@ -163,8 +163,8 @@ postgres=# DROP DATABASE ora_compatible_db; 事务中不支持创建database。 -- **ENCODING** +- **ENCODING LC\_COLLATE LC\_CTYPE** - 当新建数据库Encoding与模板数据库(SQL\_ASCII)不匹配(为'GBK' /'UTF8'/'LATIN1')时,必须指定template \[=\] template0。 + 当新建数据库Encoding、LC-Collate 或LC\_Ctype与模板数据库(SQL\_ASCII)不匹配(为'GBK' /'UTF8'/'LATIN1')时,必须指定template \[=\] template0。 diff --git a/content/zh/docs/Developerguide/CREATE-DIRECTORY.md b/content/zh/docs/Developerguide/CREATE-DIRECTORY.md index 9f8331f85..1bdd62902 100644 --- a/content/zh/docs/Developerguide/CREATE-DIRECTORY.md +++ b/content/zh/docs/Developerguide/CREATE-DIRECTORY.md @@ -2,9 +2,7 @@ ## 功能描述 -使用CREATE DIRECTORY语句创建一个目录对象,该目录对象定义了服务器文件系统上目录的别名,用于存放用户使用的数据文件,用户可以通过utl\_file高级包来读写这些文件。 - -该目录对象对于指定用户可以赋予READ和WRITE的操作权限,用于给utl\_file提供权限控制。 +使用CREATE DIRECTORY语句创建一个目录对象,该目录对象定义了服务器文件系统上目录的别名,用于存放用户使用的数据文件。 ## 注意事项 @@ -53,5 +51,5 @@ postgres=# CREATE OR REPLACE DIRECTORY dir as '/tmp/'; ## 相关链接 -[ALTER DIRECTORY](ALTER-DIRECTORY.md#ZH-CN_TOPIC_0242370522),[DROP DIRECTORY](DROP-DIRECTORY.md#ZH-CN_TOPIC_0242370600) +[ALTER DIRECTORY](ALTER-DIRECTORY.md),[DROP DIRECTORY](DROP-DIRECTORY.md) diff --git a/content/zh/docs/Developerguide/CREATE-FUNCTION.md b/content/zh/docs/Developerguide/CREATE-FUNCTION.md index b19d0b207..28fc1842c 100644 --- a/content/zh/docs/Developerguide/CREATE-FUNCTION.md +++ b/content/zh/docs/Developerguide/CREATE-FUNCTION.md @@ -9,9 +9,9 @@ - 如果创建函数时参数或返回值带有精度,不进行精度检测。 - 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。 - 在创建函数时,函数内部通过SET语句设置current\_schema和search\_path无效。执行完函数search\_path和current\_schema与执行函数前的search\_path和current\_schema保持一致。 -- 如果函数参数中带有出参,SELECT调用函数必须缺省出参,CALL调用函数适配A必须指定出参,对于调用重载的带有PACKAGE属性的函数,CALL调用函数可以缺省出参,具体信息参见[CALL](CALL.md)的示例。 +- 如果函数参数中带有出参,SELECT调用函数必须缺省出参,CALL调用函数必须指定出参,对于调用重载的带有PACKAGE属性的函数,CALL调用函数可以缺省出参,具体信息参见[CALL](CALL.md)的示例。 - 兼容Postgresql风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。 -- SELECT调用可以指定不同参数来进行同名函数调用。由于语法CALL适配自A,因此不支持调用不带有PACKAGE属性的同名函数。 +- SELECT调用可以指定不同参数来进行同名函数调用。由于语法不支持调用不带有PACKAGE属性的同名函数。 - 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 - 新创建的函数默认会给PUBLIC授予执行权限(详见[GRANT](GRANT.md))。用户可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。 @@ -40,12 +40,11 @@ ][...] { AS 'definition' - | AS 'obj_file', 'link_symbol' } ``` -- A风格的创建自定义函数的语法。 +- O风格的创建自定义函数的语法。 ``` CREATE [ OR REPLACE ] FUNCTION function_name @@ -127,11 +126,11 @@ - **LANGUAGE lang\_name** - 用以实现函数的语言的名称。可以是SQL,C,internal,或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号(包围)。若采用单引号,则引号内必须为大写。 + 用以实现函数的语言的名称。可以是SQL,internal,或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号(包围)。若采用单引号,则引号内必须为大写。 - **WINDOW** - 表示该函数是窗口函数,通常只用于C语言编写的函数。替换函数定义时不能改变WINDOW属性。 + 表示该函数是窗口函数。替换函数定义时不能改变WINDOW属性。 >![](public_sys-resources/icon-notice.gif) **须知:** >自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 @@ -148,9 +147,9 @@ 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 -- PACKAGE +- **PACKAGE** - 表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对A风格的函数。 + 表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对其它风格的函数。 - 不允许package函数和非package函数重载或者替换。 - package函数不支持VARIADIC类型的参数。 @@ -224,10 +223,6 @@ 取当前会话中的值设置为configuration\_parameter的值。 -- **obj\_file, link\_symbol** - - 适用于C语言函数,字符串_obj\_file_指定了动态库的绝对路径;_link\_symbol_指定了该函数的链接符号,也就是该函数在C代码中的函数名称。 - - **plsql\_body** PL/SQL存储过程体。 @@ -299,10 +294,3 @@ postgres=# DROP FUNCTION func_add_sql; [ALTER FUNCTION](ALTER-FUNCTION.md),[DROP FUNCTION](DROP-FUNCTION.md) -## 优化建议 - -- analyse | analyze - - 不支持在事务或匿名块中执行analyze 。 - - 不支持在函数或存储过程中执行analyze操作。 - - diff --git a/content/zh/docs/Developerguide/CREATE-GROUP.md b/content/zh/docs/Developerguide/CREATE-GROUP.md index 09be785ed..6848b9d6d 100644 --- a/content/zh/docs/Developerguide/CREATE-GROUP.md +++ b/content/zh/docs/Developerguide/CREATE-GROUP.md @@ -11,18 +11,13 @@ CREATE GROUP是CREATE ROLE的别名,非SQL标准语法,不推荐使用,建 ## 语法格式 ``` -CREATE GROUP group_name [ [ WITH ] option [ ... ] ] - [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; +CREATE GROUP group_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; ``` -其中可选项action子句语法为: +其中可选项option子句语法为: ``` -where option can be: {SYSADMIN | NOSYSADMIN} - | {MONADMIN | NOMONADMIN} - | {OPRADMIN | NOOPRADMIN} - | {POLADMIN | NOPOLADMIN} | {AUDITADMIN | NOAUDITADMIN} | {CREATEDB | NOCREATEDB} | {USEFT | NOUSEFT} @@ -36,13 +31,13 @@ where option can be: | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' - | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' - | NODE GROUP logic_group_name + | TEMP SPACE 'tmpspacelimit' + | SPILL SPACE 'spillspacelimit' | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] - | ADMIN role_name [, ...] + | ADMIN rol e_name [, ...] | USER role_name [, ...] | SYSID uid | DEFAULT TABLESPACE tablespace_name @@ -57,5 +52,5 @@ where option can be: ## 相关链接 -[ALTER GROUP](ALTER-GROUP.md#ZH-CN_TOPIC_0242370526),[DROP GROUP](DROP-GROUP.md#ZH-CN_TOPIC_0242370603),[CREATE ROLE](CREATE-ROLE.md) +[ALTER GROUP](ALTER-GROUP.md),[DROP GROUP](DROP-GROUP.md),[CREATE ROLE](CREATE-ROLE.md) diff --git a/content/zh/docs/Developerguide/CREATE-INDEX.md b/content/zh/docs/Developerguide/CREATE-INDEX.md index f199c930e..d81a88145 100644 --- a/content/zh/docs/Developerguide/CREATE-INDEX.md +++ b/content/zh/docs/Developerguide/CREATE-INDEX.md @@ -83,6 +83,9 @@ 行存表支持的索引类型:btree(行存表缺省值)、gin、gist。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。 + >![](public_sys-resources/icon-note.gif) **说明:** + >列存表对GIN索引支持仅限于对于tsvector类型的支持,即创建列存GIN索引入参需要为to\_tsvector函数(的返回值)。此方法为GIN索引比较普遍的使用方式。 + - **column\_name** 表中需要创建索引的列的名称(字段名)。 @@ -279,6 +282,12 @@ postgres=# DROP TABLESPACE example1; postgres=# DROP TABLESPACE example2; postgres=# DROP TABLESPACE example3; postgres=# DROP TABLESPACE example4; + +--创建列存表以及列存表GIN索引。 +postgres=# create table cgin_create_test(a int, b text) with (orientation = column); +CREATE TABLE +postgres=# create index cgin_test on cgin_create_test using gin(to_tsvector('ngram', b)); +CREATE INDEX ``` ## 相关链接 diff --git a/content/zh/docs/Developerguide/CREATE-PROCEDURE.md b/content/zh/docs/Developerguide/CREATE-PROCEDURE.md index cbef8fef8..ee804d0d5 100644 --- a/content/zh/docs/Developerguide/CREATE-PROCEDURE.md +++ b/content/zh/docs/Developerguide/CREATE-PROCEDURE.md @@ -9,7 +9,7 @@ - 如果创建存储过程时参数或返回值带有精度,不进行精度检测。 - 创建存储过程时,存储过程定义中对表对象的操作建议都显示指定模式,否则可能会导致存储过程执行异常。 - 在创建存储过程时,存储过程内部通过SET语句设置current\_schema和search\_path无效。执行完函数search\_path和current\_schema与执行函数前的search\_path和current\_schema保持一致。 -- 如果存储过程参数中带有出参,SELECT调用存储过程必须缺省出参,CALL调用存储过程适配A,调用非重载函数时必须指定出参,对于重载的package函数,out参数可以缺省,具体信息参见[CALL](CALL.md)的示例。 +- 如果存储过程参数中带有出参,SELECT调用存储过程必须缺省出参,CALL调用存储过程调用非重载函数时必须指定出参,对于重载的package函数,out参数可以缺省,具体信息参见[CALL](CALL.md)的示例。 - 存储过程指定package属性时支持重载。 - 在创建procedure时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 diff --git a/content/zh/docs/Developerguide/CREATE-ROLE.md b/content/zh/docs/Developerguide/CREATE-ROLE.md index c4eff61ba..b00c1353c 100644 --- a/content/zh/docs/Developerguide/CREATE-ROLE.md +++ b/content/zh/docs/Developerguide/CREATE-ROLE.md @@ -34,11 +34,9 @@ CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' - | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' | TEMP SPACE 'tmpspacelimit' | SPILL SPACE 'spillspacelimit' - | NODE GROUP logic_cluster_name | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] @@ -59,6 +57,9 @@ CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { 取值范围:字符串,要符合标识符的命名规范,且最多为63个字符。若超过63个字符,数据库会截断并保留前63个字符当做角色名称。在创建角色时,数据库的时候会给出提示信息。 + >![](public_sys-resources/icon-note.gif) **说明:** + >标识符需要为字母、下划线、数字(0-9)或美元符号($),且必须以字母(a-z)或下划线(\_)开头。 + - **password** 登录密码。 @@ -156,11 +157,7 @@ CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { - **RESOURCE POOL** - 设置角色使用的resource pool名称,该名称属于系统表:pg\_resource\_pool - -- **USER GROUP 'groupuser'** - - 创建一个user的子用户。 + 设置角色使用的resource pool名称,该名称属于系统表:pg\_resource\_pool。 - **PERM SPACE** @@ -235,5 +232,5 @@ postgres=# DROP ROLE miriam; ## 相关链接 -[SET ROLE](SET-ROLE.md),[ALTER ROLE](ALTER-ROLE.md),[DROP ROLE](DROP-ROLE.md),[GRANT](GRANT.md),[REVOKE](REVOKE.md) +[SET ROLE](SET-ROLE.md),[ALTER ROLE](ALTER-ROLE.md),[DROP ROLE](DROP-ROLE.md),[GRANT](GRANT.md) diff --git a/content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md b/content/zh/docs/Developerguide/CREATE-ROW-LEVEL-SECURITY-POLICY.md similarity index 99% rename from content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md rename to content/zh/docs/Developerguide/CREATE-ROW-LEVEL-SECURITY-POLICY.md index acc5d59f8..931902aef 100644 --- a/content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md +++ b/content/zh/docs/Developerguide/CREATE-ROW-LEVEL-SECURITY-POLICY.md @@ -1,4 +1,4 @@ -# CREATE ROW LEVLEL SECURITY POLICY +# CREATE ROW LEVEL SECURITY POLICY ## 功能描述 @@ -55,7 +55,7 @@ CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name 行访问控制策略与适配的SQL语法关系参加下表: - **表 1** ROW LEVLEL SECURITY策略与适配SQL语法关系 + **表 1** ROW LEVEL SECURITY策略与适配SQL语法关系 - - @@ -48,12 +48,12 @@ DCL(Data Control Language数据控制语言),是用来创建用户角色 - - - - diff --git a/content/zh/docs/Developerguide/DO.md b/content/zh/docs/Developerguide/DO.md index 378cc6101..e7ed38109 100644 --- a/content/zh/docs/Developerguide/DO.md +++ b/content/zh/docs/Developerguide/DO.md @@ -37,7 +37,7 @@ postgres=# CREATE USER webuser PASSWORD 'Bigdata@123'; --授予用户webuser对模式tpcds下视图的所有操作权限。 postgres=# DO $$DECLARE r record; BEGIN - FOR r IN SELECT c.relname,n.nspname FROM pg_class c,pg_namespace n + FOR r IN SELECT c.relname table_name,n.nspname table_schema FROM pg_class c,pg_namespace n WHERE c.relnamespace = n.oid AND n.nspname = 'tpcds' AND relkind IN ('r','v') LOOP EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser'; diff --git a/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md b/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md index 24e55812a..e9a4262f0 100644 --- a/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md +++ b/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md @@ -1,20 +1,20 @@ # DROP DATA SOURCE -## **功能描述** +## 功能描述 删除一个Data Source对象。 -## **注意事项** +## 注意事项 只有属主/系统管理员/初始用户才可以删除一个Data Source对象。 -## **语法格式** +## 语法格式 ``` DROP DATA SOURCE [IF EXISTS] src_name [CASCADE | RESTRICT]; ``` -## **参数说明** +## 参数说明 - **src\_name** @@ -34,7 +34,7 @@ DROP DATA SOURCE [IF EXISTS] src_name [CASCADE | RESTRICT]; -## **示例** +## 示例 ``` --创建Data Source对象。 @@ -45,7 +45,7 @@ postgres=# DROP DATA SOURCE ds_tst1 CASCADE; postgres=# DROP DATA SOURCE IF EXISTS ds_tst1 RESTRICT; ``` -## **相关链接** +## 相关链接 -**[CREATE DATA SOURCE](CREATE-DATA-SOURCE.md#ZH-CN_TOPIC_0242370564)**,[ALTER DATA SOURCE](ALTER-DATA-SOURCE.md#ZH-CN_TOPIC_0242370520) +[CREATE DATA SOURCE](CREATE-DATA-SOURCE.md),[ALTER DATA SOURCE](ALTER-DATA-SOURCE.md) diff --git a/content/zh/docs/Developerguide/DROP-DATABASE.md b/content/zh/docs/Developerguide/DROP-DATABASE.md index 5465771c7..e87775eba 100644 --- a/content/zh/docs/Developerguide/DROP-DATABASE.md +++ b/content/zh/docs/Developerguide/DROP-DATABASE.md @@ -8,9 +8,8 @@ - 只有数据库所有者有权限执行DROP DATABASE命令,系统管理员默认拥有此权限。 - 不能对系统默认安装的三个数据库(POSTGRES、TEMPLATE0和TEMPLATE1)执行删除操作,系统做了保护。如果想查看当前服务中有哪几个数据库,可以用gsql的\\l命令查看。 -- 如果有用户正在与要删除的数据库连接,则删除操作失败。如果要查看当前存在哪些数据库连接,可以通过视图v$session查看。 +- 如果有用户正在与要删除的数据库连接,则删除操作失败。 - 不能在事务块中执行DROP DATABASE命令。 -- 确定删除数据库前需要执行“CLEAN CONNECTION TO ALL FORCE FOR DATABASE XXXX;”命令,用于强制停止当前已有的用户连接及后台线程,防止因为有后台线程未完全退出而导致的删库失败问题。此处需要注意,强制停止后台线程可能导致当前数据库数据一致性问题,此命令仅在确定删库阶段执行。 - 如果执行DROP DATABASE失败,事务回滚,需要再次执行一次DROP DATABASE IF EXISTS。 >![](public_sys-resources/icon-notice.gif) **须知:** diff --git a/content/zh/docs/Developerguide/DROP-DIRECTORY.md b/content/zh/docs/Developerguide/DROP-DIRECTORY.md index 498d82f84..96443acf7 100644 --- a/content/zh/docs/Developerguide/DROP-DIRECTORY.md +++ b/content/zh/docs/Developerguide/DROP-DIRECTORY.md @@ -2,7 +2,7 @@ ## 功能描述 -删除指定的directory表项。 +删除指定的directory对象。 ## 注意事项 @@ -29,11 +29,11 @@ DROP DIRECTORY [ IF EXISTS ] directory_name; --创建目录。 postgres=# CREATE OR REPLACE DIRECTORY dir as '/tmp/'; ---删除外部表。 +--删除目录。 postgres=# DROP DIRECTORY dir; ``` ## 相关链接 -[CREATE DIRECTORY](CREATE-DIRECTORY.md#ZH-CN_TOPIC_0242370565),[ALTER DIRECTORY](ALTER-DIRECTORY.md#ZH-CN_TOPIC_0242370522) +[CREATE DIRECTORY](CREATE-DIRECTORY.md),[ALTER DIRECTORY](ALTER-DIRECTORY.md) diff --git a/content/zh/docs/Developerguide/DROP-FUNCTION.md b/content/zh/docs/Developerguide/DROP-FUNCTION.md index 4bdd02032..8ea130e68 100644 --- a/content/zh/docs/Developerguide/DROP-FUNCTION.md +++ b/content/zh/docs/Developerguide/DROP-FUNCTION.md @@ -1,4 +1,4 @@ -# DROP FUNCTION +# DROP FUNCTION ## 功能描述 @@ -39,14 +39,10 @@ DROP FUNCTION [ IF EXISTS ] function_name 函数参数的类型 -- **CASCADE | RESTRICT** - - CASCADE:级联删除依赖于函数的对象(比如操作符) 。 - - RESTRICT:如果有任何依赖对象存在,则拒绝删除该函数(缺省行为)。 - ## 示例 -请参见CREATE FUNCTION的[SQL参考](SQL参考.md)。 +请参见的[示例](CREATE-FUNCTION.md#zh-cn_topic_0237122104_zh-cn_topic_0059778837_scc61c5d3cc3e48c1a1ef323652dda821)。 ## 相关链接 diff --git a/content/zh/docs/Developerguide/DROP-GROUP.md b/content/zh/docs/Developerguide/DROP-GROUP.md index 97d02cf9a..966531573 100644 --- a/content/zh/docs/Developerguide/DROP-GROUP.md +++ b/content/zh/docs/Developerguide/DROP-GROUP.md @@ -22,5 +22,5 @@ DROP GROUP [ IF EXISTS ] group_name [, ...]; ## 相关链接 -[CREATE GROUP](CREATE-GROUP.md#ZH-CN_TOPIC_0242370569),[ALTER GROUP](ALTER-GROUP.md#ZH-CN_TOPIC_0242370526),[DROP ROLE](DROP-ROLE.md#ZH-CN_TOPIC_0242370611) +[CREATE GROUP](CREATE-GROUP.md),[ALTER GROUP](ALTER-GROUP.md),[DROP ROLE](DROP-ROLE.md) diff --git a/content/zh/docs/Developerguide/DROP-INDEX.md b/content/zh/docs/Developerguide/DROP-INDEX.md index 978df4b09..054fa71ae 100644 --- a/content/zh/docs/Developerguide/DROP-INDEX.md +++ b/content/zh/docs/Developerguide/DROP-INDEX.md @@ -46,5 +46,5 @@ DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] ## 相关链接 -[ALTER INDEX](ALTER-INDEX.md#ZH-CN_TOPIC_0242370527),[CREATE INDEX](CREATE-INDEX.md) +[ALTER INDEX](ALTER-INDEX.md),[CREATE INDEX](CREATE-INDEX.md) diff --git a/content/zh/docs/Developerguide/DROP-OWNED.md b/content/zh/docs/Developerguide/DROP-OWNED.md index a60d4f92f..534871f03 100644 --- a/content/zh/docs/Developerguide/DROP-OWNED.md +++ b/content/zh/docs/Developerguide/DROP-OWNED.md @@ -30,5 +30,5 @@ DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]; ## 相关链接 -[REASSIGN OWNED](REASSIGN-OWNED.md#ZH-CN_TOPIC_0242370637) , [DROP ROLE](DROP-ROLE.md#ZH-CN_TOPIC_0242370611) +[REASSIGN OWNED](REASSIGN-OWNED.md) , [DROP ROLE](DROP-ROLE.md) diff --git a/content/zh/docs/Developerguide/DROP-ROLE.md b/content/zh/docs/Developerguide/DROP-ROLE.md index 7d92f25bc..811beeacb 100644 --- a/content/zh/docs/Developerguide/DROP-ROLE.md +++ b/content/zh/docs/Developerguide/DROP-ROLE.md @@ -33,5 +33,5 @@ DROP ROLE [ IF EXISTS ] role_name [, ...]; ## 相关链接 -[CREATE ROLE](CREATE-ROLE.md),[ALTER ROLE](ALTER-ROLE.md#ZH-CN_TOPIC_0242370532),[SET ROLE](SET-ROLE.md#ZH-CN_TOPIC_0242370652) +[CREATE ROLE](CREATE-ROLE.md),[ALTER ROLE](ALTER-ROLE.md),[SET ROLE](SET-ROLE.md) diff --git a/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md b/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md index 5bcd44c5a..810f8aa25 100644 --- a/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md +++ b/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md @@ -49,5 +49,5 @@ postgres=# DROP ROW LEVEL SECURITY POLICY all_data_rls ON all_data; ## 相关链接 -[ALTER ROW LEVEL SECURITY POLICY](ALTER-ROW-LEVEL-SECURITY-POLICY.md),[CREATE ROW LEVLEL SECURITY POLICY](CREATE-ROW-LEVLEL-SECURITY-POLICY.md) +[ALTER ROW LEVEL SECURITY POLICY](ALTER-ROW-LEVEL-SECURITY-POLICY.md),[CREATE ROW LEVEL SECURITY POLICY](CREATE-ROW-LEVEL-SECURITY-POLICY.md) diff --git a/content/zh/docs/Developerguide/DROP-SCHEMA.md b/content/zh/docs/Developerguide/DROP-SCHEMA.md index 3d4549f00..67c2b6d3d 100644 --- a/content/zh/docs/Developerguide/DROP-SCHEMA.md +++ b/content/zh/docs/Developerguide/DROP-SCHEMA.md @@ -43,5 +43,5 @@ DROP SCHEMA [ IF EXISTS ] schema_name [, ...] [ CASCADE | RESTRICT ]; ## 相关链接 -[ALTER SCHEMA](ALTER-SCHEMA.md#ZH-CN_TOPIC_0242370534),[CREATE SCHEMA](CREATE-SCHEMA.md#ZH-CN_TOPIC_0242370577)。 +[ALTER SCHEMA](ALTER-SCHEMA.md),[CREATE SCHEMA](CREATE-SCHEMA.md)。 diff --git a/content/zh/docs/Developerguide/DROP-SEQUENCE.md b/content/zh/docs/Developerguide/DROP-SEQUENCE.md index 2e8beb3ae..01c02c68b 100644 --- a/content/zh/docs/Developerguide/DROP-SEQUENCE.md +++ b/content/zh/docs/Developerguide/DROP-SEQUENCE.md @@ -45,5 +45,5 @@ postgres=# DROP SEQUENCE serial; ## 相关链接 -[ALTER SEQUENCE](ALTER-SEQUENCE.md#ZH-CN_TOPIC_0242370535), [DROP SEQUENCE](DROP-SEQUENCE.md#ZH-CN_TOPIC_0242370613) +[ALTER SEQUENCE](ALTER-SEQUENCE.md), [DROP SEQUENCE](DROP-SEQUENCE.md) diff --git a/content/zh/docs/Developerguide/DROP-SYNONYM.md b/content/zh/docs/Developerguide/DROP-SYNONYM.md new file mode 100644 index 000000000..3bac5f661 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-SYNONYM.md @@ -0,0 +1,39 @@ +# DROP SYNONYM + +## 功能描述 + +删除指定的SYNONYM对象。 + +## 注意事项 + +只有SYNONYM的所有者有权限执行DROP SYNONYM命令,系统管理员默认拥有此权限。 + +## 语法格式 + +``` +DROP SYNONYM [ IF EXISTS ] synonym_name [ CASCADE | RESTRICT ]; +``` + +## 参数描述 + +- **IF EXISTS** + + 如果指定的同义词不存在,则发出一个notice而不是抛出一个错误。 + +- **synonym\_name** + + 同义词名字,可以带模式名。 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除依赖同义词的对象(比如视图)。 + - RESTRICT:如果有依赖对象存在,则拒绝删除同义词。此选项为缺省值。 + + +## 示例 + +请参考CREATE SYNONYM的[示例](CREATE-SYNONYM.md#zh-cn_topic_0237122116_section1853433744413)。 + +## 相关链接 + +[ALTER SYNONYM](ALTER-SYNONYM.md),[CREATE SYNONYM](CREATE-SYNONYM.md) + diff --git a/content/zh/docs/Developerguide/DROP-TABLESPACE.md b/content/zh/docs/Developerguide/DROP-TABLESPACE.md index 3e10c736a..2ff52fff8 100644 --- a/content/zh/docs/Developerguide/DROP-TABLESPACE.md +++ b/content/zh/docs/Developerguide/DROP-TABLESPACE.md @@ -37,7 +37,7 @@ DROP TABLESPACE [ IF EXISTS ] tablespace_name; ## 相关链接 -[ALTER TABLESPACE](ALTER-TABLESPACE.md#ZH-CN_TOPIC_0242370542), [CREATE TABLESPACE](CREATE-TABLESPACE.md) +[ALTER TABLESPACE](ALTER-TABLESPACE.md), [CREATE TABLESPACE](CREATE-TABLESPACE.md) ## 优化建议 diff --git a/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md index bbf486636..d83e7d729 100644 --- a/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md +++ b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md @@ -39,5 +39,5 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name [ CASCADE | RESTRICT ]; ## 相关链接 -[ALTER TEXT SEARCH CONFIGURATION](ALTER-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370543), [CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370585) +[ALTER TEXT SEARCH CONFIGURATION](ALTER-TEXT-SEARCH-CONFIGURATION.md), [CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md) diff --git a/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md index 504a568b3..857ba513e 100644 --- a/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md +++ b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md @@ -48,5 +48,5 @@ DROP TEXT SEARCH DICTIONARY english; ## 相关链接 -[ALTER TEXT SEARCH DICTIONARY](ALTER-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370544),[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586) +[ALTER TEXT SEARCH DICTIONARY](ALTER-TEXT-SEARCH-DICTIONARY.md),[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md) diff --git a/content/zh/docs/Developerguide/DROP-TRIGGER.md b/content/zh/docs/Developerguide/DROP-TRIGGER.md index 770b536e4..62170b4fd 100644 --- a/content/zh/docs/Developerguide/DROP-TRIGGER.md +++ b/content/zh/docs/Developerguide/DROP-TRIGGER.md @@ -39,9 +39,9 @@ DROP TRIGGER [ IF EXISTS ] trigger_name ON table_name [ CASCADE | RESTRICT ]; ## 示例 -请参见[CREATE TRIGGER](CREATE-TRIGGER.md)的示例。 +请参见[CREATE TRIGGER](CREATE-TRIGGER.md)的[示例](CREATE-TRIGGER.md#zh-cn_topic_0237122123_zh-cn_topic_0059778166_sfbca773f5bcd4799b3ea668b3eb074fa)。 ## 相关链接 -[CREATE TRIGGER](CREATE-TRIGGER.md),[ALTER TRIGGER](ALTER-TRIGGER.md#ZH-CN_TOPIC_0242370545),[ALTER TABLE](ALTER-TABLE.md) +[CREATE TRIGGER](CREATE-TRIGGER.md),[ALTER TRIGGER](ALTER-TRIGGER.md),[ALTER TABLE](ALTER-TABLE.md) diff --git a/content/zh/docs/Developerguide/DROP-TYPE.md b/content/zh/docs/Developerguide/DROP-TYPE.md index 3942fe79e..f372bb596 100644 --- a/content/zh/docs/Developerguide/DROP-TYPE.md +++ b/content/zh/docs/Developerguide/DROP-TYPE.md @@ -35,5 +35,5 @@ DROP TYPE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ] ## 相关链接 -[CREATE TYPE](CREATE-TYPE.md#ZH-CN_TOPIC_0242370588),[CREATE TYPE](CREATE-TYPE.md#ZH-CN_TOPIC_0242370588) +[CREATE TYPE](CREATE-TYPE.md),[ALTER TYPE](ALTER-TYPE.md) diff --git a/content/zh/docs/Developerguide/DROP-USER.md b/content/zh/docs/Developerguide/DROP-USER.md index 2be27d000..ee3d3abd9 100644 --- a/content/zh/docs/Developerguide/DROP-USER.md +++ b/content/zh/docs/Developerguide/DROP-USER.md @@ -12,7 +12,6 @@ - 当参数enable\_kill\_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。 - 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即drop user不支持跨数据库进行级联删除。 -- 在多租户场景下,删除组用户时,业务用户也会同时被删除,如果指定CASCADE级联删除,那么删除业务用户时同时也指定CASCADE。如果在删除某个用户失败时,会报错,同时其他用户也无法成功删除。 - 如果该用户被DATA SOURCE对象依赖时,无法直接级联删除该用户,需要手动删除对应的DATA SOURCE对象之后再删除该用户。 ## 语法格式 diff --git a/content/zh/docs/Developerguide/DROP-VIEW.md b/content/zh/docs/Developerguide/DROP-VIEW.md index 868ef177c..d67562bc1 100644 --- a/content/zh/docs/Developerguide/DROP-VIEW.md +++ b/content/zh/docs/Developerguide/DROP-VIEW.md @@ -37,5 +37,5 @@ DROP VIEW [ IF EXISTS ] view_name [, ...] [ CASCADE | RESTRICT ]; ## 相关链接 -[ALTER VIEW](ALTER-VIEW.md#ZH-CN_TOPIC_0242370548),[CREATE VIEW](CREATE-VIEW.md#ZH-CN_TOPIC_0242370590) +[ALTER VIEW](ALTER-VIEW.md),[CREATE VIEW](CREATE-VIEW.md) diff --git a/content/zh/docs/Developerguide/FETCH.md b/content/zh/docs/Developerguide/FETCH.md index 02997374a..978253c23 100644 --- a/content/zh/docs/Developerguide/FETCH.md +++ b/content/zh/docs/Developerguide/FETCH.md @@ -86,8 +86,8 @@ NEXT 取值范围:有符号的整数 - count为正数就抓取当前关联位置之后的第count行。 - - count为负数,涉及到反向扫描操作,暂不支持。 - - 如果有数据的话,RELATIVE 0重新抓取当前行。 + - count为负数或0,涉及到反向扫描操作,暂不支持。 + - 如果当前行没有数据的话,RELATIVE 0返回空。 - count @@ -210,5 +210,5 @@ postgres=# CLOSE cursor1; ## 相关链接 -[CLOSE](CLOSE.md#ZH-CN_TOPIC_0242370555),[MOVE](MOVE.md#ZH-CN_TOPIC_0242370633) +[CLOSE](CLOSE.md),[MOVE](MOVE.md) diff --git a/content/zh/docs/Developerguide/FILE_IOSTAT.md b/content/zh/docs/Developerguide/FILE_IOSTAT.md new file mode 100644 index 000000000..fac6e895e --- /dev/null +++ b/content/zh/docs/Developerguide/FILE_IOSTAT.md @@ -0,0 +1,109 @@ +# FILE\_IOSTAT + +通过对数据文件IO的统计,反映数据的IO性能,用以发现IO操作异常等性能问题。 + +**表 1** FILE\_IOSTAT字段 + + +

Command

diff --git a/content/zh/docs/Developerguide/CREATE-SCHEMA.md b/content/zh/docs/Developerguide/CREATE-SCHEMA.md index 0256c5343..579c7f516 100644 --- a/content/zh/docs/Developerguide/CREATE-SCHEMA.md +++ b/content/zh/docs/Developerguide/CREATE-SCHEMA.md @@ -77,5 +77,5 @@ postgres=# DROP USER role1 CASCADE; ## 相关链接 -[ALTER SCHEMA](ALTER-SCHEMA.md#ZH-CN_TOPIC_0242370534),[DROP SCHEMA](DROP-SCHEMA.md#ZH-CN_TOPIC_0242370612) +[ALTER SCHEMA](ALTER-SCHEMA.md),[DROP SCHEMA](DROP-SCHEMA.md) diff --git a/content/zh/docs/Developerguide/CREATE-SEQUENCE.md b/content/zh/docs/Developerguide/CREATE-SEQUENCE.md index 9b23c8b73..a3cfdb26a 100644 --- a/content/zh/docs/Developerguide/CREATE-SEQUENCE.md +++ b/content/zh/docs/Developerguide/CREATE-SEQUENCE.md @@ -6,7 +6,7 @@ CREATE SEQUENCE用于向当前数据库里增加一个新的序列。序列的Ow ## 注意事项 -- Sequence是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 +- Sequence是一个存放等差数列的特殊表。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 - 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。 - 创建序列后,在表中使用序列的nextval\(\)函数和generate\_series\(1,N\)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate\_series\(\)函数会调用N+1次而导致报错。 @@ -136,5 +136,5 @@ postgres=# DROP SEQUENCE serial1 cascade; ## 相关链接 -[DROP SEQUENCE](DROP-SEQUENCE.md#ZH-CN_TOPIC_0242370613),[ALTER SEQUENCE](ALTER-SEQUENCE.md#ZH-CN_TOPIC_0242370535) +[DROP SEQUENCE](DROP-SEQUENCE.md),[ALTER SEQUENCE](ALTER-SEQUENCE.md) diff --git a/content/zh/docs/Developerguide/CREATE-SYNONYM.md b/content/zh/docs/Developerguide/CREATE-SYNONYM.md new file mode 100644 index 000000000..1c8c98927 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-SYNONYM.md @@ -0,0 +1,107 @@ +# CREATE SYNONYM + +## 功能描述 + +创建一个同义词对象。同义词是数据库对象的别名,用于记录与其他数据库对象名间的映射关系,用户可以使用同义词访问关联的数据库对象。 + +## 注意事项 + +- 定义同义词的用户成为其所有者。 +- 若指定模式名称,则同义词在指定模式中创建。否则,在当前模式创建。 +- 支持通过同义词访问的数据库对象包括:表、视图、函数和存储过程。 +- 使用同义词时,用户需要具有对关联对象的相应权限。 +- 支持使用同义词的DML语句包括:SELECT、INSERT、UPDATE、DELETE、EXPLAIN、CALL。 +- 不支持关联函数或存储过程的CREATE SYNONYM语句出现在存储过程中,建议存储过程中使用系统表pg\_synonym中已存在的同义词对象。 + +## 语法格式 + +``` +CREATE [ OR REPLACE ] SYNONYM synonym_name + FOR object_name; +``` + +## 参数说明 + +- **synonym** + + 创建的同义词名字,可以带模式名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **object\_name** + + 关联的对象名字,可以带模式名。 + + 取值范围:字符串,要符合标识符的命名规范。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >object\_name可以是不存在的对象名称。 + + +## 示例 + +``` +--创建模式ot。 +postgres=# CREATE SCHEMA ot; + +--创建表ot.t1及其同义词t1。 +postgres=# CREATE TABLE ot.t1(id int, name varchar2(10)); +postgres=# CREATE OR REPLACE SYNONYM t1 FOR ot.t1; + +--使用同义词t1。 +postgres=# SELECT * FROM t1; +postgres=# INSERT INTO t1 VALUES (1, 'ada'), (2, 'bob'); +postgres=# UPDATE t1 SET t1.name = 'cici' WHERE t1.id = 2; + +--创建同义词v1及其关联视图ot.v_t1。 +postgres=# CREATE SYNONYM v1 FOR ot.v_t1; +postgres=# CREATE VIEW ot.v_t1 AS SELECT * FROM ot.t1; + +--使用同义词v1。 +postgres=# SELECT * FROM v1; + +--创建重载函数ot.add及其同义词add。 +postgres=# CREATE OR REPLACE FUNCTION ot.add(a integer, b integer) RETURNS integer AS +$$ +SELECT $1 + $2 +$$ +LANGUAGE sql; + +postgres=# CREATE OR REPLACE FUNCTION ot.add(a decimal(5,2), b decimal(5,2)) RETURNS decimal(5,2) AS +$$ +SELECT $1 + $2 +$$ +LANGUAGE sql; + +postgres=# CREATE OR REPLACE SYNONYM add FOR ot.add; + +--使用同义词add。 +postgres=# SELECT add(1,2); +postgres=# SELECT add(1.2,2.3); + +--创建存储过程ot.register及其同义词register。 +postgres=# CREATE PROCEDURE ot.register(n_id integer, n_name varchar2(10)) +SECURITY INVOKER +AS +BEGIN + INSERT INTO ot.t1 VALUES(n_id, n_name); +END; +/ + +postgres=# CREATE OR REPLACE SYNONYM register FOR ot.register; + +--使用同义词register,调用存储过程。 +postgres=# CALL register(3,'mia'); + +--删除同义词。 +postgres=# DROP SYNONYM t1; +postgres=# DROP SYNONYM IF EXISTS v1; +postgres=# DROP SYNONYM IF EXISTS add; +postgres=# DROP SYNONYM register; +postgres=# DROP SCHEMA ot CASCADE; +``` + +## 相关链接 + +[ALTER SYNONYM](ALTER-SYNONYM.md),[DROP SYNONYM](DROP-SYNONYM.md) + diff --git a/content/zh/docs/Developerguide/CREATE-TABLE-AS.md b/content/zh/docs/Developerguide/CREATE-TABLE-AS.md index a3178a1bf..39b3b6162 100644 --- a/content/zh/docs/Developerguide/CREATE-TABLE-AS.md +++ b/content/zh/docs/Developerguide/CREATE-TABLE-AS.md @@ -21,7 +21,6 @@ CREATE [ UNLOGGED ] TABLE table_name [ WITH ( {storage_parameter = value} [, ... ] ) ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] - [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] AS query [ WITH [ NO ] DATA ]; ``` @@ -92,10 +91,6 @@ CREATE [ UNLOGGED ] TABLE table_name 指定新表将要在tablespace\_name表空间内创建。如果没有声明,将使用默认表空间。 -- **TO \{ GROUP groupname | NODE \( nodename \[, ... \] \) \}** - - TO GROUP指定创建表所在的Node Group。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 - - **AS query** 一个SELECT VALUES命令或者一个运行预备好的SELECT或VALUES查询的EXECUTE命令。 diff --git a/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md b/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md index 1a3f1bea7..fb3e73586 100644 --- a/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md +++ b/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md @@ -34,15 +34,10 @@ CREATE TABLE [ IF NOT EXISTS ] partition_table_name [ WITH ( {storage_parameter = value} [, ... ] ) ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] - - [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] - PARTITION BY { - {VALUES (partition_key)} | + PARTITION BY { {RANGE (partition_key) ( partition_less_than_item [, ... ] )} | {RANGE (partition_key) ( partition_start_end_item [, ... ] )} } [ { ENABLE | DISABLE } ROW MOVEMENT ]; - - ``` - 列约束column\_constraint: @@ -72,7 +67,7 @@ CREATE TABLE [ IF NOT EXISTS ] partition_table_name - like选项like\_option: ``` - { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | ALL } + { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS| ALL } ``` @@ -153,8 +148,7 @@ CREATE TABLE [ IF NOT EXISTS ] partition_table_name - 如果指定了INCLUDING STORAGE,则拷贝列的STORAGE设置也将被拷贝,默认情况下不包含STORAGE设置。 - 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释也会被拷贝过来。默认情况下,不拷贝源表的注释。 - 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)也将拷贝至新表。默认情况下,不拷贝源表的存储参数。 - - 如果指定了INCLUDING DISTRIBUTION,则新表将拷贝源表的分布信息,包括分布类型和分布列。默认情况下,不拷贝源表的分布信息。 - - INCLUDING ALL是INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS INCLUDING RELOPTIONS INCLUDING DISTRIBUTION的简写形式。 + - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 - **WITH \( storage\_parameter \[= value\] \[, ... \] \)** @@ -272,8 +266,8 @@ CREATE TABLE [ IF NOT EXISTS ] partition_table_name 取值范围: - - ENABLE:行迁移开关打开。 - - DISABLE(缺省值):行迁移开关关闭。 + - ENABLE(缺省值):行迁移开关打开。 + - DISABLE:行迁移开关关闭。 - **NOT NULL** diff --git a/content/zh/docs/Developerguide/CREATE-TABLE.md b/content/zh/docs/Developerguide/CREATE-TABLE.md index 9d992b160..8ba3139ab 100644 --- a/content/zh/docs/Developerguide/CREATE-TABLE.md +++ b/content/zh/docs/Developerguide/CREATE-TABLE.md @@ -7,7 +7,7 @@ ## 注意事项 - 列存表支持的数据类型请参考[列存表支持的数据类型](列存表支持的数据类型.md)。 -- 创建列存的数量建议不超过1000个。 +- 创建列存表的数量建议不超过1000个。 - 表中的主键约束和唯一约束必须包含分布列。 - 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 - 列存表的表级约束只支持PARTIAL CLUSTER KEY,不支持主外键等表级约束。 @@ -28,8 +28,7 @@ [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ COMPRESS | NOCOMPRESS ] - [ TABLESPACE tablespace_name ] - [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]; + [ TABLESPACE tablespace_name ]; ``` - 其中列约束column\_constraint为: @@ -65,8 +64,7 @@ - 其中like选项like\_option为: ``` - { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL } - + { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | ALL } ``` @@ -141,8 +139,7 @@ - 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 - 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。 - 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 - - 如果指定了INCLUDING DISTRIBUTION,则源表的分布信息会复制到新表中,包括分布类型和分布列。默认情况下,不拷贝源表的分布信息。 - - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS和INCLUDING DISTRIBUTION的内容。 + - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 >![](public_sys-resources/icon-notice.gif) **须知:** >- 如果源表包含serial、bigserial、smallseriral类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE ... OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。 @@ -171,7 +168,7 @@ - ROW,表示表的数据将以行式存储。 - 行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 + 行存储适合于OLTP业务,适用于点查询或者增删操作较多的场景。 - COLUMN,表示表的数据将以列式存储。 @@ -916,11 +913,8 @@ postgres=# DROP SCHEMA IF EXISTS joe CASCADE; - LIKE INCLUDING RELOPTIONS - 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 -- LIKE INCLUDING DISTRIBUTION - - 如果指定了INCLUDING DISTRIBUTION,则源表的分布信息会复制到新表中,包括分布类型和分布列。默认情况下,不拷贝源表的分布信息。 - - LIKE INCLUDING ALL - - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS和INCLUDING DISTRIBUTION的内容。 + - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS的内容。 - ORIENTATION ROW - 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 diff --git a/content/zh/docs/Developerguide/CREATE-TABLESPACE.md b/content/zh/docs/Developerguide/CREATE-TABLESPACE.md index 72e63fea0..60072d28c 100644 --- a/content/zh/docs/Developerguide/CREATE-TABLESPACE.md +++ b/content/zh/docs/Developerguide/CREATE-TABLESPACE.md @@ -34,7 +34,7 @@ WITH ( {filesystem= { 'general'| "general" | general} | 要创建的表空间名称。 - 表空间名称不能和数据openGauss中的其他表空间重名,且名称不能以"pg"开头,这样的名称留给系统表空间使用。 + 表空间名称不能和openGauss中的其他表空间重名,且名称不能以"pg"开头,这样的名称留给系统表空间使用。 取值范围:字符串,要符合标识符的命名规范。 diff --git a/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md index f6d0b6ffe..47dd6048b 100644 --- a/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md +++ b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md @@ -119,5 +119,5 @@ postgres=# DROP ROLE IF EXISTS joe; ## 相关链接 -[ALTER TEXT SEARCH CONFIGURATION](ALTER-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370543), [DROP TEXT SEARCH CONFIGURATION](DROP-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370618) +[ALTER TEXT SEARCH CONFIGURATION](ALTER-TEXT-SEARCH-CONFIGURATION.md), [DROP TEXT SEARCH CONFIGURATION](DROP-TEXT-SEARCH-CONFIGURATION.md) diff --git a/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md index a2265e398..5281b0bff 100644 --- a/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md +++ b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md @@ -4,7 +4,7 @@ 创建一个新的全文检索词典。词典是一种指定在全文检索时识别特定词并处理的方法。 -词典的创建依赖于预定义模板(在系统表[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md#ZH-CN_TOPIC_0242385854)中定义),支持创建五种类型的词典,分别是Simple、Ispell、Synonym、Thesaurus、以及Snowball,每种类型的词典可以完成不同的任务。 +词典的创建依赖于预定义模板(在系统表[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md)中定义),支持创建五种类型的词典,分别是Simple、Ispell、Synonym、Thesaurus、以及Snowball,每种类型的词典可以完成不同的任务。 ## 注意事项 @@ -33,7 +33,7 @@ CREATE TEXT SEARCH DICTIONARY name ( 模板名。 - 取值范围:系统表[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md#ZH-CN_TOPIC_0242385854)中定义的模板:Simple/Synonym/Thesaurus/Ispell/Snowball。 + 取值范围:系统表[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md)中定义的模板:Simple/Synonym/Thesaurus/Ispell/Snowball。 - **option** @@ -135,9 +135,9 @@ CREATE TEXT SEARCH DICTIONARY name ( ## 示例 -请参见[配置示例](配置示例.md#ZH-CN_TOPIC_0242370505)一节的示例。 +请参见[配置示例](配置示例.md)一节的示例。 ## 相关链接 -[ALTER TEXT SEARCH DICTIONARY](ALTER-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370544),[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586) +[ALTER TEXT SEARCH DICTIONARY](ALTER-TEXT-SEARCH-DICTIONARY.md),[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md) diff --git a/content/zh/docs/Developerguide/CREATE-TYPE.md b/content/zh/docs/Developerguide/CREATE-TYPE.md index 2fe0244a3..6b54f7d95 100644 --- a/content/zh/docs/Developerguide/CREATE-TYPE.md +++ b/content/zh/docs/Developerguide/CREATE-TYPE.md @@ -14,7 +14,7 @@ - 基本类型 - 用户可以自定义一种新的基本类型(标量类型)。通常来说这些函数必须是用C或者另外一种低层语言所编写。 + 用户可以自定义一种新的基本类型(标量类型)。通常来说这些函数必须是底层语言所编写。 - shell类型 @@ -227,7 +227,7 @@ CREATE TYPE name AS ENUM ## 示例 ``` ---创建一种复合类型,建表并插入数据以及查询: +--创建一种复合类型,建表并插入数据以及查询。 postgres=# CREATE TYPE compfoo AS (f1 int, f2 text); postgres=# CREATE TABLE t1_compfoo(a int, b compfoo); postgres=# CREATE TABLE t2_compfoo(a int, b compfoo); @@ -236,164 +236,39 @@ postgres=# INSERT INTO t2_compfoo select * from t1_typ5; postgres=# SELECT (b).f1 FROM t1_compfoo; postgres=# SELECT * FROM t1_compfoo t1 join t2_compfoo t2 on (t1.b).f1=(t1.b).f1; ---重命名数据类型: +--重命名数据类型。 postgres=# ALTER TYPE compfoo RENAME TO compfoo1; ---要改变一个用户定义类型compfoo1的所有者为usr1: -CREATE USER usr1 PASSWORD 'Bigdata@123'; +--要改变一个用户定义类型compfoo1的所有者为usr1。 +postgres=# CREATE USER usr1 PASSWORD 'Bigdata@123'; postgres=# ALTER TYPE compfoo1 OWNER TO usr1; ---把用户定义类型compfoo1的模式改变为usr1: +--把用户定义类型compfoo1的模式改变为usr1。 postgres=# ALTER TYPE compfoo1 SET SCHEMA usr1; -给一个数据类型增加一个新的属性: +--给一个数据类型增加一个新的属性。 postgres=# ALTER TYPE usr1.compfoo1 ADD ATTRIBUTE f3 int; -删除compfoo1类型: +--删除compfoo1类型。 postgres=# DROP TYPE usr1.compfoo1 cascade; -删除相关表和用户: +--删除相关表和用户。 postgres=# DROP TABLE t1_compfoo; postgres=# DROP TABLE t2_compfoo; postgres=# DROP SCHEMA usr1; postgres=# DROP USER usr1; ---创建一个枚举类型 +--创建一个枚举类型。 postgres=# CREATE TYPE bugstatus AS ENUM ('create', 'modify', 'closed'); ---添加一个标签值 +--添加一个标签值。 postgres=# ALTER TYPE bugstatus ADD VALUE IF NOT EXISTS 'regress' BEFORE 'closed'; ---重命名一个标签值 -postgres=# ALTER TYPE bugstatus RENAME VALUE 'create' BEFORE 'new'; - ---编译.so文件,并创建shell类型: -postgres=# CREATE TYPE complex; ---这个语句的作用是为要定义的类型创建了一个占位符,这样允许我们在定义其I/O函数时引用该类型。现在可以定义 I/O函数,需要注意的是在创建函数时function必须声明为NOT FENCED模式: -postgres=# CREATE FUNCTION -complex_in(cstring) - RETURNS complex - AS 'filename' - LANGUAGE C IMMUTABLE STRICT not fenced; - -postgres=# CREATE FUNCTION -complex_out(complex) - RETURNS cstring - AS 'filename' - LANGUAGE C IMMUTABLE STRICT not fenced; - -postgres=# CREATE FUNCTION -complex_recv(internal) - -RETURNS complex - -AS 'filename' - -LANGUAGE C IMMUTABLE STRICT not fenced; - -postgres=# CREATE FUNCTION -complex_send(complex) - -RETURNS bytea - -AS 'filename' - -LANGUAGE C IMMUTABLE STRICT not fenced; ---最后,提供该数据类型的完整定义: -postgres=# CREATE TYPE complex ( - -internallength = 16, - -input = complex_in, - -output = complex_out, - -receive = complex_recv, - -send = complex_send, - -alignment = double -); -``` - -input、output、receive及send函数对应的C函数定义如下: - -``` ---定义结构体Complex如下: -typedef struct Complex { - double x; - double y; -} Complex; - ---定义input函数: -PG_FUNCTION_INFO_V1(complex_in); - -Datum -complex_in(PG_FUNCTION_ARGS) -{ - char *str = PG_GETARG_CSTRING(0); - double x, - y; - Complex *result; - - if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid input syntax for complex: \"%s\"", - str))); - - result = (Complex *) palloc(sizeof(Complex)); - result->x = x; - result->y = y; - PG_RETURN_POINTER(result); -} - ---定义output函数: -PG_FUNCTION_INFO_V1(complex_out); - -Datum -complex_out(PG_FUNCTION_ARGS) -{ - Complex *complex = (Complex *) PG_GETARG_POINTER(0); - char *result; - - result = (char *) palloc(100); - snprintf(result, 100, "(%g,%g)", complex->x, complex->y); - PG_RETURN_CSTRING(result); -} - ---定义receive函数: -PG_FUNCTION_INFO_V1(complex_recv); - -Datum -complex_recv(PG_FUNCTION_ARGS) -{ - StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); - Complex *result; - - result = (Complex *) palloc(sizeof(Complex)); - result->x = pq_getmsgfloat8(buf); - result->y = pq_getmsgfloat8(buf); - PG_RETURN_POINTER(result); -} - ---定义send函数: -PG_FUNCTION_INFO_V1(complex_send); - -Datum -complex_send(PG_FUNCTION_ARGS) -{ - Complex *complex = (Complex *) PG_GETARG_POINTER(0); - StringInfoData buf; - - pq_begintypsend(&buf); - pq_sendfloat8(&buf, complex->x); - pq_sendfloat8(&buf, complex->y); - PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); -} +--重命名一个标签值。 +postgres=# ALTER TYPE bugstatus RENAME VALUE 'create' TO 'new'; ``` ## 相关链接 -[ALTER TYPE](ALTER-TYPE.md#ZH-CN_TOPIC_0242370546),[DROP TYPE](DROP-TYPE.md#ZH-CN_TOPIC_0242370621) +[ALTER TYPE](ALTER-TYPE.md),[DROP TYPE](DROP-TYPE.md) diff --git a/content/zh/docs/Developerguide/CREATE-USER.md b/content/zh/docs/Developerguide/CREATE-USER.md index d30c34c2a..f660f6e34 100644 --- a/content/zh/docs/Developerguide/CREATE-USER.md +++ b/content/zh/docs/Developerguide/CREATE-USER.md @@ -36,11 +36,9 @@ CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' - | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' | TEMP SPACE 'tmpspacelimit' | SPILL SPACE 'spillspacelimit' - | NODE GROUP logic_cluster_name | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] @@ -75,7 +73,7 @@ CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { 取值范围:字符串。 -CREATE USER的其他参数值请参考[CREATE ROLE参数说明](CREATE-ROLE.md)。 +CREATE USER的其他参数值请参考[CREATE ROLE](CREATE-ROLE.md)。 ## 示例 @@ -112,5 +110,5 @@ postgres=# DROP USER dim CASCADE; ## 相关链接 -[ALTER USER](ALTER-USER.md#ZH-CN_TOPIC_0242370547),[CREATE ROLE](CREATE-ROLE.md),[DROP USER](DROP-USER.md) +[ALTER USER](ALTER-USER.md),[CREATE ROLE](CREATE-ROLE.md),[DROP USER](DROP-USER.md) diff --git a/content/zh/docs/Developerguide/CREATE-VIEW.md b/content/zh/docs/Developerguide/CREATE-VIEW.md index e762093c0..e22b913a4 100644 --- a/content/zh/docs/Developerguide/CREATE-VIEW.md +++ b/content/zh/docs/Developerguide/CREATE-VIEW.md @@ -70,5 +70,5 @@ postgres=# DROP VIEW myView; ## 相关链接 -[ALTER VIEW](ALTER-VIEW.md#ZH-CN_TOPIC_0242370548),[DROP VIEW](DROP-VIEW.md#ZH-CN_TOPIC_0242370623) +[ALTER VIEW](ALTER-VIEW.md),[DROP VIEW](DROP-VIEW.md) diff --git a/content/zh/docs/Developerguide/CURSOR.md b/content/zh/docs/Developerguide/CURSOR.md index ec5f5d1ea..90485fa37 100644 --- a/content/zh/docs/Developerguide/CURSOR.md +++ b/content/zh/docs/Developerguide/CURSOR.md @@ -61,5 +61,5 @@ CURSOR cursor_name ## 相关链接 -[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629) +[FETCH](FETCH.md) diff --git a/content/zh/docs/Developerguide/Cache-IO.md b/content/zh/docs/Developerguide/Cache-IO.md new file mode 100644 index 000000000..025757ba0 --- /dev/null +++ b/content/zh/docs/Developerguide/Cache-IO.md @@ -0,0 +1,61 @@ +# Cache/IO + +- **[STATIO\_USER\_TABLES](STATIO_USER_TABLES.md)** + +- **[SUMMARY\_STATIO\_USER\_TABLES](SUMMARY_STATIO_USER_TABLES.md)** + +- **[GLOBAL\_STATIO\_USER\_TABLES](GLOBAL_STATIO_USER_TABLES.md)** + +- **[STATIO\_USER\_INDEXES](STATIO_USER_INDEXES.md)** + +- **[SUMMARY\_STATIO\_USER\_INDEXES](SUMMARY_STATIO_USER_INDEXES.md)** + +- **[GLOBAL\_STATIO\_USER\_INDEXES](GLOBAL_STATIO_USER_INDEXES.md)** + +- **[STATIO\_USER\_SEQUENCES](STATIO_USER_SEQUENCES.md)** + +- **[SUMMARY\_STATIO\_USER\_SEQUENCES](SUMMARY_STATIO_USER_SEQUENCES.md)** + +- **[GLOBAL\_STATIO\_USER\_SEQUENCES](GLOBAL_STATIO_USER_SEQUENCES.md)** + +- **[STATIO\_SYS\_TABLES](STATIO_SYS_TABLES.md)** + +- **[SUMMARY\_STATIO\_SYS\_TABLES](SUMMARY_STATIO_SYS_TABLES.md)** + +- **[GLOBAL\_STATIO\_SYS\_TABLES](GLOBAL_STATIO_SYS_TABLES.md)** + +- **[STATIO\_SYS\_INDEXES](STATIO_SYS_INDEXES.md)** + +- **[SUMMARY\_STATIO\_SYS\_INDEXES](SUMMARY_STATIO_SYS_INDEXES.md)** + +- **[GLOBAL\_STATIO\_SYS\_INDEXES](GLOBAL_STATIO_SYS_INDEXES.md)** + +- **[STATIO\_SYS\_SEQUENCES](STATIO_SYS_SEQUENCES.md)** + +- **[SUMMARY\_STATIO\_SYS\_SEQUENCES](SUMMARY_STATIO_SYS_SEQUENCES.md)** + +- **[GLOBAL\_STATIO\_SYS\_SEQUENCES](GLOBAL_STATIO_SYS_SEQUENCES.md)** + +- **[STATIO\_ALL\_TABLES](STATIO_ALL_TABLES.md)** + +- **[SUMMARY\_STATIO\_ALL\_TABLES](SUMMARY_STATIO_ALL_TABLES.md)** + +- **[GLOBAL\_STATIO\_ALL\_TABLES](GLOBAL_STATIO_ALL_TABLES.md)** + +- **[STATIO\_ALL\_INDEXES](STATIO_ALL_INDEXES.md)** + +- **[SUMMARY\_STATIO\_ALL\_INDEXES](SUMMARY_STATIO_ALL_INDEXES.md)** + +- **[GLOBAL\_STATIO\_ALL\_INDEXES](GLOBAL_STATIO_ALL_INDEXES.md)** + +- **[STATIO\_ALL\_SEQUENCES](STATIO_ALL_SEQUENCES.md)** + +- **[SUMMARY\_STATIO\_ALL\_SEQUENCES](SUMMARY_STATIO_ALL_SEQUENCES.md)** + +- **[GLOBAL\_STATIO\_ALL\_SEQUENCES](GLOBAL_STATIO_ALL_SEQUENCES.md)** + +- **[GLOBAL\_STAT\_DB\_CU](GLOBAL_STAT_DB_CU.md)** + +- **[GLOBAL\_STAT\_SESSION\_CU](GLOBAL_STAT_SESSION_CU.md)** + + diff --git a/content/zh/docs/Developerguide/Configuration.md b/content/zh/docs/Developerguide/Configuration.md new file mode 100644 index 000000000..6e7f74471 --- /dev/null +++ b/content/zh/docs/Developerguide/Configuration.md @@ -0,0 +1,7 @@ +# Configuration + +- **[CONFIG\_SETTINGS](CONFIG_SETTINGS.md)** + +- **[GLOBAL\_CONFIG\_SETTINGS](GLOBAL_CONFIG_SETTINGS.md)** + + diff --git "a/content/zh/docs/Developerguide/CopyManager\347\261\273\347\256\200\344\273\213.md" "b/content/zh/docs/Developerguide/CopyManager\347\261\273\347\256\200\344\273\213.md" index ce41beefc..61d012b6b 100644 --- "a/content/zh/docs/Developerguide/CopyManager\347\261\273\347\256\200\344\273\213.md" +++ "b/content/zh/docs/Developerguide/CopyManager\347\261\273\347\256\200\344\273\213.md" @@ -1,6 +1,6 @@ # CopyManager类简介 -CopyManager是 openGauss JDBC驱动中提供的一个API接口类,用于批量向openGaussopenGauss中导入数据。 +CopyManager是 openGauss JDBC驱动中提供的一个API接口类,用于批量向openGauss数据库中导入数据。 ## CopyManager的继承关系 diff --git a/content/zh/docs/Developerguide/DBE_PERF-Schema.md b/content/zh/docs/Developerguide/DBE_PERF-Schema.md new file mode 100644 index 000000000..7e0ffa9a0 --- /dev/null +++ b/content/zh/docs/Developerguide/DBE_PERF-Schema.md @@ -0,0 +1,41 @@ +# DBE\_PERF Schema + +DBE\_PERF Schema内视图主要用来诊断性能问题,也是WDR Snapshot的数据来源。数据库安装后,默认只有初始用户和监控管理员具有模式dbe\_perf的权限。若是由旧版本升级而来,为保持权限的前向兼容,模式dbe\_perf的权限与旧版本保持一致。从OS、Instance、Memory等多个维度划分组织视图,并且符合如下命名规范: + +- GLOBAL\_开头的视图,代表从数据库节点请求数据,并将数据追加对外返回,不会处理数据。 +- SUMMARY\_开头的视图,代表是将openGauss内的数据概述,多数情况下是返回数据库节点\(有时只有数据库主节点的\)的数据,会对数据进行加工和汇聚。 +- 非这两者开头的视图,一般代表本地视图,不会向其它数据库节点请求数据。 + +- **[OS](OS.md)** + +- **[Instance](Instance.md)** + +- **[Memory](Memory.md)** + +- **[File](File.md)** + +- **[Object](Object.md)** + +- **[Workload](Workload.md)** + +- **[Session/Thread](Session-Thread.md)** + +- **[Transaction](Transaction.md)** + +- **[Query](Query.md)** + +- **[Cache/IO](Cache-IO.md)** + +- **[Utility](Utility.md)** + +- **[Lock](Lock.md)** + +- **[Wait Events](Wait-Events.md)** + +- **[Configuration](Configuration.md)** + +- **[Operator](Operator.md)** + +- **[Workload Manager](Workload-Manager.md)** + + diff --git "a/content/zh/docs/Developerguide/DCL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" "b/content/zh/docs/Developerguide/DCL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" index 5fa356958..2bd184758 100644 --- "a/content/zh/docs/Developerguide/DCL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" +++ "b/content/zh/docs/Developerguide/DCL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" @@ -22,12 +22,12 @@ DCL(Data Control Language数据控制语言),是用来创建用户角色

修改角色属性

ALTER ROLE

+

ALTER ROLE

删除角色

DROP ROLE

+

DROP ROLE

创建用户

CREATE USER

+

CREATE USER

修改用户属性

ALTER USER

+

ALTER USER

删除用户

@@ -74,5 +74,5 @@ openGauss提供了收回权限的语句,请参考[REVOKE](REVOKE.md)。 ## 设置默认权限 -openGauss允许设置应用于将来创建的对象的权限,请参考[ALTER DEFAULT PRIVILEGES](ALTER-DEFAULT-PRIVILEGES.md#ZH-CN_TOPIC_0242370521)。 +openGauss允许设置应用于将来创建的对象的权限,请参考[ALTER DEFAULT PRIVILEGES](ALTER-DEFAULT-PRIVILEGES.md)。 diff --git a/content/zh/docs/Developerguide/DECLARE.md b/content/zh/docs/Developerguide/DECLARE.md index 4d94638a5..a22d578d3 100644 --- a/content/zh/docs/Developerguide/DECLARE.md +++ b/content/zh/docs/Developerguide/DECLARE.md @@ -4,7 +4,7 @@ DECLARE命令既可以定义一个游标,用于在一个大的查询里面检索少数几行数据,也可以作为一个匿名块的开始。 -本节主要描述定义为游标的用法,定义为匿名块的用法见[BEGIN](BEGIN.md)。 +本节主要描述定义为游标的用法,开启匿名块的用法见[BEGIN](BEGIN.md)。 为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 diff --git "a/content/zh/docs/Developerguide/DML\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" "b/content/zh/docs/Developerguide/DML\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" index 59e4009f8..6b7d75c00 100644 --- "a/content/zh/docs/Developerguide/DML\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" +++ "b/content/zh/docs/Developerguide/DML\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" @@ -16,7 +16,7 @@ DML(Data Manipulation Language数据操作语言),用于对数据库表中 ## 删除数据 -openGauss提供了两种删除表数据的语句:删除表中指定条件的数据,请参考[DELETE](DELETE.md);或删除表的所有数据,请参考[TRUNCATE](TRUNCATE.md#ZH-CN_TOPIC_0242370657)。 +openGauss提供了两种删除表数据的语句:删除表中指定条件的数据,请参考[DELETE](DELETE.md);或删除表的所有数据,请参考[TRUNCATE](TRUNCATE.md)。 TRUNCATE快速地从表中删除所有行,它和在每个表上进行无条件的DELETE有同样的效果,不过因为它不做表扫描,因而快得多。在大表上最有用。 @@ -26,7 +26,7 @@ openGauss提供了在表和文件之间拷贝数据的语句,请参考[COPY](C ## 锁定表 -openGauss提供了多种锁模式用于控制对表中数据的并发访问,请参考[LOCK](LOCK.md#ZH-CN_TOPIC_0242370632)。 +openGauss提供了多种锁模式用于控制对表中数据的并发访问,请参考[LOCK](LOCK.md)。 ## 调用函数 @@ -47,12 +47,12 @@ openGauss提供了三个用于调用函数的语句,它们在语法结构上

修改会话

ALTER SESSION

+

ALTER SESSION

结束会话

ALTER SYSTEM KILL SESSION

+

ALTER SYSTEM KILL SESSION

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

filenum

+

oid

+

文件标识。

+

dbid

+

oid

+

数据库标识。

+

spcid

+

oid

+

表空间标识。

+

phyrds

+

bigint

+

读物理文件的数目。

+

phywrts

+

bigint

+

写物理文件的数目。

+

phyblkrd

+

bigint

+

读物理文件块的数目。

+

phyblkwrt

+

bigint

+

写物理文件块的数目。

+

readtim

+

bigint

+

读文件的总时长(单位:微秒)。

+

writetim

+

bigint

+

写文件的总时长(单位:微秒)。

+

avgiotim

+

bigint

+

读写文件的平均时长(单位:微秒)。

+

lstiotim

+

bigint

+

最后一次读文件时长(单位:微秒)。

+

miniotim

+

bigint

+

读写文件的最小时长(单位:微秒)。

+

maxiowtm

+

bigint

+

读写文件的最大时长(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/FILE_REDO_IOSTAT.md b/content/zh/docs/Developerguide/FILE_REDO_IOSTAT.md new file mode 100644 index 000000000..73e16d954 --- /dev/null +++ b/content/zh/docs/Developerguide/FILE_REDO_IOSTAT.md @@ -0,0 +1,67 @@ +# FILE\_REDO\_IOSTAT + +本节点Redo\(WAL\)相关的统计信息。 + +**表 1** FILE\_REDO\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

phywrts

+

bigint

+

向wal buffer中写的次数。

+

phyblkwrt

+

bigint

+

向wal buffer中写的block的块数。

+

writetim

+

bigint

+

向xlog文件中写操作的时间(单位:微秒)。

+

avgiotim

+

bigint

+

平均写xlog的时间(writetim/phywrts)(单位:微秒)。

+

lstiotim

+

bigint

+

最后一次写xlog的时间(单位:微秒)。

+

miniotim

+

bigint

+

最小的写xlog时间(单位:微秒)。

+

maxiowtm

+

bigint

+

最大的写xlog时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/File.md b/content/zh/docs/Developerguide/File.md new file mode 100644 index 000000000..3899c50f4 --- /dev/null +++ b/content/zh/docs/Developerguide/File.md @@ -0,0 +1,21 @@ +# File + +- **[FILE\_IOSTAT](FILE_IOSTAT.md)** + +- **[SUMMARY\_FILE\_IOSTAT](SUMMARY_FILE_IOSTAT.md)** + +- **[GLOBAL\_FILE\_IOSTAT](GLOBAL_FILE_IOSTAT.md)** + +- **[FILE\_REDO\_IOSTAT](FILE_REDO_IOSTAT.md)** + +- **[SUMMARY\_FILE\_REDO\_IOSTAT](SUMMARY_FILE_REDO_IOSTAT.md)** + +- **[GLOBAL\_FILE\_REDO\_IOSTAT](GLOBAL_FILE_REDO_IOSTAT.md)** + +- **[LOCAL\_REL\_IOSTAT](LOCAL_REL_IOSTAT.md)** + +- **[GLOBAL\_REL\_IOSTAT](GLOBAL_REL_IOSTAT.md)** + +- **[SUMMARY\_REL\_IOSTAT](SUMMARY_REL_IOSTAT.md)** + + diff --git a/content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md b/content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md deleted file mode 100644 index 646ea7dc5..000000000 --- a/content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md +++ /dev/null @@ -1,32 +0,0 @@ -# GET\_GTM\_LITE\_STATUS - -GET\_GTM\_LITE\_STATUS视图是获取GTM上的backupXid和csn,用来支持问题定位。 - -**表 1** GET\_GTM\_LITE\_STATUS字段 - - - - - - - - - - - - - - - - -

名称

-

类型

-

描述

-

backup_xid

-

integer

-

GTM上的备份Xid值。

-

csn

-

integer

-

GTM当前csn值。

-
- diff --git a/content/zh/docs/Developerguide/GLOBAL_BGWRITER_STAT.md b/content/zh/docs/Developerguide/GLOBAL_BGWRITER_STAT.md new file mode 100644 index 000000000..a7f3153fc --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_BGWRITER_STAT.md @@ -0,0 +1,102 @@ +# GLOBAL\_BGWRITER\_STAT + +GLOBAL\_BGWRITER\_STAT视图显示各节点关于后端写进程活动的统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_BGWRITER\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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

+

这些统计被重置的时间。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_CKPT_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_CKPT_STATUS.md new file mode 100644 index 000000000..81379ce45 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_CKPT_STATUS.md @@ -0,0 +1,67 @@ +# GLOBAL\_CKPT\_STATUS + +GLOBAL\_CKPT\_STATUS视图用于显示openGauss所有实例的检查点信息和各类日志刷页情况。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_CKPT\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

ckpt_redo_point

+

test

+

当前实例的检查点。

+

ckpt_clog_flush_num

+

bigint

+

从启动到当前时间clog刷盘页面数。

+

ckpt_csnlog_flush_num

+

bigint

+

从启动到当前时间csnlog刷盘页面数。

+

ckpt_multixact_flush_num

+

bigint

+

从启动到当前时间multixact刷盘页面数。

+

ckpt_predicate_flush_num

+

bigint

+

从启动到当前时间predicate刷盘页面数。

+

ckpt_twophase_flush_num

+

bigint

+

从启动到当前时间twophase刷盘页面数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_CONFIG_SETTINGS.md b/content/zh/docs/Developerguide/GLOBAL_CONFIG_SETTINGS.md new file mode 100644 index 000000000..5bf8c048c --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_CONFIG_SETTINGS.md @@ -0,0 +1,137 @@ +# GLOBAL\_CONFIG\_SETTINGS + +GLOBAL\_CONFIG\_SETTINGS显示各节点数据库运行时参数的相关信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_CONFIG\_SETTINGS的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

name

+

text

+

参数名称。

+

setting

+

text

+

参数当前值。

+

unit

+

text

+

参数的隐式结构。

+

category

+

text

+

参数的逻辑组。

+

short_desc

+

text

+

参数的简单描述。

+

extra_desc

+

text

+

参数的详细描述。

+

context

+

text

+

设置参数值的上下文,包括internal,postmaster,sighup,backend,superuser,user。

+

vartype

+

text

+

参数类型,包括bool,enum,integer,real,string。

+

source

+

text

+

参数的赋值方式。

+

min_val

+

text

+

参数最大值。如果参数类型不是数值型,那么该字段值为null。

+

max_val

+

text

+

参数最小值。如果参数类型不是数值型,那么该字段值为null。

+

enumvals

+

text[]

+

enum类型参数合法值。如果参数类型不是enum型,那么该字段值为null。

+

boot_val

+

text

+

数据库启动时参数默认值。

+

reset_val

+

text

+

数据库重置时参数默认值。

+

sourcefile

+

text

+

设置参数值的配置文件。如果参数不是通过配置文件赋值,那么该字段值为null。

+

sourceline

+

integer

+

设置参数值的配置文件的行号。如果参数不是通过配置文件赋值,那么该字段值为null。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_DOUBLE_WRITE_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_DOUBLE_WRITE_STATUS.md new file mode 100644 index 000000000..c3841b730 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_DOUBLE_WRITE_STATUS.md @@ -0,0 +1,95 @@ +# GLOBAL\_DOUBLE\_WRITE\_STATUS + +GLOBAL\_DOUBLE\_WRITE\_STATUS视图显示openGauss所有实例的双写文件的情况。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_DOUBLEWRITE\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

curr_dwn

+

bigint

+

当前双写文件的序列号。

+

curr_start_page

+

bigint

+

当前双写文件恢复起始页面。

+

file_trunc_num

+

bigint

+

当前双写文件复用的次数。

+

file_reset_num

+

bigint

+

当前双写文件写满后发生重置的次数。

+

total_writes

+

bigint

+

当前双写文件总的I/O次数。

+

low_threshold_writes

+

bigint

+

低效率写双写文件的I/O次数(一次I/O刷页数量少于16页面)。

+

high_threshold_writes

+

bigint

+

高效率写双写文件的I/O次数(一次I/O刷页数量多于一批,421个页面)。

+

total_pages

+

bigint

+

当前刷页到双写文件区的总的页面个数。

+

low_threshold_pages

+

bigint

+

低效率刷页的页面个数。

+

high_threshold_pages

+

bigint

+

高效率刷页的页面个数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_FILE_IOSTAT.md b/content/zh/docs/Developerguide/GLOBAL_FILE_IOSTAT.md new file mode 100644 index 000000000..85384127d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_FILE_IOSTAT.md @@ -0,0 +1,116 @@ +# GLOBAL\_FILE\_IOSTAT + +得到所有节点上的数据文件IO 统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_FILE\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称

+

filenum

+

oid

+

文件标识。

+

dbid

+

oid

+

数据库标识。

+

spcid

+

oid

+

表空间标识。

+

phyrds

+

bigint

+

读物理文件的数目。

+

phywrts

+

bigint

+

写物理文件的数目。

+

phyblkrd

+

bigint

+

读物理文件块的数目。

+

phyblkwrt

+

bigint

+

写物理文件块的数目。

+

readtim

+

bigint

+

读文件的总时长(单位:微秒)。

+

writetim

+

bigint

+

写文件的总时长(单位:微秒)。

+

avgiotim

+

bigint

+

读写文件的平均时长(单位:微秒)。

+

lstiotim

+

bigint

+

最后一次读文件时长(单位:微秒)。

+

miniotim

+

bigint

+

读写文件的最小时长(单位:微秒)。

+

maxiowtm

+

bigint

+

读写文件的最大时长(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_FILE_REDO_IOSTAT.md b/content/zh/docs/Developerguide/GLOBAL_FILE_REDO_IOSTAT.md new file mode 100644 index 000000000..03f13ae79 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_FILE_REDO_IOSTAT.md @@ -0,0 +1,74 @@ +# GLOBAL\_FILE\_REDO\_IOSTAT + +得到openGauss内各节点的Redo\(WAL\)相关统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBALXC\_FILE\_REDO\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

phywrts

+

bigint

+

向wal buffer中写的次数。

+

phyblkwrt

+

bigint

+

向wal buffer中写的block的块数。

+

writetim

+

bigint

+

向xlog文件中写操作的时间(单位:微秒)。

+

avgiotim

+

bigint

+

平均写xlog的时间(writetim/phywrts)(单位:微秒)。

+

lstiotim

+

bigint

+

最后一次写xlog的时间(单位:微秒)。

+

miniotim

+

bigint

+

最小的写xlog时间(单位:微秒)。

+

maxiowtm

+

bigint

+

最大的写xlog时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_INSTANCE_TIME.md b/content/zh/docs/Developerguide/GLOBAL_INSTANCE_TIME.md new file mode 100644 index 000000000..f0aaf8fec --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_INSTANCE_TIME.md @@ -0,0 +1,46 @@ +# GLOBAL\_INSTANCE\_TIME + +提供openGauss中所有正常节点下的各种时间消耗信息\(时间类型见instance\_time视图\)。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_INSTANCE\_TIME字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程的名称。

+

stat_id

+

integer

+

统计编号。

+

stat_name

+

text

+

类型名称。

+

value

+

bigint

+

时间值(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_LOCKS.md b/content/zh/docs/Developerguide/GLOBAL_LOCKS.md new file mode 100644 index 000000000..cf01e0138 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_LOCKS.md @@ -0,0 +1,131 @@ +# GLOBAL\_LOCKS + +GLOBAL\_LOCKS视图用于查看各节点各打开事务所持有的锁信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_LOCKS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

locktype

+

text

+

被锁定对象的类型:relation,extend,page,tuple,transactionid,virtualxid,object,userlock,advisory。

+

database

+

oid

+
被锁定对象所在数据库的OID:
  • 如果被锁定的对象是共享对象,则OID为0。
  • 如果是一个事物ID,则为NULL。
+
+

relation

+

oid

+

关系的OID,如果锁定的对象不是关系,也不是关系的一部分,则为NULL。

+

page

+

integer

+

关系内部的页面编号,如果对象不是关系页或者不是行页,则为NULL。

+

tuple

+

smallint

+

页面里边的行编号,如果对象不是行,则为NULL。

+

virtualxid

+

text

+

事务的虚拟ID,如果对象不是一个虚拟事务ID,则为NULL。

+

transactionid

+

xid

+

事务的ID,如果对象不是一个事务ID,则为NULL。

+

classid

+

oid

+

包含该对象的系统表的OID,如果对象不是普通的数据库对象,则为NULL。

+

objid

+

oid

+

对象在其系统表内的OID,如果对象不是普通数据库对象,则为NULL。

+

objsubid

+

smallint

+

对于表的一个字段,这是字段编号;对于其他对象类型,这个字段是零;如果这个对象不是普通数据库对象,则为NULL。

+

virtualtransaction

+

text

+

持有此锁或者在等待此锁的事务的虚拟ID。

+

pid

+

bigint

+

持有或者等待这个锁的服务器线程的逻辑ID。如果锁是被一个预备事务持有的,则为NULL。

+

mode

+

text

+

这个线程持有的或者是期望的锁模式。

+

granted

+

boolean

+
  • 如果锁是持有锁,则为TRUE。
  • 如果锁是等待锁,则为FALSE。
+

fastpath

+

boolean

+

如果通过fast-path获得锁,则为TRUE;如果通过主要的锁表获得,则为FALSE。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_MEMORY_NODE_DETAIL.md b/content/zh/docs/Developerguide/GLOBAL_MEMORY_NODE_DETAIL.md new file mode 100644 index 000000000..8d6a28d7e --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_MEMORY_NODE_DETAIL.md @@ -0,0 +1,40 @@ +# GLOBAL\_MEMORY\_NODE\_DETAIL + +显示前openGauss中所有正常节点下的内存使用情况。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_MEMORY\_NODE\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

数据库进程名称。

+

memorytype

+

text

+
内存使用的名称。
  • max_process_memory:openGauss实例所占用的内存大小。
  • process_used_memory:进程所使用的内存大小。
  • max_dynamic_memory:最大动态内存。
  • dynamic_used_memory:已使用的动态内存。
  • dynamic_peak_memory:内存的动态峰值。
  • dynamic_used_shrctx:最大动态共享内存上下文。
  • dynamic_peak_shrctx:共享内存上下文的动态峰值。
  • max_shared_memory:最大共享内存。
  • shared_used_memory:已使用的共享内存。
  • max_cstore_memory:列存所允许使用的最大内存。
  • cstore_used_memory:列存已使用的内存大小。
  • max_sctpcomm_memory:sctp通信所允许使用的最大内存。
  • sctpcomm_used_memory:sctp通信已使用的内存大小。
  • sctpcomm_peak_memory:sctp通信的内存峰值。
  • other_used_memory:其他已使用的内存大小。
  • gpu_max_dynamic_memory:GPU最大动态内存。
  • gpu_dynamic_used_memory:GPU已使用的动态内存。
  • gpu_dynamic_peak_memory:GPU内存的动态峰值。
  • pooler_conn_memory:链接池申请内存计数。
  • pooler_freeconn_memory:链接池空闲连接的内存计数。
  • storage_compress_memory:存储模块压缩使用的内存大小。
  • udf_reserved_memory:UDF预留的内存大小。
+
+

memorymbytes

+

integer

+

内存使用的大小,单位为MB。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY.md b/content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY.md new file mode 100644 index 000000000..276d70a6d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY.md @@ -0,0 +1,173 @@ +# GLOBAL\_OPERATOR\_HISTORY + +GLOBAL\_OPERATOR\_HISTORY系统视图显示的是当前用户在数据库主节点上执行作业结束后的算子的相关记录。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_OPERATOR\_HISTORY的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

queryid

+

bigint

+

语句执行使用的内部query_id。

+

pid

+

bigint

+

后端线程id。

+

plan_node_id

+

integer

+

查询对应的执行计划的plan node id。

+

plan_node_name

+

text

+

对应于plan_node_id的算子的名称。

+

start_time

+

timestamp with time zone

+

该算子处理第一条数据的开始时间。

+

duration

+

bigint

+

该算子到结束时候总的执行时间(ms)。

+

query_dop

+

integer

+

当前算子执行时的并行度。

+

estimated_rows

+

bigint

+

优化器估算的行数信息。

+

tuple_processed

+

bigint

+

当前算子返回的元素个数。

+

min_peak_memory

+

integer

+

当前算子在数据库节点上的最小内存峰值(MB)。

+

max_peak_memory

+

integer

+

当前算子在数据库节点上的最大内存峰值(MB)。

+

average_peak_memory

+

integer

+

当前算子在数据库节点上的平均内存峰值(MB)。

+

memory_skew_percent

+

integer

+

当前算子在数据库节点间的内存使用倾斜率。

+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量(MB),默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_cpu_time

+

bigint

+

该算子在数据库节点上的最小执行时间(ms)。

+

max_cpu_time

+

bigint

+

该算子在数据库节点上的最大执行时间(ms)。

+

total_cpu_time

+

bigint

+

该算子在数据库节点上的总执行时间(ms)。

+

cpu_skew_percent

+

integer

+

数据库节点间执行时间的倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  1. Sort/SetOp/HashAgg/HashJoin spill
  2. Spill file size large than 256MB
  3. Broadcast size large than 100MB
  4. Early spill
  5. Spill times is greater than 3
  6. Spill on memory adaptive
  7. Hash table conflict
+
+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY_TABLE.md b/content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY_TABLE.md new file mode 100644 index 000000000..a596b4080 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_OPERATOR_HISTORY_TABLE.md @@ -0,0 +1,4 @@ +# GLOBAL\_OPERATOR\_HISTORY\_TABLE + +GLOBAL\_OPERATOR\_HISTORY\_TABLE视图显示数据库主节点执行作业结束后的算子相关的记录。此数据是从内核中转储到系统表GS\_WLM\_OPERATOR\_INFO中的数据。该视图是查询数据库主节点系统表GS\_WLM\_OPERATOR\_INFO的汇聚视图。表字段同[表1](GLOBAL_OPERATOR_HISTORY.md#zh-cn_topic_0237122744_zh-cn_topic_0111176227_table85181143511)。查询视图必须具有monadmin权限。 + diff --git a/content/zh/docs/Developerguide/GLOBAL_OPERATOR_RUNTIME.md b/content/zh/docs/Developerguide/GLOBAL_OPERATOR_RUNTIME.md new file mode 100644 index 000000000..35a87f58c --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_OPERATOR_RUNTIME.md @@ -0,0 +1,180 @@ +# GLOBAL\_OPERATOR\_RUNTIME + +GLOBAL\_OPERATOR\_RUNTIME视图显示当前用户在数据库主节点上正在执行的作业的算子相关信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_OPERATOR\_RUNTIME的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

queryid

+

bigint

+

语句执行使用的内部query_id。

+

pid

+

bigint

+

后端线程id。

+

plan_node_id

+

integer

+

查询对应的执行计划的plan node id。

+

plan_node_name

+

text

+

对应于plan_node_id的算子的名称。

+

start_time

+

timestamp with time zone

+

该算子处理第一条数据的开始时间。

+

duration

+

bigint

+

该算子到结束时候总的执行时间(ms)。

+

status

+

text

+

当前算子的执行状态,包括finished和running。

+

query_dop

+

integer

+

当前算子执行时的并行度。

+

estimated_rows

+

bigint

+

优化器估算的行数信息。

+

tuple_processed

+

bigint

+

当前算子返回的元素个数。

+

min_peak_memory

+

integer

+

当前算子在数据库节点上的最小内存峰值(MB)。

+

max_peak_memory

+

integer

+

当前算子在数据库节点上的最大内存峰值(MB)。

+

average_peak_memory

+

integer

+

当前算子在数据库节点上的平均内存峰值(MB)。

+

memory_skew_percent

+

integer

+

当前算子在数据库节点的内存使用倾斜率。

+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量(MB),默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_cpu_time

+

bigint

+

该算子在数据库节点上的最小执行时间(ms)。

+

max_cpu_time

+

bigint

+

该算子在数据库节点上的最大执行时间(ms)。

+

total_cpu_time

+

bigint

+

该算子在数据库节点上的总执行时间(ms)。

+

cpu_skew_percent

+

integer

+

数据库节点间执行时间的倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  • Sort/SetOp/HashAgg/HashJoin spill
  • Spill file size large than 256MB
  • Broadcast size large than 100MB
  • Early spill
  • Spill times is greater than 3
  • Spill on memory adaptive
  • Hash table conflict
+
+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_OS_RUNTIME.md b/content/zh/docs/Developerguide/GLOBAL_OS_RUNTIME.md new file mode 100644 index 000000000..488384650 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_OS_RUNTIME.md @@ -0,0 +1,60 @@ +# GLOBAL\_OS\_RUNTIME + +提供openGauss中所有正常节点下的操作系统运行状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_OS\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

id

+

integer

+

编号。

+

name

+

text

+

操作系统运行状态名称。

+

value

+

numeric

+

操作系统运行状态值。

+

comments

+

text

+

操作系统运行状态注释。

+

cumulative

+

boolean

+

操作系统运行状态的值是否为累加值。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_OS_THREADS.md b/content/zh/docs/Developerguide/GLOBAL_OS_THREADS.md new file mode 100644 index 000000000..d9c151059 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_OS_THREADS.md @@ -0,0 +1,53 @@ +# GLOBAL\_OS\_THREADS + +提供openGauss中所有正常节点下的线程状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_OS\_THREADS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

pid

+

bigint

+

当前节点进程中正在运行的线程号。

+

lwpid

+

integer

+

与pid对应的轻量级线程号。

+

thread_name

+

text

+

与pid对应的线程名称。

+

creation_time

+

timestamp with time zone

+

与pid对应的线程创建的时间。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_PAGEWRITER_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_PAGEWRITER_STATUS.md new file mode 100644 index 000000000..f0fc5d86e --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_PAGEWRITER_STATUS.md @@ -0,0 +1,74 @@ +# GLOBAL\_PAGEWRITER\_STATUS + +GLOBAL\_PAGEWRITER\_STATUS视图显示openGauss实例的刷页信息和检查点信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_PAGEWRITER\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

pgwr_actual_flush_total_num

+

bigint

+

从启动到当前时间总计刷脏页数量。

+

pgwr_last_flush_num

+

integer

+

上一批刷脏页数量。

+

remain_dirty_page_num

+

bigint

+

当前预计还剩余多少脏页。

+

queue_head_page_rec_lsn

+

text

+

当前实例的脏页队列第一个脏页的recovery_lsn。

+

queue_rec_lsn

+

text

+

当前实例的脏页队列的recovery_lsn。

+

current_xlog_insert_lsn

+

text

+

当前实例XLog写入的位置。

+

ckpt_redo_point

+

text

+

当前实例的检查点。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_RECORD_RESET_TIME.md b/content/zh/docs/Developerguide/GLOBAL_RECORD_RESET_TIME.md new file mode 100644 index 000000000..c930fb3d2 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_RECORD_RESET_TIME.md @@ -0,0 +1,32 @@ +# GLOBAL\_RECORD\_RESET\_TIME + +GLOBAL\_RECORD\_RESET\_TIME用于重置(重启,主备倒换,数据库删除)汇聚openGauss统计信息时间。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_RECORD\_RESET\_TIME字段 + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

reset_time

+

timestamp with time zone

+

重置时间点。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_RECOVERY_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_RECOVERY_STATUS.md new file mode 100644 index 000000000..fa200e16d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_RECOVERY_STATUS.md @@ -0,0 +1,81 @@ +# GLOBAL\_RECOVERY\_STATUS + +GLOBAL\_RECOVERY\_STATUS视图显示关于主机和备机的日志流控信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_RECOVERY\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

主机进程名称,包含主机和备机。

+

standby_node_name

+

text

+

备机进程名称。

+

source_ip

+

text

+

主机的IP地址。

+

source_port

+

integer

+

主机的端口号。

+

dest_ip

+

text

+

备机的IP地址。

+

dest_port

+

integer

+

备机的端口号。

+

current_rto

+

bigint

+

备机当前的日志流控时间,单位秒。

+

target_rto

+

bigint

+

备机通过GUC参数设置的预期流控时间,单位秒。

+

current_sleep_time

+

bigint

+

为了达到这个预期主机所需要的睡眠时间,单位微妙。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_REDO_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_REDO_STATUS.md new file mode 100644 index 000000000..b1302a926 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_REDO_STATUS.md @@ -0,0 +1,179 @@ +# GLOBAL\_REDO\_STATUS + +GLOBAL\_REDO\_STATUS视图显示openGauss实例的日志回放情况。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_REDO\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

redo_start_ptr

+

bigint

+

当前实例日志回放的起始点。

+

redo_start_time

+

bigint

+

当前实例日志回放的起始UTC时间。

+

redo_done_time

+

bigint

+

当前实例日志回放的结束UTC时间。

+

curr_time

+

bigint

+

当前实例的当前UTC时间。

+

min_recovery_point

+

bigint

+

当前实例日志的最小一致性点位置。

+

read_ptr

+

bigint

+

当前实例日志的读取位置。

+

last_replayed_read_ptr

+

bigint

+

当前实例的日志回放位置。

+

recovery_done_ptr

+

bigint

+

当前实例启动完成时的回放位置。

+

read_xlog_io_counter

+

bigint

+

当前实例读取回放日志的io次数计数。

+

read_xlog_io_total_dur

+

bigint

+

当前实例读取回放日志的io总时延。

+

read_data_io_counter

+

bigint

+

当前实例回放过程中读取数据页面的io次数计数。

+

read_data_io_total_dur

+

bigint

+

当前实例回放过程中读取数据页面的io总时延。

+

write_data_io_counter

+

bigint

+

当前实例回放过程中写数据页面的io次数计数。

+

write_data_io_total_dur

+

bigint

+

当前实例回放过程中写数据页面的io总时延。

+

process_pending_counter

+

bigint

+

当前实例回放过程中日志分发线程的同步次数计数。

+

process_pending_total_dur

+

bigint

+

当前实例回放过程中日志分发线程的同步总时延。

+

apply_counter

+

bigint

+

当前实例回放过程中回放线程的同步次数计数。

+

apply_total_dur

+

bigint

+

当前实例回放过程中回放线程的同步总时延。

+

speed

+

bigint

+

当前实例日志回放速率。

+

local_max_ptr

+

bigint

+

当前实例启动成功后本地收到的回放日志的最大值。

+

primary_flush_ptr

+

bigint

+

主机落盘日志的位置。

+

worker_info

+

text

+

当前实例回放线程信息,若没有开并行回放则该值为空。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_REL_IOSTAT.md b/content/zh/docs/Developerguide/GLOBAL_REL_IOSTAT.md new file mode 100644 index 000000000..7b7ad3792 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_REL_IOSTAT.md @@ -0,0 +1,53 @@ +# GLOBAL\_REL\_IOSTAT + +获取所有节点上的数据文件IO统计信息,查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_REL\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称

+

phyrds

+

bigint

+

读物理文件的数目。

+

phywrts

+

bigint

+

写物理文件的数目。

+

phyblkrd

+

bigint

+

读物理文件块的数目。

+

phyblkwrt

+

bigint

+

写物理文件块的数目。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_REPLICATION_SLOTS.md b/content/zh/docs/Developerguide/GLOBAL_REPLICATION_SLOTS.md new file mode 100644 index 000000000..aa47f227d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_REPLICATION_SLOTS.md @@ -0,0 +1,95 @@ +# GLOBAL\_REPLICATION\_SLOTS + +GLOBAL\_REPLICATION\_SLOTS视图用于查看openGauss各节点的复制节点的信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_REPLICATION\_SLOTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

slot_name

+

text

+

复制节点的名称。

+

plugin

+

text

+

插件名称。

+

slot_type

+

text

+

复制节点的类型。

+

datoid

+

oid

+

复制节点的数据库OID。

+

database

+

name

+

复制节点的数据库名称。

+

active

+

boolean

+

复制节点是否为激活状态。

+

x_min

+

xid

+

复制节点事务标识。

+

catalog_xmin

+

xid

+

逻辑复制槽对应的最早解码事务标识.

+

restart_lsn

+

text

+

复制节点的Xlog文件信息。

+

dummy_standby

+

boolean

+

复制节点是否为假备。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_REPLICATION_STAT.md b/content/zh/docs/Developerguide/GLOBAL_REPLICATION_STAT.md new file mode 100644 index 000000000..a6d905db3 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_REPLICATION_STAT.md @@ -0,0 +1,131 @@ +# GLOBAL\_REPLICATION\_STAT + +GLOBAL\_REPLICATION\_STAT视图用于获得各节点描述日志同步状态信息,如发起端发送日志位置,收端接收日志位置等。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_REPLICATION\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

pid

+

bigint

+

线程的PID。

+

usesysid

+

oid

+

用户系统ID。

+

usename

+

name

+

用户名。

+

application_name

+

text

+

程序名称。

+

client_addr

+

inet

+

客户端地址。

+

client_hostname

+

text

+

客户端名。

+

client_port

+

integer

+

客户端端口。

+

backend_start

+

timestamp with time zone

+

程序启动时间。

+

state

+

text

+

日志复制的状态(追赶状态,还是一致的流状态)。

+

sender_sent_location

+

text

+

发送端发送日志位置。

+

receiver_write_location

+

text

+

接收端write日志位置。

+

receiver_flush_location

+

text

+

接收端flush日志位置。

+

receiver_replay_location

+

text

+

接收端replay日志位置。

+

sync_priority

+

integer

+

同步复制的优先级(0表示异步)。

+

sync_state

+

text

+
同步状态:
  • 异步复制
  • 同步复制
  • 潜在同步者
+
+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY.md b/content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY.md new file mode 100644 index 000000000..44fa476bf --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY.md @@ -0,0 +1,53 @@ +# GLOBAL\_SESSION\_MEMORY + +统计各节点的Session级别的内存使用情况,包含执行作业在数据节点上Postgres线程和Stream线程分配的所有内存,单位为MB。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_SESSION\_MEMORY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

sessid

+

text

+

线程启动时间+线程标识。

+

init_mem

+

integer

+

当前正在执行作业进入执行器前已分配的内存。

+

used_mem

+

integer

+

当前正在执行作业已分配的内存。

+

peak_mem

+

integer

+

当前正在执行作业已分配的内存峰值。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY_DETAIL.md new file mode 100644 index 000000000..e491f6579 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_SESSION_MEMORY_DETAIL.md @@ -0,0 +1,81 @@ +# GLOBAL\_SESSION\_MEMORY\_DETAIL + +统计各节点的线程的内存使用情况,以MemoryContext节点来统计。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_SESSION\_MEMORY\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

sessid

+

text

+

线程启动时间+线程标识。

+

sesstype

+

text

+

线程名称。

+

contextname

+

text

+

内存上下文名称。

+

level

+

smallint

+

内存上下文的重要级别。

+

parent

+

text

+

父级内存上下文名称。

+

totalsize

+

bigint

+

总申请内存大小(单位:字节)。

+

freesize

+

bigint

+

空闲内存大小(单位:字节)。

+

usedsize

+

bigint

+

使用内存大小(单位:字节)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_SESSION_STAT.md b/content/zh/docs/Developerguide/GLOBAL_SESSION_STAT.md new file mode 100644 index 000000000..020ffc8d1 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_SESSION_STAT.md @@ -0,0 +1,60 @@ +# GLOBAL\_SESSION\_STAT + +各节点上以会话线程或AutoVacuum线程为单位,统计会话状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_SESSION\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

sessid

+

text

+

线程启动时间+线程标识。

+

statid

+

integer

+

统计编号。

+

statname

+

text

+

统计会话名称。

+

statunit

+

text

+

统计会话单位。

+

value

+

bigint

+

统计会话值。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_SESSION_STAT_ACTIVITY.md b/content/zh/docs/Developerguide/GLOBAL_SESSION_STAT_ACTIVITY.md new file mode 100644 index 000000000..c3760d8a2 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_SESSION_STAT_ACTIVITY.md @@ -0,0 +1,171 @@ +# GLOBAL\_SESSION\_STAT\_ACTIVITY + +显示openGauss内各节点上正在运行的线程相关的信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_SESSION\_STAT\_ACTIVITY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

coorname

+

text

+

数据库进程名称。

+

datid

+

oid

+

用户会话在后台连接到的数据库OID。

+

datname

+

text

+

用户会话在后台连接到的数据库名称。

+

pid

+

bigint

+

后台线程ID。

+

usesysid

+

oid

+

登录该后台的用户OID。

+

usename

+

text

+

登录该后台的用户名。

+

application_name

+

text

+

连接到该后台的应用名。

+

client_addr

+

inet

+

连接到该后台的客户端的IP地址。如果此字段是null,它表明通过服务器机器上UNIX套接字连接客户端或者这是内部进程,如autovacuum。

+

client_hostname

+

text

+

客户端的主机名,这个字段是通过client_addr的反向DNS查找得到。这个字段只有在启动log_hostname且使用IP连接时才非空。

+

client_port

+

integer

+

客户端用于与后台通讯的TCP端口号,如果使用Unix套接字,则为-1。

+

backend_start

+

timestampwith time zone

+

该过程开始的时间,即当客户端连接服务器时间。

+

xact_start

+

timestampwith time zone

+

启动当前事务的时间,如果没有事务是活跃的,则为null。如果当前查询是首个事务,则这列等同于query_start列。

+

query_start

+

timestampwith time zone

+

开始当前活跃查询的时间,如果state的值不是active,则这个值是上一个查询的开始时间。

+

state_change

+

timestampwith time zone

+

上次状态改变的时间。

+

waiting

+

boolean

+

如果后台当前正等待锁则为true。

+

enqueue

+

text

+

该字段不支持

+

+

state

+

text

+
该后台当前总体状态。可能值是:
  • active:后台正在执行一个查询。
  • idle:后台正在等待一个新的客户端命令。
  • idle in transaction:后台在事务中,但是目前无法执行查询。
  • idle in transaction (aborted):这个状态除说明事务中有某个语句导致了错误外,类似于idle in transaction
  • fastpath function call:后台正在执行一个fast-path函数。
  • disabled:如果后台禁用track_activities,则报告这个状态。
    说明:

    普通用户只能查看到自己帐户所对应的会话状态。即其他帐户的state信息为空。例如以judy用户连接数据库后,在pg_stat_activity中查看到的普通用户joe及初始用户omm的state信息为空:

    +

    postgres=# SELECT datname, usename, usesysid,state,pid FROM pg_stat_activity;

    +

    datname | usename | usesysid | state | pid

    +

    ----------+---------+----------+--------+-----------------postgres | omm | 10 | |139968752121616

    +

    postgres | omm | 10 | |139968903116560

    +

    db_tpcds | judy | 16398 | active |139968391403280

    +

    postgres | omm | 10 | |139968643069712

    +

    postgres | omm | 10 | |139968680818448

    +

    postgres | joe | 16390 | |139968563377936

    +

    (6 rows)

    +
    +
+
+

resource_pool

+

name

+

用户使用的资源池。

+

query_id

+

bigint

+

查询语句的ID。

+

query

+

text

+

该后台的最新查询。如果state状态是active(活跃的),此字段显示当前正在执行的查询。所有其他情况表示上一个查询。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_SESSION_TIME.md b/content/zh/docs/Developerguide/GLOBAL_SESSION_TIME.md new file mode 100644 index 000000000..7ab14722f --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_SESSION_TIME.md @@ -0,0 +1,53 @@ +# GLOBAL\_SESSION\_TIME + +用于统计各节点会话线程的运行时间信息,及各执行阶段所消耗时间。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_SESSION\_TIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

sessid

+

text

+

线程启动时间+线程标识。

+

stat_id

+

integer

+

统计编号。

+

stat_name

+

text

+

会话类型名称。

+

value

+

bigint

+

会话值。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_SHARED_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/GLOBAL_SHARED_MEMORY_DETAIL.md new file mode 100644 index 000000000..5829b1f45 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_SHARED_MEMORY_DETAIL.md @@ -0,0 +1,67 @@ +# GLOBAL\_SHARED\_MEMORY\_DETAIL + +查询openGauss中所有正常节点下的共享内存上下文的使用信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_SHARED\_MEMORY\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

contextname

+

text

+

内存上下文的名称。

+

level

+

smallint

+

内存上下文的级别。

+

parent

+

text

+

上级内存上下文。

+

totalsize

+

bigint

+

共享内存总大小(单位:字节)。

+

freesize

+

bigint

+

共享内存剩余大小(单位:字节)。

+

usedsize

+

bigint

+

共享内存使用大小(单位:字节)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY.md b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY.md new file mode 100644 index 000000000..54bd71ba7 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY.md @@ -0,0 +1,496 @@ +# GLOBAL\_STATEMENT\_COMPLEX\_HISTORY + +显示各个节点执行作业结束后的负载管理记录,查询该函数必须具有monadmin权限。 + +**表 1** GLOBAL\_STATEMENT\_COMPLEX\_HISTORY的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据库OID。

+

dbname

+

text

+

连接后端的数据库名称。

+

schemaname

+

text

+

模式的名称。

+

nodename

+

text

+

数据库进程名称

+

username

+

text

+

连接到后端的用户名。

+

application_name

+

text

+

连接到后端的应用名。

+

client_addr

+

inet

+

连接到后端的客户端的IP地址。 如果此字段是null,它表明通过服务器机器上UNIX套接字连接客户端或者这是内部进程,如autovacuum。

+

client_hostname

+

text

+

客户端的主机名,这个字段是通过client_addr的反向DNS查找得到。这个字段只有在启动log_hostname且使用IP连接时才非空。

+

client_port

+

integer

+

客户端用于与后端通讯的TCP端口号,如果使用Unix套接字,则为-1。

+

query_band

+

text

+

用于标示作业类型,可通过GUC参数query_band进行设置,默认为空字符串。

+

block_time

+

bigint

+

语句执行前的阻塞时间,包含语句解析和优化时间,单位ms。

+

start_time

+

timestamp with time zone

+

语句执行的开始时间。

+

finish_time

+

timestamp with time zone

+

语句执行的结束时间。

+

duration

+

bigint

+

语句实际执行的时间,单位ms。

+

estimate_total_time

+

bigint

+

语句预估执行时间,单位ms。

+

status

+

text

+

语句执行结束状态:正常为finished,异常为aborted。

+

abort_info

+

text

+

语句执行结束状态为aborted时显示异常信息。

+

resource_pool

+

text

+

用户使用的资源池。

+

control_group

+

text

+

语句所使用的Cgroup。

+

estimate_memory

+

integer

+

语句预估使用内存。

+

min_peak_memory

+

integer

+

语句在数据库节点上的最小内存峰值,单位MB。

+

max_peak_memory

+

integer

+

语句在数据库节点上的最大内存峰值,单位MB。

+

average_peak_memory

+

integer

+

语句执行过程中的内存使用平均值,单位MB。

+

memory_skew_percent

+

integer

+

语句数据库节点间的内存使用倾斜率。

+

spill_info

+

text

+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All:数据库节点均下盘。
  • [a:b]:数量为b个数据库节点中有a个数据库节点下盘。
+
+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_dn_time

+

bigint

+

语句在数据库节点上的最小执行时间,单位ms。

+

max_dn_time

+

bigint

+

语句在数据库节点上的最大执行时间,单位ms。

+

average_dn_time

+

bigint

+

语句在数据库节点上的平均执行时间,单位ms。

+

dntime_skew_percent

+

integer

+

语句在数据库节点的执行时间倾斜率。

+

min_cpu_time

+

bigint

+

语句在数据库节点上的最小CPU时间,单位ms。

+

max_cpu_time

+

bigint

+

语句在数据库节点上的最大CPU时间,单位ms。

+

total_cpu_time

+

bigint

+

语句在数据库节点上的CPU总时间,单位ms。

+

cpu_skew_percent

+

integer

+

语句在数据库节点间的CPU时间倾斜率。

+

min_peak_iops

+

integer

+

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

+

max_peak_iops

+

integer

+

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

+

average_peak_iops

+

integer

+

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

+

iops_skew_percent

+

integer

+

语句在数据库节点间的IO倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  • Spill file size large than 256MB
  • Broadcast size large than 100MB
  • Early spill
  • Spill times is greater than 3
  • Spill on memory adaptive
  • Hash table conflict
+
+

queryid

+

bigint

+

语句执行使用的内部query id。

+

query

+

text

+

执行的语句。

+

query_plan

+

text

+

语句的执行计划。

+

node_group

+

text

+

语句所属用户对应的逻辑openGauss。

+

cpu_top1_node_name

+

text

+

cpu使用率第1的节点名称。

+

cpu_top2_node_name

+

text

+

cpu使用率第2的节点名称。

+

cpu_top3_node_name

+

text

+

cpu使用率第3的节点名称。

+

cpu_top4_node_name

+

text

+

cpu使用率第4的节点名称。

+

cpu_top5_node_name

+

text

+

cpu使用率第5的节点名称。

+

mem_top1_node_name

+

text

+

内存使用量第1的节点名称。

+

mem_top2_node_name

+

text

+

内存使用量第2的节点名称。

+

mem_top3_node_name

+

text

+

内存使用量第3的节点名称。

+

mem_top4_node_name

+

text

+

内存使用量第4的节点名称。

+

mem_top5_node_name

+

text

+

内存使用量第5的节点名称。

+

cpu_top1_value

+

bigint

+

cpu使用率。

+

cpu_top2_value

+

bigint

+

cpu使用率。

+

cpu_top3_value

+

bigint

+

cpu使用率。

+

cpu_top4_value

+

bigint

+

cpu使用率。

+

cpu_top5_value

+

bigint

+

cpu使用率。

+

mem_top1_value

+

bigint

+

内存使用量。

+

mem_top2_value

+

bigint

+

内存使用量。

+

mem_top3_value

+

bigint

+

内存使用量。

+

mem_top4_value

+

bigint

+

内存使用量。

+

mem_top5_value

+

bigint

+

内存使用量。

+

top_mem_dn

+

text

+

内存使用量topN信息。

+

top_cpu_dn

+

text

+

cpu使用量topN信息。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY_TABLE.md b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY_TABLE.md new file mode 100644 index 000000000..31d1e6828 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_HISTORY_TABLE.md @@ -0,0 +1,4 @@ +# GLOBAL\_STATEMENT\_COMPLEX\_HISTORY\_TABLE + +显示各个节点执行作业结束后的负载管理记录。此数据是从内核中转储到系统表中的数据。具体的字段请参考[GLOBAL\_STATEMENT\_COMPLEX\_HISTORY](GLOBAL_STATEMENT_COMPLEX_HISTORY.md)中的字段。 + diff --git a/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_RUNTIME.md b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_RUNTIME.md new file mode 100644 index 000000000..83c55eeeb --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COMPLEX_RUNTIME.md @@ -0,0 +1,356 @@ +# GLOBAL\_STATEMENT\_COMPLEX\_RUNTIME + +显示当前用户在各个节点上正在执行的作业的负载管理记录,查询该函数必须具有monadmin权限。 + +**表 1** GLOBAL\_STATEMENT\_COMPLEX\_RUNTIME的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据OID。

+

dbname

+

name

+

连接后端的数据库名称。

+

schemaname

+

text

+

模式的名称。

+

nodename

+

text

+

数据库进程名称

+

username

+

name

+

连接到后端的用户名。

+

application_name

+

text

+

连接到后端的应用名。

+

client_addr

+

inet

+

连接到后端的客户端的IP地址。 如果此字段是null,它表明通过服务器机器上UNIX套接字连接客户端或者这是内部进程,如autovacuum。

+

client_hostname

+

text

+

客户端的主机名,这个字段是通过client_addr的反向DNS查找得到。这个字段只有在启动log_hostname且使用IP连接时才非空。

+

client_port

+

integer

+

客户端用于与后端通讯的TCP端口号,如果使用Unix套接字,则为-1。

+

query_band

+

text

+

用于标示作业类型,可通过GUC参数query_band进行设置,默认为空字符串。

+

pid

+

bigint

+

后端线程ID。

+

block_time

+

bigint

+

语句执行前的阻塞时间,单位ms。

+

start_time

+

timestamp with time zone

+

语句执行的开始时间。

+

duration

+

bigint

+

语句已经执行的时间,单位ms。

+

estimate_total_time

+

bigint

+

语句执行预估总时间,单位ms。

+

estimate_left_time

+

bigint

+

语句执行预估剩余时间,单位ms。

+

enqueue

+

text

+

工作负载管理资源状态。

+

resource_pool

+

name

+

用户使用的资源池。

+

control_group

+

text

+

语句所使用的Cgroup。

+

estimate_memory

+

integer

+

语句预估使用内存,单位MB。

+

min_peak_memory

+

integer

+

语句在数据库节点上的最小内存峰值,单位MB。

+

max_peak_memory

+

integer

+

语句在数据库节点上的最大内存峰值,单位MB。

+

average_peak_memory

+

integer

+

语句执行过程中的内存使用平均值,单位MB。

+

memory_skew_percent

+

integer

+

语句在数据库节点间的内存使用倾斜率。

+

spill_info

+

text

+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All:数据库节点均下盘。
  • [a:b]:数量为b个数据库节点中有a个数据库节点下盘。
+
+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_dn_time

+

bigint

+

语句在数据库节点上的最小执行时间,单位ms。

+

max_dn_time

+

bigint

+

语句在数据库节点上的最大执行时间,单位ms。

+

average_dn_time

+

bigint

+

语句在数据库节点上的平均执行时间,单位ms。

+

dntime_skew_percent

+

integer

+

语句在数据库节点的执行时间倾斜率。

+

min_cpu_time

+

bigint

+

语句在数据库节点上的最小CPU时间,单位ms。

+

max_cpu_time

+

bigint

+

语句在数据库节点上的最大CPU时间,单位ms。

+

total_cpu_time

+

bigint

+

语句在数据库节点上的CPU总时间,单位ms。

+

cpu_skew_percent

+

integer

+

语句在数据库节点间的CPU时间倾斜率。

+

min_peak_iops

+

integer

+

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

+

max_peak_iops

+

integer

+

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

+

average_peak_iops

+

integer

+

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

+

iops_skew_percent

+

integer

+

语句在数据库节点间的IO倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  • Spill file size large than 256MB
  • Broadcast size large than 100MB
  • Early spill
  • Spill times is greater than 3
  • Spill on memory adaptive
  • Hash table conflict
+
+

queryid

+

bigint

+

语句执行使用的内部query id。

+

query

+

text

+

正在执行的语句。

+

query_plan

+

text

+

语句的执行计划。

+

node_group

+

text

+

语句所属用户对应的逻辑openGauss。

+

top_cpu_dn

+

text

+

cpu使用量topN信息。

+

top_mem_dn

+

text

+

内存使用量topN信息。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COUNT.md b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COUNT.md new file mode 100644 index 000000000..02ad1a7fb --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATEMENT_COUNT.md @@ -0,0 +1,200 @@ +# GLOBAL\_STATEMENT\_COUNT + +显示数据库各节点当前时刻执行的五类语句(SELECT、INSERT、UPDATE、DELETE、MERGE INTO)和\(DDL、DML、DCL\)统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATEMENT\_COUNT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

user_name

+

text

+

用户名。

+

select_count

+

bigint

+

select语句统计结果。

+

update_count

+

bigint

+

update语句统计结果。

+

insert_count

+

bigint

+

insert语句统计结果。

+

delete_count

+

bigint

+

delete语句统计结果。

+

mergeinto_count

+

bigint

+

merge into语句统计结果。

+

ddl_count

+

bigint

+

DDL语句的数量。

+

dml_count

+

bigint

+

DML语句的数量。

+

dcl_count

+

bigint

+

DCL语句的数量。

+

total_select_elapse

+

bigint

+

总select的时间花费(单位:微秒)。

+

avg_select_elapse

+

bigint

+

平均select的时间花费(单位:微秒)。

+

max_select_elapse

+

bigint

+

最大select的时间花费(单位:微秒)。

+

min_select_elapse

+

bigint

+

最小select的时间花费(单位:微秒)。

+

total_update_elapse

+

bigint

+

总update的时间花费(单位:微秒)。

+

avg_update_elapse

+

bigint

+

平均update的时间花费(单位:微秒)。

+

max_update_elapse

+

bigint

+

最大update的时间花费(单位:微秒)。

+

min_update_elapse

+

bigint

+

最小update的时间花费(单位:微秒)。

+

total_insert_elapse

+

bigint

+

总insert的时间花费(单位:微秒)。

+

avg_insert_elapse

+

bigint

+

平均insert的时间花费(单位:微秒)。

+

max_insert_elapse

+

bigint

+

最大insert的时间花费(单位:微秒)。

+

min_insert_elapse

+

bigint

+

最小insert的时间花费(单位:微秒)。

+

total_delete_elapse

+

bigint

+

总delete的时间花费(单位:微秒)。

+

avg_delete_elapse

+

bigint

+

平均delete的时间花费(单位:微秒)。

+

max_delete_elapse

+

bigint

+

最大delete的时间花费(单位:微秒)。

+

min_delete_elapse

+

bigint

+

最小delete的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_INDEXES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_INDEXES.md new file mode 100644 index 000000000..715f1fbd0 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_INDEXES.md @@ -0,0 +1,74 @@ +# GLOBAL\_STATIO\_ALL\_INDEXES + +GLOBAL\_STATIO\_ALL\_INDEXES视图包含各节点的数据库中的每个索引行,显示特定索引的I/O的统计。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_ALL\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

索引的表的OID。

+

indexrelid

+

oid

+

该索引的OID。

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

numeric

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_SEQUENCES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_SEQUENCES.md new file mode 100644 index 000000000..090ba7c91 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_SEQUENCES.md @@ -0,0 +1,60 @@ +# GLOBAL\_STATIO\_ALL\_SEQUENCES + +GLOBAL\_STATIO\_ALL\_SEQUENCES包含各节点的数据库中每个序列的每一行,显示特定序列关于I/O的统计。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_ALL\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

从序列中读取的磁盘块数。

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_TABLES.md new file mode 100644 index 000000000..b350a9605 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_ALL_TABLES.md @@ -0,0 +1,102 @@ +# GLOBAL\_STATIO\_ALL\_TABLES + +GLOBAL\_STATIO\_ALL\_TABLES视图将包含各节点的数据库中每个表(包括TOAST表)的I/O的统计。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_INDEXES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_INDEXES.md new file mode 100644 index 000000000..ebb6e8165 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_INDEXES.md @@ -0,0 +1,74 @@ +# GLOBAL\_STATIO\_SYS\_INDEXES + +GLOBAL\_STATIO\_SYS\_INDEXES视图显示各节点的命名空间中所有系统表索引的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_SYS\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

索引的表的OID。

+

indexrelid

+

oid

+

该索引的OID。

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

numeric

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_SEQUENCES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_SEQUENCES.md new file mode 100644 index 000000000..41c1ac7f5 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_SEQUENCES.md @@ -0,0 +1,60 @@ +# GLOBAL\_STATIO\_SYS\_SEQUENCES + +GLOBAL\_STATIO\_SYS\_SEQUENCES视图显示各节点的命名空间中所有系统表为序列的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_SYS\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

从序列中读取的磁盘块数。

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_TABLES.md new file mode 100644 index 000000000..3659e7d54 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_SYS_TABLES.md @@ -0,0 +1,102 @@ +# GLOBAL\_STATIO\_SYS\_TABLES + +GLOBAL\_STATIO\_SYS\_TABLES视图显示各节点的命名空间中所有系统表的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_SYS\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_INDEXES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_INDEXES.md new file mode 100644 index 000000000..dfc29616d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_INDEXES.md @@ -0,0 +1,74 @@ +# GLOBAL\_STATIO\_USER\_INDEXES + +GLOBAL\_STATIO\_USER\_INDEXES视图显示各节点的命名空间中所有用户关系表索引的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_USER\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

索引的表的OID。

+

indexrelid

+

oid

+

该索引的OID。

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

numeric

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_SEQUENCES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_SEQUENCES.md new file mode 100644 index 000000000..43e8aae48 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_SEQUENCES.md @@ -0,0 +1,60 @@ +# GLOBAL\_STATIO\_USER\_SEQUENCES + +GLOBAL\_STATIO\_USER\_SEQUENCES视图显示各节点的命名空间中所有用户关系表类型为序列的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_USER\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

从序列中读取的磁盘块数。

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_TABLES.md new file mode 100644 index 000000000..c06d2848c --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STATIO_USER_TABLES.md @@ -0,0 +1,102 @@ +# GLOBAL\_STATIO\_USER\_TABLES + +GLOBAL\_STATIO\_USER\_TABLES视图显示各节点的命名空间中所有用户关系表的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STATIO\_USER\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

节点名称。

+

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表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_ALL_INDEXES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_ALL_INDEXES.md new file mode 100644 index 000000000..b97b834e7 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_ALL_INDEXES.md @@ -0,0 +1,81 @@ +# GLOBAL\_STAT\_ALL\_INDEXES + +将包含各节点数据库中的每个索引行,显示访问特定索引的统计。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_ALL\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

这个索引的表的OID。

+

indexrelid

+

oid

+

索引的OID。

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

bigint

+

索引上开始的索引扫描数。

+

idx_tup_read

+

bigint

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

bigint

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_ALL_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_ALL_TABLES.md new file mode 100644 index 000000000..cab0f6f8d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_ALL_TABLES.md @@ -0,0 +1,172 @@ +# GLOBAL\_STAT\_ALL\_TABLES + +得到各节点数据中每个表的一行(包括TOAST表)的统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+

n_live_tup

+

bigint

+

估计活跃行数。

+

n_dead_tup

+

bigint

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次此表是手动清理的(不计算VACUUM FULL)的时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析这个表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析时间。

+

vacuum_count

+

bigint

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

bigint

+

这个表被autovacuum清理的次数。

+

analyze_count

+

bigint

+

这个表被手动分析的次数。

+

autoanalyze_count

+

bigint

+

这个表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_BAD_BLOCK.md b/content/zh/docs/Developerguide/GLOBAL_STAT_BAD_BLOCK.md new file mode 100644 index 000000000..99bcb5f2b --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_BAD_BLOCK.md @@ -0,0 +1,74 @@ +# GLOBAL\_STAT\_BAD\_BLOCK + +获得各节点的表、索引等文件的读取失败信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_BAD\_BLOCK字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

databaseid

+

integer

+

database的oid。

+

tablespaceid

+

integer

+

tablespace的oid。

+

relfilenode

+

integer

+

relation的file node。

+

forknum

+

integer

+

fork编号。

+

error_count

+

integer

+

error的数量。

+

first_time

+

timestamp with time zone

+

坏块第一次出现的时间。

+

last_time

+

timestamp with time zone

+

坏块最后出现的时间。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE.md b/content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE.md new file mode 100644 index 000000000..e1b7d10b5 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE.md @@ -0,0 +1,158 @@ +# GLOBAL\_STAT\_DATABASE + +视图将包含openGauss中各节点的每个数据库的每一行,显示数据库统计。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_DATABASE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

datid

+

oid

+

数据库的OID。

+

datname

+

name

+

这个数据库的名称。

+

numbackends

+

integer

+

当前连接到该数据库的后端数。这是在返回一个反映目前状态值的视图中唯一的列;自上次重置所有其他列返回累积值。

+

xact_commit

+

bigint

+

此数据库中已经提交的事务数。

+

xact_rollback

+

bigint

+

此数据库中已经回滚的事务数。

+

blks_read

+

bigint

+

在这个数据库中读取的磁盘块的数量。

+

blks_hit

+

bigint

+

高速缓存中已经发现的磁盘块的次数,这样读取是不必要的(这只包括数据库内核缓冲区高速缓存,没有操作系统的文件系统缓存)。

+

tup_returned

+

bigint

+

通过数据库查询返回的行数。

+

tup_fetched

+

bigint

+

通过数据库查询抓取的行数。

+

tup_inserted

+

bigint

+

通过数据库查询插入的行数。

+

tup_updated

+

bigint

+

通过数据库查询更新的行数。

+

tup_deleted

+

bigint

+

通过数据库查询删除的行数。

+

conflicts

+

bigint

+

由于数据库恢复冲突取消的查询数量(只在备用服务器发生的冲突)。请参见STAT_DATABASE_CONFLICTS获取更多信息。

+

temp_files

+

bigint

+

通过数据库查询创建的临时文件数量。计算所有临时文件,不论为什么创建临时文件(比如排序或者哈希),而且不管log_temp_files设置。

+

temp_bytes

+

bigint

+

通过数据库查询写入临时文件的数据总量。计算所有临时文件,不论为什么创建临时文件,而且不管log_temp_files设置。

+

deadlocks

+

bigint

+

在该数据库中检索的死锁数。

+

blk_read_time

+

double precision

+

通过数据库后端读取数据文件块花费的时间,以毫秒计算。

+

blk_write_time

+

double precision

+

通过数据库后端写入数据文件块花费的时间,以毫秒计算。

+

stats_reset

+

timestamp with time zone

+

重置当前状态统计的时间。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE_CONFLICTS.md b/content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE_CONFLICTS.md new file mode 100644 index 000000000..8fc226068 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_DATABASE_CONFLICTS.md @@ -0,0 +1,74 @@ +# GLOBAL\_STAT\_DATABASE\_CONFLICTS + +显示每个节点的数据库冲突状态的统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_DATABASE\_CONFLICTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称

+

datid

+

oid

+

数据库标识。

+

datname

+

name

+

数据库名称。

+

confl_tablespace

+

bigint

+

冲突的表空间的数目。

+

confl_lock

+

bigint

+

冲突的锁数目。

+

confl_snapshot

+

bigint

+

冲突的快照数目。

+

confl_bufferpin

+

bigint

+

冲突的缓冲区数目。

+

confl_deadlock

+

bigint

+

冲突的死锁数目。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_DB_CU.md b/content/zh/docs/Developerguide/GLOBAL_STAT_DB_CU.md new file mode 100644 index 000000000..9511fb734 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_DB_CU.md @@ -0,0 +1,53 @@ +# GLOBAL\_STAT\_DB\_CU + +GLOBAL\_STAT\_DB\_CU视图用于查询openGauss,每个数据库的CU命中情况。可以通过gs\_stat\_reset\(\)进行清零。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_DB\_CU字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name1

+

text

+

数据库进程名称。

+

db_name

+

text

+

数据库名。

+

mem_hit

+

bigint

+

内存命中次数。

+

hdd_sync_read

+

bigint

+

硬盘同步读次数。

+

hdd_asyn_read

+

bigint

+

硬盘异步读次数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_SESSION_CU.md b/content/zh/docs/Developerguide/GLOBAL_STAT_SESSION_CU.md new file mode 100644 index 000000000..9dd6a5b7a --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_SESSION_CU.md @@ -0,0 +1,39 @@ +# GLOBAL\_STAT\_SESSION\_CU + +GLOBAL\_STAT\_SESSION\_CU用于查询openGauss各个节点,当前运行session的CU命中情况。session退出相应的统计数据会清零。openGauss重启后,统计数据也会清零。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_SESSION\_CU字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

mem_hit

+

integer

+

内存命中次数。

+

hdd_sync_read

+

integer

+

硬盘同步读次数。

+

hdd_asyn_read

+

integer

+

硬盘异步读次数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_SYS_INDEXES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_SYS_INDEXES.md new file mode 100644 index 000000000..70ee6a35b --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_SYS_INDEXES.md @@ -0,0 +1,81 @@ +# GLOBAL\_STAT\_SYS\_INDEXES + +得到各节点pg\_catalog、information\_schema以及pg\_toast模式中所有系统表的索引状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_SYS\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称

+

relid

+

oid

+

这个索引的表的OID。

+

indexrelid

+

oid

+

索引的OID。

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

bigint

+

索引上开始的索引扫描数。

+

idx_tup_read

+

bigint

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

bigint

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_SYS_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_SYS_TABLES.md new file mode 100644 index 000000000..76f2e3668 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_SYS_TABLES.md @@ -0,0 +1,172 @@ +# GLOBAL\_STAT\_SYS\_TABLES + +得到各节点pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_SYS\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

节点名称。

+

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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+

n_live_tup

+

bigint

+

估计活跃行数。

+

n_dead_tup

+

bigint

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次此表是手动清理的(不计算VACUUM FULL)时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析这个表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析的时间。

+

vacuum_count

+

bigint

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

bigint

+

这个表被autovacuum清理的次数。

+

analyze_count

+

bigint

+

这个表被手动分析的次数。

+

autoanalyze_count

+

bigint

+

这个表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/GLOBAL_STAT_USER_FUNCTIONS.md new file mode 100644 index 000000000..2367c0a25 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_USER_FUNCTIONS.md @@ -0,0 +1,67 @@ +# GLOBAL\_STAT\_USER\_FUNCTIONS + +提供openGauss中各个节点的用户所创建的函数的状态的统计信息,查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_USER\_FUNCTIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

funcid

+

oid

+

函数的id。

+

schemaname

+

name

+

此函数所在模式的名称。

+

funcname

+

name

+

函数名称。

+

calls

+

bigint

+

该函数被调用的次数。

+

total_time

+

double precision

+

此函数及其调用的所有其他函数所花费的总时间(以毫秒为单位)。

+

self_time

+

double precision

+

在此函数本身中花费的总时间(不包括它调用的其他函数),以毫秒为单位。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_USER_INDEXES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_USER_INDEXES.md new file mode 100644 index 000000000..d45da5241 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_USER_INDEXES.md @@ -0,0 +1,81 @@ +# GLOBAL\_STAT\_USER\_INDEXES + +得到各节点数据库中用户自定义普通表的索引状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_USER\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

relid

+

oid

+

这个索引的表的OID。

+

indexrelid

+

oid

+

索引的OID。

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

bigint

+

索引上开始的索引扫描数。

+

idx_tup_read

+

bigint

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

bigint

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_USER_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_USER_TABLES.md new file mode 100644 index 000000000..a57b6ae11 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_USER_TABLES.md @@ -0,0 +1,172 @@ +# GLOBAL\_STAT\_USER\_TABLES + +得到各节点所有命名空间中用户自定义普通表的状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_USER\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(即没有更新所需的单独索引)。

+

n_live_tup

+

bigint

+

估计活跃行数。

+

n_dead_tup

+

bigint

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次此表是手动清理的(不计算VACUUM FULL)时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析这个表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析的时间。

+

vacuum_count

+

bigint

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

bigint

+

这个表被autovacuum清理的次数。

+

analyze_count

+

bigint

+

这个表被手动分析的次数。

+

autoanalyze_count

+

bigint

+

这个表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_ALL_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_ALL_TABLES.md new file mode 100644 index 000000000..e8f9b9128 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_ALL_TABLES.md @@ -0,0 +1,102 @@ +# GLOBAL\_STAT\_XACT\_ALL\_TABLES + +显示各节点的命名空间中所有普通表和toast表的事务状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_XACT\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_SYS_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_SYS_TABLES.md new file mode 100644 index 000000000..721a3fea2 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_SYS_TABLES.md @@ -0,0 +1,102 @@ +# GLOBAL\_STAT\_XACT\_SYS\_TABLES + +显示各节点命名空间中系统表的事务状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_XACT\_SYS\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

节点名称。

+

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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_FUNCTIONS.md new file mode 100644 index 000000000..a84c80910 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_FUNCTIONS.md @@ -0,0 +1,67 @@ +# GLOBAL\_STAT\_XACT\_USER\_FUNCTIONS + +视图包含各节点本事务内函数执行的统信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_XACT\_USER\_FUNCTIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

节点名称。

+

funcid

+

oid

+

函数标识。

+

schemaname

+

name

+

模式的名称。

+

funcname

+

name

+

函数名称。

+

calls

+

bigint

+

函数被调用的次数。

+

total_time

+

double precision

+

此函数及其调用的所有其他函数所花费的总时间。

+

self_time

+

double precision

+

在此函数本身中花费的总时间(不包括它调用的其他函数)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_TABLES.md b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_TABLES.md new file mode 100644 index 000000000..b20de708d --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_STAT_XACT_USER_TABLES.md @@ -0,0 +1,102 @@ +# GLOBAL\_STAT\_XACT\_USER\_TABLES + +显示各节点命名空间中用户表的事务状态信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_STAT\_XACT\_USER\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_THREADPOOL_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_THREADPOOL_STATUS.md new file mode 100644 index 000000000..5a7cffd20 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_THREADPOOL_STATUS.md @@ -0,0 +1,4 @@ +# GLOBAL\_THREADPOOL\_STATUS + +GLOBAL\_THREADPOOL\_STATUS视图显示在所有节点上的线程池中工作线程及会话的状态信息。具体的字段[表1](LOCAL_THREADPOOL_STATUS.md#zh-cn_topic_0237122641_zh-cn_topic_0059778133_tc25f02433de2419f8da4d0a8c2c8e562)。 + diff --git a/content/zh/docs/Developerguide/GLOBAL_THREAD_WAIT_STATUS.md b/content/zh/docs/Developerguide/GLOBAL_THREAD_WAIT_STATUS.md new file mode 100644 index 000000000..45413b867 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_THREAD_WAIT_STATUS.md @@ -0,0 +1,106 @@ +# GLOBAL\_THREAD\_WAIT\_STATUS + +通过该视图可以检测所有节点上工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况,查询视图必须具有monadmin权限。具体事件信息请参见[15.3.67-表2 等待状态列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_zh-cn_topic_0059777957_t794f802302c24514a5db22d51eabacc4)、[15.3.67-表3 轻量级锁等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table38811324183420)、[15.3.67-表4 IO等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table124603113369)和[15.3.67-表5 事务锁等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table11826123533718)。 + +通过GLOBAL\_THREAD\_WAIT\_STATUS视图,可以查看openGauss全局各个节点上所有SQL语句产生的线程之间的调用层次关系,以及各个线程的阻塞等待状态,从而更容易定位hang以及类似现象的原因。 + +GLOBAL\_THREAD\_WAIT\_STATUS视图和THREAD\_WAIT\_STATUS视图列定义完全相同,这是由于GLOBAL\_THREAD\_WAIT\_STATUS视图本质是到openGauss中各个节点上查询THREAD\_WAIT\_STATUS视图汇总的结果。 + +**表 1** GLOBAL\_THREAD\_WAIT\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

db_name

+

text

+

数据库名称。

+

thread_name

+

text

+

线程名称。

+

query_id

+

bigint

+

查询ID,对应debug_query_id。

+

tid

+

bigint

+

当前线程的线程号。

+

sessionid

+

bigint

+

session的ID

+

lwtid

+

integer

+

当前线程的轻量级线程号。

+

psessionid

+

bigint

+

streaming线程的父线程。

+

tlevel

+

integer

+

streaming线程的层级。

+

smpid

+

integer

+

并行线程的ID。

+

wait_status

+

text

+

当前线程的等待状态。等待状态的详细信息请参见15.3.67-表2 等待状态列表

+

wait_event

+

text

+

如果wait_status是acquire lock、acquire lwlock、wait io三种类型,此列描述具体的锁、轻量级锁、IO的信息。否则是空。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_TRANSACTIONS_PREPARED_XACTS.md b/content/zh/docs/Developerguide/GLOBAL_TRANSACTIONS_PREPARED_XACTS.md new file mode 100644 index 000000000..6123753a1 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_TRANSACTIONS_PREPARED_XACTS.md @@ -0,0 +1,53 @@ +# GLOBAL\_TRANSACTIONS\_PREPARED\_XACTS + +显示各节点当前准备好进行两阶段提交的事务的信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_TRANSACTIONS\_PREPARED\_XACTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

transaction

+

xid

+

预备事务的数字事务标识。

+

gid

+

text

+

赋予该事务的全局事务标识。

+

prepared

+

timestamp with time zone

+

事务准备好提交的时间。

+

owner

+

name

+

执行该事务的用户的名称。

+

database

+

name

+

执行该事务所在的数据库名。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_WAIT_EVENTS.md b/content/zh/docs/Developerguide/GLOBAL_WAIT_EVENTS.md new file mode 100644 index 000000000..0bacb4988 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_WAIT_EVENTS.md @@ -0,0 +1,81 @@ +# GLOBAL\_WAIT\_EVENTS + +GLOBAL\_WAIT\_EVENTS视图显示各节点的event的等待相关的统计信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_WAIT\_EVENTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

数据库进程名称。

+

type

+

text

+

event类型。

+

event

+

text

+

event名称。

+

wait

+

bigint

+

等待次数。

+

failed_wait

+

bigint

+

失败的等待次数。

+

total_wait_time

+

bigint

+

总等待时间(单位:微秒)。

+

avg_wait_time

+

bigint

+

平均等待时间(单位:微秒)。

+

max_wait_time

+

bigint

+

最大等待时间(单位:微秒)。

+

min_wait_time

+

bigint

+

最小等待时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/GLOBAL_WORKLOAD_TRANSACTION.md b/content/zh/docs/Developerguide/GLOBAL_WORKLOAD_TRANSACTION.md new file mode 100644 index 000000000..779a12b08 --- /dev/null +++ b/content/zh/docs/Developerguide/GLOBAL_WORKLOAD_TRANSACTION.md @@ -0,0 +1,116 @@ +# GLOBAL\_WORKLOAD\_TRANSACTION + +显示各节点上的workload的负载信息。查询视图必须具有monadmin权限。 + +**表 1** GLOBAL\_WORKLOAD\_TRANSACTION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

workload

+

name

+

负载的名称。

+

commit_counter

+

bigint

+

用户事务commit数量。

+

rollback_counter

+

bigint

+

用户事务rollback数量。

+

resp_min

+

bigint

+

用户事务最小响应时间(单位:微秒)。

+

resp_max

+

bigint

+

用户事务最大响应时间(单位:微秒)。

+

resp_avg

+

bigint

+

用户事务平均响应时间(单位:微秒)。

+

resp_total

+

bigint

+

用户事务总响应时间(单位:微秒)。

+

bg_commit_counter

+

bigint

+

后台事务commit数量。

+

bg_rollback_counter

+

bigint

+

后台事务rollback数量。

+

bg_resp_min

+

bigint

+

后台事务最小响应时间(单位:微秒)。

+

bg_resp_max

+

bigint

+

后台事务最大响应时间(单位:微秒)。

+

bg_resp_avg

+

bigint

+

后台事务平均响应时间(单位:微秒)。

+

bg_resp_total

+

bigint

+

后台事务总响应时间(单位:微秒)。

+
+ diff --git "a/content/zh/docs/Developerguide/GOTO\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/GOTO\350\257\255\345\217\245.md" new file mode 100644 index 000000000..18d0839d6 --- /dev/null +++ "b/content/zh/docs/Developerguide/GOTO\350\257\255\345\217\245.md" @@ -0,0 +1,128 @@ +# GOTO语句 + +GOTO语句可以实现从GOTO位置到目标语句的无条件跳转。GOTO语句会改变原本的执行逻辑,因此应该慎重使用,或者也可以使用EXCEPTION处理特殊场景。当执行GOTO语句时,目标Label必须是唯一的。 + +## 语法 + +label declaration ::= + +![](figures/zh-cn_image_0253404022.png) + +goto statement ::= + +![](figures/zh-cn_image_0253404023.png) + +## 示例 + +``` +postgres=# CREATE OR REPLACE PROCEDURE GOTO_test() +AS +DECLARE + v1 int; +BEGIN + v1 := 0; + LOOP + EXIT WHEN v1 > 100; + v1 := v1 + 2; + if v1 > 25 THEN + GOTO pos1; + END IF; + END LOOP; +<> +v1 := v1 + 10; +raise info 'v1 is %. ', v1; +END; +/ + +call GOTO_test(); +``` + +## 限制场景 + +GOTO使用有以下限制场景 + +- 不支持有多个相同的GOTO labels目标场景,无论是否在同一个block中。 + + ``` + BEGIN + GOTO pos1; + <> + SELECT * FROM ... + <> + UPDATE t1 SET ... + END; + ``` + + +- 不支持GOTO跳转到IF语句,CASE语句,LOOP语句中。 + + ``` + BEGIN + GOTO pos1; + IF valid THEN + <> + SELECT * FROM ... + END IF; + END; + ``` + + +- 不支持GOTO语句从一个IF子句跳转到另一个IF子句,或从一个CASE语句的WHEN子句跳转到另一个WHEN子句。 + + ``` + BEGIN + IF valid THEN + GOTO pos1; + SELECT * FROM ... + ELSE + <> + UPDATE t1 SET ... + END IF; + END; + ``` + + +- 不支持从外部块跳转到内部的BEGIN-END块。 + + ``` + BEGIN + GOTO pos1; + BEGIN + <> + UPDATE t1 SET ... + END; + END; + ``` + + +- 不支持从异常处理部分跳转到当前的BEGIN-END块。但可以跳转到上层BEGIN-END块。 + + ``` + BEGIN + <> + UPDATE t1 SET ... + EXCEPTION + WHEN condition THEN + GOTO pos1; + END; + ``` + + +- 如果从GOTO到一个不包含执行语句的位置,需要添加NULL语句。 + + ``` + DECLARE + done BOOLEAN; + BEGIN + FOR i IN 1..50 LOOP + IF done THEN + GOTO end_loop; + END IF; + <> -- not allowed unless an executable statement follows + NULL; -- add NULL statement to avoid error + END LOOP; -- raises an error without the previous NULL + END; + / + ``` + + diff --git a/content/zh/docs/Developerguide/GRANT.md b/content/zh/docs/Developerguide/GRANT.md index c7852e2b2..9ecb47952 100644 --- a/content/zh/docs/Developerguide/GRANT.md +++ b/content/zh/docs/Developerguide/GRANT.md @@ -120,11 +120,6 @@ [ WITH GRANT OPTION ]; ``` - >![](public_sys-resources/icon-note.gif) **说明:** - >本版本只有C函数支持所有用户创建,而Java和Internal只支持拥有sysadmin权限的用户创建。 - >- 拥有sysadmin权限的用户通过grant语法来将创建C函数的权限授权给普通用户时,不支持grant usage on language c to public,只支持授权给特定用户。 - >- 拥有sysadmin权限的用户通过grant语法来将创建C函数的权限授权给普通用户时,不支持with grant option。 - - 将大对象的访问权限赋予指定的用户或角色。 ``` @@ -210,19 +205,19 @@ GRANT的权限分类如下所示。 - **SELECT** - 允许对指定的表、视图、序列执行SELECT语句。 + 允许对指定的表、视图、序列执行SELECT命令,update或delete时也需要对应字段上的select权限。 - **INSERT** - 允许对指定的表执行INSERT语句。 + 允许对指定的表执行INSERT命令。 - **UPDATE** - 允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 + 允许对声明的表中任意字段执行UPDATE命令。通常,update命令也需要select权限来查询出哪些行需要更新。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 - **DELETE** - 允许执行DELETE语句删除指定表中的数据。 + 允许执行DELETE命令删除指定表中的数据。通常,delete命令也需要select权限来查询出哪些行需要删除。 - **TRUNCATE** @@ -230,7 +225,7 @@ GRANT的权限分类如下所示。 - **REFERENCES** - 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。 + 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。由于当前不支持外键,所以不建议使用该参数。 - **CREATE** - 对于数据库,允许在数据库里创建新的模式。 @@ -344,9 +339,6 @@ GRANT的参数说明如下所示。 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。 - >![](public_sys-resources/icon-note.gif) **说明:** - >NODE GROUP不支持WITH GRANT OPTION功能。 - 非对象所有者给其他用户授予对象权限时,命令按照以下规则执行: @@ -357,7 +349,6 @@ GRANT的参数说明如下所示。 >![](public_sys-resources/icon-note.gif) **说明:** >数据库系统管理员可以访问所有对象,而不会受对象的权限设置影响。这个特点类似Unix系统的root的权限。和root一样,除了必要的情况外,建议不要总是以系统管理员身份进行操作。 >不允许对表分区进行GRANT操作,对分区表进行GRANT操作会引起告警。 ->针对NODE GROUP,普通用户不能执行GRANT/REVOKE操作。 ## 示例 diff --git a/content/zh/docs/Developerguide/GS_OPT_MODEL.md b/content/zh/docs/Developerguide/GS_OPT_MODEL.md index a5ecdf234..2af61d7a5 100644 --- a/content/zh/docs/Developerguide/GS_OPT_MODEL.md +++ b/content/zh/docs/Developerguide/GS_OPT_MODEL.md @@ -4,139 +4,136 @@ GS\_OPT\_MODEL是启用AiEngine执行计划时间预测功能时的数据表, **表 1** GS\_OPT\_MODEL字段 - - - - - - - - - - - - - @@ -73,7 +73,7 @@ PG\_SECLABELS视图提供关于安全标签的信息。 - @@ -82,7 +82,7 @@ PG\_SECLABELS视图提供关于安全标签的信息。 - diff --git a/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md b/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md index f324a9e1e..2f58b7a7d 100644 --- a/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md +++ b/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md @@ -40,7 +40,7 @@ PG\_SESSION\_IOSTAT视图显示当前用户执行作业正在运行时的IO负 - - diff --git a/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md b/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md index 6429c61d5..418ab2b87 100644 --- a/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md +++ b/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md @@ -173,14 +173,14 @@ PG\_SESSION\_WLMSTAT视图显示和当前用户执行作业正在运行时的负 - - diff --git a/content/zh/docs/Developerguide/PG_SHADOW.md b/content/zh/docs/Developerguide/PG_SHADOW.md index bbe57607c..8ea8f679a 100644 --- a/content/zh/docs/Developerguide/PG_SHADOW.md +++ b/content/zh/docs/Developerguide/PG_SHADOW.md @@ -2,7 +2,7 @@ PG\_SHADOW视图显示了所有在PG\_AUTHID中标记了rolcanlogin的角色的属性。 -这个视图的名称来自于该视图是不可读的,因为它包含口令。[PG\_USER](PG_USER.md#ZH-CN_TOPIC_0242385999)是一个在PG\_SHADOW上公开可读的视图,只是把口令域填成了空白。 +这个视图的名称来自于该视图是不可读的,因为它包含口令。[PG\_USER](PG_USER.md)是一个在PG\_SHADOW上公开可读的视图,只是把口令域填成了空白。 **表 1** PG\_SHADOW字段 diff --git a/content/zh/docs/Developerguide/PG_SHDEPEND.md b/content/zh/docs/Developerguide/PG_SHDEPEND.md index 525c13526..d9c276ae6 100644 --- a/content/zh/docs/Developerguide/PG_SHDEPEND.md +++ b/content/zh/docs/Developerguide/PG_SHDEPEND.md @@ -2,7 +2,7 @@ PG\_SHDEPEND系统表记录数据库对象和共享对象(比如角色)之间的依赖性关系。这些信息允许openGauss保证在企图删除这些对象之前,这些对象是没有被引用的。 -[PG\_DEPEND](PG_DEPEND.md#ZH-CN_TOPIC_0242385811)的作用类似,只是它是用于在一个数据库内部的对象的依赖性关系的。 +[PG\_DEPEND](PG_DEPEND.md)的作用类似,只是它是用于在一个数据库内部的对象的依赖性关系的。 和其它大多数系统表不同,PG\_SHDEPEND是在openGauss里面所有的数据库之间共享的:每个openGauss只有一个PG\_SHDEPEND,而不是每个数据库一个。 @@ -23,7 +23,7 @@ PG\_SHDEPEND系统表记录数据库对象和共享对象(比如角色)之 - @@ -88,7 +88,7 @@ PG\_SHDEPEND系统表记录数据库对象和共享对象(比如角色)之 - diff --git a/content/zh/docs/Developerguide/PG_SHSECLABEL.md b/content/zh/docs/Developerguide/PG_SHSECLABEL.md index 748edd516..a802a1eec 100644 --- a/content/zh/docs/Developerguide/PG_SHSECLABEL.md +++ b/content/zh/docs/Developerguide/PG_SHSECLABEL.md @@ -2,11 +2,11 @@ PG\_SHSECLABEL系统表存储在共享数据库对象上的安全标签。安全标签可以用SECURITY LABEL命令操作。 -查看安全标签的简单点的方法,请参阅[PG\_SECLABELS](PG_SECLABELS.md#ZH-CN_TOPIC_0242385959)。 +查看安全标签的简单点的方法,请参阅[PG\_SECLABELS](PG_SECLABELS.md)。 -[PG\_SECLABEL](PG_SECLABEL.md#ZH-CN_TOPIC_0242385841)的作用类似,只是它是用于在单个数据库内部的对象的安全标签的。 +[PG\_SECLABEL](PG_SECLABEL.md)的作用类似,只是它是用于在单个数据库内部的对象的安全标签的。 -不同于大多数的系统表,PG\_SHSECLABELopenGauss中的所有数据库中共享:每个openGauss只有一个PG\_SHSECLABEL,而不是每个数据库一个。 +不同于大多数的系统表,PG\_SHSECLABEL在openGauss中的所有数据库中共享:每个openGauss只有一个PG\_SHSECLABEL,而不是每个数据库一个。 **表 1** PG\_SHSECLABEL字段 diff --git a/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md b/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md index cd0be5399..9d435e74c 100644 --- a/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md @@ -45,7 +45,7 @@ PG\_STATIO\_ALL\_TABLES视图将包含当前数据库中每个表(包括TOAST - - - - - diff --git a/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md b/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md index 625068ee7..ad0e3cff9 100644 --- a/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md @@ -45,7 +45,7 @@ PG\_STATIO\_SYS\_TABLES视图显示命名空间中所有系统表的IO状态信 - - - - - diff --git a/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md b/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md index 38d727725..fa70b29b4 100644 --- a/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md @@ -45,7 +45,7 @@ PG\_STATIO\_USER\_TABLES视图显示命名空间中所有用户关系表的IO状 - - - - - diff --git a/content/zh/docs/Developerguide/PG_STATISTIC.md b/content/zh/docs/Developerguide/PG_STATISTIC.md index fec56d8f4..7e14f9d10 100644 --- a/content/zh/docs/Developerguide/PG_STATISTIC.md +++ b/content/zh/docs/Developerguide/PG_STATISTIC.md @@ -59,7 +59,7 @@ PG\_STATISTIC系统表存储有关该数据库中表和索引列的统计数据 - diff --git a/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md b/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md index 47bc6a84f..9770616a5 100644 --- a/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md +++ b/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md @@ -52,7 +52,7 @@ PG\_STATISTIC\_EXT系统表存储有关该数据库中表的扩展统计数据 - diff --git a/content/zh/docs/Developerguide/PG_STATS.md b/content/zh/docs/Developerguide/PG_STATS.md index aba2f1af5..8f06d0337 100644 --- a/content/zh/docs/Developerguide/PG_STATS.md +++ b/content/zh/docs/Developerguide/PG_STATS.md @@ -19,7 +19,7 @@ PG\_STATS视图提供对存储在pg\_statistic表里面的单列统计信息的 - @@ -37,7 +37,7 @@ PG\_STATS视图提供对存储在pg\_statistic表里面的单列统计信息的 - diff --git a/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md b/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md index 1e14d1da1..e965c6af5 100644 --- a/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md +++ b/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md @@ -137,7 +137,7 @@ PG\_STAT\_ACTIVITY视图显示和当前用户查询相关的信息。 ----------+---------+----------+--------+----------------- postgres | omm | 10 | | 139968752121616 postgres | omm | 10 | | 139968903116560 - db_tpcc | judy | 16398 | active | 139968391403280 + db_tpcc | judy | 16398 | active | 139968391403280 postgres | omm | 10 | | 139968643069712 postgres | omm | 10 | | 139968680818448 postgres | joe | 16390 | | 139968563377936 diff --git a/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md b/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md index cd5d5e18e..e5d09dda1 100644 --- a/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md +++ b/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md @@ -33,7 +33,7 @@ PG\_STAT\_ALL\_INDEXES视图将包含当前数据库中的每个索引行,显 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -46,7 +46,7 @@ PG\_TABLES视图提供了对数据库中每个表访问的有用信息。 - diff --git a/content/zh/docs/Developerguide/PG_TDE_INFO.md b/content/zh/docs/Developerguide/PG_TDE_INFO.md index 262176679..405cdfc95 100644 --- a/content/zh/docs/Developerguide/PG_TDE_INFO.md +++ b/content/zh/docs/Developerguide/PG_TDE_INFO.md @@ -17,7 +17,7 @@ PG\_TDE\_INFO视图提供了openGauss加密信息。 - diff --git a/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md b/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md index 6ca28c4c7..bf682bd27 100644 --- a/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md +++ b/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md @@ -226,12 +226,12 @@ wait\_status列的等待状态有以下状态。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + +

名称

+ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

类型

+

类型

描述

-

template_name

-

name

-

机器学习模型的模板名,决定训练和预测调用的函数接口,目前只实现了rlstm,方便后续扩展。

-

model_name

-

name

-

模型的实例名,每个模型对应aiEngine在线学习进程中的一套参数、训练日志、模型系数。此列需为unique。

-

datname

-

name

-

该模型所服务的database名,每个模型只针对单个database。此参数决定训练时所使用的数据。

-

ip

-

name

-

AiEngine端所部署的host ip地址。

-

port

-

integer

-

AiEngine端所监听的端口号。

-

max_epoch

-

integer

-

模型每次训练的迭代次数上限。

-

learning_rate

-

real

-

模型训练的学习速率,推荐缺省值1。

-

dim_red

-

real

-

模型特征维度降维系数。

-

hidden_units

-

integer

-

模型隐藏层神经元个数。如果训练发现模型长期无法收敛,可以适量提升本参数。

-

batch_size

-

integer

-

模型每次迭代时一个batch的大小,尽量设为大于等于训练数据总量的值,加快模型的收敛速度。

-

feature_size

-

integer

-

[不需设置] 模型特征的长度,用于触发重新训练,模型训练后该参数自动更新。

-

available

-

boolean

-

[不需设置]标识模型是否收敛。

-

Is_training

-

boolean

-

[不需设置]标识模型是否正在训练。

-

label

-

"char"[]

-

模型的目标任务:

-

S: startup time

-

T: total time

-

R: rows

-

M: peak memory

-

目前受模型性能限制,推荐{S, T}或{R}。

-

max

-

bigint[]

-

[不需设置]标识模型各任务标签的最大值,用于触发重新训练。

-

acc

-

real[]

-

[不需设置]标识模型个任务的准确率。

-

description

-

text

-

模型注释。

+

描述

template_name

+

name

+

机器学习模型的模板名,决定训练和预测调用的函数接口,目前只实现了rlstm,方便后续扩展。

+

model_name

+

name

+

模型的实例名,每个模型对应aiEngine在线学习进程中的一套参数、训练日志、模型系数。此列需为unique。

+

datname

+

name

+

该模型所服务的database名,每个模型只针对单个database。此参数决定训练时所使用的数据。

+

ip

+

name

+

AiEngine端所部署的host ip地址。

+

port

+

integer

+

AiEngine端所监听的端口号。

+

max_epoch

+

integer

+

模型每次训练的迭代次数上限。

+

learning_rate

+

real

+

模型训练的学习速率,推荐缺省值1。

+

dim_red

+

real

+

模型特征维度降维系数。

+

hidden_units

+

integer

+

模型隐藏层神经元个数。如果训练发现模型长期无法收敛,可以适量提升本参数。

+

batch_size

+

integer

+

模型每次迭代时一个batch的大小,尽量设为大于等于训练数据总量的值,加快模型的收敛速度。

+

feature_size

+

integer

+

[不需设置] 模型特征的长度,用于触发重新训练,模型训练后该参数自动更新。

+

available

+

boolean

+

[不需设置]标识模型是否收敛。

+

Is_training

+

boolean

+

[不需设置]标识模型是否正在训练。

+

label

+

"char"[]

+

模型的目标任务:

+
  • S: startup time
  • T: total time
  • R: rows
  • M: peak memory
+

目前受模型性能限制,推荐{S, T}或{R}。

+

max

+

bigint[]

+

[不需设置]标识模型各任务标签的最大值,用于触发重新训练。

+

acc

+

real[]

+

[不需设置]标识模型个任务的准确率。

+

description

+

text

+

模型注释。

+
diff --git a/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md b/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md index ffe20fc40..794b41148 100644 --- a/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md +++ b/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md @@ -45,21 +45,21 @@ GS\_SESSION\_CPU\_STATISTICS视图显示和当前用户执行复杂作业正在

bigint

语句在数据库节点上的最小CPU时间,单位为ms。

+

语句在数据库节点上的最小CPU时间,单位为ms。

max_cpu_time

bigint

语句在数据库节点上的最大CPU时间,单位为ms。

+

语句在数据库节点上的最大CPU时间,单位为ms。

total_cpu_time

bigint

语句在数据库节点上的CPU总时间,单位为ms。

+

语句在数据库节点上的CPU总时间,单位为ms。

query

@@ -73,7 +73,7 @@ GS\_SESSION\_CPU\_STATISTICS视图显示和当前用户执行复杂作业正在

text

该字段不支持。

+

该字段不支持。

top_cpu_dn

diff --git a/content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md deleted file mode 100644 index a26641946..000000000 --- a/content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md +++ /dev/null @@ -1,76 +0,0 @@ -# GS\_SESSION\_MEMORY\_CONTEXT - -GS\_SESSION\_MEMORY\_CONTEXT视图统计所有的会话的内存使用情况,以MemoryContext节点来统计。该视图仅在开启线程池(enable\_thread\_pool = on)时生效。 - -其中内存上下文“TempSmallContextGroup”,记录当前线程中所有内存上下文字段“totalsize”小于8192字节的信息汇总,并且内存上下文统计计数记录到“usedsize”字段中。所以在视图中,“TempSmallContextGroup”内存上下文中的“totalsize”和“freesize”是该线程中所有内存上下文“totalsize”小于8192字节的汇总总和,usedsize字段表示统计的内存上下文个数。 - -**表 1** GS\_SESSION\_MEMORY\_CONTEXT字段 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

描述

-

sessid

-

text

-

会话启动时间+会话标识(字符串信息为timestamp.sessionid)。

-

threadid

-

bigint

-

会话绑定的线程标识,如果未绑定线程,该值为-1。

-

contextname

-

text

-

内存上下文名称。

-

level

-

smallint

-

当前上下文在整体内存上下文中的层级。

-

parent

-

text

-

父内存上下文名称。

-

totalsize

-

bigint

-

当前内存上下文的内存总数,单位Byte。

-

freesize

-

bigint

-

当前内存上下文中已释放的内存总数,单位Byte。

-

usedsize

-

bigint

-

当前内存上下文中已使用的内存总数,单位Byte;“TempSmallContextGroup”内存上下文中该字段含义为统计计数。

-
- diff --git a/content/zh/docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md index 24e8c110b..93432da8d 100644 --- a/content/zh/docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md +++ b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md @@ -45,24 +45,24 @@ GS\_SESSION\_MEMORY\_STATISTICS视图显示和当前用户执行复杂作业正

integer

语句在数据库节点上的最小内存峰值大小,单位MB。

+

语句在数据库节点上的最小内存峰值大小,单位MB。

max_peak_memory

integer

语句在数据库节点上的最大内存峰值大小,单位MB。

+

语句在数据库节点上的最大内存峰值大小,单位MB。

spill_info

text

语句在数据库节点上的下盘信息:

-

None:数据库节点均未下盘。

-

All:数据库节点均下盘。

-

[a:b]:数量为b个数据库节点中有a个数据库节点下盘。

+

语句在数据库节点上的下盘信息:

+

None:数据库节点均未下盘。

+

All:数据库节点均下盘。

+

[a:b]:数量为b个数据库节点中有a个数据库节点下盘。

query

@@ -76,7 +76,7 @@ GS\_SESSION\_MEMORY\_STATISTICS视图显示和当前用户执行复杂作业正

text

该字段不支持

+

该字段不支持。

top_mem_dn

diff --git a/content/zh/docs/Developerguide/GS_STAT_DB_CU.md b/content/zh/docs/Developerguide/GS_STAT_DB_CU.md index 5a67f50e0..5c6f0fe3e 100644 --- a/content/zh/docs/Developerguide/GS_STAT_DB_CU.md +++ b/content/zh/docs/Developerguide/GS_STAT_DB_CU.md @@ -17,7 +17,7 @@ GS\_STAT\_DB\_CU视图查询openGauss各个节点,每个数据库的CU命中

text

节点名。

+

节点名称。

db_name

diff --git a/content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md b/content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md index 5d5482308..792ef1634 100644 --- a/content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md +++ b/content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md @@ -17,7 +17,7 @@ GS\_STAT\_SESSION\_CU视图查询openGauss各个节点,当前运行session的C

text

节点名。

+

节点名称。

mem_hit

diff --git a/content/zh/docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md b/content/zh/docs/Developerguide/GS_THREAD_MEMORY_DETAIL.md similarity index 96% rename from content/zh/docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md rename to content/zh/docs/Developerguide/GS_THREAD_MEMORY_DETAIL.md index 1d79df0aa..1a03378a7 100644 --- a/content/zh/docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md +++ b/content/zh/docs/Developerguide/GS_THREAD_MEMORY_DETAIL.md @@ -1,10 +1,10 @@ -# GS\_THREAD\_MEMORY\_CONTEXT +# GS\_THREAD\_MEMORY\_DETAIL -GS\_THREAD\_MEMORY\_CONTEXT视图统计所有的线程的内存使用情况,以MemoryContext节点来统计。该视图在关闭线程池(enable\_thread\_pool = off)时等价于GS\_SESSION\_MEMORY\_DETAIL视图。 +GS\_THREAD\_MEMORY\_DETAIL视图统计所有的线程的内存使用情况,以MemoryContext节点来统计。该视图在关闭线程池(enable\_thread\_pool = off)时等价于GS\_SESSION\_MEMORY\_DETAIL视图。 其中内存上下文“TempSmallContextGroup”,记录当前线程中所有内存上下文字段“totalsize”小于8192字节的信息汇总,并且内存上下文统计计数记录到“usedsize”字段中。所以在视图中,“TempSmallContextGroup”内存上下文中的“totalsize”和“freesize”是该线程中所有内存上下文“totalsize”小于8192字节的汇总总和,usedsize字段表示统计的内存上下文个数。 -**表 1** GS\_SESSION\_MEMORY\_CONTEXT字段 +**表 1** GS\_SESSION\_MEMORY\_DETAIL字段 - diff --git a/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md index b6ac52b7d..47e7a0d99 100644 --- a/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md +++ b/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md @@ -95,31 +95,31 @@ GS\_WLM\_INSTANCE\_HISTORY系统表存储与实例(数据库主节点或数据 - - - diff --git a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md index 7a5ea6561..c9b0ed64e 100644 --- a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md +++ b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md @@ -1,6 +1,6 @@ # GS\_WLM\_OPERATOR\_HISTORY -GS\_WLM\_OPERATOR\_HISTORY视图显示的是当前用户数据库主节点上执行作业结束后的算子的相关记录。 +GS\_WLM\_OPERATOR\_HISTORY视图显示的是当前用户当前数据库主节点上执行作业结束后的算子的相关记录。 -内核中的数据会定时被清理,清理周期为3分钟。当GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为on时,视图中的记录每隔3分钟被转储到系统表[GS\_WLM\_OPERATOR\_INFO](GS_WLM_OPERATOR_INFO.md#ZH-CN_TOPIC_0242385790)中一次,同时视图中的记录被删除;当GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为off时,记录在视图中的存留时间达到超期时间(超期时间为3分钟)后会被删除。记录的数据同[表1](GS_WLM_OPERATOR_INFO.md#zh-cn_topic_0237122263_zh-cn_topic_0111176227_table85181143511)。 +记录的数据同[表1](GS_WLM_OPERATOR_INFO.md#zh-cn_topic_0237122263_zh-cn_topic_0111176227_table85181143511)。 diff --git a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md index 633134717..cc5079ded 100644 --- a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md +++ b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md @@ -1,6 +1,6 @@ # GS\_WLM\_OPERATOR\_INFO -GS\_WLM\_OPERATOR\_INFO系统表显示执行作业结束后的算子相关的记录。此数据是从内核中转储到系统表中的数据。当设置GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为on时,系统会定时(周期为3分钟)将[GS\_WLM\_SESSION\_HISTORY](GS_WLM_SESSION_HISTORY.md)中的记录导入此系统表,开启此功能会占用系统存储空间并对性能有一定影响,不建议用户使用。 +GS\_WLM\_OPERATOR\_INFO系统表显示执行作业结束后的算子相关的记录。此数据是从内核中转储到系统表中的数据。 **表 1** GS\_WLM\_OPERATOR\_INFO的字段 @@ -94,7 +94,7 @@ GS\_WLM\_OPERATOR\_INFO系统表显示执行作业结束后的算子相关的记 - - - - - - - - - - - - - - - - - diff --git a/content/zh/docs/Developerguide/PG_PROC.md b/content/zh/docs/Developerguide/PG_PROC.md index f54c7ef82..be4b5bc75 100644 --- a/content/zh/docs/Developerguide/PG_PROC.md +++ b/content/zh/docs/Developerguide/PG_PROC.md @@ -207,7 +207,7 @@ PG\_PROC系统表存储函数或过程的信息。 - - diff --git a/content/zh/docs/Developerguide/PG_RANGE.md b/content/zh/docs/Developerguide/PG_RANGE.md index 875d5e4ac..4b53f149a 100644 --- a/content/zh/docs/Developerguide/PG_RANGE.md +++ b/content/zh/docs/Developerguide/PG_RANGE.md @@ -1,6 +1,6 @@ # PG\_RANGE -PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.md#ZH-CN_TOPIC_0242385855)里类型的记录。 +PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.md)里类型的记录。 **表 1** PG\_RANGE字段 @@ -19,7 +19,7 @@ PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.m - @@ -28,7 +28,7 @@ PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.m - @@ -37,7 +37,7 @@ PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.m - @@ -46,7 +46,7 @@ PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.m - diff --git a/content/zh/docs/Developerguide/PG_RESOURCE_POOL.md b/content/zh/docs/Developerguide/PG_RESOURCE_POOL.md index e9ac6cbe7..967a5057a 100644 --- a/content/zh/docs/Developerguide/PG_RESOURCE_POOL.md +++ b/content/zh/docs/Developerguide/PG_RESOURCE_POOL.md @@ -94,7 +94,7 @@ PG\_RESOURCE\_POOL系统表提供了数据库资源池的信息。 - - diff --git a/content/zh/docs/Developerguide/PG_RUNNING_XACTS.md b/content/zh/docs/Developerguide/PG_RUNNING_XACTS.md deleted file mode 100644 index 65a776544..000000000 --- a/content/zh/docs/Developerguide/PG_RUNNING_XACTS.md +++ /dev/null @@ -1,88 +0,0 @@ -# PG\_RUNNING\_XACTS - -PG\_RUNNING\_XACTS视图主要功能是显示当前节点运行事务的信息。 - -**表 1** PG\_RUNNING\_XACTS字段 - - -

名称

diff --git a/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md index 41da6ff14..2b890cf6a 100644 --- a/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md +++ b/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md @@ -24,7 +24,7 @@ GS\_TOTAL\_MEMORY\_DETAIL视图统计当前数据库节点使用内存的信息

text

内存类型,包括以下几种:
  • max_process_memory:openGauss实例所占用的内存大小。
  • process_used_memory:openGauss进程所使用的内存大小。
  • max_dynamic_memory:最大动态内存。
  • dynamic_used_memory:已使用的动态内存。
  • dynamic_peak_memory:内存的动态峰值。
  • dynamic_used_shrctx:最大动态共享内存上下文。
  • dynamic_peak_shrctx:共享内存上下文的动态峰值。
  • max_shared_memory:最大共享内存。
  • shared_used_memory:已使用的共享内存。
  • max_cstore_memory:列存所允许使用的最大内存。
  • cstore_used_memory:列存已使用的内存大小。
  • max_sctpcomm_memory:通信库所允许使用的最大内存。
  • sctpcomm_used_memory:通信库已使用的内存大小。
  • sctpcomm_peak_memory:通信库的内存峰值。
  • other_used_memory:其他已使用的内存大小。
+
内存类型,包括以下几种:
  • max_process_memory:openGauss实例所占用的内存大小。
  • process_used_memory:openGauss进程所使用的内存大小。
  • max_dynamic_memory:最大动态内存。
  • dynamic_used_memory:已使用的动态内存。
  • dynamic_peak_memory:内存的动态峰值。
  • dynamic_used_shrctx:最大动态共享内存上下文。
  • dynamic_peak_shrctx:共享内存上下文的动态峰值。
  • max_shared_memory:最大共享内存。
  • shared_used_memory:已使用的共享内存。
  • max_cstore_memory:列存所允许使用的最大内存。
  • cstore_used_memory:列存已使用的内存大小。
  • max_sctpcomm_memory:通信库所允许使用的最大内存。
  • sctpcomm_used_memory:通信库已使用的内存大小。
  • sctpcomm_peak_memory:通信库的内存峰值。
  • other_used_memory:其他已使用的内存大小。

bigint

数据库主节点实例:不统计。

-

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑读字节速率,单位KB/s。

+

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑读字节速率,单位KB/s。

logical_write

bigint

数据库主节点实例:不统计。

-

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑写字节速率,单位KB/s。

+

数据库主节点实例:不统计。

+

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑写字节速率,单位KB/s。

read_counts

bigint

数据库主节点实例:不统计。

-

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑读操作次数之和,单位次。

+

数据库主节点实例:不统计。

+

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑读操作次数之和,单位次。

write_counts

bigint

数据库主节点实例:不统计。

-

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑写操作次数之和,单位次。

+

数据库主节点实例:不统计。

+

数据库节点实例:该实例在本次统计间隙(10秒)内逻辑写操作次数之和,单位次。

integer

当前算子在数据库节点上的平均内存峰值(MB)。

+

当前算子在数据库节点平均内存峰值(MB)。

memory_skew_percent

@@ -108,7 +108,7 @@ GS\_WLM\_OPERATOR\_INFO系统表显示执行作业结束后的算子相关的记

integer

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

+

若发生下盘,数据库节点盘的最小数据量(MB),默认为0。

max_spill_size

@@ -122,21 +122,21 @@ GS\_WLM\_OPERATOR\_INFO系统表显示执行作业结束后的算子相关的记

integer

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

+

若发生下盘,数据库节点盘的平均数据量(MB),默认为0。

spill_skew_percent

integer

若发生下盘,数据库节点间下盘倾斜率。

+

若发生下盘,数据库节点间下盘倾斜率。

min_cpu_time

bigint

该算子在数据库节点上的最小执行时间(ms)。

+

该算子在数据库节点最小执行时间(ms)。

max_cpu_time

diff --git a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md index 040031f00..8db4928c1 100644 --- a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md +++ b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md @@ -87,21 +87,21 @@ GS\_WLM\_OPERATOR\_STATISTICS视图显示当前用户正在执行的作业的算

integer

当前算子在数据库节点上的最小内存峰值(MB)。

+

当前算子在数据库节点上的最小内存峰值(MB)。

max_peak_memory

integer

当前算子在数据库节点上的最大内存峰值(MB)。

+

当前算子在数据库节点上的最大内存峰值(MB)。

average_peak_memory

integer

当前算子在数据库节点上的平均内存峰值(MB)。

+

当前算子在数据库节点上的平均内存峰值(MB)。

memory_skew_percent

@@ -115,56 +115,56 @@ GS\_WLM\_OPERATOR\_STATISTICS视图显示当前用户正在执行的作业的算

integer

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

+

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

max_spill_size

integer

若发生下盘,数据库节点上下盘的最大数据量(MB),默认为0。

+

若发生下盘,数据库节点上下盘的最大数据量(MB),默认为0。

average_spill_size

integer

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

+

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

spill_skew_percent

integer

若发生下盘,数据库节点间下盘倾斜率。

+

若发生下盘,数据库节点间下盘倾斜率。

min_cpu_time

bigint

该算子在数据库节点上的最小执行时间(ms)。

+

该算子在数据库节点上的最小执行时间(ms)。

max_cpu_time

bigint

该算子在数据库节点上的最大执行时间(ms)。

+

该算子在数据库节点上的最大执行时间(ms)。

total_cpu_time

bigint

该算子在数据库节点上的总执行时间(ms)。

+

该算子在数据库节点上的总执行时间(ms)。

cpu_skew_percent

integer

数据库节点间执行时间的倾斜率。

+

数据库节点间执行时间的倾斜率。

warning

diff --git a/content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md b/content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md index 351765314..e69ace959 100644 --- a/content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md +++ b/content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md @@ -2,7 +2,7 @@ GS\_WLM\_PLAN\_ENCODING\_TABLE系统表显示计划算子级的编码信息,为机器学习模型的提供包括startup time, total time, peak memory, rows等标签值的训练、预测集。 -**表 1** GS\_WLM\_PLAN\_ENCODING\_TABLE的字段 +**表 1** GS\_WLM\_PLAN\_ENCODING\_TABLE的字段 - - - - - - - - - - - - - - - - diff --git a/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md index 738fc0045..5c6a3408a 100644 --- a/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md +++ b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md @@ -2,5 +2,5 @@ GS\_WLM\_PLAN\_OPERATOR\_HISTORY视图显示的是当前用户数据库主节点上执行作业结束后的执行计划算子级的相关记录。 -内核中的数据会定时被清理,清理周期为3分钟。当GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为on时,视图中的记录每隔3分钟被转储到系统表[GS\_WLM\_PLAN\_OPERATOR\_INFO](GS_WLM_PLAN_OPERATOR_INFO.md)中一次,同时视图中的记录被删除;当GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为off时,记录在视图中的存留时间达到超期时间(超期时间为3分钟)后会被删除。记录的数据同[表1](GS_WLM_PLAN_OPERATOR_INFO.md#zh-cn_topic_0111176227_table85181143511)。 +记录的数据同[表1](GS_WLM_PLAN_OPERATOR_INFO.md#zh-cn_topic_0111176227_table85181143511)。 diff --git a/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md index 94900322b..efc0fe48a 100644 --- a/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md +++ b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md @@ -1,6 +1,6 @@ # GS\_WLM\_PLAN\_OPERATOR\_INFO -GS\_WLM\_PLAN\_OPERATOR\_INFO系统表显示执行作业结束后计划算子级的相关的记录。此数据是从内核中转储到系统表中的数据。当设置GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为on时,系统会定时(周期为3分钟)将[GS\_WLM\_PLAN\_OPERATOR\_HISTORY](GS_WLM_PLAN_OPERATOR_HISTORY.md)中的记录导入此系统表,开启此功能会占用系统存储空间并对性能有一定影响,不建议用户使用。 +GS\_WLM\_PLAN\_OPERATOR\_INFO系统表显示执行作业结束后计划算子级的相关的记录。此数据是从内核中转储到系统表中的数据。 **表 1** GS\_WLM\_PLAN\_OPERATOR\_INFO的字段 @@ -13,11 +13,11 @@ GS\_WLM\_PLAN\_OPERATOR\_INFO系统表显示执行作业结束后计划算子级 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md b/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md index 7c1470224..9eb63f694 100644 --- a/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md +++ b/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md @@ -31,7 +31,7 @@ - - - - - - @@ -193,21 +193,21 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行 - - - - - - - - - - - - - - - - - - - - diff --git a/content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md index 1362a6177..a601a862e 100644 --- a/content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md @@ -1,6 +1,6 @@ # GS\_WLM\_SESSION\_QUERY\_INFO\_ALL -GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的负载管理记录。此数据是从内核中转储到系统表中的数据。当设置GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为on时,系统会定时(周期为3分钟)将内核中query信息导入GS\_WLM\_SESSION\_QUERY\_INFO\_ALL系统表。 +GS\_WLM\_SESSION\_INFO系统表显示当前数据库主节点执行作业结束后的负载管理记录。此数据是从内核中转储到系统表中的数据。 **表 1** GS\_WLM\_SESSION\_QUERY\_INFO\_ALL字段 @@ -38,7 +38,7 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的 - - - @@ -193,112 +193,112 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -200,21 +200,21 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正 - - - - - - - - - - - - - - - - @@ -64,7 +64,7 @@ PG\_AGGREGATE系统表存储与聚集函数有关的信息。PG\_AGGREGATE里的 - diff --git a/content/zh/docs/Developerguide/PG_AM.md b/content/zh/docs/Developerguide/PG_AM.md index fd524e799..b381c2061 100644 --- a/content/zh/docs/Developerguide/PG_AM.md +++ b/content/zh/docs/Developerguide/PG_AM.md @@ -129,7 +129,7 @@ PG\_AM系统表存储有关索引访问方法的信息。系统支持的每种 - - diff --git a/content/zh/docs/Developerguide/PG_AMOP.md b/content/zh/docs/Developerguide/PG_AMOP.md index f6749f8e0..42ea933f6 100644 --- a/content/zh/docs/Developerguide/PG_AMOP.md +++ b/content/zh/docs/Developerguide/PG_AMOP.md @@ -28,7 +28,7 @@ PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果 - @@ -37,7 +37,7 @@ PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果 - @@ -46,7 +46,7 @@ PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果 - @@ -73,7 +73,7 @@ PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果 - @@ -82,7 +82,7 @@ PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果 - @@ -91,7 +91,7 @@ PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果 - diff --git a/content/zh/docs/Developerguide/PG_AMPROC.md b/content/zh/docs/Developerguide/PG_AMPROC.md index 64901a83a..d31c8410f 100644 --- a/content/zh/docs/Developerguide/PG_AMPROC.md +++ b/content/zh/docs/Developerguide/PG_AMPROC.md @@ -28,7 +28,7 @@ PG\_AMPROC系统表存储有关与访问方法操作符族相关联的支持过 - @@ -37,7 +37,7 @@ PG\_AMPROC系统表存储有关与访问方法操作符族相关联的支持过 - @@ -46,7 +46,7 @@ PG\_AMPROC系统表存储有关与访问方法操作符族相关联的支持过 - diff --git a/content/zh/docs/Developerguide/PG_AUTHID.md b/content/zh/docs/Developerguide/PG_AUTHID.md index 1d666efd8..a2ac0815a 100644 --- a/content/zh/docs/Developerguide/PG_AUTHID.md +++ b/content/zh/docs/Developerguide/PG_AUTHID.md @@ -160,7 +160,7 @@ openGauss中只有一份pg\_authid,不是每个数据库有一份。需要有 - - diff --git a/content/zh/docs/Developerguide/PG_CONSTRAINT.md b/content/zh/docs/Developerguide/PG_CONSTRAINT.md index f2af18642..e2e0140b0 100644 --- a/content/zh/docs/Developerguide/PG_CONSTRAINT.md +++ b/content/zh/docs/Developerguide/PG_CONSTRAINT.md @@ -1,6 +1,6 @@ # PG\_CONSTRAINT -PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外键约束。 +PG\_CONSTRAINT系统表存储表上的检查约束、主键和唯一约束。 **表 1** PG\_CONSTRAINT字段 @@ -38,7 +38,7 @@ PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外 - - - @@ -102,7 +103,8 @@ PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外 - @@ -110,7 +112,8 @@ PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外 - @@ -160,28 +163,28 @@ PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外 - - - - - diff --git a/content/zh/docs/Developerguide/PG_DEPEND.md b/content/zh/docs/Developerguide/PG_DEPEND.md index bd2d2ff69..7c7c30828 100644 --- a/content/zh/docs/Developerguide/PG_DEPEND.md +++ b/content/zh/docs/Developerguide/PG_DEPEND.md @@ -2,7 +2,7 @@ PG\_DEPEND系统表记录数据库对象之间的依赖关系。这个信息允许DROP命令找出哪些其它对象必须由DROP CASCADE删除,或者是在DROP RESTRICT的情况下避免删除。 -这个表的功能类似[PG\_SHDEPEND](PG_SHDEPEND.md#ZH-CN_TOPIC_0242385842),用于记录那些在openGauss之间共享的对象之间的依赖性关系。 +这个表的功能类似[PG\_SHDEPEND](PG_SHDEPEND.md),用于记录那些在openGauss之间共享的对象之间的依赖性关系。 **表 1** PG\_DEPEND字段 @@ -87,7 +87,7 @@ PG\_DEPEND系统表记录数据库对象之间的依赖关系。这个信息允 - DEPENDENCY\_NORMAL \(n\):独立创建的对象之间的一般关系。有依赖的对象可以在不影响被引用对象的情况下删除。被引用对象只有在声明了CASCADE的情况下删除,这时有依赖的对象也被删除。例子:一个表字段对其数据类型有一般依赖关系。 - DEPENDENCY\_AUTO \(a\):有依赖对象可以和被引用对象分别删除,并且如果删除了被引用对象则应该被自动删除(不管是RESTRICT或CASCADE模式)。例子:一个表上面的命名约束是在该表上的自动依赖关系,因此如果删除了表,它也会被删除。 -- DEPENDENCY\_INTERNAL \(i\):有依赖的对象是作为被引用对象的一部分创建的,实际上只是它的内部实现的一部分。 DROP有依赖对象是不能直接允许的(将告诉用户发出一条删除被引用对象的DROP)。一个对被引用对象的DROP将传播到有依赖对象,不管是否声明了CASCADE。例子:一个创建来强制外键约束的触发器在该约束的[PG\_CONSTRAINT](PG_CONSTRAINT.md#ZH-CN_TOPIC_0242385806)记录上是标记为内部依赖的。 +- DEPENDENCY\_INTERNAL \(i\):有依赖的对象是作为被引用对象的一部分创建的,实际上只是它的内部实现的一部分。 DROP有依赖对象是不能直接允许的(将告诉用户发出一条删除被引用对象的DROP)。一个对被引用对象的DROP将传播到有依赖对象,不管是否声明了CASCADE。 - DEPENDENCY\_EXTENSION \(e\):依赖对象是被依赖对象extension的一个成员(请参见[PG\_EXTENSION](PG_EXTENSION.md))。依赖对象只可以通过在被依赖对象上DROP EXTENSION删除。函数上这个依赖类型和内部依赖一样动作,但是它为了清晰和简化gs\_dump保持分开。 - DEPENDENCY\_PIN \(p\):没有依赖对象;这种类型的记录标志着系统本身依赖于被引用对象,因此这个对象决不能被删除。这种类型的记录只有在initdb的时候创建。有依赖对象的字段里是零。 diff --git a/content/zh/docs/Developerguide/PG_DESCRIPTION.md b/content/zh/docs/Developerguide/PG_DESCRIPTION.md index 74a2dab0c..61b8f9828 100644 --- a/content/zh/docs/Developerguide/PG_DESCRIPTION.md +++ b/content/zh/docs/Developerguide/PG_DESCRIPTION.md @@ -2,7 +2,7 @@ PG\_DESCRIPTION系统表可以给每个数据库对象存储一个可选的描述(注释)。许多内置的系统对象的描述提供了PG\_DESCRIPTION的初始内容。 -这个表的功能类似[PG\_SHDESCRIPTION](PG_SHDESCRIPTION.md#ZH-CN_TOPIC_0242385843),用于记录openGauss范围内共享对象的注释。 +这个表的功能类似[PG\_SHDESCRIPTION](PG_SHDESCRIPTION.md),用于记录openGauss范围内共享对象的注释。 **表 1** PG\_DESCRIPTION字段 @@ -30,7 +30,7 @@ PG\_DESCRIPTION系统表可以给每个数据库对象存储一个可选的描 - diff --git a/content/zh/docs/Developerguide/PG_ENUM.md b/content/zh/docs/Developerguide/PG_ENUM.md index bb0fdc33e..f6fb76fce 100644 --- a/content/zh/docs/Developerguide/PG_ENUM.md +++ b/content/zh/docs/Developerguide/PG_ENUM.md @@ -28,7 +28,7 @@ PG\_ENUM系统表包含显示每个枚举类型值和标签的记录。给定枚 - diff --git a/content/zh/docs/Developerguide/PG_EXT_STATS.md b/content/zh/docs/Developerguide/PG_EXT_STATS.md index bd1f0bdfd..d33cfd227 100644 --- a/content/zh/docs/Developerguide/PG_EXT_STATS.md +++ b/content/zh/docs/Developerguide/PG_EXT_STATS.md @@ -1,6 +1,6 @@ # PG\_EXT\_STATS -PG\_EXT\_STATS视图提供对存储在[PG\_STATISTIC\_EXT](PG_STATISTIC_EXT.md#ZH-CN_TOPIC_0242385846)表里面的扩展统计信息的访问。扩展统计信息目前包括多列统计信息。 +PG\_EXT\_STATS视图提供对存储在[PG\_STATISTIC\_EXT](PG_STATISTIC_EXT.md)表里面的扩展统计信息的访问。扩展统计信息目前包括多列统计信息。 **表 1** PG\_EXT\_STATS字段 @@ -19,7 +19,7 @@ PG\_EXT\_STATS视图提供对存储在[PG\_STATISTIC\_EXT](PG_STATISTIC_EXT.md#Z - @@ -37,7 +37,7 @@ PG\_EXT\_STATS视图提供对存储在[PG\_STATISTIC\_EXT](PG_STATISTIC_EXT.md#Z - diff --git a/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md b/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md index 9b63fcc8f..71eb445b4 100644 --- a/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md +++ b/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md @@ -46,7 +46,7 @@ PG\_FOREIGN\_SERVER系统表存储外部服务器定义。一个外部服务器 - diff --git a/content/zh/docs/Developerguide/PG_INDEXES.md b/content/zh/docs/Developerguide/PG_INDEXES.md index 08436cd9a..28b9a768d 100644 --- a/content/zh/docs/Developerguide/PG_INDEXES.md +++ b/content/zh/docs/Developerguide/PG_INDEXES.md @@ -19,7 +19,7 @@ PG\_INDEXES视图提供对数据库中每个索引的有用信息的访问。 - @@ -46,7 +46,7 @@ PG\_INDEXES视图提供对数据库中每个索引的有用信息的访问。 - diff --git a/content/zh/docs/Developerguide/PG_JOB_PROC.md b/content/zh/docs/Developerguide/PG_JOB_PROC.md index 4d4c22b1e..1ec3800d7 100644 --- a/content/zh/docs/Developerguide/PG_JOB_PROC.md +++ b/content/zh/docs/Developerguide/PG_JOB_PROC.md @@ -1,6 +1,6 @@ # PG\_JOB\_PROC -PG\_JOB\_PROC系统表对应PG\_JOB表中每个任务的作业内容(包括:PL/SQL代码块、匿名块)。将存储过程信息独立出来,是因为A中这个字段是varchar\(4000\)的,如果放到PG\_JOB中,被加载到共享内存的时候,会占用不必要的空间,所以在使用的时候再进行查询获取。 +PG\_JOB\_PROC系统表对应PG\_JOB表中每个任务的作业内容(包括:PL/SQL代码块、匿名块)。将存储过程信息独立出来,如果放到PG\_JOB中,被加载到共享内存的时候,会占用不必要的空间,所以在使用的时候再进行查询获取。 **表 1** PG\_JOB\_PROC字段 @@ -24,7 +24,7 @@ PG\_JOB\_PROC系统表对应PG\_JOB表中每个任务的作业内容(包括: - - diff --git a/content/zh/docs/Developerguide/PG_LOCKS.md b/content/zh/docs/Developerguide/PG_LOCKS.md index 6323f375a..84de727c1 100644 --- a/content/zh/docs/Developerguide/PG_LOCKS.md +++ b/content/zh/docs/Developerguide/PG_LOCKS.md @@ -28,7 +28,7 @@ PG\_LOCKS视图存储各打开事务所持有的锁信息。 - - - diff --git a/content/zh/docs/Developerguide/PG_OBJECT.md b/content/zh/docs/Developerguide/PG_OBJECT.md index 0378fc7a0..e4a73974f 100644 --- a/content/zh/docs/Developerguide/PG_OBJECT.md +++ b/content/zh/docs/Developerguide/PG_OBJECT.md @@ -54,7 +54,7 @@ PG\_OBJECT系统表存储限定类型对象(普通表,索引,序列,视 >![](public_sys-resources/icon-notice.gif) **须知:** >- 无法记录初始化数据库(initdb)过程中所创建或修改的对象,即PG\_OBJECT无法查询到该对象记录。 ->- 对于升级至openGauss V500R001C00版本的数据库,无法记录升级以前所创建的对象,即PG\_OBJECT无法查询到该对象记录。 +>- 对于升级后的数据库,无法记录升级以前所创建的对象,即PG\_OBJECT无法查询到该对象记录。 >- 对于上述两类对象再次修改时,会记录其修改时间(mtime),由于无法得知该对象创建时间,因此ctime为空。 >- ctime和mtime所记录的时间为用户当次操作所属事务的起始时间。 >- 由扩容引起的对象修改时间也会被记录。 diff --git a/content/zh/docs/Developerguide/PG_OPCLASS.md b/content/zh/docs/Developerguide/PG_OPCLASS.md index 176387246..10050edfb 100644 --- a/content/zh/docs/Developerguide/PG_OPCLASS.md +++ b/content/zh/docs/Developerguide/PG_OPCLASS.md @@ -30,7 +30,7 @@ PG\_OPCLASS系统表定义索引访问方法操作符类。 - @@ -48,7 +48,7 @@ PG\_OPCLASS系统表定义索引访问方法操作符类。 - @@ -66,7 +66,7 @@ PG\_OPCLASS系统表定义索引访问方法操作符类。 - @@ -75,7 +75,7 @@ PG\_OPCLASS系统表定义索引访问方法操作符类。 - @@ -93,7 +93,7 @@ PG\_OPCLASS系统表定义索引访问方法操作符类。 - diff --git a/content/zh/docs/Developerguide/PG_OPERATOR.md b/content/zh/docs/Developerguide/PG_OPERATOR.md index 9ea52785b..798d342c7 100644 --- a/content/zh/docs/Developerguide/PG_OPERATOR.md +++ b/content/zh/docs/Developerguide/PG_OPERATOR.md @@ -37,7 +37,7 @@ PG\_OPERATOR系统表存储有关操作符的信息。 - @@ -82,7 +82,7 @@ PG\_OPERATOR系统表存储有关操作符的信息。 - @@ -91,7 +91,7 @@ PG\_OPERATOR系统表存储有关操作符的信息。 - @@ -100,7 +100,7 @@ PG\_OPERATOR系统表存储有关操作符的信息。 - @@ -109,7 +109,7 @@ PG\_OPERATOR系统表存储有关操作符的信息。 - @@ -118,7 +118,7 @@ PG\_OPERATOR系统表存储有关操作符的信息。 - diff --git a/content/zh/docs/Developerguide/PG_OPFAMILY.md b/content/zh/docs/Developerguide/PG_OPFAMILY.md index ec37dc0ae..24dc0e885 100644 --- a/content/zh/docs/Developerguide/PG_OPFAMILY.md +++ b/content/zh/docs/Developerguide/PG_OPFAMILY.md @@ -30,7 +30,7 @@ PG\_OPFAMILY系统表定义操作符族。 - @@ -48,7 +48,7 @@ PG\_OPFAMILY系统表定义操作符族。 - @@ -65,5 +65,5 @@ PG\_OPFAMILY系统表定义操作符族。

名称

@@ -27,46 +27,39 @@ GS\_WLM\_PLAN\_ENCODING\_TABLE系统表显示计划算子级的编码信息,

查询对应的执行计划的plan node id。

plan_node_id

+

startup_time

integer

-

查询对应的执行计划的plan node id。

-

startup_time

-

bignit

+

bignit

该算子处理第一条数据的开始时间。

total_time

+

total_time

bigint

该算子到结束时候总的执行时间(ms)。

rows

+

rows

bigint

+

bigint

当前算子执行的行数信息。

+

当前算子执行的行数信息。

peak_memory

+

peak_memory

integer

+

integer

当前算子在数据库节点上的最大内存峰值(MB)。

+

当前算子在数据库节点上的最大内存峰值(MB)。

encode

+

encode

text

+

text

当前计划算子的编码信息。

+

当前计划算子的编码信息。

datname

+

datname

name

+

name

收集计划信息所在的database名

+

收集计划信息所在的database名。

queryid

@@ -34,32 +34,32 @@ GS\_WLM\_PLAN\_OPERATOR\_INFO系统表显示执行作业结束后计划算子级

查询对应的执行计划的plan node id。

startup_time

+

startup_time

bigint

+

bigint

该算子处理第一条数据的开始时间。

total_time

+

total_time

bigint

该算子到结束时候总的执行时间(ms)。

actual_rows

+

actual_rows

bigint

+

bigint

实际执行的行数信息。

+

实际执行的行数信息。

max_peak_memory

+

max_peak_memory

integer

+

integer

当前算子在数据库节点上的最大内存峰值(MB)。

+

当前算子在数据库节点上的最大内存峰值(MB)。

query_dop

@@ -69,67 +69,67 @@ GS\_WLM\_PLAN\_OPERATOR\_INFO系统表显示执行作业结束后计划算子级

当前算子执行时的并行度。

parent_node_id

+

parent_node_id

integer

+

integer

当前算子的父节点node id。

+

当前算子的父节点node id。

left_child_id

+

left_child_id

integer

+

integer

当前算子的左孩子节点node id。

+

当前算子的左孩子节点node id。

right_child_id

+

right_child_id

integer

+

integer

当前算子的右孩子节点node id

+

当前算子的右孩子节点node id。

operation

+

operation

text

+

text

当前算子进行的操作名称。

+

当前算子进行的操作名称。

orientation

+

orientation

text

+

text

当前算子的对齐方式。

+

当前算子的对齐方式。

strategy

+

strategy

text

+

text

当前算子操作的实现方法。

+

当前算子操作的实现方法。

options

+

options

text

+

text

当前算子操作的选择方式。

+

当前算子操作的选择方式。

condition

+

condition

text

+

text

当前算子操作的过滤条件。

+

当前算子操作的过滤条件。

projection

+

projection

text

+

text

当前算子的映射关系。

+

当前算子的映射关系。

name

该字段不支持。

+

该字段不支持。

parentid

diff --git a/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md index 9880fe369..ec39deee5 100644 --- a/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md @@ -1,6 +1,6 @@ # GS\_WLM\_SESSION\_HISTORY -GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行作业结束后的负载管理记录。openGauss中的数据会定时被清理,清理周期为3分钟。当GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为on时,视图中的记录每隔3分钟被转储到系统表[GS\_WLM\_SESSION\_QUERY\_INFO\_ALL](GS_WLM_SESSION_QUERY_INFO_ALL.md)中一次,同时视图中的记录被删除;当GUC参数[enable\_resource\_record](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s77bd1023b63c4cd489760aa33f08d1ea)为off时,记录在视图中的存留时间达到超期时间(超期时间为3分钟)后会被删除。 +GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行作业结束后的负载管理记录。 **表 1** GS\_WLM\_SESSION\_HISTORY的字段 @@ -143,7 +143,7 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

text

该字段不支持

+

该字段不支持

estimate_memory

@@ -157,14 +157,14 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

integer

语句在数据库节点上的最小内存峰值,单位MB。

+

语句在数据库节点上的最小内存峰值,单位MB。

max_peak_memory

integer

语句在数据库节点上的最大内存峰值,单位MB。

+

语句在数据库节点上的最大内存峰值,单位MB。

average_peak_memory

@@ -178,14 +178,14 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

integer

语句数据库节点间的内存使用倾斜率。

+

语句数据库节点间的内存使用倾斜率。

spill_info

text

语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All: 数据库节点均下盘。
  • [a:b]: 数量为b个数据库节点中有a个数据库节点下盘。
+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All: 数据库节点均下盘。
  • [a:b]: 数量为b个数据库节点中有a个数据库节点下盘。

integer

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

max_spill_size

integer

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

average_spill_size

integer

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

spill_skew_percent

@@ -221,49 +221,49 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

bigint

语句在数据库节点上的最小执行时间,单位ms。

+

语句在数据库节点上的最小执行时间,单位ms。

max_dn_time

bigint

语句在数据库节点上的最大执行时间,单位ms。

+

语句在数据库节点上的最大执行时间,单位ms。

average_dn_time

bigint

语句在数据库节点上的平均执行时间,单位ms。

+

语句在数据库节点上的平均执行时间,单位ms。

dntime_skew_percent

integer

语句在数据库节点间的执行时间倾斜率。

+

语句在数据库节点间的执行时间倾斜率。

min_cpu_time

bigint

语句在数据库节点上的最小CPU时间,单位ms。

+

语句在数据库节点上的最小CPU时间,单位ms。

max_cpu_time

bigint

语句在数据库节点上的最大CPU时间,单位ms。

+

语句在数据库节点上的最大CPU时间,单位ms。

total_cpu_time

bigint

语句在数据库节点上的CPU总时间,单位ms。

+

语句在数据库节点上的CPU总时间,单位ms。

cpu_skew_percent

@@ -277,21 +277,21 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

integer

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

max_peak_iops

integer

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

average_peak_iops

integer

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

iops_skew_percent

@@ -334,14 +334,14 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

text

该字段不支持。

+

该字段不支持。

cpu_top1_node_name

text

当前数据库节点名称。

+

当前数据库节点名称。

cpu_top2_node_name

@@ -376,7 +376,7 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

text

当前数据库节点名称。

+

当前数据库节点名称。

mem_top2_node_name

@@ -411,7 +411,7 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

bigint

当前数据库节点cpu使用率。

+

当前数据库节点cpu使用率。

cpu_top2_value

@@ -446,7 +446,7 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

bigint

当前数据库节点内存使用量。

+

当前数据库节点内存使用量。

mem_top2_value

@@ -481,14 +481,14 @@ GS\_WLM\_SESSION\_HISTORY视图显示当前用户在数据库主节点上执行

text

当前数据库节点内存使用量信息。

+

当前数据库节点内存使用量信息。

top_cpu_dn

text

当前数据库节点cpu使用量信息。

+

当前数据库节点cpu使用量信息。

text

语句执行的数据库主节点名称。

+

语句执行的数据库主节点名称。

username

@@ -164,7 +164,7 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

integer

语句在数据库节点上的最大内存峰值,单位MB。

+

语句在数据库节点上的最大内存峰值,单位MB。

average_peak_memory

@@ -185,7 +185,7 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

text

语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All: 数据库节点均下盘。
  • [a:b]: 数量为b个数据库节点中有a个数据库节点下盘。
+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All: 数据库节点均下盘。
  • [a:b]: 数量为b个数据库节点中有a个数据库节点下盘。

integer

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

max_spill_size

integer

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

average_spill_size

integer

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

spill_skew_percent

integer

若发生下盘,数据库节点间下盘倾斜率。

+

若发生下盘,数据库节点间下盘倾斜率。

min_dn_time

bigint

语句在数据库节点上的最小执行时间,单位ms。

+

语句在数据库节点上的最小执行时间,单位ms。

max_dn_time

bigint

语句在数据库节点上的最大执行时间,单位ms。

+

语句在数据库节点上的最大执行时间,单位ms。

average_dn_time

bigint

语句在数据库节点上的平均执行时间,单位ms。

+

语句在数据库节点上的平均执行时间,单位ms。

dntime_skew_percent

integer

语句在数据库节点间的执行时间倾斜率。

+

语句在数据库节点间的执行时间倾斜率。

min_cpu_time

bigint

语句在数据库节点上的最小CPU时间,单位ms。

+

语句在数据库节点上的最小CPU时间,单位ms。

max_cpu_time

bigint

语句在数据库节点上的最大CPU时间,单位ms。

+

语句在数据库节点上的最大CPU时间,单位ms。

total_cpu_time

bigint

语句在数据库节点上的CPU总时间,单位ms。

+

语句在数据库节点上的CPU总时间,单位ms。

cpu_skew_percent

integer

语句在数据库节点间的CPU时间倾斜率。

+

语句在数据库节点间的CPU时间倾斜率。

min_peak_iops

integer

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

max_peak_iops

integer

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

average_peak_iops

integer

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

iops_skew_percent

integer

语句在数据库节点间的IO倾斜率。

+

语句在数据库节点间的IO倾斜率。

warning

@@ -334,7 +334,7 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

text

语句所属用户对应的逻辑openGauss

+

语句所属用户对应的逻辑openGauss。

cpu_top1_node_name

@@ -344,34 +344,6 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

cpu使用率第1的节点名称。

cpu_top2_node_name

-

text

-

cpu使用率第2的节点名称。

-

cpu_top3_node_name

-

text

-

cpu使用率第3的节点名称。

-

cpu_top4_node_name

-

text

-

cpu使用率第4的节点名称。

-

cpu_top5_node_name

-

text

-

cpu使用率第5的节点名称。

-

mem_top1_node_name

text

@@ -379,34 +351,6 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

内存使用量第1的节点名称。

mem_top2_node_name

-

text

-

内存使用量第5的节点名称。

-

mem_top3_node_name

-

text

-

内存使用量第5的节点名称。

-

mem_top4_node_name

-

text

-

内存使用量第5的节点名称。

-

mem_top5_node_name

-

text

-

内存使用量第5的节点名称。

-

cpu_top1_value

bigint

@@ -414,34 +358,6 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

cpu使用率。

cpu_top2_value

-

bigint

-

cpu使用率。

-

cpu_top3_value

-

bigint

-

cpu使用率。

-

cpu_top4_value

-

bigint

-

cpu使用率。

-

cpu_top5_value

-

bigint

-

cpu使用率。

-

mem_top1_value

bigint

@@ -449,34 +365,6 @@ GS\_WLM\_SESSION\_INFO系统表显示数据库主节点执行作业结束后的

内存使用量。

mem_top2_value

-

bigint

-

内存使用量。

-

mem_top3_value

-

bigint

-

内存使用量。

-

mem_top4_value

-

bigint

-

内存使用量。

-

mem_top5_value

-

bigint

-

内存使用量。

-

top_mem_dn

text

diff --git a/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md index 24c760c7e..e34fe7c37 100644 --- a/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md @@ -38,7 +38,7 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正

text

语句执行的数据库主节点名称。

+

语句执行的数据库主节点名称。

username

@@ -136,7 +136,7 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正

text

该字段不支持。

+

该字段不支持。

resource_pool

@@ -164,14 +164,14 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正

integer

语句在数据库节点上的最小内存峰值,单位MB。

+

语句在数据库节点上的最小内存峰值,单位MB。

max_peak_memory

integer

语句在数据库节点上的最大内存峰值,单位MB。

+

语句在数据库节点上的最大内存峰值,单位MB。

average_peak_memory

@@ -185,14 +185,14 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正

integer

语句在数据库节点间的内存使用倾斜率。

+

语句在数据库节点间的内存使用倾斜率。

spill_info

text

语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All:数据库节点均下盘。
  • [a:b]:数量为b个数据库节点中有a个数据库节点下盘。
+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All:数据库节点均下盘。
  • [a:b]:数量为b个数据库节点中有a个数据库节点下盘。

integer

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

max_spill_size

integer

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

average_spill_size

integer

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

+

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

spill_skew_percent

@@ -228,77 +228,77 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正

bigint

语句在数据库节点上的最小执行时间,单位ms。

+

语句在数据库节点上的最小执行时间,单位ms。

max_dn_time

bigint

语句在数据库节点上的最大执行时间,单位ms。

+

语句在数据库节点上的最大执行时间,单位ms。

average_dn_time

bigint

语句在数据库节点上的平均执行时间,单位ms。

+

语句在数据库节点上的平均执行时间,单位ms。

dntime_skew_percent

integer

语句在数据库节点间的执行时间倾斜率。

+

语句在数据库节点间的执行时间倾斜率。

min_cpu_time

bigint

语句在数据库节点上的最小CPU时间,单位ms。

+

语句在数据库节点上的最小CPU时间,单位ms。

max_cpu_time

bigint

语句在数据库节点上的最大CPU时间,单位ms。

+

语句在数据库节点上的最大CPU时间,单位ms。

total_cpu_time

bigint

语句在数据库节点上的CPU总时间,单位ms。

+

语句在数据库节点上的CPU总时间,单位ms。

cpu_skew_percent

integer

语句在数据库节点间的CPU时间倾斜率。

+

语句在数据库节点间的CPU时间倾斜率。

min_peak_iops

integer

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

max_peak_iops

integer

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

average_peak_iops

integer

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

+

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

iops_skew_percent

@@ -341,7 +341,7 @@ GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正

text

该字段不支持

+

该字段不支持。

top_mem_dn

diff --git "a/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" "b/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" index d8346e598..d93ed553b 100644 --- "a/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" +++ "b/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" @@ -14,8 +14,6 @@ - **[双机复制](双机复制.md)** -- **[内存表](内存表.md)** - - **[查询规划](查询规划.md)** - **[错误报告和日志](错误报告和日志.md)** @@ -44,15 +42,13 @@ - **[审计](审计.md)** -- **[事务监控](事务监控.md)** - - **[升级参数](升级参数.md)** - **[其它选项](其它选项.md)** - **[等待事件](等待事件.md)** -- **[Query](Query.md)** +- **[Query](Query-22.md)** - **[系统性能快照](系统性能快照.md)** diff --git "a/content/zh/docs/Developerguide/Hint\347\232\204\351\224\231\350\257\257-\345\206\262\347\252\201\345\217\212\345\221\212\350\255\246.md" "b/content/zh/docs/Developerguide/Hint\347\232\204\351\224\231\350\257\257-\345\206\262\347\252\201\345\217\212\345\221\212\350\255\246.md" new file mode 100644 index 000000000..ce60d4772 --- /dev/null +++ "b/content/zh/docs/Developerguide/Hint\347\232\204\351\224\231\350\257\257-\345\206\262\347\252\201\345\217\212\345\221\212\350\255\246.md" @@ -0,0 +1,63 @@ +# Hint的错误、冲突及告警 + +Plan Hint的结果会体现在计划的变化上,可以通过explain来查看变化。 + +Hint中的错误不会影响语句的执行,只是不能生效,该错误会根据语句类型以不同方式提示用户。对于explain语句,hint的错误会以warning形式显示在界面上,对于非explain语句,会以debug1级别日志显示在日志中,关键字为PLANHINT。 + +hint的错误分为以下类型: + +- 语法错误 + + 语法规则树归约失败,会报错,指出出错的位置。 + + 例如:hint关键字错误,leading hint或join hint指定2个表以下,其它hint未指定表等。一旦发现语法错误,则立即终止hint的解析,所以此时只有错误前面的解析完的hint有效。 + + 例如: + + ``` + leading((t1 t2)) nestloop(t1) rows(t1 t2 #10) + ``` + + nestloop\(t1\)存在语法错误,则终止解析,可用hint只有之前解析的leading\(\(t1 t2\)\)。 + +- 语义错误 + - 表不存在,存在多个,或在leading或join中出现多次,均会报语义错误。 + - scanhint中的index不存在,会报语义错误。 + - 另外,如果子查询提升后,同一层出现多个名称相同的表,且其中某个表需要被hint,hint会存在歧义,无法使用,需要为相同表增加别名规避。 + +- hint重复或冲突 + + 如果存在hint重复或冲突,只有第一个hint生效,其它hint均会失效,会给出提示。 + + - hint重复是指,hint的方法及表名均相同。例如:nestloop\(t1 t2\) nestloop\(t1 t2\)。 + - hint冲突是指,table list一样的hint,存在不一样的hint,hint的冲突仅对于每一类hint方法检测冲突。 + + 例如:nestloop \(t1 t2\) hashjoin \(t1 t2\),则后面与前面冲突,此时hashjoin的hint失效。注意:nestloop\(t1 t2\)和no mergejoin\(t1 t2\)不冲突。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >leading hint中的多个表会进行拆解。例如:leading \(\(t1 t2 t3\)\)会拆解成:leading\(\(t1 t2\)\) leading\(\(\(t1 t2\) t3\)\),此时如果存在leading\(\(t2 t1\)\),则两者冲突,后面的会被丢弃。(例外:指定内外表的hint若与不指定内外表的hint重复,则始终丢弃不指定内外表的hint。) + + +- 子链接提升后hint失效 + + 子链接提升后的hint失效,会给出提示。通常出现在子链接中存在多个表连接的场景。提升后,子链接中的多个表不再作为一个整体出现在join中。 + +- 列类型不支持重分布 + - 对于skew hint来说,目的是为了进行重分布时的调优,所以当hint列的类型不支持重分布时,hint将无效。 + +- hint未被使用 + - 非等值join使用hashjoin hint或mergejoin hint + - 不包含索引的表使用indexscan hint或indexonlyscan hint + - 通常只有在索引列上使用过滤条件才会生成相应的索引路径,全表扫描将不会使用索引,因此使用indexscan hint或indexonlyscan hint将不会使用 + - indexonlyscan只有输出列仅包含索引列才会使用,否则指定时hint不会被使用 + - 多个表存在等值连接时,仅尝试有等值连接条件的表的连接,此时没有关联条件的表之间的路径将不会生成,所以指定相应的leading,join,rows hint将不使用,例如:t1 t2 t3表join,t1和t2, t2和t3有等值连接条件,则t1和t3不会优先连接,leading\(t1 t3\)不会被使用。 + - 生成stream计划时,如果表的分布列与join列相同,则不会生成redistribute的计划;如果不同,且另一表分布列与join列相同,只能生成redistribute的计划,不会生成broadcast的计划,指定相应的hint则不会被使用。 + - 如果子链接未被提升,则blockname hint不会被使用。 + - 对于skew hint,hint未被使用可能由于: + - 计划中不需要进行重分布。 + - hint指定的列为包含分布键。 + - hint指定倾斜信息有误或不完整,如对于join优化未指定值。 + - 倾斜优化的GUC参数处于关闭状态。 + + + diff --git a/content/zh/docs/Developerguide/I-O.md b/content/zh/docs/Developerguide/I-O.md new file mode 100644 index 000000000..8f3319bd5 --- /dev/null +++ b/content/zh/docs/Developerguide/I-O.md @@ -0,0 +1,76 @@ +# I/O + +通过iostat、pidstat命令或openGauss健康检查工具查看openGauss内节点I/O繁忙度和吞吐量,分析是否存在由于I/O导致的性能瓶颈。 + +## 查看I/O状况 + +查询服务器I/O的方法主要有以下三种方式: + +- 使用iostat命令查看I/O情况。此命令主要关注单个硬盘的I/O使用率和每秒读取、写入的数量。 + + ``` + iostat -xm 1 //1为间隔时间 + Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util + sdc 0.01 519.62 2.35 44.10 0.31 2.17 109.66 0.68 14.62 2.80 15.25 0.31 1.42 + sdb 0.01 515.95 5.84 44.78 0.89 2.16 123.51 0.72 14.19 1.55 15.84 0.31 1.55 + sdd 0.02 519.93 2.36 43.91 0.32 2.17 110.16 0.65 14.12 2.58 14.74 0.30 1.38 + sde 0.02 520.26 2.34 45.17 0.31 2.18 107.46 0.80 16.86 2.92 17.58 0.34 1.63 + sda 12.07 15.72 3.97 5.01 0.07 0.08 34.11 0.28 30.64 10.11 46.92 0.98 0.88 + ``` + + “rMB/s”为每秒读取的MB数,“wMB/s”为每秒写入的MB数,“%util”为硬盘使用率。 + +- 使用pidstat命令查看I/O情况。此命令主要关注单个进程每秒读取、写入的数量。 + + ``` + pidstat -d 1 10 //1为间隔时间,10表示查看占用I/O最多的Top10进程 + 03:17:12 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command + 03:17:13 PM 1006 36134 0.00 59436.00 0.00 gaussdb + + ``` + + “kB\_rd/s”为每秒读取的kB数,“kB\_wr/s”为每秒写入的kB数。 + +- 使用gs\_checkperf工具对openGauss进行性能检查,需要以omm用户登录。 + + ``` + gs_checkperf + Cluster statistics information: + Host CPU busy time ratio : .69 % + MPPDB CPU time % in busy time : .35 % + Shared Buffer Hit ratio : 99.92 % + In-memory sort ratio : 100.00 % + Physical Reads : 8581 + Physical Writes : 2603 + DB size : 281 MB + Total Physical writes : 1944 + Active SQL count : 3 + Session count : 11 + ``` + + 显示结果包括每个节点的I/O使用情况,文件读写次数和时间。 + + 也可以使用gs\_checkperf --detail命令查询每个节点的详细性能信息。 + + +## 性能参数分析 + +1. 检查磁盘空间使用率,建议不要超过60%。 + + ``` + df -T + ``` + +2. 若I/O持续过高,建议尝试以下方式降低I/O。 + - 降低并发数。 + - 对查询相关表做VACUUM FULL。 + + ``` + vacuum full tablename; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >建议用户在系统空闲时进行VACUUM FULL操作,VACUUM FULL操作会造成短时间内I/O负载重,反而不利于降低I/O。 + + + diff --git a/content/zh/docs/Developerguide/INSERT.md b/content/zh/docs/Developerguide/INSERT.md index bab8c69bc..5b08dbbb9 100644 --- a/content/zh/docs/Developerguide/INSERT.md +++ b/content/zh/docs/Developerguide/INSERT.md @@ -24,7 +24,7 @@ INSERT INTO table_name [ ( column_name [, ...] ) ] { DEFAULT VALUES | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | query } - [ ON DUPLICATE KEY UPDATE { NOTHING | column_name = { expression | DEFAULT } } [, ...] ] + [ ON DUPLICATE KEY UPDATE { column_name = { expression | DEFAULT } } [, ...] ] [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]; ``` @@ -104,7 +104,7 @@ INSERT INTO table_name [ ( column_name [, ...] ) ] - **ON DUPLICATE KEY UPDATE** - 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。如果UPDATE子句为NOTHING,则不做任何操作。 + 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。 对于不带唯一约束的表,则仅执行插入。 @@ -115,9 +115,7 @@ INSERT INTO table_name [ ( column_name [, ...] ) ] - 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 - 分布列、唯一索引列不允许UPDATE。 - - 不支持列存 - - 。 - + - 不支持列存。 ## 示例 diff --git a/content/zh/docs/Developerguide/INSTANCE_TIME.md b/content/zh/docs/Developerguide/INSTANCE_TIME.md new file mode 100644 index 000000000..7406849bb --- /dev/null +++ b/content/zh/docs/Developerguide/INSTANCE_TIME.md @@ -0,0 +1,50 @@ +# INSTANCE\_TIME + +提供当前集群节点下的各种时间消耗信息,主要分为以下类型: + +- DB\_TIME:作业在多核下的有效时间花销。 +- CPU\_TIME:CPU的时间花销。 +- EXECUTION\_TIME:执行器内的时间花销。 +- PARSE\_TIME:SQL解析的时间花销。 +- PLAN\_TIME:生成Plan的时间花销。 +- REWRITE\_TIME:SQL重写的时间花销。 +- PL\_EXECUTION\_TIME :plpgsql(存储过程)执行的时间花销。 +- PL\_COMPILATION\_TIME:plpgsql(存储过程)编译的时间花销。 +- NET\_SEND\_TIME:网络上的时间花销。 +- DATA\_IO\_TIME:IO上的时间花销。 + +**表 1** INSTANCE\_TIME字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

stat_id

+

integer

+

统计编号。

+

stat_name

+

text

+

类型名称。

+

value

+

bigint

+

时间值(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/Instance.md b/content/zh/docs/Developerguide/Instance.md new file mode 100644 index 000000000..c200bb30e --- /dev/null +++ b/content/zh/docs/Developerguide/Instance.md @@ -0,0 +1,7 @@ +# Instance + +- **[INSTANCE\_TIME](INSTANCE_TIME.md)** + +- **[GLOBAL\_INSTANCE\_TIME](GLOBAL_INSTANCE_TIME.md)** + + diff --git "a/content/zh/docs/Developerguide/Ispell\350\257\215\345\205\270.md" "b/content/zh/docs/Developerguide/Ispell\350\257\215\345\205\270.md" index b6476244c..34301e4c3 100644 --- "a/content/zh/docs/Developerguide/Ispell\350\257\215\345\205\270.md" +++ "b/content/zh/docs/Developerguide/Ispell\350\257\215\345\205\270.md" @@ -8,7 +8,7 @@ openGauss不提供任何预定义的Ispell类型词典或词典文件。dict文 1. 获取词典定义文件和词缀文件。 - 用户可以使用开源词典(OpenOffice上可以获取),直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成 UTF-8 编码,比如挪威语词典: + 用户可以使用开源词典,直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成 UTF-8 编码,比如挪威语词典: ``` iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff @@ -26,7 +26,7 @@ openGauss不提供任何预定义的Ispell类型词典或词典文件。dict文 ); ``` - 其中,词典文件全名为nn\_no.dict和nn\_no.affix,所在目录为当前连接数据库主节点的/home/dicts/下 。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + 其中,词典文件全名为nn\_no.dict和nn\_no.affix,所在目录为当前连接数据库主节点的/home/dicts/下 。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md)。 3. 使用Ispell词典进行复合词拆分。 diff --git "a/content/zh/docs/Developerguide/JDBC\345\214\205-\351\251\261\345\212\250\347\261\273\345\222\214\347\216\257\345\242\203\347\261\273.md" "b/content/zh/docs/Developerguide/JDBC\345\214\205-\351\251\261\345\212\250\347\261\273\345\222\214\347\216\257\345\242\203\347\261\273.md" new file mode 100644 index 000000000..7305a80be --- /dev/null +++ "b/content/zh/docs/Developerguide/JDBC\345\214\205-\351\251\261\345\212\250\347\261\273\345\222\214\347\216\257\345\242\203\347\261\273.md" @@ -0,0 +1,65 @@ +# JDBC包、驱动类和环境类 + +## JDBC包 + +在源代码目录下执行build.sh,获得驱动jar包postgresql.jar,包位置在源代码目录下。从发布包中获取, 包名为openGauss-x.x.x-操作系统版本号-64bit-Jdbc.tar.gz。 + +驱动包与PostgreSQL保持兼容,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统使用。 + +## 驱动类 + +在创建数据库连接之前,需要加载数据库驱动类“org.postgresql.Driver”。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>由于openGauss在JDBC的使用上与PG的使用方法保持兼容,所以同时在同一进程内使用两个JDBC驱动的时候,可能会类名冲突。 + +## 环境类 + +客户端需配置JDK1.8,配置方法如下: + +1. DOS窗口输入“java -version”,查看JDK版本,确认为JDK1.8版本。如果未安装JDK,请从官方网站下载安装包并安装。 +2. 根据如下步骤配置系统环境变量。 + 1. 右键单击“我的电脑“,选择“属性“。 + 2. 在“系统“页面左侧导航栏单击“高级系统设置“。 + 3. 在“系统属性“页面,“高级“页签上单击“环境变量“。 + 4. 在“环境变量“页面上,“系统变量“区域单击“新建“或“编辑“配置系统变量。变量说明请参见[表1](#zh-cn_topic_0237120378_zh-cn_topic_0213179123_table1625616152473)。 + + **表 1** 变量说明 + + + + + + + + + + + + + + + + + + + + +

变量名

+

操作

+

变量值

+

JAVA_HOME

+
  • 若存在,则单击“编辑”。
  • 若不存在,则单击“新建”。
+

JAVA的安装目录。

+

例如:C:\Program Files\Java\jdk1.8.0_131

+

Path

+

编辑

+
  • 若配置了JAVA_HOME,则在变量值的最前面加上: %JAVA_HOME%\bin;
  • 若未配置JAVA_HOME,则在变量值的最前面加上 JAVA安装的全路径:

    C:\Program Files\Java\jdk1.8.0_131\bin;

    +
+

CLASSPATH

+

新建

+

.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;

+
+ + + diff --git "a/content/zh/docs/Developerguide/JDBC\346\216\245\345\217\243\345\217\202\350\200\203.md" "b/content/zh/docs/Developerguide/JDBC\346\216\245\345\217\243\345\217\202\350\200\203.md" new file mode 100644 index 000000000..f867d97a7 --- /dev/null +++ "b/content/zh/docs/Developerguide/JDBC\346\216\245\345\217\243\345\217\202\350\200\203.md" @@ -0,0 +1,4 @@ +# JDBC接口参考 + +请参见[JDBC](JDBC.md)。 + diff --git "a/content/zh/docs/Developerguide/JSON\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/JSON\345\207\275\346\225\260.md" index bcf39bd19..14de71e4d 100644 --- "a/content/zh/docs/Developerguide/JSON\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/JSON\345\207\275\346\225\260.md" @@ -1,6 +1,6 @@ # JSON函数 -JSON函数表示可以用于JSON类型(请参考[JSON类型](JSON类型.md#ZH-CN_TOPIC_0242370422))数据的函数。 +JSON函数表示可以用于JSON类型(请参考[JSON类型](JSON类型.md))数据的函数。 - array\_to\_json\(anyarray \[, pretty\_bool\]\) diff --git "a/content/zh/docs/Developerguide/JSON\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/JSON\347\261\273\345\236\213.md" index e00d749f3..94fb56e7e 100644 --- "a/content/zh/docs/Developerguide/JSON\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/JSON\347\261\273\345\236\213.md" @@ -2,5 +2,5 @@ JSON数据类型可以用来存储JSON(JavaScript Object Notation)数据。数据可以存储为text,但是JSON数据类型更有利于检查每个存储的数值是可用的JSON值。 -JSON类型相关的支持函数请参见[JSON函数](JSON函数.md#ZH-CN_TOPIC_0242370441)。 +JSON类型相关的支持函数请参见[JSON函数](JSON函数.md)。 diff --git "a/content/zh/docs/Developerguide/Join\346\226\271\345\274\217\347\232\204Hint.md" "b/content/zh/docs/Developerguide/Join\346\226\271\345\274\217\347\232\204Hint.md" new file mode 100644 index 000000000..cb45dd4c7 --- /dev/null +++ "b/content/zh/docs/Developerguide/Join\346\226\271\345\274\217\347\232\204Hint.md" @@ -0,0 +1,35 @@ +# Join方式的Hint + +## 功能描述 + +指明Join使用的方法,可以为Nested Loop,Hash Join和Merge Join。 + +## 语法格式 + +``` +[no] nestloop|hashjoin|mergejoin(table_list) +``` + +## 参数说明 + +- **no**表示hint的join方式不使用。 + +- **table\_list**为表示hint表集合的字符串,该字符串中的表与[join\_table\_list](Join顺序的Hint.md#zh-cn_topic_0237121533_section1280444714345)相同,只是中间不允许出现括号指定join的优先级。 + +例如: + +no nestloop\(t1 t2 t3\)表示:生成t1,t2,t3三表连接计划时,不使用nestloop。三表连接计划可能是t2 t3先join,再跟t1 join,或t1 t2先join,再跟t3 join。此hint只hint最后一次join的join方式,对于两表连接的方法不hint。如果需要,可以单独指定,例如:任意表均不允许nestloop连接,且希望t2 t3先join,则增加hint:no nestloop\(t2 t3\)。 + +## 示例 + +对[示例](Plan-Hint调优概述.md#zh-cn_topic_0237121532_section671421102912)中原语句使用如下hint: + +``` +explain +select /*+ nestloop(store_sales store_returns item) */ i_product_name product_name ... +``` + +该hint表示:生成store\_sales,store\_returns和item三表的结果集时,最后的两表关联使用nestloop。生成计划如下所示: + +![](figures/zh-cn_image_0253032870.png) + diff --git "a/content/zh/docs/Developerguide/Join\351\241\272\345\272\217\347\232\204Hint.md" "b/content/zh/docs/Developerguide/Join\351\241\272\345\272\217\347\232\204Hint.md" new file mode 100644 index 000000000..c9f207293 --- /dev/null +++ "b/content/zh/docs/Developerguide/Join\351\241\272\345\272\217\347\232\204Hint.md" @@ -0,0 +1,62 @@ +# Join顺序的Hint + +## 功能描述 + +指明join的顺序,包括内外表顺序。 + +## 语法格式 + +- 仅指定join顺序,不指定内外表顺序。 + +``` +leading(join_table_list) +``` + +- 同时指定join顺序和内外表顺序,内外表顺序仅在最外层生效。 + +``` +leading((join_table_list)) +``` + +## 参数说明 + +**join\_table\_list**为表示表join顺序的hint字符串,可以包含当前层的任意个表(别名),或对于子查询提升的场景,也可以包含子查询的hint别名,同时任意表可以使用括号指定优先级,表之间使用空格分隔。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>表只能用单个字符串表示,不能带schema。 +>表如果存在别名,需要优先使用别名来表示该表。 + +join table list中指定的表需要满足以下要求,否则会报语义错误。 + +- list中的表必须在当前层或提升的子查询中存在。 +- list中的表在当前层或提升的子查询中必须是唯一的。如果不唯一,需要使用不同的别名进行区分。 +- 同一个表只能在list里出现一次。 +- 如果表存在别名,则list中的表需要使用别名。 + +例如: + +leading\(t1 t2 t3 t4 t5\)表示:t1, t2, t3, t4, t5先join,五表join顺序及内外表不限。 + +leading\(\(t1 t2 t3 t4 t5\)\)表示:t1和t2先join,t2做内表;再和t3 join,t3做内表;再和t4 join,t4做内表;再和t5 join,t5做内表。 + +leading\(t1 \(t2 t3 t4\) t5\)表示:t2, t3, t4先join,内外表不限;再和t1, t5 join,内外表不限。 + +leading\(\(t1 \(t2 t3 t4\) t5\)\)表示:t2, t3, t4先join,内外表不限;在最外层,t1再和t2, t3, t4的join表join,t1为外表,再和t5 join,t5为内表。 + +leading\(\(t1 \(t2 t3\) t4 t5\)\) leading\(\(t3 t2\)\)表示:t2, t3先join,t2做内表;然后再和t1 join,t2, t3的join表做内表;然后再依次跟t4, t5做join,t4, t5做内表。 + +## 示例 + +对[示例](Plan-Hint调优概述.md#zh-cn_topic_0237121532_section671421102912)中原语句使用如下hint: + +``` +explain +select /*+ leading((((((store_sales store) promotion) item) customer) ad2) store_returns) leading((store store_sales))*/ i_product_name product_name ... +``` + +该hint表示:表之间的join关系是:store\_sales和store先join, store\_sales做内表,然后依次跟promotion, item, customer, ad2, store\_returns做join。生成计划如下所示: + +![](figures/zh-cn_image_0253030479.png) + +图中计划顶端warning的提示详见[Hint的错误、冲突及告警](Hint的错误-冲突及告警.md)的说明。 + diff --git "a/content/zh/docs/Developerguide/LLVM\344\275\277\347\224\250\345\273\272\350\256\256.md" "b/content/zh/docs/Developerguide/LLVM\344\275\277\347\224\250\345\273\272\350\256\256.md" new file mode 100644 index 000000000..6d76d5ffc --- /dev/null +++ "b/content/zh/docs/Developerguide/LLVM\344\275\277\347\224\250\345\273\272\350\256\256.md" @@ -0,0 +1,12 @@ +# LLVM使用建议 + +目前LLVM在数据库内核侧已默认打开,用户可结合上述的分析进行配置,总体建议如下: + +1. 设置合理的work\_mem,在允许的条件下尽可能设置较大的work\_mem,如果出现大量下盘,则建议关闭LLVM动态编译优化\(通过设置enable\_codegen=off实现\)。 +2. 设置合理的codegen\_cost\_threshold\(默认值为10000\),确保小数据量场景下避免使用LLVM动态编译优化。当codegen\_cost\_threshold的值设定后,因使用LLVM动态编译优化引入性能劣化,则建议增加codegen\_cost\_threshold的取值。 +3. 对于表达式计算使用LLVM动态编译优化,如果存在大量的调用C-函数的场景,建议关闭LLVM动态编译优化。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >在资源许可的情况下,数据量越大,可获得的性能提升效果越好。 + + diff --git "a/content/zh/docs/Developerguide/LLVM\351\200\202\347\224\250\345\234\272\346\231\257\344\270\216\351\231\220\345\210\266.md" "b/content/zh/docs/Developerguide/LLVM\351\200\202\347\224\250\345\234\272\346\231\257\344\270\216\351\231\220\345\210\266.md" new file mode 100644 index 000000000..ad0cd7914 --- /dev/null +++ "b/content/zh/docs/Developerguide/LLVM\351\200\202\347\224\250\345\234\272\346\231\257\344\270\216\351\231\220\345\210\266.md" @@ -0,0 +1,35 @@ +# LLVM适用场景与限制 + +## 适用场景 + +- 支持LLVM的表达式 + + 查询语句中存在以下的表达式支持LLVM优化: + + 1. Case…when… 表达式 + 2. In表达式 + 3. Bool表达式 \(And/Or/Not\) + 4. BooleanTest表达式 \(IS\_NOT\_KNOWN/IS\_UNKNOWN/IS\_TRUE/IS\_NOT\_TRUE/IS\_FALSE/IS\_NOT\_FALSE\) + 5. NullTest表达式 \(IS\_NOT\_NULL/IS\_NULL\) + 6. Operator表达式 + 7. Function表达式 \(lpad, substring, btrim, rtrim, length\) + 8. Nullif表达式 + + 表达式计算支持的数据类型包括bool, tinyint, smallint, int, bigint, float4, float8, numeric, date, time, timetz, timestamp, timestamptz, interval, bpchar, varchar, text, oid。 + + 仅当表达式出现在向量化执行引擎中Scan节点的filter、Hash Join节点中的complicate hash condition、hash join filter、hash join target, Nested Loop节点中的filter、join filter, Merge Join节点的merge join filter, merge join target, Group节点中的filter表达式时,才会考虑是否使用LLVM动态编译优化。 + +- 支持LLVM的算子: + + 1. Join :HashJoin + 2. Agg :HashAgg + 3. Sort + + 其中HashJoin算子仅支持Hash Inner Join,对应的hash cond仅支持int4、bigint、bpchar类型的比较;HashAgg算子仅支持针对bigint、numeric类型的sum及avg操作,且group by语句仅支持int4、bigint、bpchar,text,varchar,timestamp类型操作,同时支持count\(\*\)聚集操作。Sort算子仅支持对int4,bigint,numeric,bpchar,text,varchar数据类型的比较操作。除此之外,无法使用LLVM动态编译优化,具体可通过explain performance工具进行显示。 + + +## 非适用场景 + +- 不支持小数据量表使用LLVM动态编译优化。 +- 不支持生成非向量化执行路径的查询作业。 + diff --git a/content/zh/docs/Developerguide/LOCAL_REL_IOSTAT.md b/content/zh/docs/Developerguide/LOCAL_REL_IOSTAT.md new file mode 100644 index 000000000..2b5d560e9 --- /dev/null +++ b/content/zh/docs/Developerguide/LOCAL_REL_IOSTAT.md @@ -0,0 +1,46 @@ +# LOCAL\_REL\_IOSTAT + +获取当前节点中数据文件IO状态的累计值,显示为所有数据文件IO状态的总和。 + +**表 1** LOCAL\_REL\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

phyrds

+

bigint

+

读物理文件的数目。

+

phywrts

+

bigint

+

写物理文件的数目。

+

phyblkrd

+

bigint

+

读物理文件的块的数目。

+

phyblkwrt

+

bigint

+

写物理文件的块的数目。

+
+ diff --git a/content/zh/docs/Developerguide/LOCAL_THREADPOOL_STATUS.md b/content/zh/docs/Developerguide/LOCAL_THREADPOOL_STATUS.md new file mode 100644 index 000000000..95b7baf0b --- /dev/null +++ b/content/zh/docs/Developerguide/LOCAL_THREADPOOL_STATUS.md @@ -0,0 +1,69 @@ +# LOCAL\_THREADPOOL\_STATUS + +LOCAL\_THREADPOOL\_STATUS视图显示线程池下工作线程及会话的状态信息。该视图仅在线程池开启(enable\_thread\_pool = on)时生效。 + +**表 1** LOCAL\_THREADPOOL\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

group_id

+

integer

+

线程池组ID。

+

bind_numa_id

+

integer

+

该线程池组绑定的NUMA ID。

+

bind_cpu_number

+

integer

+

该线程池组绑定的CPU信息。如果未绑定CPU,该值为NULL。

+

listener

+

integer

+

该线程池组的Listener线程数量。

+

worker_info

+

text

+

线程池中线程相关信息,包括以下信息:

+
  • default:该线程池组中的初始线程数量。
  • new:该线程池组中新增线程的数量。
  • expect:该线程池组中预期线程的数量。
  • actual:该线程池组中实际线程的数量。
  • idle:该线程池组中空闲线程的数量。
  • pending:该线程池组中等待线程的数量。
+

session_info

+

text

+

线程池中会话相关信息,包括以下信息:

+
  • total:该线程池组中所有的会话数量。
  • waiting:该线程池组中等待调度的会话数量。
  • running:该线程池中正在执行的会话数量。
  • idle:该线程池组中空闲的会话数量。
+
+ diff --git a/content/zh/docs/Developerguide/LOCK.md b/content/zh/docs/Developerguide/LOCK.md index b26c0c338..fd02cace0 100644 --- a/content/zh/docs/Developerguide/LOCK.md +++ b/content/zh/docs/Developerguide/LOCK.md @@ -1,306 +1,7 @@ -# LOCK +# Lock -## 功能描述 +- **[LOCKS](LOCKS.md)** -LOCK TABLE获取表级锁。 +- **[GLOBAL\_LOCKS](GLOBAL_LOCKS.md)** -openGauss在为一个引用了表的命令自动请求锁时,尽可能选择最小限制的锁模式。如果用户需要一种更为严格的锁模式,可以使用LOCK命令。例如,一个应用是在Read Committed隔离级别上运行事务,并且它需要保证表中的数据在事务的运行过程中不被修改。为实现这个目的,则可以在查询之前对表使用SHARE锁模式进行锁定。这样将防止数据不被并发修改,从而保证后续的查询可以读到已提交的持久化的数据。因为SHARE锁模式与任何写操作需要的ROW EXCLUSIVE模式冲突,并且LOCK TABLE name IN SHARE MODE语句将等到所有当前持有ROW EXCLUSIVE模式锁的事务提交或回滚后才能执行。因此,一旦获得该锁,就不会存在未提交的写操作,并且其他操作也只能等到该锁释放之后才能开始。 - -## 注意事项 - -- LOCK TABLE只能在一个事务块的内部有用,因为锁在事务结束时就会被释放。出现在任意事务块外面的LOCK TABLE都会报错。 -- 如果没有声明锁模式,缺省为最严格的模式ACCESS EXCLUSIVE。 -- LOCK TABLE ... IN ACCESS SHARE MODE需要在目标表上有SELECT权限。所有其他形式的LOCK需要UPDATE和/或DELETE权限。 -- 没有UNLOCK TABLE命令,锁总是在事务结束时释放。 -- LOCK TABLE只处理表级的锁,因此那些带“ROW”字样的锁模式都是有歧义的。这些模式名称通常可理解为用户试图在一个被锁定的表中获取行级的锁。同样,ROW EXCLUSIVE模式也是一个可共享的表级锁。注意,只要是涉及到LOCK TABLE ,所有锁模式都有相同的语意,区别仅在于规则中锁与锁之间是否冲突,规则请参见[表1](#zh-cn_topic_0237122168_zh-cn_topic_0059778442_ta3d4fbc3c92c4f2994f7a9f5583a6ba5)。 - -## 语法格式 - -``` -LOCK [ TABLE ] {[ ONLY ] name [, ...]| {name [ * ]} [, ...]} - [ IN {ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE} MODE ] - [ NOWAIT ]; -``` - -## 参数说明 - -**表 1** 冲突的锁模式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

请求的锁模式/当前锁模式

-

ACCESS SHARE

-

ROW SHARE

-

ROW EXCLUSIVE

-

SHARE UPDATE EXCLUSIVE

-

SHARE

-

SHARE ROW EXCLUSIVE

-

EXCLUSIVE

-

ACCESS EXCLUSIVE

-

ACCESS SHARE

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

X

-

ROW SHARE

-

-

-

-

-

-

-

-

-

-

-

-

-

X

-

X

-

ROW EXCLUSIVE

-

-

-

-

-

-

-

-

-

X

-

X

-

X

-

X

-

SHARE UPDATE EXCLUSIVE

-

-

-

-

-

-

-

X

-

X

-

X

-

X

-

X

-

SHARE

-

-

-

-

-

X

-

X

-

-

-

X

-

X

-

X

-

SHARE ROW EXCLUSIVE

-

-

-

-

-

X

-

X

-

X

-

X

-

X

-

X

-

EXCLUSIVE

-

-

-

X

-

X

-

X

-

X

-

X

-

X

-

X

-

ACCESS EXCLUSIVE

-

X

-

X

-

X

-

X

-

X

-

X

-

X

-

X

-
- -LOCK的参数说明如下所示: - -- **name** - - 要锁定的表的名称,可以有模式修饰。 - - LOCK TABLE命令中声明的表的顺序就是上锁的顺序。 - - 取值范围:已存在的表名。 - -- **ONLY** - - 如果指定ONLY,只有该表被锁定。如果没有声明,该表和他的所有子表将都被锁定。 - -- **ACCESS SHARE** - - ACCESS锁只允许对表进行读取,而禁止对表进行修改。所有对表进行读取而不修改的SQL语句都会自动请求这种锁。例如,SELECT命令会自动在被引用的表上请求一个这种锁。 - -- **ROW SHARE** - - ROW SHARE锁允许对表进行并发读取,禁止对表进行其他操作。 - - SELECT FOR UPDATE和SELECT FOR SHARE命令会自动在目标表上请求ROW SHARE锁(且所有被引用但不是FOR SHARE/FOR UPDATE的其他表上,还会自动加上ACCESS SHARE锁)。 - -- **ROW EXCLUSIVE** - - 与ROW SHARE锁相同,ROW EXCLUSIVE允许并发读取表,但是禁止修改表中数据。UPDATE,DELETE,INSERT命令会自动在目标表上请求这个锁(且所有被引用的其他表上还会自动加上的ACCESS SHARE锁)。通常情况下,所有会修改表数据的命令都会请求表的ROW EXCLUSIVE锁。 - -- **SHARE UPDATE EXCLUSIVE** - - 这个模式保护一个表的模式不被并发修改,以及禁止在目标表上执行垃圾回收命令(VACUUM )。 - - VACUUM(不带FULL选项),ANALYZE,CREATE INDEX CONCURRENTLY命令会自动请求这样的锁。 - -- **SHARE** - - SHARE锁允许并发的查询,但是禁止对表进行修改。 - - CREATE INDEX(不带CONCURRENTLY选项)语句会自动请求这种锁。 - -- **SHARE ROW EXCLUSIVE** - - SHARE ROW EXCLUSIVE锁禁止对表进行任何的并发修改,而且是独占锁,因此一个会话中只能获取一次。 - - 任何SQL语句都不会自动请求这个锁模式。 - -- **EXCLUSIVE** - - EXCLUSIVE锁允许对目标表进行并发查询,但是禁止任何其他操作。 - - 这个模式只允许并发加ACCESS SHARE锁,也就是说,只有对表的读动作可以和持有这个锁模式的事务并发执行。 - - 任何SQL语句都不会在用户表上自动请求这个锁模式。然而在某些操作的时候,会在某些系统表上请求它。 - -- **ACCESS EXCLUSIVE** - - 这个模式保证其所有者(事务)是可以访问该表的唯一事务。 - - ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL命令会自动请求这种锁。 - - 在LOCK TABLE命令没有明确声明需要的锁模式时,它是缺省锁模式。 - -- **NOWAIT** - - 声明LOCK TABLE不去等待任何冲突的锁释放,如果无法立即获取该锁,该命令退出并且发出一个错误信息。 - - 在不指定NOWAIT的情况下获取表级锁时,如果有其他互斥锁存在的话,则等待其他锁的释放。 - - -## 示例 - -``` ---向一个外键表上插入数据时,在有主键的表上使用SHARE锁。 -postgres=# START TRANSACTION; - -postgres=# LOCK TABLE tpcds.reason IN SHARE MODE; - -postgres=# SELECT r_reason_desc FROM tpcds.reason WHERE r_reason_sk=5; -r_reason_desc ------------ - Parts missing -(1 row) - -postgres=# COMMIT; - ---在执行删除操作时对一个有主键的表进行 SHARE ROW EXCLUSIVE 锁。 -postgres=# CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason; - -postgres=# START TRANSACTION; - -postgres=# LOCK TABLE tpcds.reason_t1 IN SHARE ROW EXCLUSIVE MODE; - -postgres=# DELETE FROM tpcds.reason_t1 WHERE r_reason_desc IN(SELECT r_reason_desc FROM tpcds.reason_t1 WHERE r_reason_sk < 6 ); - -postgres=# DELETE FROM tpcds.reason_t1 WHERE r_reason_sk = 7; - -postgres=# COMMIT; - ---删除表tpcds.reason_t1。 -postgres=# DROP TABLE tpcds.reason_t1; -``` diff --git a/content/zh/docs/Developerguide/LOCKS.md b/content/zh/docs/Developerguide/LOCKS.md new file mode 100644 index 000000000..4b36ecc83 --- /dev/null +++ b/content/zh/docs/Developerguide/LOCKS.md @@ -0,0 +1,138 @@ +# LOCKS + +LOCKS视图用于查看各打开事务所持有的锁信息。 + +**表 1** LOCKS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

locktype

+

text

+

被锁定对象的类型:relation,extend,page,tuple,transactionid,virtualxid,object,userlock,advisory。

+

database

+

oid

+
被锁定对象所在数据库的OID:
  • 如果被锁定的对象是共享对象,则OID为0。
  • 如果是一个事物ID,则为NULL。
+
+

relation

+

oid

+

关系的OID,如果锁定的对象不是关系,也不是关系的一部分,则为NULL。

+

page

+

integer

+

关系内部的页面编号,如果对象不是关系页或者不是行页,则为NULL。

+

tuple

+

smallint

+

页面里边的行编号,如果对象不是行,则为NULL。

+

bucket

+

integer

+

哈希桶号。

+

virtualxid

+

text

+

事务的虚拟ID,如果对象不是一个虚拟事务ID,则为NULL。

+

transactionid

+

xid

+

事务的ID,如果对象不是一个事务ID,则为NULL。

+

classid

+

oid

+

包含该对象的系统表的OID,如果对象不是普通的数据库对象,则为NULL。

+

objid

+

oid

+

对象在其系统表内的OID,如果对象不是普通数据库对象,则为NULL。

+

objsubid

+

smallint

+

对于表的一个字段,这是字段编号;对于其他对象类型,这个字段是零;如果这个对象不是普通数据库对象,则为NULL。

+

virtualtransaction

+

text

+

持有此锁或者在等待此锁的事务的虚拟ID。

+

pid

+

bigint

+

持有或者等待这个锁的服务器线程的逻辑ID。如果锁是被一个预备事务持有的,则为NULL。

+

sessionid

+

bigint

+

持有或者等待这个锁的会话ID。如果锁是被一个预备事务持有的,则为NULL。

+

mode

+

text

+

这个线程持有的或者是期望的锁模式。

+

granted

+

boolean

+
  • 如果锁是持有锁,则为TRUE。
  • 如果锁是等待锁,则为FALSE。
+

fastpath

+

boolean

+

如果通过fast-path获得锁,则为TRUE;如果通过主要的锁表获得,则为FALSE。

+
+ diff --git "a/content/zh/docs/Developerguide/Linux\344\270\213\351\205\215\347\275\256\346\225\260\346\215\256\346\272\220.md" "b/content/zh/docs/Developerguide/Linux\344\270\213\351\205\215\347\275\256\346\225\260\346\215\256\346\272\220.md" new file mode 100644 index 000000000..d34b8c827 --- /dev/null +++ "b/content/zh/docs/Developerguide/Linux\344\270\213\351\205\215\347\275\256\346\225\260\346\215\256\346\272\220.md" @@ -0,0 +1,446 @@ +# Linux下配置数据源 + +将openGauss提供的ODBC DRIVER(psqlodbcw.so)配置到数据源中便可使用。配置数据源需要配置“odbc.ini”和“odbcinst.ini”两个文件(在编译安装unixODBC过程中生成且默认放在“/usr/local/etc”目录下),并在服务器端进行配置。 + +## 操作步骤 + +1. 获取unixODBC源码包。 + + 获取参考地址:http://sourceforge.net/projects/unixodbc/files/unixODBC/2.3.0/unixODBC-2.3.0.tar.gz/download + +2. 安装unixODBC。如果机器上已经安装了其他版本的unixODBC,可以直接覆盖安装。 + + 目前不支持unixODBC-2.2.1版本。以unixODBC-2.3.0版本为例,在客户端执行如下命令安装unixODBC。默认安装到“/usr/local”目录下,生成数据源文件到 “/usr/local/etc”目录下,库文件生成在“/usr/local/lib”目录。 + + ``` + tar zxvf unixODBC-2.3.0.tar.gz + cd unixODBC-2.3.0 + #修改configure文件(如果不存在,那么请修改configure.ac),找到LIB_VERSION + #将它的值修改为"1:0:0",这样将编译出*.so.1的动态库,与psqlodbcw.so的依赖关系相同。 + vim configure + + ./configure --enable-gui=no #如果要在鲲鹏服务器上编译,请追加一个configure参数: --build=aarch64-unknown-linux-gnu + make + #安装可能需要root权限 + make install + ``` + +3. 替换客户端openGauss驱动程序。 + 1. 将openGauss-1.0.0-ODBC.tar.gz解压到“/usr/local/lib”目录下。解压会得到“psqlodbcw.la”和“psqlodbcw.so”两个文件。 + 2. 将openGauss-1.0.0-ODBC.tar.gz解压后lib目录中的库拷贝到“/usr/local/lib”目录下。 + +4. 配置数据源。 + 1. 配置ODBC驱动文件。 + + 在“/usr/local/etc/odbcinst.ini”文件中追加以下内容。 + + ``` + [GaussMPP] + Driver64=/usr/local/lib/psqlodbcw.so + setup=/usr/local/lib/psqlodbcw.so + ``` + + odbcinst.ini文件中的配置参数说明如[表1](#zh-cn_topic_0237120407_zh-cn_topic_0059778464_td564f21e7c8e458bbd741b09896f5d91)所示。 + + **表 1** odbcinst.ini文件配置参数 + + + + + + + + + + + + + + + + + + + + +

参数

+

描述

+

示例

+

[DriverName]

+

驱动器名称,对应数据源DSN中的驱动名。

+

[DRIVER_N]

+

Driver64

+

驱动动态库的路径。

+

Driver64=/xxx/odbc/lib/psqlodbcw.so

+

setup

+

驱动安装路径,与Driver64中动态库的路径一致。

+

setup=/xxx/odbc/lib/psqlodbcw.so

+
+ + 2. 配置数据源文件。 + + 在“/usr/local/etc/odbc.ini ”文件中追加以下内容。 + + ``` + [MPPODBC] + Driver=GaussMPP + Servername=10.10.0.13(数据库Server IP) + Database=postgres (数据库名) + Username=omm (数据库用户名) + Password= (数据库用户密码) + Port=8000 (数据库监听端口) + Sslmode=allow + ``` + + odbc.ini文件配置参数说明如[表2](#zh-cn_topic_0237120407_zh-cn_topic_0059778464_t55845a6555f2454297b64ce47ad3d648)所示。 + + **表 2** odbc.ini文件配置参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

描述

+

示例

+

[DSN]

+

数据源的名称。

+

[MPPODBC]

+

Driver

+

驱动名,对应odbcinst.ini中的DriverName。

+

Driver=DRIVER_N

+

Servername

+

服务器的IP地址。

+

Servername=10.145.130.26

+

Database

+

要连接的数据库的名称。

+

Database=postgres

+

Username

+

数据库用户名称。

+

Username=omm

+

Password

+

数据库用户密码。

+

Password=

+
说明:

ODBC驱动本身已经对内存密码进行过清理,以保证用户密码在连接后不会再在内存中保留。

+

但是如果配置了此参数,由于UnixODBC对数据源文件等进行缓存,可能导致密码长期保留在内存中。

+

推荐在应用程序连接时,将密码传递给相应API,而非写在数据源配置文件中。同时连接成功后,应当及时清理保存密码的内存段。

+
+

Port

+

服务器的端口号。

+

Port=8000

+

Sslmode

+

开启SSL模式

+

Sslmode=allow

+

UseServerSidePrepare

+

是否开启数据库端扩展查询协议。

+

可选值0或1,默认为1,表示打开扩展查询协议。

+

UseServerSidePrepare=1

+

UseBatchProtocol

+

是否开启批量查询协议(打开可提高DML性能);可选值0或者1,默认为1。

+

当此值为0时,不使用批量查询协议(主要用于与早期数据库版本通信兼容)。

+

当此值为1,并且数据库support_batch_bind参数存在且为on时,将打开批量查询协议。

+

UseBatchProtocol=1

+

ConnectionExtraInfo

+

GUC参数connection_info(参见connection_info)中显示驱动部署路径和进程属主用户的开关。

+

ConnectionExtraInfo=1

+
说明:

默认值为0。当设置为1时,ODBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数(参见connection_info)里;同时可以在PG_STAT_ACTIVITY中查询到。

+
+
+ + 其中关于Sslmode的选项的允许值,具体信息见下表: + + **表 3** sslmode的可选项及其描述 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

sslmode

+

是否会启用SSL加密

+

描述

+

disable

+

+

不使用SSL安全连接。

+

allow

+

可能

+

如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。

+

prefer

+

可能

+

如果数据库支持,那么建议使用SSL安全加密连接,但不验证数据库服务器的真实性。

+

require

+

+

必须使用SSL安全连接,但是只做了数据加密,而并不验证数据库服务器的真实性。

+

verify-ca

+

+

必须使用SSL安全连接,并且验证数据库是否具有可信证书机构签发的证书。

+

verify-full

+

+

必须使用SSL安全连接,在verify-ca的验证范围之外,同时验证数据库所在主机的主机名是否与证书内容一致。openGauss不支持此模式。

+
+ +5. 生成SSL证书,具体请参见[证书生成](证书生成.md)。 +6. 替换SSL证书,具体请参见[证书替换](证书替换.md)。 +7. 配置数据库服务器。 + 1. 以操作系统用户omm登录数据库主节点。 + 2. 执行如下命令增加对外提供服务的网卡IP或者主机名(英文逗号分隔),其中NodeName为当前节点名称: + + ``` + gs_guc reload -N NodeName -I all -c "listen_addresses='localhost,192.168.0.100,10.11.12.13'" + ``` + + 在DR(Direct Routing,LVS的直接路由DR模式)模式中需要将虚拟IP地址(10.11.12.13)加入到服务器的监听地址列表中。 + + listen\_addresses也可以配置为“\*”或“0.0.0.0”,此配置下将监听所有网卡,但存在安全风险,不推荐用户使用,推荐用户按照需要配置IP或者主机名,打开监听。 + + 3. 执行如下命令在数据库主节点配置文件中增加一条认证规则。(这里假设客户端IP地址为10.11.12.13,即远程连接的机器的IP地址) + + ``` + gs_guc reload -N all -I all -h "host all jack 10.11.12.13/32 sha256" + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- -N all表示openGauss中的所有主机。 + >- -I all表示主机中的所有实例。 + >- -h表示指定需要在“pg\_hba.conf”增加的语句。 + >- all表示允许客户端连接到任意的数据库。 + >- jack表示连接数据库的用户。 + >- 10.11.12.13/_32_表示只允许IP地址为10.11.12.13的主机连接。在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255 + >- sha256表示连接时jack用户的密码使用sha256算法加密。 + + 如果将ODBC客户端配置在和要连接的数据库主节点在同一台机器上,则可使用local trust认证方式,如下: + + ``` + local all all xxx.xxx.xxx.xxx/32 trust + ``` + + 如果将ODBC客户端配置在和要连接的数据库主节点在不同机器上,则需要使用sha256认证方式,如下: + + ``` + host all all xxx.xxx.xxx.xxx/32 sha256 + ``` + + 4. 重启openGauss。 + + ``` + gs_om -t stop + gs_om -t start + ``` + +8. 配置环境变量。 + + ``` + vim ~/.bashrc + ``` + + 在配置文件中追加以下内容。 + + ``` + export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH + export ODBCSYSINI=/usr/local/etc + export ODBCINI=/usr/local/etc/odbc.ini + ``` + +9. 执行如下命令使设置生效。 + + ``` + source ~/.bashrc + ``` + + +## 测试数据源配置 + +执行isql -v GaussODBC\(数据源名称\)命令。 + +- 如果显示如下信息,表明配置正确,连接成功。 + + ``` + +---------------------------------------+ + | Connected! | + | | + | sql-statement | + | help [tablename] | + | quit | + | | + +---------------------------------------+ + SQL> + ``` + +- 若显示ERROR信息,则表明配置错误。请检查上述配置是否正确。 + +## 常见问题处理 + +- \[UnixODBC\]\[Driver Manager\]Can't open lib 'xxx/xxx/psqlodbcw.so' : file not found. + + 此问题的可能原因: + + - odbcinst.ini文件中配置的路径不正确 + + 确认的方法:'ls'一下错误信息中的路径,以确保该psqlodbcw.so文件存在,同时具有执行权限。 + + - psqlodbcw.so的依赖库不存在,或者不在系统环境变量中 + + 确认的办法:ldd一下错误信息中的路径,如果是缺少libodbc.so.1等UnixODBC的库,那么按照“操作步骤”中的方法重新配置UnixODBC,并确保它的安装路径下的lib目录添加到了LD\_LIBRARY\_PATH中;如果是缺少其他库,请将ODBC驱动包中的lib目录添加到LD\_LIBRARY\_PATH中。 + + +- \[UnixODBC\]connect to server failed: no such file or directory + + 此问题可能的原因: + + - 配置了错误的/不可达的数据库地址,或者端口 + + 请检查数据源配置中的Servername及Port配置项。 + + - 服务器监听不正确 + + 如果确认Servername及Port配置正确,请根据“操作步骤”中数据库服务器的相关配置,确保数据库监听了合适的网卡及端口。 + + - 防火墙及网闸设备 + + 请确认防火墙设置,将数据库的通信端口添加到可信端口中。 + + 如果有网闸设备,请确认一下相关的设置。 + + +- \[unixODBC\]The password-stored method is not supported. + + 此问题可能原因: + + 数据源中未配置sslmode配置项。 + + 解决办法: + + 请配置该选项至allow或以上选项。此配置的更多信息,见[表3](#zh-cn_topic_0237120407_zh-cn_topic_0059778464_table22136585143846)。 + +- Server common name "xxxx" does not match host name "xxxxx" + + 此问题的原因: + + 使用了SSL加密的“verify-full”选项,驱动程序会验证证书中的主机名与实际部署数据库的主机名是否一致。 + + 解决办法: + + 碰到此问题可以使用“verify-ca”选项,不再校验主机名;或者重新生成一套与数据库所在主机名相同的CA证书。 + +- Driver's SQLAllocHandle on SQL\_HANDLE\_DBC failed + + 此问题的可能原因: + + 可执行文件(比如UnixODBC的isql,以下都以isql为例)与数据库驱动(psqlodbcw.so)依赖于不同的odbc的库版本:libodbc.so.1或者libodbc.so.2。此问题可以通过如下方式确认: + + ``` + ldd `which isql` | grep odbc + ldd psqlodbcw.so | grep odbc + ``` + + 这时,如果输出的libodbc.so最后的后缀数字不同或者指向不同的磁盘物理文件,那么基本就可以断定是此问题。isql与psqlodbcw.so都会要求加载libodbc.so,这时如果它们加载的是不同的物理文件,便会导致两套完全同名的函数列表,同时出现在同一个可见域里(UnixODBC的libodbc.so.\*的函数导出列表完全一致),产生冲突,无法加载数据库驱动。 + + 解决办法: + + 确定一个要使用的UnixODBC,然后卸载另外一个(比如卸载库版本号为.so.2的UnixODBC),然后将剩下的.so.1的库,新建一个同名但是后缀为.so.2的软链接,便可解决此问题。 + +- FATAL: Forbid remote connection with trust method! + + 由于安全原因,数据库主节点禁止openGauss内部其他节点无认证接入。 + + 如果要在openGauss内部访问数据库主节点,请将ODBC程序部署在数据库主节点所在机器,服务器地址使用"127.0.0.1"。建议业务系统单独部署在openGauss外部,否则可能会影响数据库运行性能。 + +- \[unixODBC\]\[Driver Manager\]Invalid attribute value + + 在使用SQL on other GaussDB功能时碰到此问题,有可能是unixODBC的版本并非推荐版本,建议通过“odbcinst --version”命令排查环境中的unixODBC版本。 + +- authentication method 10 not supported. + + 使用开源客户端碰到此问题,可能原因: + + 数据库中存储的口令校验只存储了SHA256格式哈希,而开源客户端只识别MD5校验,双方校验方法不匹配报错。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 数据库并不存储用户口令,只存储用户口令的哈希码。 + >- 数据库当用户更新用户口令或者新建用户时,会同时存储两种格式的哈希码,这时将兼容开源的认证协议。 + >- 但是当老版本升级到新版本时,由于哈希的不可逆性,所以数据库无法还原用户口令,进而生成新格式的哈希,所以仍然只保留了SHA256格式的哈希,导致仍然无法使用MD5做口令认证。 + + 要解决该问题,可以更新用户口令(参见[ALTER USER](ALTER-USER.md));或者新建一个用户(参见[CREATE USER](CREATE-USER.md)),赋于同等权限,使用新用户连接数据库。 + +- unsupported frontend protocol 3.51: server supports 1.0 to 3.0 + + 目标数据库版本过低,或者目标数据库为开源数据库。请使用对应版本的数据库驱动连接目标数据库。 + +- FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. + + 目标数据库主节点的pg\_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到"sha256"后再试。配置方法见[7](#zh-cn_topic_0237120407_zh-cn_topic_0059778464_l4c0173b8af93447e91aba24005e368e5)。 + + diff --git a/content/zh/docs/Developerguide/MEMORY_NODE_DETAIL.md b/content/zh/docs/Developerguide/MEMORY_NODE_DETAIL.md new file mode 100644 index 000000000..37a1d7a8f --- /dev/null +++ b/content/zh/docs/Developerguide/MEMORY_NODE_DETAIL.md @@ -0,0 +1,40 @@ +# MEMORY\_NODE\_DETAIL + +显示某个数据库节点内存使用情况。 + +**表 1** MEMORY\_NODE\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

节点名称。

+

memorytype

+

text

+
内存的名称。
  • max_process_memory:openGauss实例所占用的内存大小。
  • process_used_memory:进程所使用的内存大小。
  • max_dynamic_memory:最大动态内存。
  • dynamic_used_memory:已使用的动态内存。
  • dynamic_peak_memory:内存的动态峰值。
  • dynamic_used_shrctx:最大动态共享内存上下文。
  • dynamic_peak_shrctx:共享内存上下文的动态峰值。
  • max_shared_memory:最大共享内存。
  • shared_used_memory:已使用的共享内存。
  • max_cstore_memory:列存所允许使用的最大内存。
  • cstore_used_memory:列存已使用的内存大小。
  • max_sctpcomm_memory:sctp通信所允许使用的最大内存。
  • sctpcomm_used_memory:sctp通信已使用的内存大小。
  • sctpcomm_peak_memory:sctp通信的内存峰值。
  • other_used_memory:其他已使用的内存大小。
  • gpu_max_dynamic_memory:GPU最大动态内存。
  • gpu_dynamic_used_memory:GPU已使用的动态内存。
  • gpu_dynamic_peak_memory:GPU内存的动态峰值。
  • pooler_conn_memory:链接池申请内存计数。
  • pooler_freeconn_memory:链接池空闲连接的内存计数。
  • storage_compress_memory:存储模块压缩使用的内存大小。
  • udf_reserved_memory:UDF预留的内存大小。
+
+

memorymbytes

+

integer

+

内存使用的大小,单位为MB。

+
+ diff --git a/content/zh/docs/Developerguide/MERGE-INTO.md b/content/zh/docs/Developerguide/MERGE-INTO.md index 5ab5278bd..ae339b479 100644 --- a/content/zh/docs/Developerguide/MERGE-INTO.md +++ b/content/zh/docs/Developerguide/MERGE-INTO.md @@ -32,7 +32,7 @@ ON ( condition ) - **INTO子句** - 指定正在更新或插入的目标表。目标表为复制表时,暂不支持目标表中某列默认值为volatile函数(如自增列)。 + 指定正在更新或插入的目标表。目标表为复制表时,暂不支持目标表中某列默认值为volatile函数(如自增列),enable\_stream\_operator=off时目标表需要包含主键或带有unique not null。 - **talbe\_name** diff --git a/content/zh/docs/Developerguide/MOVE.md b/content/zh/docs/Developerguide/MOVE.md index c7c59c949..53e5b1803 100644 --- a/content/zh/docs/Developerguide/MOVE.md +++ b/content/zh/docs/Developerguide/MOVE.md @@ -2,7 +2,7 @@ ## 功能描述 -MOVE在不检索数据的情况下重新定位一个游标。MOVE的作用类似于[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629)命令,但只是重定位游标而不返回行。 +MOVE在不检索数据的情况下重新定位一个游标。MOVE的作用类似于[FETCH](FETCH.md)命令,但只是重定位游标而不返回行。 ## 注意事项 @@ -71,5 +71,5 @@ postgres=# END; ## 相关链接 -[CLOSE](CLOSE.md#ZH-CN_TOPIC_0242370555),[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629) +[CLOSE](CLOSE.md),[FETCH](FETCH.md) diff --git a/content/zh/docs/Developerguide/Memory.md b/content/zh/docs/Developerguide/Memory.md new file mode 100644 index 000000000..364a39f44 --- /dev/null +++ b/content/zh/docs/Developerguide/Memory.md @@ -0,0 +1,11 @@ +# Memory + +- **[MEMORY\_NODE\_DETAIL](MEMORY_NODE_DETAIL.md)** + +- **[GLOBAL\_MEMORY\_NODE\_DETAIL](GLOBAL_MEMORY_NODE_DETAIL.md)** + +- **[SHARED\_MEMORY\_DETAIL](SHARED_MEMORY_DETAIL.md)** + +- **[GLOBAL\_SHARED\_MEMORY\_DETAIL](GLOBAL_SHARED_MEMORY_DETAIL.md)** + + diff --git a/content/zh/docs/Developerguide/ODBC.md b/content/zh/docs/Developerguide/ODBC.md index 552f999ba..874d8ccdf 100644 --- a/content/zh/docs/Developerguide/ODBC.md +++ b/content/zh/docs/Developerguide/ODBC.md @@ -46,6 +46,6 @@ ODBC接口是一套提供给用户的API函数,本节将对部分常用接口 - **[SQLSetStmtAttr](SQLSetStmtAttr.md)** -- **[示例](示例.md)** +- **[示例](示例-2.md)** diff --git "a/content/zh/docs/Developerguide/ODBC\345\214\205\345\217\212\344\276\235\350\265\226\347\232\204\345\272\223\345\222\214\345\244\264\346\226\207\344\273\266.md" "b/content/zh/docs/Developerguide/ODBC\345\214\205\345\217\212\344\276\235\350\265\226\347\232\204\345\272\223\345\222\214\345\244\264\346\226\207\344\273\266.md" new file mode 100644 index 000000000..6a7174f62 --- /dev/null +++ "b/content/zh/docs/Developerguide/ODBC\345\214\205\345\217\212\344\276\235\350\265\226\347\232\204\345\272\223\345\222\214\345\244\264\346\226\207\344\273\266.md" @@ -0,0 +1,6 @@ +# ODBC包及依赖的库和头文件 + +## Linux下的ODBC包 + +从发布包中获取,包名为openGauss-1.0.0-ODBC.tar.gz。Linux环境下,开发应用程序要用到unixODBC提供的头文件(sql.h、sqlext.h等)和库libodbc.so。这些头文件和库可从unixODBC-2.3.0的安装包中获得。 + diff --git "a/content/zh/docs/Developerguide/ODBC\346\216\245\345\217\243\345\217\202\350\200\203.md" "b/content/zh/docs/Developerguide/ODBC\346\216\245\345\217\243\345\217\202\350\200\203.md" new file mode 100644 index 000000000..14d6a96e8 --- /dev/null +++ "b/content/zh/docs/Developerguide/ODBC\346\216\245\345\217\243\345\217\202\350\200\203.md" @@ -0,0 +1,4 @@ +# ODBC接口参考 + +请参见[ODBC](ODBC.md)。 + diff --git a/content/zh/docs/Developerguide/OPERATOR_HISTORY.md b/content/zh/docs/Developerguide/OPERATOR_HISTORY.md new file mode 100644 index 000000000..9cfb048ef --- /dev/null +++ b/content/zh/docs/Developerguide/OPERATOR_HISTORY.md @@ -0,0 +1,4 @@ +# OPERATOR\_HISTORY + +OPERATOR\_HISTORY视图显示的是当前用户数据库主节点上执行作业结束后的算子的相关记录。记录的数据同[表1](GS_WLM_OPERATOR_INFO.md#zh-cn_topic_0237122263_zh-cn_topic_0111176227_table85181143511)。 + diff --git a/content/zh/docs/Developerguide/OPERATOR_HISTORY_TABLE.md b/content/zh/docs/Developerguide/OPERATOR_HISTORY_TABLE.md new file mode 100644 index 000000000..cee6bb811 --- /dev/null +++ b/content/zh/docs/Developerguide/OPERATOR_HISTORY_TABLE.md @@ -0,0 +1,173 @@ +# OPERATOR\_HISTORY\_TABLE + +OPERATOR\_HISTORY\_TABLE系统表显示执行作业结束后的算子相关的记录。此数据是从内核中转储到系统表中的数据。 + +**表 1** OPERATOR\_HISTORY\_TABLE的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

queryid

+

bigint

+

语句执行使用的内部query_id。

+

pid

+

bigint

+

后端线程id。

+

plan_node_id

+

integer

+

查询对应的执行计划的plan node id。

+

plan_node_name

+

text

+

对应于plan_node_id的算子的名称。

+

start_time

+

timestamp with time zone

+

该算子处理第一条数据的开始时间。

+

duration

+

bigint

+

该算子到结束时候总的执行时间(ms)。

+

query_dop

+

integer

+

当前算子执行时的并行度。

+

estimated_rows

+

bigint

+

优化器估算的行数信息。

+

tuple_processed

+

bigint

+

当前算子返回的元素个数。

+

min_peak_memory

+

integer

+

当前算子在数据库节点上的最小内存峰值(MB)。

+

max_peak_memory

+

integer

+

当前算子在数据库节点上的最大内存峰值(MB)。

+

average_peak_memory

+

integer

+

当前算子在数据库节点上的平均内存峰值(MB)。

+

memory_skew_percent

+

integer

+

当前算子在数据库节点间的内存使用倾斜率。

+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量(MB),默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_cpu_time

+

bigint

+

该算子在数据库节点上的最小执行时间(ms)。

+

max_cpu_time

+

bigint

+

该算子在数据库节点上的最大执行时间(ms)。

+

total_cpu_time

+

bigint

+

该算子在数据库节点上的总执行时间(ms)。

+

cpu_skew_percent

+

integer

+

数据库节点间执行时间的倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  • Sort/SetOp/HashAgg/HashJoin spill
  • Spill file size large than 256MB
  • Broadcast size large than 100MB
  • Early spill
  • Spill times is greater than 3
  • Spill on memory adaptive
  • Hash table conflict
+
+
+ diff --git a/content/zh/docs/Developerguide/OPERATOR_RUNTIME.md b/content/zh/docs/Developerguide/OPERATOR_RUNTIME.md new file mode 100644 index 000000000..66ddcbbd1 --- /dev/null +++ b/content/zh/docs/Developerguide/OPERATOR_RUNTIME.md @@ -0,0 +1,180 @@ +# OPERATOR\_RUNTIME + +OPERATOR\_RUNTIME视图显示当前用户正在执行的作业的算子相关信息。 + +**表 1** OPERATOR\_RUNTIME的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

queryid

+

bigint

+

语句执行使用的内部query_id。

+

pid

+

bigint

+

后端线程id。

+

plan_node_id

+

integer

+

查询对应的执行计划的plan node id。

+

plan_node_name

+

text

+

对应于plan_node_id的算子的名称。

+

start_time

+

timestamp with time zone

+

该算子处理第一条数据的开始时间。

+

duration

+

bigint

+

该算子到结束时候总的执行时间(ms)。

+

status

+

text

+

当前算子的执行状态,包括finished和running。

+

query_dop

+

integer

+

当前算子执行时的并行度。

+

estimated_rows

+

bigint

+

优化器估算的行数信息。

+

tuple_processed

+

bigint

+

当前算子返回的元素个数。

+

min_peak_memory

+

integer

+

当前算子在数据库节点上的最小内存峰值(MB)。

+

max_peak_memory

+

integer

+

当前算子在数据库节点上的最大内存峰值(MB)。

+

average_peak_memory

+

integer

+

当前算子在数据库节点上的平均内存峰值(MB)。

+

memory_skew_percent

+

integer

+

当前算子在数据库节点的内存使用倾斜率。

+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量(MB),默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量(MB),默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量(MB),默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_cpu_time

+

bigint

+

该算子在数据库节点上的最小执行时间(ms)。

+

max_cpu_time

+

bigint

+

该算子在数据库节点上的最大执行时间(ms)。

+

total_cpu_time

+

bigint

+

该算子在数据库节点上的总执行时间(ms)。

+

cpu_skew_percent

+

integer

+

数据库节点间执行时间的倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  • Sort/SetOp/HashAgg/HashJoin spill
  • Spill file size large than 256MB
  • Broadcast size large than 100MB
  • Early spill
  • Spill times is greater than 3
  • Spill on memory adaptive
  • Hash table conflict
+
+
+ diff --git a/content/zh/docs/Developerguide/OS.md b/content/zh/docs/Developerguide/OS.md new file mode 100644 index 000000000..4cf29ed06 --- /dev/null +++ b/content/zh/docs/Developerguide/OS.md @@ -0,0 +1,11 @@ +# OS + +- **[OS\_RUNTIME](OS_RUNTIME.md)** + +- **[GLOBAL\_OS\_RUNTIME](GLOBAL_OS_RUNTIME.md)** + +- **[OS\_THREADS](OS_THREADS.md)** + +- **[GLOBAL\_OS\_THREADS](GLOBAL_OS_THREADS.md)** + + diff --git a/content/zh/docs/Developerguide/OS_RUNTIME.md b/content/zh/docs/Developerguide/OS_RUNTIME.md new file mode 100644 index 000000000..92957e18b --- /dev/null +++ b/content/zh/docs/Developerguide/OS_RUNTIME.md @@ -0,0 +1,53 @@ +# OS\_RUNTIME + +显示当前操作系统运行的状态信息。 + +**表 1** OS\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

id

+

integer

+

编号。

+

name

+

text

+

操作系统运行状态名称。

+

value

+

numeric

+

操作系统运行状态值。

+

comments

+

text

+

操作系统运行状态注释。

+

cumulative

+

boolean

+

操作系统运行状态的值是否为累加值。

+
+ diff --git a/content/zh/docs/Developerguide/OS_THREADS.md b/content/zh/docs/Developerguide/OS_THREADS.md new file mode 100644 index 000000000..2b456dba1 --- /dev/null +++ b/content/zh/docs/Developerguide/OS_THREADS.md @@ -0,0 +1,53 @@ +# OS\_THREADS + +提供当前节点下所有线程的状态信息。 + +**表 1** OS\_THREADS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

pid

+

bigint

+

数据库进程中正在运行的线程号。

+

lwpid

+

integer

+

与pid对应的轻量级线程号。

+

thread_name

+

text

+

与pid对应的线程名称。

+

creation_time

+

timestamp with time zone

+

与pid对应的线程创建的时间。

+
+ diff --git a/content/zh/docs/Developerguide/Object.md b/content/zh/docs/Developerguide/Object.md new file mode 100644 index 000000000..feb0719ee --- /dev/null +++ b/content/zh/docs/Developerguide/Object.md @@ -0,0 +1,87 @@ +# Object + +- **[STAT\_USER\_TABLES](STAT_USER_TABLES.md)** + +- **[SUMMARY\_STAT\_USER\_TABLES](SUMMARY_STAT_USER_TABLES.md)** + +- **[GLOBAL\_STAT\_USER\_TABLES](GLOBAL_STAT_USER_TABLES.md)** + +- **[STAT\_USER\_INDEXES](STAT_USER_INDEXES.md)** + +- **[SUMMARY\_STAT\_USER\_INDEXES](SUMMARY_STAT_USER_INDEXES.md)** + +- **[GLOBAL\_STAT\_USER\_INDEXES](GLOBAL_STAT_USER_INDEXES.md)** + +- **[STAT\_SYS\_TABLES](STAT_SYS_TABLES.md)** + +- **[SUMMARY\_STAT\_SYS\_TABLES](SUMMARY_STAT_SYS_TABLES.md)** + +- **[GLOBAL\_STAT\_SYS\_TABLES](GLOBAL_STAT_SYS_TABLES.md)** + +- **[STAT\_SYS\_INDEXES](STAT_SYS_INDEXES.md)** + +- **[SUMMARY\_STAT\_SYS\_INDEXES](SUMMARY_STAT_SYS_INDEXES.md)** + +- **[GLOBAL\_STAT\_SYS\_INDEXES](GLOBAL_STAT_SYS_INDEXES.md)** + +- **[STAT\_ALL\_TABLES](STAT_ALL_TABLES.md)** + +- **[SUMMARY\_STAT\_ALL\_TABLES](SUMMARY_STAT_ALL_TABLES.md)** + +- **[GLOBAL\_STAT\_ALL\_TABLES](GLOBAL_STAT_ALL_TABLES.md)** + +- **[STAT\_ALL\_INDEXES](STAT_ALL_INDEXES.md)** + +- **[SUMMARY\_STAT\_ALL\_INDEXES](SUMMARY_STAT_ALL_INDEXES.md)** + +- **[GLOBAL\_STAT\_ALL\_INDEXES](GLOBAL_STAT_ALL_INDEXES.md)** + +- **[STAT\_DATABASE](STAT_DATABASE.md)** + +- **[SUMMARY\_STAT\_DATABASE](SUMMARY_STAT_DATABASE.md)** + +- **[GLOBAL\_STAT\_DATABASE](GLOBAL_STAT_DATABASE.md)** + +- **[STAT\_DATABASE\_CONFLICTS](STAT_DATABASE_CONFLICTS.md)** + +- **[SUMMARY\_STAT\_DATABASE\_CONFLICTS](SUMMARY_STAT_DATABASE_CONFLICTS.md)** + +- **[GLOBAL\_STAT\_DATABASE\_CONFLICTS](GLOBAL_STAT_DATABASE_CONFLICTS.md)** + +- **[STAT\_XACT\_ALL\_TABLES](STAT_XACT_ALL_TABLES.md)** + +- **[SUMMARY\_STAT\_XACT\_ALL\_TABLES](SUMMARY_STAT_XACT_ALL_TABLES.md)** + +- **[GLOBAL\_STAT\_XACT\_ALL\_TABLES](GLOBAL_STAT_XACT_ALL_TABLES.md)** + +- **[STAT\_XACT\_SYS\_TABLES](STAT_XACT_SYS_TABLES.md)** + +- **[SUMMARY\_STAT\_XACT\_SYS\_TABLES](SUMMARY_STAT_XACT_SYS_TABLES.md)** + +- **[GLOBAL\_STAT\_XACT\_SYS\_TABLES](GLOBAL_STAT_XACT_SYS_TABLES.md)** + +- **[STAT\_XACT\_USER\_TABLES](STAT_XACT_USER_TABLES.md)** + +- **[SUMMARY\_STAT\_XACT\_USER\_TABLES](SUMMARY_STAT_XACT_USER_TABLES.md)** + +- **[GLOBAL\_STAT\_XACT\_USER\_TABLES](GLOBAL_STAT_XACT_USER_TABLES.md)** + +- **[STAT\_XACT\_USER\_FUNCTIONS](STAT_XACT_USER_FUNCTIONS.md)** + +- **[SUMMARY\_STAT\_XACT\_USER\_FUNCTIONS](SUMMARY_STAT_XACT_USER_FUNCTIONS.md)** + +- **[GLOBAL\_STAT\_XACT\_USER\_FUNCTIONS](GLOBAL_STAT_XACT_USER_FUNCTIONS.md)** + +- **[STAT\_BAD\_BLOCK](STAT_BAD_BLOCK.md)** + +- **[SUMMARY\_STAT\_BAD\_BLOCK](SUMMARY_STAT_BAD_BLOCK.md)** + +- **[GLOBAL\_STAT\_BAD\_BLOCK](GLOBAL_STAT_BAD_BLOCK.md)** + +- **[STAT\_USER\_FUNCTIONS](STAT_USER_FUNCTIONS.md)** + +- **[SUMMARY\_STAT\_USER\_FUNCTIONS](SUMMARY_STAT_USER_FUNCTIONS.md)** + +- **[GLOBAL\_STAT\_USER\_FUNCTIONS](GLOBAL_STAT_USER_FUNCTIONS.md)** + + diff --git a/content/zh/docs/Developerguide/Operator.md b/content/zh/docs/Developerguide/Operator.md new file mode 100644 index 000000000..4ee33c1c8 --- /dev/null +++ b/content/zh/docs/Developerguide/Operator.md @@ -0,0 +1,15 @@ +# Operator + +- **[OPERATOR\_HISTORY\_TABLE](OPERATOR_HISTORY_TABLE.md)** + +- **[OPERATOR\_HISTORY](OPERATOR_HISTORY.md)** + +- **[OPERATOR\_RUNTIME](OPERATOR_RUNTIME.md)** + +- **[GLOBAL\_OPERATOR\_HISTORY](GLOBAL_OPERATOR_HISTORY.md)** + +- **[GLOBAL\_OPERATOR\_HISTORY\_TABLE](GLOBAL_OPERATOR_HISTORY_TABLE.md)** + +- **[GLOBAL\_OPERATOR\_RUNTIME](GLOBAL_OPERATOR_RUNTIME.md)** + + diff --git a/content/zh/docs/Developerguide/PG_AGGREGATE.md b/content/zh/docs/Developerguide/PG_AGGREGATE.md index f5c24dd1a..42f3ad7e6 100644 --- a/content/zh/docs/Developerguide/PG_AGGREGATE.md +++ b/content/zh/docs/Developerguide/PG_AGGREGATE.md @@ -55,7 +55,7 @@ PG\_AGGREGATE系统表存储与聚集函数有关的信息。PG\_AGGREGATE里的

oid

PG_OPERATOR.oid

+

PG_OPERATOR.oid

关联排序操作符(如果没有则为零)。

oid

PG_TYPE.oid

+

PG_TYPE.oid

此聚集函数的内部转换(状态)数据的数据类型。

-

是否允许在一个这种类型的索引上openGauss

+

是否允许在一个这种类型的索引上集群。

ampredlocks

@@ -145,7 +145,7 @@ PG\_AM系统表存储有关索引访问方法的信息。系统支持的每种

oid

PG_TYPE.oid

+

PG_TYPE.oid

存储在索引里数据的类型,如果不是一个固定的类型则为0。

oid

PG_OPFAMILY.oid

+

PG_OPFAMILY.oid

这个项的操作符族。

oid

PG_TYPE.oid

+

PG_TYPE.oid

操作符的左输入类型。

oid

PG_TYPE.oid

+

PG_TYPE.oid

操作符的右输入类型。

oid

PG_OPERATOR.oid

+

PG_OPERATOR.oid

该操作符的OID。

oid

PG_AM.oid

+

PG_AM.oid

索引访问方式操作符族。

oid

PG_OPFAMILY.oid

+

PG_OPFAMILY.oid

如果是一个排序操作符,则为这个项排序所依据的btree操作符族;如果是一个搜索操作符,则为0。

oid

PG_OPFAMILY.oid

+

PG_OPFAMILY.oid

该项的操作符族。

oid

PG_TYPE.oid

+

PG_TYPE.oid

相关操作符的左输入数据类型。

oid

PG_TYPE.oid

+

PG_TYPE.oid

相关操作符的右输入数据类型。

oid

该字段不支持

+

该字段不支持。

roltempspace

diff --git a/content/zh/docs/Developerguide/PG_COLLATION.md b/content/zh/docs/Developerguide/PG_COLLATION.md index 72919528f..bfb0569d9 100644 --- a/content/zh/docs/Developerguide/PG_COLLATION.md +++ b/content/zh/docs/Developerguide/PG_COLLATION.md @@ -37,7 +37,7 @@ PG\_COLLATION系统表描述可用的排序规则,本质上从一个SQL名称

oid

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含这个排序规则的名称空间的OID。

"char"

  • c = 检查约束
  • f = 外键约束
  • p = 主键约束
  • u = 唯一约束
  • t = 触发器约束
+
  • c = 检查约束
  • p = 主键约束
  • u = 唯一约束
  • t = 触发器约束

condeferrable

@@ -87,14 +87,15 @@ PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外

oid

如果是外键,则为参考的表;否则为0。

+

如果是外键,则为参考的表;否则为0。由于当前不支持外键,所以值恒为0。

confupdtype

"char"

外键更新动作代码。
  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省
+
外键更新动作代码。
  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省

    由于当前不支持外键,所以值为空。

    +

"char"

外键删除动作代码。
  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省
+
外键删除动作代码。
  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省

    由于当前不支持外键,所以值为空。

    +

"char"

外键匹配类型。
  • f = 全部
  • p = 部分
  • u = 简单(未指定)
+
外键匹配类型。
  • f = 全部
  • p = 部分
  • u = 简单(未指定)

    由于当前不支持外键,所以值为空。

    +

smallint[]

如果是一个外键,是参考的字段的列表。

+

如果是一个外键,是参考的字段的列表。由于当前不支持外键,所以值为空。

conpfeqop

oid[]

如果是一个外键,是做PK=FK比较的相等操作符ID的列表。

+

如果是一个外键,是做PK=FK比较的相等操作符ID的列表。由于当前不支持外键,所以值为空。

conppeqop

oid[]

如果是一个外键,是做PK=PK比较的相等操作符ID的列表。

+

如果是一个外键,是做PK=PK比较的相等操作符ID的列表。由于当前不支持外键,所以值为空。

conffeqop

oid[]

如果是一个外键,是做FK=FK比较的相等操作符ID的列表。

+

如果是一个外键,是做FK=FK比较的相等操作符ID的列表。由于当前不支持外键,所以值为空。

conexclop

diff --git a/content/zh/docs/Developerguide/PG_CONVERSION.md b/content/zh/docs/Developerguide/PG_CONVERSION.md index d6c6cea9b..bfbbda824 100644 --- a/content/zh/docs/Developerguide/PG_CONVERSION.md +++ b/content/zh/docs/Developerguide/PG_CONVERSION.md @@ -37,7 +37,7 @@ PG\_CONVERSION系统表描述编码转换信息。

oid

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含这个转换的名称空间的OID。

oid

PG_CLASS.oid

+

PG_CLASS.oid

这个对象出现的系统表的OID。

oid

PG_TYPE.oid

+

PG_TYPE.oid

拥有这个枚举值的pg_type记录的OID。

name

PG_NAMESPACE.nspname

+

PG_NAMESPACE.nspname

包含表的模式名。

int2vector

PG_STATISTIC_EXT.stakey

+

PG_STATISTIC_EXT.stakey

统计信息扩展的多列信息。

oid

PG_FOREIGN_DATA_WRAPPER.oid

+

PG_FOREIGN_DATA_WRAPPER.oid

这个外部服务器的外部数据封装器的OID。

name

PG_NAMESPACE.nspname

+

PG_NAMESPACE.nspname

包含表和索引的模式名称。

name

PG_TABLESPACE.nspname

+

PG_TABLESPACE.nspname

包含索引的表空间名称。

integer

外键,关联pg_job表中的job_id。

+

关联pg_job表中的job_id。

what

diff --git a/content/zh/docs/Developerguide/PG_LARGEOBJECT.md b/content/zh/docs/Developerguide/PG_LARGEOBJECT.md index cb9df0f0b..abedb2ceb 100644 --- a/content/zh/docs/Developerguide/PG_LARGEOBJECT.md +++ b/content/zh/docs/Developerguide/PG_LARGEOBJECT.md @@ -21,7 +21,7 @@ PG\_LARGEOBJECT系统表保存那些标记着“大对象”的数据。一个

oid

PG_LARGEOBJECT_METADATA.oid

+

PG_LARGEOBJECT_METADATA.oid

包含本页的大对象的标识符。

oid

PG_DATABASE.oid

+

PG_DATABASE.oid

被锁定对象所在数据库的OID。

  • 如果被锁定的对象是共享对象,则OID为0。
  • 如果是一个事务ID,则为NULL。
diff --git a/content/zh/docs/Developerguide/PG_NAMESPACE.md b/content/zh/docs/Developerguide/PG_NAMESPACE.md index 4819bca88..8e264257d 100644 --- a/content/zh/docs/Developerguide/PG_NAMESPACE.md +++ b/content/zh/docs/Developerguide/PG_NAMESPACE.md @@ -38,14 +38,14 @@ PG\_NAMESPACE系统表存储名称空间,即存储schema相关的信息。

bigint

数据库节点上创建此命名空间时的时间线。此字段为内部使用,仅在数据库节点上有效。

+

在数据库节点上创建此命名空间时的时间线。此字段为内部使用,仅在数据库节点上有效。

nspacl

aclitem[]

访问权限。具体请参见GRANTREVOKE

+

访问权限。

oid

PG_AM.oid

+

PG_AM.oid

操作符类所服务的索引访问方法。

oid

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

这个操作符类的名称空间。

oid

PG_OPFAMILY.oid

+

PG_OPFAMILY.oid

包含该操作符类的操作符族。

oid

PG_TYPE.oid

+

PG_TYPE.oid

操作符类索引的数据类型。

oid

PG_TYPE.oid

+

PG_TYPE.oid

索引数据的类型,如果和opcintype相同则为零。

oid

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含此操作符的名称空间的OID。

oid

PG_TYPE.oid

+

PG_TYPE.oid

左操作数的类型。

oid

PG_TYPE.oid

+

PG_TYPE.oid

右操作数的类型。

oid

PG_TYPE.oid

+

PG_TYPE.oid

结果类型。

oid

PG_OPERATOR.oid

+

PG_OPERATOR.oid

此操作符的交换符,如果存在的话。

oid

PG_OPERATOR.oid

+

PG_OPERATOR.oid

此操作符的反转器,如果存在的话。

oid

PG_AM.oid

+

PG_AM.oid

操作符族使用的索引方法。

oid

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

这个操作符的名称空间。

-定义一个操作符族的大多数信息不在它的PG\_OPFAMILY行里面,而是在相关的行[PG\_AMOP](PG_AMOP.md#ZH-CN_TOPIC_0242385795),[PG\_AMPROC](PG_AMPROC.md#ZH-CN_TOPIC_0242385796)和[PG\_OPCLASS](PG_OPCLASS.md#ZH-CN_TOPIC_0242385831)里。 +定义一个操作符族的大多数信息不在它的PG\_OPFAMILY行里面,而是在相关的行[PG\_AMOP](PG_AMOP.md),[PG\_AMPROC](PG_AMPROC.md)和[PG\_OPCLASS](PG_OPCLASS.md)里。 diff --git a/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md b/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md index 32c0afba7..190a00ec7 100644 --- a/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md +++ b/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md @@ -55,7 +55,7 @@ PG\_PREPARED\_XACTS视图显示当前准备好进行两阶段提交的事务的

name

PG_DATABASE.datname

+

PG_DATABASE.datname

执行该事务所在的数据库名。

aclitem[]

访问权限。具体请参见GRANTREVOKE

+

访问权限。

prodefaultargpos

@@ -228,7 +228,7 @@ PG\_PROC系统表存储函数或过程的信息。

Boolean

表示该函数是否支持重载,主要针对A风格的函数,默认值是false。

+

表示该函数是否支持重载,默认值是false。

oid

PG_TYPE.oid

+

PG_TYPE.oid

范围类型的OID。

oid

PG_TYPE.oid

+

PG_TYPE.oid

这个范围类型的元素类型(子类型)的OID。

oid

PG_COLLATION.oid

+

PG_COLLATION.oid

用于范围比较的排序规则的OID,如果没有则为零。

oid

PG_OPCLASS.oid

+

PG_OPCLASS.oid

用于范围比较的子类型的操作符类的OID。

name

表示资源池所在的逻辑openGauss的名称。

+

表示资源池所在的逻辑openGauss的名称。

is_foreign

diff --git a/content/zh/docs/Developerguide/PG_ROLES.md b/content/zh/docs/Developerguide/PG_ROLES.md index 30ebb6627..495e0f5e6 100644 --- a/content/zh/docs/Developerguide/PG_ROLES.md +++ b/content/zh/docs/Developerguide/PG_ROLES.md @@ -1,6 +1,6 @@ # PG\_ROLES -PG\_ROLES视图提供访问数据库角色的相关信息。 +PG\_ROLES视图提供访问数据库角色的相关信息,默认只有初始化用户和具有sysadmin属性的用户可以查看,其他用户需要赋权后才可以查看。 **表 1** PG\_ROLES字段 @@ -228,7 +228,7 @@ PG\_ROLES视图提供访问数据库角色的相关信息。

-

该字段不支持。

+

该字段不支持。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

描述

-

handle

-

integer

-

事务在GTM对应的句柄。

-

gxid

-

xid

-

事务id号。

-

state

-

tinyint

-

事务状态(3:prepared或者0:starting)。

-

node

-

text

-

节点名称。

-

xmin

-

xid

-

节点上当前数据涉及的最小事务号xmin。

-

vacuum

-

Boolean

-

标志当前事务是否是lazy vacuum事务。

-

timeline

-

bigint

-

标志数据库重启次数。

-

prepare_xid

-

xid

-

处于prepared状态的事务的id号,若不在prepared状态,值为0。

-

pid

-

bigint

-

事务对应的线程id。

-

next_xid

-

xid

-

该字段不支持。

-
- diff --git a/content/zh/docs/Developerguide/PG_SECLABEL.md b/content/zh/docs/Developerguide/PG_SECLABEL.md index 56d69f974..d81b265fc 100644 --- a/content/zh/docs/Developerguide/PG_SECLABEL.md +++ b/content/zh/docs/Developerguide/PG_SECLABEL.md @@ -2,7 +2,7 @@ PG\_SECLABEL系统表存储数据对象上的安全标签。 -[PG\_SHSECLABEL](PG_SHSECLABEL.md#ZH-CN_TOPIC_0242385844)的作用类似,只是它是用于在一个openGauss内共享的数据库对象的安全标签上的。 +[PG\_SHSECLABEL](PG_SHSECLABEL.md)的作用类似,只是它是用于在一个openGauss内共享的数据库对象的安全标签上的。 **表 1** PG\_SECLABEL字段 diff --git a/content/zh/docs/Developerguide/PG_SECLABELS.md b/content/zh/docs/Developerguide/PG_SECLABELS.md index 8c6ece817..6031ecacb 100644 --- a/content/zh/docs/Developerguide/PG_SECLABELS.md +++ b/content/zh/docs/Developerguide/PG_SECLABELS.md @@ -55,7 +55,7 @@ PG\_SECLABELS视图提供关于安全标签的信息。

oid

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

这个对象的名称空间的OID,如果适用;否则为NULL。

text

PG_SECLABEL.provider

+

PG_SECLABEL.provider

与这个标签相关的标签提供者。

text

PG_SECLABEL.label

+

PG_SECLABEL.label

适用于这个对象的安全标签。

integer

在作业运行时,作业io峰值中,数据库节点的最小值。

+

在作业运行时,作业io峰值中,数据库节点最小值。

maxpeakiops

@@ -75,7 +75,7 @@ PG\_SESSION\_IOSTAT视图显示当前用户执行作业正在运行时的IO负

text

该字段不支持

+

该字段不支持。

bool

该字段不支持

+

该字段不支持。

node_group

text

该字段不支持

+

该字段不支持。

oid

PG_DATABASE.oid

+

PG_DATABASE.oid

依赖对象所在的数据库的OID ,如果是共享对象,则为零。

-

用户定义C函数库文件路径。

+

用户定义函数库文件路径。

bigint

此表缓存命中数。

+

该表缓存命中数。

idx_blks_read

@@ -66,28 +66,28 @@ PG\_STATIO\_ALL\_TABLES视图将包含当前数据库中每个表(包括TOAST

bigint

此表的TOAST表读取的磁盘块数(如果存在)。

+

该表的TOAST表读取的磁盘块数(如果存在)。

toast_blks_hit

bigint

此表的TOAST表命中缓冲区数(如果存在)。

+

该表的TOAST表命中缓冲区数(如果存在)。

tidx_blks_read

bigint

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

该表的TOAST表索引读取的磁盘块数(如果存在)。

tidx_blks_hit

bigint

此表的TOAST表索引命中缓冲区数(如果存在)。

+

该表的TOAST表索引命中缓冲区数(如果存在)。

bigint

此表缓存命中数。

+

该表缓存命中数。

idx_blks_read

@@ -66,28 +66,28 @@ PG\_STATIO\_SYS\_TABLES视图显示命名空间中所有系统表的IO状态信

bigint

此表的TOAST表读取的磁盘块数(如果存在)。

+

该表的TOAST表读取的磁盘块数(如果存在)。

toast_blks_hit

bigint

此表的TOAST表命中缓冲区数(如果存在)。

+

该表的TOAST表命中缓冲区数(如果存在)。

tidx_blks_read

bigint

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

该表的TOAST表索引读取的磁盘块数(如果存在)。

tidx_blks_hit

bigint

此表的TOAST表索引命中缓冲区数(如果存在)。

+

该表的TOAST表索引命中缓冲区数(如果存在)。

bigint

此表缓存命中数。

+

该表缓存命中数。

idx_blks_read

@@ -66,28 +66,28 @@ PG\_STATIO\_USER\_TABLES视图显示命名空间中所有用户关系表的IO状

bigint

此表的TOAST表读取的磁盘块数(如果存在)。

+

该表的TOAST表读取的磁盘块数(如果存在)。

toast_blks_hit

bigint

此表的TOAST表命中缓冲区数(如果存在)。

+

该表的TOAST表命中缓冲区数(如果存在)。

tidx_blks_read

bigint

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

该表的TOAST表索引读取的磁盘块数(如果存在)。

tidx_blks_hit

bigint

此表的TOAST表索引命中缓冲区数(如果存在)。

+

该表的TOAST表索引命中缓冲区数(如果存在)。

real

标识全局统计信息中数据库节点上字段里唯一的非NULL数据值的数目。

+

标识全局统计信息中数据库节点上字段里唯一的非NULL数据值的数目。

  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。

real

标识全局统计信息中数据库节点上字段里唯一的非NULL数据值的数目。
  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。
+
标识全局统计信息中数据库节点上字段里唯一的非NULL数据值的数目。
  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。

name

PG_NAMESPACE.nspname

+

PG_NAMESPACE.nspname

包含表的模式名。

name

PG_ATTRIBUTE.attname

+

PG_ATTRIBUTE.attname

字段的名称。

name

索引中模式名。

+

索引的模式名。

relname

diff --git a/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md index c4ea196f7..7be1cb07d 100644 --- a/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md @@ -24,7 +24,7 @@ PG\_STAT\_ALL\_TABLES视图将包含当前数据库中每个表的一行(包

name

此表的模式名。

+

该表的模式名。

relname

@@ -38,7 +38,7 @@ PG\_STAT\_ALL\_TABLES视图将包含当前数据库中每个表的一行(包

bigint

此表发起的顺序扫描数。

+

该表发起的顺序扫描数。

seq_tup_read

@@ -52,7 +52,7 @@ PG\_STAT\_ALL\_TABLES视图将包含当前数据库中每个表的一行(包

bigint

此表发起的索引扫描数。

+

该表发起的索引扫描数。

idx_tup_fetch

@@ -108,28 +108,28 @@ PG\_STAT\_ALL\_TABLES视图将包含当前数据库中每个表的一行(包

timestamp with time zone

最后一次手动清理此表的时间(不计算VACUUM FULL)。

+

最后一次手动清理该表的时间(不计算VACUUM FULL)。

last_autovacuum

timestamp with time zone

上次被autovacuum守护进程清理此表的时间。

+

上次被autovacuum守护进程清理该表的时间。

last_analyze

timestamp with time zone

上次手动分析此表的时间。

+

上次手动分析该表的时间。

last_autoanalyze

timestamp with time zone

上次被autovacuum守护进程分析此表的时间。

+

上次被autovacuum守护进程分析该表的时间。

vacuum_count

diff --git a/content/zh/docs/Developerguide/PG_STAT_DATABASE.md b/content/zh/docs/Developerguide/PG_STAT_DATABASE.md index f9dd7e052..c668d0360 100644 --- a/content/zh/docs/Developerguide/PG_STAT_DATABASE.md +++ b/content/zh/docs/Developerguide/PG_STAT_DATABASE.md @@ -101,7 +101,7 @@ PG\_STAT\_DATABASE视图将包含openGauss中每个数据库的数据库统计

bigint

由于数据库恢复冲突取消的查询数量(只在备用服务器发生的冲突)。请参见PG_STAT_DATABASE_CONFLICTS获取更多信息。

+

由于数据库恢复冲突取消的查询数量(只在备用服务器发生的冲突)。请参见PG_STAT_DATABASE_CONFLICTS获取更多信息。

temp_files

diff --git a/content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md b/content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md index 33e03b423..4c04eb999 100644 --- a/content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md +++ b/content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md @@ -31,7 +31,7 @@ PG\_STAT\_SYS\_INDEXES视图显示pg\_catalog、information\_schema模式中所

name

索引中模式名。

+

索引的模式名。

relname

diff --git a/content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md index 1a5b887f7..0a7fdd2da 100644 --- a/content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md @@ -24,7 +24,7 @@ PG\_STAT\_SYS\_TABLES视图显示pg\_catalog、information\_schema模式的所

name

此表的模式名。

+

该表的模式名。

relname

@@ -38,7 +38,7 @@ PG\_STAT\_SYS\_TABLES视图显示pg\_catalog、information\_schema模式的所

bigint

此表发起的顺序扫描数。

+

该表发起的顺序扫描数。

seq_tup_read

@@ -52,7 +52,7 @@ PG\_STAT\_SYS\_TABLES视图显示pg\_catalog、information\_schema模式的所

bigint

此表发起的索引扫描数。

+

该表发起的索引扫描数。

idx_tup_fetch

@@ -108,7 +108,7 @@ PG\_STAT\_SYS\_TABLES视图显示pg\_catalog、information\_schema模式的所

timestamp with time zone

最后一次此表是手动清理的(不计算VACUUM FULL)。

+

最后一次该表是手动清理的(不计算VACUUM FULL)。

last_autovacuum

diff --git a/content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md b/content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md index 96f57a552..9590d2435 100644 --- a/content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md +++ b/content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md @@ -31,7 +31,7 @@ PG\_STAT\_USER\_INDEXES视图显示数据库中用户自定义普通表和toast

name

索引中模式名。

+

索引的模式名。

relname

diff --git a/content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md index 9e9cea380..8f9d63ebb 100644 --- a/content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md @@ -24,7 +24,7 @@ PG\_STAT\_USER\_TABLES视图显示所有命名空间中用户自定义普通表

name

此表的模式名。

+

该表的模式名。

relname

@@ -38,7 +38,7 @@ PG\_STAT\_USER\_TABLES视图显示所有命名空间中用户自定义普通表

bigint

此表发起的顺序扫描数。

+

该表发起的顺序扫描数。

seq_tup_read

@@ -52,7 +52,7 @@ PG\_STAT\_USER\_TABLES视图显示所有命名空间中用户自定义普通表

bigint

此表发起的索引扫描数。

+

该表发起的索引扫描数。

idx_tup_fetch

@@ -108,7 +108,7 @@ PG\_STAT\_USER\_TABLES视图显示所有命名空间中用户自定义普通表

timestamp with time zone

最后一次此表是手动清理的(不计算VACUUM FULL)。

+

最后一次该表是手动清理的(不计算VACUUM FULL)。

last_autovacuum

diff --git a/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md index af1a9cf53..1389ef8e5 100644 --- a/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md @@ -24,7 +24,7 @@ PG\_STAT\_XACT\_ALL\_TABLES视图显示命名空间中所有普通表和toast表

name

此表的模式名。

+

该表的模式名。

relname

@@ -38,7 +38,7 @@ PG\_STAT\_XACT\_ALL\_TABLES视图显示命名空间中所有普通表和toast表

bigint

此表发起的顺序扫描数。

+

该表发起的顺序扫描数。

seq_tup_read

@@ -52,7 +52,7 @@ PG\_STAT\_XACT\_ALL\_TABLES视图显示命名空间中所有普通表和toast表

bigint

此表发起的索引扫描数。

+

该表发起的索引扫描数。

idx_tup_fetch

diff --git a/content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md index 2178da031..c4802d421 100644 --- a/content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md @@ -24,7 +24,7 @@ PG\_STAT\_XACT\_SYS\_TABLES视图显示命名空间中系统表的事务状态

name

此表的模式名。

+

该表的模式名。

relname

@@ -38,7 +38,7 @@ PG\_STAT\_XACT\_SYS\_TABLES视图显示命名空间中系统表的事务状态

bigint

此表发起的顺序扫描数。

+

该表发起的顺序扫描数。

seq_tup_read

@@ -52,7 +52,7 @@ PG\_STAT\_XACT\_SYS\_TABLES视图显示命名空间中系统表的事务状态

bigint

此表发起的索引扫描数。

+

该表发起的索引扫描数。

idx_tup_fetch

diff --git a/content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md index b7d870fe6..dac480c26 100644 --- a/content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md @@ -24,7 +24,7 @@ PG\_STAT\_XACT\_USER\_TABLES视图显示命名空间中用户表的事务状态

name

此表的模式名。

+

该表的模式名。

relname

@@ -38,7 +38,7 @@ PG\_STAT\_XACT\_USER\_TABLES视图显示命名空间中用户表的事务状态

bigint

此表发起的顺序扫描数。

+

该表发起的顺序扫描数。

seq_tup_read

@@ -52,7 +52,7 @@ PG\_STAT\_XACT\_USER\_TABLES视图显示命名空间中用户表的事务状态

bigint

此表发起的索引扫描数。

+

该表发起的索引扫描数。

idx_tup_fetch

diff --git a/content/zh/docs/Developerguide/PG_TABLES.md b/content/zh/docs/Developerguide/PG_TABLES.md index 7d5642516..f558a7e9b 100644 --- a/content/zh/docs/Developerguide/PG_TABLES.md +++ b/content/zh/docs/Developerguide/PG_TABLES.md @@ -19,7 +19,7 @@ PG\_TABLES视图提供了对数据库中每个表访问的有用信息。

name

PG_NAMESPACE.nspname

+

PG_NAMESPACE.nspname

包含表的模式名。

name

PG_TABLESPACE.spcname

+

PG_TABLESPACE.spcname

包含表的表空间,默认为NULL。

Boolean

是否加密openGauss
  • f:非加密openGauss
  • t:加密openGauss
+
是否加密openGauss。
  • f:非加密openGauss。
  • t:加密openGauss。

synchronize quit

steam plan结束时,等待stream线程组内的线程统一退出。

+

stream plan结束时,等待stream线程组内的线程统一退出。

nodegroup destroy

+

wait stream nodegroup destroy

steam plan结束时,等待销毁stream node group。

+

stream plan结束时,等待销毁stream node group。

wait active statement

@@ -239,86 +239,6 @@ wait\_status列的等待状态有以下状态。

等待作业执行,正在资源负载管控中。

gtm connect

-

等待与GTM建连。

-

gtm get gxid

-

等待从GTM获取事务xid。

-

gtm get snapshot

-

等待从GTM获取事务快照snapshot。

-

gtm begin trans

-

等待GTM开始事务。

-

gtm commit trans

-

等待GTM提交事务。

-

gtm rollback trans

-

等待GTM执行事务回滚。

-

gtm start prepare trans

-

等待GTM开始两阶段事务的prepare阶段。

-

gtm prepare trans

-

等待GTM完成两阶段事务的prepare阶段。

-

gtm open sequence

-

等待GTM打开sequence。

-

gtm close sequence

-

等待GTM关闭sequence。

-

gtm create sequence

-

等待GTM创建sequence。

-

gtm alter sequence

-

等待GTM修改sequence。

-

gtm get sequence val

-

等待从GTM获取sequence的下一个值。

-

gtm set sequence val

-

等待GTM设置sequence的值。

-

gtm drop sequence

-

等待GTM删除sequence。

-

gtm rename sequece

-

等待GTM重命名sequence。

-

analyze: [relname], [phase]

当前正在对表relname执行analyze。如果状态包含phase信息,则为autovacuum,表示是数据库自动开启AutoVacuum线程执行的analyze分析操作。

@@ -367,6 +287,26 @@ wait\_status列的等待状态有以下状态。

当前是Material算子,write file表示Material算子正在将数据写入磁盘。

NestLoop

+

当前是NestLoop算子。

+

wait memory

+

等待内存获取。

+

wait sync consumer next step

+

Stream算子等待消费者执行。

+

wait sync producer next step

+

Stream算子等待生产者执行。

+
@@ -505,7 +445,7 @@ wait\_status列的等待状态有以下状态。

NodeTableLock

-

用于保护存放数据库节点信息的共享结构。

+

用于保护存放数据库节点信息的共享结构。

PoolerLock

@@ -593,11 +533,6 @@ wait\_status列的等待状态有以下状态。

用于串行更新特定结构中记录的主备机的xlog flush位置点。

-

GTMHostInfoLock

- -

用于避免并发访问或者修改GTM主机信息。

- -

ReplicationSlotAllocationLock

用于主备复制时保护主机端的流复制槽的分配。

@@ -655,7 +590,7 @@ wait\_status列的等待状态有以下状态。

JobShmemLock

-

用于MPP兼容A定时任务功能中保护定时读取的全局变量。

+

用于定时任务功能中保护定时读取的全局变量。

OBSRuntimeLock

@@ -728,6 +663,266 @@ wait\_status列的等待状态有以下状态。

用于保证当前只有一个线程在创建Barrier。

+

dummyServerInfoCacheLock

+ +

用于保护缓存加速openGauss连接信息的全局哈希表。

+ + +

RPNumberLock

+ +

用于加速openGauss的数据库节点对正在执行计划的任务线程的计数。

+ + +

ClusterRPLock

+ +

用于加速openGauss的CCN中维护的openGauss负载数据的并发存取控制。

+ + +

CBMParseXlogLock

+ +

Cbm 解析xlog时的保护锁

+ + +

RelfilenodeReuseLock

+ +

避免错误地取消已重用的列属性文件的链接。

+ + +

RcvWriteLock

+ +

防止并发调用WalDataRcvWrite。

+ + +

PercentileLock

+ +

用于保护全局PercentileBuffer

+ + +

CSNBufMappingLock

+ +

保护csn页面

+ + +

UniqueSQLMappingLock

+ +

用于保护uniquesql hash table

+ + +

DelayDDLLock

+ +

防止并发ddl。

+ + +

CLOG Ctl

+ +

用于避免并发访问或者修改Clog控制数据结构

+ + +

Async Ctl

+ +

保护Async buffer

+ + +

MultiXactOffset Ctl

+ +

保护MultiXact offet的slru buffer

+ + +

MultiXactMember Ctl

+ +

保护MultiXact member的slrubuffer

+ + +

OldSerXid SLRU Ctl

+ +

保护old xids的slru buffer

+ + +

ReplicationSlotLock

+ +

用于保护ReplicationSlot

+ + +

PGPROCLock

+ +

用于保护pgproc

+ + +

MetaCacheLock

+ +

用于保护MetaCache

+ + +

DataCacheLock

+ +

用于保护datacache

+ + +

InstrUserLock

+ +

用于保护InstrUserHTAB。

+ + +

BadBlockStatHashLock

+ +

用于保护global_bad_block_stat hash表。

+ + +

BufFreelistLock

+ +

用于保证共享缓冲区空闲列表操作的原子性。

+ + +

CUSlotListLock

+ +

用于控制列存缓冲区槽位的并发操作。

+ + +

AddinShmemInitLock

+ +

保护共享内存对象的初始化。

+ + +

AlterPortLock

+ +

保护协调节点更改注册端口号的操作。

+ + +

FdwPartitionCaheLock

+ +

HDFS分区表缓冲区的管理锁。

+ + +

DfsConnectorCacheLock

+ +

DFSConnector缓冲区的管理锁。

+ + +

DfsSpaceCacheLock

+ +

HDFS表空间管理缓冲区的管理锁。

+ + +

FullBuildXlogCopyStartPtrLock

+ +

用于保护全量Build中Xlog拷贝的操作。

+ + +

DfsUserLoginLock

+ +

用于HDFS用户登录以及认证。

+ + +

LogicalReplicationSlotPersistentDataLock

+ +

用于保护逻辑复制过程中复制槽位的数据。

+ + +

WorkloadSessionInfoLock

+ +

保护负载管理session info内存hash表访问。

+ + +

InstrWorkloadLock

+ +

保护负载管理统计信息的内存hash表访问。

+ + +

PgfdwLock

+ +

用于管理实例向Foreign server建立连接。

+ + +

InstanceTimeLock

+ +

用于获取实例中会话的时间信息。

+ + +

XlogRemoveSegLock

+ +

保护Xlog段文件的回收操作。

+ + +

DnUsedSpaceHashLock

+ +

用于更新会话对应的空间使用信息。

+ + +

CsnMinLock

+ +

用于计算CSNmin。

+ + +

GPCCommitLock

+ +

用于保护全局Plan Cache hash表的添加操作。

+ + +

GPCClearLock

+ +

用于保护全局Plan Cache hash表的清除操作。

+ + +

GPCTimelineLock

+ +

用于保护全局Plan Cache hash表检查Timeline的操作。

+ + +

TsTagsCacheLock

+ +

用于时序tag缓存管理。

+ + +

InstanceRealTLock

+ +

用于保护共享实例统计信息hash表的更新操作。

+ + +

CLogBufMappingLock

+ +

用于提交日志缓存管理。

+ + +

GPCMappingLock

+ +

用于全局Plan Cache缓存管理。

+ + +

GPCPrepareMappingLock

+ +

用于全局Plan Cache缓存管理。

+ + +

BufferIOLock

+ +

保护共享缓冲区页面的IO操作。

+ + +

BufferContentLock

+ +

保护共享缓冲区页面内容的读取、修改。

+ + +

CSNLOG Ctl

+ +

用于CSN日志管理。

+ + +

DoubleWriteLock

+ +

用于双写的管理操作。

+ + +

RowPageReplicationLock

+ +

用于管理行存储的数据页复制。

+ + +

extension

+ +

其他轻量锁。

+ + @@ -992,6 +1187,46 @@ wait\_status列的等待状态有以下状态。

写入WAL文件。

+

DoubleWriteFileRead

+ +

双写 文件读取。

+ + +

DoubleWriteFileSync

+ +

双写 文件强制刷盘。

+ + +

DoubleWriteFileWrite

+ +

双写 文件写入。

+ + +

PredoProcessPending

+ +

并行日志回放中当前记录回放等待其它记录回放完成。

+ + +

PredoApply

+ +

并行日志回放中等待当前工作线程等待其他线程回放至本线程LSN。

+ + +

DisableConnectFileRead

+ +

HA锁分片逻辑文件读取。

+ + +

DisableConnectFileSync

+ +

HA锁分片逻辑文件强制刷盘。

+ + +

DisableConnectFileWrite

+ +

HA锁分片逻辑文件写入。

+ + diff --git a/content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md deleted file mode 100644 index 1969c9260..000000000 --- a/content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md +++ /dev/null @@ -1,39 +0,0 @@ -# PG\_TOTAL\_MEMORY\_DETAIL - -PG\_TOTAL\_MEMORY\_DETAIL视图显示某个数据库节点内存使用情况。 - -**表 1** PG\_TOTAL\_MEMORY\_DETAIL字段 - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

描述

-

nodename

-

text

-

节点名称。

-

memorytype

-

text

-

内存的名称。

-

memorymbytes

-

integer

-

内存使用的大小,单位为MB。

-
- diff --git a/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md b/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md index 27d2e1f64..cfdce4794 100644 --- a/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md +++ b/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md @@ -94,48 +94,48 @@ PG\_TOTAL\_USER\_RESOURCE\_INFO视图显示所有用户资源使用情况,需

bigint

-

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业read的字节总数(单位KB)。

-

数据库节点:实例启动至当前时间为止,该用户复杂作业read的字节总数(单位KB)。

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业read的字节总数(单位KB)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业read的字节总数(单位KB)。

write_kbytes

bigint

-

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业write的字节总数(单位KB)。

-

数据库节点:实例启动至当前时间为止,该用户复杂作业write的字节总数(单位KB)。

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业write的字节总数(单位KB)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业write的字节总数(单位KB)。

read_counts

bigint

-

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业read的次数之和(单位次)。

-

数据库节点:实例启动至当前时间为止,该用户复杂作业read的次数之和(单位次)。

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业read的次数之和(单位次)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业read的次数之和(单位次)。

write_counts

bigint

-

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业write的次数之和(单位次)。

-

数据库节点:实例启动至当前时间为止,该用户复杂作业write的次数之和(单位次)。

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业write的次数之和(单位次)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业write的次数之和(单位次)。

read_speed

double precision

-

数据库主节点:过去5秒内,该用户在单个数据库节点上复杂作业read平均速率(单位KB/s)。

-

数据库节点:过去5秒内,该用户在该数据库节点上复杂作业read平均速率(单位KB/s)。

+

数据库主节点:过去5秒内,该用户在单个数据库节点上复杂作业read平均速率(单位KB/s)。

+

数据库节点:过去5秒内,该用户在该数据库节点上复杂作业read平均速率(单位KB/s)。

write_speed

double precision

-

数据库主节点:过去5秒内,该用户在单个数据库节点上复杂作业write平均速率(单位KB/s)。

-

数据库节点:过去5秒内,该用户在该数据库节点上复杂作业write平均速率(单位KB/s)。

+

数据库主节点:过去5秒内,该用户在单个数据库节点上复杂作业write平均速率(单位KB/s)。

+

数据库节点:过去5秒内,该用户在该数据库节点上复杂作业write平均速率(单位KB/s)。

diff --git a/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md b/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md index 0e7105ae4..e440e5a96 100644 --- a/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md +++ b/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md @@ -87,7 +87,7 @@ PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID视图显示所有用户资源使用情况

bigint

-

可使用的临时空间总大小,单位KB,值为-1表示未限制。

+

可使用的下盘空间总大小,单位KB,值为-1表示未限制。

diff --git a/content/zh/docs/Developerguide/PG_TS_CONFIG.md b/content/zh/docs/Developerguide/PG_TS_CONFIG.md index 277389df0..816872f7d 100644 --- a/content/zh/docs/Developerguide/PG_TS_CONFIG.md +++ b/content/zh/docs/Developerguide/PG_TS_CONFIG.md @@ -2,7 +2,7 @@ PG\_TS\_CONFIG系统表包含表示文本搜索配置的记录。一个配置指定一个特定的文本搜索解析器和一个为了每个解析器的输出类型使用的字典的列表。 -解析器在PG\_TS\_CONFIG记录中显示,但是字典映射的标记是由[PG\_TS\_CONFIG\_MAP](PG_TS_CONFIG_MAP.md#ZH-CN_TOPIC_0242385851)里面的辅助记录定义的。 +解析器在PG\_TS\_CONFIG记录中显示,但是字典映射的标记是由[PG\_TS\_CONFIG\_MAP](PG_TS_CONFIG_MAP.md)里面的辅助记录定义的。 **表 1** PG\_TS\_CONFIG字段 @@ -39,7 +39,7 @@ PG\_TS\_CONFIG系统表包含表示文本搜索配置的记录。一个配置指

oid

-

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含这个配置的名称空间的OID。

@@ -57,7 +57,7 @@ PG\_TS\_CONFIG系统表包含表示文本搜索配置的记录。一个配置指

oid

-

PG_TS_PARSER.oid

+

PG_TS_PARSER.oid

这个配置的文本搜索解析器的OID。

diff --git a/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md b/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md index 95ea1a843..012e50882 100644 --- a/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md +++ b/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md @@ -19,9 +19,9 @@ PG\_TS\_CONFIG\_MAP系统表包含为每个文本搜索配置的解析器的每

oid

-

PG_TS_CONFIG.oid

+

PG_TS_CONFIG.oid

-

拥有这个映射记录的PG_TS_CONFIG记录的OID。

+

拥有这个映射记录的PG_TS_CONFIG记录的OID。

maptokentype

@@ -46,7 +46,7 @@ PG\_TS\_CONFIG\_MAP系统表包含为每个文本搜索配置的解析器的每

oid

-

PG_TS_DICT.oid

+

PG_TS_DICT.oid

要咨询的文本搜索字典的OID。

diff --git a/content/zh/docs/Developerguide/PG_TS_DICT.md b/content/zh/docs/Developerguide/PG_TS_DICT.md index 5b17128b6..cd622a30d 100644 --- a/content/zh/docs/Developerguide/PG_TS_DICT.md +++ b/content/zh/docs/Developerguide/PG_TS_DICT.md @@ -39,7 +39,7 @@ PG\_TS\_DICT系统表包含定义文本搜索字典的记录。字典取决于

oid

-

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含这个字典的名称空间的OID。

@@ -57,7 +57,7 @@ PG\_TS\_DICT系统表包含定义文本搜索字典的记录。字典取决于

oid

-

PG_TS_TEMPLATE.oid

+

PG_TS_TEMPLATE.oid

这个字典的文本搜索模板的OID。

diff --git a/content/zh/docs/Developerguide/PG_TS_PARSER.md b/content/zh/docs/Developerguide/PG_TS_PARSER.md index 725df7ca5..abf1a580f 100644 --- a/content/zh/docs/Developerguide/PG_TS_PARSER.md +++ b/content/zh/docs/Developerguide/PG_TS_PARSER.md @@ -1,6 +1,6 @@ # PG\_TS\_PARSER -PG\_TS\_PARSER系统表包含定义文本解析器的记录。解析器负责分裂输入文本为词位,并且为每个词位分配标记类型。因为解析器必须通过C语言级别的函数实现,所以新解析器必须由数据库系统管理员创建。 +PG\_TS\_PARSER系统表包含定义文本解析器的记录。解析器负责分裂输入文本为词位,并且为每个词位分配标记类型。新解析器必须由数据库系统管理员创建。 **表 1** PG\_TS\_PARSER字段 @@ -37,7 +37,7 @@ PG\_TS\_PARSER系统表包含定义文本解析器的记录。解析器负责分

oid

-

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含这个解析器的名称空间的OID。

diff --git a/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md b/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md index c7127859f..86d7d54b3 100644 --- a/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md +++ b/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md @@ -37,7 +37,7 @@ PG\_TS\_TEMPLATE系统表包含定义文本搜索模板的记录。模板是文

oid

-

PG_NAMESPACE.oid

+

PG_NAMESPACE.oid

包含这个模板的名称空间的OID。

diff --git a/content/zh/docs/Developerguide/PG_TYPE.md b/content/zh/docs/Developerguide/PG_TYPE.md index 8f3a26ad5..0e79556fa 100644 --- a/content/zh/docs/Developerguide/PG_TYPE.md +++ b/content/zh/docs/Developerguide/PG_TYPE.md @@ -228,7 +228,8 @@ PG\_TYPE系统表存储数据类型的相关信息。

text

-

如果某类型没有相关缺省值,则取值是NULL。如果typdefaultbin不是NULL,则typdefault必须包含一个typdefaultbin代表的缺省表达式的人类可读的版本。如果typdefaultbin为NULL但typdefault不是,typdefault则是该类型缺省值的外部表现形式,可以把它交给该类型的输入转换器生成一个常量。

+

如果某类型没有相关缺省值,则取值是NULL。

+
  • 如果typdefaultbin为非NULL,则typdefault必须包含一个typdefaultbin代表的缺省表达式。
  • 如果typdefaultbin为NULL但typdefault不是,typdefault则是该类型缺省值的外部表现形式,可以把它作为该类型的输入,转换器生成一个常量。

typacl

diff --git a/content/zh/docs/Developerguide/PG_USER.md b/content/zh/docs/Developerguide/PG_USER.md index 502be4fa1..161514e97 100644 --- a/content/zh/docs/Developerguide/PG_USER.md +++ b/content/zh/docs/Developerguide/PG_USER.md @@ -1,6 +1,6 @@ # PG\_USER -PG\_USER视图提供了访问数据库用户的信息。 +PG\_USER视图提供了访问数据库用户的信息,默认只有初始化用户和具有sysadmin属性的用户可以查看,其余用户需要赋权后才可以查看。 **表 1** PG\_USER字段 @@ -122,7 +122,7 @@ PG\_USER视图提供了访问数据库用户的信息。

name

-

用户关联的逻辑openGauss名称,如果该用户没有管理逻辑openGauss,则该字段为空。

+

用户关联的逻辑openGauss名称,如果该用户没有管理openGauss,则该字段为空。

usemonitoradmin

diff --git a/content/zh/docs/Developerguide/PG_USER_MAPPING.md b/content/zh/docs/Developerguide/PG_USER_MAPPING.md index fb83515b6..190ce4f1c 100644 --- a/content/zh/docs/Developerguide/PG_USER_MAPPING.md +++ b/content/zh/docs/Developerguide/PG_USER_MAPPING.md @@ -2,7 +2,7 @@ PG\_USER\_MAPPING系统表存储从本地用户到远程的映射。 -需要有系统管理员权限才可以访问此系统表。普通用户可以使用视图[PG\_USER\_MAPPINGS](PG_USER_MAPPINGS.md#ZH-CN_TOPIC_0242386000)进行查询。 +需要有系统管理员权限才可以访问此系统表。普通用户可以使用视图[PG\_USER\_MAPPINGS](PG_USER_MAPPINGS.md)进行查询。 **表 1** PG\_USER\_MAPPING字段 @@ -39,7 +39,7 @@ PG\_USER\_MAPPING系统表存储从本地用户到远程的映射。

oid

-

PG_FOREIGN_SERVER.oid

+

PG_FOREIGN_SERVER.oid

包含这个映射的外部服务器的OID。

diff --git a/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md b/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md index 78aed44bc..5367257ba 100644 --- a/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md +++ b/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md @@ -2,7 +2,7 @@ PG\_USER\_MAPPINGS视图提供访问关于用户映射的信息的接口。 -这个视图只是一个[PG\_USER\_MAPPING](PG_USER_MAPPING.md#ZH-CN_TOPIC_0242385856)的可读部分的视图化表现,如果用户无权使用它则查询此表时,有些选项字段会显示为空。普通用户需要授权才可以访问。 +这个视图只是一个[PG\_USER\_MAPPING](PG_USER_MAPPING.md)的可读部分的视图化表现,如果用户无权使用它则查询该表时,有些选项字段会显示为空。普通用户需要授权才可以访问。 **表 1** PG\_USER\_MAPPINGS字段 @@ -21,7 +21,7 @@ PG\_USER\_MAPPINGS视图提供访问关于用户映射的信息的接口。

oid

-

PG_USER_MAPPING.oid

+

PG_USER_MAPPING.oid

用户映射的OID。

@@ -30,7 +30,7 @@ PG\_USER\_MAPPINGS视图提供访问关于用户映射的信息的接口。

oid

-

PG_FOREIGN_SERVER.oid

+

PG_FOREIGN_SERVER.oid

包含这个映射的外部服务器的OID。

@@ -39,7 +39,7 @@ PG\_USER\_MAPPINGS视图提供访问关于用户映射的信息的接口。

name

-

PG_FOREIGN_SERVER.srvname

+

PG_FOREIGN_SERVER.srvname

外部服务器的名称。

diff --git a/content/zh/docs/Developerguide/PG_VIEWS.md b/content/zh/docs/Developerguide/PG_VIEWS.md index 8d2323433..8f4f11113 100644 --- a/content/zh/docs/Developerguide/PG_VIEWS.md +++ b/content/zh/docs/Developerguide/PG_VIEWS.md @@ -19,7 +19,7 @@ PG\_VIEWS视图提供访问数据库中每个视图的有用信息。

name

-

PG_NAMESPACE.nspname

+

PG_NAMESPACE.nspname

包含视图的模式名。

diff --git a/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md b/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md index eae16d0c8..4bb163ebb 100644 --- a/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md +++ b/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md @@ -59,7 +59,7 @@ PG\_WLM\_STATISTICS视图显示作业结束后或已被处理异常后的负载

text

-

该字段不支持

+

该字段不支持。

status

diff --git "a/content/zh/docs/Developerguide/PL-pgSQL\350\257\255\350\250\200\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/PL-pgSQL\350\257\255\350\250\200\345\207\275\346\225\260.md" new file mode 100644 index 000000000..cb11e3075 --- /dev/null +++ "b/content/zh/docs/Developerguide/PL-pgSQL\350\257\255\350\250\200\345\207\275\346\225\260.md" @@ -0,0 +1,20 @@ +# PL/pgSQL语言函数 + +PL/pgSQL是一种可载入的过程语言。 + +用PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方。例如,可以创建复杂条件的计算函数并且后面用它们来定义操作符或把它们用于索引表达式。 + +SQL被大多数数据库用作查询语言。它是可移植的并且容易学习。但是每一个SQL语句必须由数据库服务器单独执行。 + +这意味着客户端应用必须发送每一个查询到数据库服务器、等待它被处理、接收并处理结果、做一些计算,然后发送更多查询给服务器。如果客户端和数据库服务器不在同一台机器上,则会引起进程间通信并且将带来网络负担。 + +通过PL/pgSQL,可以将一整块计算和一系列查询分组在数据库服务器内部,这样就有了一种过程语言的能力并且使SQL更易用,同时能节省客户端/服务器通信开销。 + +- 客户端和服务器之间的额外往返通信被消除。 +- 客户端不需要的中间结果不必被整理或者在服务器和客户端之间传送。 +- 多轮的查询解析可以被避免。 + +PL/pgSQL可以使用SQL中所有的数据类型、操作符和函数。 + +应用PL/pgSQL创建函数的语法为[CREATE FUNCTION](CREATE-FUNCTION.md)。PL/pgSQL是一种可载入的过程语言。其应用方法与[存储过程](存储过程.md)相似,只是存储过程无返回值,函数有返回值。 + diff --git a/content/zh/docs/Developerguide/PQcancel.md b/content/zh/docs/Developerguide/PQcancel.md index 494e69b63..4bf0cfe08 100644 --- a/content/zh/docs/Developerguide/PQcancel.md +++ b/content/zh/docs/Developerguide/PQcancel.md @@ -50,5 +50,5 @@ int:执行结果为1表示成功,0表示失败,失败原因存到errbuf中 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQclear.md b/content/zh/docs/Developerguide/PQclear.md index 688cbe855..8491b61f6 100644 --- a/content/zh/docs/Developerguide/PQclear.md +++ b/content/zh/docs/Developerguide/PQclear.md @@ -35,5 +35,5 @@ PGresult不会自动释放,当提交新的查询时它并不消失,甚至断 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQconnectdb.md b/content/zh/docs/Developerguide/PQconnectdb.md index 6879345f6..354b1169c 100644 --- a/content/zh/docs/Developerguide/PQconnectdb.md +++ b/content/zh/docs/Developerguide/PQconnectdb.md @@ -23,7 +23,7 @@ PGconn *PQconnectdb(const char *conninfo);

conninfo

-

链接字符串,字符串中的字段见5.6.4.5章节描述章节。

+

链接字符串,字符串中的字段见链接字符章节。

@@ -40,5 +40,5 @@ PGconn \*:指向包含链接的对象指针,内存在函数内部申请。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQconnectdbParams.md b/content/zh/docs/Developerguide/PQconnectdbParams.md index 6ab4d9645..80242d1bb 100644 --- a/content/zh/docs/Developerguide/PQconnectdbParams.md +++ b/content/zh/docs/Developerguide/PQconnectdbParams.md @@ -51,5 +51,5 @@ PGconn \*:指向包含链接的对象指针,内存在函数内部申请。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQerrorMessage.md b/content/zh/docs/Developerguide/PQerrorMessage.md index 21567be02..88c860e65 100644 --- a/content/zh/docs/Developerguide/PQerrorMessage.md +++ b/content/zh/docs/Developerguide/PQerrorMessage.md @@ -35,5 +35,5 @@ char类型指针。 ## 示例 -参见:[示例](示例-10.md) +参见:[示例](示例-3.md) diff --git a/content/zh/docs/Developerguide/PQexec.md b/content/zh/docs/Developerguide/PQexec.md index 1ca53bee7..1dc774b0a 100644 --- a/content/zh/docs/Developerguide/PQexec.md +++ b/content/zh/docs/Developerguide/PQexec.md @@ -47,5 +47,5 @@ PGresult:包含查询结果的对象指针。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQexecParams.md b/content/zh/docs/Developerguide/PQexecParams.md index 5127f2869..7f15f7edf 100644 --- a/content/zh/docs/Developerguide/PQexecParams.md +++ b/content/zh/docs/Developerguide/PQexecParams.md @@ -38,6 +38,11 @@ PGresult* PQexecParams(PGconn* conn,

SQL文本串。

+

nParams

+ +

绑定参数的个数

+ +

paramTypes

绑定参数类型。

diff --git a/content/zh/docs/Developerguide/PQexecParamsBatch.md b/content/zh/docs/Developerguide/PQexecParamsBatch.md index c17ce11e4..2e245ac78 100644 --- a/content/zh/docs/Developerguide/PQexecParamsBatch.md +++ b/content/zh/docs/Developerguide/PQexecParamsBatch.md @@ -39,6 +39,11 @@ PGresult* PQexecParamsBatch(PGconn* conn,

SQL文本串。

+

nParams

+ +

绑定参数的个数

+ +

nBatch

批量操作数。

diff --git a/content/zh/docs/Developerguide/PQfinish.md b/content/zh/docs/Developerguide/PQfinish.md index cf368e948..6c16dd715 100644 --- a/content/zh/docs/Developerguide/PQfinish.md +++ b/content/zh/docs/Developerguide/PQfinish.md @@ -35,5 +35,5 @@ void PQfinish(PGconn *conn); ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQflush.md b/content/zh/docs/Developerguide/PQflush.md index 09da9f5e1..abb099340 100644 --- a/content/zh/docs/Developerguide/PQflush.md +++ b/content/zh/docs/Developerguide/PQflush.md @@ -39,5 +39,5 @@ int:如果成功(或者如果发送队列为空),则返回0;如果由 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQfname.md b/content/zh/docs/Developerguide/PQfname.md index bc9ecee0c..6179a8b6e 100644 --- a/content/zh/docs/Developerguide/PQfname.md +++ b/content/zh/docs/Developerguide/PQfname.md @@ -41,5 +41,5 @@ char类型指针。 ## 示例 -参见:[示例](示例-10.md) +参见:[示例](示例-3.md) diff --git a/content/zh/docs/Developerguide/PQfreeCancel.md b/content/zh/docs/Developerguide/PQfreeCancel.md index 4231ee222..26ab7ecb3 100644 --- a/content/zh/docs/Developerguide/PQfreeCancel.md +++ b/content/zh/docs/Developerguide/PQfreeCancel.md @@ -35,5 +35,5 @@ PQfreeCancel释放一个由前面的PQgetCancel创建的数据对象。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQgetCancel.md b/content/zh/docs/Developerguide/PQgetCancel.md index 50f8dcc1d..4623e5f8a 100644 --- a/content/zh/docs/Developerguide/PQgetCancel.md +++ b/content/zh/docs/Developerguide/PQgetCancel.md @@ -39,5 +39,5 @@ PQgetCancel创建一个给定PGconn连接对象的PGcancel对象。如果给定 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQgetvalue.md b/content/zh/docs/Developerguide/PQgetvalue.md index 301efb978..25faf74c3 100644 --- a/content/zh/docs/Developerguide/PQgetvalue.md +++ b/content/zh/docs/Developerguide/PQgetvalue.md @@ -51,5 +51,5 @@ char *PQgetvalue(const PGresult *res, ## 示例 -参见:[示例](示例-10.md) +参见:[示例](示例-3.md) diff --git a/content/zh/docs/Developerguide/PQnfields.md b/content/zh/docs/Developerguide/PQnfields.md index f088ea31c..d0a6209ac 100644 --- a/content/zh/docs/Developerguide/PQnfields.md +++ b/content/zh/docs/Developerguide/PQnfields.md @@ -35,5 +35,5 @@ int类型数字。 ## 示例 -参见:[示例](示例-10.md) +参见:[示例](示例-3.md) diff --git a/content/zh/docs/Developerguide/PQntuples.md b/content/zh/docs/Developerguide/PQntuples.md index 61b41a05b..f0f715548 100644 --- a/content/zh/docs/Developerguide/PQntuples.md +++ b/content/zh/docs/Developerguide/PQntuples.md @@ -35,5 +35,5 @@ int类型数字 ## 示例 -参见:[示例](示例-10.md) +参见:[示例](示例-3.md) diff --git a/content/zh/docs/Developerguide/PQprepare.md b/content/zh/docs/Developerguide/PQprepare.md index 10a3fde90..2a4a8f5e1 100644 --- a/content/zh/docs/Developerguide/PQprepare.md +++ b/content/zh/docs/Developerguide/PQprepare.md @@ -32,7 +32,7 @@ PGresult *PQprepare(PGconn *conn,

stmtName

-

需要执行的prepare语句。

+

需要执行的stmt名称。

query

@@ -67,5 +67,5 @@ PGresult:包含查询结果的对象指针。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQreset.md b/content/zh/docs/Developerguide/PQreset.md index 1ccb98dda..66a4c4f0b 100644 --- a/content/zh/docs/Developerguide/PQreset.md +++ b/content/zh/docs/Developerguide/PQreset.md @@ -35,5 +35,5 @@ void PQreset(PGconn *conn); ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQresultStatus.md b/content/zh/docs/Developerguide/PQresultStatus.md index 3e2dcb310..343dc6c5b 100644 --- a/content/zh/docs/Developerguide/PQresultStatus.md +++ b/content/zh/docs/Developerguide/PQresultStatus.md @@ -68,11 +68,11 @@ PGresult包含一个来自当前命令的结果元组。 这个状态只在查 ## 注意事项 -- 如果结果状态为PGRES\_TUPLES\_OK或PGRES\_SINGLE\_TUPLE,则可以使用下面描述的函数来检索查询返回的行。请注意,恰好检索到零行的SELECT命令仍然显示PGRES\_TUPLES\_OK。PGRES\_COMMAND\_OK用于永远不能返回行的命令(插入或更新,不带返回子句等)。PGRES\_EMPTY\_QUERY响应可能表明客户端软件存在bug。 +- 请注意,恰好检索到零行的SELECT命令仍然显示PGRES\_TUPLES\_OK。PGRES\_COMMAND\_OK用于永远不能返回行的命令(插入或更新,不带返回子句等)。PGRES\_EMPTY\_QUERY响应可能表明客户端软件存在bug。 - 状态为PGRES\_NONFATAL\_ERROR的结果永远不会由PQexec或其他查询执行函数直接返回,此类结果将传递给通知处理程序。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQsendPrepare.md b/content/zh/docs/Developerguide/PQsendPrepare.md index 67edd4572..15c8acedb 100644 --- a/content/zh/docs/Developerguide/PQsendPrepare.md +++ b/content/zh/docs/Developerguide/PQsendPrepare.md @@ -32,7 +32,7 @@ int PQsendPrepare(PGconn *conn,

stmtName

-

需要执行的prepare语句。

+

需要执行的stmt名称。

query

@@ -63,5 +63,5 @@ int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>er ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQsendQuery.md b/content/zh/docs/Developerguide/PQsendQuery.md index 215695f0f..c569f2b6c 100644 --- a/content/zh/docs/Developerguide/PQsendQuery.md +++ b/content/zh/docs/Developerguide/PQsendQuery.md @@ -44,5 +44,5 @@ int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>er ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQsendQueryParams.md b/content/zh/docs/Developerguide/PQsendQueryParams.md index 871ad31c8..79685db93 100644 --- a/content/zh/docs/Developerguide/PQsendQueryParams.md +++ b/content/zh/docs/Developerguide/PQsendQueryParams.md @@ -77,9 +77,9 @@ int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>er ## 注意事项 -该函数等效于PQsendQuery,只是查询参数可以和查询字串分开声明。函数的参数处理和PQexecParams一样,和PQexecParams类似,它不能在2.0版本的协议连接上工作,并且它只允许在查询字串里出现一条命令。 +该函数等效于PQsendQuery,只是查询参数可以和查询字符串分开声明。函数的参数处理和PQexecParams一样,和PQexecParams类似,它不能在2.0版本的协议连接上工作,并且它只允许在查询字符串里出现一条命令。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQsendQueryPrepared.md b/content/zh/docs/Developerguide/PQsendQueryPrepared.md index 81e54c5ba..35320927e 100644 --- a/content/zh/docs/Developerguide/PQsendQueryPrepared.md +++ b/content/zh/docs/Developerguide/PQsendQueryPrepared.md @@ -34,12 +34,12 @@ int PQsendQueryPrepared(PGconn *conn,

stmtName

-

需要执行的prepare语句。

+

需要执行的stmt名称。

nParams

-

参数类型。

+

参数个数。

paramValues

@@ -75,5 +75,5 @@ int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>er ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQsetdbLogin.md b/content/zh/docs/Developerguide/PQsetdbLogin.md index c801b7a56..34c4f5a23 100644 --- a/content/zh/docs/Developerguide/PQsetdbLogin.md +++ b/content/zh/docs/Developerguide/PQsetdbLogin.md @@ -34,12 +34,12 @@ PGconn *PQsetdbLogin(const char *pghost,

pgport

-

主机服务器的端口号,详见链接字符描述的port字段。

+

主机服务器的端口号,详见链接字符描述的port字段。

pgoptions

-

添加命令行选项以在运行时发送到服务器,详见链接字符描述的option字段。

+

添加命令行选项以在运行时发送到服务器,详见链接字符描述的options字段。

pgtty

@@ -49,17 +49,17 @@ PGconn *PQsetdbLogin(const char *pghost,

dbName

-

要链接的数据库名,详见链接字符描述的dbname字段。

+

要链接的数据库名,详见链接字符描述的dbname字段。

login

-

要链接的用户名,详见链接字符章节描述的user字段。

+

要链接的用户名,详见链接字符章节描述的user字段。

pwd

-

如果服务器要求口令认证,所用的口令,详见链接字符描述的password字段。

+

如果服务器要求口令认证,所用的口令,详见链接字符描述的password字段。

@@ -76,5 +76,5 @@ PGconn \*:指向包含链接的对象指针,内存在函数内部申请。 ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PQstatus.md b/content/zh/docs/Developerguide/PQstatus.md index 754b925f8..f1216578e 100644 --- a/content/zh/docs/Developerguide/PQstatus.md +++ b/content/zh/docs/Developerguide/PQstatus.md @@ -65,5 +65,5 @@ CONNECTION_BAD ## 示例 -请参见[示例](示例-10.md)章节。 +请参见[示例](示例-3.md)章节。 diff --git a/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md b/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md index 4e3d538bd..5e11986e9 100644 --- a/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md +++ b/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md @@ -6,7 +6,7 @@ 在命令之后,事务就不再和当前会话关联了;它的状态完全保存在磁盘上,它被提交成功的可能性非常高,即使是在请求提交之前数据库发生了崩溃也如此。 -一旦准备好了,一个事务就可以在稍后用[COMMIT PREPARED](COMMIT-PREPARED.md#ZH-CN_TOPIC_0242370559)或 [ROLLBACK PREPARED](ROLLBACK-PREPARED.md#ZH-CN_TOPIC_0242370645)命令分别进行提交或者回滚。这些命令可以从任何会话中发出,而不光是最初执行事务的那个会话。 +一旦准备好了,一个事务就可以在稍后用[COMMIT PREPARED](COMMIT-PREPARED.md)或 [ROLLBACK PREPARED](ROLLBACK-PREPARED.md)命令分别进行提交或者回滚。这些命令可以从任何会话中发出,而不光是最初执行事务的那个会话。 从发出命令的会话的角度来看,PREPARE TRANSACTION不同于ROLLBACK:在执行它之后,就不再有活跃的当前事务了,并且预备事务的效果无法见到 \(在事务提交的时候其效果会再次可见\)。 @@ -33,5 +33,5 @@ PREPARE TRANSACTION transaction_id; ## 相关链接 -[COMMIT PREPARED](COMMIT-PREPARED.md#ZH-CN_TOPIC_0242370559),[ROLLBACK PREPARED](ROLLBACK-PREPARED.md#ZH-CN_TOPIC_0242370645) +[COMMIT PREPARED](COMMIT-PREPARED.md),[ROLLBACK PREPARED](ROLLBACK-PREPARED.md) diff --git a/content/zh/docs/Developerguide/PREPARE.md b/content/zh/docs/Developerguide/PREPARE.md index ddb5f1821..d4c174a68 100644 --- a/content/zh/docs/Developerguide/PREPARE.md +++ b/content/zh/docs/Developerguide/PREPARE.md @@ -4,7 +4,7 @@ 创建一个预备语句。 -预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用[DEALLOCATE](DEALLOCATE.md#ZH-CN_TOPIC_0242370593)进行删除,会话结束时,PREPARE也会自动删除。 +预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用[DEALLOCATE](DEALLOCATE.md)进行删除,会话结束时,PREPARE也会自动删除。 ## 注意事项 @@ -37,5 +37,5 @@ PREPARE name [ ( data_type [, ...] ) ] AS statement; ## 相关链接 -[DEALLOCATE](DEALLOCATE.md#ZH-CN_TOPIC_0242370593) +[DEALLOCATE](DEALLOCATE.md) diff --git "a/content/zh/docs/Developerguide/Plan-Hint\350\260\203\344\274\230\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/Plan-Hint\350\260\203\344\274\230\346\246\202\350\277\260.md" new file mode 100644 index 000000000..d2c327e6d --- /dev/null +++ "b/content/zh/docs/Developerguide/Plan-Hint\350\260\203\344\274\230\346\246\202\350\277\260.md" @@ -0,0 +1,260 @@ +# Plan Hint调优概述 + +Plan Hint为用户提供了直接影响执行计划生成的手段,用户可以通过指定join顺序,join、scan方法,指定结果行数,等多个手段来进行执行计划的调优,以提升查询的性能。 + +## 功能描述 + +Plan Hint仅支持在SELECT关键字后通过如下形式指定: + +``` +/*+ */ +``` + +可以同时指定多个hint,之间使用空格分隔。hint只能hint当前层的计划,对于子查询计划的hint,需要在子查询的select关键字后指定hint。 + +例如: + +``` +select /*+ */ * from t1, (select /*+ */ from t2) where 1=1; +``` + +其中为外层查询的hint,为内层子查询的hint。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果在视图定义(CREATE VIEW)时指定hint,则在该视图每次被应用时会使用该hint。 +>当使用random plan功能(参数plan\_mode\_seed不为0)时,查询指定的plan hint不会被使用。 + +## 支持范围 + +当前版本Plan Hint支持的范围如下,后续版本会进行增强。 + +- 指定Join顺序的Hint - leading hint +- 指定Join方式的Hint,仅支持除semi/anti join,unique plan之外的常用hint。 +- 指定结果集行数的Hint +- 指定Scan方式的Hint,仅支持常用的tablescan,indexscan和indexonlyscan的hint。 +- 指定子链接块名的Hint + +## 注意事项 + +不支持Agg、Sort、Setop和Subplan的hint。 + +## 示例 + +本章节使用同一个语句进行示例,便于Plan Hint支持的各方法作对比,示例语句及不带hint的原计划如下所示: + +``` +create table store +( + s_store_sk integer not null, + s_store_id char(16) not null, + s_rec_start_date date , + s_rec_end_date date , + s_closed_date_sk integer , + s_store_name varchar(50) , + s_number_employees integer , + s_floor_space integer , + s_hours char(20) , + s_manager varchar(40) , + s_market_id integer , + s_geography_class varchar(100) , + s_market_desc varchar(100) , + s_market_manager varchar(40) , + s_division_id integer , + s_division_name varchar(50) , + s_company_id integer , + s_company_name varchar(50) , + s_street_number varchar(10) , + s_street_name varchar(60) , + s_street_type char(15) , + s_suite_number char(10) , + s_city varchar(60) , + s_county varchar(30) , + s_state char(2) , + s_zip char(10) , + s_country varchar(20) , + s_gmt_offset decimal(5,2) , + s_tax_precentage decimal(5,2) , + primary key (s_store_sk) +); +create table store_sales +( + ss_sold_date_sk integer , + ss_sold_time_sk integer , + ss_item_sk integer not null, + ss_customer_sk integer , + ss_cdemo_sk integer , + ss_hdemo_sk integer , + ss_addr_sk integer , + ss_store_sk integer , + ss_promo_sk integer , + ss_ticket_number integer not null, + ss_quantity integer , + ss_wholesale_cost decimal(7,2) , + ss_list_price decimal(7,2) , + ss_sales_price decimal(7,2) , + ss_ext_discount_amt decimal(7,2) , + ss_ext_sales_price decimal(7,2) , + ss_ext_wholesale_cost decimal(7,2) , + ss_ext_list_price decimal(7,2) , + ss_ext_tax decimal(7,2) , + ss_coupon_amt decimal(7,2) , + ss_net_paid decimal(7,2) , + ss_net_paid_inc_tax decimal(7,2) , + ss_net_profit decimal(7,2) , + primary key (ss_item_sk, ss_ticket_number) +); +create table store_returns +( + sr_returned_date_sk integer , + sr_return_time_sk integer , + sr_item_sk integer not null, + sr_customer_sk integer , + sr_cdemo_sk integer , + sr_hdemo_sk integer , + sr_addr_sk integer , + sr_store_sk integer , + sr_reason_sk integer , + sr_ticket_number integer not null, + sr_return_quantity integer , + sr_return_amt decimal(7,2) , + sr_return_tax decimal(7,2) , + sr_return_amt_inc_tax decimal(7,2) , + sr_fee decimal(7,2) , + sr_return_ship_cost decimal(7,2) , + sr_refunded_cash decimal(7,2) , + sr_reversed_charge decimal(7,2) , + sr_store_credit decimal(7,2) , + sr_net_loss decimal(7,2) , + primary key (sr_item_sk, sr_ticket_number) +); +create table customer +( + c_customer_sk integer not null, + c_customer_id char(16) not null, + c_current_cdemo_sk integer , + c_current_hdemo_sk integer , + c_current_addr_sk integer , + c_first_shipto_date_sk integer , + c_first_sales_date_sk integer , + c_salutation char(10) , + c_first_name char(20) , + c_last_name char(30) , + c_preferred_cust_flag char(1) , + c_birth_day integer , + c_birth_month integer , + c_birth_year integer , + c_birth_country varchar(20) , + c_login char(13) , + c_email_address char(50) , + c_last_review_date char(10) , + primary key (c_customer_sk) +); +create table promotion +( + p_promo_sk integer not null, + p_promo_id char(16) not null, + p_start_date_sk integer , + p_end_date_sk integer , + p_item_sk integer , + p_cost decimal(15,2) , + p_response_target integer , + p_promo_name char(50) , + p_channel_dmail char(1) , + p_channel_email char(1) , + p_channel_catalog char(1) , + p_channel_tv char(1) , + p_channel_radio char(1) , + p_channel_press char(1) , + p_channel_event char(1) , + p_channel_demo char(1) , + p_channel_details varchar(100) , + p_purpose char(15) , + p_discount_active char(1) , + primary key (p_promo_sk) +); +create table customer_address +( + ca_address_sk integer not null, + ca_address_id char(16) not null, + ca_street_number char(10) , + ca_street_name varchar(60) , + ca_street_type char(15) , + ca_suite_number char(10) , + ca_city varchar(60) , + ca_county varchar(30) , + ca_state char(2) , + ca_zip char(10) , + ca_country varchar(20) , + ca_gmt_offset decimal(5,2) , + ca_location_type char(20) , + primary key (ca_address_sk) +); +create table item +( + i_item_sk integer not null, + i_item_id char(16) not null, + i_rec_start_date date , + i_rec_end_date date , + i_item_desc varchar(200) , + i_current_price decimal(7,2) , + i_wholesale_cost decimal(7,2) , + i_brand_id integer , + i_brand char(50) , + i_class_id integer , + i_class char(50) , + i_category_id integer , + i_category char(50) , + i_manufact_id integer , + i_manufact char(50) , + i_size char(20) , + i_formulation char(20) , + i_color char(20) , + i_units char(10) , + i_container char(10) , + i_manager_id integer , + i_product_name char(50) , + primary key (i_item_sk) +); +explain +select i_product_name product_name +,i_item_sk item_sk +,s_store_name store_name +,s_zip store_zip +,ad2.ca_street_number c_street_number +,ad2.ca_street_name c_street_name +,ad2.ca_city c_city +,ad2.ca_zip c_zip +,count(*) cnt +,sum(ss_wholesale_cost) s1 +,sum(ss_list_price) s2 +,sum(ss_coupon_amt) s3 +FROM store_sales +,store_returns +,store +,customer +,promotion +,customer_address ad2 +,item +WHERE ss_store_sk = s_store_sk AND +ss_customer_sk = c_customer_sk AND +ss_item_sk = i_item_sk and +ss_item_sk = sr_item_sk and +ss_ticket_number = sr_ticket_number and +c_current_addr_sk = ad2.ca_address_sk and +ss_promo_sk = p_promo_sk and +i_color in ('maroon','burnished','dim','steel','navajo','chocolate') and +i_current_price between 35 and 35 + 10 and +i_current_price between 35 + 1 and 35 + 15 +group by i_product_name +,i_item_sk +,s_store_name +,s_zip +,ad2.ca_street_number +,ad2.ca_street_name +,ad2.ca_city +,ad2.ca_zip +; +``` + +![](figures/zh-cn_image_0253028833.png) + diff --git "a/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\346\227\266\351\227\264\351\242\204\346\265\213\347\211\271\346\200\247.md" b/content/zh/docs/Developerguide/Predictor.md similarity index 38% rename from "content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\346\227\266\351\227\264\351\242\204\346\265\213\347\211\271\346\200\247.md" rename to content/zh/docs/Developerguide/Predictor.md index 67d719811..0cdb7d54c 100644 --- "a/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\346\227\266\351\227\264\351\242\204\346\265\213\347\211\271\346\200\247.md" +++ b/content/zh/docs/Developerguide/Predictor.md @@ -1,8 +1,10 @@ -# SQL执行时间预测特性 +# Predictor -- **[概述](概述-14.md)** +- **[概述](概述-7.md)** -- **[使用指南](使用指南.md)** +- **[环境部署](环境部署.md)** + +- **[使用指导](使用指导.md)** - **[最佳实践](最佳实践.md)** diff --git a/content/zh/docs/Developerguide/Query-22.md b/content/zh/docs/Developerguide/Query-22.md new file mode 100644 index 000000000..7c87ec35d --- /dev/null +++ b/content/zh/docs/Developerguide/Query-22.md @@ -0,0 +1,74 @@ +# Query + +## instr\_unique\_sql\_count + +**参数说明:**控制系统中unique sql信息实时收集功能。配置为0表示不启用unique sql信息收集功能。 + +该值由大变小将会清空系统中原有的数据重新统计;从小变大不受影响。 + +当系统中产生的unique sql信息大于instr\_unique\_sql\_count时,系统产生的unique sql信息不被统计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整形 0\~INT\_MAX + +**默认值**:100 + +## instr\_unique\_sql\_track\_type + +**参数说明:**unique sql记录SQL方式。 + +该参数属于INTERNAL类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- top:只记录顶层SQL。 + +**默认值**:top + +## enable\_instr\_rt\_percentile + +**参数说明:**是否开启计算系统中80%和95%的SQL响应时间的功能 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示打开sql响应时间信息计算功能。 +- off:表示关闭sql响应时间信息计算功能。 + +**默认值**:on + +## percentile + +**参数说明:**sql响应时间百分比信息,后台计算线程根据设置的值计算相应的百分比信息。 + +该参数属于INTERNAL类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值**:"80,95" + +## instr\_rt\_percentile\_interval + +**参数说明:**sql响应时间信息计算间隔,sql响应时间信息计算功能打开后,后台计算线程每隔设置的时间进行一次计算。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~3600(秒)。 + +**默认值**:10s + +## enable\_instr\_cpu\_timer + +**参数说明:是否捕获sql执行的cpu**时间消耗 。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示捕获sql执行的cpu时间消耗。 +- off:表示不捕获sql执行的cpu时间消耗。 + +**默认值**:on + diff --git a/content/zh/docs/Developerguide/Query.md b/content/zh/docs/Developerguide/Query.md index 7c87ec35d..f74c2dc9c 100644 --- a/content/zh/docs/Developerguide/Query.md +++ b/content/zh/docs/Developerguide/Query.md @@ -1,74 +1,31 @@ -# Query +# Query -## instr\_unique\_sql\_count +- **[STATEMENT](STATEMENT.md)** -**参数说明:**控制系统中unique sql信息实时收集功能。配置为0表示不启用unique sql信息收集功能。 +- **[SUMMARY\_STATEMENT](SUMMARY_STATEMENT.md)** -该值由大变小将会清空系统中原有的数据重新统计;从小变大不受影响。 +- **[STATEMENT\_COUNT](STATEMENT_COUNT.md)** -当系统中产生的unique sql信息大于instr\_unique\_sql\_count时,系统产生的unique sql信息不被统计。 +- **[GLOBAL\_STATEMENT\_COUNT](GLOBAL_STATEMENT_COUNT.md)** -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +- **[SUMMARY\_STATEMENT\_COUNT](SUMMARY_STATEMENT_COUNT.md)** -**取值范围**:整形 0\~INT\_MAX +- **[GLOBAL\_STATEMENT\_COMPLEX\_HISTORY](GLOBAL_STATEMENT_COMPLEX_HISTORY.md)** -**默认值**:100 +- **[GLOBAL\_STATEMENT\_COMPLEX\_HISTORY\_TABLE](GLOBAL_STATEMENT_COMPLEX_HISTORY_TABLE.md)** -## instr\_unique\_sql\_track\_type +- **[GLOBAL\_STATEMENT\_COMPLEX\_RUNTIME](GLOBAL_STATEMENT_COMPLEX_RUNTIME.md)** -**参数说明:**unique sql记录SQL方式。 +- **[STATEMENT\_RESPONSETIME\_PERCENTILE](STATEMENT_RESPONSETIME_PERCENTILE.md)** -该参数属于INTERNAL类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +- **[STATEMENT\_USER\_COMPLEX\_HISTORY](STATEMENT_USER_COMPLEX_HISTORY.md)** -**取值范围:**枚举类型 +- **[STATEMENT\_COMPLEX\_RUNTIME](STATEMENT_COMPLEX_RUNTIME.md)** -- top:只记录顶层SQL。 +- **[STATEMENT\_COMPLEX\_HISTORY\_TABLE](STATEMENT_COMPLEX_HISTORY_TABLE.md)** -**默认值**:top +- **[STATEMENT\_COMPLEX\_HISTORY](STATEMENT_COMPLEX_HISTORY.md)** -## enable\_instr\_rt\_percentile +- **[STATEMENT\_WLMSTAT\_COMPLEX\_RUNTIME](STATEMENT_WLMSTAT_COMPLEX_RUNTIME.md)** -**参数说明:**是否开启计算系统中80%和95%的SQL响应时间的功能 - -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔型 - -- on:表示打开sql响应时间信息计算功能。 -- off:表示关闭sql响应时间信息计算功能。 - -**默认值**:on - -## percentile - -**参数说明:**sql响应时间百分比信息,后台计算线程根据设置的值计算相应的百分比信息。 - -该参数属于INTERNAL类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**字符串。 - -**默认值**:"80,95" - -## instr\_rt\_percentile\_interval - -**参数说明:**sql响应时间信息计算间隔,sql响应时间信息计算功能打开后,后台计算线程每隔设置的时间进行一次计算。 - -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,0~3600(秒)。 - -**默认值**:10s - -## enable\_instr\_cpu\_timer - -**参数说明:是否捕获sql执行的cpu**时间消耗 。 - -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔型 - -- on:表示捕获sql执行的cpu时间消耗。 -- off:表示不捕获sql执行的cpu时间消耗。 - -**默认值**:on diff --git "a/content/zh/docs/Developerguide/Query\346\211\247\350\241\214\346\265\201\347\250\213.md" "b/content/zh/docs/Developerguide/Query\346\211\247\350\241\214\346\265\201\347\250\213.md" new file mode 100644 index 000000000..a0f4fc1fb --- /dev/null +++ "b/content/zh/docs/Developerguide/Query\346\211\247\350\241\214\346\265\201\347\250\213.md" @@ -0,0 +1,75 @@ +# Query执行流程 + +SQL引擎从接受SQL语句到执行SQL语句需要经历的步骤如[图1](#zh-cn_topic_0237121508_zh-cn_topic_0073320637_zh-cn_topic_0071158048_fig29880521152348)和[表1](#zh-cn_topic_0237121508_zh-cn_topic_0073320637_zh-cn_topic_0071158048_table11198623152535)所示。其中,红色字体部分为DBA可以介入实施调优的环节。 + +**图 1** SQL引擎执行查询类SQL语句的流程 +![](figures/SQL引擎执行查询类SQL语句的流程.png "SQL引擎执行查询类SQL语句的流程") + +**表 1** SQL引擎执行查询类SQL语句的步骤说明 + + + + + + + + + + + + + + + + + + + + + + +

步骤

+

说明

+

1、语法&词法解析

+

按照约定的SQL语句规则,把输入的SQL语句从字符串转化为格式化结构(Stmt)。

+

2、语义解析

+

将“语法&词法解析”输出的格式化结构转化为数据库可以识别的对象。

+

3、查询重写

+

根据规则把“语义解析”的输出等价转化为执行上更为优化的结构。

+

4、查询优化

+

根据“查询重写”的输出和数据库内部的统计信息规划SQL语句具体的执行方式,也就是执行计划。统计信息和GUC参数对查询优化(执行计划)的影响,请参见调优手段之统计信息调优手段之GUC参数

+

5、查询执行

+

根据“查询优化”规划的执行路径执行SQL查询语句。底层存储方式的选择合理性,将影响查询执行效率。详见调优手段之底层存储

+
+ +## 调优手段之统计信息 + +openGauss优化器是典型的基于代价的优化 \(Cost-Based Optimization,简称CBO\)。在这种优化器模型下,数据库根据表的元组数、字段宽度、NULL记录比率、distinct值、MCV值、HB值等表的特征值,以及一定的代价计算模型,计算出每一个执行步骤的不同执行方式的输出元组数和执行代价\(cost\),进而选出整体执行代价最小/首元组返回代价最小的执行方式进行执行。这些特征值就是统计信息。从上面描述可以看出统计信息是查询优化的核心输入,准确的统计信息将帮助规划器选择最合适的查询规划,一般来说我们通过analyze语法收集整个表或者表的若干个字段的统计信息,周期性地运行ANALYZE,或者在对表的大部分内容做了更改之后马上运行它是个好习惯。 + +## 调优手段之GUC参数 + +查询优化的主要目的是为查询语句选择高效的执行方式。 + +如下SQL语句: + +``` +select count(1) +from customer inner join store_sales on (ss_customer_sk = c_customer_sk); +``` + +在执行customer inner join store\_sales的时候,openGauss支持Nested Loop、Merge Join和Hash Join三种不同的Join方式。优化器会根据表customer和表store\_sales的统计信息估算结果集的大小以及每种join方式的执行代价,然后对比选出执行代价最小的执行计划。 + +正如前面所说,执行代价计算都是基于一定的模型和统计信息进行估算,当因为某些原因代价估算不能反映真实的cost的时候,我们就需要通过guc参数设置的方式让执行计划倾向更优规划。 + +## 调优手段之底层存储 + +openGauss的表支持行存表、列存表,底层存储方式的选择严格依赖于客户的具体业务场景。一般来说计算型业务查询场景\(以关联、聚合操作为主\)建议使用列存表;点查询、大批量UPDATE/DELETE业务场景适合行存表。 + +对于每种存储方式还有对应的存储层优化手段,这部分会在后续的调优章节深入介绍。 + +## 调优手段之SQL重写 + +除了上述干预SQL引擎所生成执行计划的执行性能外,根据数据库的SQL执行机制以及大量的实践发现,有些场景下,在保证客户业务SQL逻辑的前提下,通过一定规则由DBA重写SQL语句,可以大幅度的提升SQL语句的性能。 + +这种调优场景对DBA的要求比较高,需要对客户业务有足够的了解,同时也需要扎实的SQL语句基本功,后续会介绍几个常见的SQL改写场景。 + diff --git a/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md b/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md index 55f60f3a2..598606406 100644 --- a/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md +++ b/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md @@ -59,5 +59,5 @@ postgres=# DROP TABLE tpcds.table1; ## 相关链接 -[SAVEPOINT](SAVEPOINT.md#ZH-CN_TOPIC_0242370647),[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md#ZH-CN_TOPIC_0242370646) +[SAVEPOINT](SAVEPOINT.md),[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md) diff --git a/content/zh/docs/Developerguide/REPLICATION_SLOTS.md b/content/zh/docs/Developerguide/REPLICATION_SLOTS.md new file mode 100644 index 000000000..6ead24fd6 --- /dev/null +++ b/content/zh/docs/Developerguide/REPLICATION_SLOTS.md @@ -0,0 +1,88 @@ +# REPLICATION\_SLOTS + +REPLICATION\_SLOTS视图用于查看复制节点的信息。 + +**表 1** REPLICATION\_SLOTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

slot_name

+

text

+

复制节点的名称。

+

plugin

+

text

+

插件名称。

+

slot_type

+

text

+

复制节点的类型。

+

datoid

+

oid

+

复制节点的数据库OID。

+

database

+

name

+

复制节点的数据库名称。

+

active

+

boolean

+

复制节点是否为激活状态。

+

xmin

+

xid

+

复制节点事务标识。

+

catalog_xmin

+

xid

+

逻辑复制槽对应的最早解码事务标识。

+

restart_lsn

+

text

+

复制节点的Xlog文件信息。

+

dummy_standby

+

boolean

+

复制节点是否为假备。

+
+ diff --git a/content/zh/docs/Developerguide/REPLICATION_STAT.md b/content/zh/docs/Developerguide/REPLICATION_STAT.md new file mode 100644 index 000000000..a8a866fe8 --- /dev/null +++ b/content/zh/docs/Developerguide/REPLICATION_STAT.md @@ -0,0 +1,123 @@ +# REPLICATION\_STAT + +REPLICATION\_STAT用于描述日志同步状态信息,如发起端发送日志位置,收端接收日志位置等。 + +**表 1** REPLICATION\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

pid

+

bigint

+

线程的PID。

+

usesysid

+

oid

+

用户系统ID。

+

usename

+

name

+

用户名。

+

application_name

+

text

+

程序名称。

+

client_addr

+

inet

+

客户端地址。

+

client_hostname

+

text

+

客户端名。

+

client_port

+

integer

+

客户端端口。

+

backend_start

+

timestamp with time zone

+

程序启动时间。

+

state

+

text

+

日志复制的状态(追赶状态,还是一致的流状态)。

+

sender_sent_location

+

text

+

发送端发送日志位置。

+

receiver_write_location

+

text

+

接收端write日志位置。

+

receiver_flush_location

+

text

+

接收端flush日志位置。

+

receiver_replay_location

+

text

+

接收端replay日志位置。

+

sync_priority

+

integer

+

同步复制的优先级(0表示异步)。

+

sync_state

+

text

+

同步状态(异步复制,同步复制,还是潜在同步者)。

+
+ diff --git "a/content/zh/docs/Developerguide/RETURN-NEXT\345\217\212RETURN-QUERY.md" "b/content/zh/docs/Developerguide/RETURN-NEXT\345\217\212RETURN-QUERY.md" new file mode 100644 index 000000000..986214476 --- /dev/null +++ "b/content/zh/docs/Developerguide/RETURN-NEXT\345\217\212RETURN-QUERY.md" @@ -0,0 +1,64 @@ +# RETURN NEXT及RETURN QUERY + +## 语法 + +创建函数时需要指定返回值SETOF datatype。 + +return\_next\_clause::= + +![](figures/zh-cn_image_0253403489.png) + +return\_query\_clause::= + +![](figures/zh-cn_image_0253403490.png) + +对以上语法的解释如下: + +当需要函数返回一个集合时,使用RETURN NEXT或者RETURN QUERY向结果集追加结果,然后继续执行函数的下一条语句。随着后续的RETURN NEXT或RETURN QUERY命令的执行,结果集中会有多个结果。函数执行完成后会一起返回所有结果。 + +RETURN NEXT可用于标量和复合数据类型。 + +RETURN QUERY有一种变体RETURN QUERY EXECUTE,后面还可以增加动态查询,通过USING向查询插入参数。 + +## 示例 + +``` +postgres=# CREATE TABLE t1(a int); +postgres=# INSERT INTO t1 VALUES(1),(10); + +--RETURN NEXT +postgres=# CREATE OR REPLACE FUNCTION fun_for_return_next() RETURNS SETOF t1 AS $$ +DECLARE + r t1%ROWTYPE; +BEGIN + FOR r IN select * from t1 + LOOP + RETURN NEXT r; + END LOOP; + RETURN; +END; +$$ LANGUAGE PLPGSQL; +postgres=# call fun_for_return_next(); + a +--- + 1 + 10 +(2 rows) + +-- RETURN QUERY +postgres=# CREATE OR REPLACE FUNCTION fun_for_return_query() RETURNS SETOF t1 AS $$ +DECLARE + r t1%ROWTYPE; +BEGIN + RETURN QUERY select * from t1; +END; +$$ +language plpgsql; +postgres=# call fun_for_return_query(); + a +--- + 1 + 10 +(2 rows) +``` + diff --git a/content/zh/docs/Developerguide/RETURN.md b/content/zh/docs/Developerguide/RETURN.md new file mode 100644 index 000000000..ddfb2c42c --- /dev/null +++ b/content/zh/docs/Developerguide/RETURN.md @@ -0,0 +1,17 @@ +# RETURN + +## 语法 + +返回语句的语法请参见[图1](#zh-cn_topic_0237122231_zh-cn_topic_0059778007_f7ff63e01e2a840c69a1c17b91e7dc3eb)。 + +**图 1** return\_clause::= +![](figures/return_clause.jpg "return_clause") + +对以上语法的解释如下: + +用于将控制从存储过程或函数返回给调用者。 + +## 示例 + +请参见调用语句的[示例](调用语句.md#zh-cn_topic_0237122223_zh-cn_topic_0059778001_scfc5c5fdac3e4a11a915ebac95b49f79)。 + diff --git a/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md b/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md index afaceb70e..5abfea6b7 100644 --- a/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md +++ b/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md @@ -24,5 +24,5 @@ ROLLBACK PREPARED transaction_id ; ## 相关链接 -[COMMIT PREPARED](COMMIT-PREPARED.md#ZH-CN_TOPIC_0242370559),[PREPARE TRANSACTION](PREPARE-TRANSACTION.md#ZH-CN_TOPIC_0242370636)。 +[COMMIT PREPARED](COMMIT-PREPARED.md),[PREPARE TRANSACTION](PREPARE-TRANSACTION.md)。 diff --git a/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md b/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md index bef789e31..20280d2ae 100644 --- a/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md +++ b/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md @@ -49,5 +49,5 @@ postgres=# COMMIT; ## 相关链接 -[SAVEPOINT](SAVEPOINT.md#ZH-CN_TOPIC_0242370647),[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md#ZH-CN_TOPIC_0242370641) +[SAVEPOINT](SAVEPOINT.md),[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md) diff --git a/content/zh/docs/Developerguide/ROLLBACK.md b/content/zh/docs/Developerguide/ROLLBACK.md index c6fc014ab..8431148e2 100644 --- a/content/zh/docs/Developerguide/ROLLBACK.md +++ b/content/zh/docs/Developerguide/ROLLBACK.md @@ -8,7 +8,7 @@ ## 注意事项 -如果不在一个事务内部发出ROLLBACK不会有问题,但是将抛出一个警告信息。 +如果不在一个事务内部发出ROLLBACK不会有问题,但是将抛出一个NOTICE信息。 ## 语法格式 diff --git "a/content/zh/docs/Developerguide/Retry\347\256\241\347\220\206.md" "b/content/zh/docs/Developerguide/Retry\347\256\241\347\220\206.md" new file mode 100644 index 000000000..2c5f19832 --- /dev/null +++ "b/content/zh/docs/Developerguide/Retry\347\256\241\347\220\206.md" @@ -0,0 +1,21 @@ +# Retry管理 + +Retry是数据库在SQL或存储过程(包含匿名块)执行失败时,在数据库内部进行重新执行的过程,以提高执行成功率和用户体验。数据库内部通过检查发生错误时的错误码及Retry相关配置,决定是否进行重试。 + +- 失败时回滚之前执行的语句,并重新执行存储过程进行Retry。 + + 示例: + + ``` + postgres=# CREATE OR REPLACE PROCEDURE retry_basic ( IN x INT) + AS + BEGIN + INSERT INTO t1 (a) VALUES (x); + INSERT INTO t1 (a) VALUES (x+1); + END; + / + + postgres=# CALL retry_basic(1); + ``` + + diff --git a/content/zh/docs/Developerguide/SAVEPOINT.md b/content/zh/docs/Developerguide/SAVEPOINT.md index e7c7fb0c6..a51bb1913 100644 --- a/content/zh/docs/Developerguide/SAVEPOINT.md +++ b/content/zh/docs/Developerguide/SAVEPOINT.md @@ -89,5 +89,5 @@ postgres=# DROP TABLE table2; ## 相关链接 -[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md#ZH-CN_TOPIC_0242370641),[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md#ZH-CN_TOPIC_0242370646) +[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md),[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md) diff --git "a/content/zh/docs/Developerguide/SEQUENCE\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/SEQUENCE\345\207\275\346\225\260.md" index 67b12ab58..ad9bab787 100644 --- "a/content/zh/docs/Developerguide/SEQUENCE\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/SEQUENCE\345\207\275\346\225\260.md" @@ -9,9 +9,12 @@ >![](public_sys-resources/icon-note.gif) **说明:** >为了避免从同一个序列获取值的并发事务被阻塞, nextval操作不会回滚;也就是说,一旦一个值已经被抓取, 那么就认为它已经被用过了,并且不会再被返回。 即使该操作处于事务中,当事务之后中断,或者如果调用查询结束不使用该值,也是如此。这种情况将在指定值的顺序中留下未使用的"空洞"。 因此,openGauss序列对象不能用于获得"无间隙"序列。 + >![](public_sys-resources/icon-notice.gif) **须知:** + >nextval函数只能在主机上执行,备机不支持执行此函数。 + 返回类型:bigint - nextval函数有两种调用方式(其中第二种调用方式兼容A DB的语法,目前不支持Sequence命名中有特殊字符"."的情况),如下: + nextval函数有两种调用方式(其中第二种调用方式目前不支持Sequence命名中有特殊字符"."的情况),如下: 示例1: @@ -35,11 +38,11 @@ - currval\(regclass\) - 返回当前会话里最近一次nextval返回的指定的sequence的数值。如果当前会话还没有调用过指定的sequence的nextval,那么调用currval将会报错。需要注意的是,这个函数在默认情况下是不支持的,需要通过设置enable\_beta\_features为true之后,才能使用这个函数。 + 返回当前会话里最近一次nextval返回的指定的sequence的数值。如果当前会话还没有调用过指定的sequence的nextval,那么调用currval将会报错。 返回类型:bigint - currval函数有两种调用方式(其中第二种调用方式兼容A DB的语法,目前不支持Sequence命名中有特殊字符"."的情况),如下: + currval函数有两种调用方式(其中第二种调用方式目前不支持Sequence命名中有特殊字符"."的情况),如下: 示例1: @@ -65,8 +68,6 @@ 描述:返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 - 需要注意的是,这个函数在默认情况下是不支持的,需要通过设置enable\_beta\_features或者lastval\_supported为true之后,才能使用这个函数。 - 返回类型:bigint 示例: @@ -112,7 +113,10 @@ ``` >![](public_sys-resources/icon-note.gif) **说明:** - >Setval后当前会话及GTM上会立刻生效,但如果其他会话有缓存的序列值,只能等到缓存值用尽才能感知Setval的作用。所以为了避免序列值冲突,setval要谨慎使用。 + >Setval后当前会话会立刻生效,但如果其他会话有缓存的序列值,只能等到缓存值用尽才能感知Setval的作用。所以为了避免序列值冲突,setval要谨慎使用。 >因为序列是非事务的,setval造成的改变不会由于事务的回滚而撤销。 + >![](public_sys-resources/icon-notice.gif) **须知:** + >nextval函数只能在主机上执行,备机不支持执行此函数。 + diff --git a/content/zh/docs/Developerguide/SESSION_CPU_RUNTIME.md b/content/zh/docs/Developerguide/SESSION_CPU_RUNTIME.md new file mode 100644 index 000000000..233483849 --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_CPU_RUNTIME.md @@ -0,0 +1,88 @@ +# SESSION\_CPU\_RUNTIME + +SESSION\_CPU\_RUNTIME视图显示和当前用户执行复杂作业(正在运行)时的负载管理CPU使用的信息。 + +**表 1** SESSION\_CPU\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据库OID。

+

usename

+

name

+

登录到该后端的用户名。

+

pid

+

bigint

+

后端线程ID。

+

start_time

+

timestamp with time zone

+

语句执行的开始时间。

+

min_cpu_time

+

bigint

+

语句在数据库节点上的最小CPU时间,单位为ms。

+

max_cpu_time

+

bigint

+

语句在数据库节点上的最大CPU时间,单位为ms。

+

total_cpu_time

+

bigint

+

语句在数据库节点上的CPU总时间,单位为ms。

+

query

+

text

+

正在执行的语句。

+

node_group

+

text

+

语句所属用户对应的逻辑openGauss。

+

top_cpu_dn

+

text

+

cpu使用量topN信息。

+
+ diff --git a/content/zh/docs/Developerguide/SESSION_MEMORY.md b/content/zh/docs/Developerguide/SESSION_MEMORY.md new file mode 100644 index 000000000..ee5ca575b --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_MEMORY.md @@ -0,0 +1,46 @@ +# SESSION\_MEMORY + +统计Session级别的内存使用情况,包含执行作业在数据节点上Postgres线程和Stream线程分配的所有内存,单位为MB。 + +**表 1** SESSION\_MEMORY字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

线程启动时间+线程标识。

+

init_mem

+

integer

+

当前正在执行作业进入执行器前已分配的内存。

+

used_mem

+

integer

+

当前正在执行作业已分配的内存。

+

peak_mem

+

integer

+

当前正在执行作业已分配的内存峰值。

+
+ diff --git a/content/zh/docs/Developerguide/SESSION_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/SESSION_MEMORY_DETAIL.md new file mode 100644 index 000000000..2113cead5 --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_MEMORY_DETAIL.md @@ -0,0 +1,74 @@ +# SESSION\_MEMORY\_DETAIL + +统计线程的内存使用情况,以MemoryContext节点来统计。 + +**表 1** SESSION\_MEMORY\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

线程启动时间+线程标识。

+

sesstype

+

text

+

线程名称。

+

contextname

+

text

+

内存上下文名称。

+

level

+

smallint

+

内存上下文的重要级别。

+

parent

+

text

+

父级内存上下文名称。

+

totalsize

+

bigint

+

总申请内存大小(单位:字节)。

+

freesize

+

bigint

+

空闲内存大小(单位:字节)。

+

usedsize

+

bigint

+

使用内存大小(单位:字节)。

+
+ diff --git a/content/zh/docs/Developerguide/SESSION_MEMORY_RUNTIME.md b/content/zh/docs/Developerguide/SESSION_MEMORY_RUNTIME.md new file mode 100644 index 000000000..00aba1813 --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_MEMORY_RUNTIME.md @@ -0,0 +1,89 @@ +# SESSION\_MEMORY\_RUNTIME + +SESSION\_MEMORY\_RUNTIME视图显示和当前用户执行复杂作业正在运行时的负载管理内存使用的信息。 + +**表 1** SESSION\_MEMORY\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据库OID。

+

usename

+

name

+

登录到该后端的用户名。

+

pid

+

bigint

+

后端线程ID。

+

start_time

+

timestamp with time zone

+

语句执行的开始时间。

+

min_peak_memory

+

integer

+

语句在数据库节点上的最小内存峰值大小,单位MB。

+

max_peak_memory

+

integer

+

语句在数据库节点上的最大内存峰值大小,单位MB。

+

spill_info

+

text

+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘
  • All:数据库节点均下盘
  • [a:b]:数量为b个数据库节点中有a个数据库节点下盘
+
+

query

+

text

+

正在执行的语句。

+

node_group

+

text

+

语句所属用户对应的逻辑openGauss。

+

top_mem_dn

+

text

+

mem使用量topN信息。

+
+ diff --git a/content/zh/docs/Developerguide/SESSION_STAT.md b/content/zh/docs/Developerguide/SESSION_STAT.md new file mode 100644 index 000000000..5d716e3a0 --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_STAT.md @@ -0,0 +1,53 @@ +# SESSION\_STAT + +当前节点以会话线程或AutoVacuum线程为单位,统计会话状态信息。 + +**表 1** SESSION\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

线程启动时间+线程标识。

+

statid

+

integer

+

统计编号。

+

statname

+

text

+

统计会话名称。

+

statunit

+

text

+

统计会话单位。

+

value

+

bigint

+

统计会话值。

+
+ diff --git a/content/zh/docs/Developerguide/SESSION_STAT_ACTIVITY.md b/content/zh/docs/Developerguide/SESSION_STAT_ACTIVITY.md new file mode 100644 index 000000000..3679be5bc --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_STAT_ACTIVITY.md @@ -0,0 +1,164 @@ +# SESSION\_STAT\_ACTIVITY + +显示当前节点上正在运行的线程相关的信息。 + +**表 1** SESSION\_STAT\_ACTIVITY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

用户会话在后台连接到的数据库OID。

+

datname

+

name

+

用户会话在后台连接到的数据库名称。

+

pid

+

bigint

+

后台线程ID。

+

usesysid

+

oid

+

登录该后台的用户OID。

+

usename

+

name

+

登录该后台的用户名。

+

application_name

+

text

+

连接到该后台的应用名。

+

client_addr

+

inet

+

连接到该后台的客户端的IP地址。如果此字段是null,它表明通过服务器机器上UNIX套接字连接客户端或者这是内部进程,如autovacuum。

+

client_hostname

+

text

+

客户端的主机名,这个字段是通过client_addr的反向DNS查找得到。这个字段只有在启动log_hostname且使用IP连接时才非空。

+

client_port

+

integer

+

客户端用于与后台通讯的TCP端口号,如果使用Unix套接字,则为-1。

+

backend_start

+

timestampwith time zone

+

该过程开始的时间,即当客户端连接服务器时间。

+

xact_start

+

timestampwith time zone

+

启动当前事务的时间,如果没有事务是活跃的,则为null。如果当前查询是首个事务,则这列等同于query_start列。

+

query_start

+

timestampwith time zone

+

开始当前活跃查询的时间,如果state的值不是active,则这个值是上一个查询的开始时间。

+

state_change

+

timestampwith time zone

+

上次状态改变的时间。

+

waiting

+

boolean

+

如果后台当前正等待锁则为true。

+

enqueue

+

text

+

该字段不支持

+

+

state

+

text

+
该后台当前总体状态。可能值是:
  • active:后台正在执行一个查询。
  • idle:后台正在等待一个新的客户端命令。
  • idle in transaction:后台在事务中,但是目前无法执行查询。
  • idle in transaction (aborted):这个状态除说明事务中有某个语句导致了错误外,类似于idle in transaction
  • fastpath function call:后台正在执行一个fast-path函数。
  • disabled:如果后台禁用track_activities,则报告这个状态。
    说明:

    普通用户只能查看到自己帐户所对应的会话状态。即其他帐户的state信息为空。例如以judy用户连接数据库后,在pg_stat_activity中查看到的普通用户joe及初始用户omm的state信息为空:

    +

    postgres=# SELECT datname, usename, usesysid,state,pid FROM pg_stat_activity;

    +

    datname | usename | usesysid | state | pid

    +

    ----------+---------+----------+--------+-----------------postgres | omm | 10 | |139968752121616

    +

    postgres | omm | 10 | |139968903116560

    +

    db_tpcds | judy | 16398 | active |139968391403280

    +

    postgres | omm | 10 | |139968643069712

    +

    postgres | omm | 10 | |139968680818448

    +

    postgres | joe | 16390 | |139968563377936

    +

    (6 rows)

    +
    +
+
+

resource_pool

+

name

+

用户使用的资源池。

+

query_id

+

bigint

+

查询语句的ID。

+

query

+

text

+

该后台的最新查询。如果state状态是active(活跃的),此字段显示当前正在执行的查询。所有其他情况表示上一个查询。

+
+ diff --git a/content/zh/docs/Developerguide/SESSION_TIME.md b/content/zh/docs/Developerguide/SESSION_TIME.md new file mode 100644 index 000000000..e0c929e79 --- /dev/null +++ b/content/zh/docs/Developerguide/SESSION_TIME.md @@ -0,0 +1,46 @@ +# SESSION\_TIME + +用于统计当前节点会话线程的运行时间信息,及各执行阶段所消耗时间。 + +**表 1** SESSION\_TIME字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

线程启动时间+线程标识。

+

stat_id

+

integer

+

统计编号。

+

stat_name

+

text

+

会话类型名称。

+

value

+

bigint

+

会话值。

+
+ diff --git a/content/zh/docs/Developerguide/SET-CONSTRAINTS.md b/content/zh/docs/Developerguide/SET-CONSTRAINTS.md index 9e8b1c29c..5cbd6f866 100644 --- a/content/zh/docs/Developerguide/SET-CONSTRAINTS.md +++ b/content/zh/docs/Developerguide/SET-CONSTRAINTS.md @@ -12,7 +12,7 @@ IMMEDIATE约束是在每条语句后面进行检查。DEFERRED约束一直到事 当SET CONSTRAINTS把一个约束从DEFERRED改成IMMEDIATE的时候,新模式反作用式地起作用:任何将在事务结束准备进行的数据修改都将在SET CONSTRAINTS的时候执行检查。如果违反了任何约束,SET CONSTRAINTS都会失败(并且不会修改约束模式)。因此,SET CONSTRAINTS可以用于强制在事务中某一点进行约束检查。 -目前,只有外键约束被该设置影响。检查和唯一约束总是不可推迟的。 +检查和唯一约束总是不可推迟的。 ## 注意事项 diff --git a/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md b/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md index 782582dd9..7ec4c6e85 100644 --- a/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md +++ b/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md @@ -72,5 +72,5 @@ postgres=# DROP USER paul; ## 相关参考 -[SET ROLE](SET-ROLE.md#ZH-CN_TOPIC_0242370652) +[SET ROLE](SET-ROLE.md) diff --git a/content/zh/docs/Developerguide/SET-TRANSACTION.md b/content/zh/docs/Developerguide/SET-TRANSACTION.md index 0cb5566c2..57518249f 100644 --- a/content/zh/docs/Developerguide/SET-TRANSACTION.md +++ b/content/zh/docs/Developerguide/SET-TRANSACTION.md @@ -14,7 +14,7 @@ ``` { SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION } - { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ``` @@ -30,17 +30,16 @@ 取值范围:字符串,要符合标识符的命名规范。 -- **ISOLATION\_LEVEL\_CLAUSE** +- **ISOLATION\_LEVEL** 指定事务隔离级别,该参数决定当一个事务中存在其他并发运行事务时能够看到什么数据。 >![](public_sys-resources/icon-note.gif) **说明:** - >- 在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 + >在事务中第一个数据修改语句(SELECT,INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 取值范围: - READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 - - READ UNCOMMITTED:读未提交隔离级别,可能会读到未提交的数据。建议这种隔离级别下仅作只读操作,避免造成数据不一致。 - REPEATABLE READ:可重复读隔离级别,仅仅能看到事务开始之前提交的数据,不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 - SERIALIZABLE:openGauss目前功能上不支持此隔离级别,等价于REPEATABLE READ。 diff --git a/content/zh/docs/Developerguide/SHARED_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/SHARED_MEMORY_DETAIL.md new file mode 100644 index 000000000..62ed5e581 --- /dev/null +++ b/content/zh/docs/Developerguide/SHARED_MEMORY_DETAIL.md @@ -0,0 +1,60 @@ +# SHARED\_MEMORY\_DETAIL + +查询当前节点所有已产生的共享内存上下文的使用信息。 + +**表 1** SHARED\_MEMORY\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

contextname

+

text

+

内存上下文的名称。

+

level

+

smallint

+

内存上下文的级别。

+

parent

+

text

+

上级内存上下文。

+

totalsize

+

bigint

+

共享内存总大小(单位:字节)。

+

freesize

+

bigint

+

共享内存剩余大小(单位:字节)。

+

usedsize

+

bigint

+

共享内存使用大小(单位:字节)。

+
+ diff --git a/content/zh/docs/Developerguide/SNAPSHOT-SNAPSHOT.md b/content/zh/docs/Developerguide/SNAPSHOT-SNAPSHOT.md new file mode 100644 index 000000000..373100888 --- /dev/null +++ b/content/zh/docs/Developerguide/SNAPSHOT-SNAPSHOT.md @@ -0,0 +1,47 @@ +# SNAPSHOT.SNAPSHOT + +SNAPSHOT表记录当前系统中存储的WDR 快照数据的索引信息,开始,结束时间。 + +**表 1** SNAPSHOT表属性 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

示例

+

snapshot_id

+

bigint

+

WDR快照序号。

+

1

+

start_ts

+

timestamp

+

WDR快照的开始时间。

+

2019-12-28 17:11:27.423742+08

+

end_ts

+

timestamp

+

WDR快照的结束时间。

+

2019-12-28 17:11:43.67726+08

+
+ diff --git a/content/zh/docs/Developerguide/SNAPSHOT-TABLES_SNAP_TIMESTAMP.md b/content/zh/docs/Developerguide/SNAPSHOT-TABLES_SNAP_TIMESTAMP.md new file mode 100644 index 000000000..0d3e4b455 --- /dev/null +++ b/content/zh/docs/Developerguide/SNAPSHOT-TABLES_SNAP_TIMESTAMP.md @@ -0,0 +1,65 @@ +# SNAPSHOT.TABLES\_SNAP\_TIMESTAMP + +TABLES\_SNAP\_TIMESTAMP表记录所有存储的WDR snapshot中数据库,表对象,数据采集的开始,结束时间。 + +**表 1** TABLES\_SNAP\_TIMESTAMP表属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

示例

+

snapshot_id

+

bigint

+

WDR快照序号。

+

1

+

db_name

+

text

+

WDR snapshot对应的database。

+

tpcc1000

+

tablename

+

text

+

WDR snasphot对应的table。

+

snap_xc_statio_all_indexes

+

start_ts

+

timestamp

+

WDR快照的开始时间。

+

2019-12-28 17:11:27.425849+08

+

end_ts

+

timestamp

+

WDR快照的结束时间。

+

2019-12-28 17:11:27.707398+08

+
+ diff --git a/content/zh/docs/Developerguide/SQLAllocConnect.md b/content/zh/docs/Developerguide/SQLAllocConnect.md index c7299f9e0..2a9c6afce 100644 --- a/content/zh/docs/Developerguide/SQLAllocConnect.md +++ b/content/zh/docs/Developerguide/SQLAllocConnect.md @@ -1,4 +1,4 @@ # SQLAllocConnect -在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocConnect已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md#ZH-CN_TOPIC_0242371438)。 +在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocConnect已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md)。 diff --git a/content/zh/docs/Developerguide/SQLAllocEnv.md b/content/zh/docs/Developerguide/SQLAllocEnv.md index 193f707f2..5bcbac38f 100644 --- a/content/zh/docs/Developerguide/SQLAllocEnv.md +++ b/content/zh/docs/Developerguide/SQLAllocEnv.md @@ -1,4 +1,4 @@ # SQLAllocEnv -在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocEnv已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md#ZH-CN_TOPIC_0242371438)。 +在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocEnv已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md)。 diff --git a/content/zh/docs/Developerguide/SQLAllocHandle.md b/content/zh/docs/Developerguide/SQLAllocHandle.md index 61075aa1f..09a3338d3 100644 --- a/content/zh/docs/Developerguide/SQLAllocHandle.md +++ b/content/zh/docs/Developerguide/SQLAllocHandle.md @@ -53,9 +53,9 @@ SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType, ## 注意事项 -当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL\_ERROR,则它会将OutputHandlePtr的值设置为SQL\_NULL\_HDBC、SQL\_NULL\_HSTMT或SQL\_NULL\_HDESC。之后,通过调用带有适当参数的[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454),其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL\_ERROR,则它会将OutputHandlePtr的值设置为SQL\_NULL\_HDBC、SQL\_NULL\_HSTMT或SQL\_NULL\_HDESC。之后,通过调用带有适当参数的[SQLGetDiagRec](SQLGetDiagRec.md),其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLAllocStmt.md b/content/zh/docs/Developerguide/SQLAllocStmt.md index 9bb5f3f90..ae101f65a 100644 --- a/content/zh/docs/Developerguide/SQLAllocStmt.md +++ b/content/zh/docs/Developerguide/SQLAllocStmt.md @@ -1,4 +1,4 @@ # SQLAllocStmt -在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocStmt已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md#ZH-CN_TOPIC_0242371438)。 +在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocStmt已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md)。 diff --git a/content/zh/docs/Developerguide/SQLBindCol.md b/content/zh/docs/Developerguide/SQLBindCol.md index f377c558c..fc286d0e2 100644 --- a/content/zh/docs/Developerguide/SQLBindCol.md +++ b/content/zh/docs/Developerguide/SQLBindCol.md @@ -11,8 +11,8 @@ SQLRETURN SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, - SQLINTEGER BufferLength, - SQLINTEGER *StrLen_or_IndPtr); + SQLLEN BufferLength, + SQLLEN *StrLen_or_IndPtr); ``` ## 参数 @@ -68,9 +68,9 @@ SQLRETURN SQLBindCol(SQLHSTMT StatementHandle, ## 注意事项 -当SQLBindCol返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLBindCol返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLBindParameter.md b/content/zh/docs/Developerguide/SQLBindParameter.md index 85dee6214..e6a6bb197 100644 --- a/content/zh/docs/Developerguide/SQLBindParameter.md +++ b/content/zh/docs/Developerguide/SQLBindParameter.md @@ -12,11 +12,11 @@ SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle, SQLSMALLINT InputOutputType, SQLSMALLINT ValuetType, SQLSMALLINT ParameterType, - SQLSMALLINT ColumnSize, + SQLULEN ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, - SQLINTEGER BufferLength, - SQLINTEGER *StrLen_or_IndPtr); + SQLLEN BufferLength, + SQLLEN *StrLen_or_IndPtr); ``` ## 参数 @@ -92,9 +92,9 @@ SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle, ## 注意事项 -当SQLBindCol返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLBindParameter返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLColAttribute.md b/content/zh/docs/Developerguide/SQLColAttribute.md index 1f52d6e53..bb92a7ad7 100644 --- a/content/zh/docs/Developerguide/SQLColAttribute.md +++ b/content/zh/docs/Developerguide/SQLColAttribute.md @@ -13,7 +13,7 @@ SQLRETURN SQLColAttibute(SQLHSTMT StatementHandle, SQLPOINTER CharacterAtrriburePtr, SQLSMALLINT BufferLength, SQLSMALLINT *StringLengthPtr, - SQLPOINTE NumericAttributePtr); + SQLLEN *NumericAttributePtr); ``` ## 参数 @@ -74,9 +74,9 @@ SQLRETURN SQLColAttibute(SQLHSTMT StatementHandle, ## 注意事项 -当SQLColAttribute返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLColAttribute返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLConnect.md b/content/zh/docs/Developerguide/SQLConnect.md index 4bf400341..0fdfbb6d6 100644 --- a/content/zh/docs/Developerguide/SQLConnect.md +++ b/content/zh/docs/Developerguide/SQLConnect.md @@ -75,9 +75,9 @@ SQLRETURN SQLConnect(SQLHDBC ConnectionHandle, ## 注意事项 -当调用SQLConnect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当调用SQLConnect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLDisconnect.md b/content/zh/docs/Developerguide/SQLDisconnect.md index dd5fa6280..93bea4108 100644 --- a/content/zh/docs/Developerguide/SQLDisconnect.md +++ b/content/zh/docs/Developerguide/SQLDisconnect.md @@ -38,9 +38,9 @@ SQLRETURN SQLDisconnect(SQLHDBC ConnectionHandle); ## 注意事项 -当调用SQLDisconnect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当调用SQLDisconnect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLExecDirect.md b/content/zh/docs/Developerguide/SQLExecDirect.md index 81e528765..8e1e16b56 100644 --- a/content/zh/docs/Developerguide/SQLExecDirect.md +++ b/content/zh/docs/Developerguide/SQLExecDirect.md @@ -53,9 +53,9 @@ SQLRETURN SQLExecDirect(SQLHSTMT StatementHandle, ## 注意事项 -当调用SQLExecDirect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当调用SQLExecDirect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLExecute.md b/content/zh/docs/Developerguide/SQLExecute.md index 6a8bbbc99..d3f124942 100644 --- a/content/zh/docs/Developerguide/SQLExecute.md +++ b/content/zh/docs/Developerguide/SQLExecute.md @@ -41,9 +41,9 @@ SQLRETURN SQLExecute(SQLHSTMT StatementHandle); ## 注意事项 -当SQLExecute函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,可通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLExecute函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,可通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLFetch.md b/content/zh/docs/Developerguide/SQLFetch.md index 95e8b263b..f81744555 100644 --- a/content/zh/docs/Developerguide/SQLFetch.md +++ b/content/zh/docs/Developerguide/SQLFetch.md @@ -40,9 +40,9 @@ SQLRETURN SQLFetch(SQLHSTMT StatementHandle); ## 注意事项 -当调用SQLFetch函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当调用SQLFetch函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLFreeConnect.md b/content/zh/docs/Developerguide/SQLFreeConnect.md index 3b9d2dd6e..62b03fac4 100644 --- a/content/zh/docs/Developerguide/SQLFreeConnect.md +++ b/content/zh/docs/Developerguide/SQLFreeConnect.md @@ -1,4 +1,4 @@ # SQLFreeConnect -在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeConnect已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md#ZH-CN_TOPIC_0242371450)。 +在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeConnect已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md)。 diff --git a/content/zh/docs/Developerguide/SQLFreeEnv.md b/content/zh/docs/Developerguide/SQLFreeEnv.md index e3614790f..e8b6397b9 100644 --- a/content/zh/docs/Developerguide/SQLFreeEnv.md +++ b/content/zh/docs/Developerguide/SQLFreeEnv.md @@ -1,4 +1,4 @@ # SQLFreeEnv -在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeEnv已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md#ZH-CN_TOPIC_0242371450)。 +在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeEnv已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md)。 diff --git a/content/zh/docs/Developerguide/SQLFreeHandle.md b/content/zh/docs/Developerguide/SQLFreeHandle.md index 827b6e1e2..645e58863 100644 --- a/content/zh/docs/Developerguide/SQLFreeHandle.md +++ b/content/zh/docs/Developerguide/SQLFreeHandle.md @@ -50,5 +50,5 @@ SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType, ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLFreeStmt.md b/content/zh/docs/Developerguide/SQLFreeStmt.md index fcc06bc8e..0be4250f0 100644 --- a/content/zh/docs/Developerguide/SQLFreeStmt.md +++ b/content/zh/docs/Developerguide/SQLFreeStmt.md @@ -1,4 +1,4 @@ # SQLFreeStmt -在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeStmt已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md#ZH-CN_TOPIC_0242371450)。 +在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeStmt已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md)。 diff --git a/content/zh/docs/Developerguide/SQLGetData.md b/content/zh/docs/Developerguide/SQLGetData.md index d720560cc..5fc5a161a 100644 --- a/content/zh/docs/Developerguide/SQLGetData.md +++ b/content/zh/docs/Developerguide/SQLGetData.md @@ -70,9 +70,9 @@ SQLRETURN SQLGetData(SQLHSTMT StatementHandle, ## 注意事项 -当调用SQLFetch函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数分别设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当调用SQLGetData函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数分别设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLGetDiagRec.md b/content/zh/docs/Developerguide/SQLGetDiagRec.md index f6f5ae63c..dcc1a2eb5 100644 --- a/content/zh/docs/Developerguide/SQLGetDiagRec.md +++ b/content/zh/docs/Developerguide/SQLGetDiagRec.md @@ -155,5 +155,5 @@ SQLGetDiagRec不发布自己的诊断记录。它用下列返回值来报告它 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLPrepare.md b/content/zh/docs/Developerguide/SQLPrepare.md index eedc796ba..179ee5dd7 100644 --- a/content/zh/docs/Developerguide/SQLPrepare.md +++ b/content/zh/docs/Developerguide/SQLPrepare.md @@ -51,9 +51,9 @@ SQLRETURN SQLPrepare(SQLHSTMT StatementHandle, ## 注意事项 -当SQLPrepare返回的值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数分别设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLPrepare返回的值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md)函数,并将HandleType和Handle参数分别设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLSetConnectAttr.md b/content/zh/docs/Developerguide/SQLSetConnectAttr.md index db4f85d73..37763929d 100644 --- a/content/zh/docs/Developerguide/SQLSetConnectAttr.md +++ b/content/zh/docs/Developerguide/SQLSetConnectAttr.md @@ -56,9 +56,9 @@ SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle ## 注意事项 -当SQLSetConnectAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_DBC的HandleType和ConnectionHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLSetConnectAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_DBC的HandleType和ConnectionHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLSetEnvAttr.md b/content/zh/docs/Developerguide/SQLSetEnvAttr.md index bd3551d45..41259509b 100644 --- a/content/zh/docs/Developerguide/SQLSetEnvAttr.md +++ b/content/zh/docs/Developerguide/SQLSetEnvAttr.md @@ -57,9 +57,9 @@ SQLRETURN SQLSetEnvAttr(SQLHENV EnvironmentHandle ## 注意事项 -当SQLSetEnvAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_ENV的HandleType和EnvironmentHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLSetEnvAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_ENV的HandleType和EnvironmentHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git a/content/zh/docs/Developerguide/SQLSetStmtAttr.md b/content/zh/docs/Developerguide/SQLSetStmtAttr.md index c080ea01b..fb958e2f7 100644 --- a/content/zh/docs/Developerguide/SQLSetStmtAttr.md +++ b/content/zh/docs/Developerguide/SQLSetStmtAttr.md @@ -56,9 +56,9 @@ SQLRETURN SQLSetStmtAttr(SQLHSTMT StatementHandle ## 注意事项 -当SQLSetStmtAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_STMT的HandleType和StatementHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 +当SQLSetStmtAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_STMT的HandleType和StatementHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 ## 示例 -参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) +参见:[示例](示例-2.md) diff --git "a/content/zh/docs/Developerguide/SQL\345\217\202\350\200\203.md" "b/content/zh/docs/Developerguide/SQL\345\217\202\350\200\203.md" index 5599c7dfd..639bee67c 100644 --- "a/content/zh/docs/Developerguide/SQL\345\217\202\350\200\203.md" +++ "b/content/zh/docs/Developerguide/SQL\345\217\202\350\200\203.md" @@ -28,6 +28,6 @@ - **[SQL语法](SQL语法.md)** -- **[附录](附录-16.md)** +- **[附录](附录.md)** diff --git "a/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\344\273\213\347\273\215.md" "b/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\344\273\213\347\273\215.md" new file mode 100644 index 000000000..22c4793e8 --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\344\273\213\347\273\215.md" @@ -0,0 +1,7 @@ +# SQL执行计划介绍 + +- **[SQL执行计划概述](SQL执行计划概述.md)** + +- **[详解](详解.md)** + + diff --git "a/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\346\246\202\350\277\260.md" new file mode 100644 index 000000000..dc4aee149 --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\346\211\247\350\241\214\350\256\241\345\210\222\346\246\202\350\277\260.md" @@ -0,0 +1,27 @@ +# SQL执行计划概述 + +SQL执行计划是一个节点树,显示openGauss执行一条SQL语句时执行的详细步骤。每一个步骤为一个数据库运算符。 + +使用EXPLAIN命令可以查看优化器为每个查询生成的具体执行计划。EXPLAIN给每个执行节点都输出一行,显示基本的节点类型和优化器为执行这个节点预计的开销值。如[图1](#zh-cn_topic_0237121510_zh-cn_topic_0073548187_zh-cn_topic_0040046537_fig27100601101634)所示。 + +**图 1** SQL执行计划示例 +![](figures/SQL执行计划示例.png "SQL执行计划示例") + +- 最底层节点是表扫描节点,它扫描表并返回原始数据行。不同的表访问模式有不同的扫描节点类型:顺序扫描、索引扫描等。最底层节点的扫描对象也可能是非表行数据(不是直接从表中读取的数据),如VALUES子句和返回行集的函数,它们有自己的扫描节点类型。 +- 如果查询需要连接、聚集、排序、或者对原始行做其它操作,那么就会在扫描节点之上添加其它节点。 并且这些操作通常都有多种方法,因此在这些位置也有可能出现不同的执行节点类型。 +- 第一行\(最上层节点\)是执行计划总执行开销的预计。这个数值就是优化器试图最小化的数值。 + +## 执行计划显示信息 + +除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见[EXPLAIN](EXPLAIN.md)语法说明。 + +- EXPLAIN _statement_: 只生成执行计划,不实际执行。其中statement代表SQL语句。 +- EXPLAIN ANALYZE _statement_:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间\(以毫秒计\)和它实际返回的行数。 +- EXPLAIN PERFORMANCE _statement_:生成执行计划,进行执行,并显示执行期间的全部信息。 + +为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显的花费更多的时间。超支的数量依赖于查询的本质和使用的平台。 + +因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精准地定位问题原因。 + +EXPLAIN PERFORMANCE轻量化执行方式与EXPLAIN PERFORMANCE保持一致,在原来的基础上减少了性能分析的时间,执行时间与SQL执行时间的差异显著减少。 + diff --git "a/content/zh/docs/Developerguide/SQL\350\207\252\350\257\212\346\226\255.md" "b/content/zh/docs/Developerguide/SQL\350\207\252\350\257\212\346\226\255.md" new file mode 100644 index 000000000..5712b5071 --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\350\207\252\350\257\212\346\226\255.md" @@ -0,0 +1,54 @@ +# SQL自诊断 + +用户在执行查询或者执行INSERT/DELETE/UPDATE/CREATE TABLE AS语句时,可能会遇到性能问题。这种情况下,通过查询[GS\_WLM\_SESSION\_STATISTICS](GS_WLM_SESSION_STATISTICS.md),[GS\_WLM\_SESSION\_HISTORY](GS_WLM_SESSION_HISTORY.md),[GS\_WLM\_SESSION\_QUERY\_INFO\_ALL](GS_WLM_SESSION_QUERY_INFO_ALL.md)视图的warning字段可以获得对应查询可能导致性能问题的告警信息,为性能调优提供参考。 + +SQL自诊断的告警类型与[resource\_track\_level](负载管理.md#zh-cn_topic_0237124729_section153571329142612)的设置有关系。如果resource\_track\_level设置为query,则可以诊断多列/单列统计信息未收集和SQL不下推的告警。如果resource\_track\_level设置为operator,则可以诊断所有的告警场景。 + +SQL自诊断的诊断范围与[resource\_track\_cost](负载管理.md#zh-cn_topic_0237124729_section1089022732713)的设置有关系。当SQL的代价大于resource\_track\_cost时,SQL才会被诊断。SQL的代价可以通过explain来确认。 + +## 告警场景 + +目前支持对多列/单列统计信息未收集导致性能问题的场景上报告警。 + +如果存在单列或者多列统计信息未收集,则上报相关告警。调优方法可以参考[更新统计信息](更新统计信息.md)和[统计信息调优](统计信息调优.md)。 + +告警信息示例: + +整表的统计信息未收集: + +``` +Statistic Not Collect: + schema_test.t1 +``` + +单列统计信息未收集: + +``` +Statistic Not Collect: + schema_test.t2(c1,c2) +``` + +多列统计信息未收集: + +``` +Statistic Not Collect: + schema_test.t3((c1,c2)) +``` + +单列和多列统计信息未收集: + +``` +Statistic Not Collect: + schema_test.t4(c1,c2) schema_test.t4((c1,c2)) +``` + +## 规格约束 + +1. 告警字符串长度上限为2048。如果告警信息超过这个长度(例如存在大量未收集统计信息的超长表名,列名等信息)则不告警,只上报warning: + + ``` + WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped" + ``` + +2. 如果query存在limit节点(即查询语句中包含limit),则不会上报limit节点以下的Operator级别的告警。 + diff --git "a/content/zh/docs/Developerguide/SQL\350\257\255\346\263\225.md" "b/content/zh/docs/Developerguide/SQL\350\257\255\346\263\225.md" index 284266fcb..067f51a67 100644 --- "a/content/zh/docs/Developerguide/SQL\350\257\255\346\263\225.md" +++ "b/content/zh/docs/Developerguide/SQL\350\257\255\346\263\225.md" @@ -28,6 +28,8 @@ - **[ALTER SESSION](ALTER-SESSION.md)** +- **[ALTER SYNONYM](ALTER-SYNONYM.md)** + - **[ALTER SYSTEM KILL SESSION](ALTER-SYSTEM-KILL-SESSION.md)** - **[ALTER TABLE](ALTER-TABLE.md)** @@ -80,7 +82,7 @@ - **[CREATE INDEX](CREATE-INDEX.md)** -- **[CREATE ROW LEVLEL SECURITY POLICY](CREATE-ROW-LEVLEL-SECURITY-POLICY.md)** +- **[CREATE ROW LEVEL SECURITY POLICY](CREATE-ROW-LEVEL-SECURITY-POLICY.md)** - **[CREATE PROCEDURE](CREATE-PROCEDURE.md)** @@ -90,6 +92,8 @@ - **[CREATE SEQUENCE](CREATE-SEQUENCE.md)** +- **[CREATE SYNONYM](CREATE-SYNONYM.md)** + - **[CREATE TABLE](CREATE-TABLE.md)** - **[CREATE TABLE AS](CREATE-TABLE-AS.md)** @@ -144,6 +148,8 @@ - **[DROP SEQUENCE](DROP-SEQUENCE.md)** +- **[DROP SYNONYM](DROP-SYNONYM.md)** + - **[DROP TABLE](DROP-TABLE.md)** - **[DROP TABLESPACE](DROP-TABLESPACE.md)** diff --git "a/content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\345\205\263\351\224\256\345\217\202\346\225\260\350\260\203\346\225\264.md" "b/content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\345\205\263\351\224\256\345\217\202\346\225\260\350\260\203\346\225\264.md" new file mode 100644 index 000000000..b7ca1c8d8 --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\345\205\263\351\224\256\345\217\202\346\225\260\350\260\203\346\225\264.md" @@ -0,0 +1,74 @@ +# SQL调优关键参数调整 + +本节将介绍影响openGauss SQL调优性能的关键数据库主节点配置参数,配置方法参见[配置运行参数](配置运行参数.md)。 + +**表 1** 数据库主节点配置参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数/参考值

+

描述

+

enable_nestloop=on

+

控制查询优化器对嵌套循环连接(Nest Loop Join)类型的使用。当设置为“on”后,优化器优先使用Nest Loop Join;当设置为“off”后,优化器在存在其他方法时将优先选择其他方法。

+
说明:

如果只需要在当前数据库连接(即当前Session)中临时更改该参数值,则只需要在SQL语句中执行如下命令:

+
SET enable_nestloop to off;
+
+

此参数默认设置为“on”,但实际调优中应根据情况选择是否关闭。一般情况下,在三种join方式(Nested Loop、Merge Join和Hash Join)里,Nested Loop性能较差,实际调优中可以选择关闭。

+

enable_bitmapscan=on

+

控制查询优化器对位图扫描规划类型的使用。设置为“on”,表示使用;设置为“off”,表示不使用。

+
说明:

如果只需要在当前数据库连接(即当前Session)中临时更改该参数值,则只需要在SQL语句中执行命令如下命令:

+
SET enable_bitmapscan to off;
+
+

bitmapscan扫描方式适用于“where a > 1 and b > 1”且a列和b列都有索引这种查询条件,但有时其性能不如indexscan。因此,现场调优如发现查询性能较差且计划中有bitmapscan算子,可以关闭bitmapscan,看性能是否有提升。

+

enable_hashagg=on

+

控制优化器对Hash聚集规划类型的使用。

+

enable_hashjoin=on

+

控制优化器对Hash连接规划类型的使用。

+

enable_mergejoin=on

+

控制优化器对融合连接规划类型的使用。

+

enable_indexscan=on

+

控制优化器对索引扫描规划类型的使用。

+

enable_indexonlyscan=on

+

控制优化器对仅索引扫描规划类型的使用。

+

enable_seqscan=on

+

控制优化器对顺序扫描规划类型的使用。完全消除顺序扫描是不可能的,但是关闭这个变量会让优化器在存在其他方法的时候优先选择其他方法。

+

enable_sort=on

+

控制优化器使用的排序步骤。该设置不可能完全消除明确的排序,但是关闭这个变量可以让优化器在存在其他方法的时候优先选择其他方法。

+

rewrite_rule

+

控制优化器是否启用LAZY_AGG和MAGIC_SET重写规则。

+
+ diff --git "a/content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\346\214\207\345\215\227.md" "b/content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\346\214\207\345\215\227.md" new file mode 100644 index 000000000..44bc55448 --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\350\260\203\344\274\230\346\214\207\345\215\227.md" @@ -0,0 +1,25 @@ +# SQL调优指南 + +SQL调优的唯一目的是“资源利用最大化”,即CPU、内存、磁盘IO三种资源利用最大化。所有调优手段都是围绕资源使用开展的。所谓资源利用最大化是指SQL语句尽量高效,节省资源开销,以最小的代价实现最大的效益。比如做典型点查询的时候,可以用seqscan+filter\(即读取每一条元组和点查询条件进行匹配\)实现,也可以通过indexscan实现,显然indexscan可以以更小的代价实现相同的效果。 + +根据硬件资源和客户的业务特征确定合理的openGauss部署方案和表定义是数据库在多数情况下满足性能要求的基础。下文的调优说明假设您已根据“软件安装”指引在安装过程中按照合理的openGauss方案完成了安装,且已经根据“开发设计建议”的指引进行了数据库设计。 + +- **[Query执行流程](Query执行流程.md)** + +- **[SQL执行计划介绍](SQL执行计划介绍.md)** + +- **[调优流程](调优流程.md)** + +- **[更新统计信息](更新统计信息.md)** + +- **[审视和修改表定义](审视和修改表定义.md)** + +- **[典型SQL调优点](典型SQL调优点.md)** + +- **[经验总结:SQL语句改写规则](经验总结-SQL语句改写规则.md)** + +- **[SQL调优关键参数调整](SQL调优关键参数调整.md)** + +- **[使用Plan Hint进行调优](使用Plan-Hint进行调优.md)** + + diff --git "a/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206-6.md" "b/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206-6.md" deleted file mode 100644 index 18cafffc9..000000000 --- "a/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206-6.md" +++ /dev/null @@ -1,9 +0,0 @@ -# SSL证书管理 - -openGauss默认配置了通过openssl生成的安全证书、私钥。并且提供证书替换的接口,方便用户进行证书的替换。 - -- **[证书生成](证书生成-7.md)** - -- **[证书替换](证书替换-8.md)** - - diff --git "a/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206.md" "b/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206.md" index a0916fa9c..ff1f3891b 100644 --- "a/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206.md" @@ -1,4 +1,4 @@ -# SSL证书管理 +# SSL证书管理 openGauss默认配置了通过openssl生成的安全证书、私钥。并且提供证书替换的接口,方便用户进行证书的替换。 diff --git a/content/zh/docs/Developerguide/START-TRANSACTION.md b/content/zh/docs/Developerguide/START-TRANSACTION.md index cab33dd78..d986e36a2 100644 --- a/content/zh/docs/Developerguide/START-TRANSACTION.md +++ b/content/zh/docs/Developerguide/START-TRANSACTION.md @@ -16,7 +16,7 @@ START TRANSACTION [ { - ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ]; @@ -28,7 +28,7 @@ START TRANSACTION BEGIN [ WORK | TRANSACTION ] [ { - ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ]; @@ -45,12 +45,11 @@ BEGIN [ WORK | TRANSACTION ] 指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。 >![](public_sys-resources/icon-note.gif) **说明:** - >在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 + >在事务中第一个数据修改语句(SELECT, INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 取值范围: - READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 - - READ UNCOMMITTED:读未提交隔离级别,可能会读到未提交的数据。建议这种隔离级别下仅作只读操作,避免造成数据不一致。 - REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 - SERIALIZABLE:openGauss目前功能上不支持此隔离级别,等价于REPEATABLE READ。 diff --git a/content/zh/docs/Developerguide/STATEMENT.md b/content/zh/docs/Developerguide/STATEMENT.md new file mode 100644 index 000000000..6be47787b --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT.md @@ -0,0 +1,228 @@ +# STATEMENT + +获得当前节点的执行语句\(归一化SQL\)的信息。查询视图必须具有sysadmin权限。数据库主节点上可以看到此数据库主节点接收到的归一化的SQL的全量统计信息(包含数据库节点);数据库节点上仅可看到归一化的SQL的此节点执行的统计信息。 + +**表 1** STATEMENT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

node_id

+

integer

+

节点的ID(pgxc_node中的node_id)。

+

user_name

+

name

+

用户名称。

+

user_id

+

oid

+

用户OID。

+

unique_sql_id

+

bigint

+

归一化的SQL ID。

+

query

+

text

+

归一化的SQL。

+

n_calls

+

bigint

+

调用次数。

+

min_elapse_time

+

bigint

+

SQL在内核内的最小运行时间(单位:微秒)。

+

max_elapse_time

+

bigint

+

SQL在内核内的最大运行时间(单位:微秒)。

+

total_elapse_time

+

bigint

+

SQL在内核内的总运行时间(单位:微秒)。

+

n_returned_rows

+

bigint

+

SELECT返回的结果集行数。

+

n_tuples_fetched

+

bigint

+

随机扫描行。

+

n_tuples_returned

+

bigint

+

顺序扫描行。

+

n_tuples_inserted

+

bigint

+

插入行。

+

n_tuples_updated

+

bigint

+

更新行。

+

n_tuples_deleted

+

bigint

+

删除行。

+

n_blocks_fetched

+

bigint

+

buffer的块访问次数。

+

n_blocks_hit

+

bigint

+

buffer的块命中次数。

+

n_soft_parse

+

bigint

+

软解析次数,n_soft_parse + n_hard_parse可能大于n_calls,因为子查询未计入n_calls。

+

n_hard_parse

+

bigint

+

硬解析次数,n_soft_parse + n_hard_parse可能大于n_calls,因为子查询未计入n_calls。

+

db_time

+

bigint

+

有效的DB时间花费,多线程将累加(单位:微秒)。

+

cpu_time

+

bigint

+

CPU时间(单位:微秒)。

+

execution_time

+

bigint

+

执行器内执行时间(单位:微秒)。

+

parse_time

+

bigint

+

SQL解析时间(单位:微秒)。

+

plan_time

+

bigint

+

SQL生成计划时间(单位:微秒)。

+

rewrite_time

+

bigint

+

SQL重写时间(单位:微秒)。

+

pl_execution_time

+

bigint

+

plpgsql上的执行时间(单位:微秒)。

+

pl_compilation_time

+

bigint

+

plpgsql上的编译时间(单位:微秒)。

+

net_send_time

+

bigint

+

网络上的时间花费(单位:微秒)。

+

data_io_time

+

bigint

+

IO上的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY.md b/content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY.md new file mode 100644 index 000000000..67b1f1b0e --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY.md @@ -0,0 +1,4 @@ +# STATEMENT\_COMPLEX\_HISTORY + +STATEMENT\_COMPLEX\_HISTORY视图显示在数据库主节点上执行作业结束后的负载管理记录。此视图的数据直接从系统表[GS\_WLM\_SESSION\_QUERY\_INFO\_ALL](GS_WLM_SESSION_QUERY_INFO_ALL.md)获取。具体的字段请参考[表1](GS_WLM_SESSION_HISTORY.md#zh-cn_topic_0237122397_zh-cn_topic_0112535431_table75981925115018)。 + diff --git a/content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY_TABLE.md b/content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY_TABLE.md new file mode 100644 index 000000000..050352bd6 --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_COMPLEX_HISTORY_TABLE.md @@ -0,0 +1,4 @@ +# STATEMENT\_COMPLEX\_HISTORY\_TABLE + +STATEMENT\_COMPLEX\_HISTORY\_TABLE系统表显示数据库主节点执行作业结束后的负载管理记录。此数据是从内核中转储到系统表中的数据。具体的字段请参考[表1](GS_WLM_SESSION_HISTORY.md#zh-cn_topic_0237122397_zh-cn_topic_0112535431_table75981925115018)。 + diff --git a/content/zh/docs/Developerguide/STATEMENT_COMPLEX_RUNTIME.md b/content/zh/docs/Developerguide/STATEMENT_COMPLEX_RUNTIME.md new file mode 100644 index 000000000..baeb4676b --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_COMPLEX_RUNTIME.md @@ -0,0 +1,356 @@ +# STATEMENT\_COMPLEX\_RUNTIME + +STATEMENT\_COMPLEX\_RUNTIME视图显示当前用户在数据库主节点上正在执行的作业的负载管理记录。 + +**表 1** STATEMENT\_COMPLEX\_RUNTIME的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据OID。

+

dbname

+

name

+

连接后端的数据库名称。

+

schemaname

+

text

+

模式的名称。

+

nodename

+

text

+

数据库进程名称

+

username

+

name

+

连接到后端的用户名。

+

application_name

+

text

+

连接到后端的应用名。

+

client_addr

+

inet

+

连接到后端的客户端的IP地址。 如果此字段是null,它表明通过服务器机器上UNIX套接字连接客户端或者这是内部进程,如autovacuum。

+

client_hostname

+

text

+

客户端的主机名,这个字段是通过client_addr的反向DNS查找得到。这个字段只有在启动log_hostname且使用IP连接时才非空。

+

client_port

+

integer

+

客户端用于与后端通讯的TCP端口号,如果使用Unix套接字,则为-1。

+

query_band

+

text

+

用于标示作业类型,可通过GUC参数query_band进行设置,默认为空字符串。

+

pid

+

bigint

+

后端线程ID。

+

block_time

+

bigint

+

语句执行前的阻塞时间,单位ms。

+

start_time

+

timestamp with time zone

+

语句执行的开始时间。

+

duration

+

bigint

+

语句已经执行的时间,单位ms。

+

estimate_total_time

+

bigint

+

语句执行预估总时间,单位ms。

+

estimate_left_time

+

bigint

+

语句执行预估剩余时间,单位ms。

+

enqueue

+

text

+

工作负载管理资源状态。

+

resource_pool

+

name

+

用户使用的资源池。

+

control_group

+

text

+

语句所使用的Cgroup。

+

estimate_memory

+

integer

+

语句预估使用内存,单位MB。

+

min_peak_memory

+

integer

+

语句在数据库节点上的最小内存峰值,单位MB。

+

max_peak_memory

+

integer

+

语句在数据库节点上的最大内存峰值,单位MB。

+

average_peak_memory

+

integer

+

语句执行过程中的内存使用平均值,单位MB。

+

memory_skew_percent

+

integer

+

语句在数据库节点间的内存使用倾斜率。

+

spill_info

+

text

+
语句在数据库节点上的下盘信息:
  • None:数据库节点均未下盘。
  • All:数据库节点均下盘。
  • [a:b]:数量为b个数据库节点中有a个数据库节点下盘。
+
+

min_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最小数据量,单位MB,默认为0。

+

max_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的最大数据量,单位MB,默认为0。

+

average_spill_size

+

integer

+

若发生下盘,数据库节点上下盘的平均数据量,单位MB,默认为0。

+

spill_skew_percent

+

integer

+

若发生下盘,数据库节点间下盘倾斜率。

+

min_dn_time

+

bigint

+

语句在数据库节点上的最小执行时间,单位ms。

+

max_dn_time

+

bigint

+

语句在数据库节点上的最大执行时间,单位ms。

+

average_dn_time

+

bigint

+

语句在数据库节点上的平均执行时间,单位ms。

+

dntime_skew_percent

+

integer

+

语句在数据库节点的执行时间倾斜率。

+

min_cpu_time

+

bigint

+

语句在数据库节点上的最小CPU时间,单位ms。

+

max_cpu_time

+

bigint

+

语句在数据库节点上的最大CPU时间,单位ms。

+

total_cpu_time

+

bigint

+

语句在数据库节点上的CPU总时间,单位ms。

+

cpu_skew_percent

+

integer

+

语句在数据库节点间的CPU时间倾斜率。

+

min_peak_iops

+

integer

+

语句在数据库节点上的每秒最小IO峰值(列存单位是次/s,行存单位是万次/s)。

+

max_peak_iops

+

integer

+

语句在数据库节点上的每秒最大IO峰值(列存单位是次/s,行存单位是万次/s)。

+

average_peak_iops

+

integer

+

语句在数据库节点上的每秒平均IO峰值(列存单位是次/s,行存单位是万次/s)。

+

iops_skew_percent

+

integer

+

语句在数据库节点间的IO倾斜率。

+

warning

+

text

+
主要显示如下几类告警信息:
  • Spill file size large than 256MB
  • Broadcast size large than 100MB
  • Early spill
  • Spill times is greater than 3
  • Spill on memory adaptive
  • Hash table conflict
+
+

queryid

+

bigint

+

语句执行使用的内部query id。

+

query

+

text

+

正在执行的语句。

+

query_plan

+

text

+

语句的执行计划。

+

node_group

+

text

+

语句所属用户对应的逻辑openGauss。

+

top_cpu_dn

+

text

+

cpu使用量topN信息。

+

top_mem_dn

+

text

+

内存使用量topN信息。

+
+ diff --git a/content/zh/docs/Developerguide/STATEMENT_COUNT.md b/content/zh/docs/Developerguide/STATEMENT_COUNT.md new file mode 100644 index 000000000..9458b5f0f --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_COUNT.md @@ -0,0 +1,203 @@ +# STATEMENT\_COUNT + +显示数据库当前节点当前时刻执行的五类语句(SELECT、INSERT、UPDATE、DELETE、MERGE INTO)和\(DDL、DML、DCL\)统计信息。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>普通用户查询STATEMENT\_COUNT视图仅能看到该用户当前节点的统计信息;管理员权限用户查询STATEMENT\_COUNT视图则能看到所有用户当前节点的统计信息。当openGauss或该节点重启时,计数将清零,并重新开始计数。计数以节点收到的查询数为准,openGauss内部进行的查询。例如,数据库主节点收到一条查询,若下发多条查询数据库节点,那将在数据库节点上进行相应次数的计数。 + +**表 1** STATEMENT\_COUNT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

user_name

+

text

+

用户名。

+

select_count

+

bigint

+

select语句统计结果。

+

update_count

+

bigint

+

update语句统计结果。

+

insert_count

+

bigint

+

insert语句统计结果。

+

delete_count

+

bigint

+

delete语句统计结果。

+

mergeinto_count

+

bigint

+

merge into语句统计结果。

+

ddl_count

+

bigint

+

DDL语句的数量。

+

dml_count

+

bigint

+

DML语句的数量。

+

dcl_count

+

bigint

+

DCL语句的数量。

+

total_select_elapse

+

bigint

+

总select的时间花费(单位:微秒)。

+

avg_select_elapse

+

bigint

+

平均select的时间花费(单位:微秒)。

+

max_select_elapse

+

bigint

+

最大select的时间花费(单位:微秒)。

+

min_select_elapse

+

bigint

+

最小select的时间花费(单位:微秒)。

+

total_update_elapse

+

bigint

+

总update的时间花费(单位:微秒)。

+

avg_update_elapse

+

bigint

+

平均update的时间花费(单位:微秒)。

+

max_update_elapse

+

bigint

+

最大update的时间花费(单位:微秒)。

+

min_update_elapse

+

bigint

+

最小update的时间花费(单位:微秒)。

+

total_insert_elapse

+

bigint

+

总insert的时间花费(单位:微秒)。

+

avg_insert_elapse

+

bigint

+

平均insert的时间花费(单位:微秒)。

+

max_insert_elapse

+

bigint

+

最大insert的时间花费(单位:微秒)。

+

min_insert_elapse

+

bigint

+

最小insert的时间花费(单位:微秒)。

+

total_delete_elapse

+

bigint

+

总delete的时间花费(单位:微秒)。

+

avg_delete_elapse

+

bigint

+

平均delete的时间花费(单位:微秒)。

+

max_delete_elapse

+

bigint

+

最大delete的时间花费(单位:微秒)。

+

min_delete_elapse

+

bigint

+

最小delete的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/STATEMENT_IOSTAT_COMPLEX_RUNTIME.md b/content/zh/docs/Developerguide/STATEMENT_IOSTAT_COMPLEX_RUNTIME.md new file mode 100644 index 000000000..96e3e90e7 --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_IOSTAT_COMPLEX_RUNTIME.md @@ -0,0 +1,81 @@ +# STATEMENT\_IOSTAT\_COMPLEX\_RUNTIME + +STATEMENT\_IOSTAT\_COMPLEX\_RUNTIME视图显示当前用户执行作业正在运行时的IO负载管理相关信息。以下涉及到iops,对于行存,均以万次/s为单位,对于列存,均以次/s为单位。 + +**表 1** STATEMENT\_IOSTAT\_COMPLEX\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

query_id

+

bigint

+

作业id。

+

mincurriops

+

integer

+

该作业当前io在各数据库节点中的最小值。

+

maxcurriops

+

integer

+

该作业当前io在各数据库节点中的最大值。

+

minpeakiops

+

integer

+

在作业运行时,作业io峰值中,各数据库节点的最小值。

+

maxpeakiops

+

integer

+

在作业运行时,作业io峰值中,各数据库节点的最大值。

+

io_limits

+

integer

+

该作业所设GUC参数io_limits。

+

io_priority

+

text

+

该作业所设GUC参数io_priority。

+

query

+

text

+

作业。

+

node_group

+

text

+

作业所属用户对应的逻辑openGauss。

+
+ diff --git a/content/zh/docs/Developerguide/STATEMENT_RESPONSETIME_PERCENTILE.md b/content/zh/docs/Developerguide/STATEMENT_RESPONSETIME_PERCENTILE.md new file mode 100644 index 000000000..c4ddd8200 --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_RESPONSETIME_PERCENTILE.md @@ -0,0 +1,32 @@ +# STATEMENT\_RESPONSETIME\_PERCENTILE + +获取openGaussSQL响应时间P80,P95分布信息。 + +**表 1** STATEMENT\_RESPONSETIME\_PERCENTILE的字段 + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

p80

+

bigint

+

openGauss80%的SQL的响应时间(单位:微秒)。

+

p95

+

bigint

+

openGauss95%的SQL的响应时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/STATEMENT_USER_COMPLEX_HISTORY.md b/content/zh/docs/Developerguide/STATEMENT_USER_COMPLEX_HISTORY.md new file mode 100644 index 000000000..753ab6cb8 --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_USER_COMPLEX_HISTORY.md @@ -0,0 +1,4 @@ +# STATEMENT\_USER\_COMPLEX\_HISTORY + +STATEMENT\_USER\_COMPLEX\_HISTORY系统表显示数据库主节点执行作业结束后的负载管理记录。此数据是从内核中转储到系统表中的数据。具体的字段请参考[表1](GS_WLM_SESSION_HISTORY.md#zh-cn_topic_0237122397_zh-cn_topic_0112535431_table75981925115018)。 + diff --git a/content/zh/docs/Developerguide/STATEMENT_WLMSTAT_COMPLEX_RUNTIME.md b/content/zh/docs/Developerguide/STATEMENT_WLMSTAT_COMPLEX_RUNTIME.md new file mode 100644 index 000000000..585d69102 --- /dev/null +++ b/content/zh/docs/Developerguide/STATEMENT_WLMSTAT_COMPLEX_RUNTIME.md @@ -0,0 +1,181 @@ +# STATEMENT\_WLMSTAT\_COMPLEX\_RUNTIME + +STATEMENT\_WLMSTAT\_COMPLEX\_RUNTIME视图显示和当前用户执行作业正在运行时的负载管理相关信息。 + +**表 1** STATEMENT\_WLMSTAT\_COMPLEX\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据库OID。

+

datname

+

name

+

连接后端的数据库名称。

+

threadid

+

bigint

+

后端线程ID。

+

processid

+

integer

+

后端线程的pid。

+

usesysid

+

oid

+

登录后端的用户OID。

+

appname

+

text

+

连接到后端的应用名。

+

usename

+

name

+

登录到该后端的用户名。

+

priority

+

bigint

+

语句所在Cgroups的优先级。

+

attribute

+

text

+
语句的属性:
  • Ordinary:语句发送到数据库后被解析前的默认属性。
  • Simple:简单语句。
  • Complicated:复杂语句。
  • Internal:数据库内部语句。
+
+

block_time

+

bigint

+

语句当前为止的pending的时间,单位s。

+

elapsed_time

+

bigint

+

语句当前为止的实际执行时间,单位s。

+

total_cpu_time

+

bigint

+

语句在上一时间周期内的数据库节点上CPU使用的总时间,单位s。

+

cpu_skew_percent

+

integer

+

语句在上一时间周期内的数据库节点上CPU使用的倾斜率。

+

statement_mem

+

integer

+

语句执行使用的statement_mem,预留字段。

+

active_points

+

integer

+

语句占用的资源池并发点数。

+

dop_value

+

integer

+

语句的从资源池中获取的dop值。

+

control_group

+

text

+

该字段不支持。

+

status

+

text

+

该字段不支持

+

enqueue

+

text

+
语句当前的排队情况,包括:
  • Global:在全局队列中排队。
  • Respool:在资源池队列中排队。
  • CentralQueue:在中心协调节点(CCN)中排队。
  • Transaction:语句处于一个事务块中。
  • StoredProc:句处于一个存储过程中。
  • None:未在排队。
  • Forced None:事务块语句或存储过程语句由于超出设定的等待时间而强制执行。
+
+

resource_pool

+

name

+

语句当前所在的资源池。

+

query

+

text

+

该后端的最新查询。如果state状态是active(活的),此字段显示当前正在执行的查询。所有其他情况表示上一个查询。

+

is_plana

+

boolean

+

逻辑openGauss模式下,语句当前是否占用其他逻辑openGauss的资源执行。该值默认为f(否)。

+

node_group

+

text

+

语句所属用户对应的逻辑openGauss。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_ALL_INDEXES.md b/content/zh/docs/Developerguide/STATIO_ALL_INDEXES.md new file mode 100644 index 000000000..eb3aa356a --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_ALL_INDEXES.md @@ -0,0 +1,67 @@ +# STATIO\_ALL\_INDEXES + +STATIO\_ALL\_INDEXES视图包含数据库中的每个索引行,显示特定索引的I/O的统计。 + +**表 1** STATIO\_ALL\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

索引的表的OID。

+

indexrelid

+

oid

+

该索引的OID。

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

bigint

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

bigint

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_ALL_SEQUENCES.md b/content/zh/docs/Developerguide/STATIO_ALL_SEQUENCES.md new file mode 100644 index 000000000..ac0cb8087 --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_ALL_SEQUENCES.md @@ -0,0 +1,53 @@ +# STATIO\_ALL\_SEQUENCES + +STATIO\_ALL\_SEQUENCES视图包含数据库中每个序列的每一行,显示特定序列关于I/O的统计。 + +**表 1** STATIO\_ALL\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

从序列中读取的磁盘块数。

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_ALL_TABLES.md b/content/zh/docs/Developerguide/STATIO_ALL_TABLES.md new file mode 100644 index 000000000..b64253b1c --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_ALL_TABLES.md @@ -0,0 +1,95 @@ +# STATIO\_ALL\_TABLES + +STATIO\_ALL\_TABLES视图将包含数据库中每个表(包括TOAST表)的一行,显示出特定表I/O的统计。 + +**表 1** 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表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_SYS_INDEXES.md b/content/zh/docs/Developerguide/STATIO_SYS_INDEXES.md new file mode 100644 index 000000000..16f9fbbb1 --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_SYS_INDEXES.md @@ -0,0 +1,67 @@ +# STATIO\_SYS\_INDEXES + +STATIO\_SYS\_INDEXES显示命名空间中所有系统表索引的IO状态信息。 + +**表 1** STATIO\_SYS\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

索引的表的OID。

+

indexrelid

+

oid

+

该索引的OID。

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

bigint

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

bigint

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_SYS_SEQUENCES.md b/content/zh/docs/Developerguide/STATIO_SYS_SEQUENCES.md new file mode 100644 index 000000000..34885331d --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_SYS_SEQUENCES.md @@ -0,0 +1,53 @@ +# STATIO\_SYS\_SEQUENCES + +STATIO\_SYS\_SEQUENCES显示命名空间中所有系统表为序列的IO状态信息。 + +**表 1** STATIO\_SYS\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

从序列中读取的磁盘块数。

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_SYS_TABLES.md b/content/zh/docs/Developerguide/STATIO_SYS_TABLES.md new file mode 100644 index 000000000..e30d375c8 --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_SYS_TABLES.md @@ -0,0 +1,95 @@ +# STATIO\_SYS\_TABLES + +STATIO\_SYS\_TABLES视图显示命名空间中所有系统表的IO状态信息。 + +**表 1** STATIO\_SYS\_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表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_USER_INDEXES.md b/content/zh/docs/Developerguide/STATIO_USER_INDEXES.md new file mode 100644 index 000000000..a23d0acef --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_USER_INDEXES.md @@ -0,0 +1,67 @@ +# STATIO\_USER\_INDEXES + +STATIO\_USER\_INDEXES视图显示当前节点命名空间中所有用户关系表索引的IO状态信息。 + +**表 1** STATIO\_USER\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

索引的表的OID。

+

indexrelid

+

oid

+

该索引的OID。

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

bigint

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

bigint

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_USER_SEQUENCES.md b/content/zh/docs/Developerguide/STATIO_USER_SEQUENCES.md new file mode 100644 index 000000000..c9b0102e3 --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_USER_SEQUENCES.md @@ -0,0 +1,53 @@ +# STATIO\_USER\_SEQUENCES + +STATIO\_USER\_SEQUENCE视图显示当前节点的命名空间中所有用户关系表类型为序列的IO状态信息。 + +**表 1** STATIO\_USER\_SEQUENCE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

从序列中读取的磁盘块数。

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/STATIO_USER_TABLES.md b/content/zh/docs/Developerguide/STATIO_USER_TABLES.md new file mode 100644 index 000000000..ec12995ec --- /dev/null +++ b/content/zh/docs/Developerguide/STATIO_USER_TABLES.md @@ -0,0 +1,95 @@ +# STATIO\_USER\_TABLES + +STATIO\_USER\_TABLES视图显示命名空间中所有用户关系表的IO状态信息。 + +**表 1** STATIO\_USER\_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表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_ALL_INDEXES.md b/content/zh/docs/Developerguide/STAT_ALL_INDEXES.md new file mode 100644 index 000000000..bbc0671ee --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_ALL_INDEXES.md @@ -0,0 +1,74 @@ +# STAT\_ALL\_INDEXES + +将包含本节点数据库中的每个索引行,显示访问特定索引的统计。 + +**表 1** 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

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_ALL_TABLES.md b/content/zh/docs/Developerguide/STAT_ALL_TABLES.md new file mode 100644 index 000000000..26d8b7957 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_ALL_TABLES.md @@ -0,0 +1,165 @@ +# STAT\_ALL\_TABLES + +本节点内数据库中每个表(包括TOAST表)的一行的统计信息。 + +**表 1** 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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+

n_live_tup

+

bigint

+

估计活跃行数。

+

n_dead_tup

+

bigint

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次该表是手动清理的(不计算VACUUM FULL)的时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析该表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析时间。

+

vacuum_count

+

bigint

+

该表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

bigint

+

该表被autovacuum清理的次数。

+

analyze_count

+

bigint

+

该表被手动分析的次数。

+

autoanalyze_count

+

bigint

+

该表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_BAD_BLOCK.md b/content/zh/docs/Developerguide/STAT_BAD_BLOCK.md new file mode 100644 index 000000000..35eef5428 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_BAD_BLOCK.md @@ -0,0 +1,81 @@ +# STAT\_BAD\_BLOCK + +获得当前节点表、索引等文件的读取失败信息。 + +**表 1** STAT\_BAD\_BLOCK字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

数据库进程名称。

+

databaseid

+

integer

+

database的oid。

+

tablespaceid

+

integer

+

tablespace的oid。

+

relfilenode

+

integer

+

relation的file node。

+

bucketid

+

smallint

+

一致性hash bucket ID。

+

forknum

+

integer

+

fork编号。

+

error_count

+

integer

+

error的数量。

+

first_time

+

timestamp with time zone

+

坏块第一次出现的时间。

+

last_time

+

timestamp with time zone

+

坏块最后出现的时间。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_DATABASE.md b/content/zh/docs/Developerguide/STAT_DATABASE.md new file mode 100644 index 000000000..795c783a4 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_DATABASE.md @@ -0,0 +1,151 @@ +# STAT\_DATABASE + +视图将包含本节点中每个数据库的统计信息。 + +**表 1** STAT\_DATABASE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

数据库的OID。

+

datname

+

name

+

此数据库的名称。

+

numbackends

+

integer

+

当前连接到该数据库的后端数。这是在返回一个反映目前状态值的视图中唯一的列;自上次重置所有其他列返回累积值。

+

xact_commit

+

bigint

+

此数据库中已经提交的事务数。

+

xact_rollback

+

bigint

+

此数据库中已经回滚的事务数。

+

blks_read

+

bigint

+

在这个数据库中读取的磁盘块的数量。

+

blks_hit

+

bigint

+

高速缓存中已经发现的磁盘块的次数,这样读取是不必要的(这只包括PostgreSQL缓冲区高速缓存,没有操作系统的文件系统缓存)。

+

tup_returned

+

bigint

+

通过数据库查询返回的行数。

+

tup_fetched

+

bigint

+

通过数据库查询抓取的行数。

+

tup_inserted

+

bigint

+

通过数据库查询插入的行数。

+

tup_updated

+

bigint

+

通过数据库查询更新的行数。

+

tup_deleted

+

bigint

+

通过数据库查询删除的行数。

+

conflicts

+

bigint

+

由于数据库恢复冲突取消的查询数量(只在备用服务器发生的冲突)。请参见STAT_DATABASE_CONFLICTS获取更多信息。

+

temp_files

+

bigint

+

通过数据库查询创建的临时文件数量。计算所有临时文件,不论为什么创建临时文件(比如排序或者哈希),而且不管log_temp_files设置。

+

temp_bytes

+

bigint

+

通过数据库查询写入临时文件的数据总量。计算所有临时文件,不论为什么创建临时文件,而且不管log_temp_files设置。

+

deadlocks

+

bigint

+

在该数据库中检索的死锁数。

+

blk_read_time

+

double precision

+

通过数据库后端读取数据文件块花费的时间,以毫秒计算。

+

blk_write_time

+

double precision

+

通过数据库后端写入数据文件块花费的时间,以毫秒计算。

+

stats_reset

+

timestamp with time zone

+

重置当前状态统计的时间。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_DATABASE_CONFLICTS.md b/content/zh/docs/Developerguide/STAT_DATABASE_CONFLICTS.md new file mode 100644 index 000000000..fff929b25 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_DATABASE_CONFLICTS.md @@ -0,0 +1,67 @@ +# STAT\_DATABASE\_CONFLICTS + +显示当前节点数据库冲突状态的统计信息。 + +**表 1** STAT\_DATABASE\_CONFLICTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

数据库标识。

+

datname

+

name

+

数据库名称。

+

confl_tablespace

+

bigint

+

冲突的表空间的数目。

+

confl_lock

+

bigint

+

冲突的锁数目。

+

confl_snapshot

+

bigint

+

冲突的快照数目。

+

confl_bufferpin

+

bigint

+

冲突的缓冲区数目。

+

confl_deadlock

+

bigint

+

冲突的死锁数目。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_SYS_INDEXES.md b/content/zh/docs/Developerguide/STAT_SYS_INDEXES.md new file mode 100644 index 000000000..c3c05db00 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_SYS_INDEXES.md @@ -0,0 +1,74 @@ +# STAT\_SYS\_INDEXES + +显示pg\_catalog、information\_schema以及pg\_toast模式中所有系统表的索引状态信息。 + +**表 1** STAT\_SYS\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

此索引的表的OID。

+

indexrelid

+

oid

+

索引的OID。

+

schemaname

+

name

+

索引的模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

bigint

+

索引上开始的索引扫描数。

+

idx_tup_read

+

bigint

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

bigint

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_SYS_TABLES.md b/content/zh/docs/Developerguide/STAT_SYS_TABLES.md new file mode 100644 index 000000000..0eca9e378 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_SYS_TABLES.md @@ -0,0 +1,165 @@ +# STAT\_SYS\_TABLES + +显示pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息。 + +**表 1** STAT\_SYS\_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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+

n_live_tup

+

bigint

+

估计活跃行数。

+

n_dead_tup

+

bigint

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次该表是手动清理的(不计算VACUUM FULL)时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析该表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析的时间。

+

vacuum_count

+

bigint

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

bigint

+

该表被autovacuum清理的次数。

+

analyze_count

+

bigint

+

该表被手动分析的次数。

+

autoanalyze_count

+

bigint

+

该表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/STAT_USER_FUNCTIONS.md new file mode 100644 index 000000000..8d51031a1 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_USER_FUNCTIONS.md @@ -0,0 +1,60 @@ +# STAT\_USER\_FUNCTIONS + +STAT\_USER\_FUNCTIONS视图显示命名空间中用户自定义函数(函数语言为非内部语言)的状态信息。 + +**表 1** STAT\_USER\_FUNCTIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

funcid

+

oid

+

函数标识。

+

schemaname

+

name

+

schema的名称。

+

funcname

+

name

+

用户自定义函数的名称。

+

calls

+

bigint

+

函数被调用的次数。

+

total_time

+

double precision

+

调用此函数花费的总时间,包含调用其它函数的时间(单位:毫秒)。

+

self_time

+

double precision

+

调用此函数自己花费的时间,不包含调用其它函数的时间(单位:毫秒)。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_USER_INDEXES.md b/content/zh/docs/Developerguide/STAT_USER_INDEXES.md new file mode 100644 index 000000000..bf15215d6 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_USER_INDEXES.md @@ -0,0 +1,74 @@ +# STAT\_USER\_INDEXES + +显示数据库中用户自定义普通表的索引状态信息。 + +**表 1** STAT\_USER\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

此索引的表的OID。

+

indexrelid

+

oid

+

索引的OID。

+

schemaname

+

name

+

索引的模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

bigint

+

索引上开始的索引扫描数。

+

idx_tup_read

+

bigint

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

bigint

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_USER_TABLES.md b/content/zh/docs/Developerguide/STAT_USER_TABLES.md new file mode 100644 index 000000000..dd6bdb4ea --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_USER_TABLES.md @@ -0,0 +1,165 @@ +# STAT\_USER\_TABLES + +显示当前节点所有命名空间中用户自定义普通表的状态信息。 + +**表 1** STAT\_USER\_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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(即没有更新所需的单独索引)。

+

n_live_tup

+

bigint

+

估计活跃行数。

+

n_dead_tup

+

bigint

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次该表是手动清理的(不计算VACUUM FULL)时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析该表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析的时间。

+

vacuum_count

+

bigint

+

该表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

bigint

+

该表被autovacuum清理的次数。

+

analyze_count

+

bigint

+

该表被手动分析的次数。

+

autoanalyze_count

+

bigint

+

该表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_XACT_ALL_TABLES.md b/content/zh/docs/Developerguide/STAT_XACT_ALL_TABLES.md new file mode 100644 index 000000000..3ae3d980d --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_XACT_ALL_TABLES.md @@ -0,0 +1,95 @@ +# STAT\_XACT\_ALL\_TABLES + +显示命名空间中所有普通表和toast表的事务状态信息。 + +**表 1** STAT\_XACT\_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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_XACT_SYS_TABLES.md b/content/zh/docs/Developerguide/STAT_XACT_SYS_TABLES.md new file mode 100644 index 000000000..461c5dfe2 --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_XACT_SYS_TABLES.md @@ -0,0 +1,95 @@ +# STAT\_XACT\_SYS\_TABLES + +显示当前节点命名空间中系统表的事务状态信息。 + +**表 1** STAT\_XACT\_SYS\_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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_XACT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/STAT_XACT_USER_FUNCTIONS.md new file mode 100644 index 000000000..e012e9d4a --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_XACT_USER_FUNCTIONS.md @@ -0,0 +1,60 @@ +# STAT\_XACT\_USER\_FUNCTIONS + +视图包含当前节点本事务内函数执行的统计信息。 + +**表 1** STAT\_XACT\_USER\_FUNCTIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

funcid

+

oid

+

函数标识。

+

schemaname

+

name

+

模式的名称。

+

funcname

+

name

+

函数名称。

+

calls

+

bigint

+

函数被调用的次数。

+

total_time

+

double precision

+

函数的总执行时长。

+

self_time

+

double precision

+

当前线程调用函数的总的时长。

+
+ diff --git a/content/zh/docs/Developerguide/STAT_XACT_USER_TABLES.md b/content/zh/docs/Developerguide/STAT_XACT_USER_TABLES.md new file mode 100644 index 000000000..f947e270e --- /dev/null +++ b/content/zh/docs/Developerguide/STAT_XACT_USER_TABLES.md @@ -0,0 +1,95 @@ +# STAT\_XACT\_USER\_TABLES + +显示当前节点命名空间中用户表的事务状态信息。 + +**表 1** STAT\_XACT\_USER\_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

+

更新行数。

+

n_tup_del

+

bigint

+

删除行数。

+

n_tup_hot_upd

+

bigint

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_FILE_IOSTAT.md b/content/zh/docs/Developerguide/SUMMARY_FILE_IOSTAT.md new file mode 100644 index 000000000..8758aad85 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_FILE_IOSTAT.md @@ -0,0 +1,109 @@ +# SUMMARY\_FILE\_IOSTAT + +通过openGauss内对数据文件汇聚IO的统计,反映数据的IO性能,用以发现IO操作异常等性能问题。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_FILE\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

filenum

+

oid

+

文件标识。

+

dbid

+

oid

+

数据库标识。

+

spcid

+

oid

+

表空间标识。

+

phyrds

+

numeric

+

读物理文件的数目。

+

phywrts

+

numeric

+

写物理文件的数目。

+

phyblkrd

+

numeric

+

读物理文件块的数目。

+

phyblkwrt

+

numeric

+

写物理文件块的数目。

+

readtim

+

numeric

+

读文件的总时长(单位:微秒)。

+

writetim

+

numeric

+

写文件的总时长(单位:微秒)。

+

avgiotim

+

bigint

+

读写文件的平均时长(单位:微秒)。

+

lstiotim

+

bigint

+

最后一次读文件时长(单位:微秒)。

+

miniotim

+

bigint

+

读写文件的最小时长(单位:微秒)。

+

maxiowtm

+

bigint

+

读写文件的最大时长(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_FILE_REDO_IOSTAT.md b/content/zh/docs/Developerguide/SUMMARY_FILE_REDO_IOSTAT.md new file mode 100644 index 000000000..58c32f396 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_FILE_REDO_IOSTAT.md @@ -0,0 +1,67 @@ +# SUMMARY\_FILE\_REDO\_IOSTAT + +openGauss内汇聚所有的Redo\(WAL\)相关的统计信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_FILE\_REDO\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

phywrts

+

numeric

+

向wal buffer中写的次数。

+

phyblkwrt

+

numeric

+

向wal buffer中写的block的块数。

+

writetim

+

numeric

+

向xlog文件中写操作的时间(单位:微秒)。

+

avgiotim

+

bigint

+

平均写xlog的时间(writetim/phywrts)(单位:微秒)。

+

lstiotim

+

bigint

+

最后一次写xlog的时间(单位:微秒)。

+

miniotim

+

bigint

+

最小的写xlog时间(单位:微秒)。

+

maxiowtm

+

bigint

+

最大的写xlog时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_REL_IOSTAT.md b/content/zh/docs/Developerguide/SUMMARY_REL_IOSTAT.md new file mode 100644 index 000000000..4634a541b --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_REL_IOSTAT.md @@ -0,0 +1,46 @@ +# SUMMARY\_REL\_IOSTAT + +获取所有节点上的数据文件IO 统计信息,查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_REL\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

phyrds

+

numeric

+

读物理文件的数目。

+

phywrts

+

numeric

+

写物理文件的数目。

+

phyblkrd

+

numeric

+

读物理文件的块的数目。

+

phyblkwrt

+

numeric

+

写物理文件的块的数目。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATEMENT.md b/content/zh/docs/Developerguide/SUMMARY_STATEMENT.md new file mode 100644 index 000000000..44dfc0150 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATEMENT.md @@ -0,0 +1,228 @@ +# SUMMARY\_STATEMENT + +获得各数据库主节点的执行语句\(归一化SQL\)的全量信息\(包含数据库节点\)。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATEMENT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

node_id

+

integer

+

节点的ID(pgxc_node中的node_id)。

+

user_name

+

name

+

用户名称。

+

user_id

+

oid

+

用户OID。

+

unique_sql_id

+

bigint

+

归一化的SQL ID。

+

query

+

text

+

归一化的SQL。

+

n_calls

+

bigint

+

调用次数。

+

min_elapse_time

+

bigint

+

SQL在内核内的最小运行时间(单位:微秒)。

+

max_elapse_time

+

bigint

+

SQL在内核内的最大运行时间(单位:微秒)。

+

total_elapse_time

+

bigint

+

SQL在内核内的总运行时间(单位:微秒)。

+

n_returned_rows

+

bigint

+

SELECT返回的结果集行数。

+

n_tuples_fetched

+

bigint

+

随机扫描行。

+

n_tuples_returned

+

bigint

+

顺序扫描行。

+

n_tuples_inserted

+

bigint

+

插入行。

+

n_tuples_updated

+

bigint

+

更新行。

+

n_tuples_deleted

+

bigint

+

删除行。

+

n_blocks_fetched

+

bigint

+

buffer的块访问次数。

+

n_blocks_hit

+

bigint

+

buffer的块命中次数。

+

n_soft_parse

+

bigint

+

软解析次数。

+

n_hard_parse

+

bigint

+

硬解析次数。

+

db_time

+

bigint

+

有效的DB时间花费,多线程将累加(单位:微秒)。

+

cpu_time

+

bigint

+

CPU时间(单位:微秒)。

+

execution_time

+

bigint

+

执行器内执行时间(单位:微秒)。

+

parse_time

+

bigint

+

SQL解析时间(单位:微秒)。

+

plan_time

+

bigint

+

SQL生成计划时间(单位:微秒)。

+

rewrite_time

+

bigint

+

SQL重写时间(单位:微秒)。

+

pl_execution_time

+

bigint

+

plpgsql上的执行时间(单位:微秒)。

+

pl_compilation_time

+

bigint

+

plpgsql上的编译时间(单位:微秒)。

+

net_send_time

+

bigint

+

网络上的时间花费(单位:微秒)。

+

data_io_time

+

bigint

+

IO上的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATEMENT_COUNT.md b/content/zh/docs/Developerguide/SUMMARY_STATEMENT_COUNT.md new file mode 100644 index 000000000..f44cfa4f1 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATEMENT_COUNT.md @@ -0,0 +1,193 @@ +# SUMMARY\_STATEMENT\_COUNT + +显示数据库汇聚各节点\(数据库节点\)当前时刻执行的五类语句(SELECT、INSERT、UPDATE、DELETE、MERGE INTO)和\(DDL、DML、DCL\)统计信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATEMENT\_COUNT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

user_name

+

text

+

用户名。

+

select_count

+

numeric

+

select语句统计结果。

+

update_count

+

numeric

+

update语句统计结果。

+

insert_count

+

numeric

+

insert语句统计结果。

+

delete_count

+

numeric

+

delete语句统计结果。

+

mergeinto_count

+

numeric

+

merge into语句统计结果。

+

ddl_count

+

numeric

+

DDL语句的数量。

+

dml_count

+

numeric

+

DML语句的数量。

+

dcl_count

+

numeric

+

DCL语句的数量。

+

total_select_elapse

+

numeric

+

总select的时间花费(单位:微秒)。

+

avg_select_elapse

+

bigint

+

平均select的时间花费(单位:微秒)。

+

max_select_elapse

+

bigint

+

最大select的时间花费(单位:微秒)。

+

min_select_elapse

+

bigint

+

最小select的时间花费(单位:微秒)。

+

total_update_elapse

+

numeric

+

总update的时间花费(单位:微秒)。

+

avg_update_elapse

+

bigint

+

平均update的时间花费(单位:微秒)。

+

max_update_elapse

+

bigint

+

最大update的时间花费(单位:微秒)。

+

min_update_elapse

+

bigint

+

最小update的时间花费(单位:微秒)。

+

total_insert_elapse

+

numeric

+

总insert的时间花费(单位:微秒)。

+

avg_insert_elapse

+

bigint

+

平均insert的时间花费(单位:微秒)。

+

max_insert_elapse

+

bigint

+

最大insert的时间花费(单位:微秒)。

+

min_insert_elapse

+

bigint

+

最小insert的时间花费(单位:微秒)。

+

total_delete_elapse

+

numeric

+

总delete的时间花费(单位:微秒)。

+

avg_delete_elapse

+

bigint

+

平均delete的时间花费(单位:微秒)。

+

max_delete_elapse

+

bigint

+

最大delete的时间花费(单位:微秒)。

+

min_delete_elapse

+

bigint

+

最小delete的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_INDEXES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_INDEXES.md new file mode 100644 index 000000000..f5d4af02b --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_INDEXES.md @@ -0,0 +1,53 @@ +# SUMMARY\_STATIO\_ALL\_INDEXES + +SUMMARY\_STATIO\_ALL\_INDEXES视图包含含openGauss内汇聚的数据库中的每个索引行, 显示特定索引的I/O的统计。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_ALL\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

numeric

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_SEQUENCES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_SEQUENCES.md new file mode 100644 index 000000000..7fb677a6b --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_SEQUENCES.md @@ -0,0 +1,46 @@ +# SUMMARY\_STATIO\_ALL\_SEQUENCES + +SUMMARY\_STATIO\_ALL\_SEQUENCES视图包含openGauss内汇聚的数据库中每个序列的每一行,显示特定序列关于I/O的统计。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_ALL\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

numeric

+

从序列中读取的磁盘块数。

+

blks_hit

+

numeric

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_TABLES.md new file mode 100644 index 000000000..4309a3ad2 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_ALL_TABLES.md @@ -0,0 +1,88 @@ +# SUMMARY\_STATIO\_ALL\_TABLES + +SUMMARY\_STATIO\_ALL\_TABLES视图将包含openGauss内汇聚的数据库中每个表\(包括TOAST表)的I/O的统计。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

该表模式名。

+

relname

+

name

+

表名。

+

heap_blks_read

+

numeric

+

从该表中读取的磁盘块数。

+

heap_blks_hit

+

numeric

+

此表缓存命中数。

+

idx_blks_read

+

numeric

+

从表中所有索引读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

表中所有索引命中缓存数。

+

toast_blks_read

+

numeric

+

此表的TOAST表读取的磁盘块数(如果存在)。

+

toast_blks_hit

+

numeric

+

此表的TOAST表命中缓冲区数(如果存在)。

+

tidx_blks_read

+

numeric

+

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

tidx_blks_hit

+

numeric

+

此表的TOAST表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_INDEXES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_INDEXES.md new file mode 100644 index 000000000..47927f1fa --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_INDEXES.md @@ -0,0 +1,53 @@ +# SUMMARY\_STATIO\_SYS\_INDEXES + +SUMMARY\_STATIO\_SYS\_INDEXES视图显示openGauss内汇聚的命名空间中所有系统表索引的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_SYS\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

numeric

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_SEQUENCES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_SEQUENCES.md new file mode 100644 index 000000000..8e297a291 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_SEQUENCES.md @@ -0,0 +1,46 @@ +# SUMMARY\_STATIO\_SYS\_SEQUENCES + +SUMMARY\_STATIO\_SYS\_SEQUENCES视图显示openGauss内汇聚的命名空间中所有系统表为序列的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_SYS\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

numeric

+

从序列中读取的磁盘块数。

+

blks_hit

+

numeric

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_TABLES.md new file mode 100644 index 000000000..9abbc1eee --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_SYS_TABLES.md @@ -0,0 +1,88 @@ +# SUMMARY\_STATIO\_SYS\_TABLES + +SUMMARY\_STATIO\_SYS\_TABLES视图显示openGauss内汇聚的命名空间中所有系统表的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_SYS\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

该表模式名。

+

relname

+

name

+

表名。

+

heap_blks_read

+

numeric

+

从该表中读取的磁盘块数。

+

heap_blks_hit

+

numeric

+

此表缓存命中数。

+

idx_blks_read

+

numeric

+

从表中所有索引读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

表中所有索引命中缓存数。

+

toast_blks_read

+

numeric

+

此表的TOAST表读取的磁盘块数(如果存在)。

+

toast_blks_hit

+

numeric

+

此表的TOAST表命中缓冲区数(如果存在)。

+

tidx_blks_read

+

numeric

+

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

tidx_blks_hit

+

numeric

+

此表的TOAST表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_INDEXES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_INDEXES.md new file mode 100644 index 000000000..8f526b097 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_INDEXES.md @@ -0,0 +1,53 @@ +# SUMMARY\_STATIO\_USER\_INDEXES + +SUMMARY\_STATIO\_USER\_INDEXES视图显示openGauss内汇聚的命名空间中所有用户关系表索引的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_USER\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

该索引的模式名。

+

relname

+

name

+

该索引的表名。

+

indexrelname

+

name

+

索引名称。

+

idx_blks_read

+

numeric

+

从索引中读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

索引命中缓存数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_SEQUENCES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_SEQUENCES.md new file mode 100644 index 000000000..bb635b58d --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_SEQUENCES.md @@ -0,0 +1,46 @@ +# SUMMARY\_STATIO\_USER\_SEQUENCES + +SUMMARY\_STATIO\_USER\_SEQUENCES视图显示openGauss内汇聚的命名空间中所有用户关系表类型为序列的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_USER\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

numeric

+

从序列中读取的磁盘块数。

+

blks_hit

+

numeric

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_TABLES.md new file mode 100644 index 000000000..76d39d029 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STATIO_USER_TABLES.md @@ -0,0 +1,88 @@ +# SUMMARY\_STATIO\_USER\_TABLES + +SUMMARY\_STATIO\_USER\_TABLES视图显示openGauss内汇聚的命名空间中所有用户关系表的IO状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STATIO\_USER\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

该表模式名。

+

relname

+

name

+

表名。

+

heap_blks_read

+

numeric

+

从该表中读取的磁盘块数。

+

heap_blks_hit

+

numeric

+

此表缓存命中数。

+

idx_blks_read

+

numeric

+

从表中所有索引读取的磁盘块数。

+

idx_blks_hit

+

numeric

+

表中所有索引命中缓存数。

+

toast_blks_read

+

numeric

+

此表的TOAST表读取的磁盘块数(如果存在)。

+

toast_blks_hit

+

numeric

+

此表的TOAST表命中缓冲区数(如果存在)。

+

tidx_blks_read

+

numeric

+

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

tidx_blks_hit

+

numeric

+

此表的TOAST表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_ALL_INDEXES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_ALL_INDEXES.md new file mode 100644 index 000000000..8da331f52 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_ALL_INDEXES.md @@ -0,0 +1,60 @@ +# SUMMARY\_STAT\_ALL\_INDEXES + +将包含openGauss内汇聚数据库中的每个索引行,显示访问特定索引的统计。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_ALL\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

numeric

+

索引上开始的索引扫描数。

+

idx_tup_read

+

numeric

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

numeric

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_ALL_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_ALL_TABLES.md new file mode 100644 index 000000000..889e90fae --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_ALL_TABLES.md @@ -0,0 +1,158 @@ +# SUMMARY\_STAT\_ALL\_TABLES + +openGauss内汇聚数据库中每个表的一行(包括TOAST表)的统计信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

numeric

+

此表发起的顺序扫描数。

+

seq_tup_read

+

numeric

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

numeric

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

numeric

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

numeric

+

插入行数。

+

n_tup_upd

+

numeric

+

更新行数。

+

n_tup_del

+

numeric

+

删除行数。

+

n_tup_hot_upd

+

numeric

+

HOT更新行数(比如没有更新所需的单独索引)。

+

n_live_tup

+

numeric

+

估计活跃行数。

+

n_dead_tup

+

numeric

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次此表是手动清理的(不计算VACUUM FULL)的时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析这个表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析时间。

+

vacuum_count

+

numeric

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

numeric

+

这个表被autovacuum清理的次数。

+

analyze_count

+

numeric

+

这个表被手动分析的次数。

+

autoanalyze_count

+

numeric

+

这个表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_BAD_BLOCK.md b/content/zh/docs/Developerguide/SUMMARY_STAT_BAD_BLOCK.md new file mode 100644 index 000000000..58ceb920c --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_BAD_BLOCK.md @@ -0,0 +1,67 @@ +# SUMMARY\_STAT\_BAD\_BLOCK + +获得openGauss内汇聚的表、索引等文件的读取失败信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_BAD\_BLOCK字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

databaseid

+

integer

+

database的oid。

+

tablespaceid

+

integer

+

tablespace的oid。

+

relfilenode

+

integer

+

relation的file node。

+

forknum

+

bigint

+

fork编号。

+

error_count

+

bigint

+

error的数量。

+

first_time

+

timestamp with time zone

+

坏块第一次出现的时间。

+

last_time

+

timestamp with time zone

+

坏块最后出现的时间。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE.md b/content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE.md new file mode 100644 index 000000000..d999215d0 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE.md @@ -0,0 +1,144 @@ +# SUMMARY\_STAT\_DATABASE + +视图将包含集群内汇聚的每个数据库的每一行,显示数据库统计。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_DATABASE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datname

+

name

+

这个数据库的名称。

+

numbackends

+

bigint

+

当前连接到该数据库的后端数。这是在返回一个反映目前状态值的视图中唯一的列;自上次重置所有其他列返回累积值。

+

xact_commit

+

numeric

+

此数据库中已经提交的事务数。

+

xact_rollback

+

numeric

+

此数据库中已经回滚的事务数。

+

blks_read

+

numeric

+

在这个数据库中读取的磁盘块的数量。

+

blks_hit

+

numeric

+

高速缓存中已经发现的磁盘块的次数,这样读取是不必要的(这只包括PostgreSQL缓冲区高速缓存,没有操作系统的文件系统缓存)。

+

tup_returned

+

numeric

+

通过数据库查询返回的行数。

+

tup_fetched

+

numeric

+

通过数据库查询抓取的行数。

+

tup_inserted

+

bigint

+

通过数据库查询插入的行数。

+

tup_updated

+

bigint

+

通过数据库查询更新的行数。

+

tup_deleted

+

bigint

+

通过数据库查询删除的行数。

+

conflicts

+

bigint

+

由于数据库恢复冲突取消的查询数量(只在备用服务器发生的冲突)。请参见STAT_DATABASE_CONFLICTS获取更多信息。

+

temp_files

+

numeric

+

通过数据库查询创建的临时文件数量。计算所有临时文件,不论为什么创建临时文件(比如排序或者哈希),而且不管log_temp_files设置。

+

temp_bytes

+

numeric

+

通过数据库查询写入临时文件的数据总量。计算所有临时文件,不论为什么创建临时文件,而且不管log_temp_files设置。

+

deadlocks

+

bigint

+

在该数据库中检索的死锁数。

+

blk_read_time

+

double precision

+

通过数据库后端读取数据文件块花费的时间,以毫秒计算。

+

blk_write_time

+

double precision

+

通过数据库后端写入数据文件块花费的时间,以毫秒计算。

+

stats_reset

+

timestamp with time zone

+

重置当前状态统计的时间。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE_CONFLICTS.md b/content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE_CONFLICTS.md new file mode 100644 index 000000000..086bdbb27 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_DATABASE_CONFLICTS.md @@ -0,0 +1,60 @@ +# SUMMARY\_STAT\_DATABASE\_CONFLICTS + +显示openGauss内汇聚的数据库冲突状态的统计信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_DATABASE\_CONFLICTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datname

+

name

+

数据库名称。

+

confl_tablespace

+

bigint

+

冲突的表空间的数目。

+

confl_lock

+

bigint

+

冲突的锁数目。

+

confl_snapshot

+

bigint

+

冲突的快照数目。

+

confl_bufferpin

+

bigint

+

冲突的缓冲区数目。

+

confl_deadlock

+

bigint

+

冲突的死锁数目。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_SYS_INDEXES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_SYS_INDEXES.md new file mode 100644 index 000000000..7b68d0b35 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_SYS_INDEXES.md @@ -0,0 +1,60 @@ +# SUMMARY\_STAT\_SYS\_INDEXES + +openGauss内汇聚pg\_catalog、information\_schema以及pg\_toast模式中所有系统表的索引状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_SYS\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

numeric

+

索引上开始的索引扫描数。

+

idx_tup_read

+

numeric

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

numeric

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_SYS_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_SYS_TABLES.md new file mode 100644 index 000000000..74f21c1e2 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_SYS_TABLES.md @@ -0,0 +1,158 @@ +# SUMMARY\_STAT\_SYS\_TABLES + +openGauss内汇聚 pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_SYS\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

numeric

+

此表发起的顺序扫描数。

+

seq_tup_read

+

numeric

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

numeric

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

numeric

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

numeric

+

插入行数。

+

n_tup_upd

+

numeric

+

更新行数。

+

n_tup_del

+

numeric

+

删除行数。

+

n_tup_hot_upd

+

numeric

+

HOT更新行数(比如没有更新所需的单独索引)。

+

n_live_tup

+

numeric

+

估计活跃行数。

+

n_dead_tup

+

numeric

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次此表是手动清理的(不计算VACUUM FULL)时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析这个表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析的时间。

+

vacuum_count

+

numeric

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

numeric

+

这个表被autovacuum清理的次数。

+

analyze_count

+

numeric

+

这个表被手动分析的次数。

+

autoanalyze_count

+

numeric

+

这个表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/SUMMARY_STAT_USER_FUNCTIONS.md new file mode 100644 index 000000000..b401c3746 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_USER_FUNCTIONS.md @@ -0,0 +1,53 @@ +# SUMMARY\_STAT\_USER\_FUNCTIONS + +SUMMARY\_STAT\_USER\_FUNCTIONS用来统计所数据库节点用户自定义视图的相关统计信息,查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_USER\_FUNCTIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

schema的名称。

+

funcname

+

name

+

用户function的名称。

+

calls

+

numeric

+

总调用次数。

+

total_time

+

double precision

+

调用此function的总时间花费,包含调用其它function的时间(单位:毫秒)。

+

self_time

+

double precision

+

调用此function自己时间的花费,不包含调用其它function的时间(单位:毫秒)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_USER_INDEXES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_USER_INDEXES.md new file mode 100644 index 000000000..8e853d10d --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_USER_INDEXES.md @@ -0,0 +1,60 @@ +# SUMMARY\_STAT\_USER\_INDEXES + +openGauss内汇聚所有数据库中用户自定义普通表的索引状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_USER\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

numeric

+

索引上开始的索引扫描数。

+

idx_tup_read

+

numeric

+

通过索引上扫描返回的索引项数。

+

idx_tup_fetch

+

numeric

+

通过使用索引的简单索引扫描抓取的活表行数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_USER_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_USER_TABLES.md new file mode 100644 index 000000000..7c135234f --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_USER_TABLES.md @@ -0,0 +1,158 @@ +# SUMMARY\_STAT\_USER\_TABLES + +openGauss内汇聚所有命名空间中用户自定义普通表的状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_USER\_TABLES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

numeric

+

此表发起的顺序扫描数。

+

seq_tup_read

+

numeric

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

numeric

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

numeric

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

numeric

+

插入行数。

+

n_tup_upd

+

numeric

+

更新行数。

+

n_tup_del

+

numeric

+

删除行数。

+

n_tup_hot_upd

+

numeric

+

HOT更新行数(即没有更新所需的单独索引)。

+

n_live_tup

+

numeric

+

估计活跃行数。

+

n_dead_tup

+

numeric

+

估计死行数。

+

last_vacuum

+

timestamp with time zone

+

最后一次此表是手动清理的(不计算VACUUM FULL)时间。

+

last_autovacuum

+

timestamp with time zone

+

上次被autovacuum守护进程清理的时间。

+

last_analyze

+

timestamp with time zone

+

上次手动分析这个表的时间。

+

last_autoanalyze

+

timestamp with time zone

+

上次被autovacuum守护进程分析的时间。

+

vacuum_count

+

numeric

+

这个表被手动清理的次数(不计算VACUUM FULL)。

+

autovacuum_count

+

numeric

+

这个表被autovacuum清理的次数。

+

analyze_count

+

numeric

+

这个表被手动分析的次数。

+

autoanalyze_count

+

numeric

+

这个表被autovacuum守护进程分析的次数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_ALL_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_ALL_TABLES.md new file mode 100644 index 000000000..e0c1e4039 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_ALL_TABLES.md @@ -0,0 +1,88 @@ +# SUMMARY\_STAT\_XACT\_ALL\_TABLES + +显示openGauss内汇聚的命名空间中所有普通表和toast表的事务状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_XACT\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

numeric

+

此表发起的顺序扫描数。

+

seq_tup_read

+

numeric

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

numeric

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

numeric

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

numeric

+

插入行数。

+

n_tup_upd

+

numeric

+

更新行数。

+

n_tup_del

+

numeric

+

删除行数。

+

n_tup_hot_upd

+

numeric

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_SYS_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_SYS_TABLES.md new file mode 100644 index 000000000..8d7196308 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_SYS_TABLES.md @@ -0,0 +1,88 @@ +# SUMMARY\_STAT\_XACT\_SYS\_TABLES + +显示openGauss内汇聚的命名空间中系统表的事务状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_XACT\_SYS\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

numeric

+

此表发起的顺序扫描数。

+

seq_tup_read

+

numeric

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

numeric

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

numeric

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

numeric

+

插入行数。

+

n_tup_upd

+

numeric

+

更新行数。

+

n_tup_del

+

numeric

+

删除行数。

+

n_tup_hot_upd

+

numeric

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_FUNCTIONS.md new file mode 100644 index 000000000..d8b04fb5b --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_FUNCTIONS.md @@ -0,0 +1,53 @@ +# SUMMARY\_STAT\_XACT\_USER\_FUNCTIONS + +视图包含openGauss内汇聚的本事务内函数执行的统信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_XACT\_USER\_FUNCTIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

模式的名称。

+

funcname

+

name

+

函数名称。

+

calls

+

numeric

+

函数被调用的次数。

+

total_time

+

double precision

+

函数的总执行时长。

+

self_time

+

double precision

+

当前线程调用函数的总的时长。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_TABLES.md b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_TABLES.md new file mode 100644 index 000000000..b049302c9 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_STAT_XACT_USER_TABLES.md @@ -0,0 +1,88 @@ +# SUMMARY\_STAT\_XACT\_USER\_TABLES + +显示集群内汇聚的命名空间中用户表的事务状态信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_STAT\_XACT\_USER\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

numeric

+

此表发起的顺序扫描数。

+

seq_tup_read

+

numeric

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

numeric

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

numeric

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

numeric

+

插入行数。

+

n_tup_upd

+

numeric

+

更新行数。

+

n_tup_del

+

numeric

+

删除行数。

+

n_tup_hot_upd

+

numeric

+

HOT更新行数(比如没有更新所需的单独索引)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_TRANSACTIONS_PREPARED_XACTS.md b/content/zh/docs/Developerguide/SUMMARY_TRANSACTIONS_PREPARED_XACTS.md new file mode 100644 index 000000000..6ff75576e --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_TRANSACTIONS_PREPARED_XACTS.md @@ -0,0 +1,53 @@ +# SUMMARY\_TRANSACTIONS\_PREPARED\_XACTS + +显示openGauss中数据库主节点当前准备好进行两阶段提交的事务的信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_TRANSACTIONS\_PREPARED\_XACTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

transaction

+

xid

+

预备事务的数字事务标识。

+

gid

+

text

+

赋予该事务的全局事务标识。

+

prepared

+

timestamp with time zone

+

事务准备好提交的时间。

+

owner

+

name

+

执行该事务的用户的名称。

+

database

+

name

+

执行该事务所在的数据库名。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_USER_LOGIN.md b/content/zh/docs/Developerguide/SUMMARY_USER_LOGIN.md new file mode 100644 index 000000000..9dc1db58a --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_USER_LOGIN.md @@ -0,0 +1,53 @@ +# SUMMARY\_USER\_LOGIN + +SUMMARY\_USER\_LOGIN用来记录数据库主节点上用户登录和退出次数的相关信息,查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_USER\_LOGIN字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

user_name

+

text

+

用户名称。

+

user_id

+

integer

+

用户oid(同pg_authid中的oid字段)。

+

login_counter

+

bigint

+

登录次数。

+

logout_counter

+

bigint

+

退出次数。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_COUNT.md b/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_COUNT.md new file mode 100644 index 000000000..49f2a1d00 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_COUNT.md @@ -0,0 +1,81 @@ +# SUMMARY\_WORKLOAD\_SQL\_COUNT + +显示openGauss内各数据库主节点的workload上的SQL数量分布。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_WORKLOAD\_SQL\_COUNT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

workload

+

name

+

负载名称。

+

select_count

+

bigint

+

select数量。

+

update_count

+

bigint

+

update数量。

+

insert_count

+

bigint

+

insert数量。

+

delete_count

+

bigint

+

delete数量。

+

ddl_count

+

bigint

+

ddl数量。

+

dml_count

+

bigint

+

dml数量。

+

dcl_count

+

bigint

+

dcl数量。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_ELAPSE_TIME.md b/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_ELAPSE_TIME.md new file mode 100644 index 000000000..a7f8d00f5 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_SQL_ELAPSE_TIME.md @@ -0,0 +1,144 @@ +# SUMMARY\_WORKLOAD\_SQL\_ELAPSE\_TIME + +SUMMARY\_WORKLOAD\_SQL\_ELAPSE\_TIME用来统计数据库主节点上workload(业务)负载的SUID信息,查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_WORKLOAD\_SQL\_ELAPSE\_TIM字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

name

+

数据库进程名称。

+

workload

+

name

+

workload(业务负载)名称。

+

total_select_elapse

+

bigint

+

总select的时间花费(单位:微秒)。

+

max_select_elapse

+

bigint

+

最大select的时间花费(单位:微秒)。

+

min_select_elapse

+

bigint

+

最小select的时间花费(单位:微秒)。

+

avg_select_elapse

+

bigint

+

平均select的时间花费(单位:微秒)。

+

total_update_elapse

+

bigint

+

总update的时间花费(单位:微秒)。

+

max_update_elapse

+

bigint

+

最大update的时间花费(单位:微秒)。

+

min_update_elapse

+

bigint

+

最小update的时间花费(单位:微秒)。

+

avg_update_elapse

+

bigint

+

平均update的时间花费(单位:微秒)。

+

total_insert_elapse

+

bigint

+

总insert的时间花费(单位:微秒)。

+

max_insert_elapse

+

bigint

+

最大insert的时间花费(单位:微秒)。

+

min_insert_elapse

+

bigint

+

最小insert的时间花费(单位:微秒)。

+

avg_insert_elapse

+

bigint

+

平均insert的时间花费(单位:微秒)。

+

total_delete_elapse

+

bigint

+

总delete的时间花费(单位:微秒)。

+

max_delete_elapse

+

bigint

+

最大delete的时间花费(单位:微秒)。

+

min_delete_elapse

+

bigint

+

最小delete的时间花费(单位:微秒)。

+

avg_delete_elapse

+

bigint

+

平均delete的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_TRANSACTION.md b/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_TRANSACTION.md new file mode 100644 index 000000000..e024e89b2 --- /dev/null +++ b/content/zh/docs/Developerguide/SUMMARY_WORKLOAD_TRANSACTION.md @@ -0,0 +1,109 @@ +# SUMMARY\_WORKLOAD\_TRANSACTION + +显示openGauss内汇聚的负载事务信息。查询视图必须具有monadmin权限。 + +**表 1** SUMMARY\_WORKLOAD\_TRANSACTION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

workload

+

name

+

负载的名称。

+

commit_counter

+

numeric

+

用户事务commit数量。

+

rollback_counter

+

numeric

+

用户事务rollback数量。

+

resp_min

+

bigint

+

用户事务最小响应时间(单位:微秒)。

+

resp_max

+

bigint

+

用户事务最大响应时间(单位:微秒)。

+

resp_avg

+

bigint

+

用户事务平均响应时间(单位:微秒)。

+

resp_total

+

numeric

+

用户事务总响应时间(单位:微秒)。

+

bg_commit_counter

+

numeric

+

后台事务commit数量。

+

bg_rollback_counter

+

numeric

+

后台事务rollback数量。

+

bg_resp_min

+

bigint

+

后台事务最小响应时间(单位:微秒)。

+

bg_resp_max

+

bigint

+

后台事务最大响应时间(单位:微秒)。

+

bg_resp_avg

+

bigint

+

后台事务平均响应时间(单位:微秒)。

+

bg_resp_total

+

numeric

+

后台事务总响应时间(单位:微秒)。

+
+ diff --git "a/content/zh/docs/Developerguide/Scan\346\226\271\345\274\217\347\232\204Hint.md" "b/content/zh/docs/Developerguide/Scan\346\226\271\345\274\217\347\232\204Hint.md" new file mode 100644 index 000000000..5dcda02d7 --- /dev/null +++ "b/content/zh/docs/Developerguide/Scan\346\226\271\345\274\217\347\232\204Hint.md" @@ -0,0 +1,42 @@ +# Scan方式的Hint + +## 功能描述 + +指明scan使用的方法,可以是tablescan、indexscan和indexonlyscan。 + +## 语法格式 + +``` +[no] tablescan|indexscan|indexonlyscan(table [index]) +``` + +## 参数说明 + +- **no**表示hint的scan方式不使用。 + +- **table**表示hint指定的表,只能指定一个表,如果表存在别名应优先使用别名进行hint。 +- **index**表示使用indexscan或indexonlyscan的hint时,指定的索引名称,当前只能指定一个。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>对于indexscan或indexonlyscan,只有hint的索引属于hint的表时,才能使用该hint。 +>scan hint支持在行列存表、obs表、子查询表上指定。 + +## 示例 + +为了hint使用索引扫描,需要首先在表item的i\_item\_sk列上创建索引,名称为i。 + +``` +create index i on item(i_item_sk); +``` + +对[示例](Plan-Hint调优概述.md#zh-cn_topic_0237121532_section671421102912)中原语句使用如下hint: + +``` +explain +select /*+ indexscan(item i) */ i_product_name product_name ... +``` + +该hint表示:item表使用索引i进行扫描。生成计划如下所示: + +![](figures/zh-cn_image_0253037239.png) + diff --git a/content/zh/docs/Developerguide/Schema.md b/content/zh/docs/Developerguide/Schema.md index f9bd93344..2bf52f0e6 100644 --- a/content/zh/docs/Developerguide/Schema.md +++ b/content/zh/docs/Developerguide/Schema.md @@ -6,15 +6,15 @@ Schema又称作模式。通过管理Schema,允许多个用户使用同一数 相同的数据库对象名称可以应用在同一数据库的不同Schema中,而没有冲突。例如,a\_schema和b\_schema都可以包含名为mytable的表。具有所需权限的用户可以访问数据库的多个Schema中的对象。 -在初始数据库postgres中创建用户时,系统会自动帮助用户创建一个同名Schema。在其他数据库中,若需要同名Schema,则需要用户手动创建。 +在数据库创建用户时,系统会自动帮助用户创建一个同名Schema。 数据库对象是创建在数据库搜索路径中的第一个Schema内的。有关默认情况下的第一个Schema情况及如何变更Schema顺序等更多信息,请参见[搜索路径](#zh-cn_topic_0237121104_zh-cn_topic_0156599225_section03655314403)。 ## 创建、修改和删除Schema -- 要创建Schema,请使用[CREATE SCHEMA](CREATE-SCHEMA.md#ZH-CN_TOPIC_0242370577)。默认初始用户和系统管理员可以创建Schema,其他用户需要具备数据库的CREATE权限才可以在该数据库中创建Schema,赋权方式请参考[GRANT](GRANT.md)中将数据库的访问权限赋予指定的用户或角色中的语法。 -- 要更改Schema名称或者所有者,请使用[ALTER SCHEMA](ALTER-SCHEMA.md#ZH-CN_TOPIC_0242370534)。Schema所有者可以更改Schema。 -- 要删除Schema及其对象,请使用[DROP SCHEMA](DROP-SCHEMA.md#ZH-CN_TOPIC_0242370612)。Schema所有者可以删除Schema。 +- 要创建Schema,请使用[CREATE SCHEMA](CREATE-SCHEMA.md)。默认初始用户和系统管理员可以创建Schema,其他用户需要具备数据库的CREATE权限才可以在该数据库中创建Schema,赋权方式请参考[GRANT](GRANT.md)中将数据库的访问权限赋予指定的用户或角色中的语法。 +- 要更改Schema名称或者所有者,请使用[ALTER SCHEMA](ALTER-SCHEMA.md)。Schema所有者可以更改Schema。 +- 要删除Schema及其对象,请使用[DROP SCHEMA](DROP-SCHEMA.md)。Schema所有者可以删除Schema。 - 要在Schema内创建表,请以schema\_name.table\_name格式创建表。不指定schema\_name时,对象默认创建到[搜索路径](#zh-cn_topic_0237121104_zh-cn_topic_0156599225_section03655314403)中的第一个Schema内。 - 要查看Schema所有者,请对系统表PG\_NAMESPACE和PG\_USER执行如下关联查询。语句中的schema\_name请替换为实际要查找的Schema名称。 @@ -39,7 +39,7 @@ Schema又称作模式。通过管理Schema,允许多个用户使用同一数 搜索路径定义在[search\_path](语句行为.md#zh-cn_topic_0237124732_zh-cn_topic_0059779117_s304b0a206e2e4ca782210ffb66cbc4b0)参数中,参数取值形式为采用逗号分隔的Schema名称列表。如果创建对象时未指定目标Schema,则将该对象会被添加到搜索路径中列出的第一个Schema中。当不同Schema中存在同名的对象时,查询对象未指定Schema的情况下,将从搜索路径中包含该对象的第一个Schema中返回对象。 -- 要查看当前搜索路径,请使用[SHOW](SHOW.md#ZH-CN_TOPIC_0242370655)。 +- 要查看当前搜索路径,请使用[SHOW](SHOW.md)。 ``` postgres=# SHOW SEARCH_PATH; diff --git a/content/zh/docs/Developerguide/Session-Thread.md b/content/zh/docs/Developerguide/Session-Thread.md new file mode 100644 index 000000000..387264bd9 --- /dev/null +++ b/content/zh/docs/Developerguide/Session-Thread.md @@ -0,0 +1,37 @@ +# Session/Thread + +- **[SESSION\_STAT](SESSION_STAT.md)** + +- **[GLOBAL\_SESSION\_STAT](GLOBAL_SESSION_STAT.md)** + +- **[SESSION\_TIME](SESSION_TIME.md)** + +- **[GLOBAL\_SESSION\_TIME](GLOBAL_SESSION_TIME.md)** + +- **[SESSION\_MEMORY](SESSION_MEMORY.md)** + +- **[GLOBAL\_SESSION\_MEMORY](GLOBAL_SESSION_MEMORY.md)** + +- **[SESSION\_MEMORY\_DETAIL](SESSION_MEMORY_DETAIL.md)** + +- **[GLOBAL\_SESSION\_MEMORY\_DETAIL](GLOBAL_SESSION_MEMORY_DETAIL.md)** + +- **[SESSION\_STAT\_ACTIVITY](SESSION_STAT_ACTIVITY.md)** + +- **[GLOBAL\_SESSION\_STAT\_ACTIVITY](GLOBAL_SESSION_STAT_ACTIVITY.md)** + +- **[THREAD\_WAIT\_STATUS](THREAD_WAIT_STATUS.md)** + +- **[GLOBAL\_THREAD\_WAIT\_STATUS](GLOBAL_THREAD_WAIT_STATUS.md)** + +- **[LOCAL\_THREADPOOL\_STATUS](LOCAL_THREADPOOL_STATUS.md)** + +- **[GLOBAL\_THREADPOOL\_STATUS](GLOBAL_THREADPOOL_STATUS.md)** + +- **[SESSION\_CPU\_RUNTIME](SESSION_CPU_RUNTIME.md)** + +- **[SESSION\_MEMORY\_RUNTIME](SESSION_MEMORY_RUNTIME.md)** + +- **[STATEMENT\_IOSTAT\_COMPLEX\_RUNTIME](STATEMENT_IOSTAT_COMPLEX_RUNTIME.md)** + + diff --git "a/content/zh/docs/Developerguide/Simple\350\257\215\345\205\270.md" "b/content/zh/docs/Developerguide/Simple\350\257\215\345\205\270.md" index cd5a72baf..40dfcd0f1 100644 --- "a/content/zh/docs/Developerguide/Simple\350\257\215\345\205\270.md" +++ "b/content/zh/docs/Developerguide/Simple\350\257\215\345\205\270.md" @@ -20,7 +20,7 @@ Simple词典首先将输入标记转换为小写字母,然后检查停用词 ); ``` - 其中,停用词表文件全名为english.stop。关于创建simple词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + 其中,停用词表文件全名为english.stop。关于创建simple词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md)。 2. 使用Simple词典。 diff --git "a/content/zh/docs/Developerguide/Snowball\350\257\215\345\205\270.md" "b/content/zh/docs/Developerguide/Snowball\350\257\215\345\205\270.md" index 23529ea58..d3b43147e 100644 --- "a/content/zh/docs/Developerguide/Snowball\350\257\215\345\205\270.md" +++ "b/content/zh/docs/Developerguide/Snowball\350\257\215\345\205\270.md" @@ -1,8 +1,8 @@ # Snowball词典 -Snowball词典模板支持词干分析词典,基于Martin Porter的Snowball项目,内置有许多语言的词干分析算法。openGauss中预定义有多种语言的Snowball词典,可通过系统表[PG\_TS\_DICT](PG_TS_DICT.md#ZH-CN_TOPIC_0242385852)查看预定义的词干分析词典以及支持的语言词干分析算法。 +Snowball词典模板支持词干分析词典,基于Martin Porter的Snowball项目,内置有许多语言的词干分析算法。openGauss中预定义有多种语言的Snowball词典,可通过系统表[PG\_TS\_DICT](PG_TS_DICT.md)查看预定义的词干分析词典以及支持的语言词干分析算法。 无论是否可以简化,Snowball词典将标示所有输入为已识别,因此它应当被放置在词典列表的最后。把Snowball词典放在任何其他词典前面会导致后继词典失效,因为输入token不会通过Snowball词典进入到下一个词典。 -关于Snowball词典的语法,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 +关于Snowball词典的语法,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md)。 diff --git a/content/zh/docs/Toolreference/Sqldiag.md b/content/zh/docs/Developerguide/Sqldiag.md similarity index 77% rename from content/zh/docs/Toolreference/Sqldiag.md rename to content/zh/docs/Developerguide/Sqldiag.md index 6d99256a1..146491719 100644 --- a/content/zh/docs/Toolreference/Sqldiag.md +++ b/content/zh/docs/Developerguide/Sqldiag.md @@ -1,4 +1,4 @@ -# Sqldiag +# Sqldiag Sqliag是openGauss中SQL语句执行时长预测框架。现有的预测技术主要基于执行计划的模型预测,但这些预测方案仅适用于OLAP场景且可以获取执行计划的作业,对于OLTP或者HTAP这样的快速查询是没有使用价值的。和上述方案不同,Sqldiag着眼于数据库的历史SQL语句,因为短时间内数据库SQL语句执行时长不会有太大的差距,Sqldiag可以从历史数据中检测出已输入指令相似的指令集,并基于SQL向量化技术和时序预测算法预测SQL语句执行时长。该框架有如下优点: @@ -6,14 +6,14 @@ Sqliag是openGauss中SQL语句执行时长预测框架。现有的预测技术 2. 使用场景广泛,目前业内的很多算法具有很强的针对性,比如只适用于OLTP或者OLAP,Sqldiag使用场景广泛。 3. 该框架鲁棒性强,理解容易,只需要简单的修改,用户就可以设计出自己的预测模型。 -- **[概述](概述-4.md)** +- **[概述](概述-11.md)** -- **[使用指导](使用指导-5.md)** +- **[使用指导](使用指导-12.md)** -- **[获取帮助](获取帮助-6.md)** +- **[获取帮助](获取帮助-13.md)** -- **[命令参考](命令参考-7.md)** +- **[命令参考](命令参考-14.md)** -- **[常见问题处理](常见问题处理-8.md)** +- **[常见问题处理](常见问题处理-15.md)** diff --git "a/content/zh/docs/Developerguide/Synonym\350\257\215\345\205\270.md" "b/content/zh/docs/Developerguide/Synonym\350\257\215\345\205\270.md" index 38de7b7cf..e965c5055 100644 --- "a/content/zh/docs/Developerguide/Synonym\350\257\215\345\205\270.md" +++ "b/content/zh/docs/Developerguide/Synonym\350\257\215\345\205\270.md" @@ -1,6 +1,6 @@ # Synonym词典 -Synonym词典用于定义、识别token的同义词并转化,不支持词组(词组形式的同义词可用Thesaurus词典定义,详细请参见[Thesaurus词典](Thesaurus词典.md#ZH-CN_TOPIC_0242370502))。 +Synonym词典用于定义、识别token的同义词并转化,不支持词组(词组形式的同义词可用Thesaurus词典定义,详细请参见[Thesaurus词典](Thesaurus词典.md))。 ## 示例 @@ -51,9 +51,9 @@ Synonym词典用于定义、识别token的同义词并转化,不支持词组 ``` - 其中,同义词词典文件全名为my\_synonyms.syn,所在目录为当前连接数据库主节点的/home/dicts/下。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + 其中,同义词词典文件全名为my\_synonyms.syn,所在目录为当前连接数据库主节点的/home/dicts/下。关于创建词典的语法和更多参数,请参见[ALTER TEXT SEARCH DICTIONARY](ALTER-TEXT-SEARCH-DICTIONARY.md)。 -- 星号(\*)可用于词典文件中的同义词结尾,表示该同义词是一个前缀。在to\_tsvector\(\)中该星号将被忽略,但在to\_tsquery\(\)中会匹配该前缀并对应输出结果(参照[处理查询](处理查询.md#ZH-CN_TOPIC_0242370493)一节)。 +- 星号(\*)可用于词典文件中的同义词结尾,表示该同义词是一个前缀。在to\_tsvector\(\)中该星号将被忽略,但在to\_tsquery\(\)中会匹配该前缀并对应输出结果(参照[处理查询](处理查询.md)一节)。 假设词典文件synonym\_sample.syn内容如下: diff --git a/content/zh/docs/Developerguide/THREAD_WAIT_STATUS.md b/content/zh/docs/Developerguide/THREAD_WAIT_STATUS.md new file mode 100644 index 000000000..23f735f1e --- /dev/null +++ b/content/zh/docs/Developerguide/THREAD_WAIT_STATUS.md @@ -0,0 +1,102 @@ +# THREAD\_WAIT\_STATUS + +通过该视图可以检测当前实例中工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况,具体事件信息请参见[15.3.67-表2 等待状态列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_zh-cn_topic_0059777957_t794f802302c24514a5db22d51eabacc4)、[15.3.67-表3 轻量级锁等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table38811324183420)、[15.3.67-表4 IO等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table124603113369)和[15.3.67-表5 事务锁等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table11826123533718)。 + +**表 1** THREAD\_WAIT\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

db_name

+

text

+

数据库名称。

+

thread_name

+

text

+

线程名称。

+

query_id

+

bigint

+

查询ID,对应debug_query_id。

+

tid

+

bigint

+

当前线程的线程号。

+

sessionid

+

bigint

+

session的ID。

+

lwtid

+

integer

+

当前线程的轻量级线程号。

+

psessionid

+

bigint

+

streaming线程的父线程。

+

tlevel

+

integer

+

streaming线程的层级。

+

smpid

+

integer

+

并行线程的ID。

+

wait_status

+

text

+

当前线程的等待状态。等待状态的详细信息请参见15.3.67-表2 等待状态列表

+

wait_event

+

text

+

如果wait_status是acquire lock、acquire lwlock、wait io三种类型,此列描述具体的锁、轻量级锁、IO的信息;否则为空。

+
+ diff --git "a/content/zh/docs/Developerguide/TPCC\350\277\220\350\241\214\346\227\266-\346\263\250\345\205\245\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234-TPCC\345\215\241\344\275\217\347\232\204\351\227\256\351\242\230.md" "b/content/zh/docs/Developerguide/TPCC\350\277\220\350\241\214\346\227\266-\346\263\250\345\205\245\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234-TPCC\345\215\241\344\275\217\347\232\204\351\227\256\351\242\230.md" new file mode 100644 index 000000000..9d178f81f --- /dev/null +++ "b/content/zh/docs/Developerguide/TPCC\350\277\220\350\241\214\346\227\266-\346\263\250\345\205\245\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234-TPCC\345\215\241\344\275\217\347\232\204\351\227\256\351\242\230.md" @@ -0,0 +1,14 @@ +# TPCC运行时,注入磁盘满故障,TPCC卡住的问题 + +## 问题现象 + +TPCC运行时,注入磁盘满故障,TPCC卡住,故障消除后,TPCC自动续跑。 + +## 原因分析 + +数据库本身机制,在性能日志(gs\_profile)所在磁盘满时,导致无法写入而陷入无限等待,表现为TPCC卡住。磁盘满故障消除后,性能日志能正常写入,TPCC恢复正常。 + +## 处理分析 + +外部监控磁盘使用状况,定时进行清理磁盘。 + diff --git a/content/zh/docs/Developerguide/TRANSACTIONS_PREPARED_XACTS.md b/content/zh/docs/Developerguide/TRANSACTIONS_PREPARED_XACTS.md new file mode 100644 index 000000000..4311f8630 --- /dev/null +++ b/content/zh/docs/Developerguide/TRANSACTIONS_PREPARED_XACTS.md @@ -0,0 +1,53 @@ +# TRANSACTIONS\_PREPARED\_XACTS + +显示当前准备好进行两阶段提交的事务的信息。 + +**表 1** TRANSACTIONS\_PREPARED\_XACTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

transaction

+

xid

+

预备事务的数字事务标识。

+

gid

+

text

+

赋予该事务的全局事务标识。

+

prepared

+

timestamp with time zone

+

事务准备好提交的时间。

+

owner

+

name

+

执行该事务的用户的名称。

+

database

+

name

+

执行该事务所在的数据库名。

+
+ diff --git a/content/zh/docs/Developerguide/TRUNCATE.md b/content/zh/docs/Developerguide/TRUNCATE.md index fc8d79c7f..8eeab4fcb 100644 --- a/content/zh/docs/Developerguide/TRUNCATE.md +++ b/content/zh/docs/Developerguide/TRUNCATE.md @@ -55,8 +55,8 @@ ALTER TABLE [ IF EXISTS ] { [ ONLY ] table_name 不改变序列的值。这是缺省值。 - **CASCADE | RESTRICT** - - CASCADE:级联清空所有在该表上有外键引用的表,或者由于CASCADE而被添加到组中的表。 - - RESTRICT(缺省值):如果其他表在该表上有外键引用则拒绝清空。 + - CASCADE:级联清空所有由于CASCADE而被添加到组中的表。 + - RESTRICT(缺省值):完全清空。 - **partition\_name** diff --git "a/content/zh/docs/Developerguide/Thesaurus\350\257\215\345\205\270.md" "b/content/zh/docs/Developerguide/Thesaurus\350\257\215\345\205\270.md" index ff996e0cf..c945070c8 100644 --- "a/content/zh/docs/Developerguide/Thesaurus\350\257\215\345\205\270.md" +++ "b/content/zh/docs/Developerguide/Thesaurus\350\257\215\345\205\270.md" @@ -29,7 +29,7 @@ Thesaurus词典,也叫做分类词典(缩写为TZ),是一组定义了词 ); ``` - 其中,词典定义文件全名为thesaurus\_astro.ths,所在目录为当前连接数据库主节点的/home/dicts/下 。子词典pg\_catalog.english\_stem是预定义的Snowball类型的英语词干词典,用于规范化输入词,子词典自身相关配置(例如停用词等)不在此处显示。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + 其中,词典定义文件全名为thesaurus\_astro.ths,所在目录为当前连接数据库主节点的/home/dicts/下 。子词典pg\_catalog.english\_stem是预定义的Snowball类型的英语词干词典,用于规范化输入词,子词典自身相关配置(例如停用词等)不在此处显示。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md)。 2. 创建词典后,将其绑定到对应文本搜索配置中需要处理的token类型上: diff --git a/content/zh/docs/Developerguide/Transaction.md b/content/zh/docs/Developerguide/Transaction.md new file mode 100644 index 000000000..ea220d552 --- /dev/null +++ b/content/zh/docs/Developerguide/Transaction.md @@ -0,0 +1,9 @@ +# Transaction + +- **[TRANSACTIONS\_PREPARED\_XACTS](TRANSACTIONS_PREPARED_XACTS.md)** + +- **[SUMMARY\_TRANSACTIONS\_PREPARED\_XACTS](SUMMARY_TRANSACTIONS_PREPARED_XACTS.md)** + +- **[GLOBAL\_TRANSACTIONS\_PREPARED\_XACTS](GLOBAL_TRANSACTIONS_PREPARED_XACTS.md)** + + diff --git a/content/zh/docs/Developerguide/UPDATE.md b/content/zh/docs/Developerguide/UPDATE.md index e10d1973a..f058f76d1 100644 --- a/content/zh/docs/Developerguide/UPDATE.md +++ b/content/zh/docs/Developerguide/UPDATE.md @@ -8,7 +8,6 @@ - 要修改表,用户必须对该表有UPDATE权限。 - 对expression或condition条件里涉及到的任何表要有SELECT权限。 -- 不允许对表的分布列(distribute column)进行修改。 - 对于列存表,暂时不支持RETURNING子句。 - 列存表不支持结果不确定的更新\(non-deterministic update\)。试图对列存表用多行数据更新一行时会报错。 - 列存表的更新操作,旧记录空间不会回收,需要执行VACUUM FULL table\_name进行清理。 diff --git a/content/zh/docs/Developerguide/USER_LOGIN.md b/content/zh/docs/Developerguide/USER_LOGIN.md new file mode 100644 index 000000000..d6176c353 --- /dev/null +++ b/content/zh/docs/Developerguide/USER_LOGIN.md @@ -0,0 +1,53 @@ +# USER\_LOGIN + +USER\_LOGIN用来记录用户登录和退出次数的相关信息。 + +**表 1** USER\_LOGIN字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

数据库进程名称。

+

user_name

+

text

+

用户名称。

+

user_id

+

integer

+

用户oid(同pg_authid中的oid字段)。

+

login_counter

+

bigint

+

登录次数。

+

logout_counter

+

bigint

+

退出次数。

+
+ diff --git a/content/zh/docs/Developerguide/Utility.md b/content/zh/docs/Developerguide/Utility.md new file mode 100644 index 000000000..790e46827 --- /dev/null +++ b/content/zh/docs/Developerguide/Utility.md @@ -0,0 +1,33 @@ +# Utility + +- **[REPLICATION\_STAT](REPLICATION_STAT.md)** + +- **[GLOBAL\_REPLICATION\_STAT](GLOBAL_REPLICATION_STAT.md)** + +- **[REPLICATION\_SLOTS](REPLICATION_SLOTS.md)** + +- **[GLOBAL\_REPLICATION\_SLOTS](GLOBAL_REPLICATION_SLOTS.md)** + +- **[BGWRITER\_STAT](BGWRITER_STAT.md)** + +- **[GLOBAL\_BGWRITER\_STAT](GLOBAL_BGWRITER_STAT.md)** + +- **[GLOBAL\_CKPT\_STATUS](GLOBAL_CKPT_STATUS.md)** + +- **[GLOBAL\_DOUBLE\_WRITE\_STATUS](GLOBAL_DOUBLE_WRITE_STATUS.md)** + +- **[GLOBAL\_PAGEWRITER\_STATUS](GLOBAL_PAGEWRITER_STATUS.md)** + +- **[GLOBAL\_RECORD\_RESET\_TIME](GLOBAL_RECORD_RESET_TIME.md)** + +- **[GLOBAL\_REDO\_STATUS](GLOBAL_REDO_STATUS.md)** + +- **[GLOBAL\_RECOVERY\_STATUS](GLOBAL_RECOVERY_STATUS.md)** + +- **[CLASS\_VITAL\_INFO](CLASS_VITAL_INFO.md)** + +- **[USER\_LOGIN](USER_LOGIN.md)** + +- **[SUMMARY\_USER\_LOGIN](SUMMARY_USER_LOGIN.md)** + + diff --git a/content/zh/docs/Developerguide/VACUUM.md b/content/zh/docs/Developerguide/VACUUM.md index 90abb60ab..b6248ba95 100644 --- a/content/zh/docs/Developerguide/VACUUM.md +++ b/content/zh/docs/Developerguide/VACUUM.md @@ -18,6 +18,7 @@ VACUUM回收表或B-Tree索引中已经删除的行所占据的存储空间。 - VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。 - 简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。 - VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。 +- 同时执行多个VACUUM FULL可能出现死锁。 ## 语法格式 diff --git a/content/zh/docs/Developerguide/WAIT_EVENTS.md b/content/zh/docs/Developerguide/WAIT_EVENTS.md new file mode 100644 index 000000000..3a8e93b35 --- /dev/null +++ b/content/zh/docs/Developerguide/WAIT_EVENTS.md @@ -0,0 +1,81 @@ +# WAIT\_EVENTS + +WAIT\_EVENTS显示当前节点的event的等待相关的统计信息。具体事件信息见[15.3.67-表2 等待状态列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_zh-cn_topic_0059777957_t794f802302c24514a5db22d51eabacc4)、[15.3.67-表3 轻量级锁等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table38811324183420)、[15.3.67-表4 IO等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table124603113369)和[15.3.67-表5 事务锁等待事件列表](PG_THREAD_WAIT_STATUS.md#zh-cn_topic_0237122466_table11826123533718)。 + +**表 1** WAIT\_EVENTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

数据库进程名称。

+

type

+

text

+

event类型。

+

event

+

text

+

event名称。

+

wait

+

bigint

+

等待次数。

+

failed_wait

+

bigint

+

失败的等待次数。

+

total_wait_time

+

bigint

+

总等待时间(单位:微秒)。

+

avg_wait_time

+

bigint

+

平均等待时间(单位:微秒)。

+

max_wait_time

+

bigint

+

最大等待时间(单位:微秒)。

+

min_wait_time

+

bigint

+

最小等待时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/WDR-Snapshot-Schema.md b/content/zh/docs/Developerguide/WDR-Snapshot-Schema.md new file mode 100644 index 000000000..f38db41ce --- /dev/null +++ b/content/zh/docs/Developerguide/WDR-Snapshot-Schema.md @@ -0,0 +1,11 @@ +# WDR Snapshot Schema + +WDR Snasphot在启动后(打开参数[enable\_wdr\_snapshot](系统性能快照.md#zh-cn_topic_0237124757_section983311682019)),会在用户表空间"pg\_default",数据库"postgres"下新建schema "snapshot",用于持久化WDR快照数据。 + +根据参数[wdr\_snapshot\_retention\_days](系统性能快照.md#zh-cn_topic_0237124757_section1658494717518)来自动管理快照的生命周期。 + +- **[WDR Snapshot 原信息表](WDR-Snapshot-原信息表.md)** + +- **[WDR Snapshot 数据表](WDR-Snapshot-数据表.md)** + + diff --git "a/content/zh/docs/Developerguide/WDR-Snapshot-\345\216\237\344\277\241\346\201\257\350\241\250.md" "b/content/zh/docs/Developerguide/WDR-Snapshot-\345\216\237\344\277\241\346\201\257\350\241\250.md" new file mode 100644 index 000000000..886e2fd16 --- /dev/null +++ "b/content/zh/docs/Developerguide/WDR-Snapshot-\345\216\237\344\277\241\346\201\257\350\241\250.md" @@ -0,0 +1,7 @@ +# WDR Snapshot 原信息表 + +- **[SNAPSHOT.SNAPSHOT](SNAPSHOT-SNAPSHOT.md)** + +- **[SNAPSHOT.TABLES\_SNAP\_TIMESTAMP](SNAPSHOT-TABLES_SNAP_TIMESTAMP.md)** + + diff --git "a/content/zh/docs/Developerguide/WDR-Snapshot-\346\225\260\346\215\256\350\241\250.md" "b/content/zh/docs/Developerguide/WDR-Snapshot-\346\225\260\346\215\256\350\241\250.md" new file mode 100644 index 000000000..9233275a5 --- /dev/null +++ "b/content/zh/docs/Developerguide/WDR-Snapshot-\346\225\260\346\215\256\350\241\250.md" @@ -0,0 +1,6 @@ +# WDR Snapshot 数据表 + +WDR Snapshot数据表命名原则: snap\_\{源数据表\}。 + +WDR Snapshot数据表来源为[DBE\_PERF Schema](DBE_PERF-Schema.md)下所有的视图。 + diff --git a/content/zh/docs/Developerguide/WLM_USER_RESOURCE_CONFIG.md b/content/zh/docs/Developerguide/WLM_USER_RESOURCE_CONFIG.md new file mode 100644 index 000000000..d23814e96 --- /dev/null +++ b/content/zh/docs/Developerguide/WLM_USER_RESOURCE_CONFIG.md @@ -0,0 +1,88 @@ +# WLM\_USER\_RESOURCE\_CONFIG + +WLM\_USER\_RESOURCE\_CONFIG视图显示用户的资源配置信息。 + +**表 1** WLM\_USER\_RESOURCE\_CONFIG字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

userid

+

oid

+

用户oid。

+

username

+

name

+

用户名称。

+

sysadmin

+

boolean

+

是否是sysadmin。

+

rpoid

+

oid

+

资源池的oid。

+

respool

+

name

+

资源池的名称。

+

parentid

+

oid

+

父用户的oid。

+

totalspace

+

bigint

+

占用总空间大小。

+

spacelimit

+

bigint

+

空间大上限。

+

childcount

+

integer

+

子用户数量。

+

childlist

+

text

+

子用户的列表。

+
+ diff --git a/content/zh/docs/Developerguide/WLM_USER_RESOURCE_RUNTIME.md b/content/zh/docs/Developerguide/WLM_USER_RESOURCE_RUNTIME.md new file mode 100644 index 000000000..aa720a6da --- /dev/null +++ b/content/zh/docs/Developerguide/WLM_USER_RESOURCE_RUNTIME.md @@ -0,0 +1,95 @@ +# WLM\_USER\_RESOURCE\_RUNTIME + +WLM\_USER\_RESOURCE\_RUNTIME视图显示所有用户资源使用情况,需要使用管理员用户进行查询。此视图在GUC参数“use\_workload\_manager“为“on“时才有效。 + +**表 1** WLM\_USER\_RESOURCE\_RUNTIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

username

+

name

+

用户名。

+

used_memory

+

integer

+

正在使用的内存大小,单位MB。

+

total_memory

+

integer

+

可以使用的内存大小,单位MB。值为0表示未限制最大可用内存,其限制取决于数据库最大可用内存。

+

used_cpu

+

integer

+

正在使用的CPU核数。

+

total_cpu

+

integer

+

在该机器节点上,用户关联控制组的CPU核数总和。

+

used_space

+

bigint

+

已使用的存储空间大小,单位KB。

+

total_space

+

bigint

+

可使用的存储空间大小,单位KB,值为-1表示未限制最大存储空间。

+

used_temp_space

+

bigint

+

已使用的临时空间大小(预留字段,暂未使用),单位KB。

+

total_temp_space

+

bigint

+

可使用的临时空间大小(预留字段,暂未使用),单位KB,值为-1表示未限制最大临时存储空间。

+

used_spill_space

+

bigint

+

已使用的下盘空间大小(预留字段,暂未使用),单位KB。

+

total_spill_space

+

bigint

+

可使用的下盘空间大小(预留字段,暂未使用),单位KB,值为-1表示未限制最大下盘空间。

+
+ diff --git a/content/zh/docs/Developerguide/WORKLOAD_SQL_COUNT.md b/content/zh/docs/Developerguide/WORKLOAD_SQL_COUNT.md new file mode 100644 index 000000000..a4f2a1672 --- /dev/null +++ b/content/zh/docs/Developerguide/WORKLOAD_SQL_COUNT.md @@ -0,0 +1,74 @@ +# WORKLOAD\_SQL\_COUNT + +显示当前节点workload上的SQL数量分布。普通用户只可以看到自己在workload上的SQL分布;monadmin可以看到总的workload的负载情况。 + +**表 1** WORKLOAD\_SQL\_COUNT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

workload

+

name

+

负载名称。

+

select_count

+

bigint

+

select数量。

+

update_count

+

bigint

+

update数量。

+

insert_count

+

bigint

+

insert数量。

+

delete_count

+

bigint

+

delete数量。

+

ddl_count

+

bigint

+

ddl数量。

+

dml_count

+

bigint

+

dml数量。

+

dcl_count

+

bigint

+

dcl数量。

+
+ diff --git a/content/zh/docs/Developerguide/WORKLOAD_SQL_ELAPSE_TIME.md b/content/zh/docs/Developerguide/WORKLOAD_SQL_ELAPSE_TIME.md new file mode 100644 index 000000000..8eaaee2ed --- /dev/null +++ b/content/zh/docs/Developerguide/WORKLOAD_SQL_ELAPSE_TIME.md @@ -0,0 +1,137 @@ +# WORKLOAD\_SQL\_ELAPSE\_TIME + +WORKLOAD\_SQL\_ELAPSE\_TIME用来统计workload(业务负载)上的SUID信息。 + +**表 1** WORKLOAD\_SQL\_ELAPSE\_TIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

workload

+

name

+

workload(业务负载)名称。

+

total_select_elapse

+

bigint

+

总select的时间花费(单位:微秒)。

+

max_select_elapse

+

bigint

+

最大select的时间花费(单位:微秒)。

+

min_select_elapse

+

bigint

+

最小select的时间花费(单位:微秒)。

+

avg_select_elapse

+

bigint

+

平均select的时间花费(单位:微秒)。

+

total_update_elapse

+

bigint

+

总update的时间花费(单位:微秒)。

+

max_update_elapse

+

bigint

+

最大update的时间花费(单位:微秒)。

+

min_update_elapse

+

bigint

+

最小update的时间花费(单位:微秒)。

+

avg_update_elapse

+

bigint

+

平均update的时间花费(单位:微秒)。

+

total_insert_elapse

+

bigint

+

总insert的时间花费(单位:微秒)。

+

max_insert_elapse

+

bigint

+

最大insert的时间花费(单位:微秒)。

+

min_insert_elapse

+

bigint

+

最小insert的时间花费(单位:微秒)。

+

avg_insert_elapse

+

bigint

+

平均insert的时间花费(单位:微秒)。

+

total_delete_elapse

+

bigint

+

总delete的时间花费(单位:微秒)。

+

max_delete_elapse

+

bigint

+

最大delete的时间花费(单位:微秒)。

+

min_delete_elapse

+

bigint

+

最小delete的时间花费(单位:微秒)。

+

avg_delete_elapse

+

bigint

+

平均delete的时间花费(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/WORKLOAD_TRANSACTION.md b/content/zh/docs/Developerguide/WORKLOAD_TRANSACTION.md new file mode 100644 index 000000000..79d11a9f6 --- /dev/null +++ b/content/zh/docs/Developerguide/WORKLOAD_TRANSACTION.md @@ -0,0 +1,109 @@ +# WORKLOAD\_TRANSACTION + +当前节点上负载的事务信息。 + +**表 1** WORKLOAD\_TRANSACTION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

workload

+

name

+

负载的名称。

+

commit_counter

+

bigint

+

用户事务commit数量。

+

rollback_counter

+

bigint

+

用户事务rollback数量。

+

resp_min

+

bigint

+

用户事务最小响应时间(单位:微秒)。

+

resp_max

+

bigint

+

用户事务最大响应时间(单位:微秒)。

+

resp_avg

+

bigint

+

用户事务平均响应时间(单位:微秒)。

+

resp_total

+

bigint

+

用户事务总响应时间(单位:微秒)。

+

bg_commit_counter

+

bigint

+

后台事务commit数量。

+

bg_rollback_counter

+

bigint

+

后台事务rollback数量。

+

bg_resp_min

+

bigint

+

后台事务最小响应时间(单位:微秒)。

+

bg_resp_max

+

bigint

+

后台事务最大响应时间(单位:微秒)。

+

bg_resp_avg

+

bigint

+

后台事务平均响应时间(单位:微秒)。

+

bg_resp_total

+

bigint

+

后台事务总响应时间(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/Wait-Events.md b/content/zh/docs/Developerguide/Wait-Events.md new file mode 100644 index 000000000..76f68a39d --- /dev/null +++ b/content/zh/docs/Developerguide/Wait-Events.md @@ -0,0 +1,7 @@ +# Wait Events + +- **[WAIT\_EVENTS](WAIT_EVENTS.md)** + +- **[GLOBAL\_WAIT\_EVENTS](GLOBAL_WAIT_EVENTS.md)** + + diff --git a/content/zh/docs/Developerguide/Workload-Manager.md b/content/zh/docs/Developerguide/Workload-Manager.md new file mode 100644 index 000000000..44fb10424 --- /dev/null +++ b/content/zh/docs/Developerguide/Workload-Manager.md @@ -0,0 +1,7 @@ +# Workload Manager + +- **[WLM\_USER\_RESOURCE\_CONFIG](WLM_USER_RESOURCE_CONFIG.md)** + +- **[WLM\_USER\_RESOURCE\_RUNTIME](WLM_USER_RESOURCE_RUNTIME.md)** + + diff --git a/content/zh/docs/Developerguide/Workload.md b/content/zh/docs/Developerguide/Workload.md new file mode 100644 index 000000000..6e69fdc69 --- /dev/null +++ b/content/zh/docs/Developerguide/Workload.md @@ -0,0 +1,17 @@ +# Workload + +- **[WORKLOAD\_SQL\_COUNT](WORKLOAD_SQL_COUNT.md)** + +- **[SUMMARY\_WORKLOAD\_SQL\_COUNT](SUMMARY_WORKLOAD_SQL_COUNT.md)** + +- **[WORKLOAD\_TRANSACTION](WORKLOAD_TRANSACTION.md)** + +- **[SUMMARY\_WORKLOAD\_TRANSACTION](SUMMARY_WORKLOAD_TRANSACTION.md)** + +- **[GLOBAL\_WORKLOAD\_TRANSACTION](GLOBAL_WORKLOAD_TRANSACTION.md)** + +- **[WORKLOAD\_SQL\_ELAPSE\_TIME](WORKLOAD_SQL_ELAPSE_TIME.md)** + +- **[SUMMARY\_WORKLOAD\_SQL\_ELAPSE\_TIME](SUMMARY_WORKLOAD_SQL_ELAPSE_TIME.md)** + + diff --git a/content/zh/docs/Developerguide/X-Tuner.md b/content/zh/docs/Developerguide/X-Tuner.md new file mode 100644 index 000000000..7ac9b1cf7 --- /dev/null +++ b/content/zh/docs/Developerguide/X-Tuner.md @@ -0,0 +1,13 @@ +# X-Tuner + +- **[概述](概述-8.md)** + +- **[使用指导](使用指导-9.md)** + +- **[获取帮助](获取帮助.md)** + +- **[命令参考](命令参考.md)** + +- **[常见问题处理](常见问题处理-10.md)** + + diff --git "a/content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\2641\357\274\211.png" "b/content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\2641\357\274\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..2becb07629a18d90fa24ae5450a6237d08a1df33 GIT binary patch literal 76589 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 YtZ~))H=cePM}z-qs_Lp#D_Ms9Ur>%)ZU6uP literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\2642\357\274\211.png" "b/content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\2642\357\274\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..41a7ab13e33a0164f63d32d97b72ecfda7d65ab8 GIT binary patch literal 83041 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

R8uSyW~G=89K{3eLFQEu>=!5TJ$wfz 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 |;#kXa`S*$u!?*YN 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 C@Hij< literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\264\347\244\272\344\276\2133\357\274\211.png" "b/content/zh/docs/Developerguide/figures/12-4-5-4-\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230(\347\244\272\344\276\213\351\224\231\344\271\261\350\260\203\346\225\264\347\244\272\344\276\2133\357\274\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..f57228342bf497736a5ee69f029191deb1fc7869 GIT binary patch literal 65673 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/FOR_AS_loop.png b/content/zh/docs/Developerguide/figures/FOR_AS_loop.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb95b0afd1cf65cfa2cda35bdf4e076f2bbc5b2 GIT binary patch literal 3924 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 VKA!u+gZvW)80nkpRqHrE{~y=kbXNcX literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/IF_THEN.jpg b/content/zh/docs/Developerguide/figures/IF_THEN.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0c994c47aff0233bc71499b6464a23a88e8b5f2 GIT binary patch literal 7459 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 O0%$AzpBEIw%zpq!u{0I{ literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/IF_THEN_ELSE.jpg b/content/zh/docs/Developerguide/figures/IF_THEN_ELSE.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2f6cbe05da7a9847565189bdd4de6124e909571 GIT binary patch literal 9206 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 g&-Vdv;|2PXlRb=-nt%vwrfw0AIH`YybcN literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/SQL\345\274\225\346\223\216\346\211\247\350\241\214\346\237\245\350\257\242\347\261\273SQL\350\257\255\345\217\245\347\232\204\346\265\201\347\250\213.png" "b/content/zh/docs/Developerguide/figures/SQL\345\274\225\346\223\216\346\211\247\350\241\214\346\237\245\350\257\242\347\261\273SQL\350\257\255\345\217\245\347\232\204\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..15a28deba75f2428c785e0150d2f153140183516 GIT binary patch literal 24378 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/anonymous_block.png b/content/zh/docs/Developerguide/figures/anonymous_block.png new file mode 100644 index 0000000000000000000000000000000000000000..03a1b7fce4fd91051bd03bd391add89f62bb8375 GIT binary patch literal 3905 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 b_cHJg5&H`bt|#6M00000NkvXXu0mjf+l}iv literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/call_anonymous_block.png b/content/zh/docs/Developerguide/figures/call_anonymous_block.png new file mode 100644 index 0000000000000000000000000000000000000000..a922995d474f54125c589d24412d1618741946de GIT binary patch literal 8713 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 jPSpw@M$-T1z4s7C zxlu+N5nMeCMtPEV|AhDBTWg=P*SGd}_W9O2Ykeo)$Uu{xhJywG0MKh|sha=*%z^5PQ~#x9=?wtf==wFt`aFuC z0swS&+Ulxi0k&J&?(lyEfiIexMO@xW1ZR}{@UQVDi%J!9!}UT)r9~7#24E(ZcyZRn z4vYZ&0s(kNpxl-Fmz{NCRha$_P}{=@w^Yd~RRCAOkxK!{xv%h=-^dwu_LG>(@IYY9 zPGxkjUtUUw)Ka3%zZb^W;%R=Gte;#Git#KALL$T*;388ddMl|K^^OTLHoDPi`9tW> zw2k~d%#d&smn;ie@v7?K4JWFPtj%>}^?TLA6XFYl*g-{3^HMr-JCx`*Z<-t?XwajkmI6QYcOq3LQc}^k*wkSD^Dp%~pUZmyAe*;dA=jNonW=n_8F6q!^ixSt!KE4-!qIf!)L|?? z&)&*5F3K7k@PvFgz>tP)k3I@Wj2X>#O3J)YTl!keDJ zIL(|jss?e}6S{{O_hn(_RBa#geg@C9PHs@zK4L2zUqAy8oJOH}Svt<3$ zOn=|^`*od*3T5O-Pva#b(LERU80}=3x6cI5;Ud1@YI5vFD%&-lim=oLu3?78E|a+A zC6*w2q^8#T-EDa3c$q2*(jowh(oM?j8ad6zg)-0%F-#*1!y7(5TOhf=s|jkXzEv_X zY`mG>wIIu>tFzqv8;U&qg+mh8N%E;TpSuz~aOM$~WMk^9ZhQdaDFKp&N z7t3POUo$nY;%7$1By@^;%rxDKHUDfdAA)C{p1;ib#t>Xhc^iB` zH&979Or>m2OUKtw;E%&P{WuRVKMp*84<*6B!U>d>qt`_Z1~(`aIKD4{*<@!Iy7;;d zDcu@Bk!(}2rb5bqtwF;(5BSslX^YCHRt$DkK5Ss^uf6Ho*h%c_Iv9;UIKg|58tTtc z%!Dxjr5#+=)HTQv(&k_>Qd9E;+4jbGvyo=<1aBkx)k`swLrpqJ+kL7Ml)FnaNzq{A zG(Kt^{KR&V;d3p#4+}dQfY$V;O5|_MN3{x2{vprc`fBma0OkuT5HY_o4;5BAiEpX8 z@Tw$Lt~E%9eA(istM=%gUeeRkaKc95*SMt1X1%*N3GkrH&l6dloa6G3f-jIOj&%4d$8ZsEl^XXh@(zKRj z7qBczHvda)^iI5)EN!Gq5|w@&-c{60`Yf2&qQz)+mIHugj14d+;clNrH2frLRh zn=jcH%>Lz2bGDz8^l8K9TFJqUheOb(ip#?~M`vnUuGX-DC?e?8R@m1-RJ1282b6Ty zbo~KAoL0(&Wg+F!QHZ6zC)l_@9cPTS-`JsP89@iDOUi2p!I-#xrd>-!}>k0a&0^%M3! zz3t~Lt(IXKwV}X^)Z-Ngw1+;jr6{!TNy6XZg{6@mlO_@*c_jOG7CDJZkjIGX=wWKp z^oO9Rd!sXX&(x8rh)k1|h7-1%Yq8c&*6RAc^%mx?iER%AhJqqona96=$k+v-S-XeBzUXqMtxSc;Zrxuw-z#$ z3wz3O*Vjs!Dxb4V9hFA@n0+m!;YJF@eF=y~cy9jeIB}&cn~kYGcjZ2newsKo6Sm+Z z27aE+CA;u4!uMTe-NH*;&!)u_Y+bmR()@md)sJIUlE8l@MT9^7n-4G96(;jFGMTl+ zz#pe?)8XIzmWAv7@G2@7gUzOC&Y`arLNx~>gxHyXn-Eo>_CmNNOdVNOe{2O6LVXJ$ z0lMTPt9 z1XEkoQ@fGsV?_LCIPz;l1H11a>|s7BbPZmAl5I*mxVHi32`0;>?e-LGzs|eOU2R2< z>wENd2Tkwy zZL~1D;O@SxUSLJ(_IV7Efwd`R{$@bKvRj8{B;V1txqh5oA|AgLX=)@6u=3lOR z)IG033U(r#XmEMAT!km3BHy|%ch)Jas<5u}G|Ps>&nB|7b*wkOr_bubLLz9AW%$0f z>NkKJ_K0U^l79a*b1qB@zS$aj|8mwn!5)TPN_Z5+4>5Sh2n{-!&-0v*Ta-N7+Fyl$ zMGVO}e?+y*x~s7w_;5sO@~v9 zq3uk%dzB2xdmel_QbB9WC0M^=Z<)shwjB%W#WF5M?LPUX`=O=0L*zowc~;uPo)V=C zp&%y87u*m7D@EvOAhZJ1m0jB>5FKTch%g4w3o`IQ%--2w8)6MMk)pdPt{j>U3Ne2j zA|5$5qb`jvYv(O>7%t8z>BibeMg84HP51Y`@BXuU6|rjy%=ie$c0U-gcCwEi?Tx$r2~hjMLk08Ud<~TKfkYCx!C2+UQAZnuysM}cr^ zeGD_dno`I$GCh>oe!_j#t6o(_6Y&4Q|F$HNm;K~z*2#@B;H&=!KpSeH{z=U~>OYLb B4|V_m literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/call_procedure.png b/content/zh/docs/Developerguide/figures/call_procedure.png new file mode 100644 index 0000000000000000000000000000000000000000..cc33139552fe08c0814f78ec0fd7b60d3f32a581 GIT binary patch literal 5805 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/close_cursor.jpg b/content/zh/docs/Developerguide/figures/close_cursor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8b55369321f416b7c9286966ea39b5965b66227 GIT binary patch literal 3457 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 IYkBGZzcx;JjsO4v literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/declare_variable.png b/content/zh/docs/Developerguide/figures/declare_variable.png new file mode 100644 index 0000000000000000000000000000000000000000..12a9342a08bf2a8777df3407fc296365c3b70e3b GIT binary patch literal 2823 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/fetch_cursor.png b/content/zh/docs/Developerguide/figures/fetch_cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..2e34d6892396bc589d07d2266a2ee46e66f16898 GIT binary patch literal 3142 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 MSlU|DoB1UD2NRhe{Qv*} literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/for_loop.png b/content/zh/docs/Developerguide/figures/for_loop.png new file mode 100644 index 0000000000000000000000000000000000000000..f4adee6a07aabb8fcc209386508b5e270130f32b GIT binary patch literal 5430 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/for_loop_query.png b/content/zh/docs/Developerguide/figures/for_loop_query.png new file mode 100644 index 0000000000000000000000000000000000000000..18fc66d6cf2dbc36e47c594ce47b48c9da569808 GIT binary patch literal 3913 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 literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/openGauss\346\200\247\350\203\275\350\260\203\344\274\230\346\265\201\347\250\213.png" "b/content/zh/docs/Developerguide/figures/openGauss\346\200\247\350\203\275\350\260\203\344\274\230\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..1360be8c15cb1b1f3635f4dbf31fdcc101b90943 GIT binary patch literal 27594 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 z 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 Y+(K=uifuFtJkAA@msXZ4moNZ>i_@% literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/open_dynamic_cursor.png b/content/zh/docs/Developerguide/figures/open_dynamic_cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..8282aee18b8a9e3e20f51296677b84c2293d147a GIT binary patch literal 4313 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 hp=`ka>e3g~FNzCW1RSA`lEL-qgw literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/open_for.png b/content/zh/docs/Developerguide/figures/open_for.png new file mode 100644 index 0000000000000000000000000000000000000000..acfed7a343bdf302b0428b613ef2f94a0c9a4130 GIT binary patch literal 3940 zcmc(i`8(9#`^R51*0CFmwd^}%5Xq8J)~v~%Z6dH8+27d)*$Ja$7ZrJ1 zB5JHfwlbFQ^u0cR!RMFHxvq20eeUbr_kFH&J+Je)PLi349wQwO9RL7~2Kw6O006?0 zZ7*6dd7NKSY$8vfKy$qtK>Y;Y26;j0u4SwR0FCMNrzk4&8sevK8wdbQ1AjZ{oo}@( z+4y6itz{A7xZ^M%y(+-a{j0U)S+?W!NN^J;?>z08;SF{4U~5e`)#n zEVTDb63gkLCeL}jUW4;T&3xdVWETDsJLvIwj0^1u9jMr=ap%@(1PKg`w| zTEfSV>f+@|ed}&((%)gTF^N6NI zVQ_t~nba5-D5EuE`?HkbJRF2#eiN@%<{j z+PwI;<@Y z+0YM*cckaRquhl~rAiK5J?xD3>-m*qyVu`g#w}gF<0|k-_hxG_WeHSgXqmg%1bNw4 zO(h#CxNJ;VpLz1~nZagQ+rkp>ES#-^#(mcRq0Hx>;_R~UH%CY$ajLs^`t8RwLDc=z z-T4_L?`RgHi@=z3dRfl+9vsdZCI>0|Cr;1gcth9q=J{)r^ts`w=aD1WrDQ^_Pzh`Z zE1g>(oKX;0g=F6~lB|qUcVkO&JdvX8j&cUi&w5H=vd>@UCaE$&6>by&6pxa9(yc<;tJ358q?kXl;xBQp!OYHSRByi_ z3$FvNIxR0U#_2Q~XHIpPeyM-aY|47YwUdE+P9o=u>z!uZ9gLI)m-(>ta=9An)&!;N zNgtuNmA>Y7vQ^8%SwM8j-p5q$qFIRxrM!=+9K^ed9^|LG@0eF2HdF0oE4`WpdJ9_l zrz(r(!bP0BF+OqesP6luH=ZWFt>U3xEX79)rq1U|ukg83IIyQnt(HP1xFm zFYE%8Q2-0eI;RN3D>7i5>B!ZoAO)o%v|w6wZcyL_G8O4ozO)Dl0fWh*lq@VMx!hbi z_*)*e4DIX3O=D4Ieun15>Ca&5QW%;mGSL zu$G~8%f*l0t}^WlcN?+>reyw%gB`IQoEnn;;f6gsrEl~AtphJJ;CdKw+c5~YJt1p_Aq$9A60VRH% zTF#rzc)*45i zp2r3+DJl#g|Jxs!+IC+jt5JT;$=hXl-~crkJ=R zc%m*7eVv+KCpn|38YaT)56=M!zw-I9Y~yNCUjFqbb>C316QFMM3tu8J39vYPXQ z@bqY;gMvFErZhT^Dw;0Y?$wdlOXkO}<5H~6^wMF$wcYJfPh=mJ0^dEFO5$=7C`Vzm z2O0PPj(r7&ruV(8>kU^Lc781}8RU^@KVOZ{R>k1Tr?L1OvP01unh?ET=>}XLZ3}_u zwu{s5+%Sr5_%@dr&RJt>lql6UCg{Ykq^{4hE`ngQuU2L> z3&Sf2#N)cf2P+kmH6HZaap=+5IrgMpOpb=f?})woqtGelTFk5KXV2 zce~N>bSOm3@v@8jMj?77D6LPX@RHjZEBUcFd{;qC{c1U@s9)D%CqDmgFN|ro3(zD647VQ1$tmi#Y5~w0YU`)7|M5*q%Amsp0LWH!KPK`S$GZf8;T8ik4Yo;m03A#x!xu5n{sML!T*~L$YRUm zBGJ7MjF`Vi{K6<<$$-HMkVQS9&*3atdMVhWK2xP^>C zb*<=PDSbAjgM56B?^|^)ReJIHcLx|;7=yj`MJLEPmuuP(%m6Yo zqmYc`%i=jez{ue4C#!*)6Zk;>{+Y#+Bu_KLe!5a(!xf$q~XxHCxj`=@p C88TD= literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/open_static_cursor.png b/content/zh/docs/Developerguide/figures/open_static_cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..52eed83654c09e7958c2a4cbd5da152b4afa810a GIT binary patch literal 3070 zcmeHJ_ct4g9*+@4xJKKE(U`GkTYB}GC1!)R>S}7wkRm9Wh*7GjRaC18p+(C@w794h zirP_bqGInoYQ*ky-=FY)d*{4!zUwp2`JVIr=^JllVa&}b#0dZZxJ^wA?*af!)brVv zo%y_WR_pVfH>SY5#&dT#XyV1b$ZTfeC;;V0aSHNP)%D;Uit4HK^`VtSal*Q+MFg8euqI zoK%V5Egl8=xp)oBe(*X;Rp(>zP~pJ(eQ^@m-5At52 ziz1sMs}|B}l~QWe2V4Z$pl4*dS*HU+l|fU^ z>K5P4@8mHyCnq7ny}>2K$6!*+3x z=vgVvzp(cY67~hPwLO$e4ucb?6P0iJ(RP;hh;Ewprb@{xHa#~jFuh1{)HL)t;P9~!;Kp1HoOT~?CD0SOeQeiEyE}GyH1YqzZyOr zBv-0z9ts`Z4NR_Xyn3>1UE5T*r+MnqJ?=>F2(IB?zb!N-&Ur9UFY#jKb*$cidOOv} zQ4BbAsejK(1+g%celab>>_|vNM+XTS=uu*WbhTkfPey`qz7ib>DYHq0>X2 z4i=B&J5`5MhxoAfZEvI*{Fh(ESCoRmin66n!J^-1Rq9rohAPQf;77{((`fX;l=6rU zcQBqhmRu)1M+6E>=a8JH4P9(c&0!wo%Fa{^zu3ZuxlmIyYV2LS;mBT=Glnx%mGhe9 z*{1>*`p?9(LFxQZKAHBKZnxx`Y?;Xnm2j_+?{l`KIu)IL)%btKn{swbNlttr8gySh zGS2=McJ0UKhSL2nQ+uyPv_Lg(@%>Rs6^D!++`LY5`UdVq0Y39MVYpGb2Hm$@*Hc_9 zS!_PPq)hVCR^a`xK5Q{`+bST`Wg{%j{92!GjMPV&f@yj6vd$5paL-sTN(+cSe&O|r zsgS{0kTjwGAppr>k^tw}Y2`;oRlS(96ELkAt`^7h@~N0?>WoaVd4&KB?KszF%Z z-{$r%#SgL`G1jyhGEA#M8VykS;$?3#P00#p&!N`c#_u&wq3OnL$-jDyZ856|^~x4j#sA)s%gr}P&VT|>tU zuAh7)jKaPa2lVzjPOxb{T^|khbNpR*bBnPsuQi`Kn1E~5kx$}R1jhqKy%OHHgpc?) z&Y0a@&>D6as^V#iQ15%wy<4B=`pUS2;oVbAp0l|EoOpW~7e~RSkXFE2j7OsT$Rg}S zG$PZ0XTGoTZ1>2nl769vdr>zz-QJoi8)(tNLb^Zr82srZM#hEaJjUWlGq1@L9Wo6bvHlA`B{{K*SHC5lb@|moSt{sso(qZ z&JThvVgkM{Qcw%Wv(4!}KBfQy8Qx zjcR5<^dhLdq&;lmQnNbqB7@7RwfSSRTt?KGs6ix&Wg1n>WK>B!_4%D_sO+68Cw75o zHRe%ogKTJGQ5MPvQoa0?AO62$&W&G?lKUAw-K2mNHuAv{wJ1^Ic3d6osM4g3UDU;f zBFAj`b6O%FXiy7DC&!g0hevUTB#a zmlDKM>>>UlQ_OscnYO#uN7<9ZPpO-Ei0}babk@IRDg{`HM*E)MbD`M zj%um<25@@Ez%mAenN4|JO~g_n7e=2@dMJd07yg$|;?|7WGE_ACdK5K5NDMz8%TJD_ z3hp7AZ@5w??lWl>6Yw#`aK+JsPqAvsnA-an*JzN>bp*fR!nQr;-lchhfoe}|DV;^B zR@rjjgKw!`BWrcVU**85h!hLnE0j*Qz zL`d-Fy>Cx58WO2>3!l{8;agjs70!Un)-7f6DAju9hlMWwqs|?6;U_j72S{H{K)&@t zKMqN(OIPxT9lqfm$Ouw>#M|3++&b>9zrde9n%srOtD`6ahq#EdExJ1EcvFZ^$#&=a zio-)%wLi^evtB>tF@W@b@TLT(|@^F6VG zMC&H4XwG8Yj)DT9f*sP;44J2yq5GA}LiS&NCgAqXm$ yode={spomVfB;JjFpXq2lF<7<{omZ=jD?`(l2cB@nw|gb08_YyVfihmsDA^=i=}-4 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/raise.png b/content/zh/docs/Developerguide/figures/raise.png new file mode 100644 index 0000000000000000000000000000000000000000..85411be452cfb2aba72afd041e02139478b173d2 GIT binary patch literal 927 zcmeAS@N?(olHy`uVBq!ia0vp^y+CZn!2~2r4SQXH6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?4j!ywFfJby(B0|T>(r;B4qMcmsNuS=T^cv_9)*pg(*5~t=| zdL;fsF}d@#)>E0M;nH6|{hi=a@%P4aPOd%k0+w9;kvwN!p|FJd<1aj{^8%mFsjK?? zp1xi7UX#Nvyrl#ivU)<(anKLX!hJ^3YRmg4dTi_ovR-qwou zUN4Wnw@o12{`K#kqB#5gW%qMWZ`!#b#O=9n+SFB=o5UsWGnh@D?EU^LkJ7RFjEjp- z$oBaC7g71>v8?e%<<=83Ey#1iS+8tKV#ux_#0A?A*eo z4Iy3=_n!FSIOorq&&l13A{syXR10r;yS$GlNYnM3(&PP4MXtHcYt~p7pu2{DQF58K zel$=ADy1^6FOfThBR5zISZe8**yj z-)(03hnE~&nm+%g|D`*pz6EJ|R^LDP_`d(;ezw9%d>>z4{mks8*m}Z8f0^X|s3Z>M zbBhi?=*)9>D3STa$D23Z_HE^R4wFAqzsE8MtbG0G-~*rXl6QueXGpGSC}d&{DKhu- za%#@(5!P5RX?J0ekd#mI90$g!cX}sJx{x6Cn1yS_le{@oTG%d2s0TQxmOoyiVlv~H zMI)2ePHA=3g$GTJaf$?-ylbJ!$-B(ZZ$X3CyJMc783w&nGy1Q%jO2w0ESyi8ftiZI M)78&qol`;+06cK7i~s-t literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/raise_condition.png b/content/zh/docs/Developerguide/figures/raise_condition.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f844c357e3a4bc0acecfe96938a35e8f6c568a GIT binary patch literal 4070 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 M=^=H?w4I~=19t+1W&i*H literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/raise_format.png b/content/zh/docs/Developerguide/figures/raise_format.png new file mode 100644 index 0000000000000000000000000000000000000000..c278db49b518b0f9e52192cc4aa5ad66fa1e646d GIT binary patch literal 5233 zcmc(j^;?sD)WFB+Mv+huK|*p9)zKi0RSjw$#NV zDcArMY}~OO?Wy5vlKcQ5`8roa{GhrJZ*x-McP#cHvVZMRZPri#U1)~|)pMVt`N{KZ zf*!2)xl~~75x(m%ZFDgxaD}B*NV$a>@h$TJh&qw@or%0|+?Y^RzQl&jaw`8@D5%~DkE8G~;T)r9w)DbzpB_)5;Y zQ⪼F!v^(d&-6|^kC<_wbLQLohToByc-vM{Oa5ieBd1vfIJ95tH%GDOu*prmD6K! zhc-oW1q>$=0qZFXCZYFV&)kV6-a|6I{!6UyqJUKG6NQ)j9BBg!(-{_BE>2&9P`HXY8sGBEqew&4z_Qg|uqa z=h*!)$!{tL|ME13D#|@9whzIVimbR47BauJ_m!E;ry#f8VVNWknDCH+nD!d{s_FPdO zUUg2f>0p#qfN6h>c3oBm2KCtv(g-R?o*u~xe@l9VmEwr)2?P*U zJXpIB6*!IEW#Zj$^|gxs^ljb<65_UbdvyOk-msb_sZQDB29p_S65Ez}IMp&_PZ}~L zS`dF}y=*(=gYuU}hWbicRS7f?S%0AWot_=?YMFEI-%)(fd0-S%+D*~DGtjDh@5((= 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/raise_option.png b/content/zh/docs/Developerguide/figures/raise_option.png new file mode 100644 index 0000000000000000000000000000000000000000..2c28d3c5ffa7084dc29383b525d4a3eb7e99db8d GIT binary patch literal 3000 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 literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/record\347\261\273\345\236\213\347\232\204\350\257\255\346\263\225.png" "b/content/zh/docs/Developerguide/figures/record\347\261\273\345\236\213\347\232\204\350\257\255\346\263\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..339ec5a43417ec3331fd06ca60e23342e75f2a7a GIT binary patch literal 20418 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/using_clause-1.png b/content/zh/docs/Developerguide/figures/using_clause-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce079a0d75d31435f76fcf094a7eb36bf172e69 GIT binary patch literal 4831 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/using_clause-2.png b/content/zh/docs/Developerguide/figures/using_clause-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce079a0d75d31435f76fcf094a7eb36bf172e69 GIT binary patch literal 4831 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/using_clause.png b/content/zh/docs/Developerguide/figures/using_clause.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d894a3f6ca61503cce2a7d9eac808b01bce590 GIT binary patch literal 3702 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 IN*x^jKN$Py=Kufz literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/when_clause.png b/content/zh/docs/Developerguide/figures/when_clause.png new file mode 100644 index 0000000000000000000000000000000000000000..e03d843e350d381cc518fbbd18998f338b2ee88a GIT binary patch literal 2805 zcmd^>`8O178^>oD8v9O#jCJfww(JwhGIk;I*pf11jLDjPNg|IejR+CNSf;44^boR4 z@r<1q#!|>OQ!)0XcY6Pc_lNg~`##s_T=%)pb-$Z2u(RM|KhF*T0Jy9yuQ&k! zz(Gds3}#~7g&ZM&02u0IVG6(ximfpKbo;XHWdNWdo8#D*g~4ngmhPbd0C)GF10467@buSI!LOQ?l)5YE)*HibL=4I(!R?PxBJU~f~H)>gYSEh~WhQc>zfYIUa&Qa3TP#1qI+xS!bCUWg?(bSR23u0Wgu+Jf#T< zMzMYMvfQ-eC*M(-vc#ZBhcE9?)(dt- znpmxZ7Uke9-$aeSw_typ3NqYYh+EJ4+|NeWW?&n!J?3gF7ugbVLzWQXl`v+3J~SE2 zjz2jX6x9l)9-ZVF-0wY}?>IQlK-wM7$IL%~v=0yT>M6aZkh;ov_S_INe4se2=yzozT{#hVr z1h`+jAT21je;o`V+}eKpi1OB(KV&@D#S~6L>8+LTwyd@cx15+D=VQV|;Pq}@NOObH z1HzN30&j19Hc6_&a2K`LnWzD+3odjEfHOedV@adF(-dtt;?Tb@8NV)*)t=TKK#`%m3HF|v*B~M zdx83I{*ocoBeRv53VAngpQnRn2KK#P07Z?ucNNud+1dAJJ%?Kx8QyV1wG3}jFBm9}v8#@L3zD(ZQ! zj_J22m(*rCri#TCHQ*{g`WqaeHMp(RIg@JrSDIF>ckn~o(UQYZz3o{-Uq|Ckg@D9Fx4Pyod9|IMq?vnGA#1XX z`98~iXQio5sD0R0>YC#bC(GJ*NA9tR&=5QM9#yfX2(|QFWyqwb+|993Ov3IY_9;d= zE=&X#S$rtO`Ce|?Jm`%FJlHSP#{|k<{1utNl-_)*^$JR}uU;bBoN`xrjJxLwk-$(+JF@ttZTB zjgLq(tsA=eqEMBhRQda6;m+Ywz3kp5VngC{Ue#*?p+NJf+BUepROZom>AFf=?XpWy zEX6iI+5^%05Yf{>#bZUSVvVcm>#eO4Ut6|vrR%y>()qN|%o~}Tsri~|CCOR7jzTS9 zYV4fMzT5b`4e`{}6bF9(Xn7 z+TF8-mue)SDemZPx&6_`3CYE8FWBjU0JRQ7?v;Oi-z8k~p)~5xP--i&P*U!MM?4j$ zzOAI=vsQ&xD%M8LJaf5kTkVJ^2l(;QP z{WBC-fd3J&gQs+u>eA`uS>fL*VwDq=`yP$N@A~6TKV;8GB)>h-d~XIOy>2F~v=BK& ziFen-?#5CUhJWpBfb(@4$_7ftpw!i=F@6CkJS~r(V^1M6=PCq73re3xHquoGI-a&{ zIZzwIbb>bJ;A*40&ZB=1TAUD|an?v9>V%-55K>mxffMI6|JJ9Yv+Pld3%~MB{2lDH z?ql-BNOJSnl|jF3dh4L~FJ;F6Pza zbID8U>I~Of;FrgG&|qd{c*PlmK4ezw>Zb2=+#@_-r0`$-03p?uNkv(^A-$EZ!d=Eg_& zb38>U3^$g7Tv5Ir{3cTrBM@cJaONUp7&j9EBqJ{}a0ZJ}DT#`a40brvP>U)ErgQ#j zShD`NA#RB>NM1b$n!CDy`Q@kAc`-QOn$38>+}CYJp0X+oQkDK$7Xh-EKfOiy#q-Ik zZ2Wq=XvDeHwk(>2#*mt!@W2vClQ$~AQ@Zh`R6u&cMc28x&23UQW?+$~owgydc^LrG z0xJ4Oo)$k(HfX=w*B`mX2e+h3Pie@5!_3MG{;Cft%kfxbOOAp3R8L~UO+b0-ns|uQ zQBjtto1Lo{K>EhPc<}!^MP_=5-pHr@Px*pSbZt2n}0_;~!98Azr)- zd=G2C8`_#wsadL2V%@ynumX99E%3$}#d`=~4u2|#jHn8*GPk>eH}y&W52@ZKZU6uP literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/while_loop.png b/content/zh/docs/Developerguide/figures/while_loop.png new file mode 100644 index 0000000000000000000000000000000000000000..66506a24dd6442e143b554f5e8ef37501e612102 GIT binary patch literal 3453 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0118861065.jpg b/content/zh/docs/Developerguide/figures/zh-cn_image_0118861065.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bbeac003592a2cf52c838e108b4978d903b5ad3 GIT binary patch literal 66854 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 Cx-$*{ literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0246254082.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0246254082.png new file mode 100644 index 0000000000000000000000000000000000000000..fb06b2b05dcc099bb0b4f53675cd187699411f98 GIT binary patch literal 27239 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0252660975.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0252660975.png new file mode 100644 index 0000000000000000000000000000000000000000..8d006d2ba771efb806ff19e93555ecc0d5eaf2d3 GIT binary patch literal 52545 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 z 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 MqIIuW$@1m@2W7~IfdBvi literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0252663634.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0252663634.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c43b73c4dab2c8360ba9c4b7894793e3ac2345 GIT binary patch literal 15359 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0253028833.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253028833.png new file mode 100644 index 0000000000000000000000000000000000000000..511de3baaf353522deb5e2a991490aa17ec5f062 GIT binary patch literal 77804 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


FdQW=ojgsXkw^D;oNd@+JAUH8_4ORBY%3%yP zW$+mI24#M-kd@3a{Z$9KSQoXuNCZ}WerqwAqU4wJ16%rTspsi(-8PwHggl`)yIk52 zQQRT__+VP z-y};Pzeh^Bq9*W1|tl+|mGI!n=ZG+S+F62Ao5T;;!aUqJK^7bKB?d{rjt z|F03!(LV`E|DxaNm6&b!o?`?~4xN1#)<(D87_$N2flEEKVdyl&&50F3g{2fme`JH3%8n58aZAz_iL`*j{TFZ`ZFWVqLRbWNf?PpQ^11 zN%9|t$eF(xB7t_($=60m zjo0P|+F^&#Ly*3B$qF!t)VCG%sqp%_tc3WlrDrRRhPF z>-HIGl$f{=+k<*!e<+6s>@B;sm1g#E+-f_`EE>se2P zLEdsgb9Fj5^}ZPuLO}=%ILM*?(Yx$8UVPn@;YYR%HIUM0uIV=znLl_Z#D?~4W+b5B z4d)3*2pO2@Cn`%!x#>nqgQbGeikRXG>(s=h2nu+Yh!LXitS0)Zc`eS`nyTX^z47Q@ zCWB_@;iO>%yv#Nxb2|ypd1p9{q#z1O1osla_-uqFk^b ziK*0$YiI%`tQ-n7Rz4zA;BQ<-#?8IN$;>ZgP#vTw z>4_ZqR#Jr_`V5$ElhPe4aV_f8M}EdlIMk3#nn9ev^!C9uuGx;@2TV(t2QStqrSCCG zQ2(wa+xk;&!g;$Id6t-TL3w^RNA*M&tRL|`75iYxuCbm)z5ZQ#51&I92Uq(3`j`_x z3G}y`X!Uv5rZ;1ec48fs7t zIhEGx@gBiexIkCkJnxh`9~??leB|^_3WTvQ!au5 z907bk6pce7IOxfQ_$G6KUbK4WNX{%QouQm!ZUMP@Ie23?qHEoBAtx>BHVrkq<|Dqd zzv|vp(^y9k>lmpVchP8dUjkaZIfQ)frV}t2)Zt#x;2Ubh!0ReA5oa**oZ1X?aR^fR z!$67GcbFb~PGU{?ad^dQ@ZAkg1UWwHA?$S6{6hNH;m|98vw^RI#2&7+0Hqjz#Pmq{_vGB3m>;CHJAdD8coK<1kX z)(+~@Prr*@lUVu?=pmhE%I-=c?c$O>HOjFwZV>4@1xX(S3}+Ut=tW za`|^D?VavWQ^2#wOr%oRMuXS#M-nyN{K5mvmg5WMb=ASi*kke+0-mmLO0to#FD;t} zs^Rt*nz7)%3RuvQQs3sv5@+x!TkwRJLzP8HHgqn1gB~pboqY457F6`fzXbj*^#j>> zeSTRk?+_obAFit*`X_gK=R|M!zfUvF`P{6l&zE#DQYx`GtPMvGfbKW5Z~wNa3s1F|?{ z?7(5oi|D~p0ldd^1QFRCV;ZlYUNC5GqSm+twHo`-FmCShd{H3txG_T1_sQ;mJdD+n zJap+edEf?T(6PjMIKIfYA}uJ*51pQ)W_;^kxz&vEx*PU>9;q%*3$;6$G2;WDDm)cW zsQOJ*o*bZJ#aI`F9@}SE=pVVnwMfX?>A#PVp#W`4LX3JiwK3S=baqNEE z2Pnu)&eg6zXhXAFwk5|eX{5)o;w^q2+Ptn4lW`YU2vl3ku#G6I&{L4FE%KVd###Sk zpoDYI7ZaE9-f4F9T9(;;ps1CYReD~n@v|rUW=2HJ$awte^R3$r}3f9|xlN>lQlu4}mz@jB10 zsnVNyv4_Zf?x*#xXO6=Zm6N?^0s>pLxcX=0?1y<-9!>*}0UQ%(5*D>%C;!Tp|(S*TozdOx;p z&Tn@$MOyykT_s!eq(`-^MEWaJ?9I_P_oc?*(w2j7@;4)eh4=r5l!f-Ek za6J?B;gCFE z7SGJ4=# z*F*Sy{)$C!Ys2`#Zu-rqpROWUQ~o1LL~r403mDbhVoi`zftXnb+Okd{8d(*v=Efzx zvDy1{JV7}~1H1vy#b0x_$Id6<7vG{+V^GP$ojW1u*2i{2&;?tmC&tnSs3oCTru{dR zUn#nFCt4$rK<6mNmiDT3qQs><*+XFAiYC-Z{FH;3?M(X`iIF&ppSAQkiS-Y)L5(fl zUc&$G{S%#~#A&5g_hCArYwzf;Zk1Jg!Qc9aGnS^oRV3j(4zAahD0hu8Un?(Gf_l9Y zvPU{!n`jpM1tH$U1FdePW^}|3rqcT7yG~n6gq!M6-)B70n?WhzbW+S&n@2l;4~`vo zw-D!LOhxzmjQ8zgSkYpf)@8b`}r>at@q37x*uFXD9Q?J9v{)3ybVYK8H&^uj#J@o#9Kx~>NAT)vsJ`Io&tZb*0DDo zPIjy##a49m@Whr#OPJ{E-&>*pz%Zry`T@$^m^qTO)f@wp@g50?F?RB4_c+33Qcj@* z>MY2E%W%Y+;qaDSt@wF^d2Eb7)?aFCIw}2hNOeoF+CK^@3?@+Q6#HQZ>r{hxWW?by z&O>I0hi z%!z3p;9E(3X7m~xMv;OtosDx^R;93$RZohd8mokLo92>RT%18Kq0OuqQ`}e);t2^% z-99X_Jr|_wglLv)&avFe08^nAo=NOb7OI3T(2_Hx0jTadyK`lsFCunY?R@0{R20-a zSmBE7vL>;m3mIdoOcT|tnQpxNq%`CeF?d`MqWTkn+h@=SL<%_0Q?XL(%WD&I{#E;N|gVYfOoS8tO8T#4o&bjgC3r z<)m^ud~M+#>>A*l{#U0-VJ2#A;WEy&YGhMhwd6G?sM-o$1plqXO;^jquFp>t1%G+C zIcMm(sTu4(0k&}{C+N>p$m5)XHr03cm7M`ey~H zcdDJrNpp$&5_rV_K3{TlV_alvn|DV2+x`y0uY*Wu6L=@+2BbGGC9%Gls8NP7+mu~4 z?>E)bE5vm;_R}-)17qFWqIQ6~=EB;8r-~sFAt2VR)Qgr$=#T7b*fn&Qq;IV|qR+uL zZ04Q2ANOzDSX5byZccRIVS_xLl0o3P1!IavS6DBS(7%(YzDeSk0Y|8{Ndp;LHD}mi)8xDAk%>`PQ zLU?&+rMMPbJ}?Q{ zj1IiH$E%6@9&aDAeGj@9-R-3B1n;EUO|P%xOxGUAk6R&W`Zi-o!y$cJDDVjh(TM7( zDrf8OeKbp9e9qa*lYnAAZf-@*n&~XCi30=E2s}V>DEZKqa6jVC<|rjZOB8j3t~{@i z%ciUu;)E%oD_dqnh8xh=5J#}cu4PBAxv!aDaVj9rJwcn#)sb>~eyKt7Z}tAzwn86A zeBn30AtW(l=01Ql_jAqk*jDMQ z{J|S!51N*~{bV}aoPC&89?PsqLkc_4xJ3Bjz+l(t<8q1GRd1In_rAjrOh9YGe%(x) z%GMW)(iN4Ip~mannLXKCwFq^bK?ayvN#3EXH(2Ph_d?11_gU4p`Y*t&QFL zuFlrw4XL-RS?+WT1UCQG%$Lf%n6@}RGgC$8G?&3!=9xr0vryyK6H>l1 z%$fc}n`2~qW^am?y1h$sSdh461E@|t1%*VE-G0@5g|RF3;6g5CcSxmnlkW!(DE#aM z`2NkHCzn=e6h@&}VchI4Q6uYvo(JS+FMmqBEABzbU32e$?w}D?xqt}MFDh$UhG5G| zvjgJmL}sE#%P7$uaa6U5)_WVjl3g;Nxwy9`4w}BXX=(5+vwHG1u`&O#f*OPH=Rw7o zYMG2be2u@2lK}*)F*M#s@9Pj=s#k<4iFQz(17A()tT@rxcR~H-eQK>D19GsohAJ@> z75?fV_wa8>3GlN39eq+})p830F~w-x+(!#iKa_vx&_kh$rtTanP)FwO((;@SzPZCppaMKtx28KszNrz@=9QSXbI=n>L@SwddjlA9qwe_)uvxYa0+>_ilf8L ztP)w~qcwck>cQ(Vv>Ie-`&{H1_160U*%M~%0>vl8)Cy!d`^;W0gM#t9p`RVpn9dyJ zayL_Bkfa|fDdck{qKJP~j$%wsO~6r7Z5YI|0W@ff2S(5+`|M)ez3}Et*xT+KnMtgC zSnT^WsC?XWItZm)jz7*ABj52VSx80OH!MALf&bRJ-segb8HG1AFW5914~12DL@paL zb#1*rPCnjNW4QEtK+g|K4Zj(5O`EiWTfogM?yz&o#+g~{!_8oZ=XcT&`vPeq$THHp z!lM7`9pODA#Fr^doh)EGE)n<-yn#C&@bs~^UeJ+RjLN#eb- z6xWh~YP>~4jh>fCYFzclEHGf%JVc(5z45Bp(ilkF_?;!bgjnIB_Nzh{w+ULI>qpE# zn|)?kG~NdmkVRoWL(81wZ*5q!n(l6|)01igk0yEtXCchj=a$SeqCH0r`+TaN0~^N8 zcDy?V%axyqeFfMIYJ5NbiYZP+RzaTZoDzvTQxh_9#N33vhvicGdGW6B2rQ;j?CgqKft%ua~;|1`Eiz)@EdVM7HFmqtJd#j(Wqg%lK9WIW; zJ-{z-n&V8LH6E?>$2F=nG=pRsnsM+A|)08H-iavt5-!Cv2=&&c)3B}2HPMh;@AaaL9H zEyaUz&N6pBD=H?~2xPVO*n+X-uu``%e#HF8D#FoMZ7oqG&!Dt5yx^)`R$)hIs!m^Q z3_cw>7kf%Lv|t3MZ<%))HBrcrIu@a7KkB)wI`;O`_VfM;hp7c$zdTjF6swHv%+AfY zZ)Fq*Ys6uO#%R&Wx;)gH`-H=pO?WxwBd0$Q3f@X>c6Kys&I#1TZle9z*m*Toz7?-- z>PcMIQne%+C5p1` zto%;(kp!alSrC}0+;tSc99XGZ>(8ID1(rG|xw-kUzL@+KYQs_O6tk|@&;O+b0FsFP zX^N05=;?KfE$}d~?676@zAR(e@RDLj_~Ye1WO)Ula4wEV5aY#@2&%OoipH_Ex9Pco1#BH$=-lpVwVek^n}$^ zFnc`~yG`%lT#lA*#ThdaJw7{Jo8+4*5matyVXNtT!JCY+PEXLXI9;G3bZz^~dLpG) zS%;!4HNwg*=a*(CcD+SXd$ZY<%y~)N)2*^)riRdsmW$cz5G$joa)Voiu!YOJ^&f?C z<|~NP1qVPS$RHo?nT1Gegdn$i`Gr^J#=A|OFFeAvTQ9)QvrY3RU)d+Vt7=9F}ebu zFgfQguzAx^SXoYTC-abCk1*yxAI)m{9ncN6U7ZK;_gyIY5&F06dQ8cnOrg6(>FS|u zv%!?6QTrjeNwChw9QVth%|rQ!`wWk^Z@v16Q4I-tKd=|b3=ntQJV3fhazg=$X+q2e z)I17ayRW{C?LIK^&+k#a2;m~^opu-hAOA3rb3I3Q>uEGp@~ydu=B#v@n)+S);7@y` zfy`-+ zaoOlE$Y{lf-k&Fb0`E9)mBCX_4jA1kI~uO7>0KbONjMHmHm2!+^@bpwgg&F8jB%C57KCy#;JUGF}J7Ejn@O9XUo!il}T;SWy|-Yca9Un zKpAX9&$FciE6I<8tbXyXBvamVj#zIK&QL?$uX^W~jv2D0&%Fz+qJ{<0jF|kK<78#O zqd*93ECYWZ#3#Ng^{<lFrAi%SYOIH zSI#79WK_Nt=nd;9lRzwjHw#fz@5Qd%rBbkg@@xfu%2?1*NQ`4uGP|W+0G;gX83nr5 zz)^+U3=`%9Z2COUDa~ctEhyJ(nuB!+bnhmW=l8mk#%ckrgjY0;EyT8Vxc?n2dW$W|9$Xd|J3}cFa2g9LUX=72 zuC4l*ZYV(2f~Io2DG=A@fj1+nHh*cxBf5*Ts-)Y=#qjC zuWR!?YwaaJiR@2;N+%=4_qfJ%-LX!dx@gMsdCm*=TCKXwdc9uSRTlNj#AT*?XSGl__@8Tho)VZ zl|FsZx&`LB=`YcUxb%vT0?_}s5Fs9K&l7oYd3+G!VhC^9HgY^$gv0lh1l~qVkZD9^ zzLgZpN&3De*Dn%;JiS@WLeMdJ!#KJ!Gp_0OeROrXkvC8ooyWNyU6u|YI-*Jc3`dd7 z!~qU5HB>*&eyX_&l+$a)`*K>?xu_E>TM*AFGUOuS=*HC&Rwl)||9FY%q`r25AkAot zb6>osaJgt3ctrPrL$AnTcHjt!3nVY@2T2G1I@~&BcPUpTyo8$bLXwDH%^0gnE~Myv z$MNCrqo(kS%na_>Wa)mi0&5OH`S}sxga*m-7&(67&GzI9G}O2>yfG;<9INZiRcZ~F zFP?fIR{AT?O&Cpv>-+8}4!a;H!emL`(T@-!j2n#-5i}Xl%;z$9xG|C4ZpU^Vj2`Ix zcDtgg#)JrJ)GtG}zMO%)=cko2ZzODIPdubok!_i3Xfyb2v<1y(7KfXuLXRlpeKM3L zCv`f>;*`V@5n4iUEPSzrSOP@np(=`UtK3YTimX$f!Zt!r>qwmva#y6;F2pP6MGcPl zd(yk7hlWoNV^}!psD?@G{4DVsE+uh0h&;BD%`#zKfy+&#;M%M5>YTz(>*N9*q~|z& z4hy8qg_*_2d+#;4jyf;a6-EvldS)^iB8Sl7 z>g##ug1!-Y^yMr5b19#WECG{k;|x=+8&4Ko4(c}1Y4`DRYghA=8**@=+}38uupa?y zCb2HeYqK8Q`_bj5R zWlk1VBBEep%ul0yztW9@>jiS31e%NU^&IaldB|8I}F_>mtHY6IEvgbyCYRoi)VWJ;rTAB;BS80(a? zQtv-fxUT>dgB$e7au^|f;hpFVJcA2`6-G%1C!piK31+aw?GV@q`#8dd?>d-vm8rcR zoe?^UTGoi?T}&fHGxvrG@P?@^=cy}7GS=(p*0kri-zf^%vy4C|sRsS3v`k^p>#Ail zqc~k_y_8bb!TNOveWxh&F%X3D3duGC-+PAO%>Fu?&TEZ5rZXN3^Q-rWQv<0C9I4LjpE9dnh{?5W6X%AXUUi0BCuZ>vG)YS zUeD{v18bSc+;_>D$QE`%V`PBn&(CNC>E5xh1tH}&iolYto~K3nZa{}oknx(ui>Y3b zfYX+Zzo46C0whNxo%YOlP46QtNea-8PT$^2@m8w?82Rs#9|TjX_(}>8A~=ckPrjGJ zJ1XAnyY)kj-Q(;8^n2U~ zZbv7Pc=wW!Zw)i(kFamEpG@HB)OlQKT%!Ki?a>I{2USqHpdeb_+8Ad8I8`86?&{*s zWkdK#t=f1JdLQ)?xMiFe*T=l4j5c9nzxuBLGblg|lF(F^m(A&(!ff&g_HVot`l7Cn zUC~#;1TN$B8NbIZRX!s;Y^Sju~=cB$6SPFv>H0g-JdJe>e0d{ z*W;MO*8A<9XoHi;=_5$fgWixtPi)>$?gVi&)LXA|+t#p(oU8ae-9w^+({kp#sDyKq zUz+KomUZ$i;rXE?Wj;w{P>vVO3sD2(A7gO_bzBuum3TQ{(5d+93a})K+M}aP5N|r|OG_Z9@4(&BJh-jdc zX=lTSu~h`Hw_N39a(64TWK&(Svg|$^bUkkSFav!l)Ekr+=Env;gA@U;d-?c;HzoFu zGTdqvqjA|J;=MGFJA)*P%!)$mn8tPc@><|@NACZG{;b6OmIYi;|UqZa&|5A(d3@Y%I$V+u|L z%=#R4v~4P@)sf$ND8k7$O0ehKN{B(fm;E+eM&#RW$j|fE>IpuTjc7sUg4L%Pyw_88&{gl0p3{n!>uvO7;urOIDt#-lVo+6F$4b~(1Lbn6b2vUGN*DWjMv`q$1T0qc|Q+Mj~ z#S$YnVf4?Z^p{*-GgzS$C3n9^yS}WTOf6J!5B2^-#t2X625jSn^v}_+I$SgTGpAyz zUu^i$OJ;!mi#Q5JiH}nLPGq0YcEiWa;F0uDchcXl>6{9Ni=PLu^U>*Tk z*0h^kcZ8d6dA`HZi^)yBPr~`DLL>N0dPu>j+KIUiE6-8|qSbfO-wrb*aQ9lvh{U~$D{S(K!tK$(X=wV>;CS;DZ#)5ZT3`$>wI8x9hw^uP)ntAFE>%6ONP1pc^V| zL~zQ-WrzD7mP|QXytWjKTTW{Ezas`yBe)vQ*bvF~m$=4*$yD(<$aC=g3uW0Nk@W$R zp-U9}>z)|TU5BS%QFr@D4*$ko2R+hykZaEZXQ$C7_{6t%-{tLBv`Ri5<%2ySu*yl$ zZ_Qktw`h;5M}eW-na1Js=h}{b|9F}8q_m^>VJ=jhJxg{0^#rvBSAgQv99;&2q5;U8 z2-PM7V%Y2LMUlQYP$qpGa7aj=d{yF74^{nUm9L`HKJqL@jjpKv0T`ug2R8y%6eT+~ zLDD6r7jkIwtlUxDVAxC*b~+_~42WkGt>8XxD>7=y4;xc3g&mEW`iHW#!w<~p`5tR6 zt7|f?k?P^L>Xsd;u_t7Q*b?Q4hzeK=zsIs(KGvX$Z5fisGQut;l1!JgRUH%H#!E?J z@KMO~#Bl+n7(lUcfSpVMQ5wFXH_;Vd36@JYJYQ@3-1L0%{Gq{rXQ&8vGPh(*hzh4k z85JZ}eUtok88G#Nd)KjBA%yn3_Y_N@riQt8FF zOFn5&T}F=Vah=Qw2zO=y71GS(yS=0xdSnE?JX5%Xt5+BTB$cXKWu5^E9&1BR-{*n2 z7azl&inQ|=Z$-aeiHAs($2*pm6w!12zAf1^_!-zznLOr3=#W%e=yxQuU1a(MuGoGt z|BIy^-E9pN5qB)HD~bfgb3!BfIjbs;>Qw=XgI!|3P|iEl zE?7E5tt9&6aV9hYN(STPKFOSxK(1v-!cw{E{*cXJ*xxb}(= zcBP=t2SovBcbHQWV@{G8ng0MG=Bc17RV-|_mYSI7u^ntj*#k=$Vn4q2P9@jXs zS`P1*z>!1y{B->UBjV2&SMlYUt=!;#IhFPxTt?{iORkq9Q`S(=!n8=)5s^;yhAe-< zRV7gCBC^z|Sd9;puV_mc+qlKzrd@$Ugk!HN8#Kx&Zg!h3&nYSfd}O^v@y3Yr1m6Jz z0Ja-~K|ae)gy_mM>w`#OfxpLA69KugBzQ|?2|^xmXCLt|2xyTjGnQb;xo9mIT4#`v z%W2;#Ha%Y4_N?9zX>s-W4VCg~%y^g?qxO!*|{6a%Kyi)rl z+!tFqCNdyp zP6)wgoTBl~ML%V}+`VQpABtsw(0*4S!<^)yKL#vShVNl3VfT(U7%A5Cx?i{F7E7CI z&BIYG-e!Hq31hCH@A4=-=Z?+e-QRyPg&<(A>~3!L|rh%G*Nc`vYTr7tW<-%_y`CHX&2I2+?zcQ{ch44JxR;03eKH z-(`9-V#^8?aC(%Yc?U1Vt8V<2z8iBMG(R?l6H8e%Xr_xLUpT6O8aYj`wR$=$-Vc{S z>krABA~x8LsNt42Ott;@59Zl(sD$*a^#bh&;yqQ1pgu70NyG<&o#&DsG@xyG6=m6c z!su$_%kBoW63rM*7_sgO;lVV}^hTO$Xd}+VM1q*J9ba-nC27E1VQ9Wd4ZZO>R%uo6 zzo`O&d=K}VIGk8)-X*)t!vp+^iAH`nICl7vj5pUcFZUE!$;3coph^ z`3w{>@|)m=k7kA)zzv8%9{j1So6!JSI&+V`g_nP%>&zd5KUL zQQH^Nt#87Vhq%MmkFKY}4l-srjT)tt(Chw;6f*n{8a;zEpY>Is5EjI z=piM;Kz2c}46Qiw3%fq`N+kZKU~L8=r+*K+GEN&}>Y! znCIRzwqmxzh7~3je@!{Q*GOtsynZRcZuD9ev;R(4W)Ny^W-MS(arL%4j+47t8sBiq zS^Z_#t|fwWBDmKuY0I1Wr87{Sf_gAM^Kqx9k^q5=j% zij)Kg6%`Q`1(6aI5vf6XNdZx?0*Vk3BseHY4IODo5S0>&iV%tr5JHDQAPMRJ%gj6P zl=oY|Z>=m=ZU~oq&)sLAv!DI!XJY)nJpG>^DiC#5U!1r-E@y{!En74ek5QO9vbR@**UI}OkgsCIX2PccgT&6gT5b} zN2*N&7U~&rtSi|xhyNS;Mx56`v^8tYY0!Grw@fH2S{;OkqSp46o5X%8t@-Tl!rhf5 z8dMW&WXLc04xMO0Q2XwR$GeLbz{#3o2!3AlsWq1FGh(Z=4VLyK0pu;1A&mVCN|t)68IuqOT=ucc5h z@+ApO0=~2UJukhbdBtt7__q%D`w5=Nf$NPo(}@X$;G{dHiui!D7?2r$-+0^_CxoY( zO1~+rsid8S_BUq}lcFA~!@pq9Np=5|(!4YWUi#52t-3yfd@NXxRMyx8^NksIq6ryR zSG>e{M8A6CJlkzJiW3nAqi91Y{yb;D+qQqd8{mD{)fm#=rmep-(@p}WjwWUhZz(0r zMH&;mq=ZqD$&WJzJm1;o3|?)p2tU!90{Z3mFraJ2wfRPUgly(;?p(TO*7?3u{Q2^a zyMqA2t=gB5Pcb34G6^gBr z53!LRlRXkNxE^V1T9+cChq;Y@=~|qDR3yVl!w80o^Iaa2g7l^arwvWGis+l%iA<<4 zpJhfy;0ma+P(sk=k_x`{5gZEF0$cm1JVuv$jCf)V=tRsK_}+fWM0AR{R_QyLZ?1ct zJlwpZ9@Wf+oQi1eNicMkGAWq>-}ltp^(MT_1mn)}sx*z`~FB~$fsPOKL)hW?I zK}nDQHz)n^!{8CI7EhuHhHi?Y_#hgAYpW&mYDCuxbv@z)C)$s6jezy=@G` z#3O)xI$|Ttns>iWYSx$h0f6~Ovlc9CvDA%>ell$bZ}D2P5_~fakowfo z2%G9y+gC=1Pm0{By~J?E1};w;tP9oi^!N0e#-$RmxJb(n;P2D=UhGO4f0};veFi31 z;BcgnaS5e|J>MykMux0vTBrnewyRW=cK&NlsecgbTGQ~_(!aRr!zg5M9@A{ONoP>Z zUwD^j(7bDNuGviW<8(2`wH^ndL!G^le^=DiB(pzH@ma`f1w*xu{<`{xXE}?ro#Tl} zoD2D)`R?gzEn4yVw6fklGViijeGB0W{zMBpQkiQlvgk5cOy_EIl#Ohbw% z<*A>V3csP@AFL}NPX6h$t&#Kpn@J&wo#jdZ!k1sRW;Z2O(r_Lc(mL@PuVoI$XTMYx zyH5B~F-E23TEl&z6E#|SY2i=a zW%ErXC*hg7_k$OpY# zybxY#&P+;I+@99H!o`KJocGmys;&7a7a*=c&N|ERFBkg9dN=B*R;3C7@^C zl0L{N_M_kZY&}U0=}|3Xk11*2jKz(DGa3x~Gsd`@%28}6ED@?~G$F_E^t{5UUoD)d zsWx4$f79|k_d4t+NOFTODO+R8N_;*|RE&B&tezU4gV`s#g}&VtxnvLj`K)BcMrzpR6_1{jI4vH^#dE$#v{vy?6GglB{w@MmvBWl#p>T+_EL89Gnt>A zWRkst22H!m;L&o=3y|q{#Yk@b3(*XB2RCLr$0SE4zu06azqd)Tx;gA$hHH0CtQp!? zY7_H>aTN^20J}itO^<59=`!w;BjtyfCU@UlooMj8P#h<|YqZjq5)&1CKkru|iiVd| z!EpBWz7#Jb>p^ZALNLJ@@n?v;zF<`Krh5?zp^CY;lt2iprLdUV8TjUHb6+h^(CY$% z>m$uglxZU!*IGfS_hKFG$>8V3TtAKzUtNM)remO2Z9P&T%pgTU<7Nf~?Row94{#!~ z5LVpDT^WK-&aIVZzNnrW`Y@P4{ogLzggfFYOwB}naV=zg_xht51q5M9qLDXG2)5P} zZ(PwzlKLjWA)s%0Gk44@4gTSzfLQ3H!b#z-dtDUNzeebP4*|JYK&UL@Kgb&?{E!~x zQm##ke_~hAWqdEahsFyXfej0RG79`kEE>NcS7yut*8aZ%1X>0$u{gg`gaYl?6DK_W zZS4OvFT!JSkcqdikYg#>^huOx~W-Udk8&^8{{kKtOX^J?wy2qWUcrt<^En$@V61XA0 zJa~Td=g;&YAbir7q#h<6t%vZoek!wtNJbBSc?dEQx?QrvKYo|U`kMx>CTLTgK>nz) zl4ZVlpqdd-n;)}5d67MVXmHK5nc;rroa_rdw{5<(TMj$tuY`^MZZcewOPAyO)8*JTbVNv2X90IAv+)OJ`Dy@l8#NDXzPilm zV+nq$w{IEmM)u3DSAML6U?i;E3~AAFBsbHpo^JjY z+wx34d%47n_PybJu+p>ov(5hfuuY*4%yE;Hecdf9;hzJD1yl++@T8ea-k7W8Ln%Ha zcBq~uuYVa3#;x&%B^C3FS9?a3@1!mp4YR<9UE^o=O0s5aOtR1Si1H+c<)$$&h^N`g zbfMD^-W@>90$PvlKQQx=Bk0EUgERhfv0~tPuWZrr$r-t7-rbh5{`L7v^t5!VYZ=mW zg-jOq7(@n2NN30k0&V&2%rINjR>>0_on%jZVlwn>&C$oAfn0y6=)%q^Xd`@LaItW?d1v`(x;tSCf|-gQ|Od&Gaf}sID(7JJuK0wBXf! z&>cg3+gRFg#koFiA;&@N;Hh((UJRtQNYL{V$0oxKK`rgY7#}t&77V zu4yEf+Lvy0C9&FU=!6m5iwZPX4_nF))iipWYWu=pk{>Vi=lqS8KNRx{etr7zQj3-T zdS1e$gXCG~Vz>nC7AJkbHG9rIRlniAe{+12aGQqFboq?^%h;!Zk2fpmHj#;kPll=n z^pxr-|I(zv`C%ga`li^ixXB$HBYjO)dYoZK`u;M$;XX*yX?x7GOB0*p4wj+KNUtc} zar$Tr-*cxV4jM&_)WNzbWGwkwj^}90^v+pz&n) zCR^LMrq25tdflTK5w&r{p~y|^{xvqwATWK;Ws7z{iOmsn<;vExGO>3LTULYWd!nuP z$7~Jw(JOWwe5Kv+*4{XI4JS2FM`&=2hv0p5KDq1O^jE5S#7(TaI7`fSP!F(bL>eFKcbgrdgFT;Ang`v z1A{DG4lG~Wcj{?%|EE<Tz@4`$G%zg<6#60 zfC1s&xbJP&xnB1d>V%1c7wa(KR9w99K=}PO5_a&HK23^}+UdIZmFP8>64%gzwBqvM zi2?P$kOa3jF*#rJ*XztX(v-fQ6fR9O@c|iO?iIhhV4wjRU z#y-Of8_-JW9(439QuS2j+q3hnV%XhnaT678<%hL`9_@4{NR5>1y=u6Un?Bnoa=G+Ukx=uv~3UiY7+ru7ebKy)Nds1&q)T+-MN}<+QUpzPkSNxFuw-(i<;O9~{U=NvQLpFwR{Wp9QB0qmqbaw?ktY$j$mLEU90+45X5~Px1 z<=`;H7N;YfNeiRsF=1(00^Yg|Wyr(bgr%n+X>HkfD=F{24ly&STI3Zu#N|Z^^7#Pe z$;F=&NT+Tjq)bUM?|Q@h1vN}w5R_o<)TJcCUjAY3_upBY`JS}@E;3@v7FBN@U~@%m ziD`I53`@C{uK7c1%qBLL^it-ckH)WwV@PmEI_ZPbmIvaShCOys$A6V{8BkN;QQRRL zN{f&OYM$7KY)JhuHWC;f4qe`7t%;5Y;330|Hk_-VA%AJb-!ipV>0hW#eFKgx6brYYQ8AiU9_%D5gfm{XyL^{ynSt$8 zj9zeF#i&QKoxiWSq}3as01cGuyH`tBuM&>du`o1#1*Ux_Se3@$eRZ@z!Jf4z8EiAi zb!hacm73S~Rx~UjDCr~7!3_E;*aAninG9XpFz`YIFdd`9aV=P!H0^ zvZ{;WQX5`ps`2(lJNm7%X;(a-9mV#t?_-KYmquRFrWn3@$YM+y1o@^2?I8U1Pe<*WHc6foSS>+(&BwWg*lIS$(wTkO) zye|6O#i&+chI@DBB;3jCGHCGd}?ekG43&Akz0qdEY9Ei?xt^j$IScQt_B&9)u zu%La_rX2tLWY|*b2=z7YEa&S{6|;Sf#WkOjAt`BB7d(tRvU-|HF+s|-Dw`@*1jb+B zTh~jgV4rYKLP1L@5$x^(+3Lp-fpcksu6CDR=#fj&Q`WwiB%V&{7xhKW`|rXjPr%66=QbRPDElMMcx$lqUTnXdp1C%O)CO)S5-euy zxQnx68L-Q^C@{|*C`9{PNMaHv?sh#Q{g1|hK=G&BP7T4YLrXCspCrG=>i414Ln6y3 z-uWt~A|`++UcQnV>0J;xqt0DJOl(RY+xgdGvVJSs4`WLn$~H{cLpAGe{$YYd=X{kjex$|40+b70Z_W;w&v0 zv1f$$ayCLsMqMJV0+^$X$gUUBBG%$~ zuqiZ6v~MbsE$#Qv|L?cvZmH-VGhQ6K+4AC+Bkv`^d>zTV;rs+RI-pQt(J6U`J7 z=_w&N6{WJN)$73>G1TRqHXxm_4O3>fpPmw&C%h3VWLx}3Rndc)kaiut?ona5NnI*1 zt?8#SQR#rT#`Hb|%gm;vsv>U1F{U(Y%LFTqcpnuk0`a;G?9-YOh(yxoA8|g>Hvx1J z)_x|-Co*5=MtY`rrUm#D7utg^BmmHzpTmEE#YX@8a}JB88>|0uBjO78!0wxr{!oJ= z87RJ$3A}EjrP&nW1^QSL((A3(ui&}&q`sMDk95n8bLG2mo0B0(i#?d5ghbM?uQ_(MAO8`_*O#GQU$@vBP0@db2t{8Y_?)R^rI!o$$F)1QRt(8mB)-fApr={IToxtBfCgr5E z%@;+HN1JTxR_-2xWLcV8XXO|K+=2ZJ#;0#!1mPW zdEi3baSt#6bm;mAbO`Ix`>DF^hVqV(Uatq)!D`4P5nWXWNRwQm`S#CXM#tZxp6ySJ z=0Qsm{@G7r%}#;zMRY%hsJHK@jMB}L#3oXXq{<5Vr}CnUR5cY$56$#UO;f-P-6laO zRc14q?v#6A!(LDNM%VWh+Zb3@_(}ovWs6S?MRw11nkMT>?6x_$FWiF?5b4bI3fkxt5@xw~s$ys+dVw;D zKLAfCF5nozE<0nS)rZf7^|#M<(}mD2&R4bnG1Jz(LFg+-ZgU%S*87$L4Vdo5ewo*1 zSxAauZh6c^@AJrv-$m7PHu|KNcf{35N4>9UlR-==wDq;5+8l?`xTN1<^YdL(z-vys zTbIsxDm~>=#N#HnIlq9jK>KI4f~q7tY%TVjoZm1tSJ!C-V25)&Do(SUtEU=Mu*RMi zvwrS$VR>P1DRi!4iMJZY+|SZpra*ArUKsSyCt{);d8Q|QKih*K_fD<;zx&TW-tad_ z!d`6tBGnO-H>#rpJ*>LOS-sayNxxw&uII~zXl|GyVi`s$mvG7u zHL7SlPS!g+GfC`cg6sR*HyOc=0*SU1yE!YPjF9GIoj7V5Ynku45NmPsCWhMg$xRc% z7DRWi*iVb782B|gl|ez_;8rF{=|35=hL^E5(n~M0Z?Jxoj#yI#0gbO&4cR@2&oGRn zr24j#gRA-AK)(9Ils%`yABz@=+`n)$sZ%_pof-ETddz+zre!7aLvH`if3DXWo})0C zpxhH;KLMEw^)_HV`NVsMr^95iErP14jRJ6n3$PfeII05VxW>=)fZJnU{dE`P*Z4vq zNc&6Ewu09?zgrfTbVWN7Y zqpA+W$-e$X1pyc(I}bOAx7Oe44}S-8_kTnM}lSlS;M>}VM>T&C0N za);N8Y`ER=2!E0Kr;A^WcMT2EZP&)9E#mole_*1?ddd9e$5{y$03soG-Cb?kMAMSi zm<{WkS~*eOX2YhL%D{Hs;jCr&>=#=(OeC%mqAqC6guwJkhuCkH*ptx@R+|wjH_b*d zn>$9B=v_^G9;(ij$HT4zpI@M3mpS?-`bFv+{8p2?H`;tQLvOiNPe`vpi$aFjZ@P7N za4e1h7aj=zNz!~WCz%}j97Gf8pD|u;l+8}y@>yRRH&F2A+p}BfO!2j!asM$UOF79@ zDJO8hhh<4@iYQGy()-yu2~bp6yNG4)wE}hpsMu=wayoXb7M*^y3@vU7=BTM)PxamG zbNVF%vcVIvnMa$*$}Vnq?1kWAJPAYay~~_4b!qTk;@1{mv^IPv=_Y!Y;%((Ggh=;O zWPH1P+=Vge&Rc`rykA6A>cv#ZH$1_(<=9!?-7=(jCVJNa@TugpCh#NWN1uJi4DqYN z&ZWZn7gmT|+l3;LR!beSlbcem5C0JL(Q8q@dKXGYryIU|%HX*VBT{@g9V^s8d?fnR z9KfY_rCSuRq-n~FA;h28oEOtC@jR_CsDPI z)xPkv@Seh|bANd5eE1B(`$6=^p>C*N5%5goK8>ii3zAdE4ihSPL8;-iurvNSkwwU> zC*p@7`55hPyJDg3&~US0u8&w?HS?VD%Cr>~^86D#>*EZ|{{-eMHu~&+)vo40Q_X+) zA-RL*4ev?LK=PJxd{|{ImA1Qs5|Y<$uRMA(PL^@o*SH?ovXt-GrjynrYvBImwTQzk zf^#<{6JjJv;Wpd=ijBO5miJwhKMm4axRm%Y9^LzmpR zDV7gfVI}Z0!c&~M`t;CkhrdLbP1r};2+x~wTF!FbYdj(zOLfFR?f1ECpD$HywPDDw zEqh|45zfK_(RQ=&>6#~aSBz7bj8bQVlSr2(EyPKg+>!H^;+&Y)<@vuWSo@k{xF1#x z5OSkLW2v=SbCvMplLg2x#4)9{XucY5)qBPOQR-hTdMwB%hgo|_Dh%vo9&oDMH30ZQIN)_D@@_58H{~y z{o!Y};b?r&>&%ELV}YNJT}kTHelih-E?BmZJMfH0$rV1qHGz}AVKubnOb?Ns=zsRv z{@Mfb=Sl`Bfs3`E^2gOM1L1CWO2rpOO(d~f9;r8rywKyozWe?uQ`kUIP0~W~Am=O%K`@Hi2#v+Rava z%c`GpJsWkwA&-AtTe7&TwFJDV`7zSRSy*79z{6M6R+M*=1H6f>M>Y8ysG7L5D055%AU1S=yLMx-86pP-Lh9~o3}W>ENe z*3$ewZwp2h(AA(J#}QAnn^T|CEHWaW_OA1EMr%`Fo!$PODG`w65>;YDs1_MRdlni!b9b&jgWbBcyBhQ>9xC3Sv}vE2;RH<7Mu)GR*rOFQ*6K6N++s7@IGKOmay z_8*RL%{uzY^Yg30fX95Mu<Lsy!M-A(wyfXe~n~Rqu zwzydyjy#$M(W&5P75^YFC(~QTT!&0+@`*+_^)ccv{4NBnL_-#g8a2sX{PL`KX6H0~ zzeLBrxxx7jo-0!07ziFPcF-0Ji3(!U$k3&fHmABN0JaAhnap{WuX`{=2?}{3(tknKKI;-Mi*k@qOYN{h9*xTD{SnNT3c*#wiQ(hFWeXW!^w{my> z=;4m&+B+7nf2weKxP9B7TmbW6=%CQp$Zpnfs<7@j4`3n&S21yBDaU|N#vlvwNX=jH zMp#5W%&F=$mNGuwt#xULIrx0;o1Ds3@jvZxR8oPoS$%Ya#8Sgeq^2a}Hg{{rBWHBE zy!&RiZ+*#Uzc%NVS@qjoUyz^Bj2vErpn}gxbBZygDrokcLKH1O^*ZcD(&<``(rUWFyOYwk>3H*l;!eqeJ>|oX&t_ z^(9VPl$T&)PV{D8Q#WP58SWVlBR$6Y60JRLbD6g?((Q2I(Z z^rtd$f(HUbA6f;S$b!{oazquF@lR7-YCo?qZ>4$mRqrVVDg{RXRZ8?*ei2GABk)$V zyeAmZFFf2e8aS^K@En|*q*-0@Dw#JNa)jxW3W1#*{ebcwecf|vLd znJak5rr*VVQd4;&T(~JJV7V?n;jGwy4=!q^8mhAgpU&}FajvC*E^$DsuR}2g&{jpb z;>0I(<*TVf$p@3Foc0#ZZ5&KHbaqUdJaIQd$Ozi+Z1lwqwCAv8h@pRl${E(Y#?i;6 z;nptkUiGIYtI;z3Hj(li?gi}96M>#nWHYlL?7bUGEGdD@H~G9YH{rh^5rTosmHKOxA;?7|+or$fcPUY9Iu2b@c7(-9u&U$1%5g@sX;Cu?pg}Ha zs$QhRL18U7{-RAR?EoY1CT|dn+`LXYkA+_!H9a$@wtI#0+lJkQ2?D=dJP}oq8?naU zhDMjcth5$;{`%WLn2SI&n~1G@6#(WBaJ+O7#L&FfXJJSf(wZY|4dXnbu@gN{jCdr- zasXD|A&9LZL}o?JtfA0VrMRXUV;({rf0bc6Ci|yH_%jac@*17CIn3Ey_piwCe-9fn zW3i5{`+7M!7yEzCcuxY_wlOV!$$AU-mEk*Z4b-;~f|3&S;@$`R=oIkNADv^3BLzV` zZmOY>Iv}bZ?6cwnU5VCiD~9M2lZ6qudkb9^s)9HVvOH6+m88*7Mc!^%|&1!xF zkkU6+%=Vy7{IAwTW0 zU<#KW3J`b^p{h|R5l;1qo)8M5S;8?D^=j@b2UGtU6_~sA{HFDDwu{Af<`E7{ytw^o z>&_7psll6BPHz%G+vrvqmx;T!geV5|D0mW+YP{c>mr>DA(Tvc*&c))@8dlG>6rO(_ z`iinJO@7s`is~ffhYGsN?ejB%gG5$nk>~+C9|_NL#}-ka1xLA_q40)G0AfcRJKlq# z-k@$l7MbxK8;RyNgbUHr79!#XSy->I5$)s3p5s=nA^<@t=&D>^V@lPcdhx1{Xy`}W zY7hUOx-67T`bFnGDNoPRBiCxZXL2ZLQtW~*X{0lz!OuHpW}|Vr9&-d#a*#4(NG*VP;k0MRan@^(czp9VrR*5 z6^)`+P(z_OA5q2p+8kH4s;6S!N)$L4eQZuhIgMu#tvS0y-sn$uZ@l((HG{xN1xb^M zW|jAk?|N`A;XheP9Ja&r0yGyN}lQ3Tx&xy@8=CaQVe9 zA~KOiEsxF7!1nnkwuSBxCGf{Xq=kxkLwX<5O#~Hz1>BE}&=Yp*@YIlhj zK21#_2Bg7NV2| zR*!M+a}5G4y$UUQK4r|NyJO>#hL}QEn+3-nf5krHuErqIJq|7Xm{&yNz)HgRdf#rX zA2_Rpp>`pOegJlqm?qHfhMmuu(W1E(#1_d0kXiXAa+^$$BaXZkBUbsHrj=6 zkLeXPXMY4jb^ZRUZh9%JCR>ubf8Gq~kJ~WmNqP_RQVyd>>_0i1#L#6X@LN_hhCVfk z%PLnctC>8QxfP?e`G(w${I?EK&4d$aKJI!A$Gl=^pBtB97DetN&cj*Fce&zENLDt4 zc(fDe>V2gg`$BkzXOP6n;YUV5yS=Cd?250yPTa$R(X?sDDqOz+=eMwA1Qo+^He#)Z9T{2g+BWlss^*_q@sj2nU6w(Ap8=G3i(p69ZcGC%La6*?9QqB<_auQTS( zs69FIecXe?Xt;*6OXFd@L~A#BlfpwQt`*c>ge%AoMi+`;jPq!M#UOh9V#tH-yCPr2GG3Rk&hy=1FG=%@&mn$5T-a9wb`t@ws@e#Mn2dcep( ztJ;D?z_ajX^9<|+Il}GT0q|{|nNQua@OG!=%N;#F)Z&ocj-5NR)CQPPSbAf*d4+!{ z=ne&D%CT?`X`LFZ?nQ5>T00ML{p*epD_a~mom1G_t~U+e(RQNs5;*~n@7RZj5a*md zGXA&{3KuMOz_Cnt5K0&oo-a=toS-9q!(8@?KWHApAqx1F&%EY~=XI@$rgoar1%ks&1c`E0kcM|CqABRgw9L9W}hRR3Ma%+@cxgxo24(SJu;jjKfG-* z)k{51Z4I}CIa8iclcrxWU9WrpcIaT!F0%O>n~SHm6uu~-9ZnQVmv1(WlvFv2e;_Iz z`2=x=JUW1|g%x8mvHP5`{!wG7#=W>%jXL=S$1#IR$e<0A@&>;;T?wl}y}Tr}XZrT% zwFqaW=>1QKHvui5_qD)yRu{|rjUG~%FJF2woTuYBh?zb=TRL+k&z2Hg>|x7Vw^@hb zr;9UBXu+KPHeF5?W*;-@MTsC@O&)WYD?0P(F~)*Zgkb^Nhc?mk?eJRIaSoPog=@aM zF#)$tU02}Dz03FK`SD*2yt+vo0eB@;x$m&ktV8H*%s!dGi+pOE*As+?C?tC%Qn)%; z(AiBlCa9YU->a`l0?TkcunhZJG(45vt+%uQz8<@Kp|UX{VEf7E#B+Gm*dDmp4ak-& z)fS(k;;)`btMLh@A+O#f`=ed~db<^TVT{`StO}KKw;JVrNtEiZzN|2K@}>A|jWQx< zo^nZ@n?hAU@b_u?_9P@o(ZIph&5oU20b-Vq?~c<{=2Qv`1p4WZUtXLnZ&dn+d9tP{ z>F|Y%mBhYblQaf)p@$0NNAU_~9n0$b9oUE~iKb-8*nzGe?}}q}5bmRgj$9F}r0}T6 z>~QdU-IX*G|!Z(%B7Jm`ZtLuA8%>fP6Y^{OszY z`upXhz$8Bg+aUn{X}T^`^kT#`4VdP06CHC?K~B@^eZ2SA=<+N%f`CG3NX_Ds_OqIddgtZ|Ltcvzlji|YfXGy0-b^ZDnE7k$-VXf4WAcoSa=wcBf+Q5U7q zjVOy7yT_UpM|+M2FINfsJTLFbF7h|Glgn`OqJ?r>Q;8p~wHqrIIdjyy@0#di0c9T=)cva7KTF$LHW{F&FvxZi!X7H{ywuRXH2n>rBrUhdS;P zkMXRh13RLx{tjvdDhAr+%AE>%+rMtd+KTsLIrG}hG*1FkLLsEu^HGmp5oFtn?Qx^M zSQ+6Yi47=^%WpI0wMwTA|)p&QagZZc7paaH&mRRw`Evt)T z#P8^6zGIDD@#6tPPuInM^d+}SD*Pi6_mxnj^0H&2>>E2hNd<$9NnzLh$Y z$>_`3MHxdX;KQ29JnAJ7Rb;{U<9rrhULf74zyen0-0v@FBRLM7g(@;4Njg}46Q!36 zJckMAL60+7ucx;ng{A6__mKXAGzP0Q`fHViAgMp!Pt?9*_pGc0J_LOTlQzYj2dF_x zfQQk69jG5WxjI`Rs$W$1MK%WEri-?_)+mO+;>>n$uZ`s}51=t|(jP>s> zy#!Y-Vv0lf!k6e4#F`B7WaAV`N7Uz4PAnxRjb63#`+ax+$7%ofC$SCStb+sph;8^v zlDCdvI~n$ME}u*17naqim^vi2OOk~;NWleA?XdKrAx9e_yha4@kr*taxaMrh^GS*4dl)Y_?&iqh0*6jfR1o?=`TRCiRqkMH0(c>EI7E%R`*?JtB?Gi zv>`A)Fyd5$VOf`jTh(Fv5zn2P{Za?`6Z%0fOW#> zjZHLAM!mErER1d6y1W*w`;X!cpj1r-P~L(;cIho~z#WpRc^fu0ina9wfL2bRY6=yT zYhCij(l*}Aa)9|sRojS{+SQl=d1b5i8ZKhYh8t^q&@haI-WJj5i_wg$V)H`kS#0g~ z%tsD8x2GLj4a9BEM(0AWaHO>b)fPS(t{iw2wWyzzlJkMRSyJWUK~tJ{J?( zhiHQXZ;FlAp^ruyH^m=`&@k8+va{7h#!9$x+ViPlX=wa$;l@c7pwees^zE(#@ZPmhY-bNXMEkw zOZOR^f2wF%#chmP^`i?lLO()Xg@UW1fiQbsaaa((P2e>c{*G`>WWR>zcmYIo$d;jX zXt=E}CCq{I^~P&DnOF(S<2#7TyRyp!_O+_c>X&%d*p}O_6}FAu(La=O_-;F?k;IH&7&HWYfRs(u-z6k!|hW=%Z zIMo~XAMO!!y$*0$yxo#RV?p3|FpDS3L^{9$hB zG+gFb8qn-^9mr+3xQPu`4e&7RNZ)KC1&~j&#WI`U4G!7 ziHd9;kd0+_&&>2b_YkiyK%RW;cej8~<@|4w=pv9L>f~8Ri)4*-nchtznsBC6_ypes z&Th4gxLNoMMtgX$!=pEMC1VQxXPW4Dwj6*we3j4pD!pf_Y&+OIBbL0UY3&eL<9qJd zw^&)s=v7&bBKSKZJ&MRTx!J&a*>I`Qvw-IG%ZDc*usQ6%a#bLpaTKc5$^%5 zT(nCgJr{`$}?`PDfu>ItfH_xa|lsqmzAO5YjwbFz7`iz#v{<*gT zbKLV_X|r6BF8BR}z3MvA_exhzi$Ob9KaF?FC~o`_BQ*Ybea)#qDCJjp`<7EjwwrRM z%MkBhj{D*trKG|4F24K$irh|?a1*UXs67o|6Fa(ybE~Tw zc>mQWC1Aks2w%v=x~<0D`fL2wTtN|vqnevQS!9yR_bX|EL6V1l#DxQ#rdYW0z2)1W zj1aH;(pqBrn1%F>HeumKZen{o$z7DXT|Ytr)jqF!(x{T z`GC*_o{dRD_KID;fgxKLA!O8Uplp+2E02+z@xtYas;MhnU(R^Lo!%Qx`)#`k1iLxo zCU1!QO0{X!D65W@SpoZ1V?%k}OsM9T3T$@N5QX8Y)=n!T% zIL7ddd|laX$GzQ5>lU24klR~$N%#~>Rs>y33ogUYjy3l=abE^I)^%mUujjYQ<1y31 zSD~u&)Ivc@@oqXrUeJMR8q7~E@g#q#?*oiWKJu@@0eD}4adkZ0*d+}0%AvL#5(2rN zUWuZ|5O*t*F_}JK0#c8^IxpuIO=~@(EanZ$oPq?Vpdfx|$i8bmHu}??mmE)vaLnFg z-~9}6!(VlXG#pA0eV*{!cN9}zGP#lewsFOy)K1CLcCB>gXu|y92sd@J#bnUWB1C`Q z3{{;C{}NC;lBjAm@-?y(pot^jVSy}8pJKK%YX^|U0sZzc>?V+xEmT#rP}6}eEev_7 z9W%d-u5@n1v<)JEh%OU5GF2uUUEZtNN5WL*+Bi3P)P9S6N+tj}m&{=uQA{1 zjvFE3-EuIdCB#;&1#C~4&l`N$DihvQ54!qIO(oLt9|X8q#Pt|?F*l_9s4KYDhGXrg zA7Dn`L(+rnzu?^LeA~t*s=qRPQ}q2Jqg0KLbx+>95px~aQt)1$n7f|$ANzr^l3 z*bCz>2D$&)>iR~(#kv*%l#kHx{+HXG=c%u#J~>s7_%3d_wm2GO{>%0`_0Y8Y^BZ?n zEQF+aLevwf#o#e^R+xXg^g11!Qp-;INXQpv@T~GN)9*xntB3V9y*CQHsHxa&pEtg$ zE1^RcS%+VG)C$~{{eIuV{bz|@+6^9URlhZ1oLI6ec)vp6ASWcUs8ip`RUGX6$>c7? zCB^bPpEh@)+V8hU@X4Do0mGF@;ek-qrJGeSj!)mgL#ckhD$Q3GV+LLy2CHsT$y~SO_vK<}OS0tWq zL^p7cCwv|KcB16N;tpO2C%h`hvD=XcDYJL&9won~ewnM`_p=~2qTV(00N8rEg^5jj z`_TVgHuV4zD*`Bv>?d4jj(xo!@3tDJN1qW^s@vm+AlE40=%(C>6@Phr%b-UTVwScW z>&<~n@CJ#qUzioCkpfq2_p0DZn8~2iR+bW7XhET|=vu3GS3jNn#hI`H2%jt3BIa?9 z!jG89I@XHAR4@9WI&0O?g*IVTJw1iAK8& znhpRd7Ze!Sq59!M`~OW`8|?&-#u%Hq!}U@|AuNDEds3kl zJ3Vl4EAu7ldma7bjr;OWjALn$kxgPP4TpOhDm%jmpG2FZ|B^%d8?*cmilD@+QyM?R zd(!_~$@srX7T^;;SQ3`ADNYf5gG4gcTbheLW_}*V(&&#Q{$yZ2zjxeh1!EP>byu8{ zc{=`SweHD^6qy|7-v>1vl8e^39u{{i>*F7B)?YtId%;WBPMlj0gzv5=Q$~05*ZyFD zQ$x%oE7hAiyLn?q0Hvh`{;jx1aA$4_B50My?M9b1zUnE2$K=aR{_SKn3Zr-LU@rhe zx=nH=x0j=~DZ!`=ZIvz5|DJoE<-aM~7}yD1_{zSsV)xbV212Er_e2>xz4{nF$_Cv` z>YsenK=q-z4U5=fYc*Ve{SxUb`bOSGS(f-0!4SZs+ew?nEk@TanS7S6-u*ZFHz@zT z{*iJ2y4h@iz&sp3x6+SZ&vvksu~)cq5|x^0w;-YO!q5;vCtF^Tyz>gzXi)}V@O(U% z6^>}G?*A86e>8ZV0In%s)V(q0(|v@g!aiU-KFatH{o5bNM|=xiYw=bH=s~IElCQA= z)$4b2I!~6v481Wu=9X7WsLPj@|IYtjExWb%%x~;Of+Ov+U-e|;z=wF{V9c;-e=CX2Y01evSj*XbBJ?s_M3_(7UDr|4nXUXm~R9%Kxu}~d!c#pz?IMuzMaj#oqW01Kg zHzmt$dxsU5R#rju*Y2K9`=(BFo=p;O-_7mx9~%|3zU6RIg>(ue9j_X#8ZwFR(0e-w z0mU~P>Pvo91R5X9^WlqjN(?DcrvdzWpvSXx^Hldxw{CNdA7IN6gZ^YYPmTjmD6j=2 zruhfrT)la6M#YuQbt1Ecys+;o&cH71vGBOmIp+nsv!Fgta1ohVqb)?-I&S*t-;;-Q z7NpmI_W!Z<-BC?u+uI-tqkuT*2#A0UQ2~P>y##ECh}aP+5osbNbZJQ_Dx);15vhtu z2dR;kfG8~#1tIjH5PAqCq_^+I`@1vF+;6S?aR_VW%{eFM?7g4;>}N-v8mZoXsPzj; zjQKpRe-J(r>=8f*z#2%RCsb9Ib8sM9e0*oA}=AItmi57 z^<-N>!yVa2sIPsT>zGCn(>D0Eo!jq&qAoo1fH9@Um4ZL-6ldn~y&RtQ0fceitYKam zUYvO|2gpTtLlfjnJ_nAF5d~ZiZWn3Ok|9>{hQxw}nKW@Ta6v_D{K)VB+>U9C%QWV8 zcI)#a(pyFSpDJ!{hxPP`uugL>?&u`*%v8_X)tny4plj4|Rd_SYQ~uxFah6+bMq$FB zYLEYM=2u;SBINNy+&jqEntfg-Mri**L=HbSs<-keCJo$YURVZnD-XOHnhh)MDhL3S zqR#V{)g%m-$aj5v#w$9W&EDdVGzIhI*+p{Aj)1o}sXUmy+{G{B-QsW5TwWZf-$~pLCEz?!4{}0M>W{6rZk53q+s%e&1Ey_fDItUxEmjwe`1Me!&%(i1=-Otk>9NBB7-hqJm3QuIyK_@d-aX zQqjgw=vLrJaTWXvE8mY@^YjaQR$SBb27w+z`v_Z9kz!`}!3WwX)oU|Zmc%+n-UB6m zNN+*M8}4C9nZIg*zsek_o2yS$s!27hUe+7;?;6e|Im+uh{JWtcAJ9(V=IFdK5!iA< zL^{YndVb$b!;{z>hWm1fy-<-I>ggr47+gbD#%b$7kD-Hf1VMf%37o9o z`Kte9=f)zTc)1}h?CztZ1*+^kVu?^#gUFNWj=oa!v8MnmXreX4w`YHDw$UP%0PK}= z-f_853Zev|QSVMH7;Z1aFzpumFJ<~n8A#j%kNuQt`uliW zdFP6Zz(uTdfx`#qYBeWEvQI+?z(0S#^Frs*_6&;{Z0o>vC4|hJ;`1|dGoJhW-yde& z(YjDat!NFTV=28-OFnCdI!TL4u$6Ve_yaM!Gb@&dSMi|~8-;v!?#&gc@vDXmYdWH< zAOw8^u{ZY?ScQYmjk6+XP!ahsXX8WeHdTuZmt2#LrgBfUTErwjnCUit3yuBH+%i++ zo0*saOfyl*76;y4;AGyX-2V%g>A%c{K=ts}zX2&o4p@4VYwZaK?~D*Im}&kGm$?Qg60-%tJ5J7_>)jP~TpjQPMvv7!v_xzuF7w#(|PwjHUO)V0+m{Pes`i^{EWwMqL}XJ z@3w$ru=L2nx>00VVwA2fu1!RAEY`87HhG2MFF_fk>m7114L>6)lI^Bd>MWWEf*X}|2@U0uUSn0zUeRVWJHII4vTCKw|~qN z5uS^Pzp=%`KK%Q-@WcXVF3tsNrE$Qo{>s^dodQ^eZr|eq)YD$}P9nlO`+(fC1g5*= zBWlBO=5&+$Jz6+S(K{5!yB*oQ2@?jgs3hoSVY&iw&{7#P#sa!1j2aKQ5kRFIycsI;RD^n=NL@sV+um&$wJ&kctI_t(a0N0RKD} z;GfS(ioG0n30g-%Y*)AMC<(ijF-vuY+<7YayK;^hj$FdBVoCQx3D_-aQZ_VLW>V|E zE~!WjfQUYQ4vTX3aC!eJ*L*E!KIb{dWc4|>hG$9@Wv0scUEZjH7~=~b=e$5s~E18mfoDx{)J0bHnjwMPNGcsVF_BKQiGf_FO!t7guXs(D|_0E`a z|1xs*SeL}?ELop8k07)y*|CYWc?8yTSexb_e8Bn-@$yT!LmZ6U%TcLLPheefPRnNc zC1GyK1CRQJw3ef{%%?y|IhS}K`tD)VTSj|@^*z!jaUAr=w82gIP-?cs08zsj4y1eY zm3S7UKZfg`iPw}HY7xee2Cho*k8>lxYCr=H-+Rza&YTHv9QYX{ON8we!$Y%9S~9yI z?bIrbNPkcuec(=1ouo%HC=dtQL*>6$i4xn}c`sV#{lx)3C*+KPl8R@Qxb(O5tO_K^ zHF`P!!|BJJdDz>}3`HnU)&pKr`luJ*cP`*wBW@Xi3KO?R-WTvlG+ojEV6Isok-U>B z$=2r;byq;{AXgrx!5wyWK;CpGBfg*h21YRDS9T-o?*%rThb5R-*Azlx^ z@&@Ep_=?QOgJCk|=fDLp4~~6h>OA%>XMumyNdG~NC*D4tW_wJ*DBf`EQP`P~gyJ!) zao1-UOdl`5<=e!&o|e3wzV261qr4k-D%#&4Z6Z1aal_@hMPZf6b;s9{yg<5rAtS^w z=UC{y+%MoKHIe+?*0FNKlmMewJZ_ zY)Di+?{kFHFBN>qkwK2M7J5h3jX8zAU-PFpuP(;fl3$ zTS)r_0FTXV%jr|b_eJai^GjB)_rZpH#j^cttpL#QGd(`c{MB%lTp8!!v1@=HTLzN2 zP1A#UP~f;=C9Ne@cG|6bej(=@{slzn?J(wcNAXTaWPxP^b)boZClhq3^rnrs7U#K^J7meoh2dY-|PFj0Icp>6C9 zO~3M)bEyM94RMzBJNqucDvv?*a`P5SL;$iP#>LM}KQHWf+g4gKdN!8qm;n*Ckj&a| zq+(9ipR%;7|6~3%ZgV}oE#qaYo06WMhz3D_^&t}9L1wih;Mu6?#}cFf^A-z zRCljZXNbPloMtV8-W2Q~25H&~fDR+1iY#64?cAwquJebs8w@94y7y&mM66=Cqel}! zZV(9E@*4%0Wc}XZQO8PeOXqAqw&_y%iR5bp_r?DZ$@zyg{M$c#x)z*luiY{TFk!Q? z8GI4}g$r67=KFdkz=s5G&Vg;vW%x`;Wbi>lN?F*Ga$a163eILS1fX0}Lk>s74~G38 zl{}!!HL}Cr*m9W~Z%4khvYhJHA51_El)+}lAak25*XYzS5Uh$d2LmDw{}QP%)3*g$ z%BM_KC!uG(nG~4j@xi5`69}^$f|$@LfHdB}>V~N68z5yi4g}CRo8q-W+_Q9WnYj~1 z_zRLH+7Eh#3Cd*8jgxzh_CJ_WFHA8A4Gs7Mt4a3mtw3kKk@DCq$@}kX#W`H+$*iJi zIBmOcuK*`AS| zLfFvMr(i=CybfF#9-wbg>Ltr@>7Do;h1$!Op4Y!s6h1l&x50dM7ys=NPYbb3Eo!o$ zo#DELYcP{We`-;Ljz=%O>)89qoVAnfmTecHLvYvit>Jy8q>>Tw5<~UDDx;PD_PPNB zmNg`Ug%z<~OOik<#A(`%^IR0r;b>Er!ZbkyD-p(~rIQ>*unB?6bjxvaGS8HISOXj# z3_`v)z3q_ZG{pnx;(-<3R;#9YfF?!0?Sp1j?o7a;j7JI&HY_c;&77(F0dC{S$(!JK z=fL;kb-%g_43ad1vR%YC#zRFZY% zVx`x&B3#AdAMa+DZ&>p~tj`?JXnk$YN}>JsMc~D1L?Y?h_if7R+-2Xs232f~4j~$L z>kW(|kgPf`zUJRqK&uHocZWZs*MvWa7=j1(GCd^rt|zEqh6X?ji6VSgOend6mSXXF zM&Rjs%Ip|csts#iiq=A-p0Px#4X zAZ1V`c)-y#A)1r9G)waFljP&OO)>>X`Xa>P?p@k3(3f+KT*%J(dbK z3@POwNbk;+cfQ(k@|2>`8Le=Rl1cQq4#2Krokz>x;yUkM_z(05PIVnRoGrz?M2H6I z4{o%MTyT=esB`BLq@&dB$m!}%8i6GcE7QBEoUl`z5AYIVX@dVGV>B&Qv#*SIv?Wb= zE6|mQ_cnfmb?aRm$S?FW>+`#ZQ9h&Iw?&MH1$R>C2heANJ()Kz(3NLx-}UmdXoF$x z@fKWB@;HqOp}f{2>h3T%!xZiJVqRQPhMgP0lnFimfoVdRv!%+;j+v-;Tyg?XUugRxzU*e=-LO{ylb9Hg8~v173r=AN7$cPr&{HW zeACnT`ItMa<~~|6%dW~4R^!Q>`bUZZBPKsd-=}Z{vL{Jl>;j#JaCipNh%wDRm=yY9 zN~E->gcl=M3y*J_{#VMLA+~m?Rdmnhy`dtuB0kNKQ`X*J86$NdG^zO#L=6OoU2jg| zH=xgM8O?y*T~mgMi-lzdSqp^JWk-)!Jfp>i;mv;WhsII(e6%5sP;4WwZif?WMNbuz2|BEWKn^sN!CA zHLNOn3wN*QKLuTZr%d$->q3obcwIThr} zJQzHHUrY?2sSFI~zW-OZz81E0(EVI8?2_P~I=ZE`0;GS5HBPLz!jw-Kp+t>81J3)!Eha&Tk31je&Szl5iq@< z)Rg>|lk*NU2Eu>{*}gkX?=+62wLbo`Xj?E|xICLMs5bGAt#cWff41Rrm2g9!qzu$5 znWo(H{fr@A6HaEqrR^hO_tZo zaron`G9gP!_AVE-GAs|?-0X=`&8ckcyT4S6NWpkv>Hsa6n*<~age!&ZGa5q67rdfb zAuFu;*W*bA02~(5tL1n1B<3rAFoTv(1!oZltDW2Eo_J=@3yFUhrUPfsN$lQ>o&(ER zL(u%lkJEo6l@pstW${m>^3L&pAeHZTO6nj5V|ddW5YsOwihyR=-xSCSgHW#=petil zZoVhQgy(a|rO>v#?XfhR#)*zn*p$4tJ{N{%Bp2ZJ+*CL0~%$=UWWy%LXkEtO|$RC9EU*Xn; z*_7!(K$fZV%f%6BcG-NG^J3*9Q$@_jGLL&NiK zp)ItjCk4O0n3{8~w>^&nMyh-k z&E{LJA|I&3)T;H+og>&>x#_A)>%L?=Sr*Oa0-Cc>O0|7XcO!}fP;6&oqP$ExU_#y<$ihq1(ar*n;X|ND zh6nh2fhXTyA4))yoz3(#9=Pb->8{Nz>@#OCAfYyhhxmN-+j#1$O)$GIY;1n`Xh}1r zCJy$frvJ-cde2T3wHMe=d}oBiKQpO69UD<0ti+b(ChxYE!A&gn@c7}^^&%bkBcT^3 zo|dfV3+v9;oopR8#NK?;lDZO?YkthG+>CiQd-Cv+$*9AkFI)s~gZOizl)Q{sE41%U zDsp&%H2pdoQOA9l;34q`GvsdC{4=V@me{)(@zYE7K^rTmVWo`crfk_pbNS|@UHtj= z-P$sAmo%p;53fxwZ1cCYhY1$JKl3WHgJgBxGTUcdvf+dKaCc~i6X4B^zVWxVh^kh!dvHm)I5l336kuwfwFRRyHBT>h=$W zXZW$BI)Hr8U*X1o2AQ1#?FL_89xaTut1MC5B@`MMEIlfEHtO@i@S6(1qOePwDC~vN zw|7MjUk>-Bn(Dr+w@)UA0x<03pD^rYrV08jPxBr=yESpVbFkkw8B}&-yN8$m?>3E0 z6pgYaD1)5VAj_;MB03Ga$}W_R2U4S`K6=KAvZgkCsTGLy^e+Brl^^^Z>2NC+5Fr(~ zWepkYxIZ(r(-~|KXmQKv2B!8JitEU0;EvHM7AKOxmiX7ybZd~oAEQU2*M<>+aU3SlamScE%TAW0V6U`O)9rY`-zd?&j z8o8^%=#Z~-yVo=9v&p&n-_C#u&j=Zv$-V}~_9tYX;TlniM zPmP|$@a=XA>wJ*N9uh{cqrKBsQ_kw^#Y6yT?yY{!isE?{+3P!r|I9v3wF(HDM1Jgd znpPK|fpybC($UzN_oQG!aQ=<@%Wa-n&rbd9JXYTiD8vCi$cOGno77M8<(%uZ4yw$+ zQMAv~T|)a4=ux5U+%YP?JK?Jt0O~eWysQdDk})%C@U#wwB_2>$yp0Uf!$ zHwbA!A=8GMnuLF*WH{NrC1<3yGlmM2`4)6Fp;|~V22Hup2=G4D8UWs>){4So>+Y3x zC0y9eM$oogqsam>@38i$Rus8`_vFz^c-AyxfoN6s6!`{AsNJ ztveIQ+ci|-U*VTLiFCTQ-QNt*@^k$8Q11uKy4YT^w9#x01$l6K&+XwmXtjc{xiB+< z3z6Of@wcydz8HWw|Jfnw~3)G z@M{S1%l#0Ic_MfoH$o!aV+W&niJFWeHK%dMMHEfQE2J-B5&x0;2hWCkqYzi4-yA(k zo9}+h@*;uQTj~MIqJQelSD^QWxq>PTv0{$2R+&%X-(jD?N0%kMqE{62<0h-wZ-i;s z4kKnUz5jp>fm!?+Ro7@rl8EuV#M7pIZAddX8s`TJh8(N@6ZHO9*2ku_-S21Cym@s} zHCX@phxcx8Da9?4Q!4JwBiDPy;u%|-g<*=)n*A@o>^#Glz@9NvvlrIy2|u62o5$_m zvj5xr1R(7oVpPI`j zc=A0`A8`(S`r|f{uy$TE%UQ38G!c*>rWIw)<4FdZc$AGv0#l~?rpk0T}GJi#^d4lgC zU@=ykX1$QJqo>z%Oh({q=+$XuNA#N*f);1foVoMY7uMgBKVPZC4C0CGXjVR4Ow8a5 z`Uw6|Oy$=QG@SpCg-?+YKGfsa+m54+F+x)h58?GOi%J$U!F*^=Mdbc%Xe#ec2z+@6 zvw$e6?s#P}PoLo`{e!3t#5b+Rtoz?6*FS4w9##W{(N%yjIs)qK|AJEpdI@<^J-Wv% zTuFG>N-nnCKh;iT%jGq6fnX?Th-S;MO9l@^DYH};H_6Nw;b$M|Q)tt7mb_O`Z;L#u z@@k*DX^BO@^76Oju8vqz9_J-zrzkE;&U%S)9@SuOmM_eIM$GX(6qIg;JNIKU zo8$TY#~|HzRz*g|;x)Q)GJ)9AT_sjODW)L%@j}KW5;H4oV?_6RU-up6WD2yGeU)F~ zi+m}@yJqvLfwpvwf*A&NJb7|U31u;Az*$Aaf4V)g;}^R+&6b&V{!WJ^%}sYzJx*r7 z0qt*c4?isGF(&0i$`4Fl4Lj(*<>(TAEfVu6E3g6{+Q%F2Yw0eSZ(2UB$~-Z-{eudQ zT5}63e8C0Z)Ks$drMhe}*Pz~zOID}yvpG`fCa2r;)4MZP8U$b6W&&ro+JB`7BaBg3 zs3nj4JL2*UGRoCoEvFEJWs(|lzyoj-aC)L9NU+X2&0;WMQNi#;PV3R5IxFHMg_BK= zSag|x#pTd)4gQZ!p9=+iMBC@<*%r8}-T;OEgzgEwkdU+$S1g%Kpe-)u9I%czmw;AIsj%o@;7EYf}^iFEUR$)>Xq$W`$1JV zXJc^SZ+v$Cr^y2bSrnX=SS(B!i)_gzk<+geU1$nTa3to!;_%#`=m!wjj| z*dwo^g{Xj=rC*rZq@z-<=dM)>#N}azDvqGCCCCMWI?&^Z_XT=IKL8OmtcO|KbcLxL zc%vQ2iX~cl-k<$e71NQ%^$7WLusYyHMINl=a>z~VjE<+UGDJ4b06VMllg7vZW6nMSz7C!^EzGH7~7x-nY zGGCyN?MxRA8amd2e%4E!pb6cll0yuTfCq_~JfTR$?rFg|XKVx*uFIj358T(yw(K;tzw{L3Pa! zVN|yt(Km&ed__)Sn4D=zbt--llF64u53H+FN>nTfY*3%29IaY?6l29_#PvJZoA_1i zz%eV-k}D4qfNdbxCit?;$m|-0xf5>C3 z*S>~t8^@Z8V0`Z9m&T;p@d7v5v0Ql>OrxRBrLb|PDO;U#^@Mvr(0?+uk6zQI$u)3L z_V`sba;;Ttx=A8%N+irj5|mJD189{9j@F$5t%`Ra`%;azuCG<3%>%=c2ak>+EXUw!hY)97mD#uQtDI_VJRC@3Lkn zdxRX*l-1Czsb3GfQzu}GL|h7_%*Rbt?MYmrRMnEU6!`G-*0WSH=Co3+n00xG5{$Xg z;8TzG?2U@R9(fr1x~b4SP?<=a5^o>VbZ-GUMlYuo|9y{0P2iB8$ho06zrI z4>aRRLC({+sp2V)^O$0O1|^wxke=?H@Y@V1MY({TM}@jQGXlqpvYxPSl=DVu=c6^a zsHG0Av4kh`%o(lgvZV1E+&Hbm{4`IqvVfAGA@LC_Iba#Wk0n9saz5hKz4Gd<(^kw$ z-=8#CF!kp7p3k}`NF}u-6};^kKfH$#PQYiab&`|sG&b$U@QNyV*M^9s{ZMz>0&O^Nj*f>qhhZDkHLw?ehQ8r|XVW`-V4 zpG5Cxoqy)FhjW3v9#wEkUav#KeM5WYH%bE6A_7(k`gdsG^a|*3yIq|tEhKSSplO?V z!T{+S5l*ql)i7r7od|1Ic<0P;k;7a=O|8$Aw_$n?gK0K%vKnjOd9qDCPGaIJ=OC-=>3~Y@O|s8ACqlrpGR}2k*G2EOwi%gBIpRzU z!-ul6(GpB8T(Rwcxv4AsuUCZYskQB`o=#zIYZO&s$Ahh}p)L~ZQj#|6tzAYcgJE{V z6~=SU`wIwq30UXB<*LqotE|*c1Mzn&Q0v_Qlr3a}0-)?qEzUCLT>N>k447yB@*+uS z<`QAVV{Vy6xqpLuMzI!>I@!lsC9b%ghBuuY%q62%v_Z+$q^8R=3xpcT*PBZPEEgW; z4y~M`Er~qE8RfqT7 zxfPnq2q46*Lnsw>5Z$_2XsQ*ljjm63eX#YaS>Q`!#Ld;+f{VyQC&QQ1J|{hXB3`cDZfW{O zbqS9}QAtZVgHQt7DKc;4)}Khr6;EPg7yd_GHM%-6%;bKu2%1>O9p2iOX3Jpv#TLd6 zu~eCw5za}fZKt0$%V)x0^MR^2w>p`Zcb&DKiP+7RW|-vMQ|>CLx{01%sI){OcFdF* zh@c1x?OomnyIuxy8tbwY$aM)D<6XE_j7lS;@)qWn{GCo3FkO1*^MvZU8#G;E+512H zqW||e{oi?8OBXx640i6tv0B2C4*;_CYEE2u6XQaMpt>p-b1!X*8NZCI<+-7paXcn z5Kl?%s=4=(2y@x#o^8#6gmmrMUMczR4we=y$>V`VP(9Bx%a(Zsy_+?P?&D-7-x$MY zp~xuKN-0Dv7qv9*dl)yIt!ic68?eM)T0dm&+6!M)wiZ^ldvggbeHXd51N+d>r)Oxk zT5n!*e->?YrHHurb%-PjIWLQvRcO~-e}ML?ggmGZ^b7ej7SQcuS=pI)+~(d6E}FF9 zb#tbdhq*V3phTDU&zq0Y?F~4evs7yz-58sbsZyuFbc+6;i2Sb?W3!mSsV`4& zgk*gT(7)|<*?U3q6phF_CZGg;pd^U4!|(eoE6pb}k5D!y*wiEY;~G2NR~d5hfh#tH zHR&GaI=ja(Gt6v2DXHQs!j-F<#IP`C9=)VMy zmX-pIU6G*1>Fs@7|9N;K2X$0un7ent@X(6vlw|36H=mb=RXaJTBR%f6D?m;;1V#$- ziO?PmHAz-M9()KH$F4d!2*v8jTjXAI>KsA=es4K#Jcp#fAL#c=Kc7<^rG&^7oP<^@4 z;lX&xtE${{X=em(dk*{Uu_=Nhu27oWuDKH;ZLxO+KyM*SzDWzY4MmtbUyASZKbU%85IkGX8tt0=kHjEv@=rh~p zuWY~C(z09ng>hg_!l%)eAEPYGFX^&!^gmI~;p;PVFtc1k4L3%eftmtY|DTBTW&i?c zjU5O&|9%TFx**&qe5Zey-)okUp$Uh`+~cV2l@|T=B>gqk7S=koKMKfo=kB{_ha?Z= zV**XBSBvlRhx~3tb7CWQI|{IecbCWkQ^}kr4N*k7IA({@$p0kA@8xDhtcq?wva9Fu zzbxth{23%Ae9@a@tJULC$MI_bd;h49rAR{idPZ0m(RXL^Zt;xUSG_Fh+rlTe%DIrd zW-NcaHXYu}FC%9gO)+0dEuqGR7PE+tJxJuke5Kh19yh>=gQiOPez)(HKi9f<0#mu| zZx@GiS_oXmu{2;1g&Bz=29bL(U7a9yv!>BqLXMNZ#mzt#*Gcmh*ckreREGyJ_2tKNrGoW$Id2cdxc zq##MY?t>WibiYY-@ZG1P6V2L>o*^EmFV~3Cr@v2*KZr}X&1_tDB^++`VH-Rob~1ho zG>N>CTlOrzajTB6L{NcK$*K2VDYDyO zfMW$8JBUEIg0eJQYRH3MMAeX*;C=5)~V%F>>A*H=%32yuOn^Y%;m=e*V;^b zG~W)TXvh&&9o*G^Bfizrz_p`Snb6;L?FZXG@@$f$W6*1*Hhwc>!T!y1YFz<|B#UGG zC4LR)q)Q3W;k)={wAt5Zras7?ObB+@FvygW+|Lql!5`9;7<7j*BhTP>Wg>kt)7&?X zPC6%QhEbIhH^kehf;~;akB%HGCf|B($<~IM86tO8lGA-XF~x`{W@S)I z5sE*p_L^u#pqPl$(;WN2e=xHq{$RWDQA_hn%KCHCi*9)DRPC$1vc=`Rrpxi5;833p zsJ@qpOZ%)>&`Y7V$y?XM5!mQ`IhU(b>j?+e66KS@;M}fvVJd?9t$>GA*7`rez z*$Vf06Sm$Aw96KC*;Um< zbM9F4LkPUbsAOju+maF4K9z%|)TF-dj?U7yK`2p{;@9oCMoivA48}Gim09!|72kM+ zp7XLg2tL9F*J05UtfLLLohL_6t%8f&YPTNw6&FFr2*Nqp>{f*JY+Mu2U{BDNqBU=4 zVyytEDS0zQYIfD6+>35HB{L=PjXyacAlZ}X6m8~xj(}joKb{@sMU;49sI1`ZG@lPn zNF{G>|94dsL%ajyERAb$2TPWo+SD{i1<|ic8~z!?@!M!89N1nK3$2#OmLs31^)m`i z@bUX>r4SFV>Q&*JH~dTzvYqJ%xl1Q z%CP4*s%K0&Gv&uSrH1fv6?-9N#y^?#XQ-G zi36Ekp-$j;IEG{mTKup<9vaAnQ+R{#&jU_`fh+d#d|w@DIpL^r_DK^(UNr_kOSfLL zY%{W#>M-u-Dy2j0@aayrIzJT>+?N*~-NM-G+H7T>(QjnGsI_qC>}A-~>;B}U>R%Xj;$7h%q z#yMf}_h~EmBs}HXs|)rr7$RYzJ1 zWjCOcq)ylQeWzc$7`TBAr7$ER47}fK@lCk}eddGFYu$%e^#a_xrN+8=yoZyJo2!z^ zeTavmc$|31<8v3QL^=$aBX`8L-1?M@!KO(Hzgic3s{r`vxP;(x8?)~5jk!2fZJd>& zPEyNTm;lyrW2IXIde3EQubsj`Qgm}$)PdlZ{w`#lZmj$L&rNa-%_bQoP^$U(B|fPL zv|QR>4f&xIY^+IiR(Nj%e0vMF^%XxV;Qt3d%#r85y>jx{&_jG$1{`(oxiXZ3vV#UJ zbJ=3x+i+t4!fT`B-MBmmmRIJRs{F{KtAgCSEP1=pIlpEi-jJ#PO5yUFy42O~uKf9i z*^(aU*poNU367LLA zJ$b3)DT@X^lv5o=H4wcD*nIa5{szz}7)86GN85lDE6>{i%U)X-+TB-&FU9m_Im`qw z#dV=((f0OB^qg)^eU}nerx&Zj@tWsUn@A`a)?Kb&E~@Ujp4gA_8zg~JUw@(xV}h?V zoR=UfF(cn~q4+v?m0C(xXt`s_5kkTe+il1J11kk6*0vVz@7bG5# zpW0sscSIn9_7T3bJ$AX`5UOrfXcKAA>t4(A@=G4USENE$@4>7S^kf&1wLN|j&s^AV zAaD4;GyQn5$MEybvSb@>oc+NAgB_3$yoIo#X(d-*zp9WKnT^99cqIv6xX!aX2($Gc67nj;sf=(x21UGvb$`e9i ziwBc)hZT#}Deg3*^dW1fF{}a(n%cqgq};E>Y_K*BffKKWhMIvmcV`V&eXKO#(a9Z< z>kQw~Jhz_!dCec_0gIoa5Q9s0UmQs}aOVA!HTX0hPcKoGn%w!4^5pBx3tn+`5rzy? zFe0-`~dT3{ydRFr-Z0sd7+bk>NPZc*=YJP@kmk$q!ur?;TQ6@l{BQJ%ZxJYm9&0pUX+JBN3G_R zi7iuy=ZF|sc;2T3vXyn7eiDe#=I1~)bAAp$FkOrngw{)8wcW7hntmc;9u?4Z7p-M; z6dq7@bbC)R$A-VW{~&Z4>IrpzQs0U+C5E!SJpE&HEO2KK#Ww;IUWLZ-KgHjE=f#y) zSluRsDi~Uzzj(NgKLJwvo#Ph>UkkNYbUa!EapiXgeEh0)GS)r-O`-G4vh3Nn7+#C- z$s}zfOFF=rT7z`Ctc(=nPe2IDDEtZVIQrWob6Y(-Ksk_yO6Bnw6o|Le%GGMhShU%I zXP_qof+-(REOM&Y#Y{R&SR}My6Llspk<*u}F&Mp7(v>txyekR(jO!$^ z6D5*uc3?6lVV{ucN^dPaqq%Vy+8_zXfa19g!n_Kk@YD z1;G%QpCwYndbd{V9C><=(rM1wdf~Xtzx0b4YL}&#NLr)o}X4+{}A!f6)@K1 zj*`KgNu<_mmAhvrmY`equeUMm;o=ucve&65M^!82Zt%}@bOPhJ1ou~2z?D$6(oF{ypX4c`lq)>^;Q1XSgYR!pggQ;tIMCtg4a0%y7 zw)>ebJHLk<5w?x&DWfpsadxQ@oX!Kg9 zciB+(`7o?u@oBU=tALWwZ98W}I40-G&sUV^?zi~@>dYxY)WH(jm-(hk*r!A5BQGkp z9vwyX^4dr3e>*;U+6cc7(h3i3Td5UCN`DC+r+6Swc*FsznxGWs-GD*I;r_}iWA=7N zp-?TYn=lR+tN4d4zMjnErD@O;_dTRf#r705;g0Vp&hb3pfn=AwhKmA%Nm=hY6eX3i!IWeL@ zQ70ZY^aKpuP@=35DJuV$Szi)U?GzA@Ff}`8a`WHdT$$Le2M0%lg({p6*xf&}(zSNC zekvA~ zTfM4!!#aBz9WoE%NVl1W9f)~`lQ>Jkm6qM}b@&n2{&Nmv_um&DaPz^RY(nh|a!%9f zg5_41&;5kjr^YX+>e>+KY4eH10O70Yhj;e;NsBpC>x<NIna>P6S-I>N)aLYc4*#3lc z2+2)htQe1dFG2gY#%2@4h=4duM?~B|5OVm>;d32!TULNaa=EHVANz7jjo7Pin}P7o zglghhps67O>~#F?<})q#(M7ftD#-4aLj2i((c8eQFX%L-e*^M!u5K|xGlP>#??k4g zR*R%OVXJpOJ!1Ti-1}6bpyYl9xeqJyH=k^c7Cm5rRr>_F=+U(m$9sR75@3zllD-+- zEgPIfmXWZB+;f+$4pC0ORJXYLa#><)8IKntDTH)Zp(3QXPO%J-!=Yx0Sh-Zk>h!XV zvHp=uKjUu6rS3dYF-p?24-hPH+E;FmuMdxkO0d zD)WjcuQOBP-Pr9$cC?Cbr1#JSK!bgN7YD0BV1rV6ZiUL?yO17<{LN${#E7>{u4Rfp z`@Y1uX%l$r8nQ^U;A%YgFLV0$V7g2?NZDcPl+cEv`jF&)oZ=D1BhpeLUp5fPFE8$; zAJM;@3qC=A7QSKryOe-G_P*K2kHQ#PPQcc(H@xOB8-6)Ympibg%cd=L#I<2Fjh3LN3StXmx1 zH$Z>%9ND@3QHd?9ViAI@XeA}Cr&9@yVYYb~n{*D03l;LA(-@4-SF7xYP;}~59&SW8pErC<0z3~n28w?WwfO0oL*_O> zrr@x(@NxS$mppE&qUyT2b|pWf2G3@Q-5$@ZWlZ2nS41eRe1c_KUba}^X_jRh-ZX?( z)#iHf0tw=Lpjxm9a;t9aD-F_Eesj1uM_D_hI7b^M%H4ytp)IcPzsaAd*w5b6Qbxb5+CvQ1=RuO#En%9$w3 zym2*7=RQ`tc5EI^gP>)cE*dgQeg~)TQ;^ZklFz4%Rit2(?2j%ebXDL| z!5#Bi0H`PtQJ5;Il1FIm!dp+hY6~Rl8-)$@Qei5BkKoUWV_~Xz3%DbOv@uxsJP`2J zxlp$Dd=w@hK92d$x-*rAsZ(sPg3vc=QomYy9x^S-$p$7Grpm+;#M%BdL}=t$Rzb?24T0Ec?}V0p<Am_mgPiKqB2-CD8--wb2Gn1Q1gX+-79$3YIt-JiF zbjZchp9uqS{(-_}%!iI}3AH78Nf|ay=|>f={o?!xRu>ObD`-bxgy8NfS z9!cw?Yo1)Wq5gQjobRAvbcQ*L<8-ko|~o#HN-AU zo+(cV9@{eDo>8@4M+9%}VNZSWT2w+G6S)^AN@28P;iYTtHH-sZp1I5-vhfVkD+Dh1^Oz0|0-G{p zUSwXI!!h;2n1rfFNsek(Q#1Ig*rKqn43b=quD(|NF>K2GpUahhwek5Y*973D$Axs} zEaWKRP9kV{ZH3~lkRz3phrx?ErvO>GwN#>;V|WVZRY>mC$ZSNyZ_&> z`@j2iId}1upJ%F7>kj854~l@;AD;3&c%WZyF!RLw6E2V3|KL3)*^s%g>2dgXjs)KK zGngmYVXosxl!>4Q)LBUbKB;9-e|fYk&!tgp)qVRribc%q%R79YWlzxPG&=i_d(vwo??Xo=frVGha?k1e zkE&_EieJ!TRj(6#w4wGtV|V`t_)S7cDF*K7H9S8U>c9V!&J0TYTOYg6Yubug(=|7r z34NW-=UL!!*D&f|*3`38GlL!*?NHtLrF){qO`%Dm5BK~xI$Bd`xeQhfB>3 zuNNBq6CXr0IZx(Y+Hy2?!r5JKg~AkH2CPzk?(C$r*KTvkG~Z(uM2syQh^T*1F7bi0weP_{h0`u)7stzK`MR|HfBPw5 z>ykEI?vtGt`n1oVOce$m;RS41?m44$zfAANvr~86UQX5bxm2~EnUPs89=Qhu4;nb5 zMv8e>z=;~o#5p%--)y8oY;OPZW$EXyd1|z^+Hnxxgf~|EccYWv7h4h3qc+v&Dbc1o1TV!UQ%n1dJWK)v3I`pJ zVe~E#i38%G2ahFwSTvr@n0q=S(H{N&U?i)-B@{2uga-=Rn7icA)fMv8%sFs>LZ}n_ xCZxl)(NsaW1%1HYPRdhsXCZ|aM9Qwav3|bL=GOi~yGsl};OXk;vd$@?2>?xsqG134 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0253030479.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253030479.png new file mode 100644 index 0000000000000000000000000000000000000000..7aad3aefaabd51111ef2ef922fb38d088a454ba2 GIT binary patch literal 77957 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 z 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�R!n?| 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0253036670.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253036670.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8fdc24f85d10f15b6defabc8fa90d0b127c753 GIT binary patch literal 77939 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 baR`)OU3YQ%jdSrb;K%%!)zQMkF1P<51&Zkx literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0253038757.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253038757.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c2716f9092286367989af4ff35649f88ca09f5 GIT binary patch literal 15090 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 Dye9em literal 0 HcmV?d00001 diff --git a/content/zh/docs/Toolreference/figures/zh-cn_image_0245423148.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253082069.png similarity index 100% rename from content/zh/docs/Toolreference/figures/zh-cn_image_0245423148.png rename to content/zh/docs/Developerguide/figures/zh-cn_image_0253082069.png diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0253403489.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253403489.png new file mode 100644 index 0000000000000000000000000000000000000000..058a79dd9fb3da7d5b74f799b4553b560ba87998 GIT binary patch literal 2587 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0253404023.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0253404023.png new file mode 100644 index 0000000000000000000000000000000000000000..3210b21a485aea2e1950c5d9cd0325aa9547aeec GIT binary patch literal 1908 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 Re0Tx?R1`Gj%jL{M{s+D2;J*L> literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/java-sql-PreparedStatement.md b/content/zh/docs/Developerguide/java-sql-PreparedStatement.md index 305eddf9b..f5eae2c33 100644 --- a/content/zh/docs/Developerguide/java-sql-PreparedStatement.md +++ b/content/zh/docs/Developerguide/java-sql-PreparedStatement.md @@ -111,13 +111,6 @@ java.sql.PreparedStatement是预处理语句接口。

-

setNString(int parameterIndex, String value)

- -

void

- -

Yes

- -

setShort(int parameterIndex, short x)

void

diff --git a/content/zh/docs/Developerguide/libpq.md b/content/zh/docs/Developerguide/libpq.md index 3652014c1..18ace7079 100644 --- a/content/zh/docs/Developerguide/libpq.md +++ b/content/zh/docs/Developerguide/libpq.md @@ -8,7 +8,7 @@ - **[取消正在处理的查询](取消正在处理的查询.md)** -- **[示例](示例-10.md)** +- **[示例](示例-3.md)** - **[链接字符](链接字符.md)** diff --git "a/content/zh/docs/Developerguide/openGauss\344\272\213\345\212\241.md" "b/content/zh/docs/Developerguide/openGauss\344\272\213\345\212\241.md" index 44d1d063b..e9c7bbbf9 100644 --- "a/content/zh/docs/Developerguide/openGauss\344\272\213\345\212\241.md" +++ "b/content/zh/docs/Developerguide/openGauss\344\272\213\345\212\241.md" @@ -13,7 +13,6 @@ - serializable:openGauss中等价于REPEATABLE READ。 - read committed:只能读取已提交的事务的数据(缺省),不能读取到未提交的数据。 - repeatable read:仅能读取事务开始之前提交的数据,不能读取未提交的数据以及在事务执行期间由其它并发事务提交的修改。 -- read uncommitted:读未提交,可以读取任何时刻的数据。 - default:设置为defualt\_transaction\_isolation所设隔离级别。 **默认值:**read committed @@ -115,7 +114,9 @@ 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**0\~3 +该参数是内部参数,用户不能自己去设置参数值。 + +**取值范围:**0\~2 - 1 表示使用一主多备模式。 - 0 表示主备从模式。 diff --git a/content/zh/docs/Developerguide/record.md b/content/zh/docs/Developerguide/record.md new file mode 100644 index 000000000..d5d293463 --- /dev/null +++ b/content/zh/docs/Developerguide/record.md @@ -0,0 +1,114 @@ +# record + +## record类型的变量 + +创建一个record变量的方式: + +定义一个record类型 ,然后使用该类型来声明一个变量。 + +## 语法 + +record类型的语法参见[图1](#zh-cn_topic_0237122215_fig092918316312)。 + +**图 1** record类型的语法 +![](figures/record类型的语法.png "record类型的语法") + +对以上语法格式的解释如下: + +- record\_type:声明的类型名称。 +- field:record类型中的成员名称。 +- datatype:record类型中成员的类型。 +- expression:设置默认值的表达式。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在openGauss中: +>- record类型变量的赋值支持: +> - 在函数或存储过程的声明阶段,声明一个record类型,并且可以在该类型中定义成员变量。 +> - 一个record变量到另一个record变量的赋值。 +> - SELECT INTO和FETCH向一个record类型的变量中赋值。 +> - 将一个NULL值赋值给一个record变量。 +>- 不支持INSERT和UPDATE语句使用record变量进行插入数据和更新数据。 +>- 如果成员有复合类型,在声明阶段不支持指定默认值,该行为同声明阶段的变量一样。 + +## 示例 + +``` +下面存储过程中用到的表定义如下: +postgres=# \d emp_rec + Table "public.emp_rec" + Column | Type | Modifiers +----------+--------------------------------+----------- + empno | numeric(4,0) | not null + ename | character varying(10) | + job | character varying(9) | + mgr | numeric(4,0) | + hiredate | timestamp(0) without time zone | + sal | numeric(7,2) | + comm | numeric(7,2) | + deptno | numeric(2,0) | + +--演示在存储过程中对数组进行操作。 +postgres=# CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2) +RETURNS +VARCHAR2 AS $$ +DECLARE + + --声明一个record类型. + type rec_type is record (name varchar2(100), epno int); + employer rec_type; + + --使用%type声明record类型 + type rec_type1 is record (name emp_rec.ename%type, epno int not null :=10); + employer1 rec_type1; + + --声明带有默认值的record类型 + type rec_type2 is record ( + name varchar2 not null := 'SCOTT', + epno int not null :=10); + employer2 rec_type2; + CURSOR C1 IS select ename,empno from emp_rec order by 1 limit 1; + +BEGIN + --对一个record类型的变量的成员赋值。 + employer.name := 'WARD'; + employer.epno = 18; + raise info 'employer name: % , epno:%', employer.name, employer.epno; + + --将一个record类型的变量赋值给另一个变量。 + employer1 := employer; + raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno; + + --将一个record类型变量赋值为NULL。 + employer1 := NULL; + raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno; + + --获取record变量的默认值。 + raise info 'employer2 name: % ,epno: %', employer2.name, employer2.epno; + + --在for循环中使用record变量 + for employer in select ename,empno from emp_rec order by 1 limit 1 + loop + raise info 'employer name: % , epno: %', employer.name, employer.epno; + end loop; + + --在select into 中使用record变量。 + select ename,empno into employer2 from emp_rec order by 1 limit 1; + raise info 'employer name: % , epno: %', employer2.name, employer2.epno; + + --在cursor中使用record变量。 + OPEN C1; + FETCH C1 INTO employer2; + raise info 'employer name: % , epno: %', employer2.name, employer2.epno; + CLOSE C1; + RETURN employer.name; +END; +$$ +LANGUAGE plpgsql; + +--调用该存储过程。 +postgres=# CALL regress_record('abc'); + +--删除存储过程。 +postgres=# DROP PROCEDURE regress_record; +``` + diff --git "a/content/zh/docs/Developerguide/\344\270\211\346\235\203\345\210\206\347\253\213.md" "b/content/zh/docs/Developerguide/\344\270\211\346\235\203\345\210\206\347\253\213.md" index eb576e6e4..9cd11b584 100644 --- "a/content/zh/docs/Developerguide/\344\270\211\346\235\203\345\210\206\347\253\213.md" +++ "b/content/zh/docs/Developerguide/\344\270\211\346\235\203\345\210\206\347\253\213.md" @@ -1,8 +1,8 @@ # 三权分立 -[默认权限机制](默认权限机制.md#ZH-CN_TOPIC_0246507958)和[管理员](管理员.md)两节的描述基于的是openGauss创建之初的默认情况。从前面的介绍可以看出,默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。 +[默认权限机制](默认权限机制.md)和[管理员](管理员.md)两节的描述基于的是openGauss创建之初的默认情况。从前面的介绍可以看出,默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。 -在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的权限分立给安全管理员和审计管理员。 +在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立。将系统管理员的部分权限分立给安全管理员和审计管理员,形成系统管理员、安全管理员和审计管理员三权分立。 三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。即不再拥有创建角色和用户的权限,并不再拥有查看和维护数据库审计日志的权限。关于CREATEROLE属性和AUDITADMIN属性的更多信息请参考[CREATE ROLE](CREATE-ROLE.md)。 @@ -62,27 +62,27 @@

模式

-

对除dbms_perf以外的所有模式有所有的权限。

+

对除dbe_perf以外的所有模式有所有的权限。

-

仅对dbms_perf模式和自己的模式有所有的权限,对其他用户的模式无权限。

+

仅对dbe_perf模式和自己的模式有所有的权限,对其他用户的模式无权限。

仅对自己的模式有所有的权限,对其他用户的模式无权限。

函数

-

对除dbms_perf模式下的函数以外的所有的函数有所有的权限。

+

对除dbe_perf模式下的函数以外的所有的函数有所有的权限。

-

仅对dbms_perf模式下的和自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。

+

仅对dbe_perf模式下的和自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。

仅对自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。

自定义视图

-

对除dbms_perf模式下的视图以外的所有的视图有所有的权限。

+

对除dbe_perf模式下的视图以外的所有的视图有所有的权限。

-

仅对dbms_perf模式下的和自己的视图有所有的权限,对其他用户的视图无权限。

+

仅对dbe_perf模式下的和自己的视图有所有的权限,对其他用户的视图无权限。

仅对自己的视图有所有的权限,对其他用户的视图无权限。

@@ -91,7 +91,7 @@

可以查看所有系统表和视图。

-

只可以查看部分系统表和视图。详细请参见系统表和系统视图

+

只可以查看部分系统表和视图。详细请参见系统表和系统视图

diff --git "a/content/zh/docs/Developerguide/\344\270\273\346\234\215\345\212\241\345\231\250.md" "b/content/zh/docs/Developerguide/\344\270\273\346\234\215\345\212\241\345\231\250.md" index 7d1eb680c..d393ad842 100644 --- "a/content/zh/docs/Developerguide/\344\270\273\346\234\215\345\212\241\345\231\250.md" +++ "b/content/zh/docs/Developerguide/\344\270\273\346\234\215\345\212\241\345\231\250.md" @@ -18,7 +18,7 @@ **参数说明:**指定在备机同步失败时,是否阻塞主机。 -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 **取值范围:**布尔型 @@ -34,7 +34,7 @@ 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 >![](public_sys-resources/icon-notice.gif) **须知:** ->- 此参数属于性能测试参数,用于测试带有备机和不带备机的性能参数。关闭参数后,不能进行升级、切换、故障等异常场景测试,否则会出现主备从不一致的情况。 +>- 此参数属于性能测试参数,用于测试带有备机和不带备机的性能参数。关闭参数后,不能进行切换、故障等异常场景测试,否则会出现主备从不一致的情况。 >- 此参数属于受控参数,不建议正常业务场景下关闭此参数。 **取值范围:**布尔型 @@ -76,7 +76,7 @@ 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**整型,4096\~1072693248,单位为KB。 +**取值范围:**整型,4096\~1047552,单位为KB。 **默认值:**128MB(即131072KB) diff --git "a/content/zh/docs/Developerguide/\344\272\213\345\212\241\346\216\247\345\210\266.md" "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\346\216\247\345\210\266.md" index f72b35160..716022410 100644 --- "a/content/zh/docs/Developerguide/\344\272\213\345\212\241\346\216\247\345\210\266.md" +++ "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\346\216\247\345\210\266.md" @@ -4,7 +4,7 @@ ## 启动事务 -openGauss通过START TRANSACTION和BEGIN语法启动事务,请参考[SET TRANSACTION](SET-TRANSACTION.md)和[BEGIN](BEGIN.md)。 +openGauss通过START TRANSACTION和BEGIN语法启动事务,请参考[START TRANSACTION](START-TRANSACTION.md)和[BEGIN](BEGIN.md)。 ## 设置事务 @@ -16,7 +16,7 @@ openGauss通过COMMIT或者END可完成提交事务的功能,即提交事务 ## 回滚事务 -回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。请参考[ROLLBACK](ROLLBACK.md#ZH-CN_TOPIC_0242370644)。 +回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。请参考[ROLLBACK](ROLLBACK.md)。 >![](public_sys-resources/icon-note.gif) **说明:** >数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,如果其中有一个语句失败,那么整个请求都将会被回滚。 diff --git "a/content/zh/docs/Developerguide/\344\272\213\345\212\241\347\233\221\346\216\247.md" "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\347\233\221\346\216\247.md" deleted file mode 100644 index a451aba70..000000000 --- "a/content/zh/docs/Developerguide/\344\272\213\345\212\241\347\233\221\346\216\247.md" +++ /dev/null @@ -1,29 +0,0 @@ -# 事务监控 - -通过设置事务超时预警,可以监控自动回滚的事务并定位其中的语句问题,并且也可以监控执行时间过长的语句。 - -## transaction\_sync\_naptime - -**参数说明:**为保证数据一致性,当本地事务与GTM上snapshot中状态不一样时会阻塞其他事务的运行,需要等待本地节点上事务状态与GTM状态一致后再运行。该参数属于USERSET类型参数,请参考.2-表 GUC参数分类中对应设置方法进行设置。 - -**取值范围:**整型,0 \~ 2147483,单位为秒(s)。 - -**默认值:**30s - ->![](public_sys-resources/icon-note.gif) **说明:** ->若该值设为0,则不会在阻塞达到时长时主动调用gs\_clean进行清理,而是靠[gs\_clean\_timeout](锁管理.md#zh-cn_topic_0237124735_zh-cn_topic_0059778102_s3be3f5098fe846f88a95afb16b0528f6)间隔来调用gs\_clean,默认是5分钟。 - -## transaction\_sync\_timeout - -**参数说明:**为保证数据一致性,当本地事务与GTM上snapshot中状态不一样时会阻塞其他事务的运行,需要等待本地节点上事务状态与GTM状态一致后再运行。当数据库主节点上等待时长超过transaction\_sync\_timeout时会报错,回滚事务,避免由于sync lock等其他情况长时间进程停止响应造成对系统的阻塞。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,0 \~ 2147483,单位为秒(s)。 - -**默认值:**10min - ->![](public_sys-resources/icon-note.gif) **说明:** ->- 若该值设为0,则不会在阻塞超时时报错,回滚事务。 ->- 该值必须大于gs\_clean\_timeout,避免数据库节点上由于还未被gs\_clean清理的残留事务阻塞超时引起的不必要的事务回滚。 - diff --git "a/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\347\261\273\345\236\213.md" index b740e30f1..47e315d85 100644 --- "a/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\347\261\273\345\236\213.md" @@ -16,6 +16,7 @@ openGauss支持的二进制类型请参见[表1](#zh-cn_topic_0237121951_zh-cn_t

BLOB

二进制大对象

+

说明:

列存不支持BLOB类型

diff --git "a/content/zh/docs/Developerguide/\344\273\216\350\277\231\351\207\214\345\274\200\345\247\213.md" "b/content/zh/docs/Developerguide/\344\273\216\350\277\231\351\207\214\345\274\200\345\247\213.md" index 09132cd98..653ab5c2f 100644 --- "a/content/zh/docs/Developerguide/\344\273\216\350\277\231\351\207\214\345\274\200\345\247\213.md" +++ "b/content/zh/docs/Developerguide/\344\273\216\350\277\231\351\207\214\345\274\200\345\247\213.md" @@ -21,7 +21,7 @@ openGauss正常运行。 当结果显示为如下信息,则表示连接成功。 ``` - gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -51,6 +51,8 @@ openGauss正常运行。 如上创建了一个用户名为joe,密码为Bigdata@123的用户。 + **引申信息:**关于数据库用户的更多信息请参考[管理用户及权限](管理用户及权限.md)。 + 4. 创建数据库。 ``` @@ -63,12 +65,12 @@ openGauss正常运行。 CREATE DATABASE ``` - 创建完db\_tpcc数据库后,就可以按如下方法退出postgres数据库,使用新用户连接到此数据库执行接下来的创建表等操作。当然,也可以选择继续在默认的postgres数据库下做后续的体验。 + db\_tpcc数据库创建完成后,就可以按如下方法退出postgres数据库,使用新用户连接到db\_tpcc数据库执行创建表等操作。您也可以选择继续在默认的postgres数据库下进行后续的体验。 ``` postgres=# \q gsql -d db_tpcc -p 8000 -U joe -W Bigdata@123 - gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -107,7 +109,6 @@ openGauss正常运行。 ``` ``` - CREATE TABLE ``` @@ -139,7 +140,7 @@ openGauss正常运行。 - 关于创建表的更多信息请参见[创建和管理表](创建和管理表.md)。 - 除了创建的表以外,数据库还包含很多系统表。这些系统表包含openGauss安装信息以及openGauss上运行的各种查询和进程的信息。可以通过查询系统表来收集有关数据库的信息。请参见[查看系统表](查看系统表.md)。 - openGauss支持行列混合存储,为各种复杂场景下的交互分析提供极致查询性能,关于存储模型的选择,请参考[规划存储模型](规划存储模型.md)。 + openGauss支持行列混合存储,为各种复杂场景下的交互分析提供较高的查询性能,关于存储模型的选择,请参考[规划存储模型](规划存储模型.md)。 diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" index 8223c25d5..73397b75b 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" @@ -6,6 +6,6 @@ - **[示例1:通过本地文件导入导出数据](示例1-通过本地文件导入导出数据.md)** -- **[示例2:从MySQL向openGauss进行数据迁移](示例2-从MySQL向openGauss进行数据迁移.md)** +- **[示例2:从MY向openGauss数据库进行数据迁移](示例2-从MY向openGauss数据库进行数据迁移.md)** diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE-LIKE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE-LIKE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" index c30c31d0c..37aa3a978 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE-LIKE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE-LIKE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" @@ -1,6 +1,6 @@ # 使用CREATE TABLE LIKE执行深层复制 -该方法使用CREATE TABLE LIKE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。该方法不继承父表的主键和外键属性,您可以使用ALTER TABLE语句来添加它们。 +该方法使用CREATE TABLE LIKE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。该方法不继承父表的主键属性,您可以使用ALTER TABLE语句来添加它们。 ## 操作步骤 diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" index 1ba5075d4..62e3ffc2f 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250CREATE-TABLE\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" @@ -2,7 +2,7 @@ 该方法使用CREATE TABLE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。 -在创建新表时,可以指定表以及列属性,包括主键和外键。 +在创建新表时,可以指定表以及列属性,比如主键。 ## 操作步骤 diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" index 209d954b7..bb0ad16cc 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" @@ -15,9 +15,10 @@ CREATE TABLE postgres_log ( log_time timestamp(3) with time zone, +node_name text, user_name text, database_name text, -process_id integer, +process_id bigint, connection_from text, "session_id" text, session_line_num bigint, @@ -25,6 +26,8 @@ command_tag text, session_start_time timestamp with time zone, virtual_transaction_id text, transaction_id bigint, +query_id bigint, +module text, error_severity text, sql_state_code text, message text, @@ -36,8 +39,7 @@ context text, query text, query_pos integer, location text, -application_name text, -PRIMARY KEY ("transaction_id", session_line_num) +application_name text ); ``` @@ -60,108 +62,117 @@ PRIMARY KEY ("transaction_id", session_line_num)

毫秒级的时间戳

-

sql_state_code

+

module

-

SQLSTATE代码

+

日志所属模块

+ + +

node_name

+ +

节点名称

+ +

error_severity

+ +

ERRORSTATE代码

user_name

用户名

-

message

+

sql_state_code

-

错误消息

+

SQLSTATE代码

database_name

数据库名

-

detail

+

message

-

详细错误消息

+

错误消息

process_id

进程ID

-

hint

+

detail

-

提示

+

详细错误消息

connection_from

客户主机:端口号

-

internal_query

+

hint

-

内部查询(查询那些导致错误的信息,如果有的话)

+

提示

session_id

会话ID

-

internal_query_pos

+

internal_query

-

内部查询指针

+

内部查询(查询那些导致错误的信息,如果有的话)

session_line_num

每个会话的行数

-

context

+

internal_query_pos

-

环境

+

内部查询指针

command_tag

命令标签

-

query

+

context

-

错误发生位置的字符统计

+

环境

session_start_time

会话开始时间

-

query_pos

+

query

-

错误发生位置指针

+

错误发生位置的字符统计

virtual_transaction_id

常规事务

-

location

+

query_pos

-

openGauss源代码中错误的位置(如果log_error_verbosity的值设为verbose )

+

错误发生位置指针

transaction_id

事务ID

-

application_name

+

location

-

应用名称

+

openGauss源代码中错误的位置(如果log_error_verbosity的值设为verbose )

-

error_state_code

+

query_id

-

ERRORSTATE代码

+

查询ID

-

-

+

application_name

-

-

+

应用名称

@@ -183,5 +194,4 @@ COPY postgres_log FROM '/opt/data/pg_log/logfile.csv' WITH csv; - 设置[log\_filename](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s3226ae3209154e249928c24ec67c5809)和[log\_rotation\_age](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s3ce09b8a7ae543b18fae13a821a725a5),为日志文件提供一个一致的、可预测的命名方案。通过日志文件名,预测一个独立的日志文件完成并进入准备导入状态的时间。 - 将[log\_rotation\_size](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s282e72143bb14915bedb4b432586b07e)设为0来终止基于尺寸的日志回滚,因为基于尺寸的日志回滚让预测日志文件名变得非常的困难。 - 将[log\_truncate\_on\_rotation](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s143b6d35ddbe48b8810106a4d3929e8a)设为on以便区分在同一日志文件中旧的日志数据和新的日志数据。 -- [表1](#zh-cn_topic_0237124724_zh-cn_topic_0059779007_zh-cn_topic_0058967802_table44188316)包含了一个特定的主键,对防止意外导致导入两次相同的信息起到保护作用。COPY命令要求所有的数据在同一时间进行导入,所以在COPY过程中出现的所有错误都会导致整个导入失败。多次对同一日志文件进行导入会发生主键冲突,导致导入失败,请等到日志文件写入完成后再执行导入。设置主键也会限制日志没有写完整时部分日志的导入。 diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250Plan-Hint\350\277\233\350\241\214\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250Plan-Hint\350\277\233\350\241\214\350\260\203\344\274\230.md" new file mode 100644 index 000000000..225074aff --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250Plan-Hint\350\277\233\350\241\214\350\260\203\344\274\230.md" @@ -0,0 +1,17 @@ +# 使用Plan Hint进行调优 + +- **[Plan Hint调优概述](Plan-Hint调优概述.md)** + +- **[Join顺序的Hint](Join顺序的Hint.md)** + +- **[Join方式的Hint](Join方式的Hint.md)** + +- **[行数的Hint](行数的Hint.md)** + +- **[Scan方式的Hint](Scan方式的Hint.md)** + +- **[子链接块名的hint](子链接块名的hint.md)** + +- **[Hint的错误、冲突及告警](Hint的错误-冲突及告警.md)** + + diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_dump\345\222\214gs_dumpall\345\221\275\344\273\244\345\257\274\345\207\272\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_dump\345\222\214gs_dumpall\345\221\275\344\273\244\345\257\274\345\207\272\346\225\260\346\215\256.md" index 764699237..b84cd9e2c 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_dump\345\222\214gs_dumpall\345\221\275\344\273\244\345\257\274\345\207\272\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_dump\345\222\214gs_dumpall\345\221\275\344\273\244\345\257\274\345\207\272\346\225\260\346\215\256.md" @@ -1,6 +1,6 @@ # 使用gs\_dump和gs\_dumpall命令导出数据 -- **[概述](概述-12.md)** +- **[概述](概述-5.md)** - **[导出单个数据库](导出单个数据库.md)** diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_restore\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_restore\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" index 5b78d7ae6..8d86ab6f0 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_restore\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gs_restore\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" @@ -2,7 +2,7 @@ ## 操作场景 -gs\_restore是openGauss提供的与gs\_dump配套的导入工具。通过该工具,可将gs\_dump导出的文件导入至数据库。gs\_restore支持导入的文件格式包含自定义归档格式、目录归档格式和tar归档格式。 +gs\_restore是openGauss数据库提供的与gs\_dump配套的导入工具。通过该工具,可将gs\_dump导出的文件导入至数据库。gs\_restore支持导入的文件格式包含自定义归档格式、目录归档格式和tar归档格式。 gs\_restore具备如下两种功能。 @@ -93,7 +93,7 @@ gs\_restore工具在导入时,允许用户选择需要导入的内容,并支 - 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_restor”章节。 + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_restore”章节。 ## 示例 @@ -176,6 +176,7 @@ human_resource=# select * from hr.staffs; 201 | Michael | Hartstein | MHARTSTE | 515.123.5555 | 1996-02-17 00:00:00 | MK_MAN | 13000.00 | | 100 | 20 gsql -d human_resource -p 8000 + gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -262,6 +263,7 @@ restore operation successful total time: 23472 ms gsql -d backupdb -p 8000 -r + gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -287,6 +289,7 @@ restore operation successful total time: 554 ms gsql -d backupdb -p 8000 -r + gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\350\277\236\346\216\245.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\350\277\236\346\216\245.md" index 8d081fde5..a92b16657 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\350\277\236\346\216\245.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\350\277\236\346\216\245.md" @@ -37,9 +37,9 @@ gsql是openGauss提供的在命令行下运行的数据库连接工具。此工 omm用户是管理员用户,因此系统显示“DBNAME=\#”。若使用普通用户身份登录和连接数据库,系统显示“DBNAME=\>”。 - “Non-SSL connection”表示未使用SSL方式连接数据库。 + “Non-SSL connection”表示未使用SSL方式连接数据库。如果需要高安全性时,请[使用SSL连接](用SSL进行安全的TCP-IP连接.md)。 -3. 首次登录需要修改密码。原始密码固定为XuanYuan@2012,需将原始密码修改为自定义的密码,例如Mypwd123,命令如下: +3. 首次登录需要修改密码。原始密码为安装openGauss数据库手动输入的密码,具体请参见《安装指南》,此处需将原始密码修改为自定义的密码,例如Mypwd123,命令如下: ``` postgres=# ALTER ROLE omm IDENTIFIED BY 'Mypwd123' REPLACE 'XuanYuan@2012'; @@ -55,7 +55,7 @@ gsql是openGauss提供的在命令行下运行的数据库连接工具。此工 ## 远程连接数据库 1. 完成远程连接配置,操作步骤参见[配置服务端远程连接](配置服务端远程连接.md)。 -2. 在客户端机器(10.10.0.30)上,上传客户端工具包并配置gsql的执行环境变量。 +2. 在客户端机器(10.10.0.30)上,上传客户端工具包并配置gsql的执行环境变量。此处以openEuler环境为例。 1. 以root用户登录客户端机器。 2. 创建“/tmp/tools”目录。 @@ -63,7 +63,7 @@ gsql是openGauss提供的在命令行下运行的数据库连接工具。此工 mkdir /tmp/tools ``` - 3. 获取软件安装包中的“-EULER-64bit-ClientTools.tar.gz”上传到“/tmp/tools”路径下。 + 3. 获取软件安装包中的“openGauss-1.0.0-openEuler-64bit-Libpq.tar.gz”上传到“/tmp/tools”路径下。 >![](public_sys-resources/icon-note.gif) **说明:** >- 软件包相对位置为安装时所放位置,根据实际情况填写。 @@ -73,7 +73,7 @@ gsql是openGauss提供的在命令行下运行的数据库连接工具。此工 ``` cd /tmp/tools - tar -zxvf openGauss-1.0.0-EULER-64bit-ClientTools.tar.gz + tar -zxvf openGauss-1.0.0-openEuler-64bit-Libpq.tar.gz ``` 5. 设置环境变量。 diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\210\206\345\214\272\350\241\250.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\210\206\345\214\272\350\241\250.md" new file mode 100644 index 000000000..9f4564087 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\210\206\345\214\272\350\241\250.md" @@ -0,0 +1,12 @@ +# 使用分区表 + +分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点: + +1. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 +2. 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 +3. 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 + +openGauss支持的分区表为范围分区表。 + +范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。 + diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\220\210\345\271\266\346\226\271\345\274\217\346\233\264\346\226\260\345\222\214\346\217\222\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\220\210\345\271\266\346\226\271\345\274\217\346\233\264\346\226\260\345\222\214\346\217\222\345\205\245\346\225\260\346\215\256.md" index fd0ac3edf..acc2db349 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\220\210\345\271\266\346\226\271\345\274\217\346\233\264\346\226\260\345\222\214\346\217\222\345\205\245\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\220\210\345\271\266\346\226\271\345\274\217\346\233\264\346\226\260\345\222\214\346\217\222\345\205\245\346\225\260\346\215\256.md" @@ -55,7 +55,7 @@ MERGE INTO语句将目标表和源表中数据针对关联条件进行匹配, INSERT VALUES (p.product_id, p.product_name, p.category) ; ``` - 上述语句中使用的参数说明,请见[表1](#zh-cn_topic_0237121140_zh-cn_topic_0165787112_table1973914406416)。更多信息,请参见[MERGE INTO](MERGE-INTO.md#ZH-CN_TOPIC_0242370634)。 + 上述语句中使用的参数说明,请见[表1](#zh-cn_topic_0237121140_zh-cn_topic_0165787112_table1973914406416)。更多信息,请参见[MERGE INTO](MERGE-INTO.md)。 **表 1** MERGE INTO语句参数说明 @@ -71,7 +71,7 @@ MERGE INTO语句将目标表和源表中数据针对关联条件进行匹配,

INTO 子句

指定需要更新或插入数据的目标表。

-
  • 目标表支持指定别名。
  • 目标表不支持复制表。
+
  • 目标表支持指定别名。
  • 目标表支持复制表,但复制表不能带有含volatile函数的列(如自增列);如果enable_stream_operator=off,目标复制表需要带有主键或某一列满足unique not null约束。

取值:newproducts np

说明:名为newproducts,别名为np的目标表。

@@ -80,6 +80,7 @@ MERGE INTO语句将目标表和源表中数据针对关联条件进行匹配,

USING子句

指定源表。源表支持指定别名。

+

目标表是复制表时,源表也需要是复制表。

取值:products p

名为products,别名为p的源表。

diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\261\200\351\203\250\350\201\232\347\260\207.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\261\200\351\203\250\350\201\232\347\260\207.md" new file mode 100644 index 000000000..0be15c453 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\345\261\200\351\203\250\350\201\232\347\260\207.md" @@ -0,0 +1,9 @@ +# 使用局部聚簇 + +局部聚簇(Partial Cluster Key)是列存下的一种技术。这种技术可以通过min/max稀疏索引较快的实现基表扫描的filter过滤。Partial Cluster Key可以指定多列,但是一般不建议超过2列。Partial Cluster Key的选取原则: + +1. 受基表中的简单表达式约束。这种约束一般形如col op const,其中col为列名,op为操作符 =、\>、\>=、<=、<,const为常量值。 +2. 尽量采用选择度比较高\(过滤掉更多数据\)的简单表达式中的列。 +3. 尽量把选择度比较低的约束col放在Partial Cluster Key中的前面。 +4. 尽量把枚举类型的列放在Partial Cluster Key中的前面。 + diff --git "a/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-12.md" similarity index 98% rename from "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" rename to "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-12.md" index f1c01038f..27b6d45ba 100644 --- "a/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-12.md" @@ -1,4 +1,4 @@ -# 使用指导 +# 使用指导 ## 前提条件 diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-9.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-9.md" new file mode 100644 index 000000000..1e426b92b --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274-9.md" @@ -0,0 +1,30 @@ +# 使用指导 + +## 前提条件 + +需要首先保证数据库状态正常、客户端能够正常连接、且要求数据库内倒入数据,以便调优程序可以执行benchmark测试调优效果;用户需保证当前Python运行环境安装好相应依赖,且能够正常启动调优程序。 + +## 背景信息 + +调优程序是一个独立于数据库内核之外的工具,需要提供数据库及其所在实例的用户名和登录密码信息,以便控制数据库执行benchmark进行性能测试;在启动调优程序前,要求用户测试环境交互正常,能够正常跑通benchmark测试脚本、能够正常连接数据库。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果需要调优的参数中,包含重启数据库后才能使修改生效的参数,那么在调优过程中数据库将会重启多次。如果用户的数据库正在执行作业,请慎用此功能。 + +## 使用步骤 + +1. 用户进行数据库安全配置,并验证调优程序所在客户机能够正常访问到数据库实例所在的服务器; +2. 用户向数据库实例内倒入数据(如TPC-C, TPC-H),并根据调优程序所给出的示例代码,编写符合自己实际业务的benchmark(benchmark实例脚本路径在benchmark目录中).并手动验证benchmark可以正常跑通并可获得稳定的测试结果,记录下此时的测试结果,以方便后续对比调优效果; +3. 用户在确保数据库运行正常并在无其他人使用时,备份现有参数,并修改调优参数列表配置文件(文件路径在knobs目录中,默认配置文件是knobs\_htap.py),设定需要调整的参数及其范围; +4. 用户输入数据库连接信息,选择当前调优模式为“训练”或“调优”,启动参数调优程序;例如在X-Tuner根目录中输入 + + python main.py -m train --db-name postgres\\ + + --db-user dba --port 1234 \\ + + --host 192.168.1.2 --host-user opengauss\\ + + --benchmark tpcc --model-path mymodel + +5. 若为“训练”模式,则输出训练后的模型,程序退出;若为“调优”模式,则输出调优后的最优参数列表,程序退出。用户通过对比调优结果,自行判断是否应该设置为该参数,并手动设置为推荐参数或重置为调优前参数。 + diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274.md" similarity index 89% rename from "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\215\227.md" rename to "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274.md" index 26b3219a1..b1b18b1ba 100644 --- "a/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ -# 使用指南 +# 使用指导 -## 数据收集 +## 数据收集 1. 打开数据收集。 1. 设置ActiveSQL operator信息相关参数: @@ -74,7 +74,7 @@ -## 模型管理(系统管理员用户) +## 模型管理(系统管理员用户) >![](public_sys-resources/icon-note.gif) **说明:** >模型管理操作需要在数据库正常的状态下进行。 @@ -117,7 +117,7 @@ ## 模型训练(系统管理员用户) -1. 配置/添加模型训练参数:参考[模型管理(系统管理员用户)](#section16140101211372)进行模型添加、模型参数修改,来指定训练参数。 +1. 配置/添加模型训练参数:参考[模型管理(系统管理员用户)](#section664217249345)进行模型添加、模型参数修改,来指定训练参数。 例: @@ -190,3 +190,18 @@ ``` +## 其他功能 + +1. 检查AiEngine是否可连接: + + ``` + postgres=# select check_engine_status('aiEngine-ip-address',running-port); + ``` + +2. 查看模型对应日志在AiEngine侧的保存路径: + + ``` + postgres=# select track_model_train_opt('template_name', 'model_name'); + ``` + + diff --git "a/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242.md" "b/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242.md" index 04ad3327c..b8e1e9742 100644 --- "a/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242.md" +++ "b/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242.md" @@ -1,7 +1,5 @@ # 全文检索 -全文检索(或者说文本搜索)提供了查询可读性文档的能力,并且通过查询相关度将结果进行排序。搜索最常见的方式是:找到包含指定查询词的所有记录,并且按照查询顺序返回这些记录。 - - **[介绍](介绍.md)** - **[表和索引](表和索引.md)** diff --git "a/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242\346\246\202\350\277\260.md" index 1dce73f4a..699a69b97 100644 --- "a/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242\346\246\202\350\277\260.md" +++ "b/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242\346\246\202\350\277\260.md" @@ -31,5 +31,5 @@ 词典能够对token如何标准化做到细粒度控制。使用合适的词典,可以定义不被索引的停用词。 -数据类型tsvector用于存储预处理文档,tsquery用于存储查询条件,详细请参见[文本搜索类型](文本搜索类型.md#ZH-CN_TOPIC_0242370420)。为这些数据类型提供的函数和操作符请参见[文本检索函数和操作符](文本检索函数和操作符.md#ZH-CN_TOPIC_0242370440)。其中最重要的是匹配运算符@@,将在[基本文本匹配](基本文本匹配.md#ZH-CN_TOPIC_0242370480)中介绍。 +数据类型tsvector用于存储预处理文档,tsquery用于存储查询条件,详细请参见[文本搜索类型](文本搜索类型.md)。为这些数据类型提供的函数和操作符请参见[文本检索函数和操作符](文本检索函数和操作符.md)。其中最重要的是匹配运算符@@,将在[基本文本匹配](基本文本匹配.md)中介绍。 diff --git "a/content/zh/docs/Developerguide/\345\205\263\344\272\216COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\345\205\263\344\272\216COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" index 31ca91d1d..c79acc71f 100644 --- "a/content/zh/docs/Developerguide/\345\205\263\344\272\216COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\345\205\263\344\272\216COPY-FROM-STDIN\345\257\274\345\205\245\346\225\260\346\215\256.md" @@ -4,6 +4,6 @@ 用户可以使用以下方式通过COPY FROM STDIN语句直接向openGauss写入数据。 -- 通过键盘输入向openGauss写入数据。详细请参见[COPY](COPY.md)。 +- 通过键盘输入向openGauss数据库写入数据。详细请参见[COPY](COPY.md)。 - 通过JDBC驱动的CopyManager接口从文件或者数据库向openGauss写入数据。此方法支持COPY语法中copy option的所有参数。 diff --git "a/content/zh/docs/Developerguide/\345\205\263\344\272\216\346\234\254\346\226\207\346\241\243.md" "b/content/zh/docs/Developerguide/\345\205\263\344\272\216\346\234\254\346\226\207\346\241\243.md" new file mode 100644 index 000000000..339bf2185 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\263\344\272\216\346\234\254\346\226\207\346\241\243.md" @@ -0,0 +1,79 @@ +# 关于本文档 + +## 概述 + +本章介绍如何设计、创建、查询和维护数据库。包括SQL语句、存储过程、系统表和视图等。 + +## 读者对象 + +本文档是为基于openGauss进行C/Java应用程序开发的程序员而写的,提供了必要的参考信息。 + +作为应用程序开发人员,至少需要了解以下知识: + +- 操作系统知识。这是一切的基础。 +- C/Java语言。这是做应用程序开发的基础。 +- 熟悉C/Java的一种IDE。这是高效完成开发任务的必备条件。 +- SQL语法。这是操作数据库的必备能力。 + +## 符号约定 + +在本文中可能出现下列标志,它们所代表的含义如下。 + + + + + + + + + + + + + + + + + + + + + + +

符号

+

说明

+

+

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

+

+

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

+

+

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

+

+

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

+

“须知”不涉及人身伤害。

+

+

对正文中重点信息的补充说明。

+

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

+
+ +## 修改记录 + + + + + + + + + + + + +

文档版本

+

发布日期

+

修改说明

+

01

+

2020-05-12

+

第一次正式发布。

+
+ diff --git "a/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" "b/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" index f28d8699e..4c4a9373a 100644 --- "a/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" +++ "b/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" @@ -2,12 +2,17 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用做其他标识符。非保留字只是在特定的环境里有特殊的含义,而在其他环境里是可以用做标识符的。 +标识符的命名需要遵守如下规范: + +- 标识符需要为字母、下划线、数字(0-9)或美元符号($)。 +- 标识符必须以字母(a-z)或下划线(\_)开头。 + **表 1** SQL关键字 - @@ -393,13 +398,13 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用 - - - - - - - - - - - - - - - - - - - - - - - -

关键字

openGauss

+

openGauss

SQL:1999

保留

BEGIN_NON_ANOYBLOCK

+

BEGIN_NON_ANOYBLOCK

非保留

+

非保留

-

+

-

-

+

-

BETWEEN

@@ -1599,13 +1604,13 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用

-

DIRECTORY

+

DIRECTORY

非保留

+

非保留

-

+

-

-

+

-

DISABLE

@@ -1716,13 +1721,13 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用

保留

DUPLICATE

+

DUPLICATE

非保留

+

非保留

-

+

-

-

+

-

DYNAMIC

@@ -2022,13 +2027,13 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用

-

FAST

+

FAST

非保留

+

非保留

-

+

-

-

+

-

FETCH

@@ -5028,13 +5033,13 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用

-

SPILL

+

SPILL

非保留

+

非保留

-

+

-

-

+

-

SPLIT

@@ -5451,13 +5456,13 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用

保留

TIMESTAMPDIFF

+

TIMESTAMPDIFF

非保留(不能是函数或类型)

+

非保留(不能是函数或类型)

-

+

-

-

+

-

TIMEZONE_HOUR

diff --git "a/content/zh/docs/Developerguide/\345\205\263\351\227\255\350\277\236\346\216\245.md" "b/content/zh/docs/Developerguide/\345\205\263\351\227\255\350\277\236\346\216\245.md" new file mode 100644 index 000000000..2e22588d7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\263\351\227\255\350\277\236\346\216\245.md" @@ -0,0 +1,6 @@ +# 关闭连接 + +在使用数据库连接完成相应的数据操作后,需要关闭数据库连接。 + +关闭数据库连接可以直接调用其close方法即可。如:**Connection conn = null; conn.close\(\)**; + diff --git "a/content/zh/docs/Developerguide/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" index ad11998c6..912ac8736 100644 --- "a/content/zh/docs/Developerguide/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" +++ "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" @@ -193,24 +193,6 @@ **默认值:**off -## query\_dop - -**参数说明: **用户自定义的查询并行度。该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,-64-64 - -\[1,64\]:打开固定SMP功能,系统会使用固定并行度。 - -0:打开SMP自适应功能,系统会根据资源情况和计划特征动态选取最优并行度。 - -\[-64,-1\]:打开SMP自适应功能,并限制自适应选取的最大并行度。 - ->![](public_sys-resources/icon-note.gif) **说明:** ->- 在开启并行查询后,请保证系统CPU、内存、网络、I/O等资源充足,以达到最佳效果。 ->- 为了避免用户设置不合理的过大值造成性能劣化,系统会计算出该数据库节点可用最大CPU核数,并以此来作为query\_dop的上限。如果用户设置query\_dop超过4并且同时超过该上限,那么系统会重置query\_dop为该上限值。 - -**默认值:**1 - ## enable\_analyze\_check **参数说明: **标识是否允许在生成计划的时候,对于在pg\_class中显示reltuples和relpages均为0的表,检查该表是否曾进行过统计信息收集。 diff --git "a/content/zh/docs/Developerguide/\345\205\266\344\273\226\345\233\240\347\264\240\345\257\271LLVM\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.md" "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\345\233\240\347\264\240\345\257\271LLVM\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.md" new file mode 100644 index 000000000..76c685530 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\345\233\240\347\264\240\345\257\271LLVM\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.md" @@ -0,0 +1,17 @@ +# 其他因素对LLVM性能的影响 + +LLVM优化效果不仅依赖于数据库内部具体的实现,还与当前所选择的硬件环境等有关。 + +- 表达式调用C-函数个数 + + 数据库内部针对表达式计算并未实现全codegen,即在整个表达式计算中部分表达式实现了codegen,部分直接调用原本的C代码。如果整个表达式计算中后者占据了主要部分,使用LLVM动态编译优化,可能会导致性能劣化。通过设置log\_min\_message的级别为DEBUG1可以查看到哪些表达式直接调用了C代码实现。 + +- 内存资源 + + LLVM特性的一个重要思想是保障数据的局域特性,即数据应尽可能的存放在寄存器中。同时应减少数据加载,因此在使用LLVM优化时应设置足够大的work\_mem,保证对应使用LLVM优化的执行代码整个过程在内存中实现,否则可能引起性能劣化。 + +- 优化器代价估算 + + LLVM特性实现了简易的代价估算模型,即依据当前参与节点运算的表大小决定当前节点是否考虑使用LLVM动态编译优化。如果优化器低估了实际参与运算的行数,则原本可获得收益的未正常获得收益。反之亦然。 + + diff --git "a/content/zh/docs/Developerguide/\345\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\347\263\273\347\273\237\345\207\275\346\225\260.md" similarity index 85% rename from "content/zh/docs/Developerguide/\345\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" rename to "content/zh/docs/Developerguide/\345\205\266\344\273\226\347\263\273\347\273\237\345\207\275\346\225\260.md" index b32e0910e..909d94493 100644 --- "a/content/zh/docs/Developerguide/\345\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\347\263\273\347\273\237\345\207\275\346\225\260.md" @@ -1,4 +1,91 @@ -# 内部接口函数 +# 其他系统函数 + +openGauss为内建数据类型提供了大量的函数和操作符。用户也可以自行定义自己所需的函数和操作符。PSQL命令\\df和\\do可以逐个罗列出现有的函数和操作符。如果用户关心这些函数和操作符的可移植性,那请注意,除了算术和比较操作符以及上述直接标注出的函数,大部分本章中描述的函数和操作符是没有被SQL标准规定的。本章所介绍的扩充后的函数在其他SQL数据库管理系统中也存在,而且很多时候,这些函数的不同版本实现都是兼容且具备一致性的。 + +openGauss的内建函数和操作符继承自开源PGXC/PG,本小节所列举的函数,相关细节描述请参见PGXC/PG官方文档,链接如下: + +http://postgres-xc.sourceforge.net/docs/1\_1/functions.html + +https://www.postgresql.org/docs/9.2/functions.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

abbrev

+

abs

+

abstime

+

abstimeeq

+

abstimege

+

abstimegt

+

abstimein

+

abstimele

+

abstimelt

+

abstimene

+

abstimeout

+

abstimerecv

+

abstimesend

+

aclcontains

+

acldefault

+

aclexplode

+

aclinsert

+

aclitemeq

+

aclitemin

+

aclitemout

+

aclremove

+

acos

+

add_months

+

age

+

any_in

+

any_out

+

anyarray_in

+

anyarray_out

+

anyarray_recv

+

anyarray_send

+

anyelement_in

+

anyelement_out

+

anyenum_in

+

anyenum_out

+

anynonarray_in

+
- abbrev - abs @@ -653,7 +740,6 @@ - generate\_series - generate\_subscripts - generate\_wdr\_report -- get\_gtm\_lite\_status - get\_hostname - get\_nodename - get\_prepared\_pending\_xid @@ -1508,7 +1594,6 @@ - pg\_timezone\_names - pgxc\_get\_csn - pgxc\_get\_thread\_wait\_status -- pgxc\_gtm\_snapshot\_status - pgxc\_lock\_for\_sp\_database - pgxc\_max\_datanode\_size - pgxc\_node\_str diff --git "a/content/zh/docs/Developerguide/\345\205\266\344\273\226\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\350\257\255\345\217\245.md" new file mode 100644 index 000000000..d0e9c56cd --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\350\257\255\345\217\245.md" @@ -0,0 +1,7 @@ +# 其他语句 + +- **[锁操作](锁操作.md)** + +- **[游标操作](游标操作.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\205\266\345\256\203\351\200\211\351\241\271.md" "b/content/zh/docs/Developerguide/\345\205\266\345\256\203\351\200\211\351\241\271.md" index 8c6bb7ae6..300fcd3bf 100644 --- "a/content/zh/docs/Developerguide/\345\205\266\345\256\203\351\200\211\351\241\271.md" +++ "b/content/zh/docs/Developerguide/\345\205\266\345\256\203\351\200\211\351\241\271.md" @@ -36,7 +36,9 @@ 该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 -**默认值:**131072 +**单位**: 8KB + +**默认值:**131072, 即1GB ## max\_index\_keys @@ -244,7 +246,7 @@ add_months

compat_analyze_sample

analyze采样行为配置项。

-

设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时DBnode端的内存消耗,保证analyze性能的稳定性。

+

设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时DBnode端的内存消耗,保证analyze性能的稳定性。

bind_schema_tablespace

@@ -264,7 +266,7 @@ add_months

correct_to_number

控制to_number()结果兼容性的配置项。

-

若设置此配置项,则to_number()函数结果与pg11保持一致,否则默认与a db保持一致。

+

若设置此配置项,则to_number()函数结果与pg11保持一致,否则默认与O db保持一致。

unbind_dive_bound

@@ -276,7 +278,7 @@ add_months

merge_update_multi

控制merge into匹配多行时是否进行update操作。

-

若设置此配置项,匹配多行时update不报错,否则默认与a db保持一致,报错。

+

若设置此配置项,匹配多行时update不报错,否则默认与a db保持一致,报错。

return_null_string

@@ -299,7 +301,7 @@ length

compat_concat_variadic

控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。

-

若设置此配置项,当concat函数参数为variadic类型时,保留a db和Teradata兼容模式下不同的结果形式;否则默认a db和Teradata兼容模式下结果相同,且与a db保持一致。由于mysql无variadic类型,所以该选项对MySQL无影响。

+

若设置此配置项,当concat函数参数为variadic类型时,保留a db和Teradata兼容模式下不同的结果形式;否则默认a db和Teradata兼容模式下结果相同,且与a db保持一致。由于MY无variadic类型,所以该选项对MY无影响。

merge_update_multi

@@ -383,19 +385,3 @@ length 默认值:authentication -## enable\_tsdb - -**参数说明:**是否开启时序数据库特性。 - -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔型 - -- on:表示打开时序数据库特性功能。 -- off:表示关闭时序数据库特性功能。 - -**默认值**:off - ->![](public_sys-resources/icon-note.gif) **说明:** ->开启时序数据库特性后如果需要关闭该特性请谨慎考虑,因为关闭后会对原有业务流量有影响 - diff --git "a/content/zh/docs/Developerguide/\345\205\270\345\236\213SQL\350\260\203\344\274\230\347\202\271.md" "b/content/zh/docs/Developerguide/\345\205\270\345\236\213SQL\350\260\203\344\274\230\347\202\271.md" new file mode 100644 index 000000000..ffe1aa9f9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\270\345\236\213SQL\350\260\203\344\274\230\347\202\271.md" @@ -0,0 +1,13 @@ +# 典型SQL调优点 + +SQL调优是一个不断分析与尝试的过程:试跑Query,判断性能是否满足要求;如果不满足要求,则通过[查看执行计划](SQL执行计划介绍.md)分析原因并进行针对性优化;然后重新试跑和优化,直到满足性能目标。 + +- **[SQL自诊断](SQL自诊断.md)** + +- **[子查询调优](子查询调优.md)** + +- **[统计信息调优](统计信息调优.md)** + +- **[算子级调优](算子级调优.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\206\205\345\255\230-21.md" "b/content/zh/docs/Developerguide/\345\206\205\345\255\230-21.md" new file mode 100644 index 000000000..62a25c768 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\206\205\345\255\230-21.md" @@ -0,0 +1,279 @@ +# 内存 + +介绍与内存相关的参数设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这些参数只能在数据库服务重新启动后生效。 + +## memorypool\_enable + +**参数说明**:设置是否允许使用内存池。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示允许使用内存池。 +- off表示不允许使用内存池。 + +**默认值**:off + +## memorypool\_size + +**参数说明**:设置内存池大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,128\*1024~INT\_MAX/2,单位为KB。 + +**默认值**:512MB + +## enable\_memory\_limit + +**参数说明:**启用逻辑内存管理模块。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示启用逻辑内存管理模块。 +- off表示不启用逻辑内存管理模块。 + +**默认值:**on + +>![](public_sys-resources/icon-notice.gif) **须知:** +>若max\_process\_memory-shared buffer-cstore buffers少于2G,openGauss强制把enable\_memory\_limit设置为off。 + +## max\_process\_memory + +**参数说明:**设置一个数据库节点可用的最大物理内存。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,2\*1024\*1024~INT\_MAX,单位为KB。 + +**默认值:**非从备数据库节点自动适配,公式为(物理内存大小)\*0.6/\(1+主节点个数\),当结果不足2GB时,默认取2GB。从备节点默认为12GB。 + +**设置建议:** + +数据库节点上该数值需要根据系统物理内存及单节点部署主数据库节点个数决定。建议计算公式如下:物理内存大小 \* 系数 / 主节点个数,系数通常建议为0.8。该系数的目的在于预留内存供操作系统内核使用,尽可能保证系统的可靠性,防止因数据库内存膨胀导致物理节点OOM。节点的物理内存越小, 系数应越小。例如, 128GB物理内存的节点可以使用0.9作为系数, 而32GB的节点可能只适合0.7作为系数。 + +## enable\_memory\_context\_control + +**参数说明:**启用检查内存上下文是否超过给定限制的功能。仅适用于DEBUG版本。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示启用最大内存上下文限制检查功能。 +- off表示关闭最大内存上下文限制检查功能。 + +**默认值:**off + +## uncontrolled\_memory\_context + +**参数说明:**启用检查内存上下文是否超过给定限制的功能时,设置不受此功能约束。仅适用于DEBUG版本。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +查询时会在参数值的最前面添加标题含义字符串“MemoryContext white list:"。 + +**取值范围**:字符串 + +**默认值:**空 + +## shared\_buffers + +**参数说明:**设置openGauss使用的共享内存大小。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,16 \~ 1073741823 ,单位为8KB。 + +改变BLCKSZ的值会改变最小值。 + +**默认值:**数据库节点为1GB。如果操作系统支持的共享内存小于32MB,则在初始化数据存储区时会自动调整为操作系统支持的最大值。 + +**设置建议:** + +建议设置shared\_buffers值为内存的40%以内。行存列存分开对待。行存设大,列存设小。列存:\(单服务器内存/单服务器数据库节点个数\)\*0.4\*0.25。 + +如果设置较大的shared\_buffers需要同时增加checkpoint\_segments的值,因为写入大量新增、修改数据需要消耗更多的时间周期。 + +## bulk\_write\_ring\_size + +**参数说明:**数据并行导入使用的环形缓冲区大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,16384 \~ 2147483647,单位为KB。 + +**默认值:**2GB + +**设置建议:**建议导入压力大的场景中增加数据库节点中此参数配置。 + +## standby\_shared\_buffers\_fraction + +**参数说明:**备实例所在服务器使用shared\_buffers内存缓冲区大小的比例。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**双精度类型,0.1\~1.0 + +**默认值:**0.3 + +## temp\_buffers + +**参数说明:**设置每个数据库会话使用的LOCAL临时缓冲区的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +在每个会话的第一次使用临时表之前可以改变temp\_buffers的值,之后的设置将是无效的。 + +一个会话将按照temp\_buffers给出的限制,根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,其开销只是一个缓冲区描述符的大小。当缓冲区被使用,就会额外消耗8192字节。 + +**取值范围:**整型,100\~1073741823,单位为8KB。 + +**默认值:**8MB + +## max\_prepared\_transactions + +**参数说明:**设置可以同时处于"预备"状态的事务的最大数目。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。 + +当openGauss部署为主备双机时,在备机上此参数的设置必须要高于或等于主机上的,否则无法在备机上进行查询操作。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型。0\~536870911。 + +**默认值:**800 + +>![](public_sys-resources/icon-note.gif) **说明:** +>为避免在准备步骤失败,此参数的值不能小于max\_connections。 + +## work\_mem + +**参数说明:**设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。 + +对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work\_mem的好几倍。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,64\~2147483647,单位为KB。 + +**默认值:**64MB + +**设置建议:** + +依据查询特点和并发来确定,一旦work\_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。 + +- 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work\_mem=50%内存/10。 +- 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work\_mem=50%内存/5。 +- 对于并发场景,建议work\_mem=串行下的work\_mem/物理并发数。 + +## query\_mem + +**参数说明:**设置执行作业所使用的内存。如果设置的query\_mem值大于0,在生成执行计划时,优化器会将作业的估算内存调整为该值。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0,或大于32M的整型,默认单位为KB。如果设置值为负数或小于32M,将设置为默认值0,此时优化器不会根据该值调整作业的估算内存。 + +**默认值:**0 + +## query\_max\_mem + +**参数说明:**设置执行作业所能够使用的最大内存。如果设置的query\_max\_mem值大于0,当作业执行时所使用内存超过该值时,将报错退出。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0,或大于32M的整型,默认单位为KB。如果设置值为负数或小于32M,将设置为默认值0,此时不会根据该值限制作业的内存使用。 + +**默认值:**0 + +## maintenance\_work\_mem + +**参数说明:**设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024\~INT\_MAX,单位为KB。 + +**默认值:**128MB + +**设置建议:** + +- 建议设置此参数的值大于[work\_mem](#zh-cn_topic_0237124699_zh-cn_topic_0059777577_sd27c81d651ce4d2585febca76c4cc34e),可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。 +- 当[自动清理](自动清理.md)进程运行时,[autovacuum\_max\_workers](自动清理.md#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)倍数的内存将会被分配,所以此时设置maintenance\_work\_mem的值应该不小于[work\_mem](#zh-cn_topic_0237124699_zh-cn_topic_0059777577_sd27c81d651ce4d2585febca76c4cc34e)。 +- 如果进行大数据量的cluster等,可以在session中调大该值。 + +## psort\_work\_mem + +**参数说明:**设置列存表在进行局部排序中在开始写入临时磁盘文件之前使用的内存大小。带partial cluster key的表、带索引的表插入,创建表索引,删除表和更新表都会用到。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>同样,好几个正在运行的会话可能会同时进行表的局部排序操作。因此使用的总内存可能是psort\_work\_mem的好几倍。 + +**取值范围:**整型64\~2147483647,单位为KB。 + +**默认值:**512MB + +## max\_loaded\_cudesc + +**参数说明:**设置列存表在做扫描时,每列缓存cudesc信息的个数。增大设置会提高查询性能,但也会增加内存占用,特别是当列存表的列非常多时。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>max\_loaded\_cudesc设置过高时,有可能引起内存分配不足。 + +**取值范围:**100\~1073741823。 + +**默认值:**1024 + +## max\_stack\_depth + +**参数说明:**设置openGauss执行堆栈的最大安全深度。需要这个安全界限是因为在服务器里,并非所有程序都检查了堆栈深度,只是在可能递规的过程,比如表达式计算这样的过程里面才进行检查。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +设置原则: + +- 数据库需要预留640KB堆栈深度,因此此参数的最佳设置是等于操作系统内核允许的最大值(就是ulimit -s的设置)- 640KB。 +- 如果设置此参数的值大于实际的内核限制,则一个正在运行的递归函数可能会导致一个独立的服务器进程崩溃。在openGauss能够检测内核限制的操作系统上(SLES上),将自动限制设置为一个不安全的值。 +- 因为并非所有的操作都能够检测,所以建议用户在此设置一个明确的值。 + +**取值范围:**整型,100\~INT\_MAX,单位为KB。 + +**默认值:**2MB + +>![](public_sys-resources/icon-note.gif) **说明:** +>默认值2MB,这个值相对比较小,不容易导致系统崩溃。但是可能会因为该值较小,导致无法执行复杂的函数。 + +## cstore\_buffers + +**参数说明:**设置列存所使用的共享缓冲区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,16384~1073741823,单位为KB。 + +**默认值:**32768KB + +**设置建议**: + +列存表使用cstore\_buffers设置的共享缓冲区,几乎不用shared\_buffers。因此在列存表为主的场景中,应减少shared\_buffers,增加cstore\_buffers。 + +## bulk\_read\_ring\_size + +**参数说明:**并行导出,使用的环形缓冲区大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,256\~2147483647,单位为KB。 + +**默认值:**16MB + diff --git "a/content/zh/docs/Developerguide/\345\206\205\345\255\230.md" "b/content/zh/docs/Developerguide/\345\206\205\345\255\230.md" index 37b0ef3fa..2a40c9bea 100644 --- "a/content/zh/docs/Developerguide/\345\206\205\345\255\230.md" +++ "b/content/zh/docs/Developerguide/\345\206\205\345\255\230.md" @@ -1,281 +1,69 @@ -# 内存 +# 内存 -介绍与内存相关的参数设置。 +通过top命令查看openGauss节点内存使用情况,分析是否存在由于内存占用率过高导致的性能瓶颈。 ->![](public_sys-resources/icon-notice.gif) **须知:** ->这些参数只能在数据库服务重新启动后生效。 +## 查看内存状况 -## memorypool\_enable +查询服务器内存的使用情况主要通过以下方式: -**参数说明**:设置是否允许使用内存池。 +执行**top**命令,查看内存占用情况。执行该命令后,按“Shift+M”键,可按照内存大小排序。 -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +``` +top - 11:38:26 up 2 days, 17:59, 10 users, load average: 0.01, 0.05, 0.15 +Tasks: 685 total, 1 running, 684 sleeping, 0 stopped, 0 zombie +%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +KiB Mem : 19740646+total, 23503420 free, 15947100 used, 15795595+buff/cache +KiB Swap: 8242172 total, 8242172 free, 0 used. 13366219+avail Mem -**取值范围**:布尔型 + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +29838 omm 20 0 1373104 456904 175248 S 3.6 0.2 98:53.16 gaussdb +27789 omm 20 0 150732 4136 3216 S 0.0 0.0 0:00.00 gsql +45659 omm 20 0 117164 4052 1860 S 0.0 0.0 0:00.24 bash + 8087 omm 20 0 117164 4000 1848 S 0.0 0.0 0:00.05 bash +27459 omm 20 0 117160 4000 1848 S 0.0 0.0 0:00.04 bash +33619 omm 20 0 117120 3852 1740 S 0.0 0.0 0:00.04 bash +27282 omm 20 0 117120 3840 1728 S 0.0 0.0 0:00.03 bash + 9923 omm 20 0 158064 2932 1612 R 0.3 0.0 0:00.04 top +``` -- on表示允许使用内存池。 -- off表示不允许使用内存池。 +分析时,请主要关注gaussdb进程占用的内存百分比(%MEM)、整系统的剩余内存。 -**默认值**:off +显示信息中的主要属性解释如下: -## memorypool\_size +- total:物理内存总量。 +- used:已使用的物理内存总量。 +- free:空闲内存总量。 +- buffers:进程使用的虚拟内存总量。 +- %MEM:进程占用的内存百分比。 +- VIRT:进程使用的虚拟内存总量,VIRT=SWAP+RES。 +- SWAP:进程使用的虚拟内存中已被换出到交换分区的量。 +- RES:进程使用的虚拟内存中未被换出的量。 +- SHR:共享内存大小。 -**参数说明**:设置内存池大小。 +## 性能参数分析 -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +1. 以root用户执行“free”命令查看cache的占用情况。 -**取值范围**:整型,128\*1024~INT\_MAX/2,单位为KB。 + ``` + free + ``` -**默认值**:512MB + 查询结果如下所示: -## enable\_memory\_limit + ``` + total used free shared buffers cached + Mem: 8038844 6336184 1702660 0 375896 2880912 + -/+ buffers/cache: 3079376 4959468 + Swap: 4192924 0 4192924 + ``` -**参数说明:**启用逻辑内存管理模块。 +2. 若“cache”占用过高,请执行如下命令开启自动清除缓存功能。 -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + ``` + /opt/software/openGauss/sudo/run_drop_cache.sh + ``` -**取值范围**:布尔型 +3. 若用户内存占用过高,需查看执行计划,重点分析以下内容。 + - 是否有不合理的join顺序。例如,多表关联时,执行计划中优先关联的两表的中间结果集比较大,导致最终执行代价比较大。 -- on表示启用逻辑内存管理模块。 -- off表示不启用逻辑内存管理模块。 - -**默认值:**on - ->![](public_sys-resources/icon-notice.gif) **须知:** ->若max\_process\_memory-shared buffer-cstore buffers少于2G,openGauss强制把enable\_memory\_limit设置为off。 - -## max\_process\_memory - -**参数说明:**设置一个数据库节点可用的最大物理内存。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围**:整型,2\*1024\*1024~INT\_MAX,单位为KB。 - -**默认值:**非从备数据库节点自动适配,公式为(物理内存大小)\*0.6/\(1+主节点个数\),当结果不足2GB时,默认取2GB。从备节点默认为12GB。 - -**设置建议:** - -数据库节点上该数值需要根据系统物理内存及单节点部署主数据库节点个数决定的。计算公式如下:(物理内存大小 – vm.min\_free\_kbytes)\* 0.7 / \(n+主数据库节点个数\)。该参数目的是尽可能保证系统的可靠性,不会因数据库内存膨胀导致节点OOM。这个公式中提到vm.min\_free\_kbytes,其含义是预留操作系统内存供内核使用,通常用作操作系统内核中通信收发内存分配,至少为5%内存。即,max\_process\_memory=物理内存\*0.665/\(n+主数据库节点个数\),其中,当openGauss规模小于256时,n=1;当openGauss规模大于256且小于512时, n=2;当openGauss规模超过512时,n=3。 - -RAM:openGauss规划时分配给openGauss的最大使用内存,实际为服务器的物理内存。 - -## enable\_memory\_context\_control - -**参数说明:**启用检查内存上下文是否超过给定限制的功能。仅适用于DEBUG版本。 - -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围**:布尔型 - -- on表示启用最大内存上下文限制检查功能。 -- off表示关闭最大内存上下文限制检查功能。 - -**默认值:**off - -## uncontrolled\_memory\_context - -**参数说明:**启用检查内存上下文是否超过给定限制的功能时,设置不受此功能约束。仅适用于DEBUG版本。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -查询时会在参数值的最前面添加标题含义字符串“MemoryContext white list:”"。 - -**取值范围**:字符串 - -**默认值:**空 - -## shared\_buffers - -**参数说明:**设置openGauss使用的共享内存大小。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,16 \~ 1073741823 ,单位为8KB。 - -改变BLCKSZ的值会改变最小值。 - -**默认值:**数据库节点为1GB。如果操作系统支持的共享内存小于32MB,则在初始化数据存储区时会自动调整为操作系统支持的最大值。 - -**设置建议:** - -建议设置shared\_buffers值为内存的40%以内。行存列存分开对待。行存设大,列存设小。列存:\(单服务器内存/单服务器数据库节点个数\)\*0.4\*0.25。 - -如果设置较大的shared\_buffers需要同时增加checkpoint\_segments的值,因为写入大量新增、修改数据需要消耗更多的时间周期。 - -## bulk\_write\_ring\_size - -**参数说明:**数据并行导入使用的环形缓冲区大小。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,16384 \~ 2147483647,单位为KB。 - -**默认值:**2GB - -**设置建议:**建议导入压力大的场景中增加数据库节点中此参数配置。 - -## standby\_shared\_buffers\_fraction - -**参数说明:**备实例所在服务器使用shared\_buffers内存缓冲区大小的比例。 - -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**双精度类型,0.1\~1.0 - -**默认值:**0.3 - -## temp\_buffers - -**参数说明:**设置每个数据库会话使用的LOCAL临时缓冲区的大小。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -在每个会话的第一次使用临时表之前可以改变temp\_buffers的值,之后的设置将是无效的。 - -一个会话将按照temp\_buffers给出的限制,根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,其开销只是一个缓冲区描述符的大小。当缓冲区被使用,就会额外消耗8192字节。 - -**取值范围:**整型,100\~1073741823,单位为8KB。 - -**默认值:**8MB - -## max\_prepared\_transactions - -**参数说明:**设置可以同时处于"预备"状态的事务的最大数目。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。 - -当openGauss部署为主备双机时,在备机上此参数的设置必须要高于或等于主机上的,否则无法在备机上进行查询操作。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型。0\~536870911。 - -**默认值:**800 - ->![](public_sys-resources/icon-note.gif) **说明:** ->为避免在准备步骤失败,此参数的值不能小于max\_connections。 - -## work\_mem - -**参数说明:**设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。 - -对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work\_mem的好几倍。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,64\~2147483647,单位为KB。 - -**默认值:**64MB - -**设置建议:** - -依据查询特点和并发来确定,一旦work\_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。 - -- 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work\_mem=50%内存/10。 -- 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work\_mem=50%内存/5。 -- 对于并发场景,建议work\_mem=串行下的work\_mem/物理并发数。 - -## query\_mem - -**参数说明:**设置执行作业所使用的内存。如果设置的query\_mem值大于0,在生成执行计划时,优化器会将作业的估算内存调整为该值。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**0,或大于32M的整型,默认单位为KB。如果设置值为负数或小于32M,将设置为默认值0,此时优化器不会根据该值调整作业的估算内存。 - -**默认值:**0 - -## query\_max\_mem - -**参数说明:**设置执行作业所能够使用的最大内存。如果设置的query\_max\_mem值大于0,当作业执行时所使用内存超过该值时,将报错退出。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**0,或大于32M的整型,默认单位为KB。如果设置值为负数或小于32M,将设置为默认值0,此时不会根据该值限制作业的内存使用。 - -**默认值:**0 - -## maintenance\_work\_mem - -**参数说明:**设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,1024\~INT\_MAX,单位为KB。 - -**默认值:**128MB - -**设置建议:** - -- 建议设置此参数的值大于[work\_mem](#zh-cn_topic_0237124699_zh-cn_topic_0059777577_sd27c81d651ce4d2585febca76c4cc34e),可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。 -- 当[自动清理](自动清理.md)进程运行时,[autovacuum\_max\_workers](自动清理.md#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)倍数的内存将会被分配,所以此时设置maintenance\_work\_mem的值应该不小于[work\_mem](#zh-cn_topic_0237124699_zh-cn_topic_0059777577_sd27c81d651ce4d2585febca76c4cc34e)。 -- 如果进行大数据量的cluster等,可以在session中调大该值。 - -## psort\_work\_mem - -**参数说明:**设置列存表在进行局部排序中在开始写入临时磁盘文件之前使用的内存大小。带partial cluster key的表、带索引的表插入,创建表索引,删除表和更新表都会用到。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - ->![](public_sys-resources/icon-notice.gif) **须知:** ->同样,好几个正在运行的会话可能会同时进行表的局部排序操作。因此使用的总内存可能是psort\_work\_mem的好几倍。 - -**取值范围:**整型64\~2147483647,单位为KB。 - -**默认值:**512MB - -## max\_loaded\_cudesc - -**参数说明:**设置列存表在做扫描时,每列缓存cudesc信息的个数。增大设置会提高查询性能,但也会增加内存占用,特别是当列存表的列非常多时。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - ->![](public_sys-resources/icon-notice.gif) **须知:** ->max\_loaded\_cudesc设置过高时,有可能引起内存分配不足。 - -**取值范围:**100\~1073741823。 - -**默认值:**1024 - -## max\_stack\_depth - -**参数说明:**设置openGauss执行堆栈的最大安全深度。需要这个安全界限是因为在服务器里,并非所有程序都检查了堆栈深度,只是在可能递规的过程,比如表达式计算这样的过程里面才进行检查。 - -该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -设置原则: - -- 数据库需要预留640KB堆栈深度,因此此参数的最佳设置是等于操作系统内核允许的最大值(就是ulimit -s的设置)- 640KB。 -- 如果设置此参数的值大于实际的内核限制,则一个正在运行的递归函数可能会导致一个独立的服务器进程崩溃。在openGauss能够检测内核限制的操作系统上(SLES上),将自动限制设置为一个不安全的值。 -- 因为并非所有的操作都能够检测,所以建议用户在此设置一个明确的值。 - -**取值范围:**整型,100\~INT\_MAX,单位为KB。 - -**默认值:**2MB - ->![](public_sys-resources/icon-note.gif) **说明:** ->默认值2MB,这个值相对比较小,不容易导致系统崩溃。但是可能会因为该值较小,导致无法执行复杂的函数。 - -## cstore\_buffers - -**参数说明:**设置列存所使用的共享缓冲区的大小。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,16384~1073741823,单位为KB。 - -**默认值:**32768KB - -**设置建议**: - -列存表使用cstore\_buffers设置的共享缓冲区,几乎不用shared\_buffers。因此在列存表为主的场景中,应减少shared\_buffers,增加cstore\_buffers。 - -## bulk\_read\_ring\_size - -**参数说明:**并行导出,使用的环形缓冲区大小。 - -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**整型,256\~2147483647,单位为KB。 - -**默认值:**16MB diff --git "a/content/zh/docs/Developerguide/\345\206\205\345\255\230\350\241\250.md" "b/content/zh/docs/Developerguide/\345\206\205\345\255\230\350\241\250.md" deleted file mode 100644 index 2125106d4..000000000 --- "a/content/zh/docs/Developerguide/\345\206\205\345\255\230\350\241\250.md" +++ /dev/null @@ -1,67 +0,0 @@ -# 内存表 - -介绍内存表的配置参数。 - -## enable\_codegen\_mot - -**参数说明:**设置是否启用原生 LLVM Lite 执行简单查询。如果当前平台上不支持原生LLVM,那么将使用伪LLVM。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔值 - -**默认值:**true - -## force\_pseudo\_codegen\_mot - -**参数说明:**设置是否强制伪LLVM Lite执行简单查询,即使当前平台上支持原生LLVM。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔值 - -**默认值:**true - ->![](public_sys-resources/icon-note.gif) **说明:** ->即使将force\_pseudo\_codegen\_mot设置为false,但force\_pseudo\_codegen\_mot设置为 true,而当前平台不支持原生LLVM,那么仍然会使用伪LLVM。 - -## enable\_codegen\_mot\_print - -**参数说明:**设置是否打印生成函数的 IR 字节码(如果使用伪 LLVM,则打印伪 IR 字节码)。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔值 - -**默认值:**true - -## codegen\_mot\_limit - -**参数说明:**设置全局缓存计划源的数量限制,以及每个会话的克隆计划。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**uint32 - -**默认值:**100 - -## mot\_allow\_index\_on\_nullable\_column - -**参数说明:**设置是否允许在内存表nullable列上创建索引。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**布尔值 - -**默认值:**true - -## mot\_config\_file - -**参数说明:**指定MOT的主配置文件。 - -该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 - -**取值范围:**字符串 - -**默认值:**NULL - diff --git "a/content/zh/docs/Developerguide/\345\207\240\344\275\225\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\345\207\240\344\275\225\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" index c7722c873..e2b1fc0c0 100644 --- "a/content/zh/docs/Developerguide/\345\207\240\344\275\225\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\345\207\240\344\275\225\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -782,7 +782,7 @@ - point\(double precision, double precision\) - 描述:结点 + 描述:节点 返回类型:point diff --git "a/content/zh/docs/Developerguide/\345\207\240\344\275\225\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\345\207\240\344\275\225\347\261\273\345\236\213.md" index ea8dbe83e..3a2b3a2df 100644 --- "a/content/zh/docs/Developerguide/\345\207\240\344\275\225\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\345\207\240\344\275\225\347\261\273\345\236\213.md" @@ -81,7 +81,7 @@ openGauss支持的几何类型请参见[表1](#zh-cn_topic_0237121953_zh-cn_topi
-openGauss提供了一系列的函数和操作符用来进行各种几何计算,如拉伸、转换、旋转、计算相交等。详细信息请参考[几何函数和操作符](几何函数和操作符.md#ZH-CN_TOPIC_0242370438)。 +openGauss提供了一系列的函数和操作符用来进行各种几何计算,如拉伸、转换、旋转、计算相交等。详细信息请参考[几何函数和操作符](几何函数和操作符.md)。 ## 点 diff --git "a/content/zh/docs/Developerguide/\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" index b64c62bc1..bc70ed9a0 100644 --- "a/content/zh/docs/Developerguide/\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -1,11 +1,5 @@ # 函数和操作符 -操作符可以对一个或多个操作数进行处理,位置上可能处于操作数之前、之后,或两个操作数中间。完成处理之后,返回处理结果。 - -函数是对一些业务逻辑的封装,以完成特定的功能。函数可以有参数,也可以没有参数。函数是有返回类型的,执行完成后,会返回执行结果。 - -对于系统函数,用户可以进行修改,但是修改之后系统函数的语义可能会发生改变,从而导致系统控制紊乱。正常情况下不允许用户手工修改系统函数。 - - **[逻辑操作符](逻辑操作符.md)** - **[比较操作符](比较操作符.md)** @@ -56,6 +50,6 @@ - **[触发器函数](触发器函数.md)** -- **[内部接口函数](内部接口函数.md)** +- **[其他系统函数](其他系统函数.md)** diff --git "a/content/zh/docs/Developerguide/\345\210\206\346\224\257\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\345\210\206\346\224\257\350\257\255\345\217\245.md" new file mode 100644 index 000000000..ec7538e73 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\206\346\224\257\350\257\255\345\217\245.md" @@ -0,0 +1,56 @@ +# 分支语句 + +## 语法 + +分支语句的语法请参见[图1](#zh-cn_topic_0237122235_zh-cn_topic_0059779327_fe2376535378e44c78c4e70078d0fb779)。 + +**图 1** case\_when::= +![](figures/case_when.png "case_when") + +when\_clause子句的语法图参见[图2](#zh-cn_topic_0237122235_zh-cn_topic_0059779327_f0b6779d008024e8fb5c2267d8d3bff14)。 + +**图 2** when\_clause::= +![](figures/when_clause.png "when_clause") + +参数说明: + +- case\_expression:变量或表达式。 +- when\_expression:常量或者条件表达式。 +- statement:执行语句。 + +## 示例 + +``` +CREATE OR REPLACE PROCEDURE proc_case_branch(pi_result in integer, pi_return out integer) +AS + BEGIN + CASE pi_result + WHEN 1 THEN + pi_return := 111; + WHEN 2 THEN + pi_return := 222; + WHEN 3 THEN + pi_return := 333; + WHEN 6 THEN + pi_return := 444; + WHEN 7 THEN + pi_return := 555; + WHEN 8 THEN + pi_return := 666; + WHEN 9 THEN + pi_return := 777; + WHEN 10 THEN + pi_return := 888; + ELSE + pi_return := 999; + END CASE; + raise info 'pi_return : %',pi_return ; +END; +/ + +CALL proc_case_branch(3,0); + +--删除存储过程 +DROP PROCEDURE proc_case_branch; +``` + diff --git "a/content/zh/docs/Developerguide/\345\210\206\346\236\220\344\275\234\344\270\232\346\230\257\345\220\246\350\242\253\351\230\273\345\241\236.md" "b/content/zh/docs/Developerguide/\345\210\206\346\236\220\344\275\234\344\270\232\346\230\257\345\220\246\350\242\253\351\230\273\345\241\236.md" new file mode 100644 index 000000000..813dd63e0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\206\346\236\220\344\275\234\344\270\232\346\230\257\345\220\246\350\242\253\351\230\273\345\241\236.md" @@ -0,0 +1,70 @@ +# 分析作业是否被阻塞 + +数据库系统运行时,在某些业务场景下查询语句会被阻塞,导致语句运行时间过长,可以强制结束有问题的会话。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,8000为数据库节点的端口号。 + + 连接成功后,系统显示类似如下信息: + + ``` + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + Non-SSL connection (SSL connection is recommended when requiring high-security) + Type "help" for help. + + postgres=# + ``` + +3. 查看阻塞的查询语句及阻塞查询的表、模式信息。 + + ``` + SELECT w.query as waiting_query, + w.pid as w_pid, + w.usename as w_user, + l.query as locking_query, + l.pid as l_pid, + l.usename as l_user, + t.schemaname || '.' || t.relname as tablename + from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid + and not l1.granted join pg_locks l2 on l1.relation = l2.relation + and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid + where w.waiting; + ``` + + 该查询返回线程ID、用户信息、查询状态,以及导致阻塞的表、模式信息。 + +4. 使用如下命令结束相应的会话。其中,139834762094352为线程ID。 + + ``` + SELECT PG_TERMINATE_BACKEND(139834762094352); + ``` + + 显示类似如下信息,表示结束会话成功。 + + ``` + PG_TERMINATE_BACKEND + ---------------------- + t + (1 row) + ``` + + 显示类似如下信息,表示用户正在尝试结束当前会话,此时仅会重连会话,而不是结束会话。 + + ``` + FATAL: terminating connection due to administrator command + FATAL: terminating connection due to administrator command + The connection to the server was lost. Attempting reset: Succeeded. + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >gsql客户端使用PG\_TERMINATE\_BACKEND函数终止本会话后台线程时,客户端不会退出而是自动重连。 + + diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206schema.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206schema.md" index a21c7f649..a900169c3 100644 --- "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206schema.md" +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206schema.md" @@ -16,7 +16,7 @@ schema又称作模式。通过管理schema,允许多个用户使用同一数 ## 操作步骤 -- 创建schema +- 创建管理用户及权限schema - 执行如下命令来创建一个schema。 ``` @@ -93,7 +93,7 @@ schema又称作模式。通过管理schema,允许多个用户使用同一数 默认情况下,用户只能访问属于自己的schema中的数据库对象。如果需要访问其他schema的对象,则该schema的所有者应该赋予他对该schema的usage权限。 - 通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。注意默认情况下,所有角色都拥有在public模式上的USAGE权限,但是普通用户没有在public模式上的CREATE权限。普通用户能够连接到一个指定数据库并在它的public模式中创建对象是不安全的,如果普通用户可以在public模式上的CREATE权限则建议通过如下语句撤销该权限。 + 通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。注意默认情况下,所有角色都拥有在public模式上的USAGE权限,但是普通用户没有在public模式上的CREATE权限。普通用户能够连接到一个指定数据库并在它的public模式中创建对象是不安全的,如果普通用户具有在public模式上的CREATE权限则建议通过如下语句撤销该权限。 - 撤销PUBLIC在public模式下创建对象的权限,下面语句中第一个“public”是模式,第二个“PUBLIC”指的是所有角色。 diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\210\206\345\214\272\350\241\250.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\210\206\345\214\272\350\241\250.md" index 644ce8e76..5ce7fc5a8 100644 --- "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\210\206\345\214\272\350\241\250.md" +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\210\206\345\214\272\350\241\250.md" @@ -54,6 +54,7 @@ openGauss数据库支持的分区表为范围分区表。 ca_location_type character(20) ) TABLESPACE example1 + PARTITION BY RANGE (ca_address_sk) ( PARTITION P1 VALUES LESS THAN(5000), diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223.md" index 6d32b736d..fb872a4e9 100644 --- "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223.md" +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223.md" @@ -2,7 +2,7 @@ ## 前提条件 -用户必须拥有数据库创建的权限或者是数据库的系统管理员权限才能创建数据库。 +用户必须拥有数据库创建的权限或者是数据库的系统管理员权限才能创建数据库,赋予创建数据库的权限参见[管理用户及权限](管理用户及权限.md)。 ## 背景信息 diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" index 99e8c86d3..847dda455 100644 --- "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" @@ -8,7 +8,6 @@ - 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。 - 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。 -- 在经常使用连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度。 - 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。 - 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。 - 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。 @@ -144,12 +143,12 @@ openGauss支持4种创建索引的方式请参见[表1](#zh-cn_topic_0237120308_

唯一索引

-

可用于约束索引属性值的唯一性,或者属性组合值的唯一性。如果一个表声明了唯一约束或者主键,则openGauss自动在组成主键或唯一约束的字段上创建唯一索引(可能是多字段索引),以实现这些约束。目前,openGauss只有B-Tree可以创建唯一索引。

+

可用于约束索引属性值的唯一性,或者属性组合值的唯一性。如果一个表声明了唯一约束或者主键,则openGauss自动在组成主键或唯一约束的字段上创建唯一索引(可能是多字段索引),以实现这些约束。目前,openGauss只有B-Tree可以创建唯一索引。

多字段索引

-

一个索引可以定义在表中的多个属性上。目前,openGauss中的B-Tree支持多字段索引,且最多可在32个字段上创建索引。

+

一个索引可以定义在表中的多个属性上。目前,openGauss中的B-Tree支持多字段索引,且最多可在32个字段上创建索引。

部分索引

diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250\347\251\272\351\227\264.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250\347\251\272\351\227\264.md" index 0ac6ce74a..b914b4b39 100644 --- "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250\347\251\272\351\227\264.md" +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250\347\251\272\351\227\264.md" @@ -18,7 +18,7 @@ - 表空间对应于一个文件系统目录,假定数据库节点数据目录/pg\_location/mount1/path1是用户拥有读写权限的空目录。 - MAXSIZE使用该表空间配额管理性能会有30%左右的影响,MAXSIZE指定每个数据库节点的配额大小,误差范围在500M 个数以内。请根据实际的情况确认是否需要设置表空间的最大值。 + 使用表空间配额管理会使性能有30%左右的影响,MAXSIZE指定每个数据库节点的配额大小,误差范围在500MB以内。请根据实际的情况确认是否需要设置表空间的最大值。 ## 操作步骤 @@ -79,7 +79,6 @@ 当结果显示为如下信息,则表示创建成功。 ``` - CREATE TABLE ``` diff --git "a/content/zh/docs/Developerguide/\345\212\240\350\275\275\351\251\261\345\212\250.md" "b/content/zh/docs/Developerguide/\345\212\240\350\275\275\351\251\261\345\212\250.md" new file mode 100644 index 000000000..8baea89be --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\212\240\350\275\275\351\251\261\345\212\250.md" @@ -0,0 +1,13 @@ +# 加载驱动 + +在创建数据库连接之前,需要先加载数据库驱动程序。 + +加载驱动有两种方法: + +- 在代码中创建连接之前任意位置隐含装载:Class.forName\("org.postgresql.Driver"\); +- 在JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest + + >![](public_sys-resources/icon-note.gif) **说明:** + >上述jdbctest为测试用例程序的名称。 + + diff --git "a/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\257\255\345\217\245.md" new file mode 100644 index 000000000..9fe8f3f9b --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\257\255\345\217\245.md" @@ -0,0 +1,11 @@ +# 动态语句 + +- **[执行动态查询语句](执行动态查询语句.md)** + +- **[执行动态非查询语句](执行动态非查询语句.md)** + +- **[动态调用存储过程](动态调用存储过程.md)** + +- **[动态调用匿名块](动态调用匿名块.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\214\277\345\220\215\345\235\227.md" "b/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\214\277\345\220\215\345\235\227.md" new file mode 100644 index 000000000..069ad5746 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\214\277\345\220\215\345\235\227.md" @@ -0,0 +1,23 @@ +# 动态调用匿名块 + +动态调用匿名块是指在动态语句中执行匿名块,使用EXECUTE IMMEDIATE…USING语句后面带IN、OUT来输入、输出参数。 + +## 语法 + +语法请参见[图1](#zh-cn_topic_0237122228_zh-cn_topic_0059778140_fcac14cc166724cca818d8c659b30fbb9)。 + +**图 1** call\_anonymous\_block::= +![](figures/call_anonymous_block.png "call_anonymous_block") + +using\_clause子句的语法参见[图2](#zh-cn_topic_0237122228_zh-cn_topic_0059778140_f06fb8cdac8dc4c42bacd550e446ca6bd)。 + +**图 2** using\_clause::= +![](figures/using_clause-2.png "using_clause-2") + +对以上语法格式的解释如下: + +- 匿名块程序实施部分,以BEGIN语句开始,以END语句停顿,以一个分号结束。 +- USING \[IN|OUT|IN OUT\] bind\_argument,用于指定存放传递给存储过程参数值的变量。bind\_argument前的修饰符与对应参数的修饰符一致。 +- 匿名块中间的输入输出参数使用占位符来指明,要求占位符个数与参数个数相同,并且占位符所对应参数的顺序和USING中参数的顺序一致。 +- 目前openGauss在动态语句调用匿名块时,EXCEPTION语句中暂不支持使用占位符进行输入输出参数的传递。 + diff --git "a/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 000000000..2002adc3c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\212\250\346\200\201\350\260\203\347\224\250\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,22 @@ +# 动态调用存储过程 + +动态调用存储过程必须使用匿名的语句块将存储过程或语句块包在里面,使用EXECUTE IMMEDIATE…USING语句后面带IN、OUT来输入、输出参数。 + +## 语法 + +语法请参见[图1](#zh-cn_topic_0237122227_zh-cn_topic_0059778625_f7bf3ce30f4aa42d38394f459c525f33b)。 + +**图 1** call\_procedure::= +![](figures/call_procedure.png "call_procedure") + +using\_clause子句的语法参见[图2](#zh-cn_topic_0237122227_zh-cn_topic_0059778625_fd82a97bfa5774a32bd19b36b80dd5248)。 + +**图 2** using\_clause::= +![](figures/using_clause-1.png "using_clause-1") + +对以上语法格式的解释如下: + +- CALL procedure\_name: 调用存储过程。 +- \[:placeholder1,:placeholder2,…\]: 存储过程参数占位符列表。占位符个数与参数个数相同。 +- USING \[IN|OUT|IN OUT\] bind\_argument: 用于指定存放传递给存储过程参数值的变量。bind\_argument前的修饰符与对应参数的修饰符一致。 + diff --git "a/content/zh/docs/Developerguide/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" "b/content/zh/docs/Developerguide/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" index 26aadfbf5..954bb931d 100644 --- "a/content/zh/docs/Developerguide/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" +++ "b/content/zh/docs/Developerguide/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" @@ -31,7 +31,7 @@ - postgres表示产生与PostgreSQL 8.4版本相匹配的输出,当[DateStyle](#zh-cn_topic_0237124733_zh-cn_topic_0059778109_s6464b29eb2274134845cea28f39d915e)参数被设为ISO时。 - postgres\_verbose表示产生与PostgreSQL 8.4版本相匹配的输出,当[DateStyle](#zh-cn_topic_0237124733_zh-cn_topic_0059778109_s6464b29eb2274134845cea28f39d915e)参数被设为non\_ISO时。 - iso\_8601表示产生与在ISO 8601中定义的“格式与代号”相匹配的输出。 -- a表示产生于A DB中与numtodsinterval函数相匹配的输出结果,详细请参考[numtodsinterval](时间和日期处理函数和操作符.md#zh-cn_topic_0237121972_zh-cn_topic_0059779084_lf9dae2de082b41c094177f70cf798433)。 +- a表示与numtodsinterval函数相匹配的输出结果,详细请参考[numtodsinterval](时间和日期处理函数和操作符.md#zh-cn_topic_0237121972_zh-cn_topic_0059779084_lf9dae2de082b41c094177f70cf798433)。 >![](public_sys-resources/icon-notice.gif) **须知:** >IntervalStyle参数也会影响不明确的间隔输入的说明。 @@ -62,7 +62,7 @@ **默认值:**Default >![](public_sys-resources/icon-note.gif) **说明:** ->Default表示通用时区的缩写。但也有其他诸如 'Australia' 和 'India' 等用来定义特定的安装。 +>Default表示通用时区的缩写, 适合绝大部分情况。但也可设置其他诸如 'Australia' 和 'India' 等用来定义特定的安装。而设置除此之外的时区缩写, 需要在建数据库之前通过相应的配置文件进行设置。 ## extra\_float\_digits diff --git "a/content/zh/docs/Developerguide/\345\214\277\345\220\215\345\235\227.md" "b/content/zh/docs/Developerguide/\345\214\277\345\220\215\345\235\227.md" new file mode 100644 index 000000000..b634b754d --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\214\277\345\220\215\345\235\227.md" @@ -0,0 +1,21 @@ +# 匿名块 + +匿名块(Anonymous Block)一般用于不频繁执行的脚本或不重复进行的活动。它们在一个会话中执行,并不被存储。 + +## 语法 + +匿名块的语法参见[图1](#zh-cn_topic_0237122218_zh-cn_topic_0059779171_f19ed9f384e0646f29744951d7eec8c3b)。 + +**图 1** anonymous\_block::= +![](figures/anonymous_block.png "anonymous_block") + +对以上语法图的解释如下: + +- 匿名块程序实施部分,以BEGIN语句开始,以END语句停顿,以一个分号结束。输入“/”按回车执行它。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >最后的结束符“/”必须独占一行,不能直接跟在END后面。 + +- 声明部分包括变量定义、类型、游标定义等。 +- 最简单的匿名块不执行任何命令。但一定要在任意实施块里至少有一个语句,甚至是一个NULL语句。 + diff --git "a/content/zh/docs/Developerguide/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" "b/content/zh/docs/Developerguide/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" index d82e9e120..4c8d07c83 100644 --- "a/content/zh/docs/Developerguide/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" +++ "b/content/zh/docs/Developerguide/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" @@ -72,7 +72,7 @@ on表示当读取或修改大对象时禁用权限检查,与PostgreSQL 9.0以 ## sql\_inheritance -**参数说明:**控制继承语义。用来控制继承表的访问策略,off表示各种命令不能访问子表,即默认使用ONLY关键字。这是为了兼容7.1之前版本而设置的。 +**参数说明:**控制继承语义。用来控制继承表的访问策略,off表示各种命令不能访问子表,即默认使用ONLY关键字。这是为了兼容旧版本而设置的。 该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 diff --git "a/content/zh/docs/Developerguide/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" "b/content/zh/docs/Developerguide/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" index 1d77fff52..d2b806b69 100644 --- "a/content/zh/docs/Developerguide/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" +++ "b/content/zh/docs/Developerguide/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" @@ -11,7 +11,7 @@ **取值范围**:整型,0~262143 -**默认值:**100 +**默认值:**单机默认为4, 主备环境默认为8 ## wal\_keep\_segments @@ -36,7 +36,7 @@ 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 >![](public_sys-resources/icon-notice.gif) **须知:** ->- 如果主机数据较大,重建操作需要增大此参数的值,主机数据在 500G时,此参数的参考值为 600s。 +>- 如果主机数据较大,重建备机数据库时需要增大此参数的值,主机数据在 500G时,此参数的参考值为 600s。 >- 此值不能大于wal\_receiver\_timeout或数据库重建时的超时参数。 **取值范围:**整型, 0 \~ INT\_MAX,单位为毫秒(ms)。 diff --git "a/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" "b/content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203-14.md" similarity index 83% rename from "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" rename to "content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203-14.md" index d3f36484d..ed5a9ce2f 100644 --- "a/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" +++ "b/content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203-14.md" @@ -1,4 +1,4 @@ -# 命令参考 +# 命令参考 **表 1** 常见参数 @@ -15,28 +15,28 @@

供训练用历史日志的路径。

-

-

+

-

--model

训练生成的模型及中间文件存储路径,以及预测时指定的模型路径

-

-

+

-

--predict

待预测负载文件路径

-

-

+

-

--ratio

推荐重新训练阈值比率,可选

-

-

+

-

diff --git "a/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" "b/content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203.md" similarity index 83% rename from "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" rename to "content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203.md" index 7b393a51d..efa15f6ac 100644 --- "a/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" +++ "b/content/zh/docs/Developerguide/\345\221\275\344\273\244\345\217\202\350\200\203.md" @@ -1,4 +1,4 @@ -# 命令参考 +# 命令参考 **表 1** 常见参数 @@ -22,49 +22,49 @@

调优程序的配置文件,可选

-

-

+

-

--db-name

指定调优的数据库

-

-

+

-

--db-user

指定调优的数据库用户名

-

-

+

-

--port

数据库的监听端口

-

-

+

-

--host

数据库实例的宿主机IP

-

-

+

-

--host-user

数据库安装时的DBA用户名

-

-

+

-

--host-ssh-port

数据库实例所在宿主机的SSH端口号,可选

-

-

+

-

--scenario

@@ -78,21 +78,21 @@

由用户指定的benchmark脚本文件名

-

-

+

-

--model-path

调优强化学习模型存储或加载的文件路径

-

-

+

-

--version, -v

返回当前工具版本号

-

-

+

-

diff --git "a/content/zh/docs/Developerguide/\345\237\272\344\272\216JDBC\345\274\200\345\217\221.md" "b/content/zh/docs/Developerguide/\345\237\272\344\272\216JDBC\345\274\200\345\217\221.md" new file mode 100644 index 000000000..e6fd200f8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\344\272\216JDBC\345\274\200\345\217\221.md" @@ -0,0 +1,31 @@ +# 基于JDBC开发 + +JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问接口,应用程序可基于它操作数据。 openGauss库提供了对JDBC 4.0特性的支持,需要使用JDK1.8版本编译程序代码,不支持JDBC桥接ODBC方式。 + +- **[JDBC包、驱动类和环境类](JDBC包-驱动类和环境类.md)** + +- **[开发流程](开发流程.md)** + +- **[加载驱动](加载驱动.md)** + +- **[连接数据库](连接数据库-0.md)** + +- **[连接数据库(以SSL方式)](连接数据库(以SSL方式).md)** + +- **[执行SQL语句](执行SQL语句.md)** + +- **[处理结果集](处理结果集.md)** + +- **[关闭连接](关闭连接.md)** + +- **[示例:常用操作](示例-常用操作.md)** + +- **[示例:重新执行应用SQL](示例-重新执行应用SQL.md)** + +- **[示例:通过本地文件导入导出数据](示例-通过本地文件导入导出数据.md)** + +- **[示例:从MY向openGauss进行数据迁移](示例-从MY向openGauss进行数据迁移.md)** + +- **[JDBC接口参考](JDBC接口参考.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\237\272\344\272\216ODBC\345\274\200\345\217\221.md" "b/content/zh/docs/Developerguide/\345\237\272\344\272\216ODBC\345\274\200\345\217\221.md" new file mode 100644 index 000000000..966ef5e6f --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\344\272\216ODBC\345\274\200\345\217\221.md" @@ -0,0 +1,61 @@ +# 基于ODBC开发 + +ODBC(Open Database Connectivity,开放数据库互连)是由Microsoft公司基于X/OPEN CLI提出的用于访问数据库的应用程序编程接口。应用程序通过ODBC提供的API与数据库进行交互,增强了应用程序的可移植性、扩展性和可维护性。 + +ODBC的系统结构参见[图1](#fig1255101034110)。 + +**图 1** ODBC系统机构 +![](figures/ODBC系统机构.png "ODBC系统机构") + +openGauss目前在以下环境中提供对ODBC3.5的支持。 + +**表 1** ODBC支持平台 + + + + + + + + + + + + + + + + + + + +

操作系统

+

平台

+

CentOS 6.4/6.5/6.6/6.7/6.8/6.9/7.0/7.1/7.2/7.3/7.4

+

x86_64位

+

CentOS 7.6

+

ARM64位

+

EulerOS 2.0 SP2/SP3

+

x86_64位

+

EulerOS 2.0 SP8

+

ARM64位

+
+ +UNIX/Linux系统下的驱动程序管理器主要有unixODBC和iODBC,在这选择驱动管理器unixODBC-2.3.0作为连接数据库的组件。 + +Windows系统自带ODBC驱动程序管理器,在控制面板-\>管理工具中可以找到数据源(ODBC)选项。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>当前数据库ODBC驱动基于开源版本,对于tinyint、smalldatetime、nvarchar2类型,在获取数据类型的时候,可能会出现不兼容。 + +- **[ODBC包及依赖的库和头文件](ODBC包及依赖的库和头文件.md)** + +- **[Linux下配置数据源](Linux下配置数据源.md)** + +- **[开发流程](开发流程-1.md)** + +- **[示例](示例.md)** + +- **[ODBC接口参考](ODBC接口参考.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\237\272\344\272\216libpq\345\274\200\345\217\221.md" "b/content/zh/docs/Developerguide/\345\237\272\344\272\216libpq\345\274\200\345\217\221.md" new file mode 100644 index 000000000..551a8d079 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\344\272\216libpq\345\274\200\345\217\221.md" @@ -0,0 +1,6 @@ +# 基于libpq开发 + +openGauss未对此接口在应用程序开发场景下的使用做验证。因此对使用此接口做应用程序开发存在的风险未知,故不推荐用户使用此套接口做应用程序开发。推荐用户使用ODBC或JDBC接口来替代。 + +。 + diff --git "a/content/zh/docs/Developerguide/\345\237\272\344\272\216\345\274\200\351\224\200\347\232\204\346\270\205\347\220\206\345\273\266\350\277\237.md" "b/content/zh/docs/Developerguide/\345\237\272\344\272\216\345\274\200\351\224\200\347\232\204\346\270\205\347\220\206\345\273\266\350\277\237.md" index 881bb34fd..2abc553ee 100644 --- "a/content/zh/docs/Developerguide/\345\237\272\344\272\216\345\274\200\351\224\200\347\232\204\346\270\205\347\220\206\345\273\266\350\277\237.md" +++ "b/content/zh/docs/Developerguide/\345\237\272\344\272\216\345\274\200\351\224\200\347\232\204\346\270\205\347\220\206\345\273\266\350\277\237.md" @@ -9,7 +9,7 @@ ## 背景信息 -在[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md)和[VACUUM](VACUUM.md#ZH-CN_TOPIC_0242370659)语句执行过程中,系统维护一个内部的记数器,跟踪所执行的各种I/O操作的近似开销。如果积累的开销达到了vacuum\_cost\_limit声明的限制,则执行这个操作的进程将睡眠vacuum\_cost\_delay指定的时间。然后它会重置记数器然后继续执行。 +在[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md)和[VACUUM](VACUUM.md)语句执行过程中,系统维护一个内部的记数器,跟踪所执行的各种I/O操作的近似开销。如果积累的开销达到了vacuum\_cost\_limit声明的限制,则执行这个操作的进程将睡眠vacuum\_cost\_delay指定的时间。然后它会重置记数器然后继续执行。 这个特性是缺省关闭的。要想打开它,把vacuum\_cost\_delay变量设置为一个非零值。 diff --git "a/content/zh/docs/Developerguide/\345\237\272\346\234\254\346\226\207\346\234\254\345\214\271\351\205\215.md" "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\346\226\207\346\234\254\345\214\271\351\205\215.md" index 901b3cbf2..c6a7b43b5 100644 --- "a/content/zh/docs/Developerguide/\345\237\272\346\234\254\346\226\207\346\234\254\345\214\271\351\205\215.md" +++ "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\346\226\207\346\234\254\345\214\271\351\205\215.md" @@ -18,7 +18,7 @@ postgres=# SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat (1 row) ``` -正如上面例子表明,tsquery不仅是文本,且比tsvector包含的要多。tsquery包含已经标注化为词条的搜索词,同时可能是使用AND、OR、或NOT操作符连接的多个术语。详细请参见[文本搜索类型](文本搜索类型.md#ZH-CN_TOPIC_0242370420)。函数to\_tsquery和plainto\_tsquery对于将用户书写文本转换成适合的tsquery是非常有用的,比如将文本中的词标准化。类似地,to\_tsvector用于解析和标准化文档字符串。因此,实际中文本搜索匹配看起来更像这样: +正如上面例子表明,tsquery不仅是文本,且比tsvector包含的要多。tsquery包含已经标注化为词条的搜索词,同时可能是使用AND、OR、或NOT操作符连接的多个术语。详细请参见[文本搜索类型](文本搜索类型.md)。函数to\_tsquery和plainto\_tsquery对于将用户书写文本转换成适合的tsquery是非常有用的,比如将文本中的词标准化。类似地,to\_tsvector用于解析和标准化文档字符串。因此,实际中文本搜索匹配看起来更像这样: ``` postgres=# SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat') AS RESULT; diff --git "a/content/zh/docs/Developerguide/\345\237\272\346\234\254\347\273\223\346\236\204.md" "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\347\273\223\346\236\204.md" new file mode 100644 index 000000000..4197e85c6 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\347\273\223\346\236\204.md" @@ -0,0 +1,47 @@ +# 基本结构 + +## 结构 + +PL/SQL块中可以包含子块,子块可以位于PL/SQL中任何部分。PL/SQL块的结构如下: + +- 声明部分:声明PL/SQL用到的变量、类型、游标、局部的存储过程和函数。 + + ``` + DECLARE + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >不涉及变量声明时声明部分可以没有。 + >- 对匿名块来说,没有变量声明部分时,可以省去DECLARE关键字。 + >- 对存储过程来说,没有DECLARE, AS相当于DECLARE。即便没有变量声明的部分,关键字AS也必须保留。 + +- 执行部分:过程及SQL语句,程序的主要部分。必选。 + + ``` + BEGIN + ``` + +- 执行异常部分:错误处理。可选。 + + ``` + EXCEPTION + ``` + +- 结束 + + ``` + END; + / + ``` + + >![](public_sys-resources/icon-notice.gif) **须知:** + >禁止在PL/SQL块中使用连续的Tab,连续的Tab可能会造成在使用gsql工具带“-r”参数执行PL/SQL块时出现异常。 + + +## 分类 + +PL/SQL块可以分为以下几类: + +- 匿名块:动态构造,只能执行一次。语法请参考[图1](匿名块.md#zh-cn_topic_0237122218_zh-cn_topic_0059779171_f19ed9f384e0646f29744951d7eec8c3b)。 +- 子程序:存储在数据库中的存储过程、函数、操作符和高级包等。当在数据库上建立好后,可以在其他程序中调用它们。 + diff --git "a/content/zh/docs/Developerguide/\345\237\272\346\234\254\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\350\257\255\345\217\245.md" new file mode 100644 index 000000000..78450707b --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\350\257\255\345\217\245.md" @@ -0,0 +1,14 @@ +# 基本语句 + +在编写PL/SQL过程中,会定义一些变量,给变量赋值,调用其他存储过程等。介绍PL/SQL中的基本语句,包括定义变量、赋值语句、调用语句以及返回语句。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>尽量不要在存储过程中调用包含密码的SQL语句,因为存储在数据库中的存储过程文本可能被其他有权限的用户看到导致密码信息被泄漏。如果存储过程中包含其他敏感信息也需要配置存储过程的访问权限,保证敏感信息不会泄漏。 + +- **[定义变量](定义变量.md)** + +- **[赋值语句](赋值语句.md)** + +- **[调用语句](调用语句.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\243\260\346\230\216\350\257\255\346\263\225.md" "b/content/zh/docs/Developerguide/\345\243\260\346\230\216\350\257\255\346\263\225.md" new file mode 100644 index 000000000..8595f36d3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\243\260\346\230\216\350\257\255\346\263\225.md" @@ -0,0 +1,9 @@ +# 声明语法 + +- **[基本结构](基本结构.md)** + +- **[匿名块](匿名块.md)** + +- **[子程序](子程序.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\244\204\347\220\206\347\273\223\346\236\234\351\233\206.md" "b/content/zh/docs/Developerguide/\345\244\204\347\220\206\347\273\223\346\236\234\351\233\206.md" new file mode 100644 index 000000000..cc5adeb61 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\244\204\347\220\206\347\273\223\346\236\234\351\233\206.md" @@ -0,0 +1,186 @@ +# 处理结果集 + +## 设置结果集类型 + +不同类型的结果集有各自的应用场景,应用程序需要根据实际情况选择相应的结果集类型。在执行SQL语句过程中,都需要先创建相应的语句对象,而部分创建语句对象的方法提供了设置结果集类型的功能。具体的参数设置如[表1](#zh-cn_topic_0237120384_zh-cn_topic_0213179150_zh-cn_topic_0189250321_zh-cn_topic_0059778370_t600ecae93052471d819154e0f14d8fc3)所示。涉及的Connection的方法如下: + +``` +//创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 +createStatement(int resultSetType, int resultSetConcurrency); + +//创建一个PreparedStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 +prepareStatement(String sql, int resultSetType, int resultSetConcurrency); + +//创建一个CallableStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 +prepareCall(String sql, int resultSetType, int resultSetConcurrency); +``` + +**表 1** 结果集类型 + + + + + + + + + + + + + +

参数

+

描述

+

resultSetType

+

表示结果集的类型,具体有三种类型:

+
  • ResultSet.TYPE_FORWARD_ONLY:ResultSet只能向前移动。是缺省值。
  • ResultSet.TYPE_SCROLL_SENSITIVE:在修改后重新滚动到修改所在行,可以看到修改后的结果。
  • ResultSet.TYPE_SCROLL_INSENSITIVE:对可修改例程所做的编辑不进行显示。
+
说明:

结果集从数据库中读取了数据之后,即使类型是ResultSet.TYPE_SCROLL_SENSITIVE,也不会看到由其他事务在这之后引起的改变。调用ResultSet的refreshRow()方法,可进入数据库并从其中取得当前游标所指记录的最新数据。

+
+

resultSetConcurrency

+

表示结果集的并发,具体有两种类型:

+
  • ResultSet.CONCUR_READ_ONLY:如果不从结果集中的数据建立一个新的更新语句,不能对结果集中的数据进行更新。
  • ResultSet.CONCUR_UPDATEABLE:可改变的结果集。对于可滚动的结果集,可对结果集进行适当的改变。
+
+ +## 在结果集中定位 + +ResultSet对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next方法将光标移动到下一行;因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。但对于可滚动的结果集,JDBC驱动程序提供更多的定位方法,使ResultSet指向特定的行。定位方法如[表2](#zh-cn_topic_0237120384_zh-cn_topic_0213179150_zh-cn_topic_0189250321_zh-cn_topic_0059778370_t0e427b4d1b1f4d67899fac4ad3df1049)所示。 + +**表 2** 在结果集中定位的方法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

描述

+

next()

+

把ResultSet向下移动一行。

+

previous()

+

把ResultSet向上移动一行。

+

beforeFirst()

+

把ResultSet定位到第一行之前。

+

afterLast()

+

把ResultSet定位到最后一行之后。

+

first()

+

把ResultSet定位到第一行。

+

last()

+

把ResultSet定位到最后一行。

+

absolute(int)

+

把ResultSet移动到参数指定的行数。

+

relative(int)

+

通过设置为1向前(设置为1,相当于next())或者向后(设置为-1,相当于previous())移动参数指定的行。

+
+ +## 获取结果集中光标的位置 + +对于可滚动的结果集,可能会调用定位方法来改变光标的位置。JDBC驱动程序提供了获取结果集中光标所处位置的方法。获取光标位置的方法如[表3](#zh-cn_topic_0237120384_zh-cn_topic_0213179150_zh-cn_topic_0189250321_zh-cn_topic_0059778370_tfc10dffc5995480281e8065b4b03d370)所示。 + +**表 3** 获取结果集光标的位置 + + + + + + + + + + + + + + + + + + + + + + +

方法

+

描述

+

isFirst()

+

是否在一行。

+

isLast()

+

是否在最后一行。

+

isBeforeFirst()

+

是否在第一行之前。

+

isAfterLast()

+

是否在最后一行之后。

+

getRow()

+

获取当前在第几行。

+
+ +## 获取结果集中的数据 + +ResultSet对象提供了丰富的方法,以获取结果集中的数据。获取数据常用的方法如[表4](#zh-cn_topic_0237120384_zh-cn_topic_0213179150_zh-cn_topic_0189250321_zh-cn_topic_0059778370_t92d6c213fa8b403796ae7da7e7cd6c46)所示,其他方法请参考JDK官方文档。 + +**表 4** ResultSet对象的常用方法 + + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

描述

+

int getInt(int columnIndex)

+

按列标获取int型数据。

+

int getInt(String columnLabel)

+

按列名获取int型数据。

+

String getString(int columnIndex)

+

按列标获取String型数据。

+

String getString(String columnLabel)

+

按列名获取String型数据。

+

Date getDate(int columnIndex)

+

按列标获取Date型数据

+

Date getDate(String columnLabel)

+

按列名获取Date型数据。

+
+ diff --git "a/content/zh/docs/Developerguide/\345\244\207\344\273\275\346\201\242\345\244\215\346\216\247\345\210\266\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\244\207\344\273\275\346\201\242\345\244\215\346\216\247\345\210\266\345\207\275\346\225\260.md" index 726ad692f..713745838 100644 --- "a/content/zh/docs/Developerguide/\345\244\207\344\273\275\346\201\242\345\244\215\346\216\247\345\210\266\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\345\244\207\344\273\275\346\201\242\345\244\215\346\216\247\345\210\266\345\207\275\346\225\260.md" @@ -138,25 +138,13 @@ - pg\_enable\_delay\_xlog\_recycle\(\) - 描述:开启延迟xlog回收功能,cn修复使用。 + 描述:开启延迟xlog回收功能,数据库主节点修复使用。 返回值类型:void - pg\_disable\_delay\_xlog\_recycle\(\) - 描述:关闭延迟xlog回收功能,cn修复使用。 - - 返回值类型:void - -- gs\_roach\_enable\_delay\_xlog\_recycle\(is\_full\_backup boolean, backup\_key text\) - - 描述:开启延迟xlog回收功能,roach备份使用。 - - 返回值类型:void - -- gs\_roach\_disable\_delay\_xlog\_recycle\(is\_full\_backup boolean, backup\_key text\) - - 描述:关闭延迟xlog回收功能,roach备份使用。 + 描述:关闭延迟xlog回收功能,数据库主节点修复使用。 返回值类型:void diff --git "a/content/zh/docs/Developerguide/\345\244\207\346\234\215\345\212\241\345\231\250.md" "b/content/zh/docs/Developerguide/\345\244\207\346\234\215\345\212\241\345\231\250.md" index 8080b72ae..68533dc3a 100644 --- "a/content/zh/docs/Developerguide/\345\244\207\346\234\215\345\212\241\345\231\250.md" +++ "b/content/zh/docs/Developerguide/\345\244\207\346\234\215\345\212\241\345\231\250.md" @@ -49,9 +49,9 @@ 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**整型,0 \~ INT\_MAX / 1000,单位为毫秒。 +**取值范围:**整型,范围:0 \~ INT\_MAX ,单位为毫秒。 -**默认值:**5s +**默认值:**5s**(即**5000ms) ## hot\_standby\_feedback @@ -61,11 +61,15 @@ **取值范围:**布尔型 -- on表示允许将备机上执行查询的结果反馈给主机。 -- off表示不允许将备机上执行查询的结果反馈给主机。 +- on表示允许将备机上执行查询的最小事务号反馈给主机。 +- off表示不允许将备机上执行查询的最小事务号反馈给主机。 **默认值:**off +>![](public_sys-resources/icon-notice.gif) **须知:** +>当该参数为on时,主机的旧版本数据的清理会受限于备机正在读的事务,即主机只允许清理小于备机反馈回来的事务所作的更改。 +>所以,若该参数开启时,会影响主机的性能。 + ## wal\_receiver\_timeout **参数说明:**设置从主机接收数据的最大等待时间。 diff --git "a/content/zh/docs/Developerguide/\345\244\207\346\234\272\345\244\204\344\272\216need-repair(WAL)\347\212\266\346\200\201\351\227\256\351\242\230.md" "b/content/zh/docs/Developerguide/\345\244\207\346\234\272\345\244\204\344\272\216need-repair(WAL)\347\212\266\346\200\201\351\227\256\351\242\230.md" new file mode 100644 index 000000000..3c43b82c0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\244\207\346\234\272\345\244\204\344\272\216need-repair(WAL)\347\212\266\346\200\201\351\227\256\351\242\230.md" @@ -0,0 +1,14 @@ +# 备机处于need repair\(WAL\)状态问题 + +## 问题现象 + +openGauss备机出现Standby Need repair\(WAL\)故障。 + +## 原因分析 + +因网络故障、磁盘满等原因造成主备实例连接断开,主备日志不同步,导致数据库集群在启动时异常。 + +## 处理分析 + +通过gs\_ctl build -D 命令对故障节点进行重建,具体的操作方法请参见openGauss工具参考中的build参数。 + diff --git "a/content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\260\203\344\274\230.md" new file mode 100644 index 000000000..bc0b23aa7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\260\203\344\274\230.md" @@ -0,0 +1,501 @@ +# 子查询调优 + +## 子查询背景介绍 + +应用程序通过SQL语句来操作数据库时会使用大量的子查询,这种写法比直接对两个表做连接操作在结构上和思路上更清晰,尤其是在一些比较复杂的查询语句中,子查询有更完整、更独立的语义,会使SQL对业务逻辑的表达更清晰更容易理解,因此得到了广泛的应用。 + +openGauss根据子查询在SQL语句中的位置把子查询分成了子查询、子链接两种形式。 + +- 子查询SubQuery:对应于查询解析树中的范围表RangeTblEntry,更通俗一些指的是出现在FROM语句后面的独立的SELECT语句。 +- 子链接SubLink:对应于查询解析树中的表达式,更通俗一些指的是出现在where/on子句、targetlist里面的语句。 + + 综上,对于查询解析树而言,SubQuery的本质是范围表、而SubLink的本质是表达式。针对SubLink场景而言,由于SubLink可以出现在约束条件、表达式中,按照openGauss对sublink的实现,sublink可以分为以下几类: + + - exist\_sublink:对应EXIST、NOT EXIST语句 + - any\_sublink:对应op ALL\(select…\)语句,其中OP可以是IN,<,\>,=操作符 + - all\_sublink:对应op ALL\(select…\)语句,其中OP可以是IN,<,\>,=操作符 + - rowcompare\_sublink:对应record op \(select …\)语句 + - expr\_sublink:对应\(SELECT with single targetlist item ...\)语句 + - array\_sublink:对应ARRAY\(select…\)语句 + - cte\_sublink:对应with query\(…\)语句 + + 其中OLAP、HTAP场景中常用的sublink为exist\_sublink、any\_sublink,在openGauss的优化引擎中对其应用场景做了优化(子链接提升),由于SQL语句中子查询的使用的灵活性,会带来SQL子查询过于复杂造成性能问题。子查询从大类上来看,分为非相关子查询和相关子查询: + + - **非相关子查询None-Correlated SubQuery** + + 子查询的执行不依赖于外层父查询的任何属性值。这样子查询具有独立性,可独自求解,形成一个子查询计划先于外层的查询求解。 + + 例如: + + ``` + select t1.c1,t1.c2 + from t1 + where t1.c1 in ( + select c2 + from t2 + where t2.c2 IN (2,3,4) + ); + QUERY PLAN + ---------------------------------------------------------------- + Hash Join + Hash Cond: (t1.c1 = t2.c2) + -> Seq Scan on t1 + Filter: (c1 = ANY ('{2,3,4}'::integer[])) + -> Hash + -> HashAggregate + Group By Key: t2.c2 + -> Seq Scan on t2 + Filter: (c2 = ANY ('{2,3,4}'::integer[])) + (9 rows) + + ``` + + - **相关子查询Correlated-SubQuery** + + 子查询的执行依赖于外层父查询的一些属性值(如下列示例t2.c1 = t1.c1条件中的t1.c1)作为内层查询的一个AND-ed条件。这样的子查询不具备独立性,需要和外层查询按分组进行求解。 + + 例如: + + ``` + select t1.c1,t1.c2 + from t1 + where t1.c1 in ( + select c2 + from t2 + where t2.c1 = t1.c1 AND t2.c2 in (2,3,4) + ); + QUERY PLAN + ------------------------------------------------------------------------ + Seq Scan on t1 + Filter: (SubPlan 1) + SubPlan 1 + -> Seq Scan on t2 + Filter: ((c1 = t1.c1) AND (c2 = ANY ('{2,3,4}'::integer[]))) + (5 rows) + + ``` + + + +## openGauss对SubLink的优化 + +针对SubLink的优化策略主要是让内层的子查询提升\(pullup\),能够和外表直接做关联查询,从而避免生成SubPlan+Broadcast內表的执行计划。判断子查询是否存在性能风险,可以通过explain查询语句查看Sublink的部分是否被转换成SubPlan的执行计划。 + +例如: + +![](figures/zh-cn_image_0246254080.png) + +箭头右侧执行计划应替换成下面的执行计划: + +``` +QUERY PLAN +-------------------------------- +Seq Scan on t1 +Filter: (SubPlan 1) +SubPlan 1 +-> Seq Scan on t2 +Filter: (c1 = t1.c1) +(5 rows) +``` + +- **目前openGauss支持的Sublink-Release场景** + - IN-Sublink无相关条件 + + - 不能包含上一层查询的表中的列(可以包含更高层查询表中的列)。 + - 不能包含易变函数。 + + ![](figures/zh-cn_image_0246254081.png) + + 箭头右侧执行计划应替换成下面的执行计划: + + ``` + QUERY PLAN + -------------------------------------- + Hash Join + Hash Cond: (t1.c1 = t2.c2) + -> Seq Scan on t1 + -> Hash + -> HashAggregate + Group By Key: t2.c2 + -> Seq Scan on t2 + Filter: (c1 = 1) + (8 rows) + ``` + + - Exist-Sublink包含相关条件 + + Where子句中必须包含上一层查询的表中的列,子查询的其它部分不能含有上层查询的表中的列。其它限制如下。 + + - 子查询必须有from子句。 + - 子查询不能含有with子句。 + - 子查询不能含有聚集函数。 + - 子查询里不能包含集合操作、排序、limit、windowagg、having操作。 + - 不能包含易变函数。 + + ![](figures/zh-cn_image_0246254082.png) + + 箭头右侧执行计划应替换成下面的执行计划: + + QUERY PLAN + + ----------------------------------- + + Hash Join + + Hash Cond: \(t1.c1 = t2.c1\) + + -\> Seq Scan on t1 + + -\> Hash + + -\> HashAggregate + + Group By Key: t2.c1 + + -\> Seq Scan on t2 + + \(7 rows\) + + - 包含聚集函数的等值相关子查询的提升 + + 子查询的where条件中必须含有来自上一层的列,而且此列必须和子查询本层涉及表中的列做相等判断,且这些条件必须用and连接。其它地方不能包含上层的列。其它限制条件如下。 + + - 子查询中where条件包含的表达式\(列名\)必须是表中的列。 + - 子查询的Select关键字后,必须有且仅有一个输出列,此输出列必须是聚集函数\(如max\),并且聚集函数的参数\(t2.c2\)不能是来自外层表\(t1\)中的列。聚集函数不能是count。 + + 例如,下列示例可以提升。 + + ``` + select * from t1 where c1 >( + select max(t2.c1) from t2 where t2.c1=t1.c1 + ); + ``` + + 下列示例不能提升,因为子查询没有聚集函数。 + + ``` + select * from t1 where c1 >( + select t2.c1 from t2 where t2.c1=t1.c1 + ); + ``` + + 下列示例不能提升,因为子查询有两个输出列。 + + ``` + select * from t1 where (c1,c2) >( + select max(t2.c1),min(t2.c2) from t2 where t2.c1=t1.c1 + ); + ``` + + - 子查询必须是from子句。 + - 子查询中不能有groupby、having、集合操作。 + - 子查询只能是inner join。 + + 例如:下列示例不能提升。 + + ``` + select * from t1 where c1 >( + select max(t2.c1) from t2 full join t3 on (t2.c2=t3.c2) where t2.c1=t1.c1 + ); + ``` + + - 子查询的targetlist中不能包含返回set的函数。 + - 子查询的where条件中必须含有来自上一层的列,而且此列必须和子查询层涉及表中的列做相等判断,且这些条件必须用and连接。其它地方不能包含上层的上层中的列。例如:下列示例中的最内层子链接可以提升。 + + ``` + select * from t3 where t3.c1=( + select t1.c1 + from t1 where c1 >( + select max(t2.c1) from t2 where t2.c1=t1.c1 + )); + ``` + + 基于上面的示例,再加一个条件,则不能提升,因为最内侧子查询引用了上层中的列。示例如下: + + ``` + select * from t3 where t3.c1=( + select t1.c1 + from t1 where c1 >( + select max(t2.c1) from t2 where t2.c1=t1.c1 and t3.c1>t2.c2 + + )); + ``` + + - 提升OR子句中的SubLink + + 当WHERE过滤条件中有OR连接的EXIST相关SubLink, + + 例如: + + ``` + select a, c from t1 + where t1.a = (select avg(a) from t3 where t1.b = t3.b) or + exists (select * from t4 where t1.c = t4.c); + ``` + + 将OR-ed连接的EXIST相关子查询OR字句的提升过程: + + 1. 提取where条件中,or子句中的opExpr。为:t1.a = \(select avg\(a\) from t3 where t1.b = t3.b\) + 2. 这个op操作中包含subquery,判断是否可以提升,如果可以提升,重写subquery为:select avg\(a\), t3.b from t3 group by t3.b,生成not null条件t3.b is not null,并将这个opexpr用这个not null条件替换。此时SQL变为: + + ``` + select a, c + from t1 left join (select avg(a) avg, t3.b from t3 group by t3.b) as t3 on (t1.a = avg and t1.b = t3.b) + where t3.b is not null or exists (select * from t4 where t1.c = t4.c); + ``` + + 3. 再次提取or子句中的exists sublink,exists \(select \* from t4 where t1.c = t4.c\),判断是否可以提升,如果可以提升,转换subquery为:select t4.c from t4 group by t4.c生成NotNull条件t4.c is not null提升查询,SQL变为: + + ``` + select a, c + from t1 left join (select avg(a) avg, t3.b from t3 group by t3.b) as t3 on (t1.a = avg and t1.b = t3.b) + left join (select t4.c from t4 group by t4.c) where t3.b is not null or t4.c is not null; + ``` + + + + +- **目前openGauss不支持的Sublink-Release场景** + + 除了以上场景之外都不支持Sublink提升,因此关联子查询会被计划成SubPlan+Broadcast的执行计划,当inner表的数据量较大时则会产生性能风险。 + + 如果相关子查询中跟外层的两张表做join,那么无法提升该子查询,需要通过将父SQL创建成with子句,然后再跟子查询中的表做相关子查询查询。 + + 例如: + + ``` + select distinct t1.a, t2.a + from t1 left join t2 on t1.a=t2.a and not exists (select a,b from test1 where test1.a=t1.a and test1.b=t2.a); + ``` + + 改写为 + + ``` + with temp as + ( + select * from (select t1.a as a, t2.a as b from t1 left join t2 on t1.a=t2.a) + + ) + select distinct a,b + from temp + where not exists (select a,b from test1 where temp.a=test1.a and temp.b=test1.b); + ``` + + - 出现在targetlist里的相关子查询无法提升\(不含count\) + + 例如: + + ``` + explain (costs off) + select (select c2 from t2 where t1.c1 = t2.c1) ssq, t1.c2 + from t1 + where t1.c2 > 10; + ``` + + 执行计划为: + + ``` + explain (costs off) + select (select c2 from t2 where t1.c1 = t2.c1) ssq, t1.c2 + from t1 + where t1.c2 > 10; + QUERY PLAN + -------------------------------- + Seq Scan on t1 + Filter: (c2 > 10) + SubPlan 1 + -> Seq Scan on t2 + Filter: (t1.c1 = c1) + (5 rows) + ``` + + 由于相关子查询出现在targetlist\(查询返回列表\)里,对于t1.c1=t2.c1不匹配的场景仍然需要输出值,因此使用left-outerjoin关联T1&T2确保t1.c1=t2.c1在不匹配时,子SSQ能够返回不匹配的补空值。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >SSQ和CSSQ的解释如下: + >- SSQ:ScalarSubQuery一般指返回1行1列scalar值的sublink,简称SSQ。 + >- CSSQ:Correlated-ScalarSubQuery和SSQ相同不过是指包含相关条件的SSQ。 + + 上述SQL语句可以改写为: + + ``` + with ssq as + ( + select t2.c2 from t2 + ) + select ssq.c2, t1.c2 + from t1 left join ssq on t1.c1 = ssq.c2 + where t1.c2 > 10; + ``` + + 改写后的执行计划为: + + ``` + QUERY PLAN + --------------------------------- + Hash Right Join + Hash Cond: (ssq.c2 = t1.c1) + CTE ssq + -> Seq Scan on t2 + -> CTE Scan on ssq + -> Hash + -> Seq Scan on t1 + Filter: (c2 > 10) + (8 rows) + ``` + + 可以看到出现在SSQ返回列表里的相关子查询SSQ,已经被提升成Right Join,从而避免当內表T2较大时出现SubPlan计划导致性能变差。 + + - 出现在targetlist里的相关子查询无法提升\(带count\) + + 例如: + + ``` + select (select count(*) from t2 where t2.c1=t1.c1) cnt, t1.c1, t3.c1 + from t1,t3 + where t1.c1=t3.c1 order by cnt, t1.c1; + ``` + + 执行计划为 + + ``` + QUERY PLAN + -------------------------------------------- + Sort + Sort Key: ((SubPlan 1)), t1.c1 + -> Hash Join + Hash Cond: (t1.c1 = t3.c1) + -> Seq Scan on t1 + -> Hash + -> Seq Scan on t3 + SubPlan 1 + -> Aggregate + -> Seq Scan on t2 + Filter: (c1 = t1.c1) + (11 rows) + ``` + + 由于相关子查询出现在targetlist\(查询返回列表\)里,对于t1.c1=t2.c1不匹配的场景仍然需要输出值,因此使用left-outerjoin关联T1&T2确保t1.c1=t2.c1在不匹配时子SSQ能够返回不匹配的补空值,但是这里带了count语句及时在t1.c1=t2.t1不匹配时需要输出0,因此可以使用一个case-when NULL then 0 else count\(\*\)来代替。 + + 上述SQL语句可以改写为: + + ``` + with ssq as + ( + select count(*) cnt, c1 from t2 group by c1 + ) + select case when + ssq.cnt is null then 0 + else ssq.cnt + end cnt, t1.c1, t3.c1 + from t1 left join ssq on ssq.c1 = t1.c1,t3 + where t1.c1 = t3.c1 + order by ssq.cnt, t1.c1; + ``` + + 改写后的执行计划为 + + ``` + QUERY PLAN + ------------------------------------------- + Sort + Sort Key: ssq.cnt, t1.c1 + CTE ssq + -> HashAggregate + Group By Key: t2.c1 + -> Seq Scan on t2 + -> Hash Join + Hash Cond: (t1.c1 = t3.c1) + -> Hash Left Join + Hash Cond: (t1.c1 = ssq.c1) + -> Seq Scan on t1 + -> Hash + -> CTE Scan on ssq + -> Hash + -> Seq Scan on t3 + (15 rows) + ``` + + - 相关条件为不等值场景 + + 例如: + + ``` + select t1.c1, t1.c2 + from t1 + where t1.c1 = (select agg() from t2.c2 > t1.c2); + ``` + + 对于非等值相关条件的SubLink目前无法提升,从语义上可以通过做2次join(一次CorrelationKey,一次rownum自关联)达到提升改写的目的。 + + 改写方案有两种。 + + - 子查询改写方式 + + ``` + select t1.c1, t1.c2 + from t1, ( + select t1.rowid, agg() aggref + from t1,t2 + where t1.c2 > t2.c2 group by t1.rowid + ) dt /* derived table */ + where t1.rowid = dt.rowid AND t1.c1 = dt.aggref; + ``` + + - CTE改写方式 + + ``` + WITH dt as + ( + select t1.rowid, agg() aggref + from t1,t2 + where t1.c2 > t2.c2 group by t1.rowid + ) + select t1.c1, t1.c2 + from t1, derived_table + where t1.rowid = derived_table.rowid AND + t1.c1 = derived_table.aggref; + ``` + + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 对于AGG类型为count\(\*\)时需要进行CASE-WHEN对没有match的场景补0处理,非COUNT\(\*\)场景NULL处理。 + >- CTE改写方式如果有sharescan支持性能上能够更优。 + + +## 更多优化示例 + +**示例:**修改select语句,将子查询修改为和主表的join,或者修改为可以提升的subquery,但是在修改前后需要保证语义的正确性。 + +``` +explain (costs off) select * from t1 where t1.c1 in (select t2.c1 from t2 where t1.c1 = t2.c2); + QUERY PLAN +-------------------------------- + Seq Scan on t1 + Filter: (SubPlan 1) + SubPlan 1 + -> Seq Scan on t2 + Filter: (t1.c1 = c2) +(5 rows) +``` + +上面事例计划中存在一个subPlan,为了消除这个subPlan可以修改语句为: + +``` +explain (costs off) select * from t1 where exists (select t2.c1 from t2 where t1.c1 = t2.c2 and t1.c1 = t2.c1); + QUERY PLAN +------------------------------------------ + Hash Join + Hash Cond: (t1.c1 = t2.c2) + -> Seq Scan on t1 + -> Hash + -> HashAggregate + Group By Key: t2.c2, t2.c1 + -> Seq Scan on t2 + Filter: (c2 = c1) +(8 rows) + +``` + +从计划可以看出,subPlan消除了,计划变成了两个表的hash join,这样会大大提高执行效率。 + diff --git "a/content/zh/docs/Developerguide/\345\255\220\347\250\213\345\272\217.md" "b/content/zh/docs/Developerguide/\345\255\220\347\250\213\345\272\217.md" new file mode 100644 index 000000000..90eb6437a --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\220\347\250\213\345\272\217.md" @@ -0,0 +1,4 @@ +# 子程序 + +存储在数据库中的存储过程、函数、操作符和高级包等。当在数据库上建立好后,可以在其他程序中调用它们。 + diff --git "a/content/zh/docs/Developerguide/\345\255\220\351\223\276\346\216\245\345\235\227\345\220\215\347\232\204hint.md" "b/content/zh/docs/Developerguide/\345\255\220\351\223\276\346\216\245\345\235\227\345\220\215\347\232\204hint.md" new file mode 100644 index 000000000..29e68b7f3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\220\351\223\276\346\216\245\345\235\227\345\220\215\347\232\204hint.md" @@ -0,0 +1,31 @@ +# 子链接块名的hint + +## 功能描述 + +指明子链接块的名称。 + +## 语法格式 + +``` +blockname (table) +``` + +## 参数说明 + +- **table**表示为该子链接块hint的别名的名称。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- **blockname hint**仅在对应的子链接块提升时才会被上层查询使用。目前支持的子链接提升包括IN子链接提升、EXISTS子链接提升和包含Agg等值相关子链接提升。该hint通常会和前面章节提到的hint联合使用。 +>- 对于FROM关键字后的子查询,则需要使用子查询的别名进行hint,blockname hint不会被用到。 +>- 如果子链接中含有多个表,则提升后这些表可与外层表以任意优化顺序连接,hint也不会被用到。 + +## 示例 + +``` +explain select /*+nestloop(store_sales tt) */ * from store_sales where ss_item_sk in (select /*+blockname(tt)*/ i_item_sk from item group by 1); +``` + +该hint表示:子链接的别名为tt,提升后与上层的store\_sales表关联时使用nestloop。生成计划如下所示: + +![](figures/zh-cn_image_0253038757.png) + diff --git "a/content/zh/docs/Developerguide/\345\255\227\347\254\246\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\345\255\227\347\254\246\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" index a792c6381..c8666f320 100644 --- "a/content/zh/docs/Developerguide/\345\255\227\347\254\246\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\345\255\227\347\254\246\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -668,22 +668,6 @@ openGauss提供的字符处理函数和操作符主要用于字符串与字符 (1 row) ``` -- sys\_context \( 'namespace' , 'parameter'\) - - 描述:获取并返回指定namespace下参数parameter的值。 - - 返回值类型:text - - 示例: - - ``` - postgres=# SELECT SYS_CONTEXT ( 'postgres' , 'archive_mode'); - sys_context - ------------- - - (1 row) - ``` - - substrb\(text,int,int\) 描述:提取子字符串,第一个int表示提取的起始位置,第二个表示提取几位字符。 @@ -1078,7 +1062,7 @@ openGauss提供的字符处理函数和操作符主要用于字符串与字符 postgres=# SELECT rpad('hi',5,'xyza'); rpad ------- - hixyx + hixyz (1 row) ``` @@ -1195,7 +1179,7 @@ openGauss提供的字符处理函数和操作符主要用于字符串与字符 - concat\(str1,str2\) - 描述:将字符串str1和str2连接并返回,若str1或str2为NULL时,返回NULL。 + 描述:将字符串str1和str2连接并返回。 返回值类型:varchar @@ -1210,7 +1194,7 @@ openGauss提供的字符处理函数和操作符主要用于字符串与字符 postgres=# SELECT concat('Hello', NULL); concat -------- - + Hello (1 row) ``` diff --git "a/content/zh/docs/Developerguide/\345\255\227\347\254\246\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\345\255\227\347\254\246\347\261\273\345\236\213.md" index 9a7b2761b..f3eac36c9 100644 --- "a/content/zh/docs/Developerguide/\345\255\227\347\254\246\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\345\255\227\347\254\246\347\261\273\345\236\213.md" @@ -32,7 +32,7 @@ openGauss支持的字符类型请参见[表1](#zh-cn_topic_0237121950_zh-cn_topi

VARCHAR2(n)

-

变长字符串。是VARCHAR(n)类型的别名,为兼容A类型。n是指字节长度。

+

变长字符串。是VARCHAR(n)类型的别名。n是指字节长度。

最大为10MB。

@@ -46,7 +46,7 @@ openGauss支持的字符类型请参见[表1](#zh-cn_topic_0237121950_zh-cn_topi

CLOB

-

文本大对象。是TEXT类型的别名,为兼容A类型。

+

文本大对象。是TEXT类型的别名。

最大为1GB-8203字节(即1073733621字节)。

diff --git "a/content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213-18.md" "b/content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213-18.md" new file mode 100644 index 000000000..792730625 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213-18.md" @@ -0,0 +1,10 @@ +# 存储过程 + +商业规则和业务逻辑可以通过程序存储在openGauss中,这个程序就是存储过程。 + +存储过程是SQL和PL/SQL的组合。存储过程使执行商业规则的代码可以从应用程序中移动到数据库。从而,代码存储一次能够被多个程序使用。 + +存储过程的创建及调用办法请参考[CREATE PROCEDURE](CREATE-PROCEDURE.md)。 + +[PL/pgSQL语言函数](PL-pgSQL语言函数.md)节所提到的PL/pgSQL语言创建的函数与存储过程的应用方法相通。下面各节中,除非特别声明,否则内容通用于存储过程和PL/pgSQL语言函数。 + diff --git "a/content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 000000000..dbbb05f1f --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,27 @@ +# 存储过程 + +- **[存储过程](存储过程-18.md)** + +- **[数据类型](数据类型-19.md)** + +- **[数据类型转换](数据类型转换.md)** + +- **[数组和record](数组和record.md)** + +- **[声明语法](声明语法.md)** + +- **[基本语句](基本语句.md)** + +- **[动态语句](动态语句.md)** + +- **[控制语句](控制语句.md)** + +- **[其他语句](其他语句.md)** + +- **[游标](游标.md)** + +- **[Retry管理](Retry管理.md)** + +- **[调试](调试-20.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\207\275\346\225\260.md" index 2afdd15d4..5e3544016 100644 --- "a/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\207\275\346\225\260.md" @@ -280,13 +280,7 @@ -- pgxc\_query\_audit - - 描述:查看数据库主节点审计日志。 - - 返回值类型:record - - 函数返回字段同pg\_query\_audit函数。 + 函数使用方法及示例请参考[查看审计结果](查看审计结果.md)。 - pg\_delete\_audit @@ -294,5 +288,6 @@ 返回值类型:void + 函数使用方法及示例请参考[维护审计日志](维护审计日志.md)。 diff --git "a/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" "b/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" index c0af033a5..7d71fee08 100644 --- "a/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" +++ "b/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" @@ -52,7 +52,7 @@ >![](public_sys-resources/icon-notice.gif) **须知:** >openGauss目前支持SSL的场景为客户端连接数据库主节点场景,该参数目前建议只在数据库主节点中开启,数据库节点默认值为off。开启此参数需要同时配置ssl\_cert\_file、ssl\_key\_file和ssl\_ca\_file等参数及对应文件,不正确的配置可能会导致openGauss无法正常启动。 -**默认值:**on +**默认值:**off ## require\_ssl @@ -76,7 +76,7 @@ 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**字符串,如果指定多个加密算法,加密算法之间需要以分号分割。详细请参见[表4](用SSL进行安全的TCP-IP连接.md#zh-cn_topic_0237121092_zh-cn_topic_0059778374_t34eea0830ef94be1a866f0410ba3eb07)获取支持的加密算法。 +**取值范围:**字符串,如果指定多个加密算法,加密算法之间需要以分号分割。详细请参见[用SSL进行安全的TCP/IP连接](用SSL进行安全的TCP-IP连接.md)获取支持的加密算法。 **默认值:**ALL @@ -132,7 +132,7 @@ ## krb\_server\_keyfile -**参数说明:**指定Kerberos服务主配置文件的位置,详细请参见[客户端接入认证](客户端接入认证.md)。 +**参数说明:**指定Kerberos服务主配置文件的位置,详细请参见[配置客户端接入认证](配置客户端接入认证.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -142,7 +142,7 @@ ## krb\_srvname -**参数说明:**设置Kerberos服务名,详细请参见[客户端接入认证](客户端接入认证.md)。 +**参数说明:**设置Kerberos服务名,详细请参见[配置客户端接入认证](配置客户端接入认证.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -178,7 +178,7 @@ ## password\_policy -**参数说明:**在使用CREATE ROLE/USER或者ALTER ROLE/USER命令创建或者修改openGauss帐户时,该参数决定是否进行密码复杂度检查。 +**参数说明:**在使用CREATE ROLE/USER或者ALTER ROLE/USER命令创建或者修改openGauss帐户时,该参数决定是否进行密码复杂度检查。关于密码复杂度检查策略请参见[设置密码安全策略](设置密码安全策略.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -194,7 +194,7 @@ ## password\_reuse\_time -**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用天数检查。 +**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用天数检查。关于密码可重用策略请参见[设置密码安全策略](设置密码安全策略.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -214,7 +214,7 @@ ## password\_reuse\_max -**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用次数检查。 +**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用次数检查。关于密码可重用策略请参见[设置密码安全策略](设置密码安全策略.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -234,7 +234,7 @@ ## password\_lock\_time -**参数说明:**该参数指定帐户被锁定后自动解锁的时间。 +**参数说明:**该参数指定帐户被锁定后自动解锁的时间。关于帐户自动锁定策略请参见[设置密码安全策略](设置密码安全策略.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -250,7 +250,7 @@ ## failed\_login\_attempts -**参数说明:**在任意时候,如果输入密码错误的次数达到failed\_login\_attempts则当前帐户被锁定,password\_lock\_time秒后被自动解锁。 例如,登录时输入密码失败,ALTER USER时修改密码失败等。 +**参数说明:**在任意时候,如果输入密码错误的次数达到failed\_login\_attempts则当前帐户被锁定,password\_lock\_time秒后被自动解锁。 例如,登录时输入密码失败,ALTER USER时修改密码失败等。关于帐户自动锁定策略请参见[设置密码安全策略](设置密码安全策略.md)。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 diff --git "a/content/zh/docs/Developerguide/\345\256\232\344\271\211\345\217\230\351\207\217.md" "b/content/zh/docs/Developerguide/\345\256\232\344\271\211\345\217\230\351\207\217.md" new file mode 100644 index 000000000..60241313d --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\232\344\271\211\345\217\230\351\207\217.md" @@ -0,0 +1,56 @@ +# 定义变量 + +介绍PL/SQL中变量的声明,以及该变量在代码中的作用域。 + +## 变量声明 + +变量声明语法请参见[图1](#zh-cn_topic_0237122221_zh-cn_topic_0059777427_f6cc941e0c136457aade3860fc682cbbc)。 + +**图 1** declare\_variable::= +![](figures/declare_variable.png "declare_variable") + +对以上语法格式的解释如下: + +- variable\_name:变量名。 +- type:变量类型。 +- value:该变量的初始值(如果不给定初始值,则初始为NULL)。value也可以是表达式。 + +**示例** + +``` +postgres=# DECLARE + emp_id INTEGER := 7788; --定义变量并赋值 +BEGIN + emp_id := 5*7784; --变量赋值 +END; +/ +``` + +变量类型除了支持基本类型,还可以是使用%TYPE和%ROWTYPE去声明一些与其他表字段或表结构本身相关的变量。 + +**%TYPE属性** + +%TYPE主要用于声明某个与其他变量类型(例如,表中某列的类型)相同的变量。假如我们想定义一个my\_name变量,它的变量类型与employee的firstname类型相同,我们可以通过如下定义: + +``` +my_name employee.firstname%TYPE +``` + +这样定义可以带来两个好处,首先,我们不用预先知道employee 表的firstname类型具体是什么。其次,即使之后firstname类型有了变化,我们也不需要再次修改my\_name的类型。 + +**%ROWTYPE属性** + +%ROWTYPE属性主要用于对一组数据的类型声明,用于存储表中的一行数据或从游标匹配的结果。假如,我们需要一组数据,该组数据的字段名称与字段类型都与employee表相同。我们可以通过如下定义: + +``` +my_employee employee%ROWTYPE +``` + +## 变量作用域 + +变量的作用域表示变量在代码块中的可访问性和可用性。只有在它的作用域内,变量才有效。 + +- 变量必须在declare部分声明,即必须建立BEGIN-END块。块结构也强制变量必须先声明后使用,即变量在过程内有不同作用域、不同的生存期。 +- 同一变量可以在不同的作用域内定义多次,内层的定义会覆盖外层的定义。 +- 在外部块定义的变量,可以在嵌套块中使用。但外部块不能访问嵌套块中的变量。 + diff --git "a/content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211.md" "b/content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211.md" new file mode 100644 index 000000000..5f7e6109c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211.md" @@ -0,0 +1,13 @@ +# 审视和修改表定义 + +- **[审视和修改表定义概述](审视和修改表定义概述.md)** + +- **[选择存储模型](选择存储模型.md)** + +- **[使用局部聚簇](使用局部聚簇.md)** + +- **[使用分区表](使用分区表.md)** + +- **[选择数据类型](选择数据类型.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211\346\246\202\350\277\260.md" new file mode 100644 index 000000000..7f2d628a5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\241\350\247\206\345\222\214\344\277\256\346\224\271\350\241\250\345\256\232\344\271\211\346\246\202\350\277\260.md" @@ -0,0 +1,9 @@ +# 审视和修改表定义概述 + +好的表定义至少需要达到以下几个目标: + +1. **减少扫描数据数据量**。通过分区的剪枝机制可以实现该点。 +2. **尽量极少随机IO**。通过聚簇/局部聚簇可以实现该点。 + +表定义在数据库设计阶段创建,在SQL调优过程中进行审视和修改。 + diff --git "a/content/zh/docs/Developerguide/\345\256\241\350\256\241\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\345\256\241\350\256\241\346\246\202\350\277\260.md" index 5b457ed00..36ed724b7 100644 --- "a/content/zh/docs/Developerguide/\345\256\241\350\256\241\346\246\202\350\277\260.md" +++ "b/content/zh/docs/Developerguide/\345\256\241\350\256\241\346\246\202\350\277\260.md" @@ -54,7 +54,7 @@

数据库对象的CREATE,ALTER,DROP操作审计

参数:audit_system_object

-

默认值为12295,表示只对DATABASE、SCHEMA、USER、DATA SOURCE、NODE GROUP这五类数据库对象的CREATE、ALTER、DROP操作进行审计。

+

默认值为12295,表示只对DATABASE、SCHEMA、USER、DATA SOURCE这四类数据库对象的CREATE、ALTER、DROP操作进行审计。

具体表的INSERT、UPDATE和DELETE操作审计

@@ -432,7 +432,7 @@ 连接成功后,系统显示类似如下信息: ``` - gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -451,7 +451,7 @@ 2. 执行如下命令开启审计功能,参数设置立即生效。 ``` - gs_guc set -Z coordinator -Z datanode -N all -I all -c "audit_enabled=on" + gs_guc set -N all -I all -c "audit_enabled=on" ``` 4. 配置具体的审计项。 @@ -463,7 +463,7 @@ 以开启对数据库所有对象的增删改操作的审计开关为例,其他配置项的修改方法与此相同,修改配置项的方法如下所示: ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_system_object=12295" + gs_guc reload -N all -I all -c "audit_system_object=12295" ``` 其中audit\_system\_object代表审计项开关,12295为该审计开关的值。 diff --git "a/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-0.md" "b/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-0.md" deleted file mode 100644 index 662972982..000000000 --- "a/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-0.md" +++ /dev/null @@ -1,15 +0,0 @@ -# 客户端接入认证 - -- **[配置客户端接入认证](配置客户端接入认证-1.md)** - -- **[配置文件参考](配置文件参考-2.md)** - -- **[用SSL进行安全的TCP/IP连接](用SSL进行安全的TCP-IP连接-3.md)** - -- **[用SSH隧道进行安全的TCP/IP连接](用SSH隧道进行安全的TCP-IP连接-4.md)** - -- **[查看数据库连接数](查看数据库连接数-5.md)** - -- **[SSL证书管理](SSL证书管理-6.md)** - - diff --git "a/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" "b/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" index b135d09a8..269d0d908 100644 --- "a/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" +++ "b/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" @@ -1,4 +1,4 @@ -# 客户端接入认证 +# 客户端接入认证 - **[配置客户端接入认证](配置客户端接入认证.md)** diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\345\257\274\345\205\245\346\225\260\346\215\256.md" index 5aef9d375..004a4f0bf 100644 --- "a/content/zh/docs/Developerguide/\345\257\274\345\205\245\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\345\257\274\345\205\245\346\225\260\346\215\256.md" @@ -1,6 +1,6 @@ # 导入数据 -openGauss提供了灵活的数据入库方式:INSERT、COPY以及gsql元命令\\copy。各方式具有不同的特点,具体请参见[表1](#zh-cn_topic_0237121116_table59418455192145)。 +openGauss数据库提供了灵活的数据入库方式:INSERT、COPY以及gsql元命令\\copy。各方式具有不同的特点,具体请参见[表1](#zh-cn_topic_0237121116_table59418455192145)。 **表 1** 导入方式特点说明 @@ -18,8 +18,8 @@ openGauss提供了灵活的数据入库方式:INSERT、COPY以及gsql元命令

COPY

-

通过COPY FROM STDIN语句直接向openGauss写入数据。

-

通过JDBC驱动的CopyManager接口从其他数据库向openGauss写入数据时,具有业务数据无需落地成文件的优势。

+

通过COPY FROM STDIN语句直接向openGauss数据库写入数据。

+

通过JDBC驱动的CopyManager接口从其他数据库向openGauss数据库写入数据时,具有业务数据无需落地成文件的优势。

gsql工具的元命令\copy

@@ -40,7 +40,7 @@ openGauss提供了灵活的数据入库方式:INSERT、COPY以及gsql元命令 - **[使用gs\_restore命令导入数据](使用gs_restore命令导入数据.md)** -- **[更新表中数据](更新表中数据-11.md)** +- **[更新表中数据](更新表中数据-4.md)** - **[深层复制](深层复制.md)** diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\205\250\345\261\200\345\257\271\350\261\241.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\205\250\345\261\200\345\257\271\350\261\241.md" index e43e30732..1d7570a69 100644 --- "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\205\250\345\261\200\345\257\271\350\261\241.md" +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\205\250\345\261\200\345\257\271\350\261\241.md" @@ -24,7 +24,7 @@ openGauss支持使用gs\_dumpall工具导出所有数据库公共的全局对象

-U

-

连接数据库的用户名,需要是openGauss管理员用户。

+

连接数据库的用户名,需要是openGauss管理员用户。

-U omm

diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-13.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-6.md" similarity index 93% rename from "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-13.md" rename to "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-6.md" index 6efccec95..4fec588e5 100644 --- "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-13.md" +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223-6.md" @@ -4,12 +4,12 @@ openGauss支持使用gs\_dumpall工具导出所有数据库的全量信息,包 - 导出所有数据库全量信息,包含openGauss中每个数据库信息和公共的全局对象信息(包含角色和表空间信息)。 - 使用导出的全量信息可以创建与openGauss相同的一个openGauss,拥有相同数据库和公共全局对象,且库中数据也与当前各库相同。 + 使用导出的全量信息可以创建与当前主机相同的一个主机环境,拥有相同数据库和公共全局对象,且库中数据也与当前各库相同。 - 仅导出数据,即导出每个数据库中的数据,且不包含所有对象定义和公共的全局对象信息。 - 仅导出所有对象定义,包括:表空间、库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。 - 使用导出的对象定义,可以快速创建与openGauss相同的一个openGauss,拥有相同的数据库和表空间,但是库中并无原数据库的数据。 + 使用导出的对象定义,可以快速创建与当前主机相同的一个主机环境,拥有相同的数据库和表空间,但是库中并无原数据库的数据。 ## 操作步骤 @@ -34,7 +34,7 @@ openGauss支持使用gs\_dumpall工具导出所有数据库的全量信息,包

-U

-

连接数据库的用户名,需要是openGauss管理员用户。

+

连接数据库的用户名,需要是openGauss管理员用户。

-U omm

diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223.md" index d8708a75f..c0b5c2062 100644 --- "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223.md" +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\211\200\346\234\211\346\225\260\346\215\256\345\272\223.md" @@ -1,6 +1,6 @@ # 导出所有数据库 -- **[导出所有数据库](导出所有数据库-13.md)** +- **[导出所有数据库](导出所有数据库-6.md)** - **[导出全局对象](导出全局对象.md)** diff --git "a/content/zh/docs/Developerguide/\345\270\270\350\247\201\346\225\205\351\232\234\345\256\232\344\275\215\346\214\207\345\215\227.md" "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\346\225\205\351\232\234\345\256\232\344\275\215\346\214\207\345\215\227.md" index 170ba6717..251a67f51 100644 --- "a/content/zh/docs/Developerguide/\345\270\270\350\247\201\346\225\205\351\232\234\345\256\232\344\275\215\346\214\207\345\215\227.md" +++ "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\346\225\205\351\232\234\345\256\232\344\275\215\346\214\207\345\215\227.md" @@ -2,4 +2,8 @@ - **[core问题定位](core问题定位.md)** +- **[TPCC运行时,注入磁盘满故障,TPCC卡住的问题](TPCC运行时-注入磁盘满故障-TPCC卡住的问题.md)** + +- **[备机处于need repair\(WAL\)状态问题](备机处于need-repair(WAL)状态问题.md)** + diff --git "a/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-10.md" similarity index 80% rename from "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" rename to "content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-10.md" index 8d61c67ab..85c22219f 100644 --- "a/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" +++ "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-10.md" @@ -1,4 +1,4 @@ -# 常见问题处理 +# 常见问题处理 - 数据库实例连接失败:请检查数据库实例的情况,是否数据库实例出现了问题或安全权限配置不正确; - 重启失败:请检查数据库实例健康情况,确保数据库实例工作正常; diff --git "a/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-15.md" similarity index 78% rename from "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" rename to "content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-15.md" index e9c604c05..f977cf186 100644 --- "a/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" +++ "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-15.md" @@ -1,4 +1,4 @@ -# 常见问题处理 +# 常见问题处理 - 训练场景失败:请检查历史日志文件路径是否正确,且文件格式符合上文规定。 diff --git "a/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" index 87fde7d76..2242a1c4b 100644 --- "a/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" +++ "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" @@ -1,5 +1,14 @@ # 常见问题处理 +## AI Engine配置问题 + +- **AiEngine启动失败**:请检查ip地址,端口是否可用;CA证书路径是否存在。 +- **发起请求AiEngine无响应**:请检查通信双方CA证书是否一致。 +- **训练,测试场景失败**:请检查模型文件保存路径是否存在;训练预测文件是否在正确下载。 +- **更换AiEngine-IP地址**:按照[证书生成](环境部署.md#section2571634396)步骤重新生成证书,在[生成证书及密钥](环境部署.md#li1783847165213)中替换成相应的IP地址即可。 + +## 数据库内部报错问题 + 问题:AiEngine链接失败。 ``` diff --git "a/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\345\274\200\345\217\221\346\225\231\347\250\213.md" "b/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\345\274\200\345\217\221\346\225\231\347\250\213.md" new file mode 100644 index 000000000..be565f03c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\345\274\200\345\217\221\346\225\231\347\250\213.md" @@ -0,0 +1,13 @@ +# 应用程序开发教程 + +- **[开发规范](开发规范.md)** + +- **[基于JDBC开发](基于JDBC开发.md)** + +- **[基于ODBC开发](基于ODBC开发.md)** + +- **[基于libpq开发](基于libpq开发.md)** + +- **[调试](调试.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243.md" "b/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243.md" index ce433220a..1848b3453 100644 --- "a/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243.md" +++ "b/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243.md" @@ -17,7 +17,7 @@

ODBC

-
  • Linux下:

    驱动程序:openGauss-x.x-EULER-64bit-Odbc.tar.gz

    + @@ -32,3 +32,5 @@ 使用JDBC和ODBC接口连接数据库属远程连接,因此需要openGauss已经做了支持[远程连接的配置](配置服务端远程连接.md)。 +更多支持的应用程序接口详细信息请参考[应用程序开发教程](应用程序开发教程.md)。 + diff --git "a/content/zh/docs/Developerguide/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" index e78e053f1..57a557264 100644 --- "a/content/zh/docs/Developerguide/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" +++ "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" @@ -102,7 +102,7 @@ 该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**整型,最小值为0,最大值为INT\_MAX/1000000,单位为秒。 +**取值范围:**整型,最小值为0,最大值为2147,单位为秒。 **默认值:**0 @@ -188,7 +188,7 @@ **参数说明**:该参数用于控制在特定的客户场景中,使用不同的估算方法使得估算值与真实值更接近。此参数可以同时控制多种方法,与某一方法对应的位做与操作,不为0表示该方法被选择。 -当cost\_param & 1 不为0,表示对于求不等值连接选择率时选择一种改良机制,此方法在自连接(两个相同的表之间连接)的估算中更加准确,V300R002C00版本开始,已弃用cost\_param & 1 不为0时的路径,默认选择更优的估算公式; +当cost\_param & 1 不为0,表示对于求不等值连接选择率时选择一种改良机制,此方法在自连接(两个相同的表之间连接)的估算中更加准确。目前,已弃用cost\_param & 1 不为0时的路径,默认选择更优的估算公式; 当cost\_param & 2 不为0,表示求多个过滤条件(Filter)的选择率时,选择最小的作为总的选择率,而非两者乘积,此方法在过滤条件的列之间关联性较强时估算更加准确; @@ -230,7 +230,7 @@ 该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围**:枚举类型,有效值有application,dbnode,gtm,gtmproxy,internaltool,gtmtool。 +**取值范围**:枚举类型,有效值有application,datanode,internaltool。 **默认值**:application @@ -354,6 +354,11 @@ set rewrite_rule=none; --关闭所有可选查询重写规则 **默认值:**ALL,on\(\),off\(LLVM\_COMPILE,HASH\_CONFLICT,STREAM\_DATA\_CHECK\),不开启任何定位功能。 +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置时,选择开启或者关闭的选项请使用'on\(\)'或'off\(\)'包括,未被显示指定的功能选项会维持原来的值。参考格式: +>'on\(option1, option2, ...\)' +>'off\(ALL\)' + ## resource\_track\_log **参数说明**:控制自诊断的日志级别。目前仅对多列统计信息进行控制。 @@ -375,7 +380,7 @@ set rewrite_rule=none; --关闭所有可选查询重写规则 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**整型,200\*1024~2147483647,单位为KB。 +**取值范围:**整型,200\*1024~max\_process\_memory,单位为KB。 **默认值:**200MB @@ -416,7 +421,7 @@ set rewrite_rule=none; --关闭所有可选查询重写规则 - 用户自定义参数(以–D开头,如–Duser.defined.option) >![](public_sys-resources/icon-notice.gif) **须知:** ->如果用户在pljava\_vmoptions中设置参数不满足上述取值范围,会在使用PL/Java语言函数时报错。 +>如果用户在pljava\_vmoptions中设置参数不满足上述取值范围,会在使用PL/Java语言函数时报错。此参数的详细说明参见[PL/pgSQL语言函数](PL-pgSQL语言函数.md)。 **默认值:**空 @@ -487,7 +492,7 @@ set rewrite_rule=none; --关闭所有可选查询重写规则 **取值范围**:整型,0\~256 (0表示关闭异步刷盘功能),单位页面(8K)。例如,取值64,表示backend线程连续写64个磁盘页,即64\*8=512KB磁盘空间后会进行异步刷盘。 -**默认值**:512KB(即64个页面) +**默认值**:0 ## enable\_parallel\_ddl diff --git "a/content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213-1.md" "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213-1.md" new file mode 100644 index 000000000..beb3357dc --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213-1.md" @@ -0,0 +1,104 @@ +# 开发流程 + +**图 1** ODBC开发应用程序的流程 +![](figures/ODBC开发应用程序的流程.png "ODBC开发应用程序的流程") + +## 开发流程中涉及的API + +**表 1** 相关API说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    功能

    +

    API

    +

    申请句柄资源

    +

    SQLAllocHandle:申请句柄资源,可替代如下函数:

    + +

    设置环境属性

    +

    SQLSetEnvAttr

    +

    设置连接属性

    +

    SQLSetConnectAttr

    +

    设置语句属性

    +

    SQLSetStmtAttr

    +

    连接数据源

    +

    SQLConnect

    +

    绑定缓冲区到结果集的列中

    +

    SQLBindCol

    +

    绑定SQL语句的参数标志和缓冲区

    +

    SQLBindParameter

    +

    查看最近一次操作错误信息

    +

    SQLGetDiagRec

    +

    为执行SQL语句做准备

    +

    SQLPrepare

    +

    执行一条准备好的SQL语句

    +

    SQLExecute

    +

    直接执行SQL语句

    +

    SQLExecDirect

    +

    结果集中取行集

    +

    SQLFetch

    +

    返回结果集中某一列的数据

    +

    SQLGetData

    +

    获取结果集中列的描述信息

    +

    SQLColAttribute

    +

    断开与数据源的连接

    +

    SQLDisconnect

    +

    释放句柄资源

    +

    SQLFreeHandle:释放句柄资源,可替代如下函数:

    + +
    + +>![](public_sys-resources/icon-note.gif) **说明:** +>数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,同时如果其中有一个语句失败,那么整个请求都将会被回滚。 + diff --git "a/content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213.md" "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213.md" new file mode 100644 index 000000000..3fa67428f --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\346\265\201\347\250\213.md" @@ -0,0 +1,5 @@ +# 开发流程 + +**图 1** 采用JDBC开发应用程序的流程 +![](figures/采用JDBC开发应用程序的流程.png "采用JDBC开发应用程序的流程") + diff --git "a/content/zh/docs/Developerguide/\345\274\200\345\217\221\350\247\204\350\214\203.md" "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\350\247\204\350\214\203.md" new file mode 100644 index 000000000..8eff54185 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\350\247\204\350\214\203.md" @@ -0,0 +1,9 @@ +# 开发规范 + +如果用户在APP的开发中,使用了连接池机制,那么需要遵循如下规范: + +- 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 +- 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。 + +否则,连接池里面的连接就是有状态的,会对用户后续使用连接池进行操作的正确性带来影响。 + diff --git "a/content/zh/docs/Developerguide/\345\276\252\347\216\257\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\345\276\252\347\216\257\350\257\255\345\217\245.md" new file mode 100644 index 000000000..7d934bcf4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\276\252\347\216\257\350\257\255\345\217\245.md" @@ -0,0 +1,131 @@ +# 循环语句 + +## 简单LOOP语句 + +**语法图** + +**图 1** loop::= +![](figures/loop.png "loop") + +**示例** + +``` +CREATE OR REPLACE PROCEDURE proc_loop(i in integer, count out integer) +AS + BEGIN + count:=0; + LOOP + IF count > i THEN + raise info 'count is %. ', count; + EXIT; + ELSE + count:=count+1; + END IF; + END LOOP; + END; +/ + +CALL proc_loop(10,5); +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该循环必须要结合EXIT使用,否则将陷入死循环。 + +## WHILE\_LOOP语句 + +**语法图** + +**图 2** while\_loop::= +![](figures/while_loop.png "while_loop") + +只要条件表达式为真,WHILE语句就会不停的在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。 + +**示例** + +``` +CREATE TABLE integertable(c1 integer) ; +CREATE OR REPLACE PROCEDURE proc_while_loop(maxval in integer) +AS + DECLARE + i int :=1; + BEGIN + WHILE i < maxval LOOP + INSERT INTO integertable VALUES(i); + i:=i+1; + END LOOP; + END; +/ + +--调用函数 +CALL proc_while_loop(10); + +--删除存储过程和表 +DROP PROCEDURE proc_while_loop; +DROP TABLE integertable; +``` + +## FOR\_LOOP(integer变量)语句 + +**语法图** + +**图 3** for\_loop::= +![](figures/for_loop.png "for_loop") + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 变量name会自动定义为integer类型并且只在此循环里存在。变量name介于lower\_bound和upper\_bound之间。 +>- 当使用REVERSE关键字时,lower\_bound必须大于等于upper\_bound,否则循环体不会被执行。 + +## FOR\_LOOP查询语句 + +**语法图** + +**图 4** for\_loop\_query::= +![](figures/for_loop_query.png "for_loop_query") + +>![](public_sys-resources/icon-note.gif) **说明:** +>变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果。 + +## FORALL批量查询语句 + +**语法图** + +**图 5** forall::= +![](figures/forall.png "forall") + +>![](public_sys-resources/icon-note.gif) **说明:** +>变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low\_bound和upper\_bound之间。 + +**示例** + +``` +CREATE TABLE hdfs_t1 ( + title NUMBER(6), + did VARCHAR2(20), + data_peroid VARCHAR2(25), + kind VARCHAR2(25), + interval VARCHAR2(20), + time DATE, + isModified VARCHAR2(10) +) + +INSERT INTO hdfs_t1 VALUES( 8, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK' ); + +CREATE OR REPLACE PROCEDURE proc_forall() +AS +BEGIN + FORALL i IN 100..120 + update hdfs_t1 set title = title + 100*i; +END; +/ + +--调用函数 +CALL proc_forall(); + +--查询存储过程调用结果 +SELECT * FROM hdfs_t1 WHERE title BETWEEN 100 AND 120; + +--删除存储过程和表 +DROP PROCEDURE proc_forall; +DROP TABLE hdfs_t1; +``` + diff --git "a/content/zh/docs/Developerguide/\346\200\247\350\203\275\347\273\237\350\256\241.md" "b/content/zh/docs/Developerguide/\346\200\247\350\203\275\347\273\237\350\256\241.md" index 938daed50..6b36863b0 100644 --- "a/content/zh/docs/Developerguide/\346\200\247\350\203\275\347\273\237\350\256\241.md" +++ "b/content/zh/docs/Developerguide/\346\200\247\350\203\275\347\273\237\350\256\241.md" @@ -24,5 +24,5 @@ - on表示开启记录性能统计数据的功能。 - off表示关闭记录性能统计数据的功能。 -**默认值:on** +**默认值:off** diff --git "a/content/zh/docs/Developerguide/\346\200\247\350\203\275\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\346\200\247\350\203\275\350\260\203\344\274\230.md" new file mode 100644 index 000000000..adac1f131 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\200\247\350\203\275\350\260\203\344\274\230.md" @@ -0,0 +1,11 @@ +# 性能调优 + +- **[总体调优思路](总体调优思路.md)** +openGauss的总体性能调优思路为性能瓶颈点分析、关键参数调整以及SQL调优。在调优过程中,通过系统资源、吞吐量、负载等因素来帮助定位和分析性能问题,使系统性能达到可接受的范围。 +- **[确定性能调优范围](确定性能调优范围.md)** + +- **[系统调优指南](系统调优指南.md)** + +- **[SQL调优指南](SQL调优指南.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\200\273\344\275\223\350\260\203\344\274\230\346\200\235\350\267\257.md" "b/content/zh/docs/Developerguide/\346\200\273\344\275\223\350\260\203\344\274\230\346\200\235\350\267\257.md" new file mode 100644 index 000000000..29d96812f --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\200\273\344\275\223\350\260\203\344\274\230\346\200\235\350\267\257.md" @@ -0,0 +1,46 @@ +# 总体调优思路 + +openGauss的总体性能调优思路为性能瓶颈点分析、关键参数调整以及SQL调优。在调优过程中,通过系统资源、吞吐量、负载等因素来帮助定位和分析性能问题,使系统性能达到可接受的范围。 + +openGauss性能调优过程需要综合考虑多方面因素,因此,调优人员应对系统软件架构、软硬件配置、数据库配置参数、并发控制、查询处理和数据库应用有广泛而深刻的理解。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>性能调优过程有时候需要重启openGauss,可能会中断当前业务。因此,业务上线后,当性能调优操作需要重启openGauss时,操作窗口时间需向管理部门提出申请,经批准后方可执行。 + +## 调优流程 + +调优流程如[图1](#zh-cn_topic_0237121483_zh-cn_topic_0073253541_zh-cn_topic_0040046511_fig52278782113544)所示。 + +**图 1** openGauss性能调优流程 +![](figures/openGauss性能调优流程.png "openGauss性能调优流程") + +调优各阶段说明,如[表1](#zh-cn_topic_0237121483_zh-cn_topic_0073253541_zh-cn_topic_0040046511_table18747316113544)所示。 + +**表 1** openGauss性能调优流程说明 + + + + + + + + + + + + + + + + +

    阶段

    +

    描述

    +

    确定性能调优范围

    +

    获取openGauss节点的CPU、内存、I/O和网络资源使用情况,确认这些资源是否已被充分利用,是否存在瓶颈点。

    +

    系统调优指南

    +

    进行操作系统级以及数据库系统级的调优,更充分地利用机器的CPU、内存、I/O和网络资源,避免资源冲突,提升整个系统查询的吞吐量。

    +

    系统调优指南

    +

    审视业务所用SQL语句是否存在可优化空间,包括:

    +
    • 通过ANALYZE语句生成表统计信息:ANALYZE语句可收集与数据库中表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。
    • 分析执行计划:EXPLAIN语句可显示SQL语句的执行计划,EXPLAIN PERFORMANCE语句可显示SQL语句中各算子的执行时间。
    • 查找问题根因并进行调优:通过分析执行计划,找到可能存在的原因,进行针对性的调优,通常为调整数据库级SQL调优参数。
    • 编写更优的SQL:介绍一些复杂查询中的中间临时数据缓存、结果集缓存、结果集合并等场景中的更优SQL语法。
    +
    + diff --git "a/content/zh/docs/Developerguide/\346\211\247\350\241\214SQL\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\346\211\247\350\241\214SQL\350\257\255\345\217\245.md" new file mode 100644 index 000000000..91678778f --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\211\247\350\241\214SQL\350\257\255\345\217\245.md" @@ -0,0 +1,162 @@ +# 执行SQL语句 + +## 执行普通SQL语句 + +应用程序通过执行SQL语句来操作数据库的数据(不用传递参数的语句),需要按以下步骤执行: + +1. 调用Connection的createStatement方法创建语句对象。 + + ``` + Connection conn = null; + Statement stmt = conn.createStatement(); + ``` + +2. 调用Statement的executeUpdate方法执行SQL语句。 + + ``` + int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,事务块中不支持vacuum操作。如果其中有一个语句失败,那么整个请求都将会被回滚。 + +3. 关闭语句对象。 + + ``` + stmt.close(); + ``` + + +## 执行预编译SQL语句 + +预编译语句是只编译和优化一次,然后可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行: + +1. 调用Connection的prepareStatement方法创建预编译语句对象。 + + ``` + PreparedStatement pstmt = con.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1"); + ``` + +2. 调用PreparedStatement的setShort设置参数。 + + ``` + pstmt.setShort(1, (short)2); + ``` + +3. 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。 + + ``` + int rowcount = pstmt.executeUpdate(); + ``` + +4. 调用PreparedStatement的close方法关闭预编译语句对象。 + + ``` + pstmt.close(); + ``` + + +## 调用存储过程 + +openGauss支持通过JDBC直接调用事先创建的存储过程,步骤如下: + +1. 调用Connection的prepareCall方法创建调用语句对象。 + + ``` + Connection myConn = null; + CallableStatement cstmt = myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"); + ``` + +2. 调用CallableStatement的setInt方法设置参数。 + + ``` + cstmt.setInt(2, 50); + cstmt.setInt(1, 20); + cstmt.setInt(3, 90); + ``` + +3. 调用CallableStatement的registerOutParameter方法注册输出参数。 + + ``` + cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。 + ``` + +4. 调用CallableStatement的execute执行方法调用。 + + ``` + cstmt.execute(); + ``` + +5. 调用CallableStatement的getInt方法获取输出参数。 + + ``` + int out = cstmt.getInt(4); //获取out参数 + ``` + + 示例: + + ``` + //在数据库中已创建了如下存储过程,它带有out参数。 + create or replace procedure testproc + ( + psv_in1 in integer, + psv_in2 in integer, + psv_inout in out integer + ) + as + begin + psv_inout := psv_in1 + psv_in2 + psv_inout; + end; + / + ``` + +6. 调用CallableStatement的close方法关闭调用语句。 + + ``` + cstmt.close(); + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 很多的数据库类如Connection、Statement和ResultSet都有close\(\)方法,在使用完对象后应把它们关闭。要注意的是,Connection的关闭将间接关闭所有与它关联的Statement,Statement的关闭间接关闭了ResultSet。 + >- 一些JDBC驱动程序还提供命名参数的方法来设置参数。命名参数的方法允许根据名称而不是顺序来设置参数,若参数有默认值,则可以不用指定参数值就可以使用此参数的默认值。即使存储过程中参数的顺序发生了变更,也不必修改应用程序。目前openGauss数据库的JDBC驱动程序不支持此方法。 + >- openGauss数据库不支持带有输出参数的函数,也不支持存储过程和函数参数默认值。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 当游标作为存储过程的返回值时,如果使用JDBC调用该存储过程,返回的游标将不可用。 + >- 存储过程不能和普通SQL在同一条语句中执行。 + + +## 执行批处理 + +用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: + +1. 调用Connection的prepareStatement方法创建预编译语句对象。 + + ``` + Connection conn = null; + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?)"); + ``` + +2. 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。 + + ``` + pstmt.setShort(1, (short)2); + pstmt.addBatch(); + ``` + +3. 调用PreparedStatement的executeBatch方法执行批处理。 + + ``` + int[] rowcount = pstmt.executeBatch(); + ``` + +4. 调用PreparedStatement的close方法关闭预编译语句对象。 + + ``` + pstmt.close(); + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >在实际的批处理过程中,通常不终止批处理程序的执行,否则会降低数据库的性能。因此在批处理程序时,应该关闭自动提交功能,每几行提交一次。关闭自动提交功能的语句为: conn.setAutoCommit\(false\); + + diff --git "a/content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\346\237\245\350\257\242\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\346\237\245\350\257\242\350\257\255\345\217\245.md" new file mode 100644 index 000000000..86b21e3e9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\346\237\245\350\257\242\350\257\255\345\217\245.md" @@ -0,0 +1,50 @@ +# 执行动态查询语句 + +介绍执行动态查询语句。openGauss提供两种方式:使用EXECUTE IMMEDIATE、OPEN FOR实现动态查询。前者通过动态执行SELECT语句,后者结合了游标的使用。当需要将查询的结果保存在一个数据集用于提取时,可使用OPEN FOR实现动态查询。 + +## EXECUTE IMMEDIATE + +语法图请参见[图1](#zh-cn_topic_0237122225_zh-cn_topic_0059778916_f67de6df4c6ef4404b41f0f30de36ee64)。 + +**图 1** EXECUTE IMMEDIATE dynamic\_select\_clause::= +![](figures/EXECUTE-IMMEDIATE-dynamic_select_clause.png "EXECUTE-IMMEDIATE-dynamic_select_clause") + +using\_clause子句的语法图参见[图2](#zh-cn_topic_0237122225_zh-cn_topic_0059778916_fcfce5c125aec449ba3ce27eec6f7a82b)。 + +**图 2** using\_clause::= +![](figures/using_clause.png "using_clause") + +对以上语法格式的解释如下: + +- define\_variable:用于指定存放单行查询结果的变量。 +- USING IN bind\_argument:用于指定存放传递给动态SQL值的变量,即在dynamic\_select\_string中存在占位符时使用。 +- USING OUT bind\_argument:用于指定存放动态SQL返回值的变量。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 查询语句中,into和out不能同时存在; + >- 占位符命名以“:”开始,后面可跟数字、字符或字符串,与USING子句的bind\_argument一一对应; + >- bind\_argument只能是值、变量或表达式,不能是表名、列名、数据类型等数据库对象,即不支持使用bind\_argument为动态SQL语句传递模式对象。如果存储过程需要通过声明参数传递数据库对象来构造动态SQL语句(常见于执行DDL语句时),建议采用连接运算符“||”拼接dynamic\_select\_clause; + >- 动态PL/SQL块允许出现重复的占位符,即相同占位符只能与USING子句的一个bind\_argument按位置对应。 + + +``` + +``` + +## OPEN FOR + +动态查询语句还可以使用OPEN FOR打开动态游标来执行。 + +语法参见[图3](#zh-cn_topic_0237122225_zh-cn_topic_0059778916_f3f108da94a694175ac707f4511b7f1a1)。 + +**图 3** open\_for::= +![](figures/open_for.png "open_for") + +参数说明: + +- cursor\_name:要打开的游标名。 +- dynamic\_string:动态查询语句。 +- USING value:在dynamic\_string中存在占位符时使用。 + +游标的使用请参考[游标](游标.md)。 + diff --git "a/content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\351\235\236\346\237\245\350\257\242\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\351\235\236\346\237\245\350\257\242\350\257\255\345\217\245.md" new file mode 100644 index 000000000..fb99ecd7f --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\211\247\350\241\214\345\212\250\346\200\201\351\235\236\346\237\245\350\257\242\350\257\255\345\217\245.md" @@ -0,0 +1,56 @@ +# 执行动态非查询语句 + +## 语法 + +语法请参见[图1](#zh-cn_topic_0237122226_zh-cn_topic_0059777751_f039af8fc76c54a54b06d579e56b81232)。 + +**图 1** noselect::= +![](figures/noselect.png "noselect") + +using\_clause子句的语法参见[图2](#zh-cn_topic_0237122226_zh-cn_topic_0059777751_fa52bfbcefb174772a5bd22ca73c6a03a)。 + +**图 2** using\_clause::= +![](figures/using_clause-0.png "using_clause-0") + +对以上语法格式的解释如下: + +USING IN bind\_argument用于指定存放传递给动态SQL值的变量,在dynamic\_noselect\_string中存在占位符时使用,即动态SQL语句执行时,bind\_argument将替换相对应的占位符。要注意的是,bind\_argument只能是值、变量或表达式,不能是表名、列名、数据类型等数据库对象。如果存储过程需要通过声明参数传递数据库对象来构造动态SQL语句(常见于执行DDL语句时),建议采用连接运算符“||”拼接dynamic\_select\_clause。另外,动态语句允许出现重复的占位符,相同占位符只能与唯一一个bind\_argument按位置一一对应。 + +## 示例 + +``` +--创建表 +postgres=# CREATE TABLE sections_t1 +( + section NUMBER(4) , + section_name VARCHAR2(30), + manager_id NUMBER(6), + place_id NUMBER(4) +); + +--声明变量 +postgres=# DECLARE + section NUMBER(4) := 280; + section_name VARCHAR2(30) := 'Info support'; + manager_id NUMBER(6) := 103; + place_id NUMBER(4) := 1400; + new_colname VARCHAR2(10) := 'sec_name'; +BEGIN +--执行查询 + EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :4)' + USING section, section_name, manager_id,place_id; +--执行查询(重复占位符) + EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :1)' + USING section, section_name, manager_id; +--执行ALTER语句(建议采用“||”拼接数据库对象构造DDL语句) + EXECUTE IMMEDIATE 'alter table sections_t1 rename section_name to ' || new_colname; +END; +/ + +--查询数据 +postgres=# SELECT * FROM sections_t1; + +--删除表 +postgres=# DROP TABLE sections_t1; +``` + diff --git "a/content/zh/docs/Developerguide/\346\211\251\345\261\225\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\345\207\275\346\225\260.md" index d50254e81..46f64501e 100644 --- "a/content/zh/docs/Developerguide/\346\211\251\345\261\225\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\345\207\275\346\225\260.md" @@ -1,9 +1,5 @@ # 扩展函数 -openGauss针对扩展数据类型,提供了一些对应的操作函数。这些操作函数依赖于扩展数据类型,目前处于Beta阶段,可能在功能上存在不稳定性,或者在后续版本发生变更。请在商用业务场景下谨慎使用,以免对正式业务系统的升级、扩容等方面产生不利影响。 - -该部分内容由GUC参数support\_extended\_features控制,请参见[support\_extended\_features](平台和客户端兼容性.md#zh-cn_topic_0237124738_zh-cn_topic_0059779195_s1b60ec6dbc79490bbadf5dd62ba2538c)进行配置。 - 下表列举了openGauss中支持的扩展函数,不作为商用特性交付,仅供参考。 diff --git "a/content/zh/docs/Developerguide/\346\211\251\345\261\225\350\257\255\346\263\225.md" "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\350\257\255\346\263\225.md" index 6d0368cfa..7688aefca 100644 --- "a/content/zh/docs/Developerguide/\346\211\251\345\261\225\350\257\255\346\263\225.md" +++ "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\350\257\255\346\263\225.md" @@ -15,23 +15,13 @@ openGauss提供了一些扩展语法,目前处于Beta阶段,仅供内部使 -   +

    创建表(CREATE TABLE)

    +

    INHERITS ( parent_table [, ... ] )

    是否支持继承表。

    -

    TO { GROUP groupname | NODE ( nodename [, ... ] ) }

    - -

    是否支持用TO NODE/GROUP指定表数据将要分布的数据节点列表。

    - - -

    column_constraint:

    -

    REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ][ ON DELETE action ] [ ON UPDATE action ]

    - -

    是否支持用REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] 为表创建外键约束。

    - -

    table_constraint:

    EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]

    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ]

    @@ -188,19 +178,6 @@ openGauss提供了一些扩展语法,目前处于Beta阶段,仅供内部使

    删除排序规则。

    -

    规则

    - -

    CREATE RULE

    - -

    创建规则。

    -

    规则是在指定表上执行指定动作的时候,将执行一些额外的动作。

    - - -

    DROP RULE

    - -

    删除规则。

    - -

    生成一个通知

    NOTIFY

    diff --git "a/content/zh/docs/Developerguide/\346\216\247\345\210\266\346\226\207\346\234\254\346\220\234\347\264\242.md" "b/content/zh/docs/Developerguide/\346\216\247\345\210\266\346\226\207\346\234\254\346\220\234\347\264\242.md" index 76bef3f61..d933f59b9 100644 --- "a/content/zh/docs/Developerguide/\346\216\247\345\210\266\346\226\207\346\234\254\346\220\234\347\264\242.md" +++ "b/content/zh/docs/Developerguide/\346\216\247\345\210\266\346\226\207\346\234\254\346\220\234\347\264\242.md" @@ -1,7 +1,5 @@ # 控制文本搜索 -为了执行全文搜索,必须有个函数创建来自文档的tsvector和来自用户查询的tsquery。同时,为了以有效的顺序返回结果,需要一个函数对比文档的查询相关性。同时,能很好地显示结果也是很重要的。openGauss支持所有这些函数。 - - **[解析文档](解析文档.md)** - **[解析查询](解析查询.md)** diff --git "a/content/zh/docs/Developerguide/\346\216\247\345\210\266\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\346\216\247\345\210\266\350\257\255\345\217\245.md" new file mode 100644 index 000000000..5e25628e0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\216\247\345\210\266\350\257\255\345\217\245.md" @@ -0,0 +1,17 @@ +# 控制语句 + +- **[返回语句](返回语句.md)** + +- **[条件语句](条件语句.md)** + +- **[循环语句](循环语句.md)** + +- **[分支语句](分支语句.md)** + +- **[空语句](空语句.md)** + +- **[错误捕获语句](错误捕获语句.md)** + +- **[GOTO语句](GOTO语句.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\223\215\344\275\234\345\256\241\350\256\241.md" "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\345\256\241\350\256\241.md" index 9b1690209..d0bf75353 100644 --- "a/content/zh/docs/Developerguide/\346\223\215\344\275\234\345\256\241\350\256\241.md" +++ "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\345\256\241\350\256\241.md" @@ -6,14 +6,14 @@ 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围:**整型,0~262143 +**取值范围:**整型,0~524287 - 0代表关闭openGauss数据库对象的CREATE、DROP、ALTER操作审计功能。 - 非0代表只审计openGauss的某类或者某些数据库对象的CREATE、DROP、ALTER操作。 **取值说明**: -该参数的值由18个二进制位的组合求出,这18个二进制位分别代表openGauss的18类数据库对象。如果对应的二进制位取值为0,表示不审计对应的数据库对象的CREATE、DROP、ALTER操作;取值为1,表示审计对应的数据库对象的CREATE、DROP、ALTER操作。这18个二进制位代表的具体审计内容请参见[表1](#zh-cn_topic_0237124747_zh-cn_topic_0059777487_zh-cn_topic_0058967566_table53712060)。 +该参数的值由19个二进制位的组合求出,这19个二进制位分别代表openGauss的19类数据库对象。如果对应的二进制位取值为0,表示不审计对应的数据库对象的CREATE、DROP、ALTER操作;取值为1,表示审计对应的数据库对象的CREATE、DROP、ALTER操作。这19个二进制位代表的具体审计内容请参见[表1](#zh-cn_topic_0237124747_zh-cn_topic_0059777487_zh-cn_topic_0058967566_table53712060)。 **默认值:**12295 @@ -239,14 +239,14 @@ **取值范围:**枚举型 -- A表示同a db兼容。 -- TD表示同Teradata兼容。 -- MYSQL表示同MySQL兼容。 +- A表示同A数据库兼容。 +- B表示同B数据库兼容。 +- C表示同C数据库兼容。 -**默认值:**MYSQL +**默认值:**A >![](public_sys-resources/icon-notice.gif) **须知:** ->在数据库中,该参数只能是确定的一个值,要么始终设置为ORA,要么始终设置为TD,不能随便改动,否则会导致数据库行为不一致。 +>在数据库中,该参数只能是确定的一个值,要么始终设置为A,要么始终设置为B,不能随便改动,否则会导致数据库行为不一致。 ## enableSeparationOfDuty @@ -304,7 +304,6 @@ **默认值:**off >![](public_sys-resources/icon-notice.gif) **须知:** ->用户在使用高级包UTL\_FILE访问服务器端文件时,要求必须拥有所指定的DIRECTORY对象的权限。 ->出于安全考虑,默认情况下,只有初始用户才能够创建、删除DIRECTORY对象。 ->如果开启了enable\_access\_server\_directory,那么在三权分立关闭时,系统管理员(包括初始用户)可以创建、删除DIRECTORY对象;而在三权分立开启时,只有初始用户可以创建、删除DIRECTORY对象。 +>- 出于安全考虑,默认情况下,只有初始用户才能够创建、删除DIRECTORY对象。 +>- 如果开启了enable\_access\_server\_directory,那么在三权分立关闭时,系统管理员(包括初始用户)可以创建、删除DIRECTORY对象;而在三权分立开启时,只有初始用户可以创建、删除DIRECTORY对象。 diff --git "a/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\254\246.md" index 2f924781f..55c79df90 100644 --- "a/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\254\246.md" @@ -78,5 +78,5 @@ postgres=# SELECT array[1,2] <@ '{1,2,3}' as "is subset"; ``` >![](public_sys-resources/icon-note.gif) **说明:** ->openGauss操作符表有几条记录对应于中缀操作符<@,但是只有两个可以在左侧接受一个整数数组的操作符是数组包含\(anyarray <@ anyarray\) 和范围包含\(anyelement <@ anyrange\)的。因为没有多态的伪类型\(参阅[伪类型](伪类型.md#ZH-CN_TOPIC_0242370425)\)是首选的,所以解析器不能解决这个基础上的歧义。然而,最后一个解析规则告诉用户,假设未知类型的文字是和另外一个输入相同的类型,也就是,整数数组。现在只有两个操作符中的一个可以匹配,所以选择数组包含。(如果用户选择了范围包含,用户将得到一个错误,因为字符串没有正确的格式成为范围的文字。) +>openGauss操作符表有几条记录对应于中缀操作符<@,但是只有两个可以在左侧接受一个整数数组的操作符是数组包含\(anyarray <@ anyarray\) 和范围包含\(anyelement <@ anyrange\)的。因为没有多态的伪类型\(参阅[伪类型](伪类型.md)\)是首选的,所以解析器不能解决这个基础上的歧义。然而,最后一个解析规则告诉用户,假设未知类型的文字是和另外一个输入相同的类型,也就是,整数数组。现在只有两个操作符中的一个可以匹配,所以选择数组包含。(如果用户选择了范围包含,用户将得到一个错误,因为字符串没有正确的格式成为范围的文字。) diff --git "a/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" new file mode 100644 index 000000000..ab956e0fe --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" @@ -0,0 +1,152 @@ +# 操作系统参数调优 + +在性能调优过程中,可以根据实际业务情况修改关键操作系统\(OS\)配置参数,以提升openGauss数据库的性能。 + +## 前提条件 + +需要用户使用gs\_check检查操作系统参数结果是否和建议值保持一致,如果不一致,用户可根据实际业务情况去手动修改。 + +## 内存相关参数设置 + +配置“sysctl.conf”文件,修改内存相关参数vm.extfrag\_threshold为1000(参考值),如果文件中没有内存相关参数,可以手动添加。 + +``` +vim /etc/sysctl.conf +``` + +修改完成后,请执行如下命令,使参数生效。 + +``` +sysctl -p +``` + +## 网络相关参数设置 + +- 配置“sysctl.conf”文件,修改网络相关参数,如果文件中没有网络相关参数,可以手动添加。详细说明请参见[表1](#zh-cn_topic_0237121493_zh-cn_topic_0073253550_zh-cn_topic_0040046482_table5597039720233)。 + + ``` + vim /etc/sysctl.conf + ``` + + 在修改完成后,请执行如下命令,使参数生效。 + + ``` + sysctl -p + ``` + + **表 1** 网络相关参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    参数名

    +

    参考值

    +

    说明

    +

    net.ipv4.tcp_timestamps

    +

    1

    +

    表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭,1表示打开。

    +

    net.ipv4.tcp_mem

    +

    94500000 915000000 927000000

    +

    第一个数字表示,当tcp使用的page少于 94500000 时,kernel不对其进行任何的干预。

    +

    第二个数字表示,当tcp使用的page超过 915000000 时,kernel会进入“memory pressure”压力模式。

    +

    第三个数字表示,当tcp使用的pages超过 927000000 时,就会报:Out of socket memory。

    +

    net.ipv4.tcp_max_orphans

    +

    3276800

    +

    最大孤儿套接字(orphan sockets)数。

    +

    net.ipv4.tcp_fin_timeout

    +

    60

    +

    表示系統默认的TIMEOUT时间。

    +

    net.ipv4.ip_local_port_range

    +

    26000 65535

    +

    TCP和UDP能够使用的port段。

    +
    + +- 设置10GE网卡最大传输单元(MTU),使用ifconfig命令设置。10GE网卡推荐设置为8192,可提升网络带宽利用率。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >在数据库节点配置参数设置comm\_tcp\_mode=false时,一定要保证各个openGauss的MTU大小相等,否则可能有通信问题。 + + 示例: + + ``` + #ifconfig ethx mtu 8192 + #ifconfig ethx + ethx Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX + inet addr:xxx.xxx.xxx.xxx Bcast:xxx.xxx.xxx.xxx Mask:xxx.xxx.xxx.0 + inet6 addr: fxxx::9xxx:bxxx:xxxa:1d18/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:8192 Metric:1 + RX packets:179849803 errors:0 dropped:0 overruns:0 frame:0 + TX packets:40492292 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:17952090386 (17120.4 Mb) TX bytes:171359670290 (163421.3 Mb) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- ethx为10GE数据库内部使用的业务网卡。 + >- 第一条命令设置MTU,第二条命令验证是否设置成功,粗体部分为MTU的值。 + >- 需使用root用户设置。 + +- 设置10GE网卡接收\(rx\)、发送队列\(tx\)长度,使用ethtool工具设置。10GE网卡推荐设置为4096,可提升网络带宽利用率。 + + 示例: + + ``` + # ethtool -G ethx rx 4096 tx 4096 + # ethtool -g ethx + Ring parameters for ethx: + Pre-set maximums: + RX: 4096 + RX Mini: 0 + RX Jumbo: 0 + TX: 4096 + Current hardware settings: + RX: 4096 + RX Mini: 0 + RX Jumbo: 0 + TX: 4096 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- ethx为10GE数据库内部使用的业务网卡。 + >- 第一条命令设置网卡接收、发送队列长度,第二条命令验证是否设置成功,示例的输出表示设置成功。 + >- 需使用root用户设置。 + + +## I/O相关参数设置 + +设置hugepage属性。在“/boot/grub/menu.lst”文件中第一个kernel行里追加下面参数,来关闭透明大页。 + +``` +transparent_hugepage=never +``` + +修改完成后,请执行如下命令,使参数生效。 + +``` +reboot +``` + diff --git "a/content/zh/docs/Developerguide/\346\225\260\345\200\274\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\346\225\260\345\200\274\347\261\273\345\236\213.md" index 21f95a6b9..41631533f 100644 --- "a/content/zh/docs/Developerguide/\346\225\260\345\200\274\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\346\225\260\345\200\274\347\261\273\345\236\213.md" @@ -44,7 +44,7 @@

    BINARY_INTEGER

    -

    常用的整数INTEGER的别名,为兼容A类型。

    +

    常用的整数INTEGER的别名。

    4字节

    @@ -57,7 +57,7 @@

    8字节

    -

    -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807

    +

    -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807

    @@ -142,7 +142,7 @@ postgres=# DROP TABLE int_type_t2;

    NUMBER[(p[,s])]

    -

    NUMERIC类型的别名,为兼容A数据类型。

    +

    NUMERIC类型的别名。

    用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

    @@ -355,7 +355,7 @@ postgres=# DROP TABLE bigserial_type_tab;

    BINARY_DOUBLE

    -

    是DOUBLE PRECISION的别名,为兼容A类型。

    +

    是DOUBLE PRECISION的别名。

    8字节

    diff --git "a/content/zh/docs/Developerguide/\346\225\260\345\255\227\346\223\215\344\275\234\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\346\225\260\345\255\227\346\223\215\344\275\234\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" index 706aadb91..5bccf2b26 100644 --- "a/content/zh/docs/Developerguide/\346\225\260\345\255\227\346\223\215\344\275\234\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\346\225\260\345\255\227\346\223\215\344\275\234\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -587,11 +587,7 @@ - mod\(x,y\) - 描述: - - x/y的余数(模) - - 如果x是0,则返回y。 + 描述:x/y的余数(模)。如果x是0,则返回0。 返回值类型:与参数类型相同。 diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\344\275\277\347\224\250.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\344\275\277\347\224\250.md" index 870831ade..e34896dcb 100644 --- "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\344\275\277\347\224\250.md" +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\344\275\277\347\224\250.md" @@ -16,6 +16,4 @@ - **[其他操作](其他操作.md)** -- **[附录](附录.md)** - diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\206\205\345\255\230\345\217\202\346\225\260\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\206\205\345\255\230\345\217\202\346\225\260\350\260\203\344\274\230.md" new file mode 100644 index 000000000..c03001b16 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\206\205\345\255\230\345\217\202\346\225\260\350\260\203\344\274\230.md" @@ -0,0 +1,26 @@ +# 数据库内存参数调优 + +数据库的复杂查询语句性能非常强的依赖于数据库系统内存的配置参数。数据库系统内存的配置参数主要包括逻辑内存管理的控制参数和执行算子是否下盘的参数。 + +## 逻辑内存管理参数 + +逻辑内存管理参数为max\_process\_memory,主要功能是控制数据库节点上可用内存的最大峰值,该参数的数值设置公式参考[max\_process\_memory](内存-21.md#zh-cn_topic_0237124699_zh-cn_topic_0059777577_sbebcee7acf2042dc8824982f22a2b4a8)。 + +执行作业最终可用的内存为: + +max\_process\_memory – shared memory \( 包括shared\_buffers \) – cstore\_buffers + +所以影响执行作业可用内存参数的主要两个参数为shared\_buffers及cstore\_buffers。 + +逻辑内存管理有专门的视图查询数据库节点中各大块内存区域已使用内存及峰值信息。可连接到单个数据库节点,通过“pg\_total\_memory\_detail”查询该节点上内存区域信息;或者连接到数据库主节点,通过“pgxc\_total\_memory\_detail”查询节点上内存区域信息。 + +参数work\_mem依据查询特点和并发来确定,一旦work\_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。 + +- 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work\_mem=50%内存/10。 +- 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work\_mem=50%内存/5。 +- 对于并发场景,建议work\_mem=串行下的work\_mem/物理并发数。 + +## 执行算子是否下盘的参数 + +参数work\_mem可以判断执行作业可下盘算子是否已使用内存量触发下盘点。当前可下盘算子有六类(向量化及非向量化共10种):Hash\(VecHashJoin\),Agg\(VecAgg\),Sort\(VecSort\),Material\(VecMaterial\),SetOp\(VecSetOp\),WindowAgg\(VecWindowAgg\)。该参数设置通常是一个权衡,即要保证并发的吞吐量,又要保证单查询作业的性能,故需要根据实际执行情况(结合Explain Performance输出)进行调优。 + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\230\237\345\210\227\345\217\202\346\225\260\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\230\237\345\210\227\345\217\202\346\225\260\350\260\203\344\274\230.md" new file mode 100644 index 000000000..14bb26ec0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\230\237\345\210\227\345\217\202\346\225\260\350\260\203\344\274\230.md" @@ -0,0 +1,20 @@ +# 数据库并发队列参数调优 + +数据库提供两种手段进行并发队列的控制,全局并发队列和局部并发队列。 + +## 全局并发队列 + +全局并发队列采用GUC参数max\_active\_statements控制数据库主节点上运行并发执行的作业数量。采用全局并发队列机制将控制所有普通用户的执行作业,不区分复杂度,即执行语句都将作为一个执行单元,当并发执行的作业数量达到此参数阈值时,将进入队列等待。对于管理员执行的作业,不走全局并发控制逻辑。 + +设置该GUC参数数值时,需要考虑系统的承受能力,主要关注内存的使用情况及IO的使用情况,综合判断。若普通用户关联资源池,并且资源池中的优先级比例不同,全局并发队列在数据库内部将使用两维队列,即优先级高低排队和同一优先级进行排队。在唤醒时,将优先唤醒高优先级队列的作业。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 在事务类大并发业务场景下,参数max\_active\_statements建议设置为-1,即不限制全局并发数。 +>- 在分析类查询的场景下,参数max\_active\_statements的值设置为CPU的核数除以数据库节点个数,一般可以设置5\~8个。 + +## 局部并发队列 + +采用资源池局部并发控制机制的目的是控制在数据库主节点上同一资源池内的并发作业数量。局部并发控制机制根据执行作业的cost,控制复杂查询的并发作业数量。 + +参数parctl\_min\_cost数值用于判断执行作业是否是复杂作业。 + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" new file mode 100644 index 000000000..52761aeae --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\202\346\225\260\350\260\203\344\274\230.md" @@ -0,0 +1,9 @@ +# 数据库系统参数调优 + +为了保证数据库尽可能高性能地运行,建议依据硬件资源情况和业务实际进行数据库系统参数——GUC参数的设置。这里主要介绍GUC参数对性能的影响,关于参数的详细设置方法请参见"管理员指南"。 + +- **[数据库内存参数调优](数据库内存参数调优.md)** + +- **[数据库并发队列参数调优](数据库并发队列参数调优.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213-19.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213-19.md" new file mode 100644 index 000000000..08c73322f --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213-19.md" @@ -0,0 +1,4 @@ +# 数据类型 + +数据类型是一组值的集合以及定义在这个值集上的一组操作。openGauss数据库是由表的集合组成的,而各表中的列定义了该表,每一列都属于一种数据类型,openGauss根据数据类型有相应函数对其内容进行操作,例如openGauss可对数值型数据进行加、减、乘、除操作。 + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213.md" index 00ca1532c..3021cc183 100644 --- "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -1,8 +1,6 @@ # 数据类型 -数据类型是数据的一个基本属性,用于区分不同类型的数据。不同的数据类型所占的存储空间不同,能够进行的操作也不相同。数据库中的数据存储在数据表中。数据表中的每一列都定义了数据类型,用户存储数据时,须遵从这些数据类型的属性,否则可能会出错。 - -openGauss支持某些数据类型间的隐式转换,具体转化关系请参见[PG\_CAST](PG_CAST.md#ZH-CN_TOPIC_0242385803)。 +openGauss支持某些数据类型间的隐式转换,具体转化关系请参见[PG\_CAST](PG_CAST.md)。 - **[数值类型](数值类型.md)** diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213\350\275\254\346\215\242.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213\350\275\254\346\215\242.md" new file mode 100644 index 000000000..1ac534ef7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213\350\275\254\346\215\242.md" @@ -0,0 +1,156 @@ +# 数据类型转换 + +数据库中允许有些数据类型进行隐式类型转换(赋值、函数调用的参数等),有些数据类型间不允许进行隐式数据类型转换,可尝试使用openGauss提供的类型转换函数,例如CAST进行数据类型强转。 + +openGauss数据库常见的隐式类型转换,请参见[表1](#zh-cn_topic_0237122212_zh-cn_topic_0059778807_tbc67231ae8bc4ca484efaebd2629a0e4)。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss支持的DATE的效限范围是:公元前4713年到公元294276年。 + +**表 1** 隐式类型转换表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    原始数据类型

    +

    目标数据类型

    +

    备注

    +

    CHAR

    +

    VARCHAR2

    +

    -

    +

    CHAR

    +

    NUMBER

    +

    原数据必须由数字组成。

    +

    CHAR

    +

    DATE

    +

    原数据不能超出合法日期范围。

    +

    CHAR

    +

    RAW

    +

    -

    +

    CHAR

    +

    CLOB

    +

    -

    +

    VARCHAR2

    +

    CHAR

    +

    -

    +

    VARCHAR2

    +

    NUMBER

    +

    原数据必须由数字组成。

    +

    VARCHAR2

    +

    DATE

    +

    原数据不能超出合法日期范围。

    +

    VARCHAR2

    +

    CLOB

    +

    -

    +

    NUMBER

    +

    CHAR

    +

    -

    +

    NUMBER

    +

    VARCHAR2

    +

    -

    +

    DATE

    +

    CHAR

    +

    -

    +

    DATE

    +

    VARCHAR2

    +

    -

    +

    RAW

    +

    CHAR

    +

    -

    +

    RAW

    +

    VARCHAR2

    +

    -

    +

    CLOB

    +

    CHAR

    +

    -

    +

    CLOB

    +

    VARCHAR2

    +

    -

    +

    CLOB

    +

    NUMBER

    +

    原数据必须由数字组成。

    +

    INT4

    +

    CHAR

    +

    -

    +
    + diff --git "a/content/zh/docs/Developerguide/\346\225\260\347\273\204.md" "b/content/zh/docs/Developerguide/\346\225\260\347\273\204.md" new file mode 100644 index 000000000..db49de030 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\347\273\204.md" @@ -0,0 +1,29 @@ +# 数组 + +## 数组类型的使用 + +在使用数组之前,需要自定义一个数组类型。 + +在存储过程中紧跟AS关键字后面定义数组类型。定义方法为: + +``` +TYPE array_type IS VARRAY(size) OF data_type; +``` + +其中: + +- array\_type:要定义的数组类型名。 +- VARRAY:表示要定义的数组类型。 +- size:取值为正整数,表示可以容纳的成员的最大数量。 +- data\_type:要创建的数组中成员的类型。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 在openGauss中,数组会自动增长,访问越界会返回一个NULL,不会报错。 +>- 在存储过程中定义的数组类型,其作用域仅在该存储过程中。 +>- 建议选择上述定义方法的一种来自定义数组类型,当同时使用两种方法定义同名的数组类型时,openGauss会优先选择存储过程中定义的数组类型来声明数组变量。 + +openGauss支持使用圆括号来访问数组元素,且还支持一些特有的函数,如extend,count,first,last来访问数组的内容。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>存储过程中如果有DML语句(SELECT、UPDATE、INSERT、DELETE),DML语句只能使用中括号来访问数组元素,从而和函数表达式区分开。 + diff --git "a/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" index 9b9bd3227..cffe252cb 100644 --- "a/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -255,7 +255,7 @@ - array\_dims\(anyarray\) - 描述:返回数组维数的文本表示。 + 描述:返回数组各个维度中的低位下标值和高位下标值。 返回类型:text @@ -271,7 +271,7 @@ - array\_length\(anyarray, int\) - 描述:返回数组维度的长度。 + 描述:返回指定数组维度的长度。int为指定数组维度。 返回类型:int @@ -283,11 +283,17 @@ -------- 3 (1 row) + + postgres=# SELECT array_length(array[[1,2,3],[4,5,6]], 2) AS RESULT; + result + -------- + 3 + (1 row) ``` - array\_lower\(anyarray, int\) - 描述:返回数组维数的下界。 + 描述:返回指定数组维数的下界。int为指定数组维度。 返回类型:int @@ -303,7 +309,7 @@ - array\_upper\(anyarray, int\) - 描述:返回数组维数的上界。 + 描述:返回指定数组维数的上界。int为指定数组维度。 返回类型:int diff --git "a/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\222\214record.md" "b/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\222\214record.md" new file mode 100644 index 000000000..3e765d0d4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\347\273\204\345\222\214record.md" @@ -0,0 +1,7 @@ +# 数组和record + +- **[数组](数组.md)** + +- **[record](record.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\227\245\345\277\227\345\233\236\346\224\276.md" "b/content/zh/docs/Developerguide/\346\227\245\345\277\227\345\233\236\346\224\276.md" index 6adfc4e08..8bd7c98c6 100644 --- "a/content/zh/docs/Developerguide/\346\227\245\345\277\227\345\233\236\346\224\276.md" +++ "b/content/zh/docs/Developerguide/\346\227\245\345\277\227\345\233\236\346\224\276.md" @@ -28,11 +28,11 @@ 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 -**取值范围**:整型,0\~16 +**取值范围**:整型,1\~16 -0是指不开极致RTO,1\~16是指开极致RTO。需要配合recovery\_redo\_workers使用。若同时开启recovery\_parse\_workers和recovery\_max\_workers,以开启极致RTO的recovery\_parse\_workers为准,并行回放特性失效。 +仅在开启极致RTO情况下可以设置recovery\_parse\_workers为\>1。需要配合recovery\_redo\_workers使用。若同时开启recovery\_parse\_workers和recovery\_max\_workers,以开启极致RTO的recovery\_parse\_workers为准,并行回放特性失效。因极致RTO不支持hot standby模式和主备从模式, 仅在参数[hot\_standby](备服务器.md#zh-cn_topic_0237124714_zh-cn_topic_0059778071_sa43017102b08472cb160e9f856e664bd)设置成off,[replication\_type](openGauss事务.md#zh-cn_topic_0237124741_section94292665717)设置成1时可以设置recovery\_parse\_workers为\>1。另外,极致RTO也不支持列存,在已经使用列存表或者即将使用列存表的系统中,请关闭极致RTO. -**默认值:**0 +**默认值:**1 ## recovery\_redo\_workers @@ -42,9 +42,7 @@ **取值范围**:整型,1\~8 -需要配合recovery\_parse\_workers使用。recovery\_redo\_workers是极致RTO特性中每个ParseRedoRecord线程对应的PageRedoWorker线程数量。在配合recovery\_parse\_workers使用时,只有recovery\_parse\_workers大于0 - -recovery\_redo\_workers参数才生效。 +需要配合recovery\_parse\_workers使用。在配合recovery\_parse\_workers使用时,只有recovery\_parse\_workers大于0,recovery\_redo\_workers参数才生效。 **默认值:**1 diff --git "a/content/zh/docs/Developerguide/\346\227\245\346\234\237-\346\227\266\351\227\264\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\346\227\245\346\234\237-\346\227\266\351\227\264\347\261\273\345\236\213.md" index 0975a590e..28c683de9 100644 --- "a/content/zh/docs/Developerguide/\346\227\245\346\234\237-\346\227\266\351\227\264\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\346\227\245\346\234\237-\346\227\266\351\227\264\347\261\273\345\236\213.md" @@ -66,7 +66,7 @@ openGauss支持的日期/时间类型请参见[表1](#zh-cn_topic_0237121952_zh-

    INTERVAL DAY (l) TO SECOND (p)

    时间间隔,X天X小时X分X秒。

    -
    • l:天数的精度,取值范围为0~6。为适配A语法,未实现具体功能。
    • p:秒数的精度,取值范围为0~6。小数末尾的零不显示。
    +
    • l:天数的精度,取值范围为0~6。兼容性考虑,目前未实现具体功能。
    • p:秒数的精度,取值范围为0~6。小数末尾的零不显示。

    16字节

    diff --git "a/content/zh/docs/Developerguide/\346\227\266\351\227\264\345\222\214\346\227\245\346\234\237\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\346\227\266\351\227\264\345\222\214\346\227\245\346\234\237\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" index 59123b7df..b8888a9f5 100644 --- "a/content/zh/docs/Developerguide/\346\227\266\351\227\264\345\222\214\346\227\245\346\234\237\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\346\227\266\351\227\264\345\222\214\346\227\245\346\234\237\345\244\204\347\220\206\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -498,7 +498,7 @@ 描述:将数字转换为interval类型。num为numeric类型数字,interval\_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 - 可以通过设置参数[IntervalStyle](区域和格式化.md#zh-cn_topic_0237124733_zh-cn_topic_0059778109_s89302a8dcd7f46ecb7167574d6397dc0)为a,兼容该函数在A DB中的interval输出格式。 + 可以通过设置参数[IntervalStyle](区域和格式化.md#zh-cn_topic_0237124733_zh-cn_topic_0059778109_s89302a8dcd7f46ecb7167574d6397dc0)为a,兼容该函数interval输出格式。 示例: @@ -648,11 +648,14 @@ ``` -## TIMESTAMPDIFF +## TIMESTAMPDIFF **TIMESTAMPDIFF\(**_unit , timestamp\_expr1, timestamp\_expr2_**\)** -timestampdiff函数是计算两个日期时间之间\(timestamp\_expr2-timestamp\_expr1\)的差值,并以unit形式范围结果。timestamp\_expr1,timestamp\_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。extract函数返回类型为int64的数值。unit的取值范围如下所示。 +timestampdiff函数是计算两个日期时间之间\(timestamp\_expr2-timestamp\_expr1\)的差值,并以unit形式返回结果。timestamp\_expr1,timestamp\_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>该函数仅在openGauss兼容MY类型时(即dbcompatibility = 'B')有效,其他类型不支持该函数。 - year diff --git "a/content/zh/docs/Developerguide/\346\230\276\345\274\217\346\270\270\346\240\207.md" "b/content/zh/docs/Developerguide/\346\230\276\345\274\217\346\270\270\346\240\207.md" new file mode 100644 index 000000000..7d4c9236e --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\230\276\345\274\217\346\270\270\346\240\207.md" @@ -0,0 +1,81 @@ +# 显式游标 + +显式游标主要用于对查询语句的处理,尤其是在查询结果为多条记录的情况下。 + +## 处理步骤 + +显式游标处理需六个PL/SQL步骤: + +1. **定义静态游标:**就是定义一个游标名,以及与其相对应的SELECT语句。 + + 定义静态游标的语法图,请参见[图1](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_f3cd97ed9f2474aa785f5626e468a75de)。 + + **图 1** static\_cursor\_define::= + ![](figures/static_cursor_define.jpg "static_cursor_define") + + 参数说明: + + - cursor\_name:定义的游标名。 + - parameter:游标参数,只能为输入参数,其格式为: + + ``` + parameter_name datatype + ``` + + - select\_statement:查询语句。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >根据执行计划的不同,系统会自动判断该游标是否可以用于以倒序的方式检索数据行。 + + **定义动态游标:**指ref游标,可以通过一组静态的SQL语句动态的打开游标。首先定义ref游标类型,然后定义该游标类型的游标变量,在打开游标时通过OPEN FOR动态绑定SELECT语句。 + + 定义动态游标的语法图,请参见[图2](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_f1579c1867b984124b10da33d032a55b0)和[图3](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_fceaf870eaa73494496e8a65e7afc8cec)。 + + **图 2** cursor\_typename::= + ![](figures/cursor_typename.png "cursor_typename") + + **图 3** dynamic\_cursor\_define::= + ![](figures/dynamic_cursor_define.png "dynamic_cursor_define") + +2. **打开静态游标:**就是执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN语句还将锁定数据库表中游标结果集合对应的数据行。 + + 打开静态游标的语法图,请参见[图4](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_fac5b397fa6184f35a416626255a9280d)。 + + **图 4** open\_static\_cursor::= + ![](figures/open_static_cursor.png "open_static_cursor") + + **打开动态游标:**可以通过OPEN FOR语句打开动态游标,动态绑定SQL语句。 + + 打开动态游标的语法图,请参见[图5](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_f8e95270034c744b3bec53bd78cf56a22)。 + + **图 5** open\_dynamic\_cursor::= + ![](figures/open_dynamic_cursor.png "open_dynamic_cursor") + + PL/SQL程序不能用OPEN语句重复打开一个游标。 + +3. 提取游标数据:检索结果集合中的数据行,放入指定的输出变量中。 + + 提取游标数据的语法图,请参见[图6](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_f0759ffa7118d4c4481c0f0fd9a600351)。 + + **图 6** fetch\_cursor::= + ![](figures/fetch_cursor.png "fetch_cursor") + +4. 对该记录进行处理。 +5. 继续处理,直到活动集合中没有记录。 +6. 关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH语句获取其中数据。关闭后的游标可以使用OPEN语句重新打开。 + + 关闭游标的语法图,请参见[图7](#zh-cn_topic_0237122244_zh-cn_topic_0059778930_fdd13133c237949828f65e55cb3ec2f5b)。 + + **图 7** close\_cursor::= + ![](figures/close_cursor.jpg "close_cursor") + + +## 属性 + +游标的属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。显式游标的属性为: + +- %FOUND布尔型属性:当最近一次读记录时成功返回,则值为TRUE。 +- %NOTFOUND布尔型属性:与%FOUND相反。 +- %ISOPEN布尔型属性:当游标已打开时返回TRUE。 +- %ROWCOUNT数值型属性:返回已从游标中读取的记录数。 + diff --git "a/content/zh/docs/Developerguide/\346\233\264\346\226\260\347\273\237\350\256\241\344\277\241\346\201\257.md" "b/content/zh/docs/Developerguide/\346\233\264\346\226\260\347\273\237\350\256\241\344\277\241\346\201\257.md" new file mode 100644 index 000000000..ce0e54130 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\233\264\346\226\260\347\273\237\350\256\241\344\277\241\346\201\257.md" @@ -0,0 +1,41 @@ +# 更新统计信息 + +在数据库中,统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造成执行计划严重劣化,从而导致性能问题。 + +## 背景信息 + +ANALYZE语句可收集与数据库中表内容相关的统计信息,统计结果存储在系统表PG\_STATISTIC中。查询优化器会使用这些统计数据,以生成最有效的执行计划。 + +建议在执行了大批量插入/删除操作后,例行对表或全库执行ANALYZE语句更新统计信息。目前默认收集统计信息的采样比例是30000行(即:guc参数default\_statistics\_target默认设置为100),如果表的总行数超过一定行数(大于1600000),建议设置guc参数default\_statistics\_target为-2,即按2%收集样本估算统计信息。 + +对于在批处理脚本或者存储过程中生成的中间表,也需要在完成数据生成之后显式的调用ANALYZE。 + +对于表中多个列有相关性且查询中有同时基于这些列的条件或分组操作的情况,可尝试收集多列统计信息,以便查询优化器可以更准确地估算行数,并生成更有效的执行计划。 + +## 操作步骤 + +使用以下命令更新某个表或者整个database的统计信息。 + +``` +ANALYZE tablename; --更新单个表的统计信息 +ANALYZE; --更新全库的统计信息 +``` + +使用以下命令进行多列统计信息相关操作。 + +``` +ANALYZE tablename ((column_1, column_2)); --收集tablename表的column_1、column_2列的多列统计信息 + +ALTER TABLE tablename ADD STATISTICS ((column_1, column_2)); --添加tablename表的column_1、column_2列的多列统计信息声明 +ANALYZE tablename; --收集单列统计信息,并收集已声明的多列统计信息 + +ALTER TABLE tablename DELETE STATISTICS ((column_1, column_2)); --删除tablename表的column_1、column_2列的多列统计信息或其声明 +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** +>在使用ALTER TABLE tablename ADD STATISTICS语句添加了多列统计信息声明后,系统并不会立刻收集多列统计信息,而是在下次对该表或全库进行ANALYZE时,进行多列统计信息的收集。 +>如果想直接收集多列统计信息,请使用ANALYZE命令进行收集。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>使用EXPLAIN查看各SQL的执行计划时,如果发现某个表SEQ SCAN的输出中rows=10,rows=10是系统给的默认值,有可能该表没有进行ANALYZE,需要对该表执行ANALYZE。 + diff --git "a/content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-11.md" "b/content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-4.md" similarity index 100% rename from "content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-11.md" rename to "content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-4.md" diff --git "a/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217\345\207\275\346\225\260.md" index 502825577..a29a94530 100644 --- "a/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217\345\207\275\346\225\260.md" @@ -105,26 +105,6 @@ 备注:参数expr1和expr2可以为任意类型,当NVL的两个参数不属于同类型时,看第二个参数是否可以向第一个参数进行隐式转换,如果可以则返回第一个参数类型。如果第二个参数不能向第一个参数进行隐式转换而第一个参数可以向第二个参数进行隐式转换,则返回第二个参数的类型。如果两个参数之间不存在隐式类型转换并且也不属于同一类型则报错。 -- sys\_context\( 'namespace' , 'parameter'\) - - 描述:获取并返回指定namespace下参数parameter的值。 - - 返回值类型:VARCHAR - - 示例: - - ``` - postgres=# SELECT sys_context('USERENV', 'CURRENT_SCHEMA'); - sys_context - ------------- - public - (1 row) - ``` - - 根据当前所在的实际schema而变化。 - - 备注:目前仅支持SYS\_CONTEXT\('USERENV', 'CURRENT\_SCHEMA'\) 和SYS\_CONTEXT\('USERENV', 'CURRENT\_USER'\)两种格式。 - - greatest\(expr1 \[, ...\]\) 描述:获取并返回参数列表中值最大的表达式的值。 @@ -188,6 +168,4 @@ postgres=# DROP TABLE blob_tb; ``` - 备注:使用DBMS.GETLENGTH求得的长度为0。 - diff --git "a/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\257\255\345\217\245.md" new file mode 100644 index 000000000..10f8e8e8a --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\257\255\345\217\245.md" @@ -0,0 +1,102 @@ +# 条件语句 + +条件语句的主要作用判断参数或者语句是否满足已给定的条件,根据判定结果执行相应的操作。 + +openGauss有五种形式的IF: + +- IF\_THEN + + **图 1** IF\_THEN::= + ![](figures/IF_THEN.jpg "IF_THEN") + + IF\_THEN语句是IF的最简单形式。如果条件为真,statements将被执行。否则,将忽略它们的结果使该IF\_THEN语句执行结束。 + + **示例** + + ``` + postgres=# IF v_user_id <> 0 THEN + UPDATE users SET email = v_email WHERE user_id = v_user_id; + END IF; + ``` + +- IF\_THEN\_ELSE + + **图 2** IF\_THEN\_ELSE::= + ![](figures/IF_THEN_ELSE.jpg "IF_THEN_ELSE") + + IF\_THEN\_ELSE语句增加了ELSE的分支,可以声明在条件为假的时候执行的语句。 + + **示例** + + ``` + postgres=# IF parentid IS NULL OR parentid = '' + THEN + RETURN; + ELSE + hp_true_filename(parentid);--表示调用存储过程 + END IF; + ``` + +- IF\_THEN\_ELSE IF + + IF语句可以嵌套,嵌套方式如下: + + ``` + postgres=# IF sex = 'm' THEN + pretty_sex := 'man'; + ELSE + IF sex = 'f' THEN + pretty_sex := 'woman'; + END IF; + END IF; + ``` + + 这种形式实际上就是在一个IF语句的ELSE部分嵌套了另一个IF语句。因此需要一个END IF语句给每个嵌套的IF,另外还需要一个END IF语句结束父IF-ELSE。如果有多个选项,可使用下面的形式。 + +- IF\_THEN\_ELSIF\_ELSE + + **图 3** IF\_THEN\_ELSIF\_ELSE::= + ![](figures/IF_THEN_ELSIF_ELSE.png "IF_THEN_ELSIF_ELSE") + + **示例** + + ``` + IF number_tmp = 0 THEN + result := 'zero'; + ELSIF number_tmp > 0 THEN + result := 'positive'; + ELSIF number_tmp < 0 THEN + result := 'negative'; + ELSE + result := 'NULL'; + END IF; + ``` + +- IF\_THEN\_ELSEIF\_ELSE + + ELSEIF是ELSIF的别名。 + + 综合示例 + + ``` + CREATE OR REPLACE PROCEDURE proc_control_structure(i in integer) + AS + BEGIN + IF i > 0 THEN + raise info 'i:% is greater than 0. ',i; + ELSIF i < 0 THEN + raise info 'i:% is smaller than 0. ',i; + ELSE + raise info 'i:% is equal to 0. ',i; + END IF; + RETURN; + END; + / + + CALL proc_control_structure(3); + + --删除存储过程 + DROP PROCEDURE proc_control_structure; + ``` + + diff --git "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\256\241\350\256\241\347\273\223\346\236\234.md" "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\256\241\350\256\241\347\273\223\346\236\234.md" index 97d685582..8b13bbdcf 100644 --- "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\256\241\350\256\241\347\273\223\346\236\234.md" +++ "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\256\241\350\256\241\347\273\223\346\236\234.md" @@ -9,7 +9,7 @@ ## 背景信息 -- 只有拥有AUDITADMIN属性的用户才可以查看审计记录。有关数据库用户及创建用户的办法请参见[用户](用户.md#ZH-CN_TOPIC_0246507961)。 +- 只有拥有AUDITADMIN属性的用户才可以查看审计记录。有关数据库用户及创建用户的办法请参见[用户](用户.md)。 - 审计查询命令是数据库提供的sql函数pg\_query\_audit,其原型为: ``` @@ -18,12 +18,6 @@ 参数startime和endtime分别表示审计记录的开始时间和结束时间,audit\_log表示所查看的审计日志信息所在的物理文件路径,当不指定audit\_log时,默认查看连接当前实例的审计日志信息。 - 通过sql函数pgxc\_query\_audit可以查询数据库主节点的审计日志,其原型为: - - ``` - pgxc_query_audit(timestamptz startime,timestamptz endtime) - ``` - >![](public_sys-resources/icon-note.gif) **说明:** >startime和endtime的差值代表要查询的时间段,其有效值为从startime日期中的00:00:00开始到endtime日期中的23:59:59之间的任何值。请正确指定这两个参数,否则将查不到需要的审计信息。 @@ -42,7 +36,7 @@ 连接成功后,系统显示类似如下信息: ``` - gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -65,28 +59,4 @@ 该条记录表明,用户omm在2015-07-15 08:03:55+08登录数据库postgres。其中client\_conninfo字段在log\_hostname启动且IP连接时,字符@后显示反向DNS查找得到的主机名。 -4. 查询数据库主节点审计记录。 - - ``` - postgres=# SELECT * FROM pgxc_query_audit('2019-01-10 17:00:00','2019-01-10 19:00:00') where type = 'login_success' and username = 'user1'; - ``` - - 查询结果如下: - - ``` - time | type | result | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | - local_port | remote_port - ------------------------+---------------+--------+----------+----------+-----------------+-------------+------------------------------------------------------+--------------+---------------------------------+- - -----------+------------- - 2019-01-10 18:06:08+08 | login_success | ok | user1 | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:user1 | coordinator1 | 139965149210368@600429968516954 | - 17560 | null - 2019-01-10 18:06:22+08 | login_success | ok | user1 | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:user1 | coordinator1 | 139965149210368@600429982697548 | - 17560 | null - 2019-01-10 18:06:54+08 | login_success | ok | user1 | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:user1 | coordinator2 | 140677694355200@600430014804280 | - 17562 | null - (3 rows) - ``` - - 查询结果显示,用户user1在数据库主节点1和数据库主节点2的成功登录记录。 - diff --git "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260-5.md" "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260-5.md" deleted file mode 100644 index 02527318a..000000000 --- "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260-5.md" +++ /dev/null @@ -1,116 +0,0 @@ -# 查看数据库连接数 - -## 背景信息 - -当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 - -- 全局的最大连接数:由运行参数max\_connections指定,默认值为800。 -- 某用户的连接数:在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。 -- 某数据库的连接数:在创建数据库时,由CREATE DATABASE的CONNECTION LIMIT connlimit参数指定。 -- 预留连接供gs\_clean使用:需要预留连接给gs\_clean工具进行残留事务清理,以免由于残留事务长期阻塞系统正常运行。 - -## 操作步骤 - -1. 以操作系统用户omm登录数据库主节点。 -2. 使用如下命令连接数据库。 - - ``` - gsql -d postgres -p 8000 - ``` - - postgres为需要连接的数据库名称,8000为数据库主节点的端口号。 - - 连接成功后,系统显示类似如下信息: - - ``` - gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 - Non-SSL connection (SSL connection is recommended when requiring high-security) - Type "help" for help. - - postgres=# - ``` - -3. 查看全局会话连接数限制。 - - ``` - postgres=# SHOW max_connections; - max_connections - ----------------- - 800 - (1 row) - ``` - - 其中800是最大会话连接数。 - -4. 查看已使用的会话连接数。 - - 具体命令请参见[表1](#zh-cn_topic_0237121094_zh-cn_topic_0059779140_t608a1965463e41f1b6eacd02f97a65ba)。 - - >![](public_sys-resources/icon-notice.gif) **须知:** - >除了创建的时候用双引号引起的数据库和用户名称外,以下命令中用到的数据库名称和用户名称,其中包含的英文字母必须使用小写。 - - **表 1** 查看会话连接数 - - - - - - - - - - - - - - - - - - - - - - -

    描述

    -

    命令

    -

    查看指定用户的会话连接数上限。

    -

    执行如下命令查看连接到指定用户omm的会话连接数上限。其中-1表示没有对用户omm设置连接数的限制。

    -
    postgres=# SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='omm';
    -     rolname  | rolconnlimit
    -    ----------+--------------
    -     omm |           -1
    -    (1 row)
    -

    查看指定用户已使用的会话连接数。

    -

    执行如下命令查看指定用户omm已使用的会话连接数。其中,1表示omm已使用的会话连接数。

    -
    postgres=# SELECT COUNT(*) FROM V$SESSION WHERE USERNAME='omm';
    -    
    -     count
    -    -------
    -         1
    -    (1 row)
    -

    查看指定数据库的会话连接数上限。

    -

    执行如下命令查看连接到指定数据库postgres的会话连接数上限。其中-1表示没有对数据库postgres设置连接数的限制。

    -
    postgres=# SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='postgres';
    -    
    -     datname  | datconnlimit
    -    ----------+--------------
    -     postgres |           -1
    -    (1 row)
    -

    查看指定数据库已使用的会话连接数。

    -

    执行如下命令查看指定数据库postgres上已使用的会话连接数。其中,1表示数据库postgres上已使用的会话连接数。

    -
    postgres=# SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='postgres';
    -     count 
    -    -------
    -         1
    -    (1 row)
    -

    查看所有用户已使用会话连接数。

    -

    执行如下命令查看所有用户已使用的会话连接数。

    -
    postgres=# SELECT COUNT(*) FROM V$SESSION;
    -     count
    -    -------
    -         10
    -    (1 row)
    -
    - - diff --git "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260.md" "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260.md" index 0f2bd5f17..7fc57be61 100644 --- "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260.md" @@ -1,10 +1,10 @@ -# 查看数据库连接数 +# 查看数据库连接数 ## 背景信息 当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 -- 全局的最大连接数:由运行参数max\_connections指定,默认值为800。 +- 全局的最大连接数:由运行参数max\_connections指定,默认值为5000。 - 某用户的连接数:在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。 - 某数据库的连接数:在创建数据库时,由CREATE DATABASE的CONNECTION LIMIT connlimit参数指定。 @@ -22,7 +22,7 @@ 连接成功后,系统显示类似如下信息: ``` - gsql ((openGauss 1.0.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -70,7 +70,16 @@

    查看指定用户已使用的会话连接数。

    执行如下命令查看指定用户omm已使用的会话连接数。其中,1表示omm已使用的会话连接数。

    -
    postgres=# SELECT COUNT(*) FROM V$SESSION WHERE USERNAME='omm';
    +    
    postgres=# CREATE OR REPLACE VIEW DV_SESSIONS AS
    +    	       SELECT
    +    		    sa.sessionid AS SID,
    +    		    0::integer AS SERIAL#,
    +    		    sa.usesysid AS USER#,
    +    		    ad.rolname AS USERNAME
    +    	        FROM pg_stat_get_activity(NULL) AS sa
    +    	        LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid)
    +    	        WHERE sa.application_name <> 'JobScheduler';
    +    postgres=# SELECT COUNT(*) FROM DV_SESSIONS WHERE USERNAME='omm';
         
          count
         -------
    @@ -102,7 +111,16 @@
         

    查看所有用户已使用会话连接数。

    执行如下命令查看所有用户已使用的会话连接数。

    -
    postgres=# SELECT COUNT(*) FROM V$SESSION;
    +    
    postgres=# CREATE OR REPLACE VIEW DV_SESSIONS AS
    +    	       SELECT
    +    		    sa.sessionid AS SID,
    +    		    0::integer AS SERIAL#,
    +    		    sa.usesysid AS USER#,
    +    		    ad.rolname AS USERNAME
    +    	        FROM pg_stat_get_activity(NULL) AS sa
    +    	        LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid)
    +    	        WHERE sa.application_name <> 'JobScheduler';
    +    postgres=# SELECT COUNT(*) FROM DV_SESSIONS;
          count
         -------
              10
    diff --git "a/content/zh/docs/Developerguide/\346\237\245\350\257\242\345\222\214\347\264\242\345\274\225\347\273\237\350\256\241\346\224\266\351\233\206\345\231\250.md" "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\345\222\214\347\264\242\345\274\225\347\273\237\350\256\241\346\224\266\351\233\206\345\231\250.md"
    index 016385ebb..f6ced43a1 100644
    --- "a/content/zh/docs/Developerguide/\346\237\245\350\257\242\345\222\214\347\264\242\345\274\225\347\273\237\350\256\241\346\224\266\351\233\206\345\231\250.md"
    +++ "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\345\222\214\347\264\242\345\274\225\347\273\237\350\256\241\346\224\266\351\233\206\345\231\250.md"
    @@ -56,7 +56,7 @@
     **取值范围:**枚举类型
     
     -   pl表示只追踪过程语言函数。
    --   all表示追踪SQL和C语言函数。
    +-   all表示追踪SQL语言函数。
     -   none表示关闭函数追踪功能。
     
     **默认值:**none
    @@ -137,8 +137,8 @@
     
     >![](public_sys-resources/icon-note.gif) **说明:**   
     >-   track\_sql\_count参数受track\_activities约束:  
    ->    -   track\_activities开启而track\_sql\_count关闭时,如果查询了gs\_sql\_count或pgxc\_sql\_count视图,将会有WARNING提示track\_sql\_count是关闭的;  
    ->    -   track\_activities和track\_sql\_count同时关闭,那么此时将会有两条WARNING,分别提示track\_activities是关闭的和track\_sql\_count是关闭的;  
    ->    -   track\_activities关闭而track\_sql\_count开启,此时将仅有WARNING提示track\_activities是关闭。  
    +>    -   track\_activities开启而track\_sql\_count关闭时,如果查询了gs\_sql\_count或pgxc\_sql\_count视图,日志中将会有WARNING提示track\_sql\_count是关闭的;  
    +>    -   track\_activities和track\_sql\_count同时关闭,那么此时日志中将会有两条WARNING,分别提示track\_activities是关闭的和track\_sql\_count是关闭的;  
    +>    -   track\_activities关闭而track\_sql\_count开启,此时日志中将仅有WARNING提示track\_activities是关闭。  
     >-   当参数关闭时,查询视图的结果为0行。  
     
    diff --git "a/content/zh/docs/Developerguide/\346\237\245\350\257\242\346\234\200\350\200\227\346\200\247\350\203\275\347\232\204SQL.md" "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\346\234\200\350\200\227\346\200\247\350\203\275\347\232\204SQL.md"
    new file mode 100644
    index 000000000..d63747d5f
    --- /dev/null
    +++ "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\346\234\200\350\200\227\346\200\247\350\203\275\347\232\204SQL.md"
    @@ -0,0 +1,83 @@
    +# 查询最耗性能的SQL
    +
    +系统中有些SQL语句运行了很长时间还没有结束,这些语句会消耗很多的系统性能,请根据本章内容查询长时间运行的SQL语句。
    +
    +## 操作步骤
    +
    +1.  以操作系统用户omm登录数据库节点。
    +2.  使用如下命令连接数据库。
    +
    +    ```
    +    gsql -d postgres -p 8000
    +    ```
    +
    +    postgres为需要连接的数据库名称,8000为数据库节点的端口号。
    +
    +    连接成功后,系统显示类似如下信息:
    +
    +    ```
    +    gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131
    +    Non-SSL connection (SSL connection is recommended when requiring high-security)
    +    Type "help" for help.
    +    
    +    postgres=# 
    +    ```
    +
    +3.  查询系统中长时间运行的查询语句。
    +
    +    ```
    +    SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc;
    +    ```
    +
    +    查询后会按执行时间从长到短顺序返回查询语句列表,第一条结果就是当前系统中执行时间最长的查询语句。返回结果中包含了系统调用的SQL语句和用户执行SQL语句,请根据实际找到用户执行时间长的语句。
    +
    +    若当前系统较为繁忙,可以通过限制current\_timestamp - query\_start大于某一阈值来查看执行时间超过此阈值的查询语句。
    +
    +    ```
    +    SELECT query FROM pg_stat_activity WHERE current_timestamp - query_start > interval '1 days';
    +    ```
    +
    +4.  设置参数track\_activities为on。
    +
    +    ```
    +    SET track_activities = on;
    +    ```
    +
    +    当此参数为on时,数据库系统才会收集当前活动查询的运行信息。
    +
    +5.  查看正在运行的查询语句。
    +
    +    以查看视图pg\_stat\_activity为例:
    +
    +    ```
    +    SELECT datname, usename, state FROM pg_stat_activity;
    +     datname  | usename | state  |
    +    ----------+---------+--------+
    +     postgres |   omm   | idle   |
    +     postgres |   omm   | active |
    +    (2 rows)
    +    ```
    +
    +    如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。
    +
    +    如果仅需要查看非空闲的查询语句,则使用如下命令查看:
    +
    +    ```
    +    SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle';
    +    ```
    +
    +6.  分析长时间运行的查询语句状态。
    +    -   若查询语句处于正常状态,则等待其执行完毕。
    +    -   若查询语句阻塞,则通过如下命令查看当前处于阻塞状态的查询语句:
    +
    +        ```
    +        SELECT datname, usename, state, query FROM pg_stat_activity WHERE waiting = true;
    +        ```
    +
    +        查询结果中包含了当前被阻塞的查询语句,该查询语句所请求的锁资源可能被其他会话持有,正在等待持有会话释放锁资源。
    +
    +        >![](public_sys-resources/icon-note.gif) **说明:**   
    +        >只有当查询阻塞在系统内部锁资源时,waiting字段才显示为true。尽管等待锁资源是数据库系统最常见的阻塞行为,但是在某些场景下查询也会阻塞在等待其他系统资源上,例如写文件、定时器等。但是这种情况的查询阻塞,不会在视图pg\_stat\_activity中体现。  
    +
    +
    +
    diff --git "a/content/zh/docs/Developerguide/\346\243\200\346\237\245\347\202\271.md" "b/content/zh/docs/Developerguide/\346\243\200\346\237\245\347\202\271.md"
    index 3a1f4178b..74ff8ec1c 100644
    --- "a/content/zh/docs/Developerguide/\346\243\200\346\237\245\347\202\271.md"
    +++ "b/content/zh/docs/Developerguide/\346\243\200\346\237\245\347\202\271.md"
    @@ -8,7 +8,7 @@
     
     **取值范围**:整型,最小值1
     
    -提升此参数可加快大数据的导入速度,但需要结合[checkpoint\_timeout](#zh-cn_topic_0237124708_zh-cn_topic_0059778936_s880baa9f9b594980afbbe95fb8a77182)、[shared\_buffers](内存.md#zh-cn_topic_0237124699_zh-cn_topic_0059777577_s55a43fb6d0464430a59031671b37cd07)这两个参数统一考虑。这个参数同时影响WAL日志段文件复用数量,通常情况下pg\_xlog文件夹下最大的复用文件个数为2倍的checkpoint\_segments个,复用的文件被改名为后续即将使用的WAL日志段文件,不会被真正删除。
    +提升此参数可加快大数据的导入速度,但需要结合[checkpoint\_timeout](#zh-cn_topic_0237124708_zh-cn_topic_0059778936_s880baa9f9b594980afbbe95fb8a77182)、[shared\_buffers](内存-21.md#zh-cn_topic_0237124699_zh-cn_topic_0059777577_s55a43fb6d0464430a59031671b37cd07)这两个参数统一考虑。这个参数同时影响WAL日志段文件复用数量,通常情况下pg\_xlog文件夹下最大的复用文件个数为2倍的checkpoint\_segments个,复用的文件被改名为后续即将使用的WAL日志段文件,不会被真正删除。
     
     **默认值:**64
     
    @@ -20,7 +20,7 @@
     
     **取值范围**:整型, 30~3600(秒)
     
    -在提升[checkpoint\_segments](#zh-cn_topic_0237124708_zh-cn_topic_0059778936_sbadc77895e6643b882a5e7557e405373)以加快大数据导入的场景也需将此参数调大,同时这两个参数提升会加大[shared\_buffers](内存.md#zh-cn_topic_0237124699_zh-cn_topic_0059777577_s55a43fb6d0464430a59031671b37cd07)的负担,需要综合考虑。
    +在提升[checkpoint\_segments](#zh-cn_topic_0237124708_zh-cn_topic_0059778936_sbadc77895e6643b882a5e7557e405373)以加快大数据导入的场景也需将此参数调大,同时这两个参数提升会加大[shared\_buffers](内存-21.md#zh-cn_topic_0237124699_zh-cn_topic_0059777577_s55a43fb6d0464430a59031671b37cd07)的负担,需要综合考虑。
     
     **默认值:**15min
     
    @@ -91,7 +91,7 @@
     
     ## enable\_xlog\_prune
     
    -**参数说明:**设置主机是否在任一备机断联时候保留全部xlog不回收。
    +**参数说明:**设置在任一备机断联时,主机是否根据xlog日志的大小超过参数max\_size\_for\_xlog\_prune的值而回收日志。
     
     该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
     
    @@ -99,3 +99,13 @@
     
     **默认值:**on
     
    +## max\_size\_for\_xlog\_prune
    +
    +**参数说明:**在enable\_xlog\_prune打开时生效,如果有备机断连且xlog日志大小大于此阈值,则回收日志。
    +
    +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
    +
    +**取值范围**:整型,0~576 460 752 303 423 487,单位为MB
    +
    +**默认值:**100000,单位MB
    +
    diff --git "a/content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-11.md"
    similarity index 82%
    rename from "content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md"
    rename to "content/zh/docs/Developerguide/\346\246\202\350\277\260-11.md"
    index 596afa4c5..6be95d5db 100644
    --- "a/content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md"
    +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-11.md"
    @@ -1,4 +1,4 @@
    -# 概述
    +# 概述
     
     Sqldiag是一个语句时间诊断框架,通过深度学习和统计学习相结合,实现在不获取语句执行计划的前提下,依据语句逻辑相似度与历史执行记录,预测语句的执行时间。
     
    diff --git "a/content/zh/docs/Developerguide/\346\246\202\350\277\260-14.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-14.md"
    deleted file mode 100644
    index 1fbc471f0..000000000
    --- "a/content/zh/docs/Developerguide/\346\246\202\350\277\260-14.md"
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -# 概述
    -
    -SQL执行时间预测特性基于机器学习方法,通过在线学习收集的执行计划算子级信息,实现查询时间预测功能。
    -
    diff --git "a/content/zh/docs/Developerguide/\346\246\202\350\277\260-15.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-16.md"
    similarity index 98%
    rename from "content/zh/docs/Developerguide/\346\246\202\350\277\260-15.md"
    rename to "content/zh/docs/Developerguide/\346\246\202\350\277\260-16.md"
    index 62e0f7855..6a12230ca 100644
    --- "a/content/zh/docs/Developerguide/\346\246\202\350\277\260-15.md"
    +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-16.md"
    @@ -35,7 +35,7 @@ postgres=# SELECT text 'Origin' AS "label", point '(0,0)' AS "value";
         因为联合SELECT语句中的所有查询结果必须在一列里显示出来,所以每个SELECT子句中的元素类型必须相互匹配并转换成一个统一类型。类似地,一个CASE构造的结果表达式必须转换成统一的类型,这样整个case表达式会有一个统一的输出类型。同样的要求也存在于ARRAY构造以及GREATEST和LEAST函数中。
     
     
    -系统表pg\_cast存储了有关数据类型之间的转换关系以及如何执行这些转换的信息。详细信息请参见[PG\_CAST](PG_CAST.md#ZH-CN_TOPIC_0242385803)。
    +系统表pg\_cast存储了有关数据类型之间的转换关系以及如何执行这些转换的信息。详细信息请参见[PG\_CAST](PG_CAST.md)。
     
     语义分析阶段会决定表达式的返回值类型并选择适当的转换行为。数据类型的基本类型分类,包括:Boolean,numeric,string,bitstring,datetime,timespan,geometric和network。每种类型都有一种或多种首选类型用于解决类型选择的问题。根据首选类型和可用的隐含转换,就可能保证有歧义的表达式(那些有多个候选解析方案的)得到有效的方式解决。
     
    diff --git "a/content/zh/docs/Developerguide/\346\246\202\350\277\260-12.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-5.md"
    similarity index 81%
    rename from "content/zh/docs/Developerguide/\346\246\202\350\277\260-12.md"
    rename to "content/zh/docs/Developerguide/\346\246\202\350\277\260-5.md"
    index 9f3ef6eef..4d43eb909 100644
    --- "a/content/zh/docs/Developerguide/\346\246\202\350\277\260-12.md"
    +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-5.md"
    @@ -17,29 +17,29 @@ openGauss提供的gs\_dump和gs\_dumpall工具,能够帮助用户导出需要
     
     

    导出单个数据库

    -

    数据库级导出

    +

    数据库级导出

    • 导出全量信息。

      使用导出的全量信息可以创建一个与当前库相同的数据库,且库中数据也与当前库相同。

    • 仅导出库中所有对象的定义,包含库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。

      使用导出的对象定义,可以快速创建一个相同的数据库,但是库中并无原数据库的数据。

    • 仅导出数据。
    • 纯文本格式
    • 自定义归档格式
    • 目录归档格式
    • tar归档格式
    - + -

    模式级导出

    +

    模式级导出

    • 导出模式的全量信息。
    • 仅导出模式中数据。
    • 仅导出对象的定义,包含表定义、存储过程定义和索引定义等。
    -
    表级导出
    • 导出表的全量信息。
    • 仅导出表中数据。
    • 仅导出表的定义。
    +
    表级导出
    • 导出表的全量信息。
    • 仅导出表中数据。
    • 仅导出表的定义。

    导出所有数据库

    -

    数据库级导出

    -
    • 导出全量信息。

      使用导出的全量信息可以创建与openGauss相同的一个openGauss,拥有相同数据库和公共全局对象,且库中数据也与当前各库相同。

      -
    • 仅导出各数据库中的对象定义,包含表空间、库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。

      使用导出的对象定义,可以快速创建与openGauss相同的一个openGauss,拥有相同的数据库和表空间,但是库中并无原数据库的数据。

      +

      数据库级导出

      +
      • 导出全量信息。

        使用导出的全量信息可以创建与当前主机相同的一个主机环境,拥有相同数据库和公共全局对象,且库中数据也与当前各库相同。

        +
      • 仅导出各数据库中的对象定义,包含表空间、库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。

        使用导出的对象定义,可以快速创建与当前主机相同的一个主机环境,拥有相同的数据库和表空间,但是库中并无原数据库的数据。

      • 仅导出数据。

      纯文本格式

      @@ -47,14 +47,14 @@ openGauss提供的gs\_dump和gs\_dumpall工具,能够帮助用户导出需要

      数据文件导入请参见使用gsql元命令导入数据

      -
      各库公共全局对象导出
      • 仅导出表空间信息。
      • 仅导出角色信息。
      • 导出角色与表空间。
      +
      各库公共全局对象导出
      • 仅导出表空间信息。
      • 仅导出角色信息。
      • 导出角色与表空间。
      -gs\_dump和gs\_dumpall通过-U指定执行导出的用户帐户。如果当前使用的帐户不具备导出所要求的权限时,会无法导出数据。此时,可在导出命令中设置--role参数来指定具备权限的角色。在执行命令后,gs\_dump和gs\_dumpall会使用--role参数指定的角色,完成导出动作。可使用该功能的场景请参见[表1](#zh-cn_topic_0237121167_table08278213504),详细操作请参见[无权限角色导出数据](无权限角色导出数据.md#ZH-CN_TOPIC_0242370325)。 +gs\_dump和gs\_dumpall通过-U指定执行导出的用户帐户。如果当前使用的帐户不具备导出所要求的权限时,会无法导出数据。此时,可在导出命令中设置--role参数来指定具备权限的角色。在执行命令后,gs\_dump和gs\_dumpall会使用--role参数指定的角色,完成导出动作。可使用该功能的场景请参见[表1](#zh-cn_topic_0237121167_table08278213504),详细操作请参见[无权限角色导出数据](无权限角色导出数据.md)。 gs\_dump和gs\_dumpall通过对导出的数据文件加密,导入时对加密的数据文件进行解密,可以防止数据信息泄露,为数据库的安全提供保证。 diff --git "a/content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-7.md" similarity index 41% rename from "content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" rename to "content/zh/docs/Developerguide/\346\246\202\350\277\260-7.md" index 0ed8432b6..738bfd208 100644 --- "a/content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-7.md" @@ -1,4 +1,6 @@ -# 概述 +# 概述 -Predictor是基于机器学习且具有在线学习能力的查询时间预测工具。通过不断学习数据库内收集的历史执行信息,实现计划的执行时间/行数的预测功能。 +Predictor是基于机器学习且具有在线学习能力的查询时间预测工具。通过不断学习数据库内收集的历史执行信息,实现计划的执行时间预测功能。 + +本特性需要拉起python进程AIEngine,用于模型的训练和推理。 diff --git "a/content/zh/docs/Toolreference/\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-8.md" similarity index 80% rename from "content/zh/docs/Toolreference/\346\246\202\350\277\260.md" rename to "content/zh/docs/Developerguide/\346\246\202\350\277\260-8.md" index b354c7fb0..bf1071718 100644 --- "a/content/zh/docs/Toolreference/\346\246\202\350\277\260.md" +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-8.md" @@ -1,4 +1,4 @@ -# 概述 +# 概述 X-Tuner 是一款数据库自带的参数调优工具,通过结合深度强化学习和启发式算法,实现在无需人工干预的情况下,获取最佳数据库参数的途径。 diff --git "a/content/zh/docs/Developerguide/\346\250\241\345\274\217\345\214\271\351\205\215\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\346\250\241\345\274\217\345\214\271\351\205\215\346\223\215\344\275\234\347\254\246.md" index b5d986c14..c734a6552 100644 --- "a/content/zh/docs/Developerguide/\346\250\241\345\274\217\345\214\271\351\205\215\346\223\215\344\275\234\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\346\250\241\345\274\217\345\214\271\351\205\215\346\223\215\344\275\234\347\254\246.md" @@ -122,7 +122,7 @@ 正则表达式函数: - 支持使用函数[•substring\(string from pattern for escape\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_la1fee63f0fe34c148a0649f508a3048c)截取匹配SQL正则表达式的子字符串。 + 支持使用函数[substring\(string from pa...](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_la1fee63f0fe34c148a0649f508a3048c)截取匹配SQL正则表达式的子字符串。 示例: @@ -160,7 +160,7 @@ - POSIX正则表达式 - 描述:正则表达式是一个字符序列,它是定义一个串集合 (一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 POSIX正则表达式提供了比LIKE和SIMILAR TO操作符更强大的含义。[表 1 正则表达式匹配操作符](#zh-cn_topic_0237121970_table6512684711360)列出了所有可用于POSIX正则表达式模式匹配的操作符。 + 描述:正则表达式是一个字符序列,它是定义一个串集合 (一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 POSIX正则表达式提供了比LIKE和SIMILAR TO操作符更强大的含义。[表1](#zh-cn_topic_0237121970_table6512684711360)列出了所有可用于POSIX正则表达式模式匹配的操作符。 **表 1** 正则表达式匹配操作符 @@ -238,11 +238,11 @@ POSIX正则表达式支持下面函数。 - - [substring\(string from pattern\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_leae425d0ea44492abccc5db3556aa6f4)函数提供了抽取一个匹配POSIX正则表达式模式的子串的方法。 - - [regexp\_replace\(string, pattern, replacement \[,flags \]\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l3d209c16ba5f452798f2875e0144da4f)函数提供了将匹配POSIX正则表达式模式的子串替换为新文本的功能。 - - [regexp\_matches\(string text, pattern text \[, flags text\]\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l780ff57395f849c39cd24ae7bbc09950)函数返回一个文本数组,该数组由匹配一个POSIX正则表达式模式得到的所有被捕获子串构成。 - - [regexp\_split\_to\_table\(string text, pattern text \[, flags text\]\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l75315d2c7397491e8c5b10466b3fff91)函数把一个POSIX正则表达式模式当作一个定界符来分离一个串。 - - [regexp\_split\_to\_array\(string text, pattern text \[, flags text \]\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l0af8a0d78ca24b35815a93c7305cafdd)和regexp\_split\_to\_table类似,是一个正则表达式分离函数,不过它的结果以一个text数组的形式返回。 + - [substring\(string from pa...](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_leae425d0ea44492abccc5db3556aa6f4)函数提供了抽取一个匹配POSIX正则表达式模式的子串的方法。 + - [regexp\_replace\(string, p...](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l3d209c16ba5f452798f2875e0144da4f)函数提供了将匹配POSIX正则表达式模式的子串替换为新文本的功能。 + - [regexp\_matches\(string te...](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l780ff57395f849c39cd24ae7bbc09950)函数返回一个文本数组,该数组由匹配一个POSIX正则表达式模式得到的所有被捕获子串构成。 + - [regexp\_split\_to\_table\(st...](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l75315d2c7397491e8c5b10466b3fff91)函数把一个POSIX正则表达式模式当作一个定界符来分离一个串。 + - [regexp\_split\_to\_array\(st...](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_l0af8a0d78ca24b35815a93c7305cafdd)和regexp\_split\_to\_table类似,是一个正则表达式分离函数,不过它的结果以一个text数组的形式返回。 >![](public_sys-resources/icon-note.gif) **说明:** >正则表达式分离函数会忽略零长度的匹配,这种匹配发生在串的开头或结尾或者正好发生在前一个匹配之后。这和正则表达式匹配的严格定义是相悖的,后者由regexp\_matches实现,但是通常前者是实际中最常用的行为。 @@ -259,7 +259,7 @@ ``` ``` - postgres=# SELECT 'abc' ~ '* Abc' AS RESULT; + postgres=# SELECT 'abc' ~* 'Abc' AS RESULT; result -------- t diff --git "a/content/zh/docs/Developerguide/\346\265\213\350\257\225\345\222\214\350\260\203\350\257\225\346\226\207\346\234\254\346\220\234\347\264\242.md" "b/content/zh/docs/Developerguide/\346\265\213\350\257\225\345\222\214\350\260\203\350\257\225\346\226\207\346\234\254\346\220\234\347\264\242.md" index 870a66ffe..fc0a1b421 100644 --- "a/content/zh/docs/Developerguide/\346\265\213\350\257\225\345\222\214\350\260\203\350\257\225\346\226\207\346\234\254\346\220\234\347\264\242.md" +++ "b/content/zh/docs/Developerguide/\346\265\213\350\257\225\345\222\214\350\260\203\350\257\225\346\226\207\346\234\254\346\220\234\347\264\242.md" @@ -1,7 +1,5 @@ # 测试和调试文本搜索 -自定义文本搜索分词器的行为很容易变得混乱,本节中描述的函数用于对文本搜索对象进行测试。可以测试分词器整体,也可以单独测试解析器和词典。 - - **[分词器测试](分词器测试.md)** - **[解析器测试](解析器测试.md)** diff --git "a/content/zh/docs/Developerguide/\346\270\270\346\240\207.md" "b/content/zh/docs/Developerguide/\346\270\270\346\240\207.md" new file mode 100644 index 000000000..970a6997c --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\270\270\346\240\207.md" @@ -0,0 +1,11 @@ +# 游标 + +- **[游标概述](游标概述.md)** + +- **[显式游标](显式游标.md)** + +- **[隐式游标](隐式游标.md)** + +- **[游标循环](游标循环.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\270\270\346\240\207\345\276\252\347\216\257.md" "b/content/zh/docs/Developerguide/\346\270\270\346\240\207\345\276\252\347\216\257.md" new file mode 100644 index 000000000..fb0fa8f0e --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\270\270\346\240\207\345\276\252\347\216\257.md" @@ -0,0 +1,18 @@ +# 游标循环 + +游标在WHILE语句、LOOP语句中的使用称为游标循环,一般这种循环都需要使用OPEN、FETCH和CLOSE语句。下面要介绍的一种循环不需要这些操作,可以简化游标循环的操作,这种循环方式适用于静态游标的循环,不用执行静态游标的四个步骤。 + +## 语法 + +FOR AS循环的语法请参见[图1](#zh-cn_topic_0237122246_zh-cn_topic_0059778239_fd1982700d7d8496a9358b5d029a0123b)。 + +**图 1** FOR\_AS\_loop::= +![](figures/FOR_AS_loop.png "FOR_AS_loop") + +## 注意事项 + +- 不能在该循环语句中对查询的表进行更新操作。 +- 变量loop\_name会自动定义且只在此循环中有效,类型和select\_statement的查询结果类型一致。loop\_name的取值就是select\_statement的查询结果。 + +- 游标的属性中%FOUND、%NOTFOUND、%ROWCOUNT在openGauss数据库中都是访问同一个内部变量,事务和匿名块不支持多个游标同时访问。 + diff --git "a/content/zh/docs/Developerguide/\346\270\270\346\240\207\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\346\270\270\346\240\207\346\223\215\344\275\234.md" new file mode 100644 index 000000000..782327e56 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\270\270\346\240\207\346\223\215\344\275\234.md" @@ -0,0 +1,8 @@ +# 游标操作 + +openGauss中游标(cursor)是系统为用户开设的一个数据缓冲区,存放着SQL语句的执行结果。每个游标区都有一个名称。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。 + +游标的操作主要有游标的定义、打开、获取和关闭。 + +完整的游标操作示例可参考[显式游标](显式游标.md)。 + diff --git "a/content/zh/docs/Developerguide/\346\270\270\346\240\207\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\346\270\270\346\240\207\346\246\202\350\277\260.md" new file mode 100644 index 000000000..62b513fdc --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\270\270\346\240\207\346\246\202\350\277\260.md" @@ -0,0 +1,36 @@ +# 游标概述 + +为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当游标作为存储过程的返回值时,如果使用JDBC调用该存储过程,返回的游标将不可用。 + +游标的使用分为显式游标和隐式游标。对于不同的SQL语句,游标的使用情况不同,详细信息请参见[表1](#zh-cn_topic_0237122243_zh-cn_topic_0059778312_t0961a7f2a418407cbc7ebba3ba58c03d)。 + +**表 1** 游标使用情况 + + + + + + + + + + + + + + + + +

      SQL语句

      +

      游标

      +

      非查询语句

      +

      隐式的

      +

      结果是单行的查询语句

      +

      隐式的或显式的

      +

      结果是多行的查询语句

      +

      显式的

      +
      + diff --git "a/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" "b/content/zh/docs/Developerguide/\347\216\257\345\242\203\351\203\250\347\275\262.md" similarity index 53% rename from "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" rename to "content/zh/docs/Developerguide/\347\216\257\345\242\203\351\203\250\347\275\262.md" index b05804a8f..6d62887dc 100644 --- "a/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" +++ "b/content/zh/docs/Developerguide/\347\216\257\345\242\203\351\203\250\347\275\262.md" @@ -1,27 +1,76 @@ -# 使用指导 +# 环境部署 ## 前提条件 需要保证openGauss处于正常状态,用户通过身份验证成功登录openGauss;用户执行的SQL语法正确无报错,且不会导致数据库异常等;历史性能数据窗口内openGauss并发量稳定,表结构、表数量不变,数据量无突变,涉及查询性能的guc参数不变;进行预测时,需要保证模型已训练并收敛;AiEngine运行环境稳定。 -## 证书生成 - -AiEngine进程与内核进程通信需要证书认证,需要使用openssl工具生成双方证书。 - -1. 搭建证书生成环境,证书文件保存路径为$GAUSSHOME/CA: +## 请求样例 + +AiEngine进程与内核进程使用https发送请求进行通信,请求样例如下: + +``` +curl -X POST -d '{"modelName":"modelname"}' -H 'Content-Type: application/json' 'https://IP-address:port/request-API' +``` + +**表 1** : AI-Engine对外接口 + + + + + + + + + + + + + + + + + + + + + + + + + +

      Request-API

      +

      功能

      +

      /check

      +

      检查模型是否被正常拉起

      +

      /configure

      +

      设置模型参数

      +

      /train

      +

      模型训练

      +

      /track_process

      +

      查看模型训练日志

      +

      /setup

      +

      加载历史模型

      +

      /predict

      +

      模型预测

      +
      + +## 证书生成 + +使用此功能前需使用openssl工具生成通信双方认证所需的证书,保证通信安全。 + +1. 搭建证书生成环境,证书文件保存路径为$GAUSSHOME/CA。 --拷贝证书生成脚本及相关文件 ``` - cp path_to_predictor/install/ssl.sh $GAUSSHOME/ + cp path_to_predictor/install/ssl.sh $GAUSSHOME/ cp path_to_predictor/install/ca_ext.txt $GAUSSHOME/ ``` - --copy 配置文件openssl.cnf到CA下 + --copy 配置文件openssl.cnf到$GAUSSHOME路径下 ``` - cp /etc/openssl - cp openssl.cnf $GAUSSHOME/ + cp $GAUSSHOME/share/om/openssl.cnf $GAUSSHOME/ ``` --修改openssl.conf配置参数 @@ -51,7 +100,6 @@ AiEngine进程与内核进程通信需要证书认证,需要使用openssl工 --根据提示输入选项: ``` - Certificate Details: Serial Number: 1 (0x1) Validity @@ -129,24 +177,25 @@ AiEngine进程与内核进程通信需要证书认证,需要使用openssl工 --至此,相关证书及密钥已生成,($GAUSSHOME/CA)内容如下: - ![](figures/zh-cn_image_0245423148.png) + ![](figures/zh-cn_image_0253082069.png) + -3. -- +## 环境准备 -## 环境准备 +1. 将工具代码文件夹拷贝至目标环境 -1. 将工具代码文件夹拷贝至目标环境,代码路径:Code/src/gausskernel/dbmind/predictor。 + --假设安装路径为$INSTALL\_FOLDER --假设目标环境路径为/home/ai\_user : ``` - scp -r predictor ai_user@127.0.0.1:/home/ai_user/ + scp -r $INSTALL_FOLDER/bin/dbmind/predictor ai_user@127.0.0.1:path_to_Predictor ``` 2. 拷贝CA证书文件夹至aiEngine环境中某路径下: ``` - cp -r $GAUSSHOME/CA ai_user@127.0.0.1:/home/ai_user/ + cp -r $GAUSSHOME/CA ai_user@127.0.0.1:path_to_CA ``` 3. 安装predictor/install/requirements\(-gpu\).txt工具: @@ -157,7 +206,7 @@ AiEngine进程与内核进程通信需要证书认证,需要使用openssl工 ``` -## 拉起AiEngine +## 拉起AiEngine 1. 切换至aiEngine环境(即拷贝predictor的目标环境 ai\_user): @@ -166,13 +215,13 @@ AiEngine进程与内核进程通信需要证书认证,需要使用openssl工 ``` DEFAULT_FLASK_SERVER_HOST = '127.0.0.1' (aiEngine运行IP地址) DEFAULT_FLASK_SERVER_PORT = '5000' (aiEngine运行端口号) - PATH_SSL = "/home/ai_user/CA" (CA文件夹绝对路径) + PATH_SSL = "path_to_CA" (CA文件夹路径) ``` 2. 运行aiEngine启动脚本: ``` - run predictor/python/run.py + python path_to_Predictor/python/run.py ``` 此时,aiEngine即在相应端口保持拉起状态,等待内核侧时间预测功能的请求指令。 diff --git "a/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-4.md" "b/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-4.md" deleted file mode 100644 index fcdb171a0..000000000 --- "a/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-4.md" +++ /dev/null @@ -1,30 +0,0 @@ -# 用SSH隧道进行安全的TCP/IP连接 - -## 背景信息 - -为了保证服务器和客户端之间的安全通讯,可以在服务器和客户端之间构建安全的SSH隧道。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。 - -从SSH客户端来看,SSH提供了两种级别的安全验证: - -- 基于口令的安全验证:使用帐号和口令登录到远程主机。所有传输的数据都会被加密,但是不能保证正在连接的服务器就是需要连接的服务器。可能会有其他服务器冒充真正的服务器,也就是受到“中间人”方式的攻击。 -- 基于密钥的安全验证:用户必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上。这种级别的认证不仅加密所有传送的数据,而且避免“中间人”攻击方式。但是整个登录的过程可能需要10秒。 - -## 前提条件 - -SSH服务和数据库运行在同一台服务器上。 - -## 操作步骤 - -以OpenSSH为例介绍配置SSH隧道,对于如何配置基于密钥的安全验证不作赘述,OpenSSH提供了多种配置适应网络的各种限制,更多详细信息请参考OpenSSH的相关文档。 - -从本地主机建立到服务器的SSH隧道。 - -``` -ssh -L 63333:localhost:8000 username@hostIP -``` - ->![](public_sys-resources/icon-note.gif) **说明:** ->- -L参数的第一串数字(63333)是通道本端的端口号,可以自由选择。 ->- 第二串数字(8000)是通道远端的端口号,也就是服务器使用的端口号。 ->- localhost是本机IP地址,username是要连接的服务器上的用户名,hostIP是要连接的主机IP地址。 - diff --git "a/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" "b/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" index 104be8873..fcdb171a0 100644 --- "a/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" +++ "b/content/zh/docs/Developerguide/\347\224\250SSH\351\232\247\351\201\223\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" @@ -1,4 +1,4 @@ -# 用SSH隧道进行安全的TCP/IP连接 +# 用SSH隧道进行安全的TCP/IP连接 ## 背景信息 diff --git "a/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-3.md" "b/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-3.md" deleted file mode 100644 index 662e24fc3..000000000 --- "a/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245-3.md" +++ /dev/null @@ -1,544 +0,0 @@ -# 用SSL进行安全的TCP/IP连接 - -## 背景信息 - -openGauss支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。 - -## 前提条件 - -从CA认证中心申请到正式的服务器、客户端的证书和密钥。(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。) - -## 注意事项 - -- 当用户远程连接到数据库主节点时,需要使用sha256的认证方式。 -- 当内部服务器之间连接时,需要使用trust的认证方式,支持IP白名单认证。 - -## 操作步骤 - -openGauss在openGauss部署完成后,默认已开启SSL认证模式。服务器端证书,私钥以及根证书已经默认配置完成。用户需要配置客户端的相关参数。 - -配置SSL认证相关的数字证书参数,具体要求请参见[表1](#zh-cn_topic_0237121092_zh-cn_topic_0059778374_table56811076112938)。 - -- 配置客户端参数。 - - 已从CA认证中心申请到客户端默认证书,私钥,根证书以及私钥密码加密文件。假设证书、私钥和根证书都放在“/home/omm”目录。 - - 双向认证需配置如下参数: - - ``` - export PGSSLCERT="/home/omm/client.crt" - export PGSSLKEY="/home/omm/client.key" - export PGSSLMODE="verify-ca" - export PGSSLROOTCERT="/home/omm/cacert.pem" - ``` - - 单向认证需要配置如下参数: - - ``` - export PGSSLMODE="verify-ca" - export PGSSLROOTCERT="/home/omm/cacert.pem" - ``` - -- 修改客户端密钥的权限。 - - 客户端根证书,密钥,证书以及密钥密码加密文件的权限,需保证权限为600。如果权限不满足要求,则客户端无法以SSL连接到openGauss。 - - ``` - chmod 600 client.key - chmod 600 client.crt - chmod 600 client.key.cipher - chmod 600 client.key.rand - chmod 600 cacert.pem - ``` - - ->![](public_sys-resources/icon-notice.gif) **须知:** ->从安全性考虑,建议使用双向认证方式。 ->配置客户端环境变量,必须包含文件的绝对路径。 - -**表 1** 认证方式 - - - - - - - - - - - - - - - - - - - -

      认证方式

      -

      含义

      -

      配置客户端环境变量

      -

      维护建议

      -

      双向认证(推荐)

      -

      客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。

      -

      设置如下环境变量:

      -
      • PGSSLCERT
      • PGSSLKEY
      • PGSSLROOTCERT
      • PGSSLMODE
      -

      该方式应用于安全性要求较高的场景。使用此方式时,建议设置客户端的PGSSLMODE变量为verify-ca。确保了网络数据的安全性。

      -

      单向认证

      -

      客户端只验证服务器证书的有效性,而服务器端不验证客户端证书的有效性。服务器加载证书信息并发送给客户端,客户端使用根证书来验证服务器端证书的有效性。

      -

      设置如下环境变量:

      -
      • PGSSLROOTCERT
      • PGSSLMODE
      -

      为防止基于TCP链接的欺骗,建议使用SSL证书认证功能。除配置客户端根证书外,建议客户端使用PGSSLMODE变量为verify-ca方式连接。

      -
      - -## 相关参考 - -在服务器端的postgresql.conf文件中配置相关参数,详细信息请参见[表2](#zh-cn_topic_0237121092_zh-cn_topic_0059778374_tccd28484be8c47678b529d6ccd34d1fd)。 - -**表 2** 服务器参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      参数

      -

      描述

      -

      取值范围

      -

      ssl

      -

      表示是否启动SSL功能。

      -
      • on:开启SSL功能。
      • off:关闭SSL功能。
      -

      默认值:on

      -

      require_ssl

      -

      设置服务器端是否强制要求SSL连接。该参数只有当参数ssl为on时才有效。

      -
      • on:服务器端强制要求SSL连接。
      • off:服务器端对是否通过SSL连接不作强制要求。
      -

      默认值:off

      -

      ssl_cert_file

      -

      指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。

      -

      请以实际的证书名为准。必须使用相对路径,相对路径是相对于数据目录的。

      -

      默认值:server.crt

      -

      ssl_key_file

      -

      指定服务器私钥文件,用以对公钥加密的数据进行解密。

      -

      请以实际的服务器私钥名称为准。必须使用相对路径,相对路径是相对于数据目录的。

      -

      默认值:server.key

      -

      ssl_ca_file

      -

      CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。

      -

      请以实际的CA服务器根证书名称为准。

      -

      默认值

      -

      cacert.pem

      -

      ssl_crl_file

      -

      证书吊销列表,如果客户端证书在该列表中,则当前客户端证书被视为无效证书。

      -

      请以实际的证书吊销列表名称为准。

      -

      默认值:空,表示没有吊销列表。

      -

      ssl_ciphers

      -

      SSL通讯使用的加密算法。

      -

      本产品支持的加密算法的详细信息请参见表4

      -

      默认值:ALL,表示允许对端使用产品支持的所有加密算法,但不包含ADH、LOW、EXP、MD5算法。

      -
      - -在客户端配置SSL认证相关的环境变量,详细信息请参见[表3](#zh-cn_topic_0237121092_zh-cn_topic_0059778374_t1a20720af5504dc0ba3c5d0e8d1a028b)。 - ->![](public_sys-resources/icon-note.gif) **说明:** ->客户端环境变量的路径以“_/home/omm_”为例,在实际操作中请使用实际路径进行替换。 - -**表 3** 客户端参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      环境变量

      -

      描述

      -

      取值范围

      -

      PGSSLCERT

      -

      指定客户端证书文件,包含客户端的公钥。客户端证书用以表明客户端身份的合法性,公钥将发送给对端用来对数据进行加密。

      -
      必须包含文件的绝对路径,如:
      export PGSSLCERT='/home/omm/client.crt'
      -
      -

      默认值:空

      -

      PGSSLKEY

      -

      指定客户端私钥文件,用以对公钥加密的数据进行解密。

      -
      必须包含文件的绝对路径,如:
      export PGSSLKEY='/home/omm/client.key'
      -
      -

      默认值:空

      -

      PGSSLMODE

      -

      设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级。

      -

      取值及含义:

      -
      • disable:只尝试非SSL连接。
      • allow:首先尝试非SSL连接,如果连接失败,再尝试SSL连接。
      • prefer:首先尝试SSL连接,如果连接失败,将尝试非SSL连接。
      • require:只尝试SSL连接。如果存在CA文件,则按设置成verify-ca的方式验证。
      • verify-ca:只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书。
      • verify-full:只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。
      -

      默认值:prefer

      -

      PGSSLROOTCERT

      -

      指定为客户端颁发证书的根证书文件,根证书用于验证服务器证书的有效性。

      -
      必须包含文件的绝对路径,如:
      export PGSSLROOTCERT='/home/omm/certca.pem'
      -
      -

      默认值:

      -

      PGSSLCRL

      -

      指定证书吊销列表文件,用于验证服务器证书是否在废弃证书列表中,如果在,则服务器证书将会被视为无效证书。

      -
      必须包含文件的绝对路径,如:
      export PGSSLCRL='/home/omm/sslcrl-file.crl'
      -
      -

      默认值:

      -
      - -服务器端参数ssl、require\_ssl与客户端参数sslmode配置组合结果如下: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      ssl(服务器)

      -

      sslmode(客户端)

      -

      require_ssl(服务器)

      -

      结果

      -

      on

      -

      disable

      -

      on

      -

      由于服务器端要求使用SSL,但客户端针对该连接禁用了SSL,因此无法建立连接。

      -

      disable

      -

      off

      -

      连接未加密。

      -

      allow

      -

      on

      -

      连接经过加密。

      -

      allow

      -

      off

      -

      连接未加密。

      -

      prefer

      -

      on

      -

      连接经过加密。

      -

      prefer

      -

      off

      -

      连接经过加密。

      -

      require

      -

      on

      -

      连接经过加密。

      -

      require

      -

      off

      -

      连接经过加密。

      -

      verify-ca

      -

      on

      -

      连接经过加密,且验证了服务器证书。

      -

      verify-ca

      -

      off

      -

      连接经过加密,且验证了服务器证书。

      -

      verify-full

      -

      on

      -

      连接经过加密,且验证了服务器证书和主机名。

      -

      verify-full

      -

      off

      -

      连接经过加密,且验证了服务器证书和主机名。

      -

      off

      -

      disable

      -

      on

      -

      连接未加密。

      -

      disable

      -

      off

      -

      连接未加密。

      -

      allow

      -

      on

      -

      连接未加密。

      -

      allow

      -

      off

      -

      连接未加密。

      -

      prefer

      -

      on

      -

      连接未加密。

      -

      prefer

      -

      off

      -

      连接未加密。

      -

      require

      -

      on

      -

      由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。

      -

      require

      -

      off

      -

      由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。

      -

      verify-ca

      -

      on

      -

      由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。

      -

      verify-ca

      -

      off

      -

      由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。

      -

      verify-full

      -

      on

      -

      由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。

      -

      verify-full

      -

      off

      -

      由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。

      -
      - -SSL传输支持一系列不同强度的加密和认证算法。用户可以通过修改postgresql.conf中的ssl\_ciphers参数指定数据库服务器使用的加密算法。目前本产品SSL支持的加密算法如[表4](#zh-cn_topic_0237121092_zh-cn_topic_0059778374_t34eea0830ef94be1a866f0410ba3eb07)所示。 - -**表 4** 加密算法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      加密强度

      -

      安全程度

      -

      加密算法描述

      -

      stronger

      -

      high

      -

      DHE-RSA-AES256-GCM-SHA384

      -

      stronger

      -

      high

      -

      DHE-RSA-AES128-GCM-SHA256

      -

      stronger

      -

      high

      -

      DHE-DSS-AES256-GCM-SHA384

      -

      stronger

      -

      high

      -

      DHE-DSS-AES128-GCM-SHA256

      -

      stronger

      -

      medium

      -

      DHE-RSA-AES256-SHA256

      -

      stronger

      -

      medium

      -

      DHE-RSA-AES128-SHA256

      -

      stronger

      -

      medium

      -

      DHE-DSS-AES256-SHA256

      -

      stronger

      -

      medium

      -

      DHE-DSS-AES128-SHA256

      -

      stronger

      -

      high

      -

      DHE-RSA-AES256-CCM

      -

      stronger

      -

      high

      -

      DHE-RSA-AES128-CCM

      -

      stronger

      -

      medium

      -

      DHE-RSA-AES256-SHA

      -

      stronger

      -

      medium

      -

      DHE-RSA-AES128-SHA

      -

      stronger

      -

      medium

      -

      DHE-DSS-AES256-SHA

      -

      stronger

      -

      medium

      -

      DHE-DSS-AES128-SHA

      -
      - ->![](public_sys-resources/icon-note.gif) **说明:** ->- SSL目前只支持加密强度在strong以上的加密算法。 ->- 配置参数ssl\_ciphers的默认值为ALL,表示支持上表中的所有加密算法。如果对加密算法没有特殊要求,建议用户使用该默认值。 ->- 如指定以上多种加密,加密算法之间需要使用分号分割。 -> 如在postgresql.conf设置ssl\_ciphers='DHE-RSA-AES256-GCM-SHA384;DHE-RSA-AES256-SHA256;DHE-RSA-AES256-CCM' ->- 如果要使用上表中和DSS相关的加密算法(如DHE-DSS-AES256-GCM-SHA384、DHE-DSS-AES256-SHA256、DHE-DSS-AES256-SHA等)必须加载使用DSA算法签名的证书文件。如何使用openssl产生DSA算法签名的证书文件,请参见openssl官方文档。 ->- SSL连接认证不仅增加了登录(创建SSL环境)及退出过程(清理SSL环境)的时间消耗,同时需要消耗额外的时间用于加解密所需传输的内容,因此对性能有一定影响。特别的,对于频繁的登录登出,短时查询等场景有较大的影响。 ->- 在证书有效期小于7天的时候,连接登录会在日志中产生告警提醒。 - diff --git "a/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" "b/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" index 49daefeae..a0119a088 100644 --- "a/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" +++ "b/content/zh/docs/Developerguide/\347\224\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" @@ -1,4 +1,4 @@ -# 用SSL进行安全的TCP/IP连接 +# 用SSL进行安全的TCP/IP连接 ## 背景信息 @@ -99,67 +99,67 @@ openGauss在openGauss部署完成后,默认已开启SSL认证模式。服务 **表 2** 服务器参数 - + + + + @@ -93,7 +93,7 @@ @@ -105,7 +105,7 @@ @@ -124,7 +124,7 @@ diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\234\215\345\212\241\347\253\257\350\277\234\347\250\213\350\277\236\346\216\245.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\234\215\345\212\241\347\253\257\350\277\234\347\250\213\350\277\236\346\216\245.md" index 8481e7346..3ff7e9131 100644 --- "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\234\215\345\212\241\347\253\257\350\277\234\347\250\213\350\277\236\346\216\245.md" +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\234\215\345\212\241\347\253\257\350\277\234\347\250\213\350\277\236\346\216\245.md" @@ -1,13 +1,13 @@ # 配置服务端远程连接 -进行远程连接前,需要在所有部署了数据库主节点的机器上设置允许客户端访问数据库,并配置远程连接。 +进行远程连接前,需要在部署了数据库主节点的机器上设置允许客户端访问数据库,并配置远程连接。 ## 操作步骤 -以下步骤需要在openGauss的数据库主节点所在主机上执行。 +以下步骤需要在openGauss所在主机上执行。 1. 以操作系统用户omm登录数据库主节点。 -2. 配置客户端认证方式,请参考[配置客户端接入认证](配置客户端接入认证.md#ZH-CN_TOPIC_0242376654)。 +2. 配置客户端认证方式,请参考[配置客户端接入认证](配置客户端接入认证.md)。 3. 配置[listen\_addresses](连接设置.md#zh-cn_topic_0237124695_zh-cn_topic_0059777636_sed0adde99a3f47669f5d4ab557b36b35),listen\_addresses即远程客户端连接使用的数据库主节点ip或者主机名。 1. 使用如下命令查看数据库主节点目前的listen\_addresses配置。 diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\347\244\272\344\276\213.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\347\244\272\344\276\213.md" index 71607e01a..d6a2489af 100644 --- "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\347\244\272\344\276\213.md" +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\347\244\272\344\276\213.md" @@ -50,7 +50,7 @@ openGauss中预定义有一些可用的文本搜索配置,用户也可创建 ); ``` -4. 设置文本搜索配置ts\_conf,修改某些类型的token对应的词典列表。关于token类型的详细信息,请参见[解析器](解析器.md#ZH-CN_TOPIC_0242370496)。 +4. 设置文本搜索配置ts\_conf,修改某些类型的token对应的词典列表。关于token类型的详细信息,请参见[解析器](解析器.md)。 ``` postgres=# ALTER TEXT SEARCH CONFIGURATION ts_conf diff --git "a/content/zh/docs/Developerguide/\351\207\215\350\256\276\345\217\202\346\225\260.md" "b/content/zh/docs/Developerguide/\351\207\215\350\256\276\345\217\202\346\225\260.md" index 1cade6753..60aeb10e7 100644 --- "a/content/zh/docs/Developerguide/\351\207\215\350\256\276\345\217\202\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\351\207\215\350\256\276\345\217\202\346\225\260.md" @@ -94,7 +94,7 @@ openGauss提供了三种方式来修改GUC参数,具体操作请参考[表2](# diff --git "a/content/zh/docs/Developerguide/\351\223\276\346\216\245\345\255\227\347\254\246.md" "b/content/zh/docs/Developerguide/\351\223\276\346\216\245\345\255\227\347\254\246.md" index c139ca32f..68c284b56 100644 --- "a/content/zh/docs/Developerguide/\351\223\276\346\216\245\345\255\227\347\254\246.md" +++ "b/content/zh/docs/Developerguide/\351\223\276\346\216\245\345\255\227\347\254\246.md" @@ -33,6 +33,11 @@ + + + - -

      参数

      + - - - - - - - - - - - - - - - - - - - - - - - diff --git "a/content/zh/docs/Developerguide/\347\224\250\346\210\267.md" "b/content/zh/docs/Developerguide/\347\224\250\346\210\267.md" index 237947ab0..d14714e2b 100644 --- "a/content/zh/docs/Developerguide/\347\224\250\346\210\267.md" +++ "b/content/zh/docs/Developerguide/\347\224\250\346\210\267.md" @@ -1,14 +1,14 @@ # 用户 -使用CREATE USER和ALTER USER可以创建和管理数据库用户。openGauss包含一个或多个已命名数据库。用户和角色在openGauss范围内是共享的,但是其数据并不共享。即用户可以连接任何数据库,但当连接成功后,任何用户都只能访问连接请求里声明的那个数据库。 +使用CREATE USER和ALTER USER可以创建和管理数据库用户。openGauss包含一个或多个已命名数据库。用户和角色在整个openGauss范围内是共享的,但是其数据并不共享。即用户可以连接任何数据库,但当连接成功后,任何用户都只能访问连接请求里声明的那个数据库。 -非[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960)下,openGauss用户帐户只能由系统管理员或拥有CREATEROLE属性的安全管理员创建和删除。三权分立时,用户帐户只能由初始用户和安全管理员创建。 +非[三权分立](三权分立.md)下,openGauss用户帐户只能由系统管理员或拥有CREATEROLE属性的安全管理员创建和删除。三权分立时,用户帐户只能由初始用户和安全管理员创建。 在用户登录openGauss时会对其进行身份验证。用户可以拥有数据库和数据库对象(例如表),并且可以向用户和角色授予对这些对象的权限以控制谁可以访问哪个对象。除系统管理员外,具有CREATEDB属性的用户可以创建数据库并授予对这些数据库的权限。 ## 创建、修改和删除用户 -- 要创建用户,请使用SQL语句[CREATE USER](CREATE-USER.md#ZH-CN_TOPIC_0242370589)。 +- 要创建用户,请使用SQL语句[CREATE USER](CREATE-USER.md)。 例如:创建用户joe,并设置用户拥有CREATEDB属性。 @@ -17,10 +17,10 @@ CREATE ROLE ``` -- 要创建系统管理员,请使用带有SYSADMIN选项的[CREATE USER](CREATE-USER.md#ZH-CN_TOPIC_0242370589)语句 。 +- 要创建系统管理员,请使用带有SYSADMIN选项的[CREATE USER](CREATE-USER.md)语句 。 - 要删除现有用户,请使用[DROP USER](DROP-USER.md)。 -- 要更改用户帐户(例如,重命名用户或更改密码),请使用[ALTER USER](ALTER-USER.md#ZH-CN_TOPIC_0242370547)。 -- 要查看用户列表,请查询视图[PG\_USER](PG_USER.md#ZH-CN_TOPIC_0242385999): +- 要更改用户帐户(例如,重命名用户或更改密码),请使用[ALTER USER](ALTER-USER.md)。 +- 要查看用户列表,请查询视图[PG\_USER](PG_USER.md): ``` postgres=# SELECT * FROM pg_user; @@ -37,7 +37,7 @@ 对于有多个业务部门,各部门间使用不同的数据库用户进行业务操作,同时有一个同级的数据库维护部门使用数据库管理员进行维护操作的场景下,业务部门可能希望在未经授权的情况下,管理员用户只能对各部门的数据进行控制操作(DROP、ALTER、TRUNCATE),但是不能进行访问操作(INSERT、DELETE、UPDATE、SELECT、COPY)。即针对管理员用户,表对象的控制权和访问权要能够分离,提高普通用户数据安全性。 -[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960)情况下,管理员对其他用户放在属于各自模式下的表无权限。但是,这种无权限包含了无控制权限,因此不能满足上面的诉求。为此,openGauss提供了私有用户方案。即在非三权分立模式下,创建具有INDEPENDENT属性的私有用户。 +[三权分立](三权分立.md)情况下,管理员对其他用户放在属于各自模式下的表无权限。但是,这种无权限包含了无控制权限,因此不能满足上面的诉求。为此,openGauss提供了私有用户方案。即在非三权分立模式下,创建具有INDEPENDENT属性的私有用户。 ``` postgres=# CREATE USER user_independent WITH INDEPENDENT IDENTIFIED BY "1234@abc"; diff --git "a/content/zh/docs/Developerguide/\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" new file mode 100644 index 000000000..4a8a0c5cf --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" @@ -0,0 +1,5 @@ +# 用户自定义函数 + +- **[PL/pgSQL语言函数](PL-pgSQL语言函数.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\233\270\345\205\263\346\246\202\345\277\265.md" "b/content/zh/docs/Developerguide/\347\233\270\345\205\263\346\246\202\345\277\265.md" index b6d5c04c3..ad860fb45 100644 --- "a/content/zh/docs/Developerguide/\347\233\270\345\205\263\346\246\202\345\277\265.md" +++ "b/content/zh/docs/Developerguide/\347\233\270\345\205\263\346\246\202\345\277\265.md" @@ -18,5 +18,5 @@ openGauss使用用户和角色来控制对数据库的访问。根据角色自 ## 事务管理 -在事务管理上,openGauss采取了MVCC(多版本并发控制)结合两阶段锁的方式,其特点是读写之间不阻塞。openGauss的MVCC没有将历史版本数据统一存放,而是和当前元组的版本放在了一起。openGauss没有回滚段的概念,但是为了定期清除历史版本数据openGauss引入了一个VACUUM线程。一般情况下用户不用关注它,除非要做性能调优。此外,openGauss是自动提交事务。 +在事务管理上,openGauss采取了MVCC(多版本并发控制)结合两阶段锁的方式,其特点是读写之间不阻塞。openGauss统一存放,而是和当前元组的版本放在了一起。openGauss期清除历史版本数据openGauss引入了一个VACUUM线程。一般情况下用户不用关注它,除非要做性能调优。此外,openGauss是自动提交事务。 diff --git "a/content/zh/docs/Developerguide/\347\241\254\344\273\266\347\223\266\351\242\210\347\202\271\345\210\206\346\236\220.md" "b/content/zh/docs/Developerguide/\347\241\254\344\273\266\347\223\266\351\242\210\347\202\271\345\210\206\346\236\220.md" new file mode 100644 index 000000000..e16f102c8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\241\254\344\273\266\347\223\266\351\242\210\347\202\271\345\210\206\346\236\220.md" @@ -0,0 +1,13 @@ +# 硬件瓶颈点分析 + +获取openGauss节点的CPU、内存、I/O和网络资源使用情况,确认这些资源是否已被充分利用,是否存在瓶颈点。 + +- **[CPU](CPU.md)** +通过top命令查看openGauss内节点CPU使用情况,分析是否存在由于CPU负载过高导致的性能瓶颈。 +- **[内存](内存.md)** +通过top命令查看openGauss节点内存使用情况,分析是否存在由于内存占用率过高导致的性能瓶颈。 +- **[I/O](I-O.md)** +通过iostat、pidstat命令或openGauss健康检查工具查看openGauss内节点I/O繁忙度和吞吐量,分析是否存在由于I/O导致的性能瓶颈。 +- **[网络](网络.md)** +通过sar或ifconfig命令查看openGauss内节点网络使用情况,分析是否存在由于网络导致的性能瓶颈。 + diff --git "a/content/zh/docs/Developerguide/\347\241\256\345\256\232\346\200\247\350\203\275\350\260\203\344\274\230\350\214\203\345\233\264.md" "b/content/zh/docs/Developerguide/\347\241\256\345\256\232\346\200\247\350\203\275\350\260\203\344\274\230\350\214\203\345\233\264.md" new file mode 100644 index 000000000..fd1b7e1d2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\241\256\345\256\232\346\200\247\350\203\275\350\260\203\344\274\230\350\214\203\345\233\264.md" @@ -0,0 +1,46 @@ +# 确定性能调优范围 + +数据库性能调优通常发生在用户对业务的执行效率不满意,期望通过调优加快业务执行的情况下。正如“[性能因素](#zh-cn_topic_0237121484_zh-cn_topic_0073259659_zh-cn_topic_0040046511_section218827915473)”小节所述,数据库性能受影响因素多,从而性能调优是一项复杂的工程,有些时候无法系统性地说明和解释,而是依赖于DBA的经验判断。尽管如此,此处还是期望能尽量系统性的对性能调优方法加以说明,方便应用开发人员和刚接触openGauss的DBA参考。 + +## 性能因素 + +多个性能因素会影响数据库性能,了解这些因素可以帮助定位和分析性能问题。 + +- 系统资源 + + 数据库性能在很大程度上依赖于磁盘的I/O和内存使用情况。为了准确设置性能指标,用户需要了解openGauss部署硬件的基本性能。CPU,硬盘,磁盘控制器,内存和网络接口等这些硬件性能将显著影响数据库的运行速度。 + +- 负载 + + 负载等于数据库系统的需求总量,它会随着时间变化。总体负载包含用户查询,应用程序,并行作业,事务以及数据库随时传递的系统命令。比如:多用户在执行多个查询时会提高负载。负载会显著地影响数据库的性能。了解工作负载高峰期可以帮助用户更合理地利用系统资源,更有效地完成系统任务。 + +- 吞吐量 + + 使用系统的吞吐量来定义处理数据的整体能力。数据库的吞吐量以每秒的查询次数、每秒的处理事务数量或平均响应时间来测量。数据库的处理能力与底层系统(磁盘I/O,CPU速度,存储器带宽等)有密切的关系,所以当设置数据库吞吐量目标时,需要提前了解硬件的性能。 + +- 竞争 + + 竞争是指两组或多组负载组件尝试使用冲突的方式使用系统的情况。比如,多条查询视图同一时间更新相同的数据,或者多个大量的负载争夺系统资源。随着竞争的增加,吞吐量下降。 + +- 优化 + + 数据库优化可以影响到整个系统的性能。在执行SQL制定、数据库配置参数、表设计、数据分布等操作时,启用数据库查询优化器打造最有效的执行计划。 + + +## 调优范围确定 + +性能调优主要通过查看openGauss节点的CPU、内存、I/O和网络这些硬件资源的使用情况,确认这些资源是否已被充分利用,是否存在瓶颈点,然后针对性调优。 + +- 如果某个资源已达瓶颈,则: + 1. 检查关键的操作系统参数和数据库参数是否合理设置,进行[系统调优指南](系统调优指南.md)。 + 2. 通过查询最耗时的SQL语句、跑不出来的SQL语句,找出耗资源的SQL,进行[SQL调优指南](SQL调优指南.md)。 + +- 如果所有资源均未达瓶颈,则表明性能仍有提升潜力。可以查询最耗时的SQL语句,或者跑不出来的SQL语句,进行针对性的[SQL调优指南](SQL调优指南.md)。 + +- **[硬件瓶颈点分析](硬件瓶颈点分析.md)** +获取openGauss节点的CPU、内存、I/O和网络资源使用情况,确认这些资源是否已被充分利用,是否存在瓶颈点。 +- **[查询最耗性能的SQL](查询最耗性能的SQL.md)** + +- **[分析作业是否被阻塞](分析作业是否被阻塞.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213-2.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-2.md" new file mode 100644 index 000000000..13413d1f0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-2.md" @@ -0,0 +1,339 @@ +# 示例 + +## 常用功能示例代码 + +``` +// 此示例演示如何通过ODBC方式获取openGauss中的数据。 +// DBtest.c (compile with: libodbc.so) +#include +#include +#include +#ifdef WIN32 +#include +#endif +SQLHENV V_OD_Env; // Handle ODBC environment +SQLHSTMT V_OD_hstmt; // Handle statement +SQLHDBC V_OD_hdbc; // Handle connection +char typename[100]; +SQLINTEGER value = 100; +SQLINTEGER V_OD_erg,V_OD_buffer,V_OD_err,V_OD_id; +int main(int argc,char *argv[]) +{ + // 1. 申请环境句柄 + V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env); + if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) + { + printf("Error AllocHandle\n"); + exit(0); + } + // 2. 设置环境属性(版本信息) + SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); + // 3. 申请连接句柄 + V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc); + if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) + { + SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); + exit(0); + } + // 4. 设置连接属性 + SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 0); + // 5. 连接数据源,这里的“userName”与“password”分别表示连接数据库的用户名和用户密码,请根据实际情况修改。 + // 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。 + V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS, + (SQLCHAR*) "userName", SQL_NTS, (SQLCHAR*) "password", SQL_NTS); + if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) + { + printf("Error SQLConnect %d\n",V_OD_erg); + SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); + exit(0); + } + printf("Connected !\n"); + // 6. 设置语句属性 + SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0); + // 7. 申请语句句柄 + SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt); + // 8. 直接执行SQL语句。 + SQLExecDirect(V_OD_hstmt,"drop table IF EXISTS customer_t1",SQL_NTS); + SQLExecDirect(V_OD_hstmt,"CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));",SQL_NTS); + SQLExecDirect(V_OD_hstmt,"insert into customer_t1 values(25,li)",SQL_NTS); + // 9. 准备执行 + SQLPrepare(V_OD_hstmt,"insert into customer_t1 values(?)",SQL_NTS); + // 10. 绑定参数 + SQLBindParameter(V_OD_hstmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0, + &value,0,NULL); + // 11. 执行准备好的语句 + SQLExecute(V_OD_hstmt); + SQLExecDirect(V_OD_hstmt,"select id from testtable",SQL_NTS); + // 12. 获取结果集某一列的属性 + SQLColAttribute(V_OD_hstmt,1,SQL_DESC_TYPE,typename,100,NULL,NULL); + printf("SQLColAtrribute %s\n",typename); + // 13. 绑定结果集 + SQLBindCol(V_OD_hstmt,1,SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer,150, + (SQLLEN *)&V_OD_err); + // 14. 通过SQLFetch取结果集中数据 + V_OD_erg=SQLFetch(V_OD_hstmt); + // 15. 通过SQLGetData获取并返回数据。 + while(V_OD_erg != SQL_NO_DATA) + { + SQLGetData(V_OD_hstmt,1,SQL_C_SLONG,(SQLPOINTER)&V_OD_id,0,NULL); + printf("SQLGetData ----ID = %d\n",V_OD_id); + V_OD_erg=SQLFetch(V_OD_hstmt); + }; + printf("Done !\n"); + // 16. 断开数据源连接并释放句柄资源 + SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt); + SQLDisconnect(V_OD_hdbc); + SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc); + SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); + return(0); + } +``` + +## 批量绑定示例代码 + +``` +/********************************************************************** +* 请在数据源中打开UseBatchProtocol,同时指定数据库中参数support_batch_bind +* 为on +* CHECK_ERROR的作用是检查并打印错误信息。 +* 此示例将与用户交互式获取DSN、模拟的数据量,忽略的数据量,并将最终数据入库到test_odbc_batch_insert中 +***********************************************************************/ +#include +#include +#include +#include +#include + +#include "util.c" + +void Exec(SQLHDBC hdbc, SQLCHAR* sql) +{ + SQLRETURN retcode; // Return status + SQLHSTMT hstmt = SQL_NULL_HSTMT; // Statement handle + SQLCHAR loginfo[2048]; + + // Allocate Statement Handle + retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); + CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)", + hstmt, SQL_HANDLE_STMT); + + // Prepare Statement + retcode = SQLPrepare(hstmt, (SQLCHAR*) sql, SQL_NTS); + sprintf((char*)loginfo, "SQLPrepare log: %s", (char*)sql); + CHECK_ERROR(retcode, loginfo, hstmt, SQL_HANDLE_STMT); + + // Execute Statement + retcode = SQLExecute(hstmt); + sprintf((char*)loginfo, "SQLExecute stmt log: %s", (char*)sql); + CHECK_ERROR(retcode, loginfo, hstmt, SQL_HANDLE_STMT); + + // Free Handle + retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmt); + sprintf((char*)loginfo, "SQLFreeHandle stmt log: %s", (char*)sql); + CHECK_ERROR(retcode, loginfo, hstmt, SQL_HANDLE_STMT); +} + +int main () +{ + SQLHENV henv = SQL_NULL_HENV; + SQLHDBC hdbc = SQL_NULL_HDBC; + int batchCount = 1000; + SQLLEN rowsCount = 0; + int ignoreCount = 0; + + SQLRETURN retcode; + SQLCHAR dsn[1024] = {'\0'}; + SQLCHAR loginfo[2048]; + + // 交互获取数据源名称 + getStr("Please input your DSN", (char*)dsn, sizeof(dsn), 'N'); + // 交互获取批量绑定的数据量 + getInt("batchCount", &batchCount, 'N', 1); + do + { + // 交互获取批量绑定的数据中,不要入库的数据量 + getInt("ignoreCount", &ignoreCount, 'N', 1); + if (ignoreCount > batchCount) + { + printf("ignoreCount(%d) should be less than batchCount(%d)\n", ignoreCount, batchCount); + } + }while(ignoreCount > batchCount); + + retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); + CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_ENV)", + henv, SQL_HANDLE_ENV); + + // Set ODBC Verion + retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, + (SQLPOINTER*)SQL_OV_ODBC3, 0); + CHECK_ERROR(retcode, "SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)", + henv, SQL_HANDLE_ENV); + + // Allocate Connection + retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); + CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_DBC)", + henv, SQL_HANDLE_DBC); + + // Set Login Timeout + retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); + CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)", + hdbc, SQL_HANDLE_DBC); + + // Set Auto Commit + retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, + (SQLPOINTER)(1), 0); + CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_ATTR_AUTOCOMMIT)", + hdbc, SQL_HANDLE_DBC); + + // Connect to DSN + sprintf(loginfo, "SQLConnect(DSN:%s)", dsn); + retcode = SQLConnect(hdbc, (SQLCHAR*) dsn, SQL_NTS, + (SQLCHAR*) NULL, 0, NULL, 0); + CHECK_ERROR(retcode, loginfo, hdbc, SQL_HANDLE_DBC); + + // init table info. + Exec(hdbc, "drop table if exists test_odbc_batch_insert"); + Exec(hdbc, "create table test_odbc_batch_insert(id int primary key, col varchar2(50))"); + + // 下面的代码根据用户输入的数据量,构造出将要入库的数据: + { + SQLRETURN retcode; + SQLHSTMT hstmtinesrt = SQL_NULL_HSTMT; + int i; + SQLCHAR *sql = NULL; + SQLINTEGER *ids = NULL; + SQLCHAR *cols = NULL; + SQLLEN *bufLenIds = NULL; + SQLLEN *bufLenCols = NULL; + SQLUSMALLINT *operptr = NULL; + SQLUSMALLINT *statusptr = NULL; + SQLULEN process = 0; + + // 这里是按列构造,每个字段的内存连续存放在一起。 + ids = (SQLINTEGER*)malloc(sizeof(ids[0]) * batchCount); + cols = (SQLCHAR*)malloc(sizeof(cols[0]) * batchCount * 50); + // 这里是每个字段中,每一行数据的内存长度。 + bufLenIds = (SQLLEN*)malloc(sizeof(bufLenIds[0]) * batchCount); + bufLenCols = (SQLLEN*)malloc(sizeof(bufLenCols[0]) * batchCount); + // 该行是否需要被处理,SQL_PARAM_IGNORE 或 SQL_PARAM_PROCEED + operptr = (SQLUSMALLINT*)malloc(sizeof(operptr[0]) * batchCount); + memset(operptr, 0, sizeof(operptr[0]) * batchCount); + // 该行的处理结果。 + // 注:由于数据库中处理方式是同一语句隶属同一事务中,所以如果出错,那么待处理数据都将是出错的,并不会部分入库。 + statusptr = (SQLUSMALLINT*)malloc(sizeof(statusptr[0]) * batchCount); + memset(statusptr, 88, sizeof(statusptr[0]) * batchCount); + + if (NULL == ids || NULL == cols || NULL == bufLenCols || NULL == bufLenIds) + { + fprintf(stderr, "FAILED:\tmalloc data memory failed\n"); + goto exit; + } + + for (int i = 0; i < batchCount; i++) + { + ids[i] = i; + sprintf(cols + 50 * i, "column test value %d", i); + bufLenIds[i] = sizeof(ids[i]); + bufLenCols[i] = strlen(cols + 50 * i); + operptr[i] = (i < ignoreCount) ? SQL_PARAM_IGNORE : SQL_PARAM_PROCEED; + } + + // Allocate Statement Handle + retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmtinesrt); + CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)", + hstmtinesrt, SQL_HANDLE_STMT); + + // Prepare Statement + sql = (SQLCHAR*)"insert into test_odbc_batch_insert values(?, ?)"; + retcode = SQLPrepare(hstmtinesrt, (SQLCHAR*) sql, SQL_NTS); + sprintf((char*)loginfo, "SQLPrepare log: %s", (char*)sql); + CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)batchCount, sizeof(batchCount)); + CHECK_ERROR(retcode, "SQLSetStmtAttr", hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLBindParameter(hstmtinesrt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, sizeof(ids[0]), 0,&(ids[0]), 0, bufLenIds); + CHECK_ERROR(retcode, "SQLBindParameter for id", hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLBindParameter(hstmtinesrt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 50, cols, 50, bufLenCols); + CHECK_ERROR(retcode, "SQLBindParameter for cols", hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAMS_PROCESSED_PTR, (SQLPOINTER)&process, sizeof(process)); + CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAMS_PROCESSED_PTR", hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAM_STATUS_PTR, (SQLPOINTER)statusptr, sizeof(statusptr[0]) * batchCount); + CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAM_STATUS_PTR", hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAM_OPERATION_PTR, (SQLPOINTER)operptr, sizeof(operptr[0]) * batchCount); + CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAM_OPERATION_PTR", hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLExecute(hstmtinesrt); + sprintf((char*)loginfo, "SQLExecute stmt log: %s", (char*)sql); + CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT); + + retcode = SQLRowCount(hstmtinesrt, &rowsCount); + CHECK_ERROR(retcode, "SQLRowCount execution", hstmtinesrt, SQL_HANDLE_STMT); + + if (rowsCount != (batchCount - ignoreCount)) + { + sprintf(loginfo, "(batchCount - ignoreCount)(%d) != rowsCount(%d)", (batchCount - ignoreCount), rowsCount); + CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT); + } + else + { + sprintf(loginfo, "(batchCount - ignoreCount)(%d) == rowsCount(%d)", (batchCount - ignoreCount), rowsCount); + CHECK_ERROR(SQL_SUCCESS, loginfo, NULL, SQL_HANDLE_STMT); + } + + // check row number returned + if (rowsCount != process) + { + sprintf(loginfo, "process(%d) != rowsCount(%d)", process, rowsCount); + CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT); + } + else + { + sprintf(loginfo, "process(%d) == rowsCount(%d)", process, rowsCount); + CHECK_ERROR(SQL_SUCCESS, loginfo, NULL, SQL_HANDLE_STMT); + } + + for (int i = 0; i < batchCount; i++) + { + if (i < ignoreCount) + { + if (statusptr[i] != SQL_PARAM_UNUSED) + { + sprintf(loginfo, "statusptr[%d](%d) != SQL_PARAM_UNUSED", i, statusptr[i]); + CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT); + } + } + else if (statusptr[i] != SQL_PARAM_SUCCESS) + { + sprintf(loginfo, "statusptr[%d](%d) != SQL_PARAM_SUCCESS", i, statusptr[i]); + CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT); + } + } + + retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmtinesrt); + sprintf((char*)loginfo, "SQLFreeHandle hstmtinesrt"); + CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT); + } + + +exit: + printf ("\nComplete.\n"); + + // Connection + if (hdbc != SQL_NULL_HDBC) { + SQLDisconnect(hdbc); + SQLFreeHandle(SQL_HANDLE_DBC, hdbc); + } + + // Environment + if (henv != SQL_NULL_HENV) + SQLFreeHandle(SQL_HANDLE_ENV, henv); + + return 0; +} +``` + diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213-10.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-3.md" similarity index 100% rename from "content/zh/docs/Developerguide/\347\244\272\344\276\213-10.md" rename to "content/zh/docs/Developerguide/\347\244\272\344\276\213-3.md" diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213-\344\273\216MY\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\344\273\216MY\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" new file mode 100644 index 000000000..9e986cc2a --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\344\273\216MY\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" @@ -0,0 +1,91 @@ +# 示例:从MY向openGauss进行数据迁移 + +下面示例演示如何通过CopyManager从MY向openGauss进行数据迁移的过程。 + +``` +import java.io.StringReader; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import org.postgresql.copy.CopyManager; +import org.postgresql.core.BaseConnection; + +public class Migration{ + + public static void main(String[] args) { + String url = new String("jdbc:postgresql://10.180.155.74:8000/postgres"); //数据库URL + String user = new String("jack"); //openGauss用户名 + String pass = new String("Gauss@123"); //openGauss密码 + String tablename = new String("migration_table"); //定义表信息 + String delimiter = new String("|"); //定义分隔符 + String encoding = new String("UTF8"); //定义字符集 + String driver = "org.postgresql.Driver"; + StringBuffer buffer = new StringBuffer(); //定义存放格式化数据的缓存 + + try { + //获取源数据库查询结果集 + ResultSet rs = getDataSet(); + + //遍历结果集,逐行获取记录 + //将每条记录中各字段值,按指定分隔符分割,由换行符结束,拼成一个字符串 + //把拼成的字符串,添加到缓存buffer + while (rs.next()) { + buffer.append(rs.getString(1) + delimiter + + rs.getString(2) + delimiter + + rs.getString(3) + delimiter + + rs.getString(4) + + "\n"); + } + rs.close(); + + try { + //建立目标数据库连接 + Class.forName(driver); + Connection conn = DriverManager.getConnection(url, user, pass); + BaseConnection baseConn = (BaseConnection) conn; + baseConn.setAutoCommit(false); + + //初始化表信息 + String sql = "Copy " + tablename + " from STDIN DELIMITER " + "'" + delimiter + "'" + " ENCODING " + "'" + encoding + "'"; + + //提交缓存buffer中的数据 + CopyManager cp = new CopyManager(baseConn); + StringReader reader = new StringReader(buffer.toString()); + cp.copyIn(sql, reader); + baseConn.commit(); + reader.close(); + baseConn.close(); + } catch (ClassNotFoundException e) { + e.printStackTrace(System.out); + } catch (SQLException e) { + e.printStackTrace(System.out); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + //******************************** + // 从源数据库返回查询结果集 + //********************************* + private static ResultSet getDataSet() { + ResultSet rs = null; + try { + Class.forName("com.MY.jdbc.Driver").newInstance(); + Connection conn = DriverManager.getConnection("jdbc:MY://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "Gauss@123"); + Statement stmt = conn.createStatement(); + rs = stmt.executeQuery("select * from migration_table"); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return rs; + } +} +``` + diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213-\345\270\270\347\224\250\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\345\270\270\347\224\250\346\223\215\344\275\234.md" new file mode 100644 index 000000000..cd76af61c --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\345\270\270\347\224\250\346\223\215\344\275\234.md" @@ -0,0 +1,218 @@ +# 示例:常用操作 + +## 示例1 + +此示例将演示如何基于openGauss提供的JDBC接口开发应用程序。 + +``` +//DBtest.java +//演示基于JDBC开发的主要步骤,会涉及创建数据库、创建表、插入数据等。 + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.CallableStatement; + +public class DBTest { + + //创建数据库连接。 + public static Connection GetConnection(String username, String passwd) { + String driver = "org.postgresql.Driver"; + String sourceURL = "jdbc:postgresql://localhost:8000/postgres"; + Connection conn = null; + try { + //加载数据库驱动。 + Class.forName(driver).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + try { + //创建数据库连接。 + conn = DriverManager.getConnection(sourceURL, username, passwd); + System.out.println("Connection succeed!"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + return conn; + }; + + //执行普通SQL语句,创建customer_t1表。 + public static void CreateTable(Connection conn) { + Statement stmt = null; + try { + stmt = conn.createStatement(); + + //执行普通SQL语句。 + int rc = stmt + .executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); + + stmt.close(); + } catch (SQLException e) { + if (stmt != null) { + try { + stmt.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + //执行预处理语句,批量插入数据。 + public static void BatchInsertData(Connection conn) { + PreparedStatement pst = null; + + try { + //生成预处理语句。 + pst = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?,?)"); + for (int i = 0; i < 3; i++) { + //添加参数。 + pst.setInt(1, i); + pst.setString(2, "data " + i); + pst.addBatch(); + } + //执行批处理。 + pst.executeBatch(); + pst.close(); + } catch (SQLException e) { + if (pst != null) { + try { + pst.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + //执行预编译语句,更新数据。 + public static void ExecPreparedSQL(Connection conn) { + PreparedStatement pstmt = null; + try { + pstmt = conn + .prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1"); + pstmt.setString(1, "new Data"); + int rowcount = pstmt.executeUpdate(); + pstmt.close(); + } catch (SQLException e) { + if (pstmt != null) { + try { + pstmt.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + +//执行存储过程。 + public static void ExecCallableSQL(Connection conn) { + CallableStatement cstmt = null; + try { + + cstmt=conn.prepareCall("{? = CALL TESTPROC(?,?,?)}"); + cstmt.setInt(2, 50); + cstmt.setInt(1, 20); + cstmt.setInt(3, 90); + cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。 + cstmt.execute(); + int out = cstmt.getInt(4); //获取out参数 + System.out.println("The CallableStatment TESTPROC returns:"+out); + cstmt.close(); + } catch (SQLException e) { + if (cstmt != null) { + try { + cstmt.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + + /** + * 主程序,逐步调用各静态方法。 + * @param args + */ + public static void main(String[] args) { + //创建数据库连接。 + Connection conn = GetConnection("tester", "Password1234"); + + //创建表。 + CreateTable(conn); + + //批插数据。 + BatchInsertData(conn); + + //执行预编译语句,更新数据。 + ExecPreparedSQL(conn); + + //执行存储过程。 + ExecCallableSQL(conn); + + //关闭数据库连接。 + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + } + +} +``` + +## 示例2 客户端内存占用过多解决 + +此示例主要使用setFetchSize来调整客户端内存使用,它的原理是通过数据库游标来分批获取服务器端数据,但它会加大网络交互,可能会损失部分性能。 + +由于游标事务内有效,故需要先关闭自动提交,最后需要执行手动提交。 + +``` +// 关闭掉自动提交 +conn.setAutoCommit(false); +Statement st = conn.createStatement(); + +// 打开游标,每次获取50行数据 +st.setFetchSize(50); +ResultSet rs = st.executeQuery("SELECT * FROM mytable"); +conn.commit(); +while (rs.next()) +{ + System.out.print("a row was returned."); +} +rs.close(); + +// 关闭服务器游标。 +st.setFetchSize(0); +rs = st.executeQuery("SELECT * FROM mytable"); +conn.commit(); +while (rs.next()) +{ + System.out.print("many rows were returned."); +} +rs.close(); + +// Close the statement. +st.close(); +conn.close(); +``` + +执行完毕后可使用如下命令恢复自动提交: + +``` +conn.setAutoCommit(true); +``` + diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\200\232\350\277\207\346\234\254\345\234\260\346\226\207\344\273\266\345\257\274\345\205\245\345\257\274\345\207\272\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\200\232\350\277\207\346\234\254\345\234\260\346\226\207\344\273\266\345\257\274\345\205\245\345\257\274\345\207\272\346\225\260\346\215\256.md" new file mode 100644 index 000000000..ea38cb748 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\200\232\350\277\207\346\234\254\345\234\260\346\226\207\344\273\266\345\257\274\345\205\245\345\257\274\345\207\272\346\225\260\346\215\256.md" @@ -0,0 +1,113 @@ +# 示例:通过本地文件导入导出数据 + +在使用JAVA语言基于openGauss进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。 + +样例程序如下,执行时需要加载openGauss jdbc驱动。 + +``` +import java.sql.Connection; +import java.sql.DriverManager; +import java.io.IOException; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.sql.SQLException; +import org.postgresql.copy.CopyManager; +import org.postgresql.core.BaseConnection; + +public class Copy{ + + public static void main(String[] args) + { + String urls = new String("jdbc:postgresql://10.180.155.74:8000/postgres"); //数据库URL + String username = new String("jack"); //用户名 + String password = new String("Gauss@123"); //密码 + String tablename = new String("migration_table"); //定义表信息 + String tablename1 = new String("migration_table_1"); //定义表信息 + String driver = "org.postgresql.Driver"; + Connection conn = null; + + try { + Class.forName(driver); + conn = DriverManager.getConnection(urls, username, password); + } catch (ClassNotFoundException e) { + e.printStackTrace(System.out); + } catch (SQLException e) { + e.printStackTrace(System.out); + } + + // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt + try { + copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); + } catch (SQLException e) { + k + e.printStackTrace(); + } catch (IOException e) { + + e.printStackTrace(); + } + //将d:/data.txt中的数据导入到migration_table_1中。 + try { + copyFromFile(conn, "d:/data.txt", tablename1); + } catch (SQLException e) { + e.printStackTrace(); + } catch (IOException e) { + + e.printStackTrace(); + } + + // 将migration_table_1中的数据导出到本地文件d:/data1.txt + try { + copyToFile(conn, "d:/data1.txt", tablename1); + } catch (SQLException e) { + + e.printStackTrace(); + } catch (IOException e) { + + + e.printStackTrace(); + } + } + // 使用copyIn把数据从文件中导入数据库, + public static void copyFromFile(Connection connection, String filePath, String tableName) + throws SQLException, IOException { + + FileInputStream fileInputStream = null; + + try { + CopyManager copyManager = new CopyManager((BaseConnection)connection); + fileInputStream = new FileInputStream(filePath); + copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); + } finally { + if (fileInputStream != null) { + try { + fileInputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + // 使用copyOut把数据从数据库中导出到文件中 + public static void copyToFile(Connection connection, String filePath, String tableOrQuery) + throws SQLException, IOException { + + FileOutputStream fileOutputStream = null; + + try { + CopyManager copyManager = new CopyManager((BaseConnection)connection); + fileOutputStream = new FileOutputStream(filePath); + copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} +``` + diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\207\215\346\226\260\346\211\247\350\241\214\345\272\224\347\224\250SQL.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\207\215\346\226\260\346\211\247\350\241\214\345\272\224\347\224\250SQL.md" new file mode 100644 index 000000000..2afff9ef3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-\351\207\215\346\226\260\346\211\247\350\241\214\345\272\224\347\224\250SQL.md" @@ -0,0 +1,199 @@ +# 示例:重新执行应用SQL + +当主数据库节点故障且10s未恢复时,openGauss会将对应的备数据库节点升主,使openGauss正常运行。备升主期间正在运行的作业会失败;备升主后启动的作业不会再受影响。如果要做到数据库节点主备切换过程中,上层业务不感知,可参考此示例构建业务层SQL重试机制。 + +``` +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +class ExitHandler extends Thread { + private Statement cancel_stmt = null; + + public ExitHandler(Statement stmt) { + super("Exit Handler"); + this.cancel_stmt = stmt; + } + public void run() { + System.out.println("exit handle"); + try { + this.cancel_stmt.cancel(); + } catch (SQLException e) { + System.out.println("cancel query failed."); + e.printStackTrace(); + } + } +} + +public class SQLRetry { + //创建数据库连接。 + public static Connection GetConnection(String username, String passwd) { + String driver = "org.postgresql.Driver"; + String sourceURL = "jdbc:postgresql://10.131.72.136:8000/postgres"; + Connection conn = null; + try { + //加载数据库驱动。 + Class.forName(driver).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + try { + //创建数据库连接。 + conn = DriverManager.getConnection(sourceURL, username, passwd); + System.out.println("Connection succeed!"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + return conn; +} + + //执行普通SQL语句,创建jdbc_test1表。 + public static void CreateTable(Connection conn) { + Statement stmt = null; + try { + stmt = conn.createStatement(); + + + Runtime.getRuntime().addShutdownHook(new ExitHandler(stmt)); + + //执行普通SQL语句。 + int rc2 = stmt + .executeUpdate("DROP TABLE if exists jdbc_test1;"); + + int rc1 = stmt + .executeUpdate("CREATE TABLE jdbc_test1(col1 INTEGER, col2 VARCHAR(10));"); + + stmt.close(); + } catch (SQLException e) { + if (stmt != null) { + try { + stmt.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + //执行预处理语句,批量插入数据。 + public static void BatchInsertData(Connection conn) { + PreparedStatement pst = null; + + try { + //生成预处理语句。 + pst = conn.prepareStatement("INSERT INTO jdbc_test1 VALUES (?,?)"); + for (int i = 0; i < 100; i++) { + //添加参数。 + pst.setInt(1, i); + pst.setString(2, "data " + i); + pst.addBatch(); + } + //执行批处理。 + pst.executeBatch(); + pst.close(); + } catch (SQLException e) { + if (pst != null) { + try { + pst.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + } + + //执行预编译语句,更新数据。 + private static boolean QueryRedo(Connection conn){ + PreparedStatement pstmt = null; + boolean retValue = false; + try { + pstmt = conn + .prepareStatement("SELECT col1 FROM jdbc_test1 WHERE col2 = ?"); + + pstmt.setString(1, "data 10"); + ResultSet rs = pstmt.executeQuery(); + + while (rs.next()) { + System.out.println("col1 = " + rs.getString("col1")); + } + rs.close(); + + pstmt.close(); + retValue = true; + } catch (SQLException e) { + System.out.println("catch...... retValue " + retValue); + if (pstmt != null) { + try { + pstmt.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + } + + System.out.println("finesh......"); + return retValue; + } + + //查询语句,执行失败重试,重试次数可配置。 + public static void ExecPreparedSQL(Connection conn) throws InterruptedException { + int maxRetryTime = 50; + int time = 0; + String result = null; + do { + time++; + try { + System.out.println("time:" + time); + boolean ret = QueryRedo(conn); + if(ret == false){ + System.out.println("retry, time:" + time); + Thread.sleep(10000); + QueryRedo(conn); + } + } catch (Exception e) { + e.printStackTrace(); + } + } while (null == result && time < maxRetryTime); + + } + + /** + * 主程序,逐步调用各静态方法。 + * @param args + * @throws InterruptedException + */ + public static void main(String[] args) throws InterruptedException { + //创建数据库连接。 + Connection conn = GetConnection("testuser", "test@123"); + + //创建表。 + CreateTable(conn); + + //批插数据。 + BatchInsertData(conn); + + //执行预编译语句,更新数据。 + ExecPreparedSQL(conn); + + //关闭数据库连接。 + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + } + + } +``` + diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\213.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213.md" index 13413d1f0..cf705c672 100644 --- "a/content/zh/docs/Developerguide/\347\244\272\344\276\213.md" +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213.md" @@ -1,4 +1,4 @@ -# 示例 +# 示例 ## 常用功能示例代码 diff --git "a/content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MySQL\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MY\345\220\221openGauss\346\225\260\346\215\256\345\272\223\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" similarity index 89% rename from "content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MySQL\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" rename to "content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MY\345\220\221openGauss\346\225\260\346\215\256\345\272\223\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" index f9d418a21..3933f86ad 100644 --- "a/content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MySQL\345\220\221openGauss\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\2132-\344\273\216MY\345\220\221openGauss\346\225\260\346\215\256\345\272\223\350\277\233\350\241\214\346\225\260\346\215\256\350\277\201\347\247\273.md" @@ -1,6 +1,6 @@ -# 示例2:从MySQL向openGauss进行数据迁移 +# 示例2:从MY向openGauss数据库进行数据迁移 -下面示例演示如何通过CopyManager从MySQL向openGauss进行数据迁移的过程。 +下面示例演示如何通过CopyManager从MY向openGauss数据库进行数据迁移的过程。 ``` import java.io.StringReader; @@ -17,8 +17,8 @@ public class Migration{ public static void main(String[] args) { String url = new String("jdbc:postgresql://localhost:8000/postgres"); //数据库URL - String user = new String("username"); //openGauss用户名 - String pass = new String("passwd"); //openGauss密码 + String user = new String("username"); //openGauss数据库用户名 + String pass = new String("passwd"); //openGauss数据库密码 String tablename = new String("migration_table_1"); //定义表信息 String delimiter = new String("|"); //定义分隔符 String encoding = new String("UTF8"); //定义字符集 @@ -75,8 +75,8 @@ public class Migration{ private static ResultSet getDataSet() { ResultSet rs = null; try { - Class.forName("com.mysql.jdbc.Driver").newInstance(); - Connection conn = DriverManager.getConnection("jdbc:mysql://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "Gauss@123"); + Class.forName("com.MY.jdbc.Driver").newInstance(); + Connection conn = DriverManager.getConnection("jdbc:MY://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "Gauss@123"); Statement stmt = conn.createStatement(); rs = stmt.executeQuery("select * from migration_table"); } catch (SQLException e) { diff --git "a/content/zh/docs/Developerguide/\347\251\272\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\347\251\272\350\257\255\345\217\245.md" new file mode 100644 index 000000000..201c493a3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\251\272\350\257\255\345\217\245.md" @@ -0,0 +1,20 @@ +# 空语句 + +在PL/SQL程序中,可以用NULL语句来说明“不用做任何事情”,相当于一个占位符,可以使某些语句变得有意义,提高程序的可读性。 + +## 语法 + +空语句的用法如下: + +``` +DECLARE + … +BEGIN + … + IF v_num IS NULL THEN + NULL; -- 不需要处理任何数据。 + END IF; +END; +/ +``` + diff --git "a/content/zh/docs/Developerguide/\347\256\200\345\215\225\350\241\250\350\276\276\345\274\217.md" "b/content/zh/docs/Developerguide/\347\256\200\345\215\225\350\241\250\350\276\276\345\274\217.md" index 58197c897..f7ab23a0b 100644 --- "a/content/zh/docs/Developerguide/\347\256\200\345\215\225\350\241\250\350\276\276\345\274\217.md" +++ "b/content/zh/docs/Developerguide/\347\256\200\345\215\225\350\241\250\350\276\276\345\274\217.md" @@ -2,11 +2,11 @@ ## 逻辑表达式 -逻辑表达式的操作符和运算规则,请参见[逻辑操作符](逻辑操作符.md#ZH-CN_TOPIC_0242370429)。 +逻辑表达式的操作符和运算规则,请参见[逻辑操作符](逻辑操作符.md)。 ## 比较表达式 -常用的比较操作符,请参见[比较操作符](比较操作符.md#ZH-CN_TOPIC_0242370430)。 +常用的比较操作符,请参见[操作符](操作符.md)。 除比较操作符外,还可以使用以下句式结构: diff --git "a/content/zh/docs/Developerguide/\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230.md" new file mode 100644 index 000000000..a1e8f3548 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\256\227\345\255\220\347\272\247\350\260\203\344\274\230.md" @@ -0,0 +1,54 @@ +# 算子级调优 + +## 算子级调优介绍 + +一个查询语句要经过多个算子步骤才会输出最终的结果。由于各别算子耗时过长导致整体查询性能下降的情况比较常见。这些算子是整个查询的瓶颈算子。通用的优化手段是EXPLAIN ANALYZE/PERFORMANCE命令查看执行过程的瓶颈算子,然后进行针对性优化。 + +如下面的执行过程信息中,Hashagg算子的执行时间占总时间的:\(51016-13535\)/ 56476 ≈66%,此处Hashagg算子就是这个查询的瓶颈算子,在进行性能优化时应当优先考虑此算子的优化。 + +![](figures/zh-cn_image_0118861065.jpg) + +## 算子级调优示例 + +**示例1:**基表扫描时,对于点查或者范围扫描等过滤大量数据的查询,如果使用SeqScan全表扫描会比较耗时,可以在条件列上建立索引选择IndexScan进行索引扫描提升扫描效率。 + +``` +postgres=# explain (analyze on, costs off) select * from store_sales where ss_sold_date_sk = 2450944; + id | operation | A-time | A-rows | Peak Memory | A-width +----+--------------------------------+---------------------+--------+--------------+--------- + 1 | -> Streaming (type: GATHER) | 3666.020 | 3360 | 195KB | + 2 | -> Seq Scan on store_sales | [3594.611,3594.611] | 3360 | [34KB, 34KB] | +(2 rows) + + Predicate Information (identified by plan id) +----------------------------------------------- + 2 --Seq Scan on store_sales + Filter: (ss_sold_date_sk = 2450944) + Rows Removed by Filter: 4968936 +``` + +``` +postgres=# create index idx on store_sales_row(ss_sold_date_sk); +CREATE INDEX +postgres=# explain (analyze on, costs off) select * from store_sales_row where ss_sold_date_sk = 2450944; + id | operation | A-time | A-rows | Peak Memory | A-width +----+------------------------------------------------+-----------------+--------+--------------+---------- + 1 | -> Streaming (type: GATHER) | 81.524 | 3360 | 195KB | + 2 | -> Index Scan using idx on store_sales_row | [13.352,13.352] | 3360 | [34KB, 34KB] | +(2 rows) +``` + +上述例子中,全表扫描返回3360条数据,过滤掉大量数据,在ss\_sold\_date\_sk列上建立索引后,使用IndexScan扫描效率显著提高,从3.6秒提升到13毫秒。 + +**示例2:**如果从执行计划中看,两表join选择了NestLoop,而实际行数比较大时,NestLoop Join可能执行比较慢。如下的例子中NestLoop耗时181秒,如果设置参数enable\_mergejoin=off关掉Merge Join,同时设置参数enable\_nestloop=off关掉NestLoop,让优化器选择HashJoin,则Join耗时提升至200多毫秒。 + +![](figures/12-4-5-4-算子级调优(示例错乱调整1).png) + +![](figures/12-4-5-4-算子级调优(示例错乱调整2).png) + +**示例3**:通常情况下Agg选择HashAgg性能较好,如果大结果集选择了Sort+GroupAgg,则需要设置enable\_sort=off,HashAgg耗时明显优于Sort+GroupAgg。 + +![](figures/12-4-5-4-算子级调优(示例错乱调整示例3).png) + +![](figures/12-4-5-4-算子级调优(示例错乱调整示例3-1).png) + diff --git "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\344\272\213\345\212\241.md" "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\344\272\213\345\212\241.md" index b039f912c..96a877459 100644 --- "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\344\272\213\345\212\241.md" +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\344\272\213\345\212\241.md" @@ -28,7 +28,7 @@ 事务隔离级别,它决定多个事务并发操作同一个对象时的处理方式。 >![](public_sys-resources/icon-note.gif) **说明:** ->在事务中第一个数据修改语句(SELECT,INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 +>在事务中第一个数据修改语句(SELECT, INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 - **READ COMMITTED**:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。 diff --git "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\221\230.md" "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\221\230.md" index e67b0155d..8072dc53d 100644 --- "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\221\230.md" +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\221\230.md" @@ -8,7 +8,7 @@ openGauss安装过程中自动生成的帐户称为初始用户。初始用户 ## 系统管理员 -系统管理员是指具有SYSADMIN属性的帐户,默认安装情况下具有与对象所有者相同的权限,但不包括dbms\_perf模式的对象权限。 +系统管理员是指具有SYSADMIN属性的帐户,默认安装情况下具有与对象所有者相同的权限,但不包括dbe\_perf模式的对象权限。 要创建新的系统管理员,请以初始用户或者系统管理员用户身份连接数据库,并使用带SYSADMIN选项的[CREATE USER](CREATE-USER.md)语句或 [ALTER USER](ALTER-USER.md)语句进行设置。 @@ -26,7 +26,7 @@ ALTER USER时,要求用户已存在。 ## 监控管理员 -监控管理员是指具有MONADMIN属性的帐户,具有查看dbms\_perf模式下视图和函数的权限,亦可以对dbms\_perf模式的对象权限进行授予或收回。 +监控管理员是指具有MONADMIN属性的帐户,具有查看dbe\_perf模式下视图和函数的权限,亦可以对dbe\_perf模式的对象权限进行授予或收回。 要创建新的监控管理员,请以初始用户身份连接数据库,并使用带MONADMIN选项的[CREATE USER](CREATE-USER.md)语句或 [ALTER USER](ALTER-USER.md)语句进行设置。 diff --git "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223\345\256\211\345\205\250.md" "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223\345\256\211\345\205\250.md" index 6f718c316..da0064486 100644 --- "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223\345\256\211\345\205\250.md" +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\346\225\260\346\215\256\345\272\223\345\256\211\345\205\250.md" @@ -1,6 +1,6 @@ # 管理数据库安全 -- **[客户端接入认证](客户端接入认证-0.md)** +- **[客户端接入认证](客户端接入认证.md)** - **[管理用户及权限](管理用户及权限.md)** diff --git "a/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242.md" "b/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242.md" index e97377642..44cd77123 100644 --- "a/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242.md" +++ "b/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242.md" @@ -1,6 +1,6 @@ # 类型转换 -- **[概述](概述-15.md)** +- **[概述](概述-16.md)** - **[操作符](操作符.md)** diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\344\277\241\346\201\257\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\344\277\241\346\201\257\345\207\275\346\225\260.md" index ab5509a16..12691e36b 100644 --- "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\344\277\241\346\201\257\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\344\277\241\346\201\257\345\207\275\346\225\260.md" @@ -110,9 +110,9 @@ (1 row) ``` - 备注:current\_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过[SET ROLE](SET-ROLE.md#ZH-CN_TOPIC_0242370652)改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 + 备注:current\_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过[SET ROLE](SET-ROLE.md)改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 -- pg\_current\_user\(\) +- pg\_current\_sessionid\(\) 描述:当前执行环境下的会话ID。 @@ -353,7 +353,7 @@ (1 row) ``` - 备注:session\_user通常是连接当前数据库的初始用户,不过系统管理员可以用[SET SESSION AUTHORIZATION](SET-SESSION-AUTHORIZATION.md#ZH-CN_TOPIC_0242370653)修改这个设置。 + 备注:session\_user通常是连接当前数据库的初始用户,不过系统管理员可以用[SET SESSION AUTHORIZATION](SET-SESSION-AUTHORIZATION.md)修改这个设置。 - user @@ -477,7 +477,7 @@ 返回类型:Boolean - 备注:has\_function\_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has\_table\_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考[对象标识符类型](对象标识符类型.md#ZH-CN_TOPIC_0242370424))。访问权限类型必须是EXECUTE。 + 备注:has\_function\_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has\_table\_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考[对象标识符类型](对象标识符类型.md))。访问权限类型必须是EXECUTE。 - has\_language\_privilege\(user, language, privilege\) @@ -777,18 +777,6 @@ postgres=# SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); 备注:pg\_get\_keywords返回一组关于描述服务器识别SQL关键字的记录。word列包含关键字。catcode列包含一个分类代码:U表示通用的,C表示列名,T表示类型或函数名,或R表示保留。catdesc列包含了一个可能本地化描述分类的字符串。 -- pg\_get\_ruledef\(rule\_oid\) - - 描述:获取规则的CREATE RULE命令 - - 返回类型:text - -- pg\_get\_ruledef\(rule\_oid, pretty\_bool\) - - 描述:获取规则的CREATE RULE命令 - - 返回类型:text - - pg\_get\_userbyid\(role\_oid\) 描述:获取给定OID的角色名 @@ -871,7 +859,7 @@ postgres=# SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); 返回类型:regtype - 备注:pg\_typeof返回传递给他的值的数据类型OID。这可能有助于故障排除或动态构造SQL查询。声明此函数返回regtype,这是一个OID别名类型(请参考[对象标识符类型](对象标识符类型.md#ZH-CN_TOPIC_0242370424));这意味着它是一个为了比较而显示类型名称的OID。 + 备注:pg\_typeof返回传递给他的值的数据类型OID。这可能有助于故障排除或动态构造SQL查询。声明此函数返回regtype,这是一个OID别名类型(请参考[对象标识符类型](对象标识符类型.md));这意味着它是一个为了比较而显示类型名称的OID。 示例: diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\223\215\344\275\234.md" index fa62627f6..11551873c 100644 --- "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\223\215\344\275\234.md" +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\223\215\344\275\234.md" @@ -8,15 +8,15 @@ openGauss通过SQL语句执行不同的系统操作,比如:设置变量, ## 显示执行计划 -显示openGauss为SQL语句规划的执行计划,请参考[EXPLAIN](EXPLAIN.md#ZH-CN_TOPIC_0242370627)。 +显示openGauss为SQL语句规划的执行计划,请参考[EXPLAIN](EXPLAIN.md)。 ## 事务日志检查点 -预写式日志(WAL)缺省时在事务日志中每隔一段时间放置一个检查点。CHECKPOINT强迫立即进行检查,而不是等到下一次调度时的检查点。请参考[CHECKPOINT](CHECKPOINT.md#ZH-CN_TOPIC_0242370553)。 +预写式日志(WAL)缺省时在事务日志中每隔一段时间放置一个检查点。CHECKPOINT强迫立即进行检查,而不是等到下一次调度时的检查点。请参考[CHECKPOINT](CHECKPOINT.md)。 ## 垃圾收集 -进行垃圾收集以及可选择的对数据库进行分析。请参考[VACUUM](VACUUM.md#ZH-CN_TOPIC_0242370659)。 +进行垃圾收集以及可选择的对数据库进行分析。请参考[VACUUM](VACUUM.md)。 ## 收集统计信息 @@ -24,5 +24,5 @@ openGauss通过SQL语句执行不同的系统操作,比如:设置变量, ## 设置当前事务的约束检查模式 -设置当前事务里的约束检查的特性。请参考[SET CONSTRAINTS](SET-CONSTRAINTS.md#ZH-CN_TOPIC_0242370651)。 +设置当前事务里的约束检查的特性。请参考[SET CONSTRAINTS](SET-CONSTRAINTS.md)。 diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\247\206\345\233\276.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\247\206\345\233\276.md" index 8d0fc22f7..fdff4254a 100644 --- "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\247\206\345\233\276.md" +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\247\206\345\233\276.md" @@ -1,7 +1,5 @@ # 系统视图 -- **[GET\_GTM\_LITE\_STATUS](GET_GTM_LITE_STATUS.md)** - - **[GS\_SESSION\_CPU\_STATISTICS](GS_SESSION_CPU_STATISTICS.md)** - **[GS\_SESSION\_MEMORY\_STATISTICS](GS_SESSION_MEMORY_STATISTICS.md)** @@ -33,7 +31,7 @@ - **[MPP\_TABLES](MPP_TABLES.md)** - **[PG\_AVAILABLE\_EXTENSION\_VERSIONS](PG_AVAILABLE_EXTENSION_VERSIONS.md)** -PG\_AVAILABLE\_EXTENSION\_VERSIONS视图显示数据库中某些特性的扩展版本信息。 + - **[PG\_AVAILABLE\_EXTENSIONS](PG_AVAILABLE_EXTENSIONS.md)** - **[PG\_CURSORS](PG_CURSORS.md)** @@ -66,8 +64,6 @@ PG\_AVAILABLE\_EXTENSION\_VERSIONS视图显示数据库中某些特性的扩展 - **[PG\_RULES](PG_RULES.md)** -- **[PG\_RUNNING\_XACTS](PG_RUNNING_XACTS.md)** - - **[PG\_SECLABELS](PG_SECLABELS.md)** - **[PG\_SESSION\_WLMSTAT](PG_SESSION_WLMSTAT.md)** @@ -140,8 +136,6 @@ PG\_AVAILABLE\_EXTENSION\_VERSIONS视图显示数据库中某些特性的扩展 - **[PG\_TIMEZONE\_NAMES](PG_TIMEZONE_NAMES.md)** -- **[PG\_TOTAL\_MEMORY\_DETAIL](PG_TOTAL_MEMORY_DETAIL.md)** - - **[PG\_TOTAL\_USER\_RESOURCE\_INFO](PG_TOTAL_USER_RESOURCE_INFO.md)** - **[PG\_USER](PG_USER.md)** @@ -162,15 +156,13 @@ PG\_AVAILABLE\_EXTENSION\_VERSIONS视图显示数据库中某些特性的扩展 - **[GS\_SESSION\_MEMORY](GS_SESSION_MEMORY.md)** -- **[GS\_SESSION\_MEMORY\_CONTEXT](GS_SESSION_MEMORY_CONTEXT.md)** - - **[GS\_SESSION\_MEMORY\_DETAIL](GS_SESSION_MEMORY_DETAIL.md)** - **[GS\_SESSION\_STAT](GS_SESSION_STAT.md)** - **[GS\_SESSION\_TIME](GS_SESSION_TIME.md)** -- **[GS\_THREAD\_MEMORY\_CONTEXT](GS_THREAD_MEMORY_CONTEXT.md)** +- **[GS\_THREAD\_MEMORY\_DETAIL](GS_THREAD_MEMORY_DETAIL.md)** - **[GS\_TOTAL\_MEMORY\_DETAIL](GS_TOTAL_MEMORY_DETAIL.md)** diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\260\203\344\274\230\346\214\207\345\215\227.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\260\203\344\274\230\346\214\207\345\215\227.md" new file mode 100644 index 000000000..c03933745 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\260\203\344\274\230\346\214\207\345\215\227.md" @@ -0,0 +1,11 @@ +# 系统调优指南 + +系统调优是指进行操作系统级以及数据库系统级的调优,更充分地利用机器的CPU、内存、I/O和网络资源,避免资源冲突,提升整个系统查询的吞吐量。 + +- **[操作系统参数调优](操作系统参数调优.md)** +在性能调优过程中,可以根据实际业务情况修改关键操作系统\(OS\)配置参数,以提升openGauss数据库的性能。 +- **[数据库系统参数调优](数据库系统参数调优.md)** + +- **[配置LLVM](配置LLVM.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\273\217\351\252\214\346\200\273\347\273\223-SQL\350\257\255\345\217\245\346\224\271\345\206\231\350\247\204\345\210\231.md" "b/content/zh/docs/Developerguide/\347\273\217\351\252\214\346\200\273\347\273\223-SQL\350\257\255\345\217\245\346\224\271\345\206\231\350\247\204\345\210\231.md" new file mode 100644 index 000000000..61c962f19 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\273\217\351\252\214\346\200\273\347\273\223-SQL\350\257\255\345\217\245\346\224\271\345\206\231\350\247\204\345\210\231.md" @@ -0,0 +1,57 @@ +# 经验总结:SQL语句改写规则 + +根据数据库的SQL执行机制以及大量的实践,总结发现:通过一定的规则调整SQL语句,在保证结果正确的基础上,能够提高SQL执行效率。如果遵守这些规则,常常能够大幅度提升业务查询效率。 + +- **使用union all代替union** + + union在合并两个集合时会执行去重操作,而union all则直接将两个结果集合并、不执行去重。执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认两个集合不存在重叠,可用union all替代union以便提升性能。 + +- **join列增加非空过滤条件** + + 若join列上的NULL值较多,则可以加上is not null过滤条件,以实现数据的提前过滤,提高join效率。 + +- **not in转not exists** + + not in语句需要使用nestloop anti join来实现,而not exists则可以通过hash anti join来实现。在join列不存在null值的情况下,not exists和not in等价。因此在确保没有null值时,可以通过将not in转换为not exists,通过生成hash join来提升查询效率。 + + 如下所示,如果t2.d2字段中没有null值\(t2.d2字段在表定义中not null\)查询可以修改为 + + ``` + SELECT * FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t1.c1=t2.d2); + ``` + + 产生的计划如下: + + ``` + QUERY PLAN + ------------------------------ + Hash Anti Join + Hash Cond: (t1.c1 = t2.d2) + -> Seq Scan on t1 + -> Hash + -> Seq Scan on t2 + (5 rows) + ``` + +- **选择hashagg。** + + 查询中GROUP BY语句如果生成了groupagg+sort的plan性能会比较差,可以通过加大work\_mem的方法生成hashagg的plan,因为不用排序而提高性能。 + +- **尝试将函数替换为case语句。** + + openGauss函数调用性能较低,如果出现过多的函数调用导致性能下降很多,可以根据情况把可下推函数的函数改成CASE表达式。 + +- **避免对索引使用函数或表达式运算。** + + 对索引使用函数或表达式运算会停止使用索引转而执行全表扫描。 + +- **尽量避免在where子句中使用!=或<\>操作符、null值判断、or连接、参数隐式转换。** +- **对复杂SQL语句进行拆分。** + + 对于过于复杂并且不易通过以上方法调整性能的SQL可以考虑拆分的方法,把SQL中某一部分拆分成独立的SQL并把执行结果存入临时表,拆分常见的场景包括但不限于: + + - 作业中多个SQL有同样的子查询,并且子查询数据量较大。 + - Plan cost计算不准,导致子查询hash bucket太小,比如实际数据1000W行,hash bucket只有1000。 + - 函数(如substr,to\_number)导致大数据量子查询选择度计算不准。 + + diff --git "a/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\345\207\275\346\225\260.md" index 2d2d38fb3..f7ceaa17a 100644 --- "a/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\345\207\275\346\225\260.md" @@ -360,28 +360,28 @@ - - - -

      参数

      描述

      +

      描述

      取值范围

      +

      取值范围

      ssl

      +

      ssl

      表示是否启动SSL功能。

      +

      表示是否启动SSL功能。

      • on:开启SSL功能。
      • off:关闭SSL功能。
      +
      • on:开启SSL功能。
      • off:关闭SSL功能。

      默认值:on

      require_ssl

      +

      require_ssl

      设置服务器端是否强制要求SSL连接。该参数只有当参数ssl为on时才有效。

      +

      设置服务器端是否强制要求SSL连接。该参数只有当参数ssl为on时才有效。

      • on:服务器端强制要求SSL连接。
      • off:服务器端对是否通过SSL连接不作强制要求。
      +
      • on:服务器端强制要求SSL连接。
      • off:服务器端对是否通过SSL连接不作强制要求。

      默认值:off

      ssl_cert_file

      +

      ssl_cert_file

      指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。

      +

      指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。

      请以实际的证书名为准。必须使用相对路径,相对路径是相对于数据目录的。

      +

      请以实际的证书名为准。必须使用相对路径,相对路径是相对于数据目录的。

      默认值:server.crt

      ssl_key_file

      +

      ssl_key_file

      指定服务器私钥文件,用以对公钥加密的数据进行解密。

      +

      指定服务器私钥文件,用以对公钥加密的数据进行解密。

      请以实际的服务器私钥名称为准。必须使用相对路径,相对路径是相对于数据目录的。

      +

      请以实际的服务器私钥名称为准。必须使用相对路径,相对路径是相对于数据目录的。

      默认值:server.key

      ssl_ca_file

      +

      ssl_ca_file

      CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。

      +

      CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。

      请以实际的CA服务器根证书名称为准。

      -

      默认值cacert.pem

      +

      请以实际的CA服务器根证书名称为准。

      +

      默认值:cacert.pem

      ssl_crl_file

      +

      ssl_crl_file

      证书吊销列表,如果客户端证书在该列表中,则当前客户端证书被视为无效证书。

      +

      证书吊销列表,如果客户端证书在该列表中,则当前客户端证书被视为无效证书。

      请以实际的证书吊销列表名称为准。

      +

      请以实际的证书吊销列表名称为准。

      默认值:空,表示没有吊销列表。

      ssl_ciphers

      +

      ssl_ciphers

      SSL通讯使用的加密算法。

      +

      SSL通讯使用的加密算法。

      本产品支持的加密算法的详细信息请参见表4

      +

      本产品支持的加密算法的详细信息请参见表4

      默认值:ALL,表示允许对端使用产品支持的所有加密算法,但不包含ADH、LOW、EXP、MD5算法。

      int4

      当前该用户io在数据库节点中的最小值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      +

      当前该用户io在数据库节点中的最小值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      max_curr_iops

      int4

      当前该用户io在数据库节点中的最大值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      +

      当前该用户io在数据库节点中的最大值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      min_peak_iops

      int4

      该用户io峰值中,数据库节点的最小值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      +

      该用户io峰值中,数据库节点的最小值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      max_peak_iops

      int4

      该用户io峰值中,数据库节点的最大值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      +

      该用户io峰值中,数据库节点的最大值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

      io_limits

      @@ -925,7 +925,7 @@
      -- DBMS\_PERF.get\_global\_instance\_time\(\) +- DBE\_PERF.get\_global\_instance\_time\(\) 描述:提供openGauss各个关键阶段的时间消耗,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 @@ -933,7 +933,7 @@ - get\_instr\_unique\_sql\(\) - 描述:获取当前结点的执行语句(归一化SQL)信息,查询该函数必须具有sysadmin权限。 + 描述:获取当前节点的执行语句(归一化SQL)信息,查询该函数必须具有sysadmin权限。 返回值类型:record @@ -951,65 +951,53 @@ - get\_instr\_user\_login\(\) - 描述:获取当前结点的用户登入登出次数信息,查询该函数必须具有sysadmin权限。 + 描述:获取当前节点的用户登入登出次数信息,查询该函数必须具有sysadmin权限。 返回值类型:record - get\_instr\_rt\_percentile\(\) - 描述:获取CCN结点SQL 响应时间P80,P95分布信息,openGauss统一的信息在CCN节点上,其他节点查询为0。 + 描述:获取CCN节点SQL 响应时间P80,P95分布信息,openGauss统一的信息在CCN节点上,其他节点查询为0。 返回值类型:record - get\_node\_stat\_reset\_time\(\) - 描述:获取当前结点的统计信息重置(重启,主备倒换,数据库删除)时间。 + 描述:获取当前节点的统计信息重置(重启,主备倒换,数据库删除)时间。 返回值类型:record -- dbms\_perf.get\_average\_value\(\) - - 描述:获取当前结点的统计信息重置(重启,主备倒换,数据库删除)时间。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_os\_runtime\(\) +- DBE\_PERF.get\_global\_os\_runtime\(\) 描述:显示当前操作系统运行的状态信息,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_os\_threads\(\) - - 描述:提供openGauss中所有正常节点下的线程状态信息,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_os\_threads\(\) +- DBE\_PERF.get\_global\_os\_threads\(\) 描述:提供openGauss中所有正常节点下的线程状态信息,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_workload\_sql\_count\(\) +- DBE\_PERF.get\_summary\_workload\_sql\_count\(\) 描述:提供openGauss中不同负载SELECT,UPDATE,INSERT,DELETE,DDL, DML,DCL计数信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_workload\_sql\_elapse\_time\(\) +- DBE\_PERF.get\_summary\_workload\_sql\_elapse\_time\(\) 描述:提供openGauss中不同负载SELECT,UPDATE,INSERT,DELETE,响应时间信息(TOTAL,AVG, MIN, MAX),查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_workload\_transaction\(\) +- DBE\_PERF.get\_global\_workload\_transaction\(\) 描述:获取openGauss内所有节点上的事务量信息,事务时间信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_session\_stat\(\) +- DBE\_PERF.get\_global\_session\_stat\(\) 描述:获取openGauss节点上的会话状态信息,查询该函数必须具有sysadmin权限。 @@ -1021,19 +1009,19 @@ >blocks\_read\_time,blocks\_write\_time,sort\_imemory,sort\_idisk,cu\_mem\_hit, >cu\_hdd\_sync\_read,cu\_hdd\_asyread -- DBMS\_PERF.get\_global\_session\_time\(\) +- DBE\_PERF.get\_global\_session\_time\(\) 描述:提供openGauss各节点各个关键阶段的时间消耗,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_session\_memory\(\) +- DBE\_PERF.get\_global\_session\_memory\(\) 描述:汇聚各节点的Session级别的内存使用情况,包含执行作业在数据节点上Postgres线程和Stream线程分配的所有内存,单位为MB,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_session\_memory\_detail\(\) +- DBE\_PERF.get\_global\_session\_memory\_detail\(\) 描述:汇聚各节点的线程的内存使用情况,以MemoryContext节点来统计,查询该函数必须具有sysadmin权限。 @@ -1045,487 +1033,403 @@ 返回值类型:record -- DBMS\_PERF.get\_global\_session\_stat\_activity\(\) +- DBE\_PERF.get\_global\_session\_stat\_activity\(\) 描述:汇聚openGauss内各节点上正在运行的线程相关的信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_thread\_wait\_status\(\) +- DBE\_PERF.get\_global\_thread\_wait\_status\(\) - 描述:汇聚所有结点上工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况,查询该函数必须具有sysadmin权限。 + 描述:汇聚所有节点上工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_wlm\_controlgroup\_ng\_config\(\) - - 描述:数据库内所有的控制组信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_wlm\_user\_resource\_runtime\(\) +- DBE\_PERF.get\_wlm\_user\_resource\_runtime\(\) 描述:显示所有用户资源使用情况,参数use\_workload\_manager为on时才有效,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_wlm\_workload\_runtime\(\) - - 描述:汇聚当前用户在数据库主节点上执行作业时在数据库主节点上的状态信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_operator\_ec\_history\(\) - - 描述:汇聚当前用户在数据库主节点上EC算子的历史状态信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_operator\_ec\_history\_table\(\) - - 描述:汇聚当前用户在数据库主节点上EC算子的历史状态信息(持久化),查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_operator\_ec\_runtime\(\) - - 描述:汇聚当前用户在数据库主节点上EC算子的实时状态信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_operator\_history\_table\(\) +- DBE\_PERF.get\_global\_operator\_history\_table\(\) 描述:汇聚当前用户数据库主节点上执行作业结束后的算子相关记录(持久化),查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_operator\_history\(\) +- DBE\_PERF.get\_global\_operator\_history\(\) 描述:汇聚当前用户数据库主节点上执行作业结束后的算子相关记录,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_operator\_runtime\(\) +- DBE\_PERF.get\_global\_operator\_runtime\(\) 描述:汇聚当前用户数据库主节点上执行作业实时的算子相关记录,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statement\_complex\_history\(\) +- DBE\_PERF.get\_global\_statement\_complex\_history\(\) 描述:汇聚当前用户数据库主节点上复杂查询的历史记录,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statement\_complex\_history\_table\(\) +- DBE\_PERF.get\_global\_statement\_complex\_history\_table\(\) 描述:汇聚当前用户数据库主节点上复杂查询的历史记录(持久化),查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statement\_complex\_runtime\(\) +- DBE\_PERF.get\_global\_statement\_complex\_runtime\(\) 描述:汇聚当前用户数据库主节点上复杂查询的实时信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_memory\_node\_detail\(\) +- DBE\_PERF.get\_global\_memory\_node\_detail\(\) 描述:汇聚所有节点某个数据库节点内存使用情况,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_shared\_memory\_detail\(\) +- DBE\_PERF.get\_global\_shared\_memory\_detail\(\) 描述:汇聚所有节点已产生的共享内存上下文的使用信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_comm\_delay\(\) - - 描述:汇聚数据库节点的通信库时延状态,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_comm\_recv\_stream\(\) - - 描述:汇聚数据库节点的通信库接收流状态,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_comm\_send\_stream\(\) - - 描述:汇聚数据库节点的通信库发送流状态,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_comm\_status\(\) - - 描述:汇聚数据库节点的通信库状态,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_statio\_all\_indexes +- DBE\_PERF.get\_global\_statio\_all\_indexes 描述:汇聚所有节点当前数据库中的每个索引行,显示特定索引的I/O的统计,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_local\_toastname\_and\_toastindexname\(\) +- DBE\_PERF.get\_local\_toastname\_and\_toastindexname\(\) 描述:提供本地toast表的name和index和其关联表的对应关系。 返回值类型:record -- DBMS\_PERF.get\_summary\_statio\_all\_indexes +- DBE\_PERF.get\_summary\_statio\_all\_indexes\(\) 描述:统计所有节点当前数据库中的每个索引行,显示特定索引的I/O的统计,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_all\_sequences +- DBE\_PERF.get\_global\_statio\_all\_sequences\(\) 描述:提供命名空间中所有sequences的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_all\_tables +- DBE\_PERF.get\_global\_statio\_all\_tables\(\) 描述:汇聚各节点的数据库中每个表I/O的统计,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_statio\_all\_tables +- DBE\_PERF.get\_summary\_statio\_all\_tables\(\) 描述:统计openGauss内数据库中每个表I/O的统计,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_local\_toast\_relation\(\) +- DBE\_PERF.get\_local\_toast\_relation\(\) - 描述:提供本地toast表的name和其关联表的对应关系。 + 描述:提供本地toast表的name和其关联表的对应关系,查询该函数必须具有sysadmin权限 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_sys\_indexes\(\) +- DBE\_PERF.get\_global\_statio\_sys\_indexes\(\) 描述:汇聚各节点的命名空间中所有系统表索引的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_statio\_sys\_indexes\(\) +- DBE\_PERF.get\_summary\_statio\_sys\_indexes\(\) 描述:统计各节点的命名空间中所有系统表索引的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_sys\_sequences\(\) +- DBE\_PERF.get\_global\_statio\_sys\_sequences\(\) 描述:提供命名空间中所有系统表为sequences的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_sys\_tables\(\) +- DBE\_PERF.get\_global\_statio\_sys\_tables\(\) 描述:提供各节点的命名空间中所有系统表的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_statio\_sys\_tables\(\) +- DBE\_PERF.get\_summary\_statio\_sys\_tables\(\) 描述:openGauss内汇聚命名空间中所有系统表的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_user\_indexes\(\) +- DBE\_PERF.get\_global\_statio\_user\_indexes\(\) 描述:各节点的命名空间中所有用户关系表索引的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_statio\_user\_indexes\(\) +- DBE\_PERF.get\_summary\_statio\_user\_indexes\(\) 描述:openGauss内汇聚命名空间中所有用户关系表索引的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_user\_sequences\(\) +- DBE\_PERF.get\_global\_statio\_user\_sequences\(\) 描述:显示各节点的命名空间中所有用户的sequences的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statio\_user\_tables\(\) +- DBE\_PERF.get\_global\_statio\_user\_tables\(\) 描述:显示各节点的命名空间中所有用户关系表的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_statio\_user\_tables\(\) +- DBE\_PERF.get\_summary\_statio\_user\_tables\(\) 描述:openGauss内汇聚命名空间中所有用户关系表的IO状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_stat\_db\_cu\(\) +- DBE\_PERF.get\_stat\_db\_cu\(\) 描述:视图查询openGauss各个节点,每个数据库的CU命中情况,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_dn\_stat\_all\_tables\(\) - - 描述:汇聚数据库节点结点数据库中每个表的统计信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_cn\_stat\_all\_tables\(\) +- DBE\_PERF.get\_global\_stat\_all\_indexes\(\) - 描述:汇聚数据库主节点结点数据库中每个表的统计信息,查询该函数必须具有sysadmin权限。 + 描述:汇聚所有节点数据库中每个索引的统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_dn\_stat\_all\_tables\(\) +- DBE\_PERF.get\_summary\_stat\_all\_indexes\(\) - 描述:统计数据库节点结点数据库中每个表的统计信息,查询该函数必须具有sysadmin权限。 + 描述:统计所有节点数据库中每个索引的统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_cn\_stat\_all\_tables\(\) - - 描述:统计数据库主节点结点数据库中每个表的统计信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_stat\_all\_indexes\(\) - - 描述:汇聚所有结点数据库中每个索引的统计信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_summary\_stat\_all\_indexes\(\) - - 描述:统计所有结点数据库中每个索引的统计信息,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_stat\_sys\_tables\(\) +- DBE\_PERF.get\_global\_stat\_sys\_tables\(\) 描述:汇聚各节点pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_sys\_tables\(\) +- DBE\_PERF.get\_summary\_stat\_sys\_tables\(\) 描述:统计各节点pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_sys\_indexes\(\) +- DBE\_PERF.get\_global\_stat\_sys\_indexes\(\) 描述:汇聚各节点pg\_catalog、information\_schema模式中所有系统表的索引状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_sys\_indexes\(\) +- DBE\_PERF.get\_summary\_stat\_sys\_indexes\(\) 描述:统计各节点pg\_catalog、information\_schema模式中所有系统表的索引状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_user\_tables\(\) +- DBE\_PERF.get\_global\_stat\_user\_tables\(\) 描述:汇聚所有命名空间中用户自定义普通表的状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_user\_tables\(\) +- DBE\_PERF.get\_summary\_stat\_user\_tables\(\) 描述:统计所有命名空间中用户自定义普通表的状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_user\_indexes\(\) +- DBE\_PERF.get\_global\_stat\_user\_indexes\(\) 描述:汇聚所有数据库中用户自定义普通表的索引状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_user\_indexes\(\) +- DBE\_PERF.get\_summary\_stat\_user\_indexes\(\) 描述:统计所有数据库中用户自定义普通表的索引状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_database\(\) +- DBE\_PERF.get\_global\_stat\_database\(\) 描述:汇聚所有节点数据库统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_database\_conflicts\(\) +- DBE\_PERF.get\_global\_stat\_database\_conflicts\(\) 描述:统计所有节点数据库统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_xact\_all\_tables\(\) +- DBE\_PERF.get\_global\_stat\_xact\_all\_tables\(\) 描述:汇聚命名空间中所有普通表和toast表的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_xact\_all\_tables\(\) +- DBE\_PERF.get\_summary\_stat\_xact\_all\_tables\(\) 描述:统计命名空间中所有普通表和toast表的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_xact\_sys\_tables\(\) +- DBE\_PERF.get\_global\_stat\_xact\_sys\_tables\(\) 描述:汇聚所有节点命名空间中系统表的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_xact\_sys\_tables\(\) +- DBE\_PERF.get\_summary\_stat\_xact\_sys\_tables\(\) 描述:统计所有节点命名空间中系统表的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_xact\_user\_tables\(\) +- DBE\_PERF.get\_global\_stat\_xact\_user\_tables\(\) 描述:汇聚所有节点命名空间中用户表的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_stat\_xact\_user\_tables\(\) +- DBE\_PERF.get\_summary\_stat\_xact\_user\_tables\(\) 描述:统计所有节点命名空间中用户表的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_user\_functions\(\) +- DBE\_PERF.get\_global\_stat\_user\_functions\(\) 描述:汇聚所有节点命名空间中用户定义函数的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_xact\_user\_functions\(\) +- DBE\_PERF.get\_global\_stat\_xact\_user\_functions\(\) 描述:统计所有节点命名空间中用户定义函数的事务状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_stat\_bad\_block\(\) +- DBE\_PERF.get\_global\_stat\_bad\_block\(\) 描述:汇聚所有节点表、索引等文件的读取失败信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_file\_redo\_iostat\(\) +- DBE\_PERF.get\_global\_file\_redo\_iostat\(\) 描述:统计所有节点表、索引等文件的读取失败信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_file\_iostat\(\) +- DBE\_PERF.get\_global\_file\_iostat\(\) 描述:汇聚所有节点数据文件IO的统计,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_locks\(\) +- DBE\_PERF.get\_global\_locks\(\) 描述:汇聚所有节点的锁信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_replication\_slots\(\) +- DBE\_PERF.get\_global\_replication\_slots\(\) 描述:汇聚所有节点上逻辑复制信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_bgwriter\_stat\(\) +- DBE\_PERF.get\_global\_bgwriter\_stat\(\) 描述:汇聚所有节点后端写进程活动的统计信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_replication\_stat\(\) +- DBE\_PERF.get\_global\_replication\_stat\(\) 描述:汇聚各节点日志同步状态信息,如发起端发送日志位置,收端接收日志位置等,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_pooler\_status\(\) - - 描述:汇聚数据库主节点的pooler中的缓存连接状态,查询该函数必须具有sysadmin权限。 - - 返回值类型:record - -- DBMS\_PERF.get\_global\_transactions\_running\_xacts\(\) +- DBE\_PERF.get\_global\_transactions\_running\_xacts\(\) 描述:汇聚各节点运行事务的信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_transactions\_running\_xacts\(\) +- DBE\_PERF.get\_summary\_transactions\_running\_xacts\(\) 描述:统计各节点运行事务的信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_transactions\_prepared\_xacts\(\) +- DBE\_PERF.get\_global\_transactions\_prepared\_xacts\(\) 描述:汇聚各节点当前准备好进行两阶段提交的事务的信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_transactions\_prepared\_xacts\(\) +- DBE\_PERF.get\_summary\_transactions\_prepared\_xacts\(\) 描述:统计各节点当前准备好进行两阶段提交的事务的信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_statement\(\) +- DBE\_PERF.get\_summary\_statement\(\) 描述:汇聚各节点历史执行语句状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_statement\_count\(\) +- DBE\_PERF.get\_global\_statement\_count\(\) 描述:汇聚各节点SELECT,UPDATE,INSERT,DELETE,响应时间信息(TOTAL,AVG, MIN, MAX),查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_config\_settings\(\) +- DBE\_PERF.get\_global\_config\_settings\(\) 描述:汇聚各节点GUC参数配置信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_wait\_events\(\) +- DBE\_PERF.get\_global\_wait\_events\(\) 描述:汇聚各节点wait events状态信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_statement\_responsetime\_percentile\(\) +- DBE\_PERF.get\_statement\_responsetime\_percentile\(\) 描述:获取openGaussSQL响应时间P80,P95分布信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_summary\_user\_login\(\) +- DBE\_PERF.get\_summary\_user\_login\(\) 描述:统计openGauss各节点用户登入登出次数信息,查询该函数必须具有sysadmin权限。 返回值类型:record -- DBMS\_PERF.get\_global\_record\_reset\_time\(\) +- DBE\_PERF.get\_global\_record\_reset\_time\(\) 描述:汇聚openGauss统计信息重置(重启,主备倒换,数据库删除)时间,查询该函数必须具有sysadmin权限。 @@ -1543,70 +1447,12 @@ 返回值类型:record -- DBMS\_PERF.get\_global\_rel\_iostat\(\) +- DBE\_PERF.get\_global\_rel\_iostat\(\) 描述:汇聚所有节点数据文件IO的统计,查询该函数必须具有sysadmin权限。 返回值类型:record -- 函数返回字段描述如下: - -**表 1** PGXC\_GTM\_SNAPSHOT\_STATUS返回参数说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      名称

      -

      类型

      -

      描述

      -

      xmin

      -

      xid

      -

      仍在运行的最小事务号。

      -

      xmax

      -

      xid

      -

      已完成的所有事务号中最大事务号的下一个事务号。

      -

      csn

      -

      integer

      -

      待提交事务的序列号。

      -

      oldestxmin

      -

      xid

      -

      当前最早的活跃事务在其取快照时,所有运行事务号最小的事务。

      -

      xcnt

      -

      integer

      -

      当前活跃的事务个数。

      -

      running_xids

      -

      text

      -

      当前活跃的事务号。

      -
      - 示例: @@ -1630,5 +1476,3 @@ postgres=# SELECT pg_stat_get_backend_pid(1); (1 row) ``` ->![](public_sys-resources/icon-notice.gif) **须知:** - diff --git "a/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\350\260\203\344\274\230.md" "b/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\350\260\203\344\274\230.md" new file mode 100644 index 000000000..dbecdd2e0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\350\260\203\344\274\230.md" @@ -0,0 +1,93 @@ +# 统计信息调优 + +## 统计信息调优介绍 + +openGauss是基于代价估算生成的最优执行计划。优化器需要根据analyze收集的统计信息行数估算和代价估算,因此统计信息对优化器行数估算和代价估算起着至关重要的作用。通过analyze收集全局统计信息,主要包括:pg\_class表中的relpages和reltuples;pg\_statistic表中的stadistinct、stanullfrac、stanumbersN、stavaluesN、histogram\_bounds等。 + +## 实例分析1:未收集统计信息导致查询性能差 + +在很多场景下,由于查询中涉及到的表或列没有收集统计信息,会对查询性能有很大的影响。 + +表结构如下所示: + +``` +CREATE TABLE LINEITEM +( +L_ORDERKEY BIGINT NOT NULL +, L_PARTKEY BIGINT NOT NULL +, L_SUPPKEY BIGINT NOT NULL +, L_LINENUMBER BIGINT NOT NULL +, L_QUANTITY DECIMAL(15,2) NOT NULL +, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL +, L_DISCOUNT DECIMAL(15,2) NOT NULL +, L_TAX DECIMAL(15,2) NOT NULL +, L_RETURNFLAG CHAR(1) NOT NULL +, L_LINESTATUS CHAR(1) NOT NULL +, L_SHIPDATE DATE NOT NULL +, L_COMMITDATE DATE NOT NULL +, L_RECEIPTDATE DATE NOT NULL +, L_SHIPINSTRUCT CHAR(25) NOT NULL +, L_SHIPMODE CHAR(10) NOT NULL +, L_COMMENT VARCHAR(44) NOT NULL +) with (orientation = column, COMPRESSION = MIDDLE); + +CREATE TABLE ORDERS +( +O_ORDERKEY BIGINT NOT NULL +, O_CUSTKEY BIGINT NOT NULL +, O_ORDERSTATUS CHAR(1) NOT NULL +, O_TOTALPRICE DECIMAL(15,2) NOT NULL +, O_ORDERDATE DATE NOT NULL +, O_ORDERPRIORITY CHAR(15) NOT NULL +, O_CLERK CHAR(15) NOT NULL +, O_SHIPPRIORITY BIGINT NOT NULL +, O_COMMENT VARCHAR(79) NOT NULL +)with (orientation = column, COMPRESSION = MIDDLE); +``` + +查询语句如下所示: + +``` +explain verbose select +count(*) as numwait +from +lineitem l1, +orders +where +o_orderkey = l1.l_orderkey +and o_orderstatus = 'F' +and l1.l_receiptdate > l1.l_commitdate +and not exists ( +select +* +from +lineitem l3 +where +l3.l_orderkey = l1.l_orderkey +and l3.l_suppkey <> l1.l_suppkey +and l3.l_receiptdate > l3.l_commitdate +) +order by +numwait desc; +``` + +当出现该问题时,可以通过如下方法确认查询中涉及到的表或列有没有做过analyze收集统计信息。 + +1. 通过explain verbose执行query分析执行计划时会提示WARNING信息,如下所示: + + ``` + WARNING:Statistics in some tables or columns(public.lineitem.l_receiptdate, public.lineitem.l_commitdate, public.lineitem.l_orderkey, public.lineitem.l_suppkey, public.orders.o_orderstatus, public.orders.o_orderkey) are not collected. + HINT:Do analyze for them in order to generate optimized plan. + ``` + +2. 可以通过在pg\_log目录下的日志文件中查找以下信息来确认是当前执行的query是否由于没有收集统计信息导致查询性能变差。 + + ``` + 2017-06-14 17:28:30.336 CST 140644024579856 20971684 [BACKEND] LOG:Statistics in some tables or columns(public.lineitem.l_receiptdate, public.lineitem.l_commitdate, public.lineitem.l_orderkey, public.linei + tem.l_suppkey, public.orders.o_orderstatus, public.orders.o_orderkey) are not collected. + 2017-06-14 17:28:30.336 CST 140644024579856 20971684 [BACKEND] HINT:Do analyze for them in order to generate optimized plan. + ``` + + +当通过以上方法查看到哪些表或列没有做analyze,可以通过对WARNING或日志中上报的表或列做analyze可以解决由于为收集统计信息导致查询变慢的问题。 + diff --git "a/content/zh/docs/Developerguide/\347\273\264\346\212\244\345\256\241\350\256\241\346\227\245\345\277\227.md" "b/content/zh/docs/Developerguide/\347\273\264\346\212\244\345\256\241\350\256\241\346\227\245\345\277\227.md" index b3e9f34d0..0aca73388 100644 --- "a/content/zh/docs/Developerguide/\347\273\264\346\212\244\345\256\241\350\256\241\346\227\245\345\277\227.md" +++ "b/content/zh/docs/Developerguide/\347\273\264\346\212\244\345\256\241\350\256\241\346\227\245\345\277\227.md" @@ -115,7 +115,7 @@ 连接成功后,系统显示类似如下信息: ``` - gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -147,7 +147,7 @@ 2. 建议执行如下命令设置成默认值1024MB。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_space_limit=1024MB" + gs_guc reload -N all -I all -c "audit_space_limit=1024MB" ``` 配置审计文件个数的最大值(audit\_file\_remain\_threshold)。 @@ -167,7 +167,7 @@ 2. 建议执行如下命令设置成默认值1048576。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_file_remain_threshold=1048576" + gs_guc reload -N all -I all -c "audit_file_remain_threshold=1048576" ``` - 手动备份审计文件 diff --git "a/content/zh/docs/Developerguide/\347\275\221\347\273\234.md" "b/content/zh/docs/Developerguide/\347\275\221\347\273\234.md" new file mode 100644 index 000000000..203180ac2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\275\221\347\273\234.md" @@ -0,0 +1,60 @@ +# 网络 + +通过sar或ifconfig命令查看openGauss内节点网络使用情况,分析是否存在由于网络导致的性能瓶颈。 + +## 查看网络状况 + +查询服务器网络状况的方法主要有以下两种方式: + +- 使用root用户身份登录服务器,执行如下命令查看服务器网络连接。 + + ``` + SIA1000056771:~ # ifconfig + eth0 Link encap:Ethernet HWaddr 28:6E:D4:86:7D:D5 + inet addr:10.180.123.163 Bcast:10.180.123.255 Mask:255.255.254.0 + inet6 addr: fe80::2a6e:d4ff:fe86:7dd5/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:5669314 errors:0 dropped:0 overruns:0 frame:0 + TX packets:4955927 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:508077795 (484.5 Mb) TX bytes:818004366 (780.1 Mb) + + lo Link encap:Local Loopback + inet addr:127.0.0.1 Mask:255.0.0.0 + inet6 addr: ::1/128 Scope:Host + UP LOOPBACK RUNNING MTU:16436 Metric:1 + RX packets:711938 errors:0 dropped:0 overruns:0 frame:0 + TX packets:711938 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:0 + RX bytes:164158862 (156.5 Mb) TX bytes:164158862 (156.5 Mb) + ``` + + - “errors”表示收包错误的总数量。 + - “dropped”表示数据包已经进入了Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃的总数量。 + - “overruns”表示Ring Buffer队列中被丢弃的报文数目,由于Ring Buffer\(aka Driver Queue\)传输的IO大于kernel能够处理的IO导致。 + + 分析时,如果发现上述三个值持续增长,则表示网络负载过大或者存在网卡、内存等硬件故障。 + +- 使用sar命令查看服务器网络连接。 + + ``` + sar -n DEV 1 //1为间隔时间 + Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil + Average: lo 1926.94 1926.94 25573.92 25573.92 0.00 0.00 0.00 0.00 + Average: A1-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + Average: A1-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + Average: NIC0 5.17 1.48 0.44 0.92 0.00 0.00 0.00 0.00 + Average: NIC1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + Average: A0-0 8173.06 92420.66 97102.22 133305.09 0.00 0.00 0.00 0.00 + Average: A0-1 11431.37 9373.06 156950.45 494.40 0.00 0.00 0.00 0.00 + Average: B3-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + Average: B3-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + ``` + + “rxkB/s”为每秒接收的kB数,“txkB/s”为每秒发送的kB数。 + + 分析时,请主要关注每个网卡的传输量和是否达到传输上限。 + + 检查完后,按“Ctrl+Z”键退出查看。 + + diff --git "a/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\347\261\273\345\236\213.md" index 909caa229..ef91740ab 100644 --- "a/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\347\261\273\345\236\213.md" +++ "b/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\347\261\273\345\236\213.md" @@ -2,7 +2,7 @@ openGauss提供用于存储IPv4、IPv6、MAC地址的数据类型。 -用这些数据类型存储网络地址比用纯文本类型好,因为这些类型提供输入错误检查和特殊的操作和功能(请参见[网络地址函数和操作符](网络地址函数和操作符.md#ZH-CN_TOPIC_0242370439))。 +用这些数据类型存储网络地址比用纯文本类型好,因为这些类型提供输入错误检查和特殊的操作和功能(请参见[网络地址函数和操作符](网络地址函数和操作符.md))。 **表 1** 网络地址类型 diff --git "a/content/zh/docs/Developerguide/\350\201\232\351\233\206\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\350\201\232\351\233\206\345\207\275\346\225\260.md" index d48607e8c..976dbe7f0 100644 --- "a/content/zh/docs/Developerguide/\350\201\232\351\233\206\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\350\201\232\351\233\206\345\207\275\346\225\260.md" @@ -445,63 +445,6 @@ (1 row) ``` -- rank\(expression\) - - 描述:根据expression对不同组内的元组进行跳跃排序。 - - 返回类型:BIGINT - - 示例: - - ``` - postgres=# SELECT d_moy, d_fy_week_seq, rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | rank - -------+---------------+------ - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 5 | 29 - 1 | 5 | 29 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - (42 rows) - ``` - - regr\_avgx\(Y, X\) 描述:自变量的平均值 \(sum\(X\)/N\) diff --git "a/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" "b/content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251-13.md" similarity index 93% rename from "content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" rename to "content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251-13.md" index 842fb0841..261614471 100644 --- "a/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" +++ "b/content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251-13.md" @@ -1,4 +1,4 @@ -# 获取帮助 +# 获取帮助 使用Sqldiag工具前,您可以通过以下指令获取帮助。 diff --git "a/content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251.md" "b/content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251.md" new file mode 100644 index 000000000..4402577a3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\216\267\345\217\226\345\270\256\345\212\251.md" @@ -0,0 +1,45 @@ +# 获取帮助 + +启动调优程序之前,可以通过如下命令获取帮助信息: + +``` +python main.py --help +``` + +输出帮助信息结果如下: + +``` +usage: main.py [-h] [-m {train,tune}] [-f CONFIG_FILE] [--db-name DB_NAME] +[--db-user DB_USER] [--port PORT] [--host HOST] +[--host-user HOST_USER] [--host-ssh-port HOST_SSH_PORT] +[--scenario {ap,tp,htap}] [--benchmark BENCHMARK] +[--model-path MODEL_PATH] [-v] + +X-Tuner: a self-tuning toolkit for OpenGauss. + +optional arguments: +-h, --help show this help message and exit +-m {train,tune}, --mode {train,tune} +train a reinforcement learning model or tune by your +trained model. +-f CONFIG_FILE, --config-file CONFIG_FILE +you can pass a config file path or you should manually +set database information. +--db-name DB_NAME database name. +--db-user DB_USER database user name. +--port PORT database connection port. +--host HOST where did your database install on? +--host-user HOST_USER +user name of the host where your database installed +on. +--host-ssh-port HOST_SSH_PORT +host ssh port. +--scenario {ap,tp,htap} +--benchmark BENCHMARK +--model-path MODEL_PATH +the place where you want to save model weights to or +load model weights from. +-v, --version +show version. +``` + diff --git "a/content/zh/docs/Developerguide/\350\241\214\346\225\260\347\232\204Hint.md" "b/content/zh/docs/Developerguide/\350\241\214\346\225\260\347\232\204Hint.md" new file mode 100644 index 000000000..4b37ebaee --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\241\214\346\225\260\347\232\204Hint.md" @@ -0,0 +1,42 @@ +# 行数的Hint + +## 功能描述 + +指明中间结果集的大小,支持绝对值和相对值的hint。 + +## 语法格式 + +``` +rows(table_list #|+|-|* const) +``` + +## 参数说明 + +- **\#**,**+**,**-**,**\***,进行行数估算hint的四种操作符号。\#表示直接使用后面的行数进行hint。+,-,\*表示对原来估算的行数进行加、减、乘操作,运算后的行数最小值为1行。table\_list为hint对应的单表或多表join结果集,与[Join方式的Hint](Join方式的Hint.md)中[table\_list](Join方式的Hint.md#zh-cn_topic_0237121534_li1090312446510)相同。 + +- **const**可以是任意非负数,支持科学计数法。 + +例如: + +rows\(t1 \#5\)表示:指定t1表的结果集为5行。 + +rows\(t1 t2 t3 \*1000\)表示:指定t1, t2, t3 join完的结果集的行数乘以1000。 + +## 建议 + +- 推荐使用两个表\*的hint。对于两个表的采用\*操作符的hint,只要两个表出现在join的两端,都会触发hint。例如:设置hint为rows\(t1 t2 \* 3\),对于\(t1 t3 t4\)和\(t2 t5 t6\)join时,由于t1和t2出现在join的两端,所以其join的结果集也会应用该hint规则乘以3。 +- rows hint支持在单表、多表、function table及subquery scan table的结果集上指定hint。 + +## 示例 + +对[示例](Plan-Hint调优概述.md#zh-cn_topic_0237121532_section671421102912)中原语句使用如下hint: + +``` +explain +select /*+ rows(store_sales store_returns *50) */ i_product_name product_name ... +``` + +该hint表示:store\_sales,store\_returns关联的结果集估算行数在原估算行数基础上乘以50。生成计划如下所示: + +![](figures/zh-cn_image_0253036670.png) + diff --git "a/content/zh/docs/Developerguide/\350\247\222\350\211\262.md" "b/content/zh/docs/Developerguide/\350\247\222\350\211\262.md" index 7af9c132b..9d409ea5c 100644 --- "a/content/zh/docs/Developerguide/\350\247\222\350\211\262.md" +++ "b/content/zh/docs/Developerguide/\350\247\222\350\211\262.md" @@ -12,9 +12,9 @@ SELECT * FROM PG_ROLES; ## 创建、修改和删除角色 -非[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960)时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有初始用户和具有CREATEROLE属性的用户才能创建、修改或删除角色。 +非[三权分立](三权分立.md)时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有初始用户和具有CREATEROLE属性的用户才能创建、修改或删除角色。 - 要创建角色,请使用[CREATE ROLE](CREATE-ROLE.md)。 -- 要在现有角色中添加或删除用户,请使用[ALTER ROLE](ALTER-ROLE.md#ZH-CN_TOPIC_0242370532)。 -- 要删除角色,请使用[DROP ROLE](DROP-ROLE.md#ZH-CN_TOPIC_0242370611)。DROP ROLE只会删除角色,并不会删除角色中的成员用户帐户。 +- 要在现有角色中添加或删除用户,请使用[ALTER ROLE](ALTER-ROLE.md)。 +- 要删除角色,请使用[DROP ROLE](DROP-ROLE.md)。DROP ROLE只会删除角色,并不会删除角色中的成员用户帐户。 diff --git "a/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\226\207\346\241\243.md" "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\226\207\346\241\243.md" index 446669b80..e63198dce 100644 --- "a/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\226\207\346\241\243.md" +++ "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\226\207\346\241\243.md" @@ -20,7 +20,7 @@ postgres=# SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat to\_tsvector函数内部调用一个解析器,将文档的文本分解成token并给每个token指定一个类型。对于每个token,有一系列词典可供查询。词典系列因token类型的不同而不同。识别token的第一本词典将发出一个或多个标准词素来表示token。例如: - rats变成rat因为词典认为词rats是rat的复数形式。 -- 有些词被作为停用词(请参考[停用词](停用词.md#ZH-CN_TOPIC_0242370499)),这样它们就会被忽略,因为它们出现得太过频繁以致于搜索中没有用处。比如例子中的a、on和it。 +- 有些词被作为停用词(请参考[停用词](停用词.md)),这样它们就会被忽略,因为它们出现得太过频繁以致于搜索中没有用处。比如例子中的a、on和it。 - 如果没有词典识别token,那么它也被忽略。在这个例子中,符号“-”被忽略,因为词典没有给它分配token类型(空间符号),即空间记号永远不会被索引。 语法解析器、词典和要索引的token类型由选定的文本搜索分词器决定。可以在同一个数据库中有多种不同的分词器,以及提供各种语言的预定义分词器。在以上例子中,使用缺省分词器english。 @@ -42,5 +42,5 @@ postgres=# UPDATE tsearch.tt SET ti = postgres=# DROP TABLE tsearch.tt; ``` -上例使用setweight标记已完成的tsvector中的每个词的来源,并且使用tsvector连接操作符||合并标记过的tsvector值,[处理tsvector](处理tsvector.md#ZH-CN_TOPIC_0242370492)一节详细介绍了这些操作。 +上例使用setweight标记已完成的tsvector中的每个词的来源,并且使用tsvector连接操作符||合并标记过的tsvector值,[处理tsvector](处理tsvector.md)一节详细介绍了这些操作。 diff --git "a/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\237\245\350\257\242.md" "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\237\245\350\257\242.md" index 2cc0d1b0b..531d44b27 100644 --- "a/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\237\245\350\257\242.md" +++ "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\237\245\350\257\242.md" @@ -6,7 +6,7 @@ openGauss提供了函数to\_tsquery和plainto\_tsquery将查询转换为tsquery to_tsquery([ config regconfig, ] querytext text) returns tsquery ``` -to\_tsquery从querytext中创建一个tsquery,querytext必须由布尔运算符& \(AND\),| \(OR\)和! \(NOT\)分割的单个token组成。这些运算符可以用圆括弧分组。换句话说,to\_tsquery输入必须遵循tsquery输入的通用规则,具体请参见[文本搜索类型](文本搜索类型.md#ZH-CN_TOPIC_0242370420)。不同的是基本tsquery以token表面值作为输入,而to\_tsquery使用指定或默认分词器将每个token标准化成词素,并依据分词器丢弃属于停用词的token。例如: +to\_tsquery从querytext中创建一个tsquery,querytext必须由布尔运算符& \(AND\),| \(OR\)和! \(NOT\)分割的单个token组成。这些运算符可以用圆括弧分组。换句话说,to\_tsquery输入必须遵循tsquery输入的通用规则,具体请参见[文本搜索类型](文本搜索类型.md)。不同的是基本tsquery以token表面值作为输入,而to\_tsquery使用指定或默认分词器将每个token标准化成词素,并依据分词器丢弃属于停用词的token。例如: ``` postgres=# SELECT to_tsquery('english', 'The & Fat & Rats'); diff --git "a/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" "b/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" index 220372ffe..f521e5313 100644 --- "a/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" +++ "b/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" @@ -126,6 +126,8 @@ 0表示关闭基于容量的新日志文件的创建。 +建议该值大小设置级别至少为MB级,利于日志文件的及时划分。 + **默认值:**20MB ## syslog\_facility @@ -150,7 +152,7 @@ ## event\_source -**参数说明:**该参数openGauss暂未使用。windows环境下log\_destination设置为eventlog时,event\_source设置在日志中openGauss日志消息的标识。 +**参数说明:**该参数仅在windows环境下生效, openGauss暂不支持。log\_destination设置为eventlog时,event\_source设置在日志中openGauss日志消息的标识。 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 diff --git "a/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" "b/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" index 6cb653b6a..30b867288 100644 --- "a/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" +++ "b/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" @@ -253,7 +253,7 @@ > to_hex(pid) >FROM pg_stat_activity; >``` ->- 当log\_line\_prefix设置为空值时,请将其最后一个字符作为一个独立的段,以此来直观地与后续的日志进行区分,也可以使用一个标点符号。 +>- 当log\_line\_prefix设置为非空值时,请将其最后一个字符作为一个独立的段,以此来直观地与后续的日志进行区分,也可以使用一个标点符号。 >- Syslog生成自己的时间戳及进程ID信息,所以当登录日志时,不需要包含这些转义字符。 **取值范围:**字符串 diff --git "a/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" "b/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" index 131019550..91f664369 100644 --- "a/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" +++ "b/content/zh/docs/Developerguide/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" @@ -74,7 +74,7 @@ **默认值:**panic -[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)解释openGauss中使用的消息安全级别。当日志输出到syslog或者eventlog时,openGauss进行如表中的转换。 +[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)解释openGauss中使用的消息安全级别。当日志输出到syslog或者eventlog\(仅windows环境下, openGauss版本不涉及该参数\)时,openGauss进行如表中的转换。 **表 1** 信息严重程度分类 diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256.md" index 1bbd1dedf..883b78837 100644 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256.md" +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256.md" @@ -8,6 +8,7 @@ >![](public_sys-resources/icon-notice.gif) **须知:** >- 如果需要启用WAL日志归档和主备机的数据流复制,必须将此参数设置为archive或者hot\_standby。 +>- 如果此参数设置为minimal, archive\_mode必须设置为off, hot\_standby必须设置为off,max\_wal\_senders参数设置为0, 且需为单机环境, 否则将导致数据库无法启动。 >- 如果此参数设置为archive,hot\_standby必须设置为off,否则将导致数据库无法启动。但是,hot\_standby在双机环境中不能设置为off,具体参见hot\_standby参数说明。 **取值范围**:枚举类型 @@ -78,7 +79,7 @@ - fsync\_writethrough表示每次提交的时候调用fsync\(\)强制把缓冲区任何数据写入磁盘。 >![](public_sys-resources/icon-note.gif) **说明:** - >由于历史原因,我们允许在Windows平台上将wal\_sync\_method设置为fsync\_writethrough,尽管它和fsync等效。 + >由于历史原因,Windows平台支持将wal\_sync\_method设置为fsync\_writethrough。在windows平台上fsync\_writethrough和fsync等效。 - fsync表示每次提交的时候调用fsync\(\)。(支持suse10和suse11) - open\_sync表示用带O\_SYNC选项的open\(\)写“WAL”文件。(支持suse10和suse11) @@ -124,7 +125,7 @@ **取值范围:**-1\~218 - 如果设置为-1,表示wal\_buffers的大小随着参数shared\_buffers自动调整,为shared\_buffers的1/32,最小值为8个XLOG\_BLCKSZ,最大值为2048个XLOG\_BLCKSZ。 -- 如果设置为其他值,当小于8时,会被默认设置为8;当大于2048的时,会被强制设置为2048。 +- 如果设置为其他值,当小于4时,会被默认设置为4。 **默认值:**16MB @@ -185,5 +186,5 @@ **取值范围**:整型,单位为8KB。 -**默认值:**16MB \(2048 \* 8KB\) +**默认值:**16MB \(2048 \* 8KB\) diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\257\206\347\240\201\345\256\211\345\205\250\347\255\226\347\225\245.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\257\206\347\240\201\345\256\211\345\205\250\347\255\226\347\225\245.md" index edce2c41e..44a1758d4 100644 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\257\206\347\240\201\345\256\211\345\205\250\347\255\226\347\225\245.md" +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\257\206\347\240\201\345\256\211\345\205\250\347\255\226\347\225\245.md" @@ -20,7 +20,7 @@ 连接成功后,系统显示类似如下信息: ``` - gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. @@ -42,7 +42,7 @@ 4. 执行如下命令将其设置为安全的加密算法。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_encryption_type=2" + gs_guc reload -N all -I all -c "password_encryption_type=2" ``` >![](public_sys-resources/icon-notice.gif) **须知:** @@ -92,7 +92,7 @@ 3. 执行如下命令设置成默认值1。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_policy=1" + gs_guc reload -N all -I all -c "password_policy=1" ``` 帐户密码的复杂度要求如下: @@ -152,7 +152,7 @@ >不建议设置为0,即使需要设置也要将所有openGauss节点中的password\_reuse\_time都设置为0才能生效。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_reuse_time=60" + gs_guc reload -N all -I all -c "password_reuse_time=60" ``` 配置password\_reuse\_max参数。 @@ -190,7 +190,7 @@ 3. 执行如下命令设置成默认值0。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_reuse_max = 0" + gs_guc reload -N all -I all -c "password_reuse_max = 0" ``` - 密码有效期限 @@ -235,7 +235,7 @@ 3. 执行如下命令设置成默认值90(不建议设置为0)。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_effect_time = 90" + gs_guc reload -N all -I all -c "password_effect_time = 90" ``` 配置password\_notify\_time参数。 @@ -271,7 +271,7 @@ 3. 如果显示结果不为7,执行如下命令设置成默认值7(不建议设置为0)。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_notify_time = 7" + gs_guc reload -N all -I all -c "password_notify_time = 7" ``` - 密码修改 diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\345\217\267\346\234\211\346\225\210\346\234\237.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\345\217\267\346\234\211\346\225\210\346\234\237.md" index c514fa947..80e8451e8 100644 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\345\217\267\346\234\211\346\225\210\346\234\237.md" +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\345\217\267\346\234\211\346\225\210\346\234\237.md" @@ -20,7 +20,7 @@ 连接成功后,系统显示类似如下信息: ``` - gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 + gsql ((openGauss 1.0 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\346\210\267\345\256\211\345\205\250\347\255\226\347\225\245.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\346\210\267\345\256\211\345\205\250\347\255\226\347\225\245.md" index 64d20584f..a8ae8cf34 100644 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\346\210\267\345\256\211\345\205\250\347\255\226\347\225\245.md" +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\270\220\346\210\267\345\256\211\345\205\250\347\255\226\347\225\245.md" @@ -51,7 +51,7 @@ openGauss为帐户提供了自动锁定和解锁帐户、手动锁定和解锁 4. 执行如下命令设置成默认值10。 ``` - gs_guc reload -Z coordinator -D /gaussdb/data/dbnode -c "failed_login_attempts=10" + gs_guc reload -D /gaussdb/data/dbnode -c "failed_login_attempts=10" ``` @@ -91,7 +91,7 @@ openGauss为帐户提供了自动锁定和解锁帐户、手动锁定和解锁 4. 执行如下命令设置成默认值1。 ``` - gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_lock_time=1" + gs_guc reload -N all -I all -c "password_lock_time=1" ``` diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\256\241\350\256\241.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\256\241\350\256\241.md" index 8702bd2b5..85beaa6b2 100644 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\256\241\350\256\241.md" +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\256\241\350\256\241.md" @@ -6,6 +6,6 @@ - **[维护审计日志](维护审计日志.md)** -- **[设置文件权限安全策略](设置文件权限安全策略-9.md)** +- **[设置文件权限安全策略](设置文件权限安全策略.md)** diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245-9.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245-9.md" deleted file mode 100644 index 7b7c5ca7d..000000000 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245-9.md" +++ /dev/null @@ -1,211 +0,0 @@ -# 设置文件权限安全策略 - -## 背景信息 - -数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置。其权限规则如下: - -- 数据库程序目录的权限为0750。 -- 数据库数据文件目录的权限为0700。 - - openGauss部署时通过创建xml配置文件中的tmpMppdbPath参数指定目录(若未指定,则默认创建/tmp/$USER\_mppdb目录)来存放“.s.PGSQL.\*”文件,该目录和文件权限设置为0700。 - -- 数据库的数据文件、审计日志和其他数据库程序生成的数据文件的权限为0600,运行日志的权限默认不高于0640。 -- 普通操作系统用户不允许修改和删除数据库文件和日志文件。 - -## 数据库程序目录及文件权限 - -数据库安装后,部分程序目录及文件权限如[表1](#zh-cn_topic_0237121115_zh-cn_topic_0059779254_t0da233846f2544f39362bcf53de94799)所示。 - -**表 1** 文件及目录权限 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      文件/目录

      -

      父目录

      -

      权限

      -

      bin

      -

      -

      -

      0700

      -

      lib

      -

      -

      -

      0700

      -

      share

      -

      -

      -

      0700

      -

      data(数据库节点/数据库主节点

      -

      -

      -

      0700

      -

      base

      -

      实例数据目录

      -

      0700

      -

      global

      -

      实例数据目录

      -

      0700

      -

      pg_audit

      -

      实例数据目录(可配置)

      -

      0700

      -

      pg_log

      -

      实例数据目录(可配置)

      -

      0700

      -

      pg_xlog

      -

      实例数据目录

      -

      0700

      -

      postgresql.conf

      -

      实例数据目录

      -

      0600

      -

      pg_hba.conf

      -

      实例数据目录

      -

      0600

      -

      postmaster.opts

      -

      实例数据目录

      -

      0600

      -

      pg_ident.conf

      -

      实例数据目录

      -

      0600

      -

      gs_initdb

      -

      bin

      -

      0700

      -

      gs_dump

      -

      bin

      -

      0700

      -

      gs_ctl

      -

      bin

      -

      0700

      -

      gs_guc

      -

      bin

      -

      0700

      -

      gsql

      -

      bin

      -

      0700

      -

      cm_ctl

      -

      bin

      -

      0700

      -

      gs_gtm

      -

      bin

      -

      0700

      -

      gds

      -

      bin

      -

      0700

      -

      gs_redis

      -

      bin

      -

      0700

      -

      gs_clean

      -

      bin

      -

      0700

      -

      archive_status

      -

      pg_xlog

      -

      0700

      -

      libpq.so.5.5

      -

      lib

      -

      0600

      -
      - -## 建议 - -数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置,适合大多数情况下的权限要求。如果用户产品对相关权限有特殊要求,建议用户安装后定期检查相关权限设置,确保完全符合产品要求。 - diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245.md" "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245.md" index 1f7742325..97d72f9e3 100644 --- "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245.md" +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\346\226\207\344\273\266\346\235\203\351\231\220\345\256\211\345\205\250\347\255\226\347\225\245.md" @@ -1,4 +1,4 @@ -# 设置文件权限安全策略 +# 设置文件权限安全策略 ## 背景信息 @@ -48,6 +48,13 @@

      0700

      data(数据库节点/数据库主节点)

      +

      -

      +

      0700

      +

      base

      实例数据目录

      diff --git "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242-8.md" "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242-8.md" deleted file mode 100644 index 72ffec9a5..000000000 --- "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242-8.md" +++ /dev/null @@ -1,62 +0,0 @@ -# 证书替换 - -## 操作场景 - -openGauss默认配置了SSL连接所需要的安全的证书、私钥,用户如果需要替换为自己的证书、私钥则可按照此方法进行替换。 - -## 前提条件 - -用户需要从CA认证中心申请到正式的服务器、客户端的证书和密钥。 - -## 注意事项 - -openGauss目前只支持X509v3的PEM格式证书。 - -## 操作步骤 - -1. 准备证书、私钥。 - - 服务端各个配置文件名称约定: - - - 证书名称约定:server.crt。 - - 私钥名称约定:server.key。 - - 私钥密码加密文件约定:server.key.cipher、server.key.rand。 - - 客户端各个配置文件名称约定: - - - 证书名称约定:client.crt。 - - 私钥名称约定:client.key。 - - 私钥密码加密文件约定:client.key.cipher、client.key.rand。 - - 根证书名称约定:cacert.pem。 - - 吊销证书列表文件名称约定:sslcrl-file.crl。 - -2. 制作压缩包。 - - 压缩包名称约定:db-cert-replacement.zip。 - - 压缩包格式约定:ZIP。 - - 压缩包文件列表约定:server.crt、server.key、server.key.cipher、server.key.rand、client.crt、client.key、client.key.cipher、client.key.rand、cacert.pem。如果需要配置吊销证书列表,则列表中包含sslcrl-file.crl。 - -3. 调用接口,执行替换。 - 1. 将制作好的压缩包db-cert-replacement.zip上传到openGauss用户下的任意路径。 - - 例如:/home/xxxx/db-cert-replacement.zip。 - - 2. 调用如下命令进行替换。 - - ``` - gs_om -t cert --cert-file= /home/xxxx/db-cert-replacement.zip - ``` - -4. 重启openGauss。 - - ``` - gs_om -t stop - gs_om -t start - ``` - - ->![](public_sys-resources/icon-note.gif) **说明:** ->证书具有rollback功能,可以把上一次执行证书替换之前的证书,进行回退。可以使用gs\_om -t cert --rollback进行远程调用该接口;使用gs\_om -t cert --rollback -L进行本地调用该接口。以上一次成功执行证书替换后,被替换的证书版本为基础进行回退。 - diff --git "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242.md" "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242.md" index 3c90f8be8..fa0522f79 100644 --- "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242.md" +++ "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242.md" @@ -1,4 +1,4 @@ -# 证书替换 +# 证书替换 ## 操作场景 @@ -56,7 +56,7 @@ openGauss目前只支持X509v3的PEM格式证书。 gs_om -t start ``` + >![](public_sys-resources/icon-note.gif) **说明:** + >证书具有rollback功能,可以把上一次执行证书替换之前的证书,进行回退。可以使用gs\_om -t cert --rollback进行远程调用该接口;使用gs\_om -t cert --rollback -L进行本地调用该接口。以上一次成功执行证书替换后,被替换的证书版本为基础进行回退。 ->![](public_sys-resources/icon-note.gif) **说明:** ->证书具有rollback功能,可以把上一次执行证书替换之前的证书,进行回退。可以使用gs\_om -t cert --rollback进行远程调用该接口;使用gs\_om -t cert --rollback -L进行本地调用该接口。以上一次成功执行证书替换后,被替换的证书版本为基础进行回退。 diff --git "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220-7.md" "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220-7.md" deleted file mode 100644 index 62727ed6d..000000000 --- "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220-7.md" +++ /dev/null @@ -1,269 +0,0 @@ -# 证书生成 - -## 操作场景 - -在测试环境下,用户可以用通过以下方式进行数字证书测试。在客户的运行环境中,请使用从CA认证中心申请的数字证书。 - -## 前提条件 - -Linux环境安装了openssl组件。 - -## 自认证证书生成过程 - -1. 搭建CA环境。 - - ``` - --假设用户为omm已存在,搭建CA的路径为test - --以root用户身份登录Linux环境,切换到用户omm - mkdir test - cd /etc/ssl - --copy 配置文件openssl.cnf到test下 - cp openssl.cnf ~/test - cd ~/test - --到test文件夹下,开始搭建CA环境 - --创建文件夹demoCA./demoCA/newcerts./demoCA/private - mkdir ./demoCA ./demoCA/newcerts ./demoCA/private - chmod 777 ./demoCA/private - --创建serial文件,写入01 - echo '01'>./demoCA/serial - --创建文件index.txt - touch /home/omm/test/demoCA/index.txt - --修改openssl.cnf配置文件中的参数 - dir = /home/omm/test/demoCA - default_md = sha256 - --至此CA环境搭建完成 - ``` - -2. 生成根私钥。 - - ``` - --生成CA私钥 - openssl genrsa -aes256 -out demoCA/private/cakey.pem 2048 - Generating RSA private key, 2048 bit long modulus - .................+++ - ..................+++ - e is 65537 (0x10001) - --设置根私钥的保护密码,最少要求4个字符,假设为Test@123 - Enter pass phrase for demoCA/private/cakey.pem: - --再次输入私钥密码 Test@123 - Verifying - Enter pass phrase for demoCA/private/cakey.pem: - ``` - -3. 生成根证书请求文件。 - - ``` - --生成CA根证书申请文件server.req - openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem - Enter pass phrase for demoCA/private/cakey.pem: - --输入根私钥密码 Test@123 - You are about to be asked to enter information that will be incorporated - into your certificate request. - What you are about to enter is what is called a Distinguished Name or a DN. - There are quite a few fields but you can leave some blank - For some fields there will be a default value, - If you enter '.', the field will be left blank. - ----- - - --以下名称请牢记,生成服务器证书和客户端证书时填写的信息需要与此处的一致 - Country Name (2 letter code) [AU]:CN - State or Province Name (full name) [Some-State]:shanxi - Locality Name (eg, city) []:xian - Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abc - Organizational Unit Name (eg, section) []:hello - --Common Name可以随意命名 - Common Name (eg, YOUR name) []:world - --Email可以选择性填写 - Email Address []: - - Please enter the following 'extra' attributes - to be sent with your certificate request - A challenge password []: - An optional company name []: - ``` - -4. 生成自签发根证书。 - - ``` - --生成根证书时,需要修改openssl.cnf文件,设置basicConstraints=CA:TRUE - vi openssl.cnf - --生成CA自签发根证书 - openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem - Using configuration from openssl.cnf - Enter pass phrase for demoCA/private/cakey.pem: - --输入根私钥密码 Test@123 - Check that the request matches the signature - Signature ok - Certificate Details: - Serial Number: 1 (0x1) - Validity - Not Before: Feb 28 02:17:11 2017 GMT - Not After : Feb 28 02:17:11 2018 GMT - Subject: - countryName = CN - stateOrProvinceName = shanxi - organizationName = Abc - organizationalUnitName = hello - commonName = world - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - F9:91:50:B2:42:8C:A8:D3:41:B0:E4:42:CB:C2:BE:8D:B7:8C:17:1F - X509v3 Authority Key Identifier: - keyid:F9:91:50:B2:42:8C:A8:D3:41:B0:E4:42:CB:C2:BE:8D:B7:8C:17:1F - - Certificate is to be certified until Feb 28 02:17:11 2018 GMT (365 days) - Sign the certificate? [y/n]:y - - - 1 out of 1 certificate requests certified, commit? [y/n]y - Write out database with 1 new entries - Data Base Updated - --至此CA根证书自签发完成,根证书demoCA/cacert.pem。 - ``` - -5. 生成服务端证书私钥。 - - ``` - --生成服务器私钥文件server.key - openssl genrsa -aes256 -out server.key 2048 - Generating a 2048 bit RSA private key - .......++++++ - ..++++++ - e is 65537 (0x10001) - Enter pass phrase for server.key: - --服务器私钥的保护密码,最少要求4个字符,假设为Test@123 - Verifying - Enter pass phrase for server.key: - --再次确认服务器私钥的保护密码,即为Test@123 - ``` - -6. 生成服务端证书请求文件。 - - ``` - --生成服务器证书请求文件server.req - openssl req -config openssl.cnf -new -key server.key -out server.req - Enter pass phrase for server.key: - You are about to be asked to enter information that will be incorporated - into your certificate request. - What you are about to enter is what is called a Distinguished Name or a DN. - There are quite a few fields but you can leave some blank - For some fields there will be a default value, - If you enter '.', the field will be left blank. - ----- - - --以下填写的信息与创建CA时的信息一致 - Country Name (2 letter code) [AU]:CN - State or Province Name (full name) [Some-State]:shanxi - Locality Name (eg, city) []:xian - Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abc - Organizational Unit Name (eg, section) []:hello - --Common Name可以随意命名 - Common Name (eg, YOUR name) []:world - Email Address []: - --以下信息可以选择性填写 - Please enter the following 'extra' attributes - to be sent with your certificate request - A challenge password []: - An optional company name []: - ``` - -7. 生成服务端证书。 - - ``` - --生成服务端/客户端证书时,修改openssl.cnf文件,设置basicConstraints=CA:FALSE - vi openssl.cnf - --修改demoCA/index.txt.attr中属性为no。 - vi demoCA/index.txt.attr - - --对生成的服务器证书请求文件进行签发,签发后将生成正式的服务器证书server.crt - openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 -md sha256 - Using configuration from /etc/ssl/openssl.cnf - Enter pass phrase for ./demoCA/private/cakey.pem: - Check that the request matches the signature - Signature ok - Certificate Details: - Serial Number: 2 (0x2) - Validity - Not Before: Feb 27 10:11:12 2017 GMT - Not After : Feb 25 10:11:12 2027 GMT - Subject: - countryName = CN - stateOrProvinceName = shanxi - organizationName = Abc - organizationalUnitName = hello - commonName = world - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - EB:D9:EE:C0:D2:14:48:AD:EB:BB:AD:B6:29:2C:6C:72:96:5C:38:35 - X509v3 Authority Key Identifier: - keyid:84:F6:A1:65:16:1F:28:8A:B7:0D:CB:7E:19:76:2A:8B:F5:2B:5C:6A - - Certificate is to be certified until Feb 25 10:11:12 2027 GMT (3650 days) - --选择y对证书进行签发 - Sign the certificate? [y/n]:y - - --选择y,证书签发结束 - 1 out of 1 certificate requests certified, commit? [y/n]y - Write out database with 1 new entries - Data Base Updated - ``` - - 去掉私钥密码保护,方法如下: - - ``` - --去掉服务器私钥的密码保护 - openssl rsa -in server.key -out server.key - --如果不去掉服务器私钥的密码保护需要使用gs_guc工具对存储密码进行加密保护 - gs_guc encrypt -M server -K Test@123 -D ./ - --gs_guc加密后会生成server.key.cipher,server.key.rand两个私钥密码保护文件 - ``` - -8. 客户端证书,私钥的生成。 - - 生成客户端证书和客户端私钥的方法和要求与服务器相同。 - - ``` - --生成客户端私钥 - openssl genrsa -aes256 -out client.key 2048 - --生成客户端证书请求文件 - openssl req -config openssl.cnf -new -key client.key -out client.req - --对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书client.crt - openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 -md sha256 - ``` - - 去掉私钥密码保护,方法如下: - - ``` - --去掉客户端私钥的密码 - openssl rsa -in client.key -out client.key - --如果不去掉客户端私钥的密码保护需要使用gs_guc工具对存储密码进行加密保护 - gs_guc encrypt -M client -K Test@123 -D ./ - gs_guc加密后会生成client.key.cipher,client.key.rand两个私钥密码保护文件。 - ``` - - 将客户端密钥转化为DER格式,方法如下: - - ``` - openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt - ``` - -9. 吊销证书列表的生成。 - - 如果需要吊销列表,可按照如下方法生成: - - ``` - --首先创建crlnumber文件 - echo '00'>./demoCA/crlnumber - --吊销服务器证书 - openssl ca -config openssl.cnf -revoke server.crt - --生成证书吊销列表sslcrl-file.crl - openssl ca -config openssl.cnf -gencrl -out sslcrl-file.crl - ``` - - diff --git "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220.md" "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220.md" index be9c79eba..71e37e6db 100644 --- "a/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220.md" +++ "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220.md" @@ -1,4 +1,4 @@ -# 证书生成 +# 证书生成 ## 操作场景 @@ -16,7 +16,7 @@ Linux环境安装了openssl组件。 --假设用户为omm已存在,搭建CA的路径为test --以root用户身份登录Linux环境,切换到用户omm mkdir test - cd /etc/ssl + cd /etc/pki/tls --copy 配置文件openssl.cnf到test下 cp openssl.cnf ~/test cd ~/test @@ -27,9 +27,9 @@ Linux环境安装了openssl组件。 --创建serial文件,写入01 echo '01'>./demoCA/serial --创建文件index.txt - touch /home/omm/test/demoCA/index.txt + touch ./demoCA/index.txt --修改openssl.cnf配置文件中的参数 - dir = /home/omm/test/demoCA + dir = ./demoCA default_md = sha256 --至此CA环境搭建完成 ``` diff --git "a/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\246\202\350\277\260.md" index 4514e863d..7ea758a70 100644 --- "a/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\246\202\350\277\260.md" +++ "b/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\246\202\350\277\260.md" @@ -10,7 +10,7 @@ - 如果token在词典中已知,返回对应lexeme数组(注意,一个标记可能对应多个lexeme)。 -- 一个lexeme。(该lexeme为设置了TSL\_FILTER标志的lexeme,TSL\_FILTER标志为过滤词典内部自动设置,用户不感知。)一个新token会代替输入token被传递给后继词典(当前词典可被称为过滤词典)。 +- 一个lexeme。一个新token会代替输入token被传递给后继词典(当前词典可被称为过滤词典)。 - 如果token在词典中已知,但它是一个停用词,返回空数组。 - 如果词典不能识别输入的token,返回NULL。 diff --git "a/content/zh/docs/Developerguide/\350\257\246\350\247\243.md" "b/content/zh/docs/Developerguide/\350\257\246\350\247\243.md" new file mode 100644 index 000000000..fe71206fe --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\246\350\247\243.md" @@ -0,0 +1,99 @@ +# 详解 + +如[SQL执行计划概述](SQL执行计划概述.md)节中所说,EXPLAIN会显示执行计划,但并不会实际执行SQL语句。EXPLAIN ANALYZE和EXPLAIN PERFORMANCE两者都会实际执行SQL语句并返回执行信息。在这一节将详细解释执行计划及执行信息。 + +## 执行计划 + +以如下SQL语句为例: + +``` +SELECT * FROM t1, t2 WHERE t1.c1 = t2.c2; +``` + +执行EXPLAIN的输出为: + +![](figures/zh-cn_image_0252663634.png) + +**执行计划层级解读(纵向):** + +1. 第一层:Seq Scan on t2 + + 表扫描算子,用Seq Scan的方式扫描表t2。这一层的作用是把表t2的数据从buffer或者磁盘上读上来输送给上层节点参与计算。 + +2. 第二层:Hash + + Hash算子,作用是把下层计算输送上来的算子计算hash值,为后续hash join操作做数据准备 + +3. 第三层:Seq Scan on t1 + + 表扫描算子,用Seq Scan的方式扫描表t1。这一层的作用是把表t1的数据从buffer或者磁盘上读上来输送给上层节点参与hash join计算。 + +4. 第四层:Hash Join + + join算子,主要作用是将t1表和t2表的数据通过hash join的方式连接,并输出结果数据 + + +**执行计划中的关键字说明:** + +1. 表访问方式 + - Seq Scan + + 全表顺序扫描。 + + - Index Scan + + 优化器决定使用两步的规划:最底层的规划节点访问一个索引,找出匹配索引条件的行的位置,然后上层规划节点真实地从表中抓取出那些行。独立地抓取数据行比顺序地读取它们的开销高很多,但是因为并非所有表的页面都被访问了,这么做实际上仍然比一次顺序扫描开销要少。使用两层规划的原因是,上层规划节点在读取索引标识出来的行位置之前,会先将它们按照物理位置排序,这样可以最小化独立抓取的开销。 + + 如果在WHERE里面使用的好几个字段上都有索引,那么优化器可能会使用索引的AND或OR的组合。但是这么做要求访问两个索引,因此与只使用一个索引,而把另外一个条件只当作过滤器相比,这个方法未必是更优。 + + 索引扫描可以分为以下几类,他们之间的差异在于索引的排序机制。 + + - Bitmap Index Scan + + 使用位图索引抓取数据页。 + + - Index Scan using index\_name + + 使用简单索引搜索,该方式表的数据行是以索引顺序抓取的,这样就令读取它们的开销更大,但是这里的行少得可怜,因此对行位置的额外排序并不值得。最常见的就是看到这种规划类型只抓取一行,以及那些要求ORDER BY条件匹配索引顺序的查询。因为那时候没有多余的排序步骤是必要的以满足ORDER BY。 + + +2. 表连接方式 + - Nested Loop + + 嵌套循环,适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。 + + - \(Sonic\) Hash Join + + 哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。 + + - Merge Join + + 归并连接,通常情况下执行性能差于哈希连接。如果源数据已经被排序过,在执行融合连接时,并不需要再排序,此时融合连接的性能优于哈希连接。 + +3. 运算符 + - sort + + 对结果集进行排序。 + + - filter + + EXPLAIN输出显示WHERE子句当作一个"filter"条件附属于顺序扫描计划节点。这意味着规划节点为它扫描的每一行检查该条件,并且只输出符合条件的行。预计的输出行数降低了,因为有WHERE子句。不过,扫描仍将必须访问所有 10000 行,因此开销没有降低;实际上它还增加了一些(确切的说,通过10000 \* cpu\_operator\_cost)以反映检查WHERE条件的额外CPU时间。 + + - LIMIT + + LIMIT限定了执行结果的输出记录数。如果增加了LIMIT,那么不是所有的行都会被检索到。 + + + +## 执行信息 + +以如下SQL语句为例: + +``` +select sum(t2.c1) from t1,t2 where t1.c1=t2.c2 group by t1.c2; +``` + +执行EXPLAIN PERFORMANCE输出为: + +![](figures/zh-cn_image_0252660975.png) + diff --git "a/content/zh/docs/Developerguide/\350\257\255\345\217\245\350\241\214\344\270\272.md" "b/content/zh/docs/Developerguide/\350\257\255\345\217\245\350\241\214\344\270\272.md" index 14d07e9d0..ff3b65331 100644 --- "a/content/zh/docs/Developerguide/\350\257\255\345\217\245\350\241\214\344\270\272.md" +++ "b/content/zh/docs/Developerguide/\350\257\255\345\217\245\350\241\214\344\270\272.md" @@ -99,7 +99,6 @@ **取值范围:**枚举类型 -- read uncommitted表示隔离级别是读未提交。 - read committed表示事务读已提交。 - repeatable read表示事务可重复读。 - serializable,openGauss目前功能上不支持此隔离级别,等价于repeatable read。 @@ -157,7 +156,7 @@ openGauss不支持可串行化的隔离级别,因此,该参数无实际意 该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 -**取值范围:**整型,最小值为0,最大值为2147483648,单位为毫秒。 +**取值范围:**整型,最小值为0,最大值为2147483647,单位为毫秒。 **默认值:**0 diff --git "a/content/zh/docs/Developerguide/\350\260\203\344\274\230\346\265\201\347\250\213.md" "b/content/zh/docs/Developerguide/\350\260\203\344\274\230\346\265\201\347\250\213.md" new file mode 100644 index 000000000..8ae1d1aa2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\260\203\344\274\230\346\265\201\347\250\213.md" @@ -0,0 +1,12 @@ +# 调优流程 + +对慢SQL语句进行分析,通常包括以下步骤: + +## 操作步骤 + +1. 收集SQL中涉及到的所有表的统计信息。在数据库中,统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造成执行计划严重劣化,从而导致性能问题。从经验数据来看,10%左右性能问题是因为没有收集统计信息。具体请参见[更新统计信息](更新统计信息.md)。 +2. 通过查看执行计划来查找原因。如果SQL长时间运行未结束,通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及实际运行情况,以便更精准地定位问题原因。有关执行计划的详细介绍请参见[SQL执行计划介绍](SQL执行计划介绍.md)。 +3. [审视和修改表定义](审视和修改表定义.md)。 +4. 针对EXPLAIN或EXPLAIN PERFORMANCE信息,定位SQL慢的具体原因以及改进措施,具体参见[典型SQL调优点](典型SQL调优点.md)。 +5. 通常情况下,有些SQL语句可以通过查询重写转换成等价的,或特定场景下等价的语句。重写后的语句比原语句更简单,且可以简化某些执行步骤达到提升性能的目的。查询重写方法在各个数据库中基本是通用的。[经验总结:SQL语句改写规则](经验总结-SQL语句改写规则.md)介绍了几种常用的通过改写SQL进行调优的方法。 + diff --git "a/content/zh/docs/Developerguide/\350\260\203\347\224\250\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\350\260\203\347\224\250\350\257\255\345\217\245.md" new file mode 100644 index 000000000..802863a22 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\260\203\347\224\250\350\257\255\345\217\245.md" @@ -0,0 +1,38 @@ +# 调用语句 + +## 语法 + +调用一个语句的语法请参见[图1](#zh-cn_topic_0237122223_zh-cn_topic_0059778001_fa4de2ab1dc7e4c04b4997c6238ee1861)。 + +**图 1** call\_clause::= +![](figures/call_clause.png "call_clause") + +对以上语法格式的解释如下: + +- procedure\_name:存储过程名。 +- parameter:存储过程的参数,可以没有或者有多个参数。 + +## 示例 + +``` +--创建存储过程proc_staffs +postgres=# CREATE OR REPLACE PROCEDURE proc_staffs +( +section NUMBER(6), +salary_sum out NUMBER(8,2), +staffs_count out INTEGER +) +IS +BEGIN +SELECT sum(salary), count(*) INTO salary_sum, staffs_count FROM hr.staffs where section_id = section; +END; +/ + +--调用存储过程proc_return. +postgres=# CALL proc_staffs(2,8,6); + +--清除存储过程 +postgres=# DROP PROCEDURE proc_staffs; + +``` + diff --git "a/content/zh/docs/Developerguide/\350\260\203\350\257\225-20.md" "b/content/zh/docs/Developerguide/\350\260\203\350\257\225-20.md" new file mode 100644 index 000000000..c3bbd2d1a --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\260\203\350\257\225-20.md" @@ -0,0 +1,122 @@ +# 调试 + +## 语法 + +RAISE有以下五种语法格式: + +**图 1** raise\_format::= +![](figures/raise_format.png "raise_format") + +**图 2** raise\_condition::= +![](figures/raise_condition.png "raise_condition") + +**图 3** raise\_sqlstate::= +![](figures/raise_sqlstate.png "raise_sqlstate") + +**图 4** raise\_option::= +![](figures/raise_option.png "raise_option") + +**图 5** raise::= +![](figures/raise.png "raise") + +**参数说明:** + +- level选项用于指定错误级别,有DEBUG,LOG,INFO,NOTICE,WARNING以及EXCEPTION(默认值)。EXCEPTION抛出一个正常终止当前事务的异常,其他的仅产生不同异常级别的信息。特殊级别的错误信息是否报告到客户端、写到服务器日志由[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)和[client\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)这两个配置参数控制。 +- format:格式字符串,指定要报告的错误消息文本。格式字符串后可跟表达式,用于向消息文本中插入。在格式字符串中,%由format后面跟着的参数的值替换,%%用于打印出%。例如: + + ``` + --v_job_id 将替换字符串中的 %: + RAISE NOTICE 'Calling cs_create_job(%)',v_job_id; + ``` + +- option = expression:向错误报告中添加另外的信息。关键字option可以是MESSAGE、DETAIL、HINT以及ERRCODE,并且每一个expression可以是任意的字符串。 + - MESSAGE,指定错误消息文本,这个选项不能用于在USING前包含一个格式字符串的RAISE语句中。 + - DETAIL,说明错误的详细信息。 + - HINT,用于打印出提示信息。 + - ERRCODE,向报告中指定错误码(SQLSTATE)。可以使用条件名称或者直接用五位字符的SQLSTATE错误码。 + +- condition\_name:错误码对应的条件名。 +- sqlstate:错误码。 + +如果在RAISE EXCEPTION命令中既没有指定条件名也没有指定SQLSTATE,默认用RAISE EXCEPTION \(P0001\)。如果没有指定消息文本,默认用条件名或者SQLSTATE作为消息文本。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当由SQLSTATE指定了错误码,则不局限于已定义的错误码,可以选择任意包含五个数字或者大写的ASCII字母的错误码,而不是00000。建议避免使用以三个0结尾的错误码,因为这种错误码是类别码,会被整个种类捕获。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>[图5](#zh-cn_topic_0237122256_zh-cn_topic_0059777683_f6b9d7253ecad413e9ee92ba78199a6b4)所示的语法不接任何参数。这种形式仅用于一个BEGIN块中的EXCEPTION语句,它使得错误重新被处理。 + +## 示例 + +终止事务时,给出错误和提示信息: + +``` +CREATE OR REPLACE PROCEDURE proc_raise1(user_id in integer) +AS +BEGIN +RAISE EXCEPTION 'Noexistence ID --> %',user_id USING HINT = 'Please check your user ID'; +END; +/ + +call proc_raise1(300011); + +--执行结果 +ERROR: Noexistence ID --> 300011 +HINT: Please check your user ID +``` + +两种设置SQLSTATE的方式: + +``` +CREATE OR REPLACE PROCEDURE proc_raise2(user_id in integer) +AS +BEGIN +RAISE 'Duplicate user ID: %',user_id USING ERRCODE = 'unique_violation'; +END; +/ + +\set VERBOSITY verbose +call proc_raise2(300011); + +--执行结果 +ERROR: Duplicate user ID: 300011 +SQLSTATE: 23505 +LOCATION: exec_stmt_raise, pl_exec.cpp:3482 +``` + +如果主要的参数是条件名或者是SQLSTATE,可以使用: + +RAISE division\_by\_zero; + +RAISE SQLSTATE '22012'; + +例如: + +``` +CREATE OR REPLACE PROCEDURE division(div in integer, dividend in integer) +AS +DECLARE +res int; + BEGIN + IF dividend=0 THEN + RAISE division_by_zero; + RETURN; + ELSE + res := div/dividend; + RAISE INFO 'division result: %', res; + RETURN; + END IF; + END; +/ +call division(3,0); + +--执行结果 +ERROR: division_by_zero +``` + +或者另一种方式: + +``` +RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id; +``` + diff --git "a/content/zh/docs/Developerguide/\350\260\203\350\257\225.md" "b/content/zh/docs/Developerguide/\350\260\203\350\257\225.md" new file mode 100644 index 000000000..72eb72cb9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\260\203\350\257\225.md" @@ -0,0 +1,160 @@ +# 调试 + +用户可以根据自己的需要,通过修改实例数据目录下的postgresql.conf文件中特定的配置参数来控制日志的输出,从而更好的了解数据库的运行状态。 + +可调整的配置参数请参见[表1](#zh-cn_topic_0237120444_zh-cn_topic_0059779333_tec23904511dd4695b8b01f8c7c04563a)。 + +**表 1** 配置参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      参数名称

      +

      描述

      +

      取值范围

      +

      备注

      +

      client_min_messages

      +

      配置发送到客户端信息的级别。

      +
      • DEBUG5
      • DEBUG4
      • DEBUG3
      • DEBUG2
      • DEBUG1
      • LOG
      • NOTICE
      • WARNING
      • ERROR
      • FATAL
      • PANIC
      +

      默认值:NOTICE 。

      +

      设置级别后,发送到客户端的信息包含所设级别及以下所有低级别会发送的信息。级别越低,发送的信息越少。

      +

      log_min_messages

      +

      配置写到服务器日志里信息的级别。

      +
      • DEBUG5
      • DEBUG4
      • DEBUG3
      • DEBUG2
      • DEBUG1
      • INFO
      • NOTICE
      • WARNING
      • ERROR
      • LOG
      • FATAL
      • PANIC
      +

      默认值:WARNING。

      +

      指定某一级别后,写到日志的信息包含所有更高级别会输出的信息。级别越高,服务器日志的信息越少。

      +

      log_min_error_statement

      +

      配置写到服务器日志中错误SQL语句的级别。

      +
      • DEBUG5
      • DEBUG4
      • DEBUG3
      • DEBUG2
      • DEBUG1
      • INFO
      • NOTICE
      • WARNING
      • ERROR
      • FATAL
      • PANIC
      +

      缺省值:ERROR。

      +

      所有导致一个特定级别(或者更高级别)错误的SQL语句都将记录在服务器日志中。

      +

      只有系统管理员可以修改该参数。

      +

      log_min_duration_statement

      +

      配置语句执行持续的最短时间。如果某个语句的持续时间大于或者等于设置的毫秒数,则会在日志中记录该语句及其持续时间。打开这个选项可以方便地跟踪需要优化的查询。

      +

      INT类型。

      +

      默认值:-1。

      +

      单位:毫秒。

      +

      设置为-1表示关闭这个功能。

      +

      只有系统管理员可以修改该参数。

      +

      log_connections/log_disconnections

      +

      配置是否在每次会话连接或结束时向服务器日志里打印一条信息。

      +
      • on:每次会话连接或结束时向日志里打印一条信息。
      • off:每次会话连接或结束时不向日志里打印信息。
      +

      默认值:off。

      +

      -

      +

      log_duration

      +

      配置是否记录每个已完成语句的持续时间。

      +
      • on:记录每个已完成语句的持续时间。
      • off:不记录已完成语句的持续时间。
      +

      默认值:off。

      +

      只有系统管理员可以修改该参数。

      +

      log_statement

      +

      配置日志中记录哪些SQL语句。

      +
      • none:不记录任何SQL语句。
      • ddl:记录数据定义语句。
      • mod:记录数据定义语句和数据操作语句。
      • all :记录所有语句。
      +

      默认值: none。

      +

      只有系统管理员可以修改该参数。

      +

      log_hostname

      +

      配置是否记录主机名。

      +
      • on:记录主机名。
      • off:不记录主机名。
      +

      默认值:off。

      +

      缺省时,连接日志只记录所连接主机的IP地址。打开这个选项会同时记录主机名。

      +

      该参数同时影响 查看审计结果GS_WLM_SESSION_HISTORYPG_STAT_ACTIVITYlog_line_prefix参数。

      +
      + +上表有关参数级别的说明请参见[表2](#zh-cn_topic_0237120444_zh-cn_topic_0059779333_t3c729a4a94d145c7bdc4ca788236d8a7)。 + +**表 2** 日志级别参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      级别

      +

      说明

      +

      DEBUG[1-5]

      +

      提供开发人员使用的信息。5级为最高级别,依次类推,1级为最低级别。

      +

      INFO

      +

      提供用户隐含要求的信息。如在VACUUM VERBOSE过程中的信息。

      +

      NOTICE

      +

      提供可能对用户有用的信息。如长标识符的截断,作为主键一部分创建的索引。

      +

      WARNING

      +

      提供给用户的警告。如在事务块范围之外的COMMIT。

      +

      ERROR

      +

      报告导致当前命令退出的错误。

      +

      LOG

      +

      报告一些管理员感兴趣的信息。如检查点活跃性。

      +

      FATAL

      +

      报告导致当前会话终止的原因。

      +

      PANIC

      +

      报告导致所有会话退出的原因。

      +
      + diff --git "a/content/zh/docs/Developerguide/\350\264\237\350\275\275\347\256\241\347\220\206.md" "b/content/zh/docs/Developerguide/\350\264\237\350\275\275\347\256\241\347\220\206.md" index 864cb5dc2..218a295ff 100644 --- "a/content/zh/docs/Developerguide/\350\264\237\350\275\275\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Developerguide/\350\264\237\350\275\275\347\256\241\347\220\206.md" @@ -37,10 +37,7 @@ **取值范围**:字符串 -**默认值:**DefaultClass:Medium - ->![](public_sys-resources/icon-note.gif) **说明:** ->DefaultClass:Medium表示DefaultClass下Timeshare控制组中的Medium控制组。 +**默认值:**InvalidGroup ## cpu\_collect\_timer @@ -97,7 +94,7 @@ ## enable\_resource\_record -**参数说明:**是否开启资源监控记录归档功能。开启时,对于history视图(GS\_WLM\_SESSION\_HISTORY和GS\_WLM\_OPERATOR\_HISTORY)中的记录,每隔3分钟会分别被归档到相应的info视图(GS\_WLM\_SESSION\_INFO和GS\_WLM\_OPERATOR\_INFO),归档后history视图中的记录会被清除。 +**参数说明:**是否开启资源监控记录归档功能。 该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 @@ -139,7 +136,7 @@ 参数说明:设置用户历史资源监控数据的保存天数。该参数仅在 enable\_user\_metric\_persistent为on时有效。 -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中的方法一和方法二进行设置。 取值范围:整型,0 ~ 730,单位为天。 @@ -166,7 +163,7 @@ **参数说明:**设置实例历史资源监控数据的保存天数。该参数仅在enable\_instance\_metric\_persistent为on时有效。 -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中的方法一和方法二进行设置。 **取值范围**:整型,0 ~3650,单位为天。 @@ -220,7 +217,7 @@ **参数说明:**禁止内存保护功能。当系统内存不足时如果需要查询系统视图,可以先将此参数置为on,禁止内存保护功能,保证视图可以正常查询。该参数只适用于在系统内存不足时进行系统诊断和调试,正常运行时请保持该参数配置为off。 -该参数属于USERSET类型参数,且只对当前会话有效。请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 +该参数属于USERSET类型参数,且只对当前会话有效。请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 **取值范围**:布尔型 @@ -279,7 +276,7 @@ **参数说明**:每秒触发IO的上限。 -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应类型的设置的方法进行设置。 **取值范围**:整型,0~1073741823 @@ -289,7 +286,7 @@ **参数说明**:IO利用率高达50%时,重消耗IO作业进行IO资源管控时关联的优先级等级。 -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应类型的设置的方法进行设置。 **取值范围**:枚举型 @@ -304,7 +301,7 @@ **参数说明**:行存场景下,io管控时用来对io次数进行计数的单位。 -该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应类型的设置方法进行设置。 记多少次io触发为一计数单位,通过此计数单位所记录的次数进行io管控。 @@ -316,7 +313,7 @@ **参数说明**:当前的session关联的resource pool。 -该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应类型的设置方法进行设置。 即如果先设置cgroup\_name,再设置session\_respool,那么session\_respool关联的控制组起作用,如果再切换cgroup\_name,那么新切换的cgroup\_name起作用。 diff --git "a/content/zh/docs/Developerguide/\350\265\204\346\272\220\346\266\210\350\200\227.md" "b/content/zh/docs/Developerguide/\350\265\204\346\272\220\346\266\210\350\200\227.md" index 0d2973e1e..6e466c3db 100644 --- "a/content/zh/docs/Developerguide/\350\265\204\346\272\220\346\266\210\350\200\227.md" +++ "b/content/zh/docs/Developerguide/\350\265\204\346\272\220\346\266\210\350\200\227.md" @@ -1,6 +1,6 @@ # 资源消耗 -- **[内存](内存.md)** +- **[内存](内存-21.md)** - **[磁盘空间](磁盘空间.md)** diff --git "a/content/zh/docs/Developerguide/\350\265\213\345\200\274\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\350\265\213\345\200\274\350\257\255\345\217\245.md" new file mode 100644 index 000000000..e107373df --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\265\213\345\200\274\350\257\255\345\217\245.md" @@ -0,0 +1,26 @@ +# 赋值语句 + +## 语法 + +给变量赋值的语法请参见[图1](#zh-cn_topic_0237122222_zh-cn_topic_0059778597_f1087f61f4ec24addbb3b79a2ccf21917)。 + +**图 1** assignment\_value::= +![](figures/assignment_value.png "assignment_value") + +对以上语法格式的解释如下: + +- variable\_name:变量名。 +- value:可以是值或表达式。值value的类型需要和变量variable\_name的类型兼容才能正确赋值。 + +## 示例 + +``` +postgres=# DECLARE + emp_id INTEGER := 7788;--赋值 +BEGIN + emp_id := 5;--赋值 + emp_id := 5*7784; +END; +/ +``` + diff --git "a/content/zh/docs/Developerguide/\350\277\224\345\233\236\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\350\277\224\345\233\236\350\257\255\345\217\245.md" new file mode 100644 index 000000000..0f692a954 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\224\345\233\236\350\257\255\345\217\245.md" @@ -0,0 +1,9 @@ +# 返回语句 + +openGauss提供两种方式返回数据:RETURN或RETURN NEXT及RETURN QUERY。其中,RETURN NEXT和RETURN QUERY只适用于函数,不适用存储过程。 + +- **[RETURN](RETURN.md)** + +- **[RETURN NEXT及RETURN QUERY](RETURN-NEXT及RETURN-QUERY.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223-0.md" "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223-0.md" new file mode 100644 index 000000000..43717a5bb --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223-0.md" @@ -0,0 +1,140 @@ +# 连接数据库 + +在创建数据库连接之后,才能使用它来执行SQL语句操作数据。 + +## 函数原型 + +JDBC提供了三个方法,用于创建数据库连接。 + +- DriverManager.getConnection\(String url\); +- DriverManager.getConnection\(String url, Properties info\); +- DriverManager.getConnection\(String url, String user, String password\); + +## 参数 + +**表 1** 数据库连接参数 + + + + + + + + + + + + + + + + + + + +

      参数

      +

      描述

      +

      url

      +

      postgresql.jar数据库连接描述符。格式如下:

      +
      • jdbc:postgresql:database
      • jdbc:postgresql://host/database
      • jdbc:postgresql://host:port/database
      • jdbc:postgresql://host:port/database?param1=value1&param2=value2
      • jdbc:postgresql://host1:port1,host2:port2/database?param1=value1&param2=value2
      +
      说明:
      • database为要连接的数据库名称。
      • host为数据库服务器名称或IP地址。

        连接openGauss的机器与openGauss不在同一网段时,host指定的IP地址应为Manager界面上所设的coo.cooListenIp2(应用访问IP)的取值。

        +

        由于安全原因,数据库主节点禁止openGauss内部其他节点无认证接入。如果要在openGauss内部访问数据库主节点,请将JDBC程序部署在数据库主节点所在机器,host使用"127.0.0.1"。否则可能会出现“FATAL: Forbid remote connection with trust method!”错误。

        +

        建议业务系统单独部署在openGauss外部,否则可能会影响数据库运行性能。

        +

        缺省情况下,连接服务器为localhost。

        +
      • port为数据库服务器端口。

        缺省情况下,会尝试连接到5431端口的database。

        +
      • param为参数名称,即数据库连接属性。

        参数可以配置在URL中,以"?"开始配置,以"="给参数赋值,以"&"作为不同参数的间隔。也可以采用info对象的属性方式进行配置,详细示例会在本节给出。

        +
      • value为参数值,即数据库连接属性值。
      +
      +

      info

      +

      数据库连接属性。常用的属性如下:

      +
      • PGDBNAME:String类型。表示数据库名称。(URL中无需配置该参数,自动从URL中解析)
      • PGHOST:String类型。主机IP地址。详细示例见下。
      • PGPORT:Integer类型。主机端口号。详细示例见下。
      • user:String类型。表示创建连接的数据库用户。
      • password:String类型。表示数据库用户的密码。
      • loggerLevel:String类型。目前支持3种级别:OFF、DEBUG、TRACE。设置为OFF关闭日志,设置为DEBUG和TRACE记录的日志信息详细程度不同。
      • loggerFile:String类型。Logger输出的文件名。需要显示指定日志文件名,若未指定目录则生成在客户端运行程序目录。
      • allowEncodingChanges:Boolean类型。设置该参数值为“true”进行字符集类型更改,配合characterEncoding=CHARSET设置字符集,二者使用"&"分隔。
      • currentSchema:String类型。在search-path中指定要设置的schema。
      • hostRecheckSeconds:Integer类型。JDBC尝试连接主机后会保存主机状态:连接成功或连接失败。在hostRecheckSeconds时间内保持可信,超过则状态失效。缺省值是10秒。
      • ssl:Boolean类型。以SSL方式连接。

        ssl=true可支持NonValidatingFactory通道和使用证书的方式:

        +

        1、NonValidatingFactory通道需要配置用户名和密码,同时将SSL设置为true。

        +

        2、配置客户端证书、密钥、根证书,将SSL设置为true。

        +
      • sslmode:String类型。SSL认证方式。取值范围为:require、verify-ca、verify-full。
        • require只尝试SSL连接,如果存在CA文件,则应设置成verify-ca的方式验证。
        • verify-ca只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书。
        • verify-full只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。
        +
      • sslcert:String类型。提供证书文件的完整路径。客户端和服务端证书的类型为End Entity。
      • sslkey:String类型。提供密钥文件的完整路径。使用时将客户端证书转换为DER格式:
        openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
        +
      • sslrootcert:String类型。SSL根证书的文件名。根证书的类型为CA。
      • sslpassword:String类型。提供给ConsoleCallbackHandler使用。
      • sslpasswordcallback:String类型。SSL密码提供者的类名。缺省值:org.postgresql.ssl.jdbc4.LibPQFactory.ConsoleCallbackHandler。
      • sslfactory:String类型。提供的值是SSLSocketFactory在建立SSL连接时用的类名。
      • sslfactoryarg:String类型。此值是上面提供的sslfactory类的构造函数的可选参数(不推荐使用)。
      • sslhostnameverifier:String类型。主机名验证程序的类名。接口实现javax.net.ssl.HostnameVerifier,默认使用org.postgresql.ssl.PGjdbcHostnameVerifier。
      • loginTimeout:Integer类型。指建立数据库连接的等待时间。超时时间单位为秒。
      • connectTimeout:Integer类型。用于连接服务器操作的超时值。如果连接到服务器花费的时间超过此值,则连接断开。超时时间单位为秒,值为0时表示已禁用,timeout不发生。
      • socketTimeout:Integer类型。用于socket读取操作的超时值。如果从服务器读取所花费的时间超过此值,则连接关闭。超时时间单位为秒,值为0时表示已禁用,timeout不发生。
      • cancelSignalTimeout:Integer类型。发送取消消息本身可能会阻塞,此属性控制用于取消命令的“connect超时”和“socket超时”。超时时间单位为秒,默认值为10秒。
      • tcpKeepAlive:Boolean类型。启用或禁用TCP保活探测功能。默认为false。
      • logUnclosedConnections:Boolean类型。客户端可能由于未调用Connection对象的close()方法而泄漏Connection对象。最终这些对象将被垃圾回收,并且调用finalize()方法。如果调用者自己忽略了此操作,该方法将关闭Connection。
      • assumeMinServerVersion:String类型。客户端会发送请求进行float精度设置。该参数设置要连接的服务器版本,如assumeMinServerVersion=9.0,可以在建立时减少相关包的发送。
      • ApplicationName:String类型。设置正在使用连接的JDBC驱动的名称。通过在数据库主节点上查询pg_stat_activity表可以看到正在连接的客户端信息,JDBC驱动名称显示在application_name列。缺省值为PostgreSQL JDBC Driver。
      • connectionExtraInfo:Boolean类型。表示驱动是否上报当前驱动的部署路径、进程属主用户到数据库。

        取值范围:true或false,默认值为false。设置connectionExtraInfo为true,JDBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数里;同时可以在PG_STAT_ACTIVITY中查询到。

        +
      • autosave:String类型。共有3种:"always", "never", "conservative"。如果查询失败,指定驱动程序应该执行的操作。在autosave=always模式下,JDBC驱动程序在每次查询之前设置一个保存点,并在失败时回滚到该保存点。在autosave=never模式(默认)下,无保存点。在autosave=conservative模式下,每次查询都会设置保存点,但是只会在“statement XXX无效”等情况下回滚并重试。
      • protocolVersion:Integer类型。连接协议版本号,目前仅支持3。注意:设置该参数时将采用md5加密方式,需要同步修改数据库的加密方式:gs_guc set -N all -I all -c "password_encryption_type=1" ,重启openGauss生效后需要创建用md5方式加密口令的用户。同时修改pg_hba.conf,将客户端连接方式修改为md5。用新建用户进行登录(不推荐)。
      • prepareThreshold:Integer类型。控制parse语句何时发送。默认值是5。第一次parse一个SQL比较慢,后面再parse就会比较快,因为有缓存了。如果一个会话连续多次执行同一个SQL,在达到prepareThreshold次数以上时,JDBC将不再对这个SQL发送parse命令。
      • preparedStatementCacheQueries:Integer类型。确定每个连接中缓存的查询数,默认情况下是256。若在prepareStatement()调用中使用超过256个不同的查询,则最近最少使用的查询缓存将被丢弃。0表示禁用缓存。
      • preparedStatementCacheSizeMiB:Integer类型。确定每个连接可缓存的最大值(以兆字节为单位),默认情况下是5。若缓存了超过5MB的查询,则最近最少使用的查询缓存将被丢弃。0表示禁用缓存。
      • databaseMetadataCacheFields:Integer类型。默认值是65536。指定每个连接可缓存的最大值。“0”表示禁用缓存。
      • databaseMetadataCacheFieldsMiB:Integer类型。默认值是5。每个连接可缓存的最大值,单位是MB。“0”表示禁用缓存。
      • stringtype:String类型,可选字段为:false, "unspecified", "varchar"。设置通过setString()方法使用的PreparedStatement参数的类型,如果stringtype设置为VARCHAR(默认值),则这些参数将作为varchar参数发送给服务器。若stringtype设置为unspecified,则参数将作为untyped值发送到服务器,服务器将尝试推断适当的类型。
      • batchMode:Boolean类型。用于确定是否使用batch模式连接。
      • fetchsize:Integer类型。用于设置数据库连接所创建statement的默认fetchsize。
      • reWriteBatchedInserts:Boolean类型。批量导入时,该参数设置为on,可将N条插入语句合并为一条:insert into TABLE_NAME values(values1, ..., valuesN), ..., (values1, ..., valuesN);使用该参数时,需设置batchMode=off。
      • unknownLength:Integer类型,默认为Integer.MAX_VALUE。某些postgresql类型(例如TEXT)没有明确定义的长度,当通过ResultSetMetaData.getColumnDisplaySize和ResultSetMetaData.getPrecision等函数返回关于这些类型的数据时,此参数指定未知长度类型的长度。
      • defaultRowFetchSize:Integer类型。确定一次fetch在ResultSet中读取的行数。限制每次访问数据库时读取的行数可以避免不必要的内存消耗,从而避免OutOfMemoryException。缺省值是0,这意味着ResultSet中将一次获取所有行。没有负数。
      • binaryTransfer:Boolean类型。使用二进制格式发送和接收数据,默认值为“false”。
      • binaryTransferEnable:String类型。启用二进制传输的类型列表,以逗号分隔。OID编号和名称二选一,例如binaryTransferEnable=Integer4_ARRAY,Integer8_ARRAY。

        比如:OID名称为BLOB,编号为88,可以如下配置:

        +

        binaryTransferEnable=BLOB 或 binaryTransferEnable=88

        +
      • binaryTransferDisEnable:String类型。禁用二进制传输的类型列表,以逗号分隔。OID编号和名称二选一。覆盖binaryTransferEnable的设置。
      • blobMode:String类型。用于设置setBinaryStream方法为不同类型的数据赋值,设置为on时表示为blob类型数据赋值,设置为off时表示为bytea类型数据赋值,默认为on。
      • socketFactory:String类型。用于创建与服务器socket连接的类的名称。该类必须实现了接口“javax.net.SocketFactory”,并定义无参或单String参数的构造函数。
      • socketFactoryArg:String类型。此值是上面提供的socketFactory类的构造函数的可选参数,不推荐使用。
      • receiveBufferSize:Integer类型。该值用于设置连接流上的SO_RCVBUF。
      • sendBufferSize:Integer类型。该值用于设置连接流上的SO_SNDBUF。
      • preferQueryMode:String类型。共有4种:"extended", "extendedForPrepared", "extendedCacheEverything", "simple"。用于指定执行查询的模式,simple模式会excute,不parse和bind;extended模式会bind和excute;extendedForPrepared模式为prepared statement扩展使用;extendedCacheEverything模式会缓存每个statement。
      +

      user

      +

      数据库用户。

      +

      password

      +

      数据库用户的密码。

      +
      + +## 示例 + +``` +//以下代码将获取数据库连接操作封装为一个接口,可通过给定用户名和密码来连接数据库。 +public static Connection getConnect(String username, String passwd) + { + //驱动类。 + String driver = "org.postgresql.Driver"; + //数据库连接描述符。 + String sourceURL = "jdbc:postgresql://10.10.0.13:8000/postgres"; + Connection conn = null; + + try + { + //加载驱动。 + Class.forName(driver); + } + catch( Exception e ) + { + e.printStackTrace(); + return null; + } + + try + { + //创建连接。 + conn = DriverManager.getConnection(sourceURL, username, passwd); + System.out.println("Connection succeed!"); + } + catch(Exception e) + { + e.printStackTrace(); + return null; + } + + return conn; + }; +// 以下代码将使用Properties对象作为参数建立连接 +public static Connection getConnectUseProp(String username, String passwd) + { + //驱动类。 + String driver = "org.postgresql.Driver"; + //数据库连接描述符。 + String sourceURL = "jdbc:postgresql://10.10.0.13:8000/postgres?"; + Connection conn = null; + Properties info = new Properties(); + + try + { + //加载驱动。 + Class.forName(driver); + } + catch( Exception e ) + { + e.printStackTrace(); + return null; + } + + try + { + info.setProperty("user", username); + info.setProperty("password", passwd); + //创建连接。 + conn = DriverManager.getConnection(sourceURL, info); + System.out.println("Connection succeed!"); + } + catch(Exception e) + { + e.printStackTrace(); + return null; + } + + return conn; + }; +``` + diff --git "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223\357\274\210\344\273\245SSL\346\226\271\345\274\217\357\274\211.md" "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223\357\274\210\344\273\245SSL\346\226\271\345\274\217\357\274\211.md" new file mode 100644 index 000000000..9128620f8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223\357\274\210\344\273\245SSL\346\226\271\345\274\217\357\274\211.md" @@ -0,0 +1,136 @@ +# 连接数据库(以SSL方式) + +用户通过JDBC连接openGauss服务器时,可以通过开启SSL加密客户端和服务器之间的通讯,为敏感数据在Internet上的传输提供了一种安全保障手段。本小节主要介绍应用程序通过JDBC如何采用SSL的方式连接openGauss。在使用本小节所描述的方法前,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令 。 + +## 服务端配置 + +当开启SSL模式后,必须提供根证书、服务器证书和私钥。 + +配置步骤(假设用户的证书文件放在数据目录/gaussdb/data/datanode下,且采用默认文件名): + +1. 以操作系统用户omm登录数据库主节点。 +2. 生成并配置证书 + + 生成SSL证书,具体请参见[证书生成](证书生成.md)。将生成出的文件server.crt,server.key,cacert.pem拷贝到服务端数据目录下。 + + 使用如下命令可以查询数据库节点的数据目录,instance列为数据目录。 + + ``` + gs_om -t status --detail + ``` + + 在Unix系统上,server.crt、server.key的权限设置必须禁止任何外部或组的访问,请执行如下命令实现这一点。 + + ``` + chmod 0600 server.key + ``` + +3. 开启SSL认证模式。 + + ``` + gs_guc set -D /gaussdb/data/datanode -c "ssl=on" + ``` + +4. 配置客户端接入认证参数,IP为所要连接的主机IP。 + + ``` + gs_guc reload -D /gaussdb/data/datanode -h "hostssl all all 127.0.0.1/32 cert" + gs_guc reload -D /gaussdb/data/datanode -h "hostssl all all IP/32 cert" + ``` + + 表示允许127.0.0.1/32网段的客户端以ssl认证方式连接到openGauss服务器。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >如果服务端pg\_hba.conf文件中METHOD配置为cert,则只有客户端使用证书(client.crt)中所设置的用户名(common name)才能够成功连接数据库。如果设置为md5或sha256则对连接数据库的用户没有限制。 + +5. 配置SSL认证相关的数字证书参数。 + + 各命令后所附为设置成功的回显。 + + ``` + gs_guc set -D /gaussdb/data/datanode -c "ssl_cert_file='server.crt'" + gs_guc set: ssl_cert_file='server.crt' + ``` + + ``` + gs_guc set -D /gaussdb/data/datanode -c "ssl_key_file='server.key'" + gs_guc set: ssl_key_file='server.key' + ``` + + ``` + gs_guc set -D /gaussdb/data/datanode -c "ssl_ca_file='cacert.pem'" + gs_guc set: ssl_ca_file='cacert.pem' + ``` + +6. 重启数据库。 + + ``` + gs_om -t stop && gs_om -t start + ``` + +7. 生成并上传证书文件 + +## 客户端配置 + +配置步骤如下: + +上传证书文件,将在服务端配置章节生成出的文件client.key.pk8,client.crt,cacert.pem放置在客户端。 + +## 示例 + +``` +import java.sql.Connection; +import java.util.Properties; +import java.sql.DriverManager; +import java.sql.Statement; +import java.sql.ResultSet; + +public class SSL{ + public static void main(String[] args) { + Properties urlProps = new Properties(); + String urls = "jdbc:postgresql://10.29.37.136:8000/postgres"; + + /** + * ================== 示例1 使用NonValidatingFactory通道,pg_hba.conf文件中MTETHOD不为cert + */ +/* + urlProps.setProperty("sslfactory","org.postgresql.ssl.NonValidatingFactory"); + urlProps.setProperty("user", "world"); + //此处的test@123为创建用户CRETAE USER world WITH PASSWORD 'test123@'时指定的密码 + urlProps.setProperty("password", "test@123"); + urlProps.setProperty("ssl", "true"); +*/ + /** + * ================== 示例2 - 5 使用证书,pg_hba.conf文件中MTETHOD为cert + */ + urlProps.setProperty("sslcert", "client.crt"); + // DER格式的客户端秘钥 + urlProps.setProperty("sslkey", "client.key.pk8"); + urlProps.setProperty("sslrootcert", "cacert.pem"); + urlProps.setProperty("user", "world"); + /* ================== 示例2 设置ssl为true,使用证书认证 */ + urlProps.setProperty("ssl", "true"); + /* ================== 示例3 设置sslmode为require,使用证书 */ +// urlProps.setProperty("sslmode", "require"); + /* ================== 示例4 设置sslmode为verify-ca,使用证书 */ +// urlProps.setProperty("sslmode", "verify-ca"); + /* ================== 示例5 设置sslmode为verify-full,使用证书(Linux下验证) */ +// urls = "jdbc:postgresql://world:8000/postgres"; +// urlProps.setProperty("sslmode", "verify-full"); + + try { + Class.forName("org.postgresql.Driver").newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + try { + Connection conn; + conn = DriverManager.getConnection(urls,urlProps); + conn.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} +``` + diff --git "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\350\256\276\347\275\256.md" "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\350\256\276\347\275\256.md" index a008f394f..6771aeabf 100644 --- "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\350\256\276\347\275\256.md" +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\350\256\276\347\275\256.md" @@ -35,7 +35,7 @@ **取值范围:**整型,1~65535 -**默认值:**5432(实际值有安装时的配置文件指定) +**默认值:**5432(实际值由安装时的配置文件指定) ## max\_connections @@ -49,7 +49,7 @@ **设置建议:** -数据库主节点中此参数建议保持默认值。数据库节点中此参数建议设置为数据库主节点的个数乘以数据库主节点中此参数的值。 +数据库主节点中此参数建议保持默认值。 增大这个参数可能导致openGauss要求更多的SystemV共享内存或者信号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加以调整。 @@ -135,9 +135,9 @@ Unix域套接字使用普通的Unix文件系统权限集。这个参数的值应 >![](public_sys-resources/icon-note.gif) **说明:** >- 空字符串,表示当前连接数据库的驱动不支持自动设置connection\_info参数或应用程序未设置。 ->- 驱动连接数enable\_resource\_record据库的时候自行拼接的connection\_info参数格式如下: +>- 驱动连接数据库的时候自行拼接的connection\_info参数格式如下: > ``` -> {"driver_name":"ODBC","driver_version": "(openGauss x.x build 62e7353e) compiled at 2019-06-26 14:56:09 commit 5361 last mr 9168 debug","driver_path":"/usr/local/lib/psqlodbcw.so","os_user":"omm"} +> {"driver_name":"ODBC","driver_version": "(GaussDB Kernel V500R001C00 build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 debug","driver_path":"/usr/local/lib/psqlodbcw.so","os_user":"omm"} > ``` -> 默认显示driver\_name和driver\_version,driver\_path和os\_user的显示由用户控制。 +> 默认显示driver\_name和driver\_version,driver\_path和os\_user的显示由用户控制(参见[连接数据库](连接数据库-0.md)和[Linux下配置数据源](Linux下配置数据源.md))。 diff --git "a/content/zh/docs/Developerguide/\351\200\211\346\213\251\345\255\230\345\202\250\346\250\241\345\236\213.md" "b/content/zh/docs/Developerguide/\351\200\211\346\213\251\345\255\230\345\202\250\346\250\241\345\236\213.md" new file mode 100644 index 000000000..5eb3288b2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\200\211\346\213\251\345\255\230\345\202\250\346\250\241\345\236\213.md" @@ -0,0 +1,27 @@ +# 选择存储模型 + +进行数据库设计时,表设计上的一些关键项将严重影响后续整库的查询性能。表设计对数据存储也有影响:好的表设计能够减少I/O操作及最小化内存使用,进而提升查询性能。 + +表的存储模型选择是表定义的第一步。客户业务属性是表的存储模型的决定性因素,依据下面表格选择适合当前业务的存储模型。 + + + + + + + + + + + + + +

      存储模型

      +

      适用场景

      +

      行存

      +

      点查询(返回记录少,基于索引的简单查询)。

      +

      增删改比较多的场景。

      +

      列存

      +

      统计分析类查询 (group , join多的场景)。

      +
      + diff --git "a/content/zh/docs/Developerguide/\351\200\211\346\213\251\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\351\200\211\346\213\251\346\225\260\346\215\256\347\261\273\345\236\213.md" new file mode 100644 index 000000000..2f4a77b99 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\200\211\346\213\251\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -0,0 +1,17 @@ +# 选择数据类型 + +高效数据类型,主要包括以下三方面: + +1. **尽量使用执行效率比较高的数据类型** + + 一般来说整型数据运算\(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by\)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。 + +2. **尽量使用短字段的数据类型** + + 长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。 + +3. **使用一致的数据类型** + + 表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。 + + diff --git "a/content/zh/docs/Developerguide/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" "b/content/zh/docs/Developerguide/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" index 524fa1b79..9386db59f 100644 --- "a/content/zh/docs/Developerguide/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" @@ -53,7 +53,7 @@ >![](public_sys-resources/icon-notice.gif) **须知:** >SCTP协议的连接不再提供支持,为了保持兼容,提供此参数的接口,但此参数会在设置过程中强制改为on。 -**取值范围:**布尔型,数据库主节点设置为on表示使用TCP模式连接数据库节点。 +**取值范围:**布尔型,设置为on表示使用TCP模式连接数据库节点。 **默认值:**on diff --git "a/content/zh/docs/Developerguide/\351\200\232\347\224\250\346\226\207\344\273\266\350\256\277\351\227\256\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\351\200\232\347\224\250\346\226\207\344\273\266\350\256\277\351\227\256\345\207\275\346\225\260.md" index a8f69bb93..bd097a766 100644 --- "a/content/zh/docs/Developerguide/\351\200\232\347\224\250\346\226\207\344\273\266\350\256\277\351\227\256\345\207\275\346\225\260.md" +++ "b/content/zh/docs/Developerguide/\351\200\232\347\224\250\346\226\207\344\273\266\350\256\277\351\227\256\345\207\275\346\225\260.md" @@ -113,7 +113,7 @@ /srv/BigData/gaussdb/data1/dbnode+ 1496308688 + 25108 + - /opt/huawei/Bigdata/gaussdb/gaussdb_tmp + + /opt/user/Bigdata/gaussdb/gaussdb_tmp + * + 25108001 43352069 + diff --git "a/content/zh/docs/Developerguide/\351\200\232\350\277\207INSERT\350\257\255\345\217\245\347\233\264\346\216\245\345\206\231\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\351\200\232\350\277\207INSERT\350\257\255\345\217\245\347\233\264\346\216\245\345\206\231\345\205\245\346\225\260\346\215\256.md" index e341b6ff9..e55c14f58 100644 --- "a/content/zh/docs/Developerguide/\351\200\232\350\277\207INSERT\350\257\255\345\217\245\347\233\264\346\216\245\345\206\231\345\205\245\346\225\260\346\215\256.md" +++ "b/content/zh/docs/Developerguide/\351\200\232\350\277\207INSERT\350\257\255\345\217\245\347\233\264\346\216\245\345\206\231\345\205\245\346\225\260\346\215\256.md" @@ -1,15 +1,15 @@ # 通过INSERT语句直接写入数据 -用户可以通过以下方式执行[INSERT](INSERT.md)语句直接向openGauss写入数据: +用户可以通过以下方式执行[INSERT](INSERT.md)语句直接向openGauss数据库写入数据: -- 使用openGauss提供的客户端工具向openGauss写入数据。 +- 使用openGauss数据库提供的客户端工具向openGauss数据库写入数据。 请参见[向表中插入数据](向表中插入数据.md)。 -- 通过JDBC/ODBC驱动连接数据库执行INSERT语句向openGauss写入数据。 +- 通过JDBC/ODBC驱动连接数据库执行INSERT语句向openGauss数据库写入数据。 详细内容请参见[连接数据库](连接数据库.md)。 -openGauss支持完整的数据库事务级别的增删改操作。INSERT是最简单的一种数据写入方式,这种方式适合数据写入量不大, 并发度不高的场景。 +openGauss数据库支持完整的数据库事务级别的增删改操作。INSERT是最简单的一种数据写入方式,这种方式适合数据写入量不大, 并发度不高的场景。 diff --git "a/content/zh/docs/Developerguide/\351\200\232\350\277\207\345\210\233\345\273\272\344\270\264\346\227\266\350\241\250\345\271\266\346\210\252\346\226\255\345\216\237\345\247\213\350\241\250\346\235\245\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" "b/content/zh/docs/Developerguide/\351\200\232\350\277\207\345\210\233\345\273\272\344\270\264\346\227\266\350\241\250\345\271\266\346\210\252\346\226\255\345\216\237\345\247\213\350\241\250\346\235\245\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" index 23053ce83..b9bb68138 100644 --- "a/content/zh/docs/Developerguide/\351\200\232\350\277\207\345\210\233\345\273\272\344\270\264\346\227\266\350\241\250\345\271\266\346\210\252\346\226\255\345\216\237\345\247\213\350\241\250\346\235\245\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" +++ "b/content/zh/docs/Developerguide/\351\200\232\350\277\207\345\210\233\345\273\272\344\270\264\346\227\266\350\241\250\345\271\266\346\210\252\346\226\255\345\216\237\345\247\213\350\241\250\346\235\245\346\211\247\350\241\214\346\267\261\345\261\202\345\244\215\345\210\266.md" @@ -2,7 +2,7 @@ 该方法使用CREATE TABLE ... AS语句创建原始表的临时表,然后截断原始表并从临时表填充它完成原始表的深层复制。 -在新建表需要保留父表的主键和外键属性,或如果父表具有依赖项的情况下,建议使用此方法。 +在新建表需要保留父表的主键属性,或如果父表具有依赖项的情况下,建议使用此方法。 ## 操作步骤 diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256LLVM.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256LLVM.md" new file mode 100644 index 000000000..7e138f039 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256LLVM.md" @@ -0,0 +1,13 @@ +# 配置LLVM + +LLVM\(Low Level Virtual Machine\)动态编译技术可以为每个查询生成定制化的机器码用于替换原本的通用函数。通过减少实际查询时冗余的条件逻辑判断、虚函数调用并提高数据局域性,从而达到提升查询整体性能的目的。 + +由于LLVM需要消耗额外的时间预生成IR中间态表示并编译成机器码,因此在小数据量场景或查询本身耗时较少时,可能引起性能的劣化。 + +- **[LLVM适用场景与限制](LLVM适用场景与限制.md)** + +- **[其他因素对LLVM性能的影响](其他因素对LLVM性能的影响.md)** + +- **[LLVM使用建议](LLVM使用建议.md)** + + diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-1.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-1.md" deleted file mode 100644 index 895ff5512..000000000 --- "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201-1.md" +++ /dev/null @@ -1,115 +0,0 @@ -# 配置客户端接入认证 - -## 背景信息 - -如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为pg\_hba.conf)存放在数据库的数据目录里。hba(host-based authentication)表示是基于主机的认证。 - -- 本产品支持如下三种认证方式,这三种方式都需要配置“pg\_hba.conf”文件。 - - 基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。 - - 口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。 - - SSL加密:使用OpenSSL(开源安全通信库)提供服务器端和客户端安全连接的环境。 - -- “pg\_hba.conf”文件的格式是一行写一条信息,表示一个认证规则,空白和注释(以\#开头)被忽略。 -- 每个认证规则是由若干空格和/,空格和制表符分隔的字段组成。如果字段用引号包围,则它可以包含空白。一条记录不能跨行存在。 - -## 操作步骤 - -1. 以操作系统用户omm登录数据库主节点。 -2. 配置客户端认证方式,允许客户端以“jack”用户连接到本机,此处远程连接禁止使用“omm”用户(即数据库初始化用户)。 - - 例如,下面示例中配置允许IP地址为10.10.0.30的客户端访问本机。 - - ``` - gs_guc set -N all -I all -h "host all jack 10.10.0.30/32 sha256" - ``` - - >![](public_sys-resources/icon-note.gif) **说明:** - >- 使用“jack”用户前,需先本地连接数据库,并在数据库中使用如下语句建立“jack”用户: - > ``` - > postgres=# CREATE USER jack PASSWORD 'Test@123'; - > ``` - >- -N all表示openGauss的所有主机。 - >- -I all表示主机的所有实例。 - >- -h表示指定需要在“pg\_hba.conf”增加的语句。 - >- all表示允许客户端连接到任意的数据库。 - >- jack表示连接数据库的用户。 - >- 10.10.0.30_/32_表示只允许IP地址为10.10.0.30的主机连接。此处的IP地址不能为openGauss内的IP,在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255 - >- sha256表示连接时jack用户的密码使用sha256算法加密。 - - 这条命令在数据库主节点实例对应的“pg\_hba.conf”文件中添加了一条规则,用于对连接数据库主节点的客户端进行鉴定。 - - “pg\_hba.conf”文件中的每条记录可以是下面四种格式之一,四种格式的参数说明请参见[配置文件参考](配置文件参考.md#ZH-CN_TOPIC_0242376655)。 - - ``` - local DATABASE USER METHOD [OPTIONS] - host DATABASE USER ADDRESS METHOD [OPTIONS] - hostssl DATABASE USER ADDRESS METHOD [OPTIONS] - hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] - ``` - - 因为认证时系统是为每个连接请求顺序检查“pg\_hba.conf”里的记录的,所以这些记录的顺序是非常关键的。 - - >![](public_sys-resources/icon-note.gif) **说明:** - >在配置“pg\_hba.conf”文件时,请依据通讯需求按照格式内容从上至下配置记录,优先级高的需求需要配置在前面。openGaussopenGauss和扩容配置的IP优先级最高,用户手动配置的IP请放在这二者之后,如果已经进行的客户配置和扩容节点的IP在同一网段,请在扩容前删除,扩容成功后再进行配置。 - - 因此对于认证规则的配置建议如下: - - - 靠前的记录有比较严格的连接参数和比较弱的认证方法。 - - 靠后的记录有比较宽松的连接参数和比较强的认证方法。 - - >![](public_sys-resources/icon-note.gif) **说明:** - >- 一个用户要想成功连接到特定的数据库,不仅需要通过pg\_hba.conf中的规则检查,还必须要有该数据库上的CONNECT权限。如果希望控制某些用户只能连接到指定数据库,赋予/撤销CONNECT权限通常比在pg\_hba.conf中设置规则更为简单。 - >- 对应openGauss外部客户端连接,trust为不安全的认证方式,请将认证方式设置为sha256。 - - -## 异常处理 - -用户认证失败有很多原因,通过服务器返回给客户端的提示信息,可以看到用户认证失败的原因。常见的错误提示请参见[表1](#zh-cn_topic_0237121090_zh-cn_topic_0059778856_t451d737a3917467b9691ba1306766cdb)。 - -**表 1** 错误提示 - - - - - - - - - - - - - - - - -

      问题现象

      -

      解决方法

      -

      用户名或密码错误:

      -
      FATAL: invalid username/password,login denied
      -

      这条信息说明用户名或者密码错误,请检查输入是否有误。

      -

      连接的数据库不存在:

      -
      FATAL: database "TESTDB" does not exist
      -

      这条信息说明尝试连接的数据库不存在,请检查连接的数据库名输入是否有误。

      -

      未找到客户端匹配记录:

      -
      FATAL: no pg_hba.conf entry for host "10.10.0.60", user "ANDYM", database "TESTDB"
      -

      这条信息说明已经连接了服务器,但服务器拒绝了连接请求,因为没有在它的pg_hba.conf配置文件里找到匹配的记录。请联系数据库管理员在pg_hba.conf配置文件加入用户的信息。

      -
      - -## 示例 - -``` -TYPE DATABASE USER ADDRESS METHOD - -"local" is for Unix domain socket connections only -#表示只允许以安装时-U参数指定的用户从服务器本机进行连接。 -local all all trust -IPv4 local connections: -#表示允许omm用户从10.10.0.50主机上连接到任意数据库,使用sha256算法对密码进行加密。 -host all omm 10.10.0.50/32 sha256 -#表示允许任何用户从10.10.0.0/24网段的主机上连接到任意数据库,使用sha256算法对密码进行加密,并且经过SSL加密传输。 -hostssl all all 10.10.0.0/24 sha256 -#表示允许任何用户从10.10.0.0/24网段的主机上连接到任意数据库,使用Kerberos认证方式,当前版本暂不支持客户端kerberos认证。 -host all all 10.10.0.0/24 gss include_realm=1 krb_realm=HADOOP.COM -``` - diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" index 77ac7307a..31fd4615a 100644 --- "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\345\256\242\346\210\267\347\253\257\346\216\245\345\205\245\350\256\244\350\257\201.md" @@ -1,4 +1,4 @@ -# 配置客户端接入认证 +# 配置客户端接入认证 ## 背景信息 @@ -38,7 +38,7 @@ 这条命令在数据库主节点实例对应的“pg\_hba.conf”文件中添加了一条规则,用于对连接数据库主节点的客户端进行鉴定。 - “pg\_hba.conf”文件中的每条记录可以是下面四种格式之一,四种格式的参数说明请参见[配置文件参考](配置文件参考.md#ZH-CN_TOPIC_0242376655)。 + “pg\_hba.conf”文件中的每条记录可以是下面四种格式之一,四种格式的参数说明请参见[配置文件参考](配置文件参考.md)。 ``` local DATABASE USER METHOD [OPTIONS] diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203-2.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203-2.md" deleted file mode 100644 index 643de1b57..000000000 --- "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203-2.md" +++ /dev/null @@ -1,133 +0,0 @@ -# 配置文件参考 - -**表 1** 参数说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      参数名称

      -

      描述

      -

      取值范围

      -

      local

      -

      表示这条记录只接受通过Unix域套接字进行的连接。没有这种类型的记录,就不允许Unix域套接字的连接。

      -

      只有在从服务器本机使用gsql连接且在不指定-U参数的情况下,才是通过Unix域套接字连接。

      -

      -

      -

      host

      -

      表示这条记录既接受一个普通的TCP/IP套接字连接,也接受一个经过SSL加密的TCP/IP套接字连接。

      -

      -

      -

      hostssl

      -

      表示这条记录只接受一个经过SSL加密的TCP/IP套接字连接。

      -

      用SSL进行安全的连接,需要配置申请数字证书并配置相关参数,详细信息请参见用SSL进行安全的TCP/IP连接

      -

      hostnossl

      -

      表示这条记录只接受一个普通的TCP/IP套接字连接。

      -

      -

      -

      DATABASEGUC

      -

      声明记录所匹配且允许访问的数据库。

      -
      • all:表示该记录匹配所有数据库。
      • sameuser:表示如果请求访问的数据库和请求的用户同名,则匹配。
      • samerole:表示请求的用户必须是与数据库同名角色中的成员。
      • samegroup:与samerole作用完全一致,表示请求的用户必须是与数据库同名角色中的成员。
      • 一个包含数据库名的文件或者文件中的数据库列表:文件可以通过在文件名前面加前缀@来声明。文件中的数据库列表以逗号或者换行符分隔。
      • 特定的数据库名称或者用逗号分隔的数据库列表。
        说明:

        值replication表示如果请求一个复制链接,则匹配,但复制链接不表示任何特定的数据库。如需使用名为replication的数据库,需在database列使用记录“replication”作为数据库名。

        -
        -
      -

      USER

      -

      声明记录所匹配且允许访问的数据库用户。

      -
      • all:表明该记录匹配所有用户。
      • +用户角色:表示匹配任何直接或者间接属于这个角色的成员。
        说明:

        +表示前缀符号。

        -
        -
      • 一个包含用户名的文件或者文件中的用户列表:文件可以通过在文件名前面加前缀@来声明。文件中的用户列表以逗号或者换行符分隔。
      • 特定的数据库用户名或者用逗号分隔的用户列表。
      -

      ADDRESS

      -

      指定与记录匹配且允许访问的IP地址范围。

      -

      支持IPv4和IPv6,可以使用如下两种形式来表示:

      -
      • IP地址/掩码长度。例如,10.10.0.0/24
      • IP地址子网掩码。例如,10.10.0.0 255.255.255.0
      -
      说明:

      以IPv4格式给出的IP地址会匹配那些拥有对应地址的IPv6连接,比如127.0.0.1将匹配IPv6地址 ::ffff:127.0.0.1

      -
      -

      METHOD

      -

      声明连接时使用的认证方法。

      -

      本产品支持如下几种认证方式,详细解释请参见表2

      -
      • trust
      • reject
      • md5(不推荐使用,默认不支持,可通过password_encryption_type参数配置)
      • sha256
      • cert
      • gss(仅用于openGauss内部节点间认证)
      -
      - -**表 2** 认证方式 - - - - - - - - - - - - - - - - - - - - - - - - - -

      认证方式

      -

      说明

      -

      trust

      -

      采用这种认证模式时,本产品只完全信任从服务器本机使用gsql且不指定-U参数的连接,此时不需要口令。

      -

      trust认证对于单用户工作站的本地连接是非常合适和方便的,通常不适用于多用户环境。如果想使用这种认证方法,可利用文件系统权限限制对服务器的Unix域套接字文件的访问。要使用这种限制有两个方法:

      - -
      须知:

      设置文件系统权限只能Unix域套接字连接,它不会限制本地TCP/IP连接。为保证本地TCP/IP安全,openGauss不允许远程连接使用trust认证方法。

      -
      -

      reject

      -

      无条件地拒绝连接。常用于过滤某些主机。

      -

      md5

      -

      要求客户端提供一个md5加密的口令进行认证。

      -
      须知:

      不推荐使用md5认证,因为md5为不安全的加密算法,存在网络安全风险。openGauss保留md5认证和密码存储,是为了便于第三方工具的使用(比如TPCC评测工具)。

      -
      -

      sha256

      -

      要求客户端提供一个sha256算法加密的口令进行认证,该口令在传送过程中结合salt(服务器发送给客户端的随机数)的单向sha256加密,增强了安全性。

      -

      cert

      -

      客户端证书认证模式,此模式需进行SSL连接配置且需要客户端提供有效的SSL证书,不需要提供用户密码。

      -
      须知:

      该认证方式只支持hostssl类型的规则。

      -
      -

      gss

      -

      使用基于gssapi的kerberos认证。

      -
      须知:
      • 该认证方式依赖kerberos server等组件,仅支持openGauss内部通信认证。当前版本暂不支持外部客户端通过kerberos认证连接。
      • 开启openGauss内部kerberos认证会使增加内部节点建连时间,即影响首次涉及内部建连的SQL操作性能,内部连接建立好后, 后续操作不受影响。
      -
      -
      - diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203.md" index 6d93c8441..c123dfeef 100644 --- "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203.md" +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203.md" @@ -1,4 +1,4 @@ -# 配置文件参考 +# 配置文件参考 **表 1** 参数说明 @@ -73,7 +73,7 @@

      声明连接时使用的认证方法。

      本产品支持如下几种认证方式,详细解释请参见表2

      -
      • trust
      • reject
      • md5(不推荐使用,默认不支持,可通过password_encryption_type参数配置)
      • sha256
      • cert
      • gss(仅用于openGauss内部节点间认证)
      +
      • trust
      • reject
      • md5(不推荐使用,默认不支持,可通过password_encryption_type参数配置)
      • sha256
      • cert
      • gss(仅用于openGauss内部节点间认证)

      采用这种认证模式时,本产品只完全信任从服务器本机使用gsql且不指定-U参数的连接,此时不需要口令。

      trust认证对于单用户工作站的本地连接是非常合适和方便的,通常不适用于多用户环境。如果想使用这种认证方法,可利用文件系统权限限制对服务器的Unix域套接字文件的访问。要使用这种限制有两个方法:

      -
      须知:

      设置文件系统权限只能Unix域套接字连接,它不会限制本地TCP/IP连接。为保证本地TCP/IP安全,openGauss不允许远程连接使用trust认证方法。

      +
      须知:

      设置文件系统权限只能Unix域套接字连接,它不会限制本地TCP/IP连接。为保证本地TCP/IP安全,openGauss不允许远程连接使用trust认证方法。

      md5

      要求客户端提供一个md5加密的口令进行认证。

      -
      须知:

      不推荐使用md5认证,因为md5为不安全的加密算法,存在网络安全风险。openGauss保留md5认证和密码存储,是为了便于第三方工具的使用(比如TPCC评测工具)。

      +
      须知:

      不推荐使用md5认证,因为md5为不安全的加密算法,存在网络安全风险。openGauss保留md5认证和密码存储,是为了便于第三方工具的使用(比如TPCC评测工具)。

      gss

      使用基于gssapi的kerberos认证。

      -
      须知:
      • 该认证方式依赖kerberos server等组件,仅支持openGauss内部通信认证。当前版本暂不支持外部客户端通过kerberos认证连接。
      • 开启openGauss内部kerberos认证会使增加内部节点建连时间,即影响首次涉及内部建连的SQL操作性能,内部连接建立好后, 后续操作不受影响。
      +
      须知:
      • 该认证方式依赖kerberos server等组件,仅支持openGauss内部通信认证。当前版本暂不支持外部客户端通过kerberos认证连接。
      • 开启openGauss内部kerberos认证会使增加内部节点建连时间,即影响首次涉及内部建连的SQL操作性能,内部连接建立好后, 后续操作不受影响。
      1. 使用如下命令修改参数。
        gs_guc set -D datadir -c "paraname=value"
        说明:

        如果参数是一个字符串变量,则使用-c parameter="'value'"或者使用-c "parameter = 'value'"。

        -

        使用以下命令在数据库节点上同时设置某个参数。

        +

        使用以下命令在数据库节点上同时设置某个参数。

        gs_guc set -N all -I all -c "paraname=value"
      2. 重启数据库使参数生效。
        说明:

        重启openGauss操作会导致用户执行操作中断,请在操作之前规划好合适的执行窗口。

        @@ -106,7 +106,7 @@ openGauss提供了三种方式来修改GUC参数,具体操作请参考[表2](#

      方式二

      gs_guc reload -D datadir -c "paraname=value"
      -
      说明:

      使用以下命令在数据库节点上同时设置某个参数。

      +
      说明:

      使用以下命令在数据库节点上同时设置某个参数。

      gs_guc reload -N all -I all -c "paraname=value"

      要链接的用户名,缺省是与运行该应用的用户操作系统名同名的用户。

      dbname

      +

      数据库名,缺省和用户名相同。

      +

      password

      如果服务器要求口令认证,所用的口令。

      @@ -40,7 +45,7 @@

      connect_timeout

      链接的最大等待时间,以秒计(用十进制整数字串书写),0或者不声明表示无穷。不建议把链接超时的值设置得小于2秒。

      +

      链接的最大等待时间,以秒计(用十进制整数字符串书写),0或者不声明表示无穷。不建议把链接超时的值设置得小于2秒。

      client_encoding

      @@ -50,7 +55,7 @@

      options

      添加命令行选项以在运行时发送到服务器。例如,设置为-c comm_debug_mode=off设置guc参数comm_debug_mode参数的会话的值为off。

      +

      添加命令行选项以在运行时发送到服务器。

      application_name

      diff --git "a/content/zh/docs/Developerguide/\351\224\201\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\351\224\201\346\223\215\344\275\234.md" new file mode 100644 index 000000000..8e82b1560 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\224\201\346\223\215\344\275\234.md" @@ -0,0 +1,4 @@ +# 锁操作 + +openGauss提供了多种锁模式用于控制对表中数据的并发访问。这些模式可以用在MVCC(多版本并发控制)无法给出期望行为的场合。同样,大多数openGauss命令自动施加恰当的锁,以保证被引用的表在命令的执行过程中不会以一种不兼容的方式被删除或者修改。比如,在存在其他并发操作的时候,ALTER TABLE是不能在同一个表上执行的。 + diff --git "a/content/zh/docs/Developerguide/\351\224\231\350\257\257\346\215\225\350\216\267\350\257\255\345\217\245.md" "b/content/zh/docs/Developerguide/\351\224\231\350\257\257\346\215\225\350\216\267\350\257\255\345\217\245.md" new file mode 100644 index 000000000..cb070d9d4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\224\231\350\257\257\346\215\225\350\216\267\350\257\255\345\217\245.md" @@ -0,0 +1,112 @@ +# 错误捕获语句 + +缺省时,当PL/SQL函数执行过程中发生错误时退出函数执行,并且周围的事务也会回滚。可以用一个带有EXCEPTION子句的BEGIN块捕获错误并且从中恢复。其语法是正常的BEGIN块语法的一个扩展: + +``` +[<

Yes