From 7b795983887f9e544a8c9b4489a4c230b01479f0 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:02:28 +0800 Subject: [PATCH 01/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntent/zh/docs/installation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../installation/completing-the-installation.md | 1 - .../configurations-during-installation.md | 1 - .../docs/installation/figures/installation.jpg | Bin 41177 -> 0 bytes content/zh/docs/installation/installation.md | 3 --- .../docs/installation/starting-installation.md | 1 - 5 files changed, 6 deletions(-) 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/installation.md delete mode 100644 content/zh/docs/installation/starting-installation.md diff --git a/content/zh/docs/installation/completing-the-installation.md b/content/zh/docs/installation/completing-the-installation.md deleted file mode 100644 index 98ece32f0..000000000 --- a/content/zh/docs/installation/completing-the-installation.md +++ /dev/null @@ -1 +0,0 @@ -这篇文档描述如何完成安装openGauss。 diff --git a/content/zh/docs/installation/configurations-during-installation.md b/content/zh/docs/installation/configurations-during-installation.md deleted file mode 100644 index 661f3261d..000000000 --- a/content/zh/docs/installation/configurations-during-installation.md +++ /dev/null @@ -1 +0,0 @@ -这篇文档描述在安装openGauss过程中如何配置。 diff --git a/content/zh/docs/installation/figures/installation.jpg b/content/zh/docs/installation/figures/installation.jpg deleted file mode 100644 index 148c7c11c1361529dbbe6424ccee0401c9f9df0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41177 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 U982tIW3ur?g#_MULa$eZh}99VQKzs8V#F<`;W! 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 Date: Thu, 28 May 2020 16:02:39 +0800 Subject: [PATCH 02/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/.keep diff --git a/content/zh/docs/.keep b/content/zh/docs/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From fcb8995eb55c317e35770625902ec441c310c6ee Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:03:30 +0800 Subject: [PATCH 03/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Compilationguide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Compilationguide/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Compilationguide/.keep diff --git a/content/zh/docs/Compilationguide/.keep b/content/zh/docs/Compilationguide/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 1bc7536b273af3acaccda64c92ed25722bccf3c5 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:03:54 +0800 Subject: [PATCH 04/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20public=5Fsys-resourc?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Compilationguide/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/.keep diff --git a/content/zh/docs/Compilationguide/public_sys-resources/.keep b/content/zh/docs/Compilationguide/public_sys-resources/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 6384391987388171aa13b54b4e3277cb1588b0e6 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:07:58 +0800 Subject: [PATCH 05/35] =?UTF-8?q?openGauss=E8=B5=84=E6=96=99=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zh/docs/Compilationguide/Compilation.md | 13 ++ 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 +++ ...64\346\227\266\346\226\207\344\273\266.md" | 23 ++++ ...e-executables-\346\212\245\351\224\231.md" | 12 ++ ...26\350\257\221\347\216\257\345\242\203.md" | 9 ++ ...73\347\273\237\350\246\201\346\261\202.md" | 7 ++ ...10\346\234\254\347\274\226\350\257\221.md" | 13 ++ ...30\351\207\217\351\205\215\347\275\256.md" | 6 + ...54\344\273\266\350\246\201\346\261\202.md" | 11 ++ ...21\345\211\215\345\207\206\345\244\207.md" | 5 + ...35\350\265\226\350\246\201\346\261\202.md" | 68 ++++++++++ ...11\350\243\205\347\274\226\350\257\221.md" | 116 ++++++++++++++++++ ...57\344\273\266\350\246\201\346\261\202.md" | 7 ++ 15 files changed, 357 insertions(+) create mode 100644 content/zh/docs/Compilationguide/Compilation.md create mode 100644 content/zh/docs/Compilationguide/FAQ.md create 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" create mode 100644 "content/zh/docs/Compilationguide/\344\273\243\347\240\201\344\270\213\350\275\275.md" create mode 100644 "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" create 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/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Compilationguide/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" create mode 100644 "content/zh/docs/Compilationguide/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" create mode 100644 "content/zh/docs/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" create mode 100644 "content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" diff --git a/content/zh/docs/Compilationguide/Compilation.md b/content/zh/docs/Compilationguide/Compilation.md new file mode 100644 index 000000000..59e3286f9 --- /dev/null +++ b/content/zh/docs/Compilationguide/Compilation.md @@ -0,0 +1,13 @@ +# 环境编译指导 + +## 目的 + +本文档帮助读者快速了解编译openGauss所需的软硬件要求、环境配置,以及如何从源码编译出软件或者安装包。 + +## 概述 + +本文档介绍了openGauss对于操作系统的要求、编译环境的要求、软件依赖、编译方法以及编译结果的存放位置等。 + + + + diff --git a/content/zh/docs/Compilationguide/FAQ.md b/content/zh/docs/Compilationguide/FAQ.md new file mode 100644 index 000000000..316ce0f9f --- /dev/null +++ b/content/zh/docs/Compilationguide/FAQ.md @@ -0,0 +1,7 @@ +# 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" new file mode 100644 index 000000000..6f88a50d9 --- /dev/null +++ "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" @@ -0,0 +1,41 @@ +# 产品安装包编译 + +安装包编译即将代码编译生成软件安装包。 + +## 前提条件 + +- 已按照[搭建编译环境](搭建编译环境.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" new file mode 100644 index 000000000..faa443b1b --- /dev/null +++ "b/content/zh/docs/Compilationguide/\344\273\243\347\240\201\344\270\213\350\275\275.md" @@ -0,0 +1,19 @@ +# 代码下载 + +## 前提条件 + +已在本地安装并配置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\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/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" new file mode 100644 index 000000000..2d4e841a0 --- /dev/null +++ "b/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" @@ -0,0 +1,23 @@ +# 如何清除编译过程中生成的临时文件 + +## 问题 + +如何清除编译过程中生成的临时文件。 + +## 回答 + +进入/sda/openGauss-server目录,执行如下命令清除编译过程中生成的临时文件。 + +- 删除由configure和make生成的文件。 + + ``` + make distclean -sj + ``` + +- 删除make生成的文件。 + + ``` + make clean -sj + ``` + + 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" new file mode 100644 index 000000000..b4876ab6e --- /dev/null +++ "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" @@ -0,0 +1,12 @@ +# 如何解决“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/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" "b/content/zh/docs/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" new file mode 100644 index 000000000..c8f6b57e6 --- /dev/null +++ "b/content/zh/docs/Compilationguide/\346\220\255\345\273\272\347\274\226\350\257\221\347\216\257\345\242\203.md" @@ -0,0 +1,9 @@ +# 搭建编译环境 + +- **[硬件要求](硬件要求.md)** + +- **[软件要求](软件要求.md)** + +- **[环境变量配置](环境变量配置.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/Compilationguide/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" new file mode 100644 index 000000000..b84a57ffa --- /dev/null +++ "b/content/zh/docs/Compilationguide/\346\223\215\344\275\234\347\263\273\347\273\237\350\246\201\346\261\202.md" @@ -0,0 +1,7 @@ +# 操作系统要求 + +openGauss支持的操作系统: + +- CentOS 7.6 \(x86 架构\) +- openEuler-20.03-LTS \(aarch64 架构\) + diff --git "a/content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" "b/content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" new file mode 100644 index 000000000..a909910bf --- /dev/null +++ "b/content/zh/docs/Compilationguide/\347\211\210\346\234\254\347\274\226\350\257\221.md" @@ -0,0 +1,13 @@ +# 版本编译 + +openGauss的编译过程和生成安装包的过程已经写成了两个一键式的脚本,可以方便的通过脚本进行编译操作。也可以自己配置环境变量,通过命令进行编译。 + +本章节会介绍openGauss编译需要满足的前提条件,编译的操作步骤等。 + +- **[编译前准备](编译前准备.md)** + +- **[软件安装编译](软件安装编译.md)** + +- **[产品安装包编译](产品安装包编译.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/Compilationguide/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" new file mode 100644 index 000000000..804a2524d --- /dev/null +++ "b/content/zh/docs/Compilationguide/\347\216\257\345\242\203\345\217\230\351\207\217\351\205\215\347\275\256.md" @@ -0,0 +1,6 @@ +# 环境变量配置 + +编译openGauss的环境变量配置已经统一写入一键式编译和打包脚本,因此无需自行配置。 + +若想不使用一键式编译脚本,则需要手动配置环境变量,将在[软件安装编译](软件安装编译.md)介绍。 + diff --git "a/content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" "b/content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" new file mode 100644 index 000000000..b35ef57f3 --- /dev/null +++ "b/content/zh/docs/Compilationguide/\347\241\254\344\273\266\350\246\201\346\261\202.md" @@ -0,0 +1,11 @@ +# 硬件要求 + +编译openGauss的硬件要求: + +- 机器数量:1台 +- 机器硬件规格: + - CPU: 4U + - Memory: 8G + - Free Disk:100G \(Linux 64位\) + + 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/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" new file mode 100644 index 000000000..eded02ed7 --- /dev/null +++ "b/content/zh/docs/Compilationguide/\347\274\226\350\257\221\345\211\215\345\207\206\345\244\207.md" @@ -0,0 +1,5 @@ +# 编译前准备 + +- **[代码下载](代码下载.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/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" new file mode 100644 index 000000000..8185bce53 --- /dev/null +++ "b/content/zh/docs/Compilationguide/\350\275\257\344\273\266\344\276\235\350\265\226\350\246\201\346\261\202.md" @@ -0,0 +1,68 @@ +# 软件依赖要求 + +编译openGauss的软件依赖要求如[表1](#table1212531681911)所示。 + +建议使用上述操作系统安装光盘或者源中,下列依赖软件的默认安装包,若不存在下列软件,可参看软件对应的建议版本。 + +**表 1** 软件依赖要求 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

所需软件

+

建议版本

+

libaio

+

建议版本:0.3.109-13

+

libaio-devel

+

建议版本:0.3.109-13

+

flex

+

要求版本:2.5.31 以上

+

bison

+

建议版本:2.7-4

+

ncurses-devel

+

建议版本:5.9-13.20130511

+

zlib-devel

+

建议版本:1.2.7-15

+

glibc

+

建议版本:2.17-111

+

glibc.i686

+

建议版本:2.17-111

+

glibc.devel*

+

建议版本:2.17-111

+

patch

+

建议版本:2.7.1-10

+
+ 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/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" new file mode 100644 index 000000000..8b3ebd6d4 --- /dev/null +++ "b/content/zh/docs/Compilationguide/\350\275\257\344\273\266\345\256\211\350\243\205\347\274\226\350\257\221.md" @@ -0,0 +1,116 @@ +# 软件安装编译 + +软件安装编译即将代码编译生成软件,并将软件安装到机器上。提供一键式编译脚本build.sh进行操作,也可以自己配置环境变量手动操作。两种方式将在本章节的一键式脚本操作步骤、手动编译操作步骤中进行讲解 + +## 前提条件 + +- 已按照[搭建编译环境](搭建编译环境.md)的要求准备好相关软硬件。 +- 已下载代码和子仓库。具体请参见[代码下载](代码下载.md)。 +- 已完成开源软件编译构建。 + +## 一键式脚本编译 + +1. 执行如下命令进入到软件代码编译脚本目录。 + + ``` + [user@linux sda]$ cd /sda/openGauss-server + ``` + +2. 执行如下命令,编译安装openGauss。 + + ``` + [user@linux openGauss-server]$ sh build.sh [debug | release | memcheck] + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >_\[debug | release | memcheck\]_表示可选择三种目标版本,三种目标版本如下所示: + >- release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 + >- debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境; + >- memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 + +3. 显示如下内容,表示编译成功。 + + ``` + make compile sucessfully! + ``` + + - 编译后软件安装路径为:/sda/openGauss-server/dest + - 编译后的二进制放置路径为:/sda/openGauss-server/dest/bin + - 编译日志为:make\_compile.log + + +## 手动编译 + +1. 执行如下命令进入到软件代码目录。 + + ``` + [user@linux sda]$ cd /sda/openGauss-server + ``` + +2. 执行脚本获取自己系统的版本 + + ``` + [user@linux openGauss-server]$ sh src/get_PlatForm_str.sh + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 显示的结果表示openGauss当前支持的操作系统,openGauss支持的操作系统为centos7.6\_x86\_64、openeuler\_aarch64。 + >- 如果结果显示为 Failed,表示当前操作系统不支持。 + +3. 配置环境变量,将[步骤2](#li1666842982511)获取到的结果替换下面的**\*\*\***。 + + ``` + export CODE_BASE=`pwd` + export GCC_PATH=$CODE_BASE/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/ + ``` + +4. 选择版本进行configure。 + + debug版: + + ``` + ./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --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 + ``` + + 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 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >_\[debug | release | memcheck\]_表示可选择三种目标版本,三种目标版本如下所示: + >- release: 代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生成环境或性能测试环境。 + >- debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境; + >- memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 + >在ARM平台上,release版本的CFLAGS需要添加 -D\_\_USE\_NUMA 。 + +5. 执行如下命令,编译安装。 + + ``` + [user@linux openGauss-server]$ make -sj + [user@linux openGauss-server]$ make install -sj + ``` + +6. 显示如下内容,表示编译安装成功。 + + ``` + PostgreSQL installation complete. + ``` + + - 编译后软件安装路径为:$GAUSSHOME + - 编译后的二进制放置路径为:$GAUSSHOME/bin + + diff --git "a/content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" "b/content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" new file mode 100644 index 000000000..e0d234159 --- /dev/null +++ "b/content/zh/docs/Compilationguide/\350\275\257\344\273\266\350\246\201\346\261\202.md" @@ -0,0 +1,7 @@ +# 软件要求 + +- **[操作系统要求](操作系统要求.md)** + +- **[软件依赖要求](软件依赖要求.md)** + + -- Gitee From f2604cf7f2996e81c93b429daca47d01fd30e1a0 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:12:00 +0800 Subject: [PATCH 06/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../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 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Compilationguide/public_sys-resources/icon-warning.gif diff --git a/content/zh/docs/Compilationguide/public_sys-resources/icon-caution.gif b/content/zh/docs/Compilationguide/public_sys-resources/icon-caution.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/Compilationguide/public_sys-resources/icon-danger.gif b/content/zh/docs/Compilationguide/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/Compilationguide/public_sys-resources/icon-note.gif b/content/zh/docs/Compilationguide/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/Compilationguide/public_sys-resources/icon-notice.gif b/content/zh/docs/Compilationguide/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 -- Gitee From 33bee99d367fe3e8e2245e0ae547f4c8b62bda1b Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:13:04 +0800 Subject: [PATCH 07/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Description?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Description/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Description/.keep diff --git a/content/zh/docs/Description/.keep b/content/zh/docs/Description/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 40ccfc687de4cb1d8076983fc1966e05e5899e98 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:13:31 +0800 Subject: [PATCH 08/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20figures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Description/figures/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Description/figures/.keep diff --git a/content/zh/docs/Description/figures/.keep b/content/zh/docs/Description/figures/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 5dae1b297f594e8f2938f644ca494f01e0eab783 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 16:13:55 +0800 Subject: [PATCH 09/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20public=5Fsys-resourc?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Description/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Description/public_sys-resources/.keep diff --git a/content/zh/docs/Description/public_sys-resources/.keep b/content/zh/docs/Description/public_sys-resources/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 3728ce39b7482df8c8146120d550dff67cde0527 Mon Sep 17 00:00:00 2001 From: liyang0608 <554903772@qq.com> Date: Thu, 28 May 2020 17:12:36 +0800 Subject: [PATCH 10/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Description/.keep | 0 content/zh/docs/Description/Description.md | 5 ++ ...QL\350\207\252\350\257\212\346\226\255.md" | 8 ++ content/zh/docs/Description/figures/.keep | 0 ...1\346\236\266\346\236\204\345\233\276.png" | Bin 0 -> 20522 bytes ...7\350\241\214\345\274\225\346\223\216.jpg" | Bin 0 -> 9128 bytes ...7\345\255\230\345\274\225\346\223\216.jpg" | Bin 0 -> 37733 bytes .../Description/public_sys-resources/.keep | 0 .../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 ...73\345\244\207\345\217\214\346\234\272.md" | 6 ++ ...47\345\223\201\345\256\232\344\275\215.md" | 8 ++ ...36\345\274\272\347\211\271\346\200\247.md" | 17 ++++ .../\345\206\205\345\255\230\350\241\250.md" | 4 + ...67\345\220\210\345\274\225\346\223\216.md" | 48 +++++++++++ ...75\345\222\214\347\211\271\346\200\247.md" | 32 +++++++ ...24\347\224\250\345\234\272\346\231\257.md" | 11 +++ ...00\346\234\257\346\214\207\346\240\207.md" | 81 ++++++++++++++++++ ...60\346\215\256\345\210\206\345\214\272.md" | 49 +++++++++++ ...73\347\273\237\346\236\266\346\236\204.md" | 46 ++++++++++ ...20\350\241\214\347\216\257\345\242\203.md" | 15 ++++ ...13\345\212\241\345\244\204\347\220\206.md" | 15 ++++ ...1-\351\253\230\346\200\247\350\203\275.md" | 4 + 27 files changed, 349 insertions(+) delete mode 100644 content/zh/docs/Description/.keep create mode 100644 content/zh/docs/Description/Description.md create mode 100644 "content/zh/docs/Description/SQL\350\207\252\350\257\212\346\226\255.md" delete mode 100644 content/zh/docs/Description/figures/.keep create mode 100644 "content/zh/docs/Description/figures/openGauss\351\200\273\350\276\221\346\236\266\346\236\204\345\233\276.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.jpg" create 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" delete mode 100644 content/zh/docs/Description/public_sys-resources/.keep create mode 100644 content/zh/docs/Description/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Description/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Description/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Description/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Description/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Description/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Description/\344\270\273\345\244\207\345\217\214\346\234\272.md" create mode 100644 "content/zh/docs/Description/\344\272\247\345\223\201\345\256\232\344\275\215.md" create mode 100644 "content/zh/docs/Description/\344\274\201\344\270\232\347\272\247\345\242\236\345\274\272\347\211\271\346\200\247.md" create mode 100644 "content/zh/docs/Description/\345\206\205\345\255\230\350\241\250.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Description/\345\272\224\347\224\250\345\234\272\346\231\257.md" create mode 100644 "content/zh/docs/Description/\346\212\200\346\234\257\346\214\207\346\240\207.md" create mode 100644 "content/zh/docs/Description/\346\225\260\346\215\256\345\210\206\345\214\272.md" create mode 100644 "content/zh/docs/Description/\347\263\273\347\273\237\346\236\266\346\236\204.md" create mode 100644 "content/zh/docs/Description/\350\277\220\350\241\214\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Description/\351\253\230\345\217\257\351\235\240\344\272\213\345\212\241\345\244\204\347\220\206.md" create mode 100644 "content/zh/docs/Description/\351\253\230\345\271\266\345\217\221-\351\253\230\346\200\247\350\203\275.md" diff --git a/content/zh/docs/Description/.keep b/content/zh/docs/Description/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Description/Description.md b/content/zh/docs/Description/Description.md new file mode 100644 index 000000000..95968eaa5 --- /dev/null +++ b/content/zh/docs/Description/Description.md @@ -0,0 +1,5 @@ +# 产品描述 + +本文档对openGauss数据库进行详细描述,包含产品定位、系统架构介绍、应用场景、运行环境、技术指标、基本功能和特性、企业级增强特性介绍等信息。 + + diff --git "a/content/zh/docs/Description/SQL\350\207\252\350\257\212\346\226\255.md" "b/content/zh/docs/Description/SQL\350\207\252\350\257\212\346\226\255.md" new file mode 100644 index 000000000..eb7cda3b4 --- /dev/null +++ "b/content/zh/docs/Description/SQL\350\207\252\350\257\212\346\226\255.md" @@ -0,0 +1,8 @@ +# SQL自诊断 + +通过执行查询对应的explain performance,获得对应执行计划,是一种十分有效的定位查询性能问题的方法。但是这种方法需要修改业务逻辑,同时输出的日志量大,问题定位的效率依赖于人员的经验。SQL自诊断为用户提供了另一种更为高效易用的性能问题定位方法。 + +在执行作业之前,配置GUC参数resource\_track\_level和resource\_track\_cost,然后运行用户作业,就可以通过查看相关系统视图,获得执行完成的相关查询作业可能存在的性能问题。系统视图中会给出导致性能问题的可能原因,根据这些“性能告警”,参考《开发者指南》中“性能调优 \> SQL调优指南 \> 典型SQL调优点 \> SQL自诊断”章节,就可以对存在性能问题的作业进行调优。 + +SQL自诊断可以在不影响用户作业,不修改业务逻辑的情况下,诊断出相对准确的性能问题,为用户提供更为易用的性能调优参考。 + diff --git a/content/zh/docs/Description/figures/.keep b/content/zh/docs/Description/figures/.keep deleted file mode 100644 index e69de29bb..000000000 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" new file mode 100644 index 0000000000000000000000000000000000000000..b9f5fabba75f4afadc909a3e0383263f2cf03cf6 GIT binary patch literal 20522 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≪aEJe2(Efk*0vLA!Di`tuETp$N1@tn4 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 Vj3S^2L-F6ADfoZ%9sT#n{{oOL;N<`S literal 0 HcmV?d00001 diff --git a/content/zh/docs/Description/public_sys-resources/.keep b/content/zh/docs/Description/public_sys-resources/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Description/public_sys-resources/icon-caution.gif b/content/zh/docs/Description/public_sys-resources/icon-caution.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/Description/public_sys-resources/icon-danger.gif b/content/zh/docs/Description/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/Description/public_sys-resources/icon-note.gif b/content/zh/docs/Description/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/Description/public_sys-resources/icon-notice.gif b/content/zh/docs/Description/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/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" new file mode 100644 index 000000000..526316dcc --- /dev/null +++ "b/content/zh/docs/Description/\344\270\273\345\244\207\345\217\214\346\234\272.md" @@ -0,0 +1,6 @@ +# 主备双机 + +主备双机支持同步和异步复制,应用可以根据业务场景选择合适的部署方式。同步复制保证数据的高可靠,一般需要一主两备部署,同时对性能有一定影响。异步复制一主一备部署即可,对性能影响小,但异常时可能存在数据丢失。openGauss支持页面损坏的自动修复,在主机页面发生损坏时,能够自动从备机修复损坏页面。openGauss支持备机并行日志恢复,尽量降低主机宕机时业务不可用的时间。 + +同时,如果按照主备模式部署,并打开备机可读功能后,备机将能够提供读操作,但不支持写操作(如建表、插入数据、删除数据等),从而缓解主机上的压力。 + diff --git "a/content/zh/docs/Description/\344\272\247\345\223\201\345\256\232\344\275\215.md" "b/content/zh/docs/Description/\344\272\247\345\223\201\345\256\232\344\275\215.md" new file mode 100644 index 000000000..9774a9413 --- /dev/null +++ "b/content/zh/docs/Description/\344\272\247\345\223\201\345\256\232\344\275\215.md" @@ -0,0 +1,8 @@ +# 产品定位 + +openGauss支持SQL2003标准语法,支持主备部署的高可用关系型数据库。 + +- 多种存储模式支持复合业务场景。 +- NUMA化数据结构支持高性能。 +- 主备模式,CRC校验支持高可用。 + diff --git "a/content/zh/docs/Description/\344\274\201\344\270\232\347\272\247\345\242\236\345\274\272\347\211\271\346\200\247.md" "b/content/zh/docs/Description/\344\274\201\344\270\232\347\272\247\345\242\236\345\274\272\347\211\271\346\200\247.md" new file mode 100644 index 000000000..4ff015e1b --- /dev/null +++ "b/content/zh/docs/Description/\344\274\201\344\270\232\347\272\247\345\242\236\345\274\272\347\211\271\346\200\247.md" @@ -0,0 +1,17 @@ +# 企业级增强特性 + +- **[数据分区](数据分区.md)** + +- **[向量化执行和行列混合引擎](向量化执行和行列混合引擎.md)** + +- **[高可靠事务处理](高可靠事务处理.md)** + +- **[高并发&高性能](高并发-高性能.md)** + +- **[SQL自诊断](SQL自诊断.md)** + +- **[内存表](内存表.md)** + +- **[主备双机](主备双机.md)** + + diff --git "a/content/zh/docs/Description/\345\206\205\345\255\230\350\241\250.md" "b/content/zh/docs/Description/\345\206\205\345\255\230\350\241\250.md" new file mode 100644 index 000000000..6217ca991 --- /dev/null +++ "b/content/zh/docs/Description/\345\206\205\345\255\230\350\241\250.md" @@ -0,0 +1,4 @@ +# 内存表 + +内存表把数据全部缓存在内存中,所有数据访问实现免锁并发,实现数据处理的极致性能,满足实时性严苛要求场景。 + 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" new file mode 100644 index 000000000..ec81a7f9f --- /dev/null +++ "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" @@ -0,0 +1,48 @@ +# 向量化执行和行列混合引擎 + +## 背景信息 + +在大宽表,数据量比较大、查询经常关注某些列的场景中,行存储引擎查询性能比较差。例如气象局的场景,单表有200\~800个列,查询经常访问10个列,在类似这样的场景下,向量化执行技术和列存储引擎可以极大的提升性能和减少存储空间。 + +## 向量化执行 + +标准的迭代器模型如[图1](#zh-cn_topic_0237080624_zh-cn_topic_0231764690_zh-cn_topic_0059777898_f9d90aebe179a40759039d0263492489d)所示。控制流向下(下图实线)、数据流向上(下图虚线)、上层驱动下层(上层节点调用下层节点要数据)、一次一元组(下层节点每次只返回一条元组给上层节点)。 + +而向量化执行相对于传统的执行模式改变是对于一次一元组的模型修改为一次一批元组,配合列存特性,可以带来巨大的性能提升。 + +**图 1** 向量化执行引擎 +![](figures/向量化执行引擎.jpg "向量化执行引擎") + +## 行列混合存储引擎 + +openGauss支持行存储和列存储两种存储模型,用户可以根据应用场景,建表的时候选择行存储还是列存储表。 + +一般情况下,如果表的字段比较多(大宽表),查询中涉及到的列不很多的情况下,适合列存储。如果表的字段个数比较少,查询大部分字段,那么选择行存储比较好。 + +如[图2](#zh-cn_topic_0237080624_zh-cn_topic_0231764690_zh-cn_topic_0059777898_fbb2af39ce12a419cb437829aaf1cf4fb)所示,行列混合存储引擎可以同时为用户提供更优的数据压缩比(列存)、更好的索引性能(列存)、更好的点更新和点查询(行存)性能。 + +**图 2** 行列混存引擎 +![](figures/行列混存引擎.jpg "行列混存引擎") + +当前列存储引擎有以下约束: + +- DDL仅支持CREATE/DROP/TRUNCATE TABLE的功能。 + + 兼容分区的DDL管理功能(如: ADD/DROP/MERGE PARTITION,EXCHANGE功能)。 + + 支持CREATE TABLE LIKE语法。 + + 支持ALTER TABLE的部分语法。 + + 其他功能都不支持。 + +- DML支持UPDATE/COPY/BULKLOAD/DELETE。 +- 不支持触发器,不支持主外键。 +- 支持Psort index、B-tree index和GIN index,具体约束参见《开发者指南》中“SQL参考 \> SQL语法 \> CREATE INDEX”章节。 + +## 列存下的数据压缩 + +对于非活跃的早期数据可以通过压缩来减少空间占用,降低采购和运维成本。 + +openGauss列存储压缩支持Delta Value Encoding、Dictionary、RLE 、LZ4、ZLIB等压缩算法,且能够根据数据特征自适应的选择压缩算法,平均压缩比7:1。压缩数据可直接访问,对业务透明,极大缩短历史数据访问的准备时间。 + 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" new file mode 100644 index 000000000..e27610557 --- /dev/null +++ "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" @@ -0,0 +1,32 @@ +# 基本功能和特性 + +## 背景信息 + +openGauss是一个单机数据库,具备关系型数据库的基本功能,以及企业特性的增强功能。 + +## 基本功能 + +- 标准SQL支持 + + 支持标准的SQL92/SQL99/SQL2003/SQL2011规范,支持GBK和UTF-8字符集,支持SQL标准函数与分析函数,支持存储过程。 + +- 数据库存储管理功能 + + 支持表空间,可以把不同表规划到不同的存储位置。 + +- 提供主备双机 + + 事务支持ACID特性、单节点故障恢复、双机数据同步,双机故障切换等。 + +- 应用程序接口 + + 支持标准JDBC 4.0的特性、ODBC 3.5特性。 + +- 管理工具 + + 提供安装部署工具、实例启停工具、备份恢复工具。 + +- 安全管理 + - 支持SSL安全网络连接、用户权限管理、密码管理、安全审计等功能,保证数据库在管理层、应用层、系统层和网络层的安全性。 + + diff --git "a/content/zh/docs/Description/\345\272\224\347\224\250\345\234\272\346\231\257.md" "b/content/zh/docs/Description/\345\272\224\347\224\250\345\234\272\346\231\257.md" new file mode 100644 index 000000000..2c7875f42 --- /dev/null +++ "b/content/zh/docs/Description/\345\272\224\347\224\250\345\234\272\346\231\257.md" @@ -0,0 +1,11 @@ +# 应用场景 + +- 交易型应用 + + 大并发、大数据量、以联机事务处理为主的交易型应用,如电商、金融、O2O、电信CRM/计费等,应用可按需选择不同的主备部署模式。 + +- 物联网数据 + + 在工业监控和远程控制、智慧城市的延展、智能家居、车联网等物联网场景下,传感监控设备多,采样率高,数据存储为追加模型,操作和分析并重的场景。 + + diff --git "a/content/zh/docs/Description/\346\212\200\346\234\257\346\214\207\346\240\207.md" "b/content/zh/docs/Description/\346\212\200\346\234\257\346\214\207\346\240\207.md" new file mode 100644 index 000000000..756d93864 --- /dev/null +++ "b/content/zh/docs/Description/\346\212\200\346\234\257\346\214\207\346\240\207.md" @@ -0,0 +1,81 @@ +# 技术指标 + +openGauss的技术指标如[表1](#zh-cn_topic_0237080616_zh-cn_topic_0231764304_zh-cn_topic_0059777844_t24ab71cac351418d8d5b1b8bd1d942c7)所示。 + +**表 1** 技术指标 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

技术指标

+

最大值

+

数据库容量

+

受限于操作系统与硬件

+

单表大小

+

32TB

+

单行数据大小

+

1GB

+

每条记录单个字段的大小

+

1GB

+

单表记录数

+

248

+

单表列数

+

250~1600(随字段类型不同会有变化)

+

单表中的索引个数

+

无限制

+

复合索引包含列数

+

32

+

单表约束个数

+

无限制

+

并发连接数

+

10000

+

分区表的分区个数

+

32768

+

分区表的单个分区大小

+

32TB

+

分区表的单个分区记录数

+

255

+
+ 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" new file mode 100644 index 000000000..f08d444d4 --- /dev/null +++ "b/content/zh/docs/Description/\346\225\260\346\215\256\345\210\206\345\214\272.md" @@ -0,0 +1,49 @@ +# 数据分区 + +数据分区是数据库产品普遍具备的功能。在openGauss中,数据分区是对数据按照用户指定的策略对数据做的水平分表,将表按照指定范围划分为多个数据互不重叠的部分(Partition)。 + +openGauss支持范围分区(Range Partitioning)功能,即根据表的一列或者多列,将要插入表的记录分为若干个范围(这些范围在不同的分区里没有重叠),然后为每个范围创建一个分区,用来存储相应的数据。用户在CREATE TABLE时增加PARTITION参数,即表示针对此表应用数据分区功能。 + +例如,[表1](#zh-cn_topic_0237080621_zh-cn_topic_0231764089_zh-cn_topic_0059777656_t77b9e09809f742f1aaadea05d041bc23)描述了一个xDR(详单)场景下,基于时间分片的方式分区后带来的收益。 + +**表 1** 分区收益 + + + + + + + + + + + + + + + + +

场景描述

+

收益

+

当表中访问率较高的行位于一个单独分区或少数几个分区时。

+

大幅减少搜索空间,从而提升访问性能。

+

当需要查询或更新一个分区的大部分记录时。

+

仅需要连续扫描对应分区,而非扫描整个表,因此可大幅提升性能。

+

当需要大量加载或者删除的记录位于一个单独分区或少数几个分区时。

+

可直接读取或删除对应分区,从而提升处理性能;同时由于避免大量零散的删除操作,可减少清理碎片工作量。

+
+ +数据分区带来的好处在于: + +- **改善可管理性:**利用分区,可以将表和索引划分为一些更小、更易管理的单元。这样,数据库管理员在进行数据管理时就能采取“分而治之”的方法。 有了分区,维护操作可以专门针对表的特定部分执行。 +- **可提升删除操作的性能:**删除数据时可以删除整个分区,与分别删除每行相比,这种操作非常高效和快速。 + + 删除分区表与删除普通表的语法一致,都是通过DROP TABLE语法进行删除。 + +- **改善查询性能:**通过限制要检查或操作的数据数量,分区可带来许多性能优势。 + + 分区剪枝:分区剪枝(也称为分区消除)是openGauss在执行时过滤掉不需要扫描的分区,只对相关的分区进行扫描的技术。分区剪枝通常可以将查询性能提高若干数量级。 + + 智能化分区联接:通过使用一种称为智能化分区联接的技术,分区还可以改善多表联接的性能。当将两个表联接在一起,并且至少其中一个表使用联接键进行分区时,可以应用智能化分区联接。智能化分区联接将一个大型联接分为多个较小的联接,这些较小的联接包含与联接的表“相同”的数据集。这里,“相同”定义为恰好包含联接的两端中相同的分区键值集,因此可以确保只有这些“相同”数据集的联接才会有效,而不必考虑其他数据集。 + + diff --git "a/content/zh/docs/Description/\347\263\273\347\273\237\346\236\266\346\236\204.md" "b/content/zh/docs/Description/\347\263\273\347\273\237\346\236\266\346\236\204.md" new file mode 100644 index 000000000..edb2c4d16 --- /dev/null +++ "b/content/zh/docs/Description/\347\263\273\347\273\237\346\236\266\346\236\204.md" @@ -0,0 +1,46 @@ +# 系统架构 + +openGauss是单机系统,在这样的系统架构中,业务数据存储在单个物理节点上,数据访问任务被推送到服务节点执行,通过服务器的高并发,实现对数据处理的快速响应。同时通过日志复制可以把数据复制到备机,提供数据的高可靠和读扩展。 + +## 软件架构 + +openGauss是单机系统,支持主备部署。 + +openGauss逻辑架构如[图1](#zh-cn_topic_0237080634_zh-cn_topic_0231764167_fig5205420191411)所示。 + +**图 1** openGauss逻辑架构图 +![](figures/openGauss逻辑架构图.png "openGauss逻辑架构图") + +**表 1** 架构说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

OM

+

运维管理模块(Operation Manager)。提供集群日常运维、配置管理的管理接口、工具。

+

客户端驱动

+

客户端驱动(Client Driver)。负责接收来自应用的访问请求,并向应用返回执行结果。客户端驱动负责与openGauss实例通信,发送应用的SQL命令,接收openGauss实例的执行结果。

+

openGauss(主备)

+

openGauss主备(Datanode)。负责存储业务数据、执行数据查询任务以及向客户端返回执行结果。

+

openGauss实例包含主、备两种类型,支持一主多备。建议将主、备openGauss实例分散部署在不同的物理节点中。

+

Storage

+

服务器的本地存储资源,持久化存储数据。

+
+ diff --git "a/content/zh/docs/Description/\350\277\220\350\241\214\347\216\257\345\242\203.md" "b/content/zh/docs/Description/\350\277\220\350\241\214\347\216\257\345\242\203.md" new file mode 100644 index 000000000..5d6aeadb9 --- /dev/null +++ "b/content/zh/docs/Description/\350\277\220\350\241\214\347\216\257\345\242\203.md" @@ -0,0 +1,15 @@ +# 运行环境 + +## 支持的硬件平台 + +openGauss支持运行在鲲鹏服务器和通用的x86服务器上: + +- 支持鲲鹏服务器和基于x86\_64的通用PC服务器。 +- 支持本地存储(SATA、SAS、SSD)。 +- 支持千兆、万兆Ethernet网络。 + +## 支持的操作系统 + +- openEuler release 20.03 \(LTS\) on ARM。推荐采用此操作系统。 +- CentOS 7.6 on X86-64。 + diff --git "a/content/zh/docs/Description/\351\253\230\345\217\257\351\235\240\344\272\213\345\212\241\345\244\204\347\220\206.md" "b/content/zh/docs/Description/\351\253\230\345\217\257\351\235\240\344\272\213\345\212\241\345\244\204\347\220\206.md" new file mode 100644 index 000000000..febfa3058 --- /dev/null +++ "b/content/zh/docs/Description/\351\253\230\345\217\257\351\235\240\344\272\213\345\212\241\345\244\204\347\220\206.md" @@ -0,0 +1,15 @@ +# 高可靠事务处理 + +openGauss提供事务管理功能,保证事务的ACID特性。 + +为了在主节点出现故障时尽可能地不中断服务,openGauss提供了主备双机高可靠机制。通过保护关键用户程序对外不间断提供服务,把因为硬件、软件和人为造成的故障对业务的影响程度降到最低,以保证业务的持续性。 + +**故障恢复** + +支持节点故障可恢复及恢复后满足ACID特性。节点故障、停止后重启等情况下,openGauss能够保证故障之前的数据无丢失,满足ACID特性。 + +**事务管理:** + +- 支持事务块,用户可以通过start transaction命令显式启动一个事务块。 +- 支持单语句事务,用户不显式启动事务,则单条语句就是一个事务。 + diff --git "a/content/zh/docs/Description/\351\253\230\345\271\266\345\217\221-\351\253\230\346\200\247\350\203\275.md" "b/content/zh/docs/Description/\351\253\230\345\271\266\345\217\221-\351\253\230\346\200\247\350\203\275.md" new file mode 100644 index 000000000..36f30ccf7 --- /dev/null +++ "b/content/zh/docs/Description/\351\253\230\345\271\266\345\217\221-\351\253\230\346\200\247\350\203\275.md" @@ -0,0 +1,4 @@ +# 高并发&高性能 + +openGauss通过服务器端的线程池,可以支持1W并发链接。通过NUMA化内核数据结构,支持线程亲核性处理,可以支持百万级tpmC。通过页面的高效冷热淘汰,支持T级别大内存缓冲区管理。通过CSN快照,去除快照瓶颈,实现多版本访问,读写互不阻塞。通过增量检查点,避免全页写导致的性能波动,实现业务性能平稳运行。 + -- Gitee From 25d16049b2726aabbd62a2a68894f177e518e3ac Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:18:38 +0800 Subject: [PATCH 11/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Developerguide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Developerguide/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Developerguide/.keep diff --git a/content/zh/docs/Developerguide/.keep b/content/zh/docs/Developerguide/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From ebe956b02a36fcdee87903588d2b3ce6f98a1d41 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:20:50 +0800 Subject: [PATCH 12/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Installation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Installation/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Installation/.keep diff --git a/content/zh/docs/Installation/.keep b/content/zh/docs/Installation/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 1990d2ad4a6a2260a3f560ebe33f0117473a43b9 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:21:04 +0800 Subject: [PATCH 13/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Quickstart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Quickstart/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Quickstart/.keep diff --git a/content/zh/docs/Quickstart/.keep b/content/zh/docs/Quickstart/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 635d8ada8bbbe79aeceecb9aa6a4f508e3b9ae88 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:21:19 +0800 Subject: [PATCH 14/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Toolreference?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Toolreference/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Toolreference/.keep diff --git a/content/zh/docs/Toolreference/.keep b/content/zh/docs/Toolreference/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 159b1946a75e4ca90d9b1d97d165cbe61b7f3300 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:21:45 +0800 Subject: [PATCH 15/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20figures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Developerguide/figures/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Developerguide/figures/.keep diff --git a/content/zh/docs/Developerguide/figures/.keep b/content/zh/docs/Developerguide/figures/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From aa80af1cbedb15773ae9cf1c0fe79469731fd9d0 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:22:06 +0800 Subject: [PATCH 16/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20public=5Fsys-resourc?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Developerguide/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Developerguide/public_sys-resources/.keep diff --git a/content/zh/docs/Developerguide/public_sys-resources/.keep b/content/zh/docs/Developerguide/public_sys-resources/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 3971934864296e956338cd4b97a757f1949522a6 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:26:40 +0800 Subject: [PATCH 17/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20figures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Installation/figures/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Installation/figures/.keep diff --git a/content/zh/docs/Installation/figures/.keep b/content/zh/docs/Installation/figures/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 5aa909ce498d3e49fa919e1dba51e5ef311ff8b2 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:26:58 +0800 Subject: [PATCH 18/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20public=5Fsys-resourc?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Installation/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Installation/public_sys-resources/.keep diff --git a/content/zh/docs/Installation/public_sys-resources/.keep b/content/zh/docs/Installation/public_sys-resources/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 68757b7d44720b5106361697d2045599dd7be011 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:27:37 +0800 Subject: [PATCH 19/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20figures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Quickstart/figures/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Quickstart/figures/.keep diff --git a/content/zh/docs/Quickstart/figures/.keep b/content/zh/docs/Quickstart/figures/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From cb6a073538a00c0cd64c7ce22d8f01e2d9f5565e Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:27:55 +0800 Subject: [PATCH 20/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20public=5Fsys-resourc?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Quickstart/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Quickstart/public_sys-resources/.keep diff --git a/content/zh/docs/Quickstart/public_sys-resources/.keep b/content/zh/docs/Quickstart/public_sys-resources/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 523ad27cfa0843a3155f837957030f913d9d46b6 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:28:14 +0800 Subject: [PATCH 21/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20figures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Toolreference/figures/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Toolreference/figures/.keep diff --git a/content/zh/docs/Toolreference/figures/.keep b/content/zh/docs/Toolreference/figures/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 076b09a269cbb236a8cee1dc31721f02fb8d909f Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:28:29 +0800 Subject: [PATCH 22/35] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20public=5Fsys-resourc?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Toolreference/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/zh/docs/Toolreference/public_sys-resources/.keep diff --git a/content/zh/docs/Toolreference/public_sys-resources/.keep b/content/zh/docs/Toolreference/public_sys-resources/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 6553a066a445ba594f832f3b36dc622e1d6edbbf Mon Sep 17 00:00:00 2001 From: liyang0608 <554903772@qq.com> Date: Thu, 28 May 2020 17:35:01 +0800 Subject: [PATCH 23/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Installation/figures/.keep | 0 ...205\346\265\201\347\250\213\345\233\276.png" | Bin 0 -> 40551 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/zh/docs/Installation/figures/.keep create mode 100644 "content/zh/docs/Installation/figures/\345\256\211\350\243\205\346\265\201\347\250\213\345\233\276.png" diff --git a/content/zh/docs/Installation/figures/.keep b/content/zh/docs/Installation/figures/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git "a/content/zh/docs/Installation/figures/\345\256\211\350\243\205\346\265\201\347\250\213\345\233\276.png" "b/content/zh/docs/Installation/figures/\345\256\211\350\243\205\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c6e65229b2af9b56c2d3caa1b2f308abccd15daf GIT binary patch literal 40551 zcmdqJbySsYw>P>_K?I~rL_knL8bP|Gq`Rb~yQQQBK~kipL`sluq@|^#q)R}gL0bCE z<@4;lzwbNW{_~7I#&O7a-WPDK`@Zh$n)6q4g(xXJxrsrBfj}T`N=u2WAP^|=2*gz$ zbTs(Rwqx5}_|FXosi)5o2<%qm7fPpnt_cD`g^(71tmdAwG2`n%VD8WTr`Vqkg_Zuy z0YCT+YDRi6jScnlm24V{{rx>6u|;|ea`U_fBAsJM8ZQ3)D3w zFy_5ESy|9Y;aPAw_=NJjXJB9;+rIJm*Uyzam?Plwbr^?F8 zI-~U{sHwAsF3+Byt!XyZIxcqH>@U=*))(|X*-z+V8Fm+BYu;T5W5p1@*oh=LJ6jgM z%zr{LpK^^_M$z|dkureN>vwauYy!(UrSG3s%8PB21apBQAuWwU?E~StI=6o7@`>NQ z9Q_u5-{?{O#mTz&GoRz7=Ecs)%k3@}*^D7REq(aL^7eGi^NoRYu}EvqUP5Y*5^@3e z-@if#=-$-n7A3^!#fxXzrVWO%HvXA2>wV|A(Qq_toQpen)v_m^nIkkb^dh<4=-9Tb zCpx$SD}E$jb6Mzc-1zn7=G?{Rj!8mbu*E~$$%+Syfh77`b*`I}zOt@QV`b_LUd#uQ ze8k4V@w_;nyG%_N6~_r=)~V{%s<0T0Z#ti9I)4_eM|^*XMe894hcK_#pWkAoMu=>Z z$j+-xbChm%B2)FiQ`AiFJuZ^)TmL~$1 z&wpJW`CcBW!VXJ*rlFzXl=a@IY-;oKi@jg3j*QDEL@#G+o}2gDX2*B;`y6ttIM=?L zq7e2WNBllnFIFshwO_)X+?RAT>uJBVyVRrU3V-g^2@Gb*m*_Tl9Qch`-MR8R02WAP z>f~S@1)*KYwf~Mjl%9d1rPR37gwbd9xT8bzU7r~OepTJ8x47wo3}L`VYGg-(e(i?? zkCLh?frb!u_Qh)2#p=$pi`|4v5`;0_yS%n@V4+s&Lh*86^3h^+G=309d-jOcwr95Y z&VmGKM91esBFj2|fB#dphaLk=I#pP_yu6CHB0A1Y67DBepvOOsAVaYj=(6Xr8?JkdZ;n^hbaK=gP}3SqV`T1&TgbaZr9%wM;ngtg;yvB1)m7EBdU#0p!Li@Ddoqg8l z)VBU)Eq`EL)u#m~+Yk1U@PY#m7a~{A_36(nuaW{d(E4U(zgm{xd$LSO+{Iug#d^p4 zoYtA|j=1uxJ~J_Obs{)c2&#Q8Sm>2UuW=|l@{1eEN?8jv!fdCi(sOgsA3b_R|KLH5 z{dT}mj6zOph2`*t)lzqyESysocr?b@UYhSDGoL=w)fGsAE04Gzk>l*<)@oGxN)#30 z;pvHjppChK_~BYtYS8ST%Z#6@@cQJ$Lrqh&b=6tHscZG|?;%;%b1E8|MY=AQ*D0~~ zrE+OPGiN_z6crR*c~|C%(61ROpz*xeHEAU)q~w8OOE|ST-IdY z;Nr^{1j1nWqdao|3}!wNJJqSMz$0eXelwiGpcdho)tjDe8BE1;>~F}8aHE?VCyZ_&&|!9nV-+N|Cy7t$#R&M^U)&--JFHJ zV+0ko7CH8HvfH;&5P^Y#CEA5w`}-q3Q!#Vy#;831)!Ph3S@rMD


NH$TN9Rx#T5 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%0AZuTfQ^0^{oK>?j#m2gPYZ}y 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 Date: Thu, 28 May 2020 17:37:43 +0800 Subject: [PATCH 24/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Installation/.keep | 0 content/zh/docs/Installation/Installation.md | 9 + .../Installation/public_sys-resources/.keep | 0 .../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 ...15\347\275\256\346\226\207\344\273\266.md" | 46 ++ ...57\345\242\203\346\270\205\347\220\206.md" | 92 ++++ ...11\350\243\205\346\265\201\347\250\213.md" | 56 ++ ...12\347\224\250\346\210\267\347\273\204.md" | 37 ++ ...73\347\273\237\351\205\215\347\275\256.md" | 13 + ...44\346\215\242\345\206\205\345\255\230.md" | 8 + ...37\351\230\262\347\201\253\345\242\231.md" | 96 ++++ ...67\345\217\212\347\216\257\345\242\203.md" | 353 ++++++++++++ ...11\350\243\205\347\216\257\345\242\203.md" | 11 + ...15\347\275\256\346\226\207\344\273\266.md" | 15 + ...11\350\243\205\347\216\257\345\242\203.md" | 11 + ...35\345\247\213\351\205\215\347\275\256.md" | 7 + ...15\347\275\256\346\226\207\344\273\266.md" | 36 ++ .../\345\215\270\350\275\275openGauss.md" | 9 + .../\345\256\211\350\243\205openGauss.md" | 11 + ...11\350\243\205\345\207\206\345\244\207.md" | 13 + ...11\350\243\205\346\246\202\350\277\260.md" | 6 + ...11\350\243\205\351\252\214\350\257\201.md" | 5 + ...72\347\253\213\344\272\222\344\277\241.md" | 312 +++++++++++ ...47\350\241\214\345\215\270\350\275\275.md" | 54 ++ ...47\350\241\214\345\256\211\350\243\205.md" | 209 ++++++++ ...45\345\272\267\347\212\266\346\200\201.md" | 60 +++ .../Installation/\347\244\272\344\276\213.md" | 7 + ...14\345\256\211\350\243\205\345\214\205.md" | 73 +++ ...34\347\250\213\347\231\273\345\275\225.md" | 60 +++ ...46\351\233\206\345\217\202\346\225\260.md" | 8 + ...72\345\222\214\346\227\266\351\227\264.md" | 20 + ...347\275\221\345\215\241MTU\345\200\274.md" | 8 + ...57\345\242\203\350\246\201\346\261\202.md" | 83 +++ ...72\346\234\254\344\277\241\346\201\257.md" | 72 +++ ...14\345\255\227\347\254\246\351\233\206.md" | 119 +++++ ...73\347\273\237\345\217\202\346\225\260.md" | 502 ++++++++++++++++++ ...02\347\202\271\344\277\241\346\201\257.md" | 83 +++ ...04\351\241\271\347\233\256\345\275\225.md" | 105 ++++ ...07\346\234\272\345\217\257\350\257\273.md" | 10 + 44 files changed, 2619 insertions(+) delete mode 100644 content/zh/docs/Installation/.keep create mode 100644 content/zh/docs/Installation/Installation.md delete mode 100644 content/zh/docs/Installation/public_sys-resources/.keep create mode 100644 content/zh/docs/Installation/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Installation/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Installation/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Installation/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Installation/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Installation/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Installation/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Installation/\344\270\200\351\224\256\345\274\217\347\216\257\345\242\203\346\270\205\347\220\206.md" create mode 100644 "content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" create mode 100644 "content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" create mode 100644 "content/zh/docs/Installation/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Installation/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" create mode 100644 "content/zh/docs/Installation/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" create mode 100644 "content/zh/docs/Installation/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Installation/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Installation/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Installation/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Installation/\345\210\235\345\247\213\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Installation/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Installation/\345\215\270\350\275\275openGauss.md" create mode 100644 "content/zh/docs/Installation/\345\256\211\350\243\205openGauss.md" create mode 100644 "content/zh/docs/Installation/\345\256\211\350\243\205\345\207\206\345\244\207.md" create mode 100644 "content/zh/docs/Installation/\345\256\211\350\243\205\346\246\202\350\277\260.md" create mode 100644 "content/zh/docs/Installation/\345\256\211\350\243\205\351\252\214\350\257\201.md" create mode 100644 "content/zh/docs/Installation/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" create mode 100644 "content/zh/docs/Installation/\346\211\247\350\241\214\345\215\270\350\275\275.md" create mode 100644 "content/zh/docs/Installation/\346\211\247\350\241\214\345\256\211\350\243\205.md" create mode 100644 "content/zh/docs/Installation/\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/Installation/\347\244\272\344\276\213.md" create mode 100644 "content/zh/docs/Installation/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" create mode 100644 "content/zh/docs/Installation/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" create mode 100644 "content/zh/docs/Installation/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Installation/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" create mode 100644 "content/zh/docs/Installation/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" create mode 100644 "content/zh/docs/Installation/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Installation/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Installation/\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/Installation/\351\205\215\347\275\256\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/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" create mode 100644 "content/zh/docs/Installation/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" diff --git a/content/zh/docs/Installation/.keep b/content/zh/docs/Installation/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Installation/Installation.md b/content/zh/docs/Installation/Installation.md new file mode 100644 index 000000000..d6e937365 --- /dev/null +++ b/content/zh/docs/Installation/Installation.md @@ -0,0 +1,9 @@ +# 安装指南 + +## 概述 + +本文档主要介绍openGauss数据库的安装方法,以指导用户顺利完成openGauss数据库安装。 + +## 读者对象 + +本文档适用于所有使用openGauss数据库的用户,特别是初次使用或想了解openGauss的用户,包括系统工程师、管理员及维护人员等。使用本手册的用户需要具备基础的数据库相关知识。 \ No newline at end of file diff --git a/content/zh/docs/Installation/public_sys-resources/.keep b/content/zh/docs/Installation/public_sys-resources/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Installation/public_sys-resources/icon-caution.gif b/content/zh/docs/Installation/public_sys-resources/icon-caution.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/Installation/public_sys-resources/icon-danger.gif b/content/zh/docs/Installation/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/Installation/public_sys-resources/icon-note.gif b/content/zh/docs/Installation/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/Installation/public_sys-resources/icon-notice.gif b/content/zh/docs/Installation/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/Installation/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Installation/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..759439dd4 --- /dev/null +++ "b/content/zh/docs/Installation/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,46 @@ +# 一主一备配置文件 + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + diff --git "a/content/zh/docs/Installation/\344\270\200\351\224\256\345\274\217\347\216\257\345\242\203\346\270\205\347\220\206.md" "b/content/zh/docs/Installation/\344\270\200\351\224\256\345\274\217\347\216\257\345\242\203\346\270\205\347\220\206.md" new file mode 100644 index 000000000..d039fc41e --- /dev/null +++ "b/content/zh/docs/Installation/\344\270\200\351\224\256\345\274\217\347\216\257\345\242\203\346\270\205\347\220\206.md" @@ -0,0 +1,92 @@ +# 一键式环境清理 + +在openGauss卸载完成后,如果不需要在环境上重新部署openGauss,可以运行脚本gs\_postuninstall对openGauss服务器上环境信息做清理。openGauss环境清理是对环境准备脚本gs\_preinstall所做设置的清理。 + +## 前提条件 + +- openGauss卸载执行成功。 +- root用户互信可用。 +- 只能使用root用户执行gs\_postuninstall命令。 + +## 操作步骤 + +1. 以root用户登录openGauss服务器。 +2. 进入script路径下 + + ``` + cd /opt/software/openGauss/script + ``` + +3. 查看root用户互信是否建立,如果root用户没有建立互信,需要手工建立root用户互信,操作参考3.2.2手工建立互信。 + + 查看互信是否建成功,可以互相ssh主机名。输入exit退出。 + + ``` + plat1:~ # ssh plat2 + Last login: Tue Jan 5 10:28:18 2016 from plat1 + Huawei's internal systems must only be used for conducting Huawei's business or for purposes authorized by Huawei management.Use is subject to audit at any time by Huawei management. + plat2:~ # exit + logout + Connection to plat2 closed. + plat1:~ # + ``` + +4. 使用gs\_postuninstall进行清理。若为环境变量分离的模式安装的集群需要source环境变量分离文件ENVFILE。 + + ``` + gs_postuninstall -U omm -X /opt/software/openGauss/clusterconfig.xml --delete-user --delete-group + ``` + + 或者在openGauss中每个节点执行本地后置清理。 + + ``` + gs_postuninstall -U omm -X /opt/software/openGauss/clusterconfig.xml --delete-user --delete-group -L + ``` + + omm为运行openGauss的操作系统用户名,/opt/software/openGauss/clusterconfig.xml为openGauss配置文件路径。 + + 若为环境变量分离的模式安装的集群需删除之前source的环境变量分离的env参数 + + unset MPPDB\_ENV\_SEPARATE\_PATH + +5. 删除openGauss数据库各节点root用户的互信,操作参考3.2.2手工建立互信的删除root用户互信部分内容。 + +## 示例 + +清理主机的环境 + +``` +gs_postuninstall -U omm -X /opt/software/openGauss/clusterconfig.xml --delete-user +Parsing the configuration file. +Successfully parsed the configuration file. +Check log file path. +Successfully checked log file path. +Checking unpreinstallation. +Successfully checked unpreinstallation. +Deleting Cgroup. +Successfully deleted Cgroup. +Deleting the instance's directory. +Successfully deleted the instance's directory. +Deleting the installation directory. +Successfully deleted the installation directory. +Deleting the temporary directory. +Successfully deleted the temporary directory. +Deleting remote OS user. +Successfully deleted remote OS user. +Deleting software packages and environmental variables of other nodes. +Successfully deleted software packages and environmental variables of other nodes. +Deleting logs of other nodes. +Successfully deleted logs of other nodes. +Deleting software packages and environmental variables of the local node. +Successfully deleted software packages and environmental variables of the local nodes. +Deleting local OS user. +Successfully deleted local OS user. +Deleting local node's logs. +Successfully deleted local node's logs. +Successfully cleaned environment. +``` + +## 错误排查 + +如果一键式环境清理失败请根据“$GAUSSLOG/om/gs\_postuninstall-YYYY-MM-DD\_HHMMSS.log”中的日志信息排查错误。 + diff --git "a/content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" "b/content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" new file mode 100644 index 000000000..0e47b2fdf --- /dev/null +++ "b/content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" @@ -0,0 +1,56 @@ +# 了解安装流程 + +本章节通过流程图简要介绍openGauss的安装流程。 + +openGauss的安装流程如[图1](#fig18264185162412)所示。 + +**图 1** 安装流程图 +![](figures/安装流程图.png "安装流程图") + +**表 1** 安装流程图说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

流程

+

说明

+

安装前准备

+

openGauss安装前需要准备相应的软硬件环境以及相关配置。

+

文档提供了openGauss安装所需的最低要求,实际安装中,请用户根据实际情况进行规划。

+

更多信息,请参考安装准备

+

获取并校验安装包

+

安装包需要在官方网站上下载并且对安装包进行校验,详细请参见获取并校验安装包

+

配置XML文件

+

安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场配置对应的XML文件。

+

关于如何配置XML文件,详细请参见创建XML配置文件

+

初始化安装环境

+

安装环境的初始化包含上传安装包和XML文件、解压安装包、使用gs_preinstall准备好安装环境。

+

关于如何初始化安装环境,详细请参见初始化安装环境

+

执行安装

+

使用gs_install安装openGauss。

+

关于如何执行安装,详细请参见执行安装

+

设置备机可读

+

可选操作。在开启备机可读之后,备机将支持读操作,并满足数据一致性要求。

+
+ diff --git "a/content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" "b/content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" new file mode 100644 index 000000000..8cf7e623a --- /dev/null +++ "b/content/zh/docs/Installation/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" @@ -0,0 +1,37 @@ +# 了解安装用户及用户组 + +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性。安装脚本在安装过程中会自动按照用户指定创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + + + + + + + + + + + + + + + + +

用户/组名

+

所属类型

+

规划建议

+

dbgrp

+

操作系统

+

建议规划单独的用户组,例如dbgrp

+

初始化安装环境时,由-G参数所指定的安装用户所属的用户组。该用户组如果不存在,则会自动创建,也可提前创建好用户组。在执行gs_preinstall脚本时会检查权限。gs_preinstall脚本会自动赋予此组中的用户对安装目录、数据目录的访问和执行权限。

+

创建dbgrp用户组命令:

+
groupadd dbgrp
+

omm

+

操作系统

+

建议规划用户用于运行和维护openGauss,例如omm。

+

初始化安装环境时,由-U参数所指定和自动创建的操作系统用户,如果已经存在该用户,请清理该用户或更换初始化用户。从安全性考虑,对此用户的所属组规划如下:

+

所属组:dbgrp

+
+ +在安装openGauss过程中运行“gs\_preinstall”时,会创建与安装用户同名的数据库用户,即数据库用户omm。此用户具备数据库的最高操作权限,openGauss为此用户设置的初始密码为GaussDB@2012。为了保证系统的安全性,请及时修改密码。或在安装后通过设置GUC参数modify\_initial\_password为on启用强制修改初始密码特性。启用后,使用此用户首次连接数据库时,系统会强制要求修改此密码。关于GUC参数的修改方法请参见《openGauss 开发者指南》中的“GUC参数说明“。 + diff --git "a/content/zh/docs/Installation/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" "b/content/zh/docs/Installation/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" new file mode 100644 index 000000000..e86b97972 --- /dev/null +++ "b/content/zh/docs/Installation/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" @@ -0,0 +1,13 @@ +# 修改操作系统配置 + +- **[关闭操作系统防火墙](关闭操作系统防火墙.md)** +为了在防火墙开启的状态下,确保openGauss的正常使用。用户需要将同openGauss相关的服务、协议、IP以及端口添加到openGauss各主机的防火墙白名单中。 +- **[设置字符集参数](设置字符集参数.md)** + +- **[设置时区和时间](设置时区和时间.md)** + +- **[关闭swap交换内存](关闭swap交换内存.md)** + +- **[设置网卡MTU值](设置网卡MTU值.md)** + + diff --git "a/content/zh/docs/Installation/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" "b/content/zh/docs/Installation/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" new file mode 100644 index 000000000..42a841593 --- /dev/null +++ "b/content/zh/docs/Installation/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" @@ -0,0 +1,8 @@ +# 关闭swap交换内存 + +在各数据库节点上,使用swapoff -a命令将交换内存关闭。 + +``` +swapoff -a +``` + diff --git "a/content/zh/docs/Installation/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" "b/content/zh/docs/Installation/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" new file mode 100644 index 000000000..1a8644554 --- /dev/null +++ "b/content/zh/docs/Installation/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" @@ -0,0 +1,96 @@ +# 关闭操作系统防火墙 + +为了在防火墙开启的状态下,确保openGauss的正常使用。用户需要将同openGauss相关的服务、协议、IP以及端口添加到openGauss各主机的防火墙白名单中。 + +以openEuler操作系统为例,假设openGauss信息如[表1](#zh-cn_topic_0241802566_zh-cn_topic_0085434636_zh-cn_topic_0059782018_table4312170510523)所示。 + +**表 1** openGauss信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

主机名称

+

内部IP

+

外部IP

+

plat1

+

192.168.0.11

+

10.10.0.11

+

plat2

+

192.168.0.12

+

10.10.0.12

+

plat3

+

192.168.0.13

+

10.10.0.13

+

plat4

+

192.168.0.14

+

10.10.0.14

+

管理网络

+

-

+

10.10.64.236

+
+ +## 操作步骤 + +目前仅支持在防火墙关闭的状态下进行安装。 + +1. 检查防火墙是否关闭。 + + ``` + systemctl status firewalld + ``` + + 若防火墙未关闭,请执行[2](#zh-cn_topic_0241802566_zh-cn_topic_0085434636_zh-cn_topic_0059782018_li11887129193617); + + 若防火墙已关闭,则无需再关闭防火墙。 + +2. 关闭防火墙。 + + ``` + systemctl stop firewalld.service + ``` + +3. 修改/etc/selinux/config文件中的“SELINUX“值为“disabled“。 + 1. 使用VIM打开config文件。 + + ``` + vim /etc/selinux/config + ``` + + 2. 修改“SELINUX“的值“disabled“。 + + ``` + SELINUX=disabled + ``` + +4. 重新启动操作系统。 + + ``` + reboot + ``` + +5. 在其他主机上重复步骤1到步骤3。 + diff --git "a/content/zh/docs/Installation/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" "b/content/zh/docs/Installation/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" new file mode 100644 index 000000000..c4b8b672d --- /dev/null +++ "b/content/zh/docs/Installation/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" @@ -0,0 +1,353 @@ +# 准备安装用户及环境 + +创建完openGauss配置文件后,在执行安装前,为了后续能以最小权限进行安装及openGauss管理操作,保证系统安全性,需要运行安装前置脚本gs\_preinstall准备好安装用户及环境。 + +安装前置脚本gs\_preinstall可以协助用户自动完成如下的安装环境准备工作: + +- 自动设置Linux内核参数以达到提高服务器负载能力的目的。这些参数直接影响数据库系统的运行状态,请仅在确认必要时调整。openGauss所设置的Linux内核参数取值请参见[配置操作系统参数](配置操作系统参数.md)。 +- 自动将openGauss配置文件、安装包拷贝到openGauss主机的相同目录下。 +- openGauss安装用户、用户组不存在时,自动创建安装用户以及用户组。 +- 读取openGauss配置文件中的目录信息并创建,将目录权限授予安装用户。 + +## 前提条件 + +- 已完成[安装准备](安装准备.md)的所有任务。 + +## 注意事项 + +- 用户需要检查上层目录权限,保证安装用户对安装包和配置文件目录读写执行的权限。 +- xml文件中各主机的名称与IP映射配置正确。 +- 只能使用root用户执行gs\_preinstall命令。 + +## 操作步骤 + +1. 以root用户登录待安装openGauss的任意主机,并按规划创建存放安装包的目录。 + + ``` + mkdir -p /opt/software/openGauss + chmod 755 -R /opt/software + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 不建议把安装包的存放目录规划到openGauss用户的家目录或其子目录下,可能导致权限问题。 + >- openGauss用户须具有/opt/software/openGauss目录的读写权限。 + +2. 以release包为例,将安装包“openGauss\_x.x.x\_PACKAGES\_RELEASE.tar.gz”和配置文件“clusterconfig.xml”都上传至上一步所创建的目录中。 +3. 在安装包所在的目录下,解压安装包。 + + ``` + cd /opt/software/openGauss + tar -zxvf openGauss_x.x.x_PACKAGES_RELEASE.tar.gz + ``` + + 解压后的安装包说明见[表1](#zh-cn_topic_0241805803_zh-cn_topic_0085434653_zh-cn_topic_0059781995_te4a9d557337c400c85acff184476a722)。 + + **表 1** 安装包说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

包名

+

说明

+

openGauss-x.x.x-openEULER-64bit-ClientTools.tar.gz

+

用于Linux的客户端工具安装包。含gsql、dump restore tool、ODBC驱动、JDBC驱动、Libpq库。

+

openGauss-x.x.x-openEULER-64bit-Jdbc.tar.gz

+

用于Linux的JDBC驱动安装包。

+

openGauss-x.x.x-openEULER-64bit-Libpq.tar.gz

+

用于Linux的libpq库。

+

openGauss-x.x.x-openEULER-64bit-Odbc.tar.gz

+

用于Linux的ODBC驱动安装包。

+

openGauss-x.x.x-openEULER-64bit-symbol.tar.gz

+

用于调试和定位数据库问题的支持文件。

+

openGauss-x.x.x-openEULER-64bit.tar.gz

+

数据库管理系统安装包。即本手册使用的安装包。

+

openGauss-x.x.x-Sslcert.tar.gz

+

用于客户端服务器认证的证书。

+

openGauss-x.x.x-Inspection.tar.gz

+

用于检查数据库健康状况的巡检工具。

+
+ +4. 对openGauss-x.x.x-openEULER-64bit.tar.gz进行解压。 + + ``` + tar -zxvf openGauss-x.x.x-openEULER-64bit.tar.gz + ``` + + 安装包解压后,会在/opt/software/openGauss路径下自动生成script子目录,并且在script目录下生成gs\_preinstall等各种OM工具脚本。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 在执行前置脚本gs\_preinstall时,需要规划好openGauss配置文件路径、安装包存放路径、程序安装目录、实例数据目录,后续普通用户使用过程中不能再更改这些路径。 + >- 运行前置脚本gs\_preinstall准备安装环境时,脚本内部会自动将openGauss配置文件、解压后的安装包同步拷贝到其余服务器的相同目录下。 + >- 在执行前置或者互信前,请检查/etc/profile文件中是否包含错误输出信息,如果存在错误输出,需手动处理。 + +5. 进入到工具脚本存放目录下。 + + ``` + cd /opt/software/openGauss/script + ``` + +6. 如果是openEuler的操作系统,执行如下命令打开performance.sh文件,用\#注释sysctl -w vm.min\_free\_kbytes=112640 &\> /dev/null,键入“ESC”键进入指令模式,执行**:wq**保存并退出修改。 + + ``` + vi /etc/profile.d/performance.sh + ``` + +7. 为确保openssl版本正确,执行预安装前请加载安装包中lib库。执行命令如下,其中_\{packagePath\}_为用户安装包放置的路径,本示例中为/opt/software/openGauss。 + + ``` + export LD_LIBRARY_PATH={packagePath}/script/gspylib/clib:$LD_LIBRARY_PATH + ``` + +8. 为确保成功安装,检查 hostname 与 /etc/hostname 是否一致。预安装过程中,会对hostname进行检查。 +9. 使用gs\_preinstall准备好安装环境。若为共用环境需加入--sep-env-file=ENVFILE参数分离环境变量避免与其他用户相互影响,ENVFILE为用户自行指定的环境变量分离文件的路径。 + - 采用交互模式执行前置,并在执行过程中自动创建root用户互信和openGauss用户互信: + + ``` + python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml + ``` + + omm为数据库管理员(也是运行openGauss的操作系统用户),dbgrp为运行openGauss的操作系统用户的群组名称,/opt/software/openGauss/clusterconfig.xml为openGauss配置文件路径。在执行过程中,用户根据提示选择是否创建互信,并输入root用户或openGauss用户的密码。 + + - 不允许创建root用户互信时,创建omm用户,在各主机上执行本地模式前置,然后用户手动创建openGauss用户互信: + 1. 执行下面命令准备安装环境。 + + ``` + cd /opt/software/openGauss/script + python gs_preinstall -U omm -G dbgrp -L -X /opt/software/openGauss/clusterconfig.xml + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >此操作需要在每台主机上执行该命令。 + + + - 采用非交互模式执行前置: + 1. 参考[手工建立互信](手工建立互信.md)章节手工建立root用户互信和openGauss用户互信。 + 2. 执行下面命令准备安装环境。 + + ``` + cd /opt/software/openGauss/script + python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml --non-interactive + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 此模式要求用户确保在执行前,已经建立了各节点root用户互信和openGauss用户互信。 + >- root用户互信可能会存在安全隐患,因此建议用户在执行完安装后,立即删除各主机上root用户的互信。 + + + + +## 示例 + +执行前置脚本: + +``` +plat1:/opt/software/openGauss/script # python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Are you sure you want to create trust for root (yes/no)? yes +Please enter password for root. +Password: +Creating SSH trust for the root permission user. +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +Successfully created SSH trust for the root permission user. +Distributing package. +Begin to distribute package to tool path. +Successfully distribute package to tool path. +Begin to distribute package to package path. +Successfully distribute package to package path. +Successfully distributed package. +Are you sure you want to create the user[gaussdba] and create trust for it (yes/no)? yes +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Creating SSH trust for [gaussdba] user. +Please enter password for current user[gaussdba]. +Password: +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +Successfully created SSH trust for [gaussdba] user. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +Successfully set ARM Optimization. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +root密码不一致也不能修改为一致,执行前置脚本本地安装模式: + +``` +plat1:/opt/software/openGauss/script # python gs_preinstall -U omm -G dbgrp -L -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Warning: Installation environment contains some warning messages. +Please get more details by "/home/package/r8c00/script/gs_checkos -i A -h SIA1000068990". +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Cgroup. +Successfully set Cgroup. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +以非交互模式执行前置: + +``` +plat1:/opt/software/openGauss/script # python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml --non-interactive +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Distributing package. +Begin to distribute package to tool path. +Successfully distribute package to tool path. +Begin to distribute package to package path. +Successfully distribute package to package path. +Successfully distributed package. +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +Successfully set ARM Optimization. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +## 错误排查 + +如果准备安装环境失败请根据openGauss日志目录“$GAUSSLOG/om”下的“gs\_preinstall-YYYY-MM-DD\_HHMMSS.log”和“gs\_local-YYYY-MM-DD\_HHMMSS.log”中的日志信息排查错误。例如配置文件中“gaussdbLogPath”参数指定的路径为“/var/log/gaussdb”,则“$GAUSSLOG/om”路径为“/var/log/gaussdb/omm/om”,omm用户为运行openGauss的用户。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>准备安装用户及环境的过程中会使用root添加定时任务用于定时巡检和上报。 + diff --git "a/content/zh/docs/Installation/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" "b/content/zh/docs/Installation/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" new file mode 100644 index 000000000..9a7e8f73b --- /dev/null +++ "b/content/zh/docs/Installation/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" @@ -0,0 +1,11 @@ +# 准备软硬件安装环境 + +本章节描述安装前需要进行的环境准备。 + +- **[软硬件环境要求](软硬件环境要求.md)** +介绍openGauss的软硬件环境要求。建议部署openGauss的各服务器具有等价的软硬件配置。 +- **[修改操作系统配置](修改操作系统配置.md)** + +- **[设置root用户远程登录](设置root用户远程登录.md)** +在openGauss安装时需要root帐户远程登录访问权限,本章介绍如何设置使用root用户远程登录。 + diff --git "a/content/zh/docs/Installation/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Installation/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..a47446b58 --- /dev/null +++ "b/content/zh/docs/Installation/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,15 @@ +# 创建XML配置文件 + +安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场配置对应的XML文件。 + +下面以一主一备的方案为例,说明如何创建XML配置文件。 + +- **[配置数据库名称及各项目录](配置数据库名称及各项目录.md)** + +- **[配置Host基本信息](配置Host基本信息.md)** + +- **[配置数据库主节点信息](配置数据库主节点信息.md)** + +- **[示例](示例.md)** + + diff --git "a/content/zh/docs/Installation/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" "b/content/zh/docs/Installation/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" new file mode 100644 index 000000000..e15cf25b6 --- /dev/null +++ "b/content/zh/docs/Installation/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" @@ -0,0 +1,11 @@ +# 初始化安装环境 + +为了保证openGauss的正确安装,请首先对主机环境进行配置。 + +- **[准备安装用户及环境](准备安装用户及环境.md)** +创建完openGauss配置文件后,在执行安装前,为了后续能以最小权限进行安装及openGauss管理操作,保证系统安全性,需要运行安装前置脚本gs\_preinstall准备好安装用户及环境。 +- **[手工建立互信](手工建立互信.md)** +openGauss在安装过程中,需要在openGauss中的主机间执行命令,传送文件等操作。因此,在普通用户安装前需要确保互信是连通的。前置脚本中会先建立root用户间的互信,然后创建普通用户,并建立普通用户间的互信。 +- **[配置操作系统参数](配置操作系统参数.md)** +openGauss要求各主机上的操作系统参数设置成一定的值,以满足系统运行的性能要求等。 + diff --git "a/content/zh/docs/Installation/\345\210\235\345\247\213\351\205\215\347\275\256.md" "b/content/zh/docs/Installation/\345\210\235\345\247\213\351\205\215\347\275\256.md" new file mode 100644 index 000000000..894dae50f --- /dev/null +++ "b/content/zh/docs/Installation/\345\210\235\345\247\213\351\205\215\347\275\256.md" @@ -0,0 +1,7 @@ +# 初始配置 + +安装完成后,可以对GUC参数、区域和字符集等进行配置,保证openGauss的平稳运行。 + +- **[配置区域和字符集](配置区域和字符集.md)** +区域和字符集在安装过程中通过指定初始化GUC参数来控制,考虑到这两个参数的重要性,在此单独对这两个参数进行详细说明。 + diff --git "a/content/zh/docs/Installation/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Installation/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..44ad1084c --- /dev/null +++ "b/content/zh/docs/Installation/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,36 @@ +# 单节点配置文件 + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + diff --git "a/content/zh/docs/Installation/\345\215\270\350\275\275openGauss.md" "b/content/zh/docs/Installation/\345\215\270\350\275\275openGauss.md" new file mode 100644 index 000000000..83caaaf8c --- /dev/null +++ "b/content/zh/docs/Installation/\345\215\270\350\275\275openGauss.md" @@ -0,0 +1,9 @@ +# 卸载openGauss + +卸载openGauss的过程包含卸载openGauss和对openGauss服务器的环境做清理。 + +- **[执行卸载](执行卸载.md)** +openGauss提供了卸载脚本帮助用户完整的卸载openGauss。 +- **[一键式环境清理](一键式环境清理.md)** +在openGauss卸载完成后,如果不需要在环境上重新部署openGauss,可以运行脚本gs\_postuninstall对openGauss服务器上环境信息做清理。openGauss环境清理是对环境准备脚本gs\_preinstall所做设置的清理。 + diff --git "a/content/zh/docs/Installation/\345\256\211\350\243\205openGauss.md" "b/content/zh/docs/Installation/\345\256\211\350\243\205openGauss.md" new file mode 100644 index 000000000..4cabee017 --- /dev/null +++ "b/content/zh/docs/Installation/\345\256\211\350\243\205openGauss.md" @@ -0,0 +1,11 @@ +# 安装openGauss + +- **[创建XML配置文件](创建XML配置文件.md)** +安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场配置对应的XML文件。 +- **[初始化安装环境](初始化安装环境.md)** +为了保证openGauss的正确安装,请首先对主机环境进行配置。 +- **[执行安装](执行安装.md)** +执行前置脚本准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 +- **[(可选)设置备机可读]((可选)设置备机可读.md)** +备机可读特性为可选特性,需要修改配置参数并重启主备机器后才能使用。在开启备机可读之后,备机将支持读操作,并满足数据一致性要求。 + diff --git "a/content/zh/docs/Installation/\345\256\211\350\243\205\345\207\206\345\244\207.md" "b/content/zh/docs/Installation/\345\256\211\350\243\205\345\207\206\345\244\207.md" new file mode 100644 index 000000000..a596c9cce --- /dev/null +++ "b/content/zh/docs/Installation/\345\256\211\350\243\205\345\207\206\345\244\207.md" @@ -0,0 +1,13 @@ +# 安装准备 + +本章详细介绍了安装openGauss的环境准备和配置,请在安装之前仔细阅读本章的内容。如果已完成本章节的配置,请进入“安装openGauss”章节。 + +- **[了解安装流程](了解安装流程.md)** +本章节通过流程图简要介绍openGauss的安装流程。 +- **[获取并校验安装包](获取并校验安装包.md)** +为了防止安装包在传输过程中被恶意篡改或破坏给客户网络安全造成威胁,在获取到安装包后,需要对安装包的完整性进行校验,通过了校验的安装包才能部署。 +- **[准备软硬件安装环境](准备软硬件安装环境.md)** +本章节描述安装前需要进行的环境准备。 +- **[了解安装用户及用户组](了解安装用户及用户组.md)** +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性。安装脚本在安装过程中会自动按照用户指定创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + diff --git "a/content/zh/docs/Installation/\345\256\211\350\243\205\346\246\202\350\277\260.md" "b/content/zh/docs/Installation/\345\256\211\350\243\205\346\246\202\350\277\260.md" new file mode 100644 index 000000000..7997cfe8d --- /dev/null +++ "b/content/zh/docs/Installation/\345\256\211\350\243\205\346\246\202\350\277\260.md" @@ -0,0 +1,6 @@ +# 安装概述 + +openGauss支持单机部署和单机HA部署两种部署方式。单机部署时,可在一个主机部署多个数据库实例,但为了数据安全,不建议用户这样部署。单机HA部署支持一台主机和最少一台备机,备机和级联备一共最多4台的配置方式。 + +单机部署和单机HA部署均支持精简模式和兼容模式。精简模式下,您可以安装openGauss数据库并正常使用;兼容模式是在精简模式的基础上做了兼容增强,安装兼容包后会兼容主流数据库的接口名称,便于习惯主流数据库的用户使用openGauss。 + diff --git "a/content/zh/docs/Installation/\345\256\211\350\243\205\351\252\214\350\257\201.md" "b/content/zh/docs/Installation/\345\256\211\350\243\205\351\252\214\350\257\201.md" new file mode 100644 index 000000000..4a7f5d849 --- /dev/null +++ "b/content/zh/docs/Installation/\345\256\211\350\243\205\351\252\214\350\257\201.md" @@ -0,0 +1,5 @@ +# 安装验证 + +- **[检查openGauss健康状态](检查openGauss健康状态.md)** + + diff --git "a/content/zh/docs/Installation/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" "b/content/zh/docs/Installation/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" new file mode 100644 index 000000000..cea57f1cd --- /dev/null +++ "b/content/zh/docs/Installation/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" @@ -0,0 +1,312 @@ +# 手工建立互信 + +openGauss在安装过程中,需要在openGauss中的主机间执行命令,传送文件等操作。因此,在普通用户安装前需要确保互信是连通的。前置脚本中会先建立root用户间的互信,然后创建普通用户,并建立普通用户间的互信。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>root用户互信可能会存在安全隐患,因此建议用户在使用完成后,立即删除各主机上root用户的互信。 +>单机部署不需要创建互信。 + +## 前提条件 + +- 确保ssh服务打开。 +- 确保ssh端口不会被防火墙关闭。 +- 确保xml文件中各主机名称和IP配置正确。 +- 确保所有机器节点间网络畅通。 +- 如果为普通用户建立互信,需要提前在各主机创建相同用户并设置密码。 +- 如果各主机安装并启动了SELinux服务,需要确保/root和/home目录安全上下文为默认值(root目录:system\_u:object\_r:home\_root\_t:s0,home目录:system\_u:object\_r:admin\_home\_t:s0)或者关闭掉SELinux服务。 + + 检查系统SELinux状态的方法:执行命令getenforce,如果返回结果是Enforcing ,说明SELinux安装并启用。 + + 检查目录安全上下文的命令: + + ``` + ls -ldZ /root | awk '{print $4}' + ``` + + ``` + ls -ldZ /home | awk '{print $4}' + ``` + + 恢复目录安全上下文命令: + + ``` + restorecon -r -vv /home/ + ``` + + ``` + restorecon -r -vv /root/ + ``` + + +## 使用脚本建立互信 + +1. 创建一个执行互信脚本所需要的输入文本,并在此文件中添加openGauss中所有主机IP。 + + ``` + plat1:/opt/software/openGauss> vim hostfile + 192.168.0.1 + 192.168.0.2 + 192.168.0.3 + ``` + +2. 以需要创建互信的用户执行脚本。 +3. 执行下面脚本建立互信。 + + ``` + plat1:/opt/software/openGauss/script# gs_sshexkey -f /opt/software/hostfile + ``` + + /opt/software/hostfile为主机列表,列出所有需要建立互信机器的主机IP。 + + +## 手工建立互信 + +如果openGauss各主机的root密码不一致,gs\_preinstall脚本无法建立互信,可以手工建立互信。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>建立互信的过程中需要生成如下4个文件:authorized\_keys、id\_rsa、id\_rsa.pub、known\_hosts。请勿删除或破坏这些互信相关的文件。 + +手工建立信任关系,步骤如下,plat1,plat2,plat3是主机名: + +1. 在其中一个主机上,生成root用户的本机授权文件。假设在主机plat1上执行。 + 1. 生成密钥。 + + ``` + ssh-keygen -t rsa + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keygen -t rsa + Generating public/private rsa key pair. + Enter file in which to save the key (/root/.ssh/id_rsa): + Created directory '/root/.ssh'. + Enter passphrase (empty for no passphrase): + Enter same passphrase again: + Your identification has been saved in /root/.ssh/id_rsa. + Your public key has been saved in /root/.ssh/id_rsa.pub. + The key fingerprint is: + d5:35:46:33:27:22:09:f0:1e:12:a7:87:fa:33:3f:ab root@plat1 + The key's randomart image is: + +--[ RSA 2048]----+ + | o.o.....O .| + | * .o + * | + | + + . . | + | . + o | + | . S | + | . | + | + | + | +. | + | E.oo | + +-----------------+ + ``` + + 2. 生成本机授权文件。 + + ``` + cat .ssh/id_rsa.pub >> .ssh/authorized_keys + ``` + + 示例如下: + + ``` + plat1:~ # cat .ssh/id_rsa.pub >> .ssh/authorized_keys + ``` + +2. 收集所有的待建互信主机的公钥,写入到本机的known\_hosts文件中。此步骤需要在步骤1执行的主机上执行。需要收集plat1、plat2、plat3三个主机的公钥。 + 1. 收集plat1的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat1 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat1 >> ~/.ssh/known_hosts + # plat1 SSH-2.0-OpenSSH_5.1 + ``` + + 2. 收集plat2的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat2 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat2 >> ~/.ssh/known_hosts + # plat2 SSH-2.0-OpenSSH_5.1 + ``` + + 3. 收集plat3的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat3 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat3 >> ~/.ssh/known_hosts + # plat3 SSH-2.0-OpenSSH_5.1 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known\_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分。 + >- 如果该主机上known\_hosts文件被删除,互信仍然可以使用,但是会有告警提示信息。如果需要规避告警提示信息,请将/etc/ssh/ssh\_config配置文件中,StrictHostKeyChecking参数设置为no。 + + +3. 将互信文件分发到其它所有主机上。在本例中,需要将plat1上的互信文件分发到plat2和plat3上。 + + 1、将互信文件分发到plat2上。Password输入拷贝目标主机的密码。 + + ``` + scp -r .ssh plat2:~ + ``` + + 示例如下: + + ``` + plat1:~ # scp -r .ssh plat2:~ + Password: + authorized_keys 100% 796 0.8KB/s 00:00 + id_rsa 100% 1675 1.6KB/s 00:00 + id_rsa.pub 100% 398 0.4KB/s 00:00 + known_hosts 100% 1089 1.1KB/s 00:00 + ``` + + 2、将互信文件分发到plat3上。Password输入拷贝目标主机的密码。 + + ``` + scp -r .ssh plat3:~ + ``` + + 示例如下: + + ``` + plat1:~ # scp -r .ssh plat3:~ + Password: + authorized_keys 100% 796 0.8KB/s 00:00 + id_rsa 100% 1675 1.6KB/s 00:00 + id_rsa.pub 100% 398 0.4KB/s 00:00 + known_hosts 100% 1089 1.1KB/s 00:00 + ``` + +4. 查看互信是否建成功,可以互相ssh主机名。输入exit退出。 + + ``` + plat1:~ # ssh plat2 + Last login: Tue Jan 5 10:28:18 2016 from plat1 + Huawei's internal systems must only be used for conducting Huawei's business or for purposes authorized by Huawei management.Use is subject to audit at any time by Huawei management. + plat2:~ # exit + logout + Connection to plat2 closed. + plat1:~ # + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果三个以上节点,和上述过程类似。假设节点名为plat1、plat2、plat3、......。第一步,需要在plat1上生成root用户的本机授权文件;第二步,需要收集所有待建互信主机\(plat1、plat2、plat3、......\)的公钥并写入到本机known\_hosts文件中;第三步,需要将互信文件分发到除本机外的所有其它主机\(plat2、plat3、......\)上;第四步,检查互信是否建立成功。 + + +## 删除root用户互信 + +为了避免Root用户互信可能存在的安全隐患,因此建议用户在使用完成后,立即删除各主机上root用户的互信。 + +1. 删除openGauss数据库各节点上的互信相关文件/root/.ssh。 + + rm –rf \~/.ssh + +2. 查看互信是否删除成功,可以互相ssh主机名,提示不能互信,互信删除成功。 + + plat1:\~ \# ssh plat2 + + he authenticity of host ' plssat2 \(plat2\)' can't be established. + + ECDSA key fingerprint is SHA256:Q4DPRedFytsjsJSKf4l2lHKuzVw4prq3bIUCNVKIa7M. + + ECDSA key fingerprint is MD5:e2:77:6c:aa:4c:43:5f:f2:c4:58:ec:d5:53:de:7c:fc. + + Are you sure you want to continue connecting \(yes/no\)? + + +## 示例 + +root用户建立互信示例: + +``` +plat1:~ # gs_sshexkey -f /opt/software/hostfile -W Gauss_234 +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +``` + +普通用户建立互信示例: + +``` +gaussdb@plat1:~ > gs_sshexkey -f /opt/software/hostfile -W Gauss_234 +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +``` + +安全模式下建立互信示例,需要用户根据提示,手动输入建立互信的用户密码(建议使用安全模式): + +``` +plat1:~ # gs_sshexkey -f /opt/software/hostfile +Please enter password for current user[root]. +Password: +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +``` + diff --git "a/content/zh/docs/Installation/\346\211\247\350\241\214\345\215\270\350\275\275.md" "b/content/zh/docs/Installation/\346\211\247\350\241\214\345\215\270\350\275\275.md" new file mode 100644 index 000000000..cd6fd3c6b --- /dev/null +++ "b/content/zh/docs/Installation/\346\211\247\350\241\214\345\215\270\350\275\275.md" @@ -0,0 +1,54 @@ +# 执行卸载 + +openGauss提供了卸载脚本帮助用户完整的卸载openGauss。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_uninstall卸载openGauss。 + + ``` + gs_uninstall --delete-data + ``` + + 或者在openGauss中每个节点执行本地卸载。 + + ``` + gs_uninstall --delete-data -L + ``` + + +## 示例 + +使用gs\_uninstall脚本进行卸载openGauss。 + +``` +gs_uninstall --delete-data +Checking uninstallation. +Successfully checked uninstallation. +Stopping the cluster. +Successfully stopped the cluster. +Successfully deleted instances. +Uninstalling application. +Successfully uninstalled application. +Uninstallation succeeded. +``` + +单机卸载场景使用gs\_uninstall脚本进行卸载。 + +``` +gs_uninstall --delete-data +Checking uninstallation. +Successfully checked uninstallation. +Stopping the cluster. +Successfully stopped the cluster. +Successfully deleted instances. +Uninstalling application. +Successfully uninstalled application. +Uninstallation succeeded. +``` + +## 错误排查 + +如果卸载失败请根据“$GAUSSLOG/om/gs\_uninstall-YYYY-MM-DD\_HHMMSS.log”中的日志信息排查错误。 + diff --git "a/content/zh/docs/Installation/\346\211\247\350\241\214\345\256\211\350\243\205.md" "b/content/zh/docs/Installation/\346\211\247\350\241\214\345\256\211\350\243\205.md" new file mode 100644 index 000000000..455d4d8ac --- /dev/null +++ "b/content/zh/docs/Installation/\346\211\247\350\241\214\345\256\211\350\243\205.md" @@ -0,0 +1,209 @@ +# 执行安装 + +执行前置脚本准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 + +## 前提条件 + +- 已成功执行前置脚本gs\_preinstall。即完成了[准备安装用户及环境](准备安装用户及环境.md)。 +- 所有服务器操作系统和网络均正常运行。 +- 用户需确保各个主机上的locale保持一致。详细请参见[配置区域和字符集](配置区域和字符集.md)。 + +## 操作步骤 + +1. (可选)检查安装包和openGauss配置文件在规划路径下是否已存在。如果没有则需要重新上传一份,并解压和修改属主为omm。 + + ``` + cd /opt/software/openGauss/script + chmod -R 755 /opt/software/openGauss/script + chown -R omm:dbgrp /opt/software/openGauss/script + ``` + +2. 登录到openGauss的主机,并切换到omm用户。 + + ``` + su - omm + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- omm指的是前置脚本gs\_preinstall中-U参数指定的用户。 + >- 安装脚本gs\_install必须以前置脚本中指定的omm执行,否则,脚本执行会报错。 + +3. 使用gs\_install安装openGauss。若为环境变量分离的模式安装的集群需要source环境变量分离文件ENVFILE。 + + ``` + gs_install -X /opt/software/openGauss/clusterconfig.xml + ``` + + /opt/software/openGauss/clusterconfig.xml为openGauss配置文件的路径。 + + 日志文件路径下会生成两个日志文件:“gs\_install-YYYY-MMDD\_HHMMSS.log”和“gs\_local-YYYY-MM-DD\_HHMMSS.log”。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >执行gs\_install脚本时,如果输入参数--autostart=no, 则工具脚本在配置(config)步骤完成后退出,不会自动启动openGauss,需要用户通过执行gs\_om -t start命令手动启动。 + +4. 安装执行成功之后,需要手动删除主机root用户的互信,即删除openGauss数据库各节点上的互信文件。 + + ``` + rm –rf ~/.ssh + ``` + + +## 安装生成的目录 + +安装后的目录及各目录下的文件说明请参见[表1](#zh-cn_topic_0241805806_zh-cn_topic_0085434626_zh-cn_topic_0059782015_tdcb4fb0f38a6419099ee2c47d4d0b37f)。 + +**表 1** 安装生成的目录 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

序号

+

项目目录说明

+

目录

+

子目录

+

说明

+

1

+

openGauss安装目录

+

/opt/gaussdb/app

+

bin

+

存放数据库二进制文件的目录。

+

etc

+

cgroup工具配置文件。

+

include

+

存放数据库运行所需要的头文件。

+

jdk

+

存放javaJDK环境文件。

+

utilslib

+

存放extension扩展依赖库文件。

+

lib

+

存放数据库的库文件的目录。

+

share

+

存放数据库运行所需要的公共文件,如配置文件模板。

+

2

+

openGauss数据目录

+

/gaussdb/data

+

data_dnxxx

+

DBnode实例的数据目录,其中主实例的目录名为“data_dnxxx”,

+

备实例的为data_dnSxxx。xxx代表DBnode编号。

+

3

+

openGauss日志目录

+

/var/log/gaussdb/用户名

+

bin

+

二进制程序的日志目录。

+

gs_profile

+

数据库内核性能日志目录。

+

om

+

OM的日志目录。例如:

+

部分local脚本产生的日志,增删数据库节点接口的日志,gs_om接口的日志,前置接口的日志,节点替换接口的日志等。

+

pg_audit

+

数据库审计日志目录。

+

pg_log

+

数据库节点实例的运行日志目录。

+

4

+

openGauss系统工具目录

+

/opt/huawei/wisequery

+

script

+

用于openGauss用户进行openGauss管理的脚本文件。

+

sudo

+

用于root用户进行openGauss管理的脚本文件。

+

lib

+

bin目录下的二进制文件依赖的库文件。

+
+ +## 示例 + +执行安装: + +``` +omm@plat1:~> gs_install -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Check preinstall on every node. +Successfully checked preinstall on every node. +Creating the backup directory. +Successfully created the backup directory. +Installing the cluster. +Checking the installation environment on all nodes. +Installing applications on all nodes. +Successfully installed APP. +Cluster installation is completed. +Configuring. +Deleting instances from all nodes. +Checking node configuration on all nodes. +Initializing instances on all nodes. +Updating instance configuration on all nodes. +Configuring pg_hba on all nodes. +Configuration is completed. +Successfully started cluster. +Successfully installed application. +``` + +## 错误排查 + +如果安装失败请根据openGauss日志目录下的“gs\_install-YYYY-MM-DD\_HHMMSS.log”和“gs\_local-YYYY-MM-DD\_HHMMSS.log”中的日志信息排查错误。 + diff --git "a/content/zh/docs/Installation/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" "b/content/zh/docs/Installation/\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..5a5382434 --- /dev/null +++ "b/content/zh/docs/Installation/\346\243\200\346\237\245openGauss\345\201\245\345\272\267\347\212\266\346\200\201.md" @@ -0,0 +1,60 @@ +# 检查openGauss健康状态 + +通过openGauss提供的gs\_checkos工具可以完成操作系统状态检查。 + +## 前提条件 + +- 当前的硬件和网络环境正常。 +- 各主机间root互信状态正常。 +- 只能使用root用户执行gs\_checkos命令。 + +## 操作步骤 + +1. 以root用户身份登录服务器。 +2. 执行如下命令对openGauss节点服务器的OS参数进行检查。 + + ``` + gs_checkos -i A + ``` + + 检查节点服务器的OS参数的目的是为了保证openGauss正常通过预安装,并且在安装成功后可以安全高效的运行。详细的检查项目请参见《工具参考》gs\_checkos工具的表 1 操作系统检查项,操作系统参数和文件系统参数。 + + +## 示例 + +执行gs\_checkos前需要先执行前置脚本,准备环境。以参数"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/Installation/\347\244\272\344\276\213.md" "b/content/zh/docs/Installation/\347\244\272\344\276\213.md" new file mode 100644 index 000000000..3b6605372 --- /dev/null +++ "b/content/zh/docs/Installation/\347\244\272\344\276\213.md" @@ -0,0 +1,7 @@ +# 示例 + +- **[单节点配置文件](单节点配置文件.md)** + +- **[一主一备配置文件](一主一备配置文件.md)** + + diff --git "a/content/zh/docs/Installation/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" "b/content/zh/docs/Installation/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" new file mode 100644 index 000000000..b89142c17 --- /dev/null +++ "b/content/zh/docs/Installation/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" @@ -0,0 +1,73 @@ +# 获取并校验安装包 + +为了防止安装包在传输过程中被恶意篡改或破坏给客户网络安全造成威胁,在获取到安装包后,需要对安装包的完整性进行校验,通过了校验的安装包才能部署。 + +## 前提条件 + +- 已经获取PGP简易验证工具,如PGPVerify,同时也已获取公钥文件。 +- 已经获取openGauss安装包和签名文件,安装包与签名文件是一一对应并放在同一目录下,一个安装包对应一个校验文件,签名文件由各产品与对应的安装包版本同时发布,签名文件的后缀是“asc”,通常情况下名称和安装包名称相同。假设安装包的名称openGauss-x.x.x.x-CentOS-64bit.tar.gz时,对应的校验文件的名称为“openGauss-x.x.x.x-CentOS-64bit.tar.asc”。 + +## 操作步骤 + +1. **从openGauss开源社区下载对应平台的安装包**。 + 1. 登陆openGauss开源社区。 + 2. 单击“下载”。 + 3. 解压下载后的压缩包。 + +2. 验证安装程序。 + 1. 解压安装包,检查安装目录及文件是否齐全。在安装包所在目录执行以下命令: + + ``` + tar -zxvfopenGauss-x.x.x-openEuler-64bit.tar.gz + ls -1 + ``` + + 执行ls命令,显示类似如下信息,其中packages目录中_openGauss-x.x.x-openEuler_-64bit.tar.gz表示数据库安装包,在执行_openGauss-x.x.x_安装的过程中会对数据库安装程序自动执行SHA256校验 + + ``` + total 188632 + -rwxr-xr-x 1 root root 392301 Sep 7 14:53 Copyright Notice.docx + -rw-r--r-- 1 root root 1615973 Sep 7 14:52 openGauss-x.x.x-Inspection.tar.gz + -rw-r--r-- 1 root root 17521151 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-ClientTools.tar.gz + -rw-r--r-- 1 root root 7386461 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-Jdbc.tar.gz + -rw-r--r-- 1 root root 4336455 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-Libpq.tar.gz + -rw-r--r-- 1 root root 4982437 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-Odbc.tar.gz + -rw-r--r-- 1 root root 2983406 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-gauss-loader.tar.gz + -rw-r--r-- 1 root root 4559410 Sep 7 14:54openGauss-x.x.x-openEuler-64bit-gsql.tar.gz + -rwxr-xr-x 1 root root 95274943 Sep 7 14:51 openGauss-x.x.x-openEuler-64bit-symbol.tar.gz + -rwx------ 1 root root 184035063 Sep 7 14:53 openGauss-x.x.x-openEuler-64bit.bin + -rw-r--r-- 1 root root 65 Sep 7 14:53 openGauss-x.x.x-openEuler-64bit.sha256 + -rw-r--r-- 1 root root 224104563 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit.tar.gz + -rw-r--r-- 1 root root 7253 Sep 7 14:30 openGauss-x.x.x-Sslcert.tar.gz + -rwx------ 1 root root 370511659 Sep 10 15:14 openGauss-x.x.x_PACKAGES.tar.gz + -rw------- 1 root root 65 Sep 7 14:53 inplace_upgrade_sql.sha256 + -rw------- 1 root root 193799 Sep 7 14:53 inplace_upgrade_sql.tar.gz + drwxr-xr-x 9 root root 4096 Sep 7 14:53 lib + drwxr-xr-x 4 root root 4096 Sep 7 14:53 libcgroup + drwxr-xr-x 11 root root 4096 Sep 7 14:53 lvs + drwxr-xr-x 7 root root 4096 Sep 7 14:53 pssh-2.3.1 + drwxr-xr-x 6 root root 4096 Sep 7 14:53 script + drwxr-xr-x 9 root root 4096 Sep 7 14:53 sctp_patch + -rwxr-xr-x 1 root root 40 Sep 7 14:53 server.key.cipher + -rwxr-xr-x 1 root root 24 Sep 7 14:53 server.key.rand + drwxr-xr-x 5 root root 4096 Sep 7 14:53 sudo + -rw-r--r-- 1 root root 28 Sep 7 14:53 version.cfg + + ``` + + 2. 进入scripts目录启动openGauss安装,观察是否提示安装不成功。 + + 在安装过程中,安装包会自动使用SHA256文件校验数据库安装程序的完整性。 + + 如果出现类似如下的信息,则表示数据库安装包校验失败,从而会导致openGauss安装失败。 + + ``` + Error: The sha256 value is different! + Bin file a4ebce0b6052723b1f386928e4d820fa2 + sha256 file 4ebce0b6052723b1f386928e4d820fa2 + ``` + + 如果无任何错误提示,则表示安装程序正确,未被非法修改。 + + + diff --git "a/content/zh/docs/Installation/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" "b/content/zh/docs/Installation/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" new file mode 100644 index 000000000..3e8d8a64f --- /dev/null +++ "b/content/zh/docs/Installation/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" @@ -0,0 +1,60 @@ +# 设置root用户远程登录 + +在openGauss安装时需要root帐户远程登录访问权限,本章介绍如何设置使用root用户远程登录。 + +1. 修改PermitRootLogin配置,允许用户远程登录。 + 1. 打开sshd\_config文件。 + + ``` + vim /etc/ssh/sshd_config + ``` + + 2. 修改权限配置,可以使用以下两种方式实现: + - 注释掉“PermitRootLogin no”。 + + ``` + #PermitRootLogin no + ``` + + - 将“PermitRootLogin“改为“yes“。 + + ``` + PermitRootLogin yes + ``` + + 3. 执行**:wq**保存并退出编辑页面。 + +2. 修改Banner配置,去掉连接到系统时,系统提示的欢迎信息。欢迎信息会干扰安装时远程操作的返回结果,影响安装正常执行。 + 1. 编辑sshd\_config文件。 + + ``` + vim /etc/ssh/sshd_config + ``` + + 2. 修改Banner配置,注释掉“Banner”所在的行。 + + ``` + #Banner /etc/ssh/welcome.msg + ``` + + 3. 执行**:wq**保存并退出编辑页面。 + +3. 使用如下命令使设置生效。 + + ``` + service sshd restart + ``` + + >![](public_sys-resources/icon-caution.gif) **注意:** + >若执行命令后返回提示信息“Redirecting to /bin/systemctl restart sshd.service”,请执行命令:/bin/systemctl restart sshd.service。 + +4. 以root用户身份重新登录。 + + ``` + ssh xxx.xxx.xxx.xxx + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >xxx.xxx.xxx.xxx为安装openGauss环境的ip。 + + diff --git "a/content/zh/docs/Installation/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" "b/content/zh/docs/Installation/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" new file mode 100644 index 000000000..b106146bc --- /dev/null +++ "b/content/zh/docs/Installation/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" @@ -0,0 +1,8 @@ +# 设置字符集参数 + +将各数据库节点的字符集设置为相同的字符集,可以在/etc/profile文件中添加"export LANG=XXX"(XXX为Unicode编码)。 + +``` +vim /etc/profile +``` + diff --git "a/content/zh/docs/Installation/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" "b/content/zh/docs/Installation/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" new file mode 100644 index 000000000..292dbc0f0 --- /dev/null +++ "b/content/zh/docs/Installation/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" @@ -0,0 +1,20 @@ +# 设置时区和时间 + +将各数据库节点的时区设置为相同时区,可以将/usr/share/zoneinfo/目录下的时区文件拷贝为/etc/localtime文件。 + +``` +cp /usr/share/zoneinfo/$地区/$时区 /etc/localtime +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>_$地区/$时区为需要设置时区的信息,例如:Asian_/Shanghai。 + +使用date -s命令将各主机的时间设置为统一时间,举例如下。 + +``` +date -s Mon May 11 16:42:11 CST 2020 +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以通过date命令查询主机时区。 + diff --git "a/content/zh/docs/Installation/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" "b/content/zh/docs/Installation/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" new file mode 100644 index 000000000..8799e49db --- /dev/null +++ "b/content/zh/docs/Installation/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" @@ -0,0 +1,8 @@ +# 设置网卡MTU值 + +将各数据库节点的网卡MTU值设置为相同大小。MTU值推荐8192,要求不小于1500 + +``` +ifconfig 网卡编号 mtu 值 +``` + diff --git "a/content/zh/docs/Installation/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" "b/content/zh/docs/Installation/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" new file mode 100644 index 000000000..936f3565c --- /dev/null +++ "b/content/zh/docs/Installation/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" @@ -0,0 +1,83 @@ +# 软硬件环境要求 + +介绍openGauss的软硬件环境要求。建议部署openGauss的各服务器具有等价的软硬件配置。 + +## 硬件环境要求 + +[表1](#zh-cn_topic_0241802565_zh-cn_topic_0085434629_zh-cn_topic_0059782022_t62cd0eed17004265b1b8ad98f302a4bc)列出了openGauss服务器应具备的最低硬件要求。在实际产品中,硬件配置的规划需考虑数据规模及所期望的数据库响应速度。请根据实际情况进行规划。 + +**表 1** 硬件环境要求 + + + + + + + + + + + + + + + + + + + +

项目

+

配置描述

+

最小内存

+

功能调试32GB以上。

+

性能测试和商业部署时,单实例部署建议128GB以上。

+

复杂的查询对内存的需求量比较高,在高并发场景下,可能出现内存不足。此时建议使用大内存的机器,或使用负载管理限制系统的并发。

+

CPU

+

功能调试最小1×8 核 2.0GHz。

+

性能测试和商业部署时,单实例部署建议1×16核 2.0GHz。

+

CPU超线程和非超线程两种模式都支持。但是,openGauss各节点的设置需保持一致。

+

硬盘

+

用于安装openGauss的硬盘需最少满足如下要求:

+
  • 至少1GB用于安装openGauss的应用程序包。
  • 每个主机需大约300MB用于元数据存储。
  • 预留70%以上的磁盘剩余空间用于数据存储。
+

建议系统盘配置为Raid1,数据盘配置为Raid5,且规划4组Raid5数据盘用于安装openGauss。有关Raid的配置方法在本手册中不做介绍。请参考硬件厂家的手册或互联网上的方法进行配置,其中Disk Cache Policy一项需要设置为Disabled,否则机器异常掉电后有数据丢失的风险。

+

openGauss支持使用SSD盘作为数据库的主存储设备,支持SAS接口NVME协议的SSD盘,以RAID的方式部署使用。

+

网络要求

+

300兆以上以太网。

+

建议网卡设置为双网卡冗余bond。有关网卡冗余bond的配置方法在本手册中不做介绍。请参考硬件厂商的手册或互联网上的方法进行配置。

+

openGauss网络如果配置bond,请保证bond模式一致,不一致的bond配置可能导致openGauss工作异常。

+
+ +## 软件环境要求 + +**表 2** 软件环境要求 + + + + + + + + + + + + + + + + + + + +

软件类型

+

配置描述

+

Linux操作系统

+

openEuler20.3LTS和CentOS7.6

+

Linux文件系统

+

剩余inode个数 > 15亿(推荐)

+

工具

+

Huawei JDK 1.8.0、psmisc

+

Python

+

Python 3.6.X-3.7.X

+
+ diff --git "a/content/zh/docs/Installation/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" "b/content/zh/docs/Installation/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" new file mode 100644 index 000000000..fcd07b56b --- /dev/null +++ "b/content/zh/docs/Installation/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" @@ -0,0 +1,72 @@ +# 配置Host基本信息 + +>![](public_sys-resources/icon-note.gif) **说明:** +>每台Host服务器都必须有如下信息,如下示例以node1为例。 + +加粗字体内容为示例,可自行替换。每行信息均有注释进行说明。 + +``` + + + + + + + + + + + + +``` + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + +

实例类型

+

参数

+

说明

+

整体信息

+

name

+

主机名称。

+

azName

+

指定azName,字符串(不能含有特殊字符),例如AZ1、AZ2、AZ3。

+

azPriority

+

指定azPriority的优先级。

+

backIp1

+

主机在后端存储网络中的IP地址(内网IP)。所有openGauss主机使用后端存储网络通讯。

+

sshIp1

+

设置SSH可信通道IP地址(外网IP)。若无外网,则可以不设置该选项或者同backIp1设置相同IP。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>配置文件中所有IP参数(包含backIp、sshIp、listenIp等)均只支持配置一个IP。如果配置第二个IP参数,则不会读取第二个参数的配置值。 +>示例:xml配置文件中同时配置backIp1和backIp2参数: +>在解析配置文件时仅读取backIp1参数的配置值,不会读取backIp2参数的配置值。 +>``` +> +> +>``` + diff --git "a/content/zh/docs/Installation/\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" "b/content/zh/docs/Installation/\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" new file mode 100644 index 000000000..8e1846ffc --- /dev/null +++ "b/content/zh/docs/Installation/\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" @@ -0,0 +1,119 @@ +# 配置区域和字符集 + +区域和字符集在安装过程中通过指定初始化GUC参数来控制,考虑到这两个参数的重要性,在此单独对这两个参数进行详细说明。 + +## 相关概念 + +区域: + +- 区域是指应用中考虑字母、排序、数字格式等与文化相关的问题。 +- 使用gs\_install脚本初始化一个数据库时会初始化区域。缺省时,gs\_install脚本将会按照操作系统默认的区域初始化数据库。因此,如果操作系统的默认区域与用户规划的相同,则初始化数据库时不需要再设置。 + +字符集(编码格式): + +- openGauss支持GBK、UTF-8和Latin1编码格式。 +- 使用gs\_install脚本初始化数据库时会初始化字符集。缺省时,gs\_install脚本将会按照操作系统默认区域的字符集来初始化数据库。在创建数据库的时候是可以修改默认字符集。因此,多个数据库可以设置为不同的字符集。 + +## 规划原则和方法 + +- 规划字符集,选择原则和设置方法请参见[表1](#zh-cn_topic_0241805810_zh-cn_topic_0085434664_zh-cn_topic_0059782037_table4528029520399)。 + + **表 1** 字符集 + + + + + + + + + + + + + + + + + + +

字符集

+

规划原则

+

设置方法

+

GBK

+

如果数据库只需要支持中文,数据量很大,性能要求也很高,那就应该选择双字节定长编码的中文字符集。对openGauss来说,中文字符集目前只能选择GBK 。

+
  • 在安装数据库时指定初始化参数-E。
  • 通过SQL语句创建数据库时指定ENCODING参数。
+

详细请参见示例

+

UTF-8

+

如果应用程序要处理各种各样的文字,或者将处理结果发布到使用不同语言的国家或地区,就应该选择Unicode字符集。对openGauss来说,Unicode字符集目前只能选择UTF-8 。

+

Latin1

+

如果数据库只需要支持ASCII收录的字符、西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号,则可以选择Latin1。

+
+ + >![](public_sys-resources/icon-note.gif) **说明:** + >- openGauss支持字符集的多种写法:gbk/GBK、UTF-8/UTF8/uft8/utf-8和Latine1/latine1。 + >- 安装时若不指定字符集,默认字符集为SQL\_ASCII,若想指定,请在安装时指定,具体操作请参见[示例](#zh-cn_topic_0241805810_zh-cn_topic_0085434664_zh-cn_topic_0059782037_sa523d6a2a09c4cf29d503e2175747721)。 + +- 规划区域。 + 1. 检查与指定字符集(假设为UTF-8)匹配的区域。 + + ``` + locale -a |grep utf8 + ``` + + 显示类似如下信息,其中en\_US.utf8表示区域en\_US支持UTF-8编码。 + + ``` + ...... + en_SG.utf8 + en_US.utf8 + ...... + ``` + + 2. 在初始化数据库时设置区域,设置方法请参见[示例](#zh-cn_topic_0241805810_zh-cn_topic_0085434664_zh-cn_topic_0059782037_sa523d6a2a09c4cf29d503e2175747721)。 + + +## 示例 + +示例1:在初始化数据库时,指定数据库初始化的字符集为UTF-8,区域为zh\_CN.UTF-8。 + +``` +gs_initdb -E UTF-8 --locale=zh_CN.UTF-8 /opt/gaussdb/data/data_n1 --nodename dn1 -w "Bigdata@123" +``` + +/opt/gaussdb/data/data\_n1为安装后的DBnode目录,Bigdata@123为数据库用户密码。 + +显示类似如下信息: + +``` +The files belonging to this database system will be owned by user "xlnha". +This user must also own the server process. + +The database cluster will be initialized with locale "zh_CN.UTF-8". +gs_initdb: could not find suitable text search configuration for locale "zh_CN.UTF-8" +The default text search configuration will be set to "simple". + +fixing permissions on existing directory /opt/gaussdb/data1 ... ok +creating subdirectories ... ok +selecting default max_connections ... 100 +selecting default shared_buffers ... 32MB +creating configuration files ... ok +...... +``` + +示例2:使用SQL语句创建数据库时,指定数据库的字符集为GBK。 + +``` +gsql -d postgres -p 1255 +``` + +``` +postgres=# CREATE DATABASE mydb WITH ENCODING 'GBK' template = template0; +``` + +显示类似如下信息: + +``` +CREATE DATABASE +``` + diff --git "a/content/zh/docs/Installation/\351\205\215\347\275\256\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" "b/content/zh/docs/Installation/\351\205\215\347\275\256\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..debed9990 --- /dev/null +++ "b/content/zh/docs/Installation/\351\205\215\347\275\256\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" @@ -0,0 +1,502 @@ +# 配置操作系统参数 + +openGauss要求各主机上的操作系统参数设置成一定的值,以满足系统运行的性能要求等。 + +这些参数有些会在openGauss安装环境准备阶段完成设置,且这些参数将直接影响openGauss的运行状态,请仅在确认必要时进行手动调整。方法如下: + +1. 以root用户身份登录服务器。 +2. 对文件“/etc/sysctl.conf”进行编辑修改。 + + 具体参数的修改请参见[操作系统参数](#zh-cn_topic_0241805805_zh-cn_topic_0085434661_zh-cn_topic_0059782062_section3705271819540)。 + +3. 执行如下命令使修改配置生效。 + + ``` + sysctl -p + ``` + + +## 操作系统参数 + +**表 1** 操作系统参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数说明

+

推荐取值

+

net.ipv4.tcp_max_tw_buckets

+

表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。如果超过所配置的取值,TIME_WAIT将立刻被释放并打印警告信息。

+

10000

+

net.ipv4.tcp_tw_reuse

+

允许将TIME-WAIT状态的sockets重新用于新的TCP连接。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_tw_recycle

+

表示开启TCP连接中TIME-WAIT状态sockets的快速回收。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_keepalive_time

+

表示当keepalive启用的时候,TCP发送keepalive消息的频度。

+

30

+

net.ipv4.tcp_keepalive_probes

+

在认定连接失效之前,发送TCP的keepalive探测包数量。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应。

+

9

+

net.ipv4.tcp_keepalive_intvl

+

当探测没有确认时,重新发送探测的频度。

+

30

+

net.ipv4.tcp_retries1

+

在连接建立过程中TCP协议最大重试次数。

+

5

+

net.ipv4.tcp_syn_retries

+

TCP协议SYN报文最大重试次数。

+

5

+

net.ipv4.tcp_synack_retries

+

TCP协议SYN应答报文最大重试次数。

+

5

+

net.sctp.path_max_retrans

+

SCTP协议最大重试次数。

+

10

+

net.sctp.max_init_retransmits

+

SCTP协议INIT报文最大重试次数。

+

10

+

net.sctp.association_max_retrans

+

SCTP协议单个逻辑连接最大重试次数。

+

10

+

net.sctp.hb_interval

+

SCTP协议心跳检测包重传间隔。

+

30000

+

net.ipv4.tcp_retries2

+

控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接。

+

发生“connection reset by peer”时可以尝试调大该值规避问题。

+

12

+

vm.overcommit_memory

+

控制在做内存分配的时候,内核的检查方式。

+
  • 0:表示系统会尽量精确计算当前可用的内存。
  • 1:表示不作检查直接返回成功。
  • 2:内存总量×vm.overcommit_ratio/100+SWAP的总量,如果申请空间超过此数值则返回失败。
+

内核默认是2过于保守,推荐设置为0,如果系统压力大可以设置为1。

+

0

+

net.sctp.sndbuf_policy

+

SCTP发送缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.rcvbuf_policy

+

SCTP接收缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.sctp_mem

+

内核SCTP协议栈的最大可用内存,分无压力,有压力,和压力大三个区间,压力大时会丢包,单位为页面。

+

94500000 915000000 927000000

+

net.sctp.sctp_rmem

+

内核SCTP协议栈的接收总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.sctp.sctp_wmem

+

内核SCTP协议栈的发送总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_rmem

+

TCP协议接收端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_wmem

+

TCP协议发送端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.core.wmem_max

+

socket发送端缓冲区大小的最大值。

+

21299200

+

net.core.rmem_max

+

socket接收端缓冲区大小的最大值。

+

21299200

+

net.core.wmem_default

+

socket发送端缓冲区大小的默认值。

+

21299200

+

net.core.rmem_default

+

socket接收端缓冲区大小的默认值。

+

21299200

+

net.ipv4.ip_local_port_range

+

物理机可用临时端口范围。

+

26000-65535

+

kernel.sem

+

内核信号量参数设置大小。

+

250 6400000 1000 25600

+

vm.min_free_kbytes

+

保证物理内存有足够空闲空间,防止突发性换页。

+

系统总内存的5%

+

net.core.somaxconn

+

定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。

+

65535

+

net.ipv4.tcp_syncookies

+

当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

+
  • 0表示关闭SYN Cookies。
  • 1表示开启SYN Cookies。
+

1

+

net.sctp.addip_enable

+

SCTP动态地址重置支持开关

+
  • 0表示关闭。
  • 1表示开启。
+

0

+

net.core.netdev_max_backlog

+

在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

+

65535

+

net.ipv4.tcp_max_syn_backlog

+

记录的那些尚未收到客户端确认信息的连接请求的最大值。

+

65535

+

net.ipv4.tcp_fin_timeout

+

系统默认的超时时间。

+

60

+

kernel.shmall

+

内核可用的共享内存总量。

+

1152921504606846720

+

kernel.shmmax

+

内核参数定义单个共享内存段的最大值。

+

18446744073709551615

+

net.ipv4.tcp_sack

+

启用有选择的应答,通过有选择地应答乱序接受到的报文来提高性能,让发送者只发送丢失的报文段(对于广域网来说)这个选项应该启用,但是会增加对CPU的占用。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

net.ipv4.tcp_timestamps

+

TCP时间戳(会在TCP包头增加12节),以一种比重发超时更精确的方式(参考RFC 1323)来启用对RTT的计算,启用可以实现更好的性能。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

vm.extfrag_threshold

+

系统内存不够用时,linux会为当前系统内存碎片情况打分,如果超过vm.extfrag_threshold的值,kswapd就会触发memory compaction。所以这个值设置的接近1000,说明系统在内存碎片的处理倾向于把旧的页换出,以符合申请的需要,而设置接近0,表示系统在内存碎片的处理倾向做memory compaction。

+

500

+

vm.overcommit_ratio

+

系统使用绝不过量使用内存的算法时,系统整个内存地址空间不得超过swap+RAM值的此参数百分比,当vm.overcommit_memory=2时此参数生效。

+

90

+

/sys/module/sctp/parameters/no_checksums

+

SCTP协议是否关闭checksum。

+

0

+

MTU

+

节点网卡最大传输单元。OS默认值为1500,调整为8192可以提升SCTP协议数据收发的性能。

+

8192

+
+ +## 文件系统参数 + +- soft nofile + + 说明:soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。 + + 推荐取值:1000000 + +- hard nofile + + 说明:hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。 + + 推荐取值:1000000 + +- stack size + + 说明:线程堆栈大小。 + + 推荐值:3072 + + +## transparent\_hugepage设置 + +openGauss默认关闭使用transparent\_hugepage服务,并将关闭命令写入操作系统启动文件。 + +## 文件句柄设置 + +需要对文件句柄数进行手动设置时,使用root用户执行如下命令进行参数修改: + +``` +echo "* soft nofile 1000000" >>/etc/security/limits.conf +echo "* hard nofile 1000000" >>/etc/security/limits.conf +``` + +完成修改后,需重启操作系统使得设置的参数生效。 + +**表 2** 文件句柄数设置 + + + + + + + + + + + + + + + + + + + +

参数名

+

说明

+

预安装时是否由脚本自动设置

+

推荐取值

+

* soft nofile

+

soft nofile表示软限制,即表示任何用户能打开的最大文件数量为1000000,不管它开启多少个shell。

+

+

1000000

+

* hard nofile

+

hard nofile表示硬限制,软限制要小于等于硬限制。

+

+

1000000

+
+ +## 系统支持的最大进程数设置 + +需要对系统支持的最大进程数进行手动设置时,执行如下命令打开conf文件。 + +``` +vim /etc/security/limits.d/90-nproc.conf +``` + +修改\* soft nproc参数。 + +完成修改后,需重启操作系统使得设置的参数生效。 + +**表 3** 系统支持的最大进程数设置 + + + + + + + + + + + + + + +

参数名

+

说明

+

预安装时是否由脚本自动设置

+

推荐取值

+

* soft nproc

+

soft nproc参数用来限制每个用户的最大processes数量。

+

+

60000

+
+ +## 网卡参数配置 + +**表 4** 网卡参数配置 + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

说明

+

预安装时是否由脚本自动设置

+

推荐取值

+

rx

+

网卡接收队列长度设置

+

+

4096

+

tx

+

网卡传送队列长度设置

+

+

4096

+

mtu

+

网卡最大传输单元设置

+

+

15008192

+
+ +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 网卡参数配置功能只针对万兆及万兆以上级别的业务网卡。即backIp1所绑定的网卡。 +>- 设置网卡参数的命令只有在设置成功后,才会被写入系统启动文件。执行失败的信息会被记入后台日志中。 + diff --git "a/content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" "b/content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" new file mode 100644 index 000000000..9d008424a --- /dev/null +++ "b/content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" @@ -0,0 +1,83 @@ +# 配置数据库主节点信息 + +加粗字体内容为示例,可自行替换。每行信息均有注释进行说明。 + +**数据库主节点配置以下信息。** + +``` + + + + + + + +``` + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + +

实例类型

+

参数

+

说明

+

DBnode

+

dataNum

+

当前主机上需要部署的数据库节点个数。

+

dataPortBase

+

数据库节点的基础端口号,默认值40000。

+

dataListenIp1

+

监听的IP地址,用于接受其他数据库节点的连接。未设置时,使用对应主机上的backIp1生成。

+

如果配置有虚拟IP,该字段也可配置虚拟IP。

+

dataHaIp1

+

主、备DBnode通信的IP地址。未设置时,使用对应主机的backIp生成。

+

value中需设置主、备DBnode所在主机的IP地址。

+

dataNode1

+

用于指定当前主机上的数据库节点的数据存储目录。此目录为数据库的数据存储目录。应规划到数据盘上。

+
+ +**表 2** 数据库实例数据目录 + + + + + + + + + + + + + +

实例名称

+

实例数据目录

+

主DBnode

+

/opt/huawei/data/xxx

+

其中,xxx为当前主DBnode的名称。

+

备DBnode

+

opt/huawei/data/slaveX

+

其中,xxx为当前备DBnode的名称。

+
+ diff --git "a/content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" "b/content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" new file mode 100644 index 000000000..8d757f980 --- /dev/null +++ "b/content/zh/docs/Installation/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" @@ -0,0 +1,105 @@ +# 配置数据库名称及各项目录 + +加粗字体内容为示例,可自行替换。每行信息均有注释进行说明。 + +``` + + + + + + + + + + + + + + + + + + + + + + + +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- “/opt/huawei/newsql/tools”存放互信等工具,避免权限问题,不要把实例数据目录放在此目录下。 +>- 安装目录和数据目录需为空或者不存在,否则可能导致安装失败。 +>- 在对数据库节点的实例进行具体配置时,需确保配置的目录之间不相互耦合。即各个配置目录不关联,删除其中任意一个目录,不会级联删除其它目录。如gaussdbAppPath为"/opt/gaussdb/app",gaussdbLogPath为"/opt/gaussdb/app/omm"。当gaussdbAppPath目录被删除时,会级联删除gaussdbLogPath目录,从而引起其它问题。 +>- 若需要安装脚本自动创建安装用户时各配置的目录需保证不与系统创建的默认用户目录耦合关联。 +>- 配置openGauss路径和实例路径时,路径中不能包含"|",";","&","$","<","\>","\`","\\\\","'","\\"","\{","\}","\(","\)","\[","\]","\~","\*","?"特殊字符。 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

实例类型

+

参数

+

说明

+

整体信息

+

clusterName

+

openGauss名称。

+

nodeNames

+

openGauss中主机名称。

+

backIp1s

+

主机在后端存储网络中的IP地址(内网IP)。所有openGauss主机使用后端存储网络通讯。

+

gaussdbAppPath

+

openGauss程序安装目录。此目录应满足如下要求:

+
  • 磁盘空间>1GB
  • 与数据库所需其它路径相互独立,没有包含关系。
+

gaussdbLogPath

+

openGauss运行日志和操作日志存储目录。此目录应满足如下要求:

+
  • 磁盘空间建议根据主机上的数据库节点数规划。数据库节点预留1GB空间的基础上,再适当预留冗余空间。
  • openGauss所需其它路径相互独立,没有包含关系。
+

此路径可选。不指定的情况下,openGauss安装时会默认指定“$GAUSSLOG/安装用户名”作为日志目录。

+

tmpdbPath

+

数据库临时文件存放目录。

+

若不配置tmpdbPath,默认存放在/opt/huawei/wisequery/perfadm_db目录下。

+

gaussdbToolPath

+

openGauss系统工具目录,主要用于存放互信工具等。此目录应满足如下要求:

+
  • 磁盘空间>100MB
  • 固定目录,与数据库所需其它目录相互独立,没有包含关系。
+

此目录可选。不指定的情况下,openGauss安装时会默认指定“/opt/huawei/wisequery”作为数据库系统工具目录。

+

corePath

+

openGauss core文件的指定目录。

+

clusterType

+

openGauss类型,openGauss拓扑类型;可选字段。

+

“single-inst”表示单机一主多备部署形态。

+
+ diff --git "a/content/zh/docs/Installation/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" "b/content/zh/docs/Installation/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" new file mode 100644 index 000000000..2fcc37704 --- /dev/null +++ "b/content/zh/docs/Installation/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" @@ -0,0 +1,10 @@ +# (可选)设置备机可读 + +备机可读特性为可选特性,需要修改配置参数并重启主备机器后才能使用。在开启备机可读之后,备机将支持读操作,并满足数据一致性要求。 + +## 操作步骤 + +1. 如果主备机上的openGauss数据库实例正在运行,请先分别停止主备机上的数据库实例。 +2. 根据[表2](配置数据库主节点信息.md#zh-cn_topic_0241802596_table15838192510429)对应路径,分别打开主机与备机的postgres.conf配置文件,找到并将对应参数修改为:wal\_level=hot\_standby ; hot\_standby = on;hot\_standby\_feedback = on。 +3. 修改完成后,分别启动主备机即可。 + -- Gitee From 87594e1ca1fb8688edfee77acd38643f587121ae Mon Sep 17 00:00:00 2001 From: liyang0608 <554903772@qq.com> Date: Thu, 28 May 2020 17:41:41 +0800 Subject: [PATCH 25/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Quickstart/.keep | 0 content/zh/docs/Quickstart/FAQ.md | 5 + ...77\347\224\250\350\257\264\346\230\216.md" | 10 + ...02\346\225\260\350\257\264\346\230\216.md" | 55 ++ ...16\351\251\261\345\212\250\347\261\273.md" | 18 + content/zh/docs/Quickstart/Query.md | 118 ++++ content/zh/docs/Quickstart/Quickstart.md | 6 + content/zh/docs/Quickstart/figures/.keep | 0 .../figures/zh-cn_image_0241993991.png | Bin 0 -> 20522 bytes ...0\345\236\213\347\273\204\347\275\221.png" | Bin 0 -> 28267 bytes ...5\346\265\201\347\250\213\345\233\276.png" | Bin 0 -> 40551 bytes ...4\347\275\221\347\244\272\344\276\213.png" | Bin 0 -> 31137 bytes ...3\257\350\277\236\346\216\245openGauss.md" | 9 + .../openGauss\344\272\213\345\212\241.md" | 124 ++++ .../Quickstart/public_sys-resources/.keep | 0 .../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 ...15\347\275\256\346\226\207\344\273\266.md" | 46 ++ ...73\346\234\215\345\212\241\345\231\250.md" | 144 ++++ ...06\350\247\243\344\272\247\345\223\201.md" | 11 + ...11\350\243\205\346\265\201\347\250\213.md" | 56 ++ ...12\347\224\250\346\210\267\347\273\204.md" | 37 + ...13\345\212\241\347\233\221\346\216\247.md" | 29 + ...47\345\223\201\347\211\271\347\202\271.md" | 19 + ...00\351\224\200\345\270\270\351\207\217.md" | 87 +++ ...71\346\263\225\351\205\215\347\275\256.md" | 335 +++++++++ ...17\345\206\231\346\227\245\345\277\227.md" | 187 +++++ ...54\345\234\260\350\277\236\346\216\245.md" | 57 ++ ...34\347\250\213\350\277\236\346\216\245.md" | 7 + ...73\347\273\237\351\205\215\347\275\256.md" | 13 + ...44\346\215\242\345\206\205\345\255\230.md" | 8 + ...37\351\230\262\347\201\253\345\242\231.md" | 96 +++ ...26\345\231\250\351\200\211\351\241\271.md" | 345 +++++++++ ...66\344\273\226\347\274\272\347\234\201.md" | 48 ++ ...66\345\256\203\351\200\211\351\241\271.md" | 401 +++++++++++ ...70\345\236\213\347\273\204\347\275\221.md" | 43 ++ .../Quickstart/\345\206\205\345\255\230.md" | 281 ++++++++ ...04\346\272\220\344\275\277\347\224\250.md" | 34 + ...67\345\217\212\347\216\257\345\242\203.md" | 353 ++++++++++ ...11\350\243\205\347\216\257\345\242\203.md" | 11 + ...15\347\275\256\346\226\207\344\273\266.md" | 15 + ...72\346\225\260\346\215\256\345\272\223.md" | 57 ++ ...33\345\273\272\347\224\250\346\210\267.md" | 81 +++ .../\345\210\233\345\273\272\350\241\250.md" | 219 ++++++ ...33\345\273\272\350\247\222\350\211\262.md" | 71 ++ ...11\350\243\205\347\216\257\345\242\203.md" | 11 + ...40\350\275\275\351\251\261\345\212\250.md" | 14 + ...14\346\240\274\345\274\217\345\214\226.md" | 178 +++++ ...07\347\272\247\345\217\202\346\225\260.md" | 37 + ...15\347\275\256\346\226\207\344\273\266.md" | 36 + ...54\345\205\274\345\256\271\346\200\247.md" | 127 ++++ ...14\346\234\272\345\244\215\345\210\266.md" | 9 + ...57\346\234\215\345\212\241\345\231\250.md" | 115 +++ ...57\345\206\231\350\277\233\347\250\213.md" | 49 ++ ...12\350\255\246\346\243\200\346\265\213.md" | 47 ++ ...05\347\220\206\345\273\266\350\277\237.md" | 69 ++ ...42\344\274\230\345\214\226\345\231\250.md" | 99 +++ ...07\346\234\215\345\212\241\345\231\250.md" | 118 ++++ ...357\274\210postgresql-conf\357\274\211.md" | 381 ++++++++++ ...45\346\225\260\346\215\256\345\272\223.md" | 67 ++ .../\345\256\211\350\243\205openGauss.md" | 11 + ...11\350\243\205\345\207\206\345\244\207.md" | 13 + .../Quickstart/\345\256\241\350\256\241.md" | 9 + ...41\350\256\241\345\274\200\345\205\263.md" | 107 +++ ...72\347\234\201\350\256\276\347\275\256.md" | 9 + .../\345\256\271\351\224\231\346\200\247.md" | 99 +++ ...57\345\205\274\345\256\271\346\200\247.md" | 53 ++ ...66\350\241\214\345\257\274\345\205\245.md" | 52 ++ ...72\345\221\230\351\200\211\351\241\271.md" | 657 ++++++++++++++++++ ...77\347\224\250\344\272\247\345\223\201.md" | 17 + .../Quickstart/\345\274\202\346\255\245IO.md" | 111 +++ .../Quickstart/\345\275\222\346\241\243.md" | 50 ++ ...47\350\203\275\347\273\237\350\256\241.md" | 28 + ...72\347\253\213\344\272\222\344\277\241.md" | 312 +++++++++ ...350\241\214\345\215\225\346\235\241SQL.md" | 48 ++ ...47\350\241\214\345\256\211\350\243\205.md" | 209 ++++++ ...71\351\207\217\346\226\207\344\273\266.md" | 22 + ...15\344\275\234\345\256\241\350\256\241.md" | 310 +++++++++ ...07\344\273\266\344\275\215\347\275\256.md" | 63 ++ ...45\345\277\227\345\233\236\346\224\276.md" | 70 ++ ...03\351\231\220\350\265\213\344\272\210.md" | 289 ++++++++ ...23\345\211\215\345\217\226\345\200\274.md" | 70 ++ ...45\347\234\213\345\257\271\350\261\241.md" | 49 ++ ...41\346\224\266\351\233\206\345\231\250.md" | 144 ++++ ...45\350\257\242\350\247\204\345\210\222.md" | 18 + .../\346\243\200\346\237\245\347\202\271.md" | 101 +++ ...60\345\205\274\345\256\271\346\200\247.md" | 7 + ...03\351\231\220\345\256\241\350\256\241.md" | 73 ++ ...22\344\277\241\344\270\242\345\244\261.md" | 222 ++++++ ...36\346\216\245\344\277\241\346\201\257.md" | 49 ++ ...01\347\233\230\347\251\272\351\227\264.md" | 29 + .../Quickstart/\347\244\272\344\276\213-0.md" | 175 +++++ .../Quickstart/\347\244\272\344\276\213.md" | 7 + ...11\345\276\205\344\272\213\344\273\266.md" | 15 + ...60\346\215\256\347\256\241\347\220\206.md" | 9 + ...03\351\231\220\347\256\241\347\220\206.md" | 9 + ...47\350\203\275\345\277\253\347\205\247.md" | 45 ++ ...52\345\212\250\346\270\205\347\220\206.md" | 192 +++++ ...14\345\256\211\350\243\205\345\214\205.md" | 73 ++ ...27\347\232\204\344\275\215\347\275\256.md" | 160 +++++ ...27\347\232\204\345\206\205\345\256\271.md" | 389 +++++++++++ ...27\347\232\204\346\227\266\351\227\264.md" | 183 +++++ .../Quickstart/\350\256\276\347\275\256.md" | 189 +++++ ...5\256openGauss\345\217\202\346\225\260.md" | 7 + ...34\347\250\213\347\231\273\345\275\225.md" | 60 ++ ...46\351\233\206\345\217\202\346\225\260.md" | 8 + ...44\350\257\201\347\255\226\347\225\245.md" | 94 +++ ...72\345\222\214\346\227\266\351\227\264.md" | 20 + ...347\275\221\345\215\241MTU\345\200\274.md" | 8 + ...07\344\273\266\345\217\202\346\225\260.md" | 75 ++ ...55\345\217\245\350\241\214\344\270\272.md" | 248 +++++++ ...37\350\275\275\347\256\241\347\220\206.md" | 376 ++++++++++ ...04\346\272\220\346\266\210\350\200\227.md" | 15 + ...57\344\273\266\346\236\266\346\236\204.md" | 57 ++ ...57\345\242\203\350\246\201\346\261\202.md" | 83 +++ ...14\346\227\266\347\273\237\350\256\241.md" | 7 + ...45\345\222\214\350\256\244\350\257\201.md" | 9 + ...45\346\225\260\346\215\256\345\272\223.md" | 98 +++ ...36\346\216\245\350\256\276\347\275\256.md" | 143 ++++ ...41\345\272\223\345\217\202\346\225\260.md" | 215 ++++++ ...277\207JDBC\346\211\247\350\241\214SQL.md" | 11 + ...56\347\231\275\345\220\215\345\215\225.md" | 27 + ...345\205\267\346\211\247\350\241\214SQL.md" | 7 + ...72\346\234\254\344\277\241\346\201\257.md" | 72 ++ ...73\347\273\237\345\217\202\346\225\260.md" | 502 +++++++++++++ ...02\347\202\271\344\277\241\346\201\257.md" | 83 +++ ...04\351\241\271\347\233\256\345\275\225.md" | 105 +++ ...20\350\241\214\345\217\202\346\225\260.md" | 7 + ...15\350\256\276\345\217\202\346\225\260.md" | 635 +++++++++++++++++ .../\351\224\201\347\256\241\347\220\206.md" | 124 ++++ ...12\345\222\214\346\227\245\345\277\227.md" | 11 + ...31\345\274\217\346\227\245\345\277\227.md" | 11 + ...07\346\234\272\345\217\257\350\257\273.md" | 10 + 137 files changed, 12668 insertions(+) delete mode 100644 content/zh/docs/Quickstart/.keep create mode 100644 content/zh/docs/Quickstart/FAQ.md create mode 100644 "content/zh/docs/Quickstart/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" create mode 100644 "content/zh/docs/Quickstart/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" create mode 100644 "content/zh/docs/Quickstart/JDBC\345\214\205\344\270\216\351\251\261\345\212\250\347\261\273.md" create mode 100644 content/zh/docs/Quickstart/Query.md create mode 100644 content/zh/docs/Quickstart/Quickstart.md delete mode 100644 content/zh/docs/Quickstart/figures/.keep create mode 100644 content/zh/docs/Quickstart/figures/zh-cn_image_0241993991.png create mode 100644 "content/zh/docs/Quickstart/figures/\345\205\270\345\236\213\347\273\204\347\275\221.png" create mode 100644 "content/zh/docs/Quickstart/figures/\345\256\211\350\243\205\346\265\201\347\250\213\345\233\276.png" create 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" create mode 100644 "content/zh/docs/Quickstart/gsql\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245openGauss.md" create mode 100644 "content/zh/docs/Quickstart/openGauss\344\272\213\345\212\241.md" delete mode 100644 content/zh/docs/Quickstart/public_sys-resources/.keep create mode 100644 content/zh/docs/Quickstart/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Quickstart/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Quickstart/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Quickstart/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Quickstart/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Quickstart/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Quickstart/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Quickstart/\344\270\273\346\234\215\345\212\241\345\231\250.md" create mode 100644 "content/zh/docs/Quickstart/\344\272\206\350\247\243\344\272\247\345\223\201.md" create mode 100644 "content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" create mode 100644 "content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" create 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/\344\272\247\345\223\201\347\211\271\347\202\271.md" create mode 100644 "content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" create mode 100644 "content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\346\234\254\345\234\260\350\277\236\346\216\245.md" create mode 100644 "content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\350\277\234\347\250\213\350\277\236\346\216\245.md" create mode 100644 "content/zh/docs/Quickstart/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" create mode 100644 "content/zh/docs/Quickstart/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" create mode 100644 "content/zh/docs/Quickstart/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" create mode 100644 "content/zh/docs/Quickstart/\345\205\266\344\273\226\347\274\272\347\234\201.md" create mode 100644 "content/zh/docs/Quickstart/\345\205\266\345\256\203\351\200\211\351\241\271.md" create mode 100644 "content/zh/docs/Quickstart/\345\205\270\345\236\213\347\273\204\347\275\221.md" create mode 100644 "content/zh/docs/Quickstart/\345\206\205\345\255\230.md" create mode 100644 "content/zh/docs/Quickstart/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" create mode 100644 "content/zh/docs/Quickstart/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Quickstart/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\233\345\273\272\346\225\260\346\215\256\345\272\223.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\233\345\273\272\347\224\250\346\210\267.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\233\345\273\272\350\241\250.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\233\345\273\272\350\247\222\350\211\262.md" create mode 100644 "content/zh/docs/Quickstart/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" create mode 100644 "content/zh/docs/Quickstart/\345\212\240\350\275\275\351\251\261\345\212\250.md" create mode 100644 "content/zh/docs/Quickstart/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" create mode 100644 "content/zh/docs/Quickstart/\345\215\207\347\272\247\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Quickstart/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" create mode 100644 "content/zh/docs/Quickstart/\345\217\214\346\234\272\345\244\215\345\210\266.md" create mode 100644 "content/zh/docs/Quickstart/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" create mode 100644 "content/zh/docs/Quickstart/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" create mode 100644 "content/zh/docs/Quickstart/\345\221\212\350\255\246\346\243\200\346\265\213.md" create mode 100644 "content/zh/docs/Quickstart/\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" create mode 100644 "content/zh/docs/Quickstart/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" create mode 100644 "content/zh/docs/Quickstart/\345\244\207\346\234\215\345\212\241\345\231\250.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\211\350\243\205gsql\345\256\242\346\210\267\347\253\257\345\271\266\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\211\350\243\205openGauss.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\211\350\243\205\345\207\206\345\244\207.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\241\350\256\241\345\274\200\345\205\263.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\345\256\271\351\224\231\346\200\247.md" create mode 100644 "content/zh/docs/Quickstart/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" create mode 100644 "content/zh/docs/Quickstart/\345\271\266\350\241\214\345\257\274\345\205\245.md" create mode 100644 "content/zh/docs/Quickstart/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" create mode 100644 "content/zh/docs/Quickstart/\345\274\200\345\247\213\344\275\277\347\224\250\344\272\247\345\223\201.md" create mode 100644 "content/zh/docs/Quickstart/\345\274\202\346\255\245IO.md" create mode 100644 "content/zh/docs/Quickstart/\345\275\222\346\241\243.md" create mode 100644 "content/zh/docs/Quickstart/\346\200\247\350\203\275\347\273\237\350\256\241.md" create mode 100644 "content/zh/docs/Quickstart/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" create mode 100644 "content/zh/docs/Quickstart/\346\211\247\350\241\214\345\215\225\346\235\241SQL.md" create mode 100644 "content/zh/docs/Quickstart/\346\211\247\350\241\214\345\256\211\350\243\205.md" create mode 100644 "content/zh/docs/Quickstart/\346\211\247\350\241\214\346\211\271\351\207\217\346\226\207\344\273\266.md" create mode 100644 "content/zh/docs/Quickstart/\346\223\215\344\275\234\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Quickstart/\346\226\207\344\273\266\344\275\215\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\346\227\245\345\277\227\345\233\236\346\224\276.md" create mode 100644 "content/zh/docs/Quickstart/\346\235\203\351\231\220\350\265\213\344\272\210.md" create mode 100644 "content/zh/docs/Quickstart/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" create mode 100644 "content/zh/docs/Quickstart/\346\237\245\347\234\213\345\257\271\350\261\241.md" create mode 100644 "content/zh/docs/Quickstart/\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" create mode 100644 "content/zh/docs/Quickstart/\346\237\245\350\257\242\350\247\204\345\210\222.md" create mode 100644 "content/zh/docs/Quickstart/\346\243\200\346\237\245\347\202\271.md" create mode 100644 "content/zh/docs/Quickstart/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" create mode 100644 "content/zh/docs/Quickstart/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Quickstart/\347\224\250\346\210\267\345\234\250openGauss\350\212\202\347\202\271\351\227\264\347\232\204\344\272\222\344\277\241\344\270\242\345\244\261.md" create mode 100644 "content/zh/docs/Quickstart/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Quickstart/\347\243\201\347\233\230\347\251\272\351\227\264.md" create mode 100644 "content/zh/docs/Quickstart/\347\244\272\344\276\213-0.md" create mode 100644 "content/zh/docs/Quickstart/\347\244\272\344\276\213.md" create mode 100644 "content/zh/docs/Quickstart/\347\255\211\345\276\205\344\272\213\344\273\266.md" create mode 100644 "content/zh/docs/Quickstart/\347\256\200\345\215\225\346\225\260\346\215\256\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Quickstart/\347\256\200\345\215\225\346\235\203\351\231\220\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Quickstart/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" create mode 100644 "content/zh/docs/Quickstart/\350\207\252\345\212\250\346\270\205\347\220\206.md" create mode 100644 "content/zh/docs/Quickstart/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256openGauss\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256\345\256\242\346\210\267\347\253\257\350\256\244\350\257\201\347\255\226\347\225\245.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" create mode 100644 "content/zh/docs/Quickstart/\350\256\276\347\275\256\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\350\257\255\345\217\245\350\241\214\344\270\272.md" create mode 100644 "content/zh/docs/Quickstart/\350\264\237\350\275\275\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Quickstart/\350\265\204\346\272\220\346\266\210\350\200\227.md" create mode 100644 "content/zh/docs/Quickstart/\350\275\257\344\273\266\346\236\266\346\236\204.md" create mode 100644 "content/zh/docs/Quickstart/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/Quickstart/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" create mode 100644 "content/zh/docs/Quickstart/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" create mode 100644 "content/zh/docs/Quickstart/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" create mode 100644 "content/zh/docs/Quickstart/\350\277\236\346\216\245\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Quickstart/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\351\200\232\350\277\207JDBC\346\211\247\350\241\214SQL.md" create mode 100644 "content/zh/docs/Quickstart/\351\200\232\350\277\207gs_guc\351\205\215\347\275\256\347\231\275\345\220\215\345\215\225.md" create mode 100644 "content/zh/docs/Quickstart/\351\200\232\350\277\207\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267\346\211\247\350\241\214SQL.md" create mode 100644 "content/zh/docs/Quickstart/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Quickstart/\351\205\215\347\275\256\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/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" create mode 100644 "content/zh/docs/Quickstart/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\351\207\215\350\256\276\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Quickstart/\351\224\201\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Quickstart/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Quickstart/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Quickstart/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" diff --git a/content/zh/docs/Quickstart/.keep b/content/zh/docs/Quickstart/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Quickstart/FAQ.md b/content/zh/docs/Quickstart/FAQ.md new file mode 100644 index 000000000..5b90b47ac --- /dev/null +++ b/content/zh/docs/Quickstart/FAQ.md @@ -0,0 +1,5 @@ +# FAQ + +- **[用户在openGauss节点间的互信丢失](用户在openGauss节点间的互信丢失.md)** + + diff --git "a/content/zh/docs/Quickstart/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/content/zh/docs/Quickstart/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 000000000..01d0c344e --- /dev/null +++ "b/content/zh/docs/Quickstart/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,10 @@ +# GUC使用说明 + +数据库提供了许多运行参数,配置这些参数可以影响数据库系统的行为。在修改这些参数时请确保用户理解了这些参数对数据库的影响,否则可能会导致无法预料的结果。 + +## 注意事项 + +- 参数中如果取值范围为字符串,此字符串应遵循操作系统的路径和文件名命名规则。 +- 取值范围最大值为INT\_MAX的参数,此选项最大值跟所在的操作系统有关。 +- 取值范围最大值为DBL\_MAX的参数,此选项最大值跟所在的操作系统有关。 + diff --git "a/content/zh/docs/Quickstart/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" "b/content/zh/docs/Quickstart/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" new file mode 100644 index 000000000..29470910b --- /dev/null +++ "b/content/zh/docs/Quickstart/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" @@ -0,0 +1,55 @@ +# GUC参数说明 + +- **[GUC使用说明](GUC使用说明.md)** + +- **[文件位置](文件位置.md)** + +- **[连接和认证](连接和认证.md)** + +- **[资源消耗](资源消耗.md)** + +- **[并行导入](并行导入.md)** + +- **[预写式日志](预写式日志.md)** + +- **[双机复制](双机复制.md)** + +- **[查询规划](查询规划.md)** + +- **[错误报告和日志](错误报告和日志.md)** + +- **[告警检测](告警检测.md)** + +- **[运行时统计](运行时统计.md)** + +- **[负载管理](负载管理.md)** + +- **[自动清理](自动清理.md)** + +- **[客户端连接缺省设置](客户端连接缺省设置.md)** + +- **[锁管理](锁管理.md)** + +- **[版本和平台兼容性](版本和平台兼容性.md)** + +- **[容错性](容错性.md)** + +- **[openGauss事务](openGauss事务.md)** + +- **[开发人员选项](开发人员选项.md)** + +- **[审计](审计.md)** + +- **[事务监控](事务监控.md)** + +- **[升级参数](升级参数.md)** + +- **[其它选项](其它选项.md)** + +- **[等待事件](等待事件.md)** + +- **[Query](Query.md)** + +- **[系统性能快照](系统性能快照.md)** + + diff --git "a/content/zh/docs/Quickstart/JDBC\345\214\205\344\270\216\351\251\261\345\212\250\347\261\273.md" "b/content/zh/docs/Quickstart/JDBC\345\214\205\344\270\216\351\251\261\345\212\250\347\261\273.md" new file mode 100644 index 000000000..2cba34bb6 --- /dev/null +++ "b/content/zh/docs/Quickstart/JDBC\345\214\205\344\270\216\351\251\261\345\212\250\347\261\273.md" @@ -0,0 +1,18 @@ +# JDBC包与驱动类 + +## JDBC包 + +从发布包中获取。包名为openGauss-x.x-操作系统版本号-64bit-Jdbc.tar.gz。 + +解压后有两个JDBC的驱动jar包: + +- gsjdbc4.jar:与PostgreSQL保持兼容的驱动包,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统使用。 +- gsjdbc200.jar:如果同一JVM进程内需要同时访问PostgreSQL及openGauss请使用此驱动包,它的主类名为“com.huawei.gauss200.jdbc.Driver”(即将“org.postgresql”替换为“com.huawei.gauss200.jdbc”),数据库连接的URL前缀为“jdbc:gaussdb”,其余与gsjdbc4.jar相同。 + +## 驱动类 + +在创建数据库连接之前,需要加载数据库驱动类“org.postgresql.Driver”(对应包gsjdbc4.jar)或者“com.huawei.gauss200.jdbc.Driver”(对应gsjdbc200.jar)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>由于openGauss在JDBC的使用上与PG的使用方法保持兼容,所以同时在同一进程内使用两个JDBC的驱动的时候,可能会类名冲突。 + diff --git a/content/zh/docs/Quickstart/Query.md b/content/zh/docs/Quickstart/Query.md new file mode 100644 index 000000000..bff986080 --- /dev/null +++ b/content/zh/docs/Quickstart/Query.md @@ -0,0 +1,118 @@ +# Query + +## instr\_unique\_sql\_count + +**参数说明:**控制系统中unique sql信息实时收集功能。配置为0表示不启用unique sql信息收集功能。 + +该值由大变小将会清空系统中原有的数据重新统计;从小变大不受影响。 + +当系统中产生的unique sql信息大于instr\_unique\_sql\_count时,系统产生的unique sql信息不被统计。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整形 0\~INT\_MAX + +**默认值**:100 + +## instr\_unique\_sql\_track\_type + +**参数说明:**unique sql记录SQL方式。 + +该参数属于INTERNAL类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- top:只记录顶层SQL。 + +**默认值**:top + +## enable\_instr\_rt\_percentile + +**参数说明:**是否开启计算系统中80%和95%的SQL响应时间的功能 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示打开sql响应时间信息计算功能。 +- off:表示关闭sql响应时间信息计算功能。 + +**默认值**:on + +## percentile + +**参数说明:**sql响应时间百分比信息,后台计算线程根据设置的值计算相应的百分比信息。 + +该参数属于INTERNAL类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值**:"80,95" + +## instr\_rt\_percentile\_interval + +**参数说明:**sql响应时间信息计算间隔,sql响应时间信息计算功能打开后,后台计算线程每隔设置的时间进行一次计算。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~3600(秒)。 + +**默认值**:10s + +## enable\_instr\_cpu\_timer + +**参数说明:是否捕获sql执行的cpu**时间消耗 。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示捕获sql执行的cpu时间消耗。 +- off:表示不捕获sql执行的cpu时间消耗。 + +**默认值**:on + +## enable\_slow\_query\_log + +**参数说明:是否**将慢查询信息写到日志文件中 。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示需要将慢查询信息写到日志文件中。 +- off:表示不需要将慢查询信息写到日志文件中。 + +**默认值**:on + +## query\_log\_directory + +**参数说明:**GUC参数enable\_slow\_query\_log设置为ON,表示需要将慢查询记录写进日志文件中,query\_log\_directory决定存放服务器慢查询日志文件的目录。 它可以是绝对路径,或者是相对路径(相对于数据目录的路径)。query\_log\_directory支持动态修改,可以通过gs\_guc reload实现。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当配置文件中query\_log\_directory的值为非法路径时,会导致openGauss无法重新启动。 +>- 通过gs\_guc reload动态修改query\_log\_directory时,当指定路径为合法路径时,日志输出到新的路径下。当指定路径为非法路径时,日志输出到上一次合法的日志输出路径下而不影响数据库正常运行。此时即使指定的query\_log\_directory的值非法,也会写入到配置文件中。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>合法路径:用户对此路径有读写权限 +>非法路径:用户对此路径无读写权限 + +**取值范围:**字符串 + +**默认值:**sql\_monitor。 + +## query\_log\_file + +**参数说明:**GUC参数enable\_slow\_query\_log设置为ON,表示需要将慢查询记录写进日志文件中,query\_log\_file决定服务器慢查询日志文件的名称。通常日志文件名是按照strftime模式生成,因此可以用系统时间定义日志文件名,用%转义字符实现。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 建议使用%转义字符定义日志文件名称,否则难以对日志文件进行有效的管理。 + +**取值范围:**字符串 + +**默认值:**postgresql-query-log-%Y-%m-%d\_%H%M%S.log + diff --git a/content/zh/docs/Quickstart/Quickstart.md b/content/zh/docs/Quickstart/Quickstart.md new file mode 100644 index 000000000..d254fd1a3 --- /dev/null +++ b/content/zh/docs/Quickstart/Quickstart.md @@ -0,0 +1,6 @@ +# 快速入门 + +本文档进行简单的产品介绍和安装,支撑用户快速使用数据库,若了解详细特性以及参考类信息需查看具体单本文档。 + + + diff --git a/content/zh/docs/Quickstart/figures/.keep b/content/zh/docs/Quickstart/figures/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Quickstart/figures/zh-cn_image_0241993991.png b/content/zh/docs/Quickstart/figures/zh-cn_image_0241993991.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f5fabba75f4afadc909a3e0383263f2cf03cf6 GIT binary patch literal 20522 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≪aEJe2(Efk*0vLA!Di`tuETp$N1@tn4 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
NH$TN9Rx#T5 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%0AZuTfQ^0^{oK>?j#m2gPYZ}y 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 literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Quickstart/gsql\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245openGauss.md" "b/content/zh/docs/Quickstart/gsql\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245openGauss.md" new file mode 100644 index 000000000..6f1404dcd --- /dev/null +++ "b/content/zh/docs/Quickstart/gsql\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245openGauss.md" @@ -0,0 +1,9 @@ +# gsql客户端连接openGauss + +- **[确认连接信息](确认连接信息.md)** + +- **[使用gsql本地连接](使用gsql本地连接.md)** + +- **[使用gsql远程连接](使用gsql远程连接.md)** + + diff --git "a/content/zh/docs/Quickstart/openGauss\344\272\213\345\212\241.md" "b/content/zh/docs/Quickstart/openGauss\344\272\213\345\212\241.md" new file mode 100644 index 000000000..540896dff --- /dev/null +++ "b/content/zh/docs/Quickstart/openGauss\344\272\213\345\212\241.md" @@ -0,0 +1,124 @@ +# openGauss事务 + +介绍openGauss事务隔离、事务只读、最大prepared事务数、维护模式目的参数设置及取值范围等内容。 + +## transaction\_isolation + +**参数说明:**设置当前事务的隔离级别。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,只识别以下字符串,大小写空格敏感: + +- serializable:openGauss中等价于REPEATABLE READ。 +- read committed:只能读取已提交的事务的数据(缺省),不能读取到未提交的数据。 +- repeatable read:仅能读取事务开始之前提交的数据,不能读取未提交的数据以及在事务执行期间由其它并发事务提交的修改。 +- read uncommitted:读未提交,可以读取任何时刻的数据。 +- default:设置为defualt\_transaction\_isolation所设隔离级别。 + +**默认值:**read committed + +## transaction\_read\_only + +**参数说明:**设置当前事务是只读事务。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示设置当前事务为只读事务。 +- off表示该事务可以是非只读事务。 + +**默认值:**off + +## xc\_maintenance\_mode + +**参数说明:**设置系统进入维护模式。 + +该参数属于SUSET类型参数,仅支持[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中的方式三进行设置。 + +**取值范围:**布尔型 + +- on表示该功能启用。 +- off表示该功能被禁用。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>谨慎打开这个开关,避免引起openGauss数据不一致。 + +**默认值:**off + +## allow\_concurrent\_tuple\_update + +**参数说明:**设置是否允许并发更新。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示该功能启用。 +- off表示该功能被禁用。 + +**默认值:**on + +## pgxc\_node\_name + +**参数说明:**指定节点名称。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值:**当前节点名称。 + +## transaction\_deferrable + +**参数说明:**指定是否允许一个只读串行事务延迟执行,使其不会执行失败。该参数设置为on时,当一个只读事务发现读取的元组正在被其他事务修改,则延迟该只读事务直到其他事务修改完成。目前,openGauss暂时未用到这个参数。与该参数类似的还有一个[default\_transaction\_deferrable](语句行为.md#zh-cn_topic_0242371522_zh-cn_topic_0237124732_zh-cn_topic_0059779117_s031e2bbea2cf42a5a1c24e6dbaa70365),设置它来指定一个事务是否允许延迟。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许执行。 +- off表示不允许执行。 + +**默认值:**off + +## enforce\_two\_phase\_commit + +**参数说明:**强制使用两阶段提交,为了兼容历史版本功能保留该参数,当前版本设置无效。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示强制使用两阶段提交。 +- off表示不强制使用两阶段提交。 + +**默认值:**on + +## enable\_show\_any\_tuples + +**参数说明:**该参数只有在只读事务中可用,用于分析。当这个参数被置为on/true时,表中元组的所有版本都会可见。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示表中元组的所有版本都会可见。 +- off/false表示表中元组的所有版本都不可见。 + +**默认值:**off + +## replication\_type + +**参数说明:**标记当前HA模式是主备从模式还是一主多备模式。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0\~3 + +- 1 表示使用一主多备模式。 +- 0 表示主备从模式。 + +**默认值:**1 + diff --git a/content/zh/docs/Quickstart/public_sys-resources/.keep b/content/zh/docs/Quickstart/public_sys-resources/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Quickstart/public_sys-resources/icon-caution.gif b/content/zh/docs/Quickstart/public_sys-resources/icon-caution.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/Quickstart/public_sys-resources/icon-danger.gif b/content/zh/docs/Quickstart/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/Quickstart/public_sys-resources/icon-note.gif b/content/zh/docs/Quickstart/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/Quickstart/public_sys-resources/icon-notice.gif b/content/zh/docs/Quickstart/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/Quickstart/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Quickstart/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..9442b96a8 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\270\200\344\270\273\344\270\200\345\244\207\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,46 @@ +# 一主一备配置文件 + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + diff --git "a/content/zh/docs/Quickstart/\344\270\273\346\234\215\345\212\241\345\231\250.md" "b/content/zh/docs/Quickstart/\344\270\273\346\234\215\345\212\241\345\231\250.md" new file mode 100644 index 000000000..5551b69da --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\270\273\346\234\215\345\212\241\345\231\250.md" @@ -0,0 +1,144 @@ +# 主服务器 + +## synchronous\_standby\_names + +**参数说明:**潜在同步复制的备机名称列表,每个名称用逗号分隔。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当前连接的同步备机是列表中的第一个名称。如果当前同步备机失去连接,则它会立即更换下一个优先级更高的备机,并将此备机的名称放入列表中。 +>- 备机名称可以通过设置环境变量PGAPPNAME指定。 + +**取值范围:**字符串。当取值为\*,表示不启用同步复制。 + +**默认值:**\* + +## most\_available\_sync + +**参数说明:**指定在备机同步失败时,是否阻塞主机。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在备机同步失败时,不阻塞主机。 +- off表示在备机同步失败时,阻塞主机。 + +**默认值**:off + +## enable\_stream\_replication + +**参数说明:**控制主备、主从是否进行数据和日志同步。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 此参数属于性能测试参数,用于测试带有备机和不带备机的性能参数。关闭参数后,不能进行升级、切换、故障等异常场景测试,否则会出现主备从不一致的情况。 +>- 此参数属于受控参数,不建议正常业务场景下关闭此参数。 + +**取值范围:**布尔型 + +- on表示打开主备、主从同步。 +- off表示关闭主备、主从同步。 + +**默认值**:on + +## enable\_mix\_replication + +**参数说明:**控制主备、主从之间WAL日志及数据复制的方式。 + +该参数属于INTERNAL类型参数,默认值为off,不允许外部修改。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数属于内部参数,目前不允许正常业务场景下改变其值,即关闭WAL日志、数据页混合复制模式。 + +**取值范围:**布尔型 + +- on表示打开WAL日志、数据页混合复制模式。 +- off表示关闭WAL日志、数据页混合复制模式。 + +**默认值**:off + +## vacuum\_defer\_cleanup\_age + +**参数说明:**指定VACUUM使用的事务数,VACUUM会延迟清除无效的行存表记录,延迟的事务个数通过vacuum\_defer\_cleanup\_age进行设置。即VACUUM和VACUUM FULL操作不会立即清理刚刚被删除元组。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~1000000,值为0表示不延迟。 + +**默认值**:0 + +## data\_replicate\_buffer\_size + +**参数说明:**发送端与接收端传递数据页时,队列占用内存的大小。此参数会影响主备之间复制的缓冲大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,4096\~1072693248,单位为KB。 + +**默认值:**128MB(即131072KB) + +## walsender\_max\_send\_size + +**参数说明:**设置主机端日志或数据发送缓冲区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,8\~INT\_MAX,单位为KB。 + +**默认值:**8M(即8192KB) + +## enable\_data\_replicate + +**参数说明:**当数据库在数据导入行存表时,主机与备机的数据同步方式可以进行选择。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示导入数据行存表时主备数据采用数据页的方式进行同步。当replication\_type参数为1时,不允许设置为on,如果此时用guc工具设置成on,会强制改为off。 +- off表示导入数据行存表时主备数据采用日志(Xlog)方式进行同步。 + +**默认值:**off + +## ha\_module\_debug + +**参数说明:**用于查看数据复制时具体数据块的复制状态日志。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示日志中将打印数据复制时每个数据块的状态。 +- off表示日志中不打印数据复制时每个数据块的状态。 + +**默认值:**off + +## enable\_incremental\_catchup + +**参数说明:**控制主备之间数据追赶(catchup)的方式。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示备机catchup时用增量catchup方式,即从从备本地数据文件扫描获得主备差异数据文件列表,进行主备之间的catchup。 +- off表示备机catchup时用全量catchup方式,即从主机本地所有数据文件扫描获得主备差异数据文件列表,进行主备之间的catchup。 + +**默认值**:on + +## wait\_dummy\_time + +**参数说明:**同时控制增量数据追赶(catchup)时,openGauss主备从按顺序启动时等待从备启动的最长时间以及等待从备发回扫描列表的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,范围1\~INT\_MAX,单位为秒 + +**默认值**:300 + +>![](public_sys-resources/icon-note.gif) **说明:** +>单位只能设置为秒。 + diff --git "a/content/zh/docs/Quickstart/\344\272\206\350\247\243\344\272\247\345\223\201.md" "b/content/zh/docs/Quickstart/\344\272\206\350\247\243\344\272\247\345\223\201.md" new file mode 100644 index 000000000..0be631f40 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\272\206\350\247\243\344\272\247\345\223\201.md" @@ -0,0 +1,11 @@ +# 了解产品 + +openGauss是关系型数据库,采用客户端/服务器,单进程多线程架构,支持单机和一主多备部署方式,备机可读,支持双机高可用和读扩展。 + +- **[产品特点](产品特点.md)** +openGauss相比其他开源数据库主要有复合应用场景,、高性能和高可用等产品特点。 +- **[软件架构](软件架构.md)** +openGauss主要包含了openGauss服务器,客户端驱动,OM等模块,本章将介绍这些模块之间的相互关系。 +- **[典型组网](典型组网.md)** +为了保证整个应用数据的安全性,建议将openGauss的典型组网划分为两个独立网络:前端业务网络和数据管理存储网络。 + diff --git "a/content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" "b/content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" new file mode 100644 index 000000000..6ea4ae462 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\346\265\201\347\250\213.md" @@ -0,0 +1,56 @@ +# 了解安装流程 + +本章节通过流程图简要介绍openGauss的安装流程。 + +openGauss的安装流程如[图1](#zh-cn_topic_0242552150_fig18264185162412)所示。 + +**图 1** 安装流程图 +![](figures/安装流程图.png "安装流程图") + +**表 1** 安装流程图说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

流程

+

说明

+

安装前准备

+

openGauss安装前需要准备相应的软硬件环境以及相关配置。

+

文档提供了openGauss安装所需的最低要求,实际安装中,请用户根据实际情况进行规划。

+

更多信息,请参考安装准备

+

获取并校验安装包

+

安装包需要在官方网站上下载并且对安装包进行校验,详细请参见获取并校验安装包

+

配置XML文件

+

安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场配置对应的XML文件。

+

关于如何配置XML文件,详细请参见创建XML配置文件

+

初始化安装环境

+

安装环境的初始化包含上传安装包和XML文件、解压安装包、使用gs_preinstall准备好安装环境。

+

关于如何初始化安装环境,详细请参见初始化安装环境

+

执行安装

+

使用gs_install安装openGauss。

+

关于如何执行安装,详细请参见执行安装

+

设置备机可读

+

可选操作。在开启备机可读之后,备机将支持读操作,并满足数据一致性要求。

+
+ diff --git "a/content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" "b/content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" new file mode 100644 index 000000000..9b8dfb879 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\272\206\350\247\243\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\224\250\346\210\267\347\273\204.md" @@ -0,0 +1,37 @@ +# 了解安装用户及用户组 + +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性。安装脚本在安装过程中会自动按照用户指定创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + + + + + + + + + + + + + + + + +

用户/组名

+

所属类型

+

规划建议

+

dbgrp

+

操作系统

+

建议规划单独的用户组,例如dbgrp

+

初始化安装环境时,由-G参数所指定的安装用户所属的用户组。该用户组如果不存在,则会自动创建,也可提前创建好用户组。在执行gs_preinstall脚本时会检查权限。gs_preinstall脚本会自动赋予此组中的用户对安装目录、数据目录的访问和执行权限。

+

创建dbgrp用户组命令:

+
groupadd dbgrp
+

omm

+

操作系统

+

建议规划用户用于运行和维护openGauss,例如omm。

+

初始化安装环境时,由-U参数所指定和自动创建的操作系统用户,如果已经存在该用户,请清理该用户或更换初始化用户。从安全性考虑,对此用户的所属组规划如下:

+

所属组:dbgrp

+
+ +在安装openGauss过程中运行“gs\_preinstall”时,会创建与安装用户同名的数据库用户,即数据库用户omm。此用户具备数据库的最高操作权限,openGauss为此用户设置的初始密码为GaussDB@2012。为了保证系统的安全性,请及时修改密码。或在安装后通过设置GUC参数modify\_initial\_password为on启用强制修改初始密码特性。启用后,使用此用户首次连接数据库时,系统会强制要求修改此密码。关于GUC参数的修改方法请参见《openGauss 开发者指南》中的“GUC参数说明“。 + diff --git "a/content/zh/docs/Quickstart/\344\272\213\345\212\241\347\233\221\346\216\247.md" "b/content/zh/docs/Quickstart/\344\272\213\345\212\241\347\233\221\346\216\247.md" new file mode 100644 index 000000000..4c46de03b --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\272\213\345\212\241\347\233\221\346\216\247.md" @@ -0,0 +1,29 @@ +# 事务监控 + +通过设置事务超时预警,可以监控自动回滚的事务并定位其中的语句问题,并且也可以监控执行时间过长的语句。 + +## 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_0242371525_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_0242370406_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/Quickstart/\344\272\247\345\223\201\347\211\271\347\202\271.md" "b/content/zh/docs/Quickstart/\344\272\247\345\223\201\347\211\271\347\202\271.md" new file mode 100644 index 000000000..a196a5a2d --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\272\247\345\223\201\347\211\271\347\202\271.md" @@ -0,0 +1,19 @@ +# 产品特点 + +openGauss相比其他开源数据库主要有复合应用场景,、高性能和高可用等产品特点。 + +- 复合应用场景 + - 行存储,支持业务数据频繁更新场景。 + - 列存储,支持业务数据追加和分析场景。 + - 内存表,支持高吞吐,低时延,极高性能场景。 + +- 高性能 + - 通过多核数据结构,增量检查点,大内存缓冲区管理实现百万级tpmC。 + - 服务端连接池,支持万级并发。 + +- 高可用 + - 支持主备同步,异步多种部署模式。 + - 数据页CRC校验,损坏数据页通过备机自动修复。 + - 备机并行恢复,10秒内可升主提供服务。 + + diff --git "a/content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" "b/content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" new file mode 100644 index 000000000..5d437de40 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" @@ -0,0 +1,87 @@ +# 优化器开销常量 + +介绍优化器开销常量。这里描述的开销可以按照任意标准度量。只关心其相对值,因此以相同的系数缩放它们将不会对优化器的选择产生任何影响。缺省时,它们以抓取顺序页的开销为基本单位。也就是说将seq\_page\_cost设为1.0,同时其他开销参数以它为基准设置。也可以使用其他基准,比如以毫秒计的实际执行时间。 + +## seq\_page\_cost + +**参数说明**:设置优化器计算一次顺序磁盘页面抓取的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:1 + +## random\_page\_cost + +**参数说明**:设置优化器计算一次非顺序抓取磁盘页面的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>虽然服务器允许将random\_page\_cost设置的比seq\_page\_cost小,但是物理上实际不受影响。如果所有数据库都位于随机访问内存中时,两者设置为相等很合理。因为在此种情况下,非顺序抓取页并没有副作用。同样,在缓冲率很高的数据库上,应该相对于CPU参数同时降低这两个值,因为获取内存中的页要比通常情况下开销小很多。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:4 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 对于特别表空间中的表和索引,可以通过设置同名的表空间的参数来覆盖这个值。 +>- 相对于seq\_page\_cost,减少这个值将导致系统更倾向于使用索引扫描,而增加这个值使得索引扫描开销比较高。可以通过同时增加或减少这两个值来调整磁盘I/O相对于CPU的开销。 + +## cpu\_tuple\_cost + +**参数说明**:设置优化器计算在一次查询中处理每一行数据的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0.01 + +## cpu\_index\_tuple\_cost + +**参数说明**:设置优化器计算在一次索引扫描中处理每条索引的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0.005 + +## cpu\_operator\_cost + +**参数说明**:设置优化器计算一次查询中执行一个操作符或函数的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0.0025 + +## effective\_cache\_size + +**参数说明**:设置优化器在一次单一的查询中可用的磁盘缓冲区的有效大小。 + +设置这个参数,还要考虑openGauss的共享缓冲区以及内核的磁盘缓冲区。另外,还要考虑预计的在不同表之间的并发查询数目,因为它们将共享可用的空间。 + +这个参数对openGauss分配的共享内存大小没有影响,它也不会使用内核磁盘缓冲,它只用于估算。数值是用磁盘页来计算的,通常每个页面是8192字节。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX,单位为8KB。 + +比默认值高的数值可能会导致使用索引扫描,更低的数值可能会导致选择顺序扫描。 + +**默认值**:128MB + +## allocate\_mem\_cost + +**参数说明**:设置优化器计算Hash Join创建Hash表开辟内存空间所需的开销,供Hash join估算不准时调优使用。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0 + diff --git "a/content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" "b/content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" new file mode 100644 index 000000000..560e6a65f --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" @@ -0,0 +1,335 @@ +# 优化器方法配置 + +这些配置参数提供了影响查询优化器选择查询规划的原始方法。如果优化器为特定的查询选择的缺省规划并不是最优的,可以通过使用这些配置参数强制优化器选择一个不同的规划来临时解决这个问题。更好的方法包括调节优化器开销常量、手动运行ANALYZE、增加配置参数default\_statistics\_target的值、增加使用ALTER TABLE SET STATISTICS为指定列增加收集的统计信息。 + +## enable\_bitmapscan + +**参数说明**:控制优化器对位图扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## force\_bitmapand + +**参数说明**:控制优化器强制使用bitmapand规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_hashagg + +**参数说明**:控制优化器对Hash聚集规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_hashjoin + +**参数说明**:控制优化器对Hash连接规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_indexscan + +**参数说明**:控制优化器对索引扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_indexonlyscan + +**参数说明**:控制优化器对仅索引扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_material + +**参数说明**:控制优化器对实体化的使用。消除整个实体化是不可能的,但是可以关闭这个变量以防止优化器插入实体节点。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_mergejoin + +**参数说明**:控制优化器对融合连接规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_nestloop + +**参数说明**:控制优化器对内表全表扫描嵌套循环连接规划类型的使用。完全消除嵌套循环连接是不可能的,但是关闭这个变量就会让优化器在存在其他方法的时候优先选择其他方法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_index\_nestloop + +**参数说明**:控制优化器对内表参数化索引扫描嵌套循环连接规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_seqscan + +**参数说明**:控制优化器对顺序扫描规划类型的使用。完全消除顺序扫描是不可能的,但是关闭这个变量会让优化器在存在其他方法的时候优先选择其他方法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_sort + +**参数说明**:控制优化器使用的排序步骤。完全消除明确的排序是不可能的,但是关闭这个变量可以让优化器在存在其他方法的时候优先选择其他方法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_tidscan + +**参数说明**:控制优化器对TID扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_kill\_query + +**参数说明**:CASCADE模式删除用户时,会删除此用户拥有的所有对象。此参数标识是否允许在删除用户的时候,取消锁定此用户所属对象的query。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示允许取消锁定。 +- off表示不允许取消锁定。 + +**默认值**:off + +## enforce\_a\_behavior + +**参数说明:**控制正则表达式的规则匹配模式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示正则表达式采用A格式的匹配规则。 +- off表示正则表达式采用POSIX格式的匹配规则。 + +**默认值:**on + +## max\_recursive\_times + +**参数说明**:控制with recursive的最大迭代次数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX。 + +**默认值**:200 + +## enable\_vector\_engine + +**参数说明**:控制优化器对向量化执行引擎的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_broadcast + +**参数说明**:控制优化器对stream代价估算时对broadcast分布方式的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_change\_hjcost + +**参数说明**:控制优化器在Hash Join代价估算路径选择时,是否使用将内表运行时代价排除在Hash Join节点运行时代价外的估算方式。如果使用,则有利于选择条数少,但运行代价大的表做内表。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_absolute\_tablespace + +**参数说明:**控制表空间是否可以使用绝对路径。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示可以使用绝对路径。 +- off表示不可以使用绝对路径。 + +**默认值:**on + +## enable\_valuepartition\_pruning + +**参数说明:**是否对DFS分区表进行静态/动态优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示对DFS分区表进行静态/动态优化。 +- off表示不对DFS分区表进行静态/动态优化。 + +**默认值:**on + +## expected\_computing\_nodegroup + +**参数说明**:标识选定的计算Node Group模式或目标计算Node Group。Node Group目前为内部用机制,用户无需设置。 + +共4种计算Node Group模式,用于关联操作和聚集操作时选定计算Node Group。在每一种模式中,优化器有针对性地选定几个候选计算Node Group,然后根据代价,从中为当前算子挑选最佳计算Node Group。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- optimal:候选计算Node Group列表包含算子操作对象所在的Node Group和由当前用户具有COMPUTE权限的所有Node Group包含的数据库节点构成的Node Group +- query:候选计算Node Group列表包含算子操作对象所在的Node Group和由当前查询涉及的所有基表所在Node Group包含的数据库节点构成的Node Group +- Node Group名([enable\_nodegroup\_debug](#zh-cn_topic_0242371506_zh-cn_topic_0237124716_section1426622145210)被设置为off):候选计算Node Group列表包含算子操作对象所在的Node Group和该指定的Node Group +- Node Group名([enable\_nodegroup\_debug](#zh-cn_topic_0242371506_zh-cn_topic_0237124716_section1426622145210)被设置为on):候选计算Node Group为指定的Node Group + +**默认值**:query + +## enable\_nodegroup\_debug + +**参数说明**:控制优化器在多Node Group环境下,是否使用强制弹性计算。Node Group目前为内部用机制,用户无需设置。 + +该参数只在[expected\_computing\_nodegroup](#zh-cn_topic_0242371506_zh-cn_topic_0237124716_section746841514523)被设置为具体Node Group时生效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示强制将计算弹性到expected\_computing\_nodegroup所指定的Node Group进行计算。 +- off表示不强制使用某个Node Group进行计算。 + +**默认值**:off + +## qrw\_inlist2join\_optmode + +**参数说明**:控制是否使用inlist-to-join查询重写。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- disable:关闭inlist2join查询重写。 +- cost\_base:基于代价的inlist2join查询重写。 +- rule\_base:基于规则的inlist2join查询重写,即强制使用inlist2join查询重写。 +- 任意正整数:inlist2join查询重写阈值,即list内元素个数大于该阈值,进行inlist2join查询重写。 + +**默认值**:cost\_base + +## skew\_option + +**参数说明**:控制是否使用优化策略。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- off:关闭策略。 +- normal:采用激进策略。对于不确定是否出现倾斜的场景,认为存在倾斜,并进行相应优化。 +- lazy:采用保守策略。对于不确定是否出现倾斜场景,认为不存在倾斜,不进行优化。 + +**默认值**:normal + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" new file mode 100644 index 000000000..d6d8c7148 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\275\277\347\224\250CSV\346\240\274\345\274\217\345\206\231\346\227\245\345\277\227.md" @@ -0,0 +1,187 @@ +# 使用CSV格式写日志 + +## 前提条件 + +- [log\_destination](zh-cn_topic_0237124721.md#zh-cn_topic_0059778787_sb6c9884f69bd4765a60f80810c94f194)的值设置为csvlog。 +- [logging\_collector](zh-cn_topic_0237124721.md#zh-cn_topic_0059778787_s61d6090c04ee464fb54f8b31936ba818)的值设置为on。 + +## csvlog定义 + +以“逗号分隔值” 即CSV(Comma Separated Value)的形式发出日志。 + +以下是简单的用来存储CSV形式日志输出的表定义: + +``` +CREATE TABLE postgres_log +( +log_time timestamp(3) with time zone, +user_name text, +database_name text, +process_id integer, +connection_from text, +"session_id" text, +session_line_num bigint, +command_tag text, +session_start_time timestamp with time zone, +virtual_transaction_id text, +transaction_id bigint, +error_severity text, +sql_state_code text, +message text, +detail text, +hint text, +internal_query text, +internal_query_pos integer, +context text, +query text, +query_pos integer, +location text, +application_name text, +PRIMARY KEY ("transaction_id", session_line_num) +); +``` + +详细说明请参见[表1](#zh-cn_topic_0242371514_zh-cn_topic_0237124724_zh-cn_topic_0059779007_zh-cn_topic_0058967802_table44188316)。 + +**表 1** csvlog字段含义表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

字段名

+

字段含义

+

字段名

+

字段含义

+

log_time

+

毫秒级的时间戳

+

sql_state_code

+

SQLSTATE代码

+

user_name

+

用户名

+

message

+

错误消息

+

database_name

+

数据库名

+

detail

+

详细错误消息

+

process_id

+

进程ID

+

hint

+

提示

+

connection_from

+

客户主机:端口号

+

internal_query

+

内部查询(查询那些导致错误的信息,如果有的话)

+

session_id

+

会话ID

+

internal_query_pos

+

内部查询指针

+

session_line_num

+

每个会话的行数

+

context

+

环境

+

command_tag

+

命令标签

+

query

+

错误发生位置的字符统计

+

session_start_time

+

会话开始时间

+

query_pos

+

错误发生位置指针

+

virtual_transaction_id

+

常规事务

+

location

+

openGauss源代码中错误的位置(如果log_error_verbosity的值设为verbose )

+

transaction_id

+

事务ID

+

application_name

+

应用名称

+

error_state_code

+

ERRORSTATE代码

+

-

+

-

+
+ +使用COPY FROM命令将日志文件导入这个表: + +``` +COPY postgres_log FROM '/opt/data/pg_log/logfile.csv' WITH csv; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>此处的日志名“logfile.csv”要换成实际生成的日志的名称。 + +## 简化输入 + +简化输入到CSV日志文件,可以通过如下操作: + +- 设置[log\_filename](zh-cn_topic_0237124721.md#zh-cn_topic_0059778787_s3226ae3209154e249928c24ec67c5809)和[log\_rotation\_age](zh-cn_topic_0237124721.md#zh-cn_topic_0059778787_s3ce09b8a7ae543b18fae13a821a725a5),为日志文件提供一个一致的、可预测的命名方案。通过日志文件名,预测一个独立的日志文件完成并进入准备导入状态的时间。 +- 将[log\_rotation\_size](zh-cn_topic_0237124721.md#zh-cn_topic_0059778787_s282e72143bb14915bedb4b432586b07e)设为0来终止基于尺寸的日志回滚,因为基于尺寸的日志回滚让预测日志文件名变得非常的困难。 +- 将[log\_truncate\_on\_rotation](zh-cn_topic_0237124721.md#zh-cn_topic_0059778787_s143b6d35ddbe48b8810106a4d3929e8a)设为on以便区分在同一日志文件中旧的日志数据和新的日志数据。 +- [表1](#zh-cn_topic_0242371514_zh-cn_topic_0237124724_zh-cn_topic_0059779007_zh-cn_topic_0058967802_table44188316)包含了一个特定的主键,对防止意外导致导入两次相同的信息起到保护作用。COPY命令要求所有的数据在同一时间进行导入,所以在COPY过程中出现的所有错误都会导致整个导入失败。多次对同一日志文件进行导入会发生主键冲突,导致导入失败,请等到日志文件写入完成后再执行导入。设置主键也会限制日志没有写完整时部分日志的导入。 + diff --git "a/content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\346\234\254\345\234\260\350\277\236\346\216\245.md" "b/content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\346\234\254\345\234\260\350\277\236\346\216\245.md" new file mode 100644 index 000000000..b2de42714 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\346\234\254\345\234\260\350\277\236\346\216\245.md" @@ -0,0 +1,57 @@ +# 使用gsql本地连接 + +gsql是openGaussopenGauss提供的在命令行下运行的数据库连接工具。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节只介绍如何使用gsql连接数据库,关于gsql使用方法的更多信息请参考gsql。 + +## 注意事项 + +缺省情况下,客户端连接数据库后长期处于空闲状态,不会自动断开连接。 + +如果要开启自动断开功能,设置参数session\_timeout非0即可。 + +## 前提条件 + +已[确认连接信息](确认连接信息.md)。 + +## 本地连接数据库 + +1. 以操作系统用户omm登录数据库主节点。 +2. 连接数据库。 + + 数据库安装完成后,默认生成名称为postgres的数据库。第一次连接数据库时可以连接到此数据库。 + + 执行如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 -r + ``` + + 其中,postgres为需要连接的数据库名称,8000为数据库主节点的端口号。请根据实际情况做替换。 + + 连接成功后,系统显示如下信息: + + ``` + gsql ((openGauss V300R002C00 build 50dc16a6) compiled at 2019-01-29 05:49:21 commit 1071 last mr 1373) + Type "help" for help. + + postgres=# + ``` + + omm用户是管理员用户,因此系统显示“DBNAME=\#”。若使用普通用户身份登录和连接数据库,系统显示“DBNAME=\>”。 + + 如果显示如下信息,表示未使用SSL方式连接数据库。如果需要高安全性时,建议使用SSL连接。SSL连接配置过程详见产品文档。 + + ``` + gsql ((openGauss V300R002C00 build 50dc16a6) compiled at 2019-01-29 05:49:21 commit 1071 last mr 1373) + Non-SSL connection (SSL connection is recommended when requiring high-security) + Type "help" for help. + + postgres=# + ``` + +3. 退出数据库。 + + ``` + postgres=# \q + ``` + + diff --git "a/content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\350\277\234\347\250\213\350\277\236\346\216\245.md" "b/content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\350\277\234\347\250\213\350\277\236\346\216\245.md" new file mode 100644 index 000000000..1139d22b7 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\275\277\347\224\250gsql\350\277\234\347\250\213\350\277\236\346\216\245.md" @@ -0,0 +1,7 @@ +# 使用gsql远程连接 + +- **[通过gs\_guc配置白名单](通过gs_guc配置白名单.md)** + +- **[安装gsql客户端并连接数据库](安装gsql客户端并连接数据库.md)** + + diff --git "a/content/zh/docs/Quickstart/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" "b/content/zh/docs/Quickstart/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" new file mode 100644 index 000000000..f6d0646c4 --- /dev/null +++ "b/content/zh/docs/Quickstart/\344\277\256\346\224\271\346\223\215\344\275\234\347\263\273\347\273\237\351\205\215\347\275\256.md" @@ -0,0 +1,13 @@ +# 修改操作系统配置 + +- **[关闭操作系统防火墙](关闭操作系统防火墙.md)** +为了在防火墙开启的状态下,确保openGauss的正常使用。用户需要将同openGauss相关的服务、协议、IP以及端口添加到openGauss各主机的防火墙白名单中。 +- **[设置字符集参数](设置字符集参数.md)** + +- **[设置时区和时间](设置时区和时间.md)** + +- **[关闭swap交换内存](关闭swap交换内存.md)** + +- **[设置网卡MTU值](设置网卡MTU值.md)** + + diff --git "a/content/zh/docs/Quickstart/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" "b/content/zh/docs/Quickstart/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" new file mode 100644 index 000000000..200415d52 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\205\263\351\227\255swap\344\272\244\346\215\242\345\206\205\345\255\230.md" @@ -0,0 +1,8 @@ +# 关闭swap交换内存 + +在各数据库节点上,使用swapoff -a命令将交换内存关闭。 + +``` +swapoff -a +``` + diff --git "a/content/zh/docs/Quickstart/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" "b/content/zh/docs/Quickstart/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" new file mode 100644 index 000000000..c3a0f37bf --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\205\263\351\227\255\346\223\215\344\275\234\347\263\273\347\273\237\351\230\262\347\201\253\345\242\231.md" @@ -0,0 +1,96 @@ +# 关闭操作系统防火墙 + +为了在防火墙开启的状态下,确保openGauss的正常使用。用户需要将同openGauss相关的服务、协议、IP以及端口添加到openGauss各主机的防火墙白名单中。 + +以openEuler操作系统为例,假设openGauss信息如[表1](#zh-cn_topic_0242552154_zh-cn_topic_0241802566_zh-cn_topic_0085434636_zh-cn_topic_0059782018_table4312170510523)所示。 + +**表 1** openGauss信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

主机名称

+

内部IP

+

外部IP

+

plat1

+

192.168.0.11

+

10.10.0.11

+

plat2

+

192.168.0.12

+

10.10.0.12

+

plat3

+

192.168.0.13

+

10.10.0.13

+

plat4

+

192.168.0.14

+

10.10.0.14

+

管理网络

+

-

+

10.10.64.236

+
+ +## 操作步骤 + +目前仅支持在防火墙关闭的状态下进行安装。 + +1. 检查防火墙是否关闭。 + + ``` + systemctl status firewalld + ``` + + 若防火墙未关闭,请执行[2](#zh-cn_topic_0242552154_zh-cn_topic_0241802566_zh-cn_topic_0085434636_zh-cn_topic_0059782018_li11887129193617); + + 若防火墙已关闭,则无需再关闭防火墙。 + +2. 关闭防火墙。 + + ``` + systemctl stop firewalld.service + ``` + +3. 修改/etc/selinux/config文件中的“SELINUX“值为“disabled“。 + 1. 使用VIM打开config文件。 + + ``` + vim /etc/selinux/config + ``` + + 2. 修改“SELINUX“的值“disabled“。 + + ``` + SELINUX=disabled + ``` + +4. 重新启动操作系统。 + + ``` + reboot + ``` + +5. 在其他主机上重复步骤1到步骤3。 + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" new file mode 100644 index 000000000..2e41e33a3 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\205\266\344\273\226\344\274\230\345\214\226\345\231\250\351\200\211\351\241\271.md" @@ -0,0 +1,345 @@ +# 其他优化器选项 + +## default\_statistics\_target + +**参数说明**:为没有用ALTER TABLE SET STATISTICS设置字段目标的表设置缺省统计目标。此参数设置为正数是代表统计信息的样本数量,为负数时,代表使用百分比的形式设置统计目标,负数转换为对应的百分比,即-5代表5%。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-100~10000。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 比默认值大的正数数值增加了ANALYZE所需的时间,但是可能会改善优化器的估计质量。 +>- 调整此参数可能存在性能劣化的风险,如果某个查询劣化,可以考虑 +> 1. 恢复默认的统计信息。 +> 2. 使用plan hint来调整到之前的查询计划。 +>- 当此guc参数设置为负数时,如果计算的采样样本数大于等于总数据量的2%,且用户表的数据量小于1600000时,ANALYZE所需时间相比guc参数为默认值的时间会有所增加。 +>- 当此guc参数设置为负数时,则autoanalyze不生效。 + +**默认值**:100 + +## constraint\_exclusion + +**参数说明**:控制查询优化器使用表约束查询的优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型 + +- on表示检查所有表的约束。 +- off表示不检查约束。 +- partition表示只检查继承的子表和UNION ALL子查询。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >当constraint\_exclusion为on,优化器用查询条件和表的CHECK约束比较,并且在查询条件和约束冲突的时候忽略对表的扫描。 + + +**默认值**:partition + +>![](public_sys-resources/icon-note.gif) **说明:** +>目前, constraint\_exclusion缺省被打开,通常用来实现表分区。为所有的表打开它时,对于简单的查询强加了额外的规划,并且对简单查询没有什么好处。如果不用分区表,可以关掉它。 + +## cursor\_tuple\_fraction + +**参数说明**:优化器估计游标获取行数在总行数中的占比。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0.0~1.0。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>比默认值小的值与使用 “fast start” 为游标规划的值相偏离,从而使得前几行恢复的很快而抓取全部的行需要很长的时间。比默认值大的值加大了总的估计的时间。在最大的值1.0处,像正常的查询一样规划游标,只考虑总的估计时间和传送第一行的时间。 + +**默认值**:0.1 + +## from\_collapse\_limit + +**参数说明**:根据生成的FROM列表的项数来判断优化器是否将把子查询合并到上层查询,如果FROM列表项个数小于等于该参数值,优化器会将子查询合并到上层查询。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>比默认值小的数值将降低规划时间,但是可能生成差的执行计划。 + +**默认值**:8 + +## join\_collapse\_limit + +**参数说明**:根据得出的列表项数来判断优化器是否执行把除FULL JOINS之外的JOIN构造重写到FROM列表中。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 设置为1会避免任何JOIN重排。这样就使得查询中指定的连接顺序就是实际的连接顺序。查询优化器并不是总能选取最优的连接顺序,高级用户可以选择暂时把这个变量设置为1,然后指定它们需要的连接顺序。 +>- 比默认值小的数值减少规划时间但也降低了执行计划的质量。 + +**默认值**:8 + +## plan\_mode\_seed + +**参数说明**:该参数为调测参数,目前仅支持OPTIMIZE\_PLAN和RANDOM\_PLAN两种。其中:OPTIMIZE\_PLAN表示通过动态规划算法进行代价估算的最优plan,参数值设置为0;RANDOM\_PLAN表示随机生成的plan;如果设置为-1,表示用户不指定随机数的种子标识符seed值,由优化器随机生成\[1, 2147483647\]范围整型值的随机数,并根据随机数生成随机的执行计划;如果用户指定guc参数值为\[1, 2147483647\]范围的整型值,表示指定的生成随机数的种子标识符seed,优化器需要根据seed值生成随机的执行计划。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-1\~ 2147483647 + +**默认值**:0 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当该参数设置为随机执行计划模式时,优化器会生成不同的随机执行计划,该执行计划可能不是最优计划。因此在随机计划模式下,会对查询性能产生影响,所以建议在升级、扩容、缩容等正常业务操作或运维过程中将该参数保持为默认值0。 +>- 当该参数不为0时,查询指定的plan hint不会生效。 + +## hashagg\_table\_size + +**参数说明**:用于设置执行HASH JOIN操作时HASH表的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX/2。 + +**默认值**:0 + +## enable\_codegen + +**参数说明:**标识是否允许开启代码生成优化,目前代码生成使用的是LLVM优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许开启代码生成优化。 +- off表示不允许开启代码生成优化。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >目前LLVM优化仅支持向量化执行引擎特性和SQL on Hadoop特性,在其他场景下建议关闭此参数。 + + +**默认值:**on + +## codegen\_strategy + +**参数说明:**标识在表达式codegen化过程中所使用的代码生成优化策略。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- partial表示当所计算表达式中即使包含部分未被codegen化的函数时,仍可借助表达式全codegen框架调用LLVM动态编译优化策略。 +- pure表示当所计算表达式整体可被codegen化时,才考虑调用LLVM动态编译优化策略。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >在开启代码生成优化会导致查询性能下降的场景下可以设置此参数为pure,其他场景下建议不改变此参数的默认值partial。 + + +**默认值:**partial + +## enable\_codegen\_print + +**参数说明:**标识是否允许在log日志中打印所生成的LLVM IR函数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许在log日志中打印IR函数。 +- off表示不允许在log日志中打印IR函数。 + +**默认值:**off + +## codegen\_cost\_threshold + +**参数说明:**由于LLVM编译生成最终的可执行机器码需要一定时间,因此只有当实际执行的代价大于编译生成机器码所需要的代码和优化后的执行代价之和时,利用代码生成才有收益。codegen\_cost\_threshold标识代价的阈值,当执行估算代价大于该代价时,使用LLVM优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ 2147483647。 + +**默认值:**10000 + +## enable\_bloom\_filter + +**参数说明: **标识是否允许使用BloomFilter优化。该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许使用BloomFilter优化。 +- off表示不允许使用BloomFilter优化。 + +**默认值:**on + +## enable\_extrapolation\_stats + +**参数说明: **标识对于日期类型是否允许基于历史统计信息使用推理估算的逻辑。使用该逻辑对于未及时收集统计信息的表可以增大估算准确的可能性,但也存在错误推理导致估算过大的可能性,需要对于日期类型数据定期插入的场景开启此开关。该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许基于历史统计信息使用推理估算的逻辑。 +- off表示不允许基于历史统计信息使用推理估算的逻辑。 + +**默认值:**off + +## autoanalyze + +**参数说明: **标识是否允许在生成计划的时候,对于没有统计信息的表进行统计信息自动收集。对于外表和临时表,不支持autoanalyze,如果需要收集统计信息,用户需手动执行analyze操作。如果在auto analyze某个表的过程中数据库发生异常,当数据库正常运行之后再执行语句有可能仍提示需要收集此表的统计信息。此时需要用户对该表手动执行一次analyze操作,以同步统计信息数据。该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许自动进行统计信息收集。 +- off表示不允许自动进行统计信息收集。 + +**默认值:**off + +## query\_dop + +**参数说明: **用户自定义的查询并行度。该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_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的表,检查该表是否曾进行过统计信息收集。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许检查。 +- off表示不允许检查。 + +**默认值:**on + +## enable\_sonic\_hashagg + +**参数说明:**标识是否依据规则约束使用基于面向列的hash表设计的Hash Agg算子。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在满足约束条件时使用基于面向列的hash表设计的Hash Agg算子。 +- off表示不使用面向列的hash表设计的Hash Agg算子。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 在开启enable\_sonic\_hashagg,且查询达到约束条件使用基于面向列的hash表设计的Hash Agg算子时,查询对应的Hash Agg算子内存使用通常可获得精简。但对于代码生成技术可获得显著性能提升的场景\([enable\_codegen](#zh-cn_topic_0242371509_zh-cn_topic_0237124719_zh-cn_topic_0059779049_sbe5e1dbabf214873baf37dbb7580a7a3)打开后获得较大性能提升\),对应的算子查询性能可能会出现劣化。 +>- 开启enable\_sonic\_hashagg,且查询达到约束条件使用基于面向列的hash表设计的Hash Agg算子时,在Explain Analyze/Performance的执行计划和执行信息中,算子显示为“Sonic Hash Aggregation”,而未达到该约束条件时,算子名称将显示为“Hash Aggregation”。 + +**默认值:**on + +## enable\_sonic\_hashjoin + +**参数说明:**标识是否依据规则约束使用基于面向列的hash表设计的Hash Join算子。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在满足约束条件时使用基于面向列的hash表设计的Hash Join算子。 +- off表示不使用面向列的hash表设计的Hash Join算子。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 当前开关仅适用于Inner Join的场景。 +>- 在开启enable\_sonic\_hashjoin,查询对应的Hash Inner算子内存使用通常可获得精简。但对于代码生成技术可获得显著性能提升的场景,对应的算子查询性能可能会出现劣化。 +>- 开启enable\_sonic\_hashjoin,且查询达到约束条件使用基于面向列的hash表设计的Hash Join算子时,在Explain Analyze/Performance的执行计划和执行信息中,算子显示为“Sonic Hash Join”,而未达到该约束条件时,算子名称将显示为“Hash Join”。 + +**默认值:**on + +## enable\_sonic\_optspill + +**参数说明:**标识是否对面向列的hash表设计的Hash Join算子进行下盘文件数优化。该参数打开时,在Hash Join算子下盘文件较多的时候,下盘文件数不会显著增加。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示优化面向列的hash表设计的Hash Join算子的下盘文件数。 +- off表示不优化面向列的hash表设计的Hash Join算子的下盘文件数。 + +**默认值:**on + +## log\_parser\_stats + +**参数说明**:控制优化器输出parser模块的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## log\_planner\_stats + +**参数说明**:控制优化器输出planner模块的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## log\_executor\_stats + +**参数说明**:控制优化器输出executor模块的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## log\_statement\_stats + +**参数说明**:控制优化器输出该语句的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## plan\_cache\_mode + +**参数说明**:标识在prepare语句中,选择生成执行计划的策略。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型 + +- auto表示按照默认的方式选择custom plan或者generic plan。 +- force\_generic\_plan表示强制走generic plan。 +- force\_custom\_plan表示强制走custom plan。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 此参数只对prepare语句生效,一般用在prepare语句中参数化字段存在比较严重的数据倾斜的场景下。 +>- custom plan是指对于preapre语句,在执行execute的时候,把execute语句中的参数嵌套到语句之后生成的计划。custom plan会根据execute语句中具体的参数生成计划,这种方案的优点是每次都按照具体的参数生成优选计划,执行性能比较好;缺点是每次执行前都需要重新生成计划,存在大量的重复的优化器开销。 +>- generic plan是指对于preapre语句生成计划,该计划策略会在执行execute语句的时候把参数bind到plan中,然后执行计划。这种方案的优点是每次执行可以省去重复的优化器开销;缺点是当bind参数字段上数据存在倾斜时该计划可能不是最优的,部分bind参数场景下执行性能较差。 + +**默认值**:auto + diff --git "a/content/zh/docs/Quickstart/\345\205\266\344\273\226\347\274\272\347\234\201.md" "b/content/zh/docs/Quickstart/\345\205\266\344\273\226\347\274\272\347\234\201.md" new file mode 100644 index 000000000..eb4ec1a85 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\205\266\344\273\226\347\274\272\347\234\201.md" @@ -0,0 +1,48 @@ +# 其他缺省 + +主要介绍数据库系统默认的库加载参数。 + +## dynamic\_library\_path + +**参数说明:**设置数据查找动态加载的共享库文件的路径。当需要打开一个可以动态装载的模块并且在CREATE FUNCTION或LOAD命令里面声明的名称没有目录部分时,系统将搜索这个目录以查找声明的文件。 + +用于dynamic\_library\_path的数值必须是一个冒号分隔的绝对路径列表。当一个路径名称以特殊变量$libdir为开头时,会替换为openGauss发布提供的模块安装路径。例如: + +``` +dynamic_library_path = '/usr/local/lib/postgresql:/opt/testgs/lib:$libdir' +``` + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>设置为空字符串,表示关闭自动路径搜索。 + +**默认值:**$libdir + +## gin\_fuzzy\_search\_limit + +**参数说明:**设置GIN索引返回的集合大小的上限。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0\~2147483647 + +**默认值:**0 + +## local\_preload\_libraries + +**参数说明:**指定一个或多个共享库,它们在开始连接前预先加载。多个加载库之间用逗号分隔,除了双引号,所有的库名都转换为小写。 + +- 并非只有系统管理员才能更改此选项,因此只能加载安装的标准库目录下plugins子目录中的库文件,数据库管理员有责任确保该目录中的库都是安全的。local\_preload\_libraries中指定的项可以明确含有该目录,例如$libdir/plugins/mylib;也可以仅指定库的名称,例如mylib(等价于$libdir/plugins/mylib)。 +- 与shared\_preload\_libraries不同,在会话开始之前加载模块与在会话中使用到该模块的时候临时加载相比并不具有性能优势。相反,这个特性的目的是为了调试或者测量在特定会话中不明确使用LOAD加载的库。例如针对某个用户将该参数设为ALTER USER SET来进行调试。 +- 当指定的库未找到时,连接会失败。 +- 每一个支持openGauss的库都有一个“magic block”用于确保兼容性,因此不支持openGauss的库不能通过这个方法加载。 + +该参数属于BACKEND类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + diff --git "a/content/zh/docs/Quickstart/\345\205\266\345\256\203\351\200\211\351\241\271.md" "b/content/zh/docs/Quickstart/\345\205\266\345\256\203\351\200\211\351\241\271.md" new file mode 100644 index 000000000..af140c8aa --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\205\266\345\256\203\351\200\211\351\241\271.md" @@ -0,0 +1,401 @@ +# 其它选项 + +## server\_version + +**参数说明:**报告服务器版本号\(字符串形式\)。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**字符串 + +**默认值:**9.2.4 + +## server\_version\_num + +**参数说明:**报告服务器版本号\(整数形式\)。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**整数 + +**默认值:**90204 + +## block\_size + +**参数说明:**报告当前数据库所使用的块大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**8192 + +**默认值:**8192 + +## segment\_size + +**参数说明:**报告当前数据库所使用的段文件大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**131072 + +## max\_index\_keys + +**参数说明:**报告当前数据库能够支持的索引键值的最大数目。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**32 + +## integer\_datetimes + +**参数说明:**报告是否支持64位整数形式的日期和时间格式。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**布尔型 + +- on表示支持。 +- off表示不支持。 + +**默认值:**on + +## lc\_collate + +**参数说明:**报告当前数据库的字符串排序区域设置。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**依赖于openGauss安装部署时的配置 + +## lc\_ctype + +**参数说明:**报告当前数据库的字母类别区域设置。如:哪些字符属于字母,它对应的大写形式是什么。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**依赖于openGauss安装部署时的配置 + +## max\_identifier\_length + +**参数说明:**报告当前系统允许的标识符最大长度。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**整型 + +**默认值:**63 + +## server\_encoding + +**参数说明:**报告当前数据库的服务端编码字符集。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**在创建数据库的时候决定的。 + +## enable\_upgrade\_merge\_lock\_mode + +**参数说明:**当该参数设置为on时,通过提升deltamerge内部实现的锁级别,避免和update/delete并发操作时的报错。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:** 布尔型 + +- on,提升deltamerge内部实现的锁级别,并发执行deltamerge和update/delete操作时,一个操作先执行,另一个操作被阻塞,在前一个操作完成后,后一个操作再执行。 +- off,在对表的delta table的同一行并发执行deltamerge和update/delete操作时,后一个对同一行数据更新的操作会报错退出。 + +**默认值:**off + +## job\_queue\_processes + +**参数说明:**表示系统可以并发执行的job数目。该参数为postmaster级别,通过gs\_guc设置,需要重启gaussdb才能生效。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0~1000 + +功能: + +- 当job\_queue\_processes设置为0值,表示不启用定时任务功能,任何job都不会被执行(因为开启定时任务的功能会对系统的性能有影响,有些局点可能不需要定时任务的功能,可以通过设置为0不启用定时任务功能)。 +- 当job\_queue\_processes为大于0时,表示启用定时任务功能且系统能够并发处理的最大任务数。 + +启用定时任务功能后,job\_scheduler线程会在定时时间间隔轮询pg\_job系统表,系统设置定时任务检查周期默认为1s。 + +由于并行运行的任务数太多会消耗更多的系统资源,因此需要设置系统并发处理的任务数,当前并发的任务数达到job\_queue\_processes时,且此时又有任务到期,那么这些任务本次得不到执行而延期到下一轮询周期。因此,建议用户需要根据每个任务的执行时长合理的设置任务的时间间隔(即submit接口中的interval参数),来避免由于任务执行时间太长而导致下个轮询周期无法正常执行。 + +注:如果同一时间内并行的job数很多,过小的参数值会导致job等待。而过大的参数值则消耗更多的系统资源,建议设置此参数为100,用户可以根据系统资源情况合理调整。 + +**默认值:**10 + +## ngram\_gram\_size + +**参数说明:**ngram解析器分词的长度。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型 ,1~4 + +**默认值:**2 + +## ngram\_grapsymbol\_ignore + +**参数说明:**ngram解析器是否忽略图形化字符。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示忽略图形化字符。 +- off表示不忽略图形化字符。 + +**默认值:**off + +## ngram\_punctuation\_ignore + +**参数说明:**ngram解析器是否忽略标点符号。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示忽略标点符号。 +- off表示不忽略标点符号。 + +**默认值:**on + +## transparent\_encrypted\_string + +**参数说明:**它存储的是透明加密的一个样本串,使用数据库加密密钥加密固定串“TRANS\_ENCRYPT\_SAMPLE\_STRING”后的密文,用来校验二次启动时获取的DEK是否正确。如果校验失败,那么数据库节点将拒绝启动。该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,设置为空表示openGauss非加密。 + +**默认值:**空 + +>![](public_sys-resources/icon-note.gif) **说明:** +>请勿手动设置该参数,设置不当将导致openGauss不可用。 + +## transparent\_encrypt\_kms\_url + +**参数说明:**它存储的是透明加密的数据库密钥获取地址,内容要求不可出现RFC3986标准外的字符,最大长度2047字节。格式为“kms://协议@KMS主机名1;KMS主机名2:KMS端口号/kms”,例如 kms://https@linux175:29800/。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## transparent\_encrypt\_kms\_region + +**参数说明:**它存储的是openGauss的部署区域,内容要求不可出现RFC3986标准外的字符,最大长度2047字节。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## behavior\_compat\_options + +**参数说明:**数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 当前只支持[表1](#zh-cn_topic_0242371544_zh-cn_topic_0237124754_table182861153114812)。 +>- 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set behavior\_compat\_options='end\_month\_calculate,display\_leading\_zero'; + +**表 1** 兼容性配置项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

兼容性配置项

+

兼容性行为控制

+

display_leading_zero

+

浮点数显示配置项。

+
  • 不设置此配置项时,对于-1~0和0~1之间的小数,不显示小数点前的0。比如,0.25显示为.25。
  • 设置此配置项时,对于-1~0和0~1之间的小数,显示小数点前的0。比如,0.25显示为0.25。
+

end_month_calculate

+

add_months函数计算逻辑配置项。

+

假定函数add_months的两个参数分别为param1和param2,param1的月份和param2的和为月份result。

+
  • 不设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期小,计算结果中的日期字段(Day字段)和param1的日期字段保持一致。比如,
+
postgres=# select add_months('2018-02-28',3) from dual;
+add_months
+---------------------
+2018-05-28 00:00:00
+(1 row)
+
  • 设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期比小,计算结果中的日期字段(Day字段)和result的月末日期保持一致。比如,
+
postgres=# select add_months('2018-02-28',3) from dual;
+add_months
+---------------------
+2018-05-31 00:00:00
+(1 row)
+

compat_analyze_sample

+

analyze采样行为配置项。

+

设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时DBnode端的内存消耗,保证analyze性能的稳定性。

+

bind_schema_tablespace

+

绑定模式与同名表空间配置项。

+

如果存在与模式名sche_name相同的表空间名,那么如果设置search_path为sche_name, default_tablespace也会同步切换到sche_name。

+

bind_procedure_searchpath

+

未指定模式名的数据库对象的搜索路径配置项。

+

在存储过程中如果不显示指定模式名,会优先在存储过程所属的模式下搜索。

+

如果找不到,则有两种情况:

+
  • 若不设置此参数,报错退出。
  • 若设置此参数,按照search_path中指定的顺序继续搜索。如果还是找不到,报错退出。
+

correct_to_number

+

控制to_number()结果兼容性的配置项。

+

若设置此配置项,则to_number()函数结果与pg11保持一致,否则默认与a db保持一致。

+

unbind_dive_bound

+

控制对整数除法的结果进行范围校验。

+

若设置此配置项,则不需要对除法结果做范围校验,例如,INT_MIN/(-1)可以得到输出结果为INT_MAX+1,反之,则会因为超过结果大于INT_MAX而报越界错误。

+

merge_update_multi

+

控制merge into匹配多行时是否进行update操作。

+

若设置此配置项,匹配多行时update不报错,否则默认与a db保持一致,报错。

+

return_null_string

+

控制函数lpad()和rpad()结果为空字符串''的显示配置项。

+
  • 不设置此配置项时,空字符串显示为NULL。
+
postgres=# select length(lpad('123',0,'*')) from dual;
+length
+--------
+
+(1 row)
+
  • 设置此配置项时,空字符串显示为''。
+
postgres=# select length(lpad('123',0,'*')) from dual;
+length
+--------
+0
+(1 row)
+

compat_concat_variadic

+

控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。

+

若设置此配置项,当concat函数参数为variadic类型时,保留a db和Teradata兼容模式下不同的结果形式;否则默认a db和Teradata兼容模式下结果相同,且与a db保持一致。由于mysql无variadic类型,所以该选项对MySQL无影响。

+

merge_update_multi

+

控制在使用MERGE INTO ... WHEN MATCHED THEN UPDATE(参考MERGE INTO) 和INSERT ... ON DUPLICATE KEY UPDATE(参考INSERT)时,当目标表中一条目标数据与多条源数据冲突时UPDATE行为。

+

若设置此配置项,当存在上述场景时,该冲突行将会多次执行UPDATE;否则(默认)报错,即MERGE或INSERT操作失败。

+
+ +## table\_skewness\_warning\_threshold + +**参数说明**:设置用于表倾斜告警的阈值。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~1 + +**默认值**:1 + +## table\_skewness\_warning\_rows + +**参数说明**:设置用于表倾斜告警的行数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX + +**默认值**:100000 + +## datanode\_heartbeat\_interval + +**参数说明**:设置心跳线程间心跳消息发送时间间隔,建议值不超过wal\_receiver\_timeout / 2。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1000~60000(毫秒) + +**默认值**:1s + +## pagewriter\_thread\_num + +**参数说明**:设置用于增量检查点打开后后台刷页的线程数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~8 + +**默认值**:2 + +## pagewriter\_threshold + +**参数说明**:设置用于增量检查点打开后脏页数量达到这个数值时,后台刷页线程将一直刷脏页,不sleep。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX + +**默认值**:818 + +## pagewriter\_sleep + +**参数说明**:设置用于增量检查点打开后,脏页数量不足pagewriter\_threshold时,后台刷页线程将sleep设置的时间继续刷页。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~3600000(毫秒) + +**默认值**:100ms + +## remote\_read\_mode + +参数说明:远程读功能开关。读取主机上的页面失败时可以从备机上读取对应的页面。 + +取值范围:枚举类型 + +- off表示关闭远程读功能 +- non\_authentication表示开启远程读功能,但不进行证书认证 +- authentication表示开启远程读功能,但要进行证书认证 + +默认值:authentication + +## enable\_tsdb + +**参数说明:**是否开启时序数据库特性。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示打开时序数据库特性功能。 +- off:表示关闭时序数据库特性功能。 + +**默认值**:off + +>![](public_sys-resources/icon-note.gif) **说明:** +>开启时序数据库特性后如果需要关闭该特性请谨慎考虑,因为关闭后会对原有业务流量有影响 + diff --git "a/content/zh/docs/Quickstart/\345\205\270\345\236\213\347\273\204\347\275\221.md" "b/content/zh/docs/Quickstart/\345\205\270\345\236\213\347\273\204\347\275\221.md" new file mode 100644 index 000000000..84ba11648 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\205\270\345\236\213\347\273\204\347\275\221.md" @@ -0,0 +1,43 @@ +# 典型组网 + +为了保证整个应用数据的安全性,建议将openGauss的典型组网划分为两个独立网络:前端业务网络和数据管理存储网络。 + +**图 1** 典型组网 +![](figures/典型组网.png "典型组网") + +网络划分说明如[表1](#zh-cn_topic_0085434654_zh-cn_topic_0059782024_tb80dc4a120b64f6093f63535ce9998ef)所示。 + +**表 1** 网络划分 + + + + + + + + + + + + + +

类型

+

描述

+

数据库管理存储网络

+

DBA通过此网络调用OM脚本管理和维护openGauss实例。同时,用于openGauss主备通信组网。数据库管理存储网络也是应用执行系统监控的网络。

+

前端业务网络

+

外部客户端通过此网络访问openGauss数据库。

+
+ +该典型组网有如下优点: + +- 业务网络与数据库管理存储网络的隔离,有效保护了后端存储数据的安全。 +- 业务网络和数据库管理存储网络的隔离,可以防止攻击者通过互联网试图对数据库服务器进行管理操作,增加了系统安全性。 + +网络独占性及1:1的带宽收敛比是openGauss数据库网络性能的基本要求。因此,在生产系统中,对[图1](#zh-cn_topic_0085434654_zh-cn_topic_0059782024_fa885dc600f6a4c38860244454d95c7e4)中的后端存储网络,需满足独占性及至少1:1收敛比的要求。例如,[图2](#zh-cn_topic_0085434654_zh-cn_topic_0059782024_fig397545395542)中,其本质是Fattree组网方式。为实现收敛比1:1,交换网络层级每提高一层,带宽增加一倍。图中每根加粗连接线代表80GE带宽,即8台物理机带宽上限之和。接入层每单台交换机下行带宽160GE,上行带宽160GE,收敛比1:1;汇聚层每单台交换机接入带宽320GE。 + +对于测试系统,上述要求可以适当降低。 + +**图 2** 数据库管理存储网络组网示例 +![](figures/数据库管理存储网络组网示例.png "数据库管理存储网络组网示例") + diff --git "a/content/zh/docs/Quickstart/\345\206\205\345\255\230.md" "b/content/zh/docs/Quickstart/\345\206\205\345\255\230.md" new file mode 100644 index 000000000..53c3a0730 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\206\205\345\255\230.md" @@ -0,0 +1,281 @@ +# 内存 + +介绍与内存相关的参数设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这些参数只能在数据库服务重新启动后生效。 + +## memorypool\_enable + +**参数说明**:设置是否允许使用内存池。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示允许使用内存池。 +- off表示不允许使用内存池。 + +**默认值**:off + +## memorypool\_size + +**参数说明**:设置内存池大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_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_0242370406_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_0242370406_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_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示启用最大内存上下文限制检查功能。 +- off表示关闭最大内存上下文限制检查功能。 + +**默认值:**off + +## uncontrolled\_memory\_context + +**参数说明:**启用检查内存上下文是否超过给定限制的功能时,设置不受此功能约束。仅适用于DEBUG版本。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +查询时会在参数值的最前面添加标题含义字符串“MemoryContext white list:”"。 + +**取值范围**:字符串 + +**默认值:**空 + +## shared\_buffers + +**参数说明:**设置openGauss使用的共享内存大小。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_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_0242370406_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_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**双精度类型,0.1\~1.0 + +**默认值:**0.3 + +## temp\_buffers + +**参数说明:**设置每个数据库会话使用的LOCAL临时缓冲区的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_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_0242370406_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_0242370406_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_0242370406_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_0242370406_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_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024\~INT\_MAX,单位为KB。 + +**默认值:**128MB + +**设置建议:** + +- 建议设置此参数的值大于[work\_mem](#zh-cn_topic_0242371489_zh-cn_topic_0237124699_zh-cn_topic_0059777577_sd27c81d651ce4d2585febca76c4cc34e),可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。 +- 当[自动清理](自动清理.md#ZH-CN_TOPIC_0244544107)进程运行时,[autovacuum\_max\_workers](自动清理.md#zh-cn_topic_0242371520_zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)倍数的内存将会被分配,所以此时设置maintenance\_work\_mem的值应该不小于[work\_mem](#zh-cn_topic_0242371489_zh-cn_topic_0237124699_zh-cn_topic_0059777577_sd27c81d651ce4d2585febca76c4cc34e)。 +- 如果进行大数据量的cluster等,可以在session中调大该值。 + +## psort\_work\_mem + +**参数说明:**设置列存表在进行局部排序中在开始写入临时磁盘文件之前使用的内存大小。带partial cluster key的表、带索引的表插入,创建表索引,删除表和更新表都会用到。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_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_0242370406_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_0242370406_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_0242370406_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_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,256\~2147483647,单位为KB。 + +**默认值:**16MB + diff --git "a/content/zh/docs/Quickstart/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" "b/content/zh/docs/Quickstart/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" new file mode 100644 index 000000000..2d066286b --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" @@ -0,0 +1,34 @@ +# 内核资源使用 + +介绍与操作系统内核相关的参数,这些参数是否生效依赖于操作系统的设置。 + +## max\_files\_per\_process + +**参数说明:**设置每个服务器进程允许同时打开的最大文件数目。如果操作系统内核强制一个合理的数目,则不需要设置。 + +但是在一些平台上(特别是大多数BSD系统),内核允许独立进程打开比系统真正可以支持的数目大得多得文件数。如果用户发现有的“Too many open files”这样的失败现象,请尝试缩小这个设置。通常情况下需要满足,系统FD(file descriptor)数量\>=最大并发数\*数据库节点个数\*max\_files\_per\_process\*3。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,25\~2147483647。 + +**默认值:**1000 + +## shared\_preload\_libraries + +**参数说明:**此参数用于声明一个或者多个在服务器启动的时候预先装载的共享库,多个库名称之间用逗号分隔。比如 '$libdir/mylib' 会在加载标准库目录中的库文件之前预先加载mylib.so(某些平台上可能是mylib.sl)库文件。 + +可以用这个方法预先装载openGauss的存储过程库,通常是使用 '$libdir/plXXX' 语法。XXX只能是pgsql,perl,tcl,python之一。 + +通过预先装载一个共享库并在需要的时候初始化它,可以避免第一次使用这个库的加载时间。但是启动每个服务器进程的时间可能会增加,即使进程从来没有使用过这些库。因此建议对那些将被大多数会话使用的库才使用这个选项。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果被声明的库不存在,openGauss服务将会启动失败。 +>- 每一个支持openGauss的库都有一个特殊的标记用于保证兼容性。因此,不支持openGauss的库不能用这种方法加载。 + +**取值范围:**字符串 + +**默认值:**空 + diff --git "a/content/zh/docs/Quickstart/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" "b/content/zh/docs/Quickstart/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" new file mode 100644 index 000000000..550849bba --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\207\206\345\244\207\345\256\211\350\243\205\347\224\250\346\210\267\345\217\212\347\216\257\345\242\203.md" @@ -0,0 +1,353 @@ +# 准备安装用户及环境 + +创建完openGauss配置文件后,在执行安装前,为了后续能以最小权限进行安装及openGauss管理操作,保证系统安全性,需要运行安装前置脚本gs\_preinstall准备好安装用户及环境。 + +安装前置脚本gs\_preinstall可以协助用户自动完成如下的安装环境准备工作: + +- 自动设置Linux内核参数以达到提高服务器负载能力的目的。这些参数直接影响数据库系统的运行状态,请仅在确认必要时调整。openGauss所设置的Linux内核参数取值请参见[配置操作系统参数](配置操作系统参数.md#ZH-CN_TOPIC_0244544062)。 +- 自动将openGauss配置文件、安装包拷贝到openGauss主机的相同目录下。 +- openGauss安装用户、用户组不存在时,自动创建安装用户以及用户组。 +- 读取openGauss配置文件中的目录信息并创建,将目录权限授予安装用户。 + +## 前提条件 + +- 已完成[安装准备](安装准备.md#ZH-CN_TOPIC_0244544038)的所有任务。 + +## 注意事项 + +- 用户需要检查上层目录权限,保证安装用户对安装包和配置文件目录读写执行的权限。 +- xml文件中各主机的名称与IP映射配置正确。 +- 只能使用root用户执行gs\_preinstall命令。 + +## 操作步骤 + +1. 以root用户登录待安装openGauss的任意主机,并按规划创建存放安装包的目录。 + + ``` + mkdir -p /opt/software/openGauss + chmod 755 -R /opt/software + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 不建议把安装包的存放目录规划到openGauss用户的家目录或其子目录下,可能导致权限问题。 + >- openGauss用户须具有/opt/software/openGauss目录的读写权限。 + +2. 以release包为例,将安装包“openGauss\_x.x.x\_PACKAGES\_RELEASE.tar.gz”和配置文件“clusterconfig.xml”都上传至上一步所创建的目录中。 +3. 在安装包所在的目录下,解压安装包。 + + ``` + cd /opt/software/openGauss + tar -zxvf openGauss_x.x.x_PACKAGES_RELEASE.tar.gz + ``` + + 解压后的安装包说明见[表1](#zh-cn_topic_0244176941_zh-cn_topic_0241805803_zh-cn_topic_0085434653_zh-cn_topic_0059781995_te4a9d557337c400c85acff184476a722)。 + + **表 1** 安装包说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

包名

+

说明

+

openGauss-x.x.x-openEULER-64bit-ClientTools.tar.gz

+

用于Linux的客户端工具安装包。含gsql、dump restore tool、ODBC驱动、JDBC驱动、Libpq库。

+

openGauss-x.x.x-openEULER-64bit-Jdbc.tar.gz

+

用于Linux的JDBC驱动安装包。

+

openGauss-x.x.x-openEULER-64bit-Libpq.tar.gz

+

用于Linux的libpq库。

+

openGauss-x.x.x-openEULER-64bit-Odbc.tar.gz

+

用于Linux的ODBC驱动安装包。

+

openGauss-x.x.x-openEULER-64bit-symbol.tar.gz

+

用于调试和定位数据库问题的支持文件。

+

openGauss-x.x.x-openEULER-64bit.tar.gz

+

数据库管理系统安装包。即本手册使用的安装包。

+

openGauss-x.x.x-Sslcert.tar.gz

+

用于客户端服务器认证的证书。

+

openGauss-x.x.x-Inspection.tar.gz

+

用于检查数据库健康状况的巡检工具。

+
+ +4. 对openGauss-x.x.x-openEULER-64bit.tar.gz进行解压。 + + ``` + tar -zxvf openGauss-x.x.x-openEULER-64bit.tar.gz + ``` + + 安装包解压后,会在/opt/software/openGauss路径下自动生成script子目录,并且在script目录下生成gs\_preinstall等各种OM工具脚本。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 在执行前置脚本gs\_preinstall时,需要规划好openGauss配置文件路径、安装包存放路径、程序安装目录、实例数据目录,后续普通用户使用过程中不能再更改这些路径。 + >- 运行前置脚本gs\_preinstall准备安装环境时,脚本内部会自动将openGauss配置文件、解压后的安装包同步拷贝到其余服务器的相同目录下。 + >- 在执行前置或者互信前,请检查/etc/profile文件中是否包含错误输出信息,如果存在错误输出,需手动处理。 + +5. 进入到工具脚本存放目录下。 + + ``` + cd /opt/software/openGauss/script + ``` + +6. 如果是openEuler的操作系统,执行如下命令打开performance.sh文件,用\#注释sysctl -w vm.min\_free\_kbytes=112640 &\> /dev/null,键入“ESC”键进入指令模式,执行**:wq**保存并退出修改。 + + ``` + vi /etc/profile.d/performance.sh + ``` + +7. 为确保openssl版本正确,执行预安装前请加载安装包中lib库。执行命令如下,其中_\{packagePath\}_为用户安装包放置的路径,本示例中为/opt/software/openGauss。 + + ``` + export LD_LIBRARY_PATH={packagePath}/script/gspylib/clib:$LD_LIBRARY_PATH + ``` + +8. 为确保成功安装,检查 hostname 与 /etc/hostname 是否一致。预安装过程中,会对hostname进行检查。 +9. 使用gs\_preinstall准备好安装环境。若为共用环境需加入--sep-env-file=ENVFILE参数分离环境变量避免与其他用户相互影响,ENVFILE为用户自行指定的环境变量分离文件的路径。 + - 采用交互模式执行前置,并在执行过程中自动创建root用户互信和openGauss用户互信: + + ``` + python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml + ``` + + omm为数据库管理员(也是运行openGauss的操作系统用户),dbgrp为运行openGauss的操作系统用户的群组名称,/opt/software/openGauss/clusterconfig.xml为openGauss配置文件路径。在执行过程中,用户根据提示选择是否创建互信,并输入root用户或openGauss用户的密码。 + + - 不允许创建root用户互信时,创建omm用户,在各主机上执行本地模式前置,然后用户手动创建openGauss用户互信: + 1. 执行下面命令准备安装环境。 + + ``` + cd /opt/software/openGauss/script + python gs_preinstall -U omm -G dbgrp -L -X /opt/software/openGauss/clusterconfig.xml + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >此操作需要在每台主机上执行该命令。 + + + - 采用非交互模式执行前置: + 1. 参考[手工建立互信](手工建立互信.md#ZH-CN_TOPIC_0244544061)章节手工建立root用户互信和openGauss用户互信。 + 2. 执行下面命令准备安装环境。 + + ``` + cd /opt/software/openGauss/script + python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml --non-interactive + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 此模式要求用户确保在执行前,已经建立了各节点root用户互信和openGauss用户互信。 + >- root用户互信可能会存在安全隐患,因此建议用户在执行完安装后,立即删除各主机上root用户的互信。 + + + + +## 示例 + +执行前置脚本: + +``` +plat1:/opt/software/openGauss/script # python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Are you sure you want to create trust for root (yes/no)? yes +Please enter password for root. +Password: +Creating SSH trust for the root permission user. +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +Successfully created SSH trust for the root permission user. +Distributing package. +Begin to distribute package to tool path. +Successfully distribute package to tool path. +Begin to distribute package to package path. +Successfully distribute package to package path. +Successfully distributed package. +Are you sure you want to create the user[gaussdba] and create trust for it (yes/no)? yes +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Creating SSH trust for [gaussdba] user. +Please enter password for current user[gaussdba]. +Password: +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +Successfully created SSH trust for [gaussdba] user. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +Successfully set ARM Optimization. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +root密码不一致也不能修改为一致,执行前置脚本本地安装模式: + +``` +plat1:/opt/software/openGauss/script # python gs_preinstall -U omm -G dbgrp -L -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Warning: Installation environment contains some warning messages. +Please get more details by "/home/package/r8c00/script/gs_checkos -i A -h SIA1000068990". +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Cgroup. +Successfully set Cgroup. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +以非交互模式执行前置: + +``` +plat1:/opt/software/openGauss/script # python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml --non-interactive +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Distributing package. +Begin to distribute package to tool path. +Successfully distribute package to tool path. +Begin to distribute package to package path. +Successfully distribute package to package path. +Successfully distributed package. +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +Successfully set ARM Optimization. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +## 错误排查 + +如果准备安装环境失败请根据openGauss日志目录“$GAUSSLOG/om”下的“gs\_preinstall-YYYY-MM-DD\_HHMMSS.log”和“gs\_local-YYYY-MM-DD\_HHMMSS.log”中的日志信息排查错误。例如配置文件中“gaussdbLogPath”参数指定的路径为“/var/log/gaussdb”,则“$GAUSSLOG/om”路径为“/var/log/gaussdb/omm/om”,omm用户为运行openGauss的用户。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>准备安装用户及环境的过程中会使用root添加定时任务用于定时巡检和上报。 + diff --git "a/content/zh/docs/Quickstart/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" "b/content/zh/docs/Quickstart/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" new file mode 100644 index 000000000..18b2bb82c --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\207\206\345\244\207\350\275\257\347\241\254\344\273\266\345\256\211\350\243\205\347\216\257\345\242\203.md" @@ -0,0 +1,11 @@ +# 准备软硬件安装环境 + +本章节描述安装前需要进行的环境准备。 + +- **[软硬件环境要求](软硬件环境要求.md)** +介绍openGauss的软硬件环境要求。建议部署openGauss的各服务器具有等价的软硬件配置。 +- **[修改操作系统配置](修改操作系统配置.md)** + +- **[设置root用户远程登录](设置root用户远程登录.md)** +在openGauss安装时需要root帐户远程登录访问权限,本章介绍如何设置使用root用户远程登录。 + diff --git "a/content/zh/docs/Quickstart/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Quickstart/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..7e836d9a6 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\210\233\345\273\272XML\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,15 @@ +# 创建XML配置文件 + +安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场配置对应的XML文件。 + +下面以一主一备的方案为例,说明如何创建XML配置文件。 + +- **[配置数据库名称及各项目录](配置数据库名称及各项目录.md)** + +- **[配置Host基本信息](配置Host基本信息.md)** + +- **[配置数据库主节点信息](配置数据库主节点信息.md)** + +- **[示例](示例.md)** + + diff --git "a/content/zh/docs/Quickstart/\345\210\233\345\273\272\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..f894a531f --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,57 @@ +# 创建数据库 + +创建一个新的数据库。缺省情况下新数据库将通过复制标准系统数据库template1来创建。可以通过TEMPLATE template指定不同的模板。 + +## 注意事项 + +- 只有拥有CREATEDB权限的用户才可以创建新数据库,系统管理员默认拥有此权限。 +- 不能在事务块中执行创建数据库语句。 + +## 语法格式 + +``` +CREATE DATABASE database_name + [ [ WITH ] { [ OWNER [=] user_name ] | + [ TEMPLATE [=] template ] | + [ ENCODING [=] encoding ] | + [ LC_COLLATE [=] lc_collate ] | + [ LC_CTYPE [=] lc_ctype ] | + [ DBCOMPATIBILITY [=] compatibilty_type ] | + [ TABLESPACE [=] tablespace_name ] | + [ CONNECTION LIMIT [=] connlimit ]}[...] ]; +``` + +## 示例 + +``` +--创建jim和tom用户。 +postgres=# CREATE USER jim PASSWORD 'Bigdata123@'; +postgres=# CREATE USER tom PASSWORD 'Bigdata123@'; + +--创建一个GBK编码的数据库music(本地环境的编码格式必须也为GBK)。 +postgres=# CREATE DATABASE music ENCODING 'GBK' template = template0; + +--创建数据库music2,并指定所有者为jim。 +postgres=# CREATE DATABASE music2 OWNER jim; + +--用模板template0创建数据库music3,并指定所有者为jim。 +postgres=# CREATE DATABASE music3 OWNER jim TEMPLATE template0; + +--设置music数据库的连接数为10。 +postgres=# ALTER DATABASE music CONNECTION LIMIT= 10; + +--将music名称改为music4。 +postgres=# ALTER DATABASE music RENAME TO music4; + +--将数据库music2的所属者改为tom。 +postgres=# ALTER DATABASE music2 OWNER TO tom; + +--设置music3的表空间为PG_DEFAULT。 +postgres=# ALTER DATABASE music3 SET TABLESPACE PG_DEFAULT; + +--删除数据库。 +postgres=# DROP DATABASE music2; +postgres=# DROP DATABASE music3; +postgres=# DROP DATABASE music4; +``` + diff --git "a/content/zh/docs/Quickstart/\345\210\233\345\273\272\347\224\250\346\210\267.md" "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\347\224\250\346\210\267.md" new file mode 100644 index 000000000..ac8241dc7 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\347\224\250\346\210\267.md" @@ -0,0 +1,81 @@ +# 创建用户 + +创建一个用户。 + +## 注意事项 + +- 通过CREATE USER创建的用户,默认具有LOGIN权限; +- 通过CREATE USER创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不自动创建同名的SCHEMA;用户可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。 +- 系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。 + +## 语法格式 + +``` +CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; +``` + +其中option子句用于设置权限及属性等信息。 + +``` +{SYSADMIN | NOSYSADMIN} + | {AUDITADMIN | NOAUDITADMIN} + | {CREATEDB | NOCREATEDB} + | {USEFT | NOUSEFT} + | {CREATEROLE | NOCREATEROLE} + | {INHERIT | NOINHERIT} + | {LOGIN | NOLOGIN} + | {REPLICATION | NOREPLICATION} + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | VALID BEGIN 'timestamp' + | VALID UNTIL 'timestamp' + | RESOURCE POOL 'respool' + | USER GROUP 'groupuser' + | PERM SPACE 'spacelimit' + | NODE GROUP logic_cluster_name + | IN ROLE role_name [, ...] + | IN GROUP role_name [, ...] + | ROLE role_name [, ...] + | ADMIN role_name [, ...] + | USER role_name [, ...] + | SYSID uid + | DEFAULT TABLESPACE tablespace_name + | PROFILE DEFAULT + | PROFILE profile_name + | PGUSER +``` + +## 示例 + +``` +--创建用户jim,登录密码为Bigdata123@。 +postgres=# CREATE USER jim PASSWORD 'Bigdata123@'; + +--下面语句与上面的等价。 +postgres=# CREATE USER kim IDENTIFIED BY 'Bigdata123@'; + +--如果创建有“创建数据库”权限的用户,则需要加CREATEDB关键字。 +postgres=# CREATE USER dim CREATEDB PASSWORD 'Bigdata123@'; + +--将用户jim的登录密码由Bigdata123@修改为Abcd@123。 +postgres=# ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'Bigdata123@'; + +--为用户jim追加CREATEROLE权限。 +postgres=# ALTER USER jim CREATEROLE; + +--将enable_seqscan的值设置为on, 设置成功后,在下一会话中生效。 +postgres=# ALTER USER jim SET enable_seqscan TO on; + +--重置jim的enable_seqscan参数。 +postgres=# ALTER USER jim RESET enable_seqscan; + +--锁定jim帐户。 +postgres=# ALTER USER jim ACCOUNT LOCK; + +--删除用户。 +postgres=# DROP USER kim CASCADE; +postgres=# DROP USER jim CASCADE; +postgres=# DROP USER dim CASCADE; +``` + diff --git "a/content/zh/docs/Quickstart/\345\210\233\345\273\272\350\241\250.md" "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\350\241\250.md" new file mode 100644 index 000000000..b89d68c4d --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\350\241\250.md" @@ -0,0 +1,219 @@ +# 创建表 + +在当前数据库中创建一个新的空白表,该表由命令执行者所有。 + +创建表时,如未指定表的存储方式,默认创建的是行存表;如未指定分布列时,取表的主键列(如果有的话)或首个可以作为分布列的列。 + +## 语法格式 + +- 创建表。 + + ``` + CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name + ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | table_constraint + | LIKE source_table [ like_option [...] ] } + [, ... ]) + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] + [ COMPRESS | NOCOMPRESS ] + [ TABLESPACE tablespace_name ] + [ DISTRIBUTE BY { REPLICATION | { HASH ( column_name [,...] ) } } ] + [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]; + ``` + + - 其中列约束column\_constraint为: + + ``` + [ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中列的压缩可选项compress\_mode为: + + ``` + { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } + ``` + + - 其中表约束table\_constraint为: + + ``` + [ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + PARTIAL CLUSTER KEY ( column_name [, ... ] ) } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中like选项like\_option为: + + ``` + { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL } + + ``` + + + +其中索引参数index\_parameters为: + +``` +[ WITH ( {storage_parameter = value} [, ... ] ) ] +[ USING INDEX TABLESPACE tablespace_name ] +``` + +## 示例 + +``` +--创建简单的表。 +postgres=# CREATE TABLE warehouse_t2 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) DICTIONARY, + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +``` + +``` +--创建表,并指定W_STATE字段的缺省值为GA。 +CREATE TABLE warehouse_t3 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) DEFAULT 'GA', + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +``` + +``` +--创建一个带有70%填充因子的表。 +CREATE TABLE warehouse_t5 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + UNIQUE(W_WAREHOUSE_NAME) WITH(fillfactor=70) +); + +--创建普通表空间。 +CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION ' tablespace/tablespace_1'; +--创建表时,指定表空间。 +CREATE TABLE warehouse_t9 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) TABLESPACE DS_TABLESPACE1; + +``` + +``` +--创建行存表。 +CREATE TABLE warehouse_t15 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH (ORIENTATION = ROW); +``` + +``` +--创建列存表。 +CREATE TABLE warehouse_t16 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH (ORIENTATION = COLUMN); +``` + +``` +--创建表,指定复合主键,由O_W_ID、O_D_ID和O_ID组成,并使用HASH分布。 +CREATE TABLE warehouse_t17 +( + O_W_ID INTEGER NOT NULL, + O_D_ID INTEGER NOT NULL, + O_ID INTEGER , + O_C_ID INTEGER , + O_CARRIER_ID INTEGER , + O_OL_CNT INTEGER , + O_ALL_LOCAL INTEGER , + O_ENTRY_D TIMESTAMP , + PRIMARY KEY (O_W_ID, O_D_ID, O_ID) +) DISTRIBUTE BY HASH(O_W_ID); + +--给表warehouse_t17创建一个复合唯一索引warehouse_t17_index1。 +CREATE UNIQUE INDEX warehouse_t17_index1 ON warehouse_t17 (O_W_ID, O_D_ID, O_CARRIER_ID, O_ID); +``` + diff --git "a/content/zh/docs/Quickstart/\345\210\233\345\273\272\350\247\222\350\211\262.md" "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\350\247\222\350\211\262.md" new file mode 100644 index 000000000..8a7f20b2f --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\210\233\345\273\272\350\247\222\350\211\262.md" @@ -0,0 +1,71 @@ +# 创建角色 + +创建角色。 + +角色是拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。 + +## 注意事项 + +- 在数据库中添加一个新角色,角色无登录权限。 +- 创建角色的用户必须具备CREATE ROLE的权限或者是系统管理员。 + +## 语法格式 + +``` +CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; +``` + +其中角色信息设置子句option语法为: + +``` +{SYSADMIN | NOSYSADMIN} + | {AUDITADMIN | NOAUDITADMIN} + | {CREATEDB | NOCREATEDB} + | {USEFT | NOUSEFT} + | {CREATEROLE | NOCREATEROLE} + | {INHERIT | NOINHERIT} + | {LOGIN | NOLOGIN} + | {REPLICATION | NOREPLICATION} + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | VALID BEGIN 'timestamp' + | VALID UNTIL 'timestamp' + | RESOURCE POOL 'respool' + | USER GROUP 'groupuser' + | PERM SPACE 'spacelimit' + | NODE GROUP logic_cluster_name + | IN ROLE role_name [, ...] + | IN GROUP role_name [, ...] + | ROLE role_name [, ...] + | ADMIN rol e_name [, ...] + | USER role_name [, ...] + | SYSID uid + | DEFAULT TABLESPACE tablespace_name + | PROFILE DEFAULT + | PROFILE profile_name + | PGUSER +``` + +## 示例 + +``` +--创建一个角色,名为manager,密码为Bigdata123@。 +postgres=# CREATE ROLE manager IDENTIFIED BY 'Bigdata123@'; + +--创建一个角色,从2015年1月1日开始生效,到2026年1月1日失效。 +postgres=# CREATE ROLE miriam WITH LOGIN PASSWORD 'Bigdata123@' VALID BEGIN '2015-01-01' VALID UNTIL '2026-01-01'; + +--修改角色manager的密码为abcd@123。 +postgres=# ALTER ROLE manager IDENTIFIED BY 'abcd@123' REPLACE 'Bigdata123@'; + +--修改角色manager为系统管理员。 +postgres=# ALTER ROLE manager SYSADMIN; + +--删除角色manager。 +postgres=# DROP ROLE manager; + +--删除角色miriam。 +postgres=# DROP ROLE miriam; +``` + diff --git "a/content/zh/docs/Quickstart/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" "b/content/zh/docs/Quickstart/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" new file mode 100644 index 000000000..a29e68dfe --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\210\235\345\247\213\345\214\226\345\256\211\350\243\205\347\216\257\345\242\203.md" @@ -0,0 +1,11 @@ +# 初始化安装环境 + +为了保证openGauss的正确安装,请首先对主机环境进行配置。 + +- **[准备安装用户及环境](准备安装用户及环境.md)** +创建完openGauss配置文件后,在执行安装前,为了后续能以最小权限进行安装及openGauss管理操作,保证系统安全性,需要运行安装前置脚本gs\_preinstall准备好安装用户及环境。 +- **[手工建立互信](手工建立互信.md)** +openGauss在安装过程中,需要在openGauss中的主机间执行命令,传送文件等操作。因此,在普通用户安装前需要确保互信是连通的。前置脚本中会先建立root用户间的互信,然后创建普通用户,并建立普通用户间的互信。 +- **[配置操作系统参数](配置操作系统参数.md)** +openGauss要求各主机上的操作系统参数设置成一定的值,以满足系统运行的性能要求等。 + diff --git "a/content/zh/docs/Quickstart/\345\212\240\350\275\275\351\251\261\345\212\250.md" "b/content/zh/docs/Quickstart/\345\212\240\350\275\275\351\251\261\345\212\250.md" new file mode 100644 index 000000000..0d46c8800 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\212\240\350\275\275\351\251\261\345\212\250.md" @@ -0,0 +1,14 @@ +# 加载驱动 + +在创建数据库连接之前,需要先加载数据库驱动程序。 + +加载驱动有两种方法: + +- 在代码中创建连接之前任意位置隐含装载:Class.forName\("org.postgresql.Driver"\); +- 在JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 上述jdbctest为测试用例程序的名称。 + >- 当使用gsjdbc200.jar时,上面的Driver类名相应修改为"com.huawei.gauss200.jdbc.Driver" + + diff --git "a/content/zh/docs/Quickstart/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" "b/content/zh/docs/Quickstart/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" new file mode 100644 index 000000000..b38ee1c4c --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" @@ -0,0 +1,178 @@ +# 区域和格式化 + +介绍时间格式设置的相关参数。 + +## DateStyle + +**参数说明:**设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 + +这个变量包含两个独立的加载部分:输出格式声明(ISO、Postgres、SQL、German)和输入输出的年/月/日顺序(DMY、MDY、YMD)。这两个可以独立设置或者一起设置。关键字Euro和European等价于DMY;关键字US、NonEuro、NonEuropean等价于MDY 。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**ISO, MDY + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_initdb会将这个参数初始化成与[lc\_time](#zh-cn_topic_0242371523_zh-cn_topic_0237124733_zh-cn_topic_0059778109_scbb410b3c5c94682a3eec218c7ff0220)一致的值。 + +**设置建议:**优先推荐使用ISO格式。Postgres、SQL和German均采用字母缩写的形式来表示时区,例如“EST、WST、CST”等。这些缩写可同时指代不同的时区,比如CST可同时代表美国中部时间\(Central Standard Time \(USA\) UT-6:00\)、澳大利亚中部时间\(Central Standard Time \(Australia\) UT+9:30\)、中国标准时间\(China Standard Time UT+8:00\)、古巴标准时间\(Cuba Standard Time UT-4:00\)。这种情况下在时区转化时可能会得不到正确的结果,从而引发其他问题。 + +## IntervalStyle + +**参数说明:**设置区间值的显示格式。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- sql\_standard表示产生与SQL标准规定匹配的输出。 +- postgres表示产生与PostgreSQL 8.4版本相匹配的输出,当[DateStyle](#zh-cn_topic_0242371523_zh-cn_topic_0237124733_zh-cn_topic_0059778109_s6464b29eb2274134845cea28f39d915e)参数被设为ISO时。 +- postgres\_verbose表示产生与PostgreSQL 8.4版本相匹配的输出,当[DateStyle](#zh-cn_topic_0242371523_zh-cn_topic_0237124733_zh-cn_topic_0059778109_s6464b29eb2274134845cea28f39d915e)参数被设为non\_ISO时。 +- iso\_8601表示产生与在ISO 8601中定义的“格式与代号”相匹配的输出。 +- a表示产生于A DB中与numtodsinterval函数相匹配的输出结果,详细请参考[numtodsinterval](zh-cn_topic_0242370436.md#zh-cn_topic_0237121972_zh-cn_topic_0059779084_lf9dae2de082b41c094177f70cf798433)。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>IntervalStyle参数也会影响不明确的间隔输入的说明。 + +**默认值:**postgres + +## TimeZone + +**参数说明:**设置显示和解释时间类型数值时使用的时区。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串,可查询视图[PG\_TIMEZONE\_NAMES](zh-cn_topic_0242385996.md#ZH-CN_TOPIC_0242385996)获得。 + +**默认值:**PRC + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_initdb将设置一个与其系统环境一致的时区值。 + +## timezone\_abbreviations + +**参数说明:**设置服务器接受的时区缩写值。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串,可查询视图pg\_timezone\_names获得。 + +**默认值:**Default + +>![](public_sys-resources/icon-note.gif) **说明:** +>Default表示通用时区的缩写。但也有其他诸如 'Australia' 和 'India' 等用来定义特定的安装。 + +## extra\_float\_digits + +**参数说明:**这个参数为浮点数值调整显示的数据位数,浮点类型包括float4、float8 以及几何数据类型。参数值加在标准的数据位数上(FLT\_DIG或DBL\_DIG中合适的)。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,-15~3 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 设置为3,表示包括部分关键的数据位。这个功能对转储那些需要精确恢复的浮点数据特别有用。 +>- 设置为负数,表示消除不需要的数据位。 + +**默认值:**0 + +## client\_encoding + +**参数说明:**设置客户端的字符编码类型。 + +请根据前端业务的情况确定。尽量客户端编码和服务器端编码一致,提高效率。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**兼容PostgreSQL所有的字符编码类型。其中UTF8表示使用数据库的字符编码类型。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 +>- 参数建议保持默认值,不建议通过gs\_guc工具或其他方式直接在postgresql.conf文件中设置client\_encoding参数,即使设置也不会生效,以保证openGauss内部通信编码格式一致。 + +**默认值:**UTF8 + +**推荐值:**SQL\_ASCII/UTF8 + +## lc\_messages + +**参数说明:**设置信息显示的语言。 + +- 可接受的值是与系统相关的。 +- 在一些系统上,这个区域范畴并不存在,不过仍然允许设置这个变量,只是不会有任何效果。同样,也有可能是所期望的语言的翻译信息不存在。在这种情况下,用户仍然能看到英文信息。 + + 该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## lc\_monetary + +**参数说明:**设置货币值的显示格式,影响to\_char之类的函数的输出。可接受的值是系统相关的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## lc\_numeric + +**参数说明:**设置数值的显示格式,影响to\_char之类的函数的输出。可接受的值是系统相关的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## lc\_time + +**参数说明:**设置时间和区域的显示格式,影响to\_char之类的函数的输出。可接受的值是系统相关的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## default\_text\_search\_config + +**参数说明:**设置全文检索的配置信息。 + +如果设置为不存在的文本搜索配置时将会报错。如果default\_text\_search\_config对应的文本搜索配置被删除,需要重新设置default\_text\_search\_config,否则会报设置错误。 + +- 其被文本搜索函数使用,这些函数并没有一个明确指定的配置。 +- 当与环境相匹配的配置文件确定时,gs\_initdb会选择一个与环境相对应的设置来初始化配置文件。 + + 该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>openGauss支持pg\_catalog.english,pg\_catalog.simple两种配置。 + +**默认值:**pg\_catalog.english + diff --git "a/content/zh/docs/Quickstart/\345\215\207\347\272\247\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\345\215\207\347\272\247\345\217\202\346\225\260.md" new file mode 100644 index 000000000..ae835dd77 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\215\207\347\272\247\345\217\202\346\225\260.md" @@ -0,0 +1,37 @@ +# 升级参数 + +## IsInplaceUpgrade + +**参数说明:**标示是否在升级的过程中。该参数属于升级内部参数,用户无法修改。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在升级过程中。 +- off表示不在升级过程中。 + +**默认值:**off + +## inplace\_upgrade\_next\_system\_object\_oids + +**参数说明:**标示就地升级过程中,新增系统对象的OID。该参数属于升级内部参数,用户无法修改。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## upgrade\_mode + +**参数说明**:标示升级模式。该参数属于升级内部参数,不建议用户自己修改。 + +**取值范围:**整数,0\~INT\_MAX + +- 0表示不在升级过程中。 +- 1表示在就地升级过程中。 +- 2表示在灰度升级过程中。 + +**默认值**:0 + diff --git "a/content/zh/docs/Quickstart/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" "b/content/zh/docs/Quickstart/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" new file mode 100644 index 000000000..530a9fa67 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\215\225\350\212\202\347\202\271\351\205\215\347\275\256\346\226\207\344\273\266.md" @@ -0,0 +1,36 @@ +# 单节点配置文件 + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" new file mode 100644 index 000000000..1a59d6110 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\216\206\345\217\262\347\211\210\346\234\254\345\205\274\345\256\271\346\200\247.md" @@ -0,0 +1,127 @@ +# 历史版本兼容性 + +openGauss介绍数据库的向下兼容性和对外兼容性特性的参数控制。数据库系统的向后兼容性能够为对旧版本的数据库应用提供支持。本节介绍的参数主要控制数据库的向后兼容性。 + +## array\_nulls + +**参数说明:**控制数组输入解析器是否将未用引用的NULL识别为数组的一个NULL元素。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许向数组中输入空元素。 +- off表示向下兼容旧式模式。仍然能够创建包含NULL值的数组。 + +**默认值:**on + +## backslash\_quote + +**参数说明:**控制字符串文本中的单引号是否能够用\\'表示。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>在字符串文本符合SQL标准的情况下,\\没有任何其他含义。这个参数影响的是如何处理不符合标准的字符串文本,包括明确的字符串转义语法是(E'...')。 + +**取值范围:**枚举类型 + +- on表示一直允许使用\\'表示。 +- off表示拒绝使用\\'表示。 +- safe\_encoding表示仅在客户端字符集编码不会在多字节字符末尾包含\\的ASCII值时允许。 + +**默认值:**safe\_encoding + +## escape\_string\_warning + +**参数说明:**警告在普通字符串中直接使用反斜杠转义。 + +- 如果需要使用反斜杠作为转义,可以调整为使用转义字符串语法\(E'...'\)来做转义,因为在每个SQL标准中,普通字符串的默认行为现在将反斜杠作为一个普通字符。 +- 这个变量可以帮助定位需要改变的代码。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +**默认值:**on + +## lo\_compat\_privileges + +**参数说明:**控制是否启动对大对象权限检查的向后兼容模式。 + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +on表示当读取或修改大对象时禁用权限检查,与PostgreSQL 9.0以前的版本兼容。 + +**默认值:**off + +## quote\_all\_identifiers + +**参数说明:**当数据库生成SQL时,此选项强制引用所有的标识符(包括非关键字)。这将影响到EXPLAIN的输出及函数的结果,例如pg\_get\_viewdef。详细说明请参见gs\_dump的--quote-all-identifiers选项。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开强制引用。 +- off表示关闭强制引用。 + +**默认值:**off + +## sql\_inheritance + +**参数说明:**控制继承语义。用来控制继承表的访问策略,off表示各种命令不能访问子表,即默认使用ONLY关键字。这是为了兼容7.1之前版本而设置的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示可以访问子表。 +- off表示不访问子表。 + +**默认值:**on + +## standard\_conforming\_strings + +**参数说明:**控制普通字符串文本('...')中是否按照SQL标准把反斜扛当普通文本。 + +- 应用程序通过检查这个参数可以判断字符串文本的处理方式。 +- 建议明确使用转义字符串语法(E'...')来转义字符。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开控制功能。 +- off表示关闭控制功能。 + +**默认值:**on + +## synchronize\_seqscans + +**参数说明:**控制启动同步的顺序扫描。在大约相同的时间内并行扫描读取相同的数据块,共享I/O负载。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示扫描可能从表的中间开始,然后选择"环绕"方式来覆盖所有的行,为了与已经在进行中的扫描活动同步。这可能会造成没有用ORDER BY子句的查询得到行排序造成不可预测的后果。 +- off表示确保顺序扫描是从表头开始的。 + +**默认值:**on + +## enable\_beta\_features + +**参数说明:**控制开启某些非正式发布的特性,仅用于POC验证。这些特性属于延伸特性,建议客户谨慎开启,在某些功能场景下可能存在问题。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启这些功能受限的特性,保持前向兼容。但某些场景可能存在功能上的问题。 +- off表示禁止使用这些特性。 + +**默认值:**off + diff --git "a/content/zh/docs/Quickstart/\345\217\214\346\234\272\345\244\215\345\210\266.md" "b/content/zh/docs/Quickstart/\345\217\214\346\234\272\345\244\215\345\210\266.md" new file mode 100644 index 000000000..d283f360c --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\217\214\346\234\272\345\244\215\345\210\266.md" @@ -0,0 +1,9 @@ +# 双机复制 + +- **[发送端服务器](发送端服务器.md)** + +- **[主服务器](主服务器.md)** + +- **[备服务器](备服务器.md)** + + diff --git "a/content/zh/docs/Quickstart/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" "b/content/zh/docs/Quickstart/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" new file mode 100644 index 000000000..90fab6d79 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" @@ -0,0 +1,115 @@ +# 发送端服务器 + +## max\_wal\_senders + +**参数说明:**指定事务日志发送进程的并发连接最大数量。不可大于等于[max\_connections](连接设置.md#zh-cn_topic_0242371485_zh-cn_topic_0237124695_zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>[wal\_level](设置.md#zh-cn_topic_0242371497_zh-cn_topic_0237124707_zh-cn_topic_0059778393_s2c76f5957066407a959191148f2c780f)必须设置为archive或者hot\_standby以允许备机的连接。 + +**取值范围**:整型,0~262143 + +**默认值:**100 + +## wal\_keep\_segments + +**参数说明:**Xlog日志文件段数量。设置“pg\_xlog”目录下保留事务日志文件的最小数目,备机通过获取主机的日志进行流复制。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,2 \~ INT\_MAX + +**默认值:**65 + +**设置建议:** + +- 当服务器开启日志归档或者从检查点恢复时,保留的日志文件数量可能大于wal\_keep\_segments设定的值。 +- 如果此参数设置过小,则在备机请求事务日志时,此事务日志可能已经被产生的新事务日志覆盖,导致请求失败,主备关系断开。 +- 当双机为异步传输时,以COPY方式连续导入4G以上数据需要增大wal\_keep\_segments配置。以T6000单板为例,如果导入数据量为50G,建议调整参数为1000。您可以在导入完成并且日志同步正常后,动态恢复此参数设置。 + +## wal\_sender\_timeout + +**参数说明:**设置本端等待事务日志接收端接收日志的最大等待时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果主机数据较大,重建操作需要增大此参数的值,主机数据在 500G时,此参数的参考值为 600s。 +>- 此值不能大于wal\_receiver\_timeout或数据库重建时的超时参数。 + +**取值范围:**整型, 0 \~ INT\_MAX,单位为毫秒(ms)。 + +**默认值:6**s + +## replconninfo1 + +**参数说明:**设置本端监听和鉴权的第一个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第一个节点信息。 + +**默认值:**空字符串 + +## replconninfo2 + +**参数说明:**设置本端监听和鉴权的第二个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第二个节点信息。 + +**默认值:**空字符串 + +## replconninfo3 + +**参数说明:**设置本端监听和鉴权的第三个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第三个节点信息。 + +**默认值:**空字符串 + +## replconninfo4 + +**参数说明:**设置本端监听和鉴权的第四个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第四个节点信息。 + +**默认值:**空字符串 + +## replconninfo5 + +**参数说明:**设置本端监听和鉴权的第五个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第五个节点信息。 + +**默认值:**空字符串 + +## replconninfo6 + +**参数说明:**设置本端监听和鉴权的第六个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第六个节点信息。 + +**默认值:**空字符串 + +## replconninfo7 + +**参数说明:**设置本端监听和鉴权的第七个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第七个节点信息。 + +**默认值:**空字符串 + diff --git "a/content/zh/docs/Quickstart/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" "b/content/zh/docs/Quickstart/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" new file mode 100644 index 000000000..7a2edcbb9 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" @@ -0,0 +1,49 @@ +# 后端写进程 + +介绍后端写(background writer)进程的参数配置。后端写进程的功能就是把共享缓冲区中的脏数据(指共享缓冲区中新增或者修改的内容)写入到磁盘。目的是让数据库进程在进行用户查询时可以很少或者几乎不等待写动作的发生(写动作由后端写进程完成)。 + +此机制同样也减少了检查点造成的性能下降。后端写进程将持续的把脏页面刷新到磁盘上,所以在检查点到来的时候,只有几个页面需要刷新到磁盘上。但是这样还是增加了I/O的总净负荷,因为以前的检查点间隔里,一个重复弄脏的页面可能只会冲刷一次,而同一个间隔里,后端写进程可能会写好几次。在大多数情况下,连续的低负荷要比周期性的尖峰负荷好,但是在本节讨论的参数可以用于按实际需要调节其行为。 + +## bgwriter\_delay + +**参数说明**:设置后端写进程写"脏"共享缓冲区之间的时间间隔。每一次,后端写进程都会为一些脏的缓冲区发出写操作(用bgwriter\_lru\_maxpages参数控制每次写的量),然后休眠bgwriter\_delay毫秒后才再次启动。 + +在许多系统上,休眠延时的有效分辨率是10毫秒。因此,设置一个不是10的倍数的数值与把它设置为下一个10的倍数是一样的效果。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,10\~10000,单位为毫秒。 + +**默认值:**10s + +**设置建议:**在数据写压力比较大的场景中可以尝试减小该值以降低checkpoint的压力。 + +## bgwriter\_lru\_maxpages + +**参数说明:**设置后端写进程每次可写入磁盘的“脏”缓存区的个数。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~1000 + +>![](public_sys-resources/icon-note.gif) **说明:** +>此参数设置为0表示禁用后端写功能,禁用后端写功能不会对checkpoints产生影响。 + +**默认值:**100 + +## bgwriter\_lru\_multiplier + +**参数说明:**通过与已使用缓存区数目的乘积评估下次服务器需要的缓存区数目。 + +写“脏”缓存区到磁盘的数目取决于服务器最近几次使用的缓存区数目。最近的buffers数目的平均值乘以bgwriter\_lru\_multiplier是为了评估下次服务器进程需要的buffers数目。在有足够多的干净的、可用的缓存区之前,后端写进程会一直写“脏”缓存区的(每次写的缓存区数目不会超过bgwriter\_lru\_maxpages的值)。 + +设置bgwriter\_lru\_multiplier的值为1.0表示一种“实时”策略,其作用是精准预测下次写“脏”缓冲区的数目。设置为较大的值可以应对突然的需求高峰,而较小的值则可以让服务器进程执行更多的写操作。 + +设置较小的bgwriter\_lru\_maxpages和bgwriter\_lru\_multiplier会减小后端写进程导致的额外I/O开销,但是服务器进程必须自己发出写操作,增加了对查询的响应时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**浮点型,0\~10。 + +**默认值:**2 + diff --git "a/content/zh/docs/Quickstart/\345\221\212\350\255\246\346\243\200\346\265\213.md" "b/content/zh/docs/Quickstart/\345\221\212\350\255\246\346\243\200\346\265\213.md" new file mode 100644 index 000000000..98fe78c18 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\221\212\350\255\246\346\243\200\346\265\213.md" @@ -0,0 +1,47 @@ +# 告警检测 + +在openGauss运行的过程中,会对数据库中的错误场景进行检测,便于用户及早感知到openGauss的错误。 + +## enable\_alarm + +**参数说明:**允许打开告警检测线程,检测数据库中可能的错误场景。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许打开告警检测线程。 +- off表示不允许打开告警检测线程。 + +**默认值:**on + +## connection\_alarm\_rate + +**参数说明:**允许和数据库连接的最大并发连接数的比率限制。数据库连接的最大并发连接数为[max\_connections](zh-cn_topic_0237124695.md#zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79)\* connection\_alarm\_rate。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**浮点型,0.0\~1.0 + +**默认值:**0.9 + +## alarm\_report\_interval + +**参数说明:**指定告警上报的时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,单位为秒。 + +**默认值:**10 + +## alarm\_component + +**参数说明:**在对告警做上报时,会进行告警抑制,即同一个实例的同一个告警项在alarm\_report\_interval(默认值为10s)内不做重复上报。在这种情况下设置用于处理告警内容的告警组件的位置。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**/opt/huawei/snas/bin/snas\_cm\_cmd + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\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" new file mode 100644 index 000000000..230c042b2 --- /dev/null +++ "b/content/zh/docs/Quickstart/\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" @@ -0,0 +1,69 @@ +# 基于开销的清理延迟 + +这个特性的目的是允许管理员减少VACUUM和ANALYZE语句在并发活动的数据库上的I/O影响。比如,像VACUUM和ANALYZE这样的维护语句并不需要迅速完成,并且不希望他们严重干扰系统执行其他的数据库操作。基于开销的清理延迟为管理员提供了一个实现这个目的手段。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>有些清理操作会持有关键的锁,这些操作应该尽快结束并释放锁。所以openGauss的机制是,在这类操作过程中,基于开销的清理延迟不会发生作用。为了避免在这种情况下的长延时,实际的开销限制取下面两者之间的较大值: +>- vacuum\_cost\_delay\*accumulated\_balance/vacuum\_cost\_limit +>- vacuum\_cost\_delay\*4 + +## 背景信息 + +在[ANALYZE | ANALYSE](zh-cn_topic_0237122086.md)和[VACUUM](zh-cn_topic_0237122195.md)语句执行过程中,系统维护一个内部的记数器,跟踪所执行的各种I/O操作的近似开销。如果积累的开销达到了vacuum\_cost\_limit声明的限制,则执行这个操作的进程将睡眠vacuum\_cost\_delay指定的时间。然后它会重置记数器然后继续执行。 + +这个特性是缺省关闭的。要想打开它,把vacuum\_cost\_delay变量设置为一个非零值。 + +## vacuum\_cost\_delay + +**参数说明:**指定开销超过vacuum\_cost\_limit的值时,进程睡眠的时间。 + +要注意在许多系统上,睡眠的有效分辨率是10毫秒。因此把vacuum\_cost\_delay设置为一个不是10的整数倍的数值与将它设置为下一个10的整数倍作用相同。 + +此参数一般设置较小,常见的设置是10或20毫秒。调整此特性资源占用率时,最好是调整其他参数,而不是此参数。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer(毫秒),0\~100,正数值表示打开基于开销的清理延迟特性;0表示关闭基于开销的清理延迟特性。 + +**默认值:**0 + +## vacuum\_cost\_page\_hit + +**参数说明:**清理一个在共享缓存里找到的缓冲区的预计开销。他代表锁住缓冲池、查找共享的Hash表、扫描页面内容的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,0\~10000。 + +**默认值:**1 + +## vacuum\_cost\_page\_miss + +**参数说明:**清理一个要从磁盘上读取的缓冲区的预计开销。他代表锁住缓冲池、查找共享Hash表、从磁盘读取需要的数据块、扫描它的内容的开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,0\~10000。 + +**默认值:**10 + +## vacuum\_cost\_page\_dirty + +**参数说明:**清理修改一个原先是干净的块的预计开销。他代表把一个脏的磁盘块再次刷新到磁盘上的额外开销。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,0\~1000 + +**默认值:**20 + +## vacuum\_cost\_limit + +**参数说明:**导致清理进程休眠的开销限制。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,1\~10000。 + +**默认值:**200 + diff --git "a/content/zh/docs/Quickstart/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" "b/content/zh/docs/Quickstart/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" new file mode 100644 index 000000000..90ab7aeaf --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" @@ -0,0 +1,99 @@ +# 基因查询优化器 + +介绍基因查询优化器相关的参数。基因查询优化器(GEQO)是一种启发式的查询规划算法。这个算法减少了对复杂查询规划的时间,而且生成规划的开销有时也小于正常的详尽的查询算法。 + +## geqo + +**参数说明**:控制基因查询优化的使用。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>通常情况下在执行过程中不要关闭,geqo\_threshold变量提供了更精细的控制GEQO的方法。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## geqo\_threshold + +**参数说明**:如果执行语句的数量超过设计的FROM的项数,则会使用基因查询优化来执行查询。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 对于简单的查询,通常用详尽搜索方法,当涉及多个表的查询的时候,用GEQO可以更好的管理查询。 +>- 一个FULL OUTER JOIN构造仅作为一个FROM项。 + +**取值范围**:整型,2~INT\_MAX。 + +**默认值**:12 + +## geqo\_effort + +**参数说明**:控制GEQO在规划时间和规划质量之间的平衡。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>geqo\_effort实际上并没有直接做任何事情,只是用于计算其他影响GEQO的变量的默认值。如果愿意,可以手工设置其他参数。 + +**取值范围**:整型,1~10。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>比默认值大的数值增加了查询规划的时间,但是也增加了选中有效查询的几率。 + +**默认值**:5 + +## geqo\_pool\_size + +**参数说明**:控制GEQO使用池的大小,也就是基因全体中的个体数量。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>至少是2,且有用的值一般在100到1000之间。设置为0,表示使用系统自适应方式,openGauss会基于geqo\_effort和表的个数选取合适的值。 + +**默认值**:0 + +## geqo\_generations + +**参数说明**:控制GEQO使用的算法的迭代次数。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>必须至少是1,且有用的值介于100和1000之间。如果设置为0,则基于geqo\_pool\_size选取合适的值。 + +**默认值**:0 + +## geqo\_selection\_bias + +**参数说明**:控制GEQO的选择性偏好,即就是一个种群中的选择性压力。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,1.5~2.0。 + +**默认值**:2 + +## geqo\_seed + +**参数说明**:控制GEQO使用的随机数生产器的初始化值,用来从顺序连接在一起的查询空间中查找随机路径。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0.0~1.0。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>不同的值会改变搜索的连接路径,从而影响了所找路径的优劣。 + +**默认值**:0 + diff --git "a/content/zh/docs/Quickstart/\345\244\207\346\234\215\345\212\241\345\231\250.md" "b/content/zh/docs/Quickstart/\345\244\207\346\234\215\345\212\241\345\231\250.md" new file mode 100644 index 000000000..331c5a905 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\244\207\346\234\215\345\212\241\345\231\250.md" @@ -0,0 +1,118 @@ +# 备服务器 + +## hot\_standby + +**参数说明:**设置是否允许备机在恢复过程中连接和查询。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果此参数设置为on,[wal\_level](zh-cn_topic_0237124707.md#zh-cn_topic_0059778393_s2c76f5957066407a959191148f2c780f)必须设置为hot\_standby,否则将导致数据库无法启动。 +>- 在双机环境中,因为会对双机其他一些功能产生影响,hot\_standby参数不能设置成off。 + +**取值范围:**布尔型 + +- on表示允许备机在恢复过程中连接和查询。 +- off表示不允许备机在恢复过程中连接和查询。 + +**默认值:**on + +## max\_standby\_archive\_delay + +**参数说明:**当开启双机热备模式时,如果备机正处理归档WAL日志数据,这时进行查询就会产生冲突,此参数就是设置备机取消查询之前所等待的时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>-1表示允许备机一直等待冲突的查询完成。 + +**取值范围:**整型,范围:-1\~INT\_MAX,单位为毫秒。 + +**默认值:**3s**(即**3000ms) + +## max\_standby\_streaming\_delay + +**参数说明:**当开启双机热备模式时,如果备机正通过流复制接收WAL日志数据,这时进行查询就会产生冲突,这个参数就是设置备机取消查询之前所等待的时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>-1表示允许备机一直等待冲突的查询完成。 + +**取值范围:**整型(毫秒),范围:-1\~INT\_MAX + +**默认值:3s(即**3000ms) + +## wal\_receiver\_status\_interval + +**参数说明:**设置WAL日志接收进程的状态通知给主机的最大时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX / 1000,单位为毫秒。 + +**默认值:**5s + +## hot\_standby\_feedback + +**参数说明:**设置是否允许将备机上执行查询的结果反馈给主机,这可以避免查询冲突。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许将备机上执行查询的结果反馈给主机。 +- off表示不允许将备机上执行查询的结果反馈给主机。 + +**默认值:**off + +## wal\_receiver\_timeout + +**参数说明:**设置从主机接收数据的最大等待时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型, 0 \~ INT\_MAX,单位为毫秒。 + +**默认值:**6s(即6000ms) + +## wal\_receiver\_connect\_timeout + +**参数说明:**设置连接主机的最大等待超时时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型, 0 \~ INT\_MAX / 1000,单位为秒。 + +**默认值:**2s + +## wal\_receiver\_connect\_retries + +**参数说明:**设置连接主机的最大尝试次数。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型, 1\~ INT\_MAX。 + +**默认值:**1 + +## wal\_receiver\_buffer\_size + +**参数说明:**备机与从备接收Xlog存放到内存缓冲区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,4096\~1047552,单位为KB。 + +**默认值:**64MB(即65536KB) + +## primary\_slotname + +**参数说明:**设置备机对应主机的slot name,用于主备校验,与wal日志删除机制。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符型 + +**默认值:**空字符串 + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" new file mode 100644 index 000000000..51d3fc032 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\211\345\205\250\345\222\214\350\256\244\350\257\201\357\274\210postgresql-conf\357\274\211.md" @@ -0,0 +1,381 @@ +# 安全和认证(postgresql.conf) + +介绍设置客户端和服务器的安全认证方式的相关参数。 + +## authentication\_timeout + +**参数说明:**完成客户端认证的最长时间。如果一个客户端没有在这段时间里完成与服务器端的认证,则服务器自动中断与客户端的连接,这样就避免了出问题的客户端无限制地占用连接数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为1,最大值为600,最小单位为s。 + +**默认值:**1min + +## auth\_iteration\_count + +**参数说明:**认证加密信息生成过程中使用的迭代次数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,2048-134217728。 + +**默认值:**10000 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>迭代次数设置过小会降低口令存储的安全性,设置过大会导致认证、用户创建等涉及口令加密的场景性能劣化,请根据实际硬件条件合理设置迭代次数,推荐采用默认迭代次数。 + +## session\_timeout + +**参数说明:**表明与服务器建立链接后,不进行任何操作的最长时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0-86400,最小单位为s,0表示关闭超时设置。 + +**默认值:**10min + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss gsql客户端中有自动重连机制,所以针对初始化用户本地连接,超时后gsql表现的现象为断开后重连。 + +## ssl + +**参数说明:**启用SSL连接。请在使用这个选项之前阅读[使用gsql连接](zh-cn_topic_0242370178.md)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示启用SSL连接。 +- off表示不启用SSL连接。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss目前支持SSL的场景为客户端连接数据库主节点场景,该参数目前建议只在数据库主节点中开启,数据库节点默认值为off。开启此参数需要同时配置ssl\_cert\_file、ssl\_key\_file和ssl\_ca\_file等参数及对应文件,不正确的配置可能会导致openGauss无法正常启动。 + +**默认值:**on + +## require\_ssl + +**参数说明:**设置服务器端是否强制要求SSL连接,该参数只有当参数[ssl](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s8c4647db116f44c4b9ce3dceee3d6ffa)为on时才有效。请在使用这个选项之前阅读[使用gsql连接](zh-cn_topic_0242370178.md)。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示服务器端强制要求SSL连接。 +- off表示服务器端对是否通过SSL连接不作强制要求。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss目前支持SSL的场景为客户端连接数据库主节点场景,该参数目前建议只在数据库主节点中开启。 + +**默认值:**off + +## ssl\_ciphers + +**参数说明:**指定SSL支持的加密算法列表。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,如果指定多个加密算法,加密算法之间需要以分号分割。详细请参见[表4](zh-cn_topic_0242376656.md#zh-cn_topic_0237121092_zh-cn_topic_0059778374_t34eea0830ef94be1a866f0410ba3eb07)获取支持的加密算法。 + +**默认值:**ALL + +## ssl\_renegotiation\_limit + +**参数说明:**指定在会话密钥重新协商之前,通过SSL加密通道可以传输的流量。这个重新协商流量限制机制可以减少攻击者针对大量数据使用密码分析法破解密钥的几率,但是也带来较大的性能损失。流量是指发送和接受的流量总和。使用SSL重协商机制可能引入其他风险,因此已禁用SSL重协商机制,为保持版本兼容保留此参数,修改参数配置不再起作用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483647。单位为KB。其中0表示禁用重新协商机制。 + +**默认值:**0 + +## ssl\_cert\_file + +**参数说明:**指定包含SSL服务器证书的文件的名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**server.crt + +## ssl\_key\_file + +**参数说明:**指定包含SSL私钥的文件名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**server.key + +## ssl\_ca\_file + +**参数说明:**指定包含CA信息的文件的名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**cacert.pem + +## ssl\_crl\_file + +**参数说明**:指定包含CRL信息的文件的名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串,其中空表示没有CA文件被加载,不进行客户端证书验证。 + +**默认值**:空 + +## krb\_server\_keyfile + +**参数说明:**指定Kerberos服务主配置文件的位置,详细请参见[客户端接入认证](zh-cn_topic_0242376653.md#ZH-CN_TOPIC_0242376653)。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## krb\_srvname + +**参数说明:**设置Kerberos服务名,详细请参见[客户端接入认证](zh-cn_topic_0242376653.md#ZH-CN_TOPIC_0242376653)。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**postgres + +## krb\_caseins\_users + +**参数说明:**设置Kerberos用户名是否大小写敏感。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示大小写不敏感 +- off表示大小写敏感 + +**默认值:**off + +## modify\_initial\_password + +**参数说明:**当openGauss安装成功后,数据库中仅存在一个初始用户(UID为10的用户)。客户通过该帐户初次登录数据库进行操作时,该参数决定是否要对该初始帐户的密码进行修改。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示openGauss安装成功后初始用户首次登录操作前需要修改初始密码。 +- off表示openGauss安装成功后初始用户无需修改初始密码即可进行操作。 + +**默认值:**off + +## password\_policy + +**参数说明:**在使用CREATE ROLE/USER或者ALTER ROLE/USER命令创建或者修改openGauss帐户时,该参数决定是否进行密码复杂度检查。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>从安全性考虑,请勿关闭密码复杂度策略。 + +**取值范围:**0、1 + +- 0表示不采用任何密码复杂度策略。 +- 1表示采用默认密码复杂度校验策略。 + +**默认值:**1 + +## password\_reuse\_time + +**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用天数检查。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>修改密码时会检查配置参数[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)。 +>- 当[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为正数时,只要满足其中任一个,即可认为密码可以重用。 +>- 当[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)为0时,表示不限制密码重用天数,仅限制密码重用次数。 +>- 当[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)为0时,表示不限制密码重用次数,仅限制密码重用天数。 +>- 当[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为0时,表示不对密码重用进行限制。 + +**取值范围:**浮点型(天),最小值为0,最大值为3650。 + +- 0表示不检查密码可重用的天数。 +- 正数表示新密码不能为该值指定的天数内使用过的密码。 + +**默认值:**60 + +## password\_reuse\_max + +**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用次数检查。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>修改密码时会检查配置参数[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)。 +>- 当[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为正数时,只要满足其中任一个,即可认为密码可以重用。 +>- 当[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)为0时,表示不限制密码重用天数,仅限制密码重用次数。 +>- 当[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)为0时,表示不限制密码重用次数,仅限制密码重用天数。 +>- 当[password\_reuse\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为0时,表示不对密码重用进行限制。 + +**取值范围:**整型,最小值为0,最大值为1000。 + +- 0表示不检查密码可重用次数。 +- 正整数表示新密码不能为该值指定的次数内使用过的密码。 + +**默认值:**0 + +## password\_lock\_time + +**参数说明:**该参数指定帐户被锁定后自动解锁的时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>password\_lock\_time和[failed\_login\_attempts](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_sc155ec2258b34e78a2ffcf797e66b959)必须都为正数时锁定和解锁功能才能生效。 + +**取值范围:**浮点型,最小值为0,最大值为365,单位为天。 + +- 0表示密码验证失败时,自动锁定功能不生效。 +- 正数表示帐户被锁定后,当锁定时间超过password\_lock\_time设定的值时,帐户将会被自行解锁。 + +**默认值:**1 + +## failed\_login\_attempts + +**参数说明:**在任意时候,如果输入密码错误的次数达到failed\_login\_attempts则当前帐户被锁定,password\_lock\_time秒后被自动解锁。 例如,登录时输入密码失败,ALTER USER时修改密码失败等。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>failed\_login\_attempts和[password\_lock\_time](#zh-cn_topic_0242371486_zh-cn_topic_0237124696_zh-cn_topic_0059778664_s5e488e82235e4bd5b470b57a44a38c27)必须都为正数时锁定和解锁功能才能生效。 + +**取值范围:**整型,最小值为0,最大值为1000。 + +- 0表示自动锁定功能不生效。 +- 正整数表示当错误密码次数达到failed\_login\_attempts设定的值时,当前帐户将被锁定。 + +**默认值:**10 + +## password\_encryption\_type + +**参数说明:**该字段决定采用何种加密方式对用户密码进行加密存储。修改此参数的配置不会自动触发已有用户密码加密方式的修改,只会影响新创建用户或修改用户密码操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0、1、2 + +- 0表示采用md5方式对密码加密。 +- 1表示采用sha256和md5两种方式分别对密码加密。 +- 2表示采用sha256方式对密码加密。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>md5为不安全的加密算法,不建议用户使用。 + +**默认值:**2 + +## password\_min\_length + +**参数说明:**该字段决定帐户密码的最小长度。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,6\~999个字符。 + +**默认值:**8 + +## password\_max\_length + +**参数说明:**该字段决定帐户密码的最大长度。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,6\~999个字符。 + +**默认值:**32 + +## password\_min\_uppercase + +**参数说明:**该字段决定帐户密码中至少需要包含大写字母个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建账户所指定的密码中至少需要包含大写字母个数。 + +**默认值:**0 + +## password\_min\_lowercase + +**参数说明:**该字段决定帐户密码中至少需要包含小写字母的个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建帐户所指定的密码中至少需要包含小写字母个数。 + +**默认值:**0 + +## password\_min\_digital + +**参数说明:**该字段决定帐户密码中至少需要包含数字的个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建帐户所指定的密码中至少需要包含数字个数。 + +**默认值:**0 + +## password\_min\_special + +**参数说明:**该字段决定帐户密码中至少需要包含特殊字符个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建帐户所指定的密码中至少需要包含特殊字符个数。 + +**默认值:**0 + +## password\_effect\_time + +**参数说明:**该字段决定帐户密码的有效时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**浮点型,最小值为0,最大值为999,单位为天。 + +- 0表示不开启有效期限制功能。 +- 1\~999表示创建帐户所指定的密码有效期,临近或超过有效期系统会提示用户修改密码。 + +**默认值:**90 + +## password\_notify\_time + +**参数说明:**该字段决定帐户密码到期前提醒的天数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为999,单位为天。 + +- 0表示不开启提醒功能。 +- 1\~999表示帐户密码到期前提醒的天数。 + +**默认值:**7 + diff --git "a/content/zh/docs/Quickstart/\345\256\211\350\243\205gsql\345\256\242\346\210\267\347\253\257\345\271\266\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Quickstart/\345\256\211\350\243\205gsql\345\256\242\346\210\267\347\253\257\345\271\266\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..4d4e76c8a --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\211\350\243\205gsql\345\256\242\346\210\267\347\253\257\345\271\266\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,67 @@ +# 安装gsql客户端并连接数据库 + +gsql是openGauss提供的在命令行下运行的数据库连接工具。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节只介绍如何安装gsql客户端,使用gsql客户端连接数据库,更多配置请参见openGauss产品文档。 + +## 前提条件 + +已[确认连接信息](确认连接信息.md)。 + +## 操作步骤 + +在客户端机器上,上传客户端工具包并配置gsql的执行环境变量。 + +1. 以root用户登录客户端机器。 +2. 创建“/tmp/tools”目录。 + + ``` + mkdir /tmp/tools + ``` + +3. 获取软件安装包中的“openGauss 1.0-OPENEULER-64bit-ClientTools.tar.gz”上传到“/tmp/tools”路径下。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 软件包相对位置为安装时所放位置,根据实际情况填写。 + >- 不同的操作系统,工具包文件名称会有差异。请根据实际的操作系统类型选择对应的工具包。 + +4. 解压文件。 + + ``` + cd /tmp/tools + tar -zxvf openGauss 1.0-OPENEULER-64bit-ClientTools.tar.gz + ``` + +5. 设置环境变量。 + + 打开“\~/.bashrc”文件。 + + ``` + vi ~/.bashrc + ``` + + 在其中输入如下内容后,使用“:wq!”命令保存并退出。 + + ``` + export PATH=/tmp/tools/bin:$PATH + export LD_LIBRARY_PATH=/tmp/tools/lib:$LD_LIBRARY_PATH + ``` + +6. 使环境变量配置生效。 + + ``` + source ~/.bashrc + ``` + +7. 连接数据库。 + + 数据库安装完成后,默认生成名称为postgres的数据库。第一次连接数据库时可以连接到此数据库。 + + ``` + gsql -d postgres -h 10.10.0.11 -U jack -p 8000 -W Bigdata@123 -r + ``` + + postgres为需要连接的数据库名称,10.10.0.11为CN所在的服务器IP地址,jack为连接数据库的用户,8000为数据库主节点的端口号,_Bigdata@123_为连接数据库用户jack的密码。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >连接openGauss的机器与openGauss不在同一网段时,-h指定的IP地址应为Manager界面上所设的mpp.coo.cooListenIP2(应用访问IP)的取值。 + + diff --git "a/content/zh/docs/Quickstart/\345\256\211\350\243\205openGauss.md" "b/content/zh/docs/Quickstart/\345\256\211\350\243\205openGauss.md" new file mode 100644 index 000000000..ef5531e5e --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\211\350\243\205openGauss.md" @@ -0,0 +1,11 @@ +# 安装openGauss + +- **[创建XML配置文件](创建XML配置文件.md)** +安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场配置对应的XML文件。 +- **[初始化安装环境](初始化安装环境.md)** +为了保证openGauss的正确安装,请首先对主机环境进行配置。 +- **[执行安装](执行安装.md)** +执行前置脚本准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 +- **[(可选)设置备机可读]((可选)设置备机可读.md)** +备机可读特性为可选特性,需要修改配置参数并重启主备机器后才能使用。在开启备机可读之后,备机将支持读操作,并满足数据一致性要求。 + diff --git "a/content/zh/docs/Quickstart/\345\256\211\350\243\205\345\207\206\345\244\207.md" "b/content/zh/docs/Quickstart/\345\256\211\350\243\205\345\207\206\345\244\207.md" new file mode 100644 index 000000000..3ff22ba9c --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\211\350\243\205\345\207\206\345\244\207.md" @@ -0,0 +1,13 @@ +# 安装准备 + +本章详细介绍了安装openGauss的环境准备和配置,请在安装之前仔细阅读本章的内容。如果已完成本章节的配置,请进入“安装openGauss”章节。 + +- **[了解安装流程](了解安装流程.md)** +本章节通过流程图简要介绍openGauss的安装流程。 +- **[获取并校验安装包](获取并校验安装包.md)** +为了防止安装包在传输过程中被恶意篡改或破坏给客户网络安全造成威胁,在获取到安装包后,需要对安装包的完整性进行校验,通过了校验的安装包才能部署。 +- **[准备软硬件安装环境](准备软硬件安装环境.md)** +本章节描述安装前需要进行的环境准备。 +- **[了解安装用户及用户组](了解安装用户及用户组.md)** +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性。安装脚本在安装过程中会自动按照用户指定创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + diff --git "a/content/zh/docs/Quickstart/\345\256\241\350\256\241.md" "b/content/zh/docs/Quickstart/\345\256\241\350\256\241.md" new file mode 100644 index 000000000..0eb6c9ea0 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\241\350\256\241.md" @@ -0,0 +1,9 @@ +# 审计 + +- **[审计开关](审计开关.md)** + +- **[用户和权限审计](用户和权限审计.md)** + +- **[操作审计](操作审计.md)** + + diff --git "a/content/zh/docs/Quickstart/\345\256\241\350\256\241\345\274\200\345\205\263.md" "b/content/zh/docs/Quickstart/\345\256\241\350\256\241\345\274\200\345\205\263.md" new file mode 100644 index 000000000..21531bd73 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\241\350\256\241\345\274\200\345\205\263.md" @@ -0,0 +1,107 @@ +# 审计开关 + +## audit\_enabled + +**参数说明:**控制审计进程的开启和关闭。审计进程开启后,将从管道读取后台进程写入的审计信息,并写入审计文件。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示启动审计功能。 +- off表示关闭审计功能。 + +**默认值:**on + +## audit\_directory + +**参数说明:**审计文件的存储目录。一个相对于数据目录data的路径,可自行指定。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**pg\_audit。如果使用om工具部署openGauss,则审计日志路径为“$GAUSSLOG/pg\_audit/实例名称”。 + +## audit\_data\_format + +**参数说明:**审计日志文件的格式。当前仅支持二进制格式。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**binary + +## audit\_rotation\_interval + +**参数说明**:指定创建一个新审计日志文件的时间间隔。当现在的时间减去上次创建一个审计日志的时间超过了此参数值时,服务器将生成一个新的审计日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~INT\_MAX/60,单位为min。 + +**默认值**:1d + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请不要随意调整此参数,否侧可能会导致audit\_resource\_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用[audit\_resource\_policy](#zh-cn_topic_0242371535_zh-cn_topic_0237124745_section939915522551)、[audit\_space\_limit](#zh-cn_topic_0242371535_zh-cn_topic_0237124745_zh-cn_topic_0059777744_s167d5900250946bca199444c0617c714)和[audit\_file\_remain\_time](#zh-cn_topic_0242371535_zh-cn_topic_0237124745_section149961828185211)参数进行控制。 + +## audit\_rotation\_size + +**参数说明**:指定审计日志文件的最大容量。当审计日志消息的总量超过此参数值时,服务器将生成一个新的审计日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1024\~1048576,单位为KB。 + +**默认值**:10MB + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请不要随意调整此参数,否侧可能会导致audit\_resource\_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit\_resource\_policy、audit\_space\_limit和audit\_file\_remain\_time参数进行控制。 + +## audit\_resource\_policy + +**参数说明**:控制审计日志的保存策略,以空间还是时间限制为优先策略。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示采用空间优先策略,最多存储[audit\_space\_limit](#zh-cn_topic_0242371535_zh-cn_topic_0237124745_zh-cn_topic_0059777744_s167d5900250946bca199444c0617c714)大小的日志。 +- off表示采用时间优先策略,最少存储[audit\_file\_remain\_time](#zh-cn_topic_0242371535_zh-cn_topic_0237124745_section149961828185211)长度时间的日志。 + +**默认值:**on + +## audit\_file\_remain\_time + +**参数说明**:表示需记录审计日志的最短时间要求,该参数在[audit\_resource\_policy](#zh-cn_topic_0242371535_zh-cn_topic_0237124745_section939915522551)为off时生效。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~730,单位为day,0表示无时间限制。 + +**默认值**:90 + +## audit\_space\_limit + +**参数说明:**审计文件占用的磁盘空间总量。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024KB\~1024GB,单位为KB。 + +**默认值:**1GB + +## audit\_file\_remain\_threshold + +**参数说明:**审计目录下审计文件个数的最大值。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1\~1048576 + +**默认值:**1048576 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请尽量保证此参数为1048576,并不要随意调整此参数,否则可能会导致audit\_resource\_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit\_resource\_policy、audit\_space\_limit和audit\_file\_remain\_time参数进行控制。 + diff --git "a/content/zh/docs/Quickstart/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" "b/content/zh/docs/Quickstart/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" new file mode 100644 index 000000000..20ae1d438 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" @@ -0,0 +1,9 @@ +# 客户端连接缺省设置 + +- **[语句行为](语句行为.md)** + +- **[区域和格式化](区域和格式化.md)** + +- **[其他缺省](其他缺省.md)** + + diff --git "a/content/zh/docs/Quickstart/\345\256\271\351\224\231\346\200\247.md" "b/content/zh/docs/Quickstart/\345\256\271\351\224\231\346\200\247.md" new file mode 100644 index 000000000..b183f6ee3 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\256\271\351\224\231\346\200\247.md" @@ -0,0 +1,99 @@ +# 容错性 + +当数据库系统发生错误时,以下参数控制服务器处理错误的方式。 + +## exit\_on\_error + +**参数说明:**控制终止会话。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示任何错误都会终止当前的会话。 +- off表示只有FATAL级别的错误才会终止会话。 + +**默认值:**off + +## restart\_after\_crash + +**参数说明:**设置为on,后端进程崩溃时,openGauss将自动重新初始化此后端进程。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示能够最大限度地提高数据库的可用性。 + + 在某些情况(比如当采用管理工具(例如xCAT)管理openGauss时),能够最大限度地提高数据库的可用性。 + +- off表示能够使得管理工具在后端进程崩溃时获取控制权并采取适当的措施进行处理。 + +**默认值:**on + +## omit\_encoding\_error + +**参数说明:**设置为on,数据库的客户端字符集编码为UTF-8时,出现的字符编码转换错误将打印在日志中,有转换错误的被转换字符会被忽略,以"?"代替。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示有转换错误的字符将被忽略,以"?"代替,打印错误信息到日志中。 +- off表示有转换错误的字符不能被转换,打印错误信息到终端。 + +**默认值:**off + +## max\_query\_retry\_times + +**参数说明:**指定SQL语句出错自动重试功能的最大重跑次数(目前支持重跑的错误类型为“Connection reset by peer”、“Lock wait timeout”和“Connection timed out”等),设定为0时关闭重跑功能。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0\~20。 + +**默认值:**0 + +## cn\_send\_buffer\_size + +**参数说明:**指定数据库主节点发送数据缓存区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,8\~128, 单位为KB。 + +**默认值:**8KB + +## max\_cn\_temp\_file\_size + +**参数说明:**指定SQL语句出错自动重试功能中数据库主节点端使用临时文件的最大值,设定为0表示不使用临时文件。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0\~10485760, 单位为KB。 + +**默认值:**5GB + +## retry\_ecode\_list + +**参数说明:**指定SQL语句出错自动重试功能支持的错误类型列表。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值:**YY001 YY002 YY003 YY004 YY005 YY006 YY007 YY008 YY009 YY010 YY011 YY012 YY013 YY014 YY015 53200 08006 08000 57P01 XX003 XX009 YY016 + +## data\_sync\_retry + +**参数说明:**控制当fsync到磁盘失败后是否继续运行数据库。由于在某些操作系统的场景下,fsync失败后重试阶段即使再次fsync失败也不会报错,从而导致数据丢失。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示当fsync同步到磁盘失败后采取重试机制,数据库继续运行。 +- off表示当fsync同步到磁盘失败后直接报panic,停止数据库。 + +**默认值:**off + diff --git "a/content/zh/docs/Quickstart/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" "b/content/zh/docs/Quickstart/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" new file mode 100644 index 000000000..4a41c0ef7 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" @@ -0,0 +1,53 @@ +# 平台和客户端兼容性 + +很多平台都使用数据库系统,数据库系统的对外兼容性给平台提供了很大的方便。 + +## transform\_null\_equals + +**参数说明:**控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。 + +- 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。 +- Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。 +- off表示不控制,即expr = NULL总是返回NULL(未知)。 + +**默认值:**off + +>![](public_sys-resources/icon-note.gif) **说明:** +>新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。 + +## support\_extended\_features + +**参数说明:**控制是否支持数据库的扩展特性。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示支持数据库的扩展特性。 +- off表示不支持数据库的扩展特性。 + +**默认值:**off + +## td\_compatible\_truncation + +**参数说明:**控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>超长字符串自动截断功能不适用于insert语句包含外表的场景。 +>如果向字符集为字节类型编码(SQL\_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示启动超长字符串自动截断功能。 +- off表示停止超长字符串自动截断功能。 + +**默认值:**off + diff --git "a/content/zh/docs/Quickstart/\345\271\266\350\241\214\345\257\274\345\205\245.md" "b/content/zh/docs/Quickstart/\345\271\266\350\241\214\345\257\274\345\205\245.md" new file mode 100644 index 000000000..55687e8e5 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\271\266\350\241\214\345\257\274\345\205\245.md" @@ -0,0 +1,52 @@ +# 并行导入 + +openGauss提供了并行导入功能,以快速、高效地完成大量数据导入。介绍openGauss并行导入的相关参数。 + +## raise\_errors\_if\_no\_files + +**参数说明:**导入时是否区分“导入文件记录数为空”和“导入文件不存在”。raise\_errors\_if\_no\_files=TRUE,则“导入文件不存在”的时候,openGauss将抛出“文件不存在的”错误。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示导入时区分“导入文件记录数为空”和“导入文件不存在”。 +- off表示导入时不区分“导入文件记录数为空”和“导入文件不存在”。 + +**默认值:**off + +## partition\_mem\_batch + +**参数说明:**为了优化对列存分区表的批量插入,在批量插入过程中会对数据进行缓存后再批量写盘。通过partition\_mem\_batch可指定缓存个数。该值设置过大,将消耗较多系统内存资源;设置过小,将降低系统列存分区表批量插入性能。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:1\~ 65535 + +**默认值:**256 + +## partition\_max\_cache\_size + +**参数说明:**为了优化对列存分区表的批量插入,在批量插入过程中会对数据进行缓存后再批量写盘。通过partition\_max\_cache\_size可指定数据缓存区大小。该值设置过大,将消耗较多系统内存资源;设置过小,将降低列存分区表批量插入性能。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**: + +列存分区表:4096\~ INT\_MAX / 2,最小单位为KB。 + +**默认值:**2GB + +## enable\_delta\_store + +**参数说明:**为了增强列存单条数据导入的性能和解决磁盘冗余问题,可通过此参数选择是否开启支持列存delta表功能。该参数开启时,数据导入列存表,会根据表定义时指定的[DELTAROW\_THRESHOLD](zh-cn_topic_0242370581.md#zh-cn_topic_0237122117_zh-cn_topic_0059778169_lb0b5377e83534b3eac0e425f44b60166)决定数据进入delta表存储还是主表CU存储,当数据量小于DELTAROW\_THRESHOLD时,数据进入delta表。该参数影响的操作包括insert,copy,vacuum,vacuum full,vacuum deltamerge重分布等所有涉及列存表数据移动的操作。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**: + +- on表示开启列存delta表功能。 +- off表示不开启列存delta表功能。 + +**默认值:**off + diff --git "a/content/zh/docs/Quickstart/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" "b/content/zh/docs/Quickstart/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" new file mode 100644 index 000000000..74021528b --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" @@ -0,0 +1,657 @@ +# 开发人员选项 + +## allow\_system\_table\_mods + +**参数说明:**设置是否允许修改系统表的结构。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许修改系统表的结构。 +- off表示不允许修改系统表的结构。 + +**默认值:**off + +## debug\_assertions + +**参数说明:**控制打开各种断言检查。能够协助调试,当遇到奇怪的问题或者崩溃,请把此参数打开,因为它能暴露编程的错误。要使用这个参数,必须在编译openGauss的时候定义宏USE\_ASSERT\_CHECKING(通过configure选项 --enable-cassert完成)。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开断言检查。 +- off表示不打开断言检查。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>当启用断言选项编译openGauss时,debug\_assertions缺省值为on 。 + +**默认值:**off + +## ignore\_checksum\_failure + +**参数说明: **设置读取数据时是否忽略校验信息检查失败(但仍然会告警),继续执行可能导致崩溃,传播或隐藏损坏数据,无法从远程节点恢复数据及其他严重问题。不建议用户修改设置。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示忽略数据校验错误。 +- off表示数据校验错误正常报错。 + +**默认值:**off + +## enable\_force\_vector\_engine + +**参数说明**:对于支持向量化的执行器算子,如果其子节点是非向量化的算子,通过设置此参数为on,强制生成向量化的执行计划。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值**:off + +## explain\_dna\_file + +**参数说明:**指定[explain\_perf\_mode](#zh-cn_topic_0242371533_zh-cn_topic_0237124743_zh-cn_topic_0059778871_s05e1286701bc4b8d9e1c0c9aecae3a0e)为run,导出的csv信息的目标文件。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这个参数的取值必须是绝对路径加上.csv格式的文件名。 + +**取值范围:**字符串 + +**默认值:**空 + +## explain\_perf\_mode + +**参数说明**:此参数用来指定explain的显示格式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:normal、pretty、summary、run + +- normal:代表使用默认的打印格式。 +- pretty:代表使用openGauss改进后的新显示格式。新的格式层次清晰,计划包含了plan node id,性能分析简单直接。 +- summary:是在pretty的基础上增加了对打印信息的分析。 +- run:在summary的基础上,将统计的信息输出到csv格式的文件中,以便于进一步分析。 + +**默认值**:pretty + +## ignore\_system\_indexes + +**参数说明:**读取系统表时忽略系统索引(但是修改系统表时依然同时修改索引)。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这个参数在从系统索引被破坏的表中恢复数据的时候非常有用。 + +**取值范围:**布尔型 + +- on表示忽略系统索引。 +- off表示不忽略系统索引。 + +**默认值:**off + +## post\_auth\_delay + +**参数说明:**在认证成功后,延迟指定时间,启动服务器连接。允许调试器附加到启动进程上。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为INT\_MAX/1000000,单位为秒。 + +**默认值:**0 + +## pre\_auth\_delay + +**参数说明:**启动服务器连接后,延迟指定时间,进行认证。允许调试器附加到认证过程上。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0~60,单位为秒。 + +**默认值:**0 + +## trace\_notify + +**参数说明:**为LISTEN和NOTIFY命令生成大量调试输出。[client\_min\_messages](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)或[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)级别必须是DEBUG1或者更低时,才能把这些输出分别发送到客户端或者服务器日志。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开输出功能。 +- off表示关闭输出功能。 + +**默认值:**off + +## trace\_recovery\_messages + +**参数说明:**启用恢复相关调试输出的日志录,否则将不会被记录。该参数允许覆盖正常设置的[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a),但是仅限于特定的消息,这是为了在调试备机中使用。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型,有效值有debug5、debug4、debug3、debug2、debug1、log,取值的详细信息请参见[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)。 + +**默认值:**log + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 默认值log表示不影响记录决策。 +>- 除默认值外,其他值会导致优先级更高的恢复相关调试信息被记录,因为它们有log优先权。对于常见的log\_min\_messages设置,这会导致无条件地将它们记录到服务器日志上。 + +## trace\_sort + +**参数说明:**控制是否在日志中打印排序操作中的资源使用相关信息。这个选项只有在编译openGauss的时候定义了TRACE\_SORT宏的时候才可用,不过目前TRACE\_SORT是由缺省定义的。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开控制功能。 +- off表示关闭控制功能。 + +**默认值:**off + +## zero\_damaged\_pages + +**参数说明:**控制检测导致openGauss报告错误的损坏的页头,终止当前事务。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +设置为on时,会导致系统报告一个警告,把损坏的页面填充为零然后继续处理。这种行为会破坏数据,也就是所有在已经损坏页面上的行记录。但是它允许绕开坏页面然后从表中尚存的未损坏页面上继续检索数据行。因此它在因为硬件或者软件错误导致的崩溃中进行恢复是很有用的。通常不应该把它设置为on,除非不需要从崩溃的页面中恢复数据。 + +**默认值:**off + +## string\_hash\_compatible + +**参数说明:**该参数用来说明char类型和varchar/text类型的hash值计算方式是否相同,以此来判断进行分布列从char类型到相同值的varchar/text类型转换,数据分布变化时,是否需要进行重分布。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示计算方式相同,不需要进行重分布。 +- off表示计算方式不同,需要进行重分布。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>计算方式的不同主要体现在字符串计算hash值时传入的字节长度上。(如果为char,则会忽略字符串后面空格的长度,如果为text或varchar,则会保留字符串后面空格的长度。)hash值的计算会影响到查询的计算结果,因此此参数一旦设置后,在整个数据库使用过程中不能再对其进行修改,以避免查询错误。 + +**默认值:**off + +## cost\_param + +**参数说明**:该参数用于控制在特定的客户场景中,使用不同的估算方法使得估算值与真实值更接近。此参数可以同时控制多种方法,与某一方法对应的位做与操作,不为0表示该方法被选择。 + +当cost\_param & 1 不为0,表示对于求不等值连接选择率时选择一种改良机制,此方法在自连接(两个相同的表之间连接)的估算中更加准确,V300R002C00版本开始,已弃用cost\_param & 1 不为0时的路径,默认选择更优的估算公式; + +当cost\_param & 2 不为0,表示求多个过滤条件(Filter)的选择率时,选择最小的作为总的选择率,而非两者乘积,此方法在过滤条件的列之间关联性较强时估算更加准确; + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX + +**默认值**:0 + +## convert\_string\_to\_digit + +**参数说明**:设置隐式转换优先级,是否优先将字符串转为数字。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示优先将字符串转为数字。 +- off表示不优先将字符串转为数字。 + +**默认值**:on + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请谨慎调整该参数,调整该参数会修改内部数据类型转换规则并可能导致不可预期的行为。 + +## nls\_timestamp\_format + +**参数说明**:设置时间戳默认格式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +**默认值**:DD-Mon-YYYY HH:MI:SS.FF AM + +## remotetype + +**参数说明**:设置远程连接类型。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型,有效值有application,dbnode,gtm,gtmproxy,internaltool,gtmtool。 + +**默认值**:application + +## enable\_partitionwise + +**参数说明**:分区表连接操作是否选择智能算法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示选择智能算法。 +- off表示不选择智能算法。 + +**默认值**:off + +## max\_function\_args + +**参数说明**:函数参数最大个数。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围**:整型 + +**默认值**:666 + +## max\_user\_defined\_exception + +**参数说明**:异常最大个数,默认值不可更改。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,当前只能取固定值1000 + +**默认值**:1000 + +## enable\_debug\_vacuum + +**参数说明:**允许输出一些与VACUUM相关的日志,便于定位VACUUM相关问题。开发人员专用,不建议普通用户使用。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启此日志开关。 +- off/false表示关闭此日志开关。 + +**默认值:**off + +## enable\_global\_stats + +**参数说明:**标识当前统计信息模式,区别采用全局统计信息收集模式还是单节点统计信息收集模式,默认创建为采用全局统计信息模式。当关闭该参数时,则默认收集openGauss第一个节点的统计信息,此时可能会影响生成查询计划的质量,但信息收集性能较优,建议客户谨慎考虑。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示全局统计信息。 +- off/false表示数据库节点统计信息。 + +**默认值:**on + +## enable\_fast\_numeric + +**参数说明:**标识是否开启Numeric类型数据运算优化。Numeric数据运算是较为耗时的操作之一,通过将Numeric转化为int64/int128类型,提高Numeric运算的性能。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启Numeric优化。 +- off/false表示关闭Numeric优化。 + +**默认值:**on + +## rewrite\_rule + +**参数说明**:标识开启的可选查询重写规则。有部分查询重写规则是可选的,开启它们并不能总是对查询效率有提升效果。在特定的客户场景中,通过此GUC参数对查询重写规则进行设置,使得查询效率最优。 + +此参数可以控制查询重写规则的组合,比如有多个重写规则:rule1、rule2、rule3、rule4。可以设置: + +``` +set rewrite_rule=rule1; --启用查询重写规则rule1 +set rewrite_rule=rule2,rule3; --启用查询重写规则rule2和rule3 +set rewrite_rule=none; --关闭所有可选查询重写规则 +``` + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- none:不使用任何可选查询重写规则 +- lazyagg:使用Lazy Agg查询重写规则(消除子查询中的聚集运算) + +**默认值**:magicset + +## enable\_compress\_spill + +**参数说明:**标识是否开启下盘压缩功能。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启下盘优化。 +- off/false表示关闭下盘优化。 + +**默认值:**on + +## analysis\_options + +**参数说明:**通过开启对应选项中所对应的功能选项使用相应的定位功能,包括数据校验,性能统计等,参见取值范围中的选项说明。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +- LLVM\_COMPILE表示在explain performance显示界面中显示每个线程的codegen编译时间。 +- HASH\_CONFLICT表示在数据库节点进程的pg\_log目录中的log日志中显示hash表的统计信息,包括hash表大小,hash链长,hash冲突情况。 +- STREAM\_DATA\_CHECK表示对网络传输前后的数据进行CRC校验。 + +**默认值:**ALL,on\(\),off\(LLVM\_COMPILE,HASH\_CONFLICT,STREAM\_DATA\_CHECK\),不开启任何定位功能。 + +## resource\_track\_log + +**参数说明**:控制自诊断的日志级别。目前仅对多列统计信息进行控制。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +- summary:显示简略的诊断信息。 +- detail:显示详细的诊断信息。 + +目前这两个参数值只在显示多列统计信息未收集的告警的情况下有差别,summary不显示未收集多列统计信息的告警,detail会显示这类告警。 + +**默认值:**summary + +## udf\_memory\_limit + +**参数说明:**控制每个数据库节点执行UDF时可用的最大物理内存量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,200\*1024~2147483647,单位为KB。 + +**默认值:**200MB + +## FencedUDFMemoryLimit + +**参数说明:**控制每个fenced udf worker进程使用的虚拟内存。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**设置建议:**不建议设置此参数,可用[udf\_memory\_limit](#zh-cn_topic_0242371533_zh-cn_topic_0237124743_section1765913299426)代替。 + +**取值范围:**整数,0 \~ 2147483647,单位为KB,设置可带单位(KB,MB,GB)。其中0表示不做内存控制。 + +**默认值:**0 + +## UDFWorkerMemHardLimit + +**参数说明:**控制fencedUDFMemoryLimit的最大值。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**设置建议:**不建议设置此参数,可用[udf\_memory\_limit](#zh-cn_topic_0242371533_zh-cn_topic_0237124743_section1765913299426)代替。 + +**取值范围:**整数,0 \~ 2147483647,单位为KB,设置时可带单位(KB,MB,GB)。 + +**默认值:**1GB + +## pljava\_vmoptions + +**参数说明**:用户自定义设置PL/Java函数所使用的JVM虚拟机的启动参数。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串, 支持: + +- JDK8 JVM启动参数(可参见JDK[官方](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html)说明) +- JDK8 JVM系统属性参数(以–D开头如–Djava.ext.dirs,可参见JDK[官方](https://docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html)说明) +- 用户自定义参数(以–D开头,如–Duser.defined.option) + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果用户在pljava\_vmoptions中设置参数不满足上述取值范围,会在使用PL/Java语言函数时报错。 + +**默认值:**空 + +## enable\_pbe\_optimization + +**参数说明**:设置优化器是否对以PBE(Parse Bind Execute)形式执行的语句进行查询计划的优化。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型。 + +- on表示优化器将优化PBE语句的查询计划。 +- off表示不使用优化。 + +**默认值**:on + +## enable\_light\_proxy + +**参数说明**:设置优化器是否对简单查询在数据库主节点上优化执行,应用端和内核端字符集不匹配时,该参数不生效,建议建库时将字符集设为UTF8。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型。 + +- on表示优化器将优化数据库主节点上简单查询的执行。 +- off表示不使用优化。 + +**默认值**:on + +## enable\_global\_plancache + +**参数说明**:设置是否对PBE查询的执行计划进行缓存共享,开启该功能可以节省高并发下数据库节点的内存使用。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型。 + +- on表示对PBE查询的执行计划进行缓存共享。 +- off表示不共享。 + +**默认值**:off + +## checkpoint\_flush\_after + +**参数说明**:设置checkpointer线程在连续写多少个磁盘页后会进行异步刷盘操作。openGauss中,磁盘页大小为8KB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~256 (0表示关闭异步刷盘功能)。例如,取值32,表示checkpointer线程连续写32个磁盘页,即32\*8=256KB磁盘空间后会进行异步刷盘。 + +**默认值**:32 + +## bgwriter\_flush\_after + +**参数说明**:设置background writer线程在连续写多少个磁盘页后会进行异步刷盘操作。openGauss中,磁盘页大小为8KB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~256 (0表示关闭异步刷盘功能),单位页面(8K)。例如,取值64,表示background writer线程连续写64个磁盘页,即64\*8=512KB磁盘空间后会进行异步刷盘。 + +**默认值**:256KB(即32个页面) + +## backend\_flush\_after + +**参数说明**:设置backend线程在连续写多少个磁盘页后会产生异步刷盘操作。openGauss中,磁盘页大小为8KB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~256 (0表示关闭异步刷盘功能),单位页面(8K)。例如,取值64,表示backend线程连续写64个磁盘页,即64\*8=512KB磁盘空间后会进行异步刷盘。 + +**默认值**:512KB(即64个页面) + +## enable\_parallel\_ddl + +**参数说明**:控制多数据库节点对同一数据库对象是否能安全的并发执行DDL操作。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示可以安全的并发执行DDL操作,不会出现分布式死锁。 +- off表示不能安全的并发执行DDL操作,可能会出现分布式死锁。 + +**默认值**:on + +## show\_acce\_estimate\_detail + +**参数说明**:评估信息一般用于运维人员在维护工作中使用,因此该参数默认关闭,此外为了避免这些信息干扰正常的explain信息显示,只有在explain命令的verbose选项打开的情况下才显示评估信息 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示可以在explain命令的输出中显示评估信息。 +- off表示不在explain命令的输出中显示评估信息。 + + +**默认值**:off + +## enable\_prevent\_job\_task\_startup + +**参数说明**:控制是否启动job线程。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示不能启动job线程。 +- off表示可以启动job线程。 + +**默认值**:off + +## enable\_early\_free + +**参数说明**:控制是否可以实现算子内存的提前释放。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示支持算子内存提前释放。 +- off表示不支持算子内存提前释放。 + +**默认值**:on + +## support\_batch\_bind + +**参数说明**:控制是否允许通过JDBC、ODBC、Libpq等接口批量绑定和执行PBE形式的语句。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用批量绑定和执行。 +- off表示不使用批量绑定和执行。 + +**默认值**:on + +## check\_implicit\_conversions + +**参数说明**:控制是否对查询中有隐式类型转换的索引列是否会生成候选索引路径进行检查。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示对查询中有隐式类型转换的索引列是否会生成候选索引路径进行检查。 +- off表示不进行相关检查。 + +**默认值**:off + +## enable\_thread\_pool + +**参数说明**:控制是否使用线程池功能。该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启线程池功能。 +- off表示不开启线程池功能。 + +**默认值**:off + +## thread\_pool\_attr + +**参数说明**:用于控制线程池功能的详细属性,该参数仅在enable\_thread\_pool打开后生效。该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串,长度大于0 + +该参数分为3个部分,'thread\_num, group\_num, cpubind\_info',这3个部分的具体含义如下: + +- thread\_num:线程池中的线程总数,取值范围是0\~4096。其中0的含义是数据库根据系统CPU core的数量来自动配置线程池的线程数,如果参数值大于0,线程池中的线程数等于thread\_num。 +- group\_num:线程池中的线程分组个数,取值范围是0\~64。其中0的含义是数据库根据系统NUMA组的个数来自动配置线程池的线程分组个数,如果参数值大于0,线程池中的线程组个数等于group\_num。 +- cpubind\_info:线程池是否绑核的配置参数。可选择的配置方式有集中:1. '\(nobind\)' ,线程不做绑核;2. '\(allbind\)',利用当前系统所有能查询到的CPU core做线程绑核;3. '\(nodebind: 1, 2\)',利用NUMA组1,2中的CPU core进行绑核;4. '\(cpubind: 0-30\)',利用0-30号CPU core进行绑核。该参数不区分大小写。 + +**默认值**:'16, 2, \(nobind\)' + +## numa\_distribute\_mode + +**参数说明**:用于控制部分共享数据和线程在NUMA节点间分布的属性。用于大型多NUMA节点的ARM服务器性能调优,一般不用设置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串,当前有效取值为'none', 'all'。 + +- none: 表示不启用本特性。 +- all:表示将部分共享数据和线程分布到不同的NUMA节点下,减少远端访存次数,提高性能。目前仅适用于拥有多个NUMA节点的ARM服务器,并且要求全部NUMA节点都可用于数据库进程,不支持仅选择一部分NUMA节点。 + +**默认值**:'none' + +## log\_pagewriter + +**参数说明**:设置用于增量检查点打开后,显示线程的刷页信息以及增量检查点的详细信息,信息比较多,不建议设置为ture。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值**:off + +## enable\_opfusion + +**参数说明**:控制是否对简单查询进行查询优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## advance\_xlog\_file\_num + +**参数说明**:用于控制在后台周期性地提前初始化xlog文件的数目。该参数是为了避免事务提交时执行xlog文件初始化影响性能,但仅在超重负载时才可能出现,因此一般不用配置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~100(0表示不提前初始化)。例如,取值10,表示后台线程会周期性地根据当前xlog写入位置提前初始化10个xlog文件。 + +**默认值**:0 + +## enable\_beta\_opfusion + +**参数说明**:在enable\_opfusion参数打开的状态下,如果开启该参数,可以支持TPCC中出现的聚集函数,排序和nestloop join三类SQL语句的加速执行,提升SQL执行性能。需要注意的是nestloop join类型的支持,还需要打开下面的enable\_beta\_nestloop\_fusion参数。 + +**取值范围**:布尔型 + +**默认值**:off + +## enable\_beta\_nestloop\_fusion + +**参数说明**:在enable\_opfusion和enable\_beta\_opfusion两个参数都打开的状态下,如果开启该参数,可以支持TPCC中出现的nestloop join类SQL语句的加速执行,提升SQL执行性能。 + +**取值范围**:布尔型 + +**默认值**:off + diff --git "a/content/zh/docs/Quickstart/\345\274\200\345\247\213\344\275\277\347\224\250\344\272\247\345\223\201.md" "b/content/zh/docs/Quickstart/\345\274\200\345\247\213\344\275\277\347\224\250\344\272\247\345\223\201.md" new file mode 100644 index 000000000..ce68bde55 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\274\200\345\247\213\344\275\277\347\224\250\344\272\247\345\223\201.md" @@ -0,0 +1,17 @@ +# 开始使用产品 + +成功安装openGauss后,就可以开始使用openGauss进行数据库构建和管理了。关于如何使用openGauss,详细可参见《管理员指南》。 + +- **[设置openGauss参数](设置openGauss参数.md)** + +- **[gsql客户端连接openGauss](gsql客户端连接openGauss.md)** + +- **[简单数据管理](简单数据管理.md)** + +- **[简单权限管理](简单权限管理.md)** + +- **[通过客户端工具执行SQL](通过客户端工具执行SQL.md)** + +- **[通过JDBC执行SQL](通过JDBC执行SQL.md)** + + diff --git "a/content/zh/docs/Quickstart/\345\274\202\346\255\245IO.md" "b/content/zh/docs/Quickstart/\345\274\202\346\255\245IO.md" new file mode 100644 index 000000000..de85d2585 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\274\202\346\255\245IO.md" @@ -0,0 +1,111 @@ +# 异步IO + +## enable\_adio\_debug + +**参数说明:**允许维护人员输出一些与ADIO相关的日志,便于定位ADIO相关问题。开发人员专用,不建议普通用户使用。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启此日志开关。 +- off/false表示关闭此日志开关。 + +**默认值:**off + +## enable\_adio\_function + +**参数说明:**是否开起ADIO功能。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启此功能。 +- off/false表示关闭此功能。 + +**默认值:**off + +## enable\_fast\_allocate + +**参数说明:**磁盘空间快速分配开关。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。只有在XFS文件系统上才能开启该开关。 + +**取值范围:**布尔型 + +- on/true表示开启此功能。 +- off/false表示关闭此功能。 + +**默认值:**off + +## prefetch\_quantity + +**参数说明:**描述行存储使用ADIO预读取IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,128~131072,单位为8KB。 + +**默认值:**32MB \(4096 \* 8KB\) + +## backwrite\_quantity + +**参数说明:**描述行存储使用ADIO写入IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,128~131072,单位为8KB。 + +**默认值:**8MB \(1024 \* 8KB\) + +## cstore\_prefetch\_quantity + +**参数说明:**描述列存储使用ADIO预取IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024~1048576,单位为KB。 + +**默认值:**32MB + +## cstore\_backwrite\_quantity + +**参数说明:**描述列存储使用ADIO写入IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024~1048576,单位为KB。 + +**默认值:**8MB + +## cstore\_backwrite\_max\_threshold + +**参数说明:**描述列存储使用ADIO写入数据库可缓存最大的IO量。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,4096~INT\_MAX/2,单位为KB。 + +**默认值:**2GB + +## fast\_extend\_file\_size + +**参数说明:**描述列存储使用ADIO预扩展磁盘的大小。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024~1048576,单位为KB。 + +**默认值:**8MB + +## effective\_io\_concurrency + +**参数说明:**磁盘子系统可以同时有效处理的请求数。对于RAID阵列,此参数应该是阵列中驱动器主轴的数量。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型 ,0\~1000 + +**默认值:**1 + diff --git "a/content/zh/docs/Quickstart/\345\275\222\346\241\243.md" "b/content/zh/docs/Quickstart/\345\275\222\346\241\243.md" new file mode 100644 index 000000000..f6ec07c44 --- /dev/null +++ "b/content/zh/docs/Quickstart/\345\275\222\346\241\243.md" @@ -0,0 +1,50 @@ +# 归档 + +## archive\_mode + +**参数说明:**表示是否进行归档操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当[wal\_level](设置.md#zh-cn_topic_0242371497_zh-cn_topic_0237124707_zh-cn_topic_0059778393_s2c76f5957066407a959191148f2c780f)设置成minimal时,archive\_mode参数无法使用。 + +**取值范围: **布尔型 + +- on表示进行归档。 +- off表示不进行归档。 + +**默认值:**off + +## archive\_command + +**参数说明:**由管理员设置的用于归档WAL日志的命令,建议归档路径为绝对路径。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 字符串中任何%p都被要归档的文件的绝对路径代替,而任何%f都只被该文件名代替(相对路径都相对于数据目录的)。如果需要在命令里嵌入%字符就必须双写%。 +>- 这个命令当且仅当成功的时候才返回零。示例如下: +> ``` +> archive_command = 'cp --remove-destination %p /mnt/server/archivedir/%f' +> ``` +>- --remove-destination选项作用为:拷贝前如果目标文件已存在,会先删除已存在的目标文件,然后执行拷贝操作。 + +**取值范围**:字符串 + +**默认值:**\(disabled\) + +## archive\_timeout + +**参数说明:**表示归档周期。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 超过该参数设定的时间时强制切换WAL段。 +>- 由于强制切换而提早关闭的归档文件仍然与完整的归档文件长度相同。因此,将archive\_timeout设为很小的值将导致占用巨大的归档存储空间,建议将archive\_timeout设置为60秒。 + +**取值范围**:整型,0 \~ INT\_MAX,单位为秒。其中0表示禁用该功能。 + +**默认值:**0 + diff --git "a/content/zh/docs/Quickstart/\346\200\247\350\203\275\347\273\237\350\256\241.md" "b/content/zh/docs/Quickstart/\346\200\247\350\203\275\347\273\237\350\256\241.md" new file mode 100644 index 000000000..42d6502a1 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\200\247\350\203\275\347\273\237\350\256\241.md" @@ -0,0 +1,28 @@ +# 性能统计 + +在数据库运行过程中,会涉及到锁的访问、磁盘IO操作、无效消息的处理,这些操作都可能是数据库的性能瓶颈,通过openGauss提供的性能统计方法,可以方便定位性能问题。 + +## 输出性能统计日志 + +**参数说明:**对每条查询,以下4个选项控制在服务器日志里记录相应模块的性能统计数据,具体含义如下: + +- log\_parser\_stats控制在服务器日志里记录解析器的性能统计数据。 +- log\_planner\_stats控制在服务器日志里记录查询优化器的性能统计数据。 +- log\_executor\_stats控制在服务器日志里记录执行器的性能统计数据。 +- log\_statement\_stats控制在服务器日志里记录整个语句的性能统计数据。 + +这些参数只能辅助管理员进行粗略分析,类似Linux中的操作系统工具getrusage\(\) 。 + +这些参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- log\_statement\_stats记录总的语句统计数据,而其他的只记录针对每个模块的统计数据。 +>- log\_statement\_stats不能和其他任何针对每个模块统计的选项一起打开。 + +**取值范围:**布尔型 + +- on表示开启记录性能统计数据的功能。 +- off表示关闭记录性能统计数据的功能。 + +**默认值:on** + diff --git "a/content/zh/docs/Quickstart/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" "b/content/zh/docs/Quickstart/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" new file mode 100644 index 000000000..7981aec52 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\211\213\345\267\245\345\273\272\347\253\213\344\272\222\344\277\241.md" @@ -0,0 +1,312 @@ +# 手工建立互信 + +openGauss在安装过程中,需要在openGauss中的主机间执行命令,传送文件等操作。因此,在普通用户安装前需要确保互信是连通的。前置脚本中会先建立root用户间的互信,然后创建普通用户,并建立普通用户间的互信。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>root用户互信可能会存在安全隐患,因此建议用户在使用完成后,立即删除各主机上root用户的互信。 +>单机部署不需要创建互信。 + +## 前提条件 + +- 确保ssh服务打开。 +- 确保ssh端口不会被防火墙关闭。 +- 确保xml文件中各主机名称和IP配置正确。 +- 确保所有机器节点间网络畅通。 +- 如果为普通用户建立互信,需要提前在各主机创建相同用户并设置密码。 +- 如果各主机安装并启动了SELinux服务,需要确保/root和/home目录安全上下文为默认值(root目录:system\_u:object\_r:home\_root\_t:s0,home目录:system\_u:object\_r:admin\_home\_t:s0)或者关闭掉SELinux服务。 + + 检查系统SELinux状态的方法:执行命令getenforce,如果返回结果是Enforcing ,说明SELinux安装并启用。 + + 检查目录安全上下文的命令: + + ``` + ls -ldZ /root | awk '{print $4}' + ``` + + ``` + ls -ldZ /home | awk '{print $4}' + ``` + + 恢复目录安全上下文命令: + + ``` + restorecon -r -vv /home/ + ``` + + ``` + restorecon -r -vv /root/ + ``` + + +## 使用脚本建立互信 + +1. 创建一个执行互信脚本所需要的输入文本,并在此文件中添加openGauss中所有主机IP。 + + ``` + plat1:/opt/software/openGauss> vim hostfile + 192.168.0.1 + 192.168.0.2 + 192.168.0.3 + ``` + +2. 以需要创建互信的用户执行脚本。 +3. 执行下面脚本建立互信。 + + ``` + plat1:/opt/software/openGauss/script# gs_sshexkey -f /opt/software/hostfile + ``` + + /opt/software/hostfile为主机列表,列出所有需要建立互信机器的主机IP。 + + +## 手工建立互信 + +如果openGauss各主机的root密码不一致,gs\_preinstall脚本无法建立互信,可以手工建立互信。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>建立互信的过程中需要生成如下4个文件:authorized\_keys、id\_rsa、id\_rsa.pub、known\_hosts。请勿删除或破坏这些互信相关的文件。 + +手工建立信任关系,步骤如下,plat1,plat2,plat3是主机名: + +1. 在其中一个主机上,生成root用户的本机授权文件。假设在主机plat1上执行。 + 1. 生成密钥。 + + ``` + ssh-keygen -t rsa + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keygen -t rsa + Generating public/private rsa key pair. + Enter file in which to save the key (/root/.ssh/id_rsa): + Created directory '/root/.ssh'. + Enter passphrase (empty for no passphrase): + Enter same passphrase again: + Your identification has been saved in /root/.ssh/id_rsa. + Your public key has been saved in /root/.ssh/id_rsa.pub. + The key fingerprint is: + d5:35:46:33:27:22:09:f0:1e:12:a7:87:fa:33:3f:ab root@plat1 + The key's randomart image is: + +--[ RSA 2048]----+ + | o.o.....O .| + | * .o + * | + | + + . . | + | . + o | + | . S | + | . | + | + | + | +. | + | E.oo | + +-----------------+ + ``` + + 2. 生成本机授权文件。 + + ``` + cat .ssh/id_rsa.pub >> .ssh/authorized_keys + ``` + + 示例如下: + + ``` + plat1:~ # cat .ssh/id_rsa.pub >> .ssh/authorized_keys + ``` + +2. 收集所有的待建互信主机的公钥,写入到本机的known\_hosts文件中。此步骤需要在步骤1执行的主机上执行。需要收集plat1、plat2、plat3三个主机的公钥。 + 1. 收集plat1的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat1 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat1 >> ~/.ssh/known_hosts + # plat1 SSH-2.0-OpenSSH_5.1 + ``` + + 2. 收集plat2的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat2 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat2 >> ~/.ssh/known_hosts + # plat2 SSH-2.0-OpenSSH_5.1 + ``` + + 3. 收集plat3的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat3 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat3 >> ~/.ssh/known_hosts + # plat3 SSH-2.0-OpenSSH_5.1 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known\_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分。 + >- 如果该主机上known\_hosts文件被删除,互信仍然可以使用,但是会有告警提示信息。如果需要规避告警提示信息,请将/etc/ssh/ssh\_config配置文件中,StrictHostKeyChecking参数设置为no。 + + +3. 将互信文件分发到其它所有主机上。在本例中,需要将plat1上的互信文件分发到plat2和plat3上。 + + 1、将互信文件分发到plat2上。Password输入拷贝目标主机的密码。 + + ``` + scp -r .ssh plat2:~ + ``` + + 示例如下: + + ``` + plat1:~ # scp -r .ssh plat2:~ + Password: + authorized_keys 100% 796 0.8KB/s 00:00 + id_rsa 100% 1675 1.6KB/s 00:00 + id_rsa.pub 100% 398 0.4KB/s 00:00 + known_hosts 100% 1089 1.1KB/s 00:00 + ``` + + 2、将互信文件分发到plat3上。Password输入拷贝目标主机的密码。 + + ``` + scp -r .ssh plat3:~ + ``` + + 示例如下: + + ``` + plat1:~ # scp -r .ssh plat3:~ + Password: + authorized_keys 100% 796 0.8KB/s 00:00 + id_rsa 100% 1675 1.6KB/s 00:00 + id_rsa.pub 100% 398 0.4KB/s 00:00 + known_hosts 100% 1089 1.1KB/s 00:00 + ``` + +4. 查看互信是否建成功,可以互相ssh主机名。输入exit退出。 + + ``` + plat1:~ # ssh plat2 + Last login: Tue Jan 5 10:28:18 2016 from plat1 + Huawei's internal systems must only be used for conducting Huawei's business or for purposes authorized by Huawei management.Use is subject to audit at any time by Huawei management. + plat2:~ # exit + logout + Connection to plat2 closed. + plat1:~ # + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果三个以上节点,和上述过程类似。假设节点名为plat1、plat2、plat3、......。第一步,需要在plat1上生成root用户的本机授权文件;第二步,需要收集所有待建互信主机\(plat1、plat2、plat3、......\)的公钥并写入到本机known\_hosts文件中;第三步,需要将互信文件分发到除本机外的所有其它主机\(plat2、plat3、......\)上;第四步,检查互信是否建立成功。 + + +## 删除root用户互信 + +为了避免Root用户互信可能存在的安全隐患,因此建议用户在使用完成后,立即删除各主机上root用户的互信。 + +1. 删除openGauss数据库各节点上的互信相关文件/root/.ssh。 + + rm –rf \~/.ssh + +2. 查看互信是否删除成功,可以互相ssh主机名,提示不能互信,互信删除成功。 + + plat1:\~ \# ssh plat2 + + he authenticity of host ' plssat2 \(plat2\)' can't be established. + + ECDSA key fingerprint is SHA256:Q4DPRedFytsjsJSKf4l2lHKuzVw4prq3bIUCNVKIa7M. + + ECDSA key fingerprint is MD5:e2:77:6c:aa:4c:43:5f:f2:c4:58:ec:d5:53:de:7c:fc. + + Are you sure you want to continue connecting \(yes/no\)? + + +## 示例 + +root用户建立互信示例: + +``` +plat1:~ # gs_sshexkey -f /opt/software/hostfile -W Gauss_234 +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +``` + +普通用户建立互信示例: + +``` +gaussdb@plat1:~ > gs_sshexkey -f /opt/software/hostfile -W Gauss_234 +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +``` + +安全模式下建立互信示例,需要用户根据提示,手动输入建立互信的用户密码(建议使用安全模式): + +``` +plat1:~ # gs_sshexkey -f /opt/software/hostfile +Please enter password for current user[root]. +Password: +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +``` + diff --git "a/content/zh/docs/Quickstart/\346\211\247\350\241\214\345\215\225\346\235\241SQL.md" "b/content/zh/docs/Quickstart/\346\211\247\350\241\214\345\215\225\346\235\241SQL.md" new file mode 100644 index 000000000..05b3a426f --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\211\247\350\241\214\345\215\225\346\235\241SQL.md" @@ -0,0 +1,48 @@ +# 执行单条SQL + +使用客户端工具连接到openGauss执行单条SQL。 + +## 前提条件 + +已通过客户端工具连接到openGauss,连接方法请参见[确认连接信息](确认连接信息.md)和[使用gsql本地连接](使用gsql本地连接.md)。 + +## 操作步骤 + +方法一: + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gsql连接到openGauss服务器。 + + ``` + gsql -h 10.180.123.163 -d postgres -U jack -p 8000 -r + ``` + + -d参数指定目标数据库名、-U参数指定数据库用户名、-h参数指定主机名、-p参数指定端口号信息。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >若未指定数据库名称,则使用初始化时默认生成的数据库名称;若未指定数据库用户名,则默认使用当前操作系统用户作为数据库用户名;当某个值没有前面的参数(-d、-U等)时,若连接的命令中没有指定数据库名(-d)则该参数会被解释成数据库名;如果已经指定数据库名(-d)而没有指定数据库用户名(-U)时,该参数则会被解释成数据库用户名。 + +3. 执行SQL语句。 + + 以创建数据库human\_staff为例。 + + ``` + CREATE DATABASE human_staff; + CREATE DATABASE + ``` + + 通常,输入的命令行在遇到分号的时候结束。如果输入的命令行没有错误,结果就会输出到屏幕上。 + + +方法二: + +1. 以操作系统用户omm登录数据库主节点。 +2. 执行如下命令中的SQL语句。 + + ``` + gsql -d postgres -h 10.29.103.168 -U jack -p 8000 -W Gauss@123 -c 'CREATE DATABASE human_staff' + ``` + + gsql工具使用-d参数指定目标数据库名、-U参数指定数据库用户名、-h参数指定主机名、-p参数指定端口号信息,-c参数指定需要执行的SQL。使用该语句时,该用户需要具有相应的权限。 + + diff --git "a/content/zh/docs/Quickstart/\346\211\247\350\241\214\345\256\211\350\243\205.md" "b/content/zh/docs/Quickstart/\346\211\247\350\241\214\345\256\211\350\243\205.md" new file mode 100644 index 000000000..9e4802eb2 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\211\247\350\241\214\345\256\211\350\243\205.md" @@ -0,0 +1,209 @@ +# 执行安装 + +执行前置脚本准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 + +## 前提条件 + +- 已成功执行前置脚本gs\_preinstall。即完成了[准备安装用户及环境](准备安装用户及环境.md#ZH-CN_TOPIC_0244544060)。 +- 所有服务器操作系统和网络均正常运行。 +- 用户需确保各个主机上的locale保持一致。详细请参见[配置区域和字符集](zh-cn_topic_0244176949.md)。 + +## 操作步骤 + +1. (可选)检查安装包和openGauss配置文件在规划路径下是否已存在。如果没有则需要重新上传一份,并解压和修改属主为omm。 + + ``` + cd /opt/software/openGauss/script + chmod -R 755 /opt/software/openGauss/script + chown -R omm:dbgrp /opt/software/openGauss/script + ``` + +2. 登录到openGauss的主机,并切换到omm用户。 + + ``` + su - omm + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- omm指的是前置脚本gs\_preinstall中-U参数指定的用户。 + >- 安装脚本gs\_install必须以前置脚本中指定的omm执行,否则,脚本执行会报错。 + +3. 使用gs\_install安装openGauss。若为环境变量分离的模式安装的集群需要source环境变量分离文件ENVFILE。 + + ``` + gs_install -X /opt/software/openGauss/clusterconfig.xml + ``` + + /opt/software/openGauss/clusterconfig.xml为openGauss配置文件的路径。 + + 日志文件路径下会生成两个日志文件:“gs\_install-YYYY-MMDD\_HHMMSS.log”和“gs\_local-YYYY-MM-DD\_HHMMSS.log”。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >执行gs\_install脚本时,如果输入参数--autostart=no, 则工具脚本在配置(config)步骤完成后退出,不会自动启动openGauss,需要用户通过执行gs\_om -t start命令手动启动。 + +4. 安装执行成功之后,需要手动删除主机root用户的互信,即删除openGauss数据库各节点上的互信文件。 + + ``` + rm –rf ~/.ssh + ``` + + +## 安装生成的目录 + +安装后的目录及各目录下的文件说明请参见[表1](#zh-cn_topic_0244176944_zh-cn_topic_0241805806_zh-cn_topic_0085434626_zh-cn_topic_0059782015_tdcb4fb0f38a6419099ee2c47d4d0b37f)。 + +**表 1** 安装生成的目录 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

序号

+

项目目录说明

+

目录

+

子目录

+

说明

+

1

+

openGauss安装目录

+

/opt/gaussdb/app

+

bin

+

存放数据库二进制文件的目录。

+

etc

+

cgroup工具配置文件。

+

include

+

存放数据库运行所需要的头文件。

+

jdk

+

存放javaJDK环境文件。

+

utilslib

+

存放extension扩展依赖库文件。

+

lib

+

存放数据库的库文件的目录。

+

share

+

存放数据库运行所需要的公共文件,如配置文件模板。

+

2

+

openGauss数据目录

+

/gaussdb/data

+

data_dnxxx

+

DBnode实例的数据目录,其中主实例的目录名为“data_dnxxx”,

+

备实例的为data_dnSxxx。xxx代表DBnode编号。

+

3

+

openGauss日志目录

+

/var/log/gaussdb/用户名

+

bin

+

二进制程序的日志目录。

+

gs_profile

+

数据库内核性能日志目录。

+

om

+

OM的日志目录。例如:

+

部分local脚本产生的日志,增删数据库节点接口的日志,gs_om接口的日志,前置接口的日志,节点替换接口的日志等。

+

pg_audit

+

数据库审计日志目录。

+

pg_log

+

数据库节点实例的运行日志目录。

+

4

+

openGauss系统工具目录

+

/opt/huawei/wisequery

+

script

+

用于openGauss用户进行openGauss管理的脚本文件。

+

sudo

+

用于root用户进行openGauss管理的脚本文件。

+

lib

+

bin目录下的二进制文件依赖的库文件。

+
+ +## 示例 + +执行安装: + +``` +omm@plat1:~> gs_install -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Check preinstall on every node. +Successfully checked preinstall on every node. +Creating the backup directory. +Successfully created the backup directory. +Installing the cluster. +Checking the installation environment on all nodes. +Installing applications on all nodes. +Successfully installed APP. +Cluster installation is completed. +Configuring. +Deleting instances from all nodes. +Checking node configuration on all nodes. +Initializing instances on all nodes. +Updating instance configuration on all nodes. +Configuring pg_hba on all nodes. +Configuration is completed. +Successfully started cluster. +Successfully installed application. +``` + +## 错误排查 + +如果安装失败请根据openGauss日志目录下的“gs\_install-YYYY-MM-DD\_HHMMSS.log”和“gs\_local-YYYY-MM-DD\_HHMMSS.log”中的日志信息排查错误。 + diff --git "a/content/zh/docs/Quickstart/\346\211\247\350\241\214\346\211\271\351\207\217\346\226\207\344\273\266.md" "b/content/zh/docs/Quickstart/\346\211\247\350\241\214\346\211\271\351\207\217\346\226\207\344\273\266.md" new file mode 100644 index 000000000..3c7850eac --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\211\247\350\241\214\346\211\271\351\207\217\346\226\207\344\273\266.md" @@ -0,0 +1,22 @@ +# 执行批量文件 + +使用客户端工具连接到openGauss执行批量文件。 + +## 前提条件 + +已通过客户端工具连接到openGauss,连接方法请参见[确认连接信息](确认连接信息.md)和[使用gsql远程连接](使用gsql远程连接.md)。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gsql连接到数据库,然后使用文件作为命令源而不是交互式输入,gsql将在处理完文件后结束。 + + ``` + gsql -h 10.180.123.163 -d postgres -U jack -p 8000 -f /home/omm/staff.sql + ``` + + gsql工具使用-d参数指定目标数据库名、-U参数指定数据库用户名、-h参数指定主机名、-p参数指定端口号信息、-f参数指定文件名(绝对路径或相对路径,且满足操作系统路径命名规则)。 + + 本命令中使用jack用户连接到远程主机postgres数据库的8000端口,并采用文件staff.sql作为命令源。 + + diff --git "a/content/zh/docs/Quickstart/\346\223\215\344\275\234\345\256\241\350\256\241.md" "b/content/zh/docs/Quickstart/\346\223\215\344\275\234\345\256\241\350\256\241.md" new file mode 100644 index 000000000..08244b702 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\223\215\344\275\234\345\256\241\350\256\241.md" @@ -0,0 +1,310 @@ +# 操作审计 + +## audit\_system\_object + +**参数说明:**该参数决定是否对openGauss数据库对象的CREATE、DROP、ALTER操作进行审计。openGauss数据库对象包括DATABASE、USER、schema、TABLE等。通过修改该配置参数的值,可以只审计需要的数据库对象的操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~262143 + +- 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_0242371537_zh-cn_topic_0237124747_zh-cn_topic_0059777487_zh-cn_topic_0058967566_table53712060)。 + +**默认值:**12295 + +**表 1** audit\_system\_object取值含义说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

二进制位

+

含义

+

取值说明

+

第0位

+

是否审计DATABASE对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第1位

+

是否审计SCHEMA对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第2位

+

是否审计USER对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第3位

+

是否审计TABLE对象的CREATE、DROP、ALTER、TRUNCATE操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER、TRUNCATE操作;
  • 1表示审计该对象的CREATE、DROP、ALTER、TRUNCATE操作。
+

第4位

+

是否审计INDEX对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第5位

+

是否审计VIEW对象的CREATE、DROP操作。

+
  • 0表示不审计该对象的CREATE、DROP操作;
  • 1表示审计该对象的CREATE、DROP操作。
+

第6位

+

是否审计TRIGGER对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第7位

+

是否审计PROCEDURE/FUNCTION对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第8位

+

是否审计TABLESPACE对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第9位

+

是否审计RESOURCE POOL对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作
+

第10位

+

是否审计WORKLOAD对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作
+

第11位

+

是否审计SERVER FOR HADOOP对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作
+

第12位

+

是否审计DATA SOURCE对象的CRAETE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
+
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第13位

+

是否审计NODE GROUP对象的CREATE、DROP操作。

+
  • 0表示不审计该对象的CREATE、DROP操作;
+
  • 1表示审计该对象的CREATE、DROP操作。
+

第14位

+

是否审计ROW LEVEL SECURITY对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第15位

+

是否审计TYPE对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计TYPE对象的CREATE、DROP、ALTER操作;
  • 1表示审计TYPE对象的CREATE、DROP、ALTER操作。
+

第16位

+

是否审计TEXT SEARCH对象(CONFIGURATION和DICTIONARY)的CREATE、DROP、ALTER操作。

+
  • 0表示不审计TEXT SEARCH对象的CREATE、DROP、ALTER操作;
  • 1表示审计TEXT SEARCH对象的CREATE、DROP、ALTER操作。
+

第17位

+

是否审计DIRECTORY对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计DIRECTORY对象的CREATE、DROP、ALTER操作;
  • 1表示审计DIRECTORY对象的CREATE、DROP、ALTER操作。
+

第18位

+

是否审计SYNONYM对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计SYNONYM对象的CREATE、DROP、ALTER操作;
  • 1表示审计SYNONYM对象的CREATE、DROP、ALTER操作。
+
+ +## audit\_dml\_state + +**参数说明:**这个参数决定是否对具体表的INSERT、UPDATE、DELETE操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭具体表的DML操作(SELECT除外)审计功能。 +- 1表示开启具体表的DML操作(SELECT除外)审计功能。 + +**默认值:**0 + +## audit\_dml\_state\_select + +**参数说明:**这个参数决定是否对SELECT操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭SELECT操作审计功能。 +- 1表示开启SELECT审计操作功能。 + +**默认值:**0 + +## audit\_function\_exec + +参数说明:这个参数决定在执行存储过程、匿名块或自定义函数(不包括系统自带函数)时是否记录审计信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭过程或函数执行的审计功能。 +- 1表示开启过程或函数执行的审计功能。 + +**默认值:**0 + +## audit\_copy\_exec + +**参数说明:**这个参数决定是否对COPY操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭COPY审计功能。 +- 1表示开启COPY审计功能。 + +**默认值:**0 + +## audit\_set\_parameter + +**参数说明:**这个参数决定是否对SET操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭SET审计功能。 +- 1表示开启SET审计功能。 + +**默认值:**1 + +## sql\_compatibility + +**参数说明:**控制数据库的SQL语法和语句行为同哪一个主流数据库兼容。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**枚举型 + +- A表示同a db兼容。 +- TD表示同Teradata兼容。 +- MYSQL表示同MySQL兼容。 + +**默认值:**MYSQL + +>![](public_sys-resources/icon-notice.gif) **须知:** +>在数据库中,该参数只能是确定的一个值,要么始终设置为ORA,要么始终设置为TD,不能随便改动,否则会导致数据库行为不一致。 + +## enableSeparationOfDuty + +**参数说明:**是否开启三权分立选项。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启三权分立。 +- off表示不开启三权分立。 + +**默认值:**off + +## enable\_nonsysadmin\_execute\_direct + +**参数说明:**是否允许非系统管理员执行EXECUTE DIRECT ON语句。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许任意用户执行EXECUTE DIRECT ON语句。 +- off表示只允许系统管理员执行EXECUTE DIRECT ON语句。 + +**默认值:**off + +## enable\_copy\_server\_files + +**参数说明:**是否开启copy服务器端文件的权限。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启copy服务端文件的权限。 +- off表示不开启copy服务端文件的权限。 + +**默认值:**off + +>![](public_sys-resources/icon-notice.gif) **须知:** +>copy from/to file要求具有系统管理员权限的用户或初始用户才能使用,但是,在三权分立开启的状态下,系统管理员与初始用户的权限不同,可以通过使用enable\_copy\_server\_file控制系统管理员的copy权限,当前默认不允许系统管理员权限用户进行对文件的copy操作,此参数打开后系统管理员方可执行该类型操作。 + +## enable\_access\_server\_directory + +**参数说明:**是否开启系统管理员用户创建和删除DIRECTORY的权限。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启系统管理员用户创建和删除DIRECTORY的权限。 +- off表示不开启系统管理员用户创建和删除DIRECTORY的权限。 + +**默认值:**off + +>![](public_sys-resources/icon-notice.gif) **须知:** +>用户在使用高级包UTL\_FILE访问服务器端文件时,要求必须拥有所指定的DIRECTORY对象的权限。 +>出于安全考虑,默认情况下,只有初始用户才能够创建、删除DIRECTORY对象。 +>如果开启了enable\_access\_server\_directory,那么在三权分立关闭时,系统管理员(包括初始用户)可以创建、删除DIRECTORY对象;而在三权分立开启时,只有初始用户可以创建、删除DIRECTORY对象。 + diff --git "a/content/zh/docs/Quickstart/\346\226\207\344\273\266\344\275\215\347\275\256.md" "b/content/zh/docs/Quickstart/\346\226\207\344\273\266\344\275\215\347\275\256.md" new file mode 100644 index 000000000..a59671c49 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\226\207\344\273\266\344\275\215\347\275\256.md" @@ -0,0 +1,63 @@ +# 文件位置 + +数据库安装后会自动生成三个配置文件(postgresql.conf、pg\_hba.conf和pg\_ident.conf),并统一存放在数据目录(data)下。用户可以使用本节介绍的方法修改配置文件的名称和存放路径。 + +修改任意一个配置文件的存放目录时,postgresql.conf里的data\_directory参数必须设置为实际数据目录(data)。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>考虑到配置文件修改一旦出错对数据库的影响很大,不建议安装后再修改本节的配置文件。 + +## data\_directory + +**参数说明:**设置openGauss的数据目录(data目录)。此参数可以通过如下方式指定。 + +- 在安装openGauss时指定。 +- 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,长度大于0 + +**默认值:**安装时指定,如果在安装时不指定,则默认不初始化数据库。 + +## config\_file + +**参数说明:**设置主服务器配置文件名称(postgresql.conf)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,长度大于0 + +**默认值:**postgresql.conf\(实际安装可能带有绝对目录\) + +## hba\_file + +**参数说明:**设置基于主机认证(HBA)的配置文件(pg\_hba.conf)。此参数只能在配置文件postgresql.conf中指定。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**pg\_hba.conf\(实际安装可能带有绝对目录\) + +## ident\_file + +**参数说明:**设置用于客户端认证的配置文件的名称(pg\_ident.conf)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**pg\_ident.conf\(实际安装可能带有绝对目录\) + +## external\_pid\_file + +**参数说明:**声明可被服务器管理程序使用的额外PID文件。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这个参数只能在数据库服务重新启动后生效。 + +**取值范围:**字符串 + +**默认值:**空 + diff --git "a/content/zh/docs/Quickstart/\346\227\245\345\277\227\345\233\236\346\224\276.md" "b/content/zh/docs/Quickstart/\346\227\245\345\277\227\345\233\236\346\224\276.md" new file mode 100644 index 000000000..cfbcc6945 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\227\245\345\277\227\345\233\236\346\224\276.md" @@ -0,0 +1,70 @@ +# 日志回放 + +## recovery\_time\_target + +**参数说明:**设置recovery\_time\_target秒能够让备机完成日志写入和回放。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~3600 (秒) + +0是指不开启日志流控,1\~3600是指备机能够在recovery\_time\_target时间内完成日志的写入和回放,可以保证主机与备机切换时能够在recovery\_time\_target秒完成日志写入和回放,保证备机能够快速升主机。recovery\_time\_target设置时间过小会影响主机的性能,设置过大会失去流控效果。 + +**默认值:**0 + +## recovery\_max\_workers + +**参数说明:**设置最大并行回放线程个数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~20 + +**默认值:**1 + +## recovery\_parse\_workers + +**参数说明:**是极致RTO特性中ParseRedoRecord线程的数量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~16 + +0是指不开极致RTO,1\~16是指开极致RTO。需要配合recovery\_redo\_workers使用。若同时开启recovery\_parse\_workers和recovery\_max\_workers,以开启极致RTO的recovery\_parse\_workers为准,并行回放特性失效。 + +**默认值:**0 + +## recovery\_redo\_workers + +**参数说明:**是极致RTO特性中每个ParseRedoRecord线程对应的PageRedoWorker数量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~8 + +需要配合recovery\_parse\_workers使用。recovery\_redo\_workers是极致RTO特性中每个ParseRedoRecord线程对应的PageRedoWorker线程数量。在配合recovery\_parse\_workers使用时,只有recovery\_parse\_workers大于0 + +recovery\_redo\_workers参数才生效。 + +**默认值:**1 + +## recovery\_parallelism + +**参数说明:**查询实际回放线程个数,该参数为只读参数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~2147483647 + +**默认值:**1 + +## enable\_page\_lsn\_check + +**参数说明:**数据页lsn检查开关。回放时,检查数据页当前的lsn是否是期望的lsn。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**true + diff --git "a/content/zh/docs/Quickstart/\346\235\203\351\231\220\350\265\213\344\272\210.md" "b/content/zh/docs/Quickstart/\346\235\203\351\231\220\350\265\213\344\272\210.md" new file mode 100644 index 000000000..2c593d150 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\235\203\351\231\220\350\265\213\344\272\210.md" @@ -0,0 +1,289 @@ +# 权限赋予 + +对角色和用户进行授权操作。 + +使用GRANT命令进行用户授权包括以下三种场景: + +- **将系统权限授权给角色或用户** + + 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。 + +- **将数据库对象授权给角色或用户** + + 将数据库对象(表和视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户; + +- **将角色或用户的权限授权给其他角色或用户** + + 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 + + +## 语法格式 + +- 将表或视图的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } [, ...] + | ALL [ PRIVILEGES ] } + ON { [ TABLE ] table_name [, ...] + | ALL TABLES IN SCHEMA schema_name [, ...] } + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + + ``` + +- 将表中字段的访问权限赋予指定的用户或角色。 + + ``` + GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )} [, ...] + | ALL [ PRIVILEGES ] ( column_name [, ...] ) } + ON [ TABLE ] table_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将数据库的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] + | ALL [ PRIVILEGES ] } + ON DATABASE database_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将域的访问权限赋予指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON DOMAIN domain_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >本版本暂时不支持赋予域的访问权限。 + +- 将外部数据源的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON FOREIGN DATA WRAPPER fdw_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将外部服务器的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON FOREIGN SERVER server_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将函数的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { EXECUTE | ALL [ PRIVILEGES ] } + ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] + | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将过程语言的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON LANGUAGE lang_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ 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。 + +- 将大对象的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } + ON LARGE OBJECT loid [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >本版本暂时不支持大对象。 + +- 将子openGauss的访问权限赋予指定的用户或角色。 + + ``` + GRANT { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] } + ON NODE GROUP group_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将模式的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } + ON SCHEMA schema_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名字,并不能实际进行对象访问。 + +- 将表空间的访问权限赋予指定的用户或角色。 + + ``` + GRANT { CREATE | ALL [ PRIVILEGES ] } + ON TABLESPACE tablespace_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将类型的访问权限赋予指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON TYPE type_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >本版本暂时不支持赋予类型的访问权限。 + +- 将角色的权限赋予其他用户或角色的语法。 + + ``` + GRANT role_name [, ...] + TO role_name [, ...] + [ WITH ADMIN OPTION ]; + ``` + +- 将sysadmin权限赋予指定的角色。 + + ``` + GRANT ALL { PRIVILEGES | PRIVILEGE } + TO role_name; + ``` + +- 将Data Source对象的权限赋予指定的角色。 + + ``` + GRANT {USAGE | ALL [PRIVILEGES]} + ON DATA SOURCE src_name [, ...] + TO {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION]; + ``` + +- 将directory对象的权限赋予指定的角色。 + + ``` + GRANT {READ|WRITE| ALL [PRIVILEGES]} + ON DIRECTORY directory_name [, ...] + TO {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION]; + ``` + + +## 示例 + +**示例1:将系统权限授权给用户或者角色。** + +创建名为joe的用户,并将sysadmin权限授权给他。 + +``` +postgres=# CREATE USER joe PASSWORD 'Bigdata123@'; +postgres=# GRANT ALL PRIVILEGES TO joe; +``` + +授权成功后,用户joe会拥有sysadmin的所有权限。 + +**示例2:将对象权限授权给用户或者角色**。 + +1. 撤销joe用户的sysadmin权限,然后将模式tpcds的使用权限和表tpcds.reason的所有权限授权给用户joe。 + + ``` + postgres=# REVOKE ALL PRIVILEGES FROM joe; + postgres=# GRANT USAGE ON SCHEMA tpcds TO joe; + postgres=# GRANT ALL PRIVILEGES ON tpcds.reason TO joe; + ``` + + 授权成功后,joe用户就拥有了tpcds.reason表的所有权限,包括增删改查等权限。 + +2. 将tpcds.reason表中r\_reason\_sk、r\_reason\_id、r\_reason\_desc列的查询权限,r\_reason\_desc的更新权限授权给joe。 + + ``` + postgres=# GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe; + ``` + + 授权成功后,用户joe对tpcds.reason表中r\_reason\_sk,r\_reason\_id的查询权限会立即生效。如果joe用户需要拥有将这些权限授权给其他用户的权限,可以通过以下语法对joe用户进行授权。 + + ``` + postgres=# GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe WITH GRANT OPTION; + ``` + + 将数据库postgres的连接权限授权给用户joe,并给予其在postgres中创建schema的权限,而且允许joe将此权限授权给其他用户。 + + ``` + postgres=# GRANT create,connect on database postgres TO joe WITH GRANT OPTION; + ``` + + 创建角色tpcds\_manager,将模式tpcds的访问权限授权给角色tpcds\_manager,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给其他人。 + + ``` + CREATE ROLE tpcds_manager PASSWORD ''; + GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager; + ``` + + 将表空间tpcds\_tbspc的所有权限授权给用户joe,但用户joe无法将权限继续授予其他用户。 + + ``` + CREATE TABLESPACE tpcds_tbspc RELATIVE LOCATION 'tablespace/tablespace_1'; + GRANT ALL ON TABLESPACE tpcds_tbspc TO joe; + ``` + + +**示例3:将用户或者角色的权限授权给其他用户或角色。** + +1. 创建角色manager,将joe的权限授权给manager,并允许该角色将权限授权给其他人。 + + ``` + CREATE ROLE manager PASSWORD ''; + GRANT joe TO manager WITH ADMIN OPTION; + ``` + +2. 创建用户senior\_manager,将用户manager的权限授权给该用户。 + + ``` + CREATE ROLE senior_manager PASSWORD ''; + GRANT manager TO senior_manager; + ``` + +3. 撤销权限,并清理用户。 + + ``` + REVOKE manager FROM joe; + REVOKE senior_manager FROM manager; + DROP USER manager; + ``` + + +**示例4:撤销上述授予的权限,并清理角色和用户。** + +``` +REVOKE ALL PRIVILEGES ON reason FROM joe; +REVOKE ALL PRIVILEGES ON SCHEMA tpcds FROM joe; +REVOKE ALL ON TABLESPACE tpcds_tbspc FROM joe; +DROP TABLESPACE tpcds_tbspc; +REVOKE USAGE,CREATE ON SCHEMA tpcds FROM tpcds_manager; +DROP ROLE tpcds_manager; +DROP ROLE senior_manager; +DROP USER joe CASCADE; +``` + diff --git "a/content/zh/docs/Quickstart/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" "b/content/zh/docs/Quickstart/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" new file mode 100644 index 000000000..b2cb7c7de --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" @@ -0,0 +1,70 @@ +# 查看参数当前取值 + +openGauss安装后,有一套默认的运行参数,为了使openGauss与业务的配合度更高,用户需要根据业务场景和数据量的大小进行GUC参数调整。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +3. 查看数据库运行参数当前取值。 + - 方法一:使用SHOW命令。 + - 使用如下命令查看单个参数: + + ``` + postgres=# SHOW server_version; + ``` + + server\_version显示数据库版本信息的参数。 + + - 使用如下命令查看所有参数: + + ``` + postgres=# SHOW ALL; + ``` + + + - 方法二:使用pg\_settings视图。 + - 使用如下命令查看单个参数: + + ``` + postgres=# SELECT * FROM pg_settings WHERE NAME='server_version'; + ``` + + - 使用如下命令查看所有参数: + + ``` + postgres=# SELECT * FROM pg_settings; + ``` + + + + +## 示例 + +查看服务器的版本号。 + +``` +postgres=# SHOW server_version; + server_version +---------------- + 9.2.4 +(1 row) +``` + diff --git "a/content/zh/docs/Quickstart/\346\237\245\347\234\213\345\257\271\350\261\241.md" "b/content/zh/docs/Quickstart/\346\237\245\347\234\213\345\257\271\350\261\241.md" new file mode 100644 index 000000000..e5720219a --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\237\245\347\234\213\345\257\271\350\261\241.md" @@ -0,0 +1,49 @@ +# 查看对象 + +- 查看帮助信息 + + ``` + \? + ``` + +- 切换数据库 + + ``` + \c dbname + ``` + +- 列举数据库 + + ``` + \l + ``` + + +- 列举表 + + ``` + \dt + ``` + + +- 查看表结构 + + ``` + \d tablename + ``` + + +- 列举schema + + ``` + \dn + ``` + + +- 查看索引 + + ``` + \di + ``` + + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\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" new file mode 100644 index 000000000..c7974237e --- /dev/null +++ "b/content/zh/docs/Quickstart/\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" @@ -0,0 +1,144 @@ +# 查询和索引统计收集器 + +查询和索引统计收集器负责收集数据库系统运行中的统计数据,如在一个表和索引上进行了多少次插入与更新操作、磁盘块的数量和元组的数量、每个表上最近一次执行清理和分析操作的时间等。可以通过查询系统视图pg\_stats和pg\_statistic查看统计数据。下面的参数设置服务器范围内的统计收集特性。 + +## track\_activities + +**参数说明:**控制收集每个会话中当前正在执行命令的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能。 +- off表示关闭收集功能。 + +**默认值:**on + +## track\_counts + +**参数说明:**控制收集数据库活动的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能。 +- off表示关闭收集功能。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在AutoVacuum自动清理进程中选择清理的数据库时,需要数据库的统计数据,故默认值设为on。 + +**默认值:**on + +## track\_io\_timing + +**参数说明:**控制收集数据库I/O调用时序的统计数据。I/O时序统计数据可以在pg\_stat\_database中查询。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能,开启时,收集器会在重复地去查询当前时间的操作系统,这可能会引起某些平台的重大开销,故默认值设置为off。 +- off表示关闭收集功能。 + +**默认值:**off + +## track\_functions + +**参数说明:**控制收集函数的调用次数和调用耗时的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当SQL语言函数设置为调用查询的“内联”函数时,不管是否设置此选项,这些SQL语言函数无法被追踪到。 + +**取值范围:**枚举类型 + +- pl表示只追踪过程语言函数。 +- all表示追踪SQL和C语言函数。 +- none表示关闭函数追踪功能。 + +**默认值:**none + +## track\_activity\_query\_size + +**参数说明:**设置用于跟踪每一个活动会话的当前正在执行命令的字节数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,100~102400 + +**默认值:**1024 + +## update\_process\_title + +**参数说明:**控制收集因每次服务器接收到一个新的SQL语句时而产生的进程名称更新的统计数据。 + +进程名称可以通过ps命令进行查看。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能。 +- off表示关闭收集功能。 + +**默认值:**off + +## stats\_temp\_directory + +**参数说明:**设置存储临时统计数据的目录。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>将其设置为一个基于RAM的文件系统目录会减少实际的I/O开销并可以提升其性能。 + +**取值范围:**字符串 + +**默认值:**pg\_stat\_tmp + +## track\_thread\_wait\_status\_interval + +**参数说明:**用来定期收集thread状态信息的时间间隔。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0~1天,单位为min。 + +**默认值:**30min + +## enable\_save\_datachanged\_timestamp + +**参数说明:**确定是否收集insert/update/delete, exchange/truncate/drop partition操作对表数据改动的时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许收集相关操作对表数据改动的时间。 +- off表示禁止收集相关操作对表数据改动的时间。 + +**默认值:**on + +## track\_sql\_count + +**参数说明:**控制对每个会话中当前正在执行的SELECT、INSERT、UPDATE、DELETE、MERGE INTO语句进行计数的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启计数功能。 +- off表示关闭计数功能。 + +**默认值:on** + +>![](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是关闭。 +>- 当参数关闭时,查询视图的结果为0行。 + diff --git "a/content/zh/docs/Quickstart/\346\237\245\350\257\242\350\247\204\345\210\222.md" "b/content/zh/docs/Quickstart/\346\237\245\350\257\242\350\247\204\345\210\222.md" new file mode 100644 index 000000000..8b6bfe741 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\237\245\350\257\242\350\247\204\345\210\222.md" @@ -0,0 +1,18 @@ +# 查询规划 + +介绍查询优化器方法配置、开销常量、规划算法以及一些配置参数。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>优化器中涉及的两个参数: +>- INT\_MAX数据类型INT的最大值,其值为2147483647。 +>- DBL\_MAX数据类型FLOAT的最大值。 + +- **[优化器方法配置](优化器方法配置.md)** + +- **[优化器开销常量](优化器开销常量.md)** + +- **[基因查询优化器](基因查询优化器.md)** + +- **[其他优化器选项](其他优化器选项.md)** + + diff --git "a/content/zh/docs/Quickstart/\346\243\200\346\237\245\347\202\271.md" "b/content/zh/docs/Quickstart/\346\243\200\346\237\245\347\202\271.md" new file mode 100644 index 000000000..3a8bcdc56 --- /dev/null +++ "b/content/zh/docs/Quickstart/\346\243\200\346\237\245\347\202\271.md" @@ -0,0 +1,101 @@ +# 检查点 + +## checkpoint\_segments + +**参数说明:**设置[checkpoint\_timeout](#zh-cn_topic_0242371498_zh-cn_topic_0237124708_zh-cn_topic_0059778936_s880baa9f9b594980afbbe95fb8a77182)周期内所保留的最少WAL日志段文件数量。每个日志文件大小为16MB。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,最小值1 + +提升此参数可加快大数据的导入速度,但需要结合[checkpoint\_timeout](#zh-cn_topic_0242371498_zh-cn_topic_0237124708_zh-cn_topic_0059778936_s880baa9f9b594980afbbe95fb8a77182)、[shared\_buffers](zh-cn_topic_0237124699.md#zh-cn_topic_0059777577_s55a43fb6d0464430a59031671b37cd07)这两个参数统一考虑。这个参数同时影响WAL日志段文件复用数量,通常情况下pg\_xlog文件夹下最大的复用文件个数为2倍的checkpoint\_segments个,复用的文件被改名为后续即将使用的WAL日志段文件,不会被真正删除。 + +**默认值:**64 + +## checkpoint\_timeout + +**参数说明:**设置自动WAL检查点之间的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型, 30~3600(秒) + +在提升[checkpoint\_segments](#zh-cn_topic_0242371498_zh-cn_topic_0237124708_zh-cn_topic_0059778936_sbadc77895e6643b882a5e7557e405373)以加快大数据导入的场景也需将此参数调大,同时这两个参数提升会加大[shared\_buffers](zh-cn_topic_0237124699.md#zh-cn_topic_0059777577_s55a43fb6d0464430a59031671b37cd07)的负担,需要综合考虑。 + +**默认值:**15min + +## checkpoint\_completion\_target + +**参数说明:**指定检查点完成的目标。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:0.0~1.0 + +**默认值:**0.5 + +>![](public_sys-resources/icon-note.gif) **说明:** +>默认值0.5表示:每个checkpoint需要在checkpoints间隔时间的50%内完成。 + +## checkpoint\_warning + +**参数说明:**如果由于填充检查点段文件导致检查点发生的时间间隔接近这个参数表示的秒数,就向服务器日志发送一个建议增加[checkpoint\_segments](#zh-cn_topic_0242371498_zh-cn_topic_0237124708_zh-cn_topic_0059778936_sbadc77895e6643b882a5e7557e405373)值的消息。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~INT\_MAX(秒),其中0表示关闭警告。 + +**默认值:**5min + +**推荐值:**5min + +## checkpoint\_wait\_timeout + +**参数说明:**设置请求检查点等待checkpointer线程启动的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,2~3600(秒) + +**默认值:**1min + +## enable\_incremental\_checkpoint + +**参数说明:**增量检查点开关。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**on + +## enable\_double\_write + +**参数说明:**双写开关,增量检查点开关打开时,不再使用full\_page\_writes防止半页写问题,而是依赖双写特性保护。 + +该参数属于POSTMASTER类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**on + +## incremental\_checkpoint\_timeout + +**参数说明:**增量检查点开关打开之后,设置自动WAL检查点之间的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~3600(秒) + +**默认值:**1min + +## enable\_xlog\_prune + +**参数说明:**设置主机是否在任一备机断联时候保留全部xlog不回收。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**on + diff --git "a/content/zh/docs/Quickstart/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" "b/content/zh/docs/Quickstart/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" new file mode 100644 index 000000000..a73c64c0c --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" @@ -0,0 +1,7 @@ +# 版本和平台兼容性 + +- **[历史版本兼容性](历史版本兼容性.md)** + +- **[平台和客户端兼容性](平台和客户端兼容性.md)** + + diff --git "a/content/zh/docs/Quickstart/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" "b/content/zh/docs/Quickstart/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" new file mode 100644 index 000000000..dd8eb967c --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" @@ -0,0 +1,73 @@ +# 用户和权限审计 + +## audit\_login\_logout + +**参数说明:**这个参数决定是否审计openGauss用户的登录(包括登录成功和登录失败)、注销。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~7。 + +- 0表示关闭用户登录、注销审计功能。 +- 1表示只审计用户登录成功。 +- 2表示只审计用户登录失败。 +- 3表示只审计用户登录成功和失败。 +- 4表示只审计用户注销。 +- 5表示只审计用户注销和登录成功。 +- 6表示只审计用户注销和登录失败。 +- 7表示审计用户登录成功、失败和注销。 + +**默认值:**7 + +## audit\_database\_process + +**参数说明:**该参数决定是否对openGauss的启动、停止、切换和恢复进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭openGauss启动、停止、恢复和切换审计功能。 +- 1表示开启openGauss启动、停止、恢复和切换审计功能。 + +**默认值:**1 + +## audit\_user\_locked + +**参数说明:**该参数决定是否审计openGauss用户的锁定和解锁。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭用户锁定和解锁审计功能。 +- 1表示开启审计用户锁定和解锁功能。 + +**默认值:**1 + +## audit\_user\_violation + +**参数说明:**该参数决定是否审计用户的越权访问操作。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭用户越权操作审计功能。 +- 1表示开启用户越权操作审计功能。 + +**默认值:**0 + +## audit\_grant\_revoke + +**参数说明:**该参数决定是否审计openGauss用户权限授予和回收的操作。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭审计用户权限授予和回收功能。 +- 1表示开启审计用户权限授予和回收功能。 + +**默认值:**1 + diff --git "a/content/zh/docs/Quickstart/\347\224\250\346\210\267\345\234\250openGauss\350\212\202\347\202\271\351\227\264\347\232\204\344\272\222\344\277\241\344\270\242\345\244\261.md" "b/content/zh/docs/Quickstart/\347\224\250\346\210\267\345\234\250openGauss\350\212\202\347\202\271\351\227\264\347\232\204\344\272\222\344\277\241\344\270\242\345\244\261.md" new file mode 100644 index 000000000..da836d6ad --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\224\250\346\210\267\345\234\250openGauss\350\212\202\347\202\271\351\227\264\347\232\204\344\272\222\344\277\241\344\270\242\345\244\261.md" @@ -0,0 +1,222 @@ +# 用户在openGauss节点间的互信丢失 + +## 问题现象 + +在给某个用户配置好互信之后,有时候信任关系会突然丢失,ssh时提示需要输入密码。 + +``` +sc_ssh@node1:~/.ssh> ssh node2 +Password: +``` + +## 可能原因 + +- sshd服务未运行。 +- 防火墙禁止ssh访问。 +- 当前用户对根目录的权限不足。 +- 当前用户对公钥文件的权限不足。 +- “known\_hosts”文件里记录的key和IP地址冲突。 +- 公钥不匹配。 + +## 操作步骤 + +- 确认是否由于sshd服务未运行。 + 1. 执行命令service sshd status查看sshd服务状态。 + 2. 如果sshd服务关闭,使用service sshd start启动sshd服务。 + +- 确认是否由于开启了系统防火墙导致ssh互信丢失。 + 1. 执行命令Euleros: systemctl status firewalld.service查看openGauss防火墙状态。 + 2. 如果显示系统防火墙打开,使用Euleros: systemctl stop firewalld.service命令关闭防火墙。 + + +- 确认是否由于当前用户对根目录的权限不足。 + 1. 使用ll命令查看根目录属性,确认目录属组是否为互信用户的属组,同时确认用户对目录是否有读和写权限。 + 2. 用chown命令修改文件属组,用chmod命令修改目录权限,使其满足要求。 + +- 确认是否由于当前用户对公钥文件的权限不足。 + 1. 查看“\~/.ssh/id\_rsa.pub”文件,确认文件属组是否为互信用户的属组,同时确认用户对文件是否有读和写权限。 + 2. 用chown命令修改文件属组,用chmod命令修改目录权限使其满足要求。 + + +- 确认是否由于“known\_hosts”文件里记录的key和IP地址冲突。 + + 查看“\~/.ssh/known\_hosts”文件里记录的key和IP地址是否一致,如果不一致,可能是由于所指定的IP发生了变化等原因导致了异常。此时,删除“.ssh/known\_hosts”文件里面原来的公钥信息即可。 + + +- 确认是由于公钥不匹配。 + + 排除掉上面的所有原因后,如果问题仍存在,可能是公钥不匹配。此时,请删除公钥目录.ssh下的所有文件,按照下面的手工建立互信重新配置。 + + +## 使用脚本建立互信 + +1. 创建一个执行互信脚本所需要的输入文本,并在此文件中添加openGauss中所有主机IP。 + + ``` + plat1:/opt/software> vim hostfile + 192.168.0.1 + 192.168.0.2 + 192.168.0.3 + ``` + +2. 以需要创建互信的用户执行以下脚本建立互信。 + + ``` + plat1:/opt/software/gaussdb/script# gs_sshexkey -f /opt/software/hostfile + ``` + + /opt/software/hostfile为主机列表,列出所有需要建立互信机器的主机IP。 + + +## 手工建立互信 + +如果openGauss各主机的root密码不一致,gs\_preinstall脚本无法建立互信,可以手工建立互信。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>建立互信的过程中需要生成如下4个文件:authorized\_keys、id\_rsa、id\_rsa.pub、known\_hosts。请勿删除或破坏这些互信相关的文件。 + +手工建立信任关系,步骤如下,plat1,plat2,plat3是主机名: + +1. 在其中一个主机上,生成root用户的本机授权文件。假设在主机plat1上执行。 + 1. 生成密钥。 + + ``` + ssh-keygen -t rsa + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keygen -t rsa + Generating public/private rsa key pair. + Enter file in which to save the key (/root/.ssh/id_rsa): + Created directory '/root/.ssh'. + Enter passphrase (empty for no passphrase): + Enter same passphrase again: + Your identification has been saved in /root/.ssh/id_rsa. + Your public key has been saved in /root/.ssh/id_rsa.pub. + The key fingerprint is: + d5:35:46:33:27:22:09:f0:1e:12:a7:87:fa:33:3f:ab root@plat1 + The key's randomart image is: + +--[ RSA 2048]----+ + | o.o.....O .| + | * .o + * | + | + + . . | + | . + o | + | . S | + | . | + | + | + | +. | + | E.oo | + +-----------------+ + ``` + + 2. 生成本机授权文件。 + + ``` + cat .ssh/id_rsa.pub >> .ssh/authorized_keys + ``` + + 示例如下: + + ``` + plat1:~ # cat .ssh/id_rsa.pub >> .ssh/authorized_keys + ``` + +2. 收集所有的待建互信主机的公钥,写入到本机的known\_hosts文件中。此步骤需要在[步骤1](#zh-cn_topic_0231761642_zh-cn_topic_0085434670_zh-cn_topic_0059782026_li18127395152125)执行的主机上执行。需要收集plat1、plat2、plat3三个主机的公钥。 + 1. 收集plat1的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat1 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat1 >> ~/.ssh/known_hosts + # plat1 SSH-2.0-OpenSSH_5.1 + ``` + + 2. 收集plat2的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat2 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat2 >> ~/.ssh/known_hosts + # plat2 SSH-2.0-OpenSSH_5.1 + ``` + + 3. 收集plat3的公钥,写入到本机known\_hosts文件中。 + + ``` + ssh-keyscan -t rsa plat3 >> ~/.ssh/known_hosts + ``` + + 示例如下: + + ``` + plat1:~ # ssh-keyscan -t rsa plat3 >> ~/.ssh/known_hosts + # plat3 SSH-2.0-OpenSSH_5.1 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known\_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分。 + >- 如果该主机上known\_hosts文件被删除,互信仍然可以使用,但是会有告警提示信息。如果需要规避告警提示信息,请将/etc/ssh/ssh\_config配置文件中,StrictHostKeyChecking参数设置为no。 + + +3. 将互信文件分发到其它所有主机上。在本例中,需要将plat1上的互信文件分发到plat2和plat3上。 + + 1、将互信文件分发到plat2上。Password输入拷贝目标主机的密码。 + + ``` + scp -r .ssh plat2:~ + ``` + + 示例如下: + + ``` + plat1:~ # scp -r .ssh plat2:~ + Password: + authorized_keys 100% 796 0.8KB/s 00:00 + id_rsa 100% 1675 1.6KB/s 00:00 + id_rsa.pub 100% 398 0.4KB/s 00:00 + known_hosts 100% 1089 1.1KB/s 00:00 + ``` + + 2、将互信文件分发到plat3上。Password输入拷贝目标主机的密码。 + + ``` + scp -r .ssh plat3:~ + ``` + + 示例如下: + + ``` + plat1:~ # scp -r .ssh plat3:~ + Password: + authorized_keys 100% 796 0.8KB/s 00:00 + id_rsa 100% 1675 1.6KB/s 00:00 + id_rsa.pub 100% 398 0.4KB/s 00:00 + known_hosts 100% 1089 1.1KB/s 00:00 + ``` + +4. 查看互信是否建成功,可以互相ssh主机名。输入exit退出。 + + ``` + plat1:~ # ssh plat2 + Last login: Tue Jan 5 10:28:18 2016 from plat1 + Huawei's internal systems must only be used for conducting Huawei's business or for purposes authorized by Huawei management.Use is subject to audit at any time by Huawei management. + plat2:~ # exit + logout + Connection to plat2 closed. + plat1:~ # + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果三个以上节点,和上述过程类似。假设节点名为plat1、plat2、plat3、......。第一步,需要在plat1上生成root用户的本机授权文件;第二步,需要收集所有待建互信主机\(plat1、plat2、plat3、......\)的公钥并写入到本机known\_hosts文件中;第三步,需要将互信文件分发到除本机外的所有其它主机\(plat2、plat3、......\)上;第四步,检查互信是否建立成功。 + + diff --git "a/content/zh/docs/Quickstart/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" "b/content/zh/docs/Quickstart/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" new file mode 100644 index 000000000..5b862fe27 --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" @@ -0,0 +1,49 @@ +# 确认连接信息 + +客户端工具通过数据库主节点连接数据库。因此连接前,需清楚数据库主节点所在服务器的IP地址,及数据库主节点的端口号信息。客户端工具可以通过任何一个数据库主节点连接数据库。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用“gs\_om -t status --detail”命令查询openGauss各实例情况,确认数据库主节点所在的服务器的IP地址及数据路径(端口号查询备用)。 + + 例如下面示例中,部署了数据库主节点实例的服务器IP地址分别为192.168.10.11、192.168.10.12和192.168.0.13。数据库主节点数据路径为“/srv/BigData/mppdb/data1/datanode”。 + + ``` + gs_om -t status --detail + ``` + + ``` + [ Coordinator State ] + + node node_ip instance state + ----------------------------------------------------------------------------- + 1 plat1 192.168.0.11 5001 /srv/BigData/mppdb/data1/datanode Normal + 2 plat2 192.168.0.12 5002 /srv/BigData/mppdb/data1/datanode Normal + 3 plat3 192.168.0.13 5003 /srv/BigData/mppdb/data1/datanode Normal + ``` + +3. 确认数据库主节点的端口号。 + + 在[2](#zh-cn_topic_0241234209_zh-cn_topic_0085434639_zh-cn_topic_0059782064_zh-cn_topic_0062129725_li736435692628)查到的数据库主节点数据路径下的postgresql.conf文件中查看端口号信息。示例如下: + + ``` + cat postgresql.conf | grep port + ``` + + ``` + port = 8000 # (change requires restart) + #comm_sctp_port = 1024 # Assigned by installation (change requires restart) + #comm_control_port = 10001 # Assigned by installation (change requires restart) + # supported by the operating system: + # e.g. 'localhost=10.145.130.2 localport=12211 remotehost=10.145.130.3 remoteport=12212, localhost=10.145.133.2 localport=12213 remotehost=10.145.133.3 remoteport=12214' + # e.g. 'localhost=10.145.130.2 localport=12311 remotehost=10.145.130.4 remoteport=12312, localhost=10.145.133.2 localport=12313 remotehost=10.145.133.4 remoteport=12314' + # %r = remote host and port + alarm_report_interval = 10 + pooler_port = 8001 + support_extended_features=true + ``` + + 8000为数据库主节点的端口号。 + + diff --git "a/content/zh/docs/Quickstart/\347\243\201\347\233\230\347\251\272\351\227\264.md" "b/content/zh/docs/Quickstart/\347\243\201\347\233\230\347\251\272\351\227\264.md" new file mode 100644 index 000000000..24fb0449b --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\243\201\347\233\230\347\251\272\351\227\264.md" @@ -0,0 +1,29 @@ +# 磁盘空间 + +介绍与磁盘空间相关的参数,用于限制临时文件所占用的磁盘空间。 + +## sql\_use\_spacelimit + +**参数说明:**限制单个SQL在单个数据库节点上,触发落盘操作时,落盘文件的空间大小,管控的空间包扩普通表、临时表以及中间结果集落盘占用的空间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置 + +**取值范围:**整型,-1\~2147483647,单位为KB。其中-1表示没有限制。 + +**默认值:-1** + +## temp\_file\_limit + +**参数说明:**限制一个会话中,触发下盘操作时,单个下盘文件的空间大小。例如一次会话中,排序和哈希表使用的临时文件,或者游标占用的临时文件。 + +此设置为会话级别的下盘文件控制。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>SQL查询执行时使用的临时表空间不在此限制。 + +**取值范围:**整型,-1\~2147483647,单位为KB。其中-1表示没有限制。 + +**默认值:**-1 + diff --git "a/content/zh/docs/Quickstart/\347\244\272\344\276\213-0.md" "b/content/zh/docs/Quickstart/\347\244\272\344\276\213-0.md" new file mode 100644 index 000000000..c98a40860 --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\244\272\344\276\213-0.md" @@ -0,0 +1,175 @@ +# 示例 + +此示例将演示如何基于openGauss提供的JDBC接口开发应用程序。 + +``` +//DBtest.java +//以下用例以gsjdbc4.jar为例,如果要使用gsjdbc200.jar,请替换驱动类名(将代码中的“org.postgresql”替换成“com.huawei.gauss200.jdbc”)与连接URL串前缀(将“jdbc:postgresql”替换为“jdbc:gaussdb”)。 +//演示基于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(); + } + + } + +} +``` + diff --git "a/content/zh/docs/Quickstart/\347\244\272\344\276\213.md" "b/content/zh/docs/Quickstart/\347\244\272\344\276\213.md" new file mode 100644 index 000000000..d6c6c9941 --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\244\272\344\276\213.md" @@ -0,0 +1,7 @@ +# 示例 + +- **[单节点配置文件](单节点配置文件.md)** + +- **[一主一备配置文件](一主一备配置文件.md)** + + diff --git "a/content/zh/docs/Quickstart/\347\255\211\345\276\205\344\272\213\344\273\266.md" "b/content/zh/docs/Quickstart/\347\255\211\345\276\205\344\272\213\344\273\266.md" new file mode 100644 index 000000000..eb03383b1 --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\255\211\345\276\205\344\272\213\344\273\266.md" @@ -0,0 +1,15 @@ +# 等待事件 + +## enable\_instr\_track\_wait + +**参数说明:**是否开启等待事件信息实时收集功能。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示打开等待事件信息收集功能。 +- off:表示关闭等待事件信息收集功能。 + +**默认值**:on + diff --git "a/content/zh/docs/Quickstart/\347\256\200\345\215\225\346\225\260\346\215\256\347\256\241\347\220\206.md" "b/content/zh/docs/Quickstart/\347\256\200\345\215\225\346\225\260\346\215\256\347\256\241\347\220\206.md" new file mode 100644 index 000000000..885a06b27 --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\256\200\345\215\225\346\225\260\346\215\256\347\256\241\347\220\206.md" @@ -0,0 +1,9 @@ +# 简单数据管理 + +- **[创建数据库](创建数据库.md)** + +- **[创建表](创建表.md)** + +- **[查看对象](查看对象.md)** + + diff --git "a/content/zh/docs/Quickstart/\347\256\200\345\215\225\346\235\203\351\231\220\347\256\241\347\220\206.md" "b/content/zh/docs/Quickstart/\347\256\200\345\215\225\346\235\203\351\231\220\347\256\241\347\220\206.md" new file mode 100644 index 000000000..9aefa9823 --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\256\200\345\215\225\346\235\203\351\231\220\347\256\241\347\220\206.md" @@ -0,0 +1,9 @@ +# 简单权限管理 + +- **[创建角色](创建角色.md)** + +- **[创建用户](创建用户.md)** + +- **[权限赋予](权限赋予.md)** + + diff --git "a/content/zh/docs/Quickstart/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" "b/content/zh/docs/Quickstart/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" new file mode 100644 index 000000000..2b984d82d --- /dev/null +++ "b/content/zh/docs/Quickstart/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" @@ -0,0 +1,45 @@ +# 系统性能快照 + +## enable\_wdr\_snapshot + +**参数说明:**是否开启数据库监控快照功能。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:打开数据库监控快照功能。 +- off:关闭数据库监控快照功能。 + +**默认值**:off + +## wdr\_snapshot\_retention\_days + +**参数说明:**系统中数据库监控快照数据的保留天数,超过设置的值之后,系统每隔wdr\_snapshot\_interval时间间隔,清理snapshot\_id最小的快照数据。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1~8。 + +**默认值**:8 + +## wdr\_snapshot\_query\_timeout + +**参数说明:**系统执行数据库监控快照操作时,设置快照操作相关的sql语句的执行超时时间。如果语句超过设置的时间没有执行完并返回结果,则本次快照操作失败。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,100~INT\_MAX(秒)。 + +**默认值**:100s + +## wdr\_snapshot\_interval + +**参数说明:**后台线程Snapshot自动对数据库监控数据执行快照操作的时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,10~60(分钟)。 + +**默认值**:1h + diff --git "a/content/zh/docs/Quickstart/\350\207\252\345\212\250\346\270\205\347\220\206.md" "b/content/zh/docs/Quickstart/\350\207\252\345\212\250\346\270\205\347\220\206.md" new file mode 100644 index 000000000..a7d96059d --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\207\252\345\212\250\346\270\205\347\220\206.md" @@ -0,0 +1,192 @@ +# 自动清理 + +系统自动清理进程(autovacuum)自动执行VACUUM和ANALYZE命令,回收被标识为删除状态的记录空间,并更新表的统计数据。 + +## autovacuum + +**参数说明:**控制数据库自动清理进程(autovacuum)的启动。自动清理进程运行的前提是将[track\_counts](zh-cn_topic_0237124727.md#zh-cn_topic_0059779313_s3f4fb0b1004041f69e1454c701952411)设置为on。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 如果希望系统在故障恢复后,具备自动清理两阶段事务的功能,请将autovacuum设置为on; +>- 当设置autovacuum为on,[autovacuum\_max\_workers](#zh-cn_topic_0242371520_zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)为0时,表示系统不会自动进行autovacuum,只会在故障恢复后,自动清理两阶段事务; +>- 当设置autovacuum为on,[autovacuum\_max\_workers](#zh-cn_topic_0242371520_zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)大于0时,表示系统不仅在故障恢复后,自动清理两阶段事务,并且还可以自动清理进程。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>即使此参数设置为off,当事务ID回绕即将发生时,数据库也会自动启动自动清理进程。对于create/drop database发生异常时,可能有的节点提交或回滚,有的节点未提交(prepared状态),此时系统不能自动修复,需要手动修复,修复步骤: +>1. 使用gs\_clean工具(-N参数)查询出异常两阶段事务的xid以及处于prepared的节点; +>2. 登录事务处于prepared状态的节点,系统管理员连接一个可用的数据库(如postgres),执行语句set xc\_maintenance\_mode = on; +>3. 根据事务全局状态提交或者回滚此两阶段事务(如提交语句;回滚语句)。 + +**取值范围:**布尔型 + +- on表示开启数据库自动清理进程。 +- off表示关闭数据库自动清理进程。 + +**默认值:**on + +## autovacuum\_mode + +**参数说明:**该参数仅在autovacuum设置为on的场景下生效,它控制autoanalyze或autovacuum的打开情况。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- analyze表示只做autoanalyze。 +- vacuum表示只做autovacuum。 +- mix表示autoanalyze和autovacuum都做。 +- none表示二者都不做。 + +**默认值:**mix + +## autoanalyze\_timeout + +**参数说明:**设置autoanalyze的超时时间。在对某张表做autoanalyze时,如果该表的analyze时长超过了autoanalyze\_timeout,则自动取消该表此次analyze。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**int类型,单位是s,0\~2147483。 + +**默认值:**5min(即300s) + +## autovacuum\_io\_limits + +**参数说明:**控制autovacuum进程每秒触发IO的上限。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0~1073741823和-1。其中-1表示不控制,而是使用系统默认控制组。 + +**默认值:**-1 + +## log\_autovacuum\_min\_duration + +**参数说明:**当自动清理的执行时间大于或者等于某个特定的值时,向服务器日志中记录自动清理执行的每一步操作。设置此选项有助于追踪自动清理的行为。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +举例如下: + +将log\_autovacuum\_min\_duration设置为250ms,记录所有运行大于或者等于250ms的自动清理命令的相关信息。 + +**取值范围:**整型,最小值为-1,最大值为2147483647,单位为毫秒。 + +- 当参数设置为0时,表示所有的自动清理操作都记录到日志中。 +- 当参数设置为-1时,表示所有的自动清理操作都不记录到日志中。 +- 当参数设置为非-1时,当由于锁冲突的存在导致一个自动清理操作被跳过,记录一条消息。 + +**默认值:**-1 + +## autovacuum\_max\_workers + +**参数说明:**设置能同时运行的自动清理线程的最大数量,该参数的取值上限与GUC参数max\_connections和job\_queue\_processes大小有关。 + +该参数属于POSTMASTER类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0(表示不会自动进行autovacuum),理论最大值为262143,实际最大值为动态值,计算公式为“262143 - max\_connections - job\_queue\_processes - 辅助线程数 – autovacuum的lancher线程数 - 1”,其中辅助线程数和autovacuum的lancher线程数由两个宏来指定,当前版本的默认值分别为20和2。 + +**默认值:**3 + +## autovacuum\_naptime + +**参数说明:**设置两次自动清理操作的时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,单位为s,最小值为1,最大值为2147483。 + +**默认值:**10min(即600s) + +## autovacuum\_vacuum\_threshold + +**参数说明:**设置触发VACUUM的阈值。当表上被删除或更新的记录数超过设定的阈值时才会对这个表执行VACUUM操作。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483647。 + +**默认值:**50 + +## autovacuum\_analyze\_threshold + +**参数说明:**设置触发ANALYZE操作的阈值。当表上被删除、插入或更新的记录数超过设定的阈值时才会对这个表执行ANALYZE操作。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483647。 + +**默认值:**50 + +## autovacuum\_vacuum\_scale\_factor + +**参数说明:**设置触发一个VACUUM时增加到autovacuum\_vacuum\_threshold的表大小的缩放系数。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**浮点型,0.0~100.0 + +**默认值:**0.2 + +## autovacuum\_analyze\_scale\_factor + +**参数说明:**设置触发一个ANALYZE时增加到autovacuum\_analyze\_threshold的表大小的缩放系数。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**浮点型,0.0~100.0 + +**默认值:**0.1 + +## autovacuum\_freeze\_max\_age + +**参数说明:**设置事务内的最大时间,使得表的pg\_class.relfrozenxid字段在VACUUM操作执行之前被写入。 + +- VACUUM也可以删除pg\_clog/子目录中的旧文件。 +- 即使自动清理进程被禁止,系统也会调用自动清理进程来防止循环重复。 + +该参数属于POSTMASTER类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:长**整型,100 000~576 460 752 303 423 487 + +**默认值:**20000000000 + +## autovacuum\_vacuum\_cost\_delay + +**参数说明:**设置在自动VACUUM操作里使用的开销延迟数值。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,-1~100,单位为毫秒(ms)。其中-1表示使用常规的vacuum\_cost\_delay。 + +**默认值:**20ms + +## autovacuum\_vacuum\_cost\_limit + +**参数说明:**设置在自动VACUUM操作里使用的开销限制数值。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,-1~10000。其中-1表示使用常规的vacuum\_cost\_limit。 + +**默认值:**-1 + +## twophase\_clean\_workers + +**参数说明:**该参数用来控制内核调度gs\_clean工具的并发清理数。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,1~10 + +**默认值:**3 + +## defer\_csn\_cleanup\_time + +**参数说明:**用来指定本地回收时间间隔,单位为毫秒(ms)。 + +**取值范围:**整型,0\~INT\_MAX。 + +**默认值**:5s(即5000ms) + diff --git "a/content/zh/docs/Quickstart/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" "b/content/zh/docs/Quickstart/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" new file mode 100644 index 000000000..f3c6d4f13 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\216\267\345\217\226\345\271\266\346\240\241\351\252\214\345\256\211\350\243\205\345\214\205.md" @@ -0,0 +1,73 @@ +# 获取并校验安装包 + +为了防止安装包在传输过程中被恶意篡改或破坏给客户网络安全造成威胁,在获取到安装包后,需要对安装包的完整性进行校验,通过了校验的安装包才能部署。 + +## 前提条件 + +- 已经获取PGP简易验证工具,如PGPVerify,同时也已获取公钥文件。 +- 已经获取openGauss安装包和签名文件,安装包与签名文件是一一对应并放在同一目录下,一个安装包对应一个校验文件,签名文件由各产品与对应的安装包版本同时发布,签名文件的后缀是“asc”,通常情况下名称和安装包名称相同。假设安装包的名称openGauss-x.x.x.x-CentOS-64bit.tar.gz时,对应的校验文件的名称为“openGauss-x.x.x.x-CentOS-64bit.tar.asc”。 + +## 操作步骤 + +1. **从openGauss开源社区下载对应平台的安装包**。 + 1. 登陆openGauss开源社区。 + 2. 单击“下载”。 + 3. 解压下载后的压缩包。 + +2. 验证安装程序。 + 1. 解压安装包,检查安装目录及文件是否齐全。在安装包所在目录执行以下命令: + + ``` + tar -zxvfopenGauss-x.x.x-openEuler-64bit.tar.gz + ls -1 + ``` + + 执行ls命令,显示类似如下信息,其中packages目录中_openGauss-x.x.x-openEuler_-64bit.tar.gz表示数据库安装包,在执行_openGauss-x.x.x_安装的过程中会对数据库安装程序自动执行SHA256校验 + + ``` + total 188632 + -rwxr-xr-x 1 root root 392301 Sep 7 14:53 Copyright Notice.docx + -rw-r--r-- 1 root root 1615973 Sep 7 14:52 openGauss-x.x.x-Inspection.tar.gz + -rw-r--r-- 1 root root 17521151 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-ClientTools.tar.gz + -rw-r--r-- 1 root root 7386461 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-Jdbc.tar.gz + -rw-r--r-- 1 root root 4336455 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-Libpq.tar.gz + -rw-r--r-- 1 root root 4982437 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-Odbc.tar.gz + -rw-r--r-- 1 root root 2983406 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit-gauss-loader.tar.gz + -rw-r--r-- 1 root root 4559410 Sep 7 14:54openGauss-x.x.x-openEuler-64bit-gsql.tar.gz + -rwxr-xr-x 1 root root 95274943 Sep 7 14:51 openGauss-x.x.x-openEuler-64bit-symbol.tar.gz + -rwx------ 1 root root 184035063 Sep 7 14:53 openGauss-x.x.x-openEuler-64bit.bin + -rw-r--r-- 1 root root 65 Sep 7 14:53 openGauss-x.x.x-openEuler-64bit.sha256 + -rw-r--r-- 1 root root 224104563 Sep 7 14:54 openGauss-x.x.x-openEuler-64bit.tar.gz + -rw-r--r-- 1 root root 7253 Sep 7 14:30 openGauss-x.x.x-Sslcert.tar.gz + -rwx------ 1 root root 370511659 Sep 10 15:14 openGauss-x.x.x_PACKAGES.tar.gz + -rw------- 1 root root 65 Sep 7 14:53 inplace_upgrade_sql.sha256 + -rw------- 1 root root 193799 Sep 7 14:53 inplace_upgrade_sql.tar.gz + drwxr-xr-x 9 root root 4096 Sep 7 14:53 lib + drwxr-xr-x 4 root root 4096 Sep 7 14:53 libcgroup + drwxr-xr-x 11 root root 4096 Sep 7 14:53 lvs + drwxr-xr-x 7 root root 4096 Sep 7 14:53 pssh-2.3.1 + drwxr-xr-x 6 root root 4096 Sep 7 14:53 script + drwxr-xr-x 9 root root 4096 Sep 7 14:53 sctp_patch + -rwxr-xr-x 1 root root 40 Sep 7 14:53 server.key.cipher + -rwxr-xr-x 1 root root 24 Sep 7 14:53 server.key.rand + drwxr-xr-x 5 root root 4096 Sep 7 14:53 sudo + -rw-r--r-- 1 root root 28 Sep 7 14:53 version.cfg + + ``` + + 2. 进入scripts目录启动openGauss安装,观察是否提示安装不成功。 + + 在安装过程中,安装包会自动使用SHA256文件校验数据库安装程序的完整性。 + + 如果出现类似如下的信息,则表示数据库安装包校验失败,从而会导致openGauss安装失败。 + + ``` + Error: The sha256 value is different! + Bin file a4ebce0b6052723b1f386928e4d820fa2 + sha256 file 4ebce0b6052723b1f386928e4d820fa2 + ``` + + 如果无任何错误提示,则表示安装程序正确,未被非法修改。 + + + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" new file mode 100644 index 000000000..31c5273b7 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\344\275\215\347\275\256.md" @@ -0,0 +1,160 @@ +# 记录日志的位置 + +## log\_destination + +**参数说明:**openGauss支持多种方法记录服务器日志,log\_destination的取值为一个逗号分隔开的列表(如log\_destination="stderr,csvlog")。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +有效值为stderr、csvlog、syslog。 + +- 取值为stderr,表示日志打印到屏幕。 +- 取值为csvlog,表示日志的输出格式为“逗号分隔值”即CSV (Comma Separated Value)格式。使用csvlog记录日志的前提是将[logging\_collector](#zh-cn_topic_0242371511_zh-cn_topic_0237124721_zh-cn_topic_0059778787_s61d6090c04ee464fb54f8b31936ba818)设置为on,请参见[使用CSV格式写日志](使用CSV格式写日志.md#ZH-CN_TOPIC_0244544101)。 +- 取值为syslog,表示通过操作系统的syslog记录日志。openGauss使用syslog的LOCAL0 ~ LOCAL7记录日志,请参见[syslog\_facility](#zh-cn_topic_0242371511_zh-cn_topic_0237124721_zh-cn_topic_0059778787_s853e14ac6a8a47678036cdc8e5119090)。使用syslog记录日志需在操作系统后台服务配置文件中添加代码: + + ``` + local0.* /var/log/postgresql + ``` + + +**默认值:**stderr + +## logging\_collector + +**参数说明:**控制开启后端日志收集进程logger进行日志收集。该进程捕获发送到stderr或csvlog的日志消息并写入日志文件。 + +这种记录日志的方法比将日志记录到syslog更加有效,因为某些类型的消息在syslog的输出中无法显示。例如动态链接库加载失败消息和脚本(例如archive\_command)产生的错误消息。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>将服务器日志发送到stderr时可以不使用logging\_collector参数,此时日志消息会被发送到服务器的stderr指向的空间。这种方法的缺点是日志回滚困难,只适用于较小的日志容量。 + +**取值范围:**布尔型 + +- on表示开启日志收集功能。 +- off表示关闭日志收集功能。 + +**默认值:**on + +## log\_directory + +**参数说明:**logging\_collector设置为on时,log\_directory决定存放服务器日志文件的目录。 它可以是绝对路径,或者是相对路径(相对于数据目录的路径)。log\_directory支持动态修改,可以通过gs\_guc reload实现。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当配置文件中log\_directory的值为非法路径时,会导致openGauss无法重新启动。 +>- 通过gs\_guc reload动态修改log\_directory时,当指定路径为合法路径时,日志输出到新的路径下。当指定路径为非法路径时,日志输出到上一次合法的日志输出路径下而不影响数据库正常运行。此时即使指定的log\_directory的值非法,也会写入到配置文件中。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>合法路径:用户对此路径有读写权限 +>非法路径:用户对此路径无读写权限 + +**取值范围:**字符串 + +**默认值:**安装时指定。 + +## log\_filename + +**参数说明:**logging\_collector设置为on时,log\_filename决定服务器运行日志文件的名称。通常日志文件名是按照strftime模式生成,因此可以用系统时间定义日志文件名,用%转义字符实现。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 建议使用%转义字符定义日志文件名称,否则难以对日志文件进行有效的管理。 +>- 当log\_destination设为csvlog时,系统会生成附加了时间戳的日志文件名,文件格式为csv格式,例如“server\_log.1093827753.csv”。 + +**取值范围:**字符串 + +**默认值:**postgresql-%Y-%m-%d\_%H%M%S.log + +## log\_file\_mode + +**参数说明:**[logging\_collector](#zh-cn_topic_0242371511_zh-cn_topic_0237124721_zh-cn_topic_0059778787_s61d6090c04ee464fb54f8b31936ba818)设置为on时,log\_file\_mode设置服务器日志文件的权限。通常log\_file\_mode的取值是能够被chmod和umask系统调用接受的数字。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 使用此选项前请设置log\_directory,将日志存储到数据目录之外的地方。 +>- 因日志文件可能含有敏感数据,故不能将其设为对外可读。 + +**取值范围:**整型,0000~0777 (8进制计数,转化为十进制 0 \~ 511)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 0600表示只允许服务器管理员读写日志文件。 +>- 0640表示允许管理员所在用户组成员只能读日志文件。 + +**默认值:**0600 + +## log\_truncate\_on\_rotation + +**参数说明:**logging\_collector设置为on时,log\_truncate\_on\_rotation设置日志消息的写入方式。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +示例如下: + +假设日志需要保留7天,每天生成一个日志文件,日志文件名设置为server\_log.Mon、server\_log.Tue等。第二周的周二生成的日志消息会覆盖写入到server\_log.Tue。设置方法:将log\_filename设置为server\_log.%a ,log\_truncate\_on\_rotation设置为on,log\_rotation\_age设置为1440,即日志有效时间为1天。 + +**取值范围:** 布尔型 + +- on表示openGauss以覆盖写入的方式写服务器日志消息。 +- off表示openGauss将日志消息附加到同名的现有日志文件上。 + +**默认值:**off + +## log\_rotation\_age + +**参数说明:**logging\_collector设置为on时,log\_rotation\_age决定创建一个新日志文件的时间间隔。当现在的时间减去上次创建一个服务器日志的时间超过了log\_rotation\_age的值时,将生成一个新的日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ 35791394,单位为min。其中0表示关闭基于时间的新日志文件的创建。 + +**默认值:**1440\(min\) + +## log\_rotation\_size + +**参数说明:**logging\_collector设置为on时,log\_rotation\_size决定服务器日志文件的最大容量。当日志消息的总量超过日志文件容量时,服务器将生成一个新的日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX / 1024,单位为KB。 + +0表示关闭基于容量的新日志文件的创建。 + +**默认值:**20MB + +## syslog\_facility + +**参数说明:**log\_destination设置为syslog时,syslog\_facility配置使用syslog记录日志的“设备”。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型,有效值有local0、local1、local2、local3、local4、local5、local6、local7。 + +**默认值:**local0 + +## syslog\_ident + +**参数说明:**[log\_destination](#zh-cn_topic_0242371511_zh-cn_topic_0237124721_zh-cn_topic_0059778787_sb6c9884f69bd4765a60f80810c94f194)设置为syslog时,syslog\_ident设置在syslog日志中openGauss日志消息的标识。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**postgres + +## event\_source + +**参数说明:**log\_destination设置为eventlog时,event\_source设置在日志中openGauss日志消息的标识。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**PostgreSQL + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" new file mode 100644 index 000000000..70a8ee8c5 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\345\206\205\345\256\271.md" @@ -0,0 +1,389 @@ +# 记录日志的内容 + +## debug\_print\_parse + +**参数说明:**用于控制打印解析树结果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启打印结果的功能。 +- off表示关闭打印结果的功能。 + +**默认值:**off + +## debug\_print\_rewritten + +**参数说明:**用于控制打印查询重写结果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启打印结果的功能。 +- off表示关闭打印结果的功能。 + +**默认值:**off + +## debug\_print\_plan + +**参数说明:**用于控制打印查询执行结果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启打印结果的功能。 +- off表示关闭打印结果的功能。 + +**默认值:**off + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 只有当日志的级别为log及以上时,debug\_print\_parse、debug\_print\_rewritten和debug\_print\_plan的调试信息才会输出。当这些选项打开时,调试信息只会记录在服务器的日志中,而不会输出到客户端的日志中。通过设置[client\_min\_messages](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)和[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)参数可以改变日志级别。 +>- 在打开debug\_print\_plan开关的情况下需尽量避免调用gs\_encrypt\_aes128及gs\_decrypt\_aes128函数,避免敏感参数信息在日志中泄露的风险。同时建议用户在打开debug\_print\_plan开关生成的日志中对gs\_encrypt\_aes128及gs\_decrypt\_aes128函数的参数信息进行过滤后再提供给外部维护人员定位,日志使用完成后请及时删除。 + +## debug\_pretty\_print + +**参数说明:**设置此选项对debug\_print\_parse、debug\_print\_rewritten和debug\_print\_plan产生的日志进行缩进,会生成易读但比设置为off时更长的输出格式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示进行缩进。 +- off表示不进行缩进。 + +**默认值:**on + +## log\_checkpoints + +**参数说明:**控制在服务器日志中记录检查点和重启点的信息。打开此参数时,服务器日志消息包含涉及检查点和重启点的统计量,其中包含需要写的缓存区的数量及写入所花费的时间等。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开此参数时,服务器日志消息包含涉及检查点和重启点的统计量。 +- off表示关闭此参数时,服务器日志消息包含不涉及检查点和重启点的统计量。 + +**默认值:**off + +## log\_connections + +**参数说明:**控制记录客户端的连接请求信息。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>有些客户端程序(例如gsql),在判断是否需要口令的时候会尝试连接两次,因此日志消息中重复的“connection receive”(收到连接请求)并不意味着一定是问题。 + +**取值范围:**布尔型 + +- on表示记录信息。 +- off表示不记录信息。 + +**默认值:**off + +## log\_disconnections + +**参数说明:**控制记录客户端结束连接信息。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示记录信息。 +- off表示不记录信息。 + +**默认值:**off + +## log\_duration + +**参数说明:**控制记录每个已完成SQL语句的执行时间。对使用扩展查询协议的客户端、会记录语法分析、绑定和执行每一步所花费的时间。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- 设置为off ,该选项与[log\_min\_duration\_statement](记录日志的时间.md#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_s62cf0fb833324a82a841f02134a932e5)的不同之处在于log\_min\_duration\_statement强制记录查询文本。 +- 设置为on并且log\_min\_duration\_statement大于零,记录所有持续时间,但是仅记录超过阈值的语句。这可用于在高负载情况下搜集统计信息。 + +**默认值:**on + +## log\_error\_verbosity + +**参数说明:**控制服务器日志中每条记录的消息写入的详细度。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- terse输出不包括DETAIL、HINT、QUERY及CONTEXT错误信息的记录。 +- verbose输出包括SQLSTATE错误代码 、源代码文件名、函数名及产生错误所在的行号。 +- default输出包括DETAIL、HINT、QUERY及CONTEXT错误信息的记录,不包括SQLSTATE错误代码 、源代码文件名、函数名及产生错误所在的行号。 + +**默认值:**default + +## log\_hostname + +**参数说明:**默认状态下,连接消息日志只显示正在连接主机的IP地址。打开此选项同时可以记录主机名。由于解析主机名可能需要一定的时间,可能影响数据库的性能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示可以同时记录主机名。 +- off表示不可以同时记录主机名。 + +**默认值:**on + +## log\_line\_prefix + +**参数说明:**控制每条日志信息的前缀格式。日志前缀类似于printf风格的字符串,在日志的每行开头输出。用以%为开头的“转义字符”代替[表1](#zh-cn_topic_0242371513_zh-cn_topic_0237124723_zh-cn_topic_0059778400_zh-cn_topic_0058967718_table27298862)中的状态信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**表 1** 转义字符表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

转义字符

+

效果

+

%a

+

应用程序名称。

+

%u

+

用户名。

+

%d

+

数据库名。

+

%r

+

远端主机名或者IP地址以及远端端口,在不启动log_hostname时显示IP地址及远端端口。

+

%h

+

远端主机名或者IP地址,在不启动log_hostname时只显示IP地址。

+

%p

+

线程ID。

+

%t

+

时间戳(没有毫秒)。

+

%m

+

带毫秒的时间戳。

+

%n

+

表示指定错误从哪个节点上报的。

+

%i

+

命令标签:会话当前执行的命令类型。

+

%e

+

SQLSTATE错误码。

+

%c

+

会话ID,详见说明。

+

%l

+

每个会话或线程的日志编号,从1开始。

+

%s

+

进程启动时间。

+

%v

+

虚拟事务ID(backendID/ localXID)

+

%x

+

事务ID(0表示没有分配事务ID)。

+

%q

+

不产生任何输出。如果当前线程是后端线程,忽略这个转义序列,继续处理后面的转义序列;如果当前线程不是后端线程,忽略这个转义序列和它后面的所有转义序列。

+

%%

+

字符% 。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>转义字符%c打印一个独一无二的会话ID,由两个4字节的十六进制数组成,通过字符“.”分开。这两个十六进制数分别表示进程的启动时间及进程编号,所以%c也可以看作是保存打印这些名目的途径的空间。比如,从pg\_stat\_activity中产生会话ID,可以用下面的查询: +>``` +>SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' || +> to_hex(pid) +>FROM pg_stat_activity; +>``` +>- 当log\_line\_prefix设置为空值时,请将其最后一个字符作为一个独立的段,以此来直观地与后续的日志进行区分,也可以使用一个标点符号。 +>- Syslog生成自己的时间戳及进程ID信息,所以当登录日志时,不需要包含这些转义字符。 + +**取值范围:**字符串 + +**默认值:**%m %c %d %p %a %x %n %e + +>![](public_sys-resources/icon-note.gif) **说明:** +>%m %c %d %p %a %x %n %e表示在日志开头附加会话开始时间戳,会话ID,数据库名,线程ID,应用程序名,事务ID,报错节点,SQLSTATE错误码。 + +## log\_lock\_waits + +**参数说明:**当一个会话的等待获得一个锁的时间超过[deadlock\_timeout](锁管理.md#zh-cn_topic_0242371525_zh-cn_topic_0237124735_zh-cn_topic_0059778102_se697b4ff00b643938b67eb5e08206cd5)的值时,此选项控制在数据库日志中记录此消息。这对于决定锁等待是否会产生一个坏的行为是非常有用的。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示记录此信息。 +- off表示不记录此信息。 + +**默认值:**off + +## log\_statement + +**参数说明:**控制记录SQL语句。对于使用扩展查询协议的客户端,记录接收到执行消息的事件和绑定参数的值(内置单引号要双写)。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>即使log\_statement设置为all,包含简单语法错误的语句也不会被记录,因为仅在完成基本的语法分析并确定了语句类型之后才记录日志。在使用扩展查询协议的情况下,在执行阶段之前(语法分析或规划阶段)同样不会记录。将log\_min\_error\_statement设为ERROR或更低才能记录这些语句。 + +**取值范围:**枚举类型 + +- none表示不记录语句。 +- ddl表示记录所有的数据定义语句,比如CREATE、ALTER和DROP语句。 +- mod表示记录所有DDL语句,还包括数据修改语句INSERT、UPDATE、DELETE、TRUNCATE和COPY FROM 。 +- all表示记录所有语句,PREPARE、EXECUTE和EXPLAIN ANALYZE语句也同样被记录。 + +**默认值:**none + +## log\_temp\_files + +**参数说明:**控制记录临时文件的删除信息。临时文件可以用来排序、哈希及临时查询结果。当一个临时文件被删除时,将会产生一条日志消息。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为-1,最大值2147483647,单位KB。 + +- 正整数表示只记录比log\_temp\_files设定值大的临时文件的删除信息。 +- 值0 表示记录所有的临时文件的删除信息。 +- 值-1 表示不记录任何临时文件的删除信息。 + +**默认值:**-1 + +## log\_timezone + +**参数说明:**设置服务器写日志文件时使用的时区。与[TimeZone](区域和格式化.md#zh-cn_topic_0242371523_zh-cn_topic_0237124733_zh-cn_topic_0059778109_sa60c5d71347646c2ad97ccb7541c6f12)不同,这个值是数据库范围的,针对所有连接到本数据库的会话生效。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**PRC + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_initdb进行相应系统环境设置时会对默认值进行修改。 + +## logging\_module + +**参数说明:**用于设置或者显示模块日志在服务端的可输出性。该参数属于会话级参数,不建议通过gs\_guc工具来设置。 + +该参数属于USERSET类型参数,设置请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置的方法进行设置。 + +**取值范围:**字符串 + +**默认值:**所有模块日志在服务端是不输出的,可由SHOW logging\_module查看。为ALL,on\(\),off\(DFS,GUC,ORC,SLRU,MEM\_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,OPFUSION,VEC\_EXECUTOR,LLVM,OPT,OPT\_REWRITE,OPT\_JOIN,OPT\_AGG,OPT\_SUBPLAN,OPT\_SETOP,OPT\_SKEW,UDF,COOP\_ANALYZE,WLMCP,ACCELERATE,,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN\_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE\_CKPT,DBL\_WRT,RTO,HEARTBEAT\)。 + +**设置方法**:首先,可以通过SHOW logging\_module来查看哪些模块是支持可控制的。例如,查询输出结果为: + +``` +postgres=# show logging_module; +logging_module +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,T,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT) +(1 row) +``` + +支持可控制的模块使用大写来标识,特殊标识ALL用于对所有模块日志进行设置。可以使用on/off来控制模块日志的输出。设置SSL模块日志为可输出,使用如下命令: + +``` +postgres=# set logging_module='on(SSL)'; +SET +postgres=# show logging_module; logging_module +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(SSL),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PARAM) +(1 row) +``` + +可以看到模块SSL的日志输出被打开。 + +ALL标识是相当于一个快捷操作,即对所有模块的日志可输出进行开启或关闭。 + +``` +postgres=# set logging_module='off(ALL)'; +SET +postgres=# show logging_module; logging_module +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT) +(1 row) + +postgres=# set logging_module='on(ALL)'; +SET +postgres=# show logging_module; logging_module +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT),off() +(1 row) +``` + +**依赖关系**:该参数依赖于log\_min\_level参数的设置 + +## opfusion\_debug\_mode + +**参数说明:**用于调试简单查询是否进行查询优化。设置成log级别可以在数据库节点的执行计划中看到没有查询优化的具体原因。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- off表示不打开该功能。 +- log表示打开该功能,可以在数据库节点的执行计划中看到没有查询优化的具体原因。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>提供在log中显示语句没有查询优化的具体原因,需要将参数设置成log级别,log\_min\_messages设置成debug4级别,logging\_module设置'on\(OPFUSION\)',注意log内容可能会比较多,尽可能在调优期间执行少量作业使用。 + +**默认值:**off + diff --git "a/content/zh/docs/Quickstart/\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/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" new file mode 100644 index 000000000..87f9e645e --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\260\345\275\225\346\227\245\345\277\227\347\232\204\346\227\266\351\227\264.md" @@ -0,0 +1,183 @@ +# 记录日志的时间 + +## client\_min\_messages + +**参数说明:**控制发送到客户端的消息级别。每个级别都包含排在它后面的所有级别中的信息。级别越低,发送给客户端的消息就越少。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当client\_min\_messages和[log\_min\_messages](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)取相同值时,其值所代表的级别不同。 + +**取值范围:**枚举类型,有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。在实际设置过程中,如果设置的级别大于error,为fatal或panic,系统会默认将级别转为error。 + +**默认值:**notice + +## log\_min\_messages + +**参数说明:**控制写到服务器日志文件中的消息级别。每个级别都包含排在它后面的所有级别中的信息。级别越低,服务器运行日志中记录的消息就越少。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当[client\_min\_messages](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)和log\_min\_messages取相同值log时所代表的消息级别不同。 + +**取值范围:**枚举类型,有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。 + +**默认值:**warning + +## log\_min\_error\_statement + +**参数说明:**控制在服务器日志中记录错误的SQL语句。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型,有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 设置为error ,表示导致错误、日志消息、致命错误、panic的语句都将被记录。 +>- 设置为panic,表示关闭此特性。 + +**默认值:**error + +## log\_min\_duration\_statement + +**参数说明:**当某条语句的持续时间大于或者等于特定的毫秒数时,log\_min\_duration\_statement参数用于控制记录每条完成语句的持续时间。 + +设置log\_min\_duration\_statement可以很方便地跟踪需要优化的查询语句。对于使用扩展查询协议的客户端,语法分析、绑定、执行每一步所花时间被独立记录。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当此选项与[log\_statement](zh-cn_topic_0237124723.md#zh-cn_topic_0059778400_s77b3e2e16a3e4705a139bef98688be8a)同时使用时,已经被log\_statement记录的语句文本不会被重复记录。在没有使用syslog情况下,推荐使用[log\_line\_prefix](zh-cn_topic_0237124723.md#zh-cn_topic_0059778400_sd57ce2167a8149239e10ab0cef12b949)记录PID或会话ID,方便将当前语句消息连接到最后的持续时间消息。 + +**取值范围:**整型,-1 \~ INT\_MAX,单位为毫秒。 + +- 设置为250,所有运行时间不短于250ms的SQL语句都会被记录。 +- 设置为0,输出所有语句的持续时间。 +- 设置为-1,关闭此功能。 + +**默认值:**3s(即3000ms) + +## backtrace\_min\_messages + +**参数说明:**控制当产生该设置参数级别相等或更高级别的信息时,会打印函数的堆栈信息到服务器日志文件中。 + +该参数属于SUSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该参数作为客户现场问题定位手段使用,且由于频繁的打印函数栈会对系统的开销及稳定性有一定的影响,因此如果需要进行问题定位时,建议避免将backtrace\_min\_messages的值设置为fatal及panic以外的级别。 + +**取值范围:**枚举类型 + +有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。 + +**默认值:**panic + +[表1](#zh-cn_topic_0242371512_zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)解释openGauss中使用的消息安全级别。当日志输出到syslog或者eventlog时,openGauss进行如表中的转换。 + +**表 1** 信息严重程度分类 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

信息严重程度类型

+

详细说明

+

系统日志

+

事件日志

+

debug[1-5]

+

报告详细调试信息。

+

DEBUG

+

INFORMATION

+

log

+

报告对数据库管理员有用的信息, 比如检查点操作统计信息。

+

INFO

+

INFORMATION

+

info

+

报告用户可能需求的信息, 比如在VACUUM VERBOSE过程中的信息。

+

INFO

+

INFORMATION

+

notice

+

报告可能对用户有帮助的信息, 比如, 长标识符的截断, 作为主键一部分创建的索引等。

+

NOTICE

+

INFORMATION

+

warning

+

报告警告信息, 比如在事务块范围之外的COMMIT。

+

NOTICE

+

WARNING

+

error

+

报告导致当前命令退出的错误。

+

WARNING

+

ERROR

+

fatal

+

报告导致当前会话终止的原因。

+

ERR

+

ERROR

+

panic

+

报告导致整个数据库被关闭的原因。

+

CRIT

+

ERROR

+
+ +## plog\_merge\_age + +**参数说明:**该参数用于控制性能日志数据输出的周期。 + +该参数属于USERSET类型参数,请参考[表1](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该参数以毫秒为单位的,建议在使用过程中设置值为1000的整数倍,即设置值以秒为最小单位。该参数所控制的性能日志文件以prf为扩展名,文件放置在$GAUSSLOG/gs\_profile/ 目录下面,其中node\_name是由postgres.conf文件中的pgxc\_node\_name的值,不建议外部使用该参数。 + +**取值范围:**0\~2147483647,单位为毫秒(ms)。 + +当设置为0时,当前会话不再输出性能日志数据。当设置为非0时,当前会话按照指定的时间周期进行输出性能日志数据。 + +该参数设置得越小,输出的日志数据越多,对性能的负面影响越大。 + +**默认值:**3s + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256.md" new file mode 100644 index 000000000..33545d5fc --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256.md" @@ -0,0 +1,189 @@ +# 设置 + +## wal\_level + +**参数说明:**设置写入WAL信息量的级别。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果需要启用WAL日志归档和主备机的数据流复制,必须将此参数设置为archive或者hot\_standby。 +>- 如果此参数设置为archive,hot\_standby必须设置为off,否则将导致数据库无法启动。但是,hot\_standby在双机环境中不能设置为off,具体参见hot\_standby参数说明。 + +**取值范围**:枚举类型 + +- minimal + + 优点:一些重要操作(包括创建表、创建索引、簇操作和表的复制)都能安全的跳过,这样就可以使操作变得更快。 + + 缺点:WAL仅提供从数据库服务器崩溃或者紧急关闭状态恢复时所需要的基本信息,无法用WAL归档日志恢复数据。 + +- archive + + 这个参数增加了WAL归档需要的日志信息,从而可以支持数据库的归档恢复。 + +- hot\_standby + - 这个参数进一步增加了在备机上运行的SQL查询的信息,这个参数只能在数据库服务重新启动后生效。 + - 为了在备机上开启只读查询,wal\_level必须在主机上设置成hot\_standby ,并且备机必须打开hot\_standby参数。hot\_standby和archive级别之间的性能只有微小的差异,如果它们的设置对产品的性能影响有明显差异,欢迎反馈。 + + +**默认值:**hot\_standby + +## fsync + +**参数说明:**设置openGauss服务器是否使用fsync\(\)系统函数(请参见[wal\_sync\_method](#zh-cn_topic_0242371497_zh-cn_topic_0237124707_zh-cn_topic_0059778393_s9fc8bf6fcd2b474d894fc8ee7385fe86))确保数据的更新及时写入物理磁盘中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 使用fsync\(\)系统函数可以保证在操作系统或者硬件崩溃的情况下将数据恢复到一个已知的状态。 +>- 如果将此参数关闭,可能会在系统崩溃时无法恢复原来的数据,导致数据库不可用。 + +**取值范围:**布尔型 + +- on表示使用fsync\(\)系统函数。 +- off表示不使用fsync\(\)系统函数。 + +**默认值:**on + +## synchronous\_commit + +**参数说明:**设置当前事务的同步方式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型 + +- on表示将备机的同步日志刷新到磁盘。 +- off表示异步提交。 +- local表示为本地提交。 +- remote\_write表示要备机的同步日志写到磁盘。 +- remote\_receive表示要备机同步日志接收数据。 + +**默认值:**on + +## wal\_sync\_method + +**参数说明:**设置向磁盘强制更新WAL数据的方法。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果将[fsync](#zh-cn_topic_0242371497_zh-cn_topic_0237124707_zh-cn_topic_0059778393_sb6cc47bbe02c47a785c873b1959ad0df)关闭,这个参数的设置就没有意义,因为所有数据更新都不会强制写入磁盘。 + +**取值范围**:枚举类型 + +- open\_datasync表示用带O\_DSYNC选项的open\(\)打开“WAL”文件。 +- fdatasync表示每次提交的时候都调用fdatasync\(\)。(支持suse10和suse11)。 +- fsync\_writethrough表示每次提交的时候调用fsync\(\)强制把缓冲区任何数据写入磁盘。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于历史原因,我们允许在Windows平台上将wal\_sync\_method设置为fsync\_writethrough,尽管它和fsync等效。 + +- fsync表示每次提交的时候调用fsync\(\)。(支持suse10和suse11) +- open\_sync表示用带O\_SYNC选项的open\(\)写“WAL”文件。(支持suse10和suse11) + +**默认值:**fdatasync + +## full\_page\_writes + +**参数说明:**设置openGauss服务器在检查点之后对页面的第一次修改时,是否将每个磁盘页面的全部内容写到WAL日志中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 设置这个参数是因为在操作系统崩溃过程中可能磁盘页面只写入了一部分内容,从而导致在同一个页面中包含新旧数据的混合。在崩溃后的恢复期间,由于在WAL日志中存储的行变化信息不够完整,因此无法完全恢复该页。把完整的页面影像保存下来就可以保证页面被正确还原,代价是增加了写入WAL日志的数据量。 +>- 关闭此参数,在系统崩溃的时候,可能无法恢复原来的数据。如果服务器硬件的特质(比如电池供电的磁盘控制器)可以减小部分页面的写入风险,或者文件系统特性支持(比如ReiserFS 4),并且清楚知道写入风险在一个可以接受的范畴,可以关闭这个参数。 + +**取值范围:**布尔型 + +- on表示启用此特性。 +- off表示关闭此特性。 + +**默认值:**on + +## wal\_log\_hints + +**参数说明:**设置在检查点之后对页面的第一次修改为页面上元组hint bits的修改时,是否将整个页面的全部内容写到WAL日志中。不推荐用户修改此设置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示整个页面全部内容写到WAL日志中。 +- off表示整个页面内容不会写到WAL日志中。 + +**默认值:**on + +## wal\_buffers + +**参数说明:**设置用于存放WAL数据的共享内存空间的XLOG\_BLCKSZ数,XLOG\_BLCKSZ的大小默认为8KB。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**-1\~218 + +- 如果设置为-1,表示wal\_buffers的大小随着参数shared\_buffers自动调整,为shared\_buffers的1/32,最小值为8个XLOG\_BLCKSZ,最大值为2048个XLOG\_BLCKSZ。 +- 如果设置为其他值,当小于8时,会被默认设置为8;当大于2048的时,会被强制设置为2048。 + +**默认值:**16MB + +**设置建议:**每次事务提交时,WAL缓冲区的内容都写入到磁盘中,因此设置为很大的值不会带来明显的性能提升。如果将它设置成几百兆,就可以在有很多即时事务提交的服务器上提高写入磁盘的性能。根据经验来说,默认值可以满足大多数的情况。 + +## wal\_writer\_delay + +**参数说明:**WalWriter进程的写间隔时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果时间过长可能造成WAL缓冲区的内存不足,时间过短会引起WAL不断写入,增加磁盘I/O负担。 + +**取值范围**:整型, 1~10000(毫秒) + +**默认值:**200ms + +## commit\_delay + +**参数说明:**表示一个已经提交的数据在WAL缓冲区中存放的时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 设置为非 0 值时事务执行commit后不会立即写入WAL中,而仍存放在WAL缓冲区中,等待WalWriter进程周期性写入磁盘。 +>- 如果系统负载很高,在延迟时间内,其他事务可能已经准备好提交。但如果没有事务准备提交,这个延迟就是在浪费时间。 + +**取值范围**:整型, 0~100000(微秒),其中0表示无延迟。 + +**默认值:**0 + +## commit\_siblings + +**参数说明:**当一个事务发出提交请求时,如果数据库中正在执行的事务数量大于此参数的值,则该事务将等待一段时间([commit\_delay](#zh-cn_topic_0242371497_zh-cn_topic_0237124707_zh-cn_topic_0059778393_s4a63dd7d4d794286a990ae2123a328fd)的值),否则该事务则直接写入WAL。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型, 0~1000 + +**默认值:**5 + +## wal\_block\_size + +**参数说明:**说明WAL日志段文件中日志页面的大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围**:整型,单位为Byte。 + +**默认值:**8192 + +## wal\_segment\_size + +**参数说明:**说明WAL日志段文件的大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围**:整型,单位为8KB。 + +**默认值:**16MB \(2048 \* 8KB\) + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256openGauss\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256openGauss\345\217\202\346\225\260.md" new file mode 100644 index 000000000..ae10afd28 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256openGauss\345\217\202\346\225\260.md" @@ -0,0 +1,7 @@ +# 设置openGauss参数 + +- **[设置客户端认证策略](设置客户端认证策略.md)** + +- **[设置配置文件参数](设置配置文件参数.md)** + + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" new file mode 100644 index 000000000..058212483 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256root\347\224\250\346\210\267\350\277\234\347\250\213\347\231\273\345\275\225.md" @@ -0,0 +1,60 @@ +# 设置root用户远程登录 + +在openGauss安装时需要root帐户远程登录访问权限,本章介绍如何设置使用root用户远程登录。 + +1. 修改PermitRootLogin配置,允许用户远程登录。 + 1. 打开sshd\_config文件。 + + ``` + vim /etc/ssh/sshd_config + ``` + + 2. 修改权限配置,可以使用以下两种方式实现: + - 注释掉“PermitRootLogin no”。 + + ``` + #PermitRootLogin no + ``` + + - 将“PermitRootLogin“改为“yes“。 + + ``` + PermitRootLogin yes + ``` + + 3. 执行**:wq**保存并退出编辑页面。 + +2. 修改Banner配置,去掉连接到系统时,系统提示的欢迎信息。欢迎信息会干扰安装时远程操作的返回结果,影响安装正常执行。 + 1. 编辑sshd\_config文件。 + + ``` + vim /etc/ssh/sshd_config + ``` + + 2. 修改Banner配置,注释掉“Banner”所在的行。 + + ``` + #Banner /etc/ssh/welcome.msg + ``` + + 3. 执行**:wq**保存并退出编辑页面。 + +3. 使用如下命令使设置生效。 + + ``` + service sshd restart + ``` + + >![](public_sys-resources/icon-caution.gif) **注意:** + >若执行命令后返回提示信息“Redirecting to /bin/systemctl restart sshd.service”,请执行命令:/bin/systemctl restart sshd.service。 + +4. 以root用户身份重新登录。 + + ``` + ssh xxx.xxx.xxx.xxx + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >xxx.xxx.xxx.xxx为安装openGauss环境的ip。 + + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" new file mode 100644 index 000000000..bf10de44f --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\345\255\227\347\254\246\351\233\206\345\217\202\346\225\260.md" @@ -0,0 +1,8 @@ +# 设置字符集参数 + +将各数据库节点的字符集设置为相同的字符集,可以在/etc/profile文件中添加"export LANG=XXX"(XXX为Unicode编码)。 + +``` +vim /etc/profile +``` + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256\345\256\242\346\210\267\347\253\257\350\256\244\350\257\201\347\255\226\347\225\245.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\345\256\242\346\210\267\347\253\257\350\256\244\350\257\201\347\255\226\347\225\245.md" new file mode 100644 index 000000000..e1e45689d --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\345\256\242\346\210\267\347\253\257\350\256\244\350\257\201\347\255\226\347\225\245.md" @@ -0,0 +1,94 @@ +# 设置客户端认证策略 + +目前openGauss配置文件“pg\_hba.conf”中的参数默认值都是单机的配置模式。应用程序可以通过调用gs\_guc来设置适合自己的参数。更多配置请参见产品文档。 + +## 语法 + +设置客户端认证策略,同时发送信号量到数据库进程。 + +``` +gs_guc [ set | reload ] [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -h "HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK AUTHMEHOD authentication-options option" +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>authmehod-options支持以下选项: +>trust:不验密,禁止远程主机使用trust方式访问openGauss +>reject:拒绝访问 +>md5、sha256、cert:客户端证书认证 +>gss:kerberos认证 + +## 命令参考 + +- set + + 表示只修改配置文件中的参数。 + +- reload + + 表示修改配置文件中的参数,同时发送信号量给数据库进程,使其重新加载配置文件。 + +- -N + + 需要设置的主机名称。 + + 取值范围:已有主机名称。 + + 当参数取值为ALL时,表示设置openGauss中所有的主机。 + +- -I INSTANCE-NAME + + 需要设置的实例名称。 + + 取值范围:已有实例名称。 + + 当参数取值为ALL时,表示设置主机中所有的实例。 + +- -D + + 需要执行命令的openGauss实例路径。使用encrypt命令时,此参数表示指定的密码文件生成的路径。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 与"-I" 不能一块使用 + +- -h host-auth-policy + + 指定需要在“pg\_hba.conf”增加的客户端认证策略。 + + 取值范围: + + - HOSTTYPE DATABASE USERNAME IPADDR IPMASK \[authmehod-options\] + - HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK \[authmehod-options \] + - HOSTTYPE DATABASE USERNAME HOSTNAME \[authmehod-options \] + + HOSTTYPE是必输参数,取值: + + - local + - host + - hostssl + - hostnossl + + 其中“local”是一个Unix域套接字,“host”是普通或SSL加密的TCP / IP套接字,“hostssl”是SSL加密的TCP / IP套接字,“hostnossl”是一个纯TCP / IP套接字。 + + authmehod-options是可选输入,取值: + + - trust + - reject + - md5 + - sha256 + - cert + - gss + + 详细的参数说明请参见“pg\_hba.conf”配置文件中的描述。 + + +## 示例 + +设置客户端认证策略 + +``` +gs_guc set -N all -I all -h "host replication testuser 10.252.95.191/32 sha256" + +Total instances: 2. Failed instances: 0. +Success to perform gs_guc! +``` + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" new file mode 100644 index 000000000..0689b0eac --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\346\227\266\345\214\272\345\222\214\346\227\266\351\227\264.md" @@ -0,0 +1,20 @@ +# 设置时区和时间 + +将各数据库节点的时区设置为相同时区,可以将/usr/share/zoneinfo/目录下的时区文件拷贝为/etc/localtime文件。 + +``` +cp /usr/share/zoneinfo/$地区/$时区 /etc/localtime +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>_$地区/$时区为需要设置时区的信息,例如:Asian_/Shanghai。 + +使用date -s命令将各主机的时间设置为统一时间,举例如下。 + +``` +date -s Mon May 11 16:42:11 CST 2020 +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>可以通过date命令查询主机时区。 + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" new file mode 100644 index 000000000..e5b993704 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\347\275\221\345\215\241MTU\345\200\274.md" @@ -0,0 +1,8 @@ +# 设置网卡MTU值 + +将各数据库节点的网卡MTU值设置为相同大小。MTU值推荐8192,要求不小于1500 + +``` +ifconfig 网卡编号 mtu 值 +``` + diff --git "a/content/zh/docs/Quickstart/\350\256\276\347\275\256\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\346\225\260.md" new file mode 100644 index 000000000..4cc61a921 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\256\276\347\275\256\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\346\225\260.md" @@ -0,0 +1,75 @@ +# 设置配置文件参数 + +目前openGauss配置文件“postgresql.conf”中的参数默认值都是单机的配置模式。应用程序可以通过调用gs\_guc来设置适合自己的参数。 + +## 语法 + +- 同时修改配置文件中参数(postgresql.conf) + + ``` + gs_guc set [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -c "parameter = value" + ``` + +- 将已设置的参数值修改为默认值 + + ``` + gs_guc [ set | reload ] [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -c "parameter" + ``` + + +## 命令参考 + +- set + + 表示只修改配置文件中的参数。 + +- reload + + 表示修改配置文件中的参数,同时发送信号量给数据库进程,使其重新加载配置文件。 + +- -N + + 需要设置的主机名称。 + + 取值范围:已有主机名称。 + + 当参数取值为ALL时,表示设置openGauss中所有的主机。 + +- -I INSTANCE-NAME + + 需要设置的实例名称。 + + 取值范围:已有实例名称。 + + 当参数取值为ALL时,表示设置主机中所有的实例。 + +- -D + + 需要执行命令的openGauss实例路径。使用encrypt命令时,此参数表示指定的密码文件生成的路径。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 与"-I" 不能一块使用 + +- -c parameter=value + + 要设定的openGauss配置参数的名称和参数值。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 如果参数是一个字符串变量,则使用-c parameter="'value'"或者使用-c "parameter = 'value'"。 + >- 当使用gs\_guc set/reload为"log\_directory" 恢复默认值时,其默认值会被置为具体的data目录。 + + 取值范围:postgresql.conf中的所有参数。 + +- -U, --keyuser=USER + +## 示例 + +示例1:同时修改数据库节点的参数,例如修改数据库允许的最大连接数为800。修改后需要重启数据库才能生效。 + +``` +gs_guc set -N all -I all -c "max_connections = 800" + +Total instances: 21. Failed instances: 0. +Success to perform gs_guc! +``` + diff --git "a/content/zh/docs/Quickstart/\350\257\255\345\217\245\350\241\214\344\270\272.md" "b/content/zh/docs/Quickstart/\350\257\255\345\217\245\350\241\214\344\270\272.md" new file mode 100644 index 000000000..d97762757 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\257\255\345\217\245\350\241\214\344\270\272.md" @@ -0,0 +1,248 @@ +# 语句行为 + +介绍SQL语句执行过程的相关默认参数。 + +## search\_path + +**参数说明:**当一个被引用对象没有指定模式时,此参数设置模式搜索顺序。它的值由一个或多个模式名构成,不同的模式名用逗号隔开。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +- 当前会话如果存放临时表的模式时,可以使用别名pg\_temp将它列在搜索路径中,如'pg\_temp,public' 。 存放临时表的模式始终会作为第一个被搜索的对象,排在pg\_catalog和search\_path中所有模式的前面,即具有第一搜索优先级。建议用户不要在search\_path中显示设置pg\_temp。如果在search\_path中指定了pg\_temp,但不是在最前面,系统会提示设置无效,pg\_temp仍被优先搜索。通过使用别名pg\_temp,系统只会在存放临时表的模式中搜索表、视图和数据类型这样的数据库对象,不会在里面搜索函数或运算符这样的数据库对象。 +- 系统表所在的模式pg\_catalog,总是排在search\_path中指定的所有模式前面被搜索,即具有第二搜索优先级(pg\_temp具有第一搜索优先级)。建议用户不要在search\_path中显式设置pg\_catalog。如果在search\_path中指定了pg\_catalog,但不是在最前面,系统会提示设置无效,pg\_catalog仍被第二优先搜索。 +- 当没有指定一个特定模式而创建一个对象时,它们被放置到以search\_path为命名的第一个有效模式中。当搜索路径为空时,会报错误。 +- 通过SQL函数current\_schema可以检测当前搜索路径的有效值。这和检测search\_path的值不尽相同,因为current\_schema显示search\_path中首位有效的模式名称。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 设置为"$user",public时,支持共享数据库(没有用户具有私有模式和所有共享使用public),用户私有模式和这些功能的组合使用。可以通过改变默认搜索路径来获得其他效果,无论是全局化的还是私有化的。 +>- 设置为空串('')的时候,系统会自动转换成一对双引号。 +>- 设置的内容中包含双引号,系统会认为是不安全字符,会将每个双引号转换成一对双引号。 + +**默认值:**"$user",public + +>![](public_sys-resources/icon-note.gif) **说明:** +>$user表示与当前会话用户名同名的模式名,如果这样的模式不存在,$user将被忽略。 + +## current\_schema + +**参数说明:**此参数设置当前的模式。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**"$user",public + +>![](public_sys-resources/icon-note.gif) **说明:** +>$user表示与当前会话用户名同名的模式名,如果这样的模式不存在,$user将被忽略。 + +## default\_tablespace + +**参数说明:**当CREATE命令没有明确声明表空间时,所创建对象\(表和索引等\)的缺省表空间。 + +- 值是一个表空间的名称或者一个表示使用当前数据库缺省表空间的空字符串。若指定的是一个非默认表空间,用户必须具有它的CREATE权限,否则尝试创建会失败。 +- 临时表不使用此参数,可以用[temp\_tablespaces](#zh-cn_topic_0242371522_zh-cn_topic_0237124732_zh-cn_topic_0059779117_sd5bfdc9f2696411894b2912cf3f23fcc)代替。 +- 创建数据库时不使用此参数。默认情况下,一个新的数据库从模板数据库继承表空间配置。 + + 该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**字符串,其中空表示使用默认表空间。 + +**默认值:**空 + +## default\_storage\_nodegroup + +**参数说明:**此参数设置当前的默认建表所在的Node Group,目前只适用普通表。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +- 值为“installation”表示建表会默认建在安装的Node Group上。 +- 值为其他字符串表示建表会默认建在设置的Node Group上。 + +**取值范围:**字符串 + +**默认值:**installation + +## temp\_tablespaces + +**参数说明:**当一个CREATE命令没有明确指定一个表空间时,temp\_tablespaces指定了创建临时对象(临时表和临时表的索引)所在的表空间。在这些表空间中创建临时文件用来做大型数据的排序工作。 + +其值是一系列表空间名的列表。如果列表中有多个表空间时,每次临时对象的创建,openGauss会在列表中随机选择一个表空间;如果在事务中,连续创建的临时对象被放置在列表里连续的表空间中。如果选择的列表中的元素是一个空串,openGauss将自动将当前的数据库设为默认的表空间。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串。空字符串表示所有的临时对象仅在当前数据库默认的表空间中创建,请参见[default\_tablespace](#zh-cn_topic_0242371522_zh-cn_topic_0237124732_zh-cn_topic_0059779117_sa058ceea3c3142f0a8a40b5799a682d3)。 + +**默认值:**空 + +## check\_function\_bodies + +**参数说明:**设置是否在CREATE FUNCTION执行过程中进行函数体字符串的合法性验证。为了避免产生问题(比如避免从转储中恢复函数定义时向前引用的问题),偶尔会禁用验证。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在CREATE FUNCTION执行过程中进行函数体字符串的合法性验证。 +- off表示在CREATE FUNCTION执行过程中不进行函数体字符串的合法性验证。 + +**默认值:**on + +## default\_transaction\_isolation + +**参数说明:**设置默认的事务隔离级别。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- read uncommitted表示隔离级别是读未提交。 +- read committed表示事务读已提交。 +- repeatable read表示事务可重复读。 +- serializable,openGauss目前功能上不支持此隔离级别,等价于repeatable read。 + +**默认值:**read committed + +## default\_transaction\_read\_only + +**参数说明:**设置每个新创建事务是否是只读状态。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示只读状态。 +- off表示非只读状态。 + +**默认值:**off + +## default\_transaction\_deferrable + +**参数说明:**控制每个新事务的默认延迟状态。只读事务或者那些比序列化更加低的隔离级别的事务除外。 + +openGauss不支持可串行化的隔离级别,因此,该参数无实际意义。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示默认延迟。 +- off表示默认不延迟。 + +**默认值:**off + +## session\_replication\_role + +**参数说明:**控制当前会话与复制相关的触发器和规则的行为。 + +该参数属于SUSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置此参数会丢弃之前任何缓存的执行计划。 + +**取值范围:**枚举类型 + +- origin表示从当前会话中复制插入、删除、更新等操作。 +- replica表示从其他地方复制插入、删除、更新等操作到当前会话。 +- local表示函数执行复制时会检测当前登录数据库的角色并采取相应的操作。 + +**默认值:**origin + +## statement\_timeout + +**参数说明:**当语句执行时间超过该参数设置的时间(从服务器收到命令时开始计时)时,该语句将会报错并退出执行。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483648,单位为毫秒。 + +**默认值:**0 + +## vacuum\_freeze\_min\_age + +**参数说明:**指定VACUUM在扫描一个表时用于判断是否用FrozenXID替换事务ID的中断寿命\(在同一个事务中\)。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0~576 460 752 303 423 487 + +>![](public_sys-resources/icon-note.gif) **说明:** +>尽管随时可以将此参数设为0到10亿之间的任意值,但是,VACUUM将默认其有效值范围限制在[autovacuum\_freeze\_max\_age](自动清理.md#zh-cn_topic_0242371520_zh-cn_topic_0237124730_zh-cn_topic_0059778244_s7857d2d0002547a3853b7aac36a458b3)的50%以内。 + +**默认值:**5000000000 + +## vacuum\_freeze\_table\_age + +**参数说明:**指定VACUUM对全表的扫描冻结元组的时间。如果表的pg\_class.relfrozenxid字段的值已经达到了参数指定的时间,VACUUM对全表进行扫描。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0~576 460 752 303 423 487 + +>![](public_sys-resources/icon-note.gif) **说明:** +>尽管随时可以将此参数设为零到20亿之间的值,但是,VACUUM将默认其有效值范围限制在[autovacuum\_freeze\_max\_age](自动清理.md#zh-cn_topic_0242371520_zh-cn_topic_0237124730_zh-cn_topic_0059778244_s7857d2d0002547a3853b7aac36a458b3)的95%以内。定期的手动VACUUM可以在对此表的反重叠自动清理启动之前运行。 + +**默认值:**15000000000 + +## bytea\_output + +**参数说明:**设置bytea类型值的输出格式。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- hex:将二进制数据编码为每字节2位十六进制数字。 +- escape:传统化的PostgreSQL格式。采用以ASCII字符序列表示二进制串的方法,同时将那些无法表示成ASCII字符的二进制串转换成特殊的转义序列。 + +**默认值:**hex + +## xmlbinary + +**参数说明:**设置二进制值是如何在XML中进行编码的。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- base64 +- hex + +**默认值:**base64 + +## xmloption + +**参数说明:**当XML和字符串值之间进行转换时,设置document或content是否是隐含的。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- document:表示HTML格式的文档。 +- content:普通的字符串。 + +**默认值:**content + +## max\_compile\_functions + +**参数说明:**设置服务器存储的函数编译结果的最大数量。存储过多的函数和存储过程的编译结果可能占用很大内存。将此参数设置为一个合理的值,有助于减少内存占用,提升系统性能。 + +该参数属于POSTMASTER类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,取值必须大于等于1。 + +**默认值:**1000 + +## gin\_pending\_list\_limit + +**参数说明:**设置当GIN索引启用fastupdate时,pending list容量的最大值。当pending list的容量大于设置值时,会把pending list中数据批量移动到GIN索引数据结构中以进行清理。单个GIN索引可通过更改索引存储参数覆盖此设置值。 + +该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为64,最大值为INT\_MAX,单位为KB。 + +**默认值:**4MB + diff --git "a/content/zh/docs/Quickstart/\350\264\237\350\275\275\347\256\241\347\220\206.md" "b/content/zh/docs/Quickstart/\350\264\237\350\275\275\347\256\241\347\220\206.md" new file mode 100644 index 000000000..dd54cf40a --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\264\237\350\275\275\347\256\241\347\220\206.md" @@ -0,0 +1,376 @@ +# 负载管理 + +未对数据库资源做控制时,容易出现并发任务抢占资源导致操作系统过载甚至最终崩溃。操作系统过载时,其响应用户任务的速度会变慢甚至无响应;操作系统崩溃时,整个系统将无法对用户提供任何服务。openGauss的负载管理功能能够基于可用资源的多少均衡数据库的负载,以避免数据库系统过载。 + +## use\_workload\_manager + +参数说明:是否开启资源管理功能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示打开资源管理。 +- off表示关闭资源管理。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 当使用[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中的方式二来修改参数值时,新参数值只能对更改操作执行后启动的线程生效。此外,对于后台线程以及线程复用执行的新作业,该参数值的改动不会生效。如果希望这类线程即时识别参数变化,可以使用kill session或重启节点的方式来实现。 + >- use\_workload\_manager参数由off变为on状态后,不会统计off时的存储资源。如果需要统计off时用户使用的存储资源,请在数据库中执行以下命令: + > ``` + > select gs_wlm_readjust_user_space(0); + > ``` + + +**默认值:**on + +## cgroup\_name + +**参数说明:**设置当前使用的Cgroups的名称或者调整当前group下排队的优先级。 + +即如果先设置cgroup\_name,再设置session\_respool,那么session\_respool关联的控制组起作用,如果再切换cgroup\_name,那么新切换的cgroup\_name起作用。 + +切换cgroup\_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +建议尽量不要混合使用cgroup\_name和session\_respool。 + +**取值范围**:字符串 + +**默认值:**DefaultClass:Medium + +>![](public_sys-resources/icon-note.gif) **说明:** +>DefaultClass:Medium表示DefaultClass下Timeshare控制组中的Medium控制组。 + +## cpu\_collect\_timer + +**参数说明:**设置语句执行时在数据库节点上收集CPU时间的周期。 + +数据库管理员需根据系统资源(如CPU资源、IO资源和内存资源)情况,调整此数值大小,使得系统支持较合适的收集周期,太小会影响执行效率,太大会影响异常处理的精确度。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1 ~ INT\_MAX, 单位为秒。 + +**默认值:**30 + +## memory\_tracking\_mode + +**参数说明:**设置记录内存信息的模式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**: + +- none,不启动内存统计功能。 +- normal,仅做内存实时统计,不生成文件。 +- executor,生成统计文件,包含执行层使用过的所有已分配内存的上下文信息。 +- fullexec,生成文件包含执行层申请过的所有内存上下文信息。 + +**默认值:**none + +## memory\_detail\_tracking + +**参数说明:**设置需要的线程内分配内存上下文的顺序号以及当前线程所在query的plannodeid。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符型 + +**默认值:**空 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该参数不允许用户进行设置,建议保持默认值。 + +## enable\_resource\_track + +参数说明:是否开启资源实时监控功能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示打开资源监控。 +- off表示关闭资源监控。 + +**默认值:**on + +## 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_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启资源监控记录归档功能。 +- off表示关闭资源监控记录归档功能。 + +**默认值:**off + +## enable\_logical\_io\_statistics + +**参数说明:**设置是否开启资源监控逻辑IO统计功能。开启时,对于PG\_TOTAL\_USER\_RESOURCE\_INFO视图中的read\_kbytes、write\_kbytes、read\_counts、write\_counts、read\_speed和write\_speed字段,会统计对应用户的逻辑读写字节数、次数以及速率。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启资源监控逻辑IO统计功能。 +- off表示关闭资源监控逻辑IO统计功能。 + +**默认值:**on + +## enable\_user\_metric\_persistent + +参数说明:设置是否开启用户历史资源监控转存功能。开启时,对于PG\_TOTAL\_USER\_RESOURCE\_INFO视图中数据,会定期采样保存到[GS\_WLM\_USER\_RESOURCE\_HISTORY](zh-cn_topic_0242385792.md#ZH-CN_TOPIC_0242385792)系统表中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +取值范围:布尔型 + +● on表示开启用户历史资源监控转存功能。 + +● off表示关闭用户历史资源监控转存功能。 + +默认值:on + +## user\_metric\_retention\_time + +参数说明:设置用户历史资源监控数据的保存天数。该参数仅在 enable\_user\_metric\_persistent为on时有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +取值范围:整型,0 ~ 730,单位为天。 + +● 值等于0时,用户历史资源监控数据将永久保存。 + +● 值大于0时,用户历史资源监控数据将保存对应天数。 + +默认值:7 + +## enable\_instance\_metric\_persistent + +**参数说明:**设置是否开启实例资源监控转存功能。开启时,对实例的监控数据会保存到[GS\_WLM\_INSTANCE\_HISTORY](zh-cn_topic_0242385749.md#ZH-CN_TOPIC_0242385749)系统表中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启实例资源监控转存功能。 +- off表示关闭实例资源监控转存功能。 + +**默认值:**on + +## instance\_metric\_retention\_time + +**参数说明:**设置实例历史资源监控数据的保存天数。该参数仅在enable\_instance\_metric\_persistent为on时有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0 ~3650,单位为天。 + +- 值等于0时,实例历史资源监控数据将永久保存。 +- 值大于0时,实例历史资源监控数据将保存对应设置天数。 + +**默认值:**7 + +## resource\_track\_level + +**参数说明:**设置当前会话的资源监控的等级。该参数只有当参数enable\_resource\_track为on时才有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举型 + +- none,不开启资源监控功能。 +- query,开启query级别资源监控功能。 +- operator,开启query级别和算子级别资源监控功能。 + +**默认值:**query + +## resource\_track\_cost + +**参数说明:**设置对当前会话的语句进行资源监控的最小执行代价。该参数只有当参数enable\_resource\_track为on时才有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-1 ~ INT\_MAX + +- 值为-1时,不进行资源监控。 +- 值大于或等于0时,值大于或等于0且小于等于9时,对执行代价大于等于10的语句进行资源监控。 +- 值大于或等于10时,对执行代价超过该参数值的语句进行资源监控。 + +**默认值:**100000 + +## resource\_track\_duration + +**参数说明:**设置资源监控实时视图中记录的语句执行结束后进行历史信息转存的最小执行时间。当执行完成的作业,其执行时间不小于此参数值时,作业信息会从实时视图(以statistics为后缀的视图)转存到相应的历史视图(以history为后缀的视图)中。该参数只有当[enable\_resource\_track](#zh-cn_topic_0242371519_zh-cn_topic_0237124729_zh-cn_topic_0059777791_sb8ca264785d649368247597883d52ffd)为on时才有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0 ~ INT\_MAX,单位为秒。 + +- 值为0时,资源监控实时视图中记录的所有语句都进行历史信息归档。 +- 值大于0时,资源监控实时视图中记录的语句的执行时间超过这个值就会进行历史信息归档。 + +**默认值:**1min + +## disable\_memory\_protect + +**参数说明:**禁止内存保护功能。当系统内存不足时如果需要查询系统视图,可以先将此参数置为on,禁止内存保护功能,保证视图可以正常查询。该参数只适用于在系统内存不足时进行系统诊断和调试,正常运行时请保持该参数配置为off。 + +该参数属于USERSET类型参数,且只对当前会话有效。请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +**取值范围**:布尔型 + +- on表示禁止内存保护功能。 +- off表示启动内存保护功能。 + +**默认值:**off + +## query\_band + +**参数说明:**用于标示当前会话的作业类型,由用户自定义。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符型 + +**默认值:**空 + +## enable\_bbox\_dump + +**参数说明**:是否开启黑匣子功能,在系统不配置core机制的时候仍可产生core文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示打开黑匣子功能。 +- off表示关闭黑匣子功能。 + +**默认值:**off + +## bbox\_dump\_count + +**参数说明:**在[bbox\_dump\_path](#zh-cn_topic_0242371519_zh-cn_topic_0237124729_zh-cn_topic_0059777791_s4fe2520e9c914f1293e1f9314db2d519)定义的路径下,允许存储的openGauss所产生core文件最大数。超过此数量,旧的core文件会被删除。此参数只有当[enable\_bbox\_dump](#zh-cn_topic_0242371519_zh-cn_topic_0237124729_zh-cn_topic_0059777791_section10758942101117)为on时才生效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~20 + +**默认值:**8 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在并发产生core文件时,core文件的产生个数可能大于bbox\_dump\_count。 + +## bbox\_dump\_path + +**参数说明:**黑匣子core文件的生成路径。此参数只有当[enable\_bbox\_dump](#zh-cn_topic_0242371519_zh-cn_topic_0237124729_zh-cn_topic_0059777791_section10758942101117)为on时才生效。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符型 + +**默认值:**空。默认生成黑匣子core文件的路径为读取/proc/sys/opengauss/core\_pattern下的路径,如果这个路径不是一个目录,或者用户对此目录没有写权限,黑匣子core文件将生成在数据库的data目录下。或者以安装时指定的目录为准。 + +## io\_limits + +**参数说明**:每秒触发IO的上限。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +**取值范围**:整型,0~1073741823 + +**默认值:**0 + +## io\_priority + +**参数说明**:IO利用率高达50%时,重消耗IO作业进行IO资源管控时关联的优先级等级。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +**取值范围**:枚举型 + +- None: 表示不受控。 +- Low: 表示限制iops为该作业原始触发数值的10%。 +- Medium: 表示限制iops为该作业原始触发数值的20%。 +- High: 表示限制iops为该作业原始触发数值的50%。 + +**默认值:**None + +## io\_control\_unit + +**参数说明**:行存场景下,io管控时用来对io次数进行计数的单位。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +记多少次io触发为一计数单位,通过此计数单位所记录的次数进行io管控。 + +**取值范围**:整型,1000\~1000000 + +**默认值:**6000 + +## session\_respool + +**参数说明**:当前的session关联的resource pool。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +即如果先设置cgroup\_name,再设置session\_respool,那么session\_respool关联的控制组起作用,如果再切换cgroup\_name,那么新切换的cgroup\_name起作用。 + +切换cgroup\_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 + +建议尽量不要混合使用cgroup\_name和session\_respool。 + +**取值范围**:string类型,通过create resource pool所设置的资源池。 + +**默认值:**invalid\_pool + +## session\_statistics\_memory + +**参数说明**:设置实时查询视图的内存大小。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,5 \* 1024 ~ max\_process\_memory的50%,单位KB。 + +**默认值:**5MB + +## topsql\_retention\_time + +**参数说明**:设置历史TopSQL中gs\_wlm\_session\_query\_info\_all和gs\_wlm\_operator\_info表中数据 的保存时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +取值范围:整型,0 \~ 730,单位为天。 + +- 值为0时,表示数据永久保存。 +- 值大于0时,表示数据能够保存的对应天数。 + +默认值:0 + +## session\_history\_memory + +**参数说明**:设置历史查询视图的内存大小。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,10 \* 1024 ~ max\_process\_memory的50%,单位KB。 + +**默认值:**10MB + +## transaction\_pending\_time + +**参数说明**:事务块语句和存储过程语句排队的最大时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-1 ~ INT\_MAX/2,单位为秒。 + +- 值为-1或0:事务块语句和存储过程语句无超时判断,排队至资源满足可执行条件。 +- 值大于0:事务块语句和存储过程语句排队超过所设数值的时间后,无视当前资源情况强制执行。 + +**默认值:**0 + diff --git "a/content/zh/docs/Quickstart/\350\265\204\346\272\220\346\266\210\350\200\227.md" "b/content/zh/docs/Quickstart/\350\265\204\346\272\220\346\266\210\350\200\227.md" new file mode 100644 index 000000000..5713570a7 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\265\204\346\272\220\346\266\210\350\200\227.md" @@ -0,0 +1,15 @@ +# 资源消耗 + +- **[内存](内存.md)** + +- **[磁盘空间](磁盘空间.md)** + +- **[内核资源使用](内核资源使用.md)** + +- **[基于开销的清理延迟](基于开销的清理延迟.md)** + +- **[后端写进程](后端写进程.md)** + +- **[异步IO](异步IO.md)** + + diff --git "a/content/zh/docs/Quickstart/\350\275\257\344\273\266\346\236\266\346\236\204.md" "b/content/zh/docs/Quickstart/\350\275\257\344\273\266\346\236\266\346\236\204.md" new file mode 100644 index 000000000..bcec97c89 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\275\257\344\273\266\346\236\266\346\236\204.md" @@ -0,0 +1,57 @@ +# 软件架构 + +openGauss主要包含了openGauss服务器,客户端驱动,OM等模块,本章将介绍这些模块之间的相互关系。 + +openGauss软件的架构如[图1](#f078d2fc7ab574c8aa05c4a988e0df1b3)所示。在openGauss的文档中,将openGauss服务器称为实例。 + +**图 1** 软件架构 + + +![](figures/zh-cn_image_0241993991.png) + +图中各模块的含义详见[表1](#t17e13a118cb14f5facbde93d2db56660)。 + +**表 1** 模块说明 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

说明

+

OM

+

运维管理模块(Operation Manager)。提供openGauss日常运维、配置管理的管理接口、工具。

+

不同于服务器和客户端驱动模块,OM为用户提供了相关工具对openGauss实例进行管理。

+

客户端驱动

+

客户端驱动(Client Driver)。负责接收来自应用的访问请求,并向应用返回执行结果;负责与openGauss实例的通信,下发SQL在openGauss实例上执行,并接收命令执行结果。

+

负责接收来自应用的访问请求,并向应用返回执行结果。客户端驱动负责建立到openGauss实例的链接,把应用的SQL命令传输给openGauss实例,接收openGauss实例命令执行结果。。

+

客户端驱动和应用运行在同一个进程内,部署在同一个物理节点。。

+

openGauss主(备)

+

openGauss主(备)。负责存储业务数据(支持行存、列存、内存表存储)、执行数据查询任务以及向客户端驱动返回执行结果。

+

负责存储业务数据、执行数据查询任务以及向客户端驱动返回执行结果。

+

openGauss实例包含主、备两种类型。支持一主多备。建议将主、备openGauss分散部署在不同的物理节点中。

+

Storage

+

服务器的本地存储资源,持久化存储数据。

+

-

+
+ diff --git "a/content/zh/docs/Quickstart/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" "b/content/zh/docs/Quickstart/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" new file mode 100644 index 000000000..852b3a167 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\275\257\347\241\254\344\273\266\347\216\257\345\242\203\350\246\201\346\261\202.md" @@ -0,0 +1,83 @@ +# 软硬件环境要求 + +介绍openGauss的软硬件环境要求。建议部署openGauss的各服务器具有等价的软硬件配置。 + +## 硬件环境要求 + +[表1](#zh-cn_topic_0242552153_zh-cn_topic_0241802565_zh-cn_topic_0085434629_zh-cn_topic_0059782022_t62cd0eed17004265b1b8ad98f302a4bc)列出了openGauss服务器应具备的最低硬件要求。在实际产品中,硬件配置的规划需考虑数据规模及所期望的数据库响应速度。请根据实际情况进行规划。 + +**表 1** 硬件环境要求 + + + + + + + + + + + + + + + + + + + +

项目

+

配置描述

+

最小内存

+

功能调试32GB以上。

+

性能测试和商业部署时,单实例部署建议128GB以上。

+

复杂的查询对内存的需求量比较高,在高并发场景下,可能出现内存不足。此时建议使用大内存的机器,或使用负载管理限制系统的并发。

+

CPU

+

功能调试最小1×8 核 2.0GHz。

+

性能测试和商业部署时,单实例部署建议1×16核 2.0GHz。

+

CPU超线程和非超线程两种模式都支持。但是,openGauss各节点的设置需保持一致。

+

硬盘

+

用于安装openGauss的硬盘需最少满足如下要求:

+
  • 至少1GB用于安装openGauss的应用程序包。
  • 每个主机需大约300MB用于元数据存储。
  • 预留70%以上的磁盘剩余空间用于数据存储。
+

建议系统盘配置为Raid1,数据盘配置为Raid5,且规划4组Raid5数据盘用于安装openGauss。有关Raid的配置方法在本手册中不做介绍。请参考硬件厂家的手册或互联网上的方法进行配置,其中Disk Cache Policy一项需要设置为Disabled,否则机器异常掉电后有数据丢失的风险。

+

openGauss支持使用SSD盘作为数据库的主存储设备,支持SAS接口NVME协议的SSD盘,以RAID的方式部署使用。

+

网络要求

+

300兆以上以太网。

+

建议网卡设置为双网卡冗余bond。有关网卡冗余bond的配置方法在本手册中不做介绍。请参考硬件厂商的手册或互联网上的方法进行配置。

+

openGauss网络如果配置bond,请保证bond模式一致,不一致的bond配置可能导致openGauss工作异常。

+
+ +## 软件环境要求 + +**表 2** 软件环境要求 + + + + + + + + + + + + + + + + + + + +

软件类型

+

配置描述

+

Linux操作系统

+

openEuler20.3LTS和CentOS7.6

+

Linux文件系统

+

剩余inode个数 > 15亿(推荐)

+

工具

+

Huawei JDK 1.8.0、psmisc

+

Python

+

Python 3.6.X-3.7.X

+
+ diff --git "a/content/zh/docs/Quickstart/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" "b/content/zh/docs/Quickstart/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" new file mode 100644 index 000000000..2187251d1 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" @@ -0,0 +1,7 @@ +# 运行时统计 + +- **[查询和索引统计收集器](查询和索引统计收集器.md)** + +- **[性能统计](性能统计.md)** + + diff --git "a/content/zh/docs/Quickstart/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" "b/content/zh/docs/Quickstart/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" new file mode 100644 index 000000000..e5f24df87 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" @@ -0,0 +1,9 @@ +# 连接和认证 + +- **[连接设置](连接设置.md)** + +- **[安全和认证(postgresql.conf)](安全和认证(postgresql-conf).md)** + +- **[通信库参数](通信库参数.md)** + + diff --git "a/content/zh/docs/Quickstart/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Quickstart/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..7c65edb86 --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,98 @@ +# 连接数据库 + +在创建数据库连接之后,才能使用它来执行SQL语句操作数据。 + +## 函数原型 + +JDBC提供了三个方法,用于创建数据库连接。 + +- DriverManager.getConnection\(String url\); +- DriverManager.getConnection\(String url, Properties info\); +- DriverManager.getConnection\(String url, String user, String password\); + +## 参数 + +**表 1** 数据库连接参数 + + + + + + + + + + + + + + + + + + + +

参数

+

描述

+

url

+

gsjdbc4.jar数据库连接描述符。格式如下:

+
  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database
+
说明:

使用gsjdbc200.jar时,将“jdbc:postgresql”修改为“jdbc:gaussdb”

+
  • database为要连接的数据库名称。
  • host为数据库服务器名称或IP地址。

    由于安全原因,数据库DN禁止openGauss内部其他节点无认证接入。如果要在openGauss111内部访问DN,请将JDBC程序部署在DN所在机器,host使用"127.0.0.1"。否则可能会出现“FATAL: Forbid remote connection with trust method!”错误。

    +

    建议业务系统单独部署在openGauss外部,否则可能会影响数据库运行性能。

    +
  • port为数据库服务器端口。
+

缺省情况下,会尝试连接到localhost的8000端口的database。

+
+

info

+

数据库连接属性。常用的属性如下:

+
  • user:String类型。表示创建连接的数据库用户。
  • password:String类型。表示数据库用户的密码。
  • ssl:Boolean类型。表示是否使用SSL连接。
  • loggerLevel:string类型。为LogStream或LogWriter设置记录进DriverManager当前值的日志信息量。目前支持"OFF"、"DEBUG"和"TRACE"。 值为"DEBUG"时,表示只打印DEBUG级别以上的日志,将记录非常少的信息。值等于TRACE时,表示打印DEBUG和TRACE级别的日志,将产生详细的日志信息。默认值为OFF,表示不打印日志。
  • prepareThreshold:integer类型。用于确定在转换为服务器端的预备语句之前,要求执行方法PreparedStatement的次数。缺省值是5。
  • batchMode : boolean类型,用于确定是否使用batch模式连接。
  • fetchsize : integer类型,用于设置数据库链接所创建statement的默认fetchsize。
  • ApplicationName:string类型。应用名称,在不做设置时,缺省值为PostgreSQL JDBC Driver。
  • allowReadOnly:boolean类型,用于设置connection是否允许设置readonly模式,默认为false,若该参数不被设置为true,则执行connnection.setReadOnly不生效。
  • blobMode:string类型,用于设置setBinaryStream方法为不同的数据类型赋值,设置为on时表示为blob数据类型赋值,设置为off时表示为bytea数据类型赋值,默认为on。
  • connectionExtraInfo:Boolean类型。表示驱动是否上报当前驱动的部署路径、进程属主用户到数据库。
    说明:

    取值范围:true或false,默认值为false。设置connectionExtraInfo为true,JDBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数里。

    +
    +
+

user

+

数据库用户。

+

password

+

数据库用户的密码。

+
+ +## 示例 + +此示例将演示如何基于openGauss提供的JDBC接口开发应用程序。 + +``` +//以下代码将获取数据库连接操作封装为一个接口,可通过给定用户名和密码来连接数据库。 + +public static Connection GetConnection(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; + }; +``` + diff --git "a/content/zh/docs/Quickstart/\350\277\236\346\216\245\350\256\276\347\275\256.md" "b/content/zh/docs/Quickstart/\350\277\236\346\216\245\350\256\276\347\275\256.md" new file mode 100644 index 000000000..1f4fdeb2b --- /dev/null +++ "b/content/zh/docs/Quickstart/\350\277\236\346\216\245\350\256\276\347\275\256.md" @@ -0,0 +1,143 @@ +# 连接设置 + +介绍设置客户端和服务器连接方式相关的参数。 + +## listen\_addresses + +**参数说明:**声明服务器监听客户端的TCP/IP地址。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:** + +- 主机名或IP地址,多个值之间用英文逗号分隔。 +- 星号“\*”或“0.0.0.0”表示监听所有IP地址。配置监听所有IP地址存在安全风险,不推荐用户使用。必须与有效地址结合使用(比如本地IP等),否则,可能造成Build失败的问题。 +- 置空则服务器不会监听任何IP地址,这种情况下,只有Unix域套接字可以用于连接数据库。 + +**默认值:**localhost + +>![](public_sys-resources/icon-note.gif) **说明:** +>localhost表示只允许进行本地“回环”连接。 + +## local\_bind\_address + +**参数说明:**声明当前节点连接openGauss其他节点绑定的本地IP地址。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**默认值:**0.0.0.0(实际值由安装时的配置文件指定) + +## port + +**参数说明:**openGauss服务监听的TCP端口号。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1~65535 + +**默认值:**5432(实际值有安装时的配置文件指定) + +## max\_connections + +**参数说明:**允许和数据库连接的最大并发连接数。此参数会影响openGauss的并发能力。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型。最小值为1,最大值为262143。 + +**默认值:**数据库节点:5000。如果该默认值超过内核支持的最大值(在执行gs\_initdb的时候判断),系统会提示错误。 + +**设置建议:** + +数据库主节点中此参数建议保持默认值。数据库节点中此参数建议设置为数据库主节点的个数乘以数据库主节点中此参数的值。 + +增大这个参数可能导致openGauss要求更多的SystemV共享内存或者信号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加以调整。 + +## sysadmin\_reserved\_connections + +**参数说明:**为管理员用户预留的最少连接数, 不建议设置过大。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为MIN\(262143, max\_connections\)。 + +**默认值:**3 + +## unix\_socket\_directory + +**参数说明:**设置openGauss服务器监听客户端连接的Unix域套接字目录。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +该参数的长度限制于操作系统的长度,超过该限制将会导致Unix-domain socket path "xxx" is too long的问题。 + +**取值范围:**字符串 + +**默认值:**空字符串(实际值由安装时配置文件指定) + +## unix\_socket\_group + +**参数说明:**设置Unix域套接字的所属组(套接字的所属用户总是启动服务器的用户)。可以与选项[unix\_socket\_permissions](#zh-cn_topic_0242371485_zh-cn_topic_0237124695_zh-cn_topic_0059777636_s09d0cf55124b4f1aa3d401d18b9b4151)一起用于对套接字进行访问控制。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,其中空字符串表示当前用户的缺省组。 + +**默认值:**空字符串 + +## unix\_socket\_permissions + +**参数说明:**设置Unix域套接字的访问权限。 + +Unix域套接字使用普通的Unix文件系统权限集。这个参数的值应该是数值的格式(chmod和umask命令可接受的格式)。如果使用自定义的八进制格式,数字必须以0开头。 + +建议设置为0770(只有当前连接数据库的用户和同组的人可以访问)或者0700(只有当前连接数据库的用户自己可以访问,同组或者其他人都没有权限)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0000-0777 + +**默认值:**0700 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在Linux中,文档具有十个属性,其中第一个属性为文档类型,后面九个为权限属性,分别为Owner,Group及Others这三个组别的read、write、execute属性。 +>文档的权限属性分别简写为r,w,x,这九个属性三个为一组,也可以使用数字来表示文档的权限,对照表如下: +>r:4 +>w: 2 +>x:1 +>-:0 +>同一组(owner/group/others)的三个属性是累加的。 +>例如,-rwxrwx---表示这个文档的权限为: +>owner = rwx = 4+2+1 = 7 +>group = rwx = 4+2+1 = 7 +>others = --- = 0+0+0 = 0 +>所以其权限为0770。 + +## application\_name + +**参数说明:**当前连接请求当中,所使用的客户端名称。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值:**空字符串\(连接到后端的应用名,以实际安装为准\) + +## connection\_info + +**参数说明:**连接数据库的驱动类型、驱动版本号、当前驱动的部署路径和进程属主用户。 + +该参数属于USERSET类型参数,属于运维类参数,不建议用户设置。 + +**取值范围:**字符串。 + +**默认值:**空字符串**。** + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 空字符串,表示当前连接数据库的驱动不支持自动设置connection\_info参数或应用程序未设置。 +>- 驱动连接数enable\_resource\_record据库的时候自行拼接的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和driver\_version,driver\_path和os\_user的显示由用户控制。 + diff --git "a/content/zh/docs/Quickstart/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" new file mode 100644 index 000000000..f8361bf23 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" @@ -0,0 +1,215 @@ +# 通信库参数 + +本节介绍通信库相关的参数设置及取值范围等内容。 + +## tcp\_keepalives\_idle + +**参数说明:**在支持TCP\_KEEPIDLE套接字选项的系统上,设置发送活跃信号的间隔秒数。不设置发送保持活跃信号,连接就会处于闲置状态。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果操作系统不支持TCP\_KEEPIDLE选项 ,这个参数的值必须为0。 +>- 在通过Unix域套接字进行的连接的操作系统上,这个参数将被忽略。 + +**取值范围:**0-3600,单位为s。 + +**默认值:**60 + +## tcp\_keepalives\_interval + +**参数说明:**在支持TCP\_KEEPINTVL套接字选项的操作系统上,以秒数声明在重新传输之间等待响应的时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0-180,单位为s。 + +**默认值:**30 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果操作系统不支持TCP\_KEEPINTVL选项,这个参数的值必须为0。 +>- 在通过Unix域套接字进行的连接的操作系统上,这个参数将被忽略。 + +## tcp\_keepalives\_count + +**参数说明:**在支持TCP\_KEEPCNT套接字选项的操作系统上,设置openGauss服务端在断开与客户端连接之前可以等待的保持活跃信号个数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果操作系统不支持TCP\_KEEPCNT选项,这个参数的值必须为0。 +>- 在通过Unix域套接字进行连接的操作系统上,这个参数将被忽略。 + +**取值范围:**0-100,其中0表示openGauss未收到客户端反馈的保持活跃信号则立即断开连接。 + +**默认值:**20 + +## comm\_tcp\_mode + +**参数说明:**通信库使用TCP或SCTP协议建立数据通道的切换开关,重启openGauss生效。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>SCTP协议的连接不再提供支持,为了保持兼容,提供此参数的接口,但此参数会在设置过程中强制改为on。 + +**取值范围:**布尔型,数据库主节点设置为on表示使用TCP模式连接数据库节点。 + +**默认值:**on + +## comm\_sctp\_port + +**参数说明:**TCP代理通信库或SCTP通信库使用的TCP或SCTP协议监听端口,负责监听数据报文通道。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss部署时会自动分配此端口号,请不要轻易修改此参数,如端口号配置不正确会导致数据库通信失败。 + +**取值范围:**整型,最小值为0,最大值为65535。 + +**默认值:**7000 + +## comm\_control\_port + +**参数说明:**TCP代理通信库或SCTP通信库使用的TCP协议监听端口。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss部署时会自动分配此端口号,请不要轻易修改此参数,如端口号配置不正确会导致数据库通信失败。 + +**取值范围:**整型,最小值为0,最大值为65535。 + +**默认值:**7001 + +## comm\_max\_receiver + +**参数说明:**TCP代理通信库或SCTP通信库内部接收线程数量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为1,最大值为50。 + +**默认值:**4 + +## comm\_quota\_size + +**参数说明:**TCP代理通信库或SCTP通信库最大可连续发送包总大小。使用1GE网卡时,建议取较小值,推荐设置为20KB\~40KB。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2048000,默认单位为KB。 + +**默认值:**1MB + +## comm\_usable\_memory + +**参数说明:**单个数据库节点内TCP代理通信库或SCTP通信库缓存最大可使用内存。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数需根据环境内存及部署方式具体配置,过大会造成OOM,过小会降低TCP代理通信库或SCTP通信库性能。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为100\*1024,最大值为INT\_MAX/2,默认单位为KB。 + +**默认值:**4000MB + +## comm\_memory\_pool + +**参数说明:**单个数据库节点内TCP代理通信库或SCTP通信库可使用内存池资源的容量大小。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数需根据实际业务情况做调整,若通信库使用内存小,可设置该参数数值较小,反之设置数值较大。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为100\*1024,最大值为INT\_MAX/2,默认单位为KB。 + +**默认值:**2000MB + +## comm\_memory\_pool\_percent + +**参数说明:**单个数据库节点内TCP代理通信库或SCTP通信库可使用内存池资源的百分比,用于自适应负载预留通信库通信消耗的内存大小。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数需根据实际业务情况做调整,若通信库使用内存小,可设置该参数数值较小,反之设置数值较大。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为100。 + +**默认值:**0 + +## comm\_no\_delay + +**参数说明:**是否使用通信库连接的NO\_DELAY属性,重启openGauss生效。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果openGauss出现因每秒接收数据包过多导致的丢包时,需设置为off,以便小包合并成大包发送,减少数据包总数。 + +**默认值:**off + +## comm\_debug\_mode + +**参数说明:**TCP代理通信库或SCTP通信库debug模式开关,该参数设置是否打印通信层详细日志。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置为on时,打印日志量较大,会增加额外的overhead并降低数据库性能,仅在调试时打开。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打印通信库详细debug日志。 +- off表示不打印通信库详细debug日志。 + +**默认值:**off + +## comm\_ackchk\_time + +**参数说明:**无数据包接收情况下,该参数设置通信库服务端主动ACK触发时长。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为20000,单位为毫秒。取值为0表示关闭此功能。 + +**默认值:**2000 + +## comm\_timer\_mode + +**参数说明:**TCP代理通信库或SCTP通信库timer模式开关,该参数设置是否打印通信层各阶段时间桩。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置为on时,打印日志量较大,会增加额外的overhead并降低数据库性能,仅在调试时打开。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打印通信库详细时间桩日志。 +- off表示不打印通信库详细时间桩日志。 + +**默认值:**off + +## comm\_stat\_mode + +**参数说明:**TCP代理通信库或SCTP通信库stat模式开关,该参数设置是否打印通信层的统计信息。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置为on时,打印日志量较大,会增加额外的overhead并降低数据库性能,仅在调试时打开。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打印通信库统计信息日志。 +- off表示不打印通信库统计信息日志。 + +**默认值:**off + diff --git "a/content/zh/docs/Quickstart/\351\200\232\350\277\207JDBC\346\211\247\350\241\214SQL.md" "b/content/zh/docs/Quickstart/\351\200\232\350\277\207JDBC\346\211\247\350\241\214SQL.md" new file mode 100644 index 000000000..0ebad871c --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\200\232\350\277\207JDBC\346\211\247\350\241\214SQL.md" @@ -0,0 +1,11 @@ +# 通过JDBC执行SQL + +- **[JDBC包与驱动类](JDBC包与驱动类.md)** + +- **[加载驱动](加载驱动.md)** + +- **[连接数据库](连接数据库.md)** + +- **[示例](示例-0.md)** + + diff --git "a/content/zh/docs/Quickstart/\351\200\232\350\277\207gs_guc\351\205\215\347\275\256\347\231\275\345\220\215\345\215\225.md" "b/content/zh/docs/Quickstart/\351\200\232\350\277\207gs_guc\351\205\215\347\275\256\347\231\275\345\220\215\345\215\225.md" new file mode 100644 index 000000000..4fd7bcb96 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\200\232\350\277\207gs_guc\351\205\215\347\275\256\347\231\275\345\220\215\345\215\225.md" @@ -0,0 +1,27 @@ +# 通过gs\_guc配置白名单 + +## 操作步骤 + +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”用户前,请先使用本地连接数据库,详细请参见[gsql客户端连接openGauss](gsql客户端连接openGauss.md),并在数据库中使用如下语句建立“jack”用户。 + > ``` + > postgres=# CREATE USER jack PASSWORD 'Bigdata@123'; + > ``` + >- -N all表示openGauss的所有主机。 + >- -I all表示主机中的所有实例。 + >- -h表示指定需要在“pg\_hba.conf”增加的语句。 + >- all表示允许客户端连接到任意的数据库。 + >- jack表示数据库中已存在的用户。 + >- 10.10.0.30_/32_表示只允许IP地址为10.10.0.30的主机连接。在使用过程中,请根据用户的网络进行配置修改。 + >- sha256表示连接时jack用户的密码使用sha256算法加密。 + + diff --git "a/content/zh/docs/Quickstart/\351\200\232\350\277\207\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267\346\211\247\350\241\214SQL.md" "b/content/zh/docs/Quickstart/\351\200\232\350\277\207\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267\346\211\247\350\241\214SQL.md" new file mode 100644 index 000000000..7f138fbc9 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\200\232\350\277\207\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267\346\211\247\350\241\214SQL.md" @@ -0,0 +1,7 @@ +# 通过客户端工具执行SQL + +- **[执行单条SQL](执行单条SQL.md)** + +- **[执行批量文件](执行批量文件.md)** + + diff --git "a/content/zh/docs/Quickstart/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" "b/content/zh/docs/Quickstart/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" new file mode 100644 index 000000000..161425a45 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\205\215\347\275\256Host\345\237\272\346\234\254\344\277\241\346\201\257.md" @@ -0,0 +1,72 @@ +# 配置Host基本信息 + +>![](public_sys-resources/icon-note.gif) **说明:** +>每台Host服务器都必须有如下信息,如下示例以node1为例。 + +加粗字体内容为示例,可自行替换。每行信息均有注释进行说明。 + +``` + + + + + + + + + + + + +``` + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + +

实例类型

+

参数

+

说明

+

整体信息

+

name

+

主机名称。

+

azName

+

指定azName,字符串(不能含有特殊字符),例如AZ1、AZ2、AZ3。

+

azPriority

+

指定azPriority的优先级。

+

backIp1

+

主机在后端存储网络中的IP地址(内网IP)。所有openGauss主机使用后端存储网络通讯。

+

sshIp1

+

设置SSH可信通道IP地址(外网IP)。若无外网,则可以不设置该选项或者同backIp1设置相同IP。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>配置文件中所有IP参数(包含backIp、sshIp、listenIp等)均只支持配置一个IP。如果配置第二个IP参数,则不会读取第二个参数的配置值。 +>示例:xml配置文件中同时配置backIp1和backIp2参数: +>在解析配置文件时仅读取backIp1参数的配置值,不会读取backIp2参数的配置值。 +>``` +> +> +>``` + diff --git "a/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\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..35f10f9e9 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\223\215\344\275\234\347\263\273\347\273\237\345\217\202\346\225\260.md" @@ -0,0 +1,502 @@ +# 配置操作系统参数 + +openGauss要求各主机上的操作系统参数设置成一定的值,以满足系统运行的性能要求等。 + +这些参数有些会在openGauss安装环境准备阶段完成设置,且这些参数将直接影响openGauss的运行状态,请仅在确认必要时进行手动调整。方法如下: + +1. 以root用户身份登录服务器。 +2. 对文件“/etc/sysctl.conf”进行编辑修改。 + + 具体参数的修改请参见[操作系统参数](#zh-cn_topic_0244176943_zh-cn_topic_0241805805_zh-cn_topic_0085434661_zh-cn_topic_0059782062_section3705271819540)。 + +3. 执行如下命令使修改配置生效。 + + ``` + sysctl -p + ``` + + +## 操作系统参数 + +**表 1** 操作系统参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数说明

+

推荐取值

+

net.ipv4.tcp_max_tw_buckets

+

表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。如果超过所配置的取值,TIME_WAIT将立刻被释放并打印警告信息。

+

10000

+

net.ipv4.tcp_tw_reuse

+

允许将TIME-WAIT状态的sockets重新用于新的TCP连接。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_tw_recycle

+

表示开启TCP连接中TIME-WAIT状态sockets的快速回收。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_keepalive_time

+

表示当keepalive启用的时候,TCP发送keepalive消息的频度。

+

30

+

net.ipv4.tcp_keepalive_probes

+

在认定连接失效之前,发送TCP的keepalive探测包数量。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应。

+

9

+

net.ipv4.tcp_keepalive_intvl

+

当探测没有确认时,重新发送探测的频度。

+

30

+

net.ipv4.tcp_retries1

+

在连接建立过程中TCP协议最大重试次数。

+

5

+

net.ipv4.tcp_syn_retries

+

TCP协议SYN报文最大重试次数。

+

5

+

net.ipv4.tcp_synack_retries

+

TCP协议SYN应答报文最大重试次数。

+

5

+

net.sctp.path_max_retrans

+

SCTP协议最大重试次数。

+

10

+

net.sctp.max_init_retransmits

+

SCTP协议INIT报文最大重试次数。

+

10

+

net.sctp.association_max_retrans

+

SCTP协议单个逻辑连接最大重试次数。

+

10

+

net.sctp.hb_interval

+

SCTP协议心跳检测包重传间隔。

+

30000

+

net.ipv4.tcp_retries2

+

控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接。

+

发生“connection reset by peer”时可以尝试调大该值规避问题。

+

12

+

vm.overcommit_memory

+

控制在做内存分配的时候,内核的检查方式。

+
  • 0:表示系统会尽量精确计算当前可用的内存。
  • 1:表示不作检查直接返回成功。
  • 2:内存总量×vm.overcommit_ratio/100+SWAP的总量,如果申请空间超过此数值则返回失败。
+

内核默认是2过于保守,推荐设置为0,如果系统压力大可以设置为1。

+

0

+

net.sctp.sndbuf_policy

+

SCTP发送缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.rcvbuf_policy

+

SCTP接收缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.sctp_mem

+

内核SCTP协议栈的最大可用内存,分无压力,有压力,和压力大三个区间,压力大时会丢包,单位为页面。

+

94500000 915000000 927000000

+

net.sctp.sctp_rmem

+

内核SCTP协议栈的接收总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.sctp.sctp_wmem

+

内核SCTP协议栈的发送总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_rmem

+

TCP协议接收端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_wmem

+

TCP协议发送端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.core.wmem_max

+

socket发送端缓冲区大小的最大值。

+

21299200

+

net.core.rmem_max

+

socket接收端缓冲区大小的最大值。

+

21299200

+

net.core.wmem_default

+

socket发送端缓冲区大小的默认值。

+

21299200

+

net.core.rmem_default

+

socket接收端缓冲区大小的默认值。

+

21299200

+

net.ipv4.ip_local_port_range

+

物理机可用临时端口范围。

+

26000-65535

+

kernel.sem

+

内核信号量参数设置大小。

+

250 6400000 1000 25600

+

vm.min_free_kbytes

+

保证物理内存有足够空闲空间,防止突发性换页。

+

系统总内存的5%

+

net.core.somaxconn

+

定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。

+

65535

+

net.ipv4.tcp_syncookies

+

当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

+
  • 0表示关闭SYN Cookies。
  • 1表示开启SYN Cookies。
+

1

+

net.sctp.addip_enable

+

SCTP动态地址重置支持开关

+
  • 0表示关闭。
  • 1表示开启。
+

0

+

net.core.netdev_max_backlog

+

在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

+

65535

+

net.ipv4.tcp_max_syn_backlog

+

记录的那些尚未收到客户端确认信息的连接请求的最大值。

+

65535

+

net.ipv4.tcp_fin_timeout

+

系统默认的超时时间。

+

60

+

kernel.shmall

+

内核可用的共享内存总量。

+

1152921504606846720

+

kernel.shmmax

+

内核参数定义单个共享内存段的最大值。

+

18446744073709551615

+

net.ipv4.tcp_sack

+

启用有选择的应答,通过有选择地应答乱序接受到的报文来提高性能,让发送者只发送丢失的报文段(对于广域网来说)这个选项应该启用,但是会增加对CPU的占用。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

net.ipv4.tcp_timestamps

+

TCP时间戳(会在TCP包头增加12节),以一种比重发超时更精确的方式(参考RFC 1323)来启用对RTT的计算,启用可以实现更好的性能。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

vm.extfrag_threshold

+

系统内存不够用时,linux会为当前系统内存碎片情况打分,如果超过vm.extfrag_threshold的值,kswapd就会触发memory compaction。所以这个值设置的接近1000,说明系统在内存碎片的处理倾向于把旧的页换出,以符合申请的需要,而设置接近0,表示系统在内存碎片的处理倾向做memory compaction。

+

500

+

vm.overcommit_ratio

+

系统使用绝不过量使用内存的算法时,系统整个内存地址空间不得超过swap+RAM值的此参数百分比,当vm.overcommit_memory=2时此参数生效。

+

90

+

/sys/module/sctp/parameters/no_checksums

+

SCTP协议是否关闭checksum。

+

0

+

MTU

+

节点网卡最大传输单元。OS默认值为1500,调整为8192可以提升SCTP协议数据收发的性能。

+

8192

+
+ +## 文件系统参数 + +- soft nofile + + 说明:soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。 + + 推荐取值:1000000 + +- hard nofile + + 说明:hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。 + + 推荐取值:1000000 + +- stack size + + 说明:线程堆栈大小。 + + 推荐值:3072 + + +## transparent\_hugepage设置 + +openGauss默认关闭使用transparent\_hugepage服务,并将关闭命令写入操作系统启动文件。 + +## 文件句柄设置 + +需要对文件句柄数进行手动设置时,使用root用户执行如下命令进行参数修改: + +``` +echo "* soft nofile 1000000" >>/etc/security/limits.conf +echo "* hard nofile 1000000" >>/etc/security/limits.conf +``` + +完成修改后,需重启操作系统使得设置的参数生效。 + +**表 2** 文件句柄数设置 + + + + + + + + + + + + + + + + + + + +

参数名

+

说明

+

预安装时是否由脚本自动设置

+

推荐取值

+

* soft nofile

+

soft nofile表示软限制,即表示任何用户能打开的最大文件数量为1000000,不管它开启多少个shell。

+

+

1000000

+

* hard nofile

+

hard nofile表示硬限制,软限制要小于等于硬限制。

+

+

1000000

+
+ +## 系统支持的最大进程数设置 + +需要对系统支持的最大进程数进行手动设置时,执行如下命令打开conf文件。 + +``` +vim /etc/security/limits.d/90-nproc.conf +``` + +修改\* soft nproc参数。 + +完成修改后,需重启操作系统使得设置的参数生效。 + +**表 3** 系统支持的最大进程数设置 + + + + + + + + + + + + + + +

参数名

+

说明

+

预安装时是否由脚本自动设置

+

推荐取值

+

* soft nproc

+

soft nproc参数用来限制每个用户的最大processes数量。

+

+

60000

+
+ +## 网卡参数配置 + +**表 4** 网卡参数配置 + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

说明

+

预安装时是否由脚本自动设置

+

推荐取值

+

rx

+

网卡接收队列长度设置

+

+

4096

+

tx

+

网卡传送队列长度设置

+

+

4096

+

mtu

+

网卡最大传输单元设置

+

+

15008192

+
+ +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 网卡参数配置功能只针对万兆及万兆以上级别的业务网卡。即backIp1所绑定的网卡。 +>- 设置网卡参数的命令只有在设置成功后,才会被写入系统启动文件。执行失败的信息会被记入后台日志中。 + diff --git "a/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" new file mode 100644 index 000000000..799d3a966 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\344\270\273\350\212\202\347\202\271\344\277\241\346\201\257.md" @@ -0,0 +1,83 @@ +# 配置数据库主节点信息 + +加粗字体内容为示例,可自行替换。每行信息均有注释进行说明。 + +**数据库主节点配置以下信息。** + +``` + + + + + + + +``` + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + +

实例类型

+

参数

+

说明

+

DBnode

+

dataNum

+

当前主机上需要部署的数据库节点个数。

+

dataPortBase

+

数据库节点的基础端口号,默认值40000。

+

dataListenIp1

+

监听的IP地址,用于接受其他数据库节点的连接。未设置时,使用对应主机上的backIp1生成。

+

如果配置有虚拟IP,该字段也可配置虚拟IP。

+

dataHaIp1

+

主、备DBnode通信的IP地址。未设置时,使用对应主机的backIp生成。

+

value中需设置主、备DBnode所在主机的IP地址。

+

dataNode1

+

用于指定当前主机上的数据库节点的数据存储目录。此目录为数据库的数据存储目录。应规划到数据盘上。

+
+ +**表 2** 数据库实例数据目录 + + + + + + + + + + + + + +

实例名称

+

实例数据目录

+

主DBnode

+

/opt/huawei/data/xxx

+

其中,xxx为当前主DBnode的名称。

+

备DBnode

+

opt/huawei/data/slaveX

+

其中,xxx为当前备DBnode的名称。

+
+ diff --git "a/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" new file mode 100644 index 000000000..3d37b936c --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\346\225\260\346\215\256\345\272\223\345\220\215\347\247\260\345\217\212\345\220\204\351\241\271\347\233\256\345\275\225.md" @@ -0,0 +1,105 @@ +# 配置数据库名称及各项目录 + +加粗字体内容为示例,可自行替换。每行信息均有注释进行说明。 + +``` + + + + + + + + + + + + + + + + + + + + + + + +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- “/opt/huawei/newsql/tools”存放互信等工具,避免权限问题,不要把实例数据目录放在此目录下。 +>- 安装目录和数据目录需为空或者不存在,否则可能导致安装失败。 +>- 在对数据库节点的实例进行具体配置时,需确保配置的目录之间不相互耦合。即各个配置目录不关联,删除其中任意一个目录,不会级联删除其它目录。如gaussdbAppPath为"/opt/gaussdb/app",gaussdbLogPath为"/opt/gaussdb/app/omm"。当gaussdbAppPath目录被删除时,会级联删除gaussdbLogPath目录,从而引起其它问题。 +>- 若需要安装脚本自动创建安装用户时各配置的目录需保证不与系统创建的默认用户目录耦合关联。 +>- 配置openGauss路径和实例路径时,路径中不能包含"|",";","&","$","<","\>","\`","\\\\","'","\\"","\{","\}","\(","\)","\[","\]","\~","\*","?"特殊字符。 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

实例类型

+

参数

+

说明

+

整体信息

+

clusterName

+

openGauss名称。

+

nodeNames

+

openGauss中主机名称。

+

backIp1s

+

主机在后端存储网络中的IP地址(内网IP)。所有openGauss主机使用后端存储网络通讯。

+

gaussdbAppPath

+

openGauss程序安装目录。此目录应满足如下要求:

+
  • 磁盘空间>1GB
  • 与数据库所需其它路径相互独立,没有包含关系。
+

gaussdbLogPath

+

openGauss运行日志和操作日志存储目录。此目录应满足如下要求:

+
  • 磁盘空间建议根据主机上的数据库节点数规划。数据库节点预留1GB空间的基础上,再适当预留冗余空间。
  • openGauss所需其它路径相互独立,没有包含关系。
+

此路径可选。不指定的情况下,openGauss安装时会默认指定“$GAUSSLOG/安装用户名”作为日志目录。

+

tmpdbPath

+

数据库临时文件存放目录。

+

若不配置tmpdbPath,默认存放在/opt/huawei/wisequery/perfadm_db目录下。

+

gaussdbToolPath

+

openGauss系统工具目录,主要用于存放互信工具等。此目录应满足如下要求:

+
  • 磁盘空间>100MB
  • 固定目录,与数据库所需其它目录相互独立,没有包含关系。
+

此目录可选。不指定的情况下,openGauss安装时会默认指定“/opt/huawei/wisequery”作为数据库系统工具目录。

+

corePath

+

openGauss core文件的指定目录。

+

clusterType

+

openGauss类型,openGauss拓扑类型;可选字段。

+

“single-inst”表示单机一主多备部署形态。

+
+ diff --git "a/content/zh/docs/Quickstart/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" new file mode 100644 index 000000000..7df4e501d --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" @@ -0,0 +1,7 @@ +# 配置运行参数 + +- **[查看参数当前取值](查看参数当前取值.md)** + +- **[重设参数](重设参数.md)** + + diff --git "a/content/zh/docs/Quickstart/\351\207\215\350\256\276\345\217\202\346\225\260.md" "b/content/zh/docs/Quickstart/\351\207\215\350\256\276\345\217\202\346\225\260.md" new file mode 100644 index 000000000..43cf625a2 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\207\215\350\256\276\345\217\202\346\225\260.md" @@ -0,0 +1,635 @@ +# 重设参数 + +## 背景信息 + +openGauss提供了多种修改GUC参数的方法,用户可以方便的针对数据库、用户、会话进行设置。 + +- 参数名称不区分大小写。 +- 参数取值有整型、浮点型、字符串、布尔型和枚举型五类。 + - 布尔值可以是(on,off)、(true,false)、(yes,no)或者(1,0),且不区分大小写。 + - 枚举类型的取值是在系统表pg\_settings的enumvals字段取值定义的。 + +- 对于有单位的参数,在设置时请指定单位,否则将使用默认的单位。 + - 参数的默认单位在系统表pg\_settings的unit字段定义的。 + - 内存单位有:KB(千字节)、MB(兆字节)和GB(吉字节)。 + - 时间单位:ms(毫秒)、s(秒)、min(分钟)、h(小时)和d(天)。 + + +具体参数说明请参见[GUC参数说明](GUC参数说明.md#ZH-CN_TOPIC_0244544068)。 + +## GUC参数设置 + +openGauss提供了六类GUC参数,具体分类和设置方式请参考[表1](#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846): + +**表 1** GUC参数分类 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数类型

+

说明

+

设置方式

+

INTERNAL

+

固定参数,在创建数据库的时候确定,用户无法修改,只能通过show语法或者pg_settings视图进行查看。

+

+

POSTMASTER

+

数据库服务端参数,在数据库启动时确定,可以通过配置文件指定。

+

支持表2中的方式一。

+

SIGHUP

+

数据库全局参数,可在数据库启动时设置或者在数据库启动后,发送指令重新加载。

+

支持表2中的方式一、方式二。

+

BACKEND

+

会话连接参数。在创建会话连接时指定,连接建立后无法修改。连接断掉后参数失效。内部使用参数,不推荐用户设置。

+

支持表2中的方式一、方式二。

+
说明:

设置该参数后,下一次建立会话连接时生效。

+
+

SUSET

+

数据库管理员参数。可在数据库启动时、数据库启动后或者数据库管理员通过SQL进行设置。

+

支持表2中的方式一、方式二或由数据库管理员通过方式三设置。

+

USERSET

+

普通用户参数。可被任何用户在任何时刻设置。

+

支持表2中的方式一、方式二或方式三设置。

+
+ +openGauss提供了三种方式来修改GUC参数,具体操作请参考[表2](#zh-cn_topic_0242370406_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d): + +**表 2** GUC参数设置方式 + + + + + + + + + + + + + + + + +

序号

+

设置方法

+

方式一

+
  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操作会导致用户执行操作中断,请在操作之前规划好合适的执行窗口。

    +
    +
    gs_om -t stop && gs_om -t start
    +
+

方式二

+
gs_guc reload -D datadir -c "paraname=value"
+
说明:

使用以下命令在数据库节点上同时设置某个参数。

+
gs_guc reload -N all -I all -c "paraname=value"
+
+

方式三

+

修改指定数据库,用户,会话级别的参数。

+
  • 设置数据库级别的参数
    postgres=# ALTER DATABASE dbname SET paraname TO value;
    +

    在下次会话中生效。

    +
  • 设置用户级别的参数
    postgres=# ALTER USER username SET paraname TO value;
    +

    在下次会话中生效。

    +
  • 设置会话级别的参数
    postgres=# SET paraname TO value;
    +

    修改本次会话中的取值。退出会话后,设置将失效。

    +
+
+ +## 操作步骤 + +使用方式一设置数据库参数,以在数据库主节点设置archive\_mode参数为例。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 查看archive\_mode参数。 + + ``` + cat /gaussdb/data/dbnode/postgresql.conf | grep archive_mode + ``` + + ``` + archive_mode = on + ``` + + on表示日志要进行归档操作。 + +3. 设置archive\_mode参数为off,关闭日志的归档操作。 + + ``` + gs_guc set -D /gaussdb/data/dbnode -c "archive_mode=off" + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >可以使用以下命令在数据库节点上设置archive\_mode参数为off。 + >``` + >gs_guc set -N all -I all -c "archive_mode=off" + >``` + +4. 重启数据库使参数生效。 + + ``` + gs_om -t stop && gs_om -t start + ``` + +5. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +6. 检查参数设置的正确性。 + + ``` + postgres=# SHOW archive_mode; + archive_mode + -------------- + off + (1 row) + ``` + + +使用方式二设置参数,以在数据库主节点设置authentication\_timeout参数为例。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 查看authentication\_timeout参数。 + + ``` + cat /gaussdb/data/dbnode/postgresql.conf | grep authentication_timeout + ``` + + ``` + authentication_timeout = 1min + ``` + +3. 设置authentication\_timeout参数为59s。 + + ``` + gs_guc reload -N all -I all -c "authentication_timeout = 59s" + + Total instances: 2. Failed instances: 0. + Success to perform gs_guc! + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >可以使用以下命令在数据库节点上设置authentication\_timeout参数为59s。 + >``` + >gs_guc reload -N all -I all -c "authentication_timeout = 59s" + >``` + +4. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +5. 检查参数设置的正确性。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 59s + (1 row) + ``` + + +使用方式三设置参数,以设置explain\_perf\_mode参数为例。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +3. 查看explain\_perf\_mode参数。 + + ``` + postgres=# SHOW explain_perf_mode; + explain_perf_mode + ------------------- + normal + (1 row) + ``` + +4. 设置explain\_perf\_mode参数。 + + 使用以下任意方式进行设置: + + - 设置数据库级别的参数 + + ``` + postgres=# ALTER DATABASE postgres SET explain_perf_mode TO pretty; + ``` + + 当结果显示为如下信息,则表示设置成功。 + + ``` + ALTER DATABASE + ``` + + 在下次会话中生效。 + + - 设置用户级别的参数 + + ``` + postgres=# ALTER USER omm SET explain_perf_mode TO pretty; + ``` + + 当结果显示为如下信息,则表示设置成功。 + + ``` + ALTER ROLE + ``` + + 在下次会话中生效。 + + - 设置会话级别的参数 + + ``` + postgres=# SET explain_perf_mode TO pretty; + ``` + + 当结果显示为如下信息,则表示设置成功。 + + ``` + SET + ``` + +5. 检查参数设置的正确性。 + + ``` + postgres=# SHOW explain_perf_mode; + explain_perf_mode + -------------- + pretty + (1 row) + ``` + + +## 示例 + +- 示例1:使用方式一修改openGauss数据库主节点的最大连接数。 + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 200 + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库主节点的最大连接数。 + + ``` + gs_guc set -N all -I all -c "max_connections = 800" + ``` + + 6. 重启openGauss。 + + ``` + gs_om -t stop && gs_om -t start + ``` + + 7. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 8. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 800 + (1 row) + ``` + + +- 示例2:使用方式二设置数据库主节点的客户端认证最长时间参数“authentication\_timeout” + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 1min + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库主节点的客户端认证最长时间。 + + ``` + gs_guc reload -N all -I all -c "authentication_timeout = 59s" + ``` + + 6. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 7. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 59s + (1 row) + ``` + + +- 示例3:修改openGauss数据库节点的最大连接数。 + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 200 + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库节点的最大连接数。 + + ``` + gs_guc set -N all -I all -c "max_connections = 500" + ``` + + 6. 重启openGauss。 + + ``` + gs_om -t stop + gs_om -t start + ``` + + 7. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 8. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 500 + (1 row) + ``` + + +- 示例4:设置数据库节点的客户端认证最长时间参数“authentication\_timeout” + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 1min + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库节点的客户端认证最长时间。 + + ``` + gs_guc reload -N all -I all -c "authentication_timeout = 30s" + ``` + + 6. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 7. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 30s + (1 row) + ``` + + + diff --git "a/content/zh/docs/Quickstart/\351\224\201\347\256\241\347\220\206.md" "b/content/zh/docs/Quickstart/\351\224\201\347\256\241\347\220\206.md" new file mode 100644 index 000000000..c55f8b271 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\224\201\347\256\241\347\220\206.md" @@ -0,0 +1,124 @@ +# 锁管理 + +在openGauss中,并发执行的事务由于竞争资源会导致死锁。本节介绍的参数主要管理事务锁的机制。 + +## deadlock\_timeout + +**参数说明:**设置死锁超时检测时间,以毫秒为单位。当申请的锁超过设定值时,系统会检查是否产生了死锁。 + +- 死锁的检查代价是比较高的,服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中死锁是不经常出现的,因此在检查死锁前只需等待一个相对较短的时间。增加这个值就减少了无用的死锁检查浪费的时间,但是会减慢真正的死锁错误报告的速度。在一个负载过重的服务器上,用户可能需要增大它。这个值的设置应该超过事务持续时间,这样就可以减少在锁释放之前就开始死锁检查的问题。 +- 如果要通过设置[log\_lock\_waits](zh-cn_topic_0237124723.md#zh-cn_topic_0059778400_s0e43c2815b8a4f369d5b150535d1703f)来将查询执行过程中的锁等待耗时信息写入日志,请确保[log\_lock\_waits](zh-cn_topic_0237124723.md#zh-cn_topic_0059778400_s0e43c2815b8a4f369d5b150535d1703f)的设置值小于deadlock\_timeout的设置值(或默认值)。 + +该参数属于SUSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,1\~2147483647,单位为毫秒(ms)。 + +**默认值:**1s + +## lockwait\_timeout + +**参数说明:**控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。 + +该参数属于SUSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX,单位为毫秒(ms)。 + +**默认值:**20min + +## update\_lockwait\_timeout + +**参数说明:**允许并发更新参数开启情况下,该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。 + +该参数属于SUSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX,单位为毫秒(ms)。 + +**默认值:**2min + +## max\_locks\_per\_transaction + +**参数说明:**控制每个事务能够得到的平均的对象锁的数量。 + +- 共享的锁表的大小是以假设任意时刻最多只有max\_locks\_per\_transaction\*\(max\_connections+max\_prepared\_transactions\) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在数据库启动的时候设置。 +- 增大这个参数可能导致openGauss请求更多的System V共享内存,有可能超过操作系统的缺省配置。 +- 当运行备机时,请将此参数设置不小于主机上的值,否则,在备机上查询操作不会被允许。 + +该参数属于POSTMASTER类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,10 \~ INT\_MAX + +**默认值:**256 + +## max\_pred\_locks\_per\_transaction + +**参数说明:**控制每个事务允许断定锁的最大数量,是一个平均值。 + +- 共享的断定锁表的大小是以假设任意时刻最多只有max\_pred\_locks\_per\_transaction\*\(max\_connections+max\_prepared\_transactions\) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在服务器启动的时候设置。 +- 增大这个参数可能导致openGauss请求更多的System V共享内存,有可能超过操作系统的缺省配置。 + +该参数属于POSTMASTER类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,10 \~ INT\_MAX + +**默认值:**64 + +## gs\_clean\_timeout + +**参数说明:**控制DBnode周期性调用gs\_clean工具的时间,是一个平均值。 + +- openGauss数据库中事务处理使用的是两阶段提交的方法,当有两阶段事务残留时,该事务通常会拿着表级锁,导致其它连接无法加锁,此时需要调用gs\_clean工具对openGauss中两阶段事务进行清理,gs\_clean\_timeout是控制DBnode周期性调用gs\_clean的时间。 +- 增大这个参数可能导致openGauss周期性调用gs\_clean工具的时间延长,导致两阶段事务清理时间延长。 + +该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX / 1000,单位为秒(s)。 + +**默认值:**5min + +## partition\_lock\_upgrade\_timeout + +**参数说明:**在执行某些查询语句的过程中,会需要将分区表上的锁级别由允许读的ExclusiveLock级别升级到读写阻塞的AccessExclusiveLock级别。如果此时已经存在并发的读事务,那么该锁升级操作将阻塞等待。partition\_lock\_upgrade\_timeout为尝试锁升级的等待超时时间。 + +- 在分区表上进行MERGE PARTITION和CLUSTER PARTITION操作时,都利用了临时表进行数据重排和文件交换,为了最大程度提高分区上的操作并发度,在数据重排阶段给相关分区加锁ExclusiveLock,在文件交换阶段加锁AccessExclusiveLock。 +- 常规加锁方式是等待加锁,直到加锁成功,或者等待时间超过[lockwait\_timeout](#zh-cn_topic_0242371525_zh-cn_topic_0237124735_zh-cn_topic_0059778102_s6569557a768f4a80b5cade038eafb31b)发生超时失败。 +- 在分区表上进行MERGE PARTITION或CLUSTER PARTITION操作时,进入文件交换阶段需要申请加锁AccessExclusiveLock,加锁方式是尝试性加锁,加锁成功了则立即返回,不成功则等待50ms后继续下次尝试,加锁超时时间使用会话级设置参数partition\_lock\_upgrade\_timeout。 +- 特殊值:若partition\_lock\_upgrade\_timeout取值-1,表示无限等待,即不停的尝试锁升级,直到加锁成功。 + + 该参数属于USERSET类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**整型,最小值-1,最大值3000,单位为秒(s)。 + +**默认值:**1800 + +## fault\_mon\_timeout + +**参数说明:**轻量级死锁检测周期。该参数属于SIGHUP类型参数,请参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值0,最大值1440,单位为分钟(min) + +**默认值:**5min + +## enable\_online\_ddl\_waitlock + +**参数说明:**控制DDL是否会阻塞等待pg\_advisory\_lock/pgxc\_lock\_for\_backup等openGauss锁。主要用于OM在线操作场景,不建议用户设置。 + +该参数属于SIGHUP类型参数,参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启。 +- off表示关闭。 + +**默认值:**off + +## xloginsert\_locks + +参数说明:控制用于并发写预写式日志锁的个数。主要用于提高写预写式日志的效率。 + +该参数属于POSTMASTER类型参数,参考[表2](zh-cn_topic_0237121562.md#zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +取值范围:整型,最小值1,最大值1000 + +默认值:8 + diff --git "a/content/zh/docs/Quickstart/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" "b/content/zh/docs/Quickstart/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" new file mode 100644 index 000000000..5571acde9 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" @@ -0,0 +1,11 @@ +# 错误报告和日志 + +- **[记录日志的位置](记录日志的位置.md)** + +- **[记录日志的时间](记录日志的时间.md)** + +- **[记录日志的内容](记录日志的内容.md)** + +- **[使用CSV格式写日志](使用CSV格式写日志.md)** + + diff --git "a/content/zh/docs/Quickstart/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" "b/content/zh/docs/Quickstart/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" new file mode 100644 index 000000000..45d5f47c6 --- /dev/null +++ "b/content/zh/docs/Quickstart/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" @@ -0,0 +1,11 @@ +# 预写式日志 + +- **[设置](设置.md)** + +- **[检查点](检查点.md)** + +- **[日志回放](日志回放.md)** + +- **[归档](归档.md)** + + diff --git "a/content/zh/docs/Quickstart/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" "b/content/zh/docs/Quickstart/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" new file mode 100644 index 000000000..7f8d9ce79 --- /dev/null +++ "b/content/zh/docs/Quickstart/\357\274\210\345\217\257\351\200\211\357\274\211\350\256\276\347\275\256\345\244\207\346\234\272\345\217\257\350\257\273.md" @@ -0,0 +1,10 @@ +# (可选)设置备机可读 + +备机可读特性为可选特性,需要修改配置参数并重启主备机器后才能使用。在开启备机可读之后,备机将支持读操作,并满足数据一致性要求。 + +## 操作步骤 + +1. 如果主备机上的openGauss数据库实例正在运行,请先分别停止主备机上的数据库实例。 +2. 根据[表2](配置数据库主节点信息.md#zh-cn_topic_0242552161_zh-cn_topic_0241802596_table15838192510429)对应路径,分别打开主机与备机的postgres.conf配置文件,找到并将对应参数修改为:wal\_level=hot\_standby ; hot\_standby = on;hot\_standby\_feedback = on。 +3. 修改完成后,分别启动主备机即可。 + -- Gitee From eafc171d4070d49dd90d45b92eae4c1f1f31e4ee Mon Sep 17 00:00:00 2001 From: liyang0608 <554903772@qq.com> Date: Thu, 28 May 2020 17:43:58 +0800 Subject: [PATCH 26/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Toolreference/.keep | 0 content/zh/docs/Toolreference/FAQ.md | 5 + content/zh/docs/Toolreference/Predictor.md | 9 + content/zh/docs/Toolreference/Sqldiag.md | 19 + .../zh/docs/Toolreference/Toolreference.md | 4 + content/zh/docs/Toolreference/X-Tuner.md | 13 + content/zh/docs/Toolreference/figures/.keep | 0 .../figures/zh-cn_image_0245423148.png | Bin 0 -> 25606 bytes content/zh/docs/Toolreference/gaussdb.md | 496 ++++++ content/zh/docs/Toolreference/gs_backup.md | 141 ++ .../zh/docs/Toolreference/gs_basebackup.md | 112 ++ content/zh/docs/Toolreference/gs_check.md | 1460 +++++++++++++++++ content/zh/docs/Toolreference/gs_checkos.md | 648 ++++++++ content/zh/docs/Toolreference/gs_checkperf.md | 364 ++++ content/zh/docs/Toolreference/gs_collector.md | 310 ++++ ...06\345\233\276\345\210\227\350\241\250.md" | 237 +++ content/zh/docs/Toolreference/gs_ctl.md | 367 +++++ content/zh/docs/Toolreference/gs_dump.md | 561 +++++++ content/zh/docs/Toolreference/gs_dumpall.md | 253 +++ content/zh/docs/Toolreference/gs_guc.md | 320 ++++ content/zh/docs/Toolreference/gs_install.md | 146 ++ content/zh/docs/Toolreference/gs_om.md | 513 ++++++ .../zh/docs/Toolreference/gs_postuninstall.md | 123 ++ .../zh/docs/Toolreference/gs_preinstall.md | 362 ++++ content/zh/docs/Toolreference/gs_restore.md | 385 +++++ content/zh/docs/Toolreference/gs_ssh.md | 67 + content/zh/docs/Toolreference/gs_sshexkey.md | 211 +++ content/zh/docs/Toolreference/gs_uninstall.md | 76 + .../zh/docs/Toolreference/gs_upgradectl.md | 228 +++ content/zh/docs/Toolreference/gsql.md | 17 + .../gsql\346\246\202\350\277\260.md" | 444 +++++ content/zh/docs/Toolreference/gstrace.md | 158 ++ content/zh/docs/Toolreference/kadmin-local.md | 10 + content/zh/docs/Toolreference/kdb5_util.md | 10 + content/zh/docs/Toolreference/kdestroy.md | 10 + content/zh/docs/Toolreference/kinit.md | 10 + content/zh/docs/Toolreference/klist.md | 10 + content/zh/docs/Toolreference/krb5kdc.md | 10 + content/zh/docs/Toolreference/pg_config.md | 136 ++ .../zh/docs/Toolreference/pg_controldata.md | 47 + content/zh/docs/Toolreference/pg_resetxlog.md | 65 + .../Toolreference/public_sys-resources/.keep | 0 .../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 ...\347\224\250\346\214\207\345\257\274-0.md" | 27 + ...347\224\250\346\214\207\345\257\274-10.md" | 182 ++ ...\347\224\250\346\214\207\345\257\274-5.md" | 75 + ...77\347\224\250\346\214\207\345\257\274.md" | 186 +++ ...75\344\273\244\345\217\202\350\200\203.md" | 988 +++++++++++ ...\344\273\244\345\217\202\350\200\203-2.md" | 100 ++ ...\344\273\244\345\217\202\350\200\203-7.md" | 44 + ...75\344\273\244\345\217\202\350\200\203.md" | 334 ++++ ...67\347\253\257\345\267\245\345\205\267.md" | 13 + ...67\344\270\200\350\247\210\350\241\250.md" | 77 + ...351\242\230\345\244\204\347\220\206-11.md" | 7 + ...\351\242\230\345\244\204\347\220\206-3.md" | 5 + ...\351\242\230\345\244\204\347\220\206-8.md" | 7 + ...56\351\242\230\345\244\204\347\220\206.md" | 255 +++ ...51\224\231-Failed-to-obtain-the-GPHOME.md" | 28 + ...41\347\253\257\345\267\245\345\205\267.md" | 25 + .../\346\246\202\350\277\260-4.md" | 4 + .../\346\246\202\350\277\260-9.md" | 4 + .../\346\246\202\350\277\260.md" | 4 + ...50\347\232\204\345\267\245\345\205\267.md" | 45 + ...\345\217\226\345\270\256\345\212\251-1.md" | 50 + ...\345\217\226\345\270\256\345\212\251-6.md" | 31 + ...67\345\217\226\345\270\256\345\212\251.md" | 120 ++ 71 files changed, 10968 insertions(+) delete mode 100644 content/zh/docs/Toolreference/.keep create mode 100644 content/zh/docs/Toolreference/FAQ.md create mode 100644 content/zh/docs/Toolreference/Predictor.md create mode 100644 content/zh/docs/Toolreference/Sqldiag.md create mode 100644 content/zh/docs/Toolreference/Toolreference.md create mode 100644 content/zh/docs/Toolreference/X-Tuner.md delete mode 100644 content/zh/docs/Toolreference/figures/.keep create mode 100644 content/zh/docs/Toolreference/figures/zh-cn_image_0245423148.png create mode 100644 content/zh/docs/Toolreference/gaussdb.md create mode 100644 content/zh/docs/Toolreference/gs_backup.md create mode 100644 content/zh/docs/Toolreference/gs_basebackup.md create mode 100644 content/zh/docs/Toolreference/gs_check.md create mode 100644 content/zh/docs/Toolreference/gs_checkos.md create mode 100644 content/zh/docs/Toolreference/gs_checkperf.md create mode 100644 content/zh/docs/Toolreference/gs_collector.md create mode 100644 "content/zh/docs/Toolreference/gs_collector\345\267\245\345\205\267\346\224\257\346\214\201\346\224\266\351\233\206\347\232\204\347\263\273\347\273\237\350\241\250\345\222\214\350\247\206\345\233\276\345\210\227\350\241\250.md" create mode 100644 content/zh/docs/Toolreference/gs_ctl.md create mode 100644 content/zh/docs/Toolreference/gs_dump.md create mode 100644 content/zh/docs/Toolreference/gs_dumpall.md create mode 100644 content/zh/docs/Toolreference/gs_guc.md create mode 100644 content/zh/docs/Toolreference/gs_install.md create mode 100644 content/zh/docs/Toolreference/gs_om.md create mode 100644 content/zh/docs/Toolreference/gs_postuninstall.md create mode 100644 content/zh/docs/Toolreference/gs_preinstall.md create mode 100644 content/zh/docs/Toolreference/gs_restore.md create mode 100644 content/zh/docs/Toolreference/gs_ssh.md create mode 100644 content/zh/docs/Toolreference/gs_sshexkey.md create mode 100644 content/zh/docs/Toolreference/gs_uninstall.md create mode 100644 content/zh/docs/Toolreference/gs_upgradectl.md create mode 100644 content/zh/docs/Toolreference/gsql.md create mode 100644 "content/zh/docs/Toolreference/gsql\346\246\202\350\277\260.md" create mode 100644 content/zh/docs/Toolreference/gstrace.md create mode 100644 content/zh/docs/Toolreference/kadmin-local.md create mode 100644 content/zh/docs/Toolreference/kdb5_util.md create mode 100644 content/zh/docs/Toolreference/kdestroy.md create mode 100644 content/zh/docs/Toolreference/kinit.md create mode 100644 content/zh/docs/Toolreference/klist.md create mode 100644 content/zh/docs/Toolreference/krb5kdc.md create mode 100644 content/zh/docs/Toolreference/pg_config.md create mode 100644 content/zh/docs/Toolreference/pg_controldata.md create mode 100644 content/zh/docs/Toolreference/pg_resetxlog.md delete mode 100644 content/zh/docs/Toolreference/public_sys-resources/.keep create mode 100644 content/zh/docs/Toolreference/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Toolreference/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Toolreference/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Toolreference/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Toolreference/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Toolreference/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-0.md" create mode 100644 "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" create mode 100644 "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" create mode 100644 "content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274.md" create mode 100644 "content/zh/docs/Toolreference/\345\205\203\345\221\275\344\273\244\345\217\202\350\200\203.md" create mode 100644 "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" create mode 100644 "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" create mode 100644 "content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203.md" create mode 100644 "content/zh/docs/Toolreference/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267.md" create mode 100644 "content/zh/docs/Toolreference/\345\267\245\345\205\267\344\270\200\350\247\210\350\241\250.md" create 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" create mode 100644 "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" create mode 100644 "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" create mode 100644 "content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" create mode 100644 "content/zh/docs/Toolreference/\346\211\247\350\241\214\345\221\275\344\273\244\346\212\245\351\224\231-Failed-to-obtain-the-GPHOME.md" create mode 100644 "content/zh/docs/Toolreference/\346\234\215\345\212\241\347\253\257\345\267\245\345\205\267.md" create mode 100644 "content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md" create mode 100644 "content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" create mode 100644 "content/zh/docs/Toolreference/\346\246\202\350\277\260.md" create mode 100644 "content/zh/docs/Toolreference/\347\263\273\347\273\237\345\206\205\351\203\250\344\275\277\347\224\250\347\232\204\345\267\245\345\205\267.md" create mode 100644 "content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-1.md" create mode 100644 "content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" create mode 100644 "content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251.md" diff --git a/content/zh/docs/Toolreference/.keep b/content/zh/docs/Toolreference/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Toolreference/FAQ.md b/content/zh/docs/Toolreference/FAQ.md new file mode 100644 index 000000000..24c73c45f --- /dev/null +++ b/content/zh/docs/Toolreference/FAQ.md @@ -0,0 +1,5 @@ +# FAQ + +- **[执行命令报错“Failed to obtain the GPHOME”](执行命令报错-Failed-to-obtain-the-GPHOME.md)** + + diff --git a/content/zh/docs/Toolreference/Predictor.md b/content/zh/docs/Toolreference/Predictor.md new file mode 100644 index 000000000..65ccf95f6 --- /dev/null +++ b/content/zh/docs/Toolreference/Predictor.md @@ -0,0 +1,9 @@ +# Predictor + +- **[概述](概述-9.md)** + +- **[使用指导](使用指导-10.md)** + +- **[常见问题处理](常见问题处理-11.md)** + + diff --git a/content/zh/docs/Toolreference/Sqldiag.md b/content/zh/docs/Toolreference/Sqldiag.md new file mode 100644 index 000000000..6d99256a1 --- /dev/null +++ b/content/zh/docs/Toolreference/Sqldiag.md @@ -0,0 +1,19 @@ +# Sqldiag + +Sqliag是openGauss中SQL语句执行时长预测框架。现有的预测技术主要基于执行计划的模型预测,但这些预测方案仅适用于OLAP场景且可以获取执行计划的作业,对于OLTP或者HTAP这样的快速查询是没有使用价值的。和上述方案不同,Sqldiag着眼于数据库的历史SQL语句,因为短时间内数据库SQL语句执行时长不会有太大的差距,Sqldiag可以从历史数据中检测出已输入指令相似的指令集,并基于SQL向量化技术和时序预测算法预测SQL语句执行时长。该框架有如下优点: + +1. 不需要指令的执行计划,对数据库性能不会有任何的影响。 +2. 使用场景广泛,目前业内的很多算法具有很强的针对性,比如只适用于OLTP或者OLAP,Sqldiag使用场景广泛。 +3. 该框架鲁棒性强,理解容易,只需要简单的修改,用户就可以设计出自己的预测模型。 + +- **[概述](概述-4.md)** + +- **[使用指导](使用指导-5.md)** + +- **[获取帮助](获取帮助-6.md)** + +- **[命令参考](命令参考-7.md)** + +- **[常见问题处理](常见问题处理-8.md)** + + diff --git a/content/zh/docs/Toolreference/Toolreference.md b/content/zh/docs/Toolreference/Toolreference.md new file mode 100644 index 000000000..c6df506a0 --- /dev/null +++ b/content/zh/docs/Toolreference/Toolreference.md @@ -0,0 +1,4 @@ +# 工具参考 + +本章介绍连接数据库的客户端工具、openGauss服务器端所提供的命令行管理工具。 + diff --git a/content/zh/docs/Toolreference/X-Tuner.md b/content/zh/docs/Toolreference/X-Tuner.md new file mode 100644 index 000000000..4007ac5da --- /dev/null +++ b/content/zh/docs/Toolreference/X-Tuner.md @@ -0,0 +1,13 @@ +# X-Tuner + +- **[概述](概述.md)** + +- **[使用指导](使用指导-0.md)** + +- **[获取帮助](获取帮助-1.md)** + +- **[命令参考](命令参考-2.md)** + +- **[常见问题处理](常见问题处理-3.md)** + + diff --git a/content/zh/docs/Toolreference/figures/.keep b/content/zh/docs/Toolreference/figures/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Toolreference/figures/zh-cn_image_0245423148.png b/content/zh/docs/Toolreference/figures/zh-cn_image_0245423148.png new file mode 100644 index 0000000000000000000000000000000000000000..9686f9c39dbce6deecadc9af4a4cdf1f18cc0831 GIT binary patch literal 25606 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 R-tR%As;B|`^1w9Ue*ikrXh8q~ literal 0 HcmV?d00001 diff --git a/content/zh/docs/Toolreference/gaussdb.md b/content/zh/docs/Toolreference/gaussdb.md new file mode 100644 index 000000000..c8112550d --- /dev/null +++ b/content/zh/docs/Toolreference/gaussdb.md @@ -0,0 +1,496 @@ +# gaussdb + +## 背景信息 + +gaussdb是openGauss数据库的主进程,也是一个可执行的命令,能够通过其启动一个数据库进程。 + +## 语法 + +``` +gaussdb [OPTION]... +``` + +## 描述 + +客户端应用程序为了访问数据库,将连接(通过网络或本地)到一个正在运行的gaussdb进程。然后该进程实例会启动一个独立的线程来处理这个连接。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>通过gaussdb启动数据库时,需要再开一个窗口来连接到数据库,也可以使用&符号使程序在后台执行。 + +一个gaussdb进程总是管理来自同一个数据库的数据。一个系统上可以同时运行多个gaussdb进程,只要使用不同的数据目录和不同的端口号。gaussdb启动时需要知道数据目录的位置,该位置必须通过-D指定。通常,-D直接指向由gs\_initdb创建的数据库目录。 + +缺省时gaussdb在前台启动并将日志信息输出到标准错误。但在实际应用中,gaussdb应当作为后台进程启动,而且多数是在系统启动时自动启动。 + +gaussdb还能以单用户模式运行,这种用法主要用于gs\_initdb的初始化过程中,有时候也被用于调试灾难性恢复。不过,单用户模式运行的服务器并不适合于调试,因为没有实际的进程间通讯和锁动作发生。当从shell上以单用户模式调用时,用户可以输入查询,然后结果会在屏幕上以一种更适合开发者阅读(不适合普通用户)的格式显示出来。在单用户模式下,将把会话用户ID设为1并赋予系统管理员权限。该用户不必实际存在,因此单用户模式运行的服务器可以用于对某些意外损坏的系统表进行手工恢复。 + +## 选项 + +gaussdb接受[表1](#zh-cn_topic_0237152404_zh-cn_topic_0059777816_zh-cn_topic_0058968126_table57797050)中所示的命令行参数。 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-A 1|0

+

运行时断言检查,是检测编程错误的调试帮助。

+

-

+

-B NBUFFERS

+

设置服务器进程使用的共享内存缓冲区的数量。

+

-

+

-b BINARY UPGRADES

+

binary upgrade标志。

+

-

+

-c NAME=VALUE

+

给一个正在运行的参数命名。-c可以出现多次从而设置多个参数。

+

-

+

-C NAME

+

打印一个命名的运行时的参数的值然后退出。可以用在正在运行的服务器上,从postgresql.conf返回值。

+

取值为postgresql.conf中的所有参数。

+

-d 1-5

+

设置调试级别,1-5记录对应debug级别信息。级别越高,写到服务器日志的调试输出越多。

+

取值范围:1-5。

+
说明:

如果取值小于等于0,则只会记录notice级别的信息。

+
+

-D DATADIR

+

声明数据目录或者配置文件的文件系统路径。

+

用户自定义。

+

-e

+

把缺省日期风格设置为"European",也就是说用DMY规则解释日期输入,并且在一些日期输出格式里日在月份前面打印。

+

-

+

-F

+

关闭fsync调用以提高性能,但是要冒系统崩溃时数据毁坏的风险。声明这个选项等效关闭了fsync参数。

+

-

+

-h HOSTNAME

+

指定gaussdb侦听来自前端应用TCP/IP连接的主机名或IP地址。

+

前端存在的主机名或IP地址。

+

-i

+

该选项允许远程客户通过TCP/IP(网际域套接字)与服务器通讯。

+

-

+

-k DIRECTORY

+

指定gaussdb侦听来自前端应用连接的Unix域套接字的目录。

+

缺省通常是/tmp ,但是可以在编译的时候修改。

+

-l

+

该选项允许远程客户通过SSL( 安全套接层)与服务器通讯。

+

-

+

-N MAX-CONNECT

+

设置服务器接受的客户端连接的最大数。缺省时由gs_initdb自动选择。声明这个选项等价于声明max_connections配置参数。

+

取值范围:正整数。

+

-M SERVERMODE

+

在启动时指定数据库的启动模式。

+

SERVERMODE可以取下面三个值:

+
  • primary:本端以主机模式启动。
  • standby:本端以备机模式启动。
  • pending:本端处于等待状态,等待提升为主机或者备机。
+

-o OPTIONS

+

向每个服务器进程传递 "OPTIONS"。保留语法,已没有实际功能。

+

-

+

-p PORT

+

指定gaussdb侦听客户端连接的TCP/IP端口或本地Unix domain socket文件的扩展。默认端口号为8000

+

正整数,在操作系统支持的端口范围内。

+

-R

+

表明以xlogreiver运行,只在-M standby模式下使用。

+

-

+

-s

+

在每条命令结束时打印时间信息和其他统计信息。

+

-

+

-S WORK-MEM

+

声明内部排序和散列在求助于临时磁盘文件之前可以使用的内存数量。

+

单位为KB。

+

--dbnode

+

数据库节点运行。

+

-

+

--restoremode

+

以恢复节点运行。

+

-

+

--single_node

+

拉起单机数据库。

+

-

+

-V, --version

+

打印gaussdb的版本信息然后退出。

+

-

+

--NAME=VALUE

+

给一个正在运行的参数命名。

+

-

+

--describe-config

+

描述配置参数然后退出。

+

-

+

-?, --help

+

显示关于gaussdb命令行参数的帮助信息,然后退出。

+

-

+
+ +[表2](#zh-cn_topic_0237152404_zh-cn_topic_0059777816_zh-cn_topic_0058968126_table56695537)中的参数主要是便于开发人员调试使用,有时也用于帮助恢复严重损坏的数据库。在应用程序使用数据库提供服务时,请不要使用这些参数进行调试。 + +**表 2** 开发者选项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-f s|i|n|m|h

+

禁止某种扫描和连接方法的使用。

+

取值范围:

+
  • s:关闭顺序
  • i:索引扫描
  • n:关闭嵌套循环
  • m:融合(merge)连接
  • h:Hash连接
+

-n

+

主要用于调试导致服务器进程异常崩溃的问题。一般策略是通知所有其他服务器进程终止并重新初始化共享内存和信号灯。该选项指定gaussdb不重新初始化共享内存。

+

-

+

-O

+

允许修改系统表的内部。

+

-

+

-P

+

读系统表时忽略系统索引,但在修改表时仍然更新索引。

+

-

+

-t pa|pl|ex

+

打印与每个主要系统模块相关的查询记时统计。

+

-

+

-T

+

主要用于调试导致服务器进程异常崩溃的问题。该选项指定gaussdb通过发送SIGSTOP信号停止其他所有服务器进程,但是并不让它们退出。这样就允许系统程序员手动从所有服务器进程搜集内核转储。

+

-

+

-W NUM

+

指定一个新的服务器进程开始需要等待的秒数。

+

单位:秒

+

--localxid

+

使用本地事务ID,而不是全局事务ID。

+
须知:

此选项仅用于gs_initdb。使用此选项可能会导致数据库不一致。

+
+

已存在的本地事务ID

+
+ +下面的选项[表3](#zh-cn_topic_0237152404_zh-cn_topic_0059777816_zh-cn_topic_0058968126_table57361376)仅在单用户模式下可用。 + +**表 3** 单用户模式选项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--single

+

启动单用户模式。必须是命令行中的第一个选项。

+

-

+

DBNAME

+

要访问的数据库的名称。

+

字符串。默认为用户名。

+

-d 0-5

+

重新指定调试级别。

+

0-5

+

-E

+

回显所有命令。

+

-

+

-j

+

禁止使用新行作为语句分隔符。

+

-

+

-r FILENAME

+

将所有服务器标准输出和标准错误保存到文件filename中。

+

-

+
+ +**表 4** 自启动模式选项 + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--boot

+

启动自启动模式。必须是命令行中的第一个选项。

+

-

+

-r FILENAME

+

将所有服务器标准输出和标准错误保存到文件filename中。

+

-

+

-x NUM

+

指定一个新的服务器线程的类型。在初始化数据库时,会用到自启动模式,通过设置这个参数,启动不同线程来执行一些逻辑,正常情况下,不会用到,因为自启动模式很少会用到。

+

-

+
+ +**表 5** 升级模式选项 + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-u NUM

+

指定升级前数据库内核版本号。

+

-

+
+ +除以上参数外,出现在postgres.conf中的所有参数,均可以用--guc\_name=guc\_value的方式在gaussdb启动时传给gaussdb。例如,--enable\_fast\_query\_shipping=off + +## 环境变量 + +- PGLINETENCODING:客户端使用的缺省字符编码。客户端可以独立地覆盖它。这个值也可以在配置文件里设置。 +- PGDATESTYLE:运行时参数DateStyle的缺省值。现在反对使用该环境变量。 +- TZ:服务器的时区。 + +## 错误处理 + +一个提到了semget或shmget的错误信息可能意味着需要重新配置内核,提供足够的共享内存和信号灯。可以通过降低shared\_buffers值以减少openGauss的共享内存的消耗,或者降低max\_connections值减少openGauss的信号灯的消耗。 + +如果发现类似“另外一个服务器正在运行”的错误信息,可以根据系统使用不同的命令: + +``` +ps ax | grep gaussdb +``` + +或 + +``` +ps -ef | grep gaussdb +``` + +如果确信没有冲突的服务器正在运行,可以删除消息里提到的锁文件然后再次运行。 + +无法绑定端口的错误信息可能表明该端口已经被其他非openGauss进程使用。如果终止gaussdb后又马上用同一端口号运行它,也可能得到错误信息。这时,必须多等几秒,等操作系统关闭了该端口再试。最后,如果使用了一个操作系统认为是保留的端口,也可能导致这个错误信息。例如:Unix版本认为低于1024的端口号是“可信任的”,因而只有Unix系统管理员可以使用它们。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果有可能,不要使用SIGKILL杀死主进程。这样会阻止gaussdb在退出前释放它持有的系统资源(例如共享内存和信号灯)。这样可能会影响到将来启动新的进程。 +>- 可以使用SIGTERM,SIGINT,SIGQUIT信号正常结束服务器进程。第一个信号将等待所有的客户端退出后才退出。第二个将强制断开所有客户端,而第三个将不停止立刻退出,导致在重启时的恢复运行。 +>- 信号SIGHUP将会重新加载服务器配置文件。它也可能给单个服务器进程发送SIGHUP信号,但是这通常是不明显的。 +>- 要取消一个正在执行的查询,向正在运行的进程发送SIGINT信号。 +>- 主服务器进程向子进程发送SIGTERM信号让它们正常退出;发送SIGQUIT信号立即退出且不做清理工作。用户有三种信号不能用。同时,发送SIGKILL信号也是不明智的:主进程将把这个信号当作崩溃信号,然后会强制其他兄弟进程作为标准的崩溃回复过程退出。 + +## 用法 + +启动一个单用户模式的服务器: + +``` +gaussdb --single -D /usr/local/pgsql/data other-options my_database +``` + +用-D给服务器提供正确的数据库目录的路径。同时还要声名已存在的特定数据库名称。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 通常,独立运行的服务器把换行符当做命令输入完成字符;要想把一行分成多行写,必需在除最后一个换行符以外的每个换行符前面敲一个反斜杠。 +>- 如果使用了-j命令行选项,新行将不被当作命令结束符。此时服务器将从标准输入一直读取到EOF标志为止,然后把所有读到的内容当作一个完整的命令字符串看待,并且反斜杠与换行符也被当作普通字符来看待。 +>- 输入EOF(Control+D)即可退出会话。如果已经使用了-j则必须连续使用两个EOF才行。 +>- 单用户模式运行的服务器不会提供复杂的行编辑功能(比如没有命令历史)。单用户模式也不会做任何后台处理,像自动检查点。 + +## 示例 + +1. 用缺省值在后台启动gaussdb: + + ``` + nohup gaussdb >logfile 2>&1 + +## 背景信息 + +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/Toolreference/gs_basebackup.md b/content/zh/docs/Toolreference/gs_basebackup.md new file mode 100644 index 000000000..01904b437 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_basebackup.md @@ -0,0 +1,112 @@ +# gs\_basebackup + +## 背景信息 + +openGauss部署成功后,在数据库运行的过程中,会遇到各种问题及异常状态。openGauss提供了gs\_basebackup工具做基础备份。。 + +gs\_basebackup工具由数据库安装用户执行。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_basebackup仅支持全量备份,不支持增量恢复。 + +## 前提条件 + +- 可以正常连接openGauss数据库。 +- 在进行还原时,需要保证各节点备份目录中存在备份文件,若备份文件丢失,则需要从其他节点进行拷贝(二进制文件需修改文件名中的节点名)。 + +## 语法 + +- 显示帮助信息 + + ``` + gs_basebackup -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_basebackup -V | --version + ``` + + +## 参数说明 + +gs\_basebackup参数可以分为如下几类: + +- -D directory + + 写输出的目录,必选项。 + +- -x + + 相当于-X的fetch方法 + +- -X + + 在备份中包含所需的事务日志文件(WAL文件)。 + + +支持的事务日志收集方式为fast或者stream + +- 常用参数: + - -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=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. +``` + diff --git a/content/zh/docs/Toolreference/gs_check.md b/content/zh/docs/Toolreference/gs_check.md new file mode 100644 index 000000000..445457258 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_check.md @@ -0,0 +1,1460 @@ +# gs\_check + +## 背景信息 + +gs\_check改进增强,统一化当前系统中存在的各种检查工具,例如[gs\_check](gs_check.md),[gs\_checkos](gs_checkos.md)等,帮助用户在openGauss运行过程中,全量的检查openGauss运行环境,操作系统环境,网络环境及数据库执行环境,也有助于在openGauss重大操作之前对各类环境进行全面检查,有效保证操作执行成功。 + +## **注意事项** + +- 扩容新节点检查只能在root用户下执行,其他场景都必须在omm用户下执行。 +- 必须指定-i或-e参数,-i会检查指定的单项,-e会检查对应场景配置中的多项。 +- root用户在非本地模式下只能进行扩容新节点检查。 +- 如果-i参数中不包含root类检查项或-e场景配置列表中没有root类检查项,则不需要交互输入root权限的用户及其密码。 +- 可使用--skip-root-items跳过检查项中包含的root类检查,以免需要输入root权限用户及密码。 +- 黑名单检查项仅适用于R5升级到R6。 +- MTU值不一致时可能导致检查缓慢或进程停止响应,当巡检工具出现提示时请修改各节点MTU值一致后再进行巡检。 +- 交换机不支持当前设置的MTU值时,即使MTU值一致也会出现通信问题引起进程停止响应,需要根据交换机调整MTU大小。 + +## 语法 + +- 单项检查: + + ``` + gs_check -i ITEM [...] [-U USER] [-L] [-l LOGFILE] [-o OUTPUTDIR] [--skip-root-items][--set][--routing] + ``` + +- 场景检查: + + ``` + gs_check -e SCENE_NAME [-U USER] [-L] [-l LOGFILE] [-o OUTPUTDIR] [--hosts] [--skip-root-items] [--time-out=SECS][--set][--routing][--skip-items] + ``` + +- 显示帮助信息 + + ``` + gs_check -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_check -V | --version + ``` + + +## 参数说明 + +- -U + + 运行openGauss的用户名称。 + + 取值范围:运行openGauss的用户名称。 + +- -L + + 本地执行 + +- -i + + 指定检查项。格式-i CheckXX详细的检查项请参见[表1 openGauss状态检查表](#zh-cn_topic_0237152330_zh-cn_topic_0059777799_t48caf3ebc47a4dce88ed8b7132976edd)。 + +- -e + + 场景检查项。默认的场景有inspect(例行巡检)、upgrade(升级前巡检)、expand(扩容前巡检)、binary\_upgrade(就地升级前巡检)、health(健康检查巡检)、install\(安装\),replace\(节点替换\),expand\_new\_node\(扩容\)等,用户可以根据需求自己编写场景。 + +- -l + + 指定日志文件路径。 + +- -o + + 指定检查结果输出文件夹路径。 + +- --hosts + + 用于保存执行检查的节点地址的文件,expand\_new\_node场景必加,其余场景可加可不加,但必须保证要写对。 + +- --skip-root-items + + 跳过需要root权限执行的检查项。 + +- --skip-items + + 跳过指定的检查项。 + +- --format + + 设置结果报告的格式。 + +- --set + + 修复支持设置的Abnormal项。 + +- --time-out + + 设置超时时间。单位为秒,默认为1500s,若用户自定义超时时间不得少于1500s。 + +- --routing + + 指定业务IP的网段,格式为IP地址:子网掩码。 + +- --disk-threshold="PERCENT" + + 检查磁盘占用时可选指定告警阈值,可指定1-99之间的整数,不输入则默认为90。检查其他项时不需要该参数。 + +- --ShrinkNodes + + 指定缩容磁盘空间检查时缩容节点名称,仅在-i CheckSpaceForShrink时有效。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +**表 1** openGauss状态检查表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

状态

+

巡检项

+

检查内容

+

是否支持--set

+

os

+

CheckCPU(检查CPU使用率)

+

检查主机CPU占用率,如果idle大于30%并且iowait小于30%。则检查项通过,否则检查项不通过。

+

+

CheckFirewall(检查防火墙状态)

+

检查主机防火墙状态,如果防火墙关闭则检查项通过,否则检查项不通过。

+

+

CheckTimeZone(检查时区一致性)

+

检查openGauss内各节点时区,如果时区一致则检查通过,否则检查项不通过。

+

+

CheckSysParams(检查系统参数)

+

检查各节点操作系统参数,判断是否等于预期值。检查项不满足warning域则报warning,不满足NG域则检查项不通过,并打印不满足项。

+

详见操作系统参数

+

+

CheckOSVer(检查操作系统版本)

+

检查openGauss内各个节点的操作系统版本信息,如果满足版本兼容列表且openGauss在同一混搭列表中则检查通过,否则检查不通过。

+

+

CheckNTPD(检查NTPD服务)

+

检查系统NTPD服务,如果服务开启且各节点时间误差在1分钟以内则检查项通过,否则检查项不通过。

+

+

CheckTHP(检查THP服务)

+

检查系统THP服务,如果服务开启则检查项通过,否则检查项不通过。

+

+

CheckSshdService(检查sshd服务是否已启动)

+

检查系统是否存在sshd服务,若存在则检查项通过,否则检查项不通过。

+

+

CheckCrondService(检查crontab服务是否已启动)

+

检查系统是否存在crontab服务,若存在则检查项通过,否则检查项不通过。

+

+

CheckCrontabLeft(检查crontab是否有残留Gauss相关信息)

+

检查crontab是否残留Gauss相关信息,若无该信息则检查项通过,否则检查项不通过。

+

+

CheckDirLeft(检查文件目录是否有残留)

+

检查扩容新节点文件目录(/opt/huawei/Bigdata/ ,/var/log/Bigdata/, /home/omm)是否存在,(若mount目录包含此目录则忽略)若不存在则查项通过,否则检查项不通过。

+

+

CheckProcessLeft(检查进程是否有残留)

+

检查扩容新节点上是否残留gaussdb和omm进程,若未残留则检查项通过,否则检查项不通过。

+

+

CheckStack(栈深度检查)

+

检查栈深度,若各个节点不一致则报warning ,若大于等于3072则检查项通过,否则不通过。

+

+

CheckNoCheckSum(检查nochecksum值是否为预期值且一致)

+

检查nochecksum值,

+
  • Redhat 6.4/6.5且使用bond网卡时,各个节点都为Y则检查项通过,否则检查项不通过。
  • 其他系统:若各个节点都为N则检查项通过,否则检查项不通过。
+

+

CheckOmmUserExist(检查omm用户是否存在)

+

检查扩容新节点上是否存在omm用户,若不存在omm用户则检查项通过,否则检查项不通过。

+

+

CheckPortConflict(检查数据库节点端口是否占用)

+

检查数据库节点端口是否已被占用,若未占用则检查项通过,否则检查项不通过。

+

+

CheckSysPortRange(检查ip_local_port_range设置范围)

+

检查ip_local_port_range系统参数范围,若范围在26000~65535则检查项通过,否则检查项不通过。

+

+

CheckEtcHosts(检查/etc/hosts中是否有重复地址以及localhost配置)

+

检查/etc/hosts没有配置localhost检查项不通过,存在带有#openGauss注释的映射则检查项不通过,相同IP不同hostname则检查项不通过,否则通过,若hostname相同,但ip不同检查项不通过。

+

+

CheckCpuCount(检查CPU核数)

+

检查CPU核心与可用CPU不符检查项不通过,相符但存在不可用信息Warning。 所有节点CPU信息不相同检查项不通过。

+

+

CheckSctpService(检查sctp服务)

+

检查sctp服务开启且写在开机自启动文件中则检查项通过,否则检查项不通过。

+

+

CheckHyperThread(检查超线程是否打开)

+

检查超线程,若打开则检查项通过,否则检查项不通过。

+

+

CheckMemInfo(检查内存总大小)

+

检查各节点总内存大小是否一致,若检查结果一致,则检查项通过,否则报warning。

+

+

CheckSshdConfig(检查sshd服务配置是否正确)

+

检查/etc/ssh/sshd_config文件,

+

(a)PasswordAuthentication=yes;

+

(b)MaxStartups=1000;

+

(c)UseDNS=no;

+

(d)ClientAliveInterval大于10800或者等于0

+

配置如上所示则检查项通过,若a、c配置不正确则报warning,b、d配置不正确则检查项不通过。

+

+

CheckMaxHandle(检查句柄最大设置)

+

检查操作系统最大句柄值,如果该值大于等于1000000则检查项通过,否则检查项不通过。

+

+

CheckKernelVer(检查内核版本)

+

检查各节点系统内核版本信息,如果版本信息一致则检查项通过,否则报Warning。

+

+

CheckEncoding(检查编码格式)

+

检查openGauss内各个节点的系统编码,如果编码一致则检查项通过,否则检查项不通过。

+

+

CheckBootItems(检查启动项)

+

检查是否有手动添加的启动项,如果没有则检查通过,否则检查不通过。

+

+

CheckDropCache(检查DropCache进程)

+

检查各节点是否有dropcache进程在运行,若有则检查通过,否则检查不通过。

+

+

CheckFilehandle(检查文件句柄)

+

此检查项检查以下两项,两项都通过为通过,否则为不通过:

+
  • 检查每个gaussdb进程打开的进程数是否超过80万,不超过则检查通过,否则检查不通过。
  • 检查是否有slave进程使用的句柄数超过master进程,如果没有则检查通过,否则检查不通过。
+

+

CheckKeyProAdj(检查关键进程omm_adj的值)

+

检查所有关键进程,如果所有关键进程的omm_adj值为0,则通过,否则不通过。

+

+

CheckMaxProcMemory(检查max_process_memory参数设置是否合理)

+

检查数据库节点的max_process_memory值,判断该参数的值是否大于1G,若不大于则检查项通过,否则检查项不通过。

+

+

device

+

CheckSwapMemory(检查交换内存)

+

检查交换内存和总内存大小,若检查结果为0则检查项通过,否则检查项报Warning大于总内存时检查项不通过。

+

+

CheckLogicalBlock(检查磁盘逻辑块)

+

检查磁盘逻辑块大小,若为512则检查项通过,否则检查项不通过。

+

+

CheckIOrequestqueue(检查IO请求)

+

检查IO值,如果该值为32768则检查项通过,否则检查项不通过。

+

+

CheckMaxAsyIOrequests(检查最大异步请求)

+

获取当前异步请求值当前异步IO值大于(dn+cn)*1048576和104857600则检查项通过,否则检查项不通过。

+

+

CheckIOConfigure(检查IO配置)

+

检查IO配置,如果是deadline则检查项通过,否则检查项不通过。

+

+

CheckBlockdev(检查磁盘预读块)

+

检查磁盘预读块大小,如果预读块大小为16384则检查项通过,否则检查项不通过。

+

+

CheckDiskFormat(检查磁盘格式参数)

+

检查磁盘XFS格式信息,如果配置为'rw,noatime,inode64,allocsize=16m'则检查项通过,否则报warning。

+

+

CheckInodeUsage(检查磁盘inodes使用率)

+

新节点:所有磁盘

+

老节点:openGauss路径(GAUSSHOME/PGHOST/GAUSSHOME/GAUSSLOG/tmp及实例目录)

+

检查以上指定目录使用率,如果使用率超过warning阈值(默认为60%) 报warning超过NG阈值(默认为80%)则检查项不通过,否则通过。

+

+

CheckSpaceUsage(检查磁盘使用率)

+

新节点:所有磁盘

+

老节点:openGauss路径(GAUSSHOME/PGHOST/GAUSSHOME/GAUSSLOG/tmp及实例目录)

+

检查磁盘以上指定目录(目录列表)使用率,如果使用率超过warning阈值(默认为70%) 报warning超过NG阈值(默认为90%)则检查项不通过。openGauss路径下检查GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp/data路径的剩余空间,不满足阈值则检查项不通过,否则通过。

+

+

CheckDiskConfig(检查磁盘空间大小一致性)

+

检查磁盘名大小挂载点是否一致,若一致则检查项通过,否则报warning。

+

+

CheckXid(检查CheckXid数值)

+

查询xid的数值,如果大于10亿报Warning,大于18亿则检查项不通过。

+

+

CheckSysTabSize(检查每个实例的系统表容量)

+

如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。

+

+

cluster

+

CheckClusterState(检查openGauss状态)

+

检查fencedUDF状态,如果fencedUDF状态为down则报warning;检查openGauss状态,如果openGauss状态为Normal则检查项通过,否则检查项不通过。

+

+

CheckConfigFileDiff(检查XML差异)

+

检查静态配置文件与安装xml文件是否满足扩容条件,若满足,则检查项通过,否则检查项不通过。

+

+

+

CheckDBParams(检查openGauss参数)

+

检查数据库主节点检查共享缓冲区大小和Sem参数。

+

数据库节点检查共享缓冲区大小和最大连接数。

+

共享缓冲区需要大于128KB且大于shmmax且大于shmall*PAGESIZE

+

若存在数据库主节点,则Sem值需大于(数据库节点最大连接数+150)/16向上取整。

+

以上项完全满足则检查项通过,否则检查项不通过。

+

+

CheckDebugSwitch(检查日志级别)

+

在各节点检查各实例的配置文件中log_min_messages参数的值,为空则认为是Warning,判断日志级别非waring,则报warning。

+

+

CheckUpVer(检查升级版本是否一致)

+

检查openGauss各个节点上升级包的版本,如果一致则检查项通过,否则检查项不通过。

+

+

CheckDirPermissions(检查目录权限)

+

检查节点目录(实例Xlog路径、GAUSSHOME、GPHOME、PGHOST、GAUSSLOG)权限,如果目录有写入权限且不大于750则检查项通过,否则检查项不通过。

+

+

+

CheckEnvProfile(检查环境变量)

+

检查节点环境变量($GAUSSHOME、$LD_LIBRARY_PATH、$PATH),检查CMS/CMA/GTM/数据库节点进程的环境变量。如果环境变量存在并配置正确,进程的环境变量存在则检查项通过,否则检查项不通过。

+

+

CheckGaussVer(检查gaussdb版本)

+

检查各个节点gaussdb版本是否一致,如果版本一致则检查项通过,否则检查项不通过。

+

+

CheckPortRange(检查端口范围)

+

若ip_local_port_range的范围在阈值范围内(默认是26000 65535),并且实例端口不在ip_local_port_range范围内则检查项通过,否则检查项不通过。

+

+

CheckReadonlyMode(检查只读模式)

+

检查openGauss数据库主节点default_transaction_read_only值若为off则检查通过,否则不通过。

+

+

CheckCatchup(检查Catchup)

+

检查gaussdb进程堆栈是否能搜索到CatchupMain函数,若搜索不到则检查项通过,否则检查项不通过。

+

+

CheckProcessStatus(检查openGauss进程属主)

+

检查 'cm_agent', 'cm_server', 'gs_gtm', 'gaussdb'进程属主,若不存在omm以外的属主则检查项通过,否则检查项不通过。

+

+

CheckSpecialFile(特殊文件检查)

+

检查tmp目录(PGHOST)、OM目录(GPHOME)、日志目录(GAUSSLOG)、data目录、程序目录(GAUSSHOME)下文件是否存在特殊字符以及非omm用户的文件,若不存在则检查项通过,否则检查项不通过。

+

+

CheckCollector(检查openGauss的信息收集)

+

在output目录下查看信息收集是否成功,若收集成功则检查项通过,否则检查项不通过。

+

+

CheckLargeFile(检查数据目录大文件)

+

检查各个数据库节点目录是否存在超过4G的文件。任一数据库节点目录及其子目录有超过4G的单个文件,则检查不通过,否则检查通过。

+

+

CheckProStartTime(关键进程启动时间检测)

+

检查关键进程启动时间是否间隔超过5分钟,超过则检查不通过,否则检查通过。

+

+

CheckDilateSysTab(检查系统表膨胀)

+

检查系统表是否膨胀,若膨胀则不通过,否则检查通过。

+

+

CheckMpprcFile(检测环境变量分离文件改动)

+

检查是否存在对环境变量分离文件的改动,若存在则检查不通过,否则检查通过。

+

+

database

+

CheckLockNum(检查锁数量)

+

检查数据库锁数量,查询成功检查项通过。

+

+

CheckArchiveParameter(检查归档参数)

+

检查数据库归档参数,如果未打开或打开且在数据库节点下则检查项通过, 打开且不在数据库主节点目录下则检查项不通过。

+

+

CheckCurConnCount(检查当前连接数)

+

检查数据库连接数,如果连接数小于最大连接数的90%则检查项通过,否则检查项不通过。

+

+

CheckCursorNum(检查当前游标数)

+

检查数据库的游标数,检查成功则检查项通过,否则检查项不通过。

+

+

CheckMaxDatanode(检查comm_max_datanode参数值范围小于数据库节点个数)

+

检查最大数据库节点数,若最大数据库节点数小于xml配置的节点数*数据库节点数(默认值为90*5)报warning,否则检查项通过。

+

+

CheckPgPreparedXacts(检查残留两阶段事务)

+

检查pgxc_prepared_xacts参数,如果不存在二阶段事务则检查项通过,否则检查项不通过。

+

+

CheckPgxcgroup(检查pgxc_group表中需要重分布的个数)

+

检查pgxc_group表中需要重分布的个数,检查结果为0则通过, 否则不通过。

+

+

CheckLockState(openGauss是否被锁)

+

检查openGauss是否被锁,若openGauss被锁则不通过,否则检查项通过。

+

+

CheckIdleSession(检查业务停止)

+

检查非空闲会话数,如果数量为0则检查项通过,否则检查项不通过。

+

+

CheckDBConnection(检查数据库连接)

+

检查能否连接数据库,如果连接成功则检查项通过,否则检查项不通过。

+

+

CheckGUCValue(GUC参数检查)

+

检查(max_connections + max_prepared_transactions) * max_locks_per_transaction的值,若该值大于等于1000000则检查项通过,否则检查项不通过。

+

+

CheckCgroupTable(检查gs_cgroup系统表)

+

检查Cgroups系统表,若不存在用户新建的Cgroups则检查项通过,否则报warning。

+

+

CheckPMKData(检查PMK异常数据)

+

检查数据库PMK schema是否包含有异常数据,如果不存在异常数据则检查项通过,否则检查项不通过。

+

+

CheckSysTable(检查系统表)

+

检查系统表,检查成功则检查项通过。

+

+

CheckSysTabSize(检查每个实例的系统表容量)

+

如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。

+

+

CheckTableSpace(检查表空间路径)

+

表空间路径和openGauss路径之间不能存在嵌套且表空间路径相互不能存在嵌套,则检查项通过,否则检查项不通过。

+

+

CheckTableSkew(检查表级别数据倾斜)

+

若存在表在openGauss数据库节点上的数据分布不均衡,且分布数据最多的数据库节点比最低的数据库节点所分布的数据多100000条以上,则检查不通过,否则检查通过。

+

+

CheckDNSkew(检查数据库节点级别数据分布倾斜)

+

检查数据库节点级别的表倾斜数据,若分布数据最高的数据库节点比分布数据最低的数据库节点数据量高于5%,则检查不通过,否则检查通过。

+

+

CheckUnAnalyzeTable(检查未做analyze的表)

+

若存在未做analyze的表,并且表中至少包含一条数据,则检查不通过,否则检查通过。

+

+

CheckCreateView(创建视图检查)

+

创建视图时,如果查询语句中含有子查询,并且子查询结果查询解析和重写之后存在别名重复,检查不通过,否则检查通过。

+

+

CheckHashIndex(hash index语法检查)

+

如果存在hash index则检查不通过,否则检查通过。

+

+
      

CheckNextvalInDefault(检查Default表达式中包含nextval(sequence))

+

检查Default表达式中是否包含nextval(sequence),若包含则不通过,否则通过。

+

+

CheckNodeGroupName(Node group编码格式检查)

+

存在非SQL_ASCII字符的Node Group名称则检查不通过,不存在则检查通过 。

+

+

CheckPgxcRedistb(检查重分布残留的临时表 )

+

检查数据库中是否存在重分布残留的临时表,若不存在则检查通过,否则检查不通过 。

+

+

CheckReturnType(用户自定义函数返回值类型检查)

+

检查用户自定义函数是否包含非法返回类型,若包含则检查不通过,否则检查通过。

+

+

CheckSysadminUser(检查sysadmin用户)

+

检查除openGauss属主外是否存在数据库管理员用户,若存在则不通过,否则检查通过。

+

+

CheckTDDate(TD数据库中orc表date类型列检查)

+

检查TD模式数据库下的orc表中是否包含date类型的列,若包含检查不通过,否则检查通过。

+

+

CheckDropColumn(drop column检查)

+

如果存在drop column的表,则检查不通过,否则检查通过。

+

+

CheckDiskFailure(检查磁盘故障)

+

openGauss中的所有数据做全量查询,若存在查询错误则检查不通过,否则检查通过。

+

+

network

+

+

CheckPing(检查网络通畅)

+

检查openGauss内所有节点的互通性,如果各节点所有IP均可ping通则检查项通过,否则检查项不通过。

+

+

CheckRXTX(检查网卡RXTX值)

+

检查节点backIP的RX/TX值,如果该值为4096则检查项通过,否则检查项不通过。

+

+

CheckMTU(检查网卡MTU值)

+

检查节点backIP对应的网卡MTU值( bond后的物理网卡要确保一致),如果该值不是8192或1500报warning若openGaussMTU值一致则检查项通过,否则检查项不通过。

+

+

CheckNetWorkDrop(检查网络掉包率)

+

检查各IP1分钟内网络掉包率,如果不超过1%则检查项通过,否则检查项不通过。

+

+

CheckBond(检查网卡绑定模式)

+

检查是否有配置BONDING_OPTS或BONDING_MODULE_OPTS,若没有配置则报warning。检查各节点bond模式是否一致,如果同时满足则检查项通过,否则检查项不通过。

+

+

CheckMultiQueue(检查网卡多队列)

+

检查cat /proc/interrupts,判断是否开启网卡多队列且绑定不同CPU,如果满足则检查项通过,否则检查项不通过。

+

+

CheckUsedPort(检查随机端口使用数量)

+

检查net.ipv4.ip_local_port_range,范围大于等于OS默认值通过(32768-61000);

+

检查TCP协议随机端口数,小于总随机端口数的80%通过;

+

检查SCTP协议随机端口数,小于总随机端口数的80%通过。

+

+

CheckNICModel(网卡型号和驱动版本一致性检查)

+

检查各个节点的网卡型号以及驱动版本是否一致,一致则通过,否则报warning。

+

+

CheckRouting(本地路由表检查)

+

检查各节点在业务IP网段的IP个数,超过1个则报warning,否则检查通过。

+

+

CheckNetSpeed(检查网卡接收带宽,ping值,丢包率)

+

网络满载时,检查网卡平均接收带宽大于600MB通过;

+

网络满载时,检查网络ping值,小于1秒通过;

+

网络满载时,检查网卡丢包率,小于1%通过。

+

+

other

+

CheckDataDiskUsage(检查数据库节点磁盘空间使用率)

+

检查磁盘数据库节点目录使用率,如果使用率低于90%则检查项通过,否则检查项不通过。

+

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>CheckNetSpeed检查项: +>- CheckNetSpeed不支持-L本地检查模式,-L模式无法构造网络压力,检查的结果不准确。 +>- 在节点数小于6时,speed\_test构造的网络压力可能无法跑满带宽,可能会造成检查结果不准确。 + +## **用户自定义场景** + +1. 以操作系统用户omm登录数据库主节点。 +2. 在script/gspylib/inspection/config路径下新建场景配置文件scene\_XXX.xml。 +3. 将检查项写进场景配置文件中,书写格式为: + + ``` + + + + + + + + + ``` + + item name为检查项名称 + + 注:用户需自行保证自定义xml的正确性 + +4. 在home/package/script/gspylib/inspection/config执行如下命令,将此文件分发至执行检查的各个节点 + + ``` + scp scene_upgrade.xml SIA1000068994:home/package/script/gspylib/inspection/config/ + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >home/package/script/gspylib/inspection/config就是新建的场景配置文件的绝对路径。 + +5. 非扩容新节点切换至omm用户,执行以下命令查看检查结果。 + + ``` + gs_check -e XXX + ``` + + +## **用户自定义检查项** + +1. 新增巡检项配置,修改script/gspylib/inspection/config/items.xml文件,格式如下: + + ``` + + + <zh>检查CPU占用率</zh> + <en>Check CPU Idle and I/O wait</en> + + + StandardCPUIdle=30; + StandardWIO=30 + + + 如果idle不足 CPU负载过高,请扩容节点,如果iowait过高,则磁盘为瓶颈,扩容磁盘 + + + 检查主机CPU占用率,如果idle大于30%并且iowait小于30%,则检查项通过,否则检查项不通过 + + os + user + all + default + + ``` + + - id:巡检项id。 + - name:巡检项脚本名, 和巡检项脚本文件名相同。 + - title: 巡检项描述名称 (支持多语言)。 + + :中文版检查内容。 + + :英文版检查内容。 + + - standard:巡检项标准说明(支持多语言)。 + - suggestion: 巡检项修复建议说明(支持多语言)。 + - threshold:巡检项阈值定义,多值之间使用分号隔开,示例Key1=Value1;Key2=Value2。 + - category: 巡检项分类,可选参数:os,device,network,cluster,database,other。 + - permission: 巡检项需要的执行权限,可选参数:root,user默认为user\(普通用户\)。 + - scope:巡检项执行的节点范围,可选参数:cn-仅在数据库主节点执行,local-仅在当前节点执行,all-在openGauss所有节点执行,默认为all。 + - analysis:巡检项执行结果分析方式,default-检查每个节点的结果,所有节点检查项通过,则最终检查通过,consistent-openGauss内所有节点一致性检查,单节点仅返回结果,各个节点结果一致则判定检查通过,custom-自定义结果分析方式,默认为default。 + + 注:用户需保证自定义xml的正确性 + +2. 新建检查脚本,脚本名称格式遵循CheckXXXX.py,必须以Check开头,脚本放置在script/gspylib/inspection/items目录下,该目录下脚本安装巡检项分类组织,每个分类一个单独的文件夹,巡检项脚本放置在对应的分类文件夹中。格式如下: + + ``` + class CheckCPU(BaseItem): + def __init__(self): + super(CheckCPU, self).__init__(self.__class__.__name__) + self.idle = None + self.wio = None + self.standard = None + + def preCheck(self): + # check the threshold was set correctly + if (not self.threshold.has_key('StandardCPUIdle') + or not self.threshold.has_key('StandardWIO')): + raise Exception("threshold can not be empty") + self.idle = self.threshold['StandardCPUIdle'] + self.wio = self.threshold['StandardWIO'] + + # format the standard by threshold + self.standard = self.standard.format(idle=self.idle, iowait=self.wio) + + def doCheck(self): + cmd = "sar 1 5 2>&1" + output = SharedFuncs.runShellCmd(cmd) + self.result.raw = output + # check the result with threshold + d = next(n.split() for n in output.splitlines() if "Average" in n) + iowait = d[-3] + idle = d[-1] + rst = ResultStatus.OK + vals = [] + if (iowait > self.wio): + rst = ResultStatus.NG + vals.append("The %s actual value %s is greater than expected value %s" % ("IOWait", iowait, self.wio)) + if (idle < self.idle): + rst = ResultStatus.NG + vals.append("The %s actual value %s is less than expected value %s" % ("Idle", idle, self.idle)) + self.result.rst = rst + if (vals): + self.result.val = "\n".join(vals) + ``` + + 所有脚本基于BaseItem基类开发,基类定义的通用的检查流程,通用的检查结果分析方法,默认的结果输出格式。可扩展方法: + + - doCheck: 该方法包含该检查项具体的检查方法,检查结果格式如下: + + result.rst --- 检查结果状态,可选参数: + + - OK – 检查项完成,结果通过。 + - NA – 当前节点不涉及该检查项。 + - NG – 检查项完成,结果不通过。 + - WARNING – 检查项完成,结果警告。 + - ERROR – 检查项发生内部错误,未完成检查。 + + - preCheck: 检查前条件判定,内置两种实现:cnPreCheck – 用于检查当前执行节点是否包含数据库主节点实例,localPreCheck – 用于检查当前执行节点是否指定节点。可通过巡检项配置文件中的scope参数进行配置。 可重载该方法实现自定义的前置检查 + - postAnalysis:检查结果分析方法,内置两种实现:default,consistent。可通过巡检项配置文件中的analysis参数进行配置。可重载该方法实现自定义的结果分析。 + + 注:用户自定义的检查项名称不得与已有检查项名称相同,同时用户需保证自定义检查项脚本的规范性。 + +3. 将此脚本分发至所有的执行节点。 +4. 以root用户登录扩容后的新节点,或以omm用户登录扩容前的老节点,执行以下命令,查看结果。 + + 本地执行: + + ``` + gs_check -i CheckXXX -L + ``` + + 非本地执行: + + ``` + gs_check -i CheckXXX + ``` + + +## 操作系统参数 + +**表 2** 操作系统参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数说明

+

推荐取值

+

net.ipv4.tcp_max_tw_buckets

+

表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。如果超过所配置的取值,TIME_WAIT将立刻被释放并打印警告信息。

+

10000

+

net.ipv4.tcp_tw_reuse

+

允许将TIME-WAIT状态的sockets重新用于新的TCP连接。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_tw_recycle

+

表示开启TCP连接中TIME-WAIT状态sockets的快速回收。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_keepalive_time

+

表示当keepalive启用的时候,TCP发送keepalive消息的频度。

+

30

+

net.ipv4.tcp_keepalive_probes

+

在认定连接失效之前,发送TCP的keepalive探测包数量。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应。

+

9

+

net.ipv4.tcp_keepalive_intvl

+

当探测没有确认时,重新发送探测的频度。

+

30

+

net.ipv4.tcp_retries1

+

在连接建立过程中TCP协议最大重试次数。

+

5

+

net.ipv4.tcp_syn_retries

+

TCP协议SYN报文最大重试次数。

+

5

+

net.ipv4.tcp_synack_retries

+

TCP协议SYN应答报文最大重试次数。

+

5

+

net.sctp.path_max_retrans

+

SCTP协议最大重试次数。

+

10

+

net.sctp.max_init_retransmits

+

SCTP协议INIT报文最大重试次数。

+

10

+

net.sctp.association_max_retrans

+

SCTP协议单个逻辑连接最大重试次数。

+

10

+

net.sctp.hb_interval

+

SCTP协议心跳检测包重传间隔。

+

30000

+

net.ipv4.tcp_retries2

+

控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接。

+

发生“connection reset by peer”时可以尝试调大该值规避问题。

+

12

+

vm.overcommit_memory

+

控制在做内存分配的时候,内核的检查方式。

+
  • 0:表示系统会尽量精确计算当前可用的内存。
  • 1:表示不作检查直接返回成功。
  • 2:内存总量×vm.overcommit_ratio/100+SWAP的总量,如果申请空间超过此数值则返回失败。
+

内核默认是2过于保守,推荐设置为0,如果系统压力大可以设置为1。

+

0

+

net.sctp.sndbuf_policy

+

SCTP发送缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.rcvbuf_policy

+

SCTP接收缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.sctp_mem

+

内核SCTP协议栈的最大可用内存,分无压力,有压力,和压力大三个区间,压力大时会丢包,单位为页面。

+

94500000 915000000 927000000

+

net.sctp.sctp_rmem

+

内核SCTP协议栈的接收总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.sctp.sctp_wmem

+

内核SCTP协议栈的发送总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_rmem

+

TCP协议接收端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_wmem

+

TCP协议发送端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.core.wmem_max

+

socket发送端缓冲区大小的最大值。

+

21299200

+

net.core.rmem_max

+

socket接收端缓冲区大小的最大值。

+

21299200

+

net.core.wmem_default

+

socket发送端缓冲区大小的默认值。

+

21299200

+

net.core.rmem_default

+

socket接收端缓冲区大小的默认值。

+

21299200

+

net.ipv4.ip_local_port_range

+

物理机可用临时端口范围。

+

26000-65535

+

kernel.sem

+

内核信号量参数设置大小。

+

250 6400000 1000 25600

+

vm.min_free_kbytes

+

保证物理内存有足够空闲空间,防止突发性换页。

+

系统总内存的5%

+

net.core.somaxconn

+

定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。

+

65535

+

net.ipv4.tcp_syncookies

+

当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

+
  • 0表示关闭SYN Cookies。
  • 1表示开启SYN Cookies。
+

1

+

net.sctp.addip_enable

+

SCTP动态地址重置支持开关

+
  • 0表示关闭。
  • 1表示开启。
+

0

+

net.core.netdev_max_backlog

+

在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

+

65535

+

net.ipv4.tcp_max_syn_backlog

+

记录的那些尚未收到客户端确认信息的连接请求的最大值。

+

65535

+

net.ipv4.tcp_fin_timeout

+

系统默认的超时时间。

+

60

+

kernel.shmall

+

内核可用的共享内存总量。

+

1152921504606846720

+

kernel.shmmax

+

内核参数定义单个共享内存段的最大值。

+

18446744073709551615

+

net.ipv4.tcp_sack

+

启用有选择的应答,通过有选择地应答乱序接受到的报文来提高性能,让发送者只发送丢失的报文段(对于广域网来说)这个选项应该启用,但是会增加对CPU的占用。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

net.ipv4.tcp_timestamps

+

TCP时间戳(会在TCP包头增加12节),以一种比重发超时更精确的方式(参考RFC 1323)来启用对RTT的计算,启用可以实现更好的性能。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

vm.extfrag_threshold

+

系统内存不够用时,linux会为当前系统内存碎片情况打分,如果超过vm.extfrag_threshold的值,kswapd就会触发memory compaction。所以这个值设置的接近1000,说明系统在内存碎片的处理倾向于把旧的页换出,以符合申请的需要,而设置接近0,表示系统在内存碎片的处理倾向做memory compaction。

+

500

+

vm.overcommit_ratio

+

系统使用绝不过量使用内存的算法时,系统整个内存地址空间不得超过swap+RAM值的此参数百分比,当vm.overcommit_memory=2时此参数生效。

+

90

+

/sys/module/sctp/parameters/no_checksums

+

SCTP协议是否关闭checksum。

+

0

+

MTU

+

节点网卡最大传输单元。OS默认值为1500,调整为8192可以提升SCTP协议数据收发的性能。

+

8192

+
+ +## 文件系统参数 + +- soft nofile + + 说明:soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。 + + 推荐取值:1000000 + +- hard nofile + + 说明:hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。 + + 推荐取值:1000000 + +- stack size + + 说明:线程堆栈大小。 + + 推荐值:3072 + + +## 示例 + +执行单项检查结果: + +``` +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 + +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 +Skip CheckHdfsForeignTabEncoding because it only applies to V1R5 upgrade V1R6 with cluster. +Parsing the check items config file successfully +The below items require root privileges to execute:[CheckBlockdev CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckNoCheckSum CheckSctpService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] +Please enter root privileges user[root]: +Please enter password for user[root]: +Check root password connection successfully +Distribute the context file to remote hosts successfully +Start to health check for the cluster. Total Items:64 Nodes:3 +Checking... [=========================] 64/64 +Start to analysis the check result +CheckClusterState...........................OK +The item run on 3 nodes. success: 3 +CheckDBParams...............................OK +......................................................................... +CheckMpprcFile..............................OK +The item run on 3 nodes. success: 3 + +Analysis the check result successfully +Failed. All check items run completed. Total:64 Success:56 Warning:5 NG:3 Error:0 +For more information please refer to /opt/huawei/wisequery/script/gspylib/inspection/output/CheckReport_inspect_201902207129254785.tar.gz +``` + +## 相关命令 + +[gs\_checkos](gs_checkos.md),[gs\_checkperf](gs_checkperf.md) + diff --git a/content/zh/docs/Toolreference/gs_checkos.md b/content/zh/docs/Toolreference/gs_checkos.md new file mode 100644 index 000000000..3bd4bd1d7 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_checkos.md @@ -0,0 +1,648 @@ +# gs\_checkos + +## 背景信息 + +gs\_checkos工具来帮助检查操作系统、控制参数、磁盘配置等内容,并对系统控制参数、I/O配置、网络配置和THP服务等信息进行配置。 + +## 前提条件 + +- 当前的硬件和网络环境正常。 +- 各主机间root互信状态正常。 +- 只能使用root用户执行gs\_checkos命令。 + +## 语法 + +- 检查操作系统信息 + + ``` + gs_checkos -i ITEM [-f HOSTFILE] [-h HOSTNAME] [-X XMLFILE] [--detail] [-o OUTPUT] [-l LOGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_checkos -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_checkos -V | --version + ``` + + +## 参数说明 + +- -i + + 列表编号。格式:-i A、-i B1、-i A1 -i A2或-i A1,A2。 + + 取值范围:A1...A14、B1...B6 + + >![](public_sys-resources/icon-note.gif) **说明:** + >A1...A14 表示只检查操作系统参数,并不设置。 + >B1...B6 表示将参数系统参数设置为期望值。 + >A和B不能同时输入。 + + 详细的检查项请参见[表1](#zh-cn_topic_0237152331_zh-cn_topic_0059778883_t5348bfc47f50450687012eacb1a1ba4e)。 + +- -f + + 主机名称列表文件。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >-f和-h参数不能同时使用。 + + 取值范围:主机名称的列表。 + +- -h + + 指定需要检查的主机名称,可以同时指定多个主机,主机之间使用“,”分割。 + + 取值范围:openGauss的主机名称。如果不指定主机,则检查当前主机。 + +- -X + + openGaussXML配置文件。 + +- --detail + + 显示检查结果详情。 + +- -o + + 指定OS检查报告输出到指定的文件。 + + 不指定则将检查结果输出到屏幕上。 + +- -l + + 指定日志文件及存放路径。 + + 默认值:/tmp/gs\_checkos/gs\_checkos-YYYY-MM-DD\_hhmmss.log。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +**表 1** 操作系统检查项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

编号

+

检查项

+

检查项详细说明

+

A1

+

操作系统版本(OS version status)

+

操作系统版本检查:保证主机平台是支持的SUSE11、SUSE12、RHEL和CentOS平台中的一种。同时保证openGauss各个主机的平台是属于同一混编范围的。

+

A2

+

内核版本(Kernel version status)

+

内核版本检查。

+

A3

+

Unicode状态(Unicode status)

+

字符集设置检查:保证openGauss各个主机的字符集一致。

+

A4

+

时区状态(Time zone status)

+

时区时间设置检查:保证openGauss各个主机的时区状态一致。

+

A5

+

交换内存状态(Swap memory status)

+

Swap分区检查:各个主机的swap分区大小必须小于等于各主机内存总大小。

+

A6

+

系统控制参数(System control parameters status)

+

内核参数检查:保证当前内核中的参数值和默认的期望值保持一致。

+

详细的内核参数请参见操作系统参数

+

A7

+

文件系统配置状态(File system configuration status)

+

系统文件句柄检查:系统文件句柄的参数值必须大于等于100万。

+

线程堆栈大小检查:线程堆栈大小大于等于3072KB

+

进程最大可用虚拟内存:系统进程最大可用虚拟内存为unlimited。

+

A8

+

磁盘配置状态(Disk configuration status)

+

硬盘挂载参数检查:格式为xfs的硬盘,其挂载格式必须为:"rw,noatime,inode64,allocsize=16m"。

+

A9

+

预读块大小状态(Pre-read block size status)

+

预读参数检查:预读参数期望值为16384。

+

A10

+

IO调度状态(IO scheduler status)

+

IO调度策略检查:IO调度策略的方式为deadline。

+

A11

+

网卡配置状态(Network card configuration status)

+

万兆以下网卡参数检查:

+
  • 确保网卡mtu=1500。
+

万兆及以上网卡参数检查:

+
  • 当网卡为非绑定模式,同时网卡类型为万兆时,确保mtu=1500,rx/tx >=4096。
  • 当网卡为绑定模式时,需保证绑定的每个网卡类型均为万兆,然后再确保mtu=1500,rx/tx>=4096。
  • openGauss周边设备(例如交换机等)的网卡也要设置成与openGauss部署的主机一致的值。
+

A12

+

时间一致性(Time consistency status)

+

时间一致性检查:确认ntp服务启动,openGauss各个主机的系统时间误差不超过60s。

+

A13

+

防火墙状态(Firewall service status)

+

防火墙检查: 确认防火墙的状态为关闭状态。

+

A14

+

THP服务(THP service status)

+

THP服务检查:确认THP服务状态为关闭状态。

+

B1

+

设置系统控制参数(Set system control parameters)

+

内核参数设置:当实际值不满足检查条件期望时,对结果为Abnormal项参数进行修改设置;对Warning项不进行设置,由用户根据实际环境设置。

+

B2

+

设置文件系统配置值(Set file system configuration value)

+

系统文件句柄设置:当系统文件句柄的参数值小于100万时,对其进行修改设置。

+

线程堆栈大小设置:线程堆栈大小小于3072KB时,对其进行设置。

+

进程最大可用虚拟内存设置:系统进程最大可用虚拟内存不为unlimited时对其进行修改设置。

+

B3

+

设置预读块大小值(Set pre-read block size value)

+

硬盘预读参数设置:当系统的实际值小于16384时,对其进行修改设置。

+

B4

+

设置IO调度值(Set IO scheduler value)

+

IO配置项的设置:当系统的实际值不为deadline时,对其进行修改设置。

+

B5

+

设置网卡配置值(Set network card configuration value)

+

万兆网卡参数设置:对不满足万兆网卡的RX、TX参数进行设置,不对MTU参数进行设置。

+

B6

+

设置THP服务(Set THP service)

+

THP服务设置:如果THP服务启动,将该服务关闭。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- A6选项检查标准来自配置文件check\_list.conf下\[/etc/sysctl.conf\]、\[SUGGEST:/etc/sysctl.conf\]域: +> 若\[/etc/sysctl.conf\]下参数值与系统实际参数值不同,A6检查提示Abnormal,可以使用B1参数进行设置。 +> 若\[SUGGEST:/etc/sysctl.conf\]下参数值与系统实际参数值不同,A6检查提示Warning,B1参数不会进行设置,需根据实际情况进行手动设置。 +>- A7选项检查系统文件句柄标准来自配置文件check\_list.conf下\[/etc/security/limits.conf\]域open file参数,可以使用B2参数进行设置。 +>- A11选项检查万兆网卡参数"MTU"、"RX"、"TX"标准来自配置文件check\_list.conf下\[/sbin/ifconfig\]域,可以使用B5参数对RX、TX进行设置,MTU需用户手动设置。 +>- 使用gs\_checkos设置的内核参数值和文件句柄参数值,需重启新会话生效。 + +## 操作系统参数 + +**表 2** 操作系统参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数说明

+

推荐取值

+

net.ipv4.tcp_max_tw_buckets

+

表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。如果超过所配置的取值,TIME_WAIT将立刻被释放并打印警告信息。

+

10000

+

net.ipv4.tcp_tw_reuse

+

允许将TIME-WAIT状态的sockets重新用于新的TCP连接。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_tw_recycle

+

表示开启TCP连接中TIME-WAIT状态sockets的快速回收。

+
  • 0表示关闭。
  • 1表示开启。
+

1

+

net.ipv4.tcp_keepalive_time

+

表示当keepalive启用的时候,TCP发送keepalive消息的频度。

+

30

+

net.ipv4.tcp_keepalive_probes

+

在认定连接失效之前,发送TCP的keepalive探测包数量。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应。

+

9

+

net.ipv4.tcp_keepalive_intvl

+

当探测没有确认时,重新发送探测的频度。

+

30

+

net.ipv4.tcp_retries1

+

在连接建立过程中TCP协议最大重试次数。

+

5

+

net.ipv4.tcp_syn_retries

+

TCP协议SYN报文最大重试次数。

+

5

+

net.ipv4.tcp_synack_retries

+

TCP协议SYN应答报文最大重试次数。

+

5

+

net.sctp.path_max_retrans

+

SCTP协议最大重试次数。

+

10

+

net.sctp.max_init_retransmits

+

SCTP协议INIT报文最大重试次数。

+

10

+

net.sctp.association_max_retrans

+

SCTP协议单个逻辑连接最大重试次数。

+

10

+

net.sctp.hb_interval

+

SCTP协议心跳检测包重传间隔。

+

30000

+

net.ipv4.tcp_retries2

+

控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接。

+

发生“connection reset by peer”时可以尝试调大该值规避问题。

+

12

+

vm.overcommit_memory

+

控制在做内存分配的时候,内核的检查方式。

+
  • 0:表示系统会尽量精确计算当前可用的内存。
  • 1:表示不作检查直接返回成功。
  • 2:内存总量×vm.overcommit_ratio/100+SWAP的总量,如果申请空间超过此数值则返回失败。
+

内核默认是2过于保守,推荐设置为0,如果系统压力大可以设置为1。

+

0

+

net.sctp.sndbuf_policy

+

SCTP发送缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.rcvbuf_policy

+

SCTP接收缓冲区分配原则。

+
  • 0为按连接。
  • 1为按耦联。
+

0

+

net.sctp.sctp_mem

+

内核SCTP协议栈的最大可用内存,分无压力,有压力,和压力大三个区间,压力大时会丢包,单位为页面。

+

94500000 915000000 927000000

+

net.sctp.sctp_rmem

+

内核SCTP协议栈的接收总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.sctp.sctp_wmem

+

内核SCTP协议栈的发送总可用内存,分无压力,有压力和压力大三个区间,压力大时会丢包,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_rmem

+

TCP协议接收端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.ipv4.tcp_wmem

+

TCP协议发送端缓冲区的可用内存大小。分无压力,有压力,和压力大三个区间,单位为页面。

+

8192 250000 16777216

+

net.core.wmem_max

+

socket发送端缓冲区大小的最大值。

+

21299200

+

net.core.rmem_max

+

socket接收端缓冲区大小的最大值。

+

21299200

+

net.core.wmem_default

+

socket发送端缓冲区大小的默认值。

+

21299200

+

net.core.rmem_default

+

socket接收端缓冲区大小的默认值。

+

21299200

+

net.ipv4.ip_local_port_range

+

物理机可用临时端口范围。

+

26000-65535

+

kernel.sem

+

内核信号量参数设置大小。

+

250 6400000 1000 25600

+

vm.min_free_kbytes

+

保证物理内存有足够空闲空间,防止突发性换页。

+

系统总内存的5%

+

net.core.somaxconn

+

定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。

+

65535

+

net.ipv4.tcp_syncookies

+

当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

+
  • 0表示关闭SYN Cookies。
  • 1表示开启SYN Cookies。
+

1

+

net.sctp.addip_enable

+

SCTP动态地址重置支持开关

+
  • 0表示关闭。
  • 1表示开启。
+

0

+

net.core.netdev_max_backlog

+

在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

+

65535

+

net.ipv4.tcp_max_syn_backlog

+

记录的那些尚未收到客户端确认信息的连接请求的最大值。

+

65535

+

net.ipv4.tcp_fin_timeout

+

系统默认的超时时间。

+

60

+

kernel.shmall

+

内核可用的共享内存总量。

+

1152921504606846720

+

kernel.shmmax

+

内核参数定义单个共享内存段的最大值。

+

18446744073709551615

+

net.ipv4.tcp_sack

+

启用有选择的应答,通过有选择地应答乱序接受到的报文来提高性能,让发送者只发送丢失的报文段(对于广域网来说)这个选项应该启用,但是会增加对CPU的占用。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

net.ipv4.tcp_timestamps

+

TCP时间戳(会在TCP包头增加12节),以一种比重发超时更精确的方式(参考RFC 1323)来启用对RTT的计算,启用可以实现更好的性能。

+
  • 0表示关闭。
  • 1表示开启
+

1

+

vm.extfrag_threshold

+

系统内存不够用时,linux会为当前系统内存碎片情况打分,如果超过vm.extfrag_threshold的值,kswapd就会触发memory compaction。所以这个值设置的接近1000,说明系统在内存碎片的处理倾向于把旧的页换出,以符合申请的需要,而设置接近0,表示系统在内存碎片的处理倾向做memory compaction。

+

500

+

vm.overcommit_ratio

+

系统使用绝不过量使用内存的算法时,系统整个内存地址空间不得超过swap+RAM值的此参数百分比,当vm.overcommit_memory=2时此参数生效。

+

90

+

/sys/module/sctp/parameters/no_checksums

+

SCTP协议是否关闭checksum。

+

0

+

MTU

+

节点网卡最大传输单元。OS默认值为1500,调整为8192可以提升SCTP协议数据收发的性能。

+

8192

+
+ +## 文件系统参数 + +- soft nofile + + 说明:soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。 + + 推荐取值:1000000 + +- hard nofile + + 说明:hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。 + + 推荐取值:1000000 + +- stack size + + 说明:线程堆栈大小。 + + 推荐值:3072 + + +## 示例 + +使用如下命令检查操作系统参数。 + +``` +gs_checkos -i A -h plat1 -X /opt/software/openGauss/clusterconfig.xml --detail -o /var/log/checkos +Performing operation system check/set. Output the result to the file /var/log/checkos. +Operation system check/set is completed. +Total numbers:14. Abnormal numbers:0. Warning number:1. + +``` + +查看操作系统参数检查结果。 + +``` +vim /var/log/checkos +Checking items: + A1. [ OS version status ] : Normal + A2. [ openGauss 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 +``` + +## 相关命令 + +[gs\_check](gs_check.md),[gs\_checkperf](gs_checkperf.md) + diff --git a/content/zh/docs/Toolreference/gs_checkperf.md b/content/zh/docs/Toolreference/gs_checkperf.md new file mode 100644 index 000000000..a404255a5 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_checkperf.md @@ -0,0 +1,364 @@ +# gs\_checkperf + +## 背景信息 + +openGauss提供了gs\_checkperf工具来帮助对openGauss级别(主机CPU占用率、Gauss CPU占用率、I/O使用情况等)、节点级别(CPU使用情况、内存使用情况、I/O使用情况)、会话/进程级别(CPU使用情况、内存使用情况、I/O使用情况)、SSD性能(写入、读取性能)进行定期检查,让用户了解openGauss的负载情况,采取对应的改进措施。 + +## 前提条件 + +- openGauss运行状态正常且不为只读模式。 +- 运行在数据库之上的业务运行正常。 + +## **注意事项** + +- gs\_checkperf工具的监控信息依赖于pmk模式下的表的数据。如果pmk模式下的表未执行analyze操作,则可能导致gs\_checkperf工具执行失败。其报错示例信息如下: + + ``` + LOG: Statistics in some tables or columns(pmk.pmk_snapshot.snapshot_id) are not collected. + HINT: Do analyze for them in order to generate optimized plan. + ``` + + 此时需要登录任一数据库主节点,连接postgres数据库执行如下SQL: + + ``` + analyze pmk.pmk_configuration; + analyze pmk.pmk_meta_data; + analyze pmk.pmk_snapshot; + analyze pmk.pmk_snapshot_dbnode_stat; + analyze pmk.pmk_snapshot_datanode_stat; + ``` + + +## 语法 + +- 检查SSD性能(root用户) + + ``` + gs_checkperf -U USER [-o OUTPUT] -i SSD [-l LOGFILE] + ``` + +- 检查openGauss性能(openGauss安装用户) + + ``` + gs_checkperf [-U USER] [-o OUTPUT] [-i PMK] [--detail] [-l LOGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_checkperf -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_checkperf -V | --version + ``` + + +## 参数说明 + +- -U + + 运行openGauss的用户名称。 + + 取值范围:运行openGauss的用户名称。 + + 以root用户身份执行此命令必须指定该参数。 + +- -o + + 指定性能检查报告输出到指定的文件。 + + 取值范围:指定的文件名称。 + + 不指定则将检查结果输出到屏幕上。 + +- -i + + 指定检查项编号,-i参数值不区分大小写。格式:-i PMK、-i SSD。 + + 取值范围:PMK、SSD + + 只有openGauss用户才能检查PMK选项。 + + 只有root用户才能检查SSD选项。 + + 如果不指定该参数,以openGauss用户身份默认检查PMK,以root用户身份默认检查SSD。 + +- --detail + + 显示PMK检查结果详情。 + +- -l + + 指定日志文件的存储路径。 + + 默认路径为:/var/log/gaussdb/omm/om/gs\_checkperf-YYYY-MM-DD\_hhmmss.log + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +**表 1** 性能检查项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

分类

+

性能参数项

+

描述

+

openGauss级别

+

主机CPU占用率

+

主机CPU占用率。

+

Gauss CPU占用率

+

Gauss CPU占用率。

+

共享内存击中率

+

共享内存的击中率。

+

内存中排序比率

+

内存中完成的排序所占比率。

+

I/O使用情况

+

文件读写次数和时间。

+

磁盘使用情况

+

文件写次数和平均写时间、最大写时间等。

+

事务统计

+

当前SQL执行数和Session数。

+

节点级别

+

CPU使用情况

+

主机使用CPU情况,包括cpu busy time,cpu idle time等。

+

内存使用情况

+

主机使用内存情况,包括物理内存总量,已使用量等。

+

I/O使用情况

+

文件读写次数和时间。

+

会话/进程级别

+

CPU使用情况

+

会话使用CPU情况,包括cpu busy time,cpu idle time等。

+

内存使用情况

+

会话使用内存情况,包括物理内存总量,已使用量等。

+

I/O使用情况

+

会话共享缓冲区命中次数等。

+

SSD性能(只用root用户才能查看)

+

写入性能

+

使用dd命令(flag=direct bs=8M count=2560)向每个SSD写入内容,写入每个SSD时间应在10s左右。

+

读取性能

+

使用dd命令(flag=direct bs=8M count=2560)从每个SSD读取内容,读取每个SSD时间应在7s左右。

+
+ +## 示例 + +示例一:以简要格式在屏幕上显示性能统计结果。 + +``` +gs_checkperf -i pmk -U omm +Cluster statistics information: + Host CPU busy time ratio : 1.43 % + GaussDB 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 +``` + +示例二:以详细格式在屏幕上显示性能统计结果。 + +``` +gs_checkperf -i pmk -U omm --detail +Cluster statistics information: +Host CPU usage rate: + Host total CPU time : 42386.667 Jiffies + Host CPU busy time : 1873.333 Jiffies + Host CPU iowait time : 20.000 Jiffies + Host CPU busy time ratio : 4.42 % + Host CPU iowait time ratio : .05 % +GaussDB CPU usage rate: + GaussDB CPU time % in busy time : 19.04 % + GaussDB CPU time % in total time : .84 % +Shared buffer hit rate: + Shared Buffer Reads : 0 + Shared Buffer Hits : 24129 + Shared Buffer Hit ratio : 100.00 % In-memory sort ratio : 100.00 %I/O usage: + Number of files : 537 + Physical Reads : 0 + Physical Writes : 0 + Read Time : 0 ms + Write Time : 0 ms +Disk usage: + DB size : 70 MB + Total Physical writes : 0 + Average Physical write : 0 + Maximum Physical write : 0 +Activity statistics: + Active SQL count : 2 + Session count : 3 +Node statistics information: +dn_6001_6002: + GaussDB CPU Time : 200 Jiffies + Host CPU Busy Time : 3490 Jiffies + Host CPU Total Time : 42330 Jiffies + GaussDB CPU Time % in Busy Time : 5.73 % + GaussDB CPU Time % in Total Time : .47 % + Physical memory : 8231776256 Bytes + DB Memory usage : 877236224 Bytes + Shared buffer size : 33554432 Bytes + Shared buffer hit ratio : 100.00 % + Sorts in memory : 123 + Sorts in disk : 0 + In-memory sort ratio : 100.00 % + Number of files : 149 + Physical Reads : 0 + Physical Writes : 0 + Read Time : 0 + Write Time : 0 +dn_6003_6004: + GaussDB CPU Time : 170 Jiffies Host CPU Busy Time : 1030 Jiffies + Host CPU Total Time : 42470 Jiffies GaussDB CPU Time % in Busy Time : 16.50 % + GaussDB CPU Time % in Total Time : .40 % + Physical memory : 8231776256 Bytes + DB Memory usage : 881434624 Bytes Shared buffer size : 33554432 Bytes + Shared buffer hit ratio : 100.00 % + Sorts in memory : 119 + Sorts in disk : 0 + In-memory sort ratio : 100.00 % + Number of files : 165 + Physical Reads : 0 + Physical Writes : 0 + Read Time : 0 + Write Time : 0 +dn_6005_6006: + GaussDB CPU Time : 220 Jiffies + Host CPU Busy Time : 1100 Jiffies + Host CPU Total Time : 42360 Jiffies + GaussDB CPU Time % in Busy Time : 20.00 % + GaussDB CPU Time % in Total Time : .52 % + Physical memory : 8231776256 Bytes + DB Memory usage : 881430528 Bytes + Shared buffer size : 33554432 Bytes + Shared buffer hit ratio : 100.00 % + Sorts in memory : 122 + Sorts in disk : 0 + In-memory sort ratio : 100.00 % + Number of files : 115 + Physical Reads : 0 + Physical Writes : 0 + Read Time : 0 + Write Time : 0 +Session statistics information(Top 10): +Session CPU statistics: +1 dn_6003_6004-postgres-dbazt: + Session CPU time : 1211 + Database CPU time : 37670 + Session CPU time % : 3.21 % +2 dn_6005_6006-postgres-dbazt: + Session CPU time : 1204 + Database CPU time : 35730 + Session CPU time % : 3.37 % +3 dn_6001_6002-postgres-dbazt: + Session CPU time : 1064 + Database CPU time : 34120 + Session CPU time % : 3.12 % + +Session Memory statistics: +1 dn_6005_6006-postgres-dbazt: + Buffer Reads : 8989 + Shared Buffer Hit ratio : 96.97 + In Memory sorts : 136 + In Disk sorts : 0 + In Memory sorts ratio : 100.00 + Total Memory Size : 21593048 + Used Memory Size : 18496600 +2 dn_6003_6004-postgres-dbazt: + Buffer Reads : 9030 + Shared Buffer Hit ratio : 96.94 + In Memory sorts : 133 + In Disk sorts : 0 + In Memory sorts ratio : 100.00 + Total Memory Size : 21576664 + Used Memory Size : 18495688 +3 dn_6001_6002-postgres-dbazt: + Buffer Reads : 8668 + Shared Buffer Hit ratio : 96.97 + In Memory sorts : 138 + In Disk sorts : 0 + In Memory sorts ratio : 100.00 + Total Memory Size : 21258856 + Used Memory Size : 18159736 + +Session IO statistics: +1 dn_6003_6004-postgres-dbazt: + Physical Reads : 285 + Read Time : 5320 +2 dn_6005_6006-postgres-dbazt: + Physical Reads : 281 + Read Time : 5811 +3 dn_6001_6002-postgres-dbazt: + Physical Reads : 271 + Read Time : 4662 + +``` + +## 相关命令 + +[gs\_check](gs_check.md),[gs\_checkos](gs_checkos.md) + diff --git a/content/zh/docs/Toolreference/gs_collector.md b/content/zh/docs/Toolreference/gs_collector.md new file mode 100644 index 000000000..77512f265 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_collector.md @@ -0,0 +1,310 @@ +# gs\_collector + +## 背景信息 + +当openGauss发生故障时,使用此工具收集OS信息、日志信息以及配置文件等信息,来定位问题。可以使用-C参数,指定收集不同的信息内容,具体支持收集的内容信息如[表1](#zh-cn_topic_0237152334_table18101312318)所示。 + +**表 1** gs\_collector内容收集对照表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

TypeName

+

Content

+

描述

+

是否默认收集

+

System

+

HardWareInfo

+

RunTimeInfo

+
收集现在操作系统的状态信息:
  • HardWareInfo
  • Cpu(cat /proc/cpuinfo)
  • 内存(cat /proc/meminfo)
  • 磁盘(df -h)
  • RunTimeInfo:
  • topStatus(ps ux)
  • ioStat(iostat -xm 2 3)
  • 网络状态(cat /proc/net/dev)
  • 内存使用情况(free -m)
+
+

+

Database

+

具体列表见表1

+

收集系统视图或者系统表的内容。

+

是,默认收集pg_locks,pg_stat_activity和 pg_thread_wait_status三个视图的信息。

+

Log

+

DBnode

+

Gtm

+

ClusterManager

+
  • 收集DBnode的pg_log和gs_profile
  • 收集Gtm下的pg_log
  • 收集ClusterManager的日志信息包括:
    • cm_agent
    • om
    • cm_ctl
    • gs_clean
    • gs_ctl
    • gs_guc
    • gs_initcm
    • gs_initdb
    • gs_initgtm
    • gtm_ctl
    +
+

+

Config

+

DBnode

+

Gtm

+
  • 收集DBnode的配置信息:
    • postgresql.conf
    • gaussdb.state
    • pg_hba.conf
    • pg_control
    • pg_replslot
    • pg_ident.conf
    +
  • 收集Gtm配置信息:
    • gtm.conf
    • gtm.control
    • gtm.sequence
    +
+

+

Gstack

+

DBnode

+

Gtm

+

利用gstack命令得到DBnode,GTM的当前堆栈信息。

+

+

CoreDump

+

gaussdb

+

gs_gtm

+

gs_rewind

+

cm_server

+

cm_agent

+

gs_ctl

+

通过时间筛选gaussdb进程和gtm进程的core文件。

+
注意:

关于Core的配置和方式请按照如下要求:在/proc/sys/opengauss/core_pattern文件中添加core文件的格式:core-%e-%p-%t。

+
+

+

XLog

+

DBnode

+

通过时间筛选收集xlog。

+

+

Plan

+

*

+
收集计划复现信息:
  • 用户输入*表示收集所有数据库上的计划复现信息。
  • 用户输入具体的数据库名称表示收集指定数据库上的计划复现信息。
+
+

+
+ +## 前提条件 + +日志收集工具依赖操作系统工具,例如gstack为其中一种,如果未安装该工具,则提示错误后,跳过该收集项。 + +## 语法 + +- 日志收集(非root用户) + + ``` + gs_collector --begin-time="BEGINTIME" --end-time="ENDTIME" [-h HOSTNAME | -f HOSTFILE] [--keyword=KEYWORD] [--speed-limit=SPEED] [-o OUTPUT] [-l LOGFILE] [-C CONFIGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_collector -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_collector -V | --version + ``` + + +## 参数说明 + +- -h + + 收集信息的主机名称。 + + 取值范围:主机名称,只能指定一个主机名称。 + + 如果不指定则默认收集所有主机的信息。 + +- -f + + 主机名称列表文件。该文件为纯文本格式。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >-f和-h参数不能同时使用。 + + 取值范围:主机名称列表。 + +- -o + + 将收集日志以压缩包形式输出到指定的文件夹。 + + 不指定则将检查结果以压缩包形式输出到配置文件中tmpMppdbPath选项所指定的目录中。 + + 若配置文件中未配置tmpMppdbPath选项,则默认将检查结果以压缩包形式输出到“/tmp/用户名\_mppdb/”目录中。 + +- -l + + 指定的日志文件以及存放路径。 + +- -C + + 指定待收集内容的配置文件,利用TypeName指定需要收集的信息类型,利用Content指定每一类信息的具体内容,利用Count指定此类信息收集的次数,利用Interval指定收集间隔,单位为秒。 + + TypeName和Content不允许缺失或者内容为空。 + + Interval和Count可以不指定,如果没有指定Count,则默认收集一次。如果没有指定Interval则表示间隔为0秒,Interval和Count的值不能小于0。 + + 如果不指定则使用默认的配置文件。 + + 配置文件格式采用json格式,模板如下: + + ``` + { + "Collect": + [ + {"TypeName": "name", "Content":"value","Interval":"seconds", "Count":"count"} + ] + } + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >默认配置文件内容如下: + >\{ + >"Collect": + >\[ + >\{"TypeName": "System", "Content":"RunTimeInfo, HardWareInfo","Interval":"0", "Count":"1"\}, + >\{"TypeName": "Log", "Content" : "DBnode,Gtm,ClusterManager", "Interval":"0", "Count":"1"\}, + >\{"TypeName": "Database", "Content": "pg\_locks,pg\_stat\_activity,pg\_thread\_wait\_status","Interval":"0", "Count":"1"\}, + >\{"TypeName": "Config", "Content": "DBnode,Gtm", "Interval":"0", "Count":"1"\} + >\] + >\} + >TypeName和对应的Content取值范围见表1gs\_collector内容收集对照表。 + >对于Log,CoreDump,Config,XLog三种类型,Interval和Count参数不生效。 + +- --keyword=KEYWORD + + 包含关键字KEYWORD的日志文件。 + + 若关键字KEYWORD中含有空格,需要使用双引号包围。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >性能日志为二进制日志,关键字搜集功能不支持该日志的搜集。 + +- --begin-time + + 日志的开始时间。输入格式为“yyyymmdd hh:mm”。 + +- --end-time + + 日志的结束时间。输入格式为“yyyymmdd hh:mm”。 + +- --speed-limit + + 日志收集时的收集速率,输入格式为非负整数,单位为MB/s。 + + 该参数主要是为了防止日志收集过程中产生过高的磁盘或网络IO,导致数据库节点故障(如果它们与$GAUSSLOG/$PGHOST部署在同一个磁盘上)。该值应当不超过openGauss内上述磁盘IO与网络IO速率的最小值的1/3。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +## 示例 + +执行如下命令收集OS信息和日志信息。 + +``` +gs_collector --begin-time="20180131 23:00" --end-time="20180201 20:00" -h plat1 +Successfully parsed the configuration file. +Collecting OS information. +Successfully collected OS information. +Collecting catalog statistics. +Successfully collected catalog statistics. +Collecting log files. +Successfully collected log files. +Collecting configuration files and process stack information. +Successfully collected configuration files and processed stack information. +Collecting files. +Successfully collected files. +All results are stored in $PGHOST/collector_20180201_144951.tar.gz. +``` + +查看收集到的统计信息。 + +``` +tar -zxvf $PGHOST/collector_20180201_144951.tar.gz +collector_20180201_144951/ +collector_20180201_144951/plat1.tar.gz +cd collector_20180201_144951 +tar -zxvf plat1.tar.gz +plat1/ +plat1/OS_information.txt +plat1/conffiles/ +plat1/conffiles/dn_6006/ +plat1/conffiles/dn_6006/pg_hba.conf +plat1/conffiles/dn_6006/postgresql.conf +plat1/conffiles/dn_6001/ +plat1/conffiles/dn_6001/pg_hba.conf +plat1/conffiles/dn_6001/postgresql.conf +plat1/conffiles/dn_3003/ +plat1/conffiles/dn_3003/pg_hba.conf +plat1/conffiles/dn_3003/postgresql.conf +plat1/Catalog_statistics.txt +plat1/logfiles/ +plat1/logfiles/log_20180201_144957.tar +cd plat1/logfiles/ +tar -xvf log_20180201_144957.tar +./ +./om/ +./om/gs_local-2018-01-30_165832.log +./om/gs_collector-2018-02-01_144951.log +./bin/ +./bin/gs_clean/ +./bin/gs_clean/gs_clean-2018-01-30_170147-current.log +./pg_log/ +./pg_log/dn_6006/ +./pg_log/dn_6006/postgresql-2018-01-31_000000.log +./pg_log/dn_6006/postgresql-2018-02-01_000000.log +./pg_log/cn_5001/ +./pg_log/cn_5001/postgresql-2018-01-31_000000.log +./pg_log/cn_5001/postgresql-2018-02-01_000000.log +./pg_log/dn_6001/ +./pg_log/dn_6001/postgresql-2018-01-31_000000.log +./pg_log/dn_6001/postgresql-2018-02-01_000000.log +./pg_log/dn_3003/ +./pg_log/dn_3003/postgresql-2018-01-31_000000.log +./pg_log/dn_3003/postgresql-2018-02-01_000000.log +./gs_profile/ +./gs_profile/dn_6001_6002/ +./gs_profile/dn_6001_6002/postgresql-2018-02-01_000000.prf +./gs_profile/postgresql-2018-01-31_000000.prf +./gs_profile/dn_6003_3003/ +./gs_profile/dn_6003_3003/postgresql-2018-02-01_000000.prf +./gs_profile/dn_6005_6006/ +./gs_profile/dn_6005_6006/postgresql-2018-02-01_000000.prf +./gs_profile/postgresql-2018-02-01_000000.prf +``` + diff --git "a/content/zh/docs/Toolreference/gs_collector\345\267\245\345\205\267\346\224\257\346\214\201\346\224\266\351\233\206\347\232\204\347\263\273\347\273\237\350\241\250\345\222\214\350\247\206\345\233\276\345\210\227\350\241\250.md" "b/content/zh/docs/Toolreference/gs_collector\345\267\245\345\205\267\346\224\257\346\214\201\346\224\266\351\233\206\347\232\204\347\263\273\347\273\237\350\241\250\345\222\214\350\247\206\345\233\276\345\210\227\350\241\250.md" new file mode 100644 index 000000000..2863cee4c --- /dev/null +++ "b/content/zh/docs/Toolreference/gs_collector\345\267\245\345\205\267\346\224\257\346\214\201\346\224\266\351\233\206\347\232\204\347\263\273\347\273\237\350\241\250\345\222\214\350\247\206\345\233\276\345\210\227\350\241\250.md" @@ -0,0 +1,237 @@ +# gs\_collector工具支持收集的系统表和视图列表 + +**表 1** gs\_collector工具支持收集的系统表和视图列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Class

+

View Name

+

OS

+

gs_os_run_info

+

pg_os_threads

+

Session

+

/Thread

+

gs_session_stat

+

gs_session_time

+

gs_session_cpu_statistics

+

gs_session_memory_statistics

+

gs_session_memory_context

+

gs_session_memory

+

gs_session_memory_detail

+

pg_stat_activity

+

gs_thread_memory_context

+

WLM

+

gs_cluster_resource_info

+

pg_total_user_resource_info

+

pg_total_user_resource_info_oid

+

gs_wlm_rebuild_user_resource_pool

+

gs_wlm_resource_pool

+

gs_wlm_workload_records

+

pg_wlm_statistics

+

pg_app_workloadgroup_mapping

+

Query-AP

+

Operator

+

gs_wlm_operator_info

+

gs_wlm_operator_history

+

gs_wlm_operator_statistics

+

Query-AP

+

gs_wlm_session_info_all

+

gs_wlm_session_history

+

gs_wlm_session_info

+

gs_wlm_user_session_info

+

gs_wlm_session_statistics

+

pg_session_iostat

+

pg_session_wlmstat

+

Cache I/O

+

pg_statio_all_indexes

+

pg_statio_all_sequences

+

pg_statio_all_tables

+

pg_statio_sys_indexes

+

pg_statio_sys_sequences

+

pg_statio_sys_tables

+

pg_statio_user_indexes

+

pg_statio_user_sequences

+

pg_statio_user_tables

+

gs_stat_db_cu

+

gs_stat_session_cu

+

Memory

+

pg_total_memory_detail

+

pg_shared_memory_detail

+

gs_total_memory_detail

+

File

+

gs_file_stat

+

gs_redo_stat

+

pg_stat_bad_block

+

Object

+

pg_stat_user_tables

+

pg_stat_user_indexes

+

pg_stat_sys_tables

+

pg_stat_sys_indexes

+

pg_stat_all_tables

+

pg_stat_all_indexes

+

pg_stat_database

+

pg_stat_database_conflicts

+

pg_stat_xact_all_tables

+

pg_stat_xact_sys_tables

+

pg_stat_xact_user_tables

+

pg_stat_xact_user_functions

+

Lock

+

pg_locks

+

Utility

+

pg_stat_replication

+

pg_replication_slots

+

pg_stat_bgwriter

+

Transaction

+

pg_running_xacts

+

pg_prepared_xacts

+

Waits

+

pg_thread_wait_status

+
+ diff --git a/content/zh/docs/Toolreference/gs_ctl.md b/content/zh/docs/Toolreference/gs_ctl.md new file mode 100644 index 000000000..2ec170472 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_ctl.md @@ -0,0 +1,367 @@ +# gs\_ctl + +## 功能介绍 + +gs\_ctl是openGauss提供的数据库服务控制工具,可以用来启停数据库服务和查询数据库状态。主要供openGauss管理模块调用。 + +gs\_ctl工具由操作系统用户omm执行。 + +- 启动、停止、重启openGauss节点。 +- 在不停止数据库的情况下,重新加载配置文件(postgresql.conf,pg\_hba.conf)。 +- 主备切换、主备状态查询、重建和重建状态查询。 + +## 参数说明 + +gs\_ctl参数可分为如下几类: + +- option参数,详细请参见[表1](#zh-cn_topic_0237152408_zh-cn_topic_0059777628_t56b333c48c5e46cc93262560e23032f5)。 +- 公共参数,详细请参见[表2](#zh-cn_topic_0237152408_zh-cn_topic_0059777628_t09253ddb2a8a4d4a8ba32b103310bb68)。 +- start和restart模式的参数,详细请参见[表3](#zh-cn_topic_0237152408_zh-cn_topic_0059777628_t6d75b31bab9540b284e45222396ae38b)。 +- stop和restart模式的参数,详细请参见[表4](#zh-cn_topic_0237152408_zh-cn_topic_0059777628_t5406d28e9445424c9fcf63658cffc13a)。 +- switchover模式的参数,详细请参见[表5](#zh-cn_topic_0237152408_zh-cn_topic_0059777628_tb40c07f148df463c8012b9e7183fdb31)。 +- build参数,详细请参见[表6](#zh-cn_topic_0237152408_zh-cn_topic_0059777628_t22fb7e7152bf4c939f6316c48cb80b5b)。 +- restore参数,详细请参见[表7](#zh-cn_topic_0237152408_table19356432161112)。 + + **表 1** option参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

init[db]

+

初始化数据库。

+

start

+

启动数据库。

+

restart

+

重启数据库。

+

build

+

在主机上重建备实例。

+

stop

+

停止数据库。

+

reload

+

重载配置文件(postgresql.conf, pg_hba.conf)。

+

status

+

显示数据库运行状态。

+

promote

+

在指定的数据目录运行的备用服务器被命令退出故障恢复,并开始进行读写操作。

+

failover

+

在主机异常时,将备机切换为主机。

+

switchover

+

在主备机正常时,出于维护的需要,将备机切换为主机,可保证切换过程中数据不丢失。

+

切换成功后,需要执行gs_om -t refreshconf 命令记录当前主备机信息

+

query

+

查询主备机之间的状态信息。

+

notify

+

启动后再指定主备机。

+

kill

+

给指定的进程发送信号量。

+

querybuild

+

查看数据库的重建进度。

+

restore

+

恢复增量备份集,需要在gaussdb进程停止的情况下执行。

+
+ + +**表 2** 公共参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-D, --pgdata=DATADIR

+

指定数据目录的位置。

+

DATADIR的取值必须为有效的数据目录。

+

-s, --silent

+

仅打印错误,没有参考消息。

+

-

+

-t, --timeout=SECS

+

这个参数同时控制如下两个功能:

+
  • 等待数据库启动或者关闭完成的最大秒数。
+

取值范围:整型(秒)。

+

默认值:

+
  • 等待数据库启动或者停止完成:60秒。
+

-V , --version

+

打印gs_ctl的版本信息然后退出。

+

-

+

-w

+

用户执行启动或者关闭数据库的操作后,会等待事务操作的完成后再执行。

+

默认值:省略此参数时,默认会等待事务操作完成。

+

-W

+

用户执行启动或者关闭数据库的操作后,会强制完成启动或者关闭,不等待事务操作完成。

+

-

+

-M

+

-M后面需要跟SERVERMODE参数,表示在启动时指定数据库的启动模式。

+

SERVERMODE的取值范围:

+
  • primary:本端以主机模式启动。
  • standby:本端以备机模式启动。
  • pending:本端处于等待状态,等待提升为主机或者备机。
+

-T

+

-T 后面跟term,升主命令时会用此term作为主机term,build时会连接大于等于此term的主机进行build

+

term的取值范围,无符号整型。

+

-P PASSWORD

+

与-U参数配合使用,指定连接本地数据库的用户密码。

+
说明:

当省略-U参数,且认证方法为trust时,-P参数无效。

+
+

-

+

-U USERNAME

+

指定连接数据库的用户。此参数只能与notify、query和querybuild参数配合使用。

+

对于域用户,使用DOMAIN\username格式。

+

取值范围:openGauss中存在的用户。

+

默认值:省略此参数则使用与当前操作系统用户同名的用户。

+

-?, --help

+

显示关于gs_ctl命令行参数的帮助信息。

+

-

+
+ +**表 3** start或restart共有参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-c, --core-file

+

允许gaussdb进程产生内核文件。

+

-

+

-l, --log=FILENAME

+

把服务器日志输出附加在FILENAME文件上。

+

FILENAME的取值为启动数据库服务的用户有权限的文件。

+

例如,data目录下的某文件。

+

-o OPTIONS

+

声明要直接传递给由openGauss执行的gaussdb的命令行选项。

+

参数通常都用单或者双引号包围以保证它们作为一个整体传递。

+

gaussdb支持的参数。

+

-p PATH-TO-POSTGRES

+

声明gaussdb可执行文件的位置。

+

缺省位于gs_ctl自身所在目录,一般不需要此选项。

+
+ +**表 4** stop和restart共有参数 + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-m, --mode=MODE

+

声明关闭模式。

+

mode的取值:

+
  • smart:等待所有客户端中断连接后才关闭。如果服务器处于紧迫等待,一旦所有的客户断开连接,恢复和复制流将会中断。
  • fast:不等待客户端中断连接,所有活跃事务都被回滚并且客户端都被强制断开,然后服务器将被关闭。
  • immediate:强行关闭,在下次重新启动的时候将导致故障恢复。
+

默认值:fast

+
+ +**表 5** switchover参数 + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-m SWITCHOVER-MODE

+

声明双机主备实例正常时切换的切换模式。

+

mode的取值:

+
  • smart:等待所有客户端中断连接后才切换。如果服务器处于紧迫等待,一旦所有的客户断开连接,恢复和复制流将会中断。
  • fast:不等待客户端中断连接,所有活跃事务都被回滚并且客户端都被强制断开,然后服务器将被切换。
+

默认值:fast

+
+ +**表 6** build参数 + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-b MODE

+

指定重建备机的模式。

+

mode的取值:

+

● full:通过全量镜像的方式重新同步 DN主机的数据目录。

+

● incremental:通过解析Xlog日志获 取主备DN差异的数据进行增量修复备DN。

+

警告 ● 增量重建适用于主备双主等因日志 造成的不一致场景。

+

● 备机数据文件损坏、数据目录丢失 等故障通过增量重建的方式无法修复,此时可通过全量重建的方式重 新修复备机。

+

● auto(不指定):先增量,根据失败 后是否可以再增量选择继续增量或 者全量,三次增量失败后进行全 量。

+

默认值:auto

+

-r, --recvtimeout=INTERVAL

+

指定重建过程中备机日志接收等待主机响应的超时时间。

+

取值范围:整型(秒)。

+

默认值:120秒

+

-q

+

重建结束后,是否自动重启。

+

指定参数场合,不自动重启。

+

未指定场合,自动重启。

+

无参数

+
+ +**表 7** restore参数 + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--remove-backup

+

指定是否删除增量备份集。

+

无参数

+
+ diff --git a/content/zh/docs/Toolreference/gs_dump.md b/content/zh/docs/Toolreference/gs_dump.md new file mode 100644 index 000000000..aff2c6b99 --- /dev/null +++ b/content/zh/docs/Toolreference/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](gsql.md)运行该SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。 +- 归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见[表1](#zh-cn_topic_0237152335_zh-cn_topic_0058967678_t17db29a12e7342cfbf02b2f6e50ff1a5)。该导出结果必须与[gs\_restore](gs_restore.md)配合使用来恢复数据库,gs\_restore工具在导入时,系统允许用户选择需要导入的内容,甚至可以在导入之前对等待导入的内容进行排序。 + +## 主要功能 + +gs\_dump可以创建四种不同的导出文件格式,通过**\[**-F或者--format=**\]**选项指定,具体如[表1](#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_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),[gs\_restore](gs_restore.md) + diff --git a/content/zh/docs/Toolreference/gs_dumpall.md b/content/zh/docs/Toolreference/gs_dumpall.md new file mode 100644 index 000000000..a4732644a --- /dev/null +++ b/content/zh/docs/Toolreference/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](gsql.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)。 + +一旦恢复,最好在每个数据库上运行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),[gs\_restore](gs_restore.md) + diff --git a/content/zh/docs/Toolreference/gs_guc.md b/content/zh/docs/Toolreference/gs_guc.md new file mode 100644 index 000000000..3598aa251 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_guc.md @@ -0,0 +1,320 @@ +# gs\_guc + +## 背景信息 + +目前openGauss配置文件(“postgresql.conf”、“pg\_hba.conf”)中的参数默认值都是单机的配置模式。应用程序可以通过调用gs\_guc来设置适合自己的参数。 + +gs\_guc工具由操作系统用户omm执行。 + +- “gs\_guc-current.log” + + 这个文件记录gs\_guc产生的日志。 + + 默认路径:$GAUSSLOG/bin/gs\_guc。 + +- “gs\_guc-年-月-日\_HHMMSS.log” + + 当“gs\_guc-current.log”文件大小满16M后,会根据当前时刻生成一个备份文件。 + +- “server.key.cipher”,“server.key.rand” + + 使用gs\_guc encrypt命令加密用户密码时,如果指定的-M的值为server,则会生成这两个文件。其中“server.key.cipher”存储用户密码的密文,“server.key.rand”存储的是加密因子。 + +- “client.key.cipher”,“client.key.rand” + + 使用gs\_guc encrypt命令加密用户密码时,如果指定的-M的值为client,则会生成这两个文件。其中“client.key.cipher”存储用户密码的密文,“client.key.rand”存储的是加密因子。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >“client.key.cipher”和“client.key.rand”是不指定-U选项时生成的密文文件和加密因子文件。如果通过-U指定了用户名,则会生成以用户名开头的文件。以指定-U test为例,生成的文件名为:“test.key.cipher、test.key.rand”。 + + +- “datasource.key.cipher”,“datasource.key.rand” + + 使用gs\_guc encrypt命令加密用户密码时,如果指定的-M的值为source,则会生成这两个文件。其中“datasource.key.cipher”存储用户密码的密文,“datasource.key.rand”存储的是加密因子。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >“datasource.key.cipher”和“datasource.key.rand”是创建Data Source对象时调用的密钥文件。gs\_guc生成时即有读权限。使用前需将这两个文件放入各节点目录$GAUSSHOME/bin,且确保具有读权限。 + + +## 语法 + +- 检查配置文件中参数 + + ``` + gs_guc check [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -c "parameter" + ``` + +- 修改配置文件中参数 + + ``` + gs_guc set [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -c "parameter = value" + ``` + +- 将已设置的参数值修改为默认值 + + ``` + gs_guc [ set | reload ] [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -c "parameter" + ``` + +- 修改配置文件中参数,同时发送信号量到postgresql.conf + + ``` + gs_guc reload [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -c parameter=value + ``` + +- 修改客户端认证策略,同时发送信号量到pg\_hba.conf + + ``` + gs_guc [ set | reload ] [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -h "HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK AUTHMEHOD authentication-options option" + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >authmehod-options支持以下选项: + >- trust:不验密,禁止远程主机使用trust方式访问openGauss + >- reject:拒绝访问 + >- md5:md5认证,默认不支持 + >- sha256:sha256认证(推荐使用) + >- cert:客户端证书认证 + >- gss:kerberos认证 + +- 注释已经设置的客户端认证策略, 同时发送信号量到pg\_hba.conf + + ``` + gs_guc [ set | reload ] [-N NODE-NAME] [-I INSTANCE-NAME | -D DATADIR] -h "HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK AUTHMEHOD" + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果需要注释已经设置的认证策略,请使用-h "HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK AUTHMEHOD",不需要指定authmehod-options。 + +- 显示帮助信息 + + ``` + gs_guc -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_guc -V | --version + ``` + +- 生成加密密码文件 + + ``` + gs_guc encrypt [-M keymode] -K password [-U username] -D DATADIR + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >-K是用户指定的密码,gs\_guc会对该密码进行长度(8<=len<=16)和密码复杂度要求,如果不满足,将会报错。 + >-M是加密类型,当前仅支持server、client和source。默认值为server。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>- gs\_guc工具不支持参数值中包含'\#'的设置。可以使用vi工具通过手工修改配置文件来设置。 +>- 如果已经在环境变量中设置PGDATA,则可以省略-D参数。否则提示设置参数失败。 +>- 环境变量PGDATA设置方法:先将参数PGDATA设置为_/gaussdb/data_,然后在执行“export PGDATA”使设置生效。 +>- authpolicy包含一串认证参数:HOSTTYPE DATABASE USERNAME IPADDR IPMASK,或者HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK,或者HOSTTYPE DATABASE USERNAME HOSTNAME。 +>- 如果设置GUC参数时使用-c "parameter",则会将已设置的GUC参数值设置成该参数的内核默认值(注意log\_directory和audit\_directory不会被设置为内核参数默认值,而是设为$GAUSSLOG/pg\_audit/instance\_name)。因GUC参数间存在依赖关系,因此请慎用该功能。 +>- 设置-c参数时,参数都可以省略双引号。 +>- 如果value中含有特殊字符(如$),请转义后使用。 +>- 如果同一个配置参数在配置文件里面出现多行,且有两行或多于两行同时生效(即没有用"\#"注释掉),那么只有最后一个配置参数会被设置,而前面的都会被忽略。 +>- 通过reload模式设置或修改openGauss节点配置文件(postgresql.conf)的参数,生效存在短暂延迟,有可能导致配置后openGauss各实例参数极短时间不一致。 + +## 命令参考 + +- set + + 表示只修改配置文件中的参数。 + +- check + + 表示只检查配置文件中的参数。 + +- reload + + 表示修改配置文件中的参数,同时发送信号量给数据库进程,使其重新加载配置文件。 + +- encrypt/generate + + 生成加密密码文件。 + +- -N + + 需要设置的主机名称。 + + 取值范围:已有主机名称。 + + 当参数取值为ALL时,表示设置openGauss中所有的主机。 + +- -I INSTANCE-NAME + + 需要设置的实例名称。 + + 取值范围:已有实例名称。 + + 当参数取值为ALL时,表示设置主机中所有的实例。 + +- -D + + 需要执行命令的openGauss实例路径。使用encrypt命令时,此参数表示指定的密码文件生成的路径。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 与"-I" 不能一块使用 + +- -c parameter=value + + 要设定的openGauss配置参数的名称和参数值。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 如果参数是一个字符串变量,则使用-c parameter="'value'"或者使用-c "parameter = 'value'"。 + >- 当使用gs\_guc set/reload为"log\_directory" 恢复默认值时,其默认值会被置为具体的data目录。 + >- 当使用gs\_guc reload进行参数设定,并指定-N参数时,当指定的节点为主节点时,主备节点的参数值都会被修改;当指定节点为备节点时,只会修改备节点的参数值,不会修改主节点的参数值。 + >- 当使用gs\_guc reload进行参数设定,未指定-N参数时,当在主节点上执行时,主备节点的参数值都会被修改;当在备节点上执行时,只会修改备节点的参数值,不会修改主节点的参数值。 + + 取值范围:postgresql.conf中的所有参数。 + +- -c parameter + + 当进行check操作时,表示需要检查的参数名称;当进行set/reload操作时,表示需要恢复为数据库默认值的参数名称。 + +- -h host-auth-policy + + 指定需要在“pg\_hba.conf”增加的客户端认证策略。 + + 取值范围: + + - HOSTTYPE DATABASE USERNAME IPADDR IPMASK \[authmehod-options\] + - HOSTTYPE DATABASE USERNAME IPADDR-WITH-IPMASK \[authmehod-options \] + - HOSTTYPE DATABASE USERNAME HOSTNAME \[authmehod-options \] + + HOSTTYPE是必输参数,取值: + + - local + - host + - hostssl + - hostnossl + + 其中“local”是一个Unix域套接字,“host”是普通或SSL加密的TCP / IP套接字,“hostssl”是SSL加密的TCP / IP套接字,“hostnossl”是一个纯TCP / IP套接字。 + + authmehod-options是可选输入,取值: + + - trust + - reject + - md5 + - sha256 + - cert + - gss + + 详细的参数说明请参见“pg\_hba.conf”配置文件中的描述。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本信息。 + +- -M, --keymode=MODE + + 设定该密码在数据库运行过程中,用于服务端\(server\)、客户端\(client\)还是创建Data Source对象时调用。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >在使用ssl功能时,会涉及到服务端证书和私钥文件的加密密码和客户端证书和私钥文件的加密密码,在加密存储加密密码时,需要指定模式,否则默认是生成服务端的密码文件。 + + 取值范围: + + - server(缺省) + - client + - source + +- -K PASSWORD + + 指定需要加密的密码。 + + 取值范围:字符串,符合密码复杂度的要求。 + +- -U, --keyuser=USER + + 指定要加密的用户,隶属于OS用户。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >比如,openGauss可以为每个用户配置不同的ssl证书和私钥文件,指定该选项,可以生成按用户名区分的密码文件。 + +- -S CIPHERKEY + + 指定需要加密的字符串。 + + 取值范围:字符串。 + + +## 示例 + +示例1:修改数据库允许的最大连接数为800。修改后需要重启数据库才能生效。 + +``` +gs_guc set -D /gaussdb/data/coordinator -c "max_connections = 800" -N plat1 + +Total instances: 1. Failed instances: 0. +Success to perform gs_guc! +``` + +示例2:将已设置的数据库允许的最大连接数值修改为默认值。修改后需要重启数据库才能生效。 + +``` +gs_guc set -D /gaussdb/data/dbnode-c "max_connections" -N plat1 + +Total instances: 1. Failed instances: 0. +Success to perform gs_guc! +``` + +示例3:设置客户端认证策略 + +``` +gs_guc set -N all -I all -h "host replication testuser 10.252.95.191/32 sha256" + +Total instances: 2. Failed instances: 0. +Success to perform gs_guc! +``` + +示例4:注释清理已经设置的客户端认证策略 + +``` +gs_guc set -N all -I all -h "host replication testuser 10.252.95.191/32" + +Total instances: 2. Failed instances: 0. +Success to perform gs_guc! +``` + +示例5:加密服务器端存储用户密码的明文,避免密码泄露。 + +``` +gs_guc encrypt -K Gauss@123 -D /data/xzg/wisequery/gaussdb +gs_guc encrypt -K *** +``` + +示例6:检查openGauss中各个实例的参数配置情况。 + +``` +gs_guc check -D /gaussdb/data/dbnode -c "max_connections" -N plat1 + +Total GUC values: 1. Failed GUC values: 0. +The value of parameter max_connections is same on all instances. + max_connections=800 +``` + +示例7:修改archive\_command归档命令,由用户自己保证归档路径的有效性。修改后需要重启数据库才能生效。推荐使用此方法。 + +``` +gs_guc set -N all -D /data/datanode -c "archive_command= 'cp %p /data/datanode/pg_xlog/archive_status/%f'" +Total instances: 3. Failed instances: 0. +Success to perform gs_guc! +``` + +示例8:通过用户输入的明文密码,生自定义的test.key.cipher和test.key.rand文件。 + +``` +gs_guc generate -S Mppdb@123 -D data/xzg/wisequery/gaussdb -o test +gs_guc encrypt -S *** +``` + diff --git a/content/zh/docs/Toolreference/gs_install.md b/content/zh/docs/Toolreference/gs_install.md new file mode 100644 index 000000000..e0cb63342 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_install.md @@ -0,0 +1,146 @@ +# gs\_install + +## 背景信息 + +数据库的部署是一个复杂的过程。openGauss提供了gs\_install工具来帮助完成openGauss的安装和部署。 + +openGauss安装部署,要求用户指定配置文件,配置文件中会指定程序安装路径、实例数据目录、主备关系、实例数、各实例的业务IP端口等信息。 + +## 前提条件 + +- 已成功执行前置脚本gs\_preinstall。 +- 用户需确保各个节点上的locale保持一致。 +- 需要使用前置时设置的openGauss用户进行安装操作。 + +## 语法 + +- 安装openGauss + + ``` + gs_install -X XMLFILE [--gsinit-parameter="PARAMETER" [...]] [--dn-guc="PARAMETER" [...]] [--alarm-component=ALARMCOMPONENT] [--time-out=SECS] [-l LOGFILE] + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >执行gs\_install脚本时,如果输入参数--autostart=no, 则工具脚本在配置(config)步骤完成后退出,不会自动启动openGauss,需要用户通过执行gs\_om -t start命令手动启动。 + +- 显示帮助信息 + + ``` + gs_install -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_install -V | --version + ``` + + +## 参数说明 + +- -X + + openGauss配置文件的路径。 + + 取值范围:xml文件的存储路径。 + +- -l + + 指定安装日志文件及日志文件存放的路径。 + + 当既不明确指定-l,又不在XML文件中配置gaussdbLogPath时,默认值为“$GAUSSLOG/om/gs\_install-YYYY-MM-DD\_hhmmss.log”; + + 当不明确指定-l,但在XML文件中配置了gaussdbLogPath时,默认值为“gaussdbLogPath的值、用户名和om/gs\_install-YYYY-MM-DD\_hhmmss.log”的组合。 + +- --gsinit-parameter=PARAM + + 数据实例参数指定。 + + 取值范围请参见[zh-cn\_topic\_0242223705.md](zh-cn_topic_0242223705.md)的参数说明,其中对-A、-D、-U、-C、-X参数的设置不生效。 + +- --dn-guc=PARAM + + 配置参数。 + + 取值范围请参见[gs\_guc](gs_guc.md)的参数说明。 + +- --time-out=SECS + + 启动超时等待时间。单位:s。 + + 若--time-out取值过小,有可能会因为需要启动的实例数过多而引起超时。若在超时时间内启动不成功,则会报错启动超时,但是openGauss会在后台继续启动。可以等待一段时间后,查询openGauss状态,检查openGauss是否启动成功。 + + 取值范围:正整数,若无特殊需求,不需要配置该参数,系统会自动调整超时时间。 + +- --alarm-component=alarm\_component + + 指定告警上报组件的绝对路径。 + +- --autostart=yes|no + + 用来指定openGauss配置完成后是否启动。 + + - yes:启动openGauss。 + - no:不启动openGauss。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +## 示例 + +使用gs\_install脚本进行openGauss安装。 + +``` +gs_install -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Creating the backup directory. +Successfully created the backup directory. +Installing the cluster. +Checking the installation environment on all nodes. +Installing applications on all nodes. +Cluster installation is completed. +Configuring. +Deleting instances from all nodes. +Checking node configuration on all nodes. +Initializing instances on all nodes. +Updating instance configuration on all nodes. +Configuring pg_hba on all nodes. +Configuration is completed. +Starting. +=====================================================================Starting cluster. +====================================================================== +Successfully started primary instance. Wait for standby instance. +====================================================================== +. +Successfully started cluster. +====================================================================== +cluster_state : Normal +redistributing : No +node_count : 3 +Coordinator State + normal : 2 + abnormal : 0 +GTM State + primary : 1 + standby : 1 + abnormal : 0 + down : 0 +Datanode State + primary : 3 + standby : 3 + secondary : 3 + building : 0 + abnormal : 0 + down : 0 +``` + +## 相关命令 + +[gs\_postuninstall](gs_postuninstall.md),[gs\_preinstall](gs_preinstall.md),[gs\_uninstall](gs_uninstall.md) + diff --git a/content/zh/docs/Toolreference/gs_om.md b/content/zh/docs/Toolreference/gs_om.md new file mode 100644 index 000000000..020ef9138 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_om.md @@ -0,0 +1,513 @@ +# gs\_om + +## 背景信息 + +openGauss提供了gs\_om工具帮助对openGauss进行维护,包括启动openGauss、停止openGauss、查询openGauss状态、查询静态配置、查询openGauss状态、生成静态配置文件、生成动态配置文件、SSL证书替换、显示帮助信息和显示版本号信息等功能。 + +## 前提条件 + +需以操作系统用户omm执行gs\_om命令。 + +## 语法 + +- 启动openGauss + + ``` + gs_om -t start [-h HOSTNAME] [-D dataDir] [--time-out=SECS] [--security-mode=MODE] [-l LOGFILE] + ``` + +- 停止openGauss + + ``` + gs_om -t stop [-h HOSTNAME] [-D dataDir] [--time-out=SECS] [-m MODE] [-l LOGFILE] + ``` + +- 查询openGauss状态 + + ``` + gs_om -t status [-h HOSTNAME] [-o OUTPUT] [--detail] [--all] [-l LOGFILE] + ``` + +- 生成静态配置文件 + + ``` + gs_om -t generateconf -X XMLFILE [--distribute] [-l LOGFILE] + ``` + +- 生成动态配置文件,备机切换成主机后,需要执行此操作 + + ``` + gs_om -t refreshconf + ``` + +- 查看静态配置 + + ``` + gs_om -t view [-o OUTPUT] + ``` + +- 查询openGauss状态 + + ``` + gs_om -t query [-o OUTPUT] + ``` + +- SSL证书替换 + + ``` + gs_om -t cert --cert-file=CERTFILE [-l LOGFILE] + gs_om -t cert --rollback + ``` + +- 显示帮助信息 + + ``` + gs_om -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_om -V | --version + ``` + + +## 参数说明 + +gs\_om参数可以分为如下几类: + +- 通用参数: + - -t + + gs\_om命令的类型。 + + 取值范围:start、stop、status、generateconf、cert、view、query、refreshconf、kerberos。 + + - -l + + 指定日志文件及存放路径。 + + 默认值:$GAUSSLOG/om/gs\_om-YYYY-MM-DD\_hhmmss.log(virtualip的默认值:/tmp/gs\_virtualip/gs\_om-YYYY-MM-DD\_hhmmss.log) + + - -?, --help + + 显示帮助信息。 + + - -V, --version + + 显示版本号信息。 + + +- 启动openGauss参数: + - -h + + 指定需要启动的服务器名称。一次只能启动一个服务器。 + + 取值范围:服务器名称。 + + 不指定服务器名称时,表示启动openGauss。 + + - -D + + 指定 dn路径 + + 取值范围:dn路径 + + 不指定dn路径,表示使用静态文件中的dn路径 + + - --time-out=SECS + + 指定超时时间,如果超时,om脚本自动退出。单位:s。 + + 取值范围:正整数,建议值300。 + + 默认值:300 + + - --security-mode + + 指定是否以安全模式启动数据库 + + 取值范围:on 已安全模式启动, off 不已安全模式启动 + + 默认不开启安全模式 + + +- 停止openGauss参数: + - -h + + 指定需要停止实例所在的服务器名称。一次只能停止一个服务器。 + + 取值范围:实例所在的服务器名称。 + + 不指定服务器名称时,表示停止openGauss。 + + - -m, --mode=MODE + + 停止模式设置。 + + 取值范围:支持三种停止模式。 + + - fast方式:保证有主备关系的实例数据是一致的。 + - immediate方式:不保证有主备关系的实例数据是一致的。 + - smart方式:保证有主备关系的实例数据是一致的,且备机本地所有日志都已redo。 + + 默认值:fast方式。 + + - --time-out=SECS + + 指定超时时间,如果超时,om脚本自动退出。单位:s。 + + 取值范围:正整数,建议值300。 + + 默认值:300 + + +- 查询状态参数: + + openGauss状态显示结果的参数说明请参见[表1](#table1171617665)。 + + - -h + + 指定需要待查询的服务器名称。 + + 取值范围:服务器名称。 + + 不指定服务器时,表示查询openGauss。 + + - -o + + 输出到指定的output文件中。 + + 如果不指定,直接显示在屏幕上。 + + - --detail + + 显示详细信息。如果不指定,只提示该服务器是否正常。 + + --all + + 显示openGauss所有节点信息 + + +- 生成配置文件参数: + - -X + + 选择openGauss配置文件路径。 + + 取值范围:clusterconfig.xml的路径。 + + - --distribute + + 将静态配置文件发布到openGauss实例的安装目录。 + + +- SSL证书替换: + - --cert-file + + 指定本地SSL证书zip压缩包所在路径。 + + --rollback + + 证书回退到上一次成功备份的状态。 + + + +**表 1** 状态说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

字段

+

字段含义

+

字段值

+

cluster_state

+

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

+
  • Normal:表示openGauss可用,且数据有冗余备份。所有进程都在运行,主备关系正常。
  • Unavailable:表示openGauss不可用。
  • Degraded:表示openGauss可用,但数据没有冗余备份。
+

redistributing

+

数据重分布状态

+
  • Yes:表示openGauss处于数据重分布状态。
  • No:表示openGauss未处于数据重分步状态。
+

balanced

+

平衡状态。显示是否有openGauss实例发生过主备切换而导致主机负载不均衡。

+
  • Yes:表示openGauss处于负载均衡状态。
  • No:表示openGauss未处于负载均衡状态。
+

node

+

主机名称

+

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

+

node_ip

+

主机IP

+

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

+

instance

+

实例ID

+

表示该实例的ID。

+

state

+

实例状态

+
  • Primary:表示实例为主实例。
  • Standby:表示实例为备实例。
  • Secondary:表示实例为从备实例。
  • Pending:表示该实例在仲裁阶段。
  • Unknown:表示实例状态未知。
  • Down:表示实例处于宕机状态。
+
+ +**表 2** 特性ID说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

特性名称

+

特性ID

+

openGauss产品

+

多值列

+

0

+

基础版

+

JSON

+

1

+

不支持License控制

+

XML

+

2

+

不支持

+

数据存储格式ORC

+

3

+

基础版

+

+

单机支持一主多备,备机可读

+

5

+

策略不放开

+

多维碰撞分析GPU加速

+

7

+

高级特性

+

全文索引

+

8

+

基础版

+

EXTENSION_CONNECTOR

+

9

+

基础版

+

EXPRESS_CLUSTER

+

12

+

高级版

+

跨DC协同

+

13

+

高级版

+

+

14

+

不支持

+

时序

+

15

+

不支持

+

PostGis对接

+

16

+

基础版

+

openGauss内高可用-一主多备

+

17

+

策略不放开

+

行级权限控制

+

18

+

高级版

+

透明加密

+

19

+

高级版

+

私有表

+

20

+

高级版

+
+ +## 示例 + +- 启动openGauss。 + + ``` + gs_om -t start + Starting cluster. + ====================================================================== + . + ====================================================================== + + Successfully started . + ``` + +- 停止openGauss。 + + ``` + gs_om -t stop + Stopping cluster. + ========================================= + Successfully stopped cluster. + ========================================= + End stop cluster. + ``` + +- 查看openGauss详细状态信息,含实例状态信息。 + + ``` + gs_om -t status --detail + [ Cluster State ] + + cluster_state : Normal + redistributing : No + + [ Datanode State ] + node node_ip instance state | node node_ip instance state | node node_ip instance state + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ``` + +- 在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/gaussdb/wisequery/script/static_config_files. + Distributing static configuration files to all nodes. + Successfully distributed static configuration files. + ``` + + 然后打开生成的配置文件目录,会看到新生成的3个文件。 + + ``` + cd /opt/huawei/Bigdata/gaussdb/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 + ``` + +- SSL证书回退。 + + ``` + gs_om -t cert --rollback + [plat1] SSL cert files rollback successfully. + [plat2] SSL cert files rollback successfully. + [plat3] SSL cert files rollback successfully. + ``` + +- 新License注册 + + ``` + gs_om -t license -m register -f MTgsMTkK + Preparing for the program initialization. + Lock the OPS operation of OM components. + Check and make sure the consistency of the license file. + Backup the license file on all of the cluster hosts. + Encrypt the product feature information and generate the license file. + Send message to the 数据库节点 instances to reload the license file. + Remove the backup license file on all of the cluster hosts. + License register successfully. + ``` + +- 新License反注册 + + ``` + gs_om -t license -m unregister -f MTgsMTkK + Preparing for the program initialization. + Lock the OPS operation of OM components. + Check and make sure the consistency of the license file. + Backup the license file on all of the cluster hosts. + Encrypt the product feature information and generate the license file. + Send message to the 数据库节点 instances to reload the license file. + Remove the backup license file on all of the cluster hosts. + License unregister successfully. + ``` + + diff --git a/content/zh/docs/Toolreference/gs_postuninstall.md b/content/zh/docs/Toolreference/gs_postuninstall.md new file mode 100644 index 000000000..4b7d07371 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_postuninstall.md @@ -0,0 +1,123 @@ +# gs\_postuninstall + +## 背景信息 + +openGauss提供了gs\_postuninstall工具来帮助清理准备openGauss环境阶段所做配置,使得卸载后的环境得到清理。 + +## 前提条件 + +- openGauss卸载执行成功。 +- root用户互信可用。 +- 只能使用root用户执行gs\_postuninstall命令。 + +## 语法 + +- openGauss清理用户、用户组以及虚拟IP清理 + + ``` + gs_postuninstall -U USER -X XMLFILE [-L] [--delete-user] [--delete-group] [--delete-virtual-IP] [-l LOGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_postuninstall -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_postuninstall -V | --version + ``` + + +## 参数说明 + +- -U + + 运行openGauss的操作系统用户名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- -X + + openGauss配置文件路径。 + + 取值范围:xml文件的存储路径。 + +- -L + + 只清理本主机的环境。 + + 如果openGauss内某主机做单机环境清理后,openGauss不能再做全量环境清理。 + +- --delete-user + + 删除-U参数指定的操作系统用户。 + + 如果在Redhat环境下,且用户名与用户组名相同,选择此项必须指定--delete-group参数。 + +- --delete-group + + 删除操作系统用户所在的用户组(选择此选项必须指定--delete-user参数)。 + +- --delete-virtual-IP + + 删除openGauss配置文件中的虚拟IP。 + +- -l + + 指定日志文件名及路径。在内部会自动给日志名添加一个时间戳。 + + - 当既不明确指定-l,又不在XML文件中配置gaussdbLogPath时,默认值为“$GAUSSLOG/om/gs\_postuninstall-YYYY-MMDD\_hhmmss.log”。 + - 当不明确指定-l,但在XML文件中配置了gaussdbLogPath时,默认值为“gaussdbLogPath/用户名/om/gs\_postuninstall-YYYY-MMDD\_hhmmss.log”。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于在执行gs\_postuninstall后,系统会自动删除openGauss相关目录(包含$GAUSSLOG目录)。因此建议用户通过该参数指定日志文件到非openGaussopenGauss相关路径。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +## 示例 + +清理主机的环境 + +``` +gs_postuninstall -U omm -X /opt/software/openGauss/clusterconfig.xml --delete-user +Parsing the configuration file. +Successfully parsed the configuration file. +Check log file path. +Successfully checked log file path. +Checking unpreinstallation. +Successfully checked unpreinstallation. +Deleting the instance's directory. +Successfully deleted the instance's directory. +Deleting the installation directory. +Successfully deleted the installation directory. +Deleting the temporary directory. +Successfully deleted the temporary directory. +Deleting remote OS user. +Successfully deleted remote OS user. +Deleting software packages and environmental variables of other nodes. +Successfully deleted software packages and environmental variables of other nodes. +Deleting logs of other nodes. +Successfully deleted logs of other nodes. +Deleting software packages and environmental variables of the local node. +Successfully deleted software packages and environmental variables of the local nodes. +Deleting local OS user. +Successfully deleted local OS user. +Deleting local node's logs. +Successfully deleted local node's logs. +Successfully cleaned environment. +``` + +## 相关命令 + +[gs\_preinstall](gs_preinstall.md),[gs\_uninstall](gs_uninstall.md) + diff --git a/content/zh/docs/Toolreference/gs_preinstall.md b/content/zh/docs/Toolreference/gs_preinstall.md new file mode 100644 index 000000000..96799aecd --- /dev/null +++ b/content/zh/docs/Toolreference/gs_preinstall.md @@ -0,0 +1,362 @@ +# gs\_preinstall + +## 背景信息 + +openGauss提供了gs\_preinstall工具来帮助完成openGauss的环境配置,以保证openGauss安装的正常进行。 + +## 注意事项 + +- 用户需要检查上层目录权限,保证安装用户对安装包和配置文件目录读写执行的权限。 +- xml文件中各主机的名称与IP映射配置正确。 +- 只能使用root用户执行gs\_preinstall命令。 +- 本产品支持同一操作系统大版本下的小版本混合部署,其支持列表如下: + + ``` + CentOS 6.4/6.5/6.6/6.7/6.8/6.9 + CentOS 7.0/7.1/7.2/7.3/7.4 + openEuler + ``` + + +## 语法 + +- 准备openGauss环境 + + ``` + gs_preinstall -U USER -G GROUP -X XMLFILE [-L] [--skip-os-set] [--env-var="ENVVAR" [...]] [--sep-env-file=ENVFILE] [--skip-hostname-set] [-l LOGFILE] [--non-interactive] + ``` + +- 显示帮助信息 + + ``` + gs_preinstall -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_preinstall -V | --version + ``` + + +## 参数说明 + +- -U + + 运行openGauss的操作系统用户名。 + + 取值范围:字符串,要符合标识符的命名规范。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >配置-U参数值时,字符串中不能包含"|",";","&","$","<","\>","\`","\\\\","'","\\","\{","\}","\(","\)","\[","\]","\~","\*","?"特殊字符。 + +- -G + + 运行openGauss的操作系统用户的群组名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- -X + + openGauss配置文件路径。 + + 取值范围:xml文件的存储路径。 + +- -L + + 指定该参数则仅给当前节点准备好openGauss安装环境。适用于不允许使用root互信的场景和设置安全加固参数PermitRootLogin为no的场景。需要满足如下前提条件: + + 1. 安装包和openGauss配置文件已提前上传到所有主机; + 2. openGauss安装用户已提前创建好并建立好互信关系; + 3. 用户需要自己保证各台主机上所执行命令的一致性。 + +- --skip-os-set + + 是否设置操作系统参数。默认设置系统参数。如果指定该参数则不设置。 + +- --env-var="ENVVAR" + + 配置普通用户环境变量。可以指定多个。 + + 取值范围:字符串。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >不能指定openGauss默认创建的环境变量。默认创建的环境变量见[表1](#zh-cn_topic_0237152419_zh-cn_topic_0059778992_tb25e10cef2104026bdbbedc439fbcd50)。 + +- --sep-env-file=ENVFILE + + 保存环境变量的文件。如果指定该参数,表示将使用环境变量分离的版本。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >不能指定环境变量文件为openGauss相关目录或者和这些目录同名,不能和openGauss用户的目录相同。 + +- --skip-hostname-set + + 是否将xml配置文件中主机名与IP的映射关系写入“/etc/hosts”文件中。默认写入,如果指定该参数则不写入。 + +- -l + + 指定日志文件名及路径。在内部会自动给日志名添加一个时间戳。 + + 默认值:/var/log/gaussdb/用户名/om/gs\_preinstall.log + + - 当既不明确指定-l,又不在XML文件中配置gaussdbLogPath时,默认值为“/var/log/gaussdb/用户名/om/gs\_preinstall-YYYY-MM-DD\_hhmmss.log”。 + - 当不明确指定-l,但在XML文件中配置了gaussdbLogPath时,默认值为gaussdbLogPath的值、用户名和om/gs\_preinstall-YYYY-MM-DD\_hhmmss.log的组合。 + +- --non-interactive + + 指定前置执行模式。 + + - 当不指定该参数时,则为安全交互模式,在此模式下用户需要人机交互输入密码。 + - 当指定该参数时,为非交互模式,不需要进行人机交互。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >交互式输入密码的过程中,密码不能包含";","'","$"3个特殊字符。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + **表 1** openGauss默认创建的环境变量 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

环境变量名称

+

说明

+

MPPDB_ENV_SEPARATE_PATH

+

openGauss环境变量分离文件路径

+

GPHOME

+

openGauss工具目录

+

PATH

+

openGauss工具脚本目录

+

LD_LIBRARY_PATH

+

openGauss引用第三方动态库路径

+

PYTHONPATH

+

python软件路径

+

GAUSS_WARNING_TYPE

+

告警类型

+

GAUSSHOME

+

openGauss安装路径

+

GAUSS_VERSION

+

openGauss版本号

+

PGHOST

+

openGauss用户的临时目录路径

+

GS_CLUSTER_NAME

+

openGauss名称

+

GAUSSLOG

+

openGauss日志路径

+

GAUSS_ENV

+

openGauss环境变量标识

+
+ + +## 手动设置服务端SYSLOG配置 + +设置“/etc/syslog-ng/syslog-ng.conf”文件,在文件中添加如下内容: + +``` +template t_gaussdb {template("$DATE $SOURCEIP $MSGONLY\n");template_escape(no);}; +source s_gaussdb{ udp(); }; +filter f_gaussdb { level(err, crit) and match('GaussDB'); }; +destination d_gaussdb { file("/var/log/syslog_MPPDB", template(t_gaussdb)); }; +log { source(s_gaussdb); filter(f_gaussdb); destination(d_gaussdb); }; +``` + +设置“/etc/sysconfig/syslog”文件,在文件中添加如下内容: + +``` +SYSLOGD_OPTIONS="-r -m 0" +KLOGD_OPTIONS="-x" +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>该配置需要在openGauss每台机器上都要修改。 + +## 示例 + +使用非交互方式进行openGauss环境准备: + +``` +./gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml --non-interactive +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Distributing package. +Successfully distributed package. +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Warning: Installation environment contains some warning messages. +Please get more details by "/package_r8/sudo/gs_checkos -i A -h host179174,host179175,host179176". +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +使用交互模式进行openGauss环境准备: + +``` +./gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Are you sure you want to create trust for root (yes/no)? yes +Please enter password for root. +Password: +Creating SSH trust for the root permission user. +Please enter password for current user[root]. +Password: +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +Successfully created SSH trust for the root permission user. +Distributing package. +Successfully distributed package. +Are you sure you want to create the user[omm] and create trust for it (yes/no)? yes +Please enter password for cluster user. +Password: +Please enter password for cluster user again. +Password: +Creating [omm] user on all nodes. +Successfully created [omm] user on all nodes. +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Creating SSH trust for [omm] user. +Please enter password for current user[omm]. +Password: +Checking network information. +All nodes in the network are Normal. +Successfully checked network information. +Creating SSH trust. +Creating the local key file. +Successfully created the local key files. +Appending local ID to authorized_keys. +Successfully appended local ID to authorized_keys. +Updating the known_hosts file. +Successfully updated the known_hosts file. +Appending authorized_key on the remote node. +Successfully appended authorized_key on all remote node. +Checking common authentication file content. +Successfully checked common authentication content. +Distributing SSH trust file to all node. +Successfully distributed SSH trust file to all node. +Verifying SSH trust on all hosts. +Successfully verified SSH trust on all hosts. +Successfully created SSH trust. +Successfully created SSH trust for [omm] user. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Warning: Installation environment contains some warning messages. +Please get more details by "/package_r8/sudo/gs_checkos -i A -h host179174,host179175,host179176". +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +## 相关命令 + +[gs\_install](gs_install.md),[gs\_postuninstall](gs_postuninstall.md) + diff --git a/content/zh/docs/Toolreference/gs_restore.md b/content/zh/docs/Toolreference/gs_restore.md new file mode 100644 index 000000000..86df98a37 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_restore.md @@ -0,0 +1,385 @@ +# 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:该归档形式为4.21-gs\_dump的自定义格式。 + - 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。 + + +>![](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 8000 -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 8000 -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 8000 -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 8000 -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 8000 -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 8000 -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 8000 -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 8000 -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),[gs\_dumpall](gs_dumpall.md) + diff --git a/content/zh/docs/Toolreference/gs_ssh.md b/content/zh/docs/Toolreference/gs_ssh.md new file mode 100644 index 000000000..f0594f32c --- /dev/null +++ b/content/zh/docs/Toolreference/gs_ssh.md @@ -0,0 +1,67 @@ +# gs\_ssh + +## 背景信息 + +openGauss提供了gs\_ssh工具帮助用户在openGauss各节点上执行相同的命令。 + +## 前提条件 + +- 各个主机间互信正常。 +- openGauss已经正确安装部署。 +- 调用命令可用which查询到且在当前用户下有执行权限。 +- 需以操作系统用户omm执行gs\_ssh命令 + +## 语法 + +- 同步执行命令 + + ``` + gs_ssh -c cmd + ``` + +- 显示帮助信息 + + ``` + gs_ssh -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_ssh -V | --version + ``` + + +## 参数说明 + +- -c + + 指定需要在openGauss各主机上执行的linux shell命令名。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +## 示例 + +在openGauss各主机上执行相同命令。以执行"hostname"命令为例。 + +``` +gs_ssh -c "hostname" +Successfully execute command on all nodes. +Output: +[SUCCESS] plat1: +plat1 +[SUCCESS] plat2: +plat2 +[SUCCESS] plat3: +plat3 +[SUCCESS] plat4: +plat4 +``` + diff --git a/content/zh/docs/Toolreference/gs_sshexkey.md b/content/zh/docs/Toolreference/gs_sshexkey.md new file mode 100644 index 000000000..c59bf1335 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_sshexkey.md @@ -0,0 +1,211 @@ +# gs\_sshexkey + +## 背景信息 + +openGauss在安装过程中,需要在openGauss中的节点间执行命令,传送文件等操作。因此,安装前需要确保互信是连通的。openGauss提供了gs\_sshexkey工具来帮助用户建立互信。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>root用户互信可能会存在安全隐患,因此建议用户在使用完成后,立即删除各主机上root用户的互信。 + +## 前提条件 + +- 确保ssh服务打开。 +- 确保ssh端口不会被防火墙关闭。 +- 确保xml文件中各主机名称和IP配置正确。 +- 确保所有机器节点间网络畅通。 +- 如果为普通用户建立互信,需要提前在各主机创建相同用户并设置密码。 +- 如果各主机安装并启动了SELinux服务,需要确保/root和/home目录安全上下文为默认值(root目录:system\_u:object\_r:home\_root\_t:s0,home目录:system\_u:object\_r:admin\_home\_t:s0)或者关闭掉SELinux服务。 + + 检查系统SELinux状态的方法:执行命令getenforce,如果返回结果是Enforcing ,说明SELinux安装并启用。 + + 检查目录安全上下文的命令: + + ``` + ls -ldZ /root | awk '{print $4}' + ``` + + ``` + ls -ldZ /home | awk '{print $4}' + ``` + + 恢复目录安全上下文命令: + + ``` + restorecon -r -vv /home/ + ``` + + ``` + restorecon -r -vv /root/ + ``` + + +## 语法 + +- 建立互信 + + ``` + gs_sshexkey -f HOSTFILE [-W PASSWORD] [...] [--skip-hostname-set] [-l LOGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_sshexkey -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_sshexkey -V | --version + ``` + + +## 参数说明 + +- -f + + 主机列表,列出所有需要建立互信主机的IP。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >确保hostfile文件中只配置正确的主机IP,不包含其它信息。 + +- -W, --password=PASSWORD + + 待建互信用户的密码。如果不指定该参数则在建立互信过程中需要交互式输入用户密码。如果各个主机的用户密码不一样时则使用多个-W参数,密码顺序和IP地址需要一一对应,交互式情况下则依次输入对应主机的密码。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >密码不能包含";","'","$"3个特殊字符。 + +- -l + + 指定日志文件的保存路径。 + + 取值范围:任意存在的可访问的绝对路径。 + +- --skip-hostname-set + + 是否将“-f”参数文件中IP与其hostname的映射关系写入“/etc/hosts”文件中。默认写入,如果指定该参数则不写入。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +## 示例 + +如下是为root用户建立互信的示例。 + +- 用户密码相同情况下,非交互式模式使用以下命令建立互信。 + + Gauss@123为root用户的密码。 + + ``` + ./gs_sshexkey -f /opt/software/hostfile -W Gauss@123 + Checking network information. + All nodes in the network are Normal. + Successfully checked network information. + Creating SSH trust. + Creating the local key file. + Appending local ID to authorized_keys. + Successfully appended local ID to authorized_keys. + Updating the known_hosts file. + Successfully updated the known_hosts file. + Appending authorized_key on the remote node. + Successfully appended authorized_key on all remote node. + Checking common authentication file content. + Successfully checked common authentication content. + Distributing SSH trust file to all node. + Successfully distributed SSH trust file to all node. + Verifying SSH trust on all hosts. + Successfully verified SSH trust on all hosts. + Successfully created SSH trust. + ``` + +- 用户密码不同情况下,非交互式模式使用以下命令建立互信。 + + Gauss@234为主机列表中第一台主机的root密码,Gauss@345为主机列表中第二台主机的root密码。 + + ``` + ./gs_sshexkey -f /opt/software/hostfile -W Gauss@123 -W Gauss@234 -W Gauss@345 + Checking network information. + All nodes in the network are Normal. + Successfully checked network information. + Creating SSH trust. + Creating the local key file. + Appending local ID to authorized_keys. + Successfully appended local ID to authorized_keys. + Updating the known_hosts file. + Successfully updated the known_hosts file. + Appending authorized_key on the remote node. + Successfully appended authorized_key on all remote node. + Checking common authentication file content. + Successfully checked common authentication content. + Distributing SSH trust file to all node. + Successfully distributed SSH trust file to all node. + Verifying SSH trust on all hosts. + Successfully verified SSH trust on all hosts. + Successfully created SSH trust. + ``` + +- 用户密码相同情况下,交互式模式使用以下命令建立互信。 + + ``` + gs_sshexkey -f /opt/software/hostfile + Please enter password for current user[root]. + Password: + Checking network information. + All nodes in the network are Normal. + Successfully checked network information. + Creating SSH trust. + Creating the local key file. + Appending local ID to authorized_keys. + Successfully appended local ID to authorized_keys. + Updating the known_hosts file. + Successfully updated the known_hosts file. + Appending authorized_key on the remote node. + Successfully appended authorized_key on all remote node. + Checking common authentication file content. + Successfully checked common authentication content. + Distributing SSH trust file to all node. + Successfully distributed SSH trust file to all node. + Verifying SSH trust on all hosts. + Successfully verified SSH trust on all hosts. + Successfully created SSH trust. + ``` + +- 用户密码不同情况下,交互式模式使用以下命令建立互信。 + + ``` + gs_sshexkey -f /opt/software/hostfile + Please enter password for current user[root]. + Password: + Notice :The password of some nodes is incorrect. + Please enter password for current user[root] on the node[10.180.10.112]. + Password: + Please enter password for current user[root] on the node[10.180.10.113]. + Password: + Checking network information. + All nodes in the network are Normal. + Successfully checked network information. + Creating SSH trust. + Creating the local key file. + Appending local ID to authorized_keys. + Successfully appended local ID to authorized_keys. + Updating the known_hosts file. + Successfully updated the known_hosts file. + Appending authorized_key on the remote node. + Successfully appended authorized_key on all remote node. + Checking common authentication file content. + Successfully checked common authentication content. + Distributing SSH trust file to all node. + Successfully distributed SSH trust file to all node. + Verifying SSH trust on all hosts. + Successfully verified SSH trust on all hosts. + Successfully created SSH trust. + ``` + + diff --git a/content/zh/docs/Toolreference/gs_uninstall.md b/content/zh/docs/Toolreference/gs_uninstall.md new file mode 100644 index 000000000..4ade0cc97 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_uninstall.md @@ -0,0 +1,76 @@ +# gs\_uninstall + +## 背景信息 + +openGauss提供了gs\_uninstall工具来帮助完成openGauss的卸载。 + +## 语法 + +- 卸载openGauss + + ``` + gs_uninstall [--delete-data] [-L] [-l LOGFILE] + ``` + +- 显示帮助信息 + + ``` + gs_uninstall -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_uninstall -V | --version + ``` + + +## 参数说明 + +- --delete-data + + 删除数据文件。 + +- -L + + 只卸载本地主机。如果openGauss内某主机做单点卸载后,openGauss不能再做全量卸载。 + +- -l + + 指定日志文件名及可访问的绝对路径。在内部会自动给日志名添加一个时间戳。 + + - 当既不明确指定-l,又不在XML文件中配置gaussdbLogPath时,默认值为“$GAUSSLOG/om/gs\_uninstall-YYYY-MM-DD\_hhmmss.log”。 + - 当不明确指定-l,但在XML文件中配置了gaussdbLogPath时,默认值为“gaussdbLogPath/用户名/om/gs\_uninstall-YYYY-MM-DD\_hhmmss.log”。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于在执行gs\_uninstall时,系统会自动删除openGauss相关目录。因此建议用户通过该参数指定日志文件到非openGaussopenGauss相关路径。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + + +## 示例 + +使用集群用户执行gs\_uninstall脚本进行卸载openGauss。 + +``` +gs_uninstall --delete-data +Checking uninstallation. +Successfully checked uninstallation. +Stopping the cluster. +Successfully stopped the cluster. +Successfully deleted instances. +Uninstalling application. +Successfully uninstalled application. +Uninstallation succeeded. +``` + +## 相关命令 + +[gs\_install](gs_install.md),[gs\_postuninstall](gs_postuninstall.md) + diff --git a/content/zh/docs/Toolreference/gs_upgradectl.md b/content/zh/docs/Toolreference/gs_upgradectl.md new file mode 100644 index 000000000..83f9d9803 --- /dev/null +++ b/content/zh/docs/Toolreference/gs_upgradectl.md @@ -0,0 +1,228 @@ +# gs\_upgradectl + +## 背景信息 + +用户会根据openGauss提供的新特性,确定是否对现有系统进行升级。 + +升级方式为就地小版本升级。 + +- 就地小版本升级:就地升级需要停止业务进行,会一次性升级openGauss中所有节点。 + +## 注意事项 + +- 升级需要停止业务。 +- openGauss运行正常且数据库节点的数据完全同步。 +- 升级过程中不允许打开kerberos开关。 +- 请不要修改安装包中解压出来的version.cfg文件。 +- 升级成功后,原归档日志文件将失效。 +- 升级成功后,原来的二进制目录将会被删除,请不要在二进制目录中存放个人数据文件。 +- 如果升级过程中出现异常导致升级失败,并且自动回滚失败时,需要用户自动执行回滚命令进行手动回滚。升级回滚成功后,升级过程中设置的GUC参数将失效。 +- 升级过程中,不允许对wal\_level,max\_connections,max\_prepared\_transactions,max\_locks\_per\_transaction这四个GUC参数的值进行修改。 +- 数据库节点磁盘使用率低于50%时才可以执行升级操作。 + +## 语法 + +- 显示帮助信息 + + ``` + gs_upgradectl -? | --help + ``` + +- 显示版本号信息 + + ``` + gs_upgradectl -V | --version + ``` + +- 选择升级策略 + + ``` + gs_upgradectl -t chose-strategy [-l LOGFILE] + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >当前支持就地小版本升级。 + +- 自动升级openGauss + + ``` + gs_upgradectl -t auto-upgrade -X XMLFILE [-M MOUNTDIR] [-l LOGFILE] [--product=PRODUCT_FEATURE] {-g NODENUMBER | -h HOSTNAME | --continue | --inplace} + ``` + +- 自动回滚升级 + + ``` + gs_upgradectl -t auto-rollback -X XMLFILE [-l LOGFILE] [--force] + ``` + +- 升级提交 + + ``` + gs_upgradectl -t commit-upgrade -X XMLFILE [-l LOGFILE] + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 升级提交操作只适用于openGauss的就地小版本升级。 + >- 一旦提交操作完成,则不能再执行回滚操作。 + + +## 参数说明 + +- -t + + gs\_upgradectl命令的类型。 + + 取值范围:chose-strategy、auto-upgrade、auto-rollback和commit-upgrade。 + +- -l + + 用于记录升级或回滚过程中的日志信息。 + + 取值范围:任意存在的可访问的绝对路径。 + + 默认值:/var/log/gaussdb/用户名/om/gs\_upgradectl-YYYY-MM-DD\_hhmmss.log + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + +- -X + + 指定openGauss配置文件。 + + 取值范围:xml文件的存储路径。 + +- --force + + 当openGauss状态不正常,无法支持正常回滚回滚时,用此参数进行强制回滚操作。 + + +## 示例 + +**示例一:升级前使用新包进行前置操作。** + +``` +./gs_preinstall -U roach -G users -X /data/xml/3node_3c3d_1m2s_etcd.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Setting pssh path +Successfully set core path. +Distributing package. +Begin to distribute package to tool path. +Successfully distribute package to tool path. +Begin to distribute package to package path. +Successfully distribute package to package path. +Successfully distributed package. +Installing the tools in the cluster. +Successfully installed the tools in the cluster. +Checking hostname mapping. +Successfully checked hostname mapping. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Setting SCTP service. +Successfully set SCTP service. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Preparing SSH service. +Successfully prepared SSH service. +Setting user environmental variables. +Successfully set user environmental variables. +Configuring alarms on the cluster nodes. +Successfully configured alarms on the cluster nodes. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting pssh path +Successfully set pssh path. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +Successfully set ARM Optimization. +Preinstalling secbox. +Successfully installed secbox. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +**示例二:**使用gs\_upgradectl脚本执行升级。 + +``` +gs_upgradectl -t auto-upgrade -X /data/xml/3node_3c3d_1m2s_etcd.xml +Static configuration matched with old static configuration files. +Performing inplace rollback. +Rollback succeeded. +Checking upgrade environment. +Successfully checked upgrade environment. +Successfully checked upgrade environment. +Successfully started cluster. +Start to do health check. +Successfully checked cluster status. +Backing up current application and configurations. +Successfully backed up current application and configurations. +Stopping the cluster. +Successfully stopped cluster. +Backing up cluster configuration. +Successfully backup hotpatch config file. +Successfully backed up cluster configuration. +Installing new binary. +Restoring cluster configuration. +Successfully restored cluster configuration. +Modifying the socket path. +Successfully modified socket path. +Switch symbolic link to new binary directory. +Successfully switch symbolic link to new binary directory. +Successfully started cluster. +Start to do health check. +Successfully checked cluster status. +Upgrade main process has been finished, user can do some check now. +Once the check done, please execute following command to commit upgrade: + + gs_upgradectl -t commit-upgrade -X /data/xml/3node_3c3d_1m2s_etcd.xml +``` + +**示例三:**使用gs\_upgradectl脚本执行自动回滚,撤销已经成功/失败的升级操作(升级回滚)。 + +``` +gs_upgradectl -t auto-rollback -X /data/xml/3node_3c3d_1m2s_etcd.xml +Static configuration matched with old static configuration files. +Performing inplace rollback. +Checking static configuration files. +Successfully checked static configuration files. +Restoring cluster configuration. +Successfully rollback hotpatch config file. +Successfully restored cluster configuration. +Switch symbolic link to old binary directory. +Successfully switch symbolic link to old binary directory. +Stopping the cluster. +Successfully stopped cluster. +Restoring application and configurations. +Successfully restored application and configuration. +Restoring cluster configuration. +Successfully rollback hotpatch config file. +Successfully restored cluster configuration. +Successfully started cluster. +Successfully cleaned new install path. +Rollback succeeded. +``` + +**示例四:**使用gs\_upgradectl脚本执行就地升级后提交(升级提交)。 + +``` +gs_upgradectl -t auto-commit -X /data/xml/3node_3c3d_1m2s_etcd.xml +Old cluster app path is /data/gauss/app_e67b8bcd +Successfully Cleaned old install path. +Commit binary upgrade succeeded. +``` + diff --git a/content/zh/docs/Toolreference/gsql.md b/content/zh/docs/Toolreference/gsql.md new file mode 100644 index 000000000..4b39d5e6d --- /dev/null +++ b/content/zh/docs/Toolreference/gsql.md @@ -0,0 +1,17 @@ +# gsql + +gsql是openGauss提供在命令行下运行的数据库连接工具,可以通过此工具连接服务器并对其进行操作和维护,除了具备操作数据库的基本功能,gsql还提供了若干[高级特性](gsql概述.md#zh-cn_topic_0237152142_zh-cn_topic_0059778819_s999ec23443d04c7ab199c53189744b58),便于用户使用。 + +- **[gsql概述](gsql概述.md)** + +- **[使用指导](使用指导.md)** + +- **[获取帮助](获取帮助.md)** + +- **[命令参考](命令参考.md)** + +- **[元命令参考](元命令参考.md)** + +- **[常见问题处理](常见问题处理.md)** + + diff --git "a/content/zh/docs/Toolreference/gsql\346\246\202\350\277\260.md" "b/content/zh/docs/Toolreference/gsql\346\246\202\350\277\260.md" new file mode 100644 index 000000000..1f98d82ff --- /dev/null +++ "b/content/zh/docs/Toolreference/gsql\346\246\202\350\277\260.md" @@ -0,0 +1,444 @@ +# gsql概述 + +## 基本功能 + +- **连接数据库:**默认只支持从服务器本机连接,如果需要连接到远端的数据库,必须在服务端进行配置。 详细操作请参见《开发者指南》中“数据库使用 \> 连接数据库 \> 使用gsql连接 \> 远程连接数据库”章节。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >gsql创建连接时,会有5分钟超时时间。如果在这个时间内,数据库未正确地接受连接并对身份进行认证,gsql将超时退出。 + >针对此问题,可以参考[常见问题处理](常见问题处理.md#ZH-CN_TOPIC_0242223664)。 + +- **执行SQL语句:**支持交互式地键入并执行SQL语句,也可以执行一个文件中指定的SQL语句。 +- **执行元命令:**元命令可以帮助管理员查看数据库对象的信息、查询缓存区信息、格式化SQL输出结果,以及连接到新的数据库等。元命令的详细说明请参见[元命令参考](元命令参考.md)。 + +## 高级特性 + +gsql的高级特性如[表1](#zh-cn_topic_0237152142_zh-cn_topic_0059778819_t88d6eef25b234de4b4b0f7854aafa35d)所示。 + +**表 1** gsql高级特性 + + + + + + + + + + + + + + + + + + + +

特性名称

+

描述

+

变量

+

gsql提供类似于Linux的shell命令的变量特性,可以使用gsql的元命令\set设置一个变量,格式如下:

+
\set varname value
+

要删除一个变量请使用如下方式:

+
\unset varname
+
说明:
  • 变量只是简单的名称/值对,这里的值可以是任意长度。
  • 变量名称必须由字母(包括非拉丁字母)、数字和下划线组成,且对大小写敏感。
  • 如果使用\set varname的格式(不带第二个参数),则只是设置这个变量而没有给变量赋值。
  • 可以使用不带参数的\set来显示所有变量的值。
+
+

变量的示例和详细说明请参见变量

+

SQL代换

+

利用gsql的变量特性,可以将常用的SQL语句设置为变量,以简化操作。

+

SQL代换的示例和详细说明请参见SQL代换

+

自定义提示符

+

gsql使用的提示符支持用户自定义。可以通过修改gsql预留的三个变量PROMPT1、PROMPT2、PROMPT3来改变提示符。

+

这三个变量的值可以用户自定义,也可以使用gsql预定义的值。详细请参见提示符

+

客户端操作历史记录

+

gsql支持客户端操作历史记录,当客户端连接时指定“-r”参数,此功能被打开。可以通过\set设置记录历史的条数,例如,\set HISTSIZE 50,将记录历史的条数设置为50,\set HISTSIZE 0,不记录历史。

+
说明:
  • 客户端操作历史记录条数默认设置为32条,最多支持记录500条。当客户端交互式输入包含中文字符时,只支持UTF-8 的编码环境。
  • 出于安全考虑,将包含PASSWORD、IDENTIFIED敏感词的记录识别为敏感信息,不会记录到历史信息中,即不能通过上下翻回显。
+
+
+ +- 变量 + + 可以使用gsql元命令\\set设置一个变量。例如把变量foo的值设置为bar: + + ``` + postgres=# \set foo bar + ``` + + 要引用变量的值,在变量前面加冒号。例如查看变量的值: + + ``` + postgres=# \echo :foo + bar + ``` + + 这种变量的引用方法适用于规则的SQL语句和元命令。 + + gsql预定义了一些特殊变量,同时也规划了变量的取值。为了保证和后续版本最大限度地兼容,请避免以其他目的使用这些变量。所有特殊变量见[表2](#zh-cn_topic_0237152142_zh-cn_topic_0059778819_zh-cn_topic_0058968129_table45814285)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 所有特殊变量都由大写字母、数字和下划线组成。 + >- 要查看特殊变量的默认值,请使用元命令**\\echo :**_varname_(例如\\echo :DBNAME)。 + + **表 2** 特殊变量设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

变量

+

设置方法

+

变量说明

+

DBNAME

+
\set DBNAME dbname
+

当前连接的数据库的名称。每次连接数据库时都会被重新设置。

+

ECHO

+
\set ECHO all | queries
+
  • 如果设置为all,只显示查询信息。设置为all等效于使用gsql连接数据库时指定-a参数。
  • 如果设置为queries,显示命令行和查询信息。等效于使用gsql连接数据库时指定-e参数。
+

ECHO_HIDDEN

+
\set ECHO_HIDDEN  on | off | noexec
+

当使用元命令查询数据库信息(例如\dg)时,此变量的取值决定了查询的行为:

+
  • 设置为on,先显示元命令实际调用的查询语句,然后显示查询结果。等效于使用gsql连接数据库时指定-E参数。
  • 设置为off,则只显示查询结果。
  • 设置为noexec,则只显示查询信息,不执行查询操作。
+

ENCODING

+
\set ENCODING   encoding
+

当前客户端的字符集编码。

+

FETCH_COUNT

+
\set FETCH_COUNT variable
+
  • 如果该变量的值为大于0的整数,假设为n,则执行SELECT语句时每次从结果集中取n行到缓存并显示到屏幕。
  • 如果不设置此变量,或设置的值小于等于0,则执行SELECT语句时一次性把结果都取到缓存。
+
说明:

设置合理的变量值,将减少内存使用量。一般来说,设为100到1000之间的值比较合理。

+
+

HISTCONTROL

+
\set HISTCONTROL  ignorespace | ignoredups | ignoreboth | none
+
  • ignorespace:以空格开始的行将不会写入历史列表。
  • ignoredups:与以前历史记录里匹配的行不会写入历史记录。
  • ignoreboth、none或者其他值:所有以交互模式读入的行都被保存到历史列表。
    说明:

    none表示不设置HISTCONTROL。

    +
    +
+

HISTFILE

+
\set HISTFILE filename
+

此文件用于存储历史名列表。缺省值是~/.bash_history。

+

HISTSIZE

+
\set HISTSIZE size
+

保存在历史命令里命令的个数。缺省值是500。

+

HOST

+
\set HOST hostname
+

已连接的数据库主机名称。

+

IGNOREEOF

+
\set IGNOREEOF variable
+
  • 若设置此变量为数值,假设为10,则在gsql中输入的前9次EOF字符(通常是Ctrl+C组合键)都会被忽略,在第10次按Ctrl+C才能退出gsql程序。
  • 若设置此变量为非数值,则缺省为10。
  • 若删除此变量,则向交互的gsql会话发送一个EOF终止应用。
+

LASTOID

+
\set LASTOID oid
+

最后影响的oid值,即为从一条INSERT或lo_import命令返回的值。此变量只保证在下一条SQL语句的结果显示之前有效。

+

ON_ERROR_ROLLBACK

+
\set  ON_ERROR_ROLLBACK  on | interactive | off
+
  • 如果是on,当一个事务块里的语句产生错误的时候,这个错误将被忽略而事务继续。
  • 如果是interactive,这样的错误只是在交互的会话里忽略。
  • 如果是off(缺省),事务块里一个语句生成的错误将会回滚整个事务。on_error_rollback-on模式是通过在一个事务块的每个命令前隐含地发出一个SAVEPOINT的方式工作的,在发生错误的时候回滚到该事务块。
+

ON_ERROR_STOP

+
\set ON_ERROR_STOP on | off
+
  • on:命令执行错误时会立即停止,在交互模式下,gsql会立即返回已执行命令的结果。
  • off(缺省):命令执行错误时将会跳过错误继续执行。
+

PORT

+
\set PORT port
+

正连接数据库的端口号。

+

USER

+
\set USER username
+

当前用于连接的数据库用户。

+

VERBOSITY

+
\set VERBOSITY   terse | default | verbose
+

这个选项可以设置为值terse、default、verbose之一以控制错误报告的冗余行。

+
  • terse:仅返回严重且主要的错误文本以及文本位置(一般适合于单行错误信息)。
  • default:返回严重且主要的错误文本及其位置,还包括详细的错误细节、错误提示(可能会跨越多行)。
  • verbose:返回所有的错误信息。
+
+ + +- SQL代换 + + 像元命令的参数一样,gsql变量的一个关键特性是可以把gsql变量替换成正规的SQL语句。此外,gsql还提供为变量更换新的别名或其他标识符等功能。使用SQL代换方式替换一个变量的值可在变量前加冒号。例如: + + ``` + postgres=# \set foo 'HR.areaS' + postgres=# select * from :foo; + area_id | area_name + ---------+------------------------ + 4 | Middle East and Africa + 3 | Asia + 1 | Europe + 2 | Americas + (4 rows) + ``` + + 执行以上命令,将会查询HR.areaS表。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >变量的值是逐字复制的,甚至可以包含不对称的引号或反斜杠命令。所以必须保证输入的内容有意义。 + + +- 提示符 + + 通过[表3](#zh-cn_topic_0237152142_zh-cn_topic_0059778819_tfd36c27a76294b92ad194d20beeaac7f)的三个变量可以设置gsql的提示符,这些变量是由字符和特殊的转义字符所组成。 + + **表 3** 提示符变量 + + + + + + + + + + + + + + + + + + + + +

变量

+

描述

+

示例

+

PROMPT1

+

gsql请求一个新命令时使用的正常提示符。

+

PROMPT1的默认值为:

+
%/%R%#
+

使用变量PROMPT1切换提示符:

+
  • 提示符变为[local]:
    postgres=> \set PROMPT1 %M
    +    [local:/tmp/gaussdba_mppdb]
    +
  • 提示符变为name:
    postgres=> \set PROMPT1 name
    +    name
    +
  • 提示符变为=:
    postgres=> \set PROMPT1 %R
    +    =
    +
+

PROMPT2

+

在一个命令输入期待更多输入时(例如,查询没有用一个分号结束或者引号不完整)显示的提示符。

+

使用变量PROMPT2显示提示符:

+
postgres=# \set PROMPT2 TEST
+    postgres=# select * from HR.areaS TEST;
+     area_id |       area_name    
+    ---------+--------------------
+           1 | Europe
+           2 | Americas
+           4 | Middle East and Africa
+           3 | Asia
+    (4 rows))
+

PROMPT3

+

当执行COPY命令,并期望在终端输入数据时(例如,COPY FROM STDIN),显示提示符。

+

使用变量PROMPT3显示COPY提示符:

+
postgres=#  \set PROMPT3 '>>>>'
+    postgres=#  copy HR.areaS from STDIN;
+    Enter data to be copied followed by a newline.
+    End with a backslash and a period on a line by itself.
+    >>>>1 aa
+    >>>>2 bb
+    >>>>\.
+
+ + 提示符变量的值是按实际字符显示的,但是,当设置提示符的命令中出现“%”时,变量的值根据“%”后的字符,替换为已定义的内容,已定义的提示符请参见[表4](#zh-cn_topic_0237152142_zh-cn_topic_0059778819_zh-cn_topic_0058968129_table55443487)。 + + **表 4** 已定义的替换 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

符号

+

符号说明

+

%M

+

主机的全名(包含域名),若连接是通过Unix域套接字进行的,则全名为[local],若Unix域套接字不是编译的缺省位置,就是[local:/dir/name]。

+

%m

+

主机名删去第一个点后面的部分。若通过Unix域套接字连接,则为[local]。

+

%>

+

主机正在侦听的端口号。

+

%n

+

数据库会话的用户名。

+

%/

+

当前数据库名称。

+

%~

+

类似 %/,如果数据库是缺省数据库时输出的是波浪线~。

+

%#

+

如果会话用户是数据库系统管理员,使用#,否则用>。

+

%R

+
  • 对于PROMPT1通常是“=”,如果是单行模式则是“^”,如果会话与数据库断开(如果\connect失败可能发生)则是“!”。
  • 对于PROMPT2该序列被“ -”、“ *”、单引号、双引号或“$”(取决于gsql是否等待更多的输入:查询没有终止、正在一个 /* ... */ 注释里、正在引号或者美元符扩展里)代替。
+

%x

+

事务状态:

+
  • 如果不在事务块里,则是一个空字符串。
  • 如果在事务块里,则是“*”。
  • 如果在一个失败的事务块里则是“!”。
  • 如果无法判断事务状态时为“?”(比如没有连接)。
+

%digits

+

指定字节值的字符将被替换到该位置。

+

%:name

+

gsql变量“name”的值。

+

%command

+

command的输出,类似于使用“^”替换。

+

%[ . . . %]

+

提示可以包含终端控制字符,这些字符可以改变颜色、背景、提示文本的风格、终端窗口的标题。例如,

+

potgres=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%#'

+

这个句式的结果是在VT100兼容的可显示彩色的终端上的一个宽体(1;)黑底黄字(33;40)。

+
+ + +## 环境变量 + +**表 5** 与gsql相关的环境变量 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

COLUMNS

+

如果\set columns为0,则由此参数控制wrapped格式的宽度。这个宽度用于决定在自动扩展的模式下,是否要把宽输出模式变成竖线的格式。

+

PAGER

+

如果查询结果无法在一页显示,它们就会被重定向到这个命令。可以用\pset命令关闭分页器。典型的是用命令more或less来实现逐页查看。缺省值是平台相关的。

+
说明:

less的文本显示,受系统环境变量LC_CTYPE影响。

+
+

PSQL_EDITOR

+

\e和\ef命令使用环境变量指定的编辑器。变量是按照列出的先后顺序检查的。在Unix系统上默认的编辑工具是vi。

+

EDITOR

+

VISUAL

+

PSQL_EDITOR_LINENUMBER_ARG

+
当\e和\ef带上一行数字参数使用时,这个变量指定的命令行参数用于向编辑器传递起始行数。像Emacs或vi这样的编辑器,这只是个加号。如果选项和行号之间需要空白,在变量的值后加一个空格。例如:
PSQL_EDITOR_LINENUMBER_ARG = '+'  
+PSQL_EDITOR_LINENUMBER_ARG='--line '
+
+

Unix系统默认的是+。

+

PSQLRC

+

用户的.gsqlrc文件的交互位置。

+

SHELL

+

使用\!命令跟shell执行的命令是一样的效果。

+

TMPDIR

+

存储临时文件的目录。缺省是/tmp。

+
+ diff --git a/content/zh/docs/Toolreference/gstrace.md b/content/zh/docs/Toolreference/gstrace.md new file mode 100644 index 000000000..f9352e322 --- /dev/null +++ b/content/zh/docs/Toolreference/gstrace.md @@ -0,0 +1,158 @@ +# gstrace + +## 功能介绍 + +gstrace是openGauss提供的用来跟踪内核代码执行路径,记录内核数据结构,分析代码性能的工具。Trace的有限点位和数据在版本中被固化,无法动态添加和删除。 + +>![](public_sys-resources/icon-warning.gif) **警告:** +>1. 对内核dump指定内存变量的数据用于诊断分析,不存在直接指定任意寄存器或者内存地址的行为。读取的内存地址均是在开发阶段硬编码,没有任意地读取或者修改寄存器或内存的操作。 +>2. Trace点可能涉及敏感数据,收集trace信息前需要同用户协商,授权和许可后方可收集。 +>3. openGauss不会在敏感信息上打点,不会TRACE和用户相关的数据。 +>4. Trace仅用于诊断目的,开启trace将对性能产生一定影响,影响的大小视负载的高低,trace的模块而不同。 +>5. Trace工具的权限为0700,仅限于数据库用户读、写和执行。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果进程异常终止,/dev/shm/ 目录下将会有gstrace\_trace\_cfg\_\*残留,可以手动清除。 + +## 语法 + +``` +gstrace [start|stop|config|dump|detailcodepath|analyze] [-p ] [-m ] [-s ] [-f ] [-o ] [-t ] +``` + +## 参数说明 + +**表 1** gs\_trace参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

start

+

开始记录trace

+

stop

+

停止trace,释放存储信息的共享内存trace buffer。注意:trace buffer中已捕获trace信息会丢失。

+

config

+

显示trace的配置信息

+

dump

+

将共享内存中的trace信息写入指定文件。若没有启动trace将报错。

+

detail

+

将dump出来的二进制文件解析成文本文件,显示trace点的线程、时间信息。

+

codepath

+

提取dump文件中的函数调用信息,按照调用栈的方式显示。

+

analyze

+

统计各个函数的执行次数、总耗时、平均耗时、最长耗时、最短耗时

+

-p PID

+

指定启动trace功能的实例进程号

+

-f DUMP_FILE

+

指定dump导出的trace文件

+

-o OUTPUT_FILE

+

指定写入的文件

+

-t STEP_SIZE

+

指定分片分析的时间跨度(秒),可选。将生成单独的{OUTPUT_FILE}.step文件。

+

-m MASK

+

指定哪些模块、函数需要追踪,如果参数为空,则追踪添加trace接口的所有模块的所有函数。

+

格式::[comp…][ALL].[func…][ALL]

+

描述:

+
  1. comp 是模块列表,使用‘,’分隔,例如:executer,opengauss。也可以使用序号,例如:executer,2
  2. func 是function列表,使用‘,’ 分隔。 例如:sql_execute_ddl, sql_execute_dcl。也可以使用序号指代模块中第几个function,例如:2
  3. 设置成ALL表示所有模块或所有function被trace。
+

示例:

+
  1. executer,opengauss.ALL :所有定义定义在executer和opengauss模块下的function被trace。
  2. executer,opengauss.sql_execute_ddl :定义在executer 下的Function sql_execute_ddl被trace. opengauss模块被忽略,因为下面没有该function 。
  3. executer,opengauss.1 :定义在模块executer和 opengauss 下的第一个function被trace。
+

ALL.1,2 :定义在所有模块下的第一,二个function被trace。

+

-s BUFFER_SIZE

+

指定用于trace功能的共享内存大小,默认为1G,该值需要为2的倍数,如果不是则会补齐为2的倍数。

+
+ +## 示例 + +1. 启动trace + + ``` + gstrace start -p 207787 + ``` + +2. 停止trace + + ``` + gstarce stop -p 207787 + ``` + +3. 查看trace配置 + + ``` + gstrace config -p 207787 + ``` + +4. dump trace + + ``` + gstrace dump -p 207787 -o /data/207787.dump + ``` + +5. 解析dump detail信息 + + ``` + gstrace detail -f /data/207787.dump -o /data/207787.detail + ``` + +6. 解析dump codepath + + ``` + gstrace codepath -f /data/207787.dump -o /data/207787.codepath + ``` + +7. 分析全局性能 + + ``` + gstrace analyze -f /data/207787.dump -o /data/207787.perf + ``` + +8. 分析分片性能 + + ``` + gstrace analyze -f /data/207787.dump -o /data/207787.perf -t 1 + ``` + + diff --git a/content/zh/docs/Toolreference/kadmin-local.md b/content/zh/docs/Toolreference/kadmin-local.md new file mode 100644 index 000000000..75232cad0 --- /dev/null +++ b/content/zh/docs/Toolreference/kadmin-local.md @@ -0,0 +1,10 @@ +# kadmin.local + +## 功能介绍 + +为openGauss认证服务Kerberos提供命令行接口, 直接接入kdc服务的数据库, 进行增加、删除、修改Kerberos用户等操作。 + +## 参数说明 + +Kerberos工具为开源第三方提供,具体参数说明请参考Kerberos官方文档:[https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin\_commands/index.html](https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin_commands/index.html) + diff --git a/content/zh/docs/Toolreference/kdb5_util.md b/content/zh/docs/Toolreference/kdb5_util.md new file mode 100644 index 000000000..b239724f6 --- /dev/null +++ b/content/zh/docs/Toolreference/kdb5_util.md @@ -0,0 +1,10 @@ +# kdb5\_util + +## 功能介绍 + +为openGauss认证服务Kerberos提供数据库管理操作的工具, 可以新建、销毁、导入和导出数据库。 + +## 参数说明 + +Kerberos工具为开源第三方提供,具体参数说明请参考Kerberos官方文档:[https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin\_commands/index.html](https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin_commands/index.html) + diff --git a/content/zh/docs/Toolreference/kdestroy.md b/content/zh/docs/Toolreference/kdestroy.md new file mode 100644 index 000000000..c23111735 --- /dev/null +++ b/content/zh/docs/Toolreference/kdestroy.md @@ -0,0 +1,10 @@ +# kdestroy + +## 功能介绍 + +为openGauss认证服务Kerberos提供销毁用户的授权票据操作。 + +## 参数说明 + +Kerberos工具为开源第三方提供,具体参数说明请参考Kerberos官方文档:[https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin\_commands/index.html](https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin_commands/index.html) + diff --git a/content/zh/docs/Toolreference/kinit.md b/content/zh/docs/Toolreference/kinit.md new file mode 100644 index 000000000..3bc3f4da3 --- /dev/null +++ b/content/zh/docs/Toolreference/kinit.md @@ -0,0 +1,10 @@ +# kinit + +## 功能介绍 + +为openGauss认证服务Kerberos提供特定用户获取和缓存TGT能力。 + +## 参数说明 + +Kerberos工具为开源第三方提供,具体参数说明请参考Kerberos官方文档:[https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin\_commands/index.html](https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin_commands/index.html) + diff --git a/content/zh/docs/Toolreference/klist.md b/content/zh/docs/Toolreference/klist.md new file mode 100644 index 000000000..8bf8b3a84 --- /dev/null +++ b/content/zh/docs/Toolreference/klist.md @@ -0,0 +1,10 @@ +# klist + +## 功能介绍 + +为openGauss认证服务Kerberos提供列出凭证缓存中的用户和票据能力。 + +## 参数说明 + +Kerberos工具为开源第三方提供,具体参数说明请参考Kerberos官方文档:[https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin\_commands/index.html](https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin_commands/index.html) + diff --git a/content/zh/docs/Toolreference/krb5kdc.md b/content/zh/docs/Toolreference/krb5kdc.md new file mode 100644 index 000000000..1779a9154 --- /dev/null +++ b/content/zh/docs/Toolreference/krb5kdc.md @@ -0,0 +1,10 @@ +# krb5kdc + +## 功能介绍 + +为openGauss认证服务Kerberos提供列认证和秘钥管理服务。 + +## 参数说明 + +Kerberos工具为开源第三方提供,具体参数说明请参考Kerberos官方文档:[https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin\_commands/index.html](https://web.mit.edu/kerberos/krb5-1.17/doc/admin/admin_commands/index.html) + diff --git a/content/zh/docs/Toolreference/pg_config.md b/content/zh/docs/Toolreference/pg_config.md new file mode 100644 index 000000000..716a9c07a --- /dev/null +++ b/content/zh/docs/Toolreference/pg_config.md @@ -0,0 +1,136 @@ +# pg\_config + +## 功能介绍 + +通过pg\_config工具打印的当前所安装数据库的配置参数信息,可用于找到与数据库相连接的软件包所对应的头文件和库。 + +## 语法 + +``` +pg_config [option...] +``` + +## 参数说明 + +pg\_config工具支持下面一个或多个选项,如果给出多于一个选项,那么信息以该顺序打印,每行一条。 如果没有给出选项,则打印所有可获得的信息,连着标签一起打印。 + +- --bindir + + 打印用户可执行文件的路径。 比如,可以用这个找psql程序。 通常这也是pg\_config程序存在的路径。 + + +- --docdir + + 打印文档文件的位置。 + + +- --htmldir + + 输出HTML文档文件的位置。 + + +- --includedir + + 打印客户端接口C头文件的路径。 + + +- --pkgincludedir + + 打印其它C头文件的位置。 + + +- --includedir-server + + 打印那些做服务器编程时使用的C头文件的位置。 + + +- --libdir + + 打印目标代码库的路径。 + + +- --pkglibdir + + 打印动态加载的模块的位置,或者服务器在哪里寻找他们。 其它体系相关的数据文件可能也放在这个目录里。 + + +- --localedir + + 打印区域支持文件的位置。如果在编译数据库的时候没有配置区域支持, 则其值为空字符串。 + + +- --mandir + + 打印手册页的位置。 + + +- --sharedir + + 打印体系无关的支持文件的位置。 + + +- --sysconfdir + + 打印系统范围的配置文件位置。 + + +- --pgxs + + 打印扩展makefiles文件的位置。 + + +- --configure + + 打印配置和编译数据库时给configure脚本传递的选项, 用于复制相同配置, 或者找出二进制包是用哪些选项编译的。 不过请注意二进制包通常包含供应商提供的补丁。 + + +- --cc + + 打印用于编译数据库的CC变量的数值。 这个选项显示使用的C编译器。 + + +- --cppflags + + 打印用于编译数据库的CPPFLAGS变量的数值。 这个选项显示在预处理的时候所需要的C编译器开关\(通常是-I开关\)。 + + +- --cflags + + 打印编译数据库时使用的CFLAGS变量的数值。 这个选项显示C编译器开关。 + + +- --cflags\_sl + + 打印编译数据库时使用的CFLAGS\_SL变量的数值。 这个选项显示了编译共享库的额外的C编译器开关。 + + +- --ldflags + + 打印编译数据库时使用的LDFLAGS变量的数值。 它显示了链接器的开关。 + + +- --ldflags\_ex + + 输出用于创建数据库的LDFLAGS\_EX变量的值。 这显示用于构建可执行文件的链接器开关。 + + +- --ldflags\_sl + + 打印编译数据库时使用的LDFLAGS\_SL变量的数值。 它显示了用于编译共享库的链接器的开关。 + + +- --libs + + 打印编译数据库时使用的LIBS变量的数值。 其内容通常包含连接到数据库的外部库的-l开关。 + + +- --version + + 打印数据库的版本。 + + +- -?, --help + + 显示关于pg\_config命令行参数的帮助文件,并且退出。 + + diff --git a/content/zh/docs/Toolreference/pg_controldata.md b/content/zh/docs/Toolreference/pg_controldata.md new file mode 100644 index 000000000..11b58facc --- /dev/null +++ b/content/zh/docs/Toolreference/pg_controldata.md @@ -0,0 +1,47 @@ +# pg\_controldata + +## 功能介绍 + +pg\_controldata工具用来显示数据库目录下control文件的信息。 + +## 前提条件 + +确保数据目录正确,以及相应数据目录下的pg\_control文件存在。 + +## 语法 + +- 查看control文件信息 + + ``` + pg_controldata [DATADIR] + ``` + +- 显示版本号信息 + + ``` + pg_controldata -V | --version + ``` + +- 显示帮助信息 + + ``` + pg_controldata + -? | --help + ``` + + +## 参数说明 + +- DATADIR + + 查看control文件信息时所用的参数,DATADIR为实例对应的数据库目录。 + +- -V, --version + + 显示版本信息。 + +- -?,--help + + 打印帮助信息。 + + diff --git a/content/zh/docs/Toolreference/pg_resetxlog.md b/content/zh/docs/Toolreference/pg_resetxlog.md new file mode 100644 index 000000000..757fad042 --- /dev/null +++ b/content/zh/docs/Toolreference/pg_resetxlog.md @@ -0,0 +1,65 @@ +# pg\_resetxlog + +## 功能介绍 + +pg\_resetxlog是一个重新设置数据库事务文件的工具。 + +## 前提条件 + +保证数据库目录存在且路径正确。 + +## 语法 + +``` +pg_resetxlog [OPTION]... DATADIR +``` + +## 参数说明 + +OPTION取值如下所示: + +- DATADIR + + 需要修改的数据库目录,确保路径正确。 + +- -e XIDEPOCH + + 设置下一个事务id的时期。 + +- -f + + 强制更新。 + +- -l xlogfile + + 强制指定新事物log对应在xlog文件中的最小点。 + +- -m XID + + 设置下一个multitransaction ID。 + +- -n + + 不更新,仅显示配置文件的值。 + +- -o OID + + 设置下一个OID。 + +- -O OFFSET + + 设置下一个multitransaction的偏移量。 + +- -V, --version + + 显示版本信息。 + +- -x XID + + 设置下一个事务ID。 + +- -?, --help + + 打印帮助信息。 + + diff --git a/content/zh/docs/Toolreference/public_sys-resources/.keep b/content/zh/docs/Toolreference/public_sys-resources/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Toolreference/public_sys-resources/icon-caution.gif b/content/zh/docs/Toolreference/public_sys-resources/icon-caution.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/Toolreference/public_sys-resources/icon-danger.gif b/content/zh/docs/Toolreference/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/Toolreference/public_sys-resources/icon-note.gif b/content/zh/docs/Toolreference/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/Toolreference/public_sys-resources/icon-notice.gif b/content/zh/docs/Toolreference/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/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-0.md" "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-0.md" new file mode 100644 index 000000000..9b56e0552 --- /dev/null +++ "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-0.md" @@ -0,0 +1,27 @@ +# 使用指导 + +## 前提条件 + +需要首先保证数据库状态正常、客户端能够正常连接、且要求数据库内倒入数据,以便调优程序可以执行benchmark测试调优效果;用户需保证当前Python运行环境安装好相应依赖,且能够正常启动调优程序。 + +## 背景信息 + +调优程序是一个独立于数据库内核之外的工具,需要提供数据库及其所在实例的用户名和登录密码信息,以便控制数据库执行benchmark进行性能测试;在启动调优程序前,要求用户测试环境交互正常,能够正常跑通benchmark测试脚本、能够正常连接数据库。 + +## 使用步骤 + +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/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" new file mode 100644 index 000000000..b05804a8f --- /dev/null +++ "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-10.md" @@ -0,0 +1,182 @@ +# 使用指导 + +## 前提条件 + +需要保证openGauss处于正常状态,用户通过身份验证成功登录openGauss;用户执行的SQL语法正确无报错,且不会导致数据库异常等;历史性能数据窗口内openGauss并发量稳定,表结构、表数量不变,数据量无突变,涉及查询性能的guc参数不变;进行预测时,需要保证模型已训练并收敛;AiEngine运行环境稳定。 + +## 证书生成 + +AiEngine进程与内核进程通信需要证书认证,需要使用openssl工具生成双方证书。 + +1. 搭建证书生成环境,证书文件保存路径为$GAUSSHOME/CA: + + --拷贝证书生成脚本及相关文件 + + ``` + cp path_to_predictor/install/ssl.sh $GAUSSHOME/ + cp path_to_predictor/install/ca_ext.txt $GAUSSHOME/ + ``` + + --copy 配置文件openssl.cnf到CA下 + + ``` + cp /etc/openssl + cp openssl.cnf $GAUSSHOME/ + ``` + + --修改openssl.conf配置参数 + + ``` + dir = $GAUSSHOME/CA/demoCA + default_md = sha256 + ``` + + --至此证书生成环境准备完成 + +2. 生成证书及密钥 + + ``` + cd $GAUSSHOME + sh ssl.sh + ``` + + --根据提示设置密码,假如为Test@123: + + --密码要求至少3种不同类型字符,长度至少为8位 + + ``` + Please enter your password: + ``` + + --根据提示输入选项: + + ``` + + Certificate Details: + Serial Number: 1 (0x1) + Validity + Not Before: May 15 08:32:44 2020 GMT + Not After : May 15 08:32:44 2021 GMT + Subject: + countryName = CN + stateOrProvinceName = SZ + organizationName = HW + organizationalUnitName = GS + commonName = CA + X509v3 extensions: + X509v3 Basic Constraints: + CA:TRUE + Certificate is to be certified until May 15 08:32:44 2021 GMT (365 days) + Sign the certificate? [y/n]:y + 1 out of 1 certificate requests certified, commit? [y/n]y + ``` + + --输入拉起AIEngine的IP地址,如IP为127.0.0.1: + + ``` + Please enter your aiEngine IP: 127.0.0.1 + ``` + + --根据提示输入选项: + + ``` + Certificate Details: + Serial Number: 2 (0x2) + Validity + Not Before: May 15 08:38:07 2020 GMT + Not After : May 13 08:38:07 2030 GMT + Subject: + countryName = CN + stateOrProvinceName = SZ + organizationName = HW + organizationalUnitName = GS + commonName = 127.0.0.1 + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Certificate is to be certified until May 13 08:38:07 2030 GMT (3650 days) + Sign the certificate? [y/n]:y + 1 out of 1 certificate requests certified, commit? [y/n]y + ``` + + --输入启动OpenGauss IP地址,如IP为127.0.0.1: + + ``` + Please enter your gaussdb IP: 127.0.0.1 + ``` + + --根据提示输入选项: + + ``` + Certificate Details: + Serial Number: 3 (0x3) + Validity + Not Before: May 15 08:41:46 2020 GMT + Not After : May 13 08:41:46 2030 GMT + Subject: + countryName = CN + stateOrProvinceName = SZ + organizationName = HW + organizationalUnitName = GS + commonName = 127.0.0.1 + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Certificate is to be certified until May 13 08:41:46 2030 GMT (3650 days) + Sign the certificate? [y/n]:y + 1 out of 1 certificate requests certified, commit? [y/n]y + ``` + + --至此,相关证书及密钥已生成,($GAUSSHOME/CA)内容如下: + + ![](figures/zh-cn_image_0245423148.png) + +3. -- + +## 环境准备 + +1. 将工具代码文件夹拷贝至目标环境,代码路径:Code/src/gausskernel/dbmind/predictor。 + + --假设目标环境路径为/home/ai\_user : + + ``` + scp -r predictor ai_user@127.0.0.1:/home/ai_user/ + ``` + +2. 拷贝CA证书文件夹至aiEngine环境中某路径下: + + ``` + cp -r $GAUSSHOME/CA ai_user@127.0.0.1:/home/ai_user/ + ``` + +3. 安装predictor/install/requirements\(-gpu\).txt工具: + + ``` + 有GPU:pip install requirements-gpu.txt + 无GPU:pip install requirements.txt + ``` + + +## 拉起AiEngine + +1. 切换至aiEngine环境(即拷贝predictor的目标环境 ai\_user): + + 设置predictor/python/settings.py 中的相关参数: + + ``` + DEFAULT_FLASK_SERVER_HOST = '127.0.0.1' (aiEngine运行IP地址) + DEFAULT_FLASK_SERVER_PORT = '5000' (aiEngine运行端口号) + PATH_SSL = "/home/ai_user/CA" (CA文件夹绝对路径) + ``` + +2. 运行aiEngine启动脚本: + + ``` + run predictor/python/run.py + ``` + + 此时,aiEngine即在相应端口保持拉起状态,等待内核侧时间预测功能的请求指令。 + + 至此,aiEngine工具部署完成。从内核中发起执行时间预测功能指令步骤,请参考《时间预测使用说明》。 + + 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/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" new file mode 100644 index 000000000..f1c01038f --- /dev/null +++ "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274-5.md" @@ -0,0 +1,75 @@ +# 使用指导 + +## 前提条件 + +首先需要保证用户提供的历史日志及待预测负载格式符合要求,其次为保证预测准确率,用户提供的历史语句日志应尽可能全面并具有代表性。 + +## 背景信息 + +工具目录下提供了示例数据集及演示代码,更加详细的说明与工具所需依赖请参考工具根目录下的Readme文件。 + +## 操作步骤 + +1. 如果这是您第一次使用本工具,您应该提供历史日志以供模型训练,类型为: + + ``` + 执行开始时间 | 执行结束时间 | 锁时间 | 执行等待时间 | 语句文本 + ``` + + 历史日志中每一行的格式如上,其中每两列之间的分隔符为'\\t|\\t',如果某列无法提供,请将其置0。 + +2. 执行训练命令进行训练: + + ``` + python src/main.py train [--train LOG_FILE] [--model MODEL_DIR] + ``` + + - **LOG\_FILE**: 供训练用历史日志的路径。 + + - **MODEL\_DIR**: 训练生成的模型及中间文件存储路径。 + +3. 在进行预测之前,请确保训练过程已经顺利完成。待预测负载需要为文件格式,格式为每行为一条语句。 + + 执行预测命令进行预测: + + ``` + python src/main.py predict [--model MODEL_DIR] [--predict WORKLOAD_FILE] [--ratio RETRAIN_RATIO] + ``` + + - **MODEL\_DIR**: 模型路径,应与训练过程所指定的同名参数值一致。 + + - **WORKLOAD\_FILE**: 待预测负载文件路径。 + + - **RETRAIN\_RATIO**: 推荐模型重训的阈值。 默认值为0.5,代表如果未训练元素数量达到已训练元素数量的0.5倍时,工具会提示您建议重新训练模型,使您的预测结果更加精准。在出现此提示时,不会影响该次预测。 + + - 预测结果为一个float类型的列表 ,其中第n个值代表了待预测负载第n行语句的预测执行时间。该结果会显示在您的屏幕上,且被返回。 + + + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果您希望同时训练并预测,工具提供了快速启动方式命令: +>``` +>python src/main.py all [--train LOG_FILE] [--model MODEL_DIR] [--predict WORKLOAD_FILE] [--ratio RETRAIN_RATIO] +>``` +>各个参数含义与分别执行时一致。 + +## 示例 + +使用工具提供的demo数据进行训练: + +``` +python src/main.py train --train test/data/train.csv --model test/data/ +``` + +使用工具提供的demo数据进行预测: + +``` +python src/main.py predict --model test/data/ --predict test/data/test.csv --ratio 0.2 +``` + +快速启动: + +``` +python src/main.py all --train test/data/train.csv --model test/data/ --predict test/data/test.csv --ratio 0.2 +``` + diff --git "a/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274.md" new file mode 100644 index 000000000..58b58b02a --- /dev/null +++ "b/content/zh/docs/Toolreference/\344\275\277\347\224\250\346\214\207\345\257\274.md" @@ -0,0 +1,186 @@ +# 使用指导 + +## 前提条件 + +连接数据库时使用的用户需要具备访问数据库的权限。 + +## 背景信息 + +使用gsql命令可以连接本机的数据库服务,也可以连接远程数据库服务。连接远程数据库服务时,需要在服务器上设置允许远程连接,详细操作请参见《开发者指南》中“数据库使用 \> 连接数据库 \> 使用gsql连接 \> 远程连接数据库”章节。 + +## 操作步骤 + +1. 使用gsql连接到openGauss服务器。 + + gsql工具使用-d参数指定目标数据库名、-U参数指定数据库用户名、-h参数指定主机名、-p参数指定端口号信息。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >若未指定数据库名称,则使用初始化时默认生成的数据库名称;若未指定数据库用户名,则默认使用当前操作系统用户作为数据库用户名;当某个值没有前面的参数(-d、-U等)时,若连接的命令中没有指定数据库名(-d)则该参数会被解释成数据库名;如果已经指定数据库名(-d)而没有指定数据库用户名(-U)时,该参数则会被解释成数据库用户名。 + + 示例1,使用omm用户连接到本机postgres数据库的8000端口。 + + ``` + gsql -d postgres -p 8000 + ``` + + 示例2,使用jack用户连接到远程主机postgres数据库的8000端口。 + + ``` + gsql -h 10.180.123.163 -d postgres -U jack -p 8000 + ``` + + 示例3,参数postgres和omm不属于任何选项时,分别被解释成了数据库名和用户名。 + + ``` + gsql postgres omm -p 8000 + ``` + + **等效于** + + ``` + gsql -d postgres -U omm -p 8000 + ``` + + 详细的gsql参数请参见[命令参考](命令参考.md#ZH-CN_TOPIC_0242223662)。 + +2. 执行SQL语句。 + + 以创建数据库human\_staff为例。 + + ``` + CREATE DATABASE human_staff; + CREATE DATABASE + ``` + + 通常,输入的命令行在遇到分号的时候结束。如果输入的命令行没有错误,结果就会输出到屏幕上。 + +3. 执行gsql元命令。 + + 以列出openGauss中所有的数据库和描述信息为例。 + + ``` + postgres=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges + ----------------+----------+-----------+---------+-------+----------------------- + human_resource | omm | SQL_ASCII | C | C | + postgres | omm | SQL_ASCII | C | C | + template0 | omm | SQL_ASCII | C | C | =c/omm + + | | | | | omm=CTc/omm + template1 | omm | SQL_ASCII | C | C | =c/omm + + | | | | | omm=CTc/omm + human_staff | omm | SQL_ASCII | C | C | + (5 rows) + ``` + + 更多gsql元命令请参见[元命令参考](元命令参考.md)。 + + +## 示例 + +以把一个查询分成多行输入为例。注意提示符的变化: + +``` +postgres=# CREATE TABLE HR.areaS( +postgres(# area_ID NUMBER, +postgres(# area_NAME VARCHAR2(25) +postgres-# )tablespace EXAMPLE; +CREATE TABLE +``` + +查看表的定义: + +``` +postgres=# \d HR.areaS + Table "hr.areas" + Column | Type | Modifiers +-----------+-----------------------+----------- + area_id | numeric | not null + area_name | character varying(25) | +``` + +向HR.areaS表插入四行数据: + +``` +postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (1, 'Europe'); +INSERT 0 1 +postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (2, 'Americas'); +INSERT 0 1 +postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (3, 'Asia'); +INSERT 0 1 +postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (4, 'Middle East and Africa'); +INSERT 0 1 +``` + +切换提示符: + +``` +postgres=# \set PROMPT1 '%n@%m %~%R%#' +omm@[local] postgres=# +``` + +查看表: + +``` +omm@[local] postgres=#SELECT * FROM HR.areaS; + area_id | area_name +---------+------------------------ + 1 | Europe + 4 | Middle East and Africa + 2 | Americas + 3 | Asia +(4 rows) +``` + +可以用\\pset命令以不同的方法显示表: + +``` +omm@[local] postgres=#\pset border 2 +Border style is 2. +omm@[local] postgres=#SELECT * FROM HR.areaS; ++---------+------------------------+ +| area_id | area_name | ++---------+------------------------+ +| 1 | Europe | +| 2 | Americas | +| 3 | Asia | +| 4 | Middle East and Africa | ++---------+------------------------+ +(4 rows) +``` + +``` +omm@[local] postgres=#\pset border 0 +Border style is 0. +omm@[local] postgres=#SELECT * FROM HR.areaS; +area_id area_name +------- ---------------------- + 1 Europe + 2 Americas + 3 Asia + 4 Middle East and Africa +(4 rows) +``` + +使用元命令: + +``` +omm@[local] postgres=#\a \t \x +Output format is unaligned. +Showing only tuples. +Expanded display is on. +omm@[local] postgres=#SELECT * FROM HR.areaS; +area_id|2 +area_name|Americas + +area_id|1 +area_name|Europe + +area_id|4 +area_name|Middle East and Africa + +area_id|3 +area_name|Asia +omm@[local] postgres=# +``` + diff --git "a/content/zh/docs/Toolreference/\345\205\203\345\221\275\344\273\244\345\217\202\350\200\203.md" "b/content/zh/docs/Toolreference/\345\205\203\345\221\275\344\273\244\345\217\202\350\200\203.md" new file mode 100644 index 000000000..1a9572b09 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\205\203\345\221\275\344\273\244\345\217\202\350\200\203.md" @@ -0,0 +1,988 @@ +# 元命令参考 + +介绍使用openGauss数据库命令行交互工具登录数据库后,gsql所提供的元命令。所谓元命令就是在gsql里输入的任何以不带引号的反斜杠开头的命令。 + +## 注意事项 + +- 一个gsql元命令的格式是反斜杠后面紧跟一个动词,然后是任意参数。参数命令动词和其他参数以任意个空白字符间隔。 +- 要在参数里面包含空白,必须用单引号把它引起来。要在这样的参数里包含单引号,可以在前面加一个反斜杠。任何包含在单引号里的内容都会被进一步进行类似C语言的替换:\\n(新行)、\\t(制表符)、\\b(退格)、\\r(回车)、\\f(换页)、\\digits(八进制表示的字符)、\\xdigits(十六进制表示的字符)。 +- 用""包围的内容被当做一个命令行传入shell。该命令的输出(删除了结尾的新行)被当做参数值。 +- 如果不带引号的参数以冒号(:)开头,它会被当做一个gsql变量,并且该变量的值最终会成为真正的参数值。 +- 有些命令以一个SQL标识的名称(比如一个表)为参数。这些参数遵循SQL语法关于双引号的规则:不带双引号的标识强制转换成小写,而双引号保护字母不进行大小写转换,并且允许在标识符中使用空白。在双引号中,成对的双引号在结果名称中分析成一个双引号。比如,FOO"BAR"BAZ解析成fooBARbaz;而"Aweird""name"解析成A weird"name。 +- 对参数的分析在遇到另一个不带引号的反斜杠时停止。这里会认为是一个新的元命令的开始。特殊的双反斜杠序列(\\\\)标识参数的结尾并将继续分析后面的SQL语句(如果存在)。这样SQL和gsql命令可以自由的在一行里面混合。但是在任何情况下,一条元命令的参数不能延续超过行尾。 + +## 元命令 + +元命令的详细说明请参见[表1](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table23103470)、[表2](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table8624338)、[表3](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table62130565)、[表4](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table44907299)、[表6](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table53911699)、[表8](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table37189353)、[表9](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table32146234)、[表10](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table50076468)和[表12](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table55465693)。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>以下命令中所提到的FILE代表文件路径。此路径可以是绝对路径(如/home/gauss/file.txt),也可以是相对路径(file.txt,file.txt会默认在用户执行gsql命令所在的路径下创建)。 + +**表 1** 一般的元命令 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

\copyright

+

显示openGauss的版本和版权信息。

+

-

+

\g [FILE] or ;

+

执行查询(并将结果发送到文件或管道)。

+

-

+

\h(\help) [NAME]

+

给出指定SQL语句的语法帮助。

+

如果没有给出NAME,gsql将列出可获得帮助的所有命令。如果NAME是一个星号(*),则显示所有SQL语句的语法帮助。

+

\parallel [on [num]|off]

+

控制并发执行开关。

+
  • on:打开控制并发执行开关,且最大并发数为num。
  • off:关闭控制并发执行开关。
+
说明:
  • 不支持事务中开启并发执行以及并发中开启事务。
  • 不支持\d这类元命令的并发。
  • 并发select返回结果混乱问题,此为客户可接受,core、进程停止响应不可接受。
  • 不推荐在并发中使用set语句,否则导致结果与预期不一致。
  • 不支持创建临时表!如需使用临时表,需要在开启parallel之前创建好,并在parallel内部使用。parallel内部不允许创建临时表。
  • \parallel执行时最多会启动num个独立的gsql进程连接服务器。
  • \parallel中所有作业的持续时间不能超过session_timeout,否则可能会导致并发执行过程中断连。
+
+

num的默认值:1024。

+
须知:
  • 服务器能接受的最大连接数受max_connection及当前已有连接数限制。
  • 设置num时请考虑服务器当前可接受的实际连接数合理指定。
+
+

\q

+

退出gsql程序。在一个脚本文件里,只在脚本终止的时候执行。

+

-

+
+ +**表 2** 查询缓存区元命令 + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

\e [FILE] [LINE]

+

使用外部编辑器编辑查询缓冲区(或者文件)。

+

\ef [FUNCNAME [LINE]]

+

使用外部编辑器编辑函数定义。如果指定了LINE(即行号),则光标会指到函数体的指定行。

+

\p

+

打印当前查询缓冲区到标准输出。

+

\r

+

重置(或清空)查询缓冲区。

+

\w FILE

+

将当前查询缓冲区输出到文件。

+
+ +**表 3** 输入/输出元命令 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

\copy { table [ ( column_list ) ] | ( query ) } { from | to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] [ delimiter [ as ] 'character' ] [ null [ as ] 'string' ] [ csv [ header ] [ quote [ as ] 'character' ] [ escape [ as ] 'character' ] [ force quote column_list | * ] [ force not null column_list ] ]

+

在任何psql客户端登录数据库成功后可以执行导入导出数据, 这是一个运行SQL COPY命令的操作,但不是读取或写入指定文件的服务器,而是读取或写入文件,并在服务器和本地文件系统之间路由数据。 这意味着文件的可访问性和权限是本地用户的权限,而不是服务器的权限,并且不需要数据库初始化用户权限。

+
说明:

\COPY只适合小批量,格式良好的数据导入,不会对非法字符进行预处理,也无容错能力。导入数据应优先选择COPY。

+
+

\echo [STRING]

+

把字符串写到标准输出。

+

\i FILE

+

从文件FILE中读取内容,并将其当作输入,执行查询。

+

\i+ FILE KEY

+

执行加密文件中的命令。

+

\ir FILE

+

和\i类似,只是相对于存放当前脚本的路径。

+

\ir+ FILE KEY

+

和\i+类似,只是相对于存放当前脚本的路径。

+

\o [FILE]

+

把所有的查询结果发送到文件里。

+

\qecho [STRING]

+

把字符串写到查询结果输出流里。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>[表4](#zh-cn_topic_0237152146_zh-cn_topic_0059778645_zh-cn_topic_0058968158_table44907299)中的选项S表示显示系统对象,+表示显示对象附加的描述信息。[PATTERN](#zh-cn_topic_0237152146_section363084334814)用来指定要被显示的对象名称。 + +**表 4** 显示信息元命令 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

示例

+

\d[S+]

+

列出当前search_path中模式下所有的表、视图和序列。当search_path中不同模式存在同名对象时,只显示search_path中位置靠前模式下的同名对象。

+

-

+

列出当前search_path中模式下所有的表、视图和序列。

+
postgres=# \d
+

\d[S+] NAME

+

列出指定表、视图和索引的结构。

+

-

+

假设存在表a,列出指定表a的结构。

+
postgres=#  \dtable+ a
+

\d+ [PATTERN]

+

列出所有表、视图和索引。

+

如果声明了PATTERN,只显示名称匹配PATTERN的表、视图和索引。

+

列出所有名称以f开头的表、视图和索引。

+
postgres=# \d+ f*
+

\da[S] [PATTERN]

+

列出所有可用的聚集函数,以及它们操作的数据类型和返回值类型。

+

如果声明了PATTERN,只显示名称匹配PATTERN的聚集函数。

+

列出所有名称以f开头可用的聚集函数,以及它们操作的数据类型和返回值类型。

+
postgres=# \da f*
+

\db[+] [PATTERN]

+

列出所有可用的表空间。

+

如果声明了PATTERN,只显示名称匹配PATTERN的表空间。

+

列出所有名称以p开头的可用表空间。

+
postgres=# \db p*
+

\dc[S+] [PATTERN]

+

列出所有字符集之间的可用转换。

+

如果声明了PATTERN,只显示名称匹配PATTERN的转换。

+

列出所有字符集之间的可用转换。

+
postgres=# \dc *
+

\dC[+] [PATTERN]

+

列出所有类型转换。

+

如果声明了PATTERN,只显示名称匹配PATTERN的转换。

+

列出所有名称以c开头的类型转换。

+
postgres=# \dC c*
+

\dd[S] [PATTERN]

+

显示所有匹配PATTERN的描述。

+

如果没有给出参数,则显示所有可视对象。“对象”包括:聚集、函数、操作符、类型、关系(表、视图、索引、序列、大对象)、规则。

+

列出所有可视对象。

+
postgres=# \dd
+

\ddp [PATTERN]

+

显示所有默认的使用权限。

+

如果指定了PATTERN,只显示名称匹配PATTERN的使用权限。

+

列出所有默认的使用权限。

+
postgres=# \ddp
+

\dD[S+] [PATTERN]

+

列出所有可用域。

+

如果声明了PATTERN,只显示名称匹配PATTERN的域。

+

列出所有可用域。

+
postgres=# \dD
+

\ded[+] [PATTERN]

+

列出所有的Data Source对象。

+

如果声明了PATTERN,只显示名称匹配PATTERN的对象。

+

列出所有的Data Source对象。

+
postgres=# \ded
+

\det[+] [PATTERN]

+

列出所有的外部表。

+

如果声明了PATTERN,只显示名称匹配PATTERN的表。

+

列出所有的外部表。

+
postgres=# \det
+

\des[+] [PATTERN]

+

列出所有的外部服务器。

+

如果声明了PATTERN,只显示名称匹配PATTERN的服务器。

+

列出所有的外部服务器。

+
postgres=# \des
+

\deu[+] [PATTERN]

+

列出用户映射信息。

+

如果声明了PATTERN,只显示名称匹配PATTERN的信息。

+

列出用户映射信息。

+
postgres=# \deu
+

\dew[+] [PATTERN]

+

列出封装的外部数据。

+

如果声明了PATTERN,只显示名称匹配PATTERN的数据。

+

列出封装的外部数据。

+
postgres=# \dew
+

\df[antw][S+] [PATTERN]

+

列出所有可用函数,以及它们的参数和返回的数据类型。a代表聚集函数,n代表普通函数,t代表触发器,w代表窗口函数。

+

如果声明了PATTERN,只显示名称匹配PATTERN的函数。

+

列出所有可用函数,以及它们的参数和返回的数据类型。

+
postgres=# \df
+

\dF[+] [PATTERN]

+

列出所有的文本搜索配置信息。

+

如果声明了PATTERN,只显示名称匹配PATTERN的配置信息。

+

列出所有的文本搜索配置信息。

+
postgres=# \dF+
+

\dFd[+] [PATTERN]

+

列出所有的文本搜索字典。

+

如果声明了PATTERN,只显示名称匹配PATTERN的字典。

+

列出所有的文本搜索字典。

+
postgres=# \dFd
+

\dFp[+] [PATTERN]

+

列出所有的文本搜索分析器。

+

如果声明了PATTERN,只显示名称匹配PATTERN的分析器。

+

列出所有的文本搜索分析器。

+
postgres=# \dFp
+

\dFt[+] [PATTERN]

+

列出所有的文本搜索模板。

+

如果声明了PATTERN,只显示名称匹配PATTERN的模板。

+

列出所有的文本搜索模板。

+
postgres=# \dFt
+

\dg[+] [PATTERN]

+

列出所有数据库角色。

+
说明:

因为用户和群组的概念被统一为角色,所以这个命令等价于\du。为了和以前兼容,所以保留两个命令。

+
+

如果指定了PATTERN,只显示名称匹配PATTERN的角色。

+

列出名称为‘j_e’所有数据库角色。

+
postgres=# \dg j?e
+

\dl

+

\lo_list的别名,显示一个大对象的列表。

+

-

+

列出所有的大对象。

+
postgres=# \dl
+

\dL[S+] [PATTERN]

+

列出可用的程序语言。

+

如果指定了PATTERN,只列出名称匹配PATTERN的语言。

+

列出可用的程序语言。

+
postgres=# \dL
+

\dn[S+] [PATTERN]

+

列出所有的模式(名称空间)。

+

如果声明了PATTERN,只列出名称匹配PATTERN的模式名。缺省时,只列出用户创建的模式。

+

列出所有名称以d开头的模式以及相关信息。

+
postgres=#  \dn+ d*
+

\do[S] [PATTERN]

+

列出所有可用的操作符,以及它们的操作数和返回的数据类型。

+

如果声明了PATTERN,只列出名称匹配PATTERN的操作符。缺省时,只列出用户创建的操作符。

+

列出所有可用的操作符,以及它们的操作数和返回的数据类型。

+
postgres=# \do
+

\dO[S+] [PATTERN]

+

列出排序规则。

+

如果声明了PATTERN,只列出名称匹配PATTERN的规则。缺省时,只列出用户创建的规则。

+

列出排序规则。

+
postgres=# \dO
+

\dp [PATTERN]

+

列出一列可用的表、视图以及相关的权限信息。

+

\dp显示结果如下:

+
rolename=xxxx/yyyy  --赋予一个角色的权限
+
=xxxx/yyyy  --赋予public的权限 
+

xxxx表示赋予的权限,yyyy表示授予这个权限的角色。权限的参数说明请参见表5

+

如果指定了PATTERN,只列出名称匹配PATTERN的表、视图。

+

列出一列可用的表、视图以及相关的权限信息。

+
postgres=# \dp
+

\drds [PATTERN1 [PATTERN2]]

+

列出所有修改过的配置参数。这些设置可以是针对角色的、针对数据库的或者同时针对两者的。PATTERN1和PATTERN2表示要列出的角色PATTERN和数据库PATTERN。

+

如果声明了PATTERN,只列出名称匹配PATTERN的规则。缺省或指定*时,则会列出所有设置。

+

列出postgres数据库所有修改过的配置参数。

+
postgres=# \drds * postgres
+

\dT[S+] [PATTERN]

+

列出所有的数据类型。

+

如果指定了PATTERN,只列出名称匹配PATTERN的类型。

+

列出所有的数据类型。

+
postgres=# \dT
+

\du[+] [PATTERN]

+

列出所有数据库角色。

+
说明:

因为用户和群组的概念被统一为角色,所以这个命令等价于\dg。为了和以前兼容,所以保留两个命令。

+
+

如果指定了PATTERN,则只列出名称匹配PATTERN的角色。

+

列出所有数据库角色。

+
postgres=# \du
+

\dE[S+] [PATTERN]

+

\di[S+] [PATTERN]

+

\ds[S+] [PATTERN]

+

\dt[S+] [PATTERN]

+

\dv[S+] [PATTERN]

+

这一组命令,字母E,i,s,t和v分别代表着外部表,索引,序列,表和视图。可以以任意顺序指定其中一个或者它们的组合来列出这些对象。例如:\dit列出所有的索引和表。在命令名称后面追加+,则每一个对象的物理尺寸以及相关的描述也会被列出。

+
说明:

本版本暂时不支持序列。

+
+

如果指定了PATTERN,只列出名称匹配该PATTERN的对象。默认情况下只会显示用户创建的对象。通过PATTERN或者S修饰符可以把系统对象包括在内。

+

列出所有的索引和视图。

+
postgres=# \div
+

\dx[+] [PATTERN]

+

列出安装数据库的扩展信息。

+

如果指定了PATTERN,则只列出名称匹配PATTERN的扩展信息。

+

列出安装数据库的扩展信息。

+
postgres=# \dx
+

\l[+]

+

列出服务器上所有数据库的名称、所有者、字符集编码以及使用权限。

+

-

+

列出服务器上所有数据库的名称、所有者、字符集编码以及使用权限。

+
postgres=#  \l
+

\sf[+] FUNCNAME

+

显示函数的定义。

+
说明:

对于带圆括号的函数名,需要在函数名两端添加双引号,并且在双引号后面加上参数类型列表。参数类型列表两端添加圆括号。

+
+

-

+

假设存在函数function_a和函数名带圆括号的函数func()name,列出函数的定义。

+
postgres=# \sf function_a
+postgres=# \sf 
+"func()name"(argtype1, argtype2)
+

\z [PATTERN]

+

列出数据库中所有表、视图和序列,以及它们相关的访问特权。

+

如果给出任何pattern ,则被当成一个正则表达式,只显示匹配的表、视图、序列。

+

列出数据库中所有表、视图和序列,以及它们相关的访问特权。

+
postgres=# \z
+
+ +**表 5** 权限的参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

r

+

SELECT:允许对指定的表、视图读取数据。

+

w

+

UPDATE:允许对指定表更新字段。

+

a

+

INSERT:允许对指定表插入数据。

+

d

+

DELETE:允许删除指定表中的数据。

+

D

+

TRUNCATE:允许清理指定表中的数据。

+

x

+

REFERENCES:允许创建外键约束。

+

t

+

TRIGGER:允许在指定表上创建触发器。

+

X

+

EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符。

+

U

+

USAGE:

+
  • 对于过程语言,允许用户在创建函数时,指定过程语言。
  • 对于模式,允许访问包含在指定模式中的对象。
  • 对于序列,允许使用nextval函数。
+

C

+

CREATE:

+
  • 对于数据库,允许在该数据库里创建新的模式。
  • 对于模式,允许在该模式中创建新的对象。
  • 对于表空间,允许在其中创建表,以及允许创建数据库和模式的时候把该表空间指定为其缺省表空间。
+

c

+

CONNECT:允许用户连接到指定的数据库。

+

T

+

TEMPORARY:允许创建临时表。

+

arwdDxt

+

ALL PRIVILEGES:一次性给指定用户/角色赋予所有可赋予的权限。

+

*

+

给前面权限的授权选项。

+
+ +**表 6** 格式化元命令 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

\a

+

对齐模式和非对齐模式之间的切换。

+

\C [STRING]

+

把正在打印的表的标题设置为一个查询的结果或者取消这样的设置。

+

\f [STRING]

+

对于不对齐的查询输出,显示或者设置域分隔符。

+

\H

+
  • 若当前模式为文本格式,则切换为HTML输出格式。
  • 若当前模式为HTML格式,则切换回文本格式。
+

\pset NAME [VALUE]

+

设置影响查询结果表输出的选项。NAME的取值见表7

+

\t [on|off]

+

切换输出的字段名的信息和行计数脚注。

+

\T [STRING]

+

指定在使用HTML输出格式时放在table标签里的属性。如果参数为空,不设置。

+

\x [on|off|auto]

+

切换扩展行格式。

+
+ +**表 7** 可调节的打印选项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

选项

+

选项说明

+

取值范围

+

border

+

value必须是一个数字。通常这个数字越大,表的边界就越宽线就越多,但是这个取决于特定的格式。

+
  • 在HTML格式下,取值范围为大于0的整数。
  • 在其他格式下,取值范围:
    • 0:无边框
    • 1:内部分隔线
    • 2:台架
    +
+

expanded (或x)

+

在正常和扩展格式之间切换。

+
  • 当打开扩展格式时,查询结果用两列显示,字段名称在左、数据在右。这个模式在数据无法放进通常的"水平"模式的屏幕时很有用。
  • 在正常格式下,当查询输出的格式比屏幕宽时,用扩展格式。正常格式只对aligned和wrapped格式有用。
+

fieldsep

+

声明域分隔符来实现非对齐输出。这样就可以创建其他程序希望的制表符或逗号分隔的输出。要设置制表符域分隔符,键入\pset fieldsep '\t'。缺省域分隔符是 '|' (竖条符)。

+

-

+

fieldsep_zero

+

声明域分隔符来实现非对齐输出到零字节。

+

-

+

footer

+

用来切换脚注。

+

-

+

format

+

设置输出格式。允许使用唯一缩写(这意味着一个字母就够了)。

+

取值范围:

+
  • unaligned:写一行的所有列在一条直线上中,当前活动字段分隔符分隔。
  • aligned:此格式是标准的,可读性最好的文本输出。
  • wrapped:类似aligned,但是包装跨行的宽数据值,使其适应目标字段的宽度输出。
  • html:把表输出为可用于文档里的对应标记语言。输出不是完整的文档。
  • latex:把表输出为可用于文档里的对应标记语言。输出不是完整的文档。
  • troff-ms:把表输出为可用于文档里的对应标记语言。输出不是完整的文档。
+

null

+

打印一个字符串,用来代替一个null值。

+

缺省是什么都不打印,这样很容易和空字符串混淆。

+

numericlocale

+

切换分隔小数点左边的数值的区域相关的分组符号。

+
  • on:显示指定的分隔符。
  • off:不显示分隔符。
+

忽略此参数,显示默认的分隔符。

+

pager

+

控制查询和gsql帮助输出的分页器。如果设置了环境变量PAGER,输出将被指向到指定程序,否则使用系统缺省。

+
  • on:当输出到终端且不适合屏幕显示时,使用分页器。
  • off:不使用分页器。
  • always:当输出到终端无论是否符合屏幕显示时,都使用分页器。
+

recordsep

+

声明在非对齐输出格式时的记录分隔符。

+

-

+

recordsep_zero

+

声明在非对齐输出到零字节时的记录分隔符。

+

-

+

tableattr(或T)

+

声明放在html输出格式中HTML table标签的属性(例如:cellpadding或bgcolor)。注意:这里可能不需要声明border,因为已经在\pset border里用过了。如果没有给出value,则不设置表的属性。

+

-

+

title

+

为随后打印的表设置标题。这个可以用于给输出一个描述性标签。如果没有给出value,不设置标题。

+

-

+

tuples_only (或者t)

+

在完全显示和只显示实际的表数据之间切换。完全显示将输出像列头、标题、各种脚注等信息。在tuples_only模式下,只显示实际的表数据。

+

-

+
+ +**表 8** 连接元命令 + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

\c[onnect] [DBNAME|- USER|- HOST|- PORT|-]

+

连接到一个新的数据库(当前数据库为postgres)。当数据库名称长度超过63个字节时,默认前63个字节有效,连接到前63个字节对应的数据库,但是gsql的命令提示符中显示的数据库对象名仍为截断前的名称。

+
说明:

重新建立连接时,如果切换数据库登录用户,将可能会出现交互式输入,要求输入新用户的连接密码。该密码最长长度为999字节,受限于GUC参数password_max_length的最大值。

+
+

-

+

\encoding [ENCODING]

+

设置客户端字符编码格式。

+

不带参数时,显示当前的编码格式。

+

\conninfo

+

输出当前连接的数据库的信息。

+

-

+
+ +**表 9** 操作系统元命令 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

\cd [DIR]

+

切换当前的工作目录。

+

绝对路径或相对路径,且满足操作系统路径命名规则。

+

\setenv NAME [VALUE]

+

设置环境变量NAME为VALUE,如果没有给出VALUE值,则不设置环境变量。

+

-

+

\timing [on|off]

+

以毫秒为单位显示每条SQL语句的执行时间。

+
  • on表示打开显示。
  • off表示关闭显示。
+

\! [COMMAND]

+

返回到一个单独的Unix shell或者执行Unix命令COMMAND。

+

-

+
+ +**表 10** 变量元命令 + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

\prompt [TEXT] NAME

+

提示用户用文本格式来指定变量名称。

+

\set [NAME [VALUE]]

+

设置内部变量NAME为VALUE或者如果给出了多于一个值,设置为所有这些值的连接结果。如果没有给出第二个参数,只设变量不设值。

+

有一些常用变量被gsql特殊对待,它们是一些选项设置,通常所有特殊对待的变量都是由大写字母组成(可能还有数字和下划线)。 表11是一个所有特殊对待的变量列表。

+

\unset NAME

+

不设置(或删除)gsql变量名。

+
+ +**表 11** \\set常用命令 + + + + + + + + + + + + + + + + + + + + +

名称

+

命令说明

+

取值范围

+

\set VERBOSITY value

+

这个选项可以设置为值default, verbose,terse之一以控制错误报告的冗余行。

+

value取值范围:default, verbose,terse

+

\set ON_ERROR_STOP value

+

+

如果设置了这个变量,脚本处理将马上停止。如果该脚本是从另外一个脚本调用的,那个脚本也会按同样的方式停止。如果最外层的脚本不是从一次交互的gsql会话中调用的而是用-f选项调用的,gsql将返回错误代码3,以示这个情况与致命错误条件的区别(错误代码为1)。

+

value取值范围为:on/off,true/false,yes/no,1/0

+

\set RETRY [retry_times]

+

用于控制是否开启语句出错场景下的重试功能,参数retry_times用来指定最大重试次数,缺省值为5,取值范围为5-10。当重试功能已经开启时,再次执行\set RETRY可以关闭该功能。

+

使用配置文件retry_errcodes.conf列举需要重试的错误码列表,该文件和gsql可执行程序位于同一级目录下。该配置文件为系统配置,非用户定义,不允许用户直接修改。

+

当前支持以下13类出错场景的重试:

+
  • YY001:TCP通信错误,Connection reset by peer
  • YY002:TCP通信错误,Connection reset by peer
  • YY003:锁超时,Lock wait timeout.../wait transaction xxx sync time exceed xxx
  • YY004:TCP通信错误,Connection timed out
  • YY005:SET命令发送失败,ERROR SET query
  • YY006:内存申请失败,memory is temporarily unavailable
  • YY007:通信库错误,Memory allocate error
  • YY008:通信库错误,No data in buffer
  • YY009:通信库错误,Close because release memory
  • YY010:通信库错误,TCP disconnect
  • YY011:通信库错误,SCTP disconnect
  • YY012:通信库错误,Stream closed by remote
  • YY013:通信库错误,Wait poll unknown error
+

同时,出错时gsql会查询数据库节点的连接状态,当状态异常时会sleep 1分钟再进行重试,能够覆盖大部分主备切换场景下的出错重试。

+
说明:
  1. 不支持事务块中的语句错误重试;
  2. 不支持通过ODBC、JDBC接口查询的出错重试;
  3. 含有unlogged表的sql语句,不支持节点故障后的出错重试;
  4. gsql客户端本身出现的错误,不在重跑考虑范围之内;
+
+

retry_times取值范围为:5-10

+
+ +**表 12** 大对象元命令 + + + + + + + + + + +

参数

+

参数说明

+

\lo_list

+

显示一个目前存储在该数据库里的所有openGauss大对象和提供给他们的注释。

+
+ +## **PATTERN** + +很多\\d命令都可以用一个PATTERN参数来指定要被显示的对象名称。在最简单的情况下,PATTERN正好就是该对象的准确名称。在PATTERN中的字符通常会被变成小写形式(就像在SQL名称中那样),例如\\dt FOO将会显示名为foo的表。就像在SQL名称中那样,把PATTERN放在双引号中可以阻止它被转换成小写形式。如果需要在一个PATTERN中包括一个真正的双引号字符,则需要把它写成两个相邻的双引号,这同样是符合SQL引用标识符的规则。例如,\\dt "FOO""BAR"将显示名为FOO"BAR(不是foo"bar)的表。和普通的SQL名称规则不同,不能只在PATTERN的一部分周围放上双引号,例如\\dt FOO"FOO"BAR将会显示名为fooFOObar的表。 + +不使用PATTERN参数时,\\d命令会显示当前schema搜索路径中可见的全部对象——这等价于用\*作为PATTERN。所谓对象可见是指可以直接用名称引用该对象,而不需要用schema来进行限定。要查看数据库中所有的对象而不管它们的可见性,可以把\*.\*用作PATTERN。 + +如果放在一个PATTERN中,\*将匹配任意字符序列(包括空序列),而?会匹配任意的单个字符(这种记号方法就像 Unix shell 的文件名PATTERN一样)。例如,\\dt int\*会显示名称以int开始的表。但是如果被放在双引号内,\*和?就会失去这些特殊含义而变成普通的字符。 + +包含一个点号(.)的PATTERN被解释为一个schema名称模式后面跟上一个对象名称模式。例如,\\dt foo\*.\*bar\*会显示名称以foo开始的schema中所有名称包括bar的表。如果没有出现点号,那么模式将只匹配当前schema搜索路径中可见的对象。同样,双引号内的点号会失去其特殊含义并且变成普通的字符。 + +高级用户可以使用字符类等正则表达式记法,如\[0-9\]可以匹配任意数字。所有的正则表达式特殊字符都按照POSIX正则表达式所说的工作。以下字符除外: + +- .会按照上面所说的作为一种分隔符。 +- \*会被翻译成正则表达式记号.\*。 +- ?会被翻译成.。 +- $则按字面意思匹配。 + +根据需要,可以通过书写?、\(_R_+|\)、\(_R_|\)和_R_?来分别模拟PATTERN字符.、_R_\*和_R_?。$不需要作为一个正则表达式字符,因为PATTERN必须匹配整个名称,而不是像正则表达式的常规用法那样解释(换句话说,$会被自动地追加到PATTERN上)。如果不希望该PATTERN的匹配位置被固定,可以在开头或者结尾写上\*。注意在双引号内,所有的正则表达式特殊字符会失去其特殊含义并且按照其字面意思进行匹配。另外,在操作符名称PATTERN中(即\\do的PATTERN参数),正则表达式特殊字符也按照字面意思进行匹配。 + 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/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" new file mode 100644 index 000000000..7b393a51d --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-2.md" @@ -0,0 +1,100 @@ +# 命令参考 + +**表 1** 常见参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--mode, -m

+

指定调优程序运行的模式

+

train, tune

+

--config-file, -f

+

调优程序的配置文件,可选

+

-

+

--db-name

+

指定调优的数据库

+

-

+

--db-user

+

指定调优的数据库用户名

+

-

+

--port

+

数据库的监听端口

+

-

+

--host

+

数据库实例的宿主机IP

+

-

+

--host-user

+

数据库安装时的DBA用户名

+

-

+

--host-ssh-port

+

数据库实例所在宿主机的SSH端口号,可选

+

-

+

--scenario

+

指定调优的模式,对应三种不同的调优列表,用户可以对该调优列表进行修改

+

ap, htap, tp

+

--benchmark

+

由用户指定的benchmark脚本文件名

+

-

+

--model-path

+

调优强化学习模型存储或加载的文件路径

+

-

+

--version, -v

+

返回当前工具版本号

+

-

+
+ 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/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" new file mode 100644 index 000000000..d3f36484d --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203-7.md" @@ -0,0 +1,44 @@ +# 命令参考 + +**表 1** 常见参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--train

+

供训练用历史日志的路径。

+

-

+

--model

+

训练生成的模型及中间文件存储路径,以及预测时指定的模型路径

+

-

+

--predict

+

待预测负载文件路径

+

-

+

--ratio

+

推荐重新训练阈值比率,可选

+

-

+
+ diff --git "a/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203.md" "b/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203.md" new file mode 100644 index 000000000..7f025e6a6 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\221\275\344\273\244\345\217\202\350\200\203.md" @@ -0,0 +1,334 @@ +# 命令参考 + +详细的gsql参数请参见[表1](#zh-cn_topic_0237152145_zh-cn_topic_0059779319_t5f35328143ec419983a1c23d13c46e49)、[表2](#zh-cn_topic_0237152145_zh-cn_topic_0059779319_t0233128ab394456c80e339179cb56739)、[表3](#zh-cn_topic_0237152145_zh-cn_topic_0059779319_t47c174e145784f16ac251d3c6aea8ea8)和[表4](#zh-cn_topic_0237152145_zh-cn_topic_0059779319_td7e646abbf6a4d85bc54cd9741c80b68)。 + +**表 1** 常用参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-c, --command=COMMAND

+

声明gsql要执行一条字符串命令然后退出。

+

-

+

-d, --dbname=DBNAME

+

指定想要连接的数据库名称。

+

字符串。

+

-f, --file=FILENAME

+

使用文件作为命令源而不是交互式输入。gsql将在处理完文件后结束。如果FILENAME是-(连字符),则从标准输入读取。

+

绝对路径或相对路径,且满足操作系统路径命名规则。

+

-l, --list

+

列出所有可用的数据库,然后退出。

+

-

+

-v, --set, --variable=NAME=VALUE

+

设置gsql变量NAME为VALUE。

+

变量的示例和详细说明请参见变量

+

-

+

-X, --no-gsqlrc

+

不读取启动文件(系统范围的gsqlrc或者用户的~/.gsqlrc都不读取)。

+
说明:

启动文件默认为~/.gsqlrc,或通过PSQLRC环境变量指定。

+
+

-

+

-1 ("one"), --single-transaction

+

当gsql使用-f选项执行脚本时,会在脚本的开头和结尾分别加上START TRANSACTION/COMMIT用以把整个脚本当作一个事务执行。这将保证该脚本完全执行成功,或者脚本无效。

+
说明:

如果脚本中已经使用了START TRANSACTION,COMMIT,ROLLBACK,则该选项无效。

+
+

-

+

-?, --help

+

显示关于gsql命令行参数的帮助信息然后退出。

+

-

+

-V, --version

+

打印gsql版本信息然后退出。

+

-

+
+ +**表 2** 输入和输出参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-a, --echo-all

+

在读取行时向标准输出打印所有内容。

+
注意:

使用此参数可能会暴露部分SQL语句中的敏感信息,如创建用户语句中的password信息等,请谨慎使用。

+
+

-

+

-e, --echo-queries

+

把所有发送给服务器的查询同时回显到标准输出。

+
注意:

使用此参数可能会暴露部分SQL语句中的敏感信息,如创建用户语句中的password信息等,请谨慎使用。

+
+

-

+

-E, --echo-hidden

+

回显由\d和其他反斜杠命令生成的实际查询。

+

-

+

-k, --with-key=KEY

+

使用gsql对导入的加密文件进行解密。

+
须知:

对于本身就是shell命令中的关键字符如单引号(')或双引号("),Linux shell会检测输入的单引号(')或双引号(")是否匹配。如果不匹配,shell认为用户没有输入完毕,会一直等待用户输入,从而不会进入到gsql程序。

+
+

-

+

-L, --log-file=FILENAME

+

除了正常的输出源之外,把所有查询输出记录到文件FILENAME中。

+
注意:
  • 使用此参数可能会暴露部分SQL语句中的敏感信息,如创建用户语句中的password信息等,请谨慎使用。
  • 此参数只保留查询结果到相应文件中,主要目标是为了查询结果能够更好更准确地被其他调用者(例如自动化运维脚本)解析;而不是保留gsql运行过程中的相关日志信息。
+
+

绝对路径或相对路径,且满足操作系统路径命名规则。

+

-m, --maintenance

+

允许在两阶段事务恢复期间连接openGauss

+
说明:

该选项是一个开发选项,禁止用户使用,只限专业技术人员使用,功能是:使用该选项时,gsql可以连接到备机,用于校验主备机数据的一致性。

+
+

-

+

-n, --no-libedit

+

关闭命令行编辑。

+

-

+

-o, --output=FILENAME

+

将所有查询输出重定向到文件FILENAME。

+

绝对路径或相对路径,且满足操作系统路径命名规则。

+

-q, --quiet

+

安静模式,执行时不会打印出额外信息。

+

缺省时gsql将打印许多其他输出信息。

+

-s, --single-step

+

单步模式运行。意味着每个查询在发往服务器之前都要提示用户,用这个选项也可以取消执行。此选项主要用于调试脚本。

+
注意:

使用此参数可能会暴露部分SQL语句中的敏感信息,如创建用户语句中的password信息等,请谨慎使用。

+
+

-

+

-S, --single-line

+

单行运行模式,这时每个命令都将由换行符结束,像分号那样。

+

-

+
+ +**表 3** 输出格式参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-A, --no-align

+

切换为非对齐输出模式。

+

缺省为对齐输出模式。

+

-F, --field-separator=STRING

+

设置域分隔符(默认为“|”)。

+

-

+

-H, --html

+

打开HTML格式输出。

+

-

+

-P, --pset=VAR[=ARG]

+

在命令行上以\pset的风格设置打印选项。

+
说明:

这里必须用等号而不是空格分隔名称和值。例如,把输出格式设置为LaTeX,可以键入-P format=latex

+
+

-

+

-R, --record-separator=STRING

+

设置记录分隔符。

+

-

+

-r

+

开启在客户端操作中可以进行编辑的模式。

+

缺省为关闭。

+

-t, --tuples-only

+

只打印行。

+

-

+

-T, --table-attr=TEXT

+

允许声明放在HTML table标签里的选项。

+

使用时请搭配参数“-H,--html”,指定为HTML格式输出。

+

-

+

-x, --expanded

+

打开扩展表格式模式。

+

-

+

-z, --field-separator-zero

+

设置非对齐输出模式的域分隔符为空。

+

使用时请搭配参数“-A, --no-align”,指定为非对齐输出模式。

+

-

+

-0, --record-separator-zero

+

设置非对齐输出模式的记录分隔符为空。

+

使用时请搭配参数“-A, --no-align”,指定为非对齐输出模式。

+

-

+
+ +**表 4** 连接参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-h, --host=HOSTNAME

+

指定正在运行服务器的主机名或者Unix域套接字的路径。

+

如果省略主机名,gsql将通过Unix域套接字与本地主机的服务器相联,或者在没有Unix域套接字的机器上,通过TCP/IP与localhost连接。

+

-p, --port=PORT

+

指定数据库服务器的端口号。

+

可以通过port参数修改默认端口号。

+

默认为8000

+

-U, --username=USERNAME

+

指定连接数据库的用户。

+
说明:
  • 通过该参数指定用户连接数据库时,需要同时提供用户密码用以身份验证。您可以通过交换方式输入密码,或者通过-W参数指定密码。
  • 用户名中包含有字符$,需要在字符$前增加转义字符才可成功连接数据库。
+
+

字符串。默认使用与当前操作系统用户同名的用户。

+

-W, --password=PASSWORD

+

当使用-U参数连接本地数据库或者连接远端数据库时,可通过该选项指定密码。

+
说明:

登录数据库主节点所在服务器后连接本地数据库主节点实例时,默认使用trust连接,会忽略此参数。

+

用户密码中包含特殊字符“\”和"`"时,需要增加转义字符才可成功连接数据库。

+

如果用户未输入该参数,但是数据库连接需要用户密码,这时将出现交互式输入,请用户输入当前连接的密码。该密码最长长度为999字节,受限于GUC参数password_max_length的最大值。

+
+

符合密码复杂度要求。

+
+ diff --git "a/content/zh/docs/Toolreference/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267.md" "b/content/zh/docs/Toolreference/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267.md" new file mode 100644 index 000000000..905b18643 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267.md" @@ -0,0 +1,13 @@ +# 客户端工具 + +数据库在部署成功后,需要通过一些工具来便捷地连接数据库,对数据库进行各种操作和调试。openGauss提供了一些数据库连接工具。通过这些工具可以方便地连接数据库并对数据库进行数据操作。 + +- **[gsql](gsql.md)** + +- **[X-Tuner](X-Tuner.md)** + +- **[Sqldiag](Sqldiag.md)** + +- **[Predictor](Predictor.md)** + + diff --git "a/content/zh/docs/Toolreference/\345\267\245\345\205\267\344\270\200\350\247\210\350\241\250.md" "b/content/zh/docs/Toolreference/\345\267\245\345\205\267\344\270\200\350\247\210\350\241\250.md" new file mode 100644 index 000000000..12b74aae1 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\267\245\345\205\267\344\270\200\350\247\210\350\241\250.md" @@ -0,0 +1,77 @@ +# 工具一览表 + +openGauss提供客户端和服务器端应用程序(工具),帮助用户更好地维护openGauss,提供的所有工具如[表1](#zh-cn_topic_0237152139_table11292939125111)所示。工具位于安装数据库服务器的$GPHOME/script和$GAUSSHOME/bin路径下。 + +**表 1** 工具一览表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

分类

+

工具名称

+

简介

+

客户端工具

+

gsql

+

gsql是openGauss提供在命令行下运行的数据库连接工具,可以通过此工具连接服务器并对其进行操作和维护,除了具备操作数据库的基本功能,gsql还提供了若干高级特性,便于用户使用。

+

服务端工具

+

gs_check

+

gs_check改进增强,统一化当前系统中存在的各种检查工具,例如gs_checkgs_checkos等,帮助用户在openGauss运行过程中,全量的检查openGauss运行环境,操作系统环境,网络环境及数据库执行环境,也有助于在openGauss重大操作之前对各类环境进行全面检查,有效保证操作执行成功。

+

gs_checkos

+

gs_checkos用于检查操作系统、控制参数、磁盘配置等内容,并对系统控制参数、I/O配置、网络配置和THP服务等信息进行配置。

+

gs_checkperf

+

gs_checkperf工具可定期对openGauss级别(主机CPU占用率、Gauss CPU占用率、I/O使用情况等)、节点级别(CPU使用情况、内存使用情况、I/O使用情况)、会话/进程级别(CPU使用情况、内存使用情况、I/O使用情况)、SSD性能(写入、读取性能)进行检查,让用户了解openGauss的负载情况,采取对应的改进措施。

+

gs_collector

+

gs_collector在openGauss发生故障时,收集OS信息、日志信息以及配置文件信息,来定位问题。

+

gs_dump

+

gs_dump是一款用于导出数据库相关信息的工具,支持导出完整一致的数据库对象(数据库、模式、表、视图等)数据,同时不影响用户对数据库的正常访问。

+

gs_dumpall

+

gs_dumpall是一款用于导出数据库相关信息的工具,支持导出完整一致的openGauss数据库所有数据,同时不影响用户对数据库的正常访问。

+

gs_guc

+

gs_guc用于设置openGauss配置文件(“postgresql.conf”、“pg_hba.conf”)中的参数,配置文件中参数的默认值是单机的配置模式,您可以使用gs_guc来设置适合的参数值。

+

gs_om

+

openGauss提供了gs_om工具帮助对openGauss进行维护,包括启动openGauss、停止openGauss、查询openGauss状态、切换主备实例、管理数据库节点、修改IP、生成静态配置文件、格式化列存文件、升级时间评估、安装,扩容,增加数据库节点、节点替换和温备相关时间评估、管理虚拟IP、SSL证书替换、输出相对表空间路径、启停kerberos认证、删除PostGIS文件、执行日常巡检并上报告警、显示帮助信息和显示版本号信息、启动etcd的功能。

+

gs_restore

+

gs_restore是openGauss提供的针对gs_dump导出数据的导入工具。通过此工具可由gs_dump生成的导出文件进行导入。

+

gs_ssh

+

openGauss提供了gs_ssh工具帮助用户在openGauss各节点上执行相同的命令。

+
+ 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-11.md" "b/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-11.md" new file mode 100644 index 000000000..5e51ed842 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-11.md" @@ -0,0 +1,7 @@ +# 常见问题处理 + +- **AiEngine启动失败**:请检查ip地址,端口是否可用;CA证书路径是否存在。 +- **发起请求AiEngine无响应**:请检查通信双方CA证书是否一致。 +- **训练,测试场景失败**:请检查模型文件保存路径是否存在;训练预测文件是否在正确下载。 +- **更换AiEngine-IP地址**:按照[证书准备生成](使用指导-10.md#section1446112144912)步骤重新生成证书,在[生成根私钥证书及密钥](使用指导-10.md#li1783847165213)中替换成相应的IP地址即可。 + 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/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" new file mode 100644 index 000000000..8d61c67ab --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-3.md" @@ -0,0 +1,5 @@ +# 常见问题处理 + +- 数据库实例连接失败:请检查数据库实例的情况,是否数据库实例出现了问题或安全权限配置不正确; +- 重启失败:请检查数据库实例健康情况,确保数据库实例工作正常; + 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/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" new file mode 100644 index 000000000..e9c604c05 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206-8.md" @@ -0,0 +1,7 @@ +# 常见问题处理 + +- 训练场景失败:请检查历史日志文件路径是否正确,且文件格式符合上文规定。 + +- 测试场景失败:请检查模型路径是否正确。确保待预测负载文件格式正确。 + + 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.md" "b/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" new file mode 100644 index 000000000..5f5812a78 --- /dev/null +++ "b/content/zh/docs/Toolreference/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" @@ -0,0 +1,255 @@ +# 常见问题处理 + +## 连接性能问题 + +- 开启了log\_hostname,但是配置了错误的DNS导致的连接性能问题。 + + 在连接上数据库,通过“show log\_hostname”语句,检查数据库中是否开启了log\_hostname参数。 + + 如果开启了相关参数,那么数据库内核会通过DNS反查客户端所在机器的主机名。这时如果数据库主节点配置了不正确的/不可达的DNS服务器,那么会导致数据库建立连接过程较慢。此参数的更多信息,详见《开发者指南》中“GUC参数说明 \> 错误报告和日志 \> 记录日志的内容”章节中关于“log\_hostname”的描述。 + +- 数据库内核执行初始化语句较慢导致的性能问题。 + + 此种情况定位较难,可以尝试使用Linux的跟踪命令:strace。 + + ``` + strace gsql -U MyUserName -W MyPassWord -d postgres -h 127.0.0.1 -p 23508 -r -c '\q' + ``` + + 此时便会在屏幕上打印出数据库的连接过程。比如较长时间停留在下面的操作上: + + ``` + sendto(3, "Q\0\0\0\25SELECT VERSION()\0", 22, MSG_NOSIGNAL, NULL, 0) = 22 + poll([{fd=3, events=POLLIN|POLLERR}], 1, -1) = 1 ([{fd=3, revents=POLLIN}]) + ``` + + 此时便可以确定是数据库执行"SELECT VERSION\(\)"语句较慢。 + + 在连接上数据库后,便可以通过执行“explain performance select version\(\)”语句来确定初始化语句执行较慢的原因。更多信息,详见《开发者指南》中“性能调优 \> SQL调优指南 \> SQL执行计划介绍”章节。 + + 另外还有一种场景不太常见:由于数据库主节点所在机器的磁盘满或故障,此时所查询等受影响,无法进行用户认证,导致连接过程挂起,表现为假死。解决此问题清理数据库主节点的数据盘空间便可。 + +- TCP连接创建较慢问题。 + + 此问题可以参考上面的初始化语句较慢排查的做法,通过strace跟踪,如果长时间停留在: + + ``` + connect(3, {sa_family=AF_FILE, path="/home/test/tmp/gaussdb_llt1/.s.PGSQL.61052"}, 110) = 0 + ``` + + 或者 + + ``` + connect(3, {sa_family=AF_INET, sin_port=htons(61052), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) + ``` + + 那么说明客户端与数据库端建立物理连接过慢,此时应当检查网络是否存在不稳定、网络吞吐量太大的问题。 + + +## 创建连接故障 + +- gsql: could not connect to server: No route to host + + 此问题一般是指定了不可达的地址或者端口导致的。请检查-h参数与-p参数是否添加正确。 + +- gsql: FATAL: Invalid username/password,login denied. + + 此问题一般是输入了错误的用户名和密码导致的,请联系数据库管理员,确认用户名和密码的正确性。 + +- gsql: FATAL: Forbid remote connection with trust method! + + 数据库由于安全问题,禁止远程登录时使用trust模式。这时需要修改pg\_hba.conf里的连接认证信息。具体的设置信息请参见:《开发者指南》中“管理数据库安全 \> 客户端接入认证 \> 配置文件参考”章节。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >请不要修改pg\_hba.conf中openGauss主机的相关设置,否则可能导致数据库功能故障。建议业务应用部署在openGauss之外,而非openGauss内部。 + +- 在数据库主节点连接数据库,添加“-h 127.0.0.1”可以连接,去掉后无法连接问题。 + + 通过执行SQL语句“show unix\_socket\_directory”检查数据库主节点使用的Unix套接字目录,是否与shell中的环境变量$PGHOST一致。 + + 如果检查结果不一致,那么修改PGHOST环境变量到GUC参数unix\_socket\_directory指向的目录便可。 + + 关于unix\_socket\_directory的更多信息,详见《开发者指南》中“GUC参数说明 \> 连接和认证 \> 连接设置”章节中的说明。 + +- The "libpq.so" loaded mismatch the version of gsql, please check it. + + 此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的,请通过“ldd gsql”命令确认当前加载的libpq.so的版本,并通过修改LD\_LIBRARY\_PATH环境变量来加载正确的libpq.so。 + +- gsql: symbol lookup error: xxx/gsql: undefined symbol: libpqVersionString + + 此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的(也有可能是环境中存在PostgreSQL的libpq.so),请通过“ldd gsql”命令确认当前加载的libpq.so的版本,并通过修改LD\_LIBRARY\_PATH环境变量来加载正确的libpq.so。 + +- gsql: connect to server failed: Connection timed out + + Is the server running on host "xx.xxx.xxx.xxx" and accepting TCP/IP connections on port xxxx? + + 此问题是由于网络连接故障造成。请检查客户端与数据库服务器间的网络连接。如果发现从客户端无法PING到数据库服务器端,则说明网络连接出现故障。请联系网络管理人员排查解决。 + + ``` + ping -c 4 10.10.10.1 + PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data. + From 10.10.10.1: icmp_seq=2 Destination Host Unreachable + From 10.10.10.1 icmp_seq=2 Destination Host Unreachable + From 10.10.10.1 icmp_seq=3 Destination Host Unreachable + From 10.10.10.1 icmp_seq=4 Destination Host Unreachable + --- 10.10.10.1 ping statistics --- + 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2999ms + ``` + +- gsql: FATAL: permission denied for database "postgres" + + DETAIL: User does not have CONNECT privilege. + + 此问题是由于用户不具备访问该数据库的权限,可以使用如下方法解决。 + + 1. 使用管理员用户dbadmin连接数据库。 + + ``` + gsql -d postgres -U dbadmin -p 8000 + ``` + + 2. 赋予该用户访问数据库的权限。 + + GRANT CONNECT ON DATABASE postgres TO user1; + + >![](public_sys-resources/icon-note.gif) **说明:** + >实际上,常见的许多错误操作也可能产生用户无法连接上数据库的现象。如用户连接的数据库不存在,用户名或密码输入错误等。这些错误操作在客户端工具也有相应的提示信息。 + >``` + >gsql -d postgres -p 8000 + >gsql: FATAL: database "postgres" does not exist + >gsql -d postgres -U user1 -W gauss@789 -p 8000 + >gsql: FATAL: Invalid username/password,login denied. + >``` + + +- gsql: FATAL: sorry, too many clients already,active/non-active: 197/3. + + 此问题是由于系统连接数量超过了最大连接数量。请联系数据库DBA进行会话连接数管理,释放无用会话。 + + 关于查看用户会话连接数的方法如[表1](#zh-cn_topic_0237152147_zh-cn_topic_0059779356_t8e166846f0204638bd83f2fd35f44585)。 + + 会话状态可以在视图PG\_STAT\_ACTIVITY中查看。无用会话可以使用函数pg\_terminate\_backend进行释放。 + + ``` + select datid,pid,state from pg_stat_activity; + ``` + + ``` + datid | pid | state + -------+-----------------+-------- + 13205 | 139834762094352 | active + 13205 | 139834759993104 | idle + (2 rows) + ``` + + 其中pid的值即为该会话的线程ID。根据线程ID结束会话。 + + ``` + SELECT PG_TERMINATE_BACKEND(139834759993104); + ``` + + 显示类似如下信息,表示结束会话成功。 + + ``` + PG_TERMINATE_BACKEND + ---------------------- + t + (1 row) + ``` + + **表 1** 查看会话连接数 + + + + + + + + + + + + + + + + + + + + + + +

描述

+

命令

+

查看指定用户的会话连接数上限。

+

执行如下命令查看连接到指定用户USER1的会话连接数上限。其中-1表示没有对用户user1设置连接数的限制。

+
SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='user1';
+     rolname | rolconnlimit
+    ---------+--------------
+     user1    |           -1
+    (1 row)
+

查看指定用户已使用的会话连接数。

+

执行如下命令查看指定用户USER1已使用的会话连接数。其中,1表示USER1已使用的会话连接数。

+
SELECT COUNT(*) FROM V$SESSION WHERE USERNAME='user1';
+    
+     count
+    -------
+         1
+    (1 row)
+

查看指定数据库的会话连接数上限。

+

执行如下命令查看连接到指定数据库postgres的会话连接数上限。其中-1表示没有对数据库postgres设置连接数的限制。

+
SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='postgres';
+    
+     datname  | datconnlimit
+    ----------+--------------
+     postgres |           -1
+    (1 row)
+

查看指定数据库已使用的会话连接数。

+

执行如下命令查看指定数据库postgres上已使用的会话连接数。其中,1表示数据库postgres上已使用的会话连接数。

+
SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='postgres';
+     count 
+    -------
+         1
+    (1 row)
+

查看所有用户已使用会话连接数。

+

执行如下命令查看所有用户已使用的会话连接数。

+
SELECT COUNT(*) FROM V$SESSION;
+     
+     count
+    -------
+         10
+    (1 row)
+
+ +- gsql: wait xxx.xxx.xxx.xxx:xxxx timeout expired + + gsql在向数据库发起连接的时候,会有5分钟超时机制,如果在这个超时时间内,数据库未能正常的对客户端请求进行校验和身份认证,那么gsql会退出当前会话的连接过程,并报出如上错误。 + + 一般来说,此问题是由于连接时使用的-h参数及-p参数指定的连接主机及端口有误(即错误信息中的xxx部分),导致通信故障;极少数情况是网络故障导致。要排除此问题,请检查数据库的主机名及端口是否正确。 + +- gsql: could not receive data from server: Connection reset by peer. + + 同时,检查数据库主节点日志中出现类似如下日志“ FATAL: cipher file "/data/dbnode/server.key.cipher" has group or world access”,一般是由于数据目录或部分关键文件的权限被误操作篡改导致。请参照其他正常实例下的相关文件权限,修改回来便可。 + +- gsql: FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. + + 目标数据库主节点的pg\_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到"sha256"后再试。配置方法见《开发者指南》中“管理数据库安全 \> 客户端接入认证 \> 配置文件参考”章节 。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 请不要修改pg\_hba.conf中openGauss主机的相关设置,否则可能导致数据库功能故障。 + >- 建议业务应用部署在openGauss之外,而非openGauss内部。 + + +## 其他故障 + +- 出现因“总线错误”(Bus error)导致的core dump或异常退出 + + 一般情况下出现此种问题,是进程运行过程中加载的共享动态库(在Linux为.so文件)出现变化;或者进程二进制文件本身出现变化,导致操作系统加载机器的执行码或者加载依赖库的入口发生变化,操作系统出于保护目的将进程杀死,产生core dump文件。 + + 解决此问题,重试便可。同时请尽可能避免在升级等运维操作过程中,在openGauss内部运行业务程序,避免升级时因替换文件产生此问题。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此故障的core dump文件的可能堆栈是dl\_main及其子调用,它是操作系统用来初始化进程做共享动态库加载的。如果进程已经初始化,但是共享动态库还未加载完成,严格意义上来说,进程并未完全启动。 + + diff --git "a/content/zh/docs/Toolreference/\346\211\247\350\241\214\345\221\275\344\273\244\346\212\245\351\224\231-Failed-to-obtain-the-GPHOME.md" "b/content/zh/docs/Toolreference/\346\211\247\350\241\214\345\221\275\344\273\244\346\212\245\351\224\231-Failed-to-obtain-the-GPHOME.md" new file mode 100644 index 000000000..dcae1ed03 --- /dev/null +++ "b/content/zh/docs/Toolreference/\346\211\247\350\241\214\345\221\275\344\273\244\346\212\245\351\224\231-Failed-to-obtain-the-GPHOME.md" @@ -0,0 +1,28 @@ +# 执行命令报错“Failed to obtain the GPHOME” + +## 问题现象 + +如果在root用户下执行工具命令时,出现如下信息, + +``` +Failed to obtain the GPHOME. +``` + +## 原因分析 + +可能是环境变量中GPHOME变量没有配置正确。需要检查环境变量GPHOME是否包含openGaussXML中gaussdbToolPath路径。 + +## 操作步骤 + +使用如下命令检查$GPHOME路径。 + +``` +echo $GPHOME +``` + +如果不是安装时默认的路径,请在配置文件中修改GPHOME的路径。 + +``` +vim /etc/profile +``` + diff --git "a/content/zh/docs/Toolreference/\346\234\215\345\212\241\347\253\257\345\267\245\345\205\267.md" "b/content/zh/docs/Toolreference/\346\234\215\345\212\241\347\253\257\345\267\245\345\205\267.md" new file mode 100644 index 000000000..a2f613a60 --- /dev/null +++ "b/content/zh/docs/Toolreference/\346\234\215\345\212\241\347\253\257\345\267\245\345\205\267.md" @@ -0,0 +1,25 @@ +# 服务端工具 + +在使用openGauss过程中,经常需要对openGauss进行安装、卸载以及健康管理。为了简单、方便的维护openGauss,openGauss提供了一系列的管理工具。 + +- **[gs\_check](gs_check.md)** + +- **[gs\_checkos](gs_checkos.md)** + +- **[gs\_checkperf](gs_checkperf.md)** + +- **[gs\_collector](gs_collector.md)** + +- **[gs\_dump](gs_dump.md)** + +- **[gs\_dumpall](gs_dumpall.md)** + +- **[gs\_guc](gs_guc.md)** + +- **[gs\_om](gs_om.md)** + +- **[gs\_restore](gs_restore.md)** + +- **[gs\_ssh](gs_ssh.md)** + + diff --git "a/content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md" "b/content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md" new file mode 100644 index 000000000..596afa4c5 --- /dev/null +++ "b/content/zh/docs/Toolreference/\346\246\202\350\277\260-4.md" @@ -0,0 +1,4 @@ +# 概述 + +Sqldiag是一个语句时间诊断框架,通过深度学习和统计学习相结合,实现在不获取语句执行计划的前提下,依据语句逻辑相似度与历史执行记录,预测语句的执行时间。 + diff --git "a/content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" "b/content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" new file mode 100644 index 000000000..0ed8432b6 --- /dev/null +++ "b/content/zh/docs/Toolreference/\346\246\202\350\277\260-9.md" @@ -0,0 +1,4 @@ +# 概述 + +Predictor是基于机器学习且具有在线学习能力的查询时间预测工具。通过不断学习数据库内收集的历史执行信息,实现计划的执行时间/行数的预测功能。 + diff --git "a/content/zh/docs/Toolreference/\346\246\202\350\277\260.md" "b/content/zh/docs/Toolreference/\346\246\202\350\277\260.md" new file mode 100644 index 000000000..b354c7fb0 --- /dev/null +++ "b/content/zh/docs/Toolreference/\346\246\202\350\277\260.md" @@ -0,0 +1,4 @@ +# 概述 + +X-Tuner 是一款数据库自带的参数调优工具,通过结合深度强化学习和启发式算法,实现在无需人工干预的情况下,获取最佳数据库参数的途径。 + diff --git "a/content/zh/docs/Toolreference/\347\263\273\347\273\237\345\206\205\351\203\250\344\275\277\347\224\250\347\232\204\345\267\245\345\205\267.md" "b/content/zh/docs/Toolreference/\347\263\273\347\273\237\345\206\205\351\203\250\344\275\277\347\224\250\347\232\204\345\267\245\345\205\267.md" new file mode 100644 index 000000000..64f2f9788 --- /dev/null +++ "b/content/zh/docs/Toolreference/\347\263\273\347\273\237\345\206\205\351\203\250\344\275\277\347\224\250\347\232\204\345\267\245\345\205\267.md" @@ -0,0 +1,45 @@ +# 系统内部使用的工具 + +本节所涉及的工具为openGauss进程间运行使用的工具,或者说模块间调用的工具。这些工具只用于满足内部调用场景,未对其他场景下的使用正确性做过验证。因此,不建议用户直接使用这些工具执行业务,以防对系统运行带来影响。 + +- **[gaussdb](gaussdb.md)** + +- **[gs\_backup](gs_backup.md)** + +- **[gs\_basebackup](gs_basebackup.md)** + +- **[gs\_ctl](gs_ctl.md)** + +- **[gs\_install](gs_install.md)** + +- **[gs\_postuninstall](gs_postuninstall.md)** + +- **[gs\_preinstall](gs_preinstall.md)** + +- **[gs\_sshexkey](gs_sshexkey.md)** + +- **[gs\_uninstall](gs_uninstall.md)** + +- **[gs\_upgradectl](gs_upgradectl.md)** + +- **[gstrace](gstrace.md)** + +- **[kdb5\_util](kdb5_util.md)** + +- **[kadmin.local](kadmin-local.md)** + +- **[kinit](kinit.md)** + +- **[klist](klist.md)** + +- **[krb5kdc](krb5kdc.md)** + +- **[kdestroy](kdestroy.md)** + +- **[pg\_config](pg_config.md)** + +- **[pg\_controldata](pg_controldata.md)** + +- **[pg\_resetxlog](pg_resetxlog.md)** + + diff --git "a/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-1.md" "b/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-1.md" new file mode 100644 index 000000000..133d71884 --- /dev/null +++ "b/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-1.md" @@ -0,0 +1,50 @@ +# 获取帮助 + +启动调优程序之前,可以通过如下命令获取帮助信息: + +``` +python main.py --help +``` + +输出帮助信息结果如下: + +``` +usage: main.py [-h] [-m {train,tune}] [-f CONFIG_FILE] [--db-name DB_NAME] + [--db-user DB_USER] [--db-user-pwd DB_USER_PWD] [--port PORT] + [--host HOST] [--host-user HOST_USER] + [--host-user-pwd HOST_USER_PWD] [--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. + --db-user-pwd DB_USER_PWD + database user password. + --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-user-pwd HOST_USER_PWD + user password 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/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" "b/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" new file mode 100644 index 000000000..842fb0841 --- /dev/null +++ "b/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251-6.md" @@ -0,0 +1,31 @@ +# 获取帮助 + +使用Sqldiag工具前,您可以通过以下指令获取帮助。 + +``` +cd src +python main.py --help +``` + +显示如下帮助信息: + +``` +usage: main.py [-h] [--train TRAIN] [--model MODEL] [--predict PREDICT] + [--ratio RATIO] + {all,train,predict} + +Slow SQL Diagnose + +positional arguments: + {all,train,predict} Execution style + +optional arguments: + -h, --help show this help message and exit + --train TRAIN History Log Data Directory + --model MODEL Output data directory + --predict PREDICT To-be-predicted workload data directory + --ratio RATIO Ratio threshold for retrain recommend +``` + +您也可以通过工具内的Readme文件获取更加详细的帮助。 + diff --git "a/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251.md" "b/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251.md" new file mode 100644 index 000000000..5940a1e81 --- /dev/null +++ "b/content/zh/docs/Toolreference/\350\216\267\345\217\226\345\270\256\345\212\251.md" @@ -0,0 +1,120 @@ +# 获取帮助 + +## 操作步骤 + +- 连接数据库时,可以使用如下命令获取帮助信息。 + + ``` + gsql --help + ``` + + 显示如下帮助信息: + + ``` + ...... + Usage: + gsql [OPTION]... [DBNAME [USERNAME]] + + General options: + -c, --command=COMMAND run only single command (SQL or internal) and exit + -d, --dbname=DBNAME database name to connect to (default: "postgres") + -f, --file=FILENAME execute commands from file, then exit + ...... + ``` + +- 连接到数据库后,可以使用如下命令获取帮助信息。 + + ``` + help + ``` + + 显示如下帮助信息: + + ``` + You are using gsql, the command-line interface to gaussdb. + Type: \copyright for distribution terms + \h for help with SQL commands + \? for help with gsql commands + \g or terminate with semicolon to execute query + \q to quit + ``` + + +## 任务示例 + +1. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,8000为数据库主节点的端口号。 + + 连接成功后,系统显示类似如下信息: + + ``` + gsql ((openGauss x.x 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=# + ``` + +2. 查看gsql的帮助信息。具体执行命令请参见[表1](#zh-cn_topic_0237152144_zh-cn_topic_0059778941_zh-cn_topic_0058968146_table52020644)。 + + **表 1** 使用gsql联机帮助 + + + + + + + + + + + + + + + + +

描述

+

示例

+

查看版权信息

+

\copyright

+

查看openGauss支持的SQL语句的帮助

+

查看openGauss支持的SQL语句的帮助

+

例如,查看openGauss支持的所有SQL语句:

+
postgres=# \h
+    Available help:
+      ABORT                            
+      ALTER AGGREGATE
+      ALTER APP WORKLOAD GROUP                  
+    ... ...
+

例如,查看CREATE DATABASE命令的参数可使用下面的命令:

+
postgres=# \help CREATE DATABASE
+    Command:     CREATE DATABASE
+    Description: create a new database
+    Syntax:
+    CREATE DATABASE database_name
+         [ [ WITH ] {[ OWNER [=] user_name ]|
+               [ TEMPLATE [=] template ]|
+               [ ENCODING [=] encoding ]|
+               [ LC_COLLATE [=] lc_collate ]|
+               [ LC_CTYPE [=] lc_ctype ]|
+               [ DBCOMPATIBILITY [=] compatibility_type ]|
+               [ TABLESPACE [=] tablespace_name ]|
+               [ CONNECTION LIMIT [=] connlimit ]}[...] ];
+

查看gsql命令的帮助

+

例如,查看gsql支持的命令:

+
postgres=# \?
+    General
+      \copyright             show PostgreSQL usage and distribution terms
+      \g [FILE] or ;         execute query (and send results to file or |pipe)
+      \h(\help) [NAME]              help on syntax of SQL commands, * for all commands
+      \q                     quit gsql
+    ... ...
+
+ + -- Gitee From d464b08a5f9ce19e84fada38ebcb8e4e825b4229 Mon Sep 17 00:00:00 2001 From: liyang0608 <554903772@qq.com> Date: Thu, 28 May 2020 17:46:59 +0800 Subject: [PATCH 27/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Developerguide/.keep | 0 content/zh/docs/Developerguide/ABORT.md | 70 + .../AI\347\211\271\346\200\247.md" | 5 + .../docs/Developerguide/ALTER-DATA-SOURCE.md | 103 + .../zh/docs/Developerguide/ALTER-DATABASE.md | 142 + .../ALTER-DEFAULT-PRIVILEGES.md | 141 + .../zh/docs/Developerguide/ALTER-DIRECTORY.md | 41 + .../zh/docs/Developerguide/ALTER-FUNCTION.md | 190 + content/zh/docs/Developerguide/ALTER-GROUP.md | 43 + content/zh/docs/Developerguide/ALTER-INDEX.md | 165 + .../docs/Developerguide/ALTER-LARGE-OBJECT.md | 36 + content/zh/docs/Developerguide/ALTER-ROLE.md | 120 + .../ALTER-ROW-LEVEL-SECURITY-POLICY.md | 107 + .../zh/docs/Developerguide/ALTER-SCHEMA.md | 76 + .../zh/docs/Developerguide/ALTER-SEQUENCE.md | 76 + .../zh/docs/Developerguide/ALTER-SESSION.md | 85 + .../ALTER-SYSTEM-KILL-SESSION.md | 51 + .../Developerguide/ALTER-TABLE-PARTITION.md | 244 + content/zh/docs/Developerguide/ALTER-TABLE.md | 433 ++ .../docs/Developerguide/ALTER-TABLESPACE.md | 120 + .../ALTER-TEXT-SEARCH-CONFIGURATION.md | 175 + .../ALTER-TEXT-SEARCH-DICTIONARY.md | 101 + .../zh/docs/Developerguide/ALTER-TRIGGER.md | 45 + content/zh/docs/Developerguide/ALTER-TYPE.md | 152 + content/zh/docs/Developerguide/ALTER-USER.md | 113 + content/zh/docs/Developerguide/ALTER-VIEW.md | 130 + .../zh/docs/Developerguide/ANALYZE-ANALYSE.md | 192 + content/zh/docs/Developerguide/BEGIN.md | 54 + content/zh/docs/Developerguide/CALL.md | 79 + content/zh/docs/Developerguide/CHECKPOINT.md | 30 + content/zh/docs/Developerguide/CLOSE.md | 40 + content/zh/docs/Developerguide/CLUSTER.md | 124 + content/zh/docs/Developerguide/COMMENT.md | 149 + content/zh/docs/Developerguide/COMMIT-END.md | 67 + .../zh/docs/Developerguide/COMMIT-PREPARED.md | 35 + content/zh/docs/Developerguide/COPY.md | 633 ++ .../docs/Developerguide/CREATE-DATA-SOURCE.md | 92 + .../zh/docs/Developerguide/CREATE-DATABASE.md | 170 + .../docs/Developerguide/CREATE-DIRECTORY.md | 57 + .../zh/docs/Developerguide/CREATE-FUNCTION.md | 308 + .../zh/docs/Developerguide/CREATE-GROUP.md | 61 + .../zh/docs/Developerguide/CREATE-INDEX.md | 305 + .../docs/Developerguide/CREATE-PROCEDURE.md | 95 + content/zh/docs/Developerguide/CREATE-ROLE.md | 239 + .../CREATE-ROW-LEVLEL-SECURITY-POLICY.md | 224 + .../zh/docs/Developerguide/CREATE-SCHEMA.md | 81 + .../zh/docs/Developerguide/CREATE-SEQUENCE.md | 140 + .../zh/docs/Developerguide/CREATE-TABLE-AS.md | 134 + .../Developerguide/CREATE-TABLE-PARTITION.md | 643 ++ .../zh/docs/Developerguide/CREATE-TABLE.md | 931 +++ .../docs/Developerguide/CREATE-TABLESPACE.md | 131 + .../CREATE-TEXT-SEARCH-CONFIGURATION.md | 123 + .../CREATE-TEXT-SEARCH-DICTIONARY.md | 143 + .../zh/docs/Developerguide/CREATE-TRIGGER.md | 352 + content/zh/docs/Developerguide/CREATE-TYPE.md | 399 ++ content/zh/docs/Developerguide/CREATE-USER.md | 116 + content/zh/docs/Developerguide/CREATE-VIEW.md | 74 + content/zh/docs/Developerguide/CURSOR.md | 65 + content/zh/docs/Developerguide/CopyManager.md | 109 + ...er\347\261\273\347\256\200\344\273\213.md" | 109 + ...25\344\270\200\350\247\210\350\241\250.md" | 78 + ...25\344\270\200\350\247\210\350\241\250.md" | 327 + content/zh/docs/Developerguide/DEALLOCATE.md | 33 + content/zh/docs/Developerguide/DECLARE.md | 91 + content/zh/docs/Developerguide/DELETE.md | 106 + ...25\344\270\200\350\247\210\350\241\250.md" | 60 + content/zh/docs/Developerguide/DO.md | 51 + .../docs/Developerguide/DROP-DATA-SOURCE.md | 51 + .../zh/docs/Developerguide/DROP-DATABASE.md | 52 + .../zh/docs/Developerguide/DROP-DIRECTORY.md | 39 + .../zh/docs/Developerguide/DROP-FUNCTION.md | 54 + content/zh/docs/Developerguide/DROP-GROUP.md | 26 + content/zh/docs/Developerguide/DROP-INDEX.md | 50 + content/zh/docs/Developerguide/DROP-OWNED.md | 34 + .../zh/docs/Developerguide/DROP-PROCEDURE.md | 33 + content/zh/docs/Developerguide/DROP-ROLE.md | 37 + .../DROP-ROW-LEVEL-SECURITY-POLICY.md | 53 + content/zh/docs/Developerguide/DROP-SCHEMA.md | 47 + .../zh/docs/Developerguide/DROP-SEQUENCE.md | 49 + content/zh/docs/Developerguide/DROP-TABLE.md | 44 + .../zh/docs/Developerguide/DROP-TABLESPACE.md | 48 + .../DROP-TEXT-SEARCH-CONFIGURATION.md | 43 + .../DROP-TEXT-SEARCH-DICTIONARY.md | 52 + .../zh/docs/Developerguide/DROP-TRIGGER.md | 47 + content/zh/docs/Developerguide/DROP-TYPE.md | 39 + content/zh/docs/Developerguide/DROP-USER.md | 54 + content/zh/docs/Developerguide/DROP-VIEW.md | 41 + .../zh/docs/Developerguide/Developerguide.md | 55 + content/zh/docs/Developerguide/EXECUTE.md | 54 + .../zh/docs/Developerguide/EXPLAIN-PLAN.md | 79 + content/zh/docs/Developerguide/EXPLAIN.md | 247 + content/zh/docs/Developerguide/FETCH.md | 214 + .../Developerguide/GET_GTM_LITE_STATUS.md | 32 + ...72\344\270\216\346\212\200\345\267\247.md" | 21 + .../GIN\347\264\242\345\274\225.md" | 11 + content/zh/docs/Developerguide/GRANT.md | 461 ++ .../zh/docs/Developerguide/GS_FILE_STAT.md | 109 + .../docs/Developerguide/GS_INSTANCE_TIME.md | 50 + .../zh/docs/Developerguide/GS_OPT_MODEL.md | 142 + .../zh/docs/Developerguide/GS_OS_RUN_INFO.md | 53 + .../zh/docs/Developerguide/GS_REDO_STAT.md | 67 + .../GS_SESSION_CPU_STATISTICS.md | 88 + .../docs/Developerguide/GS_SESSION_MEMORY.md | 46 + .../GS_SESSION_MEMORY_CONTEXT.md | 76 + .../GS_SESSION_MEMORY_DETAIL.md | 78 + .../GS_SESSION_MEMORY_STATISTICS.md | 91 + .../zh/docs/Developerguide/GS_SESSION_STAT.md | 53 + .../zh/docs/Developerguide/GS_SESSION_TIME.md | 46 + .../zh/docs/Developerguide/GS_SQL_COUNT.md | 204 + .../zh/docs/Developerguide/GS_STAT_DB_CU.md | 53 + .../docs/Developerguide/GS_STAT_SESSION_CU.md | 46 + .../GS_THREAD_MEMORY_CONTEXT.md | 83 + .../Developerguide/GS_TOTAL_MEMORY_DETAIL.md | 40 + .../Developerguide/GS_WLM_INSTANCE_HISTORY.md | 127 + .../Developerguide/GS_WLM_OPERATOR_HISTORY.md | 6 + .../Developerguide/GS_WLM_OPERATOR_INFO.md | 173 + .../GS_WLM_OPERATOR_STATISTICS.md | 180 + .../GS_WLM_PLAN_ENCODING_TABLE.md | 74 + .../GS_WLM_PLAN_OPERATOR_HISTORY.md | 6 + .../GS_WLM_PLAN_OPERATOR_INFO.md | 137 + .../GS_WLM_REBUILD_USER_RESOURCE_POOL.md | 4 + .../Developerguide/GS_WLM_RESOURCE_POOL.md | 88 + .../Developerguide/GS_WLM_SESSION_HISTORY.md | 496 ++ .../Developerguide/GS_WLM_SESSION_INFO_ALL.md | 4 + .../GS_WLM_SESSION_QUERY_INFO_ALL.md | 629 ++ .../GS_WLM_SESSION_STATISTICS.md | 363 + .../docs/Developerguide/GS_WLM_USER_INFO.md | 88 + .../GS_WLM_USER_RESOURCE_HISTORY.md | 144 + ...77\347\224\250\350\257\264\346\230\216.md" | 10 + ...47\232\204core\351\227\256\351\242\230.md" | 14 + ...02\346\225\260\350\257\264\346\230\216.md" | 59 + content/zh/docs/Developerguide/INSERT.md | 162 + .../Ispell\350\257\215\345\205\270.md" | 44 + content/zh/docs/Developerguide/JDBC.md | 33 + .../JSON\345\207\275\346\225\260.md" | 37 + .../JSON\347\261\273\345\236\213.md" | 6 + content/zh/docs/Developerguide/LOCK.md | 306 + content/zh/docs/Developerguide/MERGE-INTO.md | 136 + content/zh/docs/Developerguide/MOVE.md | 75 + content/zh/docs/Developerguide/MPP_TABLES.md | 60 + content/zh/docs/Developerguide/ODBC.md | 51 + .../zh/docs/Developerguide/PG_AGGREGATE.md | 111 + content/zh/docs/Developerguide/PG_AM.md | 299 + content/zh/docs/Developerguide/PG_AMOP.md | 105 + content/zh/docs/Developerguide/PG_AMPROC.md | 77 + .../PG_APP_WORKLOADGROUP_MAPPING.md | 39 + content/zh/docs/Developerguide/PG_ATTRDEF.md | 53 + .../zh/docs/Developerguide/PG_ATTRIBUTE.md | 193 + content/zh/docs/Developerguide/PG_AUTHID.md | 189 + .../zh/docs/Developerguide/PG_AUTH_HISTORY.md | 46 + .../zh/docs/Developerguide/PG_AUTH_MEMBERS.md | 46 + .../Developerguide/PG_AVAILABLE_EXTENSIONS.md | 46 + .../PG_AVAILABLE_EXTENSION_VERSIONS.md | 74 + content/zh/docs/Developerguide/PG_CAST.md | 62 + content/zh/docs/Developerguide/PG_CLASS.md | 379 + .../zh/docs/Developerguide/PG_COLLATION.md | 83 + .../zh/docs/Developerguide/PG_CONSTRAINT.md | 214 + .../zh/docs/Developerguide/PG_CONVERSION.md | 92 + content/zh/docs/Developerguide/PG_CURSORS.md | 60 + content/zh/docs/Developerguide/PG_DATABASE.md | 124 + .../docs/Developerguide/PG_DB_ROLE_SETTING.md | 39 + .../zh/docs/Developerguide/PG_DEFAULT_ACL.md | 53 + content/zh/docs/Developerguide/PG_DEPEND.md | 93 + .../zh/docs/Developerguide/PG_DESCRIPTION.md | 58 + .../zh/docs/Developerguide/PG_DIRECTORY.md | 53 + content/zh/docs/Developerguide/PG_ENUM.md | 60 + .../zh/docs/Developerguide/PG_EXTENSION.md | 67 + .../PG_EXTENSION_DATA_SOURCE.md | 83 + .../zh/docs/Developerguide/PG_EXT_STATS.md | 140 + .../Developerguide/PG_FOREIGN_DATA_WRAPPER.md | 83 + .../docs/Developerguide/PG_FOREIGN_SERVER.md | 92 + .../docs/Developerguide/PG_FOREIGN_TABLE.md | 46 + .../Developerguide/PG_GET_INVALID_BACKENDS.md | 53 + .../PG_GET_SENDERS_CATCHUP_TIME.md | 74 + content/zh/docs/Developerguide/PG_GROUP.md | 39 + content/zh/docs/Developerguide/PG_INDEX.md | 152 + content/zh/docs/Developerguide/PG_INDEXES.md | 65 + content/zh/docs/Developerguide/PG_INHERITS.md | 47 + content/zh/docs/Developerguide/PG_JOB.md | 140 + content/zh/docs/Developerguide/PG_JOB_PROC.md | 39 + content/zh/docs/Developerguide/PG_LANGUAGE.md | 101 + .../zh/docs/Developerguide/PG_LARGEOBJECT.md | 51 + .../Developerguide/PG_LARGEOBJECT_METADATA.md | 47 + content/zh/docs/Developerguide/PG_LOCKS.md | 165 + .../zh/docs/Developerguide/PG_NAMESPACE.md | 53 + content/zh/docs/Developerguide/PG_NODE_ENV.md | 67 + content/zh/docs/Developerguide/PG_OBJECT.md | 61 + content/zh/docs/Developerguide/PG_OPCLASS.md | 105 + content/zh/docs/Developerguide/PG_OPERATOR.md | 155 + content/zh/docs/Developerguide/PG_OPFAMILY.md | 69 + .../zh/docs/Developerguide/PG_OS_THREADS.md | 53 + .../zh/docs/Developerguide/PG_PARTITION.md | 225 + .../zh/docs/Developerguide/PG_PLTEMPLATE.md | 74 + .../Developerguide/PG_PREPARED_STATEMENTS.md | 53 + .../docs/Developerguide/PG_PREPARED_XACTS.md | 65 + content/zh/docs/Developerguide/PG_PROC.md | 236 + content/zh/docs/Developerguide/PG_RANGE.md | 76 + .../Developerguide/PG_REPLICATION_SLOTS.md | 88 + .../docs/Developerguide/PG_RESOURCE_POOL.md | 109 + content/zh/docs/Developerguide/PG_REWRITE.md | 83 + .../zh/docs/Developerguide/PG_RLSPOLICIES.md | 67 + .../zh/docs/Developerguide/PG_RLSPOLICY.md | 67 + content/zh/docs/Developerguide/PG_ROLES.md | 236 + content/zh/docs/Developerguide/PG_RULES.md | 46 + .../docs/Developerguide/PG_RUNNING_XACTS.md | 88 + content/zh/docs/Developerguide/PG_SECLABEL.md | 67 + .../zh/docs/Developerguide/PG_SECLABELS.md | 92 + .../docs/Developerguide/PG_SESSION_IOSTAT.md | 83 + .../docs/Developerguide/PG_SESSION_WLMSTAT.md | 188 + content/zh/docs/Developerguide/PG_SETTINGS.md | 130 + content/zh/docs/Developerguide/PG_SHADOW.md | 184 + content/zh/docs/Developerguide/PG_SHDEPEND.md | 111 + .../docs/Developerguide/PG_SHDESCRIPTION.md | 51 + .../zh/docs/Developerguide/PG_SHSECLABEL.md | 62 + .../Developerguide/PG_STATIO_ALL_INDEXES.md | 67 + .../Developerguide/PG_STATIO_ALL_SEQUENCES.md | 53 + .../Developerguide/PG_STATIO_ALL_TABLES.md | 95 + .../Developerguide/PG_STATIO_SYS_INDEXES.md | 67 + .../Developerguide/PG_STATIO_SYS_SEQUENCES.md | 53 + .../Developerguide/PG_STATIO_SYS_TABLES.md | 95 + .../Developerguide/PG_STATIO_USER_INDEXES.md | 67 + .../PG_STATIO_USER_SEQUENCES.md | 53 + .../Developerguide/PG_STATIO_USER_TABLES.md | 95 + .../zh/docs/Developerguide/PG_STATISTIC.md | 115 + .../docs/Developerguide/PG_STATISTIC_EXT.md | 115 + content/zh/docs/Developerguide/PG_STATS.md | 157 + .../docs/Developerguide/PG_STAT_ACTIVITY.md | 178 + .../Developerguide/PG_STAT_ALL_INDEXES.md | 76 + .../docs/Developerguide/PG_STAT_ALL_TABLES.md | 172 + .../docs/Developerguide/PG_STAT_BAD_BLOCK.md | 81 + .../docs/Developerguide/PG_STAT_BGWRITER.md | 95 + .../docs/Developerguide/PG_STAT_DATABASE.md | 151 + .../PG_STAT_DATABASE_CONFLICTS.md | 67 + .../Developerguide/PG_STAT_REPLICATION.md | 123 + .../Developerguide/PG_STAT_SYS_INDEXES.md | 74 + .../docs/Developerguide/PG_STAT_SYS_TABLES.md | 172 + .../Developerguide/PG_STAT_USER_FUNCTIONS.md | 60 + .../Developerguide/PG_STAT_USER_INDEXES.md | 74 + .../Developerguide/PG_STAT_USER_TABLES.md | 172 + .../Developerguide/PG_STAT_XACT_ALL_TABLES.md | 95 + .../Developerguide/PG_STAT_XACT_SYS_TABLES.md | 95 + .../PG_STAT_XACT_USER_FUNCTIONS.md | 60 + .../PG_STAT_XACT_USER_TABLES.md | 95 + content/zh/docs/Developerguide/PG_TABLES.md | 83 + .../zh/docs/Developerguide/PG_TABLESPACE.md | 67 + content/zh/docs/Developerguide/PG_TDE_INFO.md | 41 + .../Developerguide/PG_THREAD_WAIT_STATUS.md | 1071 +++ .../Developerguide/PG_TIMEZONE_ABBREVS.md | 39 + .../docs/Developerguide/PG_TIMEZONE_NAMES.md | 46 + .../Developerguide/PG_TOTAL_MEMORY_DETAIL.md | 39 + .../PG_TOTAL_USER_RESOURCE_INFO.md | 143 + .../PG_TOTAL_USER_RESOURCE_INFO_OID.md | 95 + content/zh/docs/Developerguide/PG_TRIGGER.md | 133 + .../zh/docs/Developerguide/PG_TS_CONFIG.md | 76 + .../docs/Developerguide/PG_TS_CONFIG_MAP.md | 56 + content/zh/docs/Developerguide/PG_TS_DICT.md | 76 + .../zh/docs/Developerguide/PG_TS_PARSER.md | 92 + .../zh/docs/Developerguide/PG_TS_TEMPLATE.md | 65 + content/zh/docs/Developerguide/PG_TYPE.md | 243 + content/zh/docs/Developerguide/PG_USER.md | 151 + .../zh/docs/Developerguide/PG_USER_MAPPING.md | 58 + .../docs/Developerguide/PG_USER_MAPPINGS.md | 76 + .../zh/docs/Developerguide/PG_USER_STATUS.md | 61 + .../docs/Developerguide/PG_VARIABLE_INFO.md | 95 + content/zh/docs/Developerguide/PG_VIEWS.md | 56 + .../docs/Developerguide/PG_WLM_STATISTICS.md | 83 + .../docs/Developerguide/PG_WORKLOAD_GROUP.md | 46 + content/zh/docs/Developerguide/PLAN_TABLE.md | 87 + .../zh/docs/Developerguide/PLAN_TABLE_DATA.md | 100 + content/zh/docs/Developerguide/PQcancel.md | 54 + content/zh/docs/Developerguide/PQclear.md | 39 + .../zh/docs/Developerguide/PQconnectStart.md | 35 + content/zh/docs/Developerguide/PQconnectdb.md | 44 + .../docs/Developerguide/PQconnectdbParams.md | 55 + .../zh/docs/Developerguide/PQconninfoParse.md | 40 + .../zh/docs/Developerguide/PQerrorMessage.md | 39 + content/zh/docs/Developerguide/PQexec.md | 51 + .../zh/docs/Developerguide/PQexecParams.md | 72 + .../docs/Developerguide/PQexecParamsBatch.md | 78 + .../zh/docs/Developerguide/PQexecPrepared.md | 71 + .../Developerguide/PQexecPreparedBatch.md | 77 + content/zh/docs/Developerguide/PQfinish.md | 39 + content/zh/docs/Developerguide/PQflush.md | 43 + content/zh/docs/Developerguide/PQfname.md | 45 + .../zh/docs/Developerguide/PQfreeCancel.md | 39 + content/zh/docs/Developerguide/PQgetCancel.md | 43 + content/zh/docs/Developerguide/PQgetvalue.md | 55 + content/zh/docs/Developerguide/PQnfields.md | 39 + content/zh/docs/Developerguide/PQntuples.md | 39 + content/zh/docs/Developerguide/PQprepare.md | 71 + content/zh/docs/Developerguide/PQreset.md | 39 + .../zh/docs/Developerguide/PQresultStatus.md | 78 + .../zh/docs/Developerguide/PQsendPrepare.md | 67 + content/zh/docs/Developerguide/PQsendQuery.md | 48 + .../docs/Developerguide/PQsendQueryParams.md | 85 + .../Developerguide/PQsendQueryPrepared.md | 79 + .../zh/docs/Developerguide/PQsetdbLogin.md | 80 + content/zh/docs/Developerguide/PQstatus.md | 69 + .../Developerguide/PREPARE-TRANSACTION.md | 37 + content/zh/docs/Developerguide/PREPARE.md | 41 + content/zh/docs/Developerguide/Query.md | 74 + .../zh/docs/Developerguide/REASSIGN-OWNED.md | 34 + content/zh/docs/Developerguide/REINDEX.md | 139 + .../docs/Developerguide/RELEASE-SAVEPOINT.md | 63 + content/zh/docs/Developerguide/RESET.md | 63 + content/zh/docs/Developerguide/REVOKE.md | 149 + .../docs/Developerguide/ROLLBACK-PREPARED.md | 28 + .../Developerguide/ROLLBACK-TO-SAVEPOINT.md | 53 + content/zh/docs/Developerguide/ROLLBACK.md | 38 + content/zh/docs/Developerguide/SAVEPOINT.md | 93 + content/zh/docs/Developerguide/SELECT-INTO.md | 69 + content/zh/docs/Developerguide/SELECT.md | 591 ++ .../SEQUENCE\345\207\275\346\225\260.md" | 118 + .../zh/docs/Developerguide/SET-CONSTRAINTS.md | 54 + content/zh/docs/Developerguide/SET-ROLE.md | 72 + .../SET-SESSION-AUTHORIZATION.md | 76 + .../zh/docs/Developerguide/SET-TRANSACTION.md | 60 + content/zh/docs/Developerguide/SET.md | 116 + content/zh/docs/Developerguide/SHOW.md | 42 + .../zh/docs/Developerguide/SQLAllocConnect.md | 4 + content/zh/docs/Developerguide/SQLAllocEnv.md | 4 + .../zh/docs/Developerguide/SQLAllocHandle.md | 61 + .../zh/docs/Developerguide/SQLAllocStmt.md | 4 + content/zh/docs/Developerguide/SQLBindCol.md | 76 + .../docs/Developerguide/SQLBindParameter.md | 100 + .../zh/docs/Developerguide/SQLColAttribute.md | 82 + content/zh/docs/Developerguide/SQLConnect.md | 83 + .../zh/docs/Developerguide/SQLDisconnect.md | 46 + .../zh/docs/Developerguide/SQLExecDirect.md | 61 + content/zh/docs/Developerguide/SQLExecute.md | 49 + content/zh/docs/Developerguide/SQLFetch.md | 48 + .../zh/docs/Developerguide/SQLFreeConnect.md | 4 + content/zh/docs/Developerguide/SQLFreeEnv.md | 4 + .../zh/docs/Developerguide/SQLFreeHandle.md | 54 + content/zh/docs/Developerguide/SQLFreeStmt.md | 4 + content/zh/docs/Developerguide/SQLGetData.md | 78 + .../zh/docs/Developerguide/SQLGetDiagRec.md | 159 + content/zh/docs/Developerguide/SQLPrepare.md | 59 + .../docs/Developerguide/SQLSetConnectAttr.md | 64 + .../zh/docs/Developerguide/SQLSetEnvAttr.md | 65 + .../zh/docs/Developerguide/SQLSetStmtAttr.md | 64 + .../SQL\345\217\202\350\200\203.md" | 33 + ...04\346\265\213\347\211\271\346\200\247.md" | 11 + .../SQL\350\257\255\346\263\225.md" | 229 + ...\344\271\246\347\256\241\347\220\206-6.md" | 9 + ...01\344\271\246\347\256\241\347\220\206.md" | 9 + .../docs/Developerguide/START-TRANSACTION.md | 84 + content/zh/docs/Developerguide/Schema.md | 63 + .../Simple\350\257\215\345\205\270.md" | 59 + .../Snowball\350\257\215\345\205\270.md" | 8 + .../Synonym\350\257\215\345\205\270.md" | 111 + content/zh/docs/Developerguide/TRUNCATE.md | 123 + .../Thesaurus\350\257\215\345\205\270.md" | 87 + ...70\345\205\263\346\236\204\351\200\240.md" | 115 + content/zh/docs/Developerguide/UPDATE.md | 125 + .../UUID\347\261\273\345\236\213.md" | 23 + content/zh/docs/Developerguide/VACUUM.md | 118 + content/zh/docs/Developerguide/VALUES.md | 62 + ...56\351\242\230\345\256\232\344\275\215.md" | 7 + .../java-sql-CallableStatement.md | 135 + .../Developerguide/java-sql-Connection.md | 119 + .../java-sql-DatabaseMetaData.md | 438 ++ .../zh/docs/Developerguide/java-sql-Driver.md | 53 + .../java-sql-PreparedStatement.md | 164 + .../docs/Developerguide/java-sql-ResultSet.md | 239 + .../java-sql-ResultSetMetaData.md | 46 + .../docs/Developerguide/java-sql-Statement.md | 106 + .../Developerguide/javax-naming-Context.md | 88 + .../javax-naming-spi-InitialContextFactory.md | 25 + .../javax-sql-ConnectionPoolDataSource.md | 60 + .../Developerguide/javax-sql-DataSource.md | 60 + .../javax-sql-PooledConnection.md | 60 + content/zh/docs/Developerguide/libpq.md | 15 + .../zh/docs/Developerguide/openGauss-SQL.md | 31 + .../openGauss\344\272\213\345\212\241.md" | 124 + .../Developerguide/public_sys-resources/.keep | 0 .../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 ...11\346\235\203\345\210\206\347\253\213.md" | 188 + ...73\346\234\215\345\212\241\345\231\250.md" | 144 + ...13\345\212\241\346\216\247\345\210\266.md" | 23 + ...13\345\212\241\347\233\221\346\216\247.md" | 29 + ...24\347\246\273\350\257\264\346\230\216.md" | 13 + ...14\346\223\215\344\275\234\347\254\246.md" | 172 + ...33\345\210\266\347\261\273\345\236\213.md" | 73 + .../\344\273\213\347\273\215-17.md" | 10 + .../\344\273\213\347\273\215.md" | 11 + ...31\351\207\214\345\274\200\345\247\213.md" | 145 + ...00\351\224\200\345\270\270\351\207\217.md" | 87 + ...71\346\263\225\351\205\215\347\275\256.md" | 335 + .../\344\274\252\347\261\273\345\236\213.md" | 122 + ...14\346\223\215\344\275\234\347\254\246.md" | 144 + ...15\344\270\262\347\261\273\345\236\213.md" | 44 + ...74\345\205\245\346\225\260\346\215\256.md" | 11 + ...61\345\261\202\345\244\215\345\210\266.md" | 31 + ...61\345\261\202\345\244\215\345\210\266.md" | 40 + ...17\345\206\231\346\227\245\345\277\227.md" | 187 + ...44\346\233\264\346\226\260\350\241\250.md" | 70 + ...74\345\207\272\346\225\260\346\215\256.md" | 11 + ...74\345\205\245\346\225\260\346\215\256.md" | 303 + ...74\345\205\245\346\225\260\346\215\256.md" | 199 + ...47\224\250gsql\350\277\236\346\216\245.md" | 114 + ...22\345\205\245\346\225\260\346\215\256.md" | 142 + ...77\347\224\250\346\214\207\345\215\227.md" | 192 + .../\345\200\274\345\255\230\345\202\250.md" | 30 + .../\345\201\234\347\224\250\350\257\215.md" | 27 + ...50\346\226\207\346\243\200\347\264\242.md" | 23 + ...00\347\264\242\346\246\202\350\277\260.md" | 35 + ...74\345\205\245\346\225\260\346\215\256.md" | 9 + .../\345\205\263\351\224\256\345\255\227.md" | 6293 +++++++++++++++++ ...26\345\231\250\351\200\211\351\241\271.md" | 345 + ...66\344\273\226\346\223\215\344\275\234.md" | 13 + ...66\344\273\226\347\274\272\347\234\201.md" | 48 + ...66\345\256\203\345\207\275\346\225\260.md" | 250 + ...66\345\256\203\351\200\211\351\241\271.md" | 401 ++ .../\345\206\205\345\255\230.md" | 281 + .../\345\206\205\345\255\230\350\241\250.md" | 67 + ...04\346\272\220\344\275\277\347\224\250.md" | 34 + ...45\345\217\243\345\207\275\346\225\260.md" | 2225 ++++++ ...73\345\206\231\346\223\215\344\275\234.md" | 13 + ...14\346\223\215\344\275\234\347\254\246.md" | 929 +++ ...40\344\275\225\347\261\273\345\236\213.md" | 179 + .../\345\207\275\346\225\260.md" | 91 + ...14\346\223\215\344\275\234\347\254\246.md" | 61 + .../\345\210\206\346\236\220\350\241\250.md" | 40 + .../\345\210\206\350\257\215\345\231\250.md" | 15 + ...15\345\231\250\346\265\213\350\257\225.md" | 59 + ...60\346\215\256\347\261\273\345\236\213.md" | 214 + ...\222\214\347\256\241\347\220\206schema.md" | 155 + ...06\345\210\206\345\214\272\350\241\250.md" | 199 + ...41\347\220\206\345\272\217\345\210\227.md" | 78 + ...06\346\225\260\346\215\256\345\272\223.md" | 99 + ...41\347\220\206\347\264\242\345\274\225.md" | 239 + ...14\347\256\241\347\220\206\350\241\250.md" | 13 + ...06\350\241\250\347\251\272\351\227\264.md" | 176 + ...41\347\220\206\350\247\206\345\233\276.md" | 55 + ...33\345\273\272\347\264\242\345\274\225.md" | 59 + .../\345\210\233\345\273\272\350\241\250.md" | 28 + ...50\344\270\255\346\225\260\346\215\256.md" | 32 + ...14\346\240\274\345\274\217\345\214\226.md" | 178 + ...07\347\272\247\345\217\202\346\225\260.md" | 37 + ...54\345\205\274\345\256\271\346\200\247.md" | 127 + ...14\346\234\272\345\244\215\345\210\266.md" | 9 + ...57\346\234\215\345\212\241\345\231\250.md" | 115 + ...06\347\232\204\346\237\245\350\257\242.md" | 11 + ...57\345\206\231\350\277\233\347\250\213.md" | 49 + ...22\345\205\245\346\225\260\346\215\256.md" | 219 + ...12\350\255\246\346\243\200\346\265\213.md" | 47 + ...42\351\224\201\345\207\275\346\225\260.md" | 171 + ...05\347\220\206\345\273\266\350\277\237.md" | 69 + ...42\344\274\230\345\214\226\345\231\250.md" | 99 + ...07\346\234\254\345\214\271\351\205\215.md" | 53 + .../\345\244\204\347\220\206tsvector.md" | 26 + ...04\347\220\206\346\237\245\350\257\242.md" | 51 + ...47\345\210\266\345\207\275\346\225\260.md" | 217 + ...07\346\234\215\345\212\241\345\231\250.md" | 118 + ...42\350\241\250\350\276\276\345\274\217.md" | 135 + ...14\346\223\215\344\275\234\347\254\246.md" | 1522 ++++ ...27\347\254\246\347\261\273\345\236\213.md" | 152 + ...11\345\205\250\345\207\275\346\225\260.md" | 298 + ...357\274\210postgresql-conf\357\274\211.md" | 381 + .../\345\256\236\347\216\260.md" | 18 + .../\345\256\241\350\256\241.md" | 9 + ...41\350\256\241\345\274\200\345\205\263.md" | 107 + ...41\350\256\241\346\246\202\350\277\260.md" | 471 ++ ...\345\205\245\350\256\244\350\257\201-0.md" | 15 + ...45\345\205\245\350\256\244\350\257\201.md" | 15 + ...72\347\234\201\350\256\276\347\275\256.md" | 9 + .../\345\256\271\351\224\231\346\200\247.md" | 99 + ...\241\250\346\211\247\350\241\214VACUUM.md" | 17 + ...06\347\254\246\347\261\273\345\236\213.md" | 191 + ...74\345\205\245\346\225\260\346\215\256.md" | 53 + ...50\345\261\200\345\257\271\350\261\241.md" | 92 + ...52\346\225\260\346\215\256\345\272\223.md" | 9 + ...346\225\260\346\215\256\345\272\223-13.md" | 95 + ...11\346\225\260\346\215\256\345\272\223.md" | 7 + ...74\345\207\272\346\225\260\346\215\256.md" | 5 + ...72\346\225\260\346\215\256\345\272\223.md" | 129 + ...74\345\207\272\346\250\241\345\274\217.md" | 144 + .../\345\257\274\345\207\272\350\241\250.md" | 168 + ...03\345\260\224\347\261\273\345\236\213.md" | 72 + ...32\344\275\215\346\214\207\345\215\227.md" | 5 + ...56\351\242\230\345\244\204\347\220\206.md" | 20 + ...70\351\207\217\344\270\216\345\256\217.md" | 113 + ...57\345\205\274\345\256\271\346\200\247.md" | 53 + ...73\351\224\201\346\203\205\345\206\265.md" | 7 + ...31\345\205\245\347\244\272\344\276\213.md" | 17 + ...66\350\241\214\345\257\274\345\205\245.md" | 52 + ...13\345\272\217\346\216\245\345\217\243.md" | 34 + ...72\345\221\230\351\200\211\351\241\271.md" | 657 ++ .../\345\274\202\346\255\245IO.md" | 111 + ...75\344\273\244\345\244\204\347\220\206.md" | 26 + .../\345\275\222\346\241\243.md" | 50 + ...14\346\255\245\345\207\275\346\225\260.md" | 18 + ...47\350\203\275\347\273\237\350\256\241.md" | 28 + ...51\345\261\225\345\207\275\346\225\260.md" | 45 + .../\346\211\251\345\261\225\346\200\247.md" | 49 + ...51\345\261\225\350\257\255\346\263\225.md" | 321 + ...45\350\257\242\347\273\223\346\236\234.md" | 102 + ...45\345\217\243\345\217\202\350\200\203.md" | 9 + ...07\346\234\254\346\220\234\347\264\242.md" | 13 + .../\346\220\234\347\264\242\350\241\250.md" | 86 + ...15\344\275\234\345\256\241\350\256\241.md" | 310 + .../\346\223\215\344\275\234\347\254\246.md" | 82 + ...07\347\214\256\347\273\237\350\256\241.md" | 44 + ...60\345\200\274\347\261\273\345\236\213.md" | 417 ++ ...14\346\223\215\344\275\234\347\254\246.md" | 830 +++ ...42\347\232\204\345\271\266\345\217\221.md" | 33 + ...56\345\272\223\344\275\277\347\224\250.md" | 21 + ...71\350\261\241\345\207\275\346\225\260.md" | 454 ++ ...55\345\217\245\345\207\275\346\225\260.md" | 29 + ...47\345\210\266\345\207\275\346\225\260.md" | 23 + ...21\347\273\223\346\236\204\345\233\276.md" | 14 + ...04\347\220\206\350\277\207\347\250\213.md" | 5 + ...60\346\215\256\347\261\273\345\236\213.md" | 37 + ...14\346\223\215\344\275\234\347\254\246.md" | 380 + ...04\350\241\250\350\276\276\345\274\217.md" | 94 + ...07\344\273\266\344\275\215\347\275\256.md" | 63 + ...34\347\264\242\347\261\273\345\236\213.md" | 162 + ...14\346\223\215\344\275\234\347\254\246.md" | 516 ++ ...07\346\241\243\346\246\202\345\277\265.md" | 27 + ...74\345\207\272\346\225\260\346\215\256.md" | 125 + ...45\345\277\227\345\233\236\346\224\276.md" | 70 + ...66\351\227\264\347\261\273\345\236\213.md" | 616 ++ ...14\346\223\215\344\275\234\347\254\246.md" | 1333 ++++ ...344\270\255\346\225\260\346\215\256-11.md" | 7 + ...50\344\270\255\346\225\260\346\215\256.md" | 40 + ...00\344\275\263\345\256\236\350\267\265.md" | 79 + ...41\345\217\267\345\207\275\346\225\260.md" | 53 + ...66\350\241\250\350\276\276\345\274\217.md" | 214 + ...76\345\274\217\345\207\275\346\225\260.md" | 193 + ...23\345\211\215\345\217\226\345\200\274.md" | 70 + ...41\350\256\241\347\273\223\346\236\234.md" | 92 + ...45\347\234\213\346\225\260\346\215\256.md" | 51 + ...\350\277\236\346\216\245\346\225\260-5.md" | 116 + ...23\350\277\236\346\216\245\346\225\260.md" | 115 + ...13\347\263\273\347\273\237\350\241\250.md" | 137 + ...41\346\224\266\351\233\206\345\231\250.md" | 144 + ...45\350\257\242\350\247\204\345\210\222.md" | 18 + ...45\350\257\242\351\207\215\345\206\231.md" | 63 + .../\346\243\200\346\237\245\347\202\271.md" | 101 + .../\346\246\202\350\277\260-12.md" | 77 + .../\346\246\202\350\277\260-14.md" | 4 + .../\346\246\202\350\277\260-15.md" | 47 + .../\346\246\202\350\277\260.md" | 11 + ...15\346\223\215\344\275\234\347\254\246.md" | 311 + ...03\346\223\215\344\275\234\347\254\246.md" | 52 + ...07\346\234\254\346\220\234\347\264\242.md" | 11 + ...61\345\261\202\345\244\215\345\210\266.md" | 13 + ...60\345\205\274\345\256\271\346\200\247.md" | 7 + ...32\204TCP-IP\350\277\236\346\216\245-4.md" | 30 + ...\232\204TCP-IP\350\277\236\346\216\245.md" | 30 + ...32\204TCP-IP\350\277\236\346\216\245-3.md" | 544 ++ ...\232\204TCP-IP\350\277\236\346\216\245.md" | 543 ++ .../\347\224\250\346\210\267.md" | 47 + ...03\351\231\220\345\256\241\350\256\241.md" | 73 + ...03\351\231\220\350\256\276\347\275\256.md" | 43 + ...70\345\205\263\346\246\202\345\277\265.md" | 22 + ...\222\214DELETE\345\271\266\345\217\221.md" | 33 + ...\232\204\345\271\266\345\217\221INSERT.md" | 33 + ...\232\204\345\271\266\345\217\221UPDATE.md" | 34 + ...36\346\216\245\344\277\241\346\201\257.md" | 48 + ...47\232\204core\351\227\256\351\242\230.md" | 16 + ...01\347\233\230\347\251\272\351\227\264.md" | 29 + .../\347\244\272\344\276\213-10.md" | 446 ++ .../\347\244\272\344\276\213.md" | 339 + ...74\345\207\272\346\225\260\346\215\256.md" | 111 + ...60\346\215\256\350\277\201\347\247\273.md" | 91 + ...27\345\217\243\345\207\275\346\225\260.md" | 625 ++ ...11\345\276\205\344\272\213\344\273\266.md" | 15 + ...25\350\241\250\350\276\276\345\274\217.md" | 98 + ...41\347\220\206\344\272\213\345\212\241.md" | 42 + .../\347\256\241\347\220\206\345\221\230.md" | 44 + ...31\345\205\245\346\223\215\344\275\234.md" | 11 + ...56\345\272\223\345\256\211\345\205\250.md" | 9 + ...67\345\217\212\346\235\203\351\231\220.md" | 21 + ...73\345\236\213\350\275\254\346\215\242.md" | 13 + ...54\346\215\242\345\207\275\346\225\260.md" | 588 ++ ...41\346\201\257\345\207\275\346\225\260.md" | 1162 +++ ...47\350\203\275\345\277\253\347\205\247.md" | 45 + ...73\347\273\237\346\223\215\344\275\234.md" | 28 + ...41\347\220\206\345\207\275\346\225\260.md" | 21 + .../\347\263\273\347\273\237\350\241\250.md" | 145 + ...73\347\273\237\350\247\206\345\233\276.md" | 9 + ...06\345\233\276\346\246\202\350\277\260.md" | 13 + ...73\347\273\237\350\247\206\345\233\276.md" | 185 + ...77\347\224\250\347\272\246\346\235\237.md" | 37 + ...41\346\201\257\345\207\275\346\225\260.md" | 1634 +++++ ...41\350\256\241\346\227\245\345\277\227.md" | 196 + ...14\346\223\215\344\275\234\347\254\246.md" | 452 ++ ...60\345\235\200\347\261\273\345\236\213.md" | 175 + ...32\351\233\206\345\207\275\346\225\260.md" | 730 ++ ...52\345\212\250\346\270\205\347\220\206.md" | 192 + ...14\346\223\215\344\275\234\347\254\246.md" | 394 ++ ...77\351\227\256\346\216\247\345\210\266.md" | 83 + ...14\350\241\250\350\276\276\345\274\217.md" | 22 + ...50\345\222\214\347\264\242\345\274\225.md" | 9 + .../\350\241\250\350\276\276\345\274\217.md" | 13 + ...30\345\202\250\346\250\241\345\236\213.md" | 119 + .../\350\247\222\350\211\262.md" | 20 + .../\350\247\243\346\236\220\345\231\250.md" | 338 + ...20\345\231\250\346\265\213\350\257\225.md" | 63 + ...43\346\236\220\346\226\207\346\241\243.md" | 46 + ...43\346\236\220\346\237\245\350\257\242.md" | 68 + ...21\345\231\250\345\207\275\346\225\260.md" | 37 + ...27\347\232\204\344\275\215\347\275\256.md" | 160 + ...27\347\232\204\345\206\205\345\256\271.md" | 389 + ...27\347\232\204\346\227\266\351\227\264.md" | 183 + .../\350\256\276\347\275\256.md" | 189 + ...11\345\205\250\347\255\226\347\225\245.md" | 9 + ...11\345\205\250\347\255\226\347\225\245.md" | 518 ++ ...67\346\234\211\346\225\210\346\234\237.md" | 57 + ...11\345\205\250\347\255\226\347\225\245.md" | 133 + ...56\345\272\223\345\256\241\350\256\241.md" | 11 + ...\345\205\250\347\255\226\347\225\245-9.md" | 211 + ...11\345\205\250\347\255\226\347\225\245.md" | 169 + ...\344\271\246\346\233\277\346\215\242-8.md" | 62 + ...01\344\271\246\346\233\277\346\215\242.md" | 62 + ...\344\271\246\347\224\237\346\210\220-7.md" | 269 + ...01\344\271\246\347\224\237\346\210\220.md" | 269 + .../\350\257\215\345\205\270.md" | 17 + ...15\345\205\270\346\246\202\350\277\260.md" | 33 + ...15\345\205\270\346\265\213\350\257\225.md" | 23 + ...55\345\217\245\350\241\214\344\270\272.md" | 248 + ...37\350\275\275\347\256\241\347\220\206.md" | 376 + ...47\345\270\201\347\261\273\345\236\213.md" | 47 + ...04\346\272\220\346\266\210\350\200\227.md" | 15 + ...14\346\227\266\347\273\237\350\256\241.md" | 7 + ...10\347\232\204\345\207\275\346\225\260.md" | 130 + ...45\345\222\214\350\256\244\350\257\201.md" | 9 + ...45\346\225\260\346\215\256\345\272\223.md" | 16 + ...45\346\261\240\345\217\202\346\225\260.md" | 37 + ...36\346\216\245\350\256\276\347\275\256.md" | 143 + ...41\345\272\223\345\217\202\346\225\260.md" | 215 + ...77\351\227\256\345\207\275\346\225\260.md" | 143 + ...31\345\205\245\346\225\260\346\215\256.md" | 15 + ...61\345\261\202\345\244\215\345\210\266.md" | 36 + ...15\345\210\266\345\207\275\346\225\260.md" | 127 + ...21\346\223\215\344\275\234\347\254\246.md" | 93 + ...\345\205\245\350\256\244\350\257\201-1.md" | 115 + ...45\345\205\245\350\256\244\350\257\201.md" | 115 + ...\344\273\266\345\217\202\350\200\203-2.md" | 133 + ...07\344\273\266\345\217\202\350\200\203.md" | 133 + ...34\347\250\213\350\277\236\346\216\245.md" | 41 + ...15\347\275\256\347\244\272\344\276\213.md" | 111 + ...76\347\275\256\345\207\275\346\225\260.md" | 39 + ...20\350\241\214\345\217\202\346\225\260.md" | 7 + ...15\350\256\276\345\217\202\346\225\260.md" | 635 ++ ...76\346\216\245\345\255\227\347\254\246.md" | 83 + .../\351\224\201\347\256\241\347\220\206.md" | 124 + ...12\345\222\214\346\227\245\345\277\227.md" | 11 + ...04\345\212\240\345\212\237\350\203\275.md" | 11 + .../\351\231\204\345\275\225-16.md" | 9 + .../\351\231\204\345\275\225.md" | 7 + ...20\345\210\266\347\272\246\346\235\237.md" | 10 + ...31\345\274\217\346\227\245\345\277\227.md" | 11 + ...34\347\264\242\347\273\223\346\236\234.md" | 64 + ...03\351\231\220\346\234\272\345\210\266.md" | 14 + 662 files changed, 85478 insertions(+) delete mode 100644 content/zh/docs/Developerguide/.keep create mode 100644 content/zh/docs/Developerguide/ABORT.md create mode 100644 "content/zh/docs/Developerguide/AI\347\211\271\346\200\247.md" create mode 100644 content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md create mode 100644 content/zh/docs/Developerguide/ALTER-DATABASE.md create mode 100644 content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md create mode 100644 content/zh/docs/Developerguide/ALTER-DIRECTORY.md create mode 100644 content/zh/docs/Developerguide/ALTER-FUNCTION.md create mode 100644 content/zh/docs/Developerguide/ALTER-GROUP.md create mode 100644 content/zh/docs/Developerguide/ALTER-INDEX.md create mode 100644 content/zh/docs/Developerguide/ALTER-LARGE-OBJECT.md create mode 100644 content/zh/docs/Developerguide/ALTER-ROLE.md create mode 100644 content/zh/docs/Developerguide/ALTER-ROW-LEVEL-SECURITY-POLICY.md create mode 100644 content/zh/docs/Developerguide/ALTER-SCHEMA.md create mode 100644 content/zh/docs/Developerguide/ALTER-SEQUENCE.md create mode 100644 content/zh/docs/Developerguide/ALTER-SESSION.md create mode 100644 content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md create mode 100644 content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md create mode 100644 content/zh/docs/Developerguide/ALTER-TABLE.md create mode 100644 content/zh/docs/Developerguide/ALTER-TABLESPACE.md create mode 100644 content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md create mode 100644 content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md create mode 100644 content/zh/docs/Developerguide/ALTER-TRIGGER.md create mode 100644 content/zh/docs/Developerguide/ALTER-TYPE.md create mode 100644 content/zh/docs/Developerguide/ALTER-USER.md create mode 100644 content/zh/docs/Developerguide/ALTER-VIEW.md create mode 100644 content/zh/docs/Developerguide/ANALYZE-ANALYSE.md create mode 100644 content/zh/docs/Developerguide/BEGIN.md create mode 100644 content/zh/docs/Developerguide/CALL.md create mode 100644 content/zh/docs/Developerguide/CHECKPOINT.md create mode 100644 content/zh/docs/Developerguide/CLOSE.md create mode 100644 content/zh/docs/Developerguide/CLUSTER.md create mode 100644 content/zh/docs/Developerguide/COMMENT.md create mode 100644 content/zh/docs/Developerguide/COMMIT-END.md create mode 100644 content/zh/docs/Developerguide/COMMIT-PREPARED.md create mode 100644 content/zh/docs/Developerguide/COPY.md create mode 100644 content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md create mode 100644 content/zh/docs/Developerguide/CREATE-DATABASE.md create mode 100644 content/zh/docs/Developerguide/CREATE-DIRECTORY.md create mode 100644 content/zh/docs/Developerguide/CREATE-FUNCTION.md create mode 100644 content/zh/docs/Developerguide/CREATE-GROUP.md create mode 100644 content/zh/docs/Developerguide/CREATE-INDEX.md create mode 100644 content/zh/docs/Developerguide/CREATE-PROCEDURE.md create mode 100644 content/zh/docs/Developerguide/CREATE-ROLE.md create mode 100644 content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md create mode 100644 content/zh/docs/Developerguide/CREATE-SCHEMA.md create mode 100644 content/zh/docs/Developerguide/CREATE-SEQUENCE.md create mode 100644 content/zh/docs/Developerguide/CREATE-TABLE-AS.md create mode 100644 content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md create mode 100644 content/zh/docs/Developerguide/CREATE-TABLE.md create mode 100644 content/zh/docs/Developerguide/CREATE-TABLESPACE.md create mode 100644 content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md create mode 100644 content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md create mode 100644 content/zh/docs/Developerguide/CREATE-TRIGGER.md create mode 100644 content/zh/docs/Developerguide/CREATE-TYPE.md create mode 100644 content/zh/docs/Developerguide/CREATE-USER.md create mode 100644 content/zh/docs/Developerguide/CREATE-VIEW.md create mode 100644 content/zh/docs/Developerguide/CURSOR.md create mode 100644 content/zh/docs/Developerguide/CopyManager.md create mode 100644 "content/zh/docs/Developerguide/CopyManager\347\261\273\347\256\200\344\273\213.md" create mode 100644 "content/zh/docs/Developerguide/DCL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/DDL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" create mode 100644 content/zh/docs/Developerguide/DEALLOCATE.md create mode 100644 content/zh/docs/Developerguide/DECLARE.md create mode 100644 content/zh/docs/Developerguide/DELETE.md create mode 100644 "content/zh/docs/Developerguide/DML\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" create mode 100644 content/zh/docs/Developerguide/DO.md create mode 100644 content/zh/docs/Developerguide/DROP-DATA-SOURCE.md create mode 100644 content/zh/docs/Developerguide/DROP-DATABASE.md create mode 100644 content/zh/docs/Developerguide/DROP-DIRECTORY.md create mode 100644 content/zh/docs/Developerguide/DROP-FUNCTION.md create mode 100644 content/zh/docs/Developerguide/DROP-GROUP.md create mode 100644 content/zh/docs/Developerguide/DROP-INDEX.md create mode 100644 content/zh/docs/Developerguide/DROP-OWNED.md create mode 100644 content/zh/docs/Developerguide/DROP-PROCEDURE.md create mode 100644 content/zh/docs/Developerguide/DROP-ROLE.md create mode 100644 content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md create mode 100644 content/zh/docs/Developerguide/DROP-SCHEMA.md create mode 100644 content/zh/docs/Developerguide/DROP-SEQUENCE.md create mode 100644 content/zh/docs/Developerguide/DROP-TABLE.md create mode 100644 content/zh/docs/Developerguide/DROP-TABLESPACE.md create mode 100644 content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md create mode 100644 content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md create mode 100644 content/zh/docs/Developerguide/DROP-TRIGGER.md create mode 100644 content/zh/docs/Developerguide/DROP-TYPE.md create mode 100644 content/zh/docs/Developerguide/DROP-USER.md create mode 100644 content/zh/docs/Developerguide/DROP-VIEW.md create mode 100644 content/zh/docs/Developerguide/Developerguide.md create mode 100644 content/zh/docs/Developerguide/EXECUTE.md create mode 100644 content/zh/docs/Developerguide/EXPLAIN-PLAN.md create mode 100644 content/zh/docs/Developerguide/EXPLAIN.md create mode 100644 content/zh/docs/Developerguide/FETCH.md create mode 100644 content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md create mode 100644 "content/zh/docs/Developerguide/GIN\346\217\220\347\244\272\344\270\216\346\212\200\345\267\247.md" create mode 100644 "content/zh/docs/Developerguide/GIN\347\264\242\345\274\225.md" create mode 100644 content/zh/docs/Developerguide/GRANT.md create mode 100644 content/zh/docs/Developerguide/GS_FILE_STAT.md create mode 100644 content/zh/docs/Developerguide/GS_INSTANCE_TIME.md create mode 100644 content/zh/docs/Developerguide/GS_OPT_MODEL.md create mode 100644 content/zh/docs/Developerguide/GS_OS_RUN_INFO.md create mode 100644 content/zh/docs/Developerguide/GS_REDO_STAT.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_MEMORY.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_STAT.md create mode 100644 content/zh/docs/Developerguide/GS_SESSION_TIME.md create mode 100644 content/zh/docs/Developerguide/GS_SQL_COUNT.md create mode 100644 content/zh/docs/Developerguide/GS_STAT_DB_CU.md create mode 100644 content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md create mode 100644 content/zh/docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md create mode 100644 content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_USER_INFO.md create mode 100644 content/zh/docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md create mode 100644 "content/zh/docs/Developerguide/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" create mode 100644 "content/zh/docs/Developerguide/GUC\345\217\202\346\225\260log_directory\350\256\276\347\275\256\344\270\215\346\255\243\347\241\256\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" create mode 100644 "content/zh/docs/Developerguide/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" create mode 100644 content/zh/docs/Developerguide/INSERT.md create mode 100644 "content/zh/docs/Developerguide/Ispell\350\257\215\345\205\270.md" create mode 100644 content/zh/docs/Developerguide/JDBC.md create mode 100644 "content/zh/docs/Developerguide/JSON\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/JSON\347\261\273\345\236\213.md" create mode 100644 content/zh/docs/Developerguide/LOCK.md create mode 100644 content/zh/docs/Developerguide/MERGE-INTO.md create mode 100644 content/zh/docs/Developerguide/MOVE.md create mode 100644 content/zh/docs/Developerguide/MPP_TABLES.md create mode 100644 content/zh/docs/Developerguide/ODBC.md create mode 100644 content/zh/docs/Developerguide/PG_AGGREGATE.md create mode 100644 content/zh/docs/Developerguide/PG_AM.md create mode 100644 content/zh/docs/Developerguide/PG_AMOP.md create mode 100644 content/zh/docs/Developerguide/PG_AMPROC.md create mode 100644 content/zh/docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md create mode 100644 content/zh/docs/Developerguide/PG_ATTRDEF.md create mode 100644 content/zh/docs/Developerguide/PG_ATTRIBUTE.md create mode 100644 content/zh/docs/Developerguide/PG_AUTHID.md create mode 100644 content/zh/docs/Developerguide/PG_AUTH_HISTORY.md create mode 100644 content/zh/docs/Developerguide/PG_AUTH_MEMBERS.md create mode 100644 content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md create mode 100644 content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md create mode 100644 content/zh/docs/Developerguide/PG_CAST.md create mode 100644 content/zh/docs/Developerguide/PG_CLASS.md create mode 100644 content/zh/docs/Developerguide/PG_COLLATION.md create mode 100644 content/zh/docs/Developerguide/PG_CONSTRAINT.md create mode 100644 content/zh/docs/Developerguide/PG_CONVERSION.md create mode 100644 content/zh/docs/Developerguide/PG_CURSORS.md create mode 100644 content/zh/docs/Developerguide/PG_DATABASE.md create mode 100644 content/zh/docs/Developerguide/PG_DB_ROLE_SETTING.md create mode 100644 content/zh/docs/Developerguide/PG_DEFAULT_ACL.md create mode 100644 content/zh/docs/Developerguide/PG_DEPEND.md create mode 100644 content/zh/docs/Developerguide/PG_DESCRIPTION.md create mode 100644 content/zh/docs/Developerguide/PG_DIRECTORY.md create mode 100644 content/zh/docs/Developerguide/PG_ENUM.md create mode 100644 content/zh/docs/Developerguide/PG_EXTENSION.md create mode 100644 content/zh/docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md create mode 100644 content/zh/docs/Developerguide/PG_EXT_STATS.md create mode 100644 content/zh/docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md create mode 100644 content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md create mode 100644 content/zh/docs/Developerguide/PG_FOREIGN_TABLE.md create mode 100644 content/zh/docs/Developerguide/PG_GET_INVALID_BACKENDS.md create mode 100644 content/zh/docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md create mode 100644 content/zh/docs/Developerguide/PG_GROUP.md create mode 100644 content/zh/docs/Developerguide/PG_INDEX.md create mode 100644 content/zh/docs/Developerguide/PG_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_INHERITS.md create mode 100644 content/zh/docs/Developerguide/PG_JOB.md create mode 100644 content/zh/docs/Developerguide/PG_JOB_PROC.md create mode 100644 content/zh/docs/Developerguide/PG_LANGUAGE.md create mode 100644 content/zh/docs/Developerguide/PG_LARGEOBJECT.md create mode 100644 content/zh/docs/Developerguide/PG_LARGEOBJECT_METADATA.md create mode 100644 content/zh/docs/Developerguide/PG_LOCKS.md create mode 100644 content/zh/docs/Developerguide/PG_NAMESPACE.md create mode 100644 content/zh/docs/Developerguide/PG_NODE_ENV.md create mode 100644 content/zh/docs/Developerguide/PG_OBJECT.md create mode 100644 content/zh/docs/Developerguide/PG_OPCLASS.md create mode 100644 content/zh/docs/Developerguide/PG_OPERATOR.md create mode 100644 content/zh/docs/Developerguide/PG_OPFAMILY.md create mode 100644 content/zh/docs/Developerguide/PG_OS_THREADS.md create mode 100644 content/zh/docs/Developerguide/PG_PARTITION.md create mode 100644 content/zh/docs/Developerguide/PG_PLTEMPLATE.md create mode 100644 content/zh/docs/Developerguide/PG_PREPARED_STATEMENTS.md create mode 100644 content/zh/docs/Developerguide/PG_PREPARED_XACTS.md create mode 100644 content/zh/docs/Developerguide/PG_PROC.md create mode 100644 content/zh/docs/Developerguide/PG_RANGE.md create mode 100644 content/zh/docs/Developerguide/PG_REPLICATION_SLOTS.md create mode 100644 content/zh/docs/Developerguide/PG_RESOURCE_POOL.md create mode 100644 content/zh/docs/Developerguide/PG_REWRITE.md create mode 100644 content/zh/docs/Developerguide/PG_RLSPOLICIES.md create mode 100644 content/zh/docs/Developerguide/PG_RLSPOLICY.md create mode 100644 content/zh/docs/Developerguide/PG_ROLES.md create mode 100644 content/zh/docs/Developerguide/PG_RULES.md create mode 100644 content/zh/docs/Developerguide/PG_RUNNING_XACTS.md create mode 100644 content/zh/docs/Developerguide/PG_SECLABEL.md create mode 100644 content/zh/docs/Developerguide/PG_SECLABELS.md create mode 100644 content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md create mode 100644 content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md create mode 100644 content/zh/docs/Developerguide/PG_SETTINGS.md create mode 100644 content/zh/docs/Developerguide/PG_SHADOW.md create mode 100644 content/zh/docs/Developerguide/PG_SHDEPEND.md create mode 100644 content/zh/docs/Developerguide/PG_SHDESCRIPTION.md create mode 100644 content/zh/docs/Developerguide/PG_SHSECLABEL.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_ALL_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_SYS_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_USER_SEQUENCES.md create mode 100644 content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STATISTIC.md create mode 100644 content/zh/docs/Developerguide/PG_STATISTIC_EXT.md create mode 100644 content/zh/docs/Developerguide/PG_STATS.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_BAD_BLOCK.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_BGWRITER.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_DATABASE.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_DATABASE_CONFLICTS.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_REPLICATION.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_XACT_USER_FUNCTIONS.md create mode 100644 content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_TABLES.md create mode 100644 content/zh/docs/Developerguide/PG_TABLESPACE.md create mode 100644 content/zh/docs/Developerguide/PG_TDE_INFO.md create mode 100644 content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md create mode 100644 content/zh/docs/Developerguide/PG_TIMEZONE_ABBREVS.md create mode 100644 content/zh/docs/Developerguide/PG_TIMEZONE_NAMES.md create mode 100644 content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md create mode 100644 content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md create mode 100644 content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md create mode 100644 content/zh/docs/Developerguide/PG_TRIGGER.md create mode 100644 content/zh/docs/Developerguide/PG_TS_CONFIG.md create mode 100644 content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md create mode 100644 content/zh/docs/Developerguide/PG_TS_DICT.md create mode 100644 content/zh/docs/Developerguide/PG_TS_PARSER.md create mode 100644 content/zh/docs/Developerguide/PG_TS_TEMPLATE.md create mode 100644 content/zh/docs/Developerguide/PG_TYPE.md create mode 100644 content/zh/docs/Developerguide/PG_USER.md create mode 100644 content/zh/docs/Developerguide/PG_USER_MAPPING.md create mode 100644 content/zh/docs/Developerguide/PG_USER_MAPPINGS.md create mode 100644 content/zh/docs/Developerguide/PG_USER_STATUS.md create mode 100644 content/zh/docs/Developerguide/PG_VARIABLE_INFO.md create mode 100644 content/zh/docs/Developerguide/PG_VIEWS.md create mode 100644 content/zh/docs/Developerguide/PG_WLM_STATISTICS.md create mode 100644 content/zh/docs/Developerguide/PG_WORKLOAD_GROUP.md create mode 100644 content/zh/docs/Developerguide/PLAN_TABLE.md create mode 100644 content/zh/docs/Developerguide/PLAN_TABLE_DATA.md create mode 100644 content/zh/docs/Developerguide/PQcancel.md create mode 100644 content/zh/docs/Developerguide/PQclear.md create mode 100644 content/zh/docs/Developerguide/PQconnectStart.md create mode 100644 content/zh/docs/Developerguide/PQconnectdb.md create mode 100644 content/zh/docs/Developerguide/PQconnectdbParams.md create mode 100644 content/zh/docs/Developerguide/PQconninfoParse.md create mode 100644 content/zh/docs/Developerguide/PQerrorMessage.md create mode 100644 content/zh/docs/Developerguide/PQexec.md create mode 100644 content/zh/docs/Developerguide/PQexecParams.md create mode 100644 content/zh/docs/Developerguide/PQexecParamsBatch.md create mode 100644 content/zh/docs/Developerguide/PQexecPrepared.md create mode 100644 content/zh/docs/Developerguide/PQexecPreparedBatch.md create mode 100644 content/zh/docs/Developerguide/PQfinish.md create mode 100644 content/zh/docs/Developerguide/PQflush.md create mode 100644 content/zh/docs/Developerguide/PQfname.md create mode 100644 content/zh/docs/Developerguide/PQfreeCancel.md create mode 100644 content/zh/docs/Developerguide/PQgetCancel.md create mode 100644 content/zh/docs/Developerguide/PQgetvalue.md create mode 100644 content/zh/docs/Developerguide/PQnfields.md create mode 100644 content/zh/docs/Developerguide/PQntuples.md create mode 100644 content/zh/docs/Developerguide/PQprepare.md create mode 100644 content/zh/docs/Developerguide/PQreset.md create mode 100644 content/zh/docs/Developerguide/PQresultStatus.md create mode 100644 content/zh/docs/Developerguide/PQsendPrepare.md create mode 100644 content/zh/docs/Developerguide/PQsendQuery.md create mode 100644 content/zh/docs/Developerguide/PQsendQueryParams.md create mode 100644 content/zh/docs/Developerguide/PQsendQueryPrepared.md create mode 100644 content/zh/docs/Developerguide/PQsetdbLogin.md create mode 100644 content/zh/docs/Developerguide/PQstatus.md create mode 100644 content/zh/docs/Developerguide/PREPARE-TRANSACTION.md create mode 100644 content/zh/docs/Developerguide/PREPARE.md create mode 100644 content/zh/docs/Developerguide/Query.md create mode 100644 content/zh/docs/Developerguide/REASSIGN-OWNED.md create mode 100644 content/zh/docs/Developerguide/REINDEX.md create mode 100644 content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md create mode 100644 content/zh/docs/Developerguide/RESET.md create mode 100644 content/zh/docs/Developerguide/REVOKE.md create mode 100644 content/zh/docs/Developerguide/ROLLBACK-PREPARED.md create mode 100644 content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md create mode 100644 content/zh/docs/Developerguide/ROLLBACK.md create mode 100644 content/zh/docs/Developerguide/SAVEPOINT.md create mode 100644 content/zh/docs/Developerguide/SELECT-INTO.md create mode 100644 content/zh/docs/Developerguide/SELECT.md create mode 100644 "content/zh/docs/Developerguide/SEQUENCE\345\207\275\346\225\260.md" create mode 100644 content/zh/docs/Developerguide/SET-CONSTRAINTS.md create mode 100644 content/zh/docs/Developerguide/SET-ROLE.md create mode 100644 content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md create mode 100644 content/zh/docs/Developerguide/SET-TRANSACTION.md create mode 100644 content/zh/docs/Developerguide/SET.md create mode 100644 content/zh/docs/Developerguide/SHOW.md create mode 100644 content/zh/docs/Developerguide/SQLAllocConnect.md create mode 100644 content/zh/docs/Developerguide/SQLAllocEnv.md create mode 100644 content/zh/docs/Developerguide/SQLAllocHandle.md create mode 100644 content/zh/docs/Developerguide/SQLAllocStmt.md create mode 100644 content/zh/docs/Developerguide/SQLBindCol.md create mode 100644 content/zh/docs/Developerguide/SQLBindParameter.md create mode 100644 content/zh/docs/Developerguide/SQLColAttribute.md create mode 100644 content/zh/docs/Developerguide/SQLConnect.md create mode 100644 content/zh/docs/Developerguide/SQLDisconnect.md create mode 100644 content/zh/docs/Developerguide/SQLExecDirect.md create mode 100644 content/zh/docs/Developerguide/SQLExecute.md create mode 100644 content/zh/docs/Developerguide/SQLFetch.md create mode 100644 content/zh/docs/Developerguide/SQLFreeConnect.md create mode 100644 content/zh/docs/Developerguide/SQLFreeEnv.md create mode 100644 content/zh/docs/Developerguide/SQLFreeHandle.md create mode 100644 content/zh/docs/Developerguide/SQLFreeStmt.md create mode 100644 content/zh/docs/Developerguide/SQLGetData.md create mode 100644 content/zh/docs/Developerguide/SQLGetDiagRec.md create mode 100644 content/zh/docs/Developerguide/SQLPrepare.md create mode 100644 content/zh/docs/Developerguide/SQLSetConnectAttr.md create mode 100644 content/zh/docs/Developerguide/SQLSetEnvAttr.md create mode 100644 content/zh/docs/Developerguide/SQLSetStmtAttr.md create mode 100644 "content/zh/docs/Developerguide/SQL\345\217\202\350\200\203.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/SQL\350\257\255\346\263\225.md" create 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/SSL\350\257\201\344\271\246\347\256\241\347\220\206.md" create mode 100644 content/zh/docs/Developerguide/START-TRANSACTION.md create mode 100644 content/zh/docs/Developerguide/Schema.md create mode 100644 "content/zh/docs/Developerguide/Simple\350\257\215\345\205\270.md" create mode 100644 "content/zh/docs/Developerguide/Snowball\350\257\215\345\205\270.md" create mode 100644 "content/zh/docs/Developerguide/Synonym\350\257\215\345\205\270.md" create mode 100644 content/zh/docs/Developerguide/TRUNCATE.md create mode 100644 "content/zh/docs/Developerguide/Thesaurus\350\257\215\345\205\270.md" create mode 100644 "content/zh/docs/Developerguide/UNION-CASE\345\222\214\347\233\270\345\205\263\346\236\204\351\200\240.md" create mode 100644 content/zh/docs/Developerguide/UPDATE.md create mode 100644 "content/zh/docs/Developerguide/UUID\347\261\273\345\236\213.md" create mode 100644 content/zh/docs/Developerguide/VACUUM.md create mode 100644 content/zh/docs/Developerguide/VALUES.md create mode 100644 "content/zh/docs/Developerguide/core\351\227\256\351\242\230\345\256\232\344\275\215.md" create mode 100644 content/zh/docs/Developerguide/java-sql-CallableStatement.md create mode 100644 content/zh/docs/Developerguide/java-sql-Connection.md create mode 100644 content/zh/docs/Developerguide/java-sql-DatabaseMetaData.md create mode 100644 content/zh/docs/Developerguide/java-sql-Driver.md create mode 100644 content/zh/docs/Developerguide/java-sql-PreparedStatement.md create mode 100644 content/zh/docs/Developerguide/java-sql-ResultSet.md create mode 100644 content/zh/docs/Developerguide/java-sql-ResultSetMetaData.md create mode 100644 content/zh/docs/Developerguide/java-sql-Statement.md create mode 100644 content/zh/docs/Developerguide/javax-naming-Context.md create mode 100644 content/zh/docs/Developerguide/javax-naming-spi-InitialContextFactory.md create mode 100644 content/zh/docs/Developerguide/javax-sql-ConnectionPoolDataSource.md create mode 100644 content/zh/docs/Developerguide/javax-sql-DataSource.md create mode 100644 content/zh/docs/Developerguide/javax-sql-PooledConnection.md create mode 100644 content/zh/docs/Developerguide/libpq.md create mode 100644 content/zh/docs/Developerguide/openGauss-SQL.md create mode 100644 "content/zh/docs/Developerguide/openGauss\344\272\213\345\212\241.md" delete mode 100644 content/zh/docs/Developerguide/public_sys-resources/.keep create mode 100644 content/zh/docs/Developerguide/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/Developerguide/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/Developerguide/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/Developerguide/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/Developerguide/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/Developerguide/public_sys-resources/icon-warning.gif create mode 100644 "content/zh/docs/Developerguide/\344\270\211\346\235\203\345\210\206\347\253\213.md" create mode 100644 "content/zh/docs/Developerguide/\344\270\273\346\234\215\345\212\241\345\231\250.md" create mode 100644 "content/zh/docs/Developerguide/\344\272\213\345\212\241\346\216\247\345\210\266.md" create 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\272\213\345\212\241\351\232\224\347\246\273\350\257\264\346\230\216.md" create mode 100644 "content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\344\273\213\347\273\215-17.md" create mode 100644 "content/zh/docs/Developerguide/\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/Developerguide/\344\273\216\350\277\231\351\207\214\345\274\200\345\247\213.md" create mode 100644 "content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" create mode 100644 "content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Developerguide/\344\274\252\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\344\275\215\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\344\275\215\344\270\262\347\261\273\345\236\213.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250DML\345\221\275\344\273\244\346\233\264\346\226\260\350\241\250.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\345\205\203\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\350\277\236\346\216\245.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\215\227.md" create mode 100644 "content/zh/docs/Developerguide/\345\200\274\345\255\230\345\202\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\201\234\347\224\250\350\257\215.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242\346\246\202\350\277\260.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\205\266\344\273\226\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\266\344\273\226\347\274\272\347\234\201.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\266\345\256\203\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\345\205\266\345\256\203\351\200\211\351\241\271.md" create mode 100644 "content/zh/docs/Developerguide/\345\206\205\345\255\230.md" create mode 100644 "content/zh/docs/Developerguide/\345\206\205\345\255\230\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\345\206\231\345\205\245\345\222\214\350\257\273\345\206\231\346\223\215\344\275\234.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\207\240\344\275\225\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\206\346\236\220\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250\346\265\213\350\257\225.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\227\345\255\230\350\241\250\346\224\257\346\214\201\347\232\204\346\225\260\346\215\256\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206schema.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\272\217\345\210\227.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\247\206\345\233\276.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\233\345\273\272\347\264\242\345\274\225.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\233\345\273\272\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\210\240\351\231\244\350\241\250\344\270\255\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" create mode 100644 "content/zh/docs/Developerguide/\345\215\207\347\272\247\345\217\202\346\225\260.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\217\214\346\234\272\345\244\215\345\210\266.md" create mode 100644 "content/zh/docs/Developerguide/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\217\226\346\266\210\346\255\243\345\234\250\345\244\204\347\220\206\347\232\204\346\237\245\350\257\242.md" create mode 100644 "content/zh/docs/Developerguide/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\220\221\350\241\250\344\270\255\346\217\222\345\205\245\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\345\221\212\350\255\246\346\243\200\346\265\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\222\250\350\257\242\351\224\201\345\207\275\346\225\260.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\237\272\346\234\254\346\226\207\346\234\254\345\214\271\351\205\215.md" create mode 100644 "content/zh/docs/Developerguide/\345\244\204\347\220\206tsvector.md" create mode 100644 "content/zh/docs/Developerguide/\345\244\204\347\220\206\346\237\245\350\257\242.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\244\207\346\234\215\345\212\241\345\231\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\241\250\350\276\276\345\274\217.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\255\227\347\254\246\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\211\345\205\250\345\207\275\346\225\260.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\256\236\347\216\260.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\241\350\256\241\345\274\200\345\205\263.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\241\350\256\241\346\246\202\350\277\260.md" create 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" create 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.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Developerguide/\345\256\271\351\224\231\346\200\247.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\271\350\241\250\346\211\247\350\241\214VACUUM.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\271\350\261\241\346\240\207\350\257\206\347\254\246\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\205\245\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\207\272\345\205\250\345\261\200\345\257\271\350\261\241.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\207\272\345\215\225\344\270\252\346\225\260\346\215\256\345\272\223.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256\345\272\223.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\207\272\346\250\241\345\274\217.md" create mode 100644 "content/zh/docs/Developerguide/\345\257\274\345\207\272\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\345\270\203\345\260\224\347\261\273\345\236\213.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" create mode 100644 "content/zh/docs/Developerguide/\345\270\270\351\207\217\344\270\216\345\256\217.md" create mode 100644 "content/zh/docs/Developerguide/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" create mode 100644 "content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\344\272\213\345\212\241\347\232\204\346\275\234\345\234\250\346\255\273\351\224\201\346\203\205\345\206\265.md" create mode 100644 "content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\347\244\272\344\276\213.md" create mode 100644 "content/zh/docs/Developerguide/\345\271\266\350\241\214\345\257\274\345\205\245.md" create mode 100644 "content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243.md" create mode 100644 "content/zh/docs/Developerguide/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" create mode 100644 "content/zh/docs/Developerguide/\345\274\202\346\255\245IO.md" create mode 100644 "content/zh/docs/Developerguide/\345\274\202\346\255\245\345\221\275\344\273\244\345\244\204\347\220\206.md" create mode 100644 "content/zh/docs/Developerguide/\345\275\222\346\241\243.md" create mode 100644 "content/zh/docs/Developerguide/\345\277\253\347\205\247\345\220\214\346\255\245\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\200\247\350\203\275\347\273\237\350\256\241.md" create mode 100644 "content/zh/docs/Developerguide/\346\211\251\345\261\225\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\211\251\345\261\225\346\200\247.md" create mode 100644 "content/zh/docs/Developerguide/\346\211\251\345\261\225\350\257\255\346\263\225.md" create mode 100644 "content/zh/docs/Developerguide/\346\216\222\345\272\217\346\237\245\350\257\242\347\273\223\346\236\234.md" create mode 100644 "content/zh/docs/Developerguide/\346\216\245\345\217\243\345\217\202\350\200\203.md" create mode 100644 "content/zh/docs/Developerguide/\346\216\247\345\210\266\346\226\207\346\234\254\346\220\234\347\264\242.md" create mode 100644 "content/zh/docs/Developerguide/\346\220\234\347\264\242\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\346\223\215\344\275\234\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Developerguide/\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\346\224\266\351\233\206\346\226\207\347\214\256\347\273\237\350\256\241.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\345\200\274\347\261\273\345\236\213.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\257\274\345\205\245\345\222\214\346\237\245\350\257\242\347\232\204\345\271\266\345\217\221.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\344\275\277\347\224\250.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\257\271\350\261\241\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\346\211\247\350\241\214\350\257\255\345\217\245\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\216\247\345\210\266\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\346\237\245\350\257\242\350\257\267\346\261\202\345\244\204\347\220\206\350\277\207\347\250\213.md" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\225\260\347\273\204\350\241\250\350\276\276\345\274\217.md" create mode 100644 "content/zh/docs/Developerguide/\346\226\207\344\273\266\344\275\215\347\275\256.md" create mode 100644 "content/zh/docs/Developerguide/\346\226\207\346\234\254\346\220\234\347\264\242\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\346\226\207\346\234\254\346\243\200\347\264\242\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\346\226\207\346\241\243\346\246\202\345\277\265.md" create mode 100644 "content/zh/docs/Developerguide/\346\227\240\346\235\203\351\231\220\350\247\222\350\211\262\345\257\274\345\207\272\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\346\227\245\345\277\227\345\233\236\346\224\276.md" create mode 100644 "content/zh/docs/Developerguide/\346\227\245\346\234\237-\346\227\266\351\227\264\347\261\273\345\236\213.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-11.md" create mode 100644 "content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256.md" create mode 100644 "content/zh/docs/Developerguide/\346\234\200\344\275\263\345\256\236\350\267\265.md" create mode 100644 "content/zh/docs/Developerguide/\346\234\215\345\212\241\345\231\250\344\277\241\345\217\267\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\347\234\213\345\256\241\350\256\241\347\273\223\346\236\234.md" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256.md" create 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\347\234\213\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\347\234\213\347\263\273\347\273\237\350\241\250.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\350\257\242\350\247\204\345\210\222.md" create mode 100644 "content/zh/docs/Developerguide/\346\237\245\350\257\242\351\207\215\345\206\231.md" create mode 100644 "content/zh/docs/Developerguide/\346\243\200\346\237\245\347\202\271.md" create mode 100644 "content/zh/docs/Developerguide/\346\246\202\350\277\260-12.md" create mode 100644 "content/zh/docs/Developerguide/\346\246\202\350\277\260-14.md" create mode 100644 "content/zh/docs/Developerguide/\346\246\202\350\277\260-15.md" create mode 100644 "content/zh/docs/Developerguide/\346\246\202\350\277\260.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\257\224\350\276\203\346\223\215\344\275\234\347\254\246.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\346\267\261\345\261\202\345\244\215\345\210\266.md" create mode 100644 "content/zh/docs/Developerguide/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" create 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" create 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.md" create 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\250SSL\350\277\233\350\241\214\345\256\211\345\205\250\347\232\204TCP-IP\350\277\236\346\216\245.md" create mode 100644 "content/zh/docs/Developerguide/\347\224\250\346\210\267.md" create mode 100644 "content/zh/docs/Developerguide/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" create mode 100644 "content/zh/docs/Developerguide/\347\224\250\346\210\267\346\235\203\351\231\220\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Developerguide/\347\233\270\345\205\263\346\246\202\345\277\265.md" create mode 100644 "content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204INSERT\345\222\214DELETE\345\271\266\345\217\221.md" create mode 100644 "content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221INSERT.md" create mode 100644 "content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221UPDATE.md" create mode 100644 "content/zh/docs/Developerguide/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" create mode 100644 "content/zh/docs/Developerguide/\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" create mode 100644 "content/zh/docs/Developerguide/\347\243\201\347\233\230\347\251\272\351\227\264.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213-10.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\213.md" create mode 100644 "content/zh/docs/Developerguide/\347\244\272\344\276\2131-\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\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" create mode 100644 "content/zh/docs/Developerguide/\347\252\227\345\217\243\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\255\211\345\276\205\344\272\213\344\273\266.md" create mode 100644 "content/zh/docs/Developerguide/\347\256\200\345\215\225\350\241\250\350\276\276\345\274\217.md" create mode 100644 "content/zh/docs/Developerguide/\347\256\241\347\220\206\344\272\213\345\212\241.md" create mode 100644 "content/zh/docs/Developerguide/\347\256\241\347\220\206\345\221\230.md" create mode 100644 "content/zh/docs/Developerguide/\347\256\241\347\220\206\345\271\266\345\217\221\345\206\231\345\205\245\346\223\215\344\275\234.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\347\256\241\347\220\206\347\224\250\346\210\267\345\217\212\346\235\203\351\231\220.md" create mode 100644 "content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242.md" create mode 100644 "content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\344\277\241\346\201\257\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\347\256\241\347\220\206\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276\346\246\202\350\277\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\263\273\347\273\237\350\247\206\345\233\276.md" create mode 100644 "content/zh/docs/Developerguide/\347\264\242\345\274\225\344\275\277\347\224\250\347\272\246\346\235\237.md" create mode 100644 "content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\347\273\264\346\212\244\345\256\241\350\256\241\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\350\201\232\351\233\206\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\350\207\252\345\212\250\346\270\205\347\220\206.md" create mode 100644 "content/zh/docs/Developerguide/\350\214\203\345\233\264\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\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/Developerguide/\350\241\214\350\241\250\350\276\276\345\274\217.md" create mode 100644 "content/zh/docs/Developerguide/\350\241\250\345\222\214\347\264\242\345\274\225.md" create mode 100644 "content/zh/docs/Developerguide/\350\241\250\350\276\276\345\274\217.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\204\345\210\222\345\255\230\345\202\250\346\250\241\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\222\350\211\262.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250\346\265\213\350\257\225.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\243\346\236\220\346\226\207\346\241\243.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\243\346\236\220\346\237\245\350\257\242.md" create mode 100644 "content/zh/docs/Developerguide/\350\247\246\345\217\221\345\231\250\345\207\275\346\225\260.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Developerguide/\350\256\276\347\275\256\345\256\211\345\205\250\347\255\226\347\225\245.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create 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" create 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.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242-8.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242.md" create 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\201\344\271\246\347\224\237\346\210\220.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\215\345\205\270.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\215\345\205\270\346\246\202\350\277\260.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\215\345\205\270\346\265\213\350\257\225.md" create mode 100644 "content/zh/docs/Developerguide/\350\257\255\345\217\245\350\241\214\344\270\272.md" create mode 100644 "content/zh/docs/Developerguide/\350\264\237\350\275\275\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Developerguide/\350\264\247\345\270\201\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/Developerguide/\350\265\204\346\272\220\346\266\210\350\200\227.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\224\345\233\236\351\233\206\345\220\210\347\232\204\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\236\346\216\245\346\261\240\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\350\277\236\346\216\245\350\256\276\347\275\256.md" create mode 100644 "content/zh/docs/Developerguide/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\351\200\273\350\276\221\345\244\215\345\210\266\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\351\200\273\350\276\221\346\223\215\344\275\234\347\254\246.md" create 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" create 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.md" create 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\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203.md" create mode 100644 "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" create mode 100644 "content/zh/docs/Developerguide/\351\205\215\347\275\256\347\244\272\344\276\213.md" create mode 100644 "content/zh/docs/Developerguide/\351\205\215\347\275\256\350\256\276\347\275\256\345\207\275\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\351\207\215\350\256\276\345\217\202\346\225\260.md" create mode 100644 "content/zh/docs/Developerguide/\351\223\276\346\216\245\345\255\227\347\254\246.md" create mode 100644 "content/zh/docs/Developerguide/\351\224\201\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Developerguide/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Developerguide/\351\231\204\345\212\240\345\212\237\350\203\275.md" create mode 100644 "content/zh/docs/Developerguide/\351\231\204\345\275\225-16.md" create mode 100644 "content/zh/docs/Developerguide/\351\231\204\345\275\225.md" create mode 100644 "content/zh/docs/Developerguide/\351\231\220\345\210\266\347\272\246\346\235\237.md" create mode 100644 "content/zh/docs/Developerguide/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" create mode 100644 "content/zh/docs/Developerguide/\351\253\230\344\272\256\346\220\234\347\264\242\347\273\223\346\236\234.md" create mode 100644 "content/zh/docs/Developerguide/\351\273\230\350\256\244\346\235\203\351\231\220\346\234\272\345\210\266.md" diff --git a/content/zh/docs/Developerguide/.keep b/content/zh/docs/Developerguide/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Developerguide/ABORT.md b/content/zh/docs/Developerguide/ABORT.md new file mode 100644 index 000000000..078776195 --- /dev/null +++ b/content/zh/docs/Developerguide/ABORT.md @@ -0,0 +1,70 @@ +# ABORT + +## 功能描述 + +回滚当前事务并且撤销所有当前事务中所做的更改。 + +作用等同于[ROLLBACK](ROLLBACK.md),早期SQL有用ABORT,现在推荐使用ROLLBACK。 + +## 注意事项 + +在事务外部执行ABORT语句不会影响事务的执行,但是会产生一个警告信息。 + +## 语法格式 + +``` +ABORT [ WORK | TRANSACTION ] ; +``` + +## 参数说明 + +**WORK | TRANSACTION** + +可选关键字,除了增加可读性没有其他任何作用。 + +## 示例 + +``` +--创建表customer_demographics_t1。 +postgres=# CREATE TABLE customer_demographics_t1 +( + CD_DEMO_SK INTEGER NOT NULL, + CD_GENDER CHAR(1) , + CD_MARITAL_STATUS CHAR(1) , + CD_EDUCATION_STATUS CHAR(20) , + CD_PURCHASE_ESTIMATE INTEGER , + CD_CREDIT_RATING CHAR(10) , + CD_DEP_COUNT INTEGER , + CD_DEP_EMPLOYED_COUNT INTEGER , + CD_DEP_COLLEGE_COUNT INTEGER +) +WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE) +; + +--插入记录。 +postgres=# INSERT INTO customer_demographics_t1 VALUES(1920801,'M', 'U', 'DOCTOR DEGREE', 200, 'GOOD', 1, 0,0); + +--开启事务。 +postgres=# START TRANSACTION; + +--更新字段值。 +postgres=# UPDATE customer_demographics_t1 SET cd_education_status= 'Unknown'; + +--终止事务,上面所执行的更新会被撤销掉。 +postgres=# ABORT; + +--查询数据。 +postgres=# SELECT * FROM customer_demographics_t1 WHERE cd_demo_sk = 1920801; +cd_demo_sk | cd_gender | cd_marital_status | cd_education_status | cd_purchase_estimate | cd_credit_rating | cd_dep_count | cd_dep_employed_count | cd_dep_college_count +------------+-----------+-------------------+----------------------+----------------------+------------------+--------------+-----------------------+---------------------- + 1920801 | M | U | DOCTOR DEGREE | 200 | GOOD | 1 | 0 | 0 +(1 row) + +--删除表。 +postgres=# DROP TABLE customer_demographics_t1; +``` + +## 相关链接 + +[SET TRANSACTION](SET-TRANSACTION.md),[COMMIT | END](COMMIT-END.md),[ROLLBACK](ROLLBACK.md) + 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" new file mode 100644 index 000000000..f3de1de37 --- /dev/null +++ "b/content/zh/docs/Developerguide/AI\347\211\271\346\200\247.md" @@ -0,0 +1,5 @@ +# AI特性 + +- **[SQL执行时间预测特性](SQL执行时间预测特性.md)** + + diff --git a/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md b/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md new file mode 100644 index 000000000..123c50d1d --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-DATA-SOURCE.md @@ -0,0 +1,103 @@ +# 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目录下。 + +## **语法格式** + +``` +ALTER DATA SOURCE src_name + [TYPE 'type_str'] + [VERSION {'version_str' | NULL}] + [OPTIONS ( {[ ADD | SET | DROP ] optname ['optvalue']} [, ...] )]; +ALTER DATA SOURCE src_name RENAME TO src_new_name; +ALTER DATA SOURCE src_name OWNER TO new_owner; +``` + +## **参数说明** + +- **src\_name** + + 待修改的Data Source的名称。 + + 取值范围:字符串,需要符合标识符的命名规范。 + +- **TYPE** + + 将Data Source原来的TYPE修改为指定值。 + + 取值范围:空串或非空字符串。 + +- **VERSION** + + 将Data Source原来的VERSION修改为指定值。 + + 取值范围:空串或非空字符串或NULL。 + +- **OPTIONS** + + 修改OPTIONS中的字段:增加(ADD)、修改(SET)、删除(DROP),且字段名称optname需唯一,具体要求如下: + + 增加字段:ADD可以省略,待增加字段不能已经存在了; + + 修改字段:SET不可省略,待修改字段必须存在; + + 删除字段:DROP不可省略,待删除字段必须存在,且不能指定optvalue; + +- **src\_new\_name** + + 新的Data Source名称。 + + 取值范围:字符串,需符合标识符命名规范。 + +- **new\_user** + + 对象的新属主。 + + 取值范围:字符串,有效的用户名。 + + +## **示例** + +``` +--创建一个空Data Source对象。 +postgres=# CREATE DATA SOURCE ds_test1; + +--修改名称。 +postgres=# ALTER DATA SOURCE ds_test1 RENAME TO ds_test; + +--修改属主。 +postgres=# CREATE USER user_test1 IDENTIFIED BY 'Gs@123456'; +postgres=# ALTER USER user_test1 WITH SYSADMIN; +postgres=# ALTER DATA SOURCE ds_test OWNER TO user_test1; + +--修改TYPE和VERSION。 +postgres=# ALTER DATA SOURCE ds_test TYPE 'MPPDB_TYPE' VERSION 'XXX'; + +--添加字段。 +postgres=# ALTER DATA SOURCE ds_test OPTIONS (add dsn 'gaussdb', username 'test_user'); + +--修改字段。 +postgres=# ALTER DATA SOURCE ds_test OPTIONS (set dsn 'unknown'); + +--删除字段。 +postgres=# ALTER DATA SOURCE ds_test OPTIONS (drop username); + +--删除Data Source和user对象。 +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)** + diff --git a/content/zh/docs/Developerguide/ALTER-DATABASE.md b/content/zh/docs/Developerguide/ALTER-DATABASE.md new file mode 100644 index 000000000..625676483 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-DATABASE.md @@ -0,0 +1,142 @@ +# ALTER DATABASE + +## 功能描述 + +修改数据库的属性,包括它的名称、所有者、连接数限制、对象隔离属性等。 + +## 注意事项 + +- 只有拥有数据库所有者权限的用户才能执行ALTER DATABASE命令,系统管理员默认拥有此权限。如果是非系统管理员,针对所要修改属性的不同,对其还有以下权限约束: + - 修改数据库名称,必须拥有CREATEDB权限。 + - 修改数据库所有者,当前用户必须是该database的所有者,必须拥有CREATEDB权限,且该用户是新所有者角色的成员。 + - 修改数据库默认表空间,该用户必须是该database的所有者或系统管理员,必须拥有新表空间的CREATE权限。这个语句会从物理上将一个数据库原来缺省表空间上的表和索引移至新的表空间。注意不在缺省表空间的表和索引不受此影响。 + - 修改某个按数据库设置的相关参数,只有数据库所有者或者系统管理员可以改变这些设置。 + - 修改某个数据库对象隔离属性,只有数据库所有者或者系统管理员可以执行此操作。 + +- 不能重命名当前使用的数据库,如果需要重新命名,须连接至其他数据库上。 + +## 语法格式 + +- 修改数据库的最大连接数。 + + ``` + ALTER DATABASE database_name + [ [ WITH ] CONNECTION LIMIT connlimit ]; + ``` + +- 修改数据库名称。 + + ``` + ALTER DATABASE database_name + RENAME TO new_name; + ``` + +- 修改数据库所属者。 + + ``` + ALTER DATABASE database_name + OWNER TO new_owner; + ``` + +- 修改数据库默认表空间。 + + ``` + ALTER DATABASE database_name + SET TABLESPACE new_tablespace; + ``` + +- 修改数据库指定会话参数值。 + + ``` + ALTER DATABASE database_name + SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; + ``` + +- 数据库配置参数重置。 + + ``` + ALTER DATABASE database_name RESET + { configuration_parameter | ALL }; + ``` + + +- 修改数据库对象隔离属性。 + + ``` + ALTER DATABASE database_name [ WITH ] { ENABLE | DISABLE } PRIVATE OBJECT; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 修改数据库的对象隔离属性时须连接至该数据库,否则无法更改。 + >- 新创建的数据库,对象隔离属性默认是关闭的。当开启数据库对象隔离属性后,普通用户只能查看有权访问的对象(表、函数、视图、字段等)。对象隔离特性对管理员用户不生效,当开启对象隔离特性后,管理员也可以查看到全量的数据库对象。 + + +## 参数说明 + +- **database\_name** + + 需要修改属性的数据库名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **connlimit** + + 数据库可以接收的最大并发连接数(管理员用户连接除外)。 + + 取值范围:整数,建议填写1\~50的整数。-1(缺省)表示没有限制。 + +- **new\_name** + + 数据库的新名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **new\_owner** + + 数据库的新所有者。 + + 取值范围:字符串,有效的用户名。 + +- **new\_tablespace** + + 数据库新的默认表空间,该表空间为数据库中已经存在的表空间。默认的表空间为pg\_default。 + + 取值范围:字符串,有效的表空间名。 + +- **configuration\_parameter** + + **value** + + 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 + + 取值范围:字符串, + + - DEFAULT + - OFF + - RESET + +- **FROM CURRENT** + + 根据当前会话连接的数据库设置该参数的值。 + +- **RESET configuration\_parameter** + + 重置指定的数据库会话参数值。 + +- **RESET ALL** + + 重置全部的数据库会话参数值。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 修改数据库默认表空间,会将旧表空间中的所有表和索引转移到新表空间中,该操作不会影响其他非默认表空间中的表和索引。 +>- 修改的数据库会话参数值,将在下一次会话中生效。 + +## 示例 + +请参考CREATE DATABASE的[示例](CREATE-DATABASE.md#zh-cn_topic_0237122099_zh-cn_topic_0059778277_s6be7b8abbb4b4aceb9dae686434d672c)。 + +## 相关链接 + +[CREATE DATABASE](CREATE-DATABASE.md),[DROP DATABASE](DROP-DATABASE.md#ZH-CN_TOPIC_0242370597) + diff --git a/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md b/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md new file mode 100644 index 000000000..c80963f50 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-DEFAULT-PRIVILEGES.md @@ -0,0 +1,141 @@ +# ALTER DEFAULT PRIVILEGES + +## 功能描述 + +设置应用于将来创建的对象的权限(这不会影响分配到已有对象中的权限)。 + +## 注意事项 + +目前只支持表(包括视图)、 函数和类型(包括域)的权限更改。 + +## 语法格式 + +``` +ALTER DEFAULT PRIVILEGES + [ FOR { ROLE | USER } target_role [, ...] ] + [ IN SCHEMA schema_name [, ...] ] + abbreviated_grant_or_revoke; +``` + +- 其中abbreviated\_grant\_or\_revoke子句用于指定对哪些对象进行授权或回收权限。 + + ``` + grant_on_tables_clause + | grant_on_functions_clause + | grant_on_types_clause + | revoke_on_tables_clause + | revoke_on_functions_clause + | revoke_on_types_clause + ``` + + +- 其中grant\_on\_tables\_clause子句用于对表授权。 + + ``` + GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } + [, ...] | ALL [ PRIVILEGES ] } + ON TABLES + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ] + ``` + +- 其中grant\_on\_functions\_clause子句用于对函数授权。 + + ``` + GRANT { EXECUTE | ALL [ PRIVILEGES ] } + ON FUNCTIONS + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ] + ``` + +- 其中grant\_on\_types\_clause子句用于对类型授权。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON TYPES + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ] + ``` + +- 其中revoke\_on\_tables\_clause子句用于回收表对象的权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } + [, ...] | ALL [ PRIVILEGES ] } + ON TABLES + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] + ``` + +- 其中revoke\_on\_functions\_clause子句用于回收函数的权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { EXECUTE | ALL [ PRIVILEGES ] } + ON FUNCTIONS + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] + ``` + +- 其中revoke\_on\_types\_clause子句用于回收类型的权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { USAGE | ALL [ PRIVILEGES ] } + ON TYPES + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] + ``` + + +## 参数说明 + +- **target\_role** + + 已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。 + + 取值范围:已有角色的名称。 + +- **schema\_name** + + 现有模式的名称。 + + target\_role必须有schema\_name的CREATE权限。 + + 取值范围:现有模式的名称。 + +- **role\_name** + + 被授予或者取消权限角色的名称。 + + 取值范围:已存在的角色名称。 + + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果想删除一个被赋予了默认权限的角色,有必要恢复改变的缺省权限或者使用DROP OWNED BY来为角色脱离缺省的权限记录。 + +## 示例 + +``` +--将创建在模式tpcds里的所有表(和视图)的SELECT权限授予每一个用户。 +postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT SELECT ON TABLES TO PUBLIC; + +--创建用户普通用户jack。 +postgres=# CREATE USER jack PASSWORD 'Bigdata@123'; + +--将tpcds下的所有表的插入权限授予用户jack。 +postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT INSERT ON TABLES TO jack; + +--撤销上述权限。 +postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE SELECT ON TABLES FROM PUBLIC; +postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE INSERT ON TABLES FROM jack; + +--删除用户jack。 +postgres=# DROP USER jack; +``` + +## 相关链接 + +[GRANT](GRANT.md),[REVOKE](REVOKE.md) + diff --git a/content/zh/docs/Developerguide/ALTER-DIRECTORY.md b/content/zh/docs/Developerguide/ALTER-DIRECTORY.md new file mode 100644 index 000000000..ec687d8d7 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-DIRECTORY.md @@ -0,0 +1,41 @@ +# ALTER DIRECTORY + +## 功能描述 + +对directory属性进行修改。 + +## 注意事项 + +- 目前只支持修改directory属主。 +- 属主仅允许是sysadmin权限用户,不允许赋予普通用户。 + +## 语法格式 + +``` +ALTER DIRECTORY directory_name + OWNER TO new_owner; +``` + +## 参数描述 + +**directory\_name** + +需要修改的目录名称,范围为已经存在的目录名称。 + +## 示例 + +``` +--创建目录。 +postgres=# CREATE OR REPLACE DIRECTORY dir as '/tmp/'; + +--修改目录的owner。 +postgres=# ALTER DIRECTORY dir OWNER TO system; + +--删除外部表。 +postgres=# DROP DIRECTORY dir; +``` + +## 相关链接 + +[CREATE DIRECTORY](CREATE-DIRECTORY.md#ZH-CN_TOPIC_0242370565),[DROP DIRECTORY](DROP-DIRECTORY.md#ZH-CN_TOPIC_0242370600) + diff --git a/content/zh/docs/Developerguide/ALTER-FUNCTION.md b/content/zh/docs/Developerguide/ALTER-FUNCTION.md new file mode 100644 index 000000000..46deb1ee4 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-FUNCTION.md @@ -0,0 +1,190 @@ +# ALTER FUNCTION + +## 功能描述 + +修改自定义函数的属性。 + +## 注意事项 + +只有该函数的所有者,才有权限执行该命令,系统管理员默认拥有该权限。如果函数中涉及对临时表相关的操作,则无法使用ALTER FUNCTION。 + +## 语法格式 + +- 修改自定义函数的附加参数。 + + ``` + ALTER FUNCTION function_name ( [ { [ argmode ] [ argname ] argtype} [, ...] ] ) + action [ ... ] [ RESTRICT ]; + ``` + + 其中附加参数action子句语法为。 + + ``` + {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT} + | {IMMUTABLE | STABLE | VOLATILE} + | {SHIPPABLE | NOT SHIPPABLE} + | {NOT FENCED | FENCED} + | [ NOT ] LEAKPROOF + | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER } + | AUTHID { DEFINER | CURRENT_USER } + | COST execution_cost + | ROWS result_rows + | SET configuration_parameter { { TO | = } { value | DEFAULT }| FROM CURRENT} + | RESET {configuration_parameter | ALL} + ``` + +- 修改自定义函数的名称。 + + ``` + ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] ) + RENAME TO new_name; + ``` + +- 修改自定义函数的所属者。 + + ``` + ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] ) + OWNER TO new_owner; + ``` + +- 修改自定义函数的模式。 + + ``` + ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] ) + SET SCHEMA new_schema; + ``` + + +## 参数说明 + +- **function\_name** + + 要修改的函数名称。 + + 取值范围:已存在的函数名。 + +- **argmode** + + 标识该参数是输入、输出参数。 + + 取值范围:IN/OUT/IN OUT + +- **argname** + + 参数名称。 + + 取值范围:字符串,符合标识符命名规范。 + +- **argtype** + + 参数类型。 + + 取值范围:有效的类型,请参考[数据类型](数据类型.md)。 + +- **CALLED ON NULL INPUT** + + 表明该函数的某些参数是NULL的时候可以按照正常的方式调用。缺省时与指定此参数的作用相同。 + +- **RETURNS NULL ON NULL INPUT** + + **STRICT** + + STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,则如果存在NULL参数时不会执行该函数;而只是自动假设一个NULL结果。 + + RETURNS NULL ON NULL INPUT和STRICT的功能相同。 + +- **IMMUTABLE** + + 表示该函数在给出同样的参数值时总是返回同样的结果。 + +- **STABLE** + + 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 + +- **VOLATILE** + + 表示该函数值可以在一次表扫描内改变,不会做任何优化。 + +- **LEAKPROOF** + + 表示该函数没有副作用,指出参数只包括返回值。LEAKROOF只能由系统管理员设置。 + +- **EXTERNAL** + + (可选)目的是和SQL兼容,这个特性适合于所有函数,而不仅是外部函数 + +- **SECURITY INVOKER** + + **AUTHID CURREN\_USER** + + 表明该函数将以调用它的用户的权限执行。缺省时与指定此参数的作用相同。 + + SECURITY INVOKER和AUTHID CURREN\_USER的功能相同。 + +- **SECURITY DEFINER** + + **AUTHID DEFINER** + + 声明该函数将以创建它的用户的权限执行。 + + AUTHID DEFINER和SECURITY DEFINER的功能相同。 + +- **COST execution\_cost** + + 用来估计函数的执行成本。 + + execution\_cost以cpu\_operator\_cost为单位。 + + 取值范围:正数 + +- **ROWS result\_rows** + + 估计函数返回的行数。用于函数返回的是一个集合。 + + 取值范围:正数,默认值是1000行。 + +- **configuration\_parameter** + - **value** + + 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 + + 取值范围:字符串 + + - DEFAULT + - OFF + - RESET + + 指定默认值。 + + - **from current** + + 取当前会话中的值设置为configuration\_parameter的值。 + + +- **new\_name** + + 函数的新名称。要修改函数的所属模式,必须拥有新模式的CREATE权限。 + + 取值范围:字符串,符合标识符命名规范。 + +- **new\_owner** + + 函数的新所有者。要修改函数的所有者,新所有者必须拥有该函数所属模式的CREATE权限。 + + 取值范围:已存在的用户角色。 + +- **new\_schema** + + 函数的新模式。 + + 取值范围:已存在的模式。 + + +## 示例 + +请参见CREATE FUNCTION的[示例](CREATE-FUNCTION.md#zh-cn_topic_0237122104_zh-cn_topic_0059778837_scc61c5d3cc3e48c1a1ef323652dda821)。 + +## 相关链接 + +[CREATE FUNCTION](CREATE-FUNCTION.md),[DROP FUNCTION](DROP-FUNCTION.md) + diff --git a/content/zh/docs/Developerguide/ALTER-GROUP.md b/content/zh/docs/Developerguide/ALTER-GROUP.md new file mode 100644 index 000000000..0ac879efc --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-GROUP.md @@ -0,0 +1,43 @@ +# ALTER GROUP + +## 功能描述 + +修改一个用户组的属性。 + +## 注意事项 + +ALTER GROUP是ALTER ROLE的别名,非SQL标准语法,不推荐使用,建议用户直接使用ALTER ROLE替代。 + +## 语法格式 + +- 向用户组中添加用户。 + + ``` + ALTER GROUP group_name + ADD USER user_name [, ... ]; + ``` + + +- 从用户组中删除用户。 + + ``` + ALTER GROUP group_name + DROP USER user_name [, ... ]; + ``` + +- 修改用户组的名称。 + + ``` + ALTER GROUP group_name + RENAME TO new_name; + ``` + + +## 参数说明 + +请参考ALTER ROLE的[参数说明](ALTER-ROLE.md#zh-cn_topic_0237122068_zh-cn_topic_0059778744_s50961af6143d4aafaf8fa02febbbf331)。 + +## 相关链接 + +[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) + diff --git a/content/zh/docs/Developerguide/ALTER-INDEX.md b/content/zh/docs/Developerguide/ALTER-INDEX.md new file mode 100644 index 000000000..ffceb2467 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-INDEX.md @@ -0,0 +1,165 @@ +# ALTER INDEX + +## 功能描述 + +ALTER INDEX用于修改现有索引的定义。 + +它有几种子形式: + +- IF EXISTS + + 如果指定的索引不存在,则发出一个notice而不是error。 + +- RENAME TO + + 只改变索引的名称。对存储的数据没有影响。 + +- SET TABLESPACE + + 这个选项会改变索引的表空间为指定表空间,并且把索引相关的数据文件移动到新的表空间里。 + +- SET \( \{ STORAGE\_PARAMETER = value \} \[, ...\] \) + + 改变索引的一个或多个索引方法特定的存储参数。 需要注意的是索引内容不会被这个命令立即修改,根据参数的不同,可能需要使用REINDEX重建索引来获得期望的效果。 + +- RESET \( \{ storage\_parameter \} \[, ...\] \) + + 重置索引的一个或多个索引方法特定的存储参数为缺省值。与SET一样,可能需要使用REINDEX来完全更新索引。 + +- \[ MODIFY PARTITION index\_partition\_name \] UNUSABLE + + 用于设置表或者索引分区上的索引不可用。 + +- REBUILD \[ PARTITION index\_partition\_name \] + + 用于重建表或者索引分区上的索引。 + +- RENAME PARTITION + + 用于重命名索引分区 + +- MOVE PARTITION + + 用于修改索引分区的所属表空间。 + + +## 注意事项 + +只有索引的所有者有权限执行此命令,系统管理员默认拥有此权限。 + +## 语法格式 + +- 重命名表索引的名称。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + RENAME TO new_name; + ``` + + +- 修改表索引的所属空间。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + SET TABLESPACE tablespace_name; + ``` + + +- 修改表索引的存储参数。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + SET ( {storage_parameter = value} [, ... ] ); + ``` + + +- 重置表索引的存储参数。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + RESET ( storage_parameter [, ... ] ) ; + ``` + + +- 设置表索引或索引分区不可用。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + [ MODIFY PARTITION index_partition_name ] UNUSABLE; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >列存表不支持该语法。 + + +- 重建表索引或索引分区。 + + ``` + ALTER INDEX index_name + REBUILD [ PARTITION index_partition_name ]; + ``` + + +- 重命名索引分区。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + RENAME PARTITION index_partition_name TO new_index_partition_name; + ``` + + +- 修改索引分区的所属表空间。 + + ``` + ALTER INDEX [ IF EXISTS ] index_name + MOVE PARTITION index_partition_name TABLESPACE new_tablespace; + ``` + + +## 参数说明 + +- **index\_name** + + 要修改的索引名。 + +- **new\_name** + + 新的索引名。 + + 取值范围:字符串,且符合标识符命名规范。 + +- **tablespace\_name** + + 表空间的名称。 + + 取值范围:已存在的表空间。 + +- **storage\_parameter** + + 索引方法特定的参数名。 + +- **value** + + 索引方法特定的存储参数的新值。根据参数的不同,这可能是一个数字或单词。 + +- **new\_index\_partition\_name** + + 新索引分区名。 + +- **index\_partition\_name** + + 索引分区名。 + +- **new\_tablespace** + + 新表空间。 + + +## 示例 + +请参见CREATE INDEX的[示例](CREATE-INDEX.md#zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362)。 + +## 相关链接 + +[CREATE INDEX](CREATE-INDEX.md),[DROP INDEX](DROP-INDEX.md#ZH-CN_TOPIC_0242370604),[REINDEX](REINDEX.md) + diff --git a/content/zh/docs/Developerguide/ALTER-LARGE-OBJECT.md b/content/zh/docs/Developerguide/ALTER-LARGE-OBJECT.md new file mode 100644 index 000000000..540980f6b --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-LARGE-OBJECT.md @@ -0,0 +1,36 @@ +# ALTER LARGE OBJECT + +## 功能描述 + +ALTER LARGE OBJECT用于更改一个large object的定义。它的唯一的功能是分配一个新的所有者。 + +## 注意事项 + +使用ALTER LARGE OBJECT必须是系统管理员或者是其所有者。 + +## 语法格式 + +``` +ALTER LARGE OBJECT large_object_oid + OWNER TO new_owner; +``` + +## 参数说明 + +- **large\_object\_oid** + + 要被变large object的OID 。 + + 取值范围:已存在的大对象名。 + +- **OWNER TO new\_owner** + + large object新的所有者。 + + 取值范围:已存在的用户名/角色名。 + + +## 示例 + +无。 + diff --git a/content/zh/docs/Developerguide/ALTER-ROLE.md b/content/zh/docs/Developerguide/ALTER-ROLE.md new file mode 100644 index 000000000..d28804a9f --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-ROLE.md @@ -0,0 +1,120 @@ +# ALTER ROLE + +## 功能描述 + +修改角色属性。 + +## 注意事项 + +无。 + +## 语法格式 + +- 修改角色的权限。 + + ``` + ALTER ROLE role_name [ [ WITH ] option [ ... ] ]; + ``` + + 其中权限项子句option为。 + + ``` + {CREATEDB | NOCREATEDB} + | {CREATEROLE | NOCREATEROLE} + | {INHERIT | NOINHERIT} + | {AUDITADMIN | NOAUDITADMIN} + | {SYSADMIN | NOSYSADMIN} + | {MONADMIN | NOMONADMIN} + | {OPRADMIN | NOOPRADMIN} + | {POLADMIN | NOPOLADMIN} + | {USEFT | NOUSEFT} + | {LOGIN | NOLOGIN} + | {REPLICATION | NOREPLICATION} + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' + | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY 'password' [ REPLACE 'old_password' ] + | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' | DISABLE } + | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' ] | DISABLE } + | VALID BEGIN 'timestamp' + | VALID UNTIL 'timestamp' + | RESOURCE POOL 'respool' + | USER GROUP 'groupuser' + | PERM SPACE 'spacelimit' + | NODE GROUP logic_cluster_name + | ACCOUNT { LOCK | UNLOCK } + | PGUSER + ``` + +- 修改角色的名称。 + + ``` + ALTER ROLE role_name + RENAME TO new_name; + ``` + +- 设置角色的配置参数。 + + ``` + ALTER ROLE role_name [ IN DATABASE database_name ] + SET configuration_parameter {{ TO | = } { value | DEFAULT } | FROM CURRENT}; + ``` + +- 重置角色的配置参数。 + + ``` + ALTER ROLE role_name + [ IN DATABASE database_name ] RESET {configuration_parameter|ALL}; + ``` + + +## 参数说明 + +- **role\_name** + + 现有角色名。 + + 取值范围:已存在的用户名。 + +- **IN DATABASE database\_name** + + 表示修改角色在指定数据库上的参数。 + +- **SET configuration\_parameter** + + 设置角色的参数。ALTER ROLE中修改的会话参数只针对指定的角色,且在下一次该角色启动的会话中有效。 + + 取值范围: + + configuration\_parameter和value的取值请参见[SET](SET.md)。 + + DEFAULT:表示清除configuration\_parameter参数的值,configuration\_parameter参数的值将继承本角色新产生的SESSION的默认值。 + + FROM CURRENT:取当前会话中的值设置为configuration\_parameter参数的值。 + +- **RESET configuration\_parameter/ALL** + + 清除configuration\_parameter参数的值。与SET configuration\_parameter TO DEFAULT的效果相同。 + + 取值范围:ALL表示清除所有参数的值。 + +- **ACCOUNT LOCK | ACCOUNT UNLOCK** + - ACCOUNT LOCK:锁定帐户,禁止登录数据库。 + - ACCOUNT UNLOCK:解锁帐户,允许登录数据库。 + +- **PGUSER** + + 当前版本不允许修改角色的PGUSER属性 + + +其他参数请参见CREATE ROLE的[参数说明](CREATE-ROLE.md#zh-cn_topic_0237122112_zh-cn_topic_0059778189_s5a43ec5742a742089e2c302063de7fe4)。 + +## 示例 + +请参见CREATE ROLE的[示例](CREATE-ROLE.md#zh-cn_topic_0237122112_zh-cn_topic_0059778189_s0dea2f90b8474387aff0ab3f366a611e)。 + +## 相关链接 + +[CREATE ROLE](CREATE-ROLE.md),[DROP ROLE](DROP-ROLE.md#ZH-CN_TOPIC_0242370611),[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 new file mode 100644 index 000000000..b8139d66e --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-ROW-LEVEL-SECURITY-POLICY.md @@ -0,0 +1,107 @@ +# ALTER ROW LEVEL SECURITY POLICY + +## 功能描述 + +对已存在的行访问控制策略(包括行访问控制策略的名称,行访问控制指定的用户,行访问控制的策略表达式)进行修改。 + +## 注意事项 + +表的所有者或管理员用户才能进行此操作。 + +## 语法格式 + +``` +ALTER [ ROW LEVEL SECURITY ] POLICY [ IF EXISTS ] policy_name ON table_name RENAME TO new_policy_name; + +ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name + [ TO { role_name | PUBLIC } [, ...] ] + [ USING ( using_expression ) ]; +``` + +## 参数说明 + +- policy\_name + + 行访问控制策略名称。 + +- table\_name + + 行访问控制策略的表名。 + +- new\_policy\_name + + 新的行访问控制策略名称。 + +- role\_name + + 行访问控制策略应用的数据库用户,可以指定多个用户,PUBLIC表示应用到所有用户。 + +- using\_expression + + 行访问控制的表达式,返回值为boolean类型。 + + +## 示例 + +``` +--创建数据表all_data +postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100)); + +--创建行访问控制策略,当前用户只能查看用户自身的数据 +postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER); +postgres=# \d+ all_data + Table "public.all_data" + Column | Type | Modifiers | Storage | Stats target | Description +--------+------------------------+-----------+----------+--------------+------------- + id | integer | | plain | | + role | character varying(100) | | extended | | + data | character varying(100) | | extended | | +Row Level Security Policies: + POLICY "all_data_rls" + USING (((role)::name = "current_user"())) +Has OIDs: no +Location Nodes: ALL DATANODES +Options: orientation=row, compression=no + +--修改行访问控制all_data_rls的名称 +postgres=# ALTER ROW LEVEL SECURITY POLICY all_data_rls ON all_data RENAME TO all_data_new_rls; + +--修改行访问控制策略影响的用户 +postgres=# ALTER ROW LEVEL SECURITY POLICY all_data_new_rls ON all_data TO alice, bob; +postgres=# \d+ all_data + Table "public.all_data" + Column | Type | Modifiers | Storage | Stats target | Description +--------+------------------------+-----------+----------+--------------+------------- + id | integer | | plain | | + role | character varying(100) | | extended | | + data | character varying(100) | | extended | | +Row Level Security Policies: + POLICY "all_data_new_rls" + TO alice,bob + USING (((role)::name = "current_user"())) +Has OIDs: no +Location Nodes: ALL DATANODES +Options: orientation=row, compression=no, enable_rowsecurity=true + +--修改行访问控制策略表达式 +postgres=# ALTER ROW LEVEL SECURITY POLICY all_data_new_rls ON all_data USING (id > 100 AND role = current_user); +postgres=# \d+ all_data + Table "public.all_data" + Column | Type | Modifiers | Storage | Stats target | Description +--------+------------------------+-----------+----------+--------------+------------- + id | integer | | plain | | + role | character varying(100) | | extended | | + data | character varying(100) | | extended | | +Row Level Security Policies: + POLICY "all_data_new_rls" + TO alice,bob + USING (((id > 100) AND ((role)::name = "current_user"()))) +Has OIDs: no +Location Nodes: ALL DATANODES +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) + diff --git a/content/zh/docs/Developerguide/ALTER-SCHEMA.md b/content/zh/docs/Developerguide/ALTER-SCHEMA.md new file mode 100644 index 000000000..35d3f29cb --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-SCHEMA.md @@ -0,0 +1,76 @@ +# ALTER SCHEMA + +## 功能描述 + +修改模式属性。 + +## 注意事项 + +只有模式的所有者有权限执行ALTER SCHEMA命令,系统管理员默认拥有此权限。 + +## 语法格式 + +- 修改模式的名称。 + + ``` + ALTER SCHEMA schema_name + RENAME TO new_name; + ``` + +- 修改模式的所有者。 + + ``` + ALTER SCHEMA schema_name + OWNER TO new_owner; + ``` + + +## 参数说明 + +- **schema\_name** + + 现有模式的名称。 + + 取值范围:已存在的模式名。 + +- **RENAME TO new\_name** + + 修改模式的名称。 + + new\_name:模式的新名称。 + + 取值范围:字符串,要符合标识符命名规范。 + +- **OWNER TO new\_owner** + + 修改模式的所有者。非系统管理员要改变模式的所有者,该用户还必须是新的所有角色的直接或间接成员, 并且该成员必须在此数据库上有CREATE权限。 + + new\_owner:模式的新所有者。 + + 取值范围:已存在的用户名/角色名。 + + +## 示例 + +``` +--创建模式ds。 +postgres=# CREATE SCHEMA ds; + +--将当前模式ds更名为ds_new。 +postgres=# ALTER SCHEMA ds RENAME TO ds_new; + +--创建用户jack。 +postgres=# CREATE USER jack PASSWORD 'Bigdata@123'; + +--将DS_NEW的所有者修改为jack。 +postgres=# ALTER SCHEMA ds_new OWNER TO jack; + +--删除用户jack和模式ds_new。 +postgres=# DROP SCHEMA ds_new; +postgres=# DROP USER jack; +``` + +## 相关链接 + +[CREATE SCHEMA](CREATE-SCHEMA.md#ZH-CN_TOPIC_0242370577),[DROP SCHEMA](DROP-SCHEMA.md#ZH-CN_TOPIC_0242370612) + diff --git a/content/zh/docs/Developerguide/ALTER-SEQUENCE.md b/content/zh/docs/Developerguide/ALTER-SEQUENCE.md new file mode 100644 index 000000000..e1e9ff711 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-SEQUENCE.md @@ -0,0 +1,76 @@ +# ALTER SEQUENCE + +## 功能描述 + +修改一个现有的序列的参数。 + +## 注意事项 + +- 使用ALTER SEQUENCE的用户必须是该序列的所有者。 +- 当前版本仅支持修改拥有者、归属列和最大值。若要修改其他参数,可以删除重建,并用Setval函数恢复当前值。 +- ALTER SEQUENCE MAXVALUE不支持在事务、函数和存储过程中使用。 +- 修改序列的最大值后,会清空该序列在所有会话的cache。 +- ALTER SEQUENCE会阻塞nextval、setval、currval和lastval的调用、 + +## 语法格式 + +修改序列归属列 + +``` +ALTER SEQUENCE [ IF EXISTS ] name + [MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] + [ OWNED BY { table_name.column_name | NONE } ] ; +``` + +修改序列的拥有者 + +``` +ALTER SEQUENCE [ IF EXISTS ] name OWNER TO new_owner; +``` + +## 参数说明 + +- name + + 将要修改的序列名称。 + +- IF EXISTS + + 当序列不存在时使用该选项不会出现错误消息,仅有一个通知。 + +- OWNED BY + + 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。 + + 如果序列已经和表有关联后,使用这个选项后新的关联关系会覆盖旧的关联。 + + 关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。 + + 使用OWNED BY NONE将删除任何已经存在的关联。 + +- new\_owner + + 序列新所有者的用户名。用户要修改序列的所有者,必须是新角色的直接或者间接成员,并且那个角色必须有序列所在模式上的CREATE权限。 + + +## 示例 + +``` +--创建一个名为serial的递增序列,从101开始。 +postgres=# CREATE SEQUENCE serial START 101; + +--创建一个表,定义默认值。 +postgres=# CREATE TABLE T1(C1 bigint default nextval('serial')); + +--将序列serial的归属列变为T1.C1。 +postgres=# ALTER SEQUENCE serial OWNED BY T1.C1; + +--删除序列 +postgres=# DROP SEQUENCE serial cascade; +postgres=# DROP TABLE T1; +``` + +## 相关链接 + +[CREATE SEQUENCE](CREATE-SEQUENCE.md#ZH-CN_TOPIC_0242370578),[DROP SEQUENCE](DROP-SEQUENCE.md#ZH-CN_TOPIC_0242370613) + diff --git a/content/zh/docs/Developerguide/ALTER-SESSION.md b/content/zh/docs/Developerguide/ALTER-SESSION.md new file mode 100644 index 000000000..4e8637afc --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-SESSION.md @@ -0,0 +1,85 @@ +# ALTER SESSION + +## 功能描述 + +ALTER SESSION命令用于定义或修改那些对当前会话有影响的条件或参数。修改后的会话参数会一直保持,直到断开当前会话。 + +## 注意事项 + +- 如果执行SET TRANSACTION之前没有执行START TRANSACTION,则事务立即结束,命令无法显示效果。 +- 可以用START TRANSACTION里面声明所需要的transaction\_mode\(s\)的方法来避免使用SET TRANSACTION。 + +## 语法格式 + +- 设置会话的事务参数。 + + ``` + ALTER SESSION SET [ SESSION CHARACTERISTICS AS ] TRANSACTION + { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED } | { READ ONLY | READ WRITE } } [, ...] ; + ``` + +- 设置会话的其他运行时参数。 + + ``` + ALTER SESSION SET + {{config_parameter { { TO | = } { value | DEFAULT } + | FROM CURRENT }} | CURRENT_SCHEMA [ TO | = ] { schema | DEFAULT } + | TIME ZONE time_zone + | SCHEMA schema + | NAMES encoding_name + | ROLE role_name PASSWORD 'password' + | SESSION AUTHORIZATION { role_name PASSWORD 'password' | DEFAULT } + | XML OPTION { DOCUMENT | CONTENT } + } ; + ``` + + +## 参数说明 + +修改会话涉及到的参数说明请参见SET语法中的[参数说明](SET.md#zh-cn_topic_0237122186_zh-cn_topic_0059779029_s39823c7ebd854a9f9c761b3a32b1c3c3)。 + +## 示例 + +``` +-- 创建模式ds。 +postgres=# CREATE SCHEMA ds; + +--设置模式搜索路径。 +postgres=# SET SEARCH_PATH TO ds, public; + +--设置日期时间风格为传统的POSTGRES风格(日在月前)。 +postgres=# SET DATESTYLE TO postgres, dmy; + +--设置当前会话的字符编码为UTF8。 +postgres=# ALTER SESSION SET NAMES 'UTF8'; + +--设置时区为加州伯克利。 +postgres=# SET TIME ZONE 'PST8PDT'; + +--设置时区为意大利。 +postgres=# SET TIME ZONE 'Europe/Rome'; + +--设置当前模式。 +postgres=# ALTER SESSION SET CURRENT_SCHEMA TO tpcds; + +--设置XML OPTION为DOCUMENT。 +postgres=# ALTER SESSION SET XML OPTION DOCUMENT; + +--创建角色joe,并设置会话的角色为joe。 +postgres=# CREATE ROLE joe WITH PASSWORD 'Bigdata@123'; +postgres=# ALTER SESSION SET SESSION AUTHORIZATION joe PASSWORD 'Bigdata@123'; + +--切换到默认用户。 +postgres=> ALTER SESSION SET SESSION AUTHORIZATION default; + +--删除ds模式。 +postgres=# DROP SCHEMA ds; + +--删除joe。 +postgres=# DROP ROLE joe; +``` + +## 相关链接 + +[SET](SET.md) + diff --git a/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md b/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md new file mode 100644 index 000000000..4230891f8 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-SYSTEM-KILL-SESSION.md @@ -0,0 +1,51 @@ +# ALTER SYSTEM KILL SESSION + +## 功能描述 + +ALTER SYSTEM KILL SESSION命令用于结束一个会话。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +ALTER SYSTEM KILL SESSION 'session_sid, serial' [ IMMEDIATE ]; +``` + +## 参数说明 + +- **session\_sid, serial** + + 会话的SID和SERIAL(格式请参考示例)。 + + 取值范围:通过查看系统表V$SESSION可查看所有会话的SID和SERIAL。 + +- **IMMEDIATE** + + 表明会话将在命令执行后立即结束。 + + +## 示例 + +``` +--查询会话信息。 +postgres=# SELECT sid,serial#,username FROM V$SESSION; + + sid | serial# | username +-----------------+---------+---------- + 140131075880720 | 0 | omm + 140131025549072 | 0 | omm + 140131073779472 | 0 | omm + 140131071678224 | 0 | omm + 140131125774096 | 0 | + 140131127875344 | 0 | + 140131113629456 | 0 | + 140131094742800 | 0 | +(8 rows) + +--结束SID为140131075880720的会话。 +postgres=# ALTER SYSTEM KILL SESSION '140131075880720,0' IMMEDIATE; +``` + diff --git a/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md b/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md new file mode 100644 index 000000000..443df8e04 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TABLE-PARTITION.md @@ -0,0 +1,244 @@ +# ALTER TABLE PARTITION + +## 功能描述 + +修改表分区,包括增删分区、切割分区、合成分区,以及修改分区属性等。 + +## 注意事项 + +- 添加分区的表空间不能是PG\_GLOBAL。 +- 添加分区的名称不能与该分区表已有分区的名称相同。 +- 添加分区的分区键值要和分区表的分区键的类型一致,且要大于分区表中最后一个范围分区的上边界。 +- 如果目标分区表中已有分区数达到了最大值(32767),则不能继续添加分区。 + +- 当分区表只有一个分区时,不能删除该分区。 +- 选择分区使用PARTITION FOR\(\),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。 +- Value分区表不支持相应的Alter Partition操作。 +- 列存分区表不支持切割分区。 + +## 语法格式 + +- 修改表分区主语法。 + + ``` + ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + action [, ... ]; + ``` + + 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何,openGauss总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 + + ``` + move_clause | + exchange_clause | + row_clause | + merge_clause | + modify_clause | + split_clause | + add_clause | + drop_clause + ``` + + - move\_clause子语法用于移动分区到新的表空间。 + + ``` + MOVE PARTITION { partion_name | FOR ( partition_value [, ...] ) } TABLESPACE tablespacename + ``` + + - exchange\_clause子语法用于把普通表的数据迁移到指定的分区。 + + ``` + EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } + WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} + [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] + ``` + + 进行交换的普通表和分区必须满足如下条件: + + - 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。 + - 普通表和分区的表压缩信息严格一致。 + - 普通表和分区的分布列信息严格一致。 + - 普通表和分区的索引个数相同,且对应索引的信息严格一致。 + - 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。 + - 普通表不可以是临时表。 + + 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。 + + - row\_clause子语法用于设置分区表的行迁移开关。 + + ``` + { ENABLE | DISABLE } ROW MOVEMENT + ``` + + - merge\_clause子语法用于把多个分区合并成一个分区。 + + ``` + MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name + [ TABLESPACE tablespacename ] + ``` + + - modify\_clause子语法用于设置分区索引是否可用。 + + ``` + MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } + ``` + + - split\_clause子语法用于把一个分区切割成多个分区。 + + ``` + SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } + ``` + + - 指定切割点split\_point\_clause的语法为。 + + ``` + AT ( partition_value ) INTO ( PARTITION partition_name [ TABLESPACE tablespacename ] , PARTITION partition_name [ TABLESPACE tablespacename ] ) + ``` + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 列存分区表不支持切割分区。 + >- 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 + + - 不指定切割点no\_split\_point\_clause的语法为。 + + ``` + INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) } + ``` + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 不指定切割点的方式,partition\_less\_than\_item指定的第一个新分区的分区键要大于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition\_less\_than\_item指定的最后一个分区的分区键要等于正在被切割的分区的分区键大小。 + >- 不指定切割点的方式,partition\_start\_end\_item指定的第一个新分区的起始点(如果存在的话)必须等于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition\_start\_end\_item指定的最后一个分区的终止点(如果存在的话)必须等于正在被切割的分区的分区键。 + >- partition\_less\_than\_item支持的分区键个数最多为4,而partition\_start\_end\_item仅支持1个分区键,其支持的数据类型参见[PARTITION BY RANGE\(parti...](CREATE-TABLE-PARTITION.md#zh-cn_topic_0237122119_zh-cn_topic_0059777586_l00efc30fe63048ffa2ef68c5b18bb455)。 + >- 在同一语句中partition\_less\_than\_item和partition\_start\_end\_item两者不可同时使用;不同split语句之间没有限制。 + + + - 分区项partition\_less\_than\_item的语法为。 + + ``` + PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [, ...] ) + [ TABLESPACE tablespacename ] + ``` + + - 分区项partition\_start\_end\_item的语法为,其约束参见[START END语法描述](CREATE-TABLE-PARTITION.md#zh-cn_topic_0237122119_li2094151861116)。 + + ``` + PARTITION partition_name { + {START(partition_value) END (partition_value) EVERY (interval_value)} | + {START(partition_value) END ({partition_value | MAXVALUE})} | + {START(partition_value)} | + {END({partition_value | MAXVALUE})} + } [TABLESPACE tablespace_name] + + ``` + + + - add\_clause子语法用于为指定的分区表添加一个或多个分区。 + + ``` + ADD {partition_less_than_item | partition_start_end_item} + ``` + + - drop\_clause子语法用于删除分区表中的指定分区。 + + ``` + DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } + ``` + + +- 修改表分区名称的语法。 + + ``` + ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + RENAME PARTITION { partion_name | FOR ( partition_value [, ...] ) } TO partition_new_name; + ``` + + +## 参数说明 + +- **table\_name** + + 分区表名。 + + 取值范围:已存在的分区表名。 + +- **partition\_name** + + 分区名。 + + 取值范围:已存在的分区名。 + +- **tablespacename** + + 指定分区要移动到哪个表空间。 + + 取值范围:已存在的表空间名。 + +- **partition\_value** + + 分区键值。 + + 通过PARTITION FOR \( partition\_value \[, ...\] \)子句指定的这一组值,可以唯一确定一个分区。 + + 取值范围:需要进行重命名的分区的分区键的取值范围。 + +- **UNUSABLE LOCAL INDEXES** + + 设置该分区上的所有索引不可用。 + +- **REBUILD UNUSABLE LOCAL INDEXES** + + 重建该分区上的所有索引。 + +- **ENABLE/DISABLE ROW MOVEMET** + + 行迁移开关。 + + 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 + + 取值范围: + + - ENABLE:打开行迁移开关。 + - DISABLE:关闭行迁移开关。 + + 默认是关闭状态。 + +- **ordinary\_table\_name** + + 进行迁移的普通表的名称。 + + 取值范围:已存在的普通表名。 + +- **\{ WITH | WITHOUT \} VALIDATION** + + 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 + + 取值范围: + + - WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 + - WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 + + 默认是WITH状态。 + + 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 + +- **VERBOSE** + + 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 + +- **partition\_new\_name** + + 分区的新名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + + +## 示例 + +请参考CREATE TABLE PARTITION的[示例](CREATE-TABLE-PARTITION.md#zh-cn_topic_0237122119_zh-cn_topic_0059777586_s43dd49de892344bf89e6f56f17404842)。 + +## 相关链接 + +[CREATE TABLE PARTITION](CREATE-TABLE-PARTITION.md),[DROP TABLE](DROP-TABLE.md#ZH-CN_TOPIC_0242370616) + diff --git a/content/zh/docs/Developerguide/ALTER-TABLE.md b/content/zh/docs/Developerguide/ALTER-TABLE.md new file mode 100644 index 000000000..ce296029c --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TABLE.md @@ -0,0 +1,433 @@ +# ALTER TABLE + +## 功能描述 + +修改表,包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所属模式、添加/更新多个列、打开/关闭行访问控制开关。 + +## 注意事项 + +- 只有表的所有者有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。 +- 不能修改分区表的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的修改。 + +- 不支持增加自增列,或者增加DEFAULT值中包含nextval\(\)表达式的列。 +- 不支持对外表、临时表开启行访问控制开关。 +- 通过约束名删除PRIMARY KEY约束时,不会删除NOT NULL约束,如果有需要,请手动删除NOT NULL约束。 +- 使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置。 + +## 语法格式 + +- 修改表的定义。 + + ``` + ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } + action [, ... ]; + ``` + + 其中具体表操作action可以是以下子句之一: + + ``` + column_clause + | ADD table_constraint [ NOT VALID ] + | ADD table_constraint_using_index + | VALIDATE CONSTRAINT constraint_name + | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] + | CLUSTER ON index_name + | SET WITHOUT CLUSTER + | SET ( {storage_parameter = value} [, ... ] ) + | RESET ( storage_parameter [, ... ] ) + | OWNER TO new_owner + | SET TABLESPACE new_tablespace + | SET {COMPRESS|NOCOMPRESS} + + | TO { GROUP groupname | NODE ( nodename [, ... ] ) } + | ADD NODE ( nodename [, ... ] ) + | DELETE NODE ( nodename [, ... ] ) + | DISABLE TRIGGER [ trigger_name | ALL | USER ] + | ENABLE TRIGGER [ trigger_name | ALL | USER ] + | ENABLE REPLICA TRIGGER trigger_name + | ENABLE ALWAYS TRIGGER trigger_name + | DISABLE ROW LEVEL SECURITY + | ENABLE ROW LEVEL SECURITY + | FORCE ROW LEVEL SECURITY + | NO FORCE ROW LEVEL SECURITY + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- **ADD table\_constraint \[ NOT VALID \]** + > 给表增加一个新的约束。 + >- **ADD table\_constraint\_using\_index** + > 根据已有唯一索引为表增加主键约束或唯一约束。 + >- **VALIDATE CONSTRAINT constraint\_name** + > 验证一个外键或是一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 + >- **DROP CONSTRAINT \[ IF EXISTS \] constraint\_name \[ RESTRICT | CASCADE \]** + > 删除一个表上的约束。 + >- **CLUSTER ON index\_name** + > 为将来的CLUSTER(聚簇)操作选择默认索引。实际上并没有重新盘簇化处理该表。 + >- **SET WITHOUT CLUSTER** + > 从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的CLUSTER(聚簇)操作。 + >- **SET \( \{storage\_parameter = value\} \[, ... \] \)** + > 修改表的一个或多个存储参数。 + >- **RESET \( storage\_parameter \[, ... \] \)** + > 重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重写表才能获得想要的效果。 + >- **OWNER TO new\_owner** + > 将表、序列、视图的属主改变成指定的用户。 + >- **SET TABLESPACE new\_tablespace** + > 这种形式将表空间修改为指定的表空间并将相关的数据文件移动到新的表空间。但是表上的所有索引都不会被移动,索引可以通过ALTER INDEX语法的SET TABLESPACE选项来修改索引的表空间。 + >- **SET \{COMPRESS|NOCOMPRESS\}** + > 修改表的压缩特性。表压缩特性的改变只会影响后续批量插入的数据的存储方式,对已有数据的存储毫无影响。也就是说,表压缩特性的修改会导致该表中同时存在着已压缩和未压缩的数据。 + >- **TO \{ GROUP groupname | NODE \( nodename \[, ... \] \) \}** + > 此语法仅在扩展模式(GUC参数support\_extended\_features为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。 + >- **ADD NODE \( nodename \[, ... \] \)** + > 此语法主要供内部扩容工具使用,一般用户不建议使用。 + >- **DELETE NODE \( nodename \[, ... \] \)** + > 此语法主要供内部缩容工具使用,一般用户不建议使用。 + >- **DISABLE TRIGGER \[ trigger\_name | ALL | USER \]** + > 禁用trigger\_name所表示的单个触发器,或禁用所有触发器,或仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如,可延迟唯一性和排除约束的约束触发器)。 + >![](public_sys-resources/icon-note.gif) **说明:** + >应谨慎使用此功能,因为如果不执行触发器,则无法保证原先期望的约束的完整性。 + + - **| ENABLE TRIGGER \[ trigger\_name | ALL | USER \]** + + 启用trigger\_name所表示的单个触发器,或启用所有触发器,或仅启用用户触发器。 + + - **| ENABLE REPLICA TRIGGER trigger\_name** + + 触发器触发机制受配置变量[session\_replication\_role](语句行为.md#zh-cn_topic_0237124732_zh-cn_topic_0059779117_sffbd1c48d86b4c3fa3287167a7810216)的影响,当复制角色为“origin”(默认值)或“local”时,将触发简单启用的触发器。 + + 配置为ENABLE REPLICA的触发器仅在会话处于“replica”模式时触发。 + + - **| ENABLE ALWAYS TRIGGER trigger\_name** + + 无论当前复制模式如何,配置为ENABLE ALWAYS的触发器都将触发。 + + - **| DISABLE/ENABLE ROW LEVEL SECURITY** + + 开启或关闭表的行访问控制开关。 + + 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见[CREATE ROW LEVLEL SECURITY POLICY](CREATE-ROW-LEVLEL-SECURITY-POLICY.md)章节。 + + - **| NO FORCE/FORCE ROW LEVEL SECURITY** + + 强制开启或关闭表的行访问控制开关。 + + 默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)会受影响。系统管理员可以绕过所有的行访问控制策略,不受影响。 + + + + - 其中列相关的操作column\_clause可以是以下子句之一: + + ``` + ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | MODIFY column_name data_type + | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] + | MODIFY column_name [ CONSTRAINT constraint_name ] NULL + | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] + | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] + | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } + | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL + | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer + | ADD STATISTICS (( column_1_name, column_2_name [, ...] )) + | DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) + | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) + | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) + | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- **ADD \[ COLUMN \] column\_name data\_type \[ compress\_mode \] \[ COLLATE collation \] \[ column\_constraint \[ ... \] \]** + > 向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。 + >- **ADD \( \{ column\_name data\_type \[ compress\_mode \] \} \[, ...\] \)** + > 向表中增加多列。 + >- **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 ,比如外键参考、视图等。 + > DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。 + >- **ALTER \[ COLUMN \] column\_name \[ SET DATA \] TYPE data\_type \[ COLLATE collation \] \[ USING expression \]** + > 改变表字段的数据类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 + > ALTER TYPE要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是 + > ``` + > ALTER TABLE table ALTER COLUMN anycol TYPE anytype; + > ``` + > 这里的anycol是任何在表中还存在的字段,而anytype是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强迫重写,这样就删除了不再使用的数据。 + >- **ALTER \[ COLUMN \] column\_name \{ SET DEFAULT expression | DROP DEFAULT \}** + > 为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的INSERT命令,它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT规则应用之前插入到INSERT句中的。 + >- **ALTER \[ COLUMN \] column\_name \{ SET | DROP \} NOT NULL** + > 修改一个字段是否允许NULL值或者拒绝NULL值。如果表在字段中包含非NULL,则只能使用SET NOT NULL。 + >- **ALTER \[ COLUMN \] column\_name SET STATISTICS \[PERCENT\] integer** + > 为随后的ANALYZE操作设置针对每个字段的统计收集目标。目标的范围可以在0到10000之内设置。设置为-1时表示重新恢复到使用系统缺省的统计目标。 + >- **\{ADD | DELETE\} STATISTICS \(\(column\_1\_name, column\_2\_name \[, ...\]\)\)** + > 用于添加和删除多列统计信息声明(不实际进行多列统计信息收集),以便在后续进行全表或全库analyze时进行多列统计信息收集。每组多列统计信息最多支持32列。不支持添加/删除多列统计信息声明的表:系统表、外表。 + >- **ALTER \[ COLUMN \] column\_name SET \( \{attribute\_option = value\} \[, ... \] \)** + > **ALTER \[ COLUMN \] column\_name RESET \( attribute\_option \[, ... \] \)** + > 设置/重置属性选项。 + > 目前,属性选项只定义了n\_distinct和n\_distinct\_inherited。n\_distinct影响表本身的统计值,而n\_distinct\_inherited影响表及其继承子表的统计。目前,只支持SET/RESET n\_distinct参数,禁止SET/RESET n\_distinct\_inherited参数。 + >- **ALTER \[ COLUMN \] column\_name SET STORAGE \{ PLAIN | EXTERNAL | EXTENDED | MAIN \}** + > 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 + + - 其中列约束column\_constraint为: + + ``` + [ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中列的压缩可选项compress\_mode为: + + ``` + [ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS ] + ``` + + + - 其中根据已有唯一索引为表增加主键约束或唯一约束table\_constraint\_using\_index为: + + ``` + [ CONSTRAINT constraint_name ] + { UNIQUE | PRIMARY KEY } USING INDEX index_name + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中表约束table\_constraint为: + + ``` + [ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + PARTIAL CLUSTER KEY ( column_name [, ... ] } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + 其中索引参数index\_parameters为: + + ``` + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ USING INDEX TABLESPACE tablespace_name ] + ``` + + + +- 重命名表。对名称的修改不会影响所存储的数据。 + + ``` + ALTER TABLE [ IF EXISTS ] table_name + RENAME TO new_table_name; + ``` + +- 重命名表中指定的列。 + + ``` + ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + RENAME [ COLUMN ] column_name TO new_column_name; + ``` + +- 重命名表的约束。 + + ``` + ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } + RENAME CONSTRAINT constraint_name TO new_constraint_name; + ``` + +- 设置表的所属模式。 + + ``` + ALTER TABLE [ IF EXISTS ] table_name + SET SCHEMA new_schema; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 这种形式把表移动到另外一个模式。相关的索引、约束都跟着移动。目前序列不支持改变schema。 若该表拥有序列,需要将序列删除,重建,或者取消拥有关系, 才能将表schema更改成功。 + >- 要修改一个表的模式,用户必须在新模式上拥有CREATE权限。要把该表添加为一个父表的新子表,用户必须同时又是父表的所有者。要修改所有者,用户还必须是新的所有角色的直接或间接成员,并且该成员必须在此表的模式上有CREATE权限。这些限制规定了该用户不能做出了重建和删除表之外的事情。不过,系统管理员可以以任何方式修改任意表的所有权限。 + >- 除了RENAME和SET SCHEMA之外所有动作都可以捆绑在一个经过多次修改的列表中并行使用。比如,可以在一个命令里增加几个字段或修改几个字段的类型。对于大表,此种操作带来的效率提升更明显,原因在于只需要对该大表做一次处理。 + >- 增加一个CHECK或NOT NULL约束将会扫描该表,以保证现有的行符合约束要求。 + >- 用一个非空缺省值增加一个字段或者改变一个字段的现有类型会重写整个表。对于大表来说,这个操作可能会花很长时间,并且它还临时需要两倍的磁盘空间。 + +- 添加多个列。 + + ``` + ALTER TABLE [ IF EXISTS ] table_name + ADD ( { column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]} [, ...] ); + ``` + +- 更新多个列。 + + ``` + ALTER TABLE [ IF EXISTS ] table_name + MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] ); + ``` + + +## 参数说明 + +- **IF EXISTS** + + 如果不存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表不存在。 + +- **table\_name \[\*\] | ONLY table\_name | ONLY \( table\_name \)** + + table\_name是需要修改的表名。 + + 若声明了ONLY选项,则只有那个表被更改。若未声明ONLY,该表及其所有子表都将会被更改。另外,可以在表名称后面显示地增加\*选项来指定包括子表,即表示所有后代表都被扫描,这是默认行为。 + +- **constraint\_name** + + 要删除的现有约束的名称。 + +- **index\_name** + + 索引名称。 + +- **storage\_parameter** + + 表的存储参数的名称。 + +- **new\_owner** + + 表新拥有者的名称。 + +- **new\_tablespace** + + 表所属新的表空间名称。 + +- **column\_name**,**column\_1\_name, column\_2\_name** + + 现存的或新字段的名称。 + +- **data\_type** + + 新字段的类型,或者现存字段的新类型。 + +- **compress\_mode** + + 表字段的压缩可选项,当前仅对行存表有效。该子句指定该字段优先使用的压缩算法。 + +- **collation** + + 字段排序规则名称。可选字段COLLATE指定了新字段的排序规则,如果省略,排序规则为新字段的默认类型。 + +- **USING expression** + + USING子句声明如何从旧的字段值里计算新的字段值;如果省略,缺省从旧类型向新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换,则必须提供一个USING子句。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >ALTER TYPE的USING选项实际上可以声明涉及该行旧值的任何表达式,即它可以引用除了正在被转换的字段之外其他的字段。这样,就可以用ALTER TYPE语法做非常普遍性的转换。因为这个灵活性,USING表达式并没有作用于该字段的缺省值(如果有的话),结果可能不是缺省表达式要求的常量表达式。这就意味着如果从旧类型到新类型没有隐含或者赋值转换的话,即使存在USING子句,ALTER TYPE也可能无法把缺省值转换成新的类型。在这种情况下,应该用DROP DEFAULT先删除缺省,执行ALTER TYPE,然后使用SET DEFAULT增加一个合适的新缺省值。类似的考虑也适用于涉及该字段的索引和约束。 + +- **NOT NULL | NULL** + + 设置列是否允许空值。 + +- **integer** + + 带符号的整数常值。当使用PERCENT时表示按照表数据的百分比收集统计信息,integer的取值范围为0-100。 + +- **attribute\_option** + + 属性选项。 + +- **PLAIN | EXTERNAL | EXTENDED | MAIN** + + 字段存储模式。 + + - PLAIN必需用于定长的数值(比如integer)并且是内联的、不压缩的。 + - MAIN用于内联、可压缩的数据。 + - EXTERNAL用于外部保存、不压缩的数据。使用EXTERNAL将令在text和bytea字段上的子字符串操作更快,但付出的代价是增加了存储空间。 + - EXTENDED用于外部的压缩数据,EXTENDED是大多数支持非PLAIN存储的数据的缺省。 + +- **CHECK \( expression \)** + + 每次将要插入的新行或者将要被更新的行必须使表达式结果为真才能成功,否则会抛出一个异常并且不会修改数据库。 + + 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 + + 目前,CHECK表达式不能包含子查询也不能引用除当前行字段之外的变量。 + +- **DEFAULT default\_expr** + + 给字段指定缺省值。 + + 缺省表达式的数据类型必须和字段类型匹配。 + + 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 + +- **UNIQUE index\_parameters** + + **UNIQUE \( column\_name \[, ... \] \) index\_parameters** + + UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。 + +- **PRIMARY KEY index\_parameters** + + **PRIMARY KEY \( column\_name \[, ... \] \) index\_parameters** + + 主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非NULL值。 + +- **DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE** + + 设置该约束是否可推迟。 + + - DEFERRABLE:可以推迟到事务结尾使用SET CONSTRAINTS命令检查。 + - NOT DEFERRABLE:在每条命令之后马上检查。 + - INITIALLY IMMEDIATE:那么每条语句之后就立即检查它。 + - INITIALLY DEFERRED:只有在事务结尾才检查它。 + +- **WITH \( \{storage\_parameter = value\} \[, ... \] \)** + + 为表或索引指定一个可选的存储参数。 + +- **tablespace\_name** + + 索引所在表空间的名称。 + +- **COMPRESS|NOCOMPRESS** + - NOCOMPRESS:如果指定关键字NOCOMPRESS则不会修改表的现有压缩特性。 + - COMPRESS:如果指定COMPRESS关键字,则对该表进行批量插入元组时触发该特性。 + +- **new\_table\_name** + + 修改后新的表名称。 + +- **new\_column\_name** + + 表中指定列修改后新的列名称。 + +- **new\_constraint\_name** + + 修改后表约束的新名称。 + +- **new\_schema** + + 修改后新的模式名称。 + +- **CASCADE** + + 级联删除依赖于被依赖字段或者约束的对象(比如引用该字段的视图)。 + +- **RESTRICT** + + 如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。这是缺省行为。 + +- **schema\_name** + + 表所在的模式名称。 + + +## 示例 + +请参考CREATE TABLE的[示例](CREATE-TABLE.md#zh-cn_topic_0237122117_zh-cn_topic_0059778169_s86758dcf05d442d2a9ebd272e76ed1b8)。 + +## 相关链接 + +[CREATE TABLE](CREATE-TABLE.md),[DROP TABLE](DROP-TABLE.md) + diff --git a/content/zh/docs/Developerguide/ALTER-TABLESPACE.md b/content/zh/docs/Developerguide/ALTER-TABLESPACE.md new file mode 100644 index 000000000..a6f27d397 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TABLESPACE.md @@ -0,0 +1,120 @@ +# ALTER TABLESPACE + +## 功能描述 + +修改表空间的属性。 + +## 注意事项 + +- 当前版本禁止使用ALTER TABLESPACE语法。 +- 只有表空间的所有者有权限执行ALTER TABLESPACE命令,系统管理员默认拥有此权限。 +- 要修改表空间的所有者A为B,则A必须是B的直接或者间接成员。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果new\_owner与old\_owner一致,此处不再校验当前执行操作的用户是否具有修改权限,而直接显示ALTER成功。 + + +## 语法格式 + +- 重命名表空间的语法。 + + ``` + ALTER TABLESPACE tablespace_name + RENAME TO new_tablespace_name; + ``` + +- 设置表空间所有者的语法。 + + ``` + ALTER TABLESPACE tablespace_name + OWNER TO new_owner; + ``` + +- 设置表空间属性的语法。 + + ``` + ALTER TABLESPACE tablespace_name + SET ( {tablespace_option = value} [, ... ] ); + ``` + +- 重置表空间属性的语法。 + + ``` + ALTER TABLESPACE tablespace_name + RESET ( { tablespace_option } [, ...] ); + ``` + +- 设置表空间限额的语法 + + ``` + ALTER TABLESPACE tablespace_name + RESIZE MAXSIZE { UNLIMITED | 'space_size'}; + ``` + + +## 参数说明 + +- **tablespace\_name** + + 要修改的表空间。 + + 取值范围:已存在的表空间名。 + +- **new\_tablespace\_name** + + 表空间的新名称。 + + 新名称不能以"PG\_"开头。 + + 取值范围:字符串,符合标识符命名规范。 + +- **new\_owner** + + 表空间的新所有者。 + + 取值范围:已存在的用户名。 + +- **tablespace\_option** + + 设置或者重置表空间的参数。 + + 取值范围: + + - seq\_page\_cost:设置优化器计算一次顺序获取磁盘页面的开销。缺省为1.0。 + - random\_page\_cost:设置优化器计算一次非顺序获取磁盘页面的开销。缺省为4.0。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- random\_page\_cost是相对于seq\_page\_cost的取值,等于或者小于seq\_page\_cost时毫无意义。 + >- 默认值为4.0的前提条件是,优化器采用索引来扫描表数据,并且表数据在cache中命中率可以90%左右。 + >- 如果表数据空间要比物理内存小,那么减小该值到一个适当水平;相反地,如果表数据在cache中命中率要低于90%,那么适当增大该值。 + >- 如果采用了类似于SSD的随机访问代价较小的存储器,可以适当减小该值,以反映真正的随机扫描代价。 + + + value的取值范围:正的浮点类型。 + +- **RESIZE MAXSIZE** + + 重新设置表空间限额的数值。 + + 取值范围: + + - UNLIMITED,此表空间不设置限额。 + - 由space\_size来确定,其格式参考[CREATE TABLESPACE](CREATE-TABLESPACE.md)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >修改参数MAXSIZE时也可使用: + >``` + >ALTER TABLESPACE tablespace_name RESIZE MAXSIZE + > { 'UNLIMITED' | 'space_size'}; + >``` + + + +## 示例 + +请参考CREATE TABLESPACE的[示例](CREATE-TABLESPACE.md#zh-cn_topic_0237122120_zh-cn_topic_0059777670_s4e5e97caa377440d87fad0d49b56323e)。 + +## 相关链接 + +[CREATE TABLESPACE](CREATE-TABLESPACE.md),[DROP TABLESPACE](DROP-TABLESPACE.md#ZH-CN_TOPIC_0242370617) + diff --git a/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md new file mode 100644 index 000000000..39d94e630 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-CONFIGURATION.md @@ -0,0 +1,175 @@ +# ALTER TEXT SEARCH CONFIGURATION + +## 功能描述 + +更改文本搜索配置的定义。用户可以将映射从字串类型调整为字典,或者改变配置的名称或者所有者,或者修改搜索配置的配置参数。 + +ADD MAPPING FOR选项为文本搜索配置增加字串类型映射;如果ADD MAPPING FOR后面任何一个字串类型的映射已经存在于此文本搜索配置中,那么系统将会报错。 + +ALTER MAPPING FOR选项会首先清除已有的字串类型映射,然后添加指定的字串类型映射。 + +ALTER MAPPING REPLACE ... WITH ... 与ALTER MAPPING FOR ... REPLACE ... WITH ...选项会直接使用new\_dictionary替换old\_dictionary。需要注意的是,只有pg\_ts\_config\_map系统表中存在maptokentype与old\_dictionary对应关系的元组时,才能更新成功,否则不会成功,也不会有任何提示信息返回。 + +DROP MAPPING FOR选项会删除当前文本搜索配置中指定的字串类型映射。 如果没有指定IF EXISTS选项,当DROP MAPPING FOR选项指定的字串类型映射在文本搜索配置中不存在时,数据库会报错。 + +## 注意事项 + +- 当一个搜索配置已经被引用(如被用来创建索引),则不允许用户修改此文本搜索配置。 +- 要使用ALTER TEXT SEARCH CONFIGURATION,用户必须是配置的所有者。 + +## 语法格式 + +- 增加文本搜索配置字串类型映射语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name + ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]; +``` + +- 修改文本搜索配置字典语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name + ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary; +``` + +- 修改文本搜索配置字串类型语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name + ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]; +``` + +- 更改文本搜索配置字典语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name + ALTER MAPPING REPLACE old_dictionary WITH new_dictionary; +``` + +- 删除文本搜索配置字串类型映射语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name + DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]; +``` + +- 重命名文本搜索配置所有者语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name OWNER TO new_owner; +``` + +- 重命名文本搜索配置名称语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name RENAME TO new_name; +``` + +- 重命名文本搜索配置命名空间语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA new_schema; +``` + +- 修改文本搜索配置属性语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name SET ( { configuration_option = value } [, ...] ); +``` + +- 重置文本搜索配置属性语法 + +``` +ALTER TEXT SEARCH CONFIGURATION name RESET ( {configuration_option} [, ...] ); +``` + +## 参数说明 + +- **name** + + 已有文本搜索配置的名称(可以有模式修饰)。 + +- **token\_type** + + 与配置的语法解析器关联的字串类型的名称。详细信息参见[解析器](解析器.md#ZH-CN_TOPIC_0242370496)。 + +- **dictionary\_name** + + 文本搜索字典名称。 如果有多个字典,则它们会按指定的顺序搜索。 + +- **old\_dictionary** + + 映身中拟被替换的文本搜索字典名称。 + +- **new\_dictionary** + + 替换old\_dictionary的文本搜索字典的名称。 + +- **new\_owner** + + 文本搜索配置的新所有者。 + +- **new\_name** + + 文本搜索配置的新名称。 + +- **new\_schema** + + 文本搜索配置的新模式名。 + +- **configuration\_option** + + 文本搜索配置项。详细信息参见[CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md#ZH-CN_TOPIC_0242370585)。 + +- **value** + + 文本搜索配置项的值。 + + +## 示例 + +``` +--创建文本搜索配置。 +postgres=# CREATE TEXT SEARCH CONFIGURATION english_1 (parser=default); +CREATE TEXT SEARCH CONFIGURATION + +--增加文本搜索配置字串类型映射语法。 +postgres=# ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR word WITH simple,english_stem; +ALTER TEXT SEARCH CONFIGURATION + +--增加文本搜索配置字串类型映射语法。 +postgres=# ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR email WITH english_stem, french_stem; +ALTER TEXT SEARCH CONFIGURATION + +--查询文本搜索配置相关信息。 +postgres=# SELECT b.cfgname,a.maptokentype,a.mapseqno,a.mapdict,c.dictname FROM pg_ts_config_map a,pg_ts_config b, pg_ts_dict c WHERE a.mapcfg=b.oid AND a.mapdict=c.oid AND b.cfgname='english_1' ORDER BY 1,2,3,4,5; + cfgname | maptokentype | mapseqno | mapdict | dictname +-----------+--------------+----------+---------+-------------- + english_1 | 2 | 1 | 3765 | simple + english_1 | 2 | 2 | 12960 | english_stem + english_1 | 4 | 1 | 12960 | english_stem + english_1 | 4 | 2 | 12964 | french_stem +(4 rows) + +--增加文本搜索配置字串类型映射语法。 +postgres=# ALTER TEXT SEARCH CONFIGURATION english_1 ALTER MAPPING REPLACE french_stem with german_stem; +ALTER TEXT SEARCH CONFIGURATION + +--查询文本搜索配置相关信息。 +postgres=# SELECT b.cfgname,a.maptokentype,a.mapseqno,a.mapdict,c.dictname FROM pg_ts_config_map a,pg_ts_config b, pg_ts_dict c WHERE a.mapcfg=b.oid AND a.mapdict=c.oid AND b.cfgname='english_1' ORDER BY 1,2,3,4,5; + cfgname | maptokentype | mapseqno | mapdict | dictname +-----------+--------------+----------+---------+-------------- + english_1 | 2 | 1 | 3765 | simple + english_1 | 2 | 2 | 12960 | english_stem + english_1 | 4 | 1 | 12960 | english_stem + english_1 | 4 | 2 | 12966 | german_stem +(4 rows) +``` + +请参见CREATE TEXT SEARCH CONFIGURATION的[示例](CREATE-TEXT-SEARCH-CONFIGURATION.md#zh-cn_topic_0237122121_zh-cn_topic_0059777835_sc3a4aef5c0c0420eaf5a2e67097004a2)。 + +## 相关链接 + +[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) + diff --git a/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md new file mode 100644 index 000000000..57acbc734 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TEXT-SEARCH-DICTIONARY.md @@ -0,0 +1,101 @@ +# ALTER TEXT SEARCH DICTIONARY + +## 功能描述 + +修改全文检索词典的相关定义,包括参数、名称、所有者、以及模式等。 + +## 注意事项 + +- 预定义词典不支持ALTER操作。 +- 只有词典的所有者可以执行ALTER操作,系统管理员默认拥有此权限。 +- 创建或修改词典之后,任何对于filepath路径下用户自定义的词典定义文件的修改,将不会影响到数据库中的词典。如果需要在数据库中使用这些修改,需使用ALTER TEXT SEARCH DICTIONARY语句更新对应词典的定义文件。 + +## 语法格式 + +- 修改词典定义。 + + ``` + ALTER TEXT SEARCH DICTIONARY name ( + option [ = value ] [, ... ] + ); + ``` + + +- 重命名词典。 + + ``` + ALTER TEXT SEARCH DICTIONARY name RENAME TO new_name; + ``` + +- 设置词典的所属模式。 + + ``` + ALTER TEXT SEARCH DICTIONARY name SET SCHEMA new_schema; + ``` + +- 修改词典的所属者。 + + ``` + ALTER TEXT SEARCH DICTIONARY name OWNER TO new_owner; + ``` + + +## 参数说明 + +- **name** + + 已存在的词典名(可指定模式名,否则默认在当前模式下)。 + + 取值范围:已存在的词典名。 + +- **option** + + 要修改的参数名。与template对应,不同的词典类型具有不同的参数列表,且与指定顺序无关。详细参数说明请见[option](CREATE-TEXT-SEARCH-DICTIONARY.md#zh-cn_topic_0237122122_li1286812455448)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 不支持修改词典的TEMPLATE参数值。 + >- 不支持仅修改FILEPATH参数而不修改对应的词典定义文件参数。 + >- 词典定义文件的文件名仅支持小写字母、数据、下划线混合。 + +- **value** + + 要修改的参数值。如果省略等号(=)和value,则表示删除该option的先前设置,使用默认值。 + + 取值范围:对应option定义。 + +- **new\_name** + + 词典的新名称。 + + 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 + +- **new\_owner** + + 词典新的所有者。 + + 取值范围:已存在的用户。 + +- **new\_schema** + + 词典的新模式。 + + 取值范围:已存在的模式。 + + +## 示例 + +``` +--更改Snowball类型字典的停用词定义,其他参数保持不变。 +postgres=# ALTER TEXT SEARCH DICTIONARY my_dict ( StopWords = newrussian, FilePath = 'file:///home/dicts' ); + +--更改Snowball类型字典的Language参数,并删除停用词定义。 +postgres=# ALTER TEXT SEARCH DICTIONARY my_dict ( Language = dutch, StopWords ); + +--更新词典定义,不实际更改任何内容。 +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) + diff --git a/content/zh/docs/Developerguide/ALTER-TRIGGER.md b/content/zh/docs/Developerguide/ALTER-TRIGGER.md new file mode 100644 index 000000000..6fa9244bc --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TRIGGER.md @@ -0,0 +1,45 @@ +# ALTER TRIGGER + +## 功能描述 + +修改触发器定义。 + +## 注意事项 + +只有触发器所在表的所有者可以执行ALTER TRIGGER操作,系统管理员默认拥有此权限。 + +## 语法格式 + +``` +ALTER TRIGGER trigger_name ON table_name RENAME TO new_name; +``` + +## 参数说明 + +- **trigger\_name** + + 要修改的触发器名称。 + + 取值范围:已存在的触发器。 + +- **table\_name** + + 要修改的触发器所在的表名称。 + + 取值范围:已存在的含触发器的表。 + +- **new\_name** + + 修改后的新名称。 + + 取值范围:符合标识符命名规范的字符串,最大长度不超过63个字符,且不能与所在表上其他触发器同名。 + + +## 示例 + +请参见[CREATE TRIGGER](CREATE-TRIGGER.md)的示例。 + +## 相关链接 + +[CREATE TRIGGER](CREATE-TRIGGER.md),[DROP TRIGGER](DROP-TRIGGER.md#ZH-CN_TOPIC_0242370620),[ALTER TABLE](ALTER-TABLE.md) + diff --git a/content/zh/docs/Developerguide/ALTER-TYPE.md b/content/zh/docs/Developerguide/ALTER-TYPE.md new file mode 100644 index 000000000..9d911b7dd --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-TYPE.md @@ -0,0 +1,152 @@ +# ALTER TYPE + +## 功能描述 + +修改一个类型的定义。 + +## 语法格式 + +- 修改类型 + + ``` + ALTER TYPE name action [, ... ] + ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } + ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ] + ALTER TYPE name RENAME TO new_name + ALTER TYPE name SET SCHEMA new_schema + ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ] + ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value + + where action is one of: + ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] + DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ] + ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] + ``` + +- 给复合类型增加新的属性。 + + ``` + ALTER TYPE name ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] + ``` + + +- 从复合类型删除一个属性。 + + ``` + ALTER TYPE name DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ] + ``` + + +- 改变一种复合类型中某个属性的类型。 + + ``` + ALTER TYPE name ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] + ``` + + +- 改变类型的所有者。 + + ``` + ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } + ``` + + +- 改变类型的名称或是一个复合类型中的一个属性的名称。 + + ``` + ALTER TYPE name RENAME TO new_name + ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ] + ``` + + +- 将类型移至一个新的模式中。 + + ``` + ALTER TYPE name SET SCHEMA new_schema + ``` + + +- 为枚举类型增加一个新值。 + + ``` + ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ] + ``` + + +- 重命名枚举类型的一个标签值。 + + ``` + ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value + ``` + + +## 参数说明 + +- **name** + + 一个需要修改的现有的类型的名称\(可以有模式修饰\) 。 + + +- **new\_name** + + 该类型的新名称。 + + +- **new\_owner** + + 新所有者的用户名 。 + + +- **new\_schema** + + 该类型的新模式 。 + + +- **attribute\_name** + + 拟增加、更改或删除的属性的名称。 + + +- **new\_attribute\_name** + + 拟改名的属性的新名称。 + + +- **data\_type** + + 拟新增属性的数据类型,或是拟更改的属性的新类型名。 + +- **new\_enum\_value** + + 枚举类型新增加的标签值,是一个非空的长度不超过64个字节的字符串。 + +- **neighbor\_enum\_value** + + 一个已有枚举标签值,新值应该被增加在紧接着该枚举值之前或者之后的位置上。 + +- **existing\_enum\_value** + + 现有的要重命名的枚举值,是一个非空的长度不超过64个字节的字符串 + + +- **CASCADE** + + 自动级联更新需更新类型以及相关联的记录和继承它们的子表。 + +- **RESTRICT** + + 如果需联动更新类型是已更新类型的关联记录,则拒绝更新。这是缺省选项。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时处理。 例如,在一条命令中同时增加几个属性或是更改几个属性的类型是可以实现的。 + >- 要使用ALTER TYPE,必须是该类型的所有者。 要修改一个类型的模式,还必须在新模式上拥有CREATE权限。 要修改所有者,必须是新的所有角色的直接或间接成员, 并且该成员必须在此类型的模式上有CREATE权限。 (这些限制强制了修改所有者不会做任何通过删除和重建类型不能做的事情。 不过,系统管理员可以以任何方式修改任意类型的所有权。) 要增加一个属性或是修改一个属性的类型,也必须有该类型的USAGE权限。 + + +## 示例 + +请参考CREATE TYPE的[示例](CREATE-TYPE.md#zh-cn_topic_0237122124_zh-cn_topic_0059779377_s66a0b4a6a1df4ba4a116c6c565a0fe9d)。 + +## 相关链接 + +[CREATE TYPE](CREATE-TYPE.md#ZH-CN_TOPIC_0242370588),[DROP TYPE](DROP-TYPE.md#ZH-CN_TOPIC_0242370621) + diff --git a/content/zh/docs/Developerguide/ALTER-USER.md b/content/zh/docs/Developerguide/ALTER-USER.md new file mode 100644 index 000000000..2f6b547fc --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-USER.md @@ -0,0 +1,113 @@ +# ALTER USER + +## 功能描述 + +修改数据库用户的属性。 + +## 注意事项 + +ALTER USER中修改的会话参数只针对指定的用户,且在下一次会话中有效。 + +## 语法格式 + +- 修改用户的权限等信息。 + + ``` + ALTER USER user_name [ [ WITH ] option [ ... ] ]; + ``` + + 其中option子句为。 + + ``` + { CREATEDB | NOCREATEDB } + | { CREATEROLE | NOCREATEROLE } + | { INHERIT | NOINHERIT } + | { AUDITADMIN | NOAUDITADMIN } + | { SYSADMIN | NOSYSADMIN } + | {MONADMIN | NOMONADMIN} + | {OPRADMIN | NOOPRADMIN} + | {POLADMIN | NOPOLADMIN} + | { USEFT | NOUSEFT } + | { LOGIN | NOLOGIN } + | { REPLICATION | NOREPLICATION } + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' | DISABLE } + | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' ] | DISABLE } + | VALID BEGIN 'timestamp' + | VALID UNTIL 'timestamp' + | RESOURCE POOL 'respool' + | USER GROUP 'groupuser' + | PERM SPACE 'spacelimit' + | NODE GROUP logic_cluster_name + | ACCOUNT { LOCK | UNLOCK } + | PGUSER + ``` + +- 修改用户名。 + + ``` + ALTER USER user_name + RENAME TO new_name; + ``` + +- 修改与用户关联的指定会话参数值。 + + ``` + ALTER USER user_name + SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; + ``` + +- 重置与用户关联的指定会话参数值。 + + ``` + ALTER USER user_name + RESET { configuration_parameter | ALL }; + ``` + + +## 参数说明 + +- **user\_name** + + 现有用户名。 + + 取值范围:已存在的用户名。 + +- **new\_password** + + 新密码。 + + 密码规则如下: + + - 不能与当前密码相同。 + - 密码默认不少于8个字符。 + - 不能与用户名及用户名倒序相同。 + - 至少包含大写字母(A-Z),小写字母(a-z),数字(0-9),非字母数字字符(限定为\~!@\#$%^&\*\(\)-\_=+\\|\[\{\}\];:,<.\>/?)四类字符中的三类字符。 + + 取值范围:字符串。 + +- **old\_password** + + 旧密码。 + +- **ACCOUNT LOCK | ACCOUNT UNLOCK** + - ACCOUNT LOCK:锁定帐户,禁止登录数据库。 + - ACCOUNT UNLOCK:解锁帐户,允许登录数据库。 + +- **PGUSER** + + 当前版本不允许修改用户的PGUSER属性。 + + +其他参数请参见[CREATE ROLE](CREATE-ROLE.md)和[ALTER ROLE](ALTER-ROLE.md#ZH-CN_TOPIC_0242370532)的参数说明。 + +## 示例 + +请参考CREATE USER的[示例](CREATE-USER.md#zh-cn_topic_0237122125_zh-cn_topic_0059778166_sfbca773f5bcd4799b3ea668b3eb074fa)。 + +## 相关链接 + +[CREATE ROLE](CREATE-ROLE.md),[CREATE USER](CREATE-USER.md#ZH-CN_TOPIC_0242370589),[DROP USER](DROP-USER.md) + diff --git a/content/zh/docs/Developerguide/ALTER-VIEW.md b/content/zh/docs/Developerguide/ALTER-VIEW.md new file mode 100644 index 000000000..0e99a5fe6 --- /dev/null +++ b/content/zh/docs/Developerguide/ALTER-VIEW.md @@ -0,0 +1,130 @@ +# ALTER VIEW + +## 功能描述 + +ALTER VIEW更改视图的各种辅助属性。(如果用户是更改视图的查询定义,要使用CREATE OR REPLACE VIEW。) + +## 注意事项 + +- 用户必须是视图的所有者才可以使用ALTER VIEW。 +- 要改变视图的模式,用户必须要有新模式的CREATE权限。 +- 要改变视图的所有者,用户必须是新所属角色的直接或者间接的成员,并且此角色必须有视图模式的CREATE权限。 +- 管理员用户可以更改任何视图的所属关系。 + +## 语法格式 + +- 设置视图列的默认值。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + ALTER [ COLUMN ] column_name SET DEFAULT expression; + ``` + +- 取消列视图列的默认值。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + ALTER [ COLUMN ] column_name DROP DEFAULT; + ``` + +- 修改视图的所有者。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + OWNER TO new_owner; + ``` + +- 重命名视图。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + RENAME TO new_name; + ``` + +- 设置视图的所属模式。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + SET SCHEMA new_schema; + ``` + +- 设置视图的选项。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + SET ( { view_option_name [ = view_option_value ] } [, ... ] ); + ``` + +- 重置视图的选项。 + + ``` + ALTER VIEW [ IF EXISTS ] view_name + RESET ( view_option_name [, ... ] ); + ``` + + +## 参数说明 + +- **IF EXISTS** + + 使用这个选项,如果视图不存在时不会产生错误,仅有会有一个提示信息。 + +- **view\_name** + + 视图名称,可以用模式修饰。 + + 取值范围:字符串,符合标识符命名规范。 + +- **column\_name** + + 可选的名称列表,视图的字段名。如果没有给出,字段名取自查询中的字段名。 + + 取值范围:字符串,符合标识符命名规范。 + +- **SET/DROP DEFAULT** + + 设置或删除一个列的缺省值,该参数暂无实际意义。 + +- **new\_owner** + + 视图新所有者的用户名称。 + +- **new\_name** + + 视图的新名称。 + +- **new\_schema** + + 视图的新模式。 + +- **view\_option\_name \[ = view\_option\_value \]** + + 该子句为视图指定一个可选的参数。 + + 目前view\_option\_name支持的参数仅有security\_barrier,当VIEW试图提供行级安全时,应使用该参数。 + + 取值范围:Boolean类型,TRUE、FALSE。 + + +## 示例 + +``` +--创建一个由c_customer_sk小于150的内容组成的视图。 +postgres=# CREATE VIEW tpcds.customer_details_view_v1 AS + SELECT * FROM tpcds.customer + WHERE c_customer_sk < 150; + +--修改视图名称。 +postgres=# ALTER VIEW tpcds.customer_details_view_v1 RENAME TO customer_details_view_v2; + +--修改视图所属schema。 +postgres=# ALTER VIEW tpcds.customer_details_view_v2 SET schema public; + +--删除视图。 +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) + diff --git a/content/zh/docs/Developerguide/ANALYZE-ANALYSE.md b/content/zh/docs/Developerguide/ANALYZE-ANALYSE.md new file mode 100644 index 000000000..4de78f91a --- /dev/null +++ b/content/zh/docs/Developerguide/ANALYZE-ANALYSE.md @@ -0,0 +1,192 @@ +# ANALYZE | ANALYSE + +## 功能描述 + +用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表PG\_STATISTIC下。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。 + +如果没有指定参数,ANALYZE会分析当前数据库中的每个表和分区表。同时也可以通过指定table\_name、column和partition\_name参数把分析限定在特定的表、列或分区表中。 + +ANALYZE|ANALYSE VERIFY用于检测数据库中普通表(行存表、列存表)的数据文件是否损坏。 + +## 注意事项 + +ANALYZE非临时表不能在一个匿名块、事务块、函数或存储过程内被执行。支持存储过程中ANALYZE临时表,不支持统计信息回滚操作。 + +ANALYZE VERIFY 操作处理的大多为异常场景检测需要使用RELEASE版本。ANALYZE VERIFY 场景不触发远程读,因此远程读参数不生效。对于关键系统表出现错误被系统检测出页面损坏时,将直接报错不再继续检测。 + +## 语法格式 + +- 收集表的统计信息。 + + ``` + { ANALYZE | ANALYSE } [ VERBOSE ] + [ table_name [ ( column_name [, ...] ) ] ]; + ``` + + +- 收集分区表的统计信息。 + + ``` + { ANALYZE | ANALYSE } [ VERBOSE ] + [ table_name [ ( column_name [, ...] ) ] ] + PARTITION ( patrition_name ) ; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >普通分区表目前支持针对某个分区的统计信息的语法,但功能上不支持针对某个分区的统计信息收集。 + + +- 收集多列统计信息 + + ``` + {ANALYZE | ANALYSE} [ VERBOSE ] + table_name (( column_1_name, column_2_name [, ...] )); + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 收集多列统计信息时,请设置GUC参数[default\_statistics\_target](其他优化器选项.md#zh-cn_topic_0237124719_zh-cn_topic_0059779049_se18c86fcdf5e4a22870f71187436d815)为负数,以使用百分比采样方式。 + >- 每组多列统计信息最多支持32列。 + >- 不支持收集多列统计信息的表:系统表。 + + +- 检测当前库的数据文件 + + ``` + {ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE}; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- Fast模式校验时,需要对校验的表有并发的DML操作,会导致校验过程中有误报的问题,因为当前Fast模式是直接从磁盘上读取,并发有其他线程修改文件时,会导致获取的数据不准确,建议离线操作。 + >- 支持对全库进行操作,由于涉及的表较多,建议以重定向保存结果**gsql -d database -p port -f "verify.sql"\> verify\_warning.txt 2\>&1**。 + >- 不支持临时表和unlog表。 + >- 对外提示NOTICE只核对外可见的表,内部表的检测会包含在它所依赖的外部表,不对外显示和呈现。 + >- 此命令的处理可容错ERROR级别的处理。由于debug版本的Assert可能会导致core无法继续执行命令,建议在release模式下操作。 + >- 对于全库操作时,当关键系统表出现损坏则直接报错,不再继续执行。 + +- 检测表和索引的数据文件 + + ``` + {ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE} table_name|index_name [CASCADE]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 支持对普通表的操作和索引表的操作,但不支持对索引表index使用CASCADE操作。原因是由于CASCADE模式用于处理主表的所有索引表,当单独对索引表进行检测时,无需使用CASCADE模式。 + >- 不支持临时表和unlog表。 + >- 对于主表的检测会同步检测主表的内部表,例如toast表、cudesc表等。 + >- 当提示索引表损坏时,建议使用reindex命令进行重建索引操作。 + +- 检测表分区的数据文件 + +``` +{ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE} table_name PARTITION {(patrition_name)}[CASCADE]; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 支持对表的单独分区进行检测操作,但不支持对索引表index使用CASCADE操作。 +>- 不支持临时表和unlog表. + +## 参数说明 + +- **VERBOSE** + + 启用显示进度信息。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果指定了VERBOSE,ANALYZE发出进度信息,表明目前正在处理的表。各种有关表的统计信息也会打印出来。 + +- **table\_name** + + 需要分析的特定表的表名(可能会带模式名),如果省略,将对数据库中的所有表(非外部表)进行分析。 + + 对于ANALYZE收集统计信息,目前仅支持行存表、列存表。 + + 取值范围:已有的表名。 + +- **column\_name**,column\_1\_name,column\_2\_name + + 需要分析特定列的列名,默认为所有列。 + + 取值范围:已有的列名。 + +- **partition\_name** + + 如果table为分区表,在关键字PARTITION后面指定分区名partition\_name表示分析该分区表的统计信息。目前语法上支持分区表做ANALYZE,但功能实现上暂不支持对指定分区统计信息的分析。 + + 取值范围:表的某一个分区名。 + +- **index\_name** + + 需要分析的特定索引表的表名(可能会带模式名)。 + + 取值范围:已有的表名。 + +- **FAST|COMPLETE** + + 对于行存表,FAST模式下主要对于行存表的CRC和page header进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对行存表的指针、tuple进行解析校验。 对于列存表,FAST模式下主要对于列存表的CRC和magic进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对列存表的CU进行解析校验。 + +- **CASCADE** + + CASCADE模式下会对当前表的所有索引进行检测处理。 + + +## 示例 + +--- 创建表。 + +``` +postgres=# CREATE TABLE customer_info +( +WR_RETURNED_DATE_SK INTEGER , +WR_RETURNED_TIME_SK INTEGER , +WR_ITEM_SK INTEGER NOT NULL, +WR_REFUNDED_CUSTOMER_SK INTEGER +) +; +``` + +--- 创建分区表。 + +``` +postgres=# CREATE TABLE customer_par +( +WR_RETURNED_DATE_SK INTEGER , +WR_RETURNED_TIME_SK INTEGER , +WR_ITEM_SK INTEGER NOT NULL, +WR_REFUNDED_CUSTOMER_SK INTEGER +) +PARTITION BY RANGE(WR_RETURNED_DATE_SK) +( +PARTITION P1 VALUES LESS THAN(2452275), +PARTITION P2 VALUES LESS THAN(2452640), +PARTITION P3 VALUES LESS THAN(2453000), +PARTITION P4 VALUES LESS THAN(MAXVALUE) +) +ENABLE ROW MOVEMENT; +``` + +--- 使用ANALYZE语句更新统计信息。 + +``` +postgres=# ANALYZE customer; +``` + +--- 使用ANALYZE VERBOSE语句更新统计信息,并输出表的相关信息。 + +``` +postgres=# ANALYZE VERBOSE customer_info; +INFO: analyzing "cstore.pg_delta_3394584009"(cn_5002 pid=53078) +INFO: analyzing "public.customer_info"(cn_5002 pid=53078) +INFO: analyzing "public.customer_info" inheritance tree(cn_5002 pid=53078) +ANALYZE +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>若环境若有故障,需查看数据库主节点的log。 + +--- 删除表。 + +``` +postgres=# DROP TABLE customer; +postgres=# DROP TABLE customer_par; +``` + diff --git a/content/zh/docs/Developerguide/BEGIN.md b/content/zh/docs/Developerguide/BEGIN.md new file mode 100644 index 000000000..e68a86b4d --- /dev/null +++ b/content/zh/docs/Developerguide/BEGIN.md @@ -0,0 +1,54 @@ +# BEGIN + +## 功能描述 + +BEGIN可以用于开始一个匿名块,也可以用于开始一个事务。本节描述用BEGIN开始匿名块的语法,以BEGIN开始事务的语法见[START TRANSACTION](START-TRANSACTION.md)。 + +匿名块是能够动态地创建和执行过程代码的结构,而不需要以持久化的方式将代码作为数据库对象储存在数据库中。 + +## 注意事项 + +无。 + +## 语法格式 + +- 开启匿名块 + + ``` + [DECLARE [declare_statements]] + BEGIN + execution_statements + END; + / + ``` + +- 开启事务 + + ``` + BEGIN [ WORK | TRANSACTION ] + [ + { + ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + | { READ WRITE | READ ONLY } + } [, ...] + ]; + ``` + + +## 参数说明 + +- **declare\_statements** + + 声明变量,包括变量名和变量类型,如“sales\_cnt int”。 + +- **execution\_statements** + + 匿名块中要执行的语句。 + + 取值范围:已存在的函数名称。 + + +## 相关链接 + +[START TRANSACTION](START-TRANSACTION.md) + diff --git a/content/zh/docs/Developerguide/CALL.md b/content/zh/docs/Developerguide/CALL.md new file mode 100644 index 000000000..f6f4bd568 --- /dev/null +++ b/content/zh/docs/Developerguide/CALL.md @@ -0,0 +1,79 @@ +# CALL + +## 功能描述 + +使用CALL命令可以调用已定义的函数和存储过程。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +CALL [schema.] {func_name| procedure_name} ( param_expr ); +``` + +## 参数说明 + +- **schema** + + 函数或存储过程所在的模式名称。 + +- **func\_name** + + 所调用函数或存储过程的名称。 + + 取值范围:已存在的函数名称。 + +- **param\_expr** + + 参数列表可以用符号":="或者"=\>"将参数名和参数值隔开,这种方法的好处是参数可以以任意顺序排列。若参数列表中仅出现参数值,则参数值的排列顺序必须和函数或存储过程定义时的相同。 + + 取值范围:已存在的函数参数名称或存储过程参数名称。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >参数可以包含入参(参数名和类型之间指定“IN”关键字)和出参(参数名和类型之间指定“OUT”关键字),使用CALL命令调用函数或存储过程时,对于非重载的函数,参数列表必须包含出参,出参可以传入一个变量或者任一常量,详见[示例](#zh-cn_topic_0237122088_zh-cn_topic_0059778236_s299dc001fa4b48cd9b56412a73db23c0)。对于重载的package函数,参数列表里可以忽略出参,忽略出参时可能会导致函数找不到。包含出参时,出参只能是常量。 + + +## 示例 + +``` +--创建一个函数func_add_sql,计算两个整数的和,并返回结果。 +postgres=# CREATE FUNCTION func_add_sql(num1 integer, num2 integer) RETURN integer +AS +BEGIN +RETURN num1 + num2; +END; +/ + +--按参数值传递。 +postgres=# CALL func_add_sql(1, 3); + +--使用命名标记法传参。 +postgres=# CALL func_add_sql(num1 => 1,num2 => 3); +postgres=# CALL func_add_sql(num2 := 2, num1 := 3); + +--删除函数。 +postgres=# DROP FUNCTION func_add_sql; + +--创建带出参的函数。 +postgres=# CREATE FUNCTION func_increment_sql(num1 IN integer, num2 IN integer, res OUT integer) +RETURN integer +AS +BEGIN +res := num1 + num2; +END; +/ + +--出参传入常量。 +postgres=# CALL func_increment_sql(1,2,1); + +--函数调用。 +postgres=# call package_func_overload(1, 'test'); +postgres=# call package_func_overload(1, 1); + +--删除函数。 +postgres=# DROP FUNCTION func_increment_sql; +``` + diff --git a/content/zh/docs/Developerguide/CHECKPOINT.md b/content/zh/docs/Developerguide/CHECKPOINT.md new file mode 100644 index 000000000..eaa30765f --- /dev/null +++ b/content/zh/docs/Developerguide/CHECKPOINT.md @@ -0,0 +1,30 @@ +# CHECKPOINT + +## 功能描述 + +检查点(CHECKPOINT)是一个事务日志中的点,所有数据文件都在该点被更新以反映日志中的信息,所有数据文件都将被刷新到磁盘。 + +设置事务日志检查点。预写式日志(WAL)缺省时在事务日志中每隔一段时间放置一个检查点。可以使用gs\_guc命令设置相关运行时参数(checkpoint\_segments和checkpoint\_timeout)来调整这个原子化检查点的间隔。 + +## 注意事项 + +- 只有系统管理员可以调用CHECKPOINT。 +- CHECKPOINT强迫立即进行检查,而不是等到下一次调度时的检查点。 + +## 语法格式 + +``` +CHECKPOINT; +``` + +## 参数说明 + +无。 + +## 示例 + +``` +--设置检查点。 +postgres=# CHECKPOINT; +``` + diff --git a/content/zh/docs/Developerguide/CLOSE.md b/content/zh/docs/Developerguide/CLOSE.md new file mode 100644 index 000000000..e9cdaee8f --- /dev/null +++ b/content/zh/docs/Developerguide/CLOSE.md @@ -0,0 +1,40 @@ +# CLOSE + +## 功能描述 + +CLOSE释放和一个游标关联的所有资源。 + +## 注意事项 + +- 不允许对一个已关闭的游标再做任何操作。 +- 一个不再使用的游标应该尽早关闭。 +- 当创建游标的事务用COMMIT或ROLLBACK终止之后,每个不可保持的已打开游标都隐含关闭。 +- 当创建游标的事务通过ROLLBACK退出之后,每个可以保持的游标都将隐含关闭。 +- 当创建游标的事务成功提交,可保持的游标将保持打开,直到执行一个明确的CLOSE或者客户端断开。 +- openGauss没有明确打开游标的OPEN语句,因为一个游标在使用CURSOR命令定义的时候就打开了。可以通过查询系统视图pg\_cursors看到所有可用的游标。 + +## 语法格式 + +``` +CLOSE { cursor_name | ALL } ; +``` + +## 参数说明 + +- **cursor\_name** + + 一个待关闭的游标名称。 + +- **ALL** + + 关闭所有已打开的游标。 + + +## 示例 + +请参考FETCH的[示例](FETCH.md#zh-cn_topic_0237122165_zh-cn_topic_0059778422_s1ee72832a27547e4949061a010e24578)。 + +## 相关链接 + +[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629),[MOVE](MOVE.md#ZH-CN_TOPIC_0242370633) + diff --git a/content/zh/docs/Developerguide/CLUSTER.md b/content/zh/docs/Developerguide/CLUSTER.md new file mode 100644 index 000000000..08eb9af75 --- /dev/null +++ b/content/zh/docs/Developerguide/CLUSTER.md @@ -0,0 +1,124 @@ +# CLUSTER + +## 功能描述 + +根据一个索引对表进行聚簇排序。 + +CLUSTER指定openGauss通过索引名指定的索引聚簇由表名指定的表。 表名上必须已经定义该索引。 + +当对一个表聚集后,该表将基于索引信息进行物理存储。聚集是一次性操作:当表被更新之后, 更改的内容不会被聚集。也就是说,系统不会试图按照索引顺序对新的存储内容及更新记录进行重新聚集。 + +在对一个表聚簇之后,openGauss会记录在哪个索引上建立了聚集。 CLUSTER table\_name的聚集形式在之前的同一个索引的表上重新聚集。用户也可以用ALTER TABLE的CLUSTER或SET WITHOUT CLUSTER形式来设置索引来用于后续的聚集操作或清除任何之前的设置。 + +不含参数的CLUSTER会将当前用户所拥有的数据库中的先前做过聚簇的所有表重新处理,或者系统管理员调用的这些表。 + +在对一个表进行聚簇的时候,会在其上请求一个ACCESS EXCLUSIVE锁。这样就避免了在CLUSTER完成之前对此表执行其它的操作\(包括读写\)。 + +## 注意事项 + +只有行存B-tree索引支持CLUSTER操作。 + +如果用户只是随机访问表中的行,那么表中数据的实际存储顺序是无关紧要的。但是, 如果对某些数据的访问多于其它数据,而且有一个索引将这些数据分组, 那么将使用CLUSTER中会有所帮助。如果从一个表中请求一定索引范围的值, 或者是一个索引值对应多行,CLUSTER也会有助于应用,因为如果索引标识出第一匹配行所在的存储页,所有其它行也可能已经在同一个存储页里了,这样便节省了磁盘访问的时间,加速了查询。 + +在聚簇过程中,系统先创建一个按照索引顺序建立的表的临时拷贝。同时也建立表上的每个索引的临时拷贝。因此,需要磁盘上有足够的剩余空间, 至少是表大小和索引大小的和。 + +因为CLUSTER记忆聚集信息,可以在第一次的时候手工对表进行聚簇,然后设置一个类似VACUUM的时间,这样就可以周期地自动对表进行聚簇操作。 + +因为优化器记录着有关表的排序的统计,所以建议在新近聚簇的表上运行ANALYZE。否则,优化器可能会选择很差劲的查询规划。 + +CLUSTER不允许在事务中执行。 + +## 语法格式 + +- 对一个表进行聚簇排序。 + + ``` + CLUSTER [ VERBOSE ] table_name [ USING index_name ]; + ``` + +- 对一个分区进行聚簇排序。 + + ``` + CLUSTER [ VERBOSE ] table_name PARTITION ( partition_name ) [ USING index_name ]; + ``` + +- 对已做过聚簇的表重新进行聚簇。 + + ``` + CLUSTER [ VERBOSE ]; + ``` + + +## 参数说明 + +- **VERBOSE** + + 启用显示进度信息。 + +- **table\_name** + + 表名称。 + + 取值范围:已存在的表名称。 + +- **index\_name** + + 索引名称。 + + 取值范围:已存在的索引名称。 + +- **partition\_name** + + 分区名称。 + + 取值范围:已存在的分区名称。 + + +## 示例 + +``` +-- 创建一个分区表。 +postgres=# CREATE TABLE tpcds.inventory_p1 +( + INV_DATE_SK INTEGER NOT NULL, + INV_ITEM_SK INTEGER NOT NULL, + INV_WAREHOUSE_SK INTEGER NOT NULL, + INV_QUANTITY_ON_HAND INTEGER +) +PARTITION BY RANGE(INV_DATE_SK) +( + PARTITION P1 VALUES LESS THAN(2451179), + PARTITION P2 VALUES LESS THAN(2451544), + PARTITION P3 VALUES LESS THAN(2451910), + PARTITION P4 VALUES LESS THAN(2452275), + PARTITION P5 VALUES LESS THAN(2452640), + PARTITION P6 VALUES LESS THAN(2453005), + PARTITION P7 VALUES LESS THAN(MAXVALUE) +); + +-- 创建索引ds_inventory_p1_index1。 +postgres=# CREATE INDEX ds_inventory_p1_index1 ON tpcds.inventory_p1 (INV_ITEM_SK) LOCAL; + +-- 对表tpcds.inventory_p1进行聚集。 +postgres=# CLUSTER tpcds.inventory_p1 USING ds_inventory_p1_index1; + +-- 对分区p3进行聚集。 +postgres=# CLUSTER tpcds.inventory_p1 PARTITION (p3) USING ds_inventory_p1_index1; + +-- 对数据库中可以进行聚集的表进聚集。 +postgres=# CLUSTER; + +--删除索引。 +postgres=# DROP INDEX tpcds.ds_inventory_p1_index1; + +--删除分区表。 +postgres=# DROP TABLE tpcds.inventory_p1; +``` + +## 优化建议 + +- cluster + - 建议在新近聚簇的表上运行ANALYZE。否则,优化器可能会选择很差劲的查询规划。 + - 不允许在事务中执行CLUSTER。 + + diff --git a/content/zh/docs/Developerguide/COMMENT.md b/content/zh/docs/Developerguide/COMMENT.md new file mode 100644 index 000000000..93d9a245e --- /dev/null +++ b/content/zh/docs/Developerguide/COMMENT.md @@ -0,0 +1,149 @@ +# COMMENT + +## 功能描述 + +定义或修改一个对象的注释。 + +## 注意事项 + +- 每个对象只存储一条注释,因此要修改一个注释,对同一个对象发出一条新的COMMENT命令即可。要删除注释,在文本字符串的位置写上NULL即可。当删除对象时,注释自动被删除掉。 +- 目前注释浏览没有安全机制:任何连接到某数据库上的用户都可以看到所有该数据库对象的注释。共享对象(比如数据库、角色、表空间)的注释是全局存储的,连接到任何数据库的任何用户都可以看到它们。因此,不要在注释里存放与安全有关的敏感信息。 +- 对大多数对象,只有对象的所有者可以设置注释。角色没有所有者,所以COMMENT ON ROLE命令仅可以由系统管理员对系统管理员角色执行,有CREATEROLE权限的角色也可以为非系统管理员角色设置注释。系统管理员可以对所有对象进行注释。 + +## 语法格式 + +``` +COMMENT ON +{ + AGGREGATE agg_name (agg_type [, ...] ) | + CAST (source_type AS target_type) | + COLLATION object_name | + COLUMN { table_name.column_name | view_name.column_name } | + CONSTRAINT constraint_name ON table_name | + CONVERSION object_name | + DATABASE object_name | + DOMAIN object_name | + EXTENSION object_name | + FOREIGN DATA WRAPPER object_name | + FOREIGN TABLE object_name | + FUNCTION function_name ( [ {[ argmode ] [ argname ] argtype} [, ...] ] ) | + INDEX object_name | + LARGE OBJECT large_object_oid | + OPERATOR operator_name (left_type, right_type) | + OPERATOR CLASS object_name USING index_method | + 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 | + TABLESPACE object_name | + TEXT SEARCH CONFIGURATION object_name | + TEXT SEARCH DICTIONARY object_name | + TEXT SEARCH PARSER object_name | + TEXT SEARCH TEMPLATE object_name | + TYPE object_name | + VIEW object_name +} + IS 'text'; +``` + +## 参数说明 + +- **agg\_name** + + 聚集函数的名称 + +- **agg\_type** + + 聚集函数参数的类型 + +- **source\_type** + + 类型转换的源数据类型。 + +- **target\_type** + + 类型转换的目标数据类型。 + +- **object\_name** + + 对象名。 + +- **table\_name.column\_name** + + **view\_name.column\_name** + + 定义/修改注释的列名称。前缀可加表名称或者视图名称。 + +- **constraint\_name** + + 定义/修改注释的表约束的名称。 + +- **table\_name** + + 表的名称。 + +- **function\_name** + + 定义/修改注释的函数名称。 + +- **argmode,argname,argtype** + + 函数参数的模式、名称、类型。 + +- **large\_object\_oid** + + 定义/修改注释的大对象的OID值。 + +- **operator\_name** + + 操作符名称。 + +- **left\_type,right\_type** + + 操作参数的数据类型(可以用模式修饰)。当前置或者后置操作符不存在时,可以增加NONE选项。 + +- **text** + + 注释。 + + +## 示例 + +``` +postgres=# CREATE TABLE tpcds.customer_demographics_t2 +( + CD_DEMO_SK INTEGER NOT NULL, + CD_GENDER CHAR(1) , + CD_MARITAL_STATUS CHAR(1) , + CD_EDUCATION_STATUS CHAR(20) , + CD_PURCHASE_ESTIMATE INTEGER , + CD_CREDIT_RATING CHAR(10) , + CD_DEP_COUNT INTEGER , + CD_DEP_EMPLOYED_COUNT INTEGER , + CD_DEP_COLLEGE_COUNT INTEGER +) +WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE) +; + +-- 为tpcds.customer_demographics_t2.cd_demo_sk列加注释。 +postgres=# COMMENT ON COLUMN tpcds.customer_demographics_t2.cd_demo_sk IS 'Primary key of customer demographics table.'; + +--创建一个由c_customer_sk小于150的内容组成的视图。 +postgres=# CREATE VIEW tpcds.customer_details_view_v2 AS + SELECT * + FROM tpcds.customer + WHERE c_customer_sk < 150; + +-- 为tpcds.customer_details_view_v2视图加注释。 +postgres=# COMMENT ON VIEW tpcds.customer_details_view_v2 IS 'View of customer detail'; + +-- 删除view。 +postgres=# DROP VIEW tpcds.customer_details_view_v2; + +-- 删除tpcds.customer_demographics_t2。 +postgres=# DROP TABLE tpcds.customer_demographics_t2; +``` + diff --git a/content/zh/docs/Developerguide/COMMIT-END.md b/content/zh/docs/Developerguide/COMMIT-END.md new file mode 100644 index 000000000..6d7d1b339 --- /dev/null +++ b/content/zh/docs/Developerguide/COMMIT-END.md @@ -0,0 +1,67 @@ +# COMMIT | END + +## 功能描述 + +通过COMMIT或者END可完成提交事务的功能,即提交事务的所有操作。 + +## 注意事项 + +执行COMMIT这个命令的时候,命令执行者必须是该事务的创建者或系统管理员,且创建和提交操作可以不在同一个会话中。 + +## 语法格式 + +``` +{ COMMIT | END } [ WORK | TRANSACTION ] ; +``` + +## 参数说明 + +- **COMMIT | END** + + 提交当前事务,让所有当前事务的更改为其他事务可见。 + +- **WORK | TRANSACTION** + + 可选关键字,除了增加可读性没有其他任何作用。 + + +## 示例 + +``` +--创建表。 +postgres=# CREATE TABLE tpcds.customer_demographics_t2 +( + CD_DEMO_SK INTEGER NOT NULL, + CD_GENDER CHAR(1) , + CD_MARITAL_STATUS CHAR(1) , + CD_EDUCATION_STATUS CHAR(20) , + CD_PURCHASE_ESTIMATE INTEGER , + CD_CREDIT_RATING CHAR(10) , + CD_DEP_COUNT INTEGER , + CD_DEP_EMPLOYED_COUNT INTEGER , + CD_DEP_COLLEGE_COUNT INTEGER +) +WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE) +; + +--开启事务。 +postgres=# START TRANSACTION; + +--插入数据。 +postgres=# INSERT INTO tpcds.customer_demographics_t2 VALUES(1,'M', 'U', 'DOCTOR DEGREE', 1200, 'GOOD', 1, 0, 0); +postgres=# INSERT INTO tpcds.customer_demographics_t2 VALUES(2,'F', 'U', 'MASTER DEGREE', 300, 'BAD', 1, 0, 0); + +--提交事务,让所有更改永久化。 +postgres=# COMMIT; + +--查询数据。 +postgres=# SELECT * FROM tpcds.customer_demographics_t2; + +--删除表tpcds.customer_demographics_t2。 +postgres=# DROP TABLE tpcds.customer_demographics_t2; +``` + +## 相关链接 + +[ROLLBACK](ROLLBACK.md) + diff --git a/content/zh/docs/Developerguide/COMMIT-PREPARED.md b/content/zh/docs/Developerguide/COMMIT-PREPARED.md new file mode 100644 index 000000000..69867890d --- /dev/null +++ b/content/zh/docs/Developerguide/COMMIT-PREPARED.md @@ -0,0 +1,35 @@ +# COMMIT PREPARED + +## 功能描述 + +提交一个早先为两阶段提交准备好的事务。 + +## 注意事项 + +- 该功能仅在维护模式\(GUC参数xc\_maintenance\_mode为on时\)下可用。该模式谨慎打开,一般供维护人员排查问题使用,一般用户不应使用该模式。 +- 命令执行者必须是该事务的创建者或系统管理员,且创建和提交操作可以不在同一个会话中。 +- 事务功能由数据库自动维护,不应显式使用事务功能。 + +## 语法格式 + +``` +COMMIT PREPARED transaction_id ; +COMMIT PREPARED transaction_id WITH CSN; +``` + +## 参数说明 + +- **transaction\_id** + + 待提交事务的标识符。它不能和任何当前预备事务已经使用了的标识符同名。 + + +- **CSN\(commit sequence number\)** + + 待提交事务的序列号。它是一个64位递增无符号数。 + + +## 相关链接 + +[PREPARE TRANSACTION](PREPARE-TRANSACTION.md#ZH-CN_TOPIC_0242370636),[ROLLBACK PREPARED](ROLLBACK-PREPARED.md#ZH-CN_TOPIC_0242370645)。 + diff --git a/content/zh/docs/Developerguide/COPY.md b/content/zh/docs/Developerguide/COPY.md new file mode 100644 index 000000000..161743010 --- /dev/null +++ b/content/zh/docs/Developerguide/COPY.md @@ -0,0 +1,633 @@ +# COPY + +## 功能描述 + +通过COPY命令实现在表和文件之间拷贝数据。 + +COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据拷贝到一个文件。 + +## 注意事项 + +- 执行COPY FROM FILENAME或COPY TO FILENAME语句需要SYSADMIN权限,但默认禁止SYSADMIN用户对数据库配置文件,密钥文件,证书文件和审计日志执行COPY FROM FILENAME或COPY TO FILENAME,以防止SYSADMIN用户越权查看或修改敏感文件。放开这一权限需要通过更改enable\_copy\_server\_files的设定来完成。 +- COPY只能用于表,不能用于视图。 +- 对任何要插入数据的表必须有插入权限。 +- 如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。如果表中有任何不在字段列表里的字段,COPY FROM将为那些字段插入缺省值。 +- 如果声明了数据源文件,服务器必须可以访问该文件;如果指定了STDIN,数据将在客户前端和服务器之间流动,输入时,表的列与列之间使用TAB键分隔,在新的一行中以反斜杠和句点(\\.)表示输入结束。 +- 如果数据文件的任意行包含比预期多或者少的字段,COPY FROM将抛出一个错误。 +- 数据的结束可以用一个只包含反斜杠和句点(\\.)的行表示。如果从文件中读取数据,数据结束的标记是不必要的;如果在客户端应用之间拷贝数据,必须要有结束标记。 +- COPY FROM中\\N为空字符串,如果要输入实际数据值\\N ,使用\\\\N。 + +- COPY FROM不支持在导入过程中对数据做预处理(比如说表达式运算,填充指定默认值等)。如果需要在导入过程中对数据做预处理,用户需先把数据导入到临时表中,然后执行SQL语句通过运算插入到表中,但此方法会导致I/O膨胀,降低导入性能。 +- COPY FROM在遇到数据格式错误时会回滚事务,但没有足够的错误信息,不方便用户从大量的原始数据中定位错误数据。 +- COPY FROM/TO适合低并发,本地小数据量导入导出。 + +## 语法格式 + +- 从一个文件拷贝数据到一个表。 + + ``` + COPY table_name [ ( column_name [, ...] ) ] + FROM { 'filename' | STDIN } + [ [ USING ] DELIMITERS 'delimiters' ] + [ WITHOUT ESCAPING ] + [ LOG ERRORS ] + [ REJECT LIMIT 'limit' ] + [ WITH ( option [, ...] ) ] + | copy_option + | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >语法中的FIXED FORMATTER \( \{ column\_name\( offset, length \) \} \[, ...\] \)以及 \[ \( option \[, ...\] \) | copy\_option \[ ...\] \] 可以任意排列组合。 + +- 把一个表的数据拷贝到一个文件。 + + ``` + COPY table_name [ ( column_name [, ...] ) ] + TO { 'filename' | STDOUT } + [ [ USING ] DELIMITERS 'delimiters' ] + [ WITHOUT ESCAPING ] + [ WITH ( option [, ...] ) ] + | copy_option + | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; + + COPY query + TO { 'filename' | STDOUT } + [ WITHOUT ESCAPING ] + [ WITH ( option [, ...] ) ] + | copy_option + | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >1. COPY TO语法形式约束如下: + > \(query\)与\[USING\] DELIMITER不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定\[USING\] DELIMITERS语法子句。 + >2. 对于FIXED FORMATTTER语法后面跟随的copy\_option是以空格进行分隔的。 + >3. copy\_option是指COPY原生的参数形式,而option是兼容外表导入的参数形式。 + >4. 语法中的FIXED FORMATTER \( \{ column\_name\( offset, length \) \} \[, ...\] \)以及 \[ \( option \[, ...\] \) | copy\_option \[ ...\] \] 可以任意排列组合。 + + 其中可选参数option子句语法为: + + ``` + FORMAT 'format_name' + | OIDS [ boolean ] + | DELIMITER 'delimiter_character' + | NULL 'null_string' + | HEADER [ boolean ] + | FILEHEADER 'header_file_string' + | FREEZE [ boolean ] + | QUOTE 'quote_character' + | ESCAPE 'escape_character' + | EOL 'newline_character' + | NOESCAPING [ boolean ] + | FORCE_QUOTE { ( column_name [, ...] ) | * } + | FORCE_NOT_NULL ( column_name [, ...] ) + | ENCODING 'encoding_name' + | IGNORE_EXTRA_DATA [ boolean ] + | FILL_MISSING_FIELDS [ boolean ] + | COMPATIBLE_ILLEGAL_CHARS [ boolean ] + | DATE_FORMAT 'date_format_string' + | TIME_FORMAT 'time_format_string' + | TIMESTAMP_FORMAT 'timestamp_format_string' + | SMALLDATETIME_FORMAT 'smalldatetime_format_string' + ``` + + 其中可选参数copy\_option子句语法为: + + ``` + OIDS + | NULL 'null_string' + | HEADER + | FILEHEADER 'header_file_string' + | FREEZE + | FORCE_NOT_NULL column_name [, ...] + | FORCE_QUOTE { column_name [, ...] | * } + | BINARY + | CSV + | QUOTE [ AS ] 'quote_character' + | ESCAPE [ AS ] 'escape_character' + | EOL 'newline_character' + | ENCODING 'encoding_name' + | IGNORE_EXTRA_DATA + | FILL_MISSING_FIELDS + | COMPATIBLE_ILLEGAL_CHARS + | DATE_FORMAT 'date_format_string' + | TIME_FORMAT 'time_format_string' + | TIMESTAMP_FORMAT 'timestamp_format_string' + | SMALLDATETIME_FORMAT 'smalldatetime_format_string' + ``` + + +## 参数说明 + +- **query** + + 其结果将被拷贝。 + + 取值范围:一个必须用圆括弧包围的SELECT或VALUES命令。 + +- **table\_name** + + 表的名称(可以有模式修饰)。 + + 取值范围:已存在的表名。 + +- **column\_name** + + 可选的待拷贝字段列表。 + + 取值范围:如果没有声明字段列表,将使用所有字段。 + +- **STDIN** + + 声明输入是来自标准输入。 + +- **STDOUT** + + 声明输出打印到标准输出。 + +- **FIXED** + + 打开字段固定长度模式。在字段固定长度模式下,不能声明DELIMITER,NULL,CSV选项。指定FIXED类型后,不能再通过option或copy\_option指定BINARY、CSV、TEXT等类型。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >定长格式定义如下: + >1. 每条记录的每个字段长度相同。 + >2. 长度不足的字段以空格填充,数字类型字段左对齐,字符字段右对齐。 + >3. 字段和字段之间没有分隔符。 + +- **\[USING\] DELIMITER 'delimiters'** + + 在文件中分隔各个字段的字符串,分隔符最大长度不超过10个字节。 + + 取值范围:不允许包含\\.abcdefghijklmnopqrstuvwxyz0123456789中的任何一个字符。 + + 缺省值:在文本模式下,缺省是水平制表符,在CSV模式下是一个逗号。 + +- **WITHOUT ESCAPING** + + 在TEXT格式中,不对'\\'和后面的字符进行转义。 + + 取值范围:仅支持TEXT格式。 + +- **LOG ERRORS** + + 若指定,则开启对于COPY FROM语句中数据类型错误的容错机制,相关错误行的错误记录会记录到此库中public.pgxc\_copy\_error\_log表中,备后续查阅。 + + 取值范围:仅支持导入(即COPY FROM)时指定。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此容错选项的使用限制如下: + >- 此容错机制仅捕捉COPY FROM过程中数据库主节点上数据解析过程中相关的数据类型错误(DATA\_EXCEPTION)。 + >- 在每个库第一次使用时COPY FROM容错时,请先行检查public.pgxc\_copy\_error\_log(COPY错误表)是否存在,若不存在请调用copy\_error\_log\_create\(\) 函数创建;若存在,请转移此表数据并删除这张表后,调用copy\_error\_log\_create\(\) 函数创建。更多关于表public.pgxc\_copy\_error\_log的字段信息,请参见[表1](其它函数.md#zh-cn_topic_0237121997_table138318280213)。 + >- 若在指定了LOG ERRORS的COPY FROM运行时,public.pgxc\_copy\_error\_log不存在(未创建或者已删除)或表定义不符合copy\_error\_log\_create\(\) 中的预设表定义,则会报错。因此请确定此COPY错误表是使用copy\_error\_log\_create\(\) 函数创建的,否则可能导致容错的COPY FROM语句无法正常执行。 + >- COPY已有的容错选项(如IGNORE\_EXTRA\_DATA)开启时,对应类型的错误会按照已有的方式处理而不会报出异常,因此错误表也不会有相应数据。 + +- **LOG ERRORS DATA** + + LOG ERRORS DATA和LOG ERRORS的区别: + + 1. LOG ERRORS DATA会填充容错表的rawrecord字段。 + 2. 只有supper权限的用户才能使用LOG ERRORS DATA参数选项。 + + >![](public_sys-resources/icon-caution.gif) **注意:** + >使用**“LOG ERRORS DATA”**时,若错误内容过于复杂可能存在写入容错表失败的风险,导致任务失败。 + + +- **REJECT LIMIT **'**limit'** + + 与LOG ERROR选项共同使用,对COPY FROM的容错机制设置数值上限,一旦此COPY FROM语句错误数据超过选项指定条数,则会按照原有机制报错。 + + 取值范围:正整数(1-INTMAX),'unlimited'(无最大值限制) + + 缺省值:若未指定LOG ERRORS,则会报错;若指定LOG ERRORS,则默认为0。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >如上述LOG ERRORS中描述的容错机制,REJECT LIMIT的计数也是按照执行COPY FROM的数据库主节点上遇到的解析错误数量计算,而不是数据库节点的错误数量。 + +- **FORMATTER** + + 在固定长度模式中,定义每一个字段在数据文件中的位置。按照column\(offset,length\)格式定义每一列在数据文件中的位置。 + + 取值范围: + + - offset取值不能小于0,以字节为单位。 + - length取值不能小于0,以字节为单位。 + + 所有列的总长度和不能大于1GB。 + + 文件中没有出现的列默认以空值代替。 + +- **OPTION \{ option\_name ' value ' \}** + + 用于指定兼容外表的各类参数。 + + - FORMAT + + 数据源文件的格式。 + + 取值范围:CSV、TEXT、FIXED、BINARY。 + + - CSV格式的文件,可以有效处理数据列中的换行符,但对一些特殊字符处理有欠缺。 + - TEXT格式的文件,可以有效处理一些特殊字符,但无法正确处理数据列中的换行符。 + - FIXED格式的文件,适用于每条数据的数据列都比较固定的数据,长度不足的列会添加空格补齐,过长的列则会自动截断。 + - BINARY形式的选项会使得所有的数据被存储/读作二进制格式而不是文本。 这比TEXT和CSV格式的要快一些,但是一个BINARY格式文件可移植性比较差。 + + 缺省值:TEXT + + - OIDS + + 为每行拷贝内部对象标识(oid)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >若COPY FROM对象为query或者对于没有oid的表,指定oids标识报错。 + + 取值范围:true/on,false/off。 + + 缺省值:false + + - DELIMITER + + 指定数据文件行数据的字段分隔符。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 分隔符不能是\\r和\\n。 + >- 分隔符不能和null参数相同,CSV格式数据的分隔符不能和quote参数相同。 + >- TEXT格式数据的分隔符不能包含: 小写字母、数字和特殊字符.\\。 + >- 数据文件中单行数据长度需<1GB,如果分隔符较长且数据列较多的情况下,会影响导出有效数据的长度。 + >- 分隔符推荐使用多字符和不可见字符。多字符例如'$^&';不可见字符例如0x07,0x08,0x1b等。 + + 取值范围:支持多字符分隔符,但分隔符不能超过10个字节。 + + 缺省值: + + - TEXT格式的默认分隔符是水平制表符(tab)。 + - CSV格式的默认分隔符为“,”。 + - FIXED格式没有分隔符。 + + - NULL + + 用来指定数据文件中空值的表示。 + + 取值范围: + + - null值不能是\\r和\\n,最大为100个字符。 + - null值不能和分隔符、quote参数相同。 + + 缺省值: + + - CSV格式下默认值是一个没有引号的空字符串。 + - 在TEXT格式下默认值是\\N。 + + - HEADER + + 指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。header只能用于CSV,FIXED格式的文件中。 + + 在导入数据时,如果header选项为on,则数据文本第一行会被识别为标题行,会忽略此行。如果header为off,而数据文件中第一行会被识别为数据。 + + 在导出数据时,如果header选项为on,则需要指定fileheader。如果header为off,则导出数据文件不包含标题行。 + + 取值范围:true/on,false/off。 + + 缺省值:false + + - QUOTE + + CSV格式文件下的引号字符。 + + 缺省值:双引号 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- quote参数不能和分隔符、null参数相同。 + >- quote参数只能是单字节的字符。 + >- 推荐不可见字符作为quote,例如0x07,0x08,0x1b等。 + + - ESCAPE + + CSV格式下,用来指定逃逸字符,逃逸字符只能指定为单字节字符。 + + 缺省值:双引号。当与quote值相同时,会被替换为'\\0'。 + + - EOL 'newline\_character' + + 指定导入导出数据文件换行符样式。 + + 取值范围:支持多字符换行符,但换行符不能超过10个字节。常见的换行符,如\\r、\\n、\\r\\n(设成0x0D、0x0A、0x0D0A效果是相同的),其他字符或字符串,如$、\#。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- EOL参数只能用于TEXT格式的导入导出,不支持CSV格式和FIXED格式导入。为了兼容原有EOL参数,仍然支持导出CSV格式和FIXED格式时指定EOL参数为0x0D或0x0D0A。 + >- EOL参数不能和分隔符、null参数相同。 + >- EOL参数不能包含:.abcdefghijklmnopqrstuvwxyz0123456789。 + + - FORCE\_QUOTE \{ \( column\_name \[, ...\] \) | \* \} + + 在CSV COPY TO模式下,强制在每个声明的字段周围对所有非NULL值都使用引号包围。NULL输出不会被引号包围。 + + 取值范围:已存在的字段。 + + - FORCE\_NOT\_NULL \( column\_name \[, ...\] \) + + 在CSV COPY FROM模式下,指定的字段输入不能为空。 + + 取值范围:已存在的字段。 + + - ENCODING + + 指定数据文件的编码格式名称,缺省为当前数据库编码格式。 + + - IGNORE\_EXTRA\_DATA + + 若数据源文件比外表定义列数多,是否会忽略对多出的列。该参数只在数据导入过程中使用。 + + 取值范围:true/on、false/off。 + + - 参数为true/on,若数据源文件比外表定义列数多,则忽略行尾多出来的列。 + - 参数为false/off,若数据源文件比外表定义列数多,会显示如下错误信息。 + + ``` + extra data after last expected column + ``` + + 缺省值:false。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >如果行尾换行符丢失,使两行变成一行时,设置此参数为true将导致后一行数据被忽略掉。 + + - COMPATIBLE\_ILLEGAL\_CHARS + + 导入非法字符容错参数。此语法仅对COPY FROM导入有效。 + + 取值范围:true/on,false/off。 + + - 参数为true/on,则导入时遇到非法字符进行容错处理,非法字符转换后入库,不报错,不中断导入。 + - 参数为false/off,导入时遇到非法字符进行报错,中断导入。 + + 缺省值:false/off + + >![](public_sys-resources/icon-note.gif) **说明:** + >导入非法字符容错规则如下: + >(1)对于'\\0',容错后转换为空格; + >(2)对于其他非法字符,容错后转换为问号; + >(3)若compatible\_illegal\_chars为true/on标识导入时对于非法字符进行容错处理,则若NULL、DELIMITER、QUOTE、ESCAPE设置为空格或问号则会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。 + + - FILL\_MISSING\_FIELDS + + 当数据加载时,若数据源文件中一行的最后一个字段缺失的处理方式。 + + 取值范围:true/on,false/off。 + + 缺省值:false/off + + - DATE\_FORMAT + + 导入对于DATE类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法DATE格式。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >对于指定为A兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp\_format参数。 + + - TIME\_FORMAT + + 导入对于TIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法TIME格式,不支持时区。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + - TIMESTAMP\_FORMAT + + 导入对于TIMESTAMP类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法TIMESTAMP格式,不支持时区。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + - SMALLDATETIME\_FORMAT + + 导入对于SMALLDATETIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法SMALLDATETIME格式。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + +- **COPY\_OPTION \{ option\_name ' value ' \}** + + 用于指定COPY原生的各类参数。 + + - OIDS + + 为每行拷贝内部对象标识(oid)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >若COPY FROM对象为query或者对于没有oid的表,指定oids标识报错。 + + - NULL null\_string + + 用来指定数据文件中空值的表示。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >在使用COPY FROM的时候,任何匹配这个字符串的字符串将被存储为NULL值,所以应该确保指定的字符串和COPY TO相同。 + + 取值范围: + + - null值不能是\\r和\\n,最大为100个字符。 + - null值不能和分隔符、quote参数相同。 + + 缺省值: + + - 在TEXT格式下默认值是\\N。 + - CSV格式下默认值是一个没有引号的空字符串。 + + - HEADER + + 指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。header只能用于CSV,FIXED格式的文件中。 + + 在导入数据时,如果header选项为on,则数据文本第一行会被识别为标题行,会忽略此行。如果header为off,而数据文件中第一行会被识别为数据。 + + 在导出数据时,如果header选项为on,则需要指定fileheader。如果header为off,则导出数据文件不包含标题行。 + + - FILEHEADER + + 导出数据时用于定义标题行的文件,一般用来描述每一列的数据信息。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 仅在header为on或true的情况下有效。 + >- fileheader指定的是绝对路径。 + >- 该文件只能包含一行标题信息,并以换行符结尾,多余的行将被丢弃(标题信息不能包含换行符)。 + >- 该文件包括换行符在内长度不超过1M。 + + - FREEZE + + 将COPY加载的数据行设置为已经被frozen,就像这些数据行执行过VACUUM FREEZE。 + + 这是一个初始数据加载的性能选项。仅当以下三个条件同时满足时,数据行会被frozen: + + - 在同一事务中create或truncate这张表之后执行COPY。 + - 当前事务中没有打开的游标。 + - 当前事务中没有原有的快照。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >COPY完成后,所有其他会话将会立刻看到这些数据。但是这违反了MVCC可见性的一般原则,用户应当了解这样会导致潜在的风险。 + + - FORCE NOT NULL column\_name \[, ...\] + + 在CSV COPY FROM模式下,指定的字段输入不能为空。 + + 取值范围:已存在的字段。 + + - FORCE QUOTE \{ column\_name \[, ...\] | \* \} + + 在CSV COPY TO模式下,强制在每个声明的字段周围对所有非NULL值都使用引号包围。NULL输出不会被引号包围。 + + 取值范围:已存在的字段。 + + - BINARY + + 使用二进制格式存储和读取,而不是以文本的方式。在二进制模式下,不能声明DELIMITER,NULL,CSV选项。指定BINARY类型后,不能再通过option或copy\_option指定CSV、FIXED、TEXT等类型。 + + - CSV + + 打开逗号分隔变量(CSV)模式。指定CSV类型后,不能再通过option或copy\_option指定BINARY、FIXED、TEXT等类型。 + + - QUOTE \[AS\] 'quote\_character' + + CSV格式文件下的引号字符。 + + 缺省值:双引号。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- quote参数不能和分隔符、null参数相同。 + >- quote参数只能是单字节的字符。 + >- 推荐不可见字符作为quote,例如0x07,0x08,0x1b等。 + + - ESCAPE \[AS\] 'escape\_character' + + CSV格式下,用来指定逃逸字符,逃逸字符只能指定为单字节字符。 + + 默认值为双引号。当与quote值相同时,会被替换为'\\0'。 + + - EOL 'newline\_character' + + 指定导入导出数据文件换行符样式。 + + 取值范围:支持多字符换行符,但换行符不能超过10个字节。常见的换行符,如\\r、\\n、\\r\\n(设成0x0D、0x0A、0x0D0A效果是相同的),其他字符或字符串,如$、\#。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- EOL参数只能用于TEXT格式的导入导出,不支持CSV格式和FIXED格式。为了兼容原有EOL参数,仍然支持导出CSV格式和FIXED格式时指定EOL参数为0x0D或0x0D0A。 + >- EOL参数不能和分隔符、null参数相同。 + >- EOL参数不能包含:.abcdefghijklmnopqrstuvwxyz0123456789。 + + - ENCODING 'encoding\_name' + + 指定文件编码格式名称。 + + 取值范围:有效的编码格式。 + + 缺省值:当前编码格式。 + + - IGNORE\_EXTRA\_DATA + + 指定当数据源文件比外表定义列数多时,忽略行尾多出来的列。该参数只在数据导入过程中使用。 + + 若不使用该参数,在数据源文件比外表定义列数多,会显示如下错误信息。 + + ``` + extra data after last expected column + ``` + + - COMPATIBLE\_ILLEGAL\_CHARS + + 指定导入时对非法字符进行容错处理,非法字符转换后入库。不报错,不中断导入。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 若不使用该参数,导入时遇到非法字符进行报错,中断导入。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >导入非法字符容错规则如下: + >(1)对于'\\0',容错后转换为空格; + >(2)对于其他非法字符,容错后转换为问号; + >(3)若compatible\_illegal\_chars为true/on标识,导入时对于非法字符进行容错处理,则若NULL、DELIMITER、QUOTE、ESCAPE设置为空格或问号则会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。 + + - FILL\_MISSING\_FIELDS + + 当数据加载时,若数据源文件中一行的最后一个字段缺失的处理方式。 + + 取值范围:true/on,false/off。 + + 缺省值:false/off。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >目前COPY指定此Option实际不会生效,即不会有相应的容错处理效果(不生效)。需要额外注意的是,打开此选项会导致解析器在数据库主节点数据解析阶段(即COPY错误表容错的涵盖范围)忽略此数据问题,而到数据库节点重新报错,从而使得COPY错误表(打开LOG ERRORS REJECT LIMIT)在此选项打开的情况下无法成功捕获这类少列的数据异常。因此请不要指定此选项。 + + - DATE\_FORMAT 'date\_format\_string' + + 导入对于DATE类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法DATE格式。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md) + + >![](public_sys-resources/icon-note.gif) **说明:** + >对于指定为A兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp\_format参数。 + + - TIME\_FORMAT 'time\_format\_string' + + 导入对于TIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法TIME格式,不支持时区。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + - TIMESTAMP\_FORMAT 'timestamp\_format\_string' + + 导入对于TIMESTAMP类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法TIMESTAMP格式,不支持时区。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + - SMALLDATETIME\_FORMAT 'smalldatetime\_format\_string' + + 导入对于SMALLDATETIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。 + + 取值范围:合法SMALLDATETIME格式。可参考[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + + COPY FROM能够识别的特殊反斜杠序列如下所示。 + + - **\\b**:反斜杠 (ASCII 8) + - **\\f**:换页(ASCII 12) + - **\\n**:换行符 (ASCII 10) + - **\\r**:回车符 (ASCII 13) + - **\\t**:水平制表符 (ASCII 9) + - **\\v**:垂直制表符 (ASCII 11) + - **\\digits**:反斜杠后面跟着一到三个八进制数,表示ASCII值为该数的字符。 + - **\\xdigits**:反斜杠x后面跟着一个或两个十六进制位声明指定数值编码的字符。 + + +## 示例 + +``` +--将tpcds.ship_mode中的数据拷贝到/home/omm/ds_ship_mode.dat文件中。 +postgres=# COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat'; + +--将tpcds.ship_mode 输出到stdout。 +postgres=# COPY tpcds.ship_mode TO stdout; + +--创建tpcds.ship_mode_t1表。 +postgres=# CREATE TABLE tpcds.ship_mode_t1 +( + SM_SHIP_MODE_SK INTEGER NOT NULL, + SM_SHIP_MODE_ID CHAR(16) NOT NULL, + SM_TYPE CHAR(30) , + SM_CODE CHAR(10) , + SM_CARRIER CHAR(20) , + SM_CONTRACT CHAR(20) +) +WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE) +; + +--从stdin拷贝数据到表tpcds.ship_mode_t1。 +postgres=# COPY tpcds.ship_mode_t1 FROM stdin; + +--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1。 +postgres=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat'; + +--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为TEXT(format 'text'),分隔符为'\t'(delimiter E'\t'),忽略多余列(ignore_extra_data 'true'),不指定转义(noescaping 'true')。 +postgres=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true'); + +--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header)。 +postgres=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data; + +--删除tpcds.ship_mode_t1。 +postgres=# DROP TABLE tpcds.ship_mode_t1; +``` + diff --git a/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md b/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md new file mode 100644 index 000000000..211019c49 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-DATA-SOURCE.md @@ -0,0 +1,92 @@ +# CREATE DATA SOURCE + +## 功能描述 + +创建一个新的外部数据源对象,该对象用于定义openGauss要连接的目标库信息。 + +## 注意事项 + +- Data Source名称在数据库中需唯一,遵循标识符命名规范,长度限制为63字节,过长则会被截断。 +- 只有系统管理员或初始用户才有权限创建Data Source对象。且创建该对象的用户为其默认属主。 +- 当在OPTIONS中出现password选项时,需要保证openGauss每个节点的$GAUSSHOME/bin目录下存在datasource.key.cipher和datasource.key.rand文件,如果不存在这两个文件,请使用gs\_guc工具生成并使用gs\_ssh工具发布到openGauss每个节点的$GAUSSHOME/bin目录下。 + +## 语法格式 + +``` +CREATE DATA SOURCE src_name + [TYPE 'type_str'] + [VERSION {'version_str' | NULL}] + [OPTIONS (optname 'optvalue' [, ...])]; +``` + +## 参数说明 + +- **src\_name** + + 新建Data Source对象的名称,需在数据库内部唯一。 + + 取值范围:字符串,要符标识符的命名规范。 + +- **TYPE** + + 新建Data Source对象的类型,可缺省。 + + 取值范围:空串或非空字符串。 + +- **VERSION** + + 新建Data Source对象的版本号,可缺省或NULL值。 + + 取值范围:空串或非空字符串或NULL。 + +- **OPTIONS** + + Data Source对象的选项字段,创建时可省略,如若指定,其关键字如下: + + - optname + + 选项名称。 + + 取值范围:dsn, username, password, encoding。不区分大小写。 + + - dsn对应odbc配置文件中的DSN。 + - username/password对应连接目标库的用户名和密码。 + + openGauss在后台会对用户输入的username/password加密以保证安全性。该加密所需密钥文件需要使用gs\_guc工具生成并使用gs\_ssh工具发布到openGauss每个节点的$GAUSSHOME/bin目录下。username/password不应当包含'encryptOpt'前缀,否则会被认为是加密后的密文。 + + - encoding表示与目标库交互的字符串编码方式(含发送的SQL语句和返回的字符类型数据),此处创建对象时不检查encoding取值的合法性,能否正确编解码取决于用户提供的编码方式是否在数据库本身支持的字符编码范围内。 + + - optvalue + + 选项值。 + + 取值范围:空或者非空字符串。 + + + +## 示例 + +``` +--创建一个空的Data Source对象,不含任何信息。 +postgres=# CREATE DATA SOURCE ds_test1; + +--创建一个Data Source对象,含TYPE信息,VERSION为NULL。 +postgres=# CREATE DATA SOURCE ds_test2 TYPE 'MPPDB' VERSION NULL; + +--创建一个Data Source对象,仅含OPTIONS。 +postgres=# CREATE DATA SOURCE ds_test3 OPTIONS (dsn 'openGauss', encoding 'utf8'); + +--创建一个Data Source对象,含TYPE, VERSION, OPTIONS。 +postgres=# CREATE DATA SOURCE ds_test4 TYPE 'unknown' VERSION '11.2.3' OPTIONS (dsn 'openGauss', username 'userid', password 'pwd@123456', encoding ''); + +--删除Data Source对象。 +postgres=# DROP DATA SOURCE ds_test1; +postgres=# DROP DATA SOURCE ds_test2; +postgres=# DROP DATA SOURCE ds_test3; +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)** + diff --git a/content/zh/docs/Developerguide/CREATE-DATABASE.md b/content/zh/docs/Developerguide/CREATE-DATABASE.md new file mode 100644 index 000000000..08e9b2cd1 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-DATABASE.md @@ -0,0 +1,170 @@ +# CREATE DATABASE + +## 功能描述 + +创建一个新的数据库。缺省情况下新数据库将通过复制标准系统数据库template0来创建,且仅支持使用template0来创建。 + +## 注意事项 + +- 只有拥有CREATEDB权限的用户才可以创建新数据库,系统管理员默认拥有此权限。 +- 不能在事务块中执行创建数据库语句。 +- 在创建数据库过程中,若出现类似“could not initialize database directory”的错误提示,可能是由于文件系统上数据目录的权限不足或磁盘满等原因引起。 + +## 语法格式 + +``` +CREATE DATABASE database_name + [ [ WITH ] { [ OWNER [=] user_name ] | + [ TEMPLATE [=] template ] | + [ ENCODING [=] encoding ] | + [ LC_COLLATE [=] lc_collate ] | + [ LC_CTYPE [=] lc_ctype ] | + [ DBCOMPATIBILITY [=] compatibilty_type ] | + [ TABLESPACE [=] tablespace_name ] | + [ CONNECTION LIMIT [=] connlimit ]}[...] ]; +``` + +## 参数说明 + +- **database\_name** + + 数据库名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **OWNER \[ = \] user\_name** + + 数据库所有者。缺省时,新数据库的所有者是当前用户。 + + 取值范围:已存在的用户名。 + +- **TEMPLATE \[ = \] template** + + 模板名。即从哪个模板创建新数据库。openGauss采用从模板数据库复制的方式来创建新的数据库。初始时,openGauss包含两个模板数据库template0、template1,以及一个默认的用户数据库postgres。 + + 取值范围:仅template0。 + +- **ENCODING \[ = \] encoding** + + 指定数据库使用的字符编码,可以是字符串(如'SQL\_ASCII')、整数编号。 + + 不指定时,默认使用模版数据库的编码。模板数据库template0和template1的编码默认与操作系统环境相关。template1不允许修改字符编码,因此若要变更编码,请使用template0创建数据库。 + + 常用取值:GBK、UTF8、Latin1。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 指定新的数据库字符集编码必须与所选择的本地环境中(LC\_COLLATE和LC\_CTYPE)的设置兼容。 + >- 当指定的字符编码集为GBK时,部分中文生僻字无法直接作为对象名。这是因为GBK第二个字节的编码范围在0x40-0x7E之间时,字节编码与ASCII字符@A-Z\[\\\]^\_\`a-z\{|\}重叠。其中@\[\\\]^\_'\{|\}是数据库中的操作符,直接作为对象名时,会语法报错。例如“侤”字,GBK16进制编码为0x8240,第二个字节为0x40,与ASCII“@”符号编码相同,因此无法直接作为对象名使用。如果确实要使用,可以在创建和访问对象时,通过增加双引号来规避这个问题。 + +- **LC\_COLLATE \[ = \] lc\_collate** + + 指定新数据库使用的字符集。例如,通过lc\_collate = 'zh\_CN.gbk'设定该参数。 + + 该参数的使用会影响到对字符串的排序顺序(如使用ORDER BY执行,以及在文本列上使用索引的顺序)。默认是使用模板数据库的排序顺序。 + + 取值范围:有效的排序类型。 + +- **LC\_CTYPE \[ = \] lc\_ctype** + + 指定新数据库使用的字符分类。例如,通过lc\_ctype = 'zh\_CN.gbk'设定该参数。该参数的使用会影响到字符的分类,如大写、小写和数字。默认是使用模板数据库的字符分类。 + + 取值范围:有效的字符分类。 + +- **DBCOMPATIBILITY \[ = \] compatibilty\_type** + + 指定兼容的数据库的类型。 + + 取值范围:A、B、C。分别表示兼容Oracle、Mysql和TD。 + +- **TABLESPACE \[ = \] tablespace\_name** + + 指定数据库对应的表空间。 + + 取值范围:已存在表空间名。 + +- **CONNECTION LIMIT \[ = \] connlimit** + + 数据库可以接受的并发连接数。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 系统管理员不受此参数的限制。 + >- connlimit数据库主节点单独统计,openGauss整体的连接数 = connlimit \* 当前正常数据库主节点个数。 + + 取值范围:\>=-1的整数。默认值为-1,表示没有限制。 + + +有关字符编码的一些限制: + +- 若区域设置为C(或POSIX),则允许所有的编码类型,但是对于其他的区域设置,字符编码必须和区域设置相同。 +- 编码和区域设置必须匹配模板数据库,除了将template0当作模板。 因为其他数据库可能会包含不匹配指定编码的数据,或者可能包含排序顺序受LC\_COLLATE和LC\_CTYPE影响的索引。复制这些数据会导致在新数据库中的索引失效。template0是不包含任何会受到影响的数据或者索引。 + +## 示例 + +``` +--创建jim和tom用户。 +postgres=# CREATE USER jim PASSWORD 'Bigdata@123'; +postgres=# CREATE USER tom PASSWORD 'Bigdata@123'; + +--创建一个GBK编码的数据库music(本地环境的编码格式必须也为GBK)。 +postgres=# CREATE DATABASE music ENCODING 'GBK' template = template0; + +--创建数据库music2,并指定所有者为jim。 +postgres=# CREATE DATABASE music2 OWNER jim; + +--用模板template0创建数据库music3,并指定所有者为jim。 +postgres=# CREATE DATABASE music3 OWNER jim TEMPLATE template0; + +--设置music数据库的连接数为10。 +postgres=# ALTER DATABASE music CONNECTION LIMIT= 10; + +--将music名称改为music4。 +postgres=# ALTER DATABASE music RENAME TO music4; + +--将数据库music2的所属者改为tom。 +postgres=# ALTER DATABASE music2 OWNER TO tom; + +--设置music3的表空间为PG_DEFAULT。 +postgres=# ALTER DATABASE music3 SET TABLESPACE PG_DEFAULT; + +--关闭在数据库music3上缺省的索引扫描。 +postgres=# ALTER DATABASE music3 SET enable_indexscan TO off; + +--重置enable_indexscan参数。 +postgres=# ALTER DATABASE music3 RESET enable_indexscan; + +--删除数据库。 +postgres=# DROP DATABASE music2; +postgres=# DROP DATABASE music3; +postgres=# DROP DATABASE music4; + +--删除jim和tom用户。 +postgres=# DROP USER jim; +postgres=# DROP USER tom; + +--创建兼容TD格式的数据库。 +postgres=# CREATE DATABASE td_compatible_db DBCOMPATIBILITY 'C'; + +--创建兼容ORA格式的数据库。 +postgres=# CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'A'; + +--删除兼容TD、ORA格式的数据库。 +postgres=# DROP DATABASE td_compatible_db; +postgres=# DROP DATABASE ora_compatible_db; +``` + +## 相关链接 + +[ALTER DATABASE](ALTER-DATABASE.md),[DROP DATABASE](DROP-DATABASE.md) + +## 优化建议 + +- **create database** + + 事务中不支持创建database。 + + +- **ENCODING** + + 当新建数据库Encoding与模板数据库(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 new file mode 100644 index 000000000..9f8331f85 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-DIRECTORY.md @@ -0,0 +1,57 @@ +# CREATE DIRECTORY + +## 功能描述 + +使用CREATE DIRECTORY语句创建一个目录对象,该目录对象定义了服务器文件系统上目录的别名,用于存放用户使用的数据文件,用户可以通过utl\_file高级包来读写这些文件。 + +该目录对象对于指定用户可以赋予READ和WRITE的操作权限,用于给utl\_file提供权限控制。 + +## 注意事项 + +- 默认只允许初始化用户创建,如果开启enable\_access\_server\_directory(可参考[enable\_access\_server\_directory](操作审计.md#zh-cn_topic_0237124747_section4279164545515)),sysadmin权限的用户也可以创建目录。 +- 创建用户默认拥有此路径的READ和WRITE操作权限。 +- 目录的默认owner为创建directory的用户。 +- 以下路径禁止创建: + - 路径含特殊字符。 + - 路径是相对路径。 + - 路径是符号连接。 + +- 创建目录时会进行以下合法性校验: + - 创建时会检查添加路径是否为操作系统实际存在路径,如不存在会提示用户使用风险。 + - 创建时会校验数据库初始化(omm)用户对于添加路径的权限\(即操作系统目录权限,读/写/执行 - R/W/X\),如果权限不全,会提示用户使用风险。 + +- 在openGauss环境下用户指定的路径需要用户保证各节点上路径的一致性,否则在不同节点上执行会产生找不到路径的问题。 + +## 语法格式 + +``` +CREATE [OR REPLACE] DIRECTORY directory_name +AS 'path_name'; +``` + +## 参数说明 + +- **directory\_name** + + 目录名称。 + + 取值范围:字符串,要符标识符的命名规范。 + +- **path\_name** + + 操作系统的路径。 + + 取值范围: 有效的操作系统路径。 + + +## 示例 + +``` +--创建目录。 +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) + diff --git a/content/zh/docs/Developerguide/CREATE-FUNCTION.md b/content/zh/docs/Developerguide/CREATE-FUNCTION.md new file mode 100644 index 000000000..b19d0b207 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-FUNCTION.md @@ -0,0 +1,308 @@ +# CREATE FUNCTION + +## 功能描述 + +创建一个函数。 + +## 注意事项 + +- 如果创建函数时参数或返回值带有精度,不进行精度检测。 +- 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。 +- 在创建函数时,函数内部通过SET语句设置current\_schema和search\_path无效。执行完函数search\_path和current\_schema与执行函数前的search\_path和current\_schema保持一致。 +- 如果函数参数中带有出参,SELECT调用函数必须缺省出参,CALL调用函数适配A必须指定出参,对于调用重载的带有PACKAGE属性的函数,CALL调用函数可以缺省出参,具体信息参见[CALL](CALL.md)的示例。 +- 兼容Postgresql风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。 +- SELECT调用可以指定不同参数来进行同名函数调用。由于语法CALL适配自A,因此不支持调用不带有PACKAGE属性的同名函数。 +- 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 +- 新创建的函数默认会给PUBLIC授予执行权限(详见[GRANT](GRANT.md))。用户可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。 + +## 语法格式 + +- 兼容PostgreSQL风格的创建自定义函数语法。 + + ``` + CREATE [ OR REPLACE ] FUNCTION function_name + ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) + [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] + LANGUAGE lang_name + [ + {IMMUTABLE | STABLE | VOLATILE } + | {SHIPPABLE | NOT SHIPPABLE} + | WINDOW + | [ NOT ] LEAKPROOF + | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } + | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} + | {fenced | not fenced} + | {PACKAGE} + + | COST execution_cost + | ROWS result_rows + | SET configuration_parameter { {TO | =} value | FROM CURRENT }} + ][...] + { + AS 'definition' + | AS 'obj_file', 'link_symbol' + } + + ``` + +- A风格的创建自定义函数的语法。 + + ``` + CREATE [ OR REPLACE ] FUNCTION function_name + ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) + RETURN rettype [ DETERMINISTIC ] + [ + {IMMUTABLE | STABLE | VOLATILE } + | {SHIPPABLE | NOT SHIPPABLE} + | {PACKAGE} + | {FENCED | NOT FENCED} + | [ NOT ] LEAKPROOF + | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } + | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | + AUTHID DEFINER | AUTHID CURRENT_USER + } + | COST execution_cost + | ROWS result_rows + | SET configuration_parameter { {TO | =} value | FROM CURRENT + + ][...] + + { + IS | AS + } plsql_body + / + ``` + + +## 参数说明 + +- **function\_name** + + 要创建的函数名称(可以用模式修饰)。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **argname** + + 函数参数的名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **argmode** + + 函数参数的模式。 + + 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >VARIADIC用于声明数组类型的参数。 + +- **argtype** + + 函数参数的类型。 + +- **expression** + + 参数的默认表达式。 + +- **rettype** + + 函数返回值的数据类型。 + + 如果存在OUT或IN OUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。 + + SETOF修饰词表示该函数将返回一个集合,而不是单独一项。 + +- **column\_name** + + 字段名称。 + +- **column\_type** + + 字段类型。 + +- **definition** + + 一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 + +- **LANGUAGE lang\_name** + + 用以实现函数的语言的名称。可以是SQL,C,internal,或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号(包围)。若采用单引号,则引号内必须为大写。 + +- **WINDOW** + + 表示该函数是窗口函数,通常只用于C语言编写的函数。替换函数定义时不能改变WINDOW属性。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 + +- **IMMUTABLE** + + 表示该函数在给出同样的参数值时总是返回同样的结果。 + +- **STABLE** + + 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 + +- **VOLATILE** + + 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 + +- PACKAGE + + 表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对A风格的函数。 + + - 不允许package函数和非package函数重载或者替换。 + - package函数不支持VARIADIC类型的参数。 + - 不允许修改函数的package属性。 + +- **LEAKPROOF** + + 指出该函数的参数只包括返回值。LEAKPROOF只能由系统管理员设置。 + +- **CALLED ON NULL INPUT** + + 表明该函数的某些参数是NULL的时候可以按照正常的方式调用。该参数可以省略。 + +- **RETURNS NULL ON NULL INPUT** + + **STRICT** + + STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。 + + RETURNS NULL ON NULL INPUT和STRICT的功能相同。 + +- **EXTERNAL** + + 目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。 + +- **SECURITY INVOKER** + + **AUTHID CURRENT\_USER** + + 表明该函数将带着调用它的用户的权限执行。该参数可以省略。 + + SECURITY INVOKER和AUTHID CURRENT\_USER的功能相同。 + +- **SECURITY DEFINER** + + **AUTHID DEFINER** + + 声明该函数将以创建它的用户的权限执行。 + + AUTHID DEFINER和SECURITY DEFINER的功能相同。 + +- **COST execution\_cost** + + 用来估计函数的执行成本。 + + execution\_cost以cpu\_operator\_cost为单位。 + + 取值范围:正数 + +- **ROWS result\_rows** + + 估计函数返回的行数。用于函数返回的是一个集合。 + + 取值范围:正数,默认值是1000行。 + +- **configuration\_parameter** + - **value** + + 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 + + 取值范围:字符串 + + - DEFAULT + - OFF + - RESET + + 指定默认值。 + + - **from current** + + 取当前会话中的值设置为configuration\_parameter的值。 + + +- **obj\_file, link\_symbol** + + 适用于C语言函数,字符串_obj\_file_指定了动态库的绝对路径;_link\_symbol_指定了该函数的链接符号,也就是该函数在C代码中的函数名称。 + +- **plsql\_body** + + PL/SQL存储过程体。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >当在函数体中创建用户时,日志中会记录密码的明文。因此不建议用户在函数体中创建用户。 + + +## 示例 + +``` +--定义函数为SQL查询。 +postgres=# CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer + AS 'select $1 + $2;' + LANGUAGE SQL + IMMUTABLE + RETURNS NULL ON NULL INPUT; + +--利用参数名用 PL/pgSQL 自增一个整数。 +postgres=# CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$ + BEGIN + RETURN i + 1; + END; +$$ LANGUAGE plpgsql; + +--返回RECORD类型 +CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint) +returns SETOF RECORD +as $$ +begin + result_1 = i + 1; + result_2 = i * 10; +return next; +end; +$$language plpgsql; + +--返回一个包含多个输出参数的记录。 +postgres=# CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text) + AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ + LANGUAGE SQL; + +postgres=# SELECT * FROM func_dup_sql(42); + +--计算两个整数的和,并返回结果。若果输入为null,则返回null。 +postgres=# CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer +AS +BEGIN +RETURN num1 + num2; +END; +/ +--修改函数add的执行规则为IMMUTABLE,即参数不变时返回相同结果。 +postgres=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE; + +--将函数add的名称修改为add_two_number。 +postgres=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number; + +--将函数add的属者改为omm。 +postgres=# ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO omm; + +--删除函数。 +postgres=# DROP FUNCTION add_two_number; +postgres=# DROP FUNCTION func_increment_sql; +postgres=# DROP FUNCTION func_dup_sql; +postgres=# DROP FUNCTION func_increment_plsql; +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 new file mode 100644 index 000000000..09be785ed --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-GROUP.md @@ -0,0 +1,61 @@ +# CREATE GROUP + +## 功能描述 + +创建一个新用户组。 + +## 注意事项 + +CREATE GROUP是CREATE ROLE的别名,非SQL标准语法,不推荐使用,建议用户直接使用CREATE ROLE替代。 + +## 语法格式 + +``` +CREATE GROUP group_name [ [ WITH ] option [ ... ] ] + [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; +``` + +其中可选项action子句语法为: + +``` +where option can be: +{SYSADMIN | NOSYSADMIN} + | {MONADMIN | NOMONADMIN} + | {OPRADMIN | NOOPRADMIN} + | {POLADMIN | NOPOLADMIN} + | {AUDITADMIN | NOAUDITADMIN} + | {CREATEDB | NOCREATEDB} + | {USEFT | NOUSEFT} + | {CREATEROLE | NOCREATEROLE} + | {INHERIT | NOINHERIT} + | {LOGIN | NOLOGIN} + | {REPLICATION | NOREPLICATION} + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | VALID BEGIN 'timestamp' + | VALID UNTIL 'timestamp' + | RESOURCE POOL 'respool' + | USER GROUP 'groupuser' + | PERM SPACE 'spacelimit' + | NODE GROUP logic_group_name + | IN ROLE role_name [, ...] + | IN GROUP role_name [, ...] + | ROLE role_name [, ...] + | ADMIN role_name [, ...] + | USER role_name [, ...] + | SYSID uid + | DEFAULT TABLESPACE tablespace_name + | PROFILE DEFAULT + | PROFILE profile_name + | PGUSER +``` + +## 参数说明 + +请参考CREATE ROLE的[参数说明](CREATE-ROLE.md#zh-cn_topic_0237122112_zh-cn_topic_0059778189_s5a43ec5742a742089e2c302063de7fe4)。 + +## 相关链接 + +[ALTER GROUP](ALTER-GROUP.md#ZH-CN_TOPIC_0242370526),[DROP GROUP](DROP-GROUP.md#ZH-CN_TOPIC_0242370603),[CREATE ROLE](CREATE-ROLE.md) + diff --git a/content/zh/docs/Developerguide/CREATE-INDEX.md b/content/zh/docs/Developerguide/CREATE-INDEX.md new file mode 100644 index 000000000..f199c930e --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-INDEX.md @@ -0,0 +1,305 @@ +# CREATE INDEX + +## 功能描述 + +在指定的表上创建索引。 + +索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: + +- 经常执行查询的字段。 +- 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select \* from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 +- where子句的过滤条件字段上(尤其是范围条件)。 +- 在经常出现在order by、group by和distinct后的字段。 + +在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如分区表上不支持并行创建索引、不支持创建部分索引、不支持NULL FIRST特性。 + +## 注意事项 + +- 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 +- 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 +- 在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。 +- 列存表支持的PSORT和B-tree索引都不支持创建表达式索引、部分索引和唯一索引。 +- 列存表支持的GIN索引支持创建表达式索引,但表达式不能包含空分词、空列和多列,不支持创建部分索引和唯一索引。 + +## 语法格式 + +- 在表上创建索引。 + + ``` + CREATE [ UNIQUE ] INDEX [ [schemaname.]index_name ] ON table_name [ USING method ] + ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ TABLESPACE tablespace_name ] + [ WHERE predicate ]; + ``` + +- 在分区表上创建索引。 + + ``` + CREATE [ UNIQUE ] INDEX [ [schemaname.]index_name ] ON table_name [ USING method ] + ( {{ column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] }[, ...] ) + LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] + [ WITH ( { storage_parameter = value } [, ...] ) ] + [ TABLESPACE tablespace_name ]; + ``` + + +## 参数说明 + +- **UNIQUE** + + 创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。 + + 目前只有行存表B-tree索引支持唯一索引。 + +- **schema\_name** + + 模式的名称。 + + 取值范围:已存在模式名。 + +- **index\_name** + + 要创建的索引名,不能包含模式名,索引的模式与表相同。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **table\_name** + + 需要为其创建索引的表的名称,可以用模式修饰。 + + 取值范围:已存在的表名。 + +- **USING method** + + 指定创建索引的方法。 + + 取值范围: + + - btree:B-tree索引使用一种类似于B+树的结构来存储数据的键值,通过这种结构能够快速的查找索引。btree适合支持比较查询以及查询范围。 + - gin:GIN索引是倒排索引,可以处理包含多个键的值(比如数组)。 + - gist:Gist索引适用于几何和地理等多维数据类型和集合数据类型。 + - Psort:Psort索引。针对列存表进行局部排序索引。 + + 行存表支持的索引类型:btree(行存表缺省值)、gin、gist。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。 + +- **column\_name** + + 表中需要创建索引的列的名称(字段名)。 + + 如果索引方式支持多字段索引,可以声明多个字段。最多可以声明32个字段。 + +- **expression** + + 创建一个基于该表的一个或多个字段的表达式索引,通常必须写在圆括弧中。如果表达式有函数调用的形式,圆括弧可以省略。 + + 表达式索引可用于获取对基本数据的某种变形的快速访问。比如,一个在upper\(col\)上的函数索引将允许WHERE upper\(col\) = 'JIM'子句使用索引。 + + 在创建表达式索引时,如果表达式中包含IS NULL子句,则这种索引是无效的。此时,建议用户尝试创建一个部分索引。 + +- **COLLATE collation** + + COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。 + +- **opclass** + + 操作符类的名称。对于索引的每一列可以指定一个操作符类,操作符类标识了索引那一列的使用的操作符。例如一个B-tree索引在一个四字节整数上可以使用int4\_ops;这个操作符类包括四字节整数的比较函数。实际上对于列上的数据类型默认的操作符类是足够用的。操作符类主要用于一些有多种排序的数据。例如,用户想按照绝对值或者实数部分排序一个复数。能通过定义两个操作符类然后当建立索引时选择合适的类。 + +- **ASC** + + 指定按升序排序 (默认)。 + +- **DESC** + + 指定按降序排序。 + +- **NULLS FIRST** + + 指定空值在排序中排在非空值之前,当指定DESC排序时,本选项为默认的。 + +- **NULLS LAST** + + 指定空值在排序中排在非空值之后,未指定DESC排序时,本选项为默认的。 + +- **WITH \( \{storage\_parameter = value\} \[, ... \] \)** + + 指定索引方法的存储参数。 + + 取值范围: + + 只有GIN索引支持FASTUPDATE,GIN\_PENDING\_LIST\_LIMIT参数。GIN和Psort之外的索引都支持FILLFACTOR参数。 + + - FILLFACTOR + + 一个索引的填充因子(fillfactor)是一个介于10和100之间的百分数。 + + 取值范围:10\~100 + + - FASTUPDATE + + GIN索引是否使用快速更新。 + + 取值范围:ON,OFF + + 默认值:ON + + - GIN\_PENDING\_LIST\_LIMIT + + 当GIN索引启用fastupdate时,设置该索引pending list容量的最大值。 + + 取值范围:64\~INT\_MAX,单位KB。 + + 默认值:gin\_pending\_list\_limit的默认取决于GUC中gin\_pending\_list\_limit的值(默认为4MB) + + +- **TABLESPACE tablespace\_name** + + 指定索引的表空间,如果没有声明则使用默认的表空间。 + + 取值范围:已存在的表空间名。 + +- **WHERE predicate** + + 创建一个部分索引。部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。例如,有一个表,表里包含已记账和未记账的定单,未记账的定单只占表的一小部分而且这部分是最常用的部分,此时就可以通过只在未记账部分创建一个索引来改善性能。另外一个可能的用途是使用带有UNIQUE的WHERE强制一个表的某个子集的唯一性。 + + 取值范围:predicate表达式只能引用表的字段,它可以使用所有字段,而不仅是被索引的字段。目前,子查询和聚集表达式不能出现在WHERE子句里。 + +- **PARTITION index\_partition\_name** + + 索引分区的名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **TABLESPACE index\_partition\_tablespace** + + 索引分区的表空间。 + + 取值范围:如果没有声明,将使用分区表索引的表空间index\_tablespace。 + + +## 示例 + +``` +--创建表tpcds.ship_mode_t1。 +postgres=# create schema tpcds; +postgres=# CREATE TABLE tpcds.ship_mode_t1 +( + SM_SHIP_MODE_SK INTEGER NOT NULL, + SM_SHIP_MODE_ID CHAR(16) NOT NULL, + SM_TYPE CHAR(30) , + SM_CODE CHAR(10) , + SM_CARRIER CHAR(20) , + SM_CONTRACT CHAR(20) +) +; + +--在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建普通索引。 +postgres=# CREATE UNIQUE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK); + +--在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建指定B-tree索引。 +postgres=# CREATE INDEX ds_ship_mode_t1_index4 ON tpcds.ship_mode_t1 USING btree(SM_SHIP_MODE_SK); + +--在表tpcds.ship_mode_t1上SM_CODE字段上创建表达式索引。 +postgres=# CREATE INDEX ds_ship_mode_t1_index2 ON tpcds.ship_mode_t1(SUBSTR(SM_CODE,1 ,4)); + +--在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建SM_SHIP_MODE_SK大于10的部分索引。 +postgres=# CREATE UNIQUE INDEX ds_ship_mode_t1_index3 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK) WHERE SM_SHIP_MODE_SK>10; + +--重命名一个现有的索引。 +postgres=# ALTER INDEX tpcds.ds_ship_mode_t1_index1 RENAME TO ds_ship_mode_t1_index5; + +--设置索引不可用。 +postgres=# ALTER INDEX tpcds.ds_ship_mode_t1_index2 UNUSABLE; + +--重建索引。 +postgres=# ALTER INDEX tpcds.ds_ship_mode_t1_index2 REBUILD; + +--删除一个现有的索引。 +postgres=# DROP INDEX tpcds.ds_ship_mode_t1_index2; + +--删除表。 +postgres=# DROP TABLE tpcds.ship_mode_t1; + +--创建表空间。 +postgres=# CREATE TABLESPACE example1 RELATIVE LOCATION 'tablespace1/tablespace_1'; +postgres=# CREATE TABLESPACE example2 RELATIVE LOCATION 'tablespace2/tablespace_2'; +postgres=# CREATE TABLESPACE example3 RELATIVE LOCATION 'tablespace3/tablespace_3'; +postgres=# CREATE TABLESPACE example4 RELATIVE LOCATION 'tablespace4/tablespace_4'; +--创建表tpcds.customer_address_p1。 +postgres=# CREATE TABLE tpcds.customer_address_p1 +( + 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) +) +TABLESPACE example1 +PARTITION BY RANGE(CA_ADDRESS_SK) +( + PARTITION p1 VALUES LESS THAN (3000), + PARTITION p2 VALUES LESS THAN (5000) TABLESPACE example1, + PARTITION p3 VALUES LESS THAN (MAXVALUE) TABLESPACE example2 +) +ENABLE ROW MOVEMENT; +--创建分区表索引ds_customer_address_p1_index1,不指定索引分区的名称。 +postgres=# CREATE INDEX ds_customer_address_p1_index1 ON tpcds.customer_address_p1(CA_ADDRESS_SK) LOCAL; +--创建分区表索引ds_customer_address_p1_index2,并指定索引分区的名称。 +postgres=# CREATE INDEX ds_customer_address_p1_index2 ON tpcds.customer_address_p1(CA_ADDRESS_SK) LOCAL +( + PARTITION CA_ADDRESS_SK_index1, + PARTITION CA_ADDRESS_SK_index2 TABLESPACE example3, + PARTITION CA_ADDRESS_SK_index3 TABLESPACE example4 +) +TABLESPACE example2; + +--修改分区表索引CA_ADDRESS_SK_index2的表空间为example1。 +postgres=# ALTER INDEX tpcds.ds_customer_address_p1_index2 MOVE PARTITION CA_ADDRESS_SK_index2 TABLESPACE example1; + +--修改分区表索引CA_ADDRESS_SK_index3的表空间为example2。 +postgres=# ALTER INDEX tpcds.ds_customer_address_p1_index2 MOVE PARTITION CA_ADDRESS_SK_index3 TABLESPACE example2; + +--重命名分区表索引。 +postgres=# ALTER INDEX tpcds.ds_customer_address_p1_index2 RENAME PARTITION CA_ADDRESS_SK_index1 TO CA_ADDRESS_SK_index4; + +--删除索引和分区表。 +postgres=# DROP INDEX tpcds.ds_customer_address_p1_index1; +postgres=# DROP INDEX tpcds.ds_customer_address_p1_index2; +postgres=# DROP TABLE tpcds.customer_address_p1; +--删除表空间。 +postgres=# DROP TABLESPACE example1; +postgres=# DROP TABLESPACE example2; +postgres=# DROP TABLESPACE example3; +postgres=# DROP TABLESPACE example4; +``` + +## 相关链接 + +[ALTER INDEX](ALTER-INDEX.md),[DROP INDEX](DROP-INDEX.md) + +## 优化建议 + +- create index + + 建议仅在匹配如下条件之一时创建索引: + + - 经常执行查询的字段。 + - 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select \* from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 + - where子句的过滤条件字段上(尤其是范围条件)。 + - 在经常出现在order by、group by和distinct后的字段。 + + 约束限制: + + - 分区表上不支持创建部分索引、不支持NULL FIRST特性。 + + - 在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。 + + diff --git a/content/zh/docs/Developerguide/CREATE-PROCEDURE.md b/content/zh/docs/Developerguide/CREATE-PROCEDURE.md new file mode 100644 index 000000000..cbef8fef8 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-PROCEDURE.md @@ -0,0 +1,95 @@ +# CREATE PROCEDURE + +## 功能描述 + +创建一个新的存储过程。 + +## 注意事项 + +- 如果创建存储过程时参数或返回值带有精度,不进行精度检测。 +- 创建存储过程时,存储过程定义中对表对象的操作建议都显示指定模式,否则可能会导致存储过程执行异常。 +- 在创建存储过程时,存储过程内部通过SET语句设置current\_schema和search\_path无效。执行完函数search\_path和current\_schema与执行函数前的search\_path和current\_schema保持一致。 +- 如果存储过程参数中带有出参,SELECT调用存储过程必须缺省出参,CALL调用存储过程适配A,调用非重载函数时必须指定出参,对于重载的package函数,out参数可以缺省,具体信息参见[CALL](CALL.md)的示例。 +- 存储过程指定package属性时支持重载。 +- 在创建procedure时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 + +## 语法格式 + +``` +postgres=# CREATE [ OR REPLACE ] PROCEDURE procedure_name + [ ( {[ argmode ] [ argname ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ] + [ + { IMMUTABLE | STABLE | VOLATILE } + | { SHIPPABLE | NOT SHIPPABLE } + | {PACKAGE} + | [ NOT ] LEAKPROOF + | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } + | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} + | COST execution_cost + | ROWS result_rows + | SET configuration_parameter { [ TO | = ] value | FROM CURRENT } + ][ ... ] + { IS | AS } +plsql_body +/ +``` + +## 参数说明 + +- **OR REPLACE** + + 当存在同名的存储过程时,替换原来的定义。 + +- **procedure\_name** + + 创建的存储过程名称,可以带有模式名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **argmode** + + 参数的模式。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >VARIADIC用于声明数组类型的参数。 + + 取值范围: IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的过程定义中。 + +- **argname** + + 参数的名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **argtype** + + 参数的数据类型。 + + 取值范围:可用的数据类型。 + +- **IMMUTABLE、STABLE**等 + + 行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明见[CREATE FUNCTION](CREATE-FUNCTION.md) + +- **plsql\_body** + + PL/SQL存储过程体。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >当在存储过程体中进行创建用户等涉及用户密码相关操作时,系统表及csv日志中会记录密码的明文。因此不建议用户在存储过程体中进行涉及用户密码的相关操作。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>argument\_name和argmode的顺序没有严格要求,推荐按照argument\_name、argmode、argument\_type的顺序使用。 + +## 相关链接 + +[DROP PROCEDURE](DROP-PROCEDURE.md) + +## 优化建议 + +- analyse | analyze + - 不支持在事务或匿名块中执行analyze 。 + - 不支持在函数或存储过程中执行analyze操作。 + + diff --git a/content/zh/docs/Developerguide/CREATE-ROLE.md b/content/zh/docs/Developerguide/CREATE-ROLE.md new file mode 100644 index 000000000..c4eff61ba --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-ROLE.md @@ -0,0 +1,239 @@ +# CREATE ROLE + +## 功能描述 + +创建角色。 + +角色是拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。 + +## 注意事项 + +- 在数据库中添加一个新角色,角色无登录权限。 +- 创建角色的用户必须具备CREATE ROLE的权限或者是系统管理员。 + +## 语法格式 + +``` +CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; +``` + +其中角色信息设置子句option语法为: + +``` +{SYSADMIN | NOSYSADMIN} + | {AUDITADMIN | NOAUDITADMIN} + | {CREATEDB | NOCREATEDB} + | {USEFT | NOUSEFT} + | {CREATEROLE | NOCREATEROLE} + | {INHERIT | NOINHERIT} + | {LOGIN | NOLOGIN} + | {REPLICATION | NOREPLICATION} + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | 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 [, ...] + | ADMIN rol e_name [, ...] + | USER role_name [, ...] + | SYSID uid + | DEFAULT TABLESPACE tablespace_name + | PROFILE DEFAULT + | PROFILE profile_name + | PGUSER +``` + +## 参数说明 + +- **role\_name** + + 角色名称。 + + 取值范围:字符串,要符合标识符的命名规范,且最多为63个字符。若超过63个字符,数据库会截断并保留前63个字符当做角色名称。在创建角色时,数据库的时候会给出提示信息。 + +- **password** + + 登录密码。 + + 密码规则如下: + + - 密码默认不少于8个字符。 + - 不能与用户名及用户名倒序相同。 + - 至少包含大写字母(A-Z),小写字母(a-z),数字(0-9),非字母数字字符(限定为\~!@\#$%^&\*\(\)-\_=+\\|\[\{\}\];:,<.\>/?)四类字符中的三类字符。 + + 取值范围:字符串。 + +- DISABLE + + 默认情况下,用户可以更改自己的密码,除非密码被禁用。要禁用用户的密码,请指定DISABLE。禁用某个用户的密码后,将从系统中删除该密码,此类用户只能通过外部认证来连接数据库,例如:kerberos认证。只有管理员才能启用或禁用密码。普通用户不能禁用初始用户的密码。要启用密码,请运行ALTER USER并指定密码。 + +- **ENCRYPTED | UNENCRYPTED** + + 控制密码存储在系统表里的口令是否加密。(如果没有指定,那么缺省的行为由配置参数password\_encryption控制。)按照产品安全要求,密码必须加密存储,所以,UNENCRYPTED在openGauss中禁止使用。因为系统无法对指定的加密口令字符串进行解密,所以如果目前的口令字符串已经是用SHA256加密的格式,则会继续照此存放,而不管是否声明了ENCRYPTED或UNENCRYPTED。这样就允许在dump/restore的时候重新加载加密的口令。 + +- **SYSADMIN | NOSYSADMIN** + + 决定一个新角色是否为“系统管理员”,具有SYSADMIN属性的角色拥有系统最高权限。 + + 缺省为NOSYSADMIN。 + +- **AUDITADMIN | NOAUDITADMIN** + + 定义角色是否有审计管理属性。 + + 缺省为NOAUDITADMIN。 + +- **CREATEDB | NOCREATEDB** + + 决定一个新角色是否能创建数据库。 + + 新角色没有创建数据库的权限。 + + 缺省为NOCREATEDB。 + +- **USEFT | NOUSEFT** + + 该参数为保留参数,暂未启用。 + +- **CREATEROLE | NOCREATEROLE** + + 决定一个角色是否可以创建新角色(也就是执行CREATE ROLE和CREATE USER)。 一个拥有CREATEROLE权限的角色也可以修改和删除其他角色。 + + 缺省为NOCREATEROLE。 + +- **INHERIT | NOINHERIT** + + 这些子句决定一个角色是否“继承”它所在组的角色的权限。不推荐使用。 + +- **LOGIN | NOLOGIN** + + 具有LOGIN属性的角色才可以登录数据库。一个拥有LOGIN属性的角色可以认为是一个用户。 + + 缺省为NOLOGIN。 + +- **REPLICATION | NOREPLICATION** + + 定义角色是否允许流复制或设置系统为备份模式。REPLICATION属性是特定的角色,仅用于复制。 + + 缺省为NOREPLICATION。 + +- **INDEPENDENT | NOINDEPENDENT** + + 定义私有、独立的角色。具有INDEPENDENT属性的角色,管理员对其进行的控制、访问的权限被分离,具体规则如下: + + - 未经INDEPENDENT角色授权,系统管理员无权对其表对象进行增、删、查、改、拷贝、授权操作。 + - 未经INDEPENDENT角色授权,系统管理员和拥有CREATEROLE属性的安全管理员无权修改INDEPENDENT角色的继承关系。 + - 系统管理员无权修改INDEPENDENT角色的表对象的属主。 + - 系统管理员和拥有CREATEROLE属性的安全管理员无权去除INDEPENDENT角色的INDEPENDENT属性。 + - 系统管理员和拥有CREATEROLE属性的安全管理员无权修改INDEPENDENT角色的数据库口令,INDEPENDENT角色需管理好自身口令,口令丢失无法重置。 + - 管理员属性用户不允许定义修改为INDEPENDENT属性。 + +- **CONNECTION LIMIT** + + 声明该角色可以使用的并发连接数量。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 系统管理员不受此参数的限制。 + >- connlimit数据库主节点单独统计,openGauss整体的连接数 = connlimit \* 当前正常数据库主节点个数。 + + 取值范围:整数,\>=-1,缺省值为-1,表示没有限制。 + +- **VALID BEGIN** + + 设置角色生效的时间戳。如果省略了该子句,角色无有效开始时间限制。 + +- **VALID UNTIL** + + 设置角色失效的时间戳。如果省略了该子句,角色无有效结束时间限制。 + +- **RESOURCE POOL** + + 设置角色使用的resource pool名称,该名称属于系统表:pg\_resource\_pool + +- **USER GROUP 'groupuser'** + + 创建一个user的子用户。 + +- **PERM SPACE** + + 设置用户使用空间的大小。 + +- **TEMP SPACE** + + 设置用户临时表存储空间限额。 + +- **SPILL SPACE** + + 设置用户算子落盘空间限额。 + +- **IN ROLE** + + 新角色立即拥有IN ROLE子句中列出的一个或多个现有角色拥有的权限。不推荐使用。 + +- **IN GROUP** + + IN GROUP是IN ROLE过时的拼法。不推荐使用。 + +- **ROLE** + + ROLE子句列出一个或多个现有的角色,它们将自动添加为这个新角色的成员,拥有新角色所有的权限。 + +- **ADMIN** + + ADMIN子句类似ROLE子句,不同的是ADMIN后的角色可以把新角色的权限赋给其他角色。 + +- **USER** + + USER子句是ROLE子句过时的拼法。 + +- **SYSID** + + SYSID子句将被忽略,无实际意义。 + +- **DEFAULT TABLESPACE** + + DEFAULT TABLESPACE子句将被忽略,无实际意义。 + +- **PROFILE** + + PROFILE子句将被忽略,无实际意义。 + +- **PGUSER** + + 当前版本该属性没有实际意义,仅为了语法的前向兼容而保留。 + + +## 示例 + +``` +--创建一个角色,名为manager,密码为Bigdata@123。 +postgres=# CREATE ROLE manager IDENTIFIED BY 'Bigdata@123'; + +--创建一个角色,从2015年1月1日开始生效,到2026年1月1日失效。 +postgres=# CREATE ROLE miriam WITH LOGIN PASSWORD 'Bigdata@123' VALID BEGIN '2015-01-01' VALID UNTIL '2026-01-01'; + +--修改角色manager的密码为abcd@123。 +postgres=# ALTER ROLE manager IDENTIFIED BY 'abcd@123' REPLACE 'Bigdata@123'; + +--修改角色manager为系统管理员。 +postgres=# ALTER ROLE manager SYSADMIN; + +--删除角色manager。 +postgres=# DROP ROLE manager; + +--删除角色miriam。 +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) + diff --git a/content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md b/content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md new file mode 100644 index 000000000..acc5d59f8 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-ROW-LEVLEL-SECURITY-POLICY.md @@ -0,0 +1,224 @@ +# CREATE ROW LEVLEL SECURITY POLICY + +## 功能描述 + +对表创建行访问控制策略。 + +当对表创建了行访问控制策略,只有打开该表的行访问控制开关\(ALTER TABLE ... ENABLE ROW LEVEL SECURITY\),策略才能生效。否则不生效。 + +当前行访问控制影响数据表的读取操作\(SELECT、UPDATE、DELETE\),暂不影响数据表的写入操作\(INSERT、MERGE INTO\)。表所有者或系统管理员可以在USING子句中创建表达式,在客户端执行数据表读取操作时,数据库后台在查询重写阶段会将满足条件的表达式拼接并应用到执行计划中。针对数据表的每一条元组,当USING表达式返回TRUE时,元组对当前用户可见,当USING表达式返回FALSE或NULL时,元组对当前用户不可见。 + +行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。 + +行访问控制策略可以应用到指定的操作\(SELECT、UPDATE、DELETE、ALL\),ALL表示会影响SELECT、UPDATE、DELETE三种操作;定义行访问控制策略时,若未指定受影响的相关操作,默认为ALL。 + +行访问控制策略可以应用到指定的用户\(角色\),也可应用到全部用户\(PUBLIC\);定义行访问控制策略时,若未指定受影响的用户,默认为PUBLIC。 + +## 注意事项 + +- 支持对行存表、行存分区表、列存表、列存分区表、复制表、unlogged表、hash表定义行访问控制策略。 +- 不支持外表、临时表定义行访问控制策略。 +- 不支持对视图定义行访问控制策略。 +- 同一张表上可以创建多个行访问控制策略,一张表最多创建100个行访问控制策略。 +- 系统管理员不受行访问控制影响,可以查看表的全量数据。 +- 通过SQL语句、视图、函数、存储过程查询包含行访问控制策略的表,都会受影响。 + +## 语法格式 + +``` +CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name + [ AS { PERMISSIVE | RESTRICTIVE } ] + [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] + [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ] + USING ( using_expression ) +``` + +## 参数说明 + +- **policy\_name** + + 行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。 + +- **table\_name** + + 行访问控制策略的表名。 + +- **command** + + 当前行访问控制影响的SQL操作,可指定操作包括:ALL、SELECT、UPDATE、DELETE。当未指定时,ALL为默认值,涵盖SELECT、UPDATE、DELETE操作。 + + 当command为SELECT时,SELECT类操作受行访问控制的影响,只能查看到满足条件\(using\_expression返回值为TRUE\)的元组数据,受影响的操作包括SELECT,UPDATE ... RETURNING,DELETE ... RETURNING。 + + 当command为UPDATE时,UPDATE类操作受行访问控制的影响,只能更新满足条件\(using\_expression返回值为TRUE\)的元组数据,受影响的操作包括UPDATE, UPDATE ... RETURNING, SELECT ... FOR UPDATE/SHARE。 + + 当command为DELETE时,DELETE类操作受行访问控制的影响,只能删除满足条件\(using\_expression返回值为TRUE\)的元组数据,受影响的操作包括DELETE, DELETE ... RETURNING。 + + 行访问控制策略与适配的SQL语法关系参加下表: + + **表 1** ROW LEVLEL SECURITY策略与适配SQL语法关系 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Command

+

SELECT/ALL policy

+

UPDATE/ALL policy

+

DELETE/ALL policy

+

SELECT

+

Existing row

+

No

+

No

+

SELECT FOR UPDATE/SHARE

+

Existing row

+

Existing row

+

No

+

UPDATE

+

No

+

Existing row

+

No

+

UPDATE RETURNING

+

Existing row

+

Existing row

+

No

+

DELETE

+

No

+

No

+

Existing row

+

DELETE RETURNING

+

Existing row

+

No

+

Existing row

+
+ +- **role\_name** + + 行访问控制影响的数据库用户。 + + 当未指定时,PUBLIC为默认值,PUBLIC表示影响所有数据库用户,可以指定多个受影响的数据库用户。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >系统管理员不受行访问控制特性影响。 + + +- **using\_expression** + + 行访问控制的表达式(返回boolean值)。 + + 条件表达式中不能包含AGG函数和窗口(WINDOW)函数。在查询重写阶段,如果数据表的行访问控制开关打开,满足条件的表达式会添加到计划树中。针对数据表的每条元组,会进行表达式计算,只有表达式返回值为TRUE时,行数据对用户才可见(SELECT、UPDATE、DELETE);当表达式返回FALSE时,该元组对当前用户不可见,用户无法通过SELECT语句查看此元组,无法通过UPDATE语句更新此元组,无法通过DELETE语句删除此元组。 + + +## 示例 + +``` +--创建用户alice +postgres=# CREATE ROLE alice PASSWORD 'Gauss@123'; + +--创建用户bob +postgres=# CREATE ROLE bob PASSWORD 'Gauss@123'; + +--创建数据表all_data +postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100)); + +--向数据表插入数据 +postgres=# INSERT INTO all_data VALUES(1, 'alice', 'alice data'); +postgres=# INSERT INTO all_data VALUES(2, 'bob', 'bob data'); +postgres=# INSERT INTO all_data VALUES(3, 'peter', 'peter data'); + +--将表all_data的读取权限赋予alice和bob用户 +postgres=# GRANT SELECT ON all_data TO alice, bob; + +--打开行访问控制策略开关 +postgres=# ALTER TABLE all_data ENABLE ROW LEVEL SECURITY; + +--创建行访问控制策略,当前用户只能查看用户自身的数据 +postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER); + +--查看表all_data相关信息 +postgres=# \d+ all_data + Table "public.all_data" + Column | Type | Modifiers | Storage | Stats target | Description +--------+------------------------+-----------+----------+--------------+------------- + id | integer | | plain | | + role | character varying(100) | | extended | | + data | character varying(100) | | extended | | +Row Level Security Policies: + POLICY "all_data_rls" + USING (((role)::name = "current_user"())) +Has OIDs: no +Location Nodes: ALL DATANODES +Options: orientation=row, compression=no, enable_rowsecurity=true + +--当前用户执行SELECT操作 +postgres=# SELECT * FROM all_data; + id | role | data +----+-------+------------ + 1 | alice | alice data + 2 | bob | bob data + 3 | peter | peter data +(3 rows) + +postgres=# EXPLAIN(COSTS OFF) SELECT * FROM all_data; + QUERY PLAN +---------------------------- + Streaming (type: GATHER) + Node/s: All dbnodes + -> Seq Scan on all_data +(3 rows) + +--切换至alice用户执行SELECT操作 +postgres=# SELECT * FROM all_data; + id | role | data +----+-------+------------ + 1 | alice | alice data +(1 row) + +postgres=# EXPLAIN(COSTS OFF) SELECT * FROM all_data; + QUERY PLAN +---------------------------------------------------------------- + Streaming (type: GATHER) + Node/s: All dbnodes + -> Seq Scan on all_data + Filter: ((role)::name = 'alice'::name) + Notice: This query is influenced by row level security feature +(5 rows) +``` + +## 相关链接 + +[DROP ROW LEVEL SECURITY POLICY](DROP-ROW-LEVEL-SECURITY-POLICY.md) + diff --git a/content/zh/docs/Developerguide/CREATE-SCHEMA.md b/content/zh/docs/Developerguide/CREATE-SCHEMA.md new file mode 100644 index 000000000..0256c5343 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-SCHEMA.md @@ -0,0 +1,81 @@ +# CREATE SCHEMA + +## 功能描述 + +创建模式。 + +访问命名对象时可以使用模式名作为前缀进行访问,如果无模式名前缀,则访问当前模式下的命名对象。创建命名对象时也可用模式名作为前缀修饰。 + +另外,CREATE SCHEMA可以包括在新模式中创建对象的子命令,这些子命令和那些在创建完模式后发出的命令没有任何区别。如果使用了AUTHORIZATION子句,则所有创建的对象都将被该用户所拥有。 + +## 注意事项 + +- 只要用户对当前数据库有CREATE权限,就可以创建模式。 +- 系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。 + +## 语法格式 + +- 根据指定的名称创建模式。 + + ``` + CREATE SCHEMA schema_name + [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]; + ``` + +- 根据用户名创建模式。 + + ``` + CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ]; + ``` + + +## 参数说明 + +- **schema\_name** + + 模式名称。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >模式名不能和当前数据库里其他的模式重名。 + >模式的名称不可以“pg\_”开头。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **AUTHORIZATION user\_name** + + 指定模式的所有者。当不指定schema\_name时,把user\_name当作模式名,此时user\_name只能是角色名。 + + 取值范围:已存在的用户名/角色名。 + +- **schema\_element** + + 在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE PARTITION、GRANT子句。 + + 子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH\_PATH来查看当前搜索路径上的模式。 + +## 示例 + +``` +--创建一个角色role1。 +postgres=# CREATE ROLE role1 IDENTIFIED BY 'Bigdata@123'; + +-- 为用户role1创建一个同名schema,子命令创建的表films和winners的拥有者为role1。 +postgres=# CREATE SCHEMA AUTHORIZATION role1 + CREATE TABLE films (title text, release date, awards text[]) + CREATE VIEW winners AS + SELECT title, release FROM films WHERE awards IS NOT NULL; + +--删除schema。 +postgres=# DROP SCHEMA role1 CASCADE; +--删除用户。 +postgres=# DROP USER role1 CASCADE; +``` + +## 相关链接 + +[ALTER SCHEMA](ALTER-SCHEMA.md#ZH-CN_TOPIC_0242370534),[DROP SCHEMA](DROP-SCHEMA.md#ZH-CN_TOPIC_0242370612) + diff --git a/content/zh/docs/Developerguide/CREATE-SEQUENCE.md b/content/zh/docs/Developerguide/CREATE-SEQUENCE.md new file mode 100644 index 000000000..9b23c8b73 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-SEQUENCE.md @@ -0,0 +1,140 @@ +# CREATE SEQUENCE + +## 功能描述 + +CREATE SEQUENCE用于向当前数据库里增加一个新的序列。序列的Owner为创建此序列的用户。 + +## 注意事项 + +- Sequence是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 +- 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。 +- 创建序列后,在表中使用序列的nextval\(\)函数和generate\_series\(1,N\)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate\_series\(\)函数会调用N+1次而导致报错。 + +## 语法格式 + +``` +CREATE SEQUENCE name [ INCREMENT [ BY ] increment ] + [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] + [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] + [ OWNED BY { table_name.column_name | NONE } ]; +``` + +## 参数说明 + +- **name** + + 将要创建的序列名称。 + + 取值范围: 仅可以使用小写字母(a\~z)、 大写字母(A\~Z),数字和特殊字符"\#","\_","$"的组合。 + +- **increment** + + 指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。 + + 缺省值为1。 + +- **MINVALUE minvalue | NO MINVALUE| NOMINVALUE** + + 执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE等价于NO MINVALUE + +- **MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE** + + 执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE + +- **start** + + 指定序列的起始值。缺省值:对于递增序列为minvalue,递减序列为maxvalue。 + +- **cache** + + 为了快速访问,而在内存中预先存储序列号的个数。 + + 缺省值为1,表示一次只能生成一个值,也就是没有缓存。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。 + +- **CYCLE** + + 用于使序列达到maxvalue或者minvalue后可循环并继续下去。 + + 如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。 + + NOCYCLE的作用等价于NO CYCLE。 + + 缺省值为NO CYCLE。 + + 若定义序列为CYCLE,则不能保证序列的唯一性。 + +- **OWNED BY**- + + 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅仅是建立了表的对应列和sequence之间关联关系,并不会在插入数据时在该列上产生自增序列。 + + 缺省值为OWNED BY NONE,表示不存在这样的关联。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >通过OWNED BY创建的Sequence不建议用于其他表,如果希望多个表共享Sequence,该Sequence不应该从属于特定表。 + + +## 示例 + +创建一个名为serial的递增序列,从101开始: + +``` +postgres=# CREATE SEQUENCE serial + START 101 + CACHE 20; +``` + +从序列中选出下一个数字: + +``` +postgres=# SELECT nextval('serial'); + nextval + --------- + 101 +``` + +从序列中选出下一个数字: + +``` +postgres=# SELECT nextval('serial'); + nextval + --------- + 102 +``` + +创建与表关联的序列: + +``` +postgres=# 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) +); + +postgres=# CREATE SEQUENCE serial1 + START 101 + CACHE 20 +OWNED BY customer_address.ca_address_sk; +--删除序列 +postgres=# DROP TABLE customer_address; +postgres=# DROP SEQUENCE serial cascade; +postgres=# DROP SEQUENCE serial1 cascade; +``` + +## 相关链接 + +[DROP SEQUENCE](DROP-SEQUENCE.md#ZH-CN_TOPIC_0242370613),[ALTER SEQUENCE](ALTER-SEQUENCE.md#ZH-CN_TOPIC_0242370535) + diff --git a/content/zh/docs/Developerguide/CREATE-TABLE-AS.md b/content/zh/docs/Developerguide/CREATE-TABLE-AS.md new file mode 100644 index 000000000..a3178a1bf --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TABLE-AS.md @@ -0,0 +1,134 @@ +# CREATE TABLE AS + +## 功能描述 + +根据查询结果创建表。 + +CREATE TABLE AS创建一个表并且用来自SELECT命令的结果填充该表。该表的字段和SELECT输出字段的名称及数据类型相关。不过用户可以通过明确地给出一个字段名称列表来覆盖SELECT输出字段的名称。 + +CREATE TABLE AS对源表进行一次查询,然后将数据写入新表中,而查询视图结果会根据源表的变化而有所改变。相比之下,每次做查询的时候,视图都重新计算定义它的SELECT语句。 + +## 注意事项 + +- 分区表不能采用此方式进行创建。 +- 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小非0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 + +## 语法格式 + +``` +CREATE [ UNLOGGED ] TABLE table_name + [ (column_name [, ...] ) ] + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ COMPRESS | NOCOMPRESS ] + [ TABLESPACE tablespace_name ] + [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] + AS query + [ WITH [ NO ] DATA ]; +``` + +## 参数说明 + +- **UNLOGGED** + + 指定表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是,它也是不安全的,非日志表在冲突或异常关机后会被自动删截。非日志表中的内容也不会被复制到备用服务器中。在该类表中创建的索引也不会被自动记录。 + + - 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 + - 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 + +- **table\_name** + + 要创建的表名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **column\_name** + + 新表中要创建的字段名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **WITH \( storage\_parameter \[= value\] \[, ... \] \)** + + 这个子句为表或索引指定一个可选的存储参数。参数的详细说明如下所示。 + + - FILLFACTOR + + 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数只对行存表有效。 + + 取值范围:10\~100 + + - ORIENTATION + + 取值范围: + + COLUMN:表的数据将以列式存储。 + + ROW(缺省值):表的数据将以行式存储。 + + - COMPRESSION + + 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 + + 取值范围: + + 列存表的有效值为YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。 + + 行存表的有效值为YES/NO,默认值为NO。 + + - MAX\_BATCHROW + + 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 + + 取值范围:10000\~60000 + + +- **COMPRESS / NOCOMPRESS** + + 创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 + + 缺省值:NOCOMPRESS,即不对元组数据进行压缩。 + +- **TABLESPACE tablespace\_name** + + 指定新表将要在tablespace\_name表空间内创建。如果没有声明,将使用默认表空间。 + +- **TO \{ GROUP groupname | NODE \( nodename \[, ... \] \) \}** + + TO GROUP指定创建表所在的Node Group。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 + +- **AS query** + + 一个SELECT VALUES命令或者一个运行预备好的SELECT或VALUES查询的EXECUTE命令。 + +- **\[ WITH \[ NO \] DATA \]** + + 创建表时,是否也插入查询到的数据。默认是要数据,选择“NO”参数时,则不要数据。 + + +## 示例 + +``` +--创建一个表tpcds.store_returns表。 +postgres=# CREATE TABLE tpcds.store_returns +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + sr_item_sk VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER +); +--创建一个表tpcds.store_returns_t1并插入tpcds.store_returns表中sr_item_sk字段中大于16的数值。 +postgres=# CREATE TABLE tpcds.store_returns_t1 AS SELECT * FROM tpcds.store_returns WHERE sr_item_sk > '4795'; + +--使用tpcds.store_returns拷贝一个新表tpcds.store_returns_t2。 +postgres=# CREATE TABLE tpcds.store_returns_t2 AS table tpcds.store_returns; + +--删除表。 +postgres=# DROP TABLE tpcds.store_returns_t1 ; +postgres=# DROP TABLE tpcds.store_returns_t2 ; +postgres=# DROP TABLE tpcds.store_returns; +``` + +## 相关链接 + +[CREATE TABLE](CREATE-TABLE.md),[SELECT](SELECT.md) + diff --git a/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md b/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md new file mode 100644 index 000000000..1a3f1bea7 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TABLE-PARTITION.md @@ -0,0 +1,643 @@ +# CREATE TABLE PARTITION + +## 功能描述 + +创建分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。 + +常见的分区方案有范围分区(Range Partitioning)、哈希分区(Hash Partitioning)、列表分区(List Partitioning)、数值分区(Value Partition)等。目前行存表、列存表仅支持范围分区。 + +范围分区是根据表的一列或者多列,将要插入表的记录分为若干个范围,这些范围在不同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。 + +范围分区的分区策略是指记录插入分区的方式。目前范围分区仅支持范围分区策略。 + +范围分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。这是最常用的分区策略。 + +分区可以提供若干好处: + +- 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下。分区可以减少数据的搜索空间,提高数据访问效率。 +- 当查询或更新一个分区的大部分记录时,连续扫描那个分区而不是访问整个表可以获得巨大的性能提升。 +- 如果需要大量加载或者删除的记录位于单独的分区上,则可以通过直接读取或删除那个分区以获得巨大的性能提升,同时还可以避免由于大量DELETE导致的VACUUM超载(仅范围分区)。 + +## 注意事项 + +有限地支持唯一约束和主键约束,即唯一约束和主键约束的约束键必须包含所有分区键。 + +## 语法格式 + +``` +CREATE TABLE [ IF NOT EXISTS ] partition_table_name +( [ + { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] + | table_constraint + | LIKE source_table [ like_option [...] ] }[, ... ] +] ) + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ COMPRESS | NOCOMPRESS ] + [ TABLESPACE tablespace_name ] + + [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] + PARTITION BY { + {VALUES (partition_key)} | + {RANGE (partition_key) ( partition_less_than_item [, ... ] )} | + {RANGE (partition_key) ( partition_start_end_item [, ... ] )} + } [ { ENABLE | DISABLE } ROW MOVEMENT ]; + + +``` + +- 列约束column\_constraint: + + ``` + [ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + +- 表约束table\_constraint: + + ``` + [ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters} + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + +- like选项like\_option: + + ``` + { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | ALL } + ``` + + +- 索引存储参数index\_parameters: + + ``` + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ USING INDEX TABLESPACE tablespace_name ] + ``` + + +- partition\_less\_than\_item: + + ``` + PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) [TABLESPACE tablespace_name] + ``` + +- partition\_start\_end\_item: + + ``` + PARTITION partition_name { + {START(partition_value) END (partition_value) EVERY (interval_value)} | + {START(partition_value) END ({partition_value | MAXVALUE})} | + {START(partition_value)} | + {END({partition_value | MAXVALUE})} + } [TABLESPACE tablespace_name] + ``` + + +## 参数说明 + +- **IF NOT EXISTS** + + 如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。 + +- **partition\_table\_name** + + 分区表的名称。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **column\_name** + + 新表中要创建的字段名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **data\_type** + + 字段的数据类型。 + +- **COLLATE collation** + + COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。 + +- **CONSTRAINT constraint\_name** + + 列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 + + 定义约束有两种方法: + + - 列约束:作为一个列定义的一部分,仅影响该列。 + - 表约束:不和某个列绑在一起,可以作用于多个列。 + +- **LIKE source\_table \[ like\_option ... \]** + + LIKE子句声明一个表,新表自动从这个表里面继承所有字段名及其数据类型和非空约束。 + + 和INHERITS不同,新表与原来的表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。 + + 字段缺省表达式只有在声明了INCLUDING DEFAULTS之后才会包含进来。缺省是不包含缺省表达式的,即新表中所有字段的缺省值都是NULL。 + + 非空约束将总是复制到新表中,CHECK约束则仅在指定了INCLUDING CONSTRAINTS的时候才复制,而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。 + + 和INHERITS不同,被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。 + + - 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 + - 如果指定了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的简写形式。 + +- **WITH \( storage\_parameter \[= value\] \[, ... \] \)** + + 这个子句为表或索引指定一个可选的存储参数。参数的详细描述如下所示: + + - FILLFACTOR + + 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。 + + 取值范围:10\~100 + + - ORIENTATION + + 决定了表的数据的存储方式。 + + 取值范围: + + - COLUMN:表的数据将以列式存储。 + - ROW(缺省值):表的数据将以行式存储。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >orientation不支持修改。 + + + - COMPRESSION + - 列存表的有效值为LOW/MIDDLE/HIGH/YES/NO,压缩级别依次升高,默认值为LOW。 + - 行存表的有效值为YES/NO,默认值为NO。 + + - MAX\_BATCHROW + + 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 + + 取值范围:10000\~60000 + + - PARTIAL\_CLUSTER\_ROWS + + 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。 + + 取值范围:其有效值为大于等于10万。此值是MAX\_BATCHROW的倍数。 + + - DELTAROW\_THRESHOLD + + 预留参数。该参数只对列存表有效。 + + 取值范围:0~9999 + + +- **COMPRESS / NOCOMPRESS** + + 创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 + + 缺省值为NOCOMPRESS,即不对元组数据进行压缩。 + +- **TABLESPACE tablespace\_name** + + 指定新表将要在tablespace\_name表空间内创建。如果没有声明,将使用默认表空间。 + +- **PARTITION BY RANGE\(partition\_key\)** + + 创建范围分区。partition\_key为分区键的名称。 + + (1)对于从句是VALUES LESS THAN的语法格式: + + >![](public_sys-resources/icon-notice.gif) **须知:** + >对于从句是VALUE LESS THAN的语法格式,范围分区策略的分区键最多支持4列。 + + 该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、CHARACTER VARYING\(n\)、VARCHAR\(n\)、CHARACTER\(n\)、CHAR\(n\)、CHARACTER、CHAR、TEXT、NVARCHAR2、NAME、TIMESTAMP\[\(p\)\] \[WITHOUT TIME ZONE\]、TIMESTAMP\[\(p\)\] \[WITH TIME ZONE\]、DATE。 + + (2)对于从句是START END的语法格式: + + >![](public_sys-resources/icon-notice.gif) **须知:** + >对于从句是START END的语法格式,范围分区策略的分区键仅支持1列。 + + 该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、TIMESTAMP\[\(p\)\] \[WITHOUT TIME ZONE\]、TIMESTAMP\[\(p\)\] \[WITH TIME ZONE\]、DATE。 + +- **PARTITION partition\_name VALUES LESS THAN \( \{ partition\_value | MAXVALUE \} \)** + + 指定各分区的信息。partition\_name为范围分区的名称。partition\_value为范围分区的上边界,取值依赖于partition\_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 每个分区都需要指定一个上边界。 + >- 分区上边界的类型应当和分区键的类型一致。 + >- 分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。 + +- **PARTITION partition\_name \{START \(partition\_value\) END \(partition\_value\) EVERY \(interval\_value\)\} | **\{START \(partition\_value\) END \(partition\_value|MAXVALUE\)\} | \{START\(partition\_value\)\} | **\{END \(partition\_value | MAXVALUE\)**\} + + 指定各分区的信息,各参数意义如下: + + - partition\_name:范围分区的名称或名称前缀,除以下情形外(假定其中的partition\_name是p1),均为分区的名称。 + - 若该定义是START+END+EVERY从句,则语义上定义的分区的名称依次为p1\_1, p1\_2, ...。例如对于定义“PARTITION p1 START\(1\) END\(4\) EVERY\(1\)”,则生成的分区是:\[1, 2\), \[2, 3\) 和 \[3, 4\),名称依次为p1\_1, p1\_2和p1\_3,即此处的p1是名称前缀。 + - 若该定义是第一个分区定义,且该定义有START值,则范围(MINVALUE, START)将自动作为第一个实际分区,其名称为p1\_0,然后该定义语义描述的分区名称依次为p1\_1, p1\_2, ...。例如对于完整定义“PARTITION p1 START\(1\), PARTITION p2 START\(2\)”,则生成的分区是:\(MINVALUE, 1\), \[1, 2\) 和 \[2, MAXVALUE\),其名称依次为p1\_0, p1\_1和p2,即此处p1是名称前缀,p2是分区名称。这里MINVALUE表示最小值。 + + - partition\_value:范围分区的端点值(起始或终点),取值依赖于partition\_key的类型,不可是MAXVALUE。 + - interval\_value:对\[START,END\) 表示的范围进行切分,interval\_value是指定切分后每个分区的宽度,不可是MAXVALUE;如果(END-START)值不能整除以EVERY值,则仅最后一个分区的宽度小于EVERY值。 + - MAXVALUE:表示最大值,它通常用于设置最后一个范围分区的上边界。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >1. 在创建分区表若第一个分区定义含START值,则范围(MINVALUE,START)将自动作为实际的第一个分区。 + >2. START END语法需要遵循以下限制: + > - 每个partition\_start\_end\_item中的START值(如果有的话,下同)必须小于其END值; + > - 相邻的两个partition\_start\_end\_item,第一个的END值必须等于第二个的START值; + > - 每个partition\_start\_end\_item中的EVERY值必须是正向递增的,且必须小于(END-START)值; + > - 每个分区包含起始值,不包含终点值,即形如:\[起始值,终点值\),起始值是MINVALUE时则不包含; + > - 一个partition\_start\_end\_item创建的每个分区所属的TABLESPACE一样; + > - partition\_name作为分区名称前缀时,其长度不要超过57字节,超过时自动截断; + > - 在创建、修改分区表时请注意分区表的分区总数不可超过最大限制(32767); + >3. 在创建分区表时START END与LESS THAN语法不可混合使用。 + >4. 即使创建分区表时使用START END语法,备份(gs\_dump)出的SQL语句也是VALUES LESS THAN语法格式。 + +- **\{ ENABLE | DISABLE \} ROW MOVEMENT** + + 行迁移开关。 + + 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 + + 取值范围: + + - ENABLE:行迁移开关打开。 + - DISABLE(缺省值):行迁移开关关闭。 + + +- **NOT NULL** + + 字段值不允许为NULL。ENABLE用于语法兼容,可省略。 + +- **NULL** + + 字段值允许NULL ,这是缺省。 + + 这个子句只是为和非标准SQL数据库兼容。不建议使用。 + +- **CHECK \(condition\) \[ NO INHERIT \]** + + CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。 + + 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 + + 用NO INHERIT标记的约束将不会传递到子表中去。 + + ENABLE用于语法兼容,可省略。 + +- **DEFAULT default\_expr** + + DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式\(不允许使用子查询和对本表中的其他字段的交叉引用\)。缺省表达式的数据类型必须和字段类型匹配。 + + 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 + +- **UNIQUE index\_parameters** + + **UNIQUE \( column\_name \[, ... \] \) index\_parameters** + + UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。 + + 对于唯一约束,NULL被认为是互不相等的。 + +- **PRIMARY KEY index\_parameters** + + **PRIMARY KEY \( column\_name \[, ... \] \) index\_parameters** + + 主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。 + + 一个表只能声明一个主键。 + +- **DEFERRABLE | NOT DEFERRABLE** + + 这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束和主键约束可以接受这个子句。所有其他约束类型都是不可推迟的。 + +- **INITIALLY IMMEDIATE | INITIALLY DEFERRED** + + 如果约束是可推迟的,则这个子句声明检查约束的缺省时间。 + + - 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它; + - 如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。 + + 约束检查的时间可以用SET CONSTRAINTS命令修改。 + +- **USING INDEX TABLESPACE tablespace\_name** + + 为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default\_tablespace中创建,如果default\_tablespace为空,将使用数据库的缺省表空间。 + + +## 示例 + +- 示例1:创建范围分区表tpcds.web\_returns\_p1,含有8个分区,分区键为integer类型。 分区的范围分别为:wr\_returned\_date\_sk< 2450815,2450815<= wr\_returned\_date\_sk< 2451179,2451179<=wr\_returned\_date\_sk< 2451544,2451544 <= wr\_returned\_date\_sk< 2451910,2451910 <= wr\_returned\_date\_sk< 2452275,2452275 <= wr\_returned\_date\_sk< 2452640,2452640 <= wr\_returned\_date\_sk< 2453005,wr\_returned\_date\_sk\>=2453005。 + + ``` + --创建表tpcds.web_returns。 + postgres=# CREATE TABLE tpcds.web_returns + ( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) + ); + --创建分区表tpcds.web_returns_p1。 + postgres=# CREATE TABLE tpcds.web_returns_p1 + ( + WR_RETURNED_DATE_SK INTEGER , + WR_RETURNED_TIME_SK INTEGER , + WR_ITEM_SK INTEGER NOT NULL, + WR_REFUNDED_CUSTOMER_SK INTEGER , + WR_REFUNDED_CDEMO_SK INTEGER , + WR_REFUNDED_HDEMO_SK INTEGER , + WR_REFUNDED_ADDR_SK INTEGER , + WR_RETURNING_CUSTOMER_SK INTEGER , + WR_RETURNING_CDEMO_SK INTEGER , + WR_RETURNING_HDEMO_SK INTEGER , + WR_RETURNING_ADDR_SK INTEGER , + WR_WEB_PAGE_SK INTEGER , + WR_REASON_SK INTEGER , + WR_ORDER_NUMBER BIGINT NOT NULL, + WR_RETURN_QUANTITY INTEGER , + WR_RETURN_AMT DECIMAL(7,2) , + WR_RETURN_TAX DECIMAL(7,2) , + WR_RETURN_AMT_INC_TAX DECIMAL(7,2) , + WR_FEE DECIMAL(7,2) , + WR_RETURN_SHIP_COST DECIMAL(7,2) , + WR_REFUNDED_CASH DECIMAL(7,2) , + WR_REVERSED_CHARGE DECIMAL(7,2) , + WR_ACCOUNT_CREDIT DECIMAL(7,2) , + WR_NET_LOSS DECIMAL(7,2) + ) + WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE) + PARTITION BY RANGE(WR_RETURNED_DATE_SK) + ( + PARTITION P1 VALUES LESS THAN(2450815), + PARTITION P2 VALUES LESS THAN(2451179), + PARTITION P3 VALUES LESS THAN(2451544), + PARTITION P4 VALUES LESS THAN(2451910), + PARTITION P5 VALUES LESS THAN(2452275), + PARTITION P6 VALUES LESS THAN(2452640), + PARTITION P7 VALUES LESS THAN(2453005), + PARTITION P8 VALUES LESS THAN(MAXVALUE) + ); + + --从示例数据表导入数据。 + postgres=# INSERT INTO tpcds.web_returns_p1 SELECT * FROM tpcds.web_returns; + + --删除分区P8。 + postgres=# ALTER TABLE tpcds.web_returns_p1 DROP PARTITION P8; + + --增加分区WR_RETURNED_DATE_SK介于2453005和2453105之间。 + postgres=# ALTER TABLE tpcds.web_returns_p1 ADD PARTITION P8 VALUES LESS THAN (2453105); + + --增加分区WR_RETURNED_DATE_SK介于2453105和MAXVALUE之间。 + postgres=# ALTER TABLE tpcds.web_returns_p1 ADD PARTITION P9 VALUES LESS THAN (MAXVALUE); + + --删除分区P8。 + postgres=# ALTER TABLE tpcds.web_returns_p1 DROP PARTITION FOR (2453005); + + --分区P7重命名为P10。 + postgres=# ALTER TABLE tpcds.web_returns_p1 RENAME PARTITION P7 TO P10; + + --分区P6重命名为P11。 + postgres=# ALTER TABLE tpcds.web_returns_p1 RENAME PARTITION FOR (2452639) TO P11; + + --查询分区P10的行数。 + postgres=# SELECT count(*) FROM tpcds.web_returns_p1 PARTITION (P10); + count + -------- + 0 + (1 row) + + --查询分区P1的行数。 + postgres=# SELECT COUNT(*) FROM tpcds.web_returns_p1 PARTITION FOR (2450815); + count + -------- + 0 + (1 row) + ``` + +- 示例2:创建范围分区表tpcds.web\_returns\_p2,含有8个分区,分区键类型为integer类型,其中第8个分区上边界为MAXVALUE。 + + 八个分区的范围分别为: wr\_returned\_date\_sk< 2450815,2450815<= wr\_returned\_date\_sk< 2451179,2451179<=wr\_returned\_date\_sk< 2451544,2451544 <= wr\_returned\_date\_sk< 2451910,2451910 <= wr\_returned\_date\_sk< 2452275,2452275 <= wr\_returned\_date\_sk< 2452640,2452640 <= wr\_returned\_date\_sk< 2453005,wr\_returned\_date\_sk\>=2453005。 + + 分区表tpcds.web\_returns\_p2的表空间为example1;分区P1到P7没有声明表空间,使用采用分区表tpcds.web\_returns\_p2的表空间example1;指定分区P8的表空间为example2。 + + 假定数据库节点的数据目录/pg\_location/mount1/path1,数据库节点的数据目录/pg\_location/mount2/path2,数据库节点的数据目录/pg\_location/mount3/path3,数据库节点的数据目录/pg\_location/mount4/path4是dwsadmin用户拥有读写权限的空目录。 + + ``` + postgres=# CREATE TABLESPACE example1 RELATIVE LOCATION 'tablespace1/tablespace_1'; + postgres=# CREATE TABLESPACE example2 RELATIVE LOCATION 'tablespace2/tablespace_2'; + postgres=# CREATE TABLESPACE example3 RELATIVE LOCATION 'tablespace3/tablespace_3'; + postgres=# CREATE TABLESPACE example4 RELATIVE LOCATION 'tablespace4/tablespace_4'; + + postgres=# CREATE TABLE tpcds.web_returns_p2 + ( + WR_RETURNED_DATE_SK INTEGER , + WR_RETURNED_TIME_SK INTEGER , + WR_ITEM_SK INTEGER NOT NULL, + WR_REFUNDED_CUSTOMER_SK INTEGER , + WR_REFUNDED_CDEMO_SK INTEGER , + WR_REFUNDED_HDEMO_SK INTEGER , + WR_REFUNDED_ADDR_SK INTEGER , + WR_RETURNING_CUSTOMER_SK INTEGER , + WR_RETURNING_CDEMO_SK INTEGER , + WR_RETURNING_HDEMO_SK INTEGER , + WR_RETURNING_ADDR_SK INTEGER , + WR_WEB_PAGE_SK INTEGER , + WR_REASON_SK INTEGER , + WR_ORDER_NUMBER BIGINT NOT NULL, + WR_RETURN_QUANTITY INTEGER , + WR_RETURN_AMT DECIMAL(7,2) , + WR_RETURN_TAX DECIMAL(7,2) , + WR_RETURN_AMT_INC_TAX DECIMAL(7,2) , + WR_FEE DECIMAL(7,2) , + WR_RETURN_SHIP_COST DECIMAL(7,2) , + WR_REFUNDED_CASH DECIMAL(7,2) , + WR_REVERSED_CHARGE DECIMAL(7,2) , + WR_ACCOUNT_CREDIT DECIMAL(7,2) , + WR_NET_LOSS DECIMAL(7,2) + ) + TABLESPACE example1 + PARTITION BY RANGE(WR_RETURNED_DATE_SK) + ( + PARTITION P1 VALUES LESS THAN(2450815), + PARTITION P2 VALUES LESS THAN(2451179), + PARTITION P3 VALUES LESS THAN(2451544), + PARTITION P4 VALUES LESS THAN(2451910), + PARTITION P5 VALUES LESS THAN(2452275), + PARTITION P6 VALUES LESS THAN(2452640), + PARTITION P7 VALUES LESS THAN(2453005), + PARTITION P8 VALUES LESS THAN(MAXVALUE) TABLESPACE example2 + ) + ENABLE ROW MOVEMENT; + + --以like方式创建一个分区表。 + postgres=# CREATE TABLE tpcds.web_returns_p3 (LIKE tpcds.web_returns_p2 INCLUDING PARTITION); + + --修改分区P1的表空间为example2。 + postgres=# ALTER TABLE tpcds.web_returns_p2 MOVE PARTITION P1 TABLESPACE example2; + + --修改分区P2的表空间为example3。 + postgres=# ALTER TABLE tpcds.web_returns_p2 MOVE PARTITION P2 TABLESPACE example3; + + --以2453010为分割点切分P8。 + postgres=# ALTER TABLE tpcds.web_returns_p2 SPLIT PARTITION P8 AT (2453010) INTO + ( + PARTITION P9, + PARTITION P10 + ); + + --将P6,P7合并为一个分区。 + postgres=# ALTER TABLE tpcds.web_returns_p2 MERGE PARTITIONS P6, P7 INTO PARTITION P8; + + --修改分区表迁移属性。 + postgres=# ALTER TABLE tpcds.web_returns_p2 DISABLE ROW MOVEMENT; + --删除表和表空间。 + postgres=# DROP TABLE tpcds.web_returns_p1; + postgres=# DROP TABLE tpcds.web_returns_p2; + postgres=# DROP TABLE tpcds.web_returns_p3; + postgres=# DROP TABLESPACE example1; + postgres=# DROP TABLESPACE example2; + postgres=# DROP TABLESPACE example3; + postgres=# DROP TABLESPACE example4; + ``` + + +- 示例3:START END语法创建、修改Range分区表。 + + 假定/home/omm/startend\_tbs1,/home/omm/startend\_tbs2,/home/omm/startend\_tbs3,/home/omm/startend\_tbs4是omm用户拥有读写权限的空目录。 + + ``` + -- 创建表空间 + postgres=# CREATE TABLESPACE startend_tbs1 LOCATION '/home/omm/startend_tbs1'; + postgres=# CREATE TABLESPACE startend_tbs2 LOCATION '/home/omm/startend_tbs2'; + postgres=# CREATE TABLESPACE startend_tbs3 LOCATION '/home/omm/startend_tbs3'; + postgres=# CREATE TABLESPACE startend_tbs4 LOCATION '/home/omm/startend_tbs4'; + + -- 创建临时schema + postgres=# CREATE SCHEMA tpcds; + postgres=# SET CURRENT_SCHEMA TO tpcds; + + -- 创建分区表,分区键是integer类型 + postgres=# CREATE TABLE tpcds.startend_pt (c1 INT, c2 INT) + TABLESPACE startend_tbs1 + PARTITION BY RANGE (c2) ( + PARTITION p1 START(1) END(1000) EVERY(200) TABLESPACE startend_tbs2, + PARTITION p2 END(2000), + PARTITION p3 START(2000) END(2500) TABLESPACE startend_tbs3, + PARTITION p4 START(2500), + PARTITION p5 START(3000) END(5000) EVERY(1000) TABLESPACE startend_tbs4 + ) + ENABLE ROW MOVEMENT; + + -- 查看分区表信息 + postgres=# SELECT relname, boundaries, spcname FROM pg_partition p JOIN pg_tablespace t ON p.reltablespace=t.oid and p.parentid='tpcds.startend_pt'::regclass ORDER BY 1; + relname | boundaries | spcname + -------------+------------+--------------- + p1_0 | {1} | startend_tbs2 + p1_1 | {201} | startend_tbs2 + p1_2 | {401} | startend_tbs2 + p1_3 | {601} | startend_tbs2 + p1_4 | {801} | startend_tbs2 + p1_5 | {1000} | startend_tbs2 + p2 | {2000} | startend_tbs1 + p3 | {2500} | startend_tbs3 + p4 | {3000} | startend_tbs1 + p5_1 | {4000} | startend_tbs4 + p5_2 | {5000} | startend_tbs4 + startend_pt | | startend_tbs1 + (12 rows) + + -- 导入数据,查看分区数据量 + postgres=# INSERT INTO tpcds.startend_pt VALUES (GENERATE_SERIES(0, 4999), GENERATE_SERIES(0, 4999)); + postgres=# SELECT COUNT(*) FROM tpcds.startend_pt PARTITION FOR (0); + count + ------- + 1 + (1 row) + + postgres=# SELECT COUNT(*) FROM tpcds.startend_pt PARTITION (p3); + count + ------- + 500 + (1 row) + + -- 增加分区: [5000, 5300), [5300, 5600), [5600, 5900), [5900, 6000) + postgres=# ALTER TABLE tpcds.startend_pt ADD PARTITION p6 START(5000) END(6000) EVERY(300) TABLESPACE startend_tbs4; + + -- 增加MAXVALUE分区: p7 + postgres=# ALTER TABLE tpcds.startend_pt ADD PARTITION p7 END(MAXVALUE); + + -- 重命名分区p7为p8 + postgres=# ALTER TABLE tpcds.startend_pt RENAME PARTITION p7 TO p8; + + -- 删除分区p8 + postgres=# ALTER TABLE tpcds.startend_pt DROP PARTITION p8; + + -- 重命名5950所在的分区为:p71 + postgres=# ALTER TABLE tpcds.startend_pt RENAME PARTITION FOR(5950) TO p71; + + -- 分裂4500所在的分区[4000, 5000) + postgres=# ALTER TABLE tpcds.startend_pt SPLIT PARTITION FOR(4500) INTO(PARTITION q1 START(4000) END(5000) EVERY(250) TABLESPACE startend_tbs3); + + -- 修改分区p2的表空间为startend_tbs4 + postgres=# ALTER TABLE tpcds.startend_pt MOVE PARTITION p2 TABLESPACE startend_tbs4; + + -- 查看分区情形 + postgres=# SELECT relname, boundaries, spcname FROM pg_partition p JOIN pg_tablespace t ON p.reltablespace=t.oid and p.parentid='tpcds.startend_pt'::regclass ORDER BY 1; + relname | boundaries | spcname + -------------+------------+--------------- + p1_0 | {1} | startend_tbs2 + p1_1 | {201} | startend_tbs2 + p1_2 | {401} | startend_tbs2 + p1_3 | {601} | startend_tbs2 + p1_4 | {801} | startend_tbs2 + p1_5 | {1000} | startend_tbs2 + p2 | {2000} | startend_tbs4 + p3 | {2500} | startend_tbs3 + p4 | {3000} | startend_tbs1 + p5_1 | {4000} | startend_tbs4 + p6_1 | {5300} | startend_tbs4 + p6_2 | {5600} | startend_tbs4 + p6_3 | {5900} | startend_tbs4 + p71 | {6000} | startend_tbs4 + q1_1 | {4250} | startend_tbs3 + q1_2 | {4500} | startend_tbs3 + q1_3 | {4750} | startend_tbs3 + q1_4 | {5000} | startend_tbs3 + startend_pt | | startend_tbs1 + (19 rows) + + -- 删除表和表空间 + postgres=# DROP SCHEMA tpcds CASCADE; + postgres=# DROP TABLESPACE startend_tbs1; + postgres=# DROP TABLESPACE startend_tbs2; + postgres=# DROP TABLESPACE startend_tbs3; + postgres=# DROP TABLESPACE startend_tbs4; + ``` + + +## 相关链接 + +[ALTER TABLE PARTITION](ALTER-TABLE-PARTITION.md),[DROP TABLE](DROP-TABLE.md) + diff --git a/content/zh/docs/Developerguide/CREATE-TABLE.md b/content/zh/docs/Developerguide/CREATE-TABLE.md new file mode 100644 index 000000000..9d992b160 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TABLE.md @@ -0,0 +1,931 @@ +# CREATE TABLE + +## 功能描述 + +在当前数据库中创建一个新的空白表,该表由命令执行者所有。 + +## 注意事项 + +- 列存表支持的数据类型请参考[列存表支持的数据类型](列存表支持的数据类型.md)。 +- 创建列存的数量建议不超过1000个。 +- 表中的主键约束和唯一约束必须包含分布列。 +- 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 +- 列存表的表级约束只支持PARTIAL CLUSTER KEY,不支持主外键等表级约束。 +- 列存表的字段约束只支持NULL、NOT NULL和DEFAULT常量值。 +- 列存表支持delta表,受参数[enable\_delta\_store](并行导入.md#zh-cn_topic_0237124705_section1035224982816) 控制是否开启,受参数deltarow\_threshold控制进入delta表的阀值。 +- 使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置。 + +## 语法格式 + +- 创建表。 + + ``` + CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name + ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | table_constraint + | LIKE source_table [ like_option [...] ] } + [, ... ]) + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] + [ COMPRESS | NOCOMPRESS ] + [ TABLESPACE tablespace_name ] + [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]; + ``` + + - 其中列约束column\_constraint为: + + ``` + [ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中列的压缩可选项compress\_mode为: + + ``` + { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } + ``` + + - 其中表约束table\_constraint为: + + ``` + [ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + PARTIAL CLUSTER KEY ( column_name [, ... ] ) } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中like选项like\_option为: + + ``` + { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL } + + ``` + + + +其中索引参数index\_parameters为: + +``` +[ WITH ( {storage_parameter = value} [, ... ] ) ] +[ USING INDEX TABLESPACE tablespace_name ] +``` + +## 参数说明 + +- **UNLOGGED** + + 如果指定此关键字,则创建的表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是非日志表在冲突、执行操作系统重启、强制重启、切断电源操作或异常关机后会被自动截断,会造成数据丢失的风险。非日志表中的内容也不会被复制到备服务器中。在非日志表中创建的索引也不会被自动记录。 + + 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 + + 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 + +- **GLOBAL | LOCAL** + + 创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。目前这两个关键字的设立,仅是为了兼容SQL标准,实际上无论指定GLOBAL还是LOCAL,openGauss都会创建本地临时表。 + +- **TEMPORARY | TEMP** + + 如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 临时表通过每个会话独立的以pg\_temp开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg\_temp,pg\_toast\_temp开头的schema。 + >- 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg\_temp\_开头的schema,则此表会被创建为临时表。 + +- **IF NOT EXISTS** + + 如果已经存在相同名称的表,不会报出错误,而会发出通知,告知通知此表已存在。 + +- **table\_name** + + 要创建的表名。 + +- **column\_name** + + 新表中要创建的字段名。 + +- **data\_type** + + 字段的数据类型。 + +- **compress\_mode** + + 表字段的压缩选项,当前仅对行存表有效。该选项指定表字段优先使用的压缩算法。 + + 取值范围:DELTA、PREFIX、DICTIONARY、NUMSTR、NOCOMPRESS + +- **COLLATE collation** + + COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。 + +- **LIKE source\_table \[ like\_option ... \]** + + LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型和非空约束。 + + 新表与源表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。 + + 被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。 + + - 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 + - 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 + - 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 + - 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 + - 如果指定了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的内容。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >- 如果源表包含serial、bigserial、smallseriral类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE ... OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。 + >- 不建议将其他表私有的Sequence配置为源表字段的默认值,尤其是其他表只分布在特定的NodeGroup上,这可能导致CREATE TABLE ... LIKE执行失败。另外,如果源表配置其他表私有的Sequence,当该表删除时Sequence也会连带删除,这样源表的Sequence将不可用。如果用户希望多个表共享Sequence,建议创建共享的Sequence。 + +- **WITH \( \{ storage\_parameter = value \} \[, ... \] \)** + + 这个子句为表或索引指定一个可选的存储参数。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >使用任意精度类型Numeric定义列时,建议指定精度p以及刻度s。在不指定精度和刻度时,会按输入的显示出来。 + + 参数的详细描述如下所示。 + + - FILLFACTOR + + 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。 + + 取值范围:10\~100 + + - ORIENTATION + + 指定表数据的存储方式,即行存方式、列存方式、ORC格式的方式,该参数设置成功后就不再支持修改。 + + 取值范围: + + - ROW,表示表的数据将以行式存储。 + + 行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 + + - COLUMN,表示表的数据将以列式存储。 + + 列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 + + 默认值: + + 若指定表空间为普通表空间,默认值为ROW。 + + - COMPRESSION + + 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 + + 取值范围: + + 列存表的有效值为YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。 + + - COMPRESSLEVEL + + 指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。 + + 取值范围:0\~3,默认值为0。 + + - MAX\_BATCHROW + + 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 + + 取值范围:10000\~60000 + + - PARTIAL\_CLUSTER\_ROWS + + 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。 + + 取值范围:600000\~2147483647 + + - DELTAROW\_THRESHOLD + + 指定列存表导入时小于多少行的数据进入delta表,只在GUC参数[enable\_delta\_store](并行导入.md#zh-cn_topic_0237124705_section1035224982816)开启时生效。该参数只对列存表有效。 + + 取值范围:0~9999,默认值为100 + + - VERSION + + 指定ORC存储格式的版本。 + + 取值范围:0.12,目前支持ORC 0.12格式,后续会随着ORC格式的发展,支持更多格式。 + + 默认值:0.12 + + +- **ON COMMIT \{ PRESERVE ROWS | DELETE ROWS | DROP \}** + + ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。有以下三个选项,当前支持PRESERVE ROWS和DELETE ROWS选项。 + + - PRESERVE ROWS(缺省值):提交时不对临时表做任何操作,临时表及其表数据保持不变。 + - DELETE ROWS:提交时删除临时表中数据。 + - DROP:提交时删除此临时表。 + +- **COMPRESS | NOCOMPRESS** + + 创建新表时,需要在CREATE TABLE语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 + + 缺省值:NOCOMPRESS,即不对元组数据进行压缩。 + +- **TABLESPACE tablespace\_name** + + 创建新表时指定此关键字,表示新表将要在指定表空间内创建。如果没有声明,将使用默认表空间。 + +- **CONSTRAINT constraint\_name** + + 列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 + + 定义约束有两种方法: + + - 列约束:作为一个列定义的一部分,仅影响该列。 + - 表约束:不和某个列绑在一起,可以作用于多个列。 + +- **NOT NULL** + + 字段值不允许为NULL。 + +- **NULL** + + 字段值允许为NULL ,这是缺省值。 + + 这个子句只是为和非标准SQL数据库兼容。不建议使用。 + +- **CHECK \( expression \)** + + CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。 + + 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >expression表达式中,如果存在“<\>NULL”或“!=NULL”,这种写法是无效的,需要写成“is NOT NULL”。 + +- **DEFAULT default\_expr** + + DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式\(不允许使用子查询和对本表中的其他字段的交叉引用\)。缺省表达式的数据类型必须和字段类型匹配。 + + 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 + +- **UNIQUE index\_parameters** + + **UNIQUE \( column\_name \[, ... \] \) index\_parameters** + + UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。 + + 对于唯一约束,NULL被认为是互不相等的。 + +- **PRIMARY KEY index\_parameters** + + **PRIMARY KEY \( column\_name \[, ... \] \) index\_parameters** + + 主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。 + + 一个表只能声明一个主键。 + +- **DEFERRABLE | NOT DEFERRABLE** + + 这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束和主键约束可以接受这个子句。所有其他约束类型都是不可推迟的。 + +- **PARTIAL CLUSTER KEY** + + 局部聚簇存储,列存表导入数据时按照指定的列\(单列或多列\),进行局部排序。 + +- **INITIALLY IMMEDIATE | INITIALLY DEFERRED** + + 如果约束是可推迟的,则这个子句声明检查约束的缺省时间。 + + - 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它; + - 如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。 + + 约束检查的时间可以用SET CONSTRAINTS命令修改。 + +- **USING INDEX TABLESPACE tablespace\_name** + + 为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default\_tablespace中创建,如果default\_tablespace为空,将使用数据库的缺省表空间。 + + +## 示例 + +``` +--创建简单的表。 +postgres=# CREATE TABLE tpcds.warehouse_t1 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +postgres=# CREATE TABLE tpcds.warehouse_t2 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) DICTIONARY, + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +``` + +``` +--创建表,并指定W_STATE字段的缺省值为GA。 +postgres=# CREATE TABLE tpcds.warehouse_t3 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) DEFAULT 'GA', + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建表,并在事务结束时检查W_WAREHOUSE_NAME字段是否有重复。 +postgres=# CREATE TABLE tpcds.warehouse_t4 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +``` + +``` +--创建一个带有70%填充因子的表。 +postgres=# CREATE TABLE tpcds.warehouse_t5 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + UNIQUE(W_WAREHOUSE_NAME) WITH(fillfactor=70) +); + +--或者用下面的语法。 +postgres=# CREATE TABLE tpcds.warehouse_t6 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) UNIQUE, + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH(fillfactor=70); + +--创建表,并指定该表数据不写入预写日志。 +postgres=# CREATE UNLOGGED TABLE tpcds.warehouse_t7 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建表临时表。 +postgres=# CREATE TEMPORARY TABLE warehouse_t24 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--事务中创建表临时表,并指定提交事务时删除该临时表数据。 +postgres=# CREATE TEMPORARY TABLE warehouse_t25 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) ON COMMIT DELETE ROWS; + +--创建表时,不希望因为表已存在而报错。 +postgres=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建普通表空间。 +postgres=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1'; +--创建表时,指定表空间。 +postgres=# CREATE TABLE tpcds.warehouse_t9 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) TABLESPACE DS_TABLESPACE1; + +--创建表时,单独指定W_WAREHOUSE_NAME的索引表空间。 +postgres=# CREATE TABLE tpcds.warehouse_t10 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) UNIQUE USING INDEX TABLESPACE DS_TABLESPACE1, + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +``` + +``` +--创建一个有主键约束的表。 +postgres=# CREATE TABLE tpcds.warehouse_t11 +( + W_WAREHOUSE_SK INTEGER PRIMARY KEY, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +---或是用下面的语法,效果完全一样。 +postgres=# CREATE TABLE tpcds.warehouse_t12 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + PRIMARY KEY(W_WAREHOUSE_SK) +); + +--或是用下面的语法,指定约束的名称。 +postgres=# CREATE TABLE tpcds.warehouse_t13 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CSTR_KEY1 PRIMARY KEY(W_WAREHOUSE_SK) +); + +--创建一个有复合主键约束的表。 +postgres=# CREATE TABLE tpcds.warehouse_t14 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) +); + +--创建列存表。 +postgres=# CREATE TABLE tpcds.warehouse_t15 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH (ORIENTATION = COLUMN); + +--创建局部聚簇存储的列存表。 +postgres=# CREATE TABLE tpcds.warehouse_t16 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) +) WITH (ORIENTATION = COLUMN); + +--定义一个带压缩的列存表。 +postgres=# CREATE TABLE tpcds.warehouse_t17 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); + +--定义一个带压缩的表。 +postgres=# CREATE TABLE tpcds.warehouse_t18 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) COMPRESS; + +--定义一个检查列约束。 +postgres=# CREATE TABLE tpcds.warehouse_t19 +( + W_WAREHOUSE_SK INTEGER PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0), + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) CHECK (W_WAREHOUSE_NAME IS NOT NULL), + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +postgres=# CREATE TABLE tpcds.warehouse_t20 +( + W_WAREHOUSE_SK INTEGER PRIMARY KEY, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) CHECK (W_WAREHOUSE_NAME IS NOT NULL), + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) +); + +--定义一个表,表中每一个行存在数据库节点中。 +postgres=# CREATE TABLE tpcds.warehouse_t21 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--定义一个表,使用HASH分布。 +postgres=# CREATE TABLE tpcds.warehouse_t22 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CONSTR_KEY3 UNIQUE(W_WAREHOUSE_SK) +); + +--向tpcds.warehouse_t19表中增加一个varchar列。 +``` + +``` +postgres=# ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30); + +--给tpcds.warehouse_t19表增加一个检查约束。 +postgres=# ALTER TABLE tpcds.warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE IS NOT NULL); + +--在一个操作中改变两个现存字段的类型。 +postgres=# ALTER TABLE tpcds.warehouse_t19 + ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80), + ALTER COLUMN W_STREET_NAME TYPE varchar(100); + +--此语句与上面语句等效。 +postgres=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60)); + +--给一个已存在字段添加非空约束。 +postgres=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL; + +--移除已存在字段的非空约束。 +postgres=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL; + +--如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。 +postgres=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK); + +--查看约束的名称,并删除一个列存表中的局部聚簇列。 +postgres=# \d+ tpcds.warehouse_t17 + Table "tpcds.warehouse_t17" + Column | Type | Modifiers | Storage | Stats target | Description +-------------------+-----------------------+-----------+----------+--------------+------------- + w_warehouse_sk | integer | not null | plain | | + w_warehouse_id | character(16) | not null | extended | | + w_warehouse_name | character varying(20) | | extended | | + w_warehouse_sq_ft | integer | | plain | | + w_street_number | character(10) | | extended | | + w_street_name | character varying(60) | | extended | | + w_street_type | character(15) | | extended | | + w_suite_number | character(10) | | extended | | + w_city | character varying(60) | | extended | | + w_county | character varying(30) | | extended | | + w_state | character(2) | | extended | | + w_zip | character(10) | | extended | | + w_country | character varying(20) | | extended | | + w_gmt_offset | numeric(5,2) | | main | | +Partial Cluster : + "warehouse_t17_cluster" PARTIAL CLUSTER KEY (w_warehouse_sk) +Has OIDs: no +Location Nodes: ALL DATANODES +Options: compression=no, version=0.12 +postgres=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster; + +--将表移动到另一个表空间。 +postgres=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT; +--创建模式joe。 +postgres=# CREATE SCHEMA joe; + +--将表移动到另一个模式中。 +postgres=# ALTER TABLE tpcds.warehouse_t19 SET SCHEMA joe; + +--重命名已存在的表。 +postgres=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23; + +--从warehouse_t23表中删除一个字段。 +postgres=# ALTER TABLE joe.warehouse_t23 DROP COLUMN W_STREET_NAME; + +--删除表空间、模式joe和模式表warehouse。 +postgres=# DROP TABLE tpcds.warehouse_t1; +postgres=# DROP TABLE tpcds.warehouse_t2; +postgres=# DROP TABLE tpcds.warehouse_t3; +postgres=# DROP TABLE tpcds.warehouse_t4; +postgres=# DROP TABLE tpcds.warehouse_t5; +postgres=# DROP TABLE tpcds.warehouse_t6; +postgres=# DROP TABLE tpcds.warehouse_t7; +postgres=# DROP TABLE tpcds.warehouse_t8; +postgres=# DROP TABLE tpcds.warehouse_t9; +postgres=# DROP TABLE tpcds.warehouse_t10; +postgres=# DROP TABLE tpcds.warehouse_t11; +postgres=# DROP TABLE tpcds.warehouse_t12; +postgres=# DROP TABLE tpcds.warehouse_t13; +postgres=# DROP TABLE tpcds.warehouse_t14; +postgres=# DROP TABLE tpcds.warehouse_t15; +postgres=# DROP TABLE tpcds.warehouse_t16; +postgres=# DROP TABLE tpcds.warehouse_t17; +postgres=# DROP TABLE tpcds.warehouse_t18; +postgres=# DROP TABLE tpcds.warehouse_t20; +postgres=# DROP TABLE tpcds.warehouse_t21; +postgres=# DROP TABLE tpcds.warehouse_t22; +postgres=# DROP TABLE joe.warehouse_t23; +postgres=# DROP TABLE tpcds.warehouse_t24; +postgres=# DROP TABLE tpcds.warehouse_t25; +postgres=# DROP TABLESPACE DS_TABLESPACE1; +postgres=# DROP SCHEMA IF EXISTS joe CASCADE; +``` + +## 相关链接 + +[ALTER TABLE](ALTER-TABLE.md),[DROP TABLE](DROP-TABLE.md),[CREATE TABLESPACE](CREATE-TABLESPACE.md) + +## 优化建议 + +- UNLOGGED + - UNLOGGED表和表上的索引因为数据写入时不通过WAL日志机制,写入速度远高于普通表。因此,可以用于缓冲存储复杂查询的中间结果集,增强复杂查询的性能。 + - UNLOGGED表无主备机制,在系统故障或异常断点等情况下,会有数据丢失风险,因此,不可用来存储基础数据。 + +- TEMPORARY | TEMP + - 临时表只在当前会话可见,会话结束后会自动删除。 + +- LIKE + - 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 + +- LIKE INCLUDING DEFAULTS + - 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 + +- LIKE INCLUDING CONSTRAINTS + - 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 + +- LIKE INCLUDING INDEXES + - 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 + +- LIKE INCLUDING STORAGE + - 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 + +- LIKE INCLUDING COMMENTS + - 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 + +- LIKE INCLUDING PARTITION + - 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。 + +- 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的内容。 + +- ORIENTATION ROW + - 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 + +- ORIENTATION COLUMN + - 创建列存表,列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 + + diff --git a/content/zh/docs/Developerguide/CREATE-TABLESPACE.md b/content/zh/docs/Developerguide/CREATE-TABLESPACE.md new file mode 100644 index 000000000..72e63fea0 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TABLESPACE.md @@ -0,0 +1,131 @@ +# CREATE TABLESPACE + +## 功能描述 + +在数据库中创建一个新的表空间。 + +## 注意事项 + +- 只有系统管理员可以创建表空间。 +- 不允许在一个事务块内部执行CREATE TABLESPACE。 +- 执行CREATE TABLESPACE失败,如果内部创建目录(文件)操作成功了就会产生残留的目录(文件),重新创建时需要用户手动清理表空间指定的目录下残留的内容。如果在创建过程中涉及到数据目录下的表空间软连接残留,需要先将软连接的残留文件删除,再重新执行OM相关操作。 +- CREATE TABLESPACE不支持两阶段事务,如果部分节点执行失败,不支持回滚。 +- 创建表空间前的准备工作参考下述参数说明。 + +## 语法格式 + +``` +CREATE TABLESPACE tablespace_name + [ OWNER user_name ] RELATIVE LOCATION 'directory' [ MAXSIZE 'space_size' ] + [with_option_clause]; +``` + +其中普通表空间的with\_option\_clause为: + +``` +WITH ( {filesystem= { 'general'| "general" | general} | + random_page_cost = { 'value ' | value } | + seq_page_cost = { 'value ' | value }}[,...]) +``` + +## 参数说明 + +- **tablespace\_name** + + 要创建的表空间名称。 + + 表空间名称不能和数据openGauss中的其他表空间重名,且名称不能以"pg"开头,这样的名称留给系统表空间使用。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **OWNER user\_name** + + 指定该表空间的所有者。缺省时,新表空间的所有者是当前用户。 + + 只有系统管理员可以创建表空间,但是可以通过OWNER子句把表空间的所有权赋给其他非系统管理员。 + + 取值范围:字符串,已存在的用户。 + +- **RELATIVE** + + 使用相对路径,LOCATION目录是相对于各个数据库节点数据目录下的。 + + 目录层次:数据库节点的数据目录/pg\_location/相对路径 + + 相对路径最多指定两层。 + +- **LOCATION directory** + + 用于表空间的目录,对于目录有如下要求: + + - openGauss系统用户必须对该目录拥有读写权限,并且目录为空。如果该目录不存在,将由系统自动创建。 + - 目录必须是绝对路径,目录中不得含有特殊字符(如$,\> 等)。 + - 目录不允许指定在数据库数据目录下。 + - 目录需为本地路径。 + + 取值范围:字符串,有效的目录。 + +- **MAXSIZE 'space\_size'** + + 指定表空间在单个数据库节点上的最大值。 + + 取值范围:字符串格式为正整数+单位,单位当前支持K/M/G/T/P。解析后的数值以K为单位,且范围不能够超过64比特表示的有符号整数,即1KB\~9007199254740991KB。 + +- **random\_page\_cost** + + 指定随机读取page的开销。 + + 取值范围:0\~1.79769e+308。 + + 默认值:使用GUC参数random\_page\_cost的值。 + +- **seq\_page\_cost** + + 指定顺序读取page的开销。 + + 取值范围:0\~1.79769e+308。 + + 默认值:使用GUC参数seq\_page\_cost的值。 + + +## 示例 + +``` +--创建表空间。 +postgres=# CREATE TABLESPACE ds_location1 RELATIVE LOCATION 'tablespace/tablespace_1'; + +--创建用户joe。 +postgres=# CREATE ROLE joe IDENTIFIED BY 'Bigdata@123'; + +--创建用户jay。 +postgres=# CREATE ROLE jay IDENTIFIED BY 'Bigdata@123'; + +--创建表空间,且所有者指定为用户joe。 +postgres=# CREATE TABLESPACE ds_location2 OWNER joe RELATIVE LOCATION 'tablespace/tablespace_1'; + +--把表空间ds_location1重命名为ds_location3。 +postgres=# ALTER TABLESPACE ds_location1 RENAME TO ds_location3; + +--改变表空间ds_location2的所有者。 +postgres=# ALTER TABLESPACE ds_location2 OWNER TO jay; + +--删除表空间。 +postgres=# DROP TABLESPACE ds_location2; +postgres=# DROP TABLESPACE ds_location3; + +--删除用户。 +postgres=# DROP ROLE joe; +postgres=# DROP ROLE jay; +``` + +## 相关链接 + +[CREATE DATABASE](CREATE-DATABASE.md),[CREATE TABLE](CREATE-TABLE.md),[CREATE INDEX](CREATE-INDEX.md),[DROP TABLESPACE](DROP-TABLESPACE.md),[ALTER TABLESPACE](ALTER-TABLESPACE.md) + +## 优化建议 + +- create tablespace + + 不建议在事务内部创建表空间。 + + diff --git a/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md new file mode 100644 index 000000000..f6d0b6ffe --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-CONFIGURATION.md @@ -0,0 +1,123 @@ +# CREATE TEXT SEARCH CONFIGURATION + +## 功能描述 + +创建新的文本搜索配置。一个文本搜索配置声明一个能将一个字符串划分成符号的文本搜索解析器,加上可以用于确定搜索对哪些标记感兴趣的字典。 + +## 注意事项 + +- 若仅声明分析器,那么新的文本搜索配置初始没有从符号类型到词典的映射, 因此会忽略所有的单词。后面必须调用ALTER TEXT SEARCH CONFIGURATION命令创建映射使配置生效。如果声明了COPY选项,那么会自动拷贝指定的文本搜索配置的解析器、映射、配置选项等信息。 +- 若模式名称已给出,那么文本搜索配置会在声明的模式中创建。否则会在当前模式创建。 +- 定义文本搜索配置的用户成为其所有者。 +- PARSER和COPY选项是互相排斥的,因为当一个现有配置被复制,其分析器配置也被复制了。 +- 若仅声明分析器,那么新的文本搜索配置初始没有从符号类型到词典的映射, 因此会忽略所有的单词。 + +## 语法格式 + +``` +CREATE TEXT SEARCH CONFIGURATION name + ( PARSER = parser_name | COPY = source_config ) + [ WITH ( {configuration_option = value} [, ...] )]; +``` + +## 参数说明 + +- **name** + + 要创建的文本搜索配置的名称。该名称可以有模式修饰。 + +- **parser\_name** + + 用于该配置的文本搜索分析器的名称。 + +- **source\_config** + + 要复制的现有文本搜索配置的名称。 + +- **configuration\_option** + + 文本搜索配置的配置参数,主要是针对parser\_name执行的解析器,或者source\_config隐含的解析器而言的。 + + 取值范围:目前共支持default、ngram两种类型的解析器,其中default类型的解析器没有对应的configuration\_option,ngram类型解析器对应的configuration\_option如[表1](#zh-cn_topic_0237122121_zh-cn_topic_0059777835_t0d301ca84e1a4c16ae8bead85aa1a8c3)所示。 + + **表 1** ngram类型解析器对应的配置参数 + + + + + + + + + + + + + + + + + + + + + + +

解析器

+

配置参数

+

参数描述

+

取值范围

+

ngram

+

gram_size

+

分词长度。

+

正整数,1~4

+

默认值:2

+

punctuation_ignore

+

是否忽略标点符号。

+
  • true(默认值):忽略标点符号。
  • false:不忽略标点符号。
+

grapsymbol_ignore

+

是否忽略图形化字符。

+
  • true:忽略图形化字符。
  • false(默认值):不忽略图形化字符。
+
+ + +## 示例 + +``` +--创建文本搜索配置。 +postgres=# CREATE TEXT SEARCH CONFIGURATION ngram2 (parser=ngram) WITH (gram_size = 2, grapsymbol_ignore = false); + +--创建文本搜索配置。 +postgres=# CREATE TEXT SEARCH CONFIGURATION ngram3 (copy=ngram2) WITH (gram_size = 2, grapsymbol_ignore = false); + +--添加类型映射。 +postgres=# ALTER TEXT SEARCH CONFIGURATION ngram2 ADD MAPPING FOR multisymbol WITH simple; + +--创建用户joe。 +postgres=# CREATE USER joe IDENTIFIED BY 'Bigdata@123'; + +--修改文本搜索配置的所有者。 +postgres=# ALTER TEXT SEARCH CONFIGURATION ngram2 OWNER TO joe; + +--修改文本搜索配置的schema。 +postgres=# ALTER TEXT SEARCH CONFIGURATION ngram2 SET SCHEMA joe; + +--重命名文本搜索配置。 +postgres=# ALTER TEXT SEARCH CONFIGURATION joe.ngram2 RENAME TO ngram_2; + +--删除类型映射。 +postgres=# ALTER TEXT SEARCH CONFIGURATION joe.ngram_2 DROP MAPPING IF EXISTS FOR multisymbol; + +--删除文本搜索配置。 +postgres=# DROP TEXT SEARCH CONFIGURATION joe.ngram_2; +postgres=# DROP TEXT SEARCH CONFIGURATION ngram3; + +--删除Schema及用户joe。 +postgres=# DROP SCHEMA IF EXISTS joe CASCADE; +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) + diff --git a/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md new file mode 100644 index 000000000..a2265e398 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TEXT-SEARCH-DICTIONARY.md @@ -0,0 +1,143 @@ +# CREATE TEXT SEARCH DICTIONARY + +## 功能描述 + +创建一个新的全文检索词典。词典是一种指定在全文检索时识别特定词并处理的方法。 + +词典的创建依赖于预定义模板(在系统表[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md#ZH-CN_TOPIC_0242385854)中定义),支持创建五种类型的词典,分别是Simple、Ispell、Synonym、Thesaurus、以及Snowball,每种类型的词典可以完成不同的任务。 + +## 注意事项 + +- 具有SYSADMIN权限的用户可以执行创建词典操作,创建该词典的用户自动成为其所有者。 +- 临时模式(pg\_temp)下不允许创建词典。 +- 创建或修改词典之后,任何对于用户自定义的词典定义文件的修改,将不会影响到数据库中的词典。如果需要在数据库中使用这些修改,需使用ALTER语句更新对应词典的定义文件。 + +## 语法格式 + +``` +CREATE TEXT SEARCH DICTIONARY name ( + TEMPLATE = template + [, option = value [, ... ]] +); +``` + +## 参数说明 + +- **name** + + 要创建的词典的名称(可指定模式名,否则在当前模式下创建)。 + + 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 + +- **template** + + 模板名。 + + 取值范围:系统表[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md#ZH-CN_TOPIC_0242385854)中定义的模板:Simple/Synonym/Thesaurus/Ispell/Snowball。 + +- **option** + + 参数名。与template值对应,不同的词典模板具有不同的参数列表,且与指定顺序无关。 + + - Simple词典对应的option + - **STOPWORDS** + + 停用词表文件名,默认后缀名为stop。停用词文件格式为一组word列表,每行定义一个停用词。词典处理时,文件中的空行和空格会被忽略,并将stopword词组转换为小写形式。 + + - **ACCEPT** + + 是否将非停用词设置为已识别。默认值为true。 + + 当Simple词典设置参数ACCEPT=true时,将不会传递任何token给后继词典,此时建议将其放置在词典列表的最后。反之,当ACCEPT=false时,建议将该Simple词典放置在列表中的至少一个词典之前。 + + - **FILEPATH** + + 词典文件所在目录。目录可以指定为本地目录和OBS目录。其中,本地目录格式为"file://absolute\_path",OBS目录格式为"obs://bucket\_name/path accesskey=ak secretkey=sk region=rg"。默认值为预定义词典文件所在目录。FILEPATH参数必须和STOPWORDS参数同时指定,不允许单独指定。 + + - Synonym词典对应的option + - **SYNONYM** + + 同义词词典的定义文件名,默认后缀名为syn。 + + 文件格式为一组同义词列表,每行格式为"token synonym",即token和其对应的synonym,中间以空格相连。 + + - **CASESENSITIVE** + + 设置是否大小写敏感,默认值为false,此时词典文件中的token和synonym均会转为小写形式处理。如果设置为true,则不会进行小写转换。 + + - **FILEPATH** + + 同义词词典文件所在目录。目录可以指定为本地目录和OBS目录两种形式。其中,本地目录格式为"file://absolute\_path",OBS目录格式为"obs://bucket\_name/path accesskey=ak secretkey=sk region=rg"。默认值为预定义词典文件所在目录。 + + - Thesaurus词典对应的option + - **DICTFILE** + + 词典定义文件名,默认后缀名为ths。 + + 文件格式为一组同义词列表,每行格式为"sample words : indexed words",中间冒号(:)作为短语和其替换词间的分隔符。TZ词典处理时,如果有多个匹配的sample words,将选择最长匹配输出。 + + - **DICTIONARY** + + 用于词规范化的子词典名,必须且仅能定义一个。该词典必须是已经存在的,在检查短语匹配之前使用,用于识别和规范输入文本。 + + 如果子词典无法识别输入词,将会报错。此时,需要移除该词或者更新子词典使其识别。此外,可在indexed words的开头放上一个星号(\*)来跳过在其上应用子词典,但是所有sample words必须可以被子词典识别。 + + 如果词典文件定义的sample words中,含有子词典中定义的停用词,需要用问号(?)替代停用词。假设a和the是子词典中所定义的停用词,如下: + + ``` + ? one ? two : swsw + ``` + + 上述同义词组定义会匹配"a one the two"以及"the one a two",这两个短语均会被swsw替代输出。 + + - **FILEPATH** + + 词典定义文件所在目录。目录可以指定为本地目录和OBS目录两种形式。其中,本地目录格式为"file://absolute\_path",OBS目录格式为"obs://bucket\_name/path accesskey=ak secretkey=sk region=rg"。默认值为预定义词典文件所在目录。 + + - Ispell词典 + - **DICTFILE** + + 词典定义文件名,默认后缀名为dict。 + + - **AFFFILE** + + 词缀文件名,默认后缀名为affix。 + + - **STOPWORDS** + + 停用词文件名,默认后缀名为stop,文件格式要求与Simple类型词典的停用词文件相同。 + + - **FILEPATH** + + 词典文件所在目录。可以指定为本地目录和OBS目录两种形式。其中,本地目录格式为"file://absolute\_path",OBS目录格式为"obs://bucket\_name/path accesskey=ak secretkey=sk region=rg"。默认值为预定义词典文件所在目录。 + + - Snowball词典 + - **LANGUAGE** + + 语言名,标识使用哪种语言的词干分析算法。算法按照对应语言中的拼写规则,缩减输入词的常见变体形式为一个基础词或词干。 + + - **STOPWORDS** + + 停用词表文件名,默认后缀名为stop,文件格式要求与Simple类型词典的停用词文件相同。 + + - **FILEPATH** + + 词典定义文件所在目录。可以指定为本地目录或者OBS目录。其中,本地目录格式为"file://absolute\_path",OBS目录格式为"obs://bucket\_name/path accesskey=ak secretkey=sk region=rg"。默认值为预定义词典文件所在目录。FILEPATH参数必须和STOPWORDS参数同时指定,不允许单独指定。 + + + >![](public_sys-resources/icon-note.gif) **说明:** + >词典定义文件的文件名仅支持小写字母、数据、下划线混合。 + +- **value** + + 参数值。如果不是简单的标识符或数字,则参数值必须加单引号(标示符和数字同样可以加上单引号)。 + + +## 示例 + +请参见[配置示例](配置示例.md#ZH-CN_TOPIC_0242370505)一节的示例。 + +## 相关链接 + +[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) + diff --git a/content/zh/docs/Developerguide/CREATE-TRIGGER.md b/content/zh/docs/Developerguide/CREATE-TRIGGER.md new file mode 100644 index 000000000..3c605ccfb --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TRIGGER.md @@ -0,0 +1,352 @@ +# CREATE TRIGGER + +## 功能描述 + +创建一个触发器。 触发器将与指定的表或视图关联,并在特定条件下执行指定的函数。 + +## 注意事项 + +- 当前仅支持在普通行存表上创建触发器,不支持在列存表、临时表、unlogged表等类型表上创建触发器。 +- 如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。 +- 触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。 + +## 语法格式 + +``` +CREATE [ CONSTRAINT ] TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } + ON table_name + [ FROM referenced_table_name ] + { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } } + [ FOR [ EACH ] { ROW | STATEMENT } ] + [ WHEN ( condition ) ] + EXECUTE PROCEDURE function_name ( arguments ); +``` + +其中event包含以下几种: + +``` + INSERT + UPDATE [ OF column_name [, ... ] ] + DELETE + TRUNCATE +``` + +## 参数说明 + +- **CONSTRAINT** + + 可选项,指定此参数将创建约束触发器,即触发器作为约束来使用。除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同。 约束触发器必须是AFTER ROW触发器。 + +- **trigger\_name** + + 触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用[SET CONSTRAINTS](SET-CONSTRAINTS.md)修改触发器行为时也使用此名称。 + + 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 + +- **BEFORE** + + 触发器函数是在触发事件发生前执行。 + +- **AFTER** + + 触发器函数是在触发事件发生后执行,约束触发器只能指定为AFTER。 + +- **INSTEAD OF** + + 触发器函数直接替代触发事件。 + +- **event** + + 启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。 + + 对于UPDATE事件类型,可以使用下面语法指定列: + + ``` + UPDATE OF column_name1 [, column_name2 ... ] + ``` + + 表示只有这些列作为UPDATE语句的目标列时,才会启动触发器,但是INSTEAD OF UPDATE类型不支持指定列信息。 + +- **table\_name** + + 需要创建触发器的表名称。 + + 取值范围:数据库中已经存在的表名称。 + +- **referenced\_table\_name** + + 约束引用的另一个表的名称。 只能为约束触发器指定,常见于外键约束。由于当前不支持外键,因此不建议使用。 + + 取值范围:数据库中已经存在的表名称。 + +- **DEFERRABLE | NOT DEFERRABLE** + + 约束触发器的启动时机,仅作用于约束触发器。这两个关键字设置该约束是否可推迟。 + + 详细介绍请参见[CREATE TABLE](CREATE-TABLE.md)。 + +- **INITIALLY IMMEDIATE** **| INITIALLY DEFERRED** + + 如果约束是可推迟的,则这个子句声明检查约束的缺省时间,仅作用于约束触发器。 + + 详细介绍请参见[CREATE TABLE](CREATE-TABLE.md)。 + +- **FOR EACH ROW | FOR EACH STATEMENT** + + 触发器的触发频率。 + + - FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。 + - FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。 + + 未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。 + +- **condition** + + 决定是否实际执行触发器函数的条件表达式。当指定WHEN时,只有在条件返回true时才会调用该函数。 + + 在FOR EACH ROW触发器中,WHEN条件可以通过分别写入OLD.column\_name或NEW.column\_name来引用旧行或新行值的列。 当然,INSERT触发器不能引用OLD和DELETE触发器不能引用NEW。 + + INSTEAD OF触发器不支持WHEN条件。 + + WHEN表达式不能包含子查询。 + + 对于约束触发器,WHEN条件的评估不会延迟,而是在执行更新操作后立即发生。 如果条件返回值不为true,则触发器不会排队等待延迟执行。 + +- **function\_name** + + 用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。 + +- **arguments** + + 执行触发器时要提供给函数的可选的以逗号分隔的参数列表。参数是文字字符串常量,简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。 请检查触发器函数的实现语言的描述,以了解如何在函数内访问这些参数。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >关于触发器种类: + >- INSTEAD OF的触发器必须标记为FOR EACH ROW,并且只能在视图上定义。 + >- BEFORE和AFTER触发器作用在视图上时,只能标记为FOR EACH STATEMENT。 + >- TRUNCATE类型触发器仅限FOR EACH STATEMENT。 + + **表 1** 表和视图上支持的触发器种类: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

触发时机

+

触发事件

+

行级

+

语句级

+

BEFORE

+

INSERT/UPDATE/DELETE

+

+

表和视图

+

TRUNCATE

+

不支持

+

+

AFTER

+

INSERT/UPDATE/DELETE

+

+

表和视图

+

TRUNCATE

+

不支持

+

+

INSTEAD OF

+

INSERT/UPDATE/DELETE

+

视图

+

不支持

+

TRUNCATE

+

不支持

+

不支持

+
+ + **表 2** PLPGSQL类型触发器函数特殊变量: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

变量名

+

变量含义

+

NEW

+

INSERT及UPDATE操作涉及tuple信息中的新值,对DELETE为空。

+

OLD

+

UPDATE及DELETE操作涉及tuple信息中的旧值,对INSERT为空。

+

TG_NAME

+

触发器名称。

+

TG_WHEN

+

触发器触发时机(BEFORE/AFTER/INSTEAD OF)。

+

TG_LEVEL

+

触发频率(ROW/STATEMENT)。

+

TG_OP

+

触发操作(INSERT/UPDATE/DELETE/TRUNCATE)。

+

TG_RELID

+

触发器所在表OID。

+

TG_RELNAME

+

触发器所在表名(已废弃,现用TG_TABLE_NAME替代)。

+

TG_TABLE_NAME

+

触发器所在表名。

+

TG_TABLE_SCHEMA

+

触发器所在表的SCHEMA信息。

+

TG_NARGS

+

触发器函数参数个数。

+

TG_ARGV[]

+

触发器函数参数列表。

+
+ + +## 示例 + +``` +--创建源表及触发表 +postgres=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); +postgres=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); + +--创建触发器函数 +postgres=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS + $$ + DECLARE + BEGIN + INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); + RETURN NEW; + END + $$ LANGUAGE PLPGSQL; + +postgres=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS + $$ + DECLARE + BEGIN + UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1; + RETURN OLD; + END + $$ LANGUAGE PLPGSQL; + +postgres=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS + $$ + DECLARE + BEGIN + DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1; + RETURN OLD; + END + $$ LANGUAGE PLPGSQL; + +--创建INSERT触发器 +postgres=# CREATE TRIGGER insert_trigger + BEFORE INSERT ON test_trigger_src_tbl + FOR EACH ROW + EXECUTE PROCEDURE tri_insert_func(); + +--创建UPDATE触发器 +postgres=# CREATE TRIGGER update_trigger + AFTER UPDATE ON test_trigger_src_tbl + FOR EACH ROW + EXECUTE PROCEDURE tri_update_func(); + +--创建DELETE触发器 +postgres=# CREATE TRIGGER delete_trigger + BEFORE DELETE ON test_trigger_src_tbl + FOR EACH ROW + EXECUTE PROCEDURE tri_delete_func(); + +--执行INSERT触发事件并检查触发结果 +postgres=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); +postgres=# SELECT * FROM test_trigger_src_tbl; +postgres=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 + +--执行UPDATE触发事件并检查触发结果 +postgres=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; +postgres=# SELECT * FROM test_trigger_src_tbl; +postgres=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效 + +--执行DELETE触发事件并检查触发结果 +postgres=# DELETE FROM test_trigger_src_tbl WHERE id1=100; +postgres=# SELECT * FROM test_trigger_src_tbl; +postgres=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效 + +--修改触发器 +postgres=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; + +--禁用insert_trigger触发器 +postgres=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; + +--禁用当前表上所有触发器 +postgres=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; + +--删除触发器 +postgres=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; +postgres=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; +postgres=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl; +``` + +## 相关链接 + +[ALTER TRIGGER](ALTER-TRIGGER.md),[DROP TRIGGER](DROP-TRIGGER.md),[ALTER TABLE](ALTER-TABLE.md) + diff --git a/content/zh/docs/Developerguide/CREATE-TYPE.md b/content/zh/docs/Developerguide/CREATE-TYPE.md new file mode 100644 index 000000000..2fe0244a3 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-TYPE.md @@ -0,0 +1,399 @@ +# CREATE TYPE + +## 功能描述 + +在当前数据库中定义一种新的数据类型。定义数据类型的用户将成为该数据类型的拥有者。类型只适用于行存表 + +有四种形式的CREATE TYPE,分别为:复合类型、基本类型、shell类型和枚举类型。 + +- 复合类型 + + 复合类型由一个属性名和数据类型的列表指定。如果属性的数据类型是可排序的,也可以指定该属性的排序规则。复合类型本质上和表的行类型相同,但是如果只想定义一种类型,使用CREATE TYPE避免了创建一个实际的表。单独的复合类型也是很有用的,例如可以作为函数的参数或者返回类型。 + + 为了能够创建复合类型,必须拥有在其所有属性类型上的USAGE特权。 + +- 基本类型 + + 用户可以自定义一种新的基本类型(标量类型)。通常来说这些函数必须是用C或者另外一种低层语言所编写。 + +- shell类型 + + shell类型是一种用于后面要定义的类型的占位符,通过发出一个不带除类型名之外其他参数的CREATE TYPE命令可以创建这种类型。在创建基本类型时,需要shell类型作为一种向前引用。 + +- 枚举类型 + + 由若干个标签构成的列表,每一个标签值都是一个非空字符串,且字符串长度必须不超过64个字节。 + + +## 注意事项 + +如果给定一个模式名,那么该类型将被创建在指定的模式中。否则它会被创建在当前模式中。类型名称必须与同一个模式中任何现有的类型或者域相区别(因为表具有相关的数据类型,类型名称也必须与同一个模式中任何现有表的名称不同)。 + +## 语法格式 + +``` +CREATE TYPE name AS + ( [ attribute_name data_type [ COLLATE collation ] [, ... ] ] ) + +CREATE TYPE name ( + INPUT = input_function, + OUTPUT = output_function + [ , RECEIVE = receive_function ] + [ , SEND = send_function ] + [ , TYPMOD_IN = +type_modifier_input_function ] + [ , TYPMOD_OUT = +type_modifier_output_function ] + [ , ANALYZE = analyze_function ] + [ , INTERNALLENGTH = { internallength | +VARIABLE } ] + [ , PASSEDBYVALUE ] + [ , ALIGNMENT = alignment ] + [ , STORAGE = storage ] + [ , LIKE = like_type ] + [ , CATEGORY = category ] + [ , PREFERRED = preferred ] + [ , DEFAULT = default ] + [ , ELEMENT = element ] + [ , DELIMITER = delimiter ] + [ , COLLATABLE = collatable ] +) + +CREATE TYPE name + +CREATE TYPE name AS ENUM + ( [ 'label' [, ... ] ] ) +``` + +## 参数说明 + +复合类型 + +- **name** + + 要创建的类型的名称(可以被模式限定)。 + +- **attribute\_name** + + 复合类型的一个属性(列)的名称。 + +- **data\_type** + + 要成为复合类型的一个列的现有数据类型的名称。 + +- **collation** + + 要关联到复合类型的一列的现有排序规则的名称。 + + +基本类型 + +自定义基本类型时,参数可以以任意顺序出现,input\_function和output\_function为必选参数,其它为可选参数。 + +- **input\_function** + + 将数据从类型的外部文本形式转换为内部形式的函数名。 + + 输入函数可以被声明为有一个cstring类型的参数,或者有三个类型分别为cstring、 oid、integer的参数。 + + - cstring参数是以C字符串存在的输入文本。 + - oid参数是该类型自身的OID(对于数组类型则是其元素类型的OID)。 + - integer参数是目标列的typmod(如果知道,不知道则将传递 -1)。 + + 输入函数必须返回一个该数据类型本身的值。通常,一个输入函数应该被声明为STRICT。 如果不是这样,在读到一个NULL输入值时,调用输入函数时第一个参数会是NULL。在这种情况下,该函数必须仍然返回NULL,除非调用函数发生了错误(这种情况主要是想支持域输入函数,域输入函数可能需要拒绝NULL输入)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >输入和输出函数能被声明为具有新类型的结果或参数是因为:必须在创建新类型之前创建这两个函数。而新类型应该首先被定义为一种shell type,它是一种占位符类型,除了名称和拥有者之外它没有其他属性。这可以通过不带额外参数的命令CREATE TYPE name做到。然后用C写的I/O函数可以被定义为引用这种shell type。最后,用带有完整定义的CREATE TYPE把该shell type替换为一个完全的、合法的类型定义,之后新类型就可以正常使用了。 + +- **output\_function** + + 将数据从类型的内部形式转换为外部文本形式的函数名。 + + 输出函数必须被声明为有一个新数据类型的参数。输出函数必须返回类型cstring。对于NULL值不会调用输出函数。 + +- **receive\_function** + + 可选参数。将数据从类型的外部二进制形式转换成内部形式的函数名。 + + 如果没有该函数,该类型不能参与到二进制输入中。二进制表达转换成内部形式代价更低,然而却更容易移植(例如,标准的整数数据类型使用网络字节序作为外部二进制表达,而内部表达是机器本地的字节序)。receive\_function应该执行足够的检查以确保该值是有效的。 + + 接收函数可以被声明为有一个internal类型的参数,或者有三个类型分别为internal、oid、integer的参数。 + + - internal参数是一个指向StringInfo缓冲区的指针,其中保存着接收到的字节串。 + - oid和integer参数和文本输入函数的相同。 + + 接收函数必须返回一个该数据类型本身的值。通常,一个接收函数应该被声明为STRICT。如果不是这样,在读到一个NULL输入值时调用接收函数时第一个参数会是NULL。在这种情况下,该函数必须仍然返回NULL,除非接收函数发生了错误(这种情况主要是想支持域接收函数,域接收函数可能需要拒绝NULL输入)。 + +- **send\_function** + + 可选参数。将数据从类型的内部形式转换为外部二进制形式的函数名。 + + 如果没有该函数,该类型将不能参与到二进制输出中。发送函数必须被声明为有一个新数据类型的参数。发送函数必须返回类型bytea。对于NULL值不会调用发送函数。 + +- **type\_modifier\_input\_function** + + 可选参数。将类型的修饰符数组转换为内部形式的函数名。 + +- **type\_modifier\_output\_function** + + 可选参数。将类型的修饰符的内部形式转换为外部文本形式的函数名。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果该类型支持修饰符(附加在类型声明上的可选约束,例如,char\(5\)或numeric\(30,2\)),则需要可选的type\_modifier\_input\_function以及type\_modifier\_output\_function。openGauss允许用户定义的类型有一个或者多个简单常量或者标识符作为修饰符。不过,为了存储在系统目录中,该信息必须能被打包到一个非负整数值中。所声明的修饰符会被以cstring数组的形式传递给type\_modifier\_input\_function。 type\_modifier\_input\_function必须检查该值的合法性(如果值错误就抛出一个错误),如果值正确,要返回一个非负integer值,该值将被存储在“typmod”列中。如果类型没有 type\_modifier\_input\_function则类型修饰符将被拒绝。type\_modifier\_output\_function把内部的整数typmod值转换回正确的形式用于用户显示。type\_modifier\_output\_function必须返回一个cstring值,该值就是追加到类型名称后的字符串。例如,numeric的函数可能会返回\(30,2\)。如果默认的显示格式就是只把存储的typmod整数值放在圆括号内,则允许省略type\_modifier\_output\_function。 + +- **analyze\_function** + + 可选参数。为该数据类型执行统计分析的函数名的可选参数。 + + 默认情况下,如果该类型有一个默认的B-tree操作符类,ANALYZE将尝试用类型的“equals”和“less-than”操作符来收集统计信息。这种行为对于非标量类型并不合适,因此可以通过指定一个自定义分析函数来覆盖这种行为。分析函数必须被声明为有一个类型为internal的参数,并且返回一个boolean结果。 + +- **internallength** + + 可选参数。一个数字常量,用于指定新类型的内部表达的字节长度。默认为变长。 + + 虽然只有I/O函数和其他为该类型创建的函数才知道新类型的内部表达的细节, 但是内部表达的一些属性必须被向openGauss声明。其中最重要的是internallength。基本数据类型可以是定长的(这种情况下internallength是一个正整数)或者是变长的(把internallength设置为VARIABLE,在内部通过把typlen设置为-1表示)。所有变长类型的内部表达都必须以一个4字节整数开始,internallength定义了总长度。 + +- **PASSEDBYVALUE** + + 可选参数。表示这种数据类型的值需要被传值而不是传引用。传值的类型必须是定长的,并且它们的内部表达不能超过Datum类型(某些机器上是4字节,其他机器上是8字节)的尺寸。 + +- **alignment** + + 可选参数。该参数指定数据类型的存储对齐需求。如果被指定,必须是char、int2、int4或者double。默认是int4。 + + 允许的值等同于以1、2、4或8字节边界对齐。要注意变长类型的alignment参数必须至少为4,因为它们需要包含一个int4作为它们的第一个组成部分。 + +- **storage** + + 可选参数。该数据类型的存储策略。 + + 如果被指定,必须是plain、external、extended或者main。 默认是plain。 + + - plain指定该类型的数据将总是被存储在线内并且不会被压缩。(对定长类型只允许plain) + - extended 指定系统将首先尝试压缩一个长的数据值,并且将在数据仍然太长的情况下把值移出主表行。 + - external允许值被移出主表, 但是系统将不会尝试对它进行压缩。 + - main允许压缩,但是不鼓励把值移出主表(如果没有其他办法让行的大小变得合适,具有这种存储策略的数据项仍将被移出主表,但比起extended以及external项来,这种存储策略的数据项会被优先考虑保留在主表中)。 + + 除plain之外所有的storage值都暗示该数据类型的函数能处理被TOAST过的值。指定的值仅仅是决定一种可TOAST数据类型的列的默认TOAST存储策略,用户可以使用ALTER TABLE SET STORAGE为列选取其他策略。 + + +- **like\_type** + + 可选参数。与新类型具有相同表达的现有数据类型的名称。会从这个类型中复制internallength、 passedbyvalue、 alignment以及storage的值( 除非在这个CREATE TYPE命令的其他地方用显式说明覆盖)。 + + 当新类型的低层实现是以一种现有的类型为参考时,用这种方式指定表达特别有用。 + +- **category** + + 可选参数。这种类型的分类码(一个ASCII 字符)。 默认是“用户定义类型”的'U'。为了创建自定义分类, 也可以选择其他 ASCII字符。 + +- **preferred** + + 可选参数。如果这种类型是其类型分类中的优先类型则为TRUE,否则为FALSE。默认为假。在一个现有类型分类中创建一种新的优先类型要非常谨慎, 因为这可能会导致很大的改变。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >category和preferred参数可以被用来帮助控制在混淆的情况下应用哪一种隐式造型。每一种数据类型都属于一个用单个ASCII 字符命名的分类,并且每一种类型可以是其所属分类中的“首选”。当有助于解决重载函数或操作符时,解析器将优先造型到首选类型(但是只能从同类的其他类型造型)。对于没有隐式转换到或来自任意其他类型的类型,让这些设置保持默认即可。不过,对于有隐式转换的相关类型的组,把它们都标记为属于同一个类别并且选择一种或两种“最常用”的类型作为该类别的首选通常是很有用的。在把一种用户定义的类型增加到一个现有的内建类别(例如,数字或者字符串类型)中时,category参数特别有用。不过,也可以创建新的全部是用户定义类型的类别。对这样的类别,可选择除大写字母之外的任何ASCII 字符。 + +- **default** + + 可选参数。数据类型的默认值。如果被省略,默认值是空。 + + 如果用户希望该数据类型的列被默认为某种非空值,可以指定一个默认值。默认值可以用DEFAULT关键词指定(这样一个默认值可以被附加到一个特定列的显式DEFAULT子句覆盖)。 + +- **element** + + 可选参数。被创建的类型是一个数组,element指定了数组元素的类型。例如,要定义一个4字节整数的数组(int4), 应指定ELEMENT = int4。 + +- **delimiter** + + 可选参数。指定这种类型组成的数组中分隔值的定界符。 + + 可以把delimiter设置为一个特定字符,默认的定界符是逗号(,)。注意定界符是与数组元素类型相关的,而不是数组类型本身相关。 + +- **collatable** + + 可选参数。如果这个类型的操作可以使用排序规则信息,则为TRUE。默认为FALSE。 + + 如果collatable为TRUE,这种类型的列定义和表达式可能通过使用COLLATE子句携带有排序规则信息。在该类型上操作的函数的实现负责真正利用这些信息,仅把类型标记为可排序的并不会让它们自动地去使用这类信息。 + +- **lable** + + 可选参数。与枚举类型的一个值相关的文本标签,其值为长度不超过64个字符的非空字符串。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>在创建用户定义类型的时候, openGauss会自动创建一个与之关联的数组类型,其名称由该元素类型的名称前缀一个下划线组成。 + +## 示例 + +``` +--创建一种复合类型,建表并插入数据以及查询: +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); +postgres=# INSERT INTO t1_compfoo values(1,(1,'demo')); +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'; +postgres=# ALTER TYPE compfoo1 OWNER TO usr1; + +--把用户定义类型compfoo1的模式改变为usr1: +postgres=# ALTER TYPE compfoo1 SET SCHEMA usr1; + +给一个数据类型增加一个新的属性: +postgres=# ALTER TYPE usr1.compfoo1 ADD ATTRIBUTE f3 int; + +删除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)); +} +``` + +## 相关链接 + +[ALTER TYPE](ALTER-TYPE.md#ZH-CN_TOPIC_0242370546),[DROP TYPE](DROP-TYPE.md#ZH-CN_TOPIC_0242370621) + diff --git a/content/zh/docs/Developerguide/CREATE-USER.md b/content/zh/docs/Developerguide/CREATE-USER.md new file mode 100644 index 000000000..d30c34c2a --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-USER.md @@ -0,0 +1,116 @@ +# CREATE USER + +## 功能描述 + +创建一个用户。 + +## 注意事项 + +- 通过CREATE USER创建的用户,默认具有LOGIN权限; +- 通过CREATE USER创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不自动创建同名的SCHEMA;用户可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。 +- 系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。 + +## 语法格式 + +``` +CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; +``` + +其中option子句用于设置权限及属性等信息。 + +``` +{SYSADMIN | NOSYSADMIN} + | {MONADMIN | NOMONADMIN} + | {OPRADMIN | NOOPRADMIN} + | {POLADMIN | NOPOLADMIN} + | {AUDITADMIN | NOAUDITADMIN} + | {CREATEDB | NOCREATEDB} + | {USEFT | NOUSEFT} + | {CREATEROLE | NOCREATEROLE} + | {INHERIT | NOINHERIT} + | {LOGIN | NOLOGIN} + | {REPLICATION | NOREPLICATION} + | {INDEPENDENT | NOINDEPENDENT} + | {VCADMIN | NOVCADMIN} + | CONNECTION LIMIT connlimit + | 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 [, ...] + | ADMIN role_name [, ...] + | USER role_name [, ...] + | SYSID uid + | DEFAULT TABLESPACE tablespace_name + | PROFILE DEFAULT + | PROFILE profile_name + | PGUSER +``` + +## 参数说明 + +- **user\_name** + + 用户名称。 + + 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 + +- **password** + + 登录密码。 + + 密码规则如下: + + - 密码默认不少于8个字符。 + - 不能与用户名及用户名倒序相同。 + - 至少包含大写字母(A-Z),小写字母(a-z),数字(0-9),非字母数字字符(限定为\~!@\#$%^&\*\(\)-\_=+\\|\[\{\}\];:,<.\>/?)四类字符中的三类字符。 + - 创建用户时,应当使用双引号或单引号将用户密码括起来。 + + 取值范围:字符串。 + + +CREATE USER的其他参数值请参考[CREATE ROLE参数说明](CREATE-ROLE.md)。 + +## 示例 + +``` +--创建用户jim,登录密码为Bigdata@123。 +postgres=# CREATE USER jim PASSWORD 'Bigdata@123'; + +--下面语句与上面的等价。 +postgres=# CREATE USER kim IDENTIFIED BY 'Bigdata@123'; + +--如果创建有“创建数据库”权限的用户,则需要加CREATEDB关键字。 +postgres=# CREATE USER dim CREATEDB PASSWORD 'Bigdata@123'; + +--将用户jim的登录密码由Bigdata@123修改为Abcd@123。 +postgres=# ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'Bigdata@123'; + +--为用户jim追加CREATEROLE权限。 +postgres=# ALTER USER jim CREATEROLE; + +--将enable_seqscan的值设置为on, 设置成功后,在下一会话中生效。 +postgres=# ALTER USER jim SET enable_seqscan TO on; + +--重置jim的enable_seqscan参数。 +postgres=# ALTER USER jim RESET enable_seqscan; + +--锁定jim帐户。 +postgres=# ALTER USER jim ACCOUNT LOCK; + +--删除用户。 +postgres=# DROP USER kim CASCADE; +postgres=# DROP USER jim CASCADE; +postgres=# DROP USER dim CASCADE; +``` + +## 相关链接 + +[ALTER USER](ALTER-USER.md#ZH-CN_TOPIC_0242370547),[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 new file mode 100644 index 000000000..e762093c0 --- /dev/null +++ b/content/zh/docs/Developerguide/CREATE-VIEW.md @@ -0,0 +1,74 @@ +# CREATE VIEW + +## 功能描述 + +创建一个视图。视图与基本表不同,是一个虚拟的表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ] + [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ] + AS query; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>创建视图时使用WITH\(security\_barriers\)可以创建一个相对安全的视图,避免攻击者利用低成本函数的RAISE语句打印出隐藏的基表数据。 + +## 参数说明 + +- **OR REPLACE** + + 如果视图已存在,则重新定义。 + +- **TEMP | TEMPORARY** + + 创建临时视图。 + +- **view\_name** + + 要创建的视图名称。可以用模式修饰。 + + 取值范围:字符串,符合标识符命名规范。 + +- **column\_name** + + 可选的名称列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。 + + 取值范围:字符串,符合标识符命名规范。 + +- **view\_option\_name \[= view\_option\_value\]** + + 该子句为视图指定一个可选的参数。 + + 目前view\_option\_name支持的参数仅有security\_barrier,当VIEW试图提供行级安全时,应使用该参数。 + + 取值范围:Boolean类型,TRUE、FALSE + +- **query** + + 为视图提供行和列的SELECT或VALUES语句。 + + +## 示例 + +``` +--创建字段spcname为pg_default组成的视图。 +postgres=# CREATE VIEW myView AS + SELECT * FROM pg_tablespace WHERE spcname = 'pg_default'; + +--查看视图。 +postgres=# SELECT * FROM myView ; + +--删除视图myView。 +postgres=# DROP VIEW myView; +``` + +## 相关链接 + +[ALTER VIEW](ALTER-VIEW.md#ZH-CN_TOPIC_0242370548),[DROP VIEW](DROP-VIEW.md#ZH-CN_TOPIC_0242370623) + diff --git a/content/zh/docs/Developerguide/CURSOR.md b/content/zh/docs/Developerguide/CURSOR.md new file mode 100644 index 000000000..ec5f5d1ea --- /dev/null +++ b/content/zh/docs/Developerguide/CURSOR.md @@ -0,0 +1,65 @@ +# CURSOR + +## 功能描述 + +CURSOR命令定义一个游标,用于在一个大的查询里面检索少数几行数据。 + +为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 + +## 注意事项 + +- 游标命令只能在事务块里使用。 +- 通常游标和SELECT一样返回文本格式。因为数据在系统内部是用二进制格式存储的,系统必须对数据做一定转换以生成文本格式。一旦数据是以文本形式返回,客户端应用需要把它们转换成二进制进行操作。使用FETCH语句,游标可以返回文本或二进制格式。 +- 应该小心使用二进制游标。文本格式一般都比对应的二进制格式占用的存储空间大。二进制游标返回内部二进制形态的数据,可能更易于操作。如果想以文本方式显示数据,则以文本方式检索会为用户节约很多客户端的工作。比如,如果查询从某个整数列返回1,在缺省的游标里将获得一个字符串1,但在二进制游标里将得到一个4字节的包含该数值内部形式的数值(大端顺序)。 + +## 语法格式 + +``` +CURSOR cursor_name + [ BINARY ] [ NO SCROLL ] [ { WITH | WITHOUT } HOLD ] + FOR query ; +``` + +## 参数说明 + +- **cursor\_name** + + 将要创建的游标名。 + + 取值范围:遵循数据库对象命名规范。 + +- **BINARY** + + 指明游标以二进制而不是文本格式返回数据。 + +- **NO SCROLL** + + 声明游标检索数据行的方式。 + + - NO SCROLL:声明该游标不能用于以倒序的方式检索数据行。 + - 未声明:根据执行计划的不同,自动判断该游标是否可以用于以倒序的方式检索数据行。 + +- **WITH HOLD | WITHOUT HOLD** + + 声明当创建游标的事务结束后,游标是否能继续使用。 + + - WITH HOLD:声明该游标在创建它的事务结束后仍可继续使用。 + - WITHOUT HOLD:声明该游标在创建它的事务之外不能再继续使用,此游标将在事务结束时被自动关闭。 + - 如果不指定WITH HOLD或WITHOUT HOLD,默认行为是WITHOUT HOLD。 + - 跨节点事务不支持WITH HOLD(例如在多DBnode部署openGauss中所创建的含有DDL的事务属于跨节点事务)。 + +- **query** + + 使用SELECT或VALUES子句指定游标返回的行。 + + 取值范围:SELECT或VALUES子句。 + + +## 示例 + +请参考FETCH的[示例](FETCH.md#zh-cn_topic_0237122165_zh-cn_topic_0059778422_s1ee72832a27547e4949061a010e24578)。 + +## 相关链接 + +[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629) + diff --git a/content/zh/docs/Developerguide/CopyManager.md b/content/zh/docs/Developerguide/CopyManager.md new file mode 100644 index 000000000..020c2c0dd --- /dev/null +++ b/content/zh/docs/Developerguide/CopyManager.md @@ -0,0 +1,109 @@ +# CopyManager + +CopyManager是openGauss JDBC驱动中提供的一个API接口类,用于批量向openGauss中导入数据。 + +## CopyManager的继承关系 + +CopyManager类位于org.postgresql.copy Package中,继承自java.lang.Object类,该类的声明如下: + +``` +public class CopyManager +extends Object +``` + +## 构造方法 + +public CopyManager\(BaseConnection connection\) + +throws SQLException + +## 常用方法 + +**表 1** CopyManager常用方法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

返回值

+

方法

+

描述

+

throws

+

CopyIn

+

copyIn(String sql)

+

-

+

SQLException

+

long

+

copyIn(String sql, InputStream from)

+

使用COPY FROM STDIN从InputStream中快速向数据库中的表加载数据。

+

SQLException,IOException

+

long

+

copyIn(String sql, InputStream from, int bufferSize)

+

使用COPY FROM STDIN从InputStream中快速向数据库中的表加载数据。

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from)

+

使用COPY FROM STDIN从Reader中快速向数据库中的表加载数据。

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from, int bufferSize)

+

使用COPY FROM STDIN从Reader中快速向数据库中的表加载数据。

+

SQLException,IOException

+

CopyOut

+

copyOut(String sql)

+

-

+

SQLException

+

long

+

copyOut(String sql, OutputStream to)

+

将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。

+

SQLException,IOException

+

long

+

copyOut(String sql, Writer to)

+

将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。

+

SQLException,IOException

+
+ 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" new file mode 100644 index 000000000..ce41beefc --- /dev/null +++ "b/content/zh/docs/Developerguide/CopyManager\347\261\273\347\256\200\344\273\213.md" @@ -0,0 +1,109 @@ +# CopyManager类简介 + +CopyManager是 openGauss JDBC驱动中提供的一个API接口类,用于批量向openGaussopenGauss中导入数据。 + +## CopyManager的继承关系 + +CopyManager类位于org.postgresql.copy Package中,继承自java.lang.Object类,该类的声明如下: + +``` +public class CopyManager +extends Object +``` + +## 构造方法 + +public CopyManager\(BaseConnection connection\) + +throws SQLException + +## 常用方法 + +**表 1** CopyManager常用方法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

返回值

+

方法

+

描述

+

throws

+

CopyIn

+

copyIn(String sql)

+

-

+

SQLException

+

long

+

copyIn(String sql, InputStream from)

+

使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。

+

SQLException,IOException

+

long

+

copyIn(String sql, InputStream from, int bufferSize)

+

使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from)

+

使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from, int bufferSize)

+

使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。

+

SQLException,IOException

+

CopyOut

+

copyOut(String sql)

+

-

+

SQLException

+

long

+

copyOut(String sql, OutputStream to)

+

将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。

+

SQLException,IOException

+

long

+

copyOut(String sql, Writer to)

+

将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。

+

SQLException,IOException

+
+ 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" new file mode 100644 index 000000000..5fa356958 --- /dev/null +++ "b/content/zh/docs/Developerguide/DCL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" @@ -0,0 +1,78 @@ +# DCL语法一览表 + +DCL(Data Control Language数据控制语言),是用来创建用户角色、设置或更改数据库用户或角色权限的语句。 + +## 定义角色 + +角色是用来管理权限的,从数据库安全的角度考虑,可以把所有的管理和操作权限划分到不同的角色上。所涉及的SQL语句,请参考[表1](#zh-cn_topic_0237122051_zh-cn_topic_0059777960_tf1770f1724d84240998305bfca259f11)。 + +**表 1** 角色定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建角色

+

CREATE ROLE

+

修改角色属性

+

ALTER ROLE

+

删除角色

+

DROP ROLE

+
+ +## 定义用户 + +用户是用来登录数据库的,通过对用户赋予不同的权限,可以方便地管理用户对数据库的访问及操作。所涉及的SQL语句,请参考[表2](#zh-cn_topic_0237122051_zh-cn_topic_0059777960_t52a128d57b274569b95a3b35f6871348)。 + +**表 2** 用户定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建用户

+

CREATE USER

+

修改用户属性

+

ALTER USER

+

删除用户

+

DROP USER

+
+ +## 授权 + +openGauss提供了针对数据对象和角色授权的语句,请参考[GRANT](GRANT.md)。 + +## 收回权限 + +openGauss提供了收回权限的语句,请参考[REVOKE](REVOKE.md)。 + +## 设置默认权限 + +openGauss允许设置应用于将来创建的对象的权限,请参考[ALTER DEFAULT PRIVILEGES](ALTER-DEFAULT-PRIVILEGES.md#ZH-CN_TOPIC_0242370521)。 + diff --git "a/content/zh/docs/Developerguide/DDL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" "b/content/zh/docs/Developerguide/DDL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" new file mode 100644 index 000000000..422d7162d --- /dev/null +++ "b/content/zh/docs/Developerguide/DDL\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" @@ -0,0 +1,327 @@ +# DDL语法一览表 + +DDL(Data Definition Language数据定义语言),用于定义或修改数据库中的对象。如:表、索引、视图等。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>openGauss不支持数据库主节点不完整时进行DDL操作。例如:openGauss中有1个数据库主节点故障时执行新建数据库、表等操作都会失败。 + +## 定义数据库 + +数据库是组织、存储和管理数据的仓库,而数据库定义主要包括:创建数据库、修改数据库属性,以及删除数据库。所涉及的SQL语句,请参考[表1](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_t986073679146430a8bce8bf0ea8f3607)。 + +**表 1** 数据库定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建数据库

+

CREATE DATABASE

+

修改数据库属性

+

ALTER DATABASE

+

删除数据库

+

DROP DATABASE

+
+ +## 定义模式 + +模式是一组数据库对象的集合,主要用于控制对数据库对象的访问。所涉及的SQL语句,请参考[表2](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_t02977f28a9564837881f110b305d7509)。 + +**表 2** 模式定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建模式

+

CREATE SCHEMA

+

修改模式属性

+

ALTER SCHEMA

+

删除模式

+

DROP SCHEMA

+
+ +## 定义表空间 + +表空间用于管理数据对象,与磁盘上的一个目录对应。所涉及的SQL语句,请参考[表3](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_t9b028195c0d143f6b8fc7065af1ce2f9)。 + +**表 3** 表空间定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建表空间

+

CREATE TABLESPACE

+

修改表空间属性

+

ALTER TABLESPACE

+

删除表空间

+

DROP TABLESPACE

+
+ +## 定义表 + +表是数据库中的一种特殊数据结构,用于存储数据对象以及对象之间的关系。所涉及的SQL语句,请参考[表4](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_tcd92dbef720d4b7eaa5bf7a290b98605)。 + +**表 4** 表定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建表

+

CREATE TABLE

+

修改表属性

+

ALTER TABLE

+

删除表

+

DROP TABLE

+
+ +## 定义分区表 + +分区表是一种逻辑表,数据是由普通表存储的,主要用于提升查询性能。所涉及的SQL语句,请参考[表5](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_t3ec179079c524dbaae801012f990a692)。 + +**表 5** 分区表定义相关SQL + + + + + + + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建分区表

+

CREATE TABLE PARTITION

+

创建分区

+

ALTER TABLE PARTITION

+

修改分区表属性

+

ALTER TABLE PARTITION

+

删除分区

+

ALTER TABLE PARTITION

+

删除分区表

+

DROP TABLE

+
+ +## 定义索引 + +索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。所涉及的SQL语句,请参考[表6](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_te79920e4b7b849b7a64fb71029436d48)。 + +**表 6** 索引定义相关SQL + + + + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建索引

+

CREATE INDEX

+

修改索引属性

+

ALTER INDEX

+

删除索引

+

DROP INDEX

+

重建索引

+

REINDEX

+
+ +## 定义存储过程 + +存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数(如果该存储过程带有参数)来执行它。所涉及的SQL语句,请参考[表7](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_t0116270962694804b50796a5d6824f3b)。 + +**表 7** 存储过程定义相关SQL + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建存储过程

+

CREATE PROCEDURE

+

删除存储过程

+

DROP PROCEDURE

+
+ +## 定义函数 + +在openGauss中,它和存储过程类似,也是一组SQL语句集,使用上没有差别。所涉及的SQL语句,请参考[表8](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_tde31d523c25742e2aecc5ae8a17d561b)。 + +**表 8** 函数定义相关SQL + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建函数

+

CREATE FUNCTION

+

修改函数属性

+

ALTER FUNCTION

+

删除函数

+

DROP FUNCTION

+
+ +## 定义视图 + +视图是从一个或几个基本表中导出的虚表,可用于控制用户对数据访问,请参考[表9](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_td65563e06b1c491892dbad9b57f3b96d)。 + +**表 9** 视图定义相关SQL + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建视图

+

CREATE VIEW

+

删除视图

+

DROP VIEW

+
+ +## 定义游标 + +为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化,请参考[表10](#zh-cn_topic_0237122049_zh-cn_topic_0059777960_t191f977ebe0a4ab5b1348c888403e3b4)。 + +**表 10** 游标定义相关SQL + + + + + + + + + + + + + + + + + + + +

功能

+

相关SQL

+

创建游标

+

CURSOR

+

移动游标

+

MOVE

+

从游标中提取数据

+

FETCH

+

关闭游标

+

CLOSE

+
+ diff --git a/content/zh/docs/Developerguide/DEALLOCATE.md b/content/zh/docs/Developerguide/DEALLOCATE.md new file mode 100644 index 000000000..e531aad03 --- /dev/null +++ b/content/zh/docs/Developerguide/DEALLOCATE.md @@ -0,0 +1,33 @@ +# DEALLOCATE + +## 功能描述 + +DEALLOCATE用于删除前面编写的预备语句。如果用户没有明确删除一个预备语句,那么它将在会话结束的时候被删除。 + +PREPARE关键字总被忽略。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +DEALLOCATE [ PREPARE ] { name | ALL }; +``` + +## 参数说明 + +- **name** + + 将要删除的预备语句。 + +- **ALL** + + 删除所有预备语句。 + + +## 示例 + +无。 + diff --git a/content/zh/docs/Developerguide/DECLARE.md b/content/zh/docs/Developerguide/DECLARE.md new file mode 100644 index 000000000..4d94638a5 --- /dev/null +++ b/content/zh/docs/Developerguide/DECLARE.md @@ -0,0 +1,91 @@ +# DECLARE + +## 功能描述 + +DECLARE命令既可以定义一个游标,用于在一个大的查询里面检索少数几行数据,也可以作为一个匿名块的开始。 + +本节主要描述定义为游标的用法,定义为匿名块的用法见[BEGIN](BEGIN.md)。 + +为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 + +通常游标和SELECT一样返回文本格式。因为数据在系统内部是用二进制格式存储的,系统必须对数据做一定转换以生成文本格式。一旦数据是以文本形式返回,客户端应用需要把它们转换成二进制进行操作。使用FETCH语句,游标可以返回文本或二进制格式。 + +## 注意事项 + +- 游标命令只能在事务块里使用。 +- 应该小心使用二进制游标。文本格式一般都比对应的二进制格式占用的存储空间大。二进制游标返回内部二进制形态的数据,可能更易于操作。如果想以文本方式显示数据,则以文本方式检索会为用户节约很多客户端的工作。比如,如果查询从某个整数列返回1,在缺省的游标里将获得一个字符串1,但在二进制游标里将得到一个4字节的包含该数值内部形式的数值(大端顺序)。 + +## 语法格式 + +- 定义游标 + + ``` + DECLARE cursor_name [ BINARY ] [ NO SCROLL ] + CURSOR [ { WITH | WITHOUT } HOLD ] FOR query ; + ``` + +- 开启匿名块 + + ``` + [DECLARE [declare_statements]] + BEGIN + execution_statements + END; + / + ``` + + +## 参数说明 + +- **cursor\_name** + + 将要创建的游标名。 + + 取值范围:遵循数据库对象命名规范。 + +- **BINARY** + + 指明游标以二进制而不是文本格式返回数据。 + +- **NO SCROLL** + + 声明游标检索数据行的方式。 + + - NO SCROLL:声明该游标不能用于以倒序的方式检索数据行。 + - 未声明:根据执行计划的不同,自动判断该游标是否可以用于以倒序的方式检索数据行。 + +- **WITH HOLD** + + **WITHOUT HOLD** + + 声明当创建游标的事务结束后,游标是否能继续使用。 + + - WITH HOLD:声明该游标在创建它的事务结束后仍可继续使用。 + - WITHOUT HOLD:声明该游标在创建它的事务之外不能再继续使用,此游标将在事务结束时被自动关闭。 + - 如果不指定WITH HOLD或WITHOUT HOLD,默认行为是WITHOUT HOLD。 + +- **query** + + 使用SELECT或VALUES子句指定游标返回的行。 + + 取值范围:SELECT或VALUES子句。 + +- **declare\_statements** + + 声明变量,包括变量名和变量类型,如“sales\_cnt int”。 + +- **execution\_statements** + + 匿名块中要执行的语句。 + + 取值范围:已存在的函数名称。 + + +## 示例 + +定义游标示例请参考FETCH的[示例](FETCH.md#zh-cn_topic_0237122165_zh-cn_topic_0059778422_s1ee72832a27547e4949061a010e24578)。 + +## 相关链接 + +[BEGIN](BEGIN.md),[FETCH](FETCH.md) + diff --git a/content/zh/docs/Developerguide/DELETE.md b/content/zh/docs/Developerguide/DELETE.md new file mode 100644 index 000000000..b342c53ad --- /dev/null +++ b/content/zh/docs/Developerguide/DELETE.md @@ -0,0 +1,106 @@ +# DELETE + +## 功能描述 + +DELETE从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。 + +## 注意事项 + +- 要删除表中的数据,用户必须对它有DELETE权限。同样也必须有USING子句引用的表以及condition上读取的表的SELECT权限。 +- 对于行存复制表,仅支持有主键约束场景下的delete操作。 +- 对于列存表,暂时不支持RETURNING子句。 + +## 语法格式 + +``` +[ WITH [ RECURSIVE ] with_query [, ...] ] +DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ] + [ USING using_list ] + [ WHERE condition | WHERE CURRENT OF cursor_name ] + [ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ]; +``` + +## 参数说明 + +- **WITH \[ RECURSIVE \] with\_query \[, ...\]** + + 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 + + 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 + + 其中with\_query的详细格式为: + + with\_query\_name \[ \( column\_name \[, ...\] \) \] AS + + \( \{select | values | insert | update | delete\} \) + + – with\_query\_name指定子查询生成的结果集名称,在查询中可使用该名称访问 + + 子查询的结果集。 + + – column\_name指定子查询结果集中显示的列名。 + + – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 + +- **ONLY** + + 如果指定ONLY则只有该表被删除;如果没有声明,则该表和它的所有子表将都被删除。 + +- **table\_name** + + 目标表的名称(可以有模式修饰)。 + + 取值范围:已存在的表名。 + +- **alias** + + 目标表的别名。 + + 取值范围:字符串,符合标识符命名规范。 + +- **using\_list** + + using子句。 + +- **condition** + + 一个返回Boolean值的表达式,用于判断哪些行需要被删除。 + +- **WHERE CURRENT OF cursor\_name** + + 当前不支持,仅保留语法接口。 + +- **output\_expr** + + DELETE命令删除行之后计算输出结果的表达式。该表达式可以使用表的任意字段。可以使用\*返回被删除行的所有字段。 + +- **output\_name** + + 一个字段的输出名称。 + + 取值范围:字符串,符合标识符命名规范。 + + +## 示例 + +``` +--创建表tpcds.customer_address_bak。 +postgres=# CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address; + +--删除tpcds.customer_address_bak中ca_address_sk小于14888的职员。 +postgres=# DELETE FROM tpcds.customer_address_bak WHERE ca_address_sk < 14888; + +--删除tpcds.customer_address_bak中所有数据。 +postgres=# DELETE FROM tpcds.customer_address_bak; + +--删除tpcds.customer_address_bak表。 +postgres=# DROP TABLE tpcds.customer_address_bak; +``` + +## 优化建议 + +- delete + + 如果要删除表中的所有记录,建议使用truncate语法。 + + 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" new file mode 100644 index 000000000..59e4009f8 --- /dev/null +++ "b/content/zh/docs/Developerguide/DML\350\257\255\346\263\225\344\270\200\350\247\210\350\241\250.md" @@ -0,0 +1,60 @@ +# DML语法一览表 + +DML(Data Manipulation Language数据操作语言),用于对数据库表中的数据进行操作。如:插入、更新、查询、删除。 + +## 插入数据 + +插入数据是往数据库表中添加一条或多条记录,请参考[INSERT](INSERT.md)。 + +## 修改数据 + +修改数据是修改数据库表中的一条或多条记录,请参考[UPDATE](UPDATE.md)。 + +## 查询数据 + +数据库查询语句SELECT是用于在数据库中检索适合条件的信息,请参考[SELECT](SELECT.md)。 + +## 删除数据 + +openGauss提供了两种删除表数据的语句:删除表中指定条件的数据,请参考[DELETE](DELETE.md);或删除表的所有数据,请参考[TRUNCATE](TRUNCATE.md#ZH-CN_TOPIC_0242370657)。 + +TRUNCATE快速地从表中删除所有行,它和在每个表上进行无条件的DELETE有同样的效果,不过因为它不做表扫描,因而快得多。在大表上最有用。 + +## 拷贝数据 + +openGauss提供了在表和文件之间拷贝数据的语句,请参考[COPY](COPY.md)。 + +## 锁定表 + +openGauss提供了多种锁模式用于控制对表中数据的并发访问,请参考[LOCK](LOCK.md#ZH-CN_TOPIC_0242370632)。 + +## 调用函数 + +openGauss提供了三个用于调用函数的语句,它们在语法结构上没有差别,请参考[CALL](CALL.md)。 + +## 操作会话 + +用户与数据库之间建立的连接称为会话,请参考[表1](#zh-cn_topic_0237122050_zh-cn_topic_0059777960_t320d7e04ba33427cbe2132b994ef6cb2)。 + +**表 1** 会话相关SQL + + + + + + + + + + + + + +

功能

+

相关SQL

+

修改会话

+

ALTER SESSION

+

结束会话

+

ALTER SYSTEM KILL SESSION

+
+ diff --git a/content/zh/docs/Developerguide/DO.md b/content/zh/docs/Developerguide/DO.md new file mode 100644 index 000000000..378cc6101 --- /dev/null +++ b/content/zh/docs/Developerguide/DO.md @@ -0,0 +1,51 @@ +# DO + +## 功能描述 + +执行匿名代码块。 + +代码块被看做是没有参数的一段函数体,返回值类型是void。它的解析和执行是同一时刻发生的。 + +## 注意事项 + +- 程序语言在使用之前,必须通过命令CREATE LANGUAGE安装到当前的数据库中。 plpgsql是默认的安装语言,其它语言安装时必须指定。 +- 如果语言是不受信任的,用户必须有使用程序语言的USAGE权限,或者是系统管理员。 + +## 语法格式 + +``` +DO [ LANGUAGE lang_name ] code; +``` + +## 参数说明 + +- **lang\_name** + + 用来解析代码的程序语言的名称,如果缺省,默认的语言是plpgsql。 + +- **code** + + 程序语言代码可以被执行的。程序语言必须指定为字符串才行。 + + +## 示例 + +``` +--创建用户webuser。 +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 + 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'; + END LOOP; +END$$; + + +--删除用户webuser。 +postgres=# DROP USER webuser CASCADE; +``` + diff --git a/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md b/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md new file mode 100644 index 000000000..24e55812a --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-DATA-SOURCE.md @@ -0,0 +1,51 @@ +# DROP DATA SOURCE + +## **功能描述** + +删除一个Data Source对象。 + +## **注意事项** + +只有属主/系统管理员/初始用户才可以删除一个Data Source对象。 + +## **语法格式** + +``` +DROP DATA SOURCE [IF EXISTS] src_name [CASCADE | RESTRICT]; +``` + +## **参数说明** + +- **src\_name** + + 待删除的Data Source对象名称。 + + 取值范围:字符串,符合标识符命名规范。 + +- **IF EXISTS** + + 如果指定的Data Source不存在,则发出一个notice而不是报错。 + +- **CASCADE | RESTRICT** + - **CASCADE**:表示允许级联删除依赖于Data Source的对象 + - **RESTRICT**(缺省值):表示有依赖于该Data Source的对象存在,则该Data Source无法删除。 + + 目前Data Source对象没有被依赖的对象,CASCADE和RESTRICT效果一样,保留此选项是为了向后兼容性。 + + + +## **示例** + +``` +--创建Data Source对象。 +postgres=# CREATE DATA SOURCE ds_tst1; + +--删除Data Source对象。 +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) + diff --git a/content/zh/docs/Developerguide/DROP-DATABASE.md b/content/zh/docs/Developerguide/DROP-DATABASE.md new file mode 100644 index 000000000..5465771c7 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-DATABASE.md @@ -0,0 +1,52 @@ +# DROP DATABASE + +## 功能描述 + +删除一个数据库。 + +## 注意事项 + +- 只有数据库所有者有权限执行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) **须知:** +>DROP DATABASE一旦执行将无法撤销,请谨慎使用。 + +## 语法格式 + +``` +DROP DATABASE [ IF EXISTS ] database_name ; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的数据库不存在,则发出一个notice而不是抛出一个错误。 + +- **database\_name** + + 要删除的数据库名称。 + + 取值范围:字符串,已存在的数据库名称。 + + +## 示例 + +请参见CREATE DATABASE的[示例](CREATE-DATABASE.md#zh-cn_topic_0237122099_zh-cn_topic_0059778277_s6be7b8abbb4b4aceb9dae686434d672c)。 + +## 相关链接 + +[CREATE DATABASE](CREATE-DATABASE.md) + +## 优化建议 + +- drop database + + 不支持在事务中删除database。 + + diff --git a/content/zh/docs/Developerguide/DROP-DIRECTORY.md b/content/zh/docs/Developerguide/DROP-DIRECTORY.md new file mode 100644 index 000000000..498d82f84 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-DIRECTORY.md @@ -0,0 +1,39 @@ +# DROP DIRECTORY + +## 功能描述 + +删除指定的directory表项。 + +## 注意事项 + +默认只有初始化用户可以执行drop操作,当enable\_access\_server\_directory开启时(可参考[enable\_access\_server\_directory](操作审计.md#zh-cn_topic_0237124747_section4279164545515)),sysadmin权限的用户也可以执行drop操作。 + +## 语法格式 + +``` +DROP DIRECTORY [ IF EXISTS ] directory_name; +``` + +## 参数说明 + +- **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) + diff --git a/content/zh/docs/Developerguide/DROP-FUNCTION.md b/content/zh/docs/Developerguide/DROP-FUNCTION.md new file mode 100644 index 000000000..4bdd02032 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-FUNCTION.md @@ -0,0 +1,54 @@ +# DROP FUNCTION + +## 功能描述 + +删除一个已存在的函数。 + +## 注意事项 + +如果函数中涉及对临时表相关操作,则无法使用DROP FUNCTION删除函数。 + +## 语法格式 + +``` +DROP FUNCTION [ IF EXISTS ] function_name +[ ( [ {[ argmode ] [ argname ] argtype} [, ...] ] ) [ CASCADE | RESTRICT ] ]; +``` + +## 参数说明 + +- **IF EXISTS** + + IF EXISTS表示,如果函数存在则执行删除操作,函数不存在也不会报错,只是发出一个notice。 + +- **function\_name** + + 要删除的函数名称。 + + 取值范围:已存在的函数名。 + +- **argmode** + + 函数参数的模式。 + +- **argname** + + 函数参数的名称。 + +- **argtype** + + 函数参数的类型 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除依赖于函数的对象(比如操作符) 。 + - RESTRICT:如果有任何依赖对象存在,则拒绝删除该函数(缺省行为)。 + + +## 示例 + +请参见CREATE FUNCTION的[SQL参考](SQL参考.md)。 + +## 相关链接 + +[ALTER FUNCTION](ALTER-FUNCTION.md),[CREATE FUNCTION](CREATE-FUNCTION.md) + diff --git a/content/zh/docs/Developerguide/DROP-GROUP.md b/content/zh/docs/Developerguide/DROP-GROUP.md new file mode 100644 index 000000000..97d02cf9a --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-GROUP.md @@ -0,0 +1,26 @@ +# DROP GROUP + +## 功能描述 + +删除用户组。 + +DROP GROUP是DROP ROLE的别名。 + +## 注意事项 + +DROP GROUP是openGauss管理工具封装的内部接口,用来实现openGauss管理。该接口不建议用户直接使用,以免对openGauss状态造成影响。 + +## 语法格式 + +``` +DROP GROUP [ IF EXISTS ] group_name [, ...]; +``` + +## 参数说明 + +请参见DROP ROLE的[参数说明](DROP-ROLE.md#zh-cn_topic_0237122147_zh-cn_topic_0059778848_sabe550f7ed48409b8ffd1d88ca9f0725)。 + +## 相关链接 + +[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) + diff --git a/content/zh/docs/Developerguide/DROP-INDEX.md b/content/zh/docs/Developerguide/DROP-INDEX.md new file mode 100644 index 000000000..978df4b09 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-INDEX.md @@ -0,0 +1,50 @@ +# DROP INDEX + +## 功能描述 + +删除索引。 + +## 注意事项 + +只有索引的所有者有权限执行DROP INDEX命令,系统管理员默认拥有此权限。 + +## 语法格式 + +``` +DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] + index_name [, ...] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **CONCURRENTLY** + + 以不加锁的方式删除索引。删除索引时,一般会阻塞其他语句对该索引所依赖表的访问。加此关键字,可实现删除过程中不做阻塞。 + + 此选项只能指定一个索引的名称, 并且CASCADE选项不支持。 + + 普通DROP INDEX命令可以在事务内执行,但是DROP INDEX CONCURRENTLY不可以在事务内执行。 + +- **IF EXISTS** + + 如果指定的索引不存在,则发出一个notice而不是抛出一个错误。 + +- **index\_name** + + 要删除的索引名。 + + 取值范围:已存在的索引。 + +- **CASCADE | RESTRICT** + - CASCADE:表示允许级联删除依赖于该索引的对象。 + - RESTRICT(缺省值):表示有依赖与此索引的对象存在,则该索引无法被删除。 + + +## 示例 + +请参见CREATE INDEX的[示例](CREATE-INDEX.md#zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362)。 + +## 相关链接 + +[ALTER INDEX](ALTER-INDEX.md#ZH-CN_TOPIC_0242370527),[CREATE INDEX](CREATE-INDEX.md) + diff --git a/content/zh/docs/Developerguide/DROP-OWNED.md b/content/zh/docs/Developerguide/DROP-OWNED.md new file mode 100644 index 000000000..a60d4f92f --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-OWNED.md @@ -0,0 +1,34 @@ +# DROP OWNED + +## 功能描述 + +删除一个数据库角色所拥有的数据库对象。 + +## 注意事项 + +- 所有该角色在当前数据库里和共享对象(数据库,表空间) 上的所有对象上的权限都将被撤销。 +- DROP OWNED常常被用来为移除一个或者多个角色做准备。因为DROP OWNED只影响当前数据库中的对象,通常需要在包含将被移除角色所拥有的对象的每一个数据库中都执行这个命令。 +- 使用CASCADE选项可能导致这个命令递归去删除由其他用户所拥有的对象。 +- 角色所拥有的数据库、表空间将不会被移除。 + +## 语法格式 + +``` +DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **name** + + 角色名。 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除所有依赖于被删除对象的对象。 + - RESTRICT(缺省值):拒绝删除那些有任何依赖对象存在的对象。 + + +## 相关链接 + +[REASSIGN OWNED](REASSIGN-OWNED.md#ZH-CN_TOPIC_0242370637) , [DROP ROLE](DROP-ROLE.md#ZH-CN_TOPIC_0242370611) + diff --git a/content/zh/docs/Developerguide/DROP-PROCEDURE.md b/content/zh/docs/Developerguide/DROP-PROCEDURE.md new file mode 100644 index 000000000..39f610116 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-PROCEDURE.md @@ -0,0 +1,33 @@ +# DROP PROCEDURE + +## 功能描述 + +删除已存在的存储过程。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +DROP PROCEDURE [ IF EXISTS ] procedure_name ; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的存储过程不存在,发出一个notice而不是抛出一个错误。 + +- **procedure\_name** + + 要删除的存储过程名称。 + + 取值范围:已存在的存储过程名。 + + +## 相关链接 + +[CREATE PROCEDURE](CREATE-PROCEDURE.md) + diff --git a/content/zh/docs/Developerguide/DROP-ROLE.md b/content/zh/docs/Developerguide/DROP-ROLE.md new file mode 100644 index 000000000..7d92f25bc --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-ROLE.md @@ -0,0 +1,37 @@ +# DROP ROLE + +## 功能描述 + +删除指定的角色。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +DROP ROLE [ IF EXISTS ] role_name [, ...]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的角色不存在,则发出一个notice而不是抛出一个错误。 + +- **role\_name** + + 要删除的角色名称。 + + 取值范围:已存在的角色。 + + +## 示例 + +请参见CREATE ROLE的[示例](CREATE-ROLE.md#zh-cn_topic_0237122112_zh-cn_topic_0059778189_s0dea2f90b8474387aff0ab3f366a611e)。 + +## 相关链接 + +[CREATE ROLE](CREATE-ROLE.md),[ALTER ROLE](ALTER-ROLE.md#ZH-CN_TOPIC_0242370532),[SET ROLE](SET-ROLE.md#ZH-CN_TOPIC_0242370652) + diff --git a/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md b/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md new file mode 100644 index 000000000..5bcd44c5a --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-ROW-LEVEL-SECURITY-POLICY.md @@ -0,0 +1,53 @@ +# DROP ROW LEVEL SECURITY POLICY + +## 功能描述 + +删除表上某个行访问控制策略。 + +## 注意事项 + +仅表的所有者或者管理员用户才能删除表的行访问控制策略。 + +## 语法格式 + +``` +DROP [ ROW LEVEL SECURITY ] POLICY [ IF EXISTS ] policy_name ON table_name [ CASCADE | RESTRICT ] +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的行访问控制策略不存在,发出一个notice而不是抛出一个错误。 + +- **policy\_name** + + 要删除的行访问控制策略的名称。 + + - table\_name + + 行访问控制策略所在的数据表名。 + + - CASCADE/RESTRICT + + 仅适配此语法,无对象依赖于该行访问控制策略,CASCADE和RESTRICT效果相同。 + + + +## 示例 + +``` +--创建数据表all_data +postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100)); + +--创建行访问控制策略 +postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER); + +--删除行访问控制策略 +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) + diff --git a/content/zh/docs/Developerguide/DROP-SCHEMA.md b/content/zh/docs/Developerguide/DROP-SCHEMA.md new file mode 100644 index 000000000..3d4549f00 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-SCHEMA.md @@ -0,0 +1,47 @@ +# DROP SCHEMA + +## 功能描述 + +从数据库中删除模式。 + +## 注意事项 + +只有模式的所有者有权限执行DROP SCHEMA命令,系统管理员默认拥有此权限。 + +## 语法格式 + +``` +DROP SCHEMA [ IF EXISTS ] schema_name [, ...] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的模式不存在,发出一个notice而不是抛出一个错误。 + +- **schema\_name** + + 模式的名称。 + + 取值范围:已存在模式名。 + +- **CASCADE | RESTRICT** + - CASCADE:自动删除包含在模式中的对象。 + - RESTRICT:如果模式包含任何对象,则删除失败(缺省行为)。 + + +>![](public_sys-resources/icon-notice.gif) **须知:** +>不要随意删除pg\_temp或pg\_toast\_temp开头的模式,这些模式是系统内部使用的,如果删除,可能导致无法预知的结果。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>无法删除当前模式。如果要删除当前模式,须切换到其他模式下。 + +## 示例 + +请参见CREATE SCHEMA的[示例](CREATE-SCHEMA.md#zh-cn_topic_0237122113_zh-cn_topic_0059777945_s05e72232af5e4507aad1511c025d7617)。 + +## 相关链接 + +[ALTER SCHEMA](ALTER-SCHEMA.md#ZH-CN_TOPIC_0242370534),[CREATE SCHEMA](CREATE-SCHEMA.md#ZH-CN_TOPIC_0242370577)。 + diff --git a/content/zh/docs/Developerguide/DROP-SEQUENCE.md b/content/zh/docs/Developerguide/DROP-SEQUENCE.md new file mode 100644 index 000000000..2e8beb3ae --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-SEQUENCE.md @@ -0,0 +1,49 @@ +# DROP SEQUENCE + +## 功能描述 + +从当前数据库里删除序列。 + +## 注意事项 + +只有序列的所有者或者系统管理员才能删除。 + +## 语法格式 + +``` +DROP SEQUENCE [ IF EXISTS ] {[schema.]sequence_name} [ , ... ] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的序列不存在,则发出一个notice而不是抛出一个错误。 + +- **name** + + 序列名称。 + +- **CASCADE** + + 级联删除依赖序列的对象。 + +- **RESTRICT** + + 如果存在任何依赖的对象,则拒绝删除序列。此项是缺省值。 + + +## 示例 + +``` +--创建一个名为serial的递增序列,从101开始。 +postgres=# CREATE SEQUENCE serial START 101; + +--删除序列。 +postgres=# DROP SEQUENCE serial; +``` + +## 相关链接 + +[ALTER SEQUENCE](ALTER-SEQUENCE.md#ZH-CN_TOPIC_0242370535), [DROP SEQUENCE](DROP-SEQUENCE.md#ZH-CN_TOPIC_0242370613) + diff --git a/content/zh/docs/Developerguide/DROP-TABLE.md b/content/zh/docs/Developerguide/DROP-TABLE.md new file mode 100644 index 000000000..b2979d014 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-TABLE.md @@ -0,0 +1,44 @@ +# DROP TABLE + +## 功能描述 + +删除指定的表。 + +## 注意事项 + +DROP TABLE会强制删除指定的表,删除表后,依赖该表的索引会被删除,而使用到该表的函数和存储过程将无法执行。删除分区表,会同时删除分区表中的所有分区。 + +## 语法格式 + +``` +DROP TABLE [ IF EXISTS ] + { [schema.]table_name } [, ...] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的表不存在,则发出一个notice而不是抛出一个错误。 + +- **schema** + + 模式名称。 + +- **table\_name** + + 表名称。 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除依赖于表的对象(比如视图)。 + - RESTRICT(缺省项):如果存在依赖对象,则拒绝删除该表。这个是缺省。 + + +## 示例 + +请参考CREATE TABLE的[示例](CREATE-TABLE.md#zh-cn_topic_0237122117_zh-cn_topic_0059778169_s86758dcf05d442d2a9ebd272e76ed1b8)。 + +## 相关链接 + +[ALTER TABLE](ALTER-TABLE.md),[CREATE TABLE](CREATE-TABLE.md) + diff --git a/content/zh/docs/Developerguide/DROP-TABLESPACE.md b/content/zh/docs/Developerguide/DROP-TABLESPACE.md new file mode 100644 index 000000000..3e10c736a --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-TABLESPACE.md @@ -0,0 +1,48 @@ +# DROP TABLESPACE + +## 功能描述 + +删除一个表空间。 + +## 注意事项 + +- 只有表空间所有者有权限执行DROP TABLESPACE命令,系统管理员默认拥有此权限。 +- 在删除一个表空间之前,表空间里面不能有任何数据库对象,否则会报错。 +- DROP TABLESPACE不支持回滚,因此,不能出现在事务块内部。 +- 执行DROP TABLESPACE操作时,如果有另外的会话执行\\db查询操作,可能会由于tablespace事务的原因导致查询失败,请重新执行\\db查询操作。 +- 如果执行DROP TABLESPACE失败,需要再次执行一次DROP TABLESPACE IF EXISTS。 + +## 语法格式 + +``` +DROP TABLESPACE [ IF EXISTS ] tablespace_name; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的表空间不存在,则发出一个notice而不是抛出一个错误。 + +- **tablespace\_name** + + 表空间的名称。 + + 取值范围:已存在的表空间的名称。 + + +## 示例 + +请参见CREATE TABLESPACE的[示例](CREATE-TABLESPACE.md#zh-cn_topic_0237122120_zh-cn_topic_0059777670_s4e5e97caa377440d87fad0d49b56323e)。 + +## 相关链接 + +[ALTER TABLESPACE](ALTER-TABLESPACE.md#ZH-CN_TOPIC_0242370542), [CREATE TABLESPACE](CREATE-TABLESPACE.md) + +## 优化建议 + +- drop database + + 不支持在事务中删除database。 + + diff --git a/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md new file mode 100644 index 000000000..bbf486636 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-CONFIGURATION.md @@ -0,0 +1,43 @@ +# DROP TEXT SEARCH CONFIGURATION + +## 功能描述 + +删除已有文本搜索配置。 + +## 注意事项 + +要执行这个命令,用户必须是该配置的所有者。 + +## 语法格式 + +``` +DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的文本搜索配置不存在,那么发出一个notice而不是抛出一个错误。 + +- **name** + + 要删除的文本搜索配置名称(可有模式修饰)。 + +- **CASCADE** + + 级联删除依赖文本搜索配置的对象。 + +- **RESTRICT** + + 若有任何对象依赖文本搜索配置则拒绝删除它。这是默认情况。 + + +## 示例 + +请参见CREATE TEXT SEARCH CONFIGURATION的[示例](CREATE-TEXT-SEARCH-CONFIGURATION.md#zh-cn_topic_0237122121_zh-cn_topic_0059777835_sc3a4aef5c0c0420eaf5a2e67097004a2)。 + +## 相关链接 + +[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) + diff --git a/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md new file mode 100644 index 000000000..504a568b3 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-TEXT-SEARCH-DICTIONARY.md @@ -0,0 +1,52 @@ +# DROP TEXT SEARCH DICTIONARY + +## 功能描述 + +删除全文检索词典。 + +## 注意事项 + +- 预定义词典不支持DROP操作。 +- 只有词典的所有者可以执行DROP操作,系统管理员默认拥有此权限。 +- 谨慎执行DROP...CASCADE操作,该操作将级联删除使用该词典的文本搜索配置(TEXT SEARCH CONFIGURATION)。 + +## 语法格式 + +``` +DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name [ CASCADE | RESTRICT ] +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的全文检索词典不存在,那么发出一个Notice而不是报错。 + +- **name** + + 要删除的词典名称(可指定模式名,否则默认在当前模式下)。 + + 取值范围:已存在的词典名。 + +- **CASCADE** + + 自动删除依赖于该词典的对象,并依次删除依赖于这些对象的所有对象。 + + 如果存在任何一个使用该词典的文本搜索配置,此DROP命令将不会成功。可添加CASCADE以删除引用该词典的所有文本搜索配置以及词典。 + +- **RESTRICT** + + 如果任何对象依赖词典,则拒绝删除该词典。这是缺省值。 + + +## 示例 + +``` +--删除词典english +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) + diff --git a/content/zh/docs/Developerguide/DROP-TRIGGER.md b/content/zh/docs/Developerguide/DROP-TRIGGER.md new file mode 100644 index 000000000..770b536e4 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-TRIGGER.md @@ -0,0 +1,47 @@ +# DROP TRIGGER + +## 功能描述 + +删除触发器。 + +## 注意事项 + +只有触发器的所有者可以执行DROP TRIGGER操作,系统管理员默认拥有此权限。 + +## 语法格式 + +``` +DROP TRIGGER [ IF EXISTS ] trigger_name ON table_name [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的触发器不存在,则发出一个notice而不是抛出一个错误。 + +- **trigger\_name** + + 要删除的触发器名称。 + + 取值范围:已存在的触发器。 + +- **table\_name** + + 要删除的触发器所在的表名称。 + + 取值范围:已存在的含触发器的表。 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除依赖此触发器的对象。 + - RESTRICT:如果有依赖对象存在,则拒绝删除此触发器。此选项为缺省值。 + + +## 示例 + +请参见[CREATE TRIGGER](CREATE-TRIGGER.md)的示例。 + +## 相关链接 + +[CREATE TRIGGER](CREATE-TRIGGER.md),[ALTER TRIGGER](ALTER-TRIGGER.md#ZH-CN_TOPIC_0242370545),[ALTER TABLE](ALTER-TABLE.md) + diff --git a/content/zh/docs/Developerguide/DROP-TYPE.md b/content/zh/docs/Developerguide/DROP-TYPE.md new file mode 100644 index 000000000..3942fe79e --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-TYPE.md @@ -0,0 +1,39 @@ +# DROP TYPE + +## 功能描述 + +删除一个用户定义的数据类型。只有类型所有者才有删除权限。 + +## 语法格式 + +``` +DROP TYPE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ] +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的类型不存在,那么发出一个notice而不是抛出一个错误。 + +- **name** + + 要删除的类型名\(可以有模式修饰\)。 + +- **CASCADE** + + 级联删除依赖该类型的对象\(比如字段、函数、操作符等\) + + **RESTRICT** + + 如果有依赖对象,则拒绝删除该类型(缺省行为)。 + + +## 示例 + +请参考CREATE TYPE的[示例](CREATE-TYPE.md#zh-cn_topic_0237122124_zh-cn_topic_0059779377_s66a0b4a6a1df4ba4a116c6c565a0fe9d)。 + +## 相关链接 + +[CREATE TYPE](CREATE-TYPE.md#ZH-CN_TOPIC_0242370588),[CREATE TYPE](CREATE-TYPE.md#ZH-CN_TOPIC_0242370588) + diff --git a/content/zh/docs/Developerguide/DROP-USER.md b/content/zh/docs/Developerguide/DROP-USER.md new file mode 100644 index 000000000..2be27d000 --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-USER.md @@ -0,0 +1,54 @@ +# DROP USER + +## 功能描述 + +删除用户,同时会删除同名的schema。 + +## 注意事项 + +- 须使用CASCADE级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的进程被杀死。 +- 在openGauss中,存在一个配置参数enable\_kill\_query,此参数在配置文件postgresql.conf中。此参数影响级联删除用户对象的行为: + - 当参数enable\_kill\_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的进程,并删除用户。 + - 当参数enable\_kill\_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。 + +- 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即drop user不支持跨数据库进行级联删除。 +- 在多租户场景下,删除组用户时,业务用户也会同时被删除,如果指定CASCADE级联删除,那么删除业务用户时同时也指定CASCADE。如果在删除某个用户失败时,会报错,同时其他用户也无法成功删除。 +- 如果该用户被DATA SOURCE对象依赖时,无法直接级联删除该用户,需要手动删除对应的DATA SOURCE对象之后再删除该用户。 + +## 语法格式 + +``` +DROP USER [ IF EXISTS ] user_name [, ...] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的用户不存在,发出一个notice而不是抛出一个错误。 + +- **user\_name** + + 待删除的用户名。 + + 取值范围:已存在的用户名。 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除依赖用户的对象。 + - RESTRICT:如果用户还有任何依赖的对象,则拒绝删除该用户(缺省行为)。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >在openGauss中,存在一个配置参数enable\_kill\_query,此参数在配置文件postgresql.conf中。此参数影响级联删除用户对象的行为: + >- 当参数enable\_kill\_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的进程,并删除用户。 + >- 当参数enable\_kill\_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。 + + + +## 示例 + +请参考CREATE USER的[示例](CREATE-USER.md#zh-cn_topic_0237122125_zh-cn_topic_0059778166_sfbca773f5bcd4799b3ea668b3eb074fa)。 + +## 相关链接 + +[ALTER USER](ALTER-USER.md),[CREATE USER](CREATE-USER.md) + diff --git a/content/zh/docs/Developerguide/DROP-VIEW.md b/content/zh/docs/Developerguide/DROP-VIEW.md new file mode 100644 index 000000000..868ef177c --- /dev/null +++ b/content/zh/docs/Developerguide/DROP-VIEW.md @@ -0,0 +1,41 @@ +# DROP VIEW + +## 功能描述 + +数据库中强制删除已有的视图。 + +## 注意事项 + +只有视图的所有者有权限执行DROP VIEW的命令,系统管理员默认拥有此权限。 + +## 语法格式 + +``` +DROP VIEW [ IF EXISTS ] view_name [, ...] [ CASCADE | RESTRICT ]; +``` + +## 参数说明 + +- **IF EXISTS** + + 如果指定的视图不存在,则发出一个notice而不是抛出一个错误。 + +- **view\_name** + + 要删除的视图名称。 + + 取值范围:已存在的视图。 + +- **CASCADE | RESTRICT** + - CASCADE:级联删除依赖此视图的对象(比如其他视图)。 + - RESTRICT:如果有依赖对象存在,则拒绝删除此视图。此选项为缺省值。 + + +## 示例 + +请参见CREATE VIEW的[示例](CREATE-VIEW.md#zh-cn_topic_0237122126_zh-cn_topic_0059779377_s66a0b4a6a1df4ba4a116c6c565a0fe9d)。 + +## 相关链接 + +[ALTER VIEW](ALTER-VIEW.md#ZH-CN_TOPIC_0242370548),[CREATE VIEW](CREATE-VIEW.md#ZH-CN_TOPIC_0242370590) + diff --git a/content/zh/docs/Developerguide/Developerguide.md b/content/zh/docs/Developerguide/Developerguide.md new file mode 100644 index 000000000..a86c18eb2 --- /dev/null +++ b/content/zh/docs/Developerguide/Developerguide.md @@ -0,0 +1,55 @@ +# 开发者指南 + +## 概述 + +本文档介绍如何设计、创建、查询和维护数据库。包括SQL语句、存储过程、系统表和视图等。 + +## 读者对象 + +- 数据库管理员。 +- 应用程序设计或开发人员。 + +作为数据库管理员和应用程序开发人员,至少需要了解以下知识: +- 操作系统知识。 +- SQL语法。 + +## 符号约定 + +在本文中可能出现下列标志,它们所代表的含义如下。 + + + + + + + + + + + + + + + + + + + + + + +

符号

+

说明

+

+

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

+

+

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

+

+

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

+

+

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

+

“须知”不涉及人身伤害。

+

+

对正文中重点信息的补充说明。

+

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

+
diff --git a/content/zh/docs/Developerguide/EXECUTE.md b/content/zh/docs/Developerguide/EXECUTE.md new file mode 100644 index 000000000..2445ad18f --- /dev/null +++ b/content/zh/docs/Developerguide/EXECUTE.md @@ -0,0 +1,54 @@ +# EXECUTE + +## 功能描述 + +执行一个前面准备好的预备语句。因为一个预备语句只在会话的生命期里存在,那么预备语句必须是在当前会话的前些时候用PREPARE语句创建的。 + +## 注意事项 + +如果创建预备语句的PREPARE语句声明了一些参数,那么传递给EXECUTE语句的必须是一个兼容的参数集,否则就会生成一个错误。 + +## 语法格式 + +``` +EXECUTE name [ ( parameter [, ...] ) ]; +``` + +## 参数说明 + +- **name** + + 要执行的预备语句的名称。 + +- **parameter** + + 给预备语句的一个参数的具体数值。它必须是一个和生成与创建这个预备语句时指定参数的数据类型相兼容的值的表达式。 + + +## 示例 + +``` +--创建表reason。 +postgres=# CREATE TABLE tpcds.reason ( + CD_DEMO_SK INTEGER NOT NULL, + CD_GENDER character(16) , + CD_MARITAL_STATUS character(100) +) +; + +--插入数据。 +postgres=# INSERT INTO tpcds.reason VALUES(51, 'AAAAAAAADDAAAAAA', 'reason 51'); + +--创建表reason_t1。 +postgres=# CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason; + +--为一个INSERT语句创建一个预备语句然后执行它。 +postgres=# PREPARE insert_reason(integer,character(16),character(100)) AS INSERT INTO tpcds.reason_t1 VALUES($1,$2,$3); + +postgres=# EXECUTE insert_reason(52, 'AAAAAAAADDAAAAAA', 'reason 52'); + +--删除表reason和reason_t1。 +postgres=# DROP TABLE tpcds.reason; +postgres=# DROP TABLE tpcds.reason_t1; +``` + diff --git a/content/zh/docs/Developerguide/EXPLAIN-PLAN.md b/content/zh/docs/Developerguide/EXPLAIN-PLAN.md new file mode 100644 index 000000000..e0cd1b3af --- /dev/null +++ b/content/zh/docs/Developerguide/EXPLAIN-PLAN.md @@ -0,0 +1,79 @@ +# EXPLAIN PLAN + +## 功能描述 + +通过EXPLAIN PLAN命令可以将查询执行的计划信息存储于PLAN\_TABLE表中。与EXPLAIN命令不同的是,EXPLAIN PLAN仅将计划信息进行存储,而不会打印到屏幕。 + +## 语法格式 + +``` +EXPLAIN PLAN +[ SET STATEMENT_ID = string ] +FOR statement ; +``` + +## 参数说明 + +- EXPLAIN中的PLAN选项表示需要将计划信息存储于PLAN\_TABLE中,存储成功将返回“EXPLAIN SUCCESS”。 +- STATEMENT\_ID用户可以对查询设置标签,输入的标签信息也将存储于PLAN\_TABLE中。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >用户在执行EXPLAIN PLAN时,如果没有进行SET STATEMENT\_ID,则默认为空值。同时,用户可输入的STATEMENT\_ID最大长度为30个字节,超过长度将会产生报错。 + + +## 注意事项 + +- EXPLAIN PLAN不支持在数据库节点上执行。 +- 对于执行错误的SQL无法进行计划信息的收集。 +- PLAN\_TABLE中的数据是session级生命周期并且session隔离和用户隔离,用户只能看到当前session、当前用户的数据。 + +## 示例 1 + +使用EXPLAIN PLAN收集SQL语句的执行计划,通常包括以下步骤: + +1. 执行EXPLAN PLAN。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >执行EXPLAIN PLAN 后会将计划信息自动存储于PLAN\_TABLE中,不支持对PLAN\_TABLE进行INSERT、UPDATE、ANALYZE等操作。 + >PLAN\_TABLE详细介绍见[PLAN\_TABLE](PLAN_TABLE.md)。 + + ``` + explain plan set statement_id='TPCH-Q4' for + select + o_orderpriority, + count(*) as order_count + from + orders + where + o_orderdate >= '1993-07-01'::date + and o_orderdate < '1993-07-01'::date + interval '3 month' + and exists ( + select + * + from + lineitem + where + l_orderkey = o_orderkey + and l_commitdate < l_receiptdate + ) + group by + o_orderpriority + order by + o_orderpriority; + ``` + +2. 查询PLAN\_TABLE。 + + ``` + SELECT * FROM PLAN_TABLE; + ``` + + ![](figures/文档.png) + +3. 清理PLAN\_TABLE表中的数据。 + + ``` + DELETE FROM PLAN_TABLE WHERE xxx; + ``` + + diff --git a/content/zh/docs/Developerguide/EXPLAIN.md b/content/zh/docs/Developerguide/EXPLAIN.md new file mode 100644 index 000000000..eb251b028 --- /dev/null +++ b/content/zh/docs/Developerguide/EXPLAIN.md @@ -0,0 +1,247 @@ +# EXPLAIN + +## 功能描述 + +显示SQL语句的执行计划。 + +执行计划将显示SQL语句所引用的表会采用什么样的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示用到的JOIN算法。 + +执行计划的最关键的部分是语句的预计执行开销,这是计划生成器估算执行该语句将花费多长的时间。 + +若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器的估计是否接近现实非常有用。 + +## 注意事项 + +在指定ANALYZE选项时,语句会被执行。如果用户想使用EXPLAIN分析INSERT,UPDATE,DELETE,CREATE TABLE AS或EXECUTE语句,而不想改动数据(执行这些语句会影响数据),请使用这种方法: + +``` +START TRANSACTION; +EXPLAIN ANALYZE ...; +ROLLBACK; +``` + +## 语法格式 + +- 显示SQL语句的执行计划,支持多种选项,对选项顺序无要求。 + + ``` + EXPLAIN [ ( option [, ...] ) ] statement; + ``` + + 其中选项option子句的语法为。 + + ``` + ANALYZE [ boolean ] | + ANALYSE [ boolean ] | + VERBOSE [ boolean ] | + COSTS [ boolean ] | + CPU [ boolean ] | + DETAIL [ boolean ] | + NODES [ boolean ] | + NUM_NODES [ boolean ] | + BUFFERS [ boolean ] | + TIMING [ boolean ] | + PLAN [ boolean ] | + FORMAT { TEXT | XML | JSON | YAML } + ``` + +- 显示SQL语句的执行计划,且要按顺序给出选项。 + + ``` + EXPLAIN { [ { ANALYZE | ANALYSE } ] [ VERBOSE ] | PERFORMANCE } statement; + ``` + + +## 参数说明 + +- **statement** + + 指定要分析的SQL语句。 + +- **ANALYZE boolean | ANALYSE boolean** + + 显示实际运行时间和其他统计数据。 + + 取值范围: + + - TRUE(缺省值):显示实际运行时间和其他统计数据。 + - FALSE:不显示。 + +- **VERBOSE boolean** + + 显示有关计划的额外信息。 + + 取值范围: + + - TRUE(缺省值):显示额外信息。 + - FALSE:不显示。 + +- **COSTS boolean** + + 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 + + 取值范围: + + - TRUE(缺省值):显示估计总成本和宽度。 + - FALSE:不显示。 + +- **CPU boolean** + + 打印CPU的使用情况的信息。 + + 取值范围: + + - TRUE(缺省值):显示CPU的使用情况。 + - FALSE:不显示。 + +- **DETAIL boolean** + + 打印数据库节点上的信息。 + + 取值范围: + + - TRUE(缺省值):打印数据库节点的信息。 + - FALSE:不打印。 + +- **NODES boolean** + + 打印query执行的节点信息。 + + 取值范围: + + - TRUE(缺省值):打印执行的节点的信息。 + - FALSE:不打印。 + +- **NUM\_NODES boolean** + + 打印执行中的节点的个数信息。 + + 取值范围: + + - TRUE(缺省值):打印数据库节点个数的信息。 + - FALSE:不打印。 + +- **BUFFERS boolean** + + 包括缓冲区的使用情况的信息。 + + 取值范围: + + - TRUE:显示缓冲区的使用情况。 + - FALSE(缺省值):不显示。 + +- **TIMING boolean** + + 包括实际的启动时间和花费在输出节点上的时间信息。 + + 取值范围: + + - TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。 + - FALSE:不显示。 + +- **PLAN** + + 是否将执行计划存储在plan\_table中。当该选项开启时,会将执行计划存储在PLAN\_TABLE中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。 + + 取值范围: + + - ON(缺省值):将执行计划存储在plan\_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUCCESS。 + - OFF:不存储执行计划,将执行计划打印到当前屏幕。 + +- **FORMAT** + + 指定输出格式。 + + 取值范围:TEXT,XML,JSON和YAML。 + + 默认值:TEXT。 + +- **PERFORMANCE** + + 使用此选项时,即打印执行中的所有相关信息。 + + +## 示例 + +``` +--创建一个表tpcds.customer_address_p1。 +postgres=# CREATE TABLE tpcds.customer_address_p1 AS TABLE tpcds.customer_address; + +--修改explain_perf_mode为normal +postgres=# SET explain_perf_mode=normal; + +--显示表简单查询的执行计划。 +postgres=# EXPLAIN SELECT * FROM tpcds.customer_address_p1; +QUERY PLAN +-------------------------------------------------- +Data Node Scan (cost=0.00..0.00 rows=0 width=0) +Node/s: All dbnodes +(2 rows) + +--以JSON格式输出的执行计划(explain_perf_mode为normal时)。 +postgres=# EXPLAIN(FORMAT JSON) SELECT * FROM tpcds.customer_address_p1; + QUERY PLAN +-------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Data Node Scan",+ + "Startup Cost": 0.00, + + "Total Cost": 0.00, + + "Plan Rows": 0, + + "Plan Width": 0, + + "Node/s": "All dbnodes" + + } + + } + + ] +(1 row) + +--如果有一个索引,当使用一个带索引WHERE条件的查询,可能会显示一个不同的计划。 +postgres=# EXPLAIN SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000; +QUERY PLAN +-------------------------------------------------- +Data Node Scan (cost=0.00..0.00 rows=0 width=0) +Node/s: dn_6005_6006 +(2 rows) + +--以YAML格式输出的执行计划(explain_perf_mode为normal时)。 +postgres=# EXPLAIN(FORMAT YAML) SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000; + QUERY PLAN +--------------------------------- + - Plan: + + Node Type: "Data Node Scan"+ + Startup Cost: 0.00 + + Total Cost: 0.00 + + Plan Rows: 0 + + Plan Width: 0 + + Node/s: "dn_6005_6006" +(1 row) + +--禁止开销估计的执行计划。 +postgres=# EXPLAIN(COSTS FALSE)SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000; + QUERY PLAN +------------------------ + Data Node Scan + Node/s: dn_6005_6006 +(2 rows) + +--带有聚集函数查询的执行计划。 +postgres=# EXPLAIN SELECT SUM(ca_address_sk) FROM tpcds.customer_address_p1 WHERE ca_address_sk<10000; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate (cost=18.19..14.32 rows=1 width=4) + -> Streaming (type: GATHER) (cost=18.19..14.32 rows=3 width=4) + Node/s: All dbnodes + -> Aggregate (cost=14.19..14.20 rows=3 width=4) + -> Seq Scan on customer_address_p1 (cost=0.00..14.18 rows=10 width=4) + Filter: (ca_address_sk < 10000) +(6 rows) + +--删除表tpcds.customer_address_p1。 +postgres=# DROP TABLE tpcds.customer_address_p1; +``` + +## 相关链接 + +[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md) + diff --git a/content/zh/docs/Developerguide/FETCH.md b/content/zh/docs/Developerguide/FETCH.md new file mode 100644 index 000000000..02997374a --- /dev/null +++ b/content/zh/docs/Developerguide/FETCH.md @@ -0,0 +1,214 @@ +# FETCH + +## 功能描述 + +FETCH通过已创建的游标来检索数据。 + +每个游标都有一个供FETCH使用的关联位置。游标的关联位置可以在查询结果的第一行之前,或者在结果中的任意行,或者在结果的最后一行之后: + +- 游标刚创建完之后,关联位置在第一行之前的。 +- 在抓取了一些移动行之后,关联位置在检索到的最后一行上。 +- 如果FETCH抓取完了所有可用行,它就停在最后一行后面,或者在反向抓取的情况下是停在第一行前面。 +- FETCH ALL或FETCH BACKWARD ALL将总是把游标的关联位置放在最后一行或者在第一行前面。 + +## 注意事项 + +- 如果游标定义了NO SCROLL,则不允许使用例如FETCH BACKWARD之类的反向抓取。 +- NEXT,PRIOR,FIRST,LAST,ABSOLUTE,RELATIVE形式在恰当地移动游标之后抓取一条记录。如果后面没有数据行,就返回一个空的结果,此时游标就会停在查询结果的最后一行之后(向后查询时)或者第一行之前(向前查询时)。 +- FORWARD和BACKWARD形式在向前或者向后移动的过程中抓取指定的行数,然后把游标定位在最后返回的行上;或者是,如果count大于可用的行数,则在所有行之后(向后查询时)或者之前(向前查询时)。 +- RELATIVE 0,FORWARD 0,BACKWARD 0都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚抓取过的行。除非游标定位在第一行之前或者最后一行之后,这个动作都应该成功,而在那两种情况下,不返回任何行。 +- 当FETCH的游标上涉及列存表时,不支持BACKWARD、PRIOR、FIRST等涉及反向获取操作。 + +## 语法格式 + +``` +FETCH [ direction { FROM | IN } ] cursor_name; +``` + +其中direction子句为可选参数。 + +``` +NEXT + | PRIOR + | FIRST + | LAST + | ABSOLUTE count + | RELATIVE count + | count + | ALL + | FORWARD + | FORWARD count + | FORWARD ALL + | BACKWARD + | BACKWARD count + | BACKWARD ALL +``` + +## 参数说明 + +- **direction\_clause** + + 定义抓取数据的方向。 + + 取值范围: + + - NEXT(缺省值) + + 从当前关联位置开始,抓取下一行。 + + - PRIOR + + 从当前关联位置开始,抓取上一行。 + + - FIRST + + 抓取查询的第一行(和ABSOLUTE 1相同)。 + + - LAST + + 抓取查询的最后一行(和ABSOLUTE -1相同)。 + + - ABSOLUTE count + + 抓取查询中第count行。 + + ABSOLUTE抓取不会比用相对位移移动到需要的数据行更快,因为下层的实现必须遍历所有中间的行。 + + count取值范围:有符号的整数 + + - count为正数,就从查询结果的第一行开始,抓取第count行。当count小于当前游标位置时,涉及到rewind操作,暂不支持。 + - count为负数或0,涉及到反向扫描操作,暂不支持。 + + - RELATIVE count + + 从当前关联位置开始,抓取随后或前面的第count行。 + + 取值范围:有符号的整数 + + - count为正数就抓取当前关联位置之后的第count行。 + - count为负数,涉及到反向扫描操作,暂不支持。 + - 如果有数据的话,RELATIVE 0重新抓取当前行。 + + - count + + 抓取随后的count行(和FORWARD count一样)。 + + - ALL + + 从当前关联位置开始,抓取所有剩余的行(和FORWARD ALL一样)。 + + - FORWARD + + 抓取下一行(和NEXT一样)。 + + - FORWARD count + + 与RELATIVE count的效果相同,从当前关联位置开始,抓取随后或前面的第count行。 + + - FORWARD ALL + + 从当前关联位置开始,抓取所有剩余行。 + + - BACKWARD + + 从当前关联位置开始,抓取前面一行\(和PRIOR一样\) 。 + + - BACKWARD count + + 从当前关联位置开始,抓取前面的count行(向后扫描)。 + + 取值范围:有符号的整数 + + - count为正数就抓取当前关联位置之前的第count行。 + - count为负数就抓取当前关联位置之后的第abs(count)行。 + - 如果有数据的话,BACKWARD 0重新抓取当前行。 + + - BACKWARD ALL + + 从当前关联位置开始,抓取所有前面的行(向后扫描) 。 + + +- **\{ FROM | IN \} cursor\_name** + + 使用关键字FROM或IN指定游标名称。 + + 取值范围:已创建的游标的名称。 + + +## 示例 + +``` +--SELECT语句,用一个游标读取一个表。开始一个事务。 +postgres=# START TRANSACTION; + +--建立一个名为cursor1的游标。 +postgres=# CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1; + +--抓取头3行到游标cursor1里。 +postgres=# FETCH FORWARD 3 FROM cursor1; + ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_location_type +---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+---------------------- + 1 | AAAAAAAABAAAAAAA | 18 | Jackson | Parkway | Suite 280 | Fairfield | Maricopa County | AZ | 86192 | United States | -7.00 | condo + 2 | AAAAAAAACAAAAAAA | 362 | Washington 6th | RD | Suite 80 | Fairview | Taos County | NM | 85709 | United States | -7.00 | condo + 3 | AAAAAAAADAAAAAAA | 585 | Dogwood Washington | Circle | Suite Q | Pleasant Valley | York County | PA | 12477 | United States | -5.00 | single family +(3 rows) + +--关闭游标并提交事务。 +postgres=# CLOSE cursor1; + +--结束一个事务。 +postgres=# END; + +--VALUES子句,用一个游标读取VALUES子句中的内容。开始一个事务。 +postgres=# START TRANSACTION; + +--建立一个名为cursor2的游标。 +postgres=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1; + +--抓取头2行到游标cursor2里。 +postgres=# FETCH FORWARD 2 FROM cursor2; +column1 | column2 +---------+--------- +0 | 3 +1 | 2 +(2 rows) + +--关闭游标并提交事务。 +postgres=# CLOSE cursor2; + +--结束一个事务。 +postgres=# END; + +--WITH HOLD游标的使用,开启事务。 +postgres=# START TRANSACTION; + +--创建一个with hold游标。 +postgres=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM tpcds.customer_address ORDER BY 1; + +--抓取头2行到游标cursor1里。 +postgres=# FETCH FORWARD 2 FROM cursor1; + ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_location_type +---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+---------------------- + 1 | AAAAAAAABAAAAAAA | 18 | Jackson | Parkway | Suite 280 | Fairfield | Maricopa County | AZ | 86192 | United States | -7.00 | condo + 2 | AAAAAAAACAAAAAAA | 362 | Washington 6th | RD | Suite 80 | Fairview | Taos County | NM | 85709 | United States | -7.00 | condo +(2 rows) + +--结束事务。 +postgres=# END; + +--抓取下一行到游标cursor1里。 +postgres=# FETCH FORWARD 1 FROM cursor1; + ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_location_type +---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+---------------------- + 3 | AAAAAAAADAAAAAAA | 585 | Dogwood Washington | Circle | Suite Q | Pleasant Valley | York County | PA | 12477 | United States | -5.00 | single family +(1 row) + +--关闭游标。 +postgres=# CLOSE cursor1; + +``` + +## 相关链接 + +[CLOSE](CLOSE.md#ZH-CN_TOPIC_0242370555),[MOVE](MOVE.md#ZH-CN_TOPIC_0242370633) + diff --git a/content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md b/content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md new file mode 100644 index 000000000..646ea7dc5 --- /dev/null +++ b/content/zh/docs/Developerguide/GET_GTM_LITE_STATUS.md @@ -0,0 +1,32 @@ +# 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/GIN\346\217\220\347\244\272\344\270\216\346\212\200\345\267\247.md" "b/content/zh/docs/Developerguide/GIN\346\217\220\347\244\272\344\270\216\346\212\200\345\267\247.md" new file mode 100644 index 000000000..80ac64737 --- /dev/null +++ "b/content/zh/docs/Developerguide/GIN\346\217\220\347\244\272\344\270\216\346\212\200\345\267\247.md" @@ -0,0 +1,21 @@ +# GIN提示与技巧 + +创建vs插入 + +由于可能要为每个项目插入很多键,所以GIN索引的插入可能比较慢。对于向表中大量插入的操作,我们建议先删除GIN索引,在完成插入之后再重建索引。与GIN索引创建、查询性能相关的GUC参数如下: + +- maintenance\_work\_mem + + GIN索引的构建时间对maintenance\_work\_mem的设置非常敏感。 + +- work\_mem + + 往已有的启用了FASTUPDATE的GIN索引的插入操作期间,只要待处理实体列表的大小超过了work\_mem,系统就会清理这个列表。为了避免可观察到的响应时间的大起大落,让待处理实体列表在后台被清理是比较合适的(比如通过autovacuum)。前端清理操作可以通过增加work\_mem或者执行autovacuum来避免。然而,扩大work\_mem意味着如果发生了前端清理,那么他的执行时间将更长。 + +- gin\_fuzzy\_search\_limit + + 开发GIN索引的主要目的是为了让openGauss支持高度可伸缩的全文索引,并且常常会遇见全文索引返回海量结果的情形。而且,这经常发生在查询高频词的时候,因而这样的结果集没什么用处。因为从磁盘读取大量记录并对其进行排序会消耗大量资源,这在产品环境下是不能接受的。 + + 为了控制这种情况,GIN索引有一个可配置的返回结果行数上限的配置参数gin\_fuzzy\_search\_limit。缺省值0表示没有限制。如果设置了非零值,那么返回结果就是从完整结果集中随机选择的一部分。 + + diff --git "a/content/zh/docs/Developerguide/GIN\347\264\242\345\274\225.md" "b/content/zh/docs/Developerguide/GIN\347\264\242\345\274\225.md" new file mode 100644 index 000000000..9972b03d4 --- /dev/null +++ "b/content/zh/docs/Developerguide/GIN\347\264\242\345\274\225.md" @@ -0,0 +1,11 @@ +# GIN索引 + +- **[介绍](介绍-17.md)** + +- **[扩展性](扩展性.md)** + +- **[实现](实现.md)** + +- **[GIN提示与技巧](GIN提示与技巧.md)** + + diff --git a/content/zh/docs/Developerguide/GRANT.md b/content/zh/docs/Developerguide/GRANT.md new file mode 100644 index 000000000..c7852e2b2 --- /dev/null +++ b/content/zh/docs/Developerguide/GRANT.md @@ -0,0 +1,461 @@ +# GRANT + +## 功能描述 + +对角色和用户进行授权操作。 + +使用GRANT命令进行用户授权包括以下三种场景: + +- **将系统权限授权给角色或用户** + + 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。 + + 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 + +- **将数据库对象授权给角色或用户** + + 将数据库对象(表和视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户; + + GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。 + + 关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。 + + 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC,这是openGauss特有的属性。 + + openGauss会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。另外,这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。 + +- **将角色或用户的权限授权给其他角色或用户** + + 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 + + 当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。 + + 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。 + + +## 注意事项 + +无。 + +## 语法格式 + +- 将表或视图的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } [, ...] + | ALL [ PRIVILEGES ] } + ON { [ TABLE ] table_name [, ...] + | ALL TABLES IN SCHEMA schema_name [, ...] } + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + + ``` + +- 将表中字段的访问权限赋予指定的用户或角色。 + + ``` + GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )} [, ...] + | ALL [ PRIVILEGES ] ( column_name [, ...] ) } + ON [ TABLE ] table_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将数据库的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] + | ALL [ PRIVILEGES ] } + ON DATABASE database_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将域的访问权限赋予指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON DOMAIN domain_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >本版本暂时不支持赋予域的访问权限。 + +- 将外部数据源的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON FOREIGN DATA WRAPPER fdw_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将外部服务器的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON FOREIGN SERVER server_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将函数的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { EXECUTE | ALL [ PRIVILEGES ] } + ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] + | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将过程语言的访问权限赋予给指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON LANGUAGE lang_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ 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。 + +- 将大对象的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } + ON LARGE OBJECT loid [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >本版本暂时不支持大对象。 + +- 将模式的访问权限赋予指定的用户或角色。 + + ``` + GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } + ON SCHEMA schema_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名称,并不能实际进行对象访问。 + +- 将表空间的访问权限赋予指定的用户或角色。 + + ``` + GRANT { CREATE | ALL [ PRIVILEGES ] } + ON TABLESPACE tablespace_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + +- 将类型的访问权限赋予指定的用户或角色。 + + ``` + GRANT { USAGE | ALL [ PRIVILEGES ] } + ON TYPE type_name [, ...] + TO { [ GROUP ] role_name | PUBLIC } [, ...] + [ WITH GRANT OPTION ]; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >本版本暂时不支持赋予类型的访问权限。 + +- 将角色的权限赋予其他用户或角色的语法。 + + ``` + GRANT role_name [, ...] + TO role_name [, ...] + [ WITH ADMIN OPTION ]; + ``` + +- 将sysadmin权限赋予指定的角色。 + + ``` + GRANT ALL { PRIVILEGES | PRIVILEGE } + TO role_name; + ``` + + +- 将Data Source对象的权限赋予指定的角色。 + + ``` + GRANT {USAGE | ALL [PRIVILEGES]} + ON DATA SOURCE src_name [, ...] + TO {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION]; + ``` + + +- 将directory对象的权限赋予指定的角色。 + + ``` + GRANT {READ|WRITE| ALL [PRIVILEGES]} + ON DIRECTORY directory_name [, ...] + TO {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION]; + ``` + + +## 参数说明 + +GRANT的权限分类如下所示。 + +- **SELECT** + + 允许对指定的表、视图、序列执行SELECT语句。 + +- **INSERT** + + 允许对指定的表执行INSERT语句。 + +- **UPDATE** + + 允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 + +- **DELETE** + + 允许执行DELETE语句删除指定表中的数据。 + +- **TRUNCATE** + + 允许执行TRUNCATE语句删除指定表中的所有记录。 + +- **REFERENCES** + + 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。 + +- **CREATE** + - 对于数据库,允许在数据库里创建新的模式。 + - 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。 + - 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。 + +- **CONNECT** + + 允许用户连接到指定的数据库。 + +- **EXECUTE** + + 允许使用指定的函数,以及利用这些函数实现的操作符。 + +- **USAGE** + - 对于过程语言,允许用户在创建函数的时候指定过程语言。 + - 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。 + - 对于序列,USAGE允许使用nextval函数。 + - 对于Data Source对象,USAGE是指访问权限,也是可赋予的所有权限,即USAGE与ALL PRIVILEGES等价。 + +- **ALL PRIVILEGES** + + 一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。 + + +GRANT的参数说明如下所示。 + +- **role\_name** + + 已存在用户名称。 + +- **table\_name** + + 已存在表名称。 + +- **column\_name** + + 已存在字段名称。 + +- **schema\_name** + + 已存在模式名称。 + +- **database\_name** + + 已存在数据库名称。 + +- **funcation\_name** + + 已存在函数名称。 + +- **sequence\_name** + + 已存在序列名称。 + +- **domain\_name** + + 已存在域类型名称。 + +- **fdw\_name** + + 已存在外部数据包名称。 + +- **lang\_name** + + 已存在语言名称。 + +- **type\_name** + + 已存在类型名称。 + +- **src\_name** + + 已存在的Data Source对象名称。 + +- **argmode** + + 参数模式。 + + 取值范围:字符串,要符合标识符命名规范。 + +- **arg\_name** + + 参数名称。 + + 取值范围:字符串,要符合标识符命名规范。 + +- **arg\_type** + + 参数类型。 + + 取值范围:字符串,要符合标识符命名规范。 + +- **loid** + + 包含本页的大对象的标识符。 + + 取值范围:字符串,要符合标识符命名规范。 + +- **tablespace\_name** + + 表空间名称。 + +- **directory\_name** + + 目录名称。 + + 取值范围:字符串,要符合标识符命名规范。 + +- **WITH GRANT OPTION** + + 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >NODE GROUP不支持WITH GRANT OPTION功能。 + + +非对象所有者给其他用户授予对象权限时,命令按照以下规则执行: + +- 如果用户没有该对象上指定的权限,命令立即失败。 +- 如果用户有该对象上的部分权限,则GRANT命令只授予他有授权选项的权限。 +- 如果用户没有可用的授权选项,GRANT ALL PRIVILEGES形式将发出一个警告信息,其他命令形式将发出在命令中提到的且没有授权选项的相关警告信息。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>数据库系统管理员可以访问所有对象,而不会受对象的权限设置影响。这个特点类似Unix系统的root的权限。和root一样,除了必要的情况外,建议不要总是以系统管理员身份进行操作。 +>不允许对表分区进行GRANT操作,对分区表进行GRANT操作会引起告警。 +>针对NODE GROUP,普通用户不能执行GRANT/REVOKE操作。 + +## 示例 + +**示例:将系统权限授权给用户或者角色。** + +创建名为joe的用户,并将sysadmin权限授权给他。 + +``` +postgres=# CREATE USER joe PASSWORD 'Bigdata@123'; +postgres=# GRANT ALL PRIVILEGES TO joe; +``` + +授权成功后,用户joe会拥有sysadmin的所有权限。 + +**示例:将对象权限授权给用户或者角色**。 + +1. 撤销joe用户的sysadmin权限,然后将模式tpcds的使用权限和表tpcds.reason的所有权限授权给用户joe。 + + ``` + postgres=# REVOKE ALL PRIVILEGES FROM joe; + postgres=# GRANT USAGE ON SCHEMA tpcds TO joe; + postgres=# GRANT ALL PRIVILEGES ON tpcds.reason TO joe; + ``` + + 授权成功后,joe用户就拥有了tpcds.reason表的所有权限,包括增删改查等权限。 + +2. 将tpcds.reason表中r\_reason\_sk、r\_reason\_id、r\_reason\_desc列的查询权限,r\_reason\_desc的更新权限授权给joe。 + + ``` + postgres=# GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe; + ``` + + 授权成功后,用户joe对tpcds.reason表中r\_reason\_sk,r\_reason\_id的查询权限会立即生效。如果joe用户需要拥有将这些权限授权给其他用户的权限,可以通过以下语法对joe用户进行授权。 + + ``` + postgres=# GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe WITH GRANT OPTION; + ``` + + 将数据库postgres的连接权限授权给用户joe,并给予其在postgres中创建schema的权限,而且允许joe将此权限授权给其他用户。 + + ``` + postgres=# GRANT create,connect on database postgres TO joe WITH GRANT OPTION; + ``` + + 创建角色tpcds\_manager,将模式tpcds的访问权限授权给角色tpcds\_manager,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给其他人。 + + ``` + postgres=# CREATE ROLE tpcds_manager PASSWORD 'Bigdata@123'; + postgres=# GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager; + ``` + + 将表空间tpcds\_tbspc的所有权限授权给用户joe,但用户joe无法将权限继续授予其他用户。 + + ``` + postgres=# CREATE TABLESPACE tpcds_tbspc RELATIVE LOCATION 'tablespace/tablespace_1'; + postgres=# GRANT ALL ON TABLESPACE tpcds_tbspc TO joe; + ``` + + +**示例:将用户或者角色的权限授权给其他用户或角色。** + +1. 创建角色manager,将joe的权限授权给manager,并允许该角色将权限授权给其他人。 + + ``` + postgres=# CREATE ROLE manager PASSWORD 'Bigdata@123'; + postgres=# GRANT joe TO manager WITH ADMIN OPTION; + ``` + +2. 创建用户senior\_manager,将用户manager的权限授权给该用户。 + + ``` + postgres=# CREATE ROLE senior_manager PASSWORD 'Bigdata@123'; + postgres=# GRANT manager TO senior_manager; + ``` + +3. 撤销权限,并清理用户。 + + ``` + postgres=# REVOKE manager FROM joe; + postgres=# REVOKE senior_manager FROM manager; + postgres=# DROP USER manager; + ``` + + +**示例:撤销上述授予的权限,并清理角色和用户。** + +``` +postgres=# REVOKE ALL PRIVILEGES ON tpcds.reason FROM joe; +postgres=# REVOKE ALL PRIVILEGES ON SCHEMA tpcds FROM joe; +postgres=# REVOKE ALL ON TABLESPACE tpcds_tbspc FROM joe; +postgres=# DROP TABLESPACE tpcds_tbspc; +postgres=# REVOKE USAGE,CREATE ON SCHEMA tpcds FROM tpcds_manager; +postgres=# DROP ROLE tpcds_manager; +postgres=# DROP ROLE senior_manager; +postgres=# DROP USER joe CASCADE; +``` + +## 相关链接 + +[REVOKE](REVOKE.md),[ALTER DEFAULT PRIVILEGES](ALTER-DEFAULT-PRIVILEGES.md) + diff --git a/content/zh/docs/Developerguide/GS_FILE_STAT.md b/content/zh/docs/Developerguide/GS_FILE_STAT.md new file mode 100644 index 000000000..6b6211ceb --- /dev/null +++ b/content/zh/docs/Developerguide/GS_FILE_STAT.md @@ -0,0 +1,109 @@ +# GS\_FILE\_STAT + +GS\_FILE\_STAT视图通过对数据文件IO的统计,反映数据的IO性能,用以发现IO操作异常等性能问题。 + +**表 1** GS\_FILE\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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/GS_INSTANCE_TIME.md b/content/zh/docs/Developerguide/GS_INSTANCE_TIME.md new file mode 100644 index 000000000..35bc0376c --- /dev/null +++ b/content/zh/docs/Developerguide/GS_INSTANCE_TIME.md @@ -0,0 +1,50 @@ +# GS\_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** GS\_INSTANCE\_TIME字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

stat_id

+

integer

+

统计编号。

+

stat_name

+

text

+

类型名称。

+

value

+

bigint

+

时间值(单位:微秒)。

+
+ diff --git a/content/zh/docs/Developerguide/GS_OPT_MODEL.md b/content/zh/docs/Developerguide/GS_OPT_MODEL.md new file mode 100644 index 000000000..a5ecdf234 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_OPT_MODEL.md @@ -0,0 +1,142 @@ +# GS\_OPT\_MODEL + +GS\_OPT\_MODEL是启用AiEngine执行计划时间预测功能时的数据表,记录机器学习模型的配置、训练结果、功能、对应系统函数、训练历史等相关信息。 + +**表 1** GS\_OPT\_MODEL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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_OS_RUN_INFO.md b/content/zh/docs/Developerguide/GS_OS_RUN_INFO.md new file mode 100644 index 000000000..da7d940a7 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_OS_RUN_INFO.md @@ -0,0 +1,53 @@ +# GS\_OS\_RUN\_INFO + +GS\_OS\_RUN\_INFO视图显示当前操作系统运行的状态信息。 + +**表 1** GS\_OS\_RUN\_INFO字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

id

+

integer

+

编号。

+

name

+

text

+

操作系统运行状态名称。

+

value

+

numeric

+

操作系统运行状态值。

+

comments

+

text

+

操作系统运行状态注释。

+

cumulative

+

Boolean

+

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

+
+ diff --git a/content/zh/docs/Developerguide/GS_REDO_STAT.md b/content/zh/docs/Developerguide/GS_REDO_STAT.md new file mode 100644 index 000000000..8fcc6fa13 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_REDO_STAT.md @@ -0,0 +1,67 @@ +# GS\_REDO\_STAT + +GS\_REDO\_STAT视图用于统计回话线程日志回放情况。 + +**表 1** GS\_REDO\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

phywrts

+

bigint

+

日志回放过程中写数据的次数。

+

phyblkwrt

+

bigint

+

日志回放过程中写数据的块数。

+

writetim

+

bigint

+

日志回放过程中写数据所耗的总时间。

+

avgiotim

+

bigint

+

日志回放过程中写一次数据的平均消耗时间。

+

lstiotim

+

bigint

+

日志回放过程中最后一次写数据消耗的时间。

+

miniotim

+

bigint

+

日志回放过程中单次写数据消耗的最短时间。

+

maxiowtm

+

bigint

+

日志回放过程中单次写数据消耗的最长时间。

+
+ diff --git a/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md b/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md new file mode 100644 index 000000000..ffe20fc40 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_CPU_STATISTICS.md @@ -0,0 +1,88 @@ +# GS\_SESSION\_CPU\_STATISTICS + +GS\_SESSION\_CPU\_STATISTICS视图显示和当前用户执行复杂作业正在运行时的负载管理CPU使用的信息。 + +**表 1** GS\_SESSION\_CPU\_STATISTICS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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

+

该字段不支持。

+

top_cpu_dn

+

text

+

cpu使用量信息。

+
+ diff --git a/content/zh/docs/Developerguide/GS_SESSION_MEMORY.md b/content/zh/docs/Developerguide/GS_SESSION_MEMORY.md new file mode 100644 index 000000000..5f2a80921 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_MEMORY.md @@ -0,0 +1,46 @@ +# GS\_SESSION\_MEMORY + +GS\_SESSION\_MEMORY视图统计Session级别的内存使用情况,包含执行作业在数据节点上Postgres线程分配的所有内存。 + +**表 1** GS\_SESSION\_MEMORY字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

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

+

init_mem

+

integer

+

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

+

used_mem

+

integer

+

当前正在执行作业已分配的内存,单位MB。

+

peak_mem

+

integer

+

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

+
+ diff --git a/content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md new file mode 100644 index 000000000..a26641946 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md @@ -0,0 +1,76 @@ +# 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_DETAIL.md b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_DETAIL.md new file mode 100644 index 000000000..784eb377e --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_DETAIL.md @@ -0,0 +1,78 @@ +# GS\_SESSION\_MEMORY\_DETAIL + +GS\_SESSION\_MEMORY\_DETAIL统计线程的内存使用情况,以MemoryContext节点来统计。当开启线程池(enable\_thread\_pool = on)时,该视图包含所有的线程和会话的内存使用情况。 + +其中内存上下文“TempSmallContextGroup”,记录当前线程中所有内存上下文字段“totalsize”小于8192字节的信息汇总,并且内存上下文统计计数记录到“usedsize”字段中。所以在视图中,“TempSmallContextGroup”内存上下文中的“totalsize”和“freesize”是该线程中所有内存上下文“totalsize”小于8192字节的汇总总和,usedsize字段表示统计的内存上下文个数。 + +可通过"select \* from gs\_session\_memctx\_detail\(threadid, ''\);"将某个线程所有内存上下文信息记录到“/tmp/dumpmem”目录下的“threadid\_timestamp.log”文件中。其中threadid可通过下表sessid中获得。 + +**表 1** GS\_SESSION\_MEMORY\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

线程启动时间+线程标识(字符串信息为timestamp.threadid)。

+

sesstype

+

text

+

线程名称。

+

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 new file mode 100644 index 000000000..24e8c110b --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md @@ -0,0 +1,91 @@ +# GS\_SESSION\_MEMORY\_STATISTICS + +GS\_SESSION\_MEMORY\_STATISTICS视图显示和当前用户执行复杂作业正在运行时的负载管理内存使用的信息。 + +**表 1** GS\_SESSION\_MEMORY\_STATISTICS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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

+

该字段不支持

+

top_mem_dn

+

text

+

mem使用量信息。

+
+ diff --git a/content/zh/docs/Developerguide/GS_SESSION_STAT.md b/content/zh/docs/Developerguide/GS_SESSION_STAT.md new file mode 100644 index 000000000..fc718c52b --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_STAT.md @@ -0,0 +1,53 @@ +# GS\_SESSION\_STAT + +GS\_SESSION\_STAT视图以会话线程或AutoVacuum线程为单位,统计会话状态信息。 + +**表 1** GS\_SESSION\_STAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

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

+

statid

+

integer

+

统计编号。

+

statname

+

text

+

统计会话名称。

+

statunit

+

text

+

统计会话单位。

+

value

+

bigint

+

统计会话值。

+
+ diff --git a/content/zh/docs/Developerguide/GS_SESSION_TIME.md b/content/zh/docs/Developerguide/GS_SESSION_TIME.md new file mode 100644 index 000000000..30e1a27b1 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SESSION_TIME.md @@ -0,0 +1,46 @@ +# GS\_SESSION\_TIME + +GS\_SESSION\_TIME视图用于统计会话线程的运行时间信息,及各执行阶段所消耗时间。 + +**表 1** GS\_SESSION\_TIME字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

sessid

+

text

+

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

+

stat_id

+

integer

+

统计编号。

+

stat_name

+

text

+

会话类型名称。

+

value

+

bigint

+

会话值。

+
+ diff --git a/content/zh/docs/Developerguide/GS_SQL_COUNT.md b/content/zh/docs/Developerguide/GS_SQL_COUNT.md new file mode 100644 index 000000000..5f0a0bf19 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_SQL_COUNT.md @@ -0,0 +1,204 @@ +# GS\_SQL\_COUNT + +GS\_SQL\_COUNT视图显示数据库当前节点当前时刻执行的五类语句(SELECT、INSERT、UPDATE、DELETE、MERGE INTO)统计信息。 + +- 普通用户查询GS\_SQL\_COUNT视图仅能看到该用户当前节点的统计信息;管理员权限用户查询GS\_SQL\_COUNT视图则能看到所有用户当前节点的统计信息。 +- 当openGauss或该节点重启时,计数将清零,并重新开始计数 。 +- 计数以节点收到的查询数为准,包括openGauss内部进行的查询。 + +**表 1** GS\_SQL\_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

+

DML语句的数量。

+

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/GS_STAT_DB_CU.md b/content/zh/docs/Developerguide/GS_STAT_DB_CU.md new file mode 100644 index 000000000..5a67f50e0 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_STAT_DB_CU.md @@ -0,0 +1,53 @@ +# GS\_STAT\_DB\_CU + +GS\_STAT\_DB\_CU视图查询openGauss各个节点,每个数据库的CU命中情况。可以通过gs\_stat\_reset\(\)进行清零。 + +**表 1** GS\_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/GS_STAT_SESSION_CU.md b/content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md new file mode 100644 index 000000000..5d5482308 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_STAT_SESSION_CU.md @@ -0,0 +1,46 @@ +# GS\_STAT\_SESSION\_CU + +GS\_STAT\_SESSION\_CU视图查询openGauss各个节点,当前运行session的CU命中情况。session退出相应的统计数据会清零。openGauss重启后,统计数据也会清零。 + +**表 1** GS\_STAT\_SESSION\_CU字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name1

+

text

+

节点名。

+

mem_hit

+

integer

+

内存命中次数。

+

hdd_sync_read

+

integer

+

硬盘同步读次数。

+

hdd_asyn_read

+

integer

+

硬盘异步读次数。

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

名称

+

类型

+

描述

+

threadid

+

text

+

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

+

tid

+

bigint

+

线程标识。

+

thrdtype

+

text

+

线程类型。

+

contextname

+

text

+

内存上下文名称。

+

level

+

smallint

+

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

+

parent

+

text

+

父内存上下文名称。

+

totalsize

+

bigint

+

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

+

freesize

+

bigint

+

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

+

usedsize

+

bigint

+

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

+
+ diff --git a/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md new file mode 100644 index 000000000..41da6ff14 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md @@ -0,0 +1,40 @@ +# GS\_TOTAL\_MEMORY\_DETAIL + +GS\_TOTAL\_MEMORY\_DETAIL视图统计当前数据库节点使用内存的信息,单位为MB。 + +**表 1** GS\_TOTAL\_MEMORY\_DETAIL字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

节点名称。

+

memorytype

+

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:其他已使用的内存大小。
+
+

memorymbytes

+

integer

+

内存类型分配内存的大小。

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md new file mode 100644 index 000000000..b6ac52b7d --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md @@ -0,0 +1,127 @@ +# GS\_WLM\_INSTANCE\_HISTORY + +GS\_WLM\_INSTANCE\_HISTORY系统表存储与实例(数据库主节点或数据库节点)相关的资源使用相关信息。该系统表里每条记录都是对应时间点某实例资源使用情况,包括:内存、CPU核数、磁盘IO、进程物理IO和进程逻辑IO信息。 + +**表 1** GS\_WLM\_INSTANCE\_HISTORY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

instancename

+

text

+

实例名称。

+

timestamp

+

timestamp with time zone

+

时间戳。

+

used_cpu

+

int

+

实例使用CPU所占用的百分比。

+

free_mem

+

int

+

实例未使用的内存大小,单位MB。

+

used_mem

+

int

+

实例已使用的内存大小,单位MB。

+

io_await

+

real

+

实例所使用磁盘的io_wait值(10秒均值)。

+

io_util

+

real

+

实例所使用磁盘的io_util值(10秒均值)。

+

disk_read

+

real

+

实例所使用磁盘的读速率(10秒均值),单位KB/s。

+

disk_write

+

real

+

实例所使用磁盘的写速率(10秒均值),单位KB/s。

+

process_read

+

bigint

+

实例对应进程从磁盘读数据的读速率(不包括从磁盘pagecache中读取的字节数,10秒均值),单位KB/s。

+

process_write

+

bigint

+

实例对应进程向磁盘写数据的写速率(不包括向磁盘pagecache中写入的字节数,10秒均值),单位KB/s。

+

logical_read

+

bigint

+

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

+

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

+

logical_write

+

bigint

+

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

+

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

+

read_counts

+

bigint

+

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

+

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

+

write_counts

+

bigint

+

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

+

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

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md new file mode 100644 index 000000000..7a5ea6561 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md @@ -0,0 +1,6 @@ +# 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)。 + diff --git a/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md new file mode 100644 index 000000000..633134717 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_INFO.md @@ -0,0 +1,173 @@ +# 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)中的记录导入此系统表,开启此功能会占用系统存储空间并对性能有一定影响,不建议用户使用。 + +**表 1** GS\_WLM\_OPERATOR\_INFO的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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/GS_WLM_OPERATOR_STATISTICS.md b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md new file mode 100644 index 000000000..040031f00 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md @@ -0,0 +1,180 @@ +# GS\_WLM\_OPERATOR\_STATISTICS + +GS\_WLM\_OPERATOR\_STATISTICS视图显示当前用户正在执行的作业的算子相关信息。 + +**表 1** GS\_WLM\_OPERATOR\_STATISTICS的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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/GS_WLM_PLAN_ENCODING_TABLE.md b/content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md new file mode 100644 index 000000000..351765314 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md @@ -0,0 +1,74 @@ +# GS\_WLM\_PLAN\_ENCODING\_TABLE + +GS\_WLM\_PLAN\_ENCODING\_TABLE系统表显示计划算子级的编码信息,为机器学习模型的提供包括startup time, total time, peak memory, rows等标签值的训练、预测集。 + +**表 1** GS\_WLM\_PLAN\_ENCODING\_TABLE的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

queryid

+

bigint

+

语句执行使用的内部query_id。

+

plan_node_id

+

integer

+

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

+

plan_node_id

+

integer

+

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

+

startup_time

+

bignit

+

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

+

total_time

+

bigint

+

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

+

rows

+

bigint

+

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

+

peak_memory

+

integer

+

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

+

encode

+

text

+

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

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md new file mode 100644 index 000000000..738fc0045 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md @@ -0,0 +1,6 @@ +# GS\_WLM\_PLAN\_OPERATOR\_HISTORY + +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)。 + diff --git a/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md new file mode 100644 index 000000000..94900322b --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md @@ -0,0 +1,137 @@ +# 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)中的记录导入此系统表,开启此功能会占用系统存储空间并对性能有一定影响,不建议用户使用。 + +**表 1** GS\_WLM\_PLAN\_OPERATOR\_INFO的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datname

+

name

+

收集计划信息所在的database名

+

queryid

+

bigint

+

语句执行使用的内部query_id。

+

plan_node_id

+

integer

+

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

+

startup_time

+

bigint

+

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

+

total_time

+

bigint

+

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

+

actual_rows

+

bigint

+

实际执行的行数信息。

+

max_peak_memory

+

integer

+

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

+

query_dop

+

integer

+

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

+

parent_node_id

+

integer

+

当前算子的父节点node id。

+

left_child_id

+

integer

+

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

+

right_child_id

+

integer

+

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

+

operation

+

text

+

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

+

orientation

+

text

+

当前算子的对齐方式。

+

strategy

+

text

+

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

+

options

+

text

+

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

+

condition

+

text

+

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

+

projection

+

text

+

当前算子的映射关系。

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md b/content/zh/docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md new file mode 100644 index 000000000..1ebc3b78d --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md @@ -0,0 +1,4 @@ +# GS\_WLM\_REBUILD\_USER\_RESOURCE\_POOL + +该视图用于在当前连接节点上重建内存中用户的资源池信息,无输出。只是用于资源池信息缺失或者错乱时用作补救措施。 + diff --git a/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md b/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md new file mode 100644 index 000000000..7c1470224 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_RESOURCE_POOL.md @@ -0,0 +1,88 @@ +# GS\_WLM\_RESOURCE\_POOL + +这是资源池上的一些统计信息。 + +**表 1** GS\_WLM\_RESOURCE\_POOL的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

rpoid

+

oid

+

资源池的OID。

+

respool

+

name

+

资源池的名称。

+

control_group

+

name

+

该字段不支持。

+

parentid

+

oid

+

父资源池的OID。

+

ref_count

+

integer

+

关联到该资源池上的作业数量。

+

active_points

+

integer

+

资源池上已经使用的点数。

+

running_count

+

integer

+

正在资源池上运行的作业数量。

+

waiting_count

+

integer

+

正在资源池上排队的作业数量。

+

io_limits

+

integer

+

资源池的iops上限。

+

io_priority

+

integer

+

资源池的io优先级。

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md new file mode 100644 index 000000000..9880fe369 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_HISTORY.md @@ -0,0 +1,496 @@ +# 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分钟)后会被删除。 + +**表 1** GS\_WLM\_SESSION\_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

+

该字段不支持

+

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

+

该字段不支持。

+

cpu_top1_node_name

+

text

+

当前数据库节点名称。

+

cpu_top2_node_name

+

text

+

该字段不支持。

+

cpu_top3_node_name

+

text

+

该字段不支持。

+

cpu_top4_node_name

+

text

+

该字段不支持。

+

cpu_top5_node_name

+

text

+

该字段不支持。

+

mem_top1_node_name

+

text

+

当前数据库节点名称。

+

mem_top2_node_name

+

text

+

该字段不支持。

+

mem_top3_node_name

+

text

+

该字段不支持。

+

mem_top4_node_name

+

text

+

该字段不支持。

+

mem_top5_node_name

+

text

+

该字段不支持。

+

cpu_top1_value

+

bigint

+

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

+

cpu_top2_value

+

bigint

+

该字段不支持。

+

cpu_top3_value

+

bigint

+

该字段不支持。

+

cpu_top4_value

+

bigint

+

该字段不支持。

+

cpu_top5_value

+

bigint

+

该字段不支持。

+

mem_top1_value

+

bigint

+

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

+

mem_top2_value

+

bigint

+

该字段不支持。

+

mem_top3_value

+

bigint

+

该字段不支持。

+

mem_top4_value

+

bigint

+

该字段不支持。

+

mem_top5_value

+

bigint

+

该字段不支持。

+

top_mem_dn

+

text

+

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

+

top_cpu_dn

+

text

+

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

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md new file mode 100644 index 000000000..0ccc0d639 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md @@ -0,0 +1,4 @@ +# GS\_WLM\_SESSION\_INFO\_ALL + +GS\_WLM\_SESSION\_INFO\_ALL视图显示在数据库主节点上执行作业结束后的负载管理记录。此视图的数据直接从系统表[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/GS_WLM_SESSION_QUERY_INFO_ALL.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md new file mode 100644 index 000000000..1362a6177 --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md @@ -0,0 +1,629 @@ +# 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系统表。 + +**表 1** GS\_WLM\_SESSION\_QUERY\_INFO\_ALL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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

+

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

+

mem_top3_node_name

+

text

+

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

+

mem_top4_node_name

+

text

+

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

+

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信息。

+

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

+

Cache加载次数

+

n_blocks_hit

+

bigint

+

Cache命中数

+

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上的时间花费(单位:微秒)

+

is_slow_query

+

bigint

+

标记是否为慢查询

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md b/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md new file mode 100644 index 000000000..24c760c7e --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_SESSION_STATISTICS.md @@ -0,0 +1,363 @@ +# GS\_WLM\_SESSION\_STATISTICS + +GS\_WLM\_SESSION\_STATISTICS视图显示当前用户在数据库主节点上正在执行的作业的负载管理记录。 + +**表 1** GS\_WLM\_SESSION\_STATISTICS的字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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。

+

sessionid

+

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

+

该字段不支持。

+

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

+

该字段不支持

+

top_mem_dn

+

text

+

内存使用量信息。

+

top_cpu_dn

+

text

+

cpu使用量信息。

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_USER_INFO.md b/content/zh/docs/Developerguide/GS_WLM_USER_INFO.md new file mode 100644 index 000000000..65e448c3a --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_USER_INFO.md @@ -0,0 +1,88 @@ +# GS\_WLM\_USER\_INFO + +用户统计信息视图。 + +**表 1** GS\_WLM\_USER\_INFO字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

userid

+

oid

+

用户OID。

+

username

+

name

+

用户名。

+

sysadmin

+

boolean

+

是否是管理员用户。

+

rpoid

+

oid

+

关联的资源池的OID。

+

respool

+

name

+

关联的资源池的名称。

+

parentid

+

oid

+

用户组的OID。

+

totalspace

+

bigint

+

用户的可用空间上限。

+

spacelimit

+

bigint

+

用户表空间限制。

+

childcount

+

interger

+

子用户的个数。

+

childlist

+

text

+

子用户列表。

+
+ diff --git a/content/zh/docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md b/content/zh/docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md new file mode 100644 index 000000000..2bc115b8f --- /dev/null +++ b/content/zh/docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md @@ -0,0 +1,144 @@ +# GS\_WLM\_USER\_RESOURCE\_HISTORY + +GS\_WLM\_USER\_RESOURCE\_HISTORY系统表存储与用户使用资源相关的信息,仅在数据库主节点上有效。该系统表的每条记录都是对应时间点某用户的资源使用情况,包括:内存、CPU核数、存储空间、临时空间、算子落盘空间、逻辑IO流量、逻辑IO次数和逻辑IO速率信息。其中,内存、CPU、IO相关监控项仅记录用户复杂作业的资源使用情况。对于IO相关监控项,当参数enable\_logical\_io\_statistics为on时才有效;当参数enable\_user\_metric\_persistent为on时,才会开启用户监控数据保存功能。GS\_WLM\_USER\_RESOURCE\_HISTORY系统表的数据来源于PG\_TOTAL\_USER\_RESOURCE\_INFO视图。 + +**表 1** GS\_WLM\_USER\_RESOURCE\_HISTORY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

username

+

text

+

用户名

+

timestamp

+

timestamp with time zone

+

时间戳

+

used_memory

+

integer

+

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

+

total_memory

+

integer

+

可以使用的内存大小,单位为MB。值为0表示未限制最大可用内存,其限制取决于数据库最大可用内存。

+

used_cpu

+

real

+

正在使用的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表示未限制最大算子落盘存储空间。

+

read_kbytes

+

bigint

+

监控周期内,读操作的字节流量,单位KB。

+

write_kbytes

+

bigint

+

监控周期内,写操作的字节流量,单位KB。

+

read_counts

+

bigint

+

监控周期内,读操作的次数,单位次。

+

write_counts

+

bigint

+

监控周期内,写操作的次数,单位次。

+

read_speed

+

real

+

监控周期内,读操作的字节速率,单位KB/s。

+

write_speed

+

real

+

监控周期内,写操作的字节速率,单位KB/s。

+
+ diff --git "a/content/zh/docs/Developerguide/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/content/zh/docs/Developerguide/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 000000000..3e59be772 --- /dev/null +++ "b/content/zh/docs/Developerguide/GUC\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,10 @@ +# GUC使用说明 + +数据库提供了许多运行参数,配置这些参数可以影响数据库系统的行为。在修改这些参数时请确保用户理解了这些参数对数据库的影响,否则可能会导致无法预料的结果。 + +## 注意事项 + +- 参数中如果取值范围为字符串,此字符串应遵循操作系统的路径和文件名命名规则。 +- 取值范围最大值为INT\_MAX的参数,此选项最大值跟所在的操作系统有关。 +- 取值范围最大值为DBL\_MAX的参数,此选项最大值跟所在的操作系统有关。 + diff --git "a/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260log_directory\350\256\276\347\275\256\344\270\215\346\255\243\347\241\256\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" "b/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260log_directory\350\256\276\347\275\256\344\270\215\346\255\243\347\241\256\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" new file mode 100644 index 000000000..1a2682eb8 --- /dev/null +++ "b/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260log_directory\350\256\276\347\275\256\344\270\215\346\255\243\347\241\256\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" @@ -0,0 +1,14 @@ +# GUC参数log\_directory设置不正确引起的core问题 + +## 问题现象 + +数据库进程拉起后出现coredump,日志无内容。 + +## 原因分析 + +GUC参数log\_directory设置的路径不可读取或无访问权限,数据库在启动过程中进行校验失败,通过panic日志退出程序。 + +## 处理办法 + +GUC参数log\_directory设置为合法路径,具体请参考[log\_directory](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_sfbedf09fcf1a4223a4538679f80f12a9)。 + 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" new file mode 100644 index 000000000..d8346e598 --- /dev/null +++ "b/content/zh/docs/Developerguide/GUC\345\217\202\346\225\260\350\257\264\346\230\216.md" @@ -0,0 +1,59 @@ +# GUC参数说明 + +- **[GUC使用说明](GUC使用说明.md)** + +- **[文件位置](文件位置.md)** + +- **[连接和认证](连接和认证.md)** + +- **[资源消耗](资源消耗.md)** + +- **[并行导入](并行导入.md)** + +- **[预写式日志](预写式日志.md)** + +- **[双机复制](双机复制.md)** + +- **[内存表](内存表.md)** + +- **[查询规划](查询规划.md)** + +- **[错误报告和日志](错误报告和日志.md)** + +- **[告警检测](告警检测.md)** + +- **[运行时统计](运行时统计.md)** + +- **[负载管理](负载管理.md)** + +- **[自动清理](自动清理.md)** + +- **[客户端连接缺省设置](客户端连接缺省设置.md)** + +- **[锁管理](锁管理.md)** + +- **[版本和平台兼容性](版本和平台兼容性.md)** + +- **[容错性](容错性.md)** + +- **[连接池参数](连接池参数.md)** + +- **[openGauss事务](openGauss事务.md)** + +- **[开发人员选项](开发人员选项.md)** + +- **[审计](审计.md)** + +- **[事务监控](事务监控.md)** + +- **[升级参数](升级参数.md)** + +- **[其它选项](其它选项.md)** + +- **[等待事件](等待事件.md)** + +- **[Query](Query.md)** + +- **[系统性能快照](系统性能快照.md)** + + diff --git a/content/zh/docs/Developerguide/INSERT.md b/content/zh/docs/Developerguide/INSERT.md new file mode 100644 index 000000000..bab8c69bc --- /dev/null +++ b/content/zh/docs/Developerguide/INSERT.md @@ -0,0 +1,162 @@ +# INSERT + +## 功能描述 + +向表中添加一行或多行数据。 + +## 注意事项 + +- 只有拥有表INSERT权限的用户,才可以向表中插入数据。 +- 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 +- 如果使用ON DUPLICATE KEY UPDATE,用户必须要有该表的SELECT、UPDATE权限,唯一约束(主键或唯一索引)的SELECT权限。 +- 如果使用query子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 +- 当连接到TD兼容的数据库时,td\_compatible\_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的insert语句中(不包含外表的场景下),对目标表中char和varchar类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果向字符集为字节类型编码(SQL\_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 + + +## 语法格式 + +``` +[ WITH [ RECURSIVE ] with_query [, ...] ] +INSERT INTO table_name [ ( column_name [, ...] ) ] + { DEFAULT VALUES + | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] + | query } + [ ON DUPLICATE KEY UPDATE { NOTHING | column_name = { expression | DEFAULT } } [, ...] ] + [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]; +``` + +## 参数说明 + +- **WITH \[ RECURSIVE \] with\_query \[, ...\]** + + 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 + + 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 + + 其中with\_query的详细格式为:with\_query\_name \[ \( column\_name \[, ...\] \) \] AS + + \( \{select | values | insert | update | delete\} \) + + – with\_query\_name指定子查询生成的结果集名称,在查询中可使用该名称访问 + + 子查询的结果集。 + + – column\_name指定子查询结果集中显示的列名。 + + – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >INSERT ON DUPLICATE KEY UPDATE不支持WITH及WITH RECURSIVE子句。 + +- **table\_name** + + 要插入数据的目标表名。 + + 取值范围:已存在的表名。 + +- **column\_name** + + 目标表中的字段名: + + - 字段名可以有子字段名或者数组下标修饰。 + - 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 + - 目标字段(column\_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 + - 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 + - value子句和query提供的值在表中从左到右关联到对应列。 + + 取值范围:已存在的字段名。 + +- **expression** + + 赋予对应column的一个有效表达式或值: + + - 如果是INSERT ON DUPLICATE KEY UPDATE语句下,expression可以为VALUES\(column\_name\)或EXCLUDED.column\_name用来表示引用冲突行对应的column\_name字段的值。需注意,其中VALUES\(column\_name\)不支持嵌套在表达式中(例如VALUES\(column\_name\)+1),但EXCLUDED不受此限制。 + + - 向表中字段插入单引号 " ' "时需要使用单引号自身进行转义。 + - 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 + +- **DEFAULT** + + 对应字段名的缺省值。如果没有缺省值,则为NULL。 + +- **query** + + 一个查询语句(SELECT语句),将查询结果作为插入的数据。 + +- **RETURNING** + + 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。注意:INSERT ON DUPLICATE KEY UPDATE不支持RETURNING子句。 + +- **output\_expression** + + INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 + + 取值范围:该表达式可以使用table的任意字段。可以使用\*返回被插入行的所有字段。 + +- **output\_name** + + 字段的输出名称。 + + 取值范围:字符串,符合标识符命名规范。 + +- **ON DUPLICATE KEY UPDATE** + + 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。如果UPDATE子句为NOTHING,则不做任何操作。 + + 对于不带唯一约束的表,则仅执行插入。 + + - 不支持触发器,不会触发目标表的INSERT或UPDATE触发器。 + + - 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 + + - 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 + + - 分布列、唯一索引列不允许UPDATE。 + - 不支持列存 + - 。 + + + +## 示例 + +``` +--创建表tpcds.reason_t2。 +postgres=# CREATE TABLE tpcds.reason_t2 +( + r_reason_sk integer, + r_reason_id character(16), + r_reason_desc character(100) +); + +--向表中插入一条记录。 +postgres=# INSERT INTO tpcds.reason_t2(r_reason_sk, r_reason_id, r_reason_desc) VALUES (1, 'AAAAAAAABAAAAAAA', 'reason1'); + +--向表中插入一条记录,和上一条语法等效。 +postgres=# INSERT INTO tpcds.reason_t2 VALUES (2, 'AAAAAAAABAAAAAAA', 'reason2'); + +--向表中插入多条记录。 +postgres=# INSERT INTO tpcds.reason_t2 VALUES (3, 'AAAAAAAACAAAAAAA','reason3'),(4, 'AAAAAAAADAAAAAAA', 'reason4'),(5, 'AAAAAAAAEAAAAAAA','reason5'); + +--向表中插入tpcds.reason中r_reason_sk小于5的记录。 +postgres=# INSERT INTO tpcds.reason_t2 SELECT * FROM tpcds.reason WHERE r_reason_sk <5; + +--对表创建唯一索引 +postgres=# CREATE UNIQUE INDEX reason_t2_u_index ON tpcds.reason_t2(r_reason_sk); + +--向表中插入多条记录,如果冲突则更新冲突数据行中r_reason_id字段为'BBBBBBBBCAAAAAAA'。 +postgres=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE r_reason_id = 'BBBBBBBBCAAAAAAA'; + +--删除表tpcds.reason_t2。 +postgres=# DROP TABLE tpcds.reason_t2; +``` + +## 优化建议 + +- VALUES + + 通过insert语句批量插入数据时,建议将多条记录合并入一条语句中执行插入,以提高数据加载性能。例如,INSERT INTO sections VALUES \(30, 'Administration', 31, 1900\),\(40, 'Development', 35, 2000\), \(50, 'Development' , 60 , 2001\); + + 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" new file mode 100644 index 000000000..b6476244c --- /dev/null +++ "b/content/zh/docs/Developerguide/Ispell\350\257\215\345\205\270.md" @@ -0,0 +1,44 @@ +# Ispell词典 + +Ispell词典模板支持词法词典,它可以把一个词的各种语言学形式规范化成相同的词位。比如,一个Ispell英语词典可以匹配搜索词bank的词尾变化和词形变化,如banking、banked、banks、banks'和bank's等。 + +openGauss不提供任何预定义的Ispell类型词典或词典文件。dict文件和affix文件支持多种开源词典格式,包括Ispell、MySpell和Hunspell等。 + +## 操作步骤 + +1. 获取词典定义文件和词缀文件。 + + 用户可以使用开源词典(OpenOffice上可以获取),直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成 UTF-8 编码,比如挪威语词典: + + ``` + iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff + iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic + ``` + +2. 创建Ispell词典。 + + ``` + postgres=# CREATE TEXT SEARCH DICTIONARY norwegian_ispell ( + TEMPLATE = ispell, + DictFile = nn_no, + AffFile = nn_no, + FilePath = 'file:///home/dicts' + ); + ``` + + 其中,词典文件全名为nn\_no.dict和nn\_no.affix,所在目录为当前连接数据库主节点的/home/dicts/下 。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + +3. 使用Ispell词典进行复合词拆分。 + + ``` + postgres=# SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk'); + ts_lexize + --------------------- + {sjokolade,fabrikk} + (1 row) + + ``` + + MySpell不支持复合词,Hunspell对复合词有较好的支持。openGauss仅支持Hunspell中基本的复合词操作。通常情况下,Ispell词典能够识别的词是一个有限集合,其后应该配置一个更广义的词典,例如一个可以识别所有词的Snowball词典。 + + diff --git a/content/zh/docs/Developerguide/JDBC.md b/content/zh/docs/Developerguide/JDBC.md new file mode 100644 index 000000000..648e09f23 --- /dev/null +++ b/content/zh/docs/Developerguide/JDBC.md @@ -0,0 +1,33 @@ +# JDBC + +JDBC接口是一套提供给用户的API方法,本节将对部分常用接口做具体描述,若涉及其他接口可参考JDK1.8(软件包)/JDBC4.0中相关内容。 + +- **[java.sql.Connection](java-sql-Connection.md)** + +- **[java.sql.CallableStatement](java-sql-CallableStatement.md)** + +- **[java.sql.DatabaseMetaData](java-sql-DatabaseMetaData.md)** + +- **[java.sql.Driver](java-sql-Driver.md)** + +- **[java.sql.PreparedStatement](java-sql-PreparedStatement.md)** + +- **[java.sql.ResultSet](java-sql-ResultSet.md)** + +- **[java.sql.ResultSetMetaData](java-sql-ResultSetMetaData.md)** + +- **[java.sql.Statement](java-sql-Statement.md)** + +- **[javax.sql.ConnectionPoolDataSource](javax-sql-ConnectionPoolDataSource.md)** + +- **[javax.sql.DataSource](javax-sql-DataSource.md)** + +- **[javax.sql.PooledConnection](javax-sql-PooledConnection.md)** + +- **[javax.naming.Context](javax-naming-Context.md)** + +- **[javax.naming.spi.InitialContextFactory](javax-naming-spi-InitialContextFactory.md)** + +- **[CopyManager](CopyManager.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" new file mode 100644 index 000000000..bcf39bd19 --- /dev/null +++ "b/content/zh/docs/Developerguide/JSON\345\207\275\346\225\260.md" @@ -0,0 +1,37 @@ +# JSON函数 + +JSON函数表示可以用于JSON类型(请参考[JSON类型](JSON类型.md#ZH-CN_TOPIC_0242370422))数据的函数。 + +- array\_to\_json\(anyarray \[, pretty\_bool\]\) + + 描述:返回JSON类型的数组。一个多维数组成为一个JSON数组的数组。如果pretty\_bool为true,将在一维元素之间添加换行符。 + + 返回类型:json + + 示例: + + ``` + postgres=# SELECT array_to_json('{{1,5},{99,100}}'::int[]); + array_to_json + ------------------ + [[1,5],[99,100]] + (1 row) + ``` + +- row\_to\_json\(record \[, pretty\_bool\]\) + + 描述:返回JSON类型的行。如果pretty\_bool为true,将在第一级元素之间添加换行符。 + + 返回类型:json + + 示例: + + ``` + postgres=# SELECT row_to_json(row(1,'foo')); + row_to_json + --------------------- + {"f1":1,"f2":"foo"} + (1 row) + ``` + + 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" new file mode 100644 index 000000000..e00d749f3 --- /dev/null +++ "b/content/zh/docs/Developerguide/JSON\347\261\273\345\236\213.md" @@ -0,0 +1,6 @@ +# JSON类型 + +JSON数据类型可以用来存储JSON(JavaScript Object Notation)数据。数据可以存储为text,但是JSON数据类型更有利于检查每个存储的数值是可用的JSON值。 + +JSON类型相关的支持函数请参见[JSON函数](JSON函数.md#ZH-CN_TOPIC_0242370441)。 + diff --git a/content/zh/docs/Developerguide/LOCK.md b/content/zh/docs/Developerguide/LOCK.md new file mode 100644 index 000000000..b26c0c338 --- /dev/null +++ b/content/zh/docs/Developerguide/LOCK.md @@ -0,0 +1,306 @@ +# LOCK + +## 功能描述 + +LOCK TABLE获取表级锁。 + +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/MERGE-INTO.md b/content/zh/docs/Developerguide/MERGE-INTO.md new file mode 100644 index 000000000..5ab5278bd --- /dev/null +++ b/content/zh/docs/Developerguide/MERGE-INTO.md @@ -0,0 +1,136 @@ +# MERGE INTO + +## 功能描述 + +通过MERGE INTO语句,将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,无法匹配时对目标表执行INSERT。此语法可以很方便地用来合并执行UPDATE和INSERT,避免多次执行。 + +## 注意事项 + +- 进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。 +- 不支持重分布过程中MERGE INTO。 + +## 语法格式 + +``` +MERGE INTO table_name [ [ AS ] alias ] +USING { { table_name | view_name } | subquery } [ [ AS ] alias ] +ON ( condition ) +[ + WHEN MATCHED THEN + UPDATE SET { column_name = { expression | DEFAULT } | + ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] + [ WHERE condition ] +] +[ + WHEN NOT MATCHED THEN + INSERT { DEFAULT VALUES | + [ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } +]; +``` + +## 参数说明 + +- **INTO子句** + + 指定正在更新或插入的目标表。目标表为复制表时,暂不支持目标表中某列默认值为volatile函数(如自增列)。 + + - **talbe\_name** + + 目标表的表名。 + + - **alias** + + 目标表的别名。 + + 取值范围:字符串,符合标识符命名规范。 + + +- **USING子句** + + 指定源表,源表可以为表、视图或子查询。目标表为复制表时,暂不支持USING子句中包含非复制表。 + +- **ON子句** + + 关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。 + +- **WHEN MATCHED子句** + + 当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。 + + 不支持更新分布列。不支持更新系统表、系统列。 + +- **WHEN NOT MATCHED子句** + + 当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。 + + 不支持INSERT子句中包含多个VALUES。 + + WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 + +- **DEFAULT** + + 用对应字段的缺省值填充该字段。 + + 如果没有缺省值,则为NULL。 + +- **WHERE condition** + + UPDATE子句和INSERT子句的条件,只有在条件满足时才进行更新操作,可缺省。不支持WHERE条件中引用系统列。 + + +## 示例 + +``` +-- 创建目标表products和源表newproducts,并插入数据 +postgres=# CREATE TABLE products +( +product_id INTEGER, +product_name VARCHAR2(60), +category VARCHAR2(60) +); + +postgres=# INSERT INTO products VALUES (1501, 'vivitar 35mm', 'electrncs'); +postgres=# INSERT INTO products VALUES (1502, 'olympus is50', 'electrncs'); +postgres=# INSERT INTO products VALUES (1600, 'play gym', 'toys'); +postgres=# INSERT INTO products VALUES (1601, 'lamaze', 'toys'); +postgres=# INSERT INTO products VALUES (1666, 'harry potter', 'dvd'); + +postgres=# CREATE TABLE newproducts +( +product_id INTEGER, +product_name VARCHAR2(60), +category VARCHAR2(60) +); + +postgres=# INSERT INTO newproducts VALUES (1502, 'olympus camera', 'electrncs'); +postgres=# INSERT INTO newproducts VALUES (1601, 'lamaze', 'toys'); +postgres=# INSERT INTO newproducts VALUES (1666, 'harry potter', 'toys'); +postgres=# INSERT INTO newproducts VALUES (1700, 'wait interface', 'books'); + +-- 进行MERGE INTO操作 +postgres=# MERGE INTO products p +USING newproducts np +ON (p.product_id = np.product_id) +WHEN MATCHED THEN + UPDATE SET p.product_name = np.product_name, p.category = np.category WHERE p.product_name != 'play gym' +WHEN NOT MATCHED THEN + INSERT VALUES (np.product_id, np.product_name, np.category) WHERE np.category = 'books'; +MERGE 4 + +-- 查询更新后的结果 +postgres=# SELECT * FROM products ORDER BY product_id; + product_id | product_name | category +------------+----------------+----------- + 1501 | vivitar 35mm | electrncs + 1502 | olympus camera | electrncs + 1600 | play gym | toys + 1601 | lamaze | toys + 1666 | harry potter | toys + 1700 | wait interface | books +(6 rows) + +-- 删除表 +postgres=# DROP TABLE products; +postgres=# DROP TABLE newproducts; +``` + diff --git a/content/zh/docs/Developerguide/MOVE.md b/content/zh/docs/Developerguide/MOVE.md new file mode 100644 index 000000000..c7c59c949 --- /dev/null +++ b/content/zh/docs/Developerguide/MOVE.md @@ -0,0 +1,75 @@ +# MOVE + +## 功能描述 + +MOVE在不检索数据的情况下重新定位一个游标。MOVE的作用类似于[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629)命令,但只是重定位游标而不返回行。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +MOVE [ direction [ FROM | IN ] ] cursor_name; +``` + +其中direction子句为可选参数。 + +``` +NEXT + | PRIOR + | FIRST + | LAST + | ABSOLUTE count + | RELATIVE count + | count + | ALL + | FORWARD + | FORWARD count + | FORWARD ALL + | BACKWARD + | BACKWARD count + | BACKWARD ALL +``` + +## 参数说明 + +MOVE命令的参数与FETCH的相同,详细请参见FETCH的[参数说明](FETCH.md#zh-cn_topic_0237122165_zh-cn_topic_0059778422_sceb763c430654064b8f61e9aa0792af9)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>成功完成时,MOVE命令将返回一个“MOVE count”的标签,count是一个使用相同参数的FETCH命令会返回的行数(可能为零)。 + +## 示例 + +``` +--开始一个事务。 +postgres=# START TRANSACTION; + +--定义一个名为cursor1的游标。 +postgres=# CURSOR cursor1 FOR SELECT * FROM tpcds.reason; + +--忽略游标cursor1的前3行。 +postgres=# MOVE FORWARD 3 FROM cursor1; + +--抓取游标cursor1的前4行。 +postgres=# FETCH 4 FROM cursor1; + r_reason_sk | r_reason_id | r_reason_desc +-------------+------------------+------------------------------------------------------------------------------------------------------ + 4 | AAAAAAAAEAAAAAAA | Not the product that was ordred + 5 | AAAAAAAAFAAAAAAA | Parts missing + 6 | AAAAAAAAGAAAAAAA | Does not work with a product that I have + 7 | AAAAAAAAHAAAAAAA | Gift exchange +(4 rows) + +--关闭游标。 +postgres=# CLOSE cursor1; + +--结束一个事务。 +postgres=# END; +``` + +## 相关链接 + +[CLOSE](CLOSE.md#ZH-CN_TOPIC_0242370555),[FETCH](FETCH.md#ZH-CN_TOPIC_0242370629) + diff --git a/content/zh/docs/Developerguide/MPP_TABLES.md b/content/zh/docs/Developerguide/MPP_TABLES.md new file mode 100644 index 000000000..e91ae5bc5 --- /dev/null +++ b/content/zh/docs/Developerguide/MPP_TABLES.md @@ -0,0 +1,60 @@ +# MPP\_TABLES + +MPP\_TABLES视图显示PGXC\_CLASS中的表信息。 + +**表 1** MPP\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

包含表的模式名。

+

tablename

+

name

+

表名。

+

tableowner

+

name

+

表的所有者。

+

tablespace

+

name

+

表所在的表空间。

+

pgroup

+

name

+

节点群的名称。

+

nodeoids

+

oidvector_extend

+

表分布的节点OID列表。

+
+ diff --git a/content/zh/docs/Developerguide/ODBC.md b/content/zh/docs/Developerguide/ODBC.md new file mode 100644 index 000000000..552f999ba --- /dev/null +++ b/content/zh/docs/Developerguide/ODBC.md @@ -0,0 +1,51 @@ +# ODBC + +ODBC接口是一套提供给用户的API函数,本节将对部分常用接口做具体描述,若涉及其他接口可参考msdn(网址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms714177\(v=vs.85\).aspx)中ODBC Programmer's Reference项的相关内容。 + +- **[SQLAllocEnv](SQLAllocEnv.md)** + +- **[SQLAllocConnect](SQLAllocConnect.md)** + +- **[SQLAllocHandle](SQLAllocHandle.md)** + +- **[SQLAllocStmt](SQLAllocStmt.md)** + +- **[SQLBindCol](SQLBindCol.md)** + +- **[SQLBindParameter](SQLBindParameter.md)** + +- **[SQLColAttribute](SQLColAttribute.md)** + +- **[SQLConnect](SQLConnect.md)** + +- **[SQLDisconnect](SQLDisconnect.md)** + +- **[SQLExecDirect](SQLExecDirect.md)** + +- **[SQLExecute](SQLExecute.md)** + +- **[SQLFetch](SQLFetch.md)** + +- **[SQLFreeStmt](SQLFreeStmt.md)** + +- **[SQLFreeConnect](SQLFreeConnect.md)** + +- **[SQLFreeHandle](SQLFreeHandle.md)** + +- **[SQLFreeEnv](SQLFreeEnv.md)** + +- **[SQLPrepare](SQLPrepare.md)** + +- **[SQLGetData](SQLGetData.md)** + +- **[SQLGetDiagRec](SQLGetDiagRec.md)** + +- **[SQLSetConnectAttr](SQLSetConnectAttr.md)** + +- **[SQLSetEnvAttr](SQLSetEnvAttr.md)** + +- **[SQLSetStmtAttr](SQLSetStmtAttr.md)** + +- **[示例](示例.md)** + + diff --git a/content/zh/docs/Developerguide/PG_AGGREGATE.md b/content/zh/docs/Developerguide/PG_AGGREGATE.md new file mode 100644 index 000000000..f5c24dd1a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AGGREGATE.md @@ -0,0 +1,111 @@ +# PG\_AGGREGATE + +PG\_AGGREGATE系统表存储与聚集函数有关的信息。PG\_AGGREGATE里的每条记录都是一条pg\_proc里面的记录的扩展。PG\_PROC记录承载该聚集的名称、输入和输出数据类型,以及其它一些和普通函数类似的信息。 + +**表 1** PG\_AGGREGATE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

aggfnoid

+

regproc

+

PG_PROC.proname

+

此聚集函数的PG_PROC proname。

+

aggtransfn

+

regproc

+

PG_PROC.proname

+

转换函数。

+

aggcollectfn

+

regproc

+

PG_PROC.proname

+

收集函数。

+

aggfinalfn

+

regproc

+

PG_PROC.proname

+

最终处理函数(如果没有则为零)。

+

aggsortop

+

oid

+

PG_OPERATOR.oid

+

关联排序操作符(如果没有则为零)。

+

aggtranstype

+

oid

+

PG_TYPE.oid

+

此聚集函数的内部转换(状态)数据的数据类型。

+

agginitval

+

text

+

-

+

转换状态的初始值。这是一个文本数据域,它包含初始值的外部字符串表现形式。如果数据域是null,则转换状态值从null开始。

+

agginitcollect

+

text

+

-

+

收集状态的初始值。这是一个文本数据域,它包含初始值的外部字符串表现形式。如果数据域是null,则收集状态值从null开始。

+

aggkind

+

"char"

+

-

+
此聚集函数类型:
  • 'n' :表示Normal Agg
  • 'o' :表示Ordered Set Agg
+
+

aggnumdirectargs

+

smallint

+

-

+

Ordered Set Agg类型聚集函数的直接参数(非聚集相关参数)数量。对Normal Agg类型聚集函数,该值为0。

+
+ diff --git a/content/zh/docs/Developerguide/PG_AM.md b/content/zh/docs/Developerguide/PG_AM.md new file mode 100644 index 000000000..fd524e799 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AM.md @@ -0,0 +1,299 @@ +# PG\_AM + +PG\_AM系统表存储有关索引访问方法的信息。系统支持的每种索引访问方法都有一行。 + +**表 1** PG\_AM字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

amname

+

name

+

-

+

访问方法的名称。

+

amstrategies

+

smallint

+

-

+

访问方法的操作符策略个数,或者如果访问方法没有一个固定的操作符策略集则为0。

+

amsupport

+

smallint

+

-

+

访问方法的支持过程个数。

+

amcanorder

+

Boolean

+

-

+

这种访问方式是否支持通过索引字段值的命令扫描排序。

+

amcanorderbyop

+

Boolean

+

-

+

这种访问方式是否支持通过索引字段上操作符的结果的命令扫描排序。

+

amcanbackward

+

Boolean

+

-

+

访问方式是否支持向后扫描。

+

amcanunique

+

Boolean

+

-

+

访问方式是否支持唯一索引。

+

amcanmulticol

+

Boolean

+

-

+

访问方式是否支持多字段索引。

+

amoptionalkey

+

Boolean

+

-

+

访问方式是否支持第一个索引字段上没有任何约束的扫描。

+

amsearcharray

+

Boolean

+

-

+

访问方式是否支持ScalarArrayOpExpr搜索。

+

amsearchnulls

+

Boolean

+

-

+

访问方式是否支持IS NULL/NOT NULL搜索。

+

amstorage

+

Boolean

+

-

+

允许索引存储的数据类型与列的数据类型是否不同。

+

amclusterable

+

Boolean

+

-

+

是否允许在一个这种类型的索引上openGauss

+

ampredlocks

+

Boolean

+

-

+

是否允许这种类型的一个索引管理细粒度的谓词锁定。

+

amkeytype

+

oid

+

PG_TYPE.oid

+

存储在索引里数据的类型,如果不是一个固定的类型则为0。

+

aminsert

+

regproc

+

PG_PROC.proname

+

“插入这个行”函数。

+

ambeginscan

+

regproc

+

PG_PROC.proname

+

“准备索引扫描” 函数。

+

amgettuple

+

regproc

+

PG_PROC.proname

+

“下一个有效行”函数,如果没有则为0。

+

amgetbitmap

+

regproc

+

PG_PROC.proname

+

“抓取所有的有效行” 函数,如果没有则为0。

+

amrescan

+

regproc

+

PG_PROC.proname

+

“(重新)开始索引扫描”函数。

+

amendscan

+

regproc

+

PG_PROC.proname

+

“索引扫描后清理” 函数。

+

ammarkpos

+

regproc

+

PG_PROC.proname

+

“标记当前扫描位置”函数。

+

amrestrpos

+

regproc

+

PG_PROC.proname

+

“恢复已标记的扫描位置”函数。

+

ammerge

+

regproc

+

PG_PROC.proname

+

“归并多个索引对象”函数。

+

ambuild

+

regproc

+

PG_PROC.proname

+

“建立新索引”函数。

+

ambuildempty

+

regproc

+

PG_PROC.proname

+

“建立空索引”函数。

+

ambulkdelete

+

regproc

+

PG_PROC.proname

+

批量删除函数。

+

amvacuumcleanup

+

regproc

+

PG_PROC.proname

+

VACUUM后的清理函数。

+

amcanreturn

+

regproc

+

PG_PROC.proname

+

检查是否索引支持唯一索引扫描的函数,如果没有则为0。

+

amcostestimate

+

regproc

+

PG_PROC.proname

+

估计一个索引扫描开销的函数。

+

amoptions

+

regproc

+

PG_PROC.proname

+

为一个索引分析和确认reloptions的函数。

+
+ diff --git a/content/zh/docs/Developerguide/PG_AMOP.md b/content/zh/docs/Developerguide/PG_AMOP.md new file mode 100644 index 000000000..f6749f8e0 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AMOP.md @@ -0,0 +1,105 @@ +# PG\_AMOP + +PG\_AMOP系统表存储有关和访问方法操作符族关联的信息。如果一个操作符是一个操作符族中的成员,则在这个表中会占据一行。一个族成员是一个search操作符或一个ordering操作符。一个操作符可以在多个族中出现,但是不能在一个族中的多个搜索位置或多个排序位置中出现。 + +**表 1** PG\_AMOP字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

amopfamily

+

oid

+

PG_OPFAMILY.oid

+

这个项的操作符族。

+

amoplefttype

+

oid

+

PG_TYPE.oid

+

操作符的左输入类型。

+

amoprighttype

+

oid

+

PG_TYPE.oid

+

操作符的右输入类型。

+

amopstrategy

+

smallint

+

-

+

操作符策略数。

+

amoppurpose

+

"char"

+

-

+

操作符目的,s为搜索或o为排序。

+

amopopr

+

oid

+

PG_OPERATOR.oid

+

该操作符的OID。

+

amopmethod

+

oid

+

PG_AM.oid

+

索引访问方式操作符族。

+

amopsortfamily

+

oid

+

PG_OPFAMILY.oid

+

如果是一个排序操作符,则为这个项排序所依据的btree操作符族;如果是一个搜索操作符,则为0。

+
+ +search操作符表明这个操作符族的一个索引可以被搜索,找到所有满足WHERE indexed\_column operator constant的行。显然,这样的操作符必须返回布尔值,并且它的左输入类型必须匹配索引的字段数据类型。 + +ordering操作符表明这个操作符族的一个索引可以被扫描,返回以ORDER BY indexed\_column operator constant顺序表示的行。这样的操作符可以返回任意可排序的数据类型,它的左输入类型也必须匹配索引的字段数据类型。 ORDER BY的确切的语义是由amopsortfamily字段指定的,该字段必须为操作符的返回类型引用一个btree操作符族。 + diff --git a/content/zh/docs/Developerguide/PG_AMPROC.md b/content/zh/docs/Developerguide/PG_AMPROC.md new file mode 100644 index 000000000..64901a83a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AMPROC.md @@ -0,0 +1,77 @@ +# PG\_AMPROC + +PG\_AMPROC系统表存储有关与访问方法操作符族相关联的支持过程的信息。每个属于某个操作符族的支持过程都占有一行。 + +**表 1** PG\_AMPROC字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

amprocfamily

+

oid

+

PG_OPFAMILY.oid

+

该项的操作符族。

+

amproclefttype

+

oid

+

PG_TYPE.oid

+

相关操作符的左输入数据类型。

+

amprocrighttype

+

oid

+

PG_TYPE.oid

+

相关操作符的右输入数据类型。

+

amprocnum

+

smallint

+

-

+

支持过程编号。

+

amproc

+

regproc

+

PG_PROC

+

.proname

+

过程的OID。

+
+ +amproclefttype和amprocrighttype字段的习惯解释,标识一个特定支持过程支持的操作符的左和右输入类型。对于某些访问方式,匹配支持过程本身的输入数据类型,对其他的则不这样。有一个对索引的“缺省”支持过程的概念,amproclefttype和amprocrighttype都等于索引操作符类的opcintype。 + diff --git a/content/zh/docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md b/content/zh/docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md new file mode 100644 index 000000000..b77b3c7b0 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md @@ -0,0 +1,39 @@ +# PG\_APP\_WORKLOADGROUP\_MAPPING + +PG\_APP\_WORKLOADGROUP\_MAPPING系统表提供了数据库负载映射组的信息。 + +**表 1** PG\_APP\_WORKLOADGROUP\_MAPPING字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

appname

+

name

+

应用名称。

+

workload_gpname

+

name

+

映射到的负载组名称。

+
+ diff --git a/content/zh/docs/Developerguide/PG_ATTRDEF.md b/content/zh/docs/Developerguide/PG_ATTRDEF.md new file mode 100644 index 000000000..9ae06feeb --- /dev/null +++ b/content/zh/docs/Developerguide/PG_ATTRDEF.md @@ -0,0 +1,53 @@ +# PG\_ATTRDEF + +PG\_ATTRDEF系统表存储列的默认值。 + +**表 1** PG\_ATTRDEF字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

adrelid

+

oid

+

该列的所属表。

+

adnum

+

smallint

+

该列的数目。

+

adbin

+

pg_node_tree

+

字段缺省值的内部表现形式。

+

adsrc

+

text

+

人类可读的缺省值的内部表现形式。

+
+ diff --git a/content/zh/docs/Developerguide/PG_ATTRIBUTE.md b/content/zh/docs/Developerguide/PG_ATTRIBUTE.md new file mode 100644 index 000000000..03d4e7661 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_ATTRIBUTE.md @@ -0,0 +1,193 @@ +# PG\_ATTRIBUTE + +PG\_ATTRIBUTE系统表存储关于表字段的信息。 + +**表 1** PG\_ATTRIBUTE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

attrelid

+

oid

+

此字段所属表。

+

attname

+

name

+

字段名。

+

atttypid

+

oid

+

字段类型。

+

attstattarget

+

integer

+

控制ANALYZE为这个字段积累的统计细节的级别。

+
  • 零值表示不收集统计信息。
  • 负数表示使用系统缺省的统计对象。
  • 正数值的确切信息是和数据类型相关的。
+

对于标量数据类型,ATTSTATTARGET既是要收集的"最常用数值"的目标数目,也是要创建的柱状图的目标数量。

+

attlen

+

smallint

+

是本字段类型的pg_type.typlen的拷贝。

+

attnum

+

smallint

+

字段编号。

+

attndims

+

integer

+

如果该字段是数组,则是维数,否则是0 。

+

attcacheoff

+

integer

+

在磁盘上的时候总是-1 ,但是如果加载入内存中的行描述器中,它可能会被更新以缓冲在行中字段的偏移量。

+

atttypmod

+

integer

+

记录创建新表时支持的类型特定的数据(比如一个varchar字段的最大长度)。它传递给类型相关的输入和长度转换函数当做第三个参数。其值对那些不需要ATTTYPMOD的类型通常为-1。

+

attbyval

+

Boolean

+

这个字段类型的pg_type.typbyval的拷贝。

+

attstorage

+

"char"

+

这个字段类型的pg_type.typstorage的拷贝。

+

attalign

+

"char"

+

这个字段类型的pg_type.typalign的拷贝。

+

attnotnull

+

Boolean

+

这代表一个非空约束。可以改变这个字段以打开或者关闭这个约束。

+

atthasdef

+

Boolean

+

这个字段有一个缺省值,此时它对应pg_attrdef表里实际定义此值的记录。

+

attisdropped

+

Boolean

+

这个字段已经被删除了,不再有效。一个已经删除的字段物理上仍然存在表中,但会被分析器忽略,因此不能再通过SQL访问。

+

attislocal

+

Boolean

+

这个字段是局部定义在关系中的。请注意一个字段可以同时是局部定义和继承的。

+

attcmprmode

+

tinyint

+
对某一列指定压缩方式。压缩方式包括:
  • ATT_CMPR_NOCOMPRESS
  • ATT_CMPR_DELTA
  • ATT_CMPR_DICTIONARY
  • ATT_CMPR_PREFIX
  • ATT_CMPR_NUMSTR
+
+

attinhcount

+

integer

+

这个字段所拥有的直接父表的个数。如果一个字段的父表个数非零,则它就不能被删除或重命名。

+

attcollation

+

oid

+

对此列定义的校对列。

+

attacl

+

aclitem[]

+

列级访问权限控制。

+

attoptions

+

text[]

+

属性级可选项。

+

attfdwoptions

+

text[]

+

属性级外数据选项。

+

attinitdefval

+

bytea

+

存储了此列默认的值表达式。行存表的ADD COLUMN需要使用此字段。

+

attkvtype

+

tinyint

+

对某一列指定key value类型。类型包括:

+

0. ATT_KV_UNDEFINED : 默认

+

1. ATT_KV_TAG : 维度

+

2. ATT_KV_FIELD : 指标

+

3. ATT_KV_TIMETAG :时间列

+
+ diff --git a/content/zh/docs/Developerguide/PG_AUTHID.md b/content/zh/docs/Developerguide/PG_AUTHID.md new file mode 100644 index 000000000..1d666efd8 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AUTHID.md @@ -0,0 +1,189 @@ +# PG\_AUTHID + +PG\_AUTHID系统表存储有关数据库认证标识符(角色)的信息。角色把“用户”的概念包含在内。一个用户实际上就是一个rolcanlogin标志被设置的角色。任何角色(不管rolcanlogin设置与否)都能够把其他角色作为成员。 + +openGauss中只有一份pg\_authid,不是每个数据库有一份。需要有系统管理员权限才可以访问此系统表。 + +**表 1** PG\_AUTHID字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

rolname

+

name

+

角色名称。

+

rolsuper

+

Boolean

+

角色是否是拥有最高权限的初始系统管理员。

+

rolinherit

+

Boolean

+

角色是否自动继承其所属角色的权限。

+

rolcreaterole

+

Boolean

+

角色是否可以创建更多角色。

+

rolcreatedb

+

Boolean

+

角色是否可以创建数据库。

+

rolcatupdate

+

Boolean

+

角色是否可以直接更新系统表。只有usesysid=10的初始系统管理员拥有此权限。其他用户无法获得此权限。

+

rolcanlogin

+

Boolean

+

角色是否可以登录,也就是说,这个角色可以给予会话认证标识符。

+

rolreplication

+

Boolean

+

角色是一个复制的角色(适配作用,没有实际的功能)。

+

rolauditadmin

+

Boolean

+

审计用户。

+

rolsystemadmin

+

Boolean

+

管理员用户。

+

rolconnlimit

+

integer

+

对于可以登录的角色,限制其最大并发连接数量。

+

-1 表示没有限制。

+

rolpassword

+

text

+

口令(可能是加密的),如果没有口令,则为NULL。

+

rolvalidbegin

+

timestamp with time zone

+

帐户的有效开始时间,如果没有开始时间,则为NULL。

+

rolvaliduntil

+

timestamp with time zone

+

帐户的有效结束时间,如果没有结束时间,则为NULL。

+

rolrespool

+

name

+

用户所能够使用的resource pool。

+

roluseft

+

Boolean

+

角色是否可以操作外表。

+

rolparentid

+

oid

+

用户所在组用户的OID。

+

roltabspace

+

text

+

用户数据表的最大空间限额。

+

rolkind

+

char

+

特殊用户种类,包括私有用户、普通用户。

+

rolnodegroup

+

oid

+

该字段不支持

+

roltempspace

+

text

+

用户临时表的最大空间限额。

+

rolspillspace

+

text

+

用户执行作业时下盘数据的最大空间限额。

+

rolexcpdata

+

text

+

用户可以设置的查询规则(当前未使用)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_AUTH_HISTORY.md b/content/zh/docs/Developerguide/PG_AUTH_HISTORY.md new file mode 100644 index 000000000..01a5dc8e8 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AUTH_HISTORY.md @@ -0,0 +1,46 @@ +# PG\_AUTH\_HISTORY + +PG\_AUTH\_HISTORY系统表记录了角色的认证历史。需要有系统管理员权限才可以访问此系统表。 + +**表 1** PG\_AUTH\_HISTORY字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

roloid

+

oid

+

角色标识。

+

passwordtime

+

timestamp with time zone

+

创建和修改密码的时间。

+

rolpassword

+

text

+

角色密码,使用MD5、SHA256加密或者不加密。

+
+ diff --git a/content/zh/docs/Developerguide/PG_AUTH_MEMBERS.md b/content/zh/docs/Developerguide/PG_AUTH_MEMBERS.md new file mode 100644 index 000000000..13fc63a4f --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AUTH_MEMBERS.md @@ -0,0 +1,46 @@ +# PG\_AUTH\_MEMBERS + +PG\_AUTH\_MEMBERS系统表存储显示角色之间的成员关系。 + +**表 1** PG\_AUTH\_MEMBERS字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

roleid

+

oid

+

拥有成员的角色ID。

+

member

+

oid

+

属于ROLEID角色的一个成员的角色ID。

+

grantor

+

oid

+

赋予此成员关系的角色ID。

+

admin_option

+

Boolean

+

如果MEMBER可以把ROLEID角色的成员关系赋予其他角色,则为真。

+
+ diff --git a/content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md b/content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md new file mode 100644 index 000000000..93c952e48 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md @@ -0,0 +1,46 @@ +# PG\_AVAILABLE\_EXTENSIONS + +PG\_AVAILABLE\_EXTENSIONS视图显示数据库中某些特性的扩展信息。 + +**表 1** PG\_AVAILABLE\_EXTENSIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

name

+

name

+

扩展名。

+

default_version

+

text

+

缺省版本的名称,如果没有指定则为NULL。

+

installed_version

+

text

+

扩展当前安装版本,如果没有安装任何版本则为NULL。

+

comment

+

text

+

扩展的控制文件中的评论字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md b/content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md new file mode 100644 index 000000000..d624b1855 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md @@ -0,0 +1,74 @@ +# PG\_AVAILABLE\_EXTENSION\_VERSIONS + +PG\_AVAILABLE\_EXTENSION\_VERSIONS视图显示数据库中某些特性的扩展版本信息。 + +**表 1** PG\_AVAILABLE\_EXTENSION\_VERSIONS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

name

+

name

+

扩展名。

+

version

+

text

+

版本名。

+

installed

+

Boolean

+

如果这个扩展的版本是当前已经安装了的则为真。

+

superuser

+

Boolean

+

如果只允许系统管理员安装这个扩展则为真。

+

relocatable

+

Boolean

+

如果扩展可以重新加载到另一个模式则为真。

+

schema

+

name

+

扩展必须安装到的模式名,如果部分或全部可重新定位则为NULL。

+

requires

+

name[]

+

先决条件扩展的名称,如果没有则为NULL。

+

comment

+

text

+

扩展的控制文件中的评论字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_CAST.md b/content/zh/docs/Developerguide/PG_CAST.md new file mode 100644 index 000000000..e638cc67c --- /dev/null +++ b/content/zh/docs/Developerguide/PG_CAST.md @@ -0,0 +1,62 @@ +# PG\_CAST + +PG\_CAST系统表存储数据类型之间的转化关系。 + +**表 1** PG\_CAST字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

castsource

+

oid

+

源数据类型的OID。

+

casttarget

+

oid

+

目标数据类型的OID。

+

castfunc

+

oid

+

转化函数的OID。如果为零表明不需要转化函数。

+

castcontext

+

"char"

+
源数据类型和目标数据类型间的转化方式:
  • 'e':表示只能进行显式转化(使用CAST或::语法)。
  • 'i':表示只能进行隐式转化。
  • 'a':表示类型间同时支持隐式和显式转化。
+
+

castmethod

+

"char"

+
转化方法:
  • 'f':使用castfunc字段中指定的函数进行转化。
  • 'b':类型间是二进制强制转化,不使用castfunc。
+
+
+ diff --git a/content/zh/docs/Developerguide/PG_CLASS.md b/content/zh/docs/Developerguide/PG_CLASS.md new file mode 100644 index 000000000..e72d05ee7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_CLASS.md @@ -0,0 +1,379 @@ +# PG\_CLASS + +PG\_CLASS系统表存储数据库对象信息及其之间的关系。 + +**表 1** PG\_CLASS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

relname

+

name

+

表、索引、视图等对象的名称。

+

relnamespace

+

oid

+

包含这个关系的名称空间的OID。

+

reltype

+

oid

+

对应这个表的行类型的数据类型(索引为零,因为索引没有pg_type记录)。

+

reloftype

+

oid

+

复合类型的OID,0表示其他类型。

+

relowner

+

oid

+

关系所有者。

+

relam

+

oid

+

如果行是索引,则就是所用的访问模式(B-tree,hash等)。

+

relfilenode

+

oid

+

这个关系在磁盘上的文件的名称,如果没有则为0。

+

reltablespace

+

oid

+

这个关系存储所在的表空间。如果为零,则意味着使用该数据库的缺省表空间。如果关系在磁盘上没有文件,则这个字段没有什么意义。

+

relpages

+

double precision

+

以页(大小为BLCKSZ)为单位的此表在磁盘上的大小,它只是优化器用的一个近似值。

+

reltuples

+

double precision

+

表中行的数目,只是优化器使用的一个估计值。

+

relallvisible

+

integer

+

被标识为全可见的表中的页的数量。此字段是优化器用来做SQL执行优化使用的。VACUUM、ANALYZE和一些DDL语句(例如,CREATE INDEX)会引起此字段更新。

+

reltoastrelid

+

oid

+

与此表关联的TOAST表的OID ,如果没有则为0。

+

TOAST表在一个从属表里“离线”存储大字段。

+

reltoastidxid

+

oid

+

对于TOAST表是它的索引的OID,如果不是TOAST表则为0。

+

reldeltarelid

+

oid

+

Delta表的OID。

+

Delta表附属于列存表。用于存储数据导入过程中的甩尾数据。

+

reldeltaidx

+

oid

+

Delta表的索引表OID。

+

relcudescrelid

+

oid

+

CU描述表的OID。

+

CU描述表(Desc表)附属于列存表。用于控制表目录中存储数据的可见性。

+

relcudescidx

+

oid

+

CU描述表的索引表OID。

+

relhasindex

+

Boolean

+

如果它是一个表而且至少有(或者最近有过)一个索引,则为真。

+

它是由CREATE INDEX设置的,但DROP INDEX不会立即将它清除。如果VACUUM进程检测一个表没有索引,将会把它将清理relhasindex字段,将值设置为假。

+

relisshared

+

Boolean

+

如果该表在openGauss中由所有数据库共享则为真。只有某些系统表(比如pg_database)是共享的。

+

relpersistence

+

"char"

+
  • p:表示永久表。
  • u:表示非日志表。
  • t:表示临时表。
+

relkind

+

"char"

+
  • r:表示普通表。
  • i:表示索引。
  • S:表示序列。
  • v:表示视图。
  • c:表示复合类型。
  • t:表示TOAST表。
  • f:表示外表。
+

relnatts

+

smallint

+

关系中用户字段数目(除了系统字段以外)。在pg_attribute里肯定有相同数目对应行。

+

relchecks

+

smallint

+

表里的检查约束的数目;参阅pg_constraint表。

+

relhasoids

+

Boolean

+

如果为关系中每行都生成一个OID则为真。

+

relhaspkey

+

Boolean

+

如果这个表有一个(或者曾经有一个)主键,则为真。

+

relhasrules

+

Boolean

+

如表有规则就为真。是否有规则可参考系统表PG_REWRITE。

+

relhastriggers

+

Boolean

+

True表示表中有触发器,或者曾经有过触发器。系统表pg_trigger中记录了表和视图的触发器。

+

relhassubclass

+

Boolean

+

如果有(或者曾经有)任何继承的子表,为真。

+

relcmprs

+

tinyint

+
表示是否启用表的启用压缩特性。需要特别注意,当且仅当批量插入才会触发压缩,普通的CRUD并不能够触发压缩。
  • 0表示其他不支持压缩的表(主要是指系统表,不支持压缩属性的修改操作)。
  • 1表示表数据的压缩特性为NOCOMPRESS或者无指定关键字。
  • 2表示表数据的压缩特性为COMPRESS。
+
+

relhasclusterkey

+

Boolean

+

是否有局部聚簇存储。

+

relrowmovement

+

Boolean

+
针对分区表进行update操作时,是否允许行迁移。
  • true:表示允许行迁移。
  • false:表示不允许行迁移。
+
+

parttype

+

"char"

+
表或者索引是否具有分区表的性质。
  • p:表示带有分区表性质。
  • n:表示没有分区表特性。
+
+

relfrozenxid

+

xid32

+

该表中所有在这个之前的事务ID已经被一个固定的("frozen")事务ID替换。该字段用于跟踪此表是否需要为了防止事务ID重叠(或者允许收缩pg_clog)而进行清理。如果该关系不是表则为零(InvalidTransactionId)。

+

为保持前向兼容,保留此字段,新增relfrozenxid64用于记录此信息。

+

relacl

+

aclitem[]

+

访问权限。

+

查询的回显结果为以下形式:

+
rolename=xxxx/yyyy  --赋予一个角色的权限
+
=xxxx/yyyy  --赋予public的权限
+

xxxx表示赋予的权限,yyyy表示授予这个权限的角色。权限的参数说明请参见表2

+

reloptions

+

text[]

+

索引的访问方法,使用"keyword=value"格式的字符串。

+

relreplident

+

"char"

+
逻辑解码中解码列的标识:
  • d = 默认 (主键,如果存在)。
  • n = 无。
  • f = 所有列。
  • i = 索引的indisreplident被设置或者为默认。
+
+

relfrozenxid64

+

xid

+

该表中所有在这个之前的事务ID已经被一个固定的("frozen")事务ID替换。该字段用于跟踪此表是否需要为了防止事务ID重叠(或者允许收缩pg_clog)而进行清理。如果该关系不是表则为零(InvalidTransactionId)。

+
+ +**表 2** 权限的参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

r

+

SELECT(读)

+

w

+

UPDATE(写)

+

a

+

INSERT(插入)

+

d

+

DELETE

+

D

+

TRUNCATE

+

x

+

REFERENCES

+

t

+

TRIGGER

+

X

+

EXECUTE

+

U

+

USAGE

+

C

+

CREATE

+

c

+

CONNECT

+

T

+

TEMPORARY

+

arwdDxt

+

ALL PRIVILEGES(用于表)

+

*

+

给前面权限的授权选项

+
+ diff --git a/content/zh/docs/Developerguide/PG_COLLATION.md b/content/zh/docs/Developerguide/PG_COLLATION.md new file mode 100644 index 000000000..72919528f --- /dev/null +++ b/content/zh/docs/Developerguide/PG_COLLATION.md @@ -0,0 +1,83 @@ +# PG\_COLLATION + +PG\_COLLATION系统表描述可用的排序规则,本质上从一个SQL名称映射到操作系统本地类别。 + +**表 1** PG\_COLLATION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

collname

+

name

+

-

+

排序规则名(每个名称空间和编码唯一)。

+

collnamespace

+

oid

+

PG_NAMESPACE.oid

+

包含这个排序规则的名称空间的OID。

+

collowner

+

oid

+

PG_AUTHID.oid

+

排序规则的所有者。

+

collencoding

+

integer

+

-

+

排序规则可用的编码,如果适用于任意编码为-1。

+

collcollate

+

name

+

-

+

这个排序规则对象的LC_COLLATE。

+

collctype

+

name

+

-

+

这个排序规则对象的LC_CTYPE。

+
+ diff --git a/content/zh/docs/Developerguide/PG_CONSTRAINT.md b/content/zh/docs/Developerguide/PG_CONSTRAINT.md new file mode 100644 index 000000000..f2af18642 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_CONSTRAINT.md @@ -0,0 +1,214 @@ +# PG\_CONSTRAINT + +PG\_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外键约束。 + +**表 1** PG\_CONSTRAINT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

conname

+

name

+

约束名称(不一定是唯一的)。

+

connamespace

+

oid

+

包含这个约束的名称空间的OID。

+

contype

+

"char"

+
  • c = 检查约束
  • f = 外键约束
  • p = 主键约束
  • u = 唯一约束
  • t = 触发器约束
+

condeferrable

+

Boolean

+

这个约束是否可以推迟。

+

condeferred

+

Boolean

+

缺省时这个约束是否可以推迟。

+

convalidated

+

Boolean

+

约束是否有效。目前,只有外键和CHECK约束可将其设置为FALSE。

+

conrelid

+

oid

+

这个约束所在的表;如果不是表约束则为0。

+

contypid

+

oid

+

这个约束所在的域;如果不是一个域约束则为0。

+

conindid

+

oid

+

与约束关联的索引ID。

+

confrelid

+

oid

+

如果是外键,则为参考的表;否则为0。

+

confupdtype

+

"char"

+
外键更新动作代码。
  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省
+
+

confdeltype

+

"char"

+
外键删除动作代码。
  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省
+
+

confmatchtype

+

"char"

+
外键匹配类型。
  • f = 全部
  • p = 部分
  • u = 简单(未指定)
+
+

conislocal

+

Boolean

+

是否是为关系创建的本地约束。

+

coninhcount

+

integer

+

约束直接继承父表的数目。继承父表数非零时,不能删除或重命名该约束。

+

connoinherit

+

Boolean

+

是否可以被继承。

+

consoft

+

Boolean

+

是否为信息约束(Informational Constraint)。

+

conopt

+

Boolean

+

是否使用信息约束优化执行计划。

+

conkey

+

smallint[]

+

如果是表约束,则是约束控制的字段列表。

+

confkey

+

smallint[]

+

如果是一个外键,是参考的字段的列表。

+

conpfeqop

+

oid[]

+

如果是一个外键,是做PK=FK比较的相等操作符ID的列表。

+

conppeqop

+

oid[]

+

如果是一个外键,是做PK=PK比较的相等操作符ID的列表。

+

conffeqop

+

oid[]

+

如果是一个外键,是做FK=FK比较的相等操作符ID的列表。

+

conexclop

+

oid[]

+

如果是一个排他约束,是列的排他操作符ID列表。

+

conbin

+

pg_node_tree

+

如果是检查约束,那就是其表达式的内部形式。

+

consrc

+

text

+

如果是检查约束,则是表达式的人类可读形式。

+
+ +>![](public_sys-resources/icon-notice.gif) **须知:** +>- consrc在被引用的对象改变之后不会被更新,它不会跟踪字段的名称修改。与其依赖这个字段,最好还是使用pg\_get\_constraintdef\(\)来抽取一个检查约束的定义。 +>- pg\_class.relchecks需要和在此表上为给定关系找到的检查约束的数目一致。 + diff --git a/content/zh/docs/Developerguide/PG_CONVERSION.md b/content/zh/docs/Developerguide/PG_CONVERSION.md new file mode 100644 index 000000000..d6c6cea9b --- /dev/null +++ b/content/zh/docs/Developerguide/PG_CONVERSION.md @@ -0,0 +1,92 @@ +# PG\_CONVERSION + +PG\_CONVERSION系统表描述编码转换信息。 + +**表 1** PG\_CONVERSION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

conname

+

name

+

-

+

转换名称(在一个名称空间里是唯一的)。

+

connamespace

+

oid

+

PG_NAMESPACE.oid

+

包含这个转换的名称空间的OID。

+

conowner

+

oid

+

PG_AUTHID.oid

+

编码转换的属主。

+

conforencoding

+

integer

+

-

+

源编码ID。

+

contoencoding

+

integer

+

-

+

目的编码ID。

+

conproc

+

regproc

+

PG_PROC.proname

+

转换过程。

+

condefault

+

Boolean

+

-

+

如果这是缺省转换则为真。

+
+ diff --git a/content/zh/docs/Developerguide/PG_CURSORS.md b/content/zh/docs/Developerguide/PG_CURSORS.md new file mode 100644 index 000000000..1a67a6207 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_CURSORS.md @@ -0,0 +1,60 @@ +# PG\_CURSORS + +PG\_CURSORS视图列出了当前可用的游标。 + +**表 1** PG\_CURSORS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

name

+

text

+

游标名。

+

statement

+

text

+

声明改游标时的查询语句。

+

is_holdable

+

Boolean

+

如果该游标是持久的(就是在声明该游标的事务结束后仍然可以访问该游标)则为TRUE,否则为FALSE。

+

is_binary

+

Boolean

+

如果该游标被声明为BINARY则为TRUE,否则为FALSE。

+

is_scrollable

+

Boolean

+

如果该游标可以滚动(就是允许以不连续的方式检索)则为TRUE,否则为FALSE。

+

creation_time

+

timestamp with time zone

+

声明该游标的时间戳。

+
+ diff --git a/content/zh/docs/Developerguide/PG_DATABASE.md b/content/zh/docs/Developerguide/PG_DATABASE.md new file mode 100644 index 000000000..6dfe9ed52 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_DATABASE.md @@ -0,0 +1,124 @@ +# PG\_DATABASE + +PG\_DATABASE系统表存储关于可用数据库的信息。 + +**表 1** PG\_DATABASE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

datname

+

name

+

数据库名称。

+

datdba

+

oid

+

数据库所有人,通常为其创建者。

+

encoding

+

integer

+

数据库的字符编码方式。

+

datcollate

+

name

+

数据库使用的排序顺序。

+

datctype

+

name

+

数据库使用的字符分类。

+

datistemplate

+

Boolean

+

是否允许作为模板数据库。

+

datallowconn

+

Boolean

+

如果为假,则没有用户可以连接到这个数据库。这个字段用于保护template0数据库不被更改。

+

datconnlimit

+

integer

+

该数据库上允许的最大并发连接数,-1表示无限制。

+

datlastsysoid

+

oid

+

数据库里最后一个系统OID 。

+

datfrozenxid

+

xid32

+

用于跟踪该数据库是否需要为了防止事务ID重叠而进行清理。

+

为保持前向兼容,保留此字段,新增datfrozenxid64用于记录此信息。

+

dattablespace

+

oid

+

数据库的缺省表空间。

+

datcompatibility

+

name

+

数据库兼容模式。

+

datacl

+

aclitem[]

+

访问权限。

+

datfrozenxid64

+

xid

+

用于跟踪该数据库是否需要为了防止事务ID重叠而进行清理。

+
+ diff --git a/content/zh/docs/Developerguide/PG_DB_ROLE_SETTING.md b/content/zh/docs/Developerguide/PG_DB_ROLE_SETTING.md new file mode 100644 index 000000000..9fa64533e --- /dev/null +++ b/content/zh/docs/Developerguide/PG_DB_ROLE_SETTING.md @@ -0,0 +1,39 @@ +# PG\_DB\_ROLE\_SETTING + +PG\_DB\_ROLE\_SETTING系统表存储数据库运行时每个角色与数据绑定的配置项的默认值 。 + +**表 1** PG\_DB\_ROLE\_SETTING字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

setdatabase

+

oid

+

配置项所对应的数据库,如果未指定数据库,则为0。

+

setrole

+

oid

+

配置项所对应的角色,如果未指定角色,则为0。

+

setconfig

+

text[]

+

运行时配置项的默认值。

+
+ diff --git a/content/zh/docs/Developerguide/PG_DEFAULT_ACL.md b/content/zh/docs/Developerguide/PG_DEFAULT_ACL.md new file mode 100644 index 000000000..5165569e3 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_DEFAULT_ACL.md @@ -0,0 +1,53 @@ +# PG\_DEFAULT\_ACL + +PG\_DEFAULT\_ACL系统表存储为新建对象设置的初始权限。 + +**表 1** PG\_DEFAULT\_ACL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

defaclrole

+

oid

+

与此权限相关的角色ID。

+

defaclnamespace

+

oid

+

与此权限相关的名称空间,如果没有,则为0。

+

defaclobjtype

+

"char"

+

此权限的对象类型。

+

defaclacl

+

aclitem[]

+

创建该类型时所拥有的访问权限。

+
+ diff --git a/content/zh/docs/Developerguide/PG_DEPEND.md b/content/zh/docs/Developerguide/PG_DEPEND.md new file mode 100644 index 000000000..bd2d2ff69 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_DEPEND.md @@ -0,0 +1,93 @@ +# PG\_DEPEND + +PG\_DEPEND系统表记录数据库对象之间的依赖关系。这个信息允许DROP命令找出哪些其它对象必须由DROP CASCADE删除,或者是在DROP RESTRICT的情况下避免删除。 + +这个表的功能类似[PG\_SHDEPEND](PG_SHDEPEND.md#ZH-CN_TOPIC_0242385842),用于记录那些在openGauss之间共享的对象之间的依赖性关系。 + +**表 1** PG\_DEPEND字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

classid

+

oid

+

PG_CLASS.oid

+

有依赖对象所在系统表的OID。

+

objid

+

oid

+

任意OID属性

+

指定的依赖对象的OID。

+

objsubid

+

integer

+

-

+

对于表字段,这个是该属性的字段数(objid和classid引用表本身)。对于所有其它对象类型,目前这个字段是零。

+

refclassid

+

oid

+

PG_CLASS.oid

+

被引用对象所在的系统表的OID。

+

refobjid

+

oid

+

任意OID属性

+

指定的被引用对象的OID。

+

refobjsubid

+

integer

+

-

+

对于表字段,这个是该字段的字段号(refobjid和refclassid引用表本身)。对于所有其它对象类型,目前这个字段是零。

+

deptype

+

"char"

+

-

+

一个定义这个依赖关系特定语义的代码。

+
+ +在所有情况下,一个PG\_DEPEND记录表示被引用的对象不能在有依赖的对象被删除前删除。不过,这里还有几种由deptype定义的情况: + +- 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\_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 new file mode 100644 index 000000000..74a2dab0c --- /dev/null +++ b/content/zh/docs/Developerguide/PG_DESCRIPTION.md @@ -0,0 +1,58 @@ +# PG\_DESCRIPTION + +PG\_DESCRIPTION系统表可以给每个数据库对象存储一个可选的描述(注释)。许多内置的系统对象的描述提供了PG\_DESCRIPTION的初始内容。 + +这个表的功能类似[PG\_SHDESCRIPTION](PG_SHDESCRIPTION.md#ZH-CN_TOPIC_0242385843),用于记录openGauss范围内共享对象的注释。 + +**表 1** PG\_DESCRIPTION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

objoid

+

oid

+

任意OID属性

+

这条描述所描述的对象的OID。

+

classoid

+

oid

+

PG_CLASS.oid

+

这个对象出现的系统表的OID。

+

objsubid

+

integer

+

-

+

对于一个表字段的注释,它是字段号(objoid和classoid指向表自身)。对于其它对象类型,它是零。

+

description

+

text

+

-

+

对该对象描述的任意文本。

+
+ diff --git a/content/zh/docs/Developerguide/PG_DIRECTORY.md b/content/zh/docs/Developerguide/PG_DIRECTORY.md new file mode 100644 index 000000000..e70684f6a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_DIRECTORY.md @@ -0,0 +1,53 @@ +# PG\_DIRECTORY + +PG\_DIRECTORY系统表用于保存用户添加的directory对象可以通过CREATE DIRECTORY语句向该表中添加记录,目前只有系统管理员用户可以向该表中添加记录。 + +**表 1** PG\_DIRECTORY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

dirname

+

name

+

目录对象的名称。

+

owner

+

oid

+

目录对象的所有者。

+

dirpath

+

text

+

目录路径。

+

diracl

+

aclitem[]

+

访问权限。

+
+ diff --git a/content/zh/docs/Developerguide/PG_ENUM.md b/content/zh/docs/Developerguide/PG_ENUM.md new file mode 100644 index 000000000..bb0fdc33e --- /dev/null +++ b/content/zh/docs/Developerguide/PG_ENUM.md @@ -0,0 +1,60 @@ +# PG\_ENUM + +PG\_ENUM系统表包含显示每个枚举类型值和标签的记录。给定枚举类型的内部表示实际上是PG\_ENUM里面相关行的OID。 + +**表 1** PG\_ENUM字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

enumtypid

+

oid

+

PG_TYPE.oid

+

拥有这个枚举值的pg_type记录的OID。

+

enumsortorder

+

real

+

-

+

这个枚举值在它的枚举类型中的排序位置。

+

enumlabel

+

name

+

-

+

这个枚举值的文本标签。

+
+ +PG\_ENUM行的OID跟着一个特殊规则:偶数的OID保证用和它们的枚举类型一样的排序顺序排序。也就是,如果两个偶数OID属于相同的枚举类型,那么较小的OID必须有较小enumsortorder值。奇数OID需要毫无关系的排序顺序。这个规则允许枚举比较例程在许多常见情况下避开目录查找。创建和修改枚举类型的例程只要可能就尝试分配偶数OID给枚举值。 + +当创建了一个枚举类型时,它的成员赋予了排序顺序位置1到n。但是随后添加的成员可能会分配enumsortorder的负值或分数值。对这些值的唯一要求是它们要正确的排序和在每个枚举类型中唯一。 + diff --git a/content/zh/docs/Developerguide/PG_EXTENSION.md b/content/zh/docs/Developerguide/PG_EXTENSION.md new file mode 100644 index 000000000..64be31f18 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_EXTENSION.md @@ -0,0 +1,67 @@ +# PG\_EXTENSION + +PG\_EXTENSION系统表存储关于所安装扩展的信息。openGauss默认有2个扩展,即PLPGSQL和MOT\_FDW。 + +**表 1** PG\_EXTENSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

extname

+

name

+

扩展名。

+

extowner

+

oid

+

扩展的所有者。

+

extnamespace

+

oid

+

扩展导出对象的名称空间。

+

extrelocatable

+

Boolean

+

标识此扩展是否可迁移到其他名称空间,true表示允许。

+

extversion

+

text

+

扩展的版本号。

+

extconfig

+

oid[]

+

扩展的配置信息。

+

extcondition

+

text[]

+

扩展配置信息的过滤条件。

+
+ diff --git a/content/zh/docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md b/content/zh/docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md new file mode 100644 index 000000000..98a379f27 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md @@ -0,0 +1,83 @@ +# PG\_EXTENSION\_DATA\_SOURCE + +PG\_EXTENSION\_DATA\_SOURCE系统表存储外部数据源对象的信息。一个外部数据源对象(Data Source)包含了外部数据库的一些口令编码等信息,主要配合Extension Connector使用。 + +**表 1** PG\_EXTENSION\_DATA\_SOURCE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

srcname

+

name

+

-

+

外部数据源对象的名称。

+

srcowner

+

oid

+

PG_AUTHID.oid

+

外部数据源对象的所有者。

+

srctype

+

text

+

-

+

外部数据源对象的类型,缺省为空。

+

srcversion

+

text

+

-

+

外部数据源对象的版本,缺省为空。

+

srcacl

+

aclitem[]

+

-

+

访问权限。

+

srcoptions

+

text[]

+

-

+

外部数据源对象的指定选项,使用“keyword=value”格式的字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_EXT_STATS.md b/content/zh/docs/Developerguide/PG_EXT_STATS.md new file mode 100644 index 000000000..bd1f0bdfd --- /dev/null +++ b/content/zh/docs/Developerguide/PG_EXT_STATS.md @@ -0,0 +1,140 @@ +# PG\_EXT\_STATS + +PG\_EXT\_STATS视图提供对存储在[PG\_STATISTIC\_EXT](PG_STATISTIC_EXT.md#ZH-CN_TOPIC_0242385846)表里面的扩展统计信息的访问。扩展统计信息目前包括多列统计信息。 + +**表 1** PG\_EXT\_STATS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

包含表的模式名。

+

tablename

+

name

+

PG_CLASS.relname

+

表名。

+

attname

+

int2vector

+

PG_STATISTIC_EXT.stakey

+

统计信息扩展的多列信息。

+

inherited

+

Boolean

+

-

+

如果为真,则包含继承的子列,否则只是指定表的字段。

+

null_frac

+

real

+

-

+

记录中字段组合为空的百分比。

+

avg_width

+

integer

+

-

+

字段组合记录以字节记的平均宽度。

+

n_distinct

+

real

+

-

+
  • 如果大于零,表示字段组合中独立数值的估计数目。
  • 如果小于零,表示独立数值的数目被行数除的负数。
    1. 用负数形式是因为ANALYZE认为独立数值的数目是随着表增长而增长;
    2. 正数的形式用于在字段看上去好像有固定的可能值数目的情况下。比如,-1表示一个字段组合中独立数值的个数和行数相同。
    +
+
  • 如果等于零,表示独立数值的数目未知。
+

n_dndistinct

+

real

+

-

+
标识dn1上字段组合中非NULL数据的唯一值的数目。
  • 如果大于零,表示独立数值的实际数目。
  • 如果小于零,表示独立数值的数目被行数除的负数。(比如,一个字段组合的数值平均出现概率为两次,则可以表示为n_dndistinct=-0.5)。
  • 如果等于零,表示独立数值的数目未知。
+
+

most_common_vals

+

anyarray

+

-

+

一个字段组合里最常用数值的列表。如果该字段组合不存在最常用数值,则为NULL。本列保存的多列常用数值均不为NULL。

+

most_common_freqs

+

real[]

+

-

+

一个最常用数值组合的频率的列表,也就是说,每个出现的次数除以行数。如果most_common_vals是NULL,则为NULL。

+

most_common_vals_null

+

anyarray

+

-

+

一个字段组合里最常用数值的列表。如果该字段组合不存在最常用数值,则为NULL。本列保存的多列常用数值中至少有一个值为NULL。

+

most_common_freqs_null

+

real[]

+

-

+

一个最常用数值组合的频率的列表,也就是说,每个出现的次数除以行数。如果most_common_vals_null是NULL,则为NULL。

+

histogram_bounds

+

anyarray

+

-

+

直方图的边界值列表。

+
+ diff --git a/content/zh/docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md b/content/zh/docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md new file mode 100644 index 000000000..dcfd695f5 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md @@ -0,0 +1,83 @@ +# PG\_FOREIGN\_DATA\_WRAPPER + +PG\_FOREIGN\_DATA\_WRAPPER系统表存储外部数据封装器定义。一个外部数据封装器是在外部服务器上驻留外部数据的机制,是可以访问的。 + +**表 1** PG\_FOREIGN\_DATA\_WRAPPER字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

fdwname

+

name

+

-

+

外部数据封装器名。

+

fdwowner

+

oid

+

PG_AUTHID.oid

+

外部数据封装器的所有者。

+

fdwhandler

+

oid

+

PG_PROC.oid

+

引用一个负责为外部数据封装器提供扩展例程的处理函数。如果没有提供处理函数则为零。

+

fdwvalidator

+

oid

+

PG_PROC.oid

+

引用一个验证器函数,这个验证器函数负责验证给予外部数据封装器的选项、 外部服务器选项和使用外部数据封装器的用户映射的有效性。 如果没有提供验证器函数则为零。

+

fdwacl

+

aclitem[]

+

-

+

访问权限。

+

fdwoptions

+

text[]

+

-

+

外部数据封装器指定选项,使用“keyword=value”格式的字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md b/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md new file mode 100644 index 000000000..9b63fcc8f --- /dev/null +++ b/content/zh/docs/Developerguide/PG_FOREIGN_SERVER.md @@ -0,0 +1,92 @@ +# PG\_FOREIGN\_SERVER + +PG\_FOREIGN\_SERVER系统表存储外部服务器定义。一个外部服务器描述了一个外部数据源,例如一个远程服务器。外部服务器通过外部数据封装器访问。 + +**表 1** PG\_FOREIGN\_SERVER字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

srvname

+

name

+

-

+

外部服务器名。

+

srvowner

+

oid

+

PG_AUTHID.oid

+

外部服务器的所有者。

+

srvfdw

+

oid

+

PG_FOREIGN_DATA_WRAPPER.oid

+

这个外部服务器的外部数据封装器的OID。

+

srvtype

+

text

+

-

+

服务器的类型(可选)。

+

srvversion

+

text

+

-

+

服务器的版本(可选)。

+

srvacl

+

aclitem[]

+

-

+

访问权限。

+

srvoptions

+

text[]

+

-

+

外部服务器指定选项,使用“keyword=value”格式的字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_FOREIGN_TABLE.md b/content/zh/docs/Developerguide/PG_FOREIGN_TABLE.md new file mode 100644 index 000000000..13b99d8b8 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_FOREIGN_TABLE.md @@ -0,0 +1,46 @@ +# PG\_FOREIGN\_TABLE + +PG\_FOREIGN\_TABLE系统表存储外部表的辅助信息。 + +**表 1** PG\_FOREIGN\_TABLE字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

ftrelid

+

oid

+

外部表的ID。

+

ftserver

+

oid

+

外部表的所在服务器。

+

ftwriteonly

+

Boolean

+

外部表是否可写。

+

ftoptions

+

text[]

+

外部表的可选项。

+
+ diff --git a/content/zh/docs/Developerguide/PG_GET_INVALID_BACKENDS.md b/content/zh/docs/Developerguide/PG_GET_INVALID_BACKENDS.md new file mode 100644 index 000000000..f5a0c4f5b --- /dev/null +++ b/content/zh/docs/Developerguide/PG_GET_INVALID_BACKENDS.md @@ -0,0 +1,53 @@ +# PG\_GET\_INVALID\_BACKENDS + +PG\_GET\_INVALID\_BACKENDS视图提供显示数据库主节点上连接到当前备机的后台线程信息。 + +**表 1** PG\_GET\_INVALID\_BACKENDS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

pid

+

bigint

+

线程ID。

+

node_name

+

text

+

后台线程中连接的节点信息。

+

dbname

+

name

+

当前连接的数据库。

+

backend_start

+

timestamp with time zone

+

后台线程启动的时间。

+

query

+

text

+

后台线程正在执行的查询语句。

+
+ diff --git a/content/zh/docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md b/content/zh/docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md new file mode 100644 index 000000000..31f7ff24b --- /dev/null +++ b/content/zh/docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md @@ -0,0 +1,74 @@ +# PG\_GET\_SENDERS\_CATCHUP\_TIME + +PG\_GET\_SENDERS\_CATCHUP\_TIME视图显示数据库节点上当前活跃的主备发送线程的追赶信息。 + +**表 1** PG\_GET\_SENDERS\_CATCHUP\_TIME字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

pid

+

bigint

+

当前sender的线程ID。

+

lwpid

+

integer

+

当前sender的lwpid。

+

local_role

+

text

+

本地的角色。

+

peer_role

+

text

+

对端的角色。

+

state

+

text

+

当前sender的复制状态。

+

type

+

text

+

当前sender的类型。

+

catchup_start

+

timestamp with time zone

+

catchup启动的时间。

+

catchup_end

+

timestamp with time zone

+

catchup结束的时间。

+
+ diff --git a/content/zh/docs/Developerguide/PG_GROUP.md b/content/zh/docs/Developerguide/PG_GROUP.md new file mode 100644 index 000000000..0d47ee3f9 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_GROUP.md @@ -0,0 +1,39 @@ +# PG\_GROUP + +PG\_GROUP视图查看数据库认证角色及角色之间的成员关系。 + +**表 1** PG\_GROUP字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

groname

+

name

+

组的名称。

+

grosysid

+

oid

+

组的ID。

+

grolist

+

oid[]

+

一个数组,包含这个组里面所有角色的ID。

+
+ diff --git a/content/zh/docs/Developerguide/PG_INDEX.md b/content/zh/docs/Developerguide/PG_INDEX.md new file mode 100644 index 000000000..827c6781e --- /dev/null +++ b/content/zh/docs/Developerguide/PG_INDEX.md @@ -0,0 +1,152 @@ +# PG\_INDEX + +PG\_INDEX系统表存储索引的一部分信息,其他的信息大多数在PG\_CLASS中。 + +**表 1** PG\_INDEX字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

indexrelid

+

oid

+

这个索引在pg_class里的记录的OID。

+

indrelid

+

oid

+

使用这个索引的表在pg_class里的记录的OID。

+

indnatts

+

smallint

+

索引中的字段数目。

+

indisunique

+

Boolean

+

如果为真,这是个唯一索引。

+

indisprimary

+

Boolean

+

如果为真,该索引代表该表的主键。这个字段为真的时候indisunique总是为真。

+

indisexclusion

+

Boolean

+

如果为真,该索引支持排他约束。

+

indimmediate

+

Boolean

+

如果为真,在插入数据时会立即进行唯一性检查。

+

indisclustered

+

Boolean

+

如果为真,则该表最后在这个索引上建了簇。

+

indisusable

+

Boolean

+

如果为真,该索引对insert/select可用。

+

indisvalid

+

Boolean

+

如果为真,则该索引可以用于查询。如果为假,则该索引可能不完整,仍然必须在INSERT/UPDATE操作时进行更新,不过不能安全的用于查询。如果是唯一索引,则唯一属性也将不为真。

+

indcheckxmin

+

Boolean

+

如果为true,查询不能使用索引,直到pg_index此行的xmin低于其快照的TransactionXmin,因为该表可能包含它们能看到的不兼容行断开的HOT链。

+

indisready

+

Boolean

+

如果为真,表示此索引对插入数据是可用的,否则,在插入或修改数据时忽略此索引。

+

indkey

+

int2vector

+

这是一个包含indnatts值的数组,这些数组值表示这个索引所建立的表字段。比如一个值为1 3的意思是第一个字段和第三个字段组成这个索引键字。这个数组里的零表明对应的索引属性是在这个表字段上的一个表达式,而不是一个简单的字段引用。

+

indcollation

+

oidvector

+

+

索引用到的各列的ID。

+

indclass

+

oidvector

+

对于索引键字里面的每个字段,这个字段都包含一个指向所使用的操作符类的OID,参阅pg_opclass获取细节。

+

indoption

+

int2vector

+

存储列前标识位,该标识位是由索引的访问方法定义。

+

indexprs

+

pg_node_tree

+

表达式树(以nodeToString()形式表现)用于那些非简单字段引用的索引属性。它是一个列表,个数与INDKEY中的零值个数相同。如果所有索引属性都是简单的引用,则为空。

+

indpred

+

pg_node_tree

+

部分索引断言的表达式树(以nodeToString()的形式表现)。如果不是部分索引,则是空字符串。

+

indisreplident

+

Boolean

+

如果为真,则此索引的列成为逻辑解码的解码列。

+
+ diff --git a/content/zh/docs/Developerguide/PG_INDEXES.md b/content/zh/docs/Developerguide/PG_INDEXES.md new file mode 100644 index 000000000..08436cd9a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_INDEXES.md @@ -0,0 +1,65 @@ +# PG\_INDEXES + +PG\_INDEXES视图提供对数据库中每个索引的有用信息的访问。 + +**表 1** PG\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

包含表和索引的模式名称。

+

tablename

+

name

+

PG_CLASS.relname

+

此索引所服务的表的名称。

+

indexname

+

name

+

PG_CLASS.relname

+

索引的名称。

+

tablespace

+

name

+

PG_TABLESPACE.nspname

+

包含索引的表空间名称。

+

indexdef

+

text

+

-

+

索引定义(一个重建的CREATE INDEX命令)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_INHERITS.md b/content/zh/docs/Developerguide/PG_INHERITS.md new file mode 100644 index 000000000..ec2cb601a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_INHERITS.md @@ -0,0 +1,47 @@ +# PG\_INHERITS + +PG\_INHERITS系统表记录关于表继承层次的信息。数据库里每个直接的子系表都有一条记录。间接的继承可以通过追溯记录链来判断。 + +**表 1** PG\_INHERITS字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

inhrelid

+

oid

+

PG_CLASS.oid

+

子表的OID。

+

inhparent

+

oid

+

PG_CLASS.oid

+

父表的OID。

+

inhseqno

+

integer

+

-

+

如果一个子表存在多个直系父表(多重继承),这个数字表明此继承字段的排列顺序。计数从1开始。

+
+ diff --git a/content/zh/docs/Developerguide/PG_JOB.md b/content/zh/docs/Developerguide/PG_JOB.md new file mode 100644 index 000000000..d12be7c82 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_JOB.md @@ -0,0 +1,140 @@ +# PG\_JOB + +PG\_JOB系统表存储用户创建的定时任务的任务详细信息,定时任务线程定时轮询pg\_job系统表中的时间,当任务到期会触发任务的执行,并更新pg\_job表中的任务状态。该系统表属于Shared Relation,所有创建的job记录对所有数据库可见。 + +**表 1** PG\_JOB字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

job_id

+

bigint

+

作业ID,主键,是唯一的(有唯一索引)

+

current_postgres_pid

+

bigint

+

如果当前任务已被执行,那么此处记录运行此任务的postgres线程ID。默认为 -1,表示此任务未被执行过。

+

log_user

+

name

+

创建者的UserName

+

priv_user

+

name

+

作业执行者的UserName

+

dbname

+

name

+

标识作业要在哪个数据库执行的数据库名称

+

node_name

+

name

+

标识当前作业是在哪个数据库主节点上创建和执行

+

job_status

+

"char"

+

当前任务的执行状态,取值范围:('r', 's', 'f', 'd'),默认为's',取值含义:

+

Status of job step: r=running, s=successfully finished, f=job failed, d=disable

+

当job连续执行失败16次,会将job_status自动设置为失效状态'd',后续不再执行该job。

+

注:当用户将定时任务关闭(即:guc参数job_queue_processes为0时),由于监控job执行的线程不会启动,所以该状态不会根据job的实时状态进行设置,用户不需要关注此状态。只有当开启定时任务功能(即:guc参数job_queue_processes为非0时),系统才会根据当前job的实时状态刷新该字段值。

+

start_date

+

timestamp without time zone

+

作业第一次开始执行时间,时间精确到毫秒。

+

next_run_date

+

timestamp without time zone

+

下次定时执行任务的时间,时间精确到毫秒。

+

failure_count

+

smallint

+

失败计数,作业连续执行失败16次,不再继续执行。

+

interval

+

text

+

作业执行的重复时间间隔。

+

last_start_date

+

timestamp without time zone

+

上次运行开始时间,时间精确到毫秒。

+

last_end_date

+

timestamp without time zone

+

上次运行的结束时间,时间精确到毫秒。

+

last_suc_date

+

timestamp without time zone

+

上次成功运行的开始时间,时间精确到毫秒。

+

this_run_date

+

timestamp without time zone

+

正在运行任务的开始时间,时间精确到毫秒。

+

nspname

+

name

+

标识作业执行时的schema的名称。

+
+ diff --git a/content/zh/docs/Developerguide/PG_JOB_PROC.md b/content/zh/docs/Developerguide/PG_JOB_PROC.md new file mode 100644 index 000000000..4d4c22b1e --- /dev/null +++ b/content/zh/docs/Developerguide/PG_JOB_PROC.md @@ -0,0 +1,39 @@ +# PG\_JOB\_PROC + +PG\_JOB\_PROC系统表对应PG\_JOB表中每个任务的作业内容(包括:PL/SQL代码块、匿名块)。将存储过程信息独立出来,是因为A中这个字段是varchar\(4000\)的,如果放到PG\_JOB中,被加载到共享内存的时候,会占用不必要的空间,所以在使用的时候再进行查询获取。 + +**表 1** PG\_JOB\_PROC字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

job_oid

+

integer

+

外键,关联pg_job表中的job_id。

+

what

+

text

+

作业内容。

+
+ diff --git a/content/zh/docs/Developerguide/PG_LANGUAGE.md b/content/zh/docs/Developerguide/PG_LANGUAGE.md new file mode 100644 index 000000000..e5d46f46f --- /dev/null +++ b/content/zh/docs/Developerguide/PG_LANGUAGE.md @@ -0,0 +1,101 @@ +# PG\_LANGUAGE + +PG\_LANGUAGE系统表登记编程语言,用户可以用这些语言或接口写函数或者存储过程。 + +**表 1** PG\_LANGUAGE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性;必须明确选择)。

+

lanname

+

name

+

-

+

语言的名称。

+

lanowner

+

oid

+

PG_AUTHID.oid

+

语言的所有者。

+

lanispl

+

Boolean

+

-

+

对于内部语言而言是假(比如SQL),对于用户定义的语言则是真。目前,gs_dump仍然使用这个东西判断哪种语言需要转储,但是这些可能在将来被其它机制取代。

+

lanpltrusted

+

Boolean

+

-

+

如果这是可信语言则为真,意味着系统相信它不会被授予任何正常SQL执行环境之外的权限。只有初始用户可以用不可信的语言创建函数。

+

lanplcallfoid

+

oid

+

PG_PROC.oid

+

对于非内部语言,这是指向该语言处理器的引用,语言处理器是一个特殊函数, 负责执行以某种语言写的所有函数。

+

laninline

+

oid

+

PG_PROC.oid

+

这个字段引用一个负责执行“inline”匿名代码块的函数(DO块)。如果不支持内联块则为零。

+

lanvalidator

+

oid

+

PG_PROC.oid

+

这个字段引用一个语言校验器函数,它负责检查新创建的函数的语法和有效性。如果没有提供校验器,则为零。

+

lanacl

+

aclitem[]

+

-

+

访问权限。

+
+ diff --git a/content/zh/docs/Developerguide/PG_LARGEOBJECT.md b/content/zh/docs/Developerguide/PG_LARGEOBJECT.md new file mode 100644 index 000000000..cb9df0f0b --- /dev/null +++ b/content/zh/docs/Developerguide/PG_LARGEOBJECT.md @@ -0,0 +1,51 @@ +# PG\_LARGEOBJECT + +PG\_LARGEOBJECT系统表保存那些标记着“大对象”的数据。一个大对象是使用其创建时分配的OID标识的。每个大对象都分解成足够小的小段或者“页面”以便以行的形式存储在PG\_LARGEOBJECT里。每页的数据定义为LOBLKSIZE。 + +需要有系统管理员权限才可以访问此系统表。 + +**表 1** PG\_LARGEOBJECT字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

loid

+

oid

+

PG_LARGEOBJECT_METADATA.oid

+

包含本页的大对象的标识符。

+

pageno

+

integer

+

-

+

本页在其大对象数据中的页码从零开始计算。

+

data

+

bytea

+

-

+

存储在大对象中的实际数据。这些数据绝不会超过LOBLKSIZE字节,而且可能更少。

+
+ +PG\_LARGEOBJECT的每一行保存一个大对象的一个页面,从该对象内部的字节偏移(pageno \* LOBLKSIZE)开始。这种实现允许松散的存储:页面可以丢失,而且可以比LOBLKSIZE字节少(即使它们不是对象的最后一页)。大对象内丢失的部分读做零。 + diff --git a/content/zh/docs/Developerguide/PG_LARGEOBJECT_METADATA.md b/content/zh/docs/Developerguide/PG_LARGEOBJECT_METADATA.md new file mode 100644 index 000000000..b7e7d0b43 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_LARGEOBJECT_METADATA.md @@ -0,0 +1,47 @@ +# PG\_LARGEOBJECT\_METADATA + +PG\_LARGEOBJECT\_METADATA系统表存储与大数据相关的元数据。实际的大对象数据存储在PG\_LARGEOBJECT里。 + +**表 1** PG\_LARGEOBJECT\_METADATA字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

lomowner

+

oid

+

PG_AUTHID.oid

+

大对象的所有者。

+

lomacl

+

aclitem[]

+

-

+

访问权限。

+
+ diff --git a/content/zh/docs/Developerguide/PG_LOCKS.md b/content/zh/docs/Developerguide/PG_LOCKS.md new file mode 100644 index 000000000..6323f375a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_LOCKS.md @@ -0,0 +1,165 @@ +# PG\_LOCKS + +PG\_LOCKS视图存储各打开事务所持有的锁信息。 + +**表 1** PG\_LOCKS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

locktype

+

text

+

-

+

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

+

database

+

oid

+

PG_DATABASE.oid

+

被锁定对象所在数据库的OID。

+
  • 如果被锁定的对象是共享对象,则OID为0。
  • 如果是一个事务ID,则为NULL。
+

relation

+

oid

+

PG_CLASS.oid

+

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

+

page

+

integer

+

-

+

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

+

tuple

+

smallint

+

-

+

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

+

virtualxid

+

text

+

-

+

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

+

transactionid

+

xid

+

-

+

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

+

classid

+

oid

+

PG_CLASS.oid

+

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

+

objid

+

oid

+

-

+

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

+

objsubid

+

smallint

+

-

+

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

+

virtualtransaction

+

text

+

-

+

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

+

pid

+

bigint

+

-

+

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

+

sessionid

+

bigint

+

-

+

持有或者等待这个锁的会话ID。

+

mode

+

text

+

-

+

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

+

granted

+

Boolean

+

-

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

fastpath

+

Boolean

+

-

+

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

+
+ diff --git a/content/zh/docs/Developerguide/PG_NAMESPACE.md b/content/zh/docs/Developerguide/PG_NAMESPACE.md new file mode 100644 index 000000000..4819bca88 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_NAMESPACE.md @@ -0,0 +1,53 @@ +# PG\_NAMESPACE + +PG\_NAMESPACE系统表存储名称空间,即存储schema相关的信息。 + +**表 1** PG\_NAMESPACE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

nspname

+

name

+

名称空间的名称。

+

nspowner

+

oid

+

名称空间的所有者。

+

nsptimeline

+

bigint

+

数据库节点上创建此命名空间时的时间线。此字段为内部使用,仅在数据库节点上有效。

+

nspacl

+

aclitem[]

+

访问权限。具体请参见GRANTREVOKE

+
+ diff --git a/content/zh/docs/Developerguide/PG_NODE_ENV.md b/content/zh/docs/Developerguide/PG_NODE_ENV.md new file mode 100644 index 000000000..85ad87580 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_NODE_ENV.md @@ -0,0 +1,67 @@ +# PG\_NODE\_ENV + +PG\_NODE\_ENV视图提供获取当前节点的环境变量信息。 + +**表 1** PG\_NODE\_ENV字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

当前节点的名称。

+

host

+

text

+

当前节点的主机名称。

+

process

+

integer

+

当前节点的进程号。

+

port

+

integer

+

当前节点的端口号。

+

installpath

+

text

+

当前节点的安装目录。

+

datapath

+

text

+

当前节点的数据目录。

+

log_directory

+

text

+

当前节点的日志目录。

+
+ diff --git a/content/zh/docs/Developerguide/PG_OBJECT.md b/content/zh/docs/Developerguide/PG_OBJECT.md new file mode 100644 index 000000000..0378fc7a0 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_OBJECT.md @@ -0,0 +1,61 @@ +# PG\_OBJECT + +PG\_OBJECT系统表存储限定类型对象(普通表,索引,序列,视图,存储过程和函数)的创建用户、创建时间和最后修改时间。 + +**表 1** PG\_OBJECT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

object_oid

+

oid

+

对象标识符

+

object_type

+

"char"

+

对象类型:

+
  • r 表示普通表
  • i 表示索引
  • s 表示序列
  • v 表示视图
  • p 表示存储过程和函数
+

creator

+

oid

+

创建用户的标识符

+

ctime

+

timestamp with time zone

+

对象的创建时间

+

mtime

+

timestamp with time zone

+

对象的最后修改时间,修改行为包括ALTER操作和GRANT、REVOKE操作

+
+ +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 无法记录初始化数据库(initdb)过程中所创建或修改的对象,即PG\_OBJECT无法查询到该对象记录。 +>- 对于升级至openGauss V500R001C00版本的数据库,无法记录升级以前所创建的对象,即PG\_OBJECT无法查询到该对象记录。 +>- 对于上述两类对象再次修改时,会记录其修改时间(mtime),由于无法得知该对象创建时间,因此ctime为空。 +>- ctime和mtime所记录的时间为用户当次操作所属事务的起始时间。 +>- 由扩容引起的对象修改时间也会被记录。 + diff --git a/content/zh/docs/Developerguide/PG_OPCLASS.md b/content/zh/docs/Developerguide/PG_OPCLASS.md new file mode 100644 index 000000000..176387246 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_OPCLASS.md @@ -0,0 +1,105 @@ +# PG\_OPCLASS + +PG\_OPCLASS系统表定义索引访问方法操作符类。 + +每个操作符类为一种特定数据类型和一种特定索引访问方法定义索引字段的语义。一个操作符类本质上指定一个特定的操作符族适用于一个特定的可索引的字段数据类型。索引的字段实际可用的族中的操作符集是接受字段的数据类型作为它们的左边的输入的那个。 + +**表 1** PG\_OPCLASS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

opcmethod

+

oid

+

PG_AM.oid

+

操作符类所服务的索引访问方法。

+

opcname

+

name

+

-

+

这个操作符类的名称。

+

opcnamespace

+

oid

+

PG_NAMESPACE.oid

+

这个操作符类的名称空间。

+

opcowner

+

oid

+

PG_AUTHID.oid

+

操作符类属主。

+

opcfamily

+

oid

+

PG_OPFAMILY.oid

+

包含该操作符类的操作符族。

+

opcintype

+

oid

+

PG_TYPE.oid

+

操作符类索引的数据类型。

+

opcdefault

+

Boolean

+

-

+

如果操作符类是opcintype的缺省,则为真。

+

opckeytype

+

oid

+

PG_TYPE.oid

+

索引数据的类型,如果和opcintype相同则为零。

+
+ +一个操作符类的opcmethod必须匹配包含它的操作符族的opfmethod。同样,对于任意给定的opcmethod和opcintype的组合,不能有超过一个PG\_OPCLASS行有opcdefault为真。 + diff --git a/content/zh/docs/Developerguide/PG_OPERATOR.md b/content/zh/docs/Developerguide/PG_OPERATOR.md new file mode 100644 index 000000000..9ea52785b --- /dev/null +++ b/content/zh/docs/Developerguide/PG_OPERATOR.md @@ -0,0 +1,155 @@ +# PG\_OPERATOR + +PG\_OPERATOR系统表存储有关操作符的信息。 + +**表 1** PG\_OPERATOR字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

oprname

+

name

+

-

+

操作符的名称。

+

oprnamespace

+

oid

+

PG_NAMESPACE.oid

+

包含此操作符的名称空间的OID。

+

oprowner

+

oid

+

PG_AUTHID.oid

+

操作符所有者。

+

oprkind

+

"char"

+

-

+
  • b=infix =中缀(“两边”)
  • l=前缀(“左边”)
  • r=后缀(“右边”)
+

oprcanmerge

+

Boolean

+

-

+

这个操作符支持合并连接。

+

oprcanhash

+

Boolean

+

-

+

这个操作符支持Hash连接。

+

oprleft

+

oid

+

PG_TYPE.oid

+

左操作数的类型。

+

oprright

+

oid

+

PG_TYPE.oid

+

右操作数的类型。

+

oprresult

+

oid

+

PG_TYPE.oid

+

结果类型。

+

oprcom

+

oid

+

PG_OPERATOR.oid

+

此操作符的交换符,如果存在的话。

+

oprnegate

+

oid

+

PG_OPERATOR.oid

+

此操作符的反转器,如果存在的话。

+

oprcode

+

regproc

+

PG_PROC.proname

+

实现这个操作符的函数。

+

oprrest

+

regproc

+

PG_PROC.proname

+

此操作符的约束选择性计算函数。

+

oprjoin

+

regproc

+

PG_PROC.proname

+

此操作符的连接选择性计算函数。

+
+ diff --git a/content/zh/docs/Developerguide/PG_OPFAMILY.md b/content/zh/docs/Developerguide/PG_OPFAMILY.md new file mode 100644 index 000000000..ec37dc0ae --- /dev/null +++ b/content/zh/docs/Developerguide/PG_OPFAMILY.md @@ -0,0 +1,69 @@ +# PG\_OPFAMILY + +PG\_OPFAMILY系统表定义操作符族。 + +每个操作符族是一个操作符和相关支持例程的集合,其中的例程实现为一个特定的索引访问方式指定的语义。另外,族中的操作符都是“兼容的”,通过由访问方式指定的方法。操作符族的概念允许交叉数据类型操作符和索引一起使用,并且合理的使用访问方式的语义的知识。 + +**表 1** PG\_OPFAMILY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

opfmethod

+

oid

+

PG_AM.oid

+

操作符族使用的索引方法。

+

opfname

+

name

+

-

+

这个操作符族的名称。

+

opfnamespace

+

oid

+

PG_NAMESPACE.oid

+

这个操作符的名称空间。

+

opfowner

+

oid

+

PG_AUTHID.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)里。 + diff --git a/content/zh/docs/Developerguide/PG_OS_THREADS.md b/content/zh/docs/Developerguide/PG_OS_THREADS.md new file mode 100644 index 000000000..340aeaf7b --- /dev/null +++ b/content/zh/docs/Developerguide/PG_OS_THREADS.md @@ -0,0 +1,53 @@ +# PG\_OS\_THREADS + +PG\_OS\_THREADS视图提供当前节点下所有线程的状态信息。 + +**表 1** PG\_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/PG_PARTITION.md b/content/zh/docs/Developerguide/PG_PARTITION.md new file mode 100644 index 000000000..779b1c7b6 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_PARTITION.md @@ -0,0 +1,225 @@ +# PG\_PARTITION + +PG\_PARTITION系统表存储数据库内所有分区表\(partitioned table\)、分区\(table partition\)、分区上toast表和分区索引\(index partition\)四类对象的信息。分区表索引\(partitioned index\)的信息不在PG\_PARTITION系统表中保存。 + +**表 1** PG\_PARTITION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

relname

+

name

+

分区表、分区、分区上toast表和分区索引的名称。

+

parttype

+

"char"

+
对象类型:
  • 'r':partitioned table
  • 'p':table partition
  • 'x':index partition
  • 't':toast table
+
+

parentid

+

oid

+

当对象为分区表或分区时,此字段表示分区表在PG_CLASS中的OID。

+

当对象为index partition时,此字段表示所属分区表索引(partitioned index)的OID。

+

rangenum

+

integer

+

保留字段。

+

intervalnum

+

integer

+

保留字段。

+

partstrategy

+

"char"

+
分区表分区策略,现在仅支持:
  • 'r':范围分区。
  • 'v':数值分区。
+
+

relfilenode

+

oid

+

table partition、index partition、分区上toast表的物理存储位置。

+

reltablespace

+

oid

+

table partition、index partition、分区上toast表所属表空间的OID。

+

relpages

+

double precision

+

统计信息:table partition、index partition的数据页数量。

+

reltuples

+

double precision

+

统计信息:table partition、index partition的元组数。

+

relallvisible

+

integer

+

统计信息:table partition、index partition的可见数据页数。

+

reltoastrelid

+

oid

+

table partition所对应toast表的OID。

+

reltoastidxid

+

oid

+

table partition所对应toast表的索引的OID。

+

indextblid

+

oid

+

index partition对应table partition的OID。

+

indisusable

+

Boolean

+

分区索引是否可用。

+

reldeltarelid

+

oid

+

Delta表的OID。

+

reldeltaidx

+

oid

+

Delta表的索引表的OID。

+

relcudescrelid

+

oid

+

CU描述表的OID。

+

relcudescidx

+

oid

+

CU描述表的索引表的OID。

+

relfrozenxid

+

xid32

+

冻结事务ID号。

+

为保持前向兼容,保留此字段,新增relfrozenxid64用于记录此信息。

+

intspnum

+

integer

+

间隔分区所属表空间的个数。

+

partkey

+

int2vector

+

分区键的列号。

+

intervaltablespace

+

oidvector

+

间隔分区所属的表空间,间隔分区以round-robin方式落在这些表空间内。

+

interval

+

text[]

+

间隔分区的间隔值。

+

boundaries

+

text[]

+

范围分区和间隔分区的上边界。

+

transit

+

text[]

+

间隔分区的跳转点。

+

reloptions

+

text[]

+

设置partition的存储属性,与pg_class.reloptions的形态一样,用"keyword=value"格式的字符串来表示 ,目前用于在线扩容的信息搜集。

+

relfrozenxid64

+

xid

+

冻结事务ID号。

+
+ diff --git a/content/zh/docs/Developerguide/PG_PLTEMPLATE.md b/content/zh/docs/Developerguide/PG_PLTEMPLATE.md new file mode 100644 index 000000000..1834ff682 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_PLTEMPLATE.md @@ -0,0 +1,74 @@ +# PG\_PLTEMPLATE + +PG\_PLTEMPLATE系统表存储过程语言的“模板”信息。 + +**表 1** PG\_PLTEMPLATE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

tmplname

+

name

+

这个模板所应用的语言的名称。

+

tmpltrusted

+

Boolean

+

如果语言被认为是可信的,则为真。

+

tmpldbacreate

+

Boolean

+

如果语言是由数据库所有者创建的,则为真。

+

tmplhandler

+

text

+

调用处理器函数的名称。

+

tmplinline

+

text

+

匿名块处理器的名称,若没有则为NULL。

+

tmplvalidator

+

text

+

校验函数的名称,如果没有则为NULL。

+

tmpllibrary

+

text

+

实现语言的共享库的路径。

+

tmplacl

+

aclitem[]

+

模板的访问权限(未使用)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_PREPARED_STATEMENTS.md b/content/zh/docs/Developerguide/PG_PREPARED_STATEMENTS.md new file mode 100644 index 000000000..c026f77ef --- /dev/null +++ b/content/zh/docs/Developerguide/PG_PREPARED_STATEMENTS.md @@ -0,0 +1,53 @@ +# PG\_PREPARED\_STATEMENTS + +PG\_PREPARED\_STATEMENTS视图显示当前会话所有可用的预备语句。 + +**表 1** PG\_PREPARED\_STATEMENTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

name

+

text

+

预备语句的标识符。

+

statement

+

text

+

创建该预备语句的查询字符串。对于从SQL创建的预备语句而言是客户端提交的PREPARE语句;对于通过前/后端协议创建的预备语句而言是预备语句自身的文本。

+

prepare_time

+

timestamp with time zone

+

创建该预备语句的时间戳。

+

parameter_types

+

regtype[]

+

该预备语句期望的参数类型,以regtype类型的数组格式出现。与该数组元素相对应的OID可以通过把regtype转换为oid值得到。

+

from_sql

+

Boolean

+
  • 如果该预备语句是通过PREPARE语句创建的则为true。
  • 如果是通过前/后端协议创建的则为false。
+
+ diff --git a/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md b/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md new file mode 100644 index 000000000..32c0afba7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_PREPARED_XACTS.md @@ -0,0 +1,65 @@ +# PG\_PREPARED\_XACTS + +PG\_PREPARED\_XACTS视图显示当前准备好进行两阶段提交的事务的信息。 + +**表 1** PG\_PREPARED\_XACTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

transaction

+

xid

+

-

+

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

+

gid

+

text

+

-

+

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

+

prepared

+

timestamp with time zone

+

-

+

事务准备好提交的时间。

+

owner

+

name

+

PG_AUTHID.rolname

+

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

+

database

+

name

+

PG_DATABASE.datname

+

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

+
+ diff --git a/content/zh/docs/Developerguide/PG_PROC.md b/content/zh/docs/Developerguide/PG_PROC.md new file mode 100644 index 000000000..f54c7ef82 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_PROC.md @@ -0,0 +1,236 @@ +# PG\_PROC + +PG\_PROC系统表存储函数或过程的信息。 + +**表 1** PG\_PROC字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

proname

+

name

+

函数名称。

+

pronamespace

+

oid

+

包含该函数名称空间的OID。

+

proowner

+

oid

+

函数的所有者。

+

prolang

+

oid

+

这个函数的实现语言或调用接口。

+

procost

+

real

+

估算的执行成本。

+

prorows

+

real

+

估算的影响行的数目。

+

provariadic

+

oid

+

参数元素的数据类型。

+

protransform

+

regproc

+

此函数的简化调用方式。

+

proisagg

+

Boolean

+

函数是聚集函数。

+

proiswindow

+

Boolean

+

函数是窗口函数。

+

prosecdef

+

Boolean

+

函数是一个安全定义器(也就是一个“setuid”函数)。

+

proleakproof

+

Boolean

+

函数没副作用。如果函数没有对参数进行防泄露处理,则会抛出错误。

+

proisstrict

+

Boolean

+

如果任何调用参数是空,则函数返回空。这时函数实际上连调用都不调用。不是“strict”的函数必须准备处理空输入。

+

proretset

+

Boolean

+

函数返回一个集合(也就是说,指定数据类型的多个数值)。

+

provolatile

+

"char"

+
告诉该函数的结果是否只倚赖于它的输入参数,或者还会被外接因素影响。
  • 对于“不可变的”(immutable)它是i,这样的函数对于相同的输入总是产生相同的结果。
  • 对于“稳定的”(stable)函数它是s,(对于固定输入)其结果在一次扫描里不变。
  • 对于“易变”(volatile)函数它是v,其结果可能在任何时候变化v也用于那些有副作用的函数,因此调用它们无法得到优化。
+
+

pronargs

+

smallint

+

参数数目。

+

pronargdefaults

+

smallint

+

有默认值的参数数目。

+

prorettype

+

oid

+

返回值的数据类型。

+

proargtypes

+

oidvector

+

一个存放函数参数的数据类型的数组。数组里只包括输入参数(包括INOUT参数)此代表该函数的调用签名(接口)。

+

proallargtypes

+

oid[]

+

一个包含函数参数的数据类型的数组。数组里包括所有参数的类型(包括OUT和INOUT参数),如果所有参数都是IN参数,则这个字段就会是空。请注意数组下标是以1为起点的,而因为历史原因,proargtypes的下标起点为0。

+

proargmodes

+

"char"[]

+

一个保存函数参数模式的数组,编码如下:i表示IN参数,o表示OUT参数,b表示INOUT参数。如果所有参数都是IN参数,则这个字段为空。请注意,下标对应的是proallargtypes的位置,而不是proargtypes。

+

proargnames

+

text[]

+

一个保存函数参数的名称的数组。没有名称的参数在数组里设置为空字符串。如果没有一个参数有名称,这个字段将是空。请注意,此数组的下标对应proallargtypes而不是proargtypes。

+

proargdefaults

+

pg_node_tree

+

默认值的表达式树。是PRONARGDEFAULTS元素的列表。

+

prosrc

+

text

+

描述函数或存储过程的定义。例如,对于解释型语言来说就是函数的源程序,或者一个链接符号,一个文件名,或者函数和存储过程创建时指定的其他任何函数体内容,具体取决于语言/调用习惯的实现。

+

probin

+

text

+

关于如何调用该函数的附加信息。同样,其含义也是和语言相关的。

+

proconfig

+

text[]

+

函数针对运行时配置变量的本地设置。

+

proacl

+

aclitem[]

+

访问权限。具体请参见GRANTREVOKE

+

prodefaultargpos

+

int2vector

+

函数默认值的位置,不局限于能最后几个参数才可有默认值。

+

fencedmode

+

Boolean

+

函数的执行模式,表示函数是在fence还是not fence模式下执行。如果是fence执行模式,函数的执行会在重新fork的进程中执行。默认值是fence。

+

propackage

+

Boolean

+

表示该函数是否支持重载,主要针对A风格的函数,默认值是false。

+
+ diff --git a/content/zh/docs/Developerguide/PG_RANGE.md b/content/zh/docs/Developerguide/PG_RANGE.md new file mode 100644 index 000000000..875d5e4ac --- /dev/null +++ b/content/zh/docs/Developerguide/PG_RANGE.md @@ -0,0 +1,76 @@ +# PG\_RANGE + +PG\_RANGE系统表存储关于范围类型的信息。除了[PG\_TYPE](PG_TYPE.md#ZH-CN_TOPIC_0242385855)里类型的记录。 + +**表 1** PG\_RANGE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

rngtypid

+

oid

+

PG_TYPE.oid

+

范围类型的OID。

+

rngsubtype

+

oid

+

PG_TYPE.oid

+

这个范围类型的元素类型(子类型)的OID。

+

rngcollation

+

oid

+

PG_COLLATION.oid

+

用于范围比较的排序规则的OID,如果没有则为零。

+

rngsubopc

+

oid

+

PG_OPCLASS.oid

+

用于范围比较的子类型的操作符类的OID。

+

rngcanonical

+

regproc

+

PG_PROC.proname

+

转换范围类型为规范格式的函数名,如果没有则为0。

+

rngsubdiff

+

regproc

+

PG_PROC.proname

+

返回两个double precision元素值的不同的函数名,如果没有则为0。

+
+ +rngsubopc(如果元素类型是可排序的,则加上rngcollation)决定用于范围类型的排序顺序。当元素类型是离散的时使用rngcanonical。 + diff --git a/content/zh/docs/Developerguide/PG_REPLICATION_SLOTS.md b/content/zh/docs/Developerguide/PG_REPLICATION_SLOTS.md new file mode 100644 index 000000000..a5ab5d422 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_REPLICATION_SLOTS.md @@ -0,0 +1,88 @@ +# PG\_REPLICATION\_SLOTS + +PG\_REPLICATION\_SLOTS视图查看复制节点的信息。 + +**表 1** PG\_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/PG_RESOURCE_POOL.md b/content/zh/docs/Developerguide/PG_RESOURCE_POOL.md new file mode 100644 index 000000000..e9ac6cbe7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_RESOURCE_POOL.md @@ -0,0 +1,109 @@ +# PG\_RESOURCE\_POOL + +PG\_RESOURCE\_POOL系统表提供了数据库资源池的信息。 + +**表 1** PG\_RESOURCE\_POOL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

respool_name

+

name

+

资源池名称。

+

mem_percent

+

integer

+

内存配置的百分比。

+

cpu_affinity

+

bigint

+

CPU绑定core的数值。

+

control_group

+

name

+

资源池所在的control group名称。

+

active_statements

+

integer

+

资源池上最大的并发数。

+

max_dop

+

integer

+

最大并发度。

+

memory_limit

+

name

+

资源池最大的内存。

+

parentid

+

oid

+

父资源池OID。

+

io_limits

+

integer

+

每秒触发IO的次数上限。行存单位是万次/s,列存是次/s。

+

io_priority

+

name

+

IO利用率高达90%时,重消耗IO作业进行IO资源管控时关联的优先级等级。

+

nodegroup

+

name

+

表示资源池所在的逻辑openGauss的名称。

+

is_foreign

+

boolean

+

表示资源池是否用于逻辑openGauss之外的用户。如果为true,表示资源池用来控制不属于当前资源池的普通用户的资源。

+
+ diff --git a/content/zh/docs/Developerguide/PG_REWRITE.md b/content/zh/docs/Developerguide/PG_REWRITE.md new file mode 100644 index 000000000..efe671017 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_REWRITE.md @@ -0,0 +1,83 @@ +# PG\_REWRITE + +PG\_REWRITE系统表存储为表和视图定义的重写规则。 + +**表 1** PG\_REWRITE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

rulename

+

name

+

规则名称。

+

ev_class

+

oid

+

使用这条规则的表名称。

+

ev_attr

+

smallint

+

这条规则适用的字段(目前总是为零,表示整个表)。

+

ev_type

+

"char"

+
规则适用的事件类型:
  • 1 = SELECT
  • 2 = UPDATE
  • 3 = INSERT
  • 4 = DELETE
+
+

ev_enabled

+

"char"

+
用于控制复制的触发。
  • O =“origin”和“local”模式时触发。
  • D =禁用触发。
  • R =“replica”时触发。
  • A =任何模式是都会触发。
+
+

is_instead

+

Boolean

+

如果该规则是INSTEAD规则,则为真。

+

ev_qual

+

pg_node_tree

+

规则的资格条件的表达式树(以nodeToString() 形式存在)。

+

ev_action

+

pg_node_tree

+

规则动作的查询树(以nodeToString() 形式存在)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_RLSPOLICIES.md b/content/zh/docs/Developerguide/PG_RLSPOLICIES.md new file mode 100644 index 000000000..fafa58bc2 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_RLSPOLICIES.md @@ -0,0 +1,67 @@ +# PG\_RLSPOLICIES + +PG\_RLSPOLICIES视图提供查询行级访问控制策略。 + +**表 1** PG\_RLSPOLICIES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

行级访问控制策略作用的表对象所属模式名称。

+

tablename

+

name

+

行级访问控制策略作用的表对象名称。

+

policyname

+

name

+

行级访问控制策略名称。

+

policypermissive

+

text

+

行级访问控制策略属性。

+

policyroles

+

name[]

+

行级访问控制策略影响的用户列表,不指定表示影响所有的用户。

+

policycmd

+

text

+

行级访问控制策略影响的SQL操作。

+

policyqual

+

text

+

行级访问控制策略的表达式。

+
+ diff --git a/content/zh/docs/Developerguide/PG_RLSPOLICY.md b/content/zh/docs/Developerguide/PG_RLSPOLICY.md new file mode 100644 index 000000000..ee33bd9fd --- /dev/null +++ b/content/zh/docs/Developerguide/PG_RLSPOLICY.md @@ -0,0 +1,67 @@ +# PG\_RLSPOLICY + +PG\_RLSPOLICY系统表存储行级访问控制策略。 + +**表 1** PG\_RLSPOLICY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

polname

+

name

+

行级访问控制策略的名称。

+

polrelid

+

oid

+

行级访问控制策略作用的表对象oid。

+

polcmd

+

"char"

+

行级访问控制策略影响的SQL操作。

+

polpermissive

+

boolean

+

行级访问控制策略的属性,t为表达式OR条件拼接,f为表达式AND条件拼接。

+

polroles

+

oid[]

+

行级访问控制策略影响的用户oid列表,不指定表示影响所有的用户。

+

polqual

+

pg_node_tree

+

行级访问控制策略的表达式。

+
+ diff --git a/content/zh/docs/Developerguide/PG_ROLES.md b/content/zh/docs/Developerguide/PG_ROLES.md new file mode 100644 index 000000000..30ebb6627 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_ROLES.md @@ -0,0 +1,236 @@ +# PG\_ROLES + +PG\_ROLES视图提供访问数据库角色的相关信息。 + +**表 1** PG\_ROLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

rolname

+

name

+

-

+

角色名称。

+

rolsuper

+

Boolean

+

-

+

该角色是否是拥有最高权限的初始系统管理员。

+

rolinherit

+

Boolean

+

-

+

该角色是否继承角色的权限。

+

rolcreaterole

+

Boolean

+

-

+

该角色是否可以创建其他的角色。

+

rolcreatedb

+

Boolean

+

-

+

该角色是否可以创建数据库。

+

rolcatupdate

+

Boolean

+

-

+

该角色是否可以直接更新系统表。只有usesysid=10的初始系统管理员拥有此权限。其他用户无法获得此权限。

+

rolcanlogin

+

Boolean

+

-

+

该角色是否可以登录数据库。

+

rolreplication

+

Boolean

+

-

+

该角色是否可以复制。

+

rolauditadmin

+

Boolean

+

-

+

该角色是否为审计管理员。

+

rolsystemadmin

+

Boolean

+

-

+

该角色是否为系统管理员。

+

rolconnlimit

+

integer

+

-

+

对于可以登录的角色,这里限制了该角色允许发起的最大并发连接数。 -1表示无限制。

+

rolpassword

+

text

+

-

+

不是口令,总是********。

+

rolvalidbegin

+

timestamp with time zone

+

-

+

帐户的有效开始时间;如果没有设置有效开始时间,则为NULL。

+

rolvaliduntil

+

timestamp with time zone

+

-

+

帐户的有效结束时间;如果没有设置有效结束时间,则为NULL。

+

rolrespool

+

name

+

-

+

用户所能够使用的resource pool。

+

rolparentid

+

oid

+

PG_AUTHID.rolparentid

+

用户所在组用户的OID。

+

roltabspace

+

text

+

-

+

用户永久表存储空间限额。

+

roltempspace

+

text

+

-

+

用户临时表存储空间限额。

+

rolspillspace

+

text

+

-

+

用户算子落盘空间限额。

+

rolconfig

+

text[]

+

-

+

运行时配置变量的会话缺省。

+

oid

+

oid

+

PG_AUTHID.oid

+

角色的ID。

+

roluseft

+

Boolean

+

PG_AUTHID.roluseft

+

角色是否可以操作外表。

+

rolkind

+

"char"

+

-

+

角色类型。

+

nodegroup

+

name

+

-

+

该字段不支持。

+
+ diff --git a/content/zh/docs/Developerguide/PG_RULES.md b/content/zh/docs/Developerguide/PG_RULES.md new file mode 100644 index 000000000..0a43f57ae --- /dev/null +++ b/content/zh/docs/Developerguide/PG_RULES.md @@ -0,0 +1,46 @@ +# PG\_RULES + +PG\_RULES视图提供对查询重写规则的有用信息访问的接口。 + +**表 1** PG\_RULES字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

schemaname

+

name

+

包含表的模式的名称。

+

tablename

+

name

+

规则作用的表的名称。

+

rulename

+

name

+

规则的名称。

+

definition

+

text

+

规则定义(一个重新构造的创建命令)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_RUNNING_XACTS.md b/content/zh/docs/Developerguide/PG_RUNNING_XACTS.md new file mode 100644 index 000000000..65a776544 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_RUNNING_XACTS.md @@ -0,0 +1,88 @@ +# PG\_RUNNING\_XACTS + +PG\_RUNNING\_XACTS视图主要功能是显示当前节点运行事务的信息。 + +**表 1** PG\_RUNNING\_XACTS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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 new file mode 100644 index 000000000..56d69f974 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SECLABEL.md @@ -0,0 +1,67 @@ +# PG\_SECLABEL + +PG\_SECLABEL系统表存储数据对象上的安全标签。 + +[PG\_SHSECLABEL](PG_SHSECLABEL.md#ZH-CN_TOPIC_0242385844)的作用类似,只是它是用于在一个openGauss内共享的数据库对象的安全标签上的。 + +**表 1** PG\_SECLABEL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

objoid

+

oid

+

任意OID属性

+

这个安全标签所属的对象的OID。

+

classoid

+

oid

+

PG_CLASS.oid

+

出现这个对象的系统目录的OID。

+

objsubid

+

integer

+

-

+

出现在这个对象中的列的序号。

+

provider

+

text

+

-

+

与这个标签相关的标签提供程序。

+

label

+

text

+

-

+

应用于这个对象的安全标签。

+
+ diff --git a/content/zh/docs/Developerguide/PG_SECLABELS.md b/content/zh/docs/Developerguide/PG_SECLABELS.md new file mode 100644 index 000000000..8c6ece817 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SECLABELS.md @@ -0,0 +1,92 @@ +# PG\_SECLABELS + +PG\_SECLABELS视图提供关于安全标签的信息。 + +**表 1** PG\_SECLABELS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

objoid

+

oid

+

任意OID属性

+

这个安全标签指向的对象的OID。

+

classoid

+

oid

+

PG_CLASS.oid

+

这个对象出现的系统表的OID。

+

objsubid

+

integer

+

-

+

对于一个在表字段上的安全标签,是字段编号(引用表本身的objoid和classoid)。对于所有其他对象类型,这个字段为零。

+

objtype

+

text

+

-

+

这个标签出现的对象的类型,文本格式。

+

objnamespace

+

oid

+

PG_NAMESPACE.oid

+

这个对象的名称空间的OID,如果适用;否则为NULL。

+

objname

+

text

+

-

+

这个标签适用的对象的名称,文本格式。

+

provider

+

text

+

PG_SECLABEL.provider

+

与这个标签相关的标签提供者。

+

label

+

text

+

PG_SECLABEL.label

+

适用于这个对象的安全标签。

+
+ diff --git a/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md b/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md new file mode 100644 index 000000000..f324a9e1e --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SESSION_IOSTAT.md @@ -0,0 +1,83 @@ +# PG\_SESSION\_IOSTAT + +PG\_SESSION\_IOSTAT视图显示当前用户执行作业正在运行时的IO负载管理相关信息。 + +以下涉及到iops,对于行存,均以万次/s为单位,对于列存,均以次/s为单位。 + +**表 1** PG\_SESSION\_IOSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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

+

该字段不支持

+
+ diff --git a/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md b/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md new file mode 100644 index 000000000..6429c61d5 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SESSION_WLMSTAT.md @@ -0,0 +1,188 @@ +# PG\_SESSION\_WLMSTAT + +PG\_SESSION\_WLMSTAT视图显示和当前用户执行作业正在运行时的负载管理相关信息。 + +**表 1** PG\_SESSION\_WLMSTAT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

连接后端的数据库OID。

+

datname

+

name

+

连接后端的数据库名称。

+

threadid

+

bigint

+

后端线程ID。

+

sessionid

+

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

+
语句当前的状态,包括:
  • pending:执行前状态。
  • running:执行进行状态。
  • finished:执行正常结束。
  • aborted:执行异常终止。
  • active: 非以上四种状态外的正常状态。
  • unknown: 未知状态。
+
+

enqueue

+

text

+

该字段不支持。

+

resource_pool

+

name

+

语句当前所在的资源池。

+

query

+

text

+

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

+

is_plana

+

bool

+

该字段不支持

+

node_group

+

text

+

该字段不支持

+
+ diff --git a/content/zh/docs/Developerguide/PG_SETTINGS.md b/content/zh/docs/Developerguide/PG_SETTINGS.md new file mode 100644 index 000000000..537cbb550 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SETTINGS.md @@ -0,0 +1,130 @@ +# PG\_SETTINGS + +PG\_SETTINGS视图显示数据库运行时参数的相关信息。 + +**表 1** PG\_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/PG_SHADOW.md b/content/zh/docs/Developerguide/PG_SHADOW.md new file mode 100644 index 000000000..bbe57607c --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SHADOW.md @@ -0,0 +1,184 @@ +# PG\_SHADOW + +PG\_SHADOW视图显示了所有在PG\_AUTHID中标记了rolcanlogin的角色的属性。 + +这个视图的名称来自于该视图是不可读的,因为它包含口令。[PG\_USER](PG_USER.md#ZH-CN_TOPIC_0242385999)是一个在PG\_SHADOW上公开可读的视图,只是把口令域填成了空白。 + +**表 1** PG\_SHADOW字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

usename

+

name

+

PG_AUTHID.rolname

+

用户名。

+

usesysid

+

oid

+

PG_AUTHID.oid

+

用户的ID。

+

usecreatedb

+

Boolean

+

-

+

用户可以创建数据库。

+

usesuper

+

Boolean

+

-

+

用户是系统管理员。

+

usecatupd

+

Boolean

+

-

+

用户可以更新视图。即使是系统管理员,如果这个字段不是真,也不能更新视图。

+

userepl

+

Boolean

+

-

+

用户可以初始化流复制和使系统处于或不处于备份模式。

+

passwd

+

text

+

-

+

口令(可能是加密的);如果没有则为null。参阅PG_AUTHID获取加密的口令是如何存储的信息。

+

valbegin

+

timestamp with time zone

+

-

+

帐户的有效开始时间;如果没有设置有效开始时间,则为NULL。

+

valuntil

+

timestamp with time zone

+

-

+

帐户的有效结束时间;如果没有设置有效结束时间,则为NULL。

+

respool

+

name

+

-

+

用户使用的资源池。

+

parent

+

oid

+

-

+

父资源池。

+

spacelimit

+

text

+

-

+

永久表存储空间限额。

+

tempspacelimit

+

text

+

-

+

临时表存储空间限额。

+

spillspacelimit

+

text

+

-

+

算子落盘空间限额。

+

useconfig

+

text[ ]

+

-

+

运行时配置变量的会话缺省。

+

usemonitoradmin

+

Boolean

+

-

+

用户是监控管理员

+

useoperatoradmin

+

Boolean

+

-

+

用户是运维管理员

+

usepolicyadmin

+

Boolean

+

-

+

用户是安全策略管理员

+
+ diff --git a/content/zh/docs/Developerguide/PG_SHDEPEND.md b/content/zh/docs/Developerguide/PG_SHDEPEND.md new file mode 100644 index 000000000..525c13526 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SHDEPEND.md @@ -0,0 +1,111 @@ +# PG\_SHDEPEND + +PG\_SHDEPEND系统表记录数据库对象和共享对象(比如角色)之间的依赖性关系。这些信息允许openGauss保证在企图删除这些对象之前,这些对象是没有被引用的。 + +[PG\_DEPEND](PG_DEPEND.md#ZH-CN_TOPIC_0242385811)的作用类似,只是它是用于在一个数据库内部的对象的依赖性关系的。 + +和其它大多数系统表不同,PG\_SHDEPEND是在openGauss里面所有的数据库之间共享的:每个openGauss只有一个PG\_SHDEPEND,而不是每个数据库一个。 + +**表 1** PG\_SHDEPEND字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

dbid

+

oid

+

PG_DATABASE.oid

+

依赖对象所在的数据库的OID ,如果是共享对象,则为零。

+

classid

+

oid

+

PG_CLASS.oid

+

依赖对象所在的系统表的OID。

+

objid

+

oid

+

任意OID属性

+

指定的依赖对象的OID。

+

objsubid

+

integer

+

-

+

对于一个表字段,这是字段号(objid和classid参考表本身)。对于所有其他对象类型,这个字段为零。

+

refclassid

+

oid

+

PG_CLASS.oid

+

被引用对象所在的系统表的OID(必须是一个共享表)。

+

refobjid

+

oid

+

任意OID属性

+

指定的被引用对象的OID。

+

deptype

+

"char"

+

-

+

一段代码,定义了这个依赖性关系的特定语义;参阅下文。

+

objfile

+

text

+

-

+

用户定义C函数库文件路径。

+
+ +在任何情况下,一条PG\_SHDEPEND记录就表明这个被引用的对象不能在未删除依赖对象的前提下删除。不过,deptype同时还标出了几种不同的子风格: + +- SHARED\_DEPENDENCY\_OWNER \(o\) + + 被引用的对象(必须是一个角色)是依赖对象的所有者。 + +- SHARED\_DEPENDENCY\_ACL \(a\) + + 被引用的对象(必须是一个角色)在依赖对象的ACL(访问控制列表,也就是权限列表)里提到。SHARED\_DEPENDENCY\_ACL不会在对象的所有者头上添加的,因为所有者会有一个SHARED\_DEPENDENCY\_OWNER记录。 + +- SHARED\_DEPENDENCY\_PIN \(p\) + + 没有依赖对象;这类记录标识系统自身依赖于该被依赖对象,因此这样的对象绝对不能被删除。这种类型的记录只是由initdb创建。这样的依赖对象的字段都是零。 + + diff --git a/content/zh/docs/Developerguide/PG_SHDESCRIPTION.md b/content/zh/docs/Developerguide/PG_SHDESCRIPTION.md new file mode 100644 index 000000000..a60835585 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SHDESCRIPTION.md @@ -0,0 +1,51 @@ +# PG\_SHDESCRIPTION + +PG\_SHDESCRIPTION系统表为共享数据库对象存储可选的注释。可以使用COMMENT命令操作注释的内容,使用psql的\\d命令查看注释内容。 + +PG\_DESCRIPTION提供了类似的功能,它记录了单个数据库中对象的注释。 + +不同于大多数系统表,PG\_SHDESCRIPTION是在openGauss里面所有的数据库之间共享的:每个openGauss只有一个PG\_SHDESCRIPTION,而不是每个数据库一个。 + +**表 1** PG\_SHDESCRIPTION字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

objoid

+

oid

+

任意OID属性

+

这条描述所描述的对象的OID。

+

classoid

+

oid

+

PG_CLASS.oid

+

这个对象出现的系统表的OID。

+

description

+

text

+

-

+

作为对该对象的描述的任意文本。

+
+ diff --git a/content/zh/docs/Developerguide/PG_SHSECLABEL.md b/content/zh/docs/Developerguide/PG_SHSECLABEL.md new file mode 100644 index 000000000..748edd516 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_SHSECLABEL.md @@ -0,0 +1,62 @@ +# PG\_SHSECLABEL + +PG\_SHSECLABEL系统表存储在共享数据库对象上的安全标签。安全标签可以用SECURITY LABEL命令操作。 + +查看安全标签的简单点的方法,请参阅[PG\_SECLABELS](PG_SECLABELS.md#ZH-CN_TOPIC_0242385959)。 + +[PG\_SECLABEL](PG_SECLABEL.md#ZH-CN_TOPIC_0242385841)的作用类似,只是它是用于在单个数据库内部的对象的安全标签的。 + +不同于大多数的系统表,PG\_SHSECLABELopenGauss中的所有数据库中共享:每个openGauss只有一个PG\_SHSECLABEL,而不是每个数据库一个。 + +**表 1** PG\_SHSECLABEL字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

objoid

+

oid

+

任意OID属性

+

这个安全标签所属的对象的OID。

+

classoid

+

oid

+

PG_CLASS.oid

+

出现这个对象的系统目录的OID。

+

provider

+

text

+

-

+

与这个标签相关的标签提供程序。

+

label

+

text

+

-

+

应用于这个对象的安全标签。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATIO_ALL_INDEXES.md b/content/zh/docs/Developerguide/PG_STATIO_ALL_INDEXES.md new file mode 100644 index 000000000..dcd555e81 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_ALL_INDEXES.md @@ -0,0 +1,67 @@ +# PG\_STATIO\_ALL\_INDEXES + +PG\_STATIO\_ALL\_INDEXES视图将包含当前数据库中的每个索引行, 显示特定索引的I/O的统计。 + +**表 1** PG\_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/PG_STATIO_ALL_SEQUENCES.md b/content/zh/docs/Developerguide/PG_STATIO_ALL_SEQUENCES.md new file mode 100644 index 000000000..323b34f31 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_ALL_SEQUENCES.md @@ -0,0 +1,53 @@ +# PG\_STATIO\_ALL\_SEQUENCES + +PG\_STATIO\_ALL\_SEQUENCES视图包含当前数据库中每个序列的I/O的统计信息。 + +**表 1** PG\_STATIO\_ALL\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

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

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md b/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md new file mode 100644 index 000000000..cd0be5399 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_ALL_TABLES.md @@ -0,0 +1,95 @@ +# PG\_STATIO\_ALL\_TABLES + +PG\_STATIO\_ALL\_TABLES视图将包含当前数据库中每个表(包括TOAST表)的I/O统计信息。 + +**表 1** PG\_STATIO\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

表OID。

+

schemaname

+

name

+

该表模式名。

+

relname

+

name

+

表名。

+

heap_blks_read

+

bigint

+

从该表中读取的磁盘块数。

+

heap_blks_hit

+

bigint

+

此表缓存命中数。

+

idx_blks_read

+

bigint

+

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

+

idx_blks_hit

+

bigint

+

表中所有索引命中缓存数。

+

toast_blks_read

+

bigint

+

此表的TOAST表读取的磁盘块数(如果存在)。

+

toast_blks_hit

+

bigint

+

此表的TOAST表命中缓冲区数(如果存在)。

+

tidx_blks_read

+

bigint

+

此表的TOAST表索引读取的磁盘块数(如果存在)。

+

tidx_blks_hit

+

bigint

+

此表的TOAST表索引命中缓冲区数(如果存在)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATIO_SYS_INDEXES.md b/content/zh/docs/Developerguide/PG_STATIO_SYS_INDEXES.md new file mode 100644 index 000000000..016090d55 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_SYS_INDEXES.md @@ -0,0 +1,67 @@ +# PG\_STATIO\_SYS\_INDEXES + +PG\_STATIO\_SYS\_INDEXES视图显示命名空间中所有系统表索引的IO状态信息。 + +**表 1** PG\_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/PG_STATIO_SYS_SEQUENCES.md b/content/zh/docs/Developerguide/PG_STATIO_SYS_SEQUENCES.md new file mode 100644 index 000000000..5296f7dae --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_SYS_SEQUENCES.md @@ -0,0 +1,53 @@ +# PG\_STATIO\_SYS\_SEQUENCES + +PG\_STATIO\_SYS\_SEQUENCES视图显示命名空间中所有序列的IO状态信息。 + +**表 1** PG\_STATIO\_SYS\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

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

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md b/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md new file mode 100644 index 000000000..625068ee7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_SYS_TABLES.md @@ -0,0 +1,95 @@ +# PG\_STATIO\_SYS\_TABLES + +PG\_STATIO\_SYS\_TABLES视图显示命名空间中所有系统表的IO状态信息。 + +**表 1** PG\_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/PG_STATIO_USER_INDEXES.md b/content/zh/docs/Developerguide/PG_STATIO_USER_INDEXES.md new file mode 100644 index 000000000..b11a8fee7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_USER_INDEXES.md @@ -0,0 +1,67 @@ +# PG\_STATIO\_USER\_INDEXES + +PG\_STATIO\_USER\_INDEXES视图显示命名空间中所有用户关系表索引的IO状态信息。 + +**表 1** PG\_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/PG_STATIO_USER_SEQUENCES.md b/content/zh/docs/Developerguide/PG_STATIO_USER_SEQUENCES.md new file mode 100644 index 000000000..8f5b8ca54 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_USER_SEQUENCES.md @@ -0,0 +1,53 @@ +# PG\_STATIO\_USER\_SEQUENCES + +PG\_STATIO\_USER\_SEQUENCES视图显示命名空间中所有用户关系表类型为序列的IO状态信息。 + +**表 1** PG\_STATIO\_USER\_SEQUENCES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

序列OID。

+

schemaname

+

name

+

序列中模式名。

+

relname

+

name

+

序列名。

+

blks_read

+

bigint

+

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

+

blks_hit

+

bigint

+

序列中缓存命中数。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md b/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md new file mode 100644 index 000000000..38d727725 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATIO_USER_TABLES.md @@ -0,0 +1,95 @@ +# PG\_STATIO\_USER\_TABLES + +PG\_STATIO\_USER\_TABLES视图显示命名空间中所有用户关系表的IO状态信息。 + +**表 1** PG\_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/PG_STATISTIC.md b/content/zh/docs/Developerguide/PG_STATISTIC.md new file mode 100644 index 000000000..fec56d8f4 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATISTIC.md @@ -0,0 +1,115 @@ +# PG\_STATISTIC + +PG\_STATISTIC系统表存储有关该数据库中表和索引列的统计数据。默认只有系统管理员权限才可以访问此系统表,普通用户需要授权才可以访问。 + +**表 1** PG\_STATISTIC字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

starelid

+

oid

+

所描述的字段所属的表或者索引。

+

starelkind

+

"char"

+

所属对象的类型。

+

staattnum

+

smallint

+

所描述的字段在表中的编号,从1开始。

+

stainherit

+

Boolean

+

是否统计有继承关系的对象。

+

stanullfrac

+

real

+

该字段中为NULL的记录的比率。

+

stawidth

+

integer

+

非NULL记录的平均存储宽度,以字节计。

+

stadistinct

+

real

+

标识全局统计信息中数据库节点上字段里唯一的非NULL数据值的数目。

+
  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。
+

stakindN

+

smallint

+

一个编码,表示这种类型的统计存储在pg_statistic行的第n个“槽位”。

+

n的取值范围:1~5

+

staopN

+

oid

+

一个用于生成这些存储在第n个“槽位”的统计信息的操作符。比如,一个柱面图槽位会显示<操作符,该操作符定义了该数据的排序顺序。

+

n的取值范围:1~5

+

stanumbersN

+

real[]

+

第n个“槽位”的相关类型的数值类型统计,如果该槽位和数值类型没有关系,则就是NULL。

+

n的取值范围:1~5

+

stavaluesN

+

anyarray

+

第n个“槽位”类型的字段数据值,如果该槽位类型不存储任何数据值,则就是NULL。每个数组的元素值实际上都是指定字段的数据类型,因此,除了把这些字段的类型定义成anyarray之外,没有更好的办法。

+

n的取值范围:1~5

+

stadndistinct

+

real

+

标识dn1上字段里唯一的非NULL数据值的数目。

+
  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。
+

staextinfo

+

text

+

统计信息的扩展信息。预留字段。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md b/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md new file mode 100644 index 000000000..47bc6a84f --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATISTIC_EXT.md @@ -0,0 +1,115 @@ +# PG\_STATISTIC\_EXT + +PG\_STATISTIC\_EXT系统表存储有关该数据库中表的扩展统计数据,包括多列统计数据和表达式统计数据(后续支持)。收集哪些扩展统计数据是由用户指定的。需要有系统管理员权限才可以访问此系统表。 + +**表 1** PG\_STATISTIC\_EXT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

starelid

+

oid

+

所描述的字段所属的表或者索引。

+

starelkind

+

"char"

+

所属对象的类型。

+

stainherit

+

Boolean

+

是否统计有继承关系的对象。

+

stanullfrac

+

real

+

该字段中为NULL的记录的比率。

+

stawidth

+

integer

+

非NULL记录的平均存储宽度,以字节计。

+

stadistinct

+

real

+
标识全局统计信息中数据库节点上字段里唯一的非NULL数据值的数目。
  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。
+
+

stadndistinct

+

real

+
标识dn1上字段里唯一的非NULL数据值的数目。
  • 一个大于零的数值是独立数值的实际数目。
  • 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,则可以表示为stadistinct=-0.5)。
  • 零值表示独立数值的数目未知。
+
+

stakindN

+

smallint

+

一个编码,表示这种类型的统计存储在pg_statistic行的第n个“槽位”。

+

n的取值范围:1~5

+

staopN

+

oid

+

一个用于生成这些存储在第n个“槽位”的统计信息的操作符。比如,一个柱面图槽位会显示<操作符,该操作符定义了该数据的排序顺序。

+

n的取值范围:1~5

+

stakey

+

int2vector

+

所描述的字段编号的数组。

+

stanumbersN

+

real[]

+

第n个“槽位”的相关类型的数值类型统计,如果该槽位和数值类型没有关系,则就是NULL。

+

n的取值范围:1~5

+

stavaluesN

+

anyarray

+

第n个“槽位”类型的字段数据值,如果该槽位类型不存储任何数据值,则就是NULL。每个数组的元素值实际上都是指定字段的数据类型,因此,除了把这些字段的类型定义成anyarray之外,没有更好的办法。

+

n的取值范围:1~5

+

staexprs

+

pg_node_tree

+

扩展统计信息对应的表达式。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STATS.md b/content/zh/docs/Developerguide/PG_STATS.md new file mode 100644 index 000000000..aba2f1af5 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STATS.md @@ -0,0 +1,157 @@ +# PG\_STATS + +PG\_STATS视图提供对存储在pg\_statistic表里面的单列统计信息的访问。 + +**表 1** PG\_STATS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

包含表的模式名。

+

tablename

+

name

+

PG_CLASS.relname

+

表名。

+

attname

+

name

+

PG_ATTRIBUTE.attname

+

字段的名称。

+

inherited

+

Boolean

+

-

+

如果为真,则包含继承的子列,否则只是指定表的字段。

+

null_frac

+

real

+

-

+

记录中字段为空的百分比。

+

avg_width

+

integer

+

-

+

字段记录以字节记的平均宽度。

+

n_distinct

+

real

+

-

+
  • 如果大于零,表示字段中独立数值的估计数目。
  • 如果小于零,表示独立数值的数目被行数除的负数。
    1. 用负数形式是因为ANALYZE认为独立数值的数目是随着表增长而增长;
    2. 正数的形式用于在字段看上去好像有固定的可能值数目的情况下。比如,-1表示一个唯一字段,独立数值的个数和行数相同。
    +
+

n_dndistinct

+

real

+

-

+
标识dn1上字段中非NULL数据的唯一值的数目。
  • 如果大于零,表示独立数值的实际数目。
  • 如果小于零,表示独立数值的数目被行数除的负数。(比如,一个字段的数值平均出现概率为两次,则可以表示为n_dndistinct=-0.5)。
  • 如果等于零,表示独立数值的数目未知。
+
+

most_common_vals

+

anyarray

+

-

+

一个字段里最常用数值的列表。如果里面的字段数值是最常见的,则为NULL。

+

most_common_freqs

+

real[]

+

-

+

一个最常用数值的频率的列表,也就是说,每个出现的次数除以行数。如果most_common_vals是NULL,则为NULL。

+

histogram_bounds

+

anyarray

+

-

+

一个数值的列表,它把字段的数值分成几组大致相同热门的组。如果在most_common_vals里有数值,则在这个饼图的计算中省略。如果字段数据类型没有<操作符或者most_common_vals列表代表了整个分布性,则这个字段为NULL。

+

correlation

+

real

+

-

+

统计与字段值的物理行序和逻辑行序有关。它的范围从-1到+1。在数值接近-1或者+1的时候,在字段上的索引扫描将被认为比它接近零的时候开销更少,因为减少了对磁盘的随机访问。如果字段数据类型没有<操作符,则这个字段为NULL。

+

most_common_elems

+

anyarray

+

-

+

一个最常用的非空元素的列表。

+

most_common_elem_freqs

+

real[]

+

-

+

一个最常用元素的频率的列表。

+

elem_count_histogram

+

real[]

+

-

+

对于独立的非空元素的统计直方图。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md b/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md new file mode 100644 index 000000000..1e14d1da1 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_ACTIVITY.md @@ -0,0 +1,178 @@ +# PG\_STAT\_ACTIVITY + +PG\_STAT\_ACTIVITY视图显示和当前用户查询相关的信息。 + +**表 1** PG\_STAT\_ACTIVITY字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

datid

+

oid

+

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

+

datname

+

name

+

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

+

pid

+

bigint

+

后台线程ID。

+

sessionid

+

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

+

timestamp with time zone

+

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

+

xact_start

+

timestamp with time zone

+

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

+

query_start

+

timestamp with time zone

+

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

+

state_change

+

timestamp with time zone

+

上次状态改变的时间。

+

waiting

+

Boolean

+

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

+

enqueue

+

text

+

该字段不支持。

+

state

+

text

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

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

+
SELECT datname, usename, usesysid, state,pid FROM pg_stat_activity;
+
 datname  | usename | usesysid | state  |       pid
+----------+---------+----------+--------+-----------------
+ postgres | omm     |       10 |        | 139968752121616
+ postgres | omm     |       10 |        | 139968903116560
+ db_tpcc | 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(活跃的),此字段显示当前正在执行的查询。所有其他情况表示上一个查询。

+

connection_info

+

text

+

json格式字符串,记录当前连接数据库的驱动类型、驱动版本号、当前驱动的部署路径、进程属主用户等信息(参见connection_info)。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md b/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md new file mode 100644 index 000000000..cd5d5e18e --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_ALL_INDEXES.md @@ -0,0 +1,76 @@ +# PG\_STAT\_ALL\_INDEXES + +PG\_STAT\_ALL\_INDEXES视图将包含当前数据库中的每个索引行,显示访问特定索引的统计。 + +索引可以通过简单的索引扫描或"位图"索引扫描进行使用。位图扫描中几个索引的输出可以通过AND或者OR规则进行组合, 因此当使用位图扫描的时候,很难将独立堆行抓取与特定索引进行组合, 因此,一个位图扫描增加pg\_stat\_all\_indexes.idx\_tup\_read使用索引计数,并且增加pg\_stat\_all\_tables.idx\_tup\_fetch表计数,但不影响pg\_stat\_all\_indexes.idx\_tup\_fetch。 + +**表 1** PG\_STAT\_ALL\_INDEXES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

这个索引的表的OID。

+

indexrelid

+

oid

+

索引的OID。

+

schemaname

+

name

+

索引中模式名。

+

relname

+

name

+

索引的表名。

+

indexrelname

+

name

+

索引名。

+

idx_scan

+

bigint

+

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

+

idx_tup_read

+

bigint

+

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

+

idx_tup_fetch

+

bigint

+

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

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md new file mode 100644 index 000000000..c4ea196f7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_ALL_TABLES.md @@ -0,0 +1,172 @@ +# PG\_STAT\_ALL\_TABLES + +PG\_STAT\_ALL\_TABLES视图将包含当前数据库中每个表的一行(包括TOAST表),显示访问特定表的统计信息。 + +**表 1** PG\_STAT\_ALL\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

relid

+

oid

+

表的OID。

+

schemaname

+

name

+

此表的模式名。

+

relname

+

name

+

表名。

+

seq_scan

+

bigint

+

此表发起的顺序扫描数。

+

seq_tup_read

+

bigint

+

顺序扫描抓取的活跃行数。

+

idx_scan

+

bigint

+

此表发起的索引扫描数。

+

idx_tup_fetch

+

bigint

+

索引扫描抓取的活跃行数。

+

n_tup_ins

+

bigint

+

插入行数。

+

n_tup_upd

+

bigint

+

更新行数。

+

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守护进程分析的次数。

+

last_data_changed

+

timestamp with time zone

+

记录这个表上一次数据发生变化的时间(引起数据变化的操作包括INSERT/UPDATE/DELETE、EXCHANGE/TRUNCATE/DROP partition),该列数据仅在本地数据库主节点记录。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_BAD_BLOCK.md b/content/zh/docs/Developerguide/PG_STAT_BAD_BLOCK.md new file mode 100644 index 000000000..d6d244041 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_BAD_BLOCK.md @@ -0,0 +1,81 @@ +# PG\_STAT\_BAD\_BLOCK + +PG\_STAT\_BAD\_BLOCK视图显示自节点启动后,读取数据时出现Page/CU校验失败的统计信息。 + +**表 1** PG\_STAT\_BAD\_BLOCK字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

nodename

+

text

+

节点名。

+

databaseid

+

integer

+

数据库OID。

+

tablespaceid

+

integer

+

表空间OID。

+

relfilenode

+

integer

+

文件对象ID。

+

bucketid

+

smallint

+

一致性hash bucket ID。

+

forknum

+

integer

+

文件类型。

+

error_count

+

integer

+

出现校验失败的次数。

+

first_time

+

timestamp with time zone

+

第一次出现时间。

+

last_time

+

timestamp with time zone

+

最近一次出现时间。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_BGWRITER.md b/content/zh/docs/Developerguide/PG_STAT_BGWRITER.md new file mode 100644 index 000000000..8b2fc22c8 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_BGWRITER.md @@ -0,0 +1,95 @@ +# PG\_STAT\_BGWRITER + +PG\_STAT\_BGWRITER视图显示关于后端写进程活动的统计信息。 + +**表 1** PG\_STAT\_BGWRITER字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

checkpoints_timed

+

bigint

+

执行的定期检查点数。

+

checkpoints_req

+

bigint

+

执行的需求检查点数。

+

checkpoint_write_time

+

double precision

+

花费在检查点处理部分的时间总量,其中文件被写入到磁盘,以毫秒为单位。

+

checkpoint_sync_time

+

double precision

+

花费在检查点处理部分的时间总量,其中文件被同步到磁盘,以毫秒为单位。

+

buffers_checkpoint

+

bigint

+

检查点写缓冲区数量。

+

buffers_clean

+

bigint

+

后端写进程写缓冲区数量。

+

maxwritten_clean

+

bigint

+

后端写进程停止清理扫描时间数,因为它写了太多缓冲区。

+

buffers_backend

+

bigint

+

通过后端直接写缓冲区数。

+

buffers_backend_fsync

+

bigint

+

后端不得不执行自己的fsync调用的时间数 (通常后端写进程处理这些即使后端确实自己写)。

+

buffers_alloc

+

bigint

+

分配的缓冲区数量。

+

stats_reset

+

timestamp with time zone

+

这些统计被重置的时间。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_DATABASE.md b/content/zh/docs/Developerguide/PG_STAT_DATABASE.md new file mode 100644 index 000000000..f9dd7e052 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_DATABASE.md @@ -0,0 +1,151 @@ +# PG\_STAT\_DATABASE + +PG\_STAT\_DATABASE视图将包含openGauss中每个数据库的数据库统计信息。 + +**表 1** PG\_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

+

由于数据库恢复冲突取消的查询数量(只在备用服务器发生的冲突)。请参见PG_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/PG_STAT_DATABASE_CONFLICTS.md b/content/zh/docs/Developerguide/PG_STAT_DATABASE_CONFLICTS.md new file mode 100644 index 000000000..0b872e479 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_DATABASE_CONFLICTS.md @@ -0,0 +1,67 @@ +# PG\_STAT\_DATABASE\_CONFLICTS + +PG\_STAT\_DATABASE\_CONFLICTS视图显示数据库冲突状态的统计信息。 + +**表 1** PG\_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/PG_STAT_REPLICATION.md b/content/zh/docs/Developerguide/PG_STAT_REPLICATION.md new file mode 100644 index 000000000..e9fb5c79d --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_REPLICATION.md @@ -0,0 +1,123 @@ +# PG\_STAT\_REPLICATION + +PG\_STAT\_REPLICATION视图用于描述日志同步状态信息,如发起端发送日志位置,收端接收日志位置等。 + +**表 1** PG\_STAT\_REPLICATION字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

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/PG_STAT_SYS_INDEXES.md b/content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md new file mode 100644 index 000000000..33e03b423 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_SYS_INDEXES.md @@ -0,0 +1,74 @@ +# PG\_STAT\_SYS\_INDEXES + +PG\_STAT\_SYS\_INDEXES视图显示pg\_catalog、information\_schema模式中所有系统表的索引状态信息。 + +**表 1** PG\_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/PG_STAT_SYS_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md new file mode 100644 index 000000000..1a5b887f7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_SYS_TABLES.md @@ -0,0 +1,172 @@ +# PG\_STAT\_SYS\_TABLES + +PG\_STAT\_SYS\_TABLES视图显示pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息。 + +**表 1** PG\_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守护进程分析的次数。

+

last_data_changed

+

timestamp with time zone

+

这个表数据最近修改时间。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/PG_STAT_USER_FUNCTIONS.md new file mode 100644 index 000000000..8c6af695a --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_USER_FUNCTIONS.md @@ -0,0 +1,60 @@ +# PG\_STAT\_USER\_FUNCTIONS + +PG\_STAT\_USER\_FUNCTIONS视图显示命名空间中用户自定义函数(函数语言为非内部语言)的状态信息。 + +**表 1** PG\_STAT\_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/PG_STAT_USER_INDEXES.md b/content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md new file mode 100644 index 000000000..96f57a552 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_USER_INDEXES.md @@ -0,0 +1,74 @@ +# PG\_STAT\_USER\_INDEXES + +PG\_STAT\_USER\_INDEXES视图显示数据库中用户自定义普通表和toast表的索引状态信息。 + +**表 1** PG\_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/PG_STAT_USER_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md new file mode 100644 index 000000000..9e9cea380 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_USER_TABLES.md @@ -0,0 +1,172 @@ +# PG\_STAT\_USER\_TABLES + +PG\_STAT\_USER\_TABLES视图显示所有命名空间中用户自定义普通表和toast表的状态信息。 + +**表 1** PG\_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守护进程分析的次。

+

last_data_changed

+

timestamp with time zone

+

这个表数据最近修改时间。

+
+ diff --git a/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md new file mode 100644 index 000000000..af1a9cf53 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md @@ -0,0 +1,95 @@ +# PG\_STAT\_XACT\_ALL\_TABLES + +PG\_STAT\_XACT\_ALL\_TABLES视图显示命名空间中所有普通表和toast表的事务状态信息。 + +**表 1** PG\_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/PG_STAT_XACT_SYS_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md new file mode 100644 index 000000000..2178da031 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md @@ -0,0 +1,95 @@ +# PG\_STAT\_XACT\_SYS\_TABLES + +PG\_STAT\_XACT\_SYS\_TABLES视图显示命名空间中系统表的事务状态信息。 + +**表 1** PG\_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/PG_STAT_XACT_USER_FUNCTIONS.md b/content/zh/docs/Developerguide/PG_STAT_XACT_USER_FUNCTIONS.md new file mode 100644 index 000000000..0ce499ba3 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_USER_FUNCTIONS.md @@ -0,0 +1,60 @@ +# PG\_STAT\_XACT\_USER\_FUNCTIONS + +PG\_STAT\_XACT\_USER\_FUNCTIONS视图包含每个函数的执行的统计信息。 + +**表 1** PG\_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/PG_STAT_XACT_USER_TABLES.md b/content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md new file mode 100644 index 000000000..b7d870fe6 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_STAT_XACT_USER_TABLES.md @@ -0,0 +1,95 @@ +# PG\_STAT\_XACT\_USER\_TABLES + +PG\_STAT\_XACT\_USER\_TABLES视图显示命名空间中用户表的事务状态信息。 + +**表 1** PG\_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/PG_TABLES.md b/content/zh/docs/Developerguide/PG_TABLES.md new file mode 100644 index 000000000..7d5642516 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TABLES.md @@ -0,0 +1,83 @@ +# PG\_TABLES + +PG\_TABLES视图提供了对数据库中每个表访问的有用信息。 + +**表 1** PG\_TABLES字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

包含表的模式名。

+

tablename

+

name

+

PG_CLASS.relname

+

表名。

+

tableowner

+

name

+

pg_get_userbyid(PG_CLASS.relowner)

+

表的所有者。

+

tablespace

+

name

+

PG_TABLESPACE.spcname

+

包含表的表空间,默认为NULL。

+

hasindexes

+

Boolean

+

PG_CLASS.relhasindex

+

如果表上有索引(或者最近拥有)则为TRUE,否则为FALSE。

+

hasrules

+

Boolean

+

PG_CLASS.relhasruls

+

如果表上有规则,则为TRUE,否则为FALSE。

+

hastriggers

+

Boolean

+

PG_CLASS.RELHASTRIGGERS

+

如果表上有触发器,则为TRUE,否则为FALSE。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TABLESPACE.md b/content/zh/docs/Developerguide/PG_TABLESPACE.md new file mode 100644 index 000000000..987c73e69 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TABLESPACE.md @@ -0,0 +1,67 @@ +# PG\_TABLESPACE + +PG\_TABLESPACE系统表存储表空间信息。 + +**表 1** PG\_TABLESPACE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

spcname

+

name

+

表空间名称。

+

spcowner

+

oid

+

表空间的所有者,通常是创建它的人。

+

spcacl

+

aclitem[]

+

访问权限。具体请参见GRANTREVOKE

+

spcoptions

+

text[]

+

表空间的选项。

+

spcmaxsize

+

text

+

可使用的最大磁盘空间大小,单位Byte。

+

relative

+

boolean

+

标识表空间指定的存储路径是否为相对路径。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TDE_INFO.md b/content/zh/docs/Developerguide/PG_TDE_INFO.md new file mode 100644 index 000000000..262176679 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TDE_INFO.md @@ -0,0 +1,41 @@ +# PG\_TDE\_INFO + +PG\_TDE\_INFO视图提供了openGauss加密信息。 + +**表 1** PG\_TDE\_INFO字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

is_encrypt

+

Boolean

+
是否加密openGauss
  • f:非加密openGauss
  • t:加密openGauss
+
+

g_tde_algo

+

text

+
加密算法。
  • SM4-CTR-128
  • AES-CTR-128
+
+

remain

+

text

+

保留字段。

+
+ diff --git a/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md b/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md new file mode 100644 index 000000000..6ca28c4c7 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_THREAD_WAIT_STATUS.md @@ -0,0 +1,1071 @@ +# PG\_THREAD\_WAIT\_STATUS + +通过PG\_THREAD\_WAIT\_STATUS视图可以检测当前实例中工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况。 + +**表 1** PG\_THREAD\_WAIT\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

当前节点的名称。

+

db_name

+

text

+

数据库名称。

+

thread_name

+

text

+

线程名称。

+

query_id

+

bigint

+

查询ID,对应debug_query_id。

+

tid

+

bigint

+

当前线程的线程号。

+

sessionid

+

bigint

+

当前会话ID。

+

lwtid

+

integer

+

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

+

psessionid

+

bigint

+

父会话ID。

+

ptid

+

integer

+

streaming线程的父线程。

+

tlevel

+

integer

+

streaming线程的层级。

+

smpid

+

integer

+

并行线程的ID。

+

wait_status

+

text

+

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

+

wait_event

+

text

+

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

+
+ +wait\_status列的等待状态有以下状态。 + +**表 2** 等待状态列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

wait_status值

+

含义

+

none

+

没在等任意事件。

+

acquire lock

+

等待加锁,要么加锁成功,要么加锁等待超时。

+

acquire lwlock

+

等待获取轻量级锁。

+

wait io

+

等待IO完成。

+

wait cmd

+

等待完成读取网络通信包。

+

wait pooler get conn

+

等待pooler完成获取连接。

+

wait pooler abort conn

+

等待pooler完成终止连接。

+

wait pooler clean conn

+

等待pooler完成清理连接。

+

pooler create conn: [nodename], total N

+

等待pooler建立连接,当前正在与nodename指定节点建立连接,且仍有N个连接等待建立。

+

get conn

+

获取到其他节点的连接。

+

set cmd: [nodename]

+

在连接上执行SET/RESET/TRANSACTION BLOCK LEVEL PARA SET/SESSION LEVEL PARA SET,当前正在nodename指定节点上执行。

+

cancel query

+

取消某连接上正在执行的SQL语句。

+

stop query

+

停止某连接上正在执行的查询。

+

wait node: [nodename](plevel), total N, [phase]

+
等待接收与某节点的连接上的数据,当前正在等待nodename节点plevel线程的数据,且仍有N个连接的数据待返回。如果状态包含phase信息,则可能的阶段状态有:
  • begin:表示处于事务开始阶段。
  • commit:表示处于事务提交阶段。
  • rollback:表示处于事务回滚阶段。
+
+

wait transaction sync: xid

+

等待xid指定事务同步。

+

wait wal sync

+

等待特定LSN的wal log完成到备机的同步。

+

wait data sync

+

等待完成数据页到备机的同步。

+

wait data sync queue

+

等待把行存的数据页或列存的CU放入同步队列。

+

flush data: [nodename](plevel), [phase]

+

等待向网络中nodename指定节点的plevel对应线程发送数据。如果状态包含phase信息,则可能的阶段状态为wait quota,即当前通信流正在等待quota值。

+

stream get conn: [nodename], total N

+

初始化stream flow时,等待与nodename节点的consumer对象建立连接,且当前有N个待建连对象。

+

wait producer ready: [nodename](plevel), total N

+

初始化stream flow时,等待每个producer都准备好,当前正在等待nodename节点plevel对应线程的producer对象准备好,且仍有N个producer对象处于等待状态。

+

synchronize quit

+

steam plan结束时,等待stream线程组内的线程统一退出。

+

nodegroup destroy

+

steam plan结束时,等待销毁stream node group。

+

wait active statement

+

等待作业执行,正在资源负载管控中。

+

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分析操作。

+

vacuum: [relname], [phase]

+

当前正在对表relname执行vacuum。如果状态包含phase信息,则为autovacuum,表示是数据库自动开启AutoVacuum线程执行的vacuum清理操作。

+

vacuum full: [relname]

+

当前正在对表relname执行vacuum full清理。

+

create index

+

当前正在创建索引。

+

HashJoin - [ build hash | write file ]

+
当前是HashJoin算子,主要关注耗时的执行阶段。
  • build hash:表示当前HashJoin算子正在建立哈希表。
  • write file:表示当前HashJoin算子正在将数据写入磁盘。
+
+

HashAgg - [ build hash | write file ]

+
当前是HashAgg算子,主要关注耗时的执行阶段。
  • build hash:表示当前HashAgg算子正在建立哈希表。
  • write file:表示当前HashAgg算子正在将数据写入磁盘。
+
+

HashSetop - [build hash | write file ]

+
当前是HashSetop算子,主要关注耗时的执行阶段。
  • build hash:表示当前HashSetop算子正在建立哈希表。
  • write file:表示当前HashSetop算子正在将数据写入磁盘。
+
+

Sort | Sort - write file

+

当前是Sort算子做排序,write file表示Sort算子正在将数据写入磁盘。

+

Material | Material - write file

+

当前是Material算子,write file表示Material算子正在将数据写入磁盘。

+
+ +当wait\_status为acquire lwlock、acquire lock或者wait io时,表示有等待事件。正在等待获取wait\_event列对应类型的轻量级锁、事务锁,或者正在进行IO。 + +其中,wait\_status值为acquire lwlock(轻量级锁)时对应的wait\_event等待事件类型与描述信息如下。(wait\_event为extension时,表示此时的轻量级锁是动态分配的锁,未被监控。) + +**表 3** 轻量级锁等待事件列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

wait_event类型

+

类型描述

+

ShmemIndexLock

+

用于保护共享内存中的主索引哈希表。

+

OidGenLock

+

用于避免不同线程产生相同的OID。

+

XidGenLock

+

用于避免两个事务获得相同的xid。

+

ProcArrayLock

+

用于避免并发访问或修改ProcArray共享数组。

+

SInvalReadLock

+

用于避免与清理失效消息并发执行。

+

SInvalWriteLock

+

用于避免与其它写失效消息、清理失效消息并发执行。

+

WALInsertLock

+

用于避免与其它WAL插入操作并发执行。

+

WALWriteLock

+

用于避免并发WAL写盘。

+

ControlFileLock

+

用于避免pg_control文件的读写并发、写写并发。

+

CheckpointLock

+

用于避免多个checkpoint并发执行。

+

CLogControlLock

+

用于避免并发访问或者修改Clog控制数据结构。

+

SubtransControlLock

+

用于避免并发访问或者修改子事务控制数据结构。

+

MultiXactGenLock

+

用于串行分配唯一MultiXact id。

+

MultiXactOffsetControlLock

+

用于避免对pg_multixact/offset的写写并发和读写并发。

+

MultiXactMemberControlLock

+

用于避免对pg_multixact/members的写写并发和读写并发。

+

RelCacheInitLock

+

用于失效消息场景对init文件进行操作时加锁。

+

CheckpointerCommLock

+

用于向checkpointer发起文件刷盘请求场景,需要串行的向请求队列插入请求结构。

+

TwoPhaseStateLock

+

用于避免并发访问或者修改两阶段信息共享数组。

+

TablespaceCreateLock

+

用于确定tablespace是否已经存在。

+

BtreeVacuumLock

+

用于防止vacuum清理B-tree中还在使用的页面。

+

AutovacuumLock

+

用于串行化访问autovacuum worker数组。

+

AutovacuumScheduleLock

+

用于串行化分配需要vacuum的table。

+

AutoanalyzeLock

+

用于获取和释放允许执行Autoanalyze的任务资源。

+

SyncScanLock

+

用于确定heap扫描时某个relfilenode的起始位置。

+

NodeTableLock

+

用于保护存放数据库节点信息的共享结构。

+

PoolerLock

+

用于保证两个线程不会同时从连接池里取到相同的连接。

+

RelationMappingLock

+

用于等待更新系统表到存储位置之间映射的文件。

+

AsyncCtlLock

+

用于避免并发访问或者修改共享通知状态。

+

AsyncQueueLock

+

用于避免并发访问或者修改共享通知信息队列。

+

SerializableXactHashLock

+

用于避免对于可串行事务共享结构的写写并发和读写并发。

+

SerializableFinishedListLock

+

用于避免对于已完成可串行事务共享链表的写写并发和读写并发。

+

SerializablePredicateLockListLock

+

用于保护对于可串行事务持有的锁链表。

+

OldSerXidLock

+

用于保护记录冲突可串行事务的结构。

+

FileStatLock

+

用于保护存储统计文件信息的数据结构。

+

SyncRepLock

+

用于在主备复制时保护xlog同步信息。

+

DataSyncRepLock

+

用于在主备复制时保护数据页同步信息。

+

CStoreColspaceCacheLock

+

用于保护列存表的CU空间分配。

+

CStoreCUCacheSweepLock

+

用于列存CU Cache循环淘汰。

+

MetaCacheSweepLock

+

用于元数据循环淘汰。

+

ExtensionConnectorLibLock

+

用于初始化ODBC连接场景,在加载与卸载特定动态库时进行加锁。

+

SearchServerLibLock

+

用于GPU加速场景初始化加载特定动态库时,对读文件操作进行加锁。

+

LsnXlogChkFileLock

+

用于串行更新特定结构中记录的主备机的xlog flush位置点。

+

GTMHostInfoLock

+

用于避免并发访问或者修改GTM主机信息。

+

ReplicationSlotAllocationLock

+

用于主备复制时保护主机端的流复制槽的分配。

+

ReplicationSlotControlLock

+

用于主备复制时避免并发更新流复制槽状态。

+

ResourcePoolHashLock

+

用于避免并发访问或者修改资源池哈希表。

+

WorkloadStatHashLock

+

用于避免并发访问或者修改包含数据库主节点的SQL请求构成的哈希表。

+

WorkloadIoStatHashLock

+

用于避免并发访问或者修改用于统计当前数据库节点的IO信息的哈希表。

+

WorkloadCGroupHashLock

+

用于避免并发访问或者修改Cgroup信息构成的哈希表。

+

OBSGetPathLock

+

用于避免对obs路径的写写并发和读写并发。

+

WorkloadUserInfoLock

+

用于避免并发访问或修改负载管理的用户信息哈希表。

+

WorkloadRecordLock

+

用于避免并发访问或修改在内存自适应管理时对数据库主节点收到请求构成的哈希表。

+

WorkloadIOUtilLock

+

用于保护记录iostat,CPU等负载信息的结构。

+

WorkloadNodeGroupLock

+

用于避免并发访问或者修改内存中的nodegroup信息构成的哈希表。

+

JobShmemLock

+

用于MPP兼容A定时任务功能中保护定时读取的全局变量。

+

OBSRuntimeLock

+

用于获取环境变量,如GASSHOME。

+

LLVMDumpIRLock

+

用于导出动态生成函数所对应的汇编语言。

+

LLVMParseIRLock

+

用于在查询开始处从IR文件中编译并解析已写好的IR函数。

+

CriticalCacheBuildLock

+

用于从共享或者本地缓存初始化文件中加载cache的场景。

+

WaitCountHashLock

+

用于保护用户语句计数功能场景中的共享结构。

+

BufMappingLock

+

用于保护对共享缓冲映射表的操作。

+

LockMgrLock

+

用于保护常规锁结构信息。

+

PredicateLockMgrLock

+

用于保护可串行事务锁结构信息。

+

OperatorRealTLock

+

用于避免并发访问或者修改记录算子级实时数据的全局结构。

+

OperatorHistLock

+

用于避免并发访问或者修改记录算子级历史数据的全局结构。

+

SessionRealTLock

+

用于避免并发访问或者修改记录query级实时数据的全局结构。

+

SessionHistLock

+

用于避免并发访问或者修改记录query级历史数据的全局结构。

+

CacheSlotMappingLock

+

用于保护CU Cache全局信息。

+

BarrierLock

+

用于保证当前只有一个线程在创建Barrier。

+
+ +当wait\_status值为wait io时对应的wait\_event等待事件类型与描述信息如下。 + +**表 4** IO等待事件列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

wait_event类型

+

类型描述

+

BufFileRead

+

从临时文件中读取数据到指定buffer。

+

BufFileWrite

+

向临时文件中写入指定buffer中的内容。

+

ControlFileRead

+

读取pg_control文件。主要在数据库启动、执行checkpoint和主备校验过程中发生。

+

ControlFileSync

+

将pg_control文件持久化到磁盘。数据库初始化时发生。

+

ControlFileSyncUpdate

+

将pg_control文件持久化到磁盘。主要在数据库启动、执行checkpoint和主备校验过程中发生。

+

ControlFileWrite

+

写入pg_control文件。数据库初始化时发生。

+

ControlFileWriteUpdate

+

更新pg_control文件。主要在数据库启动、执行checkpoint和主备校验过程中发生。

+

CopyFileRead

+

copy文件时读取文件内容。

+

CopyFileWrite

+

copy文件时写入文件内容。

+

DataFileExtend

+

扩展文件时向文件写入内容。

+

DataFileFlush

+

将表数据文件持久化到磁盘

+

DataFileImmediateSync

+

将表数据文件立即持久化到磁盘。

+

DataFilePrefetch

+

异步读取表数据文件。

+

DataFileRead

+

同步读取表数据文件。

+

DataFileSync

+

将表数据文件的修改持久化到磁盘。

+

DataFileTruncate

+

表数据文件truncate。

+

DataFileWrite

+

向表数据文件写入内容。

+

LockFileAddToDataDirRead

+

读取"postmaster.pid"文件。

+

LockFileAddToDataDirSync

+

将"postmaster.pid"内容持久化到磁盘。

+

LockFileAddToDataDirWrite

+

将pid信息写到"postmaster.pid"文件。

+

LockFileCreateRead

+

读取LockFile文件"%s.lock"。

+

LockFileCreateSync

+

将LockFile文件"%s.lock"内容持久化到磁盘。

+

LockFileCreateWRITE

+

将pid信息写到LockFile文件"%s.lock"。

+

RelationMapRead

+

读取系统表到存储位置之间的映射文件

+

RelationMapSync

+

将系统表到存储位置之间的映射文件持久化到磁盘。

+

RelationMapWrite

+

写入系统表到存储位置之间的映射文件。

+

ReplicationSlotRead

+

读取流复制槽文件。重新启动时发生。

+

ReplicationSlotRestoreSync

+

将流复制槽文件持久化到磁盘。重新启动时发生。

+

ReplicationSlotSync

+

checkpoint时将流复制槽临时文件持久化到磁盘。

+

ReplicationSlotWrite

+

checkpoint时写流复制槽临时文件。

+

SLRUFlushSync

+

将pg_clog、pg_subtrans和pg_multixact文件持久化到磁盘。主要在执行checkpoint和数据库停机时发生。

+

SLRURead

+

读取pg_clog、pg_subtrans和pg_multixact文件。

+

SLRUSync

+

将脏页写入文件pg_clog、pg_subtrans和pg_multixact并持久化到磁盘。主要在执行checkpoint和数据库停机时发生。

+

SLRUWrite

+

写入pg_clog、pg_subtrans和pg_multixact文件。

+

TimelineHistoryRead

+

读取timeline history文件。在数据库启动时发生。

+

TimelineHistorySync

+

将timeline history文件持久化到磁盘。在数据库启动时发生。

+

TimelineHistoryWrite

+

写入timeline history文件。在数据库启动时发生。

+

TwophaseFileRead

+

读取pg_twophase文件。在两阶段事务提交、两阶段事务恢复时发生。

+

TwophaseFileSync

+

将pg_twophase文件持久化到磁盘。在两阶段事务提交、两阶段事务恢复时发生。

+

TwophaseFileWrite

+

写入pg_twophase文件。在两阶段事务提交、两阶段事务恢复时发生。

+

WALBootstrapSync

+

将初始化的WAL文件持久化到磁盘。在数据库初始化发生。

+

WALBootstrapWrite

+

写入初始化的WAL文件。在数据库初始化发生。

+

WALCopyRead

+

读取已存在的WAL文件并进行复制时产生的读操作。在执行归档恢复完后发生。

+

WALCopySync

+

将复制的WAL文件持久化到磁盘。在执行归档恢复完后发生。

+

WALCopyWrite

+

读取已存在WAL文件并进行复制时产生的写操作。在执行归档恢复完后发生。

+

WALInitSync

+

将新初始化的WAL文件持久化磁盘。在日志回收或写日志时发生。

+

WALInitWrite

+

将新创建的WAL文件初始化为0。在日志回收或写日志时发生。

+

WALRead

+

从xlog日志读取数据。两阶段文件redo相关的操作产生。

+

WALSyncMethodAssign

+

将当前打开的所有WAL文件持久化到磁盘。

+

WALWrite

+

写入WAL文件。

+
+ +当wait\_status值为acquire lock(事务锁)时对应的wait\_event等待事件类型与描述信息如下。 + +**表 5** 事务锁等待事件列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

wait_event类型

+

类型描述

+

relation

+

对表加锁。

+

extend

+

对表扩展空间时加锁。

+

partition

+

对分区表加锁。

+

partition_seq

+

对分区表的分区加锁。

+

page

+

对表页面加锁。

+

tuple

+

对页面上的tuple加锁。

+

transactionid

+

对事务ID加锁。

+

virtualxid

+

对虚拟事务ID加锁。

+

object

+

加对象锁。

+

cstore_freespace

+

对列存空闲空间加锁。

+

userlock

+

加用户锁。

+

advisory

+

加advisory锁。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TIMEZONE_ABBREVS.md b/content/zh/docs/Developerguide/PG_TIMEZONE_ABBREVS.md new file mode 100644 index 000000000..020315aad --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TIMEZONE_ABBREVS.md @@ -0,0 +1,39 @@ +# PG\_TIMEZONE\_ABBREVS + +PG\_TIMEZONE\_ABBREVS视图提供了显示了所有可用的时区信息。 + +**表 1** PG\_TIMEZONE\_ABBREVS字段 + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

abbrev

+

text

+

时区名缩写。

+

utc_offset

+

interval

+

相对于UTC的偏移量。

+

is_dst

+

Boolean

+

如果当前正处于夏令时范围则为TRUE,否则为FALSE。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TIMEZONE_NAMES.md b/content/zh/docs/Developerguide/PG_TIMEZONE_NAMES.md new file mode 100644 index 000000000..b15ac3201 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TIMEZONE_NAMES.md @@ -0,0 +1,46 @@ +# PG\_TIMEZONE\_NAMES + +PG\_TIMEZONE\_NAMES视图提供了显示了所有能够被SET TIMEZONE识别的时区名及其缩写、UTC偏移量、是否夏时制。 + +**表 1** PG\_TIMEZONE\_NAMES字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

name

+

text

+

时区名。

+

abbrev

+

text

+

时区名缩写。

+

utc_offset

+

interval

+

相对于UTC的偏移量。

+

is_dst

+

Boolean

+

如果当前正处于夏令时范围则为TRUE,否则为FALSE。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md b/content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md new file mode 100644 index 000000000..1969c9260 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md @@ -0,0 +1,39 @@ +# 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 new file mode 100644 index 000000000..27d2e1f64 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md @@ -0,0 +1,143 @@ +# PG\_TOTAL\_USER\_RESOURCE\_INFO + +PG\_TOTAL\_USER\_RESOURCE\_INFO视图显示所有用户资源使用情况,需要使用管理员用户进行查询。此视图在参数[use\_workload\_manager](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s9608d330c6a14d2cbd6ae75493437820)为on时才有效。其中,IO相关监控项在参数enable\_logical\_io\_statistics为on时才有效。 + +**表 1** PG\_TOTAL\_USER\_RESOURCE\_INFO字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

username

+

name

+

用户名。

+

used_memory

+

integer

+

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

+

total_memory

+

integer

+

可以使用的内存大小,单位MB。值为0表示未限制最大可用内存,其限制取决于数据库最大可用内存。

+

used_cpu

+

double precision

+

正在使用的CPU核数(仅统计复杂作业CPU使用 情况,且该值为相关控制组的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表示未限制。

+

read_kbytes

+

bigint

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业read的字节总数(单位KB)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业read的字节总数(单位KB)。

+

write_kbytes

+

bigint

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业write的字节总数(单位KB)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业write的字节总数(单位KB)。

+

read_counts

+

bigint

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业read的次数之和(单位次)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业read的次数之和(单位次)。

+

write_counts

+

bigint

+

数据库主节点:过去5秒内,该用户在数据库节点上复杂作业write的次数之和(单位次)。

+

数据库节点:实例启动至当前时间为止,该用户复杂作业write的次数之和(单位次)。

+

read_speed

+

double precision

+

数据库主节点:过去5秒内,该用户在单个数据库节点上复杂作业read平均速率(单位KB/s)。

+

数据库节点:过去5秒内,该用户在该数据库节点上复杂作业read平均速率(单位KB/s)。

+

write_speed

+

double precision

+

数据库主节点:过去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 new file mode 100644 index 000000000..0e7105ae4 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md @@ -0,0 +1,95 @@ +# PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID + +PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID视图显示所有用户资源使用情况,需要使用管理员用户进行查询。此视图在参数[use\_workload\_manager](负载管理.md#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s9608d330c6a14d2cbd6ae75493437820)为on时才有效。 + +**表 1** PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

userid

+

oid

+

用户ID。

+

used_memory

+

integer

+

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

+

total_memory

+

integer

+

可以使用的内存大小,单位MB。值为0表示未限制最大可用内存,其限制取决于数据库最大可用内存。

+

used_cpu

+

double precision

+

正在使用的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/PG_TRIGGER.md b/content/zh/docs/Developerguide/PG_TRIGGER.md new file mode 100644 index 000000000..a45bd0d93 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TRIGGER.md @@ -0,0 +1,133 @@ +# PG\_TRIGGER + +PG\_TRIGGER系统表存储触发器信息。 + +**表 1** PG\_TRIGGER字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

tgrelid

+

oid

+

触发器所在表的OID。

+

tgname

+

name

+

触发器名。

+

tgfoid

+

oid

+

触发器OID。

+

tgtype

+

smallint

+

触发器类型。

+

tgenabled

+

"char"

+

O =触发器在“origin”和“local”模式下触发。

+

D =触发器被禁用。

+

R =触发器在“replica”模式下触发。

+

A =触发器始终触发。

+

tgisinternal

+

boolean

+

内部触发器标识,如果为true表示内部触发器。

+

tgconstrrelid

+

oid

+

完整性约束引用的表。

+

tgconstrindid

+

oid

+

完整性约束的索引。

+

tgconstraint

+

oid

+

约束触发器在pg_constraint中的OID。

+

tgdeferrable

+

boolean

+

约束触发器是为DEFERRABLE类型。

+

tginitdeferred

+

boolean

+

约束触发器是否为INITIALLY DEFERRED类型。

+

tgnargs

+

smallint

+

触发器函数入参个数。

+

tgattr

+

int2vector

+

当触发器指定列时的列号,未指定则为空数组。

+

tgargs

+

bytea

+

传递给触发器的参数。

+

tgqual

+

pg_node_tree

+

表示触发器的WHEN条件,如果没有则为null。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TS_CONFIG.md b/content/zh/docs/Developerguide/PG_TS_CONFIG.md new file mode 100644 index 000000000..277389df0 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TS_CONFIG.md @@ -0,0 +1,76 @@ +# PG\_TS\_CONFIG + +PG\_TS\_CONFIG系统表包含表示文本搜索配置的记录。一个配置指定一个特定的文本搜索解析器和一个为了每个解析器的输出类型使用的字典的列表。 + +解析器在PG\_TS\_CONFIG记录中显示,但是字典映射的标记是由[PG\_TS\_CONFIG\_MAP](PG_TS_CONFIG_MAP.md#ZH-CN_TOPIC_0242385851)里面的辅助记录定义的。 + +**表 1** PG\_TS\_CONFIG字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

cfgname

+

name

+

-

+

文本搜索配置名。

+

cfgnamespace

+

oid

+

PG_NAMESPACE.oid

+

包含这个配置的名称空间的OID。

+

cfgowner

+

oid

+

PG_AUTHID.oid

+

配置的所有者。

+

cfgparser

+

oid

+

PG_TS_PARSER.oid

+

这个配置的文本搜索解析器的OID。

+

cfoptions

+

text[]

+

-

+

分词相关配置选项。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md b/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md new file mode 100644 index 000000000..95ea1a843 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TS_CONFIG_MAP.md @@ -0,0 +1,56 @@ +# PG\_TS\_CONFIG\_MAP + +PG\_TS\_CONFIG\_MAP系统表包含为每个文本搜索配置的解析器的每个输出符号类型,显示哪个文本搜索字典应该被咨询、以什么顺序搜索的记录。 + +**表 1** PG\_TS\_CONFIG\_MAP字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

mapcfg

+

oid

+

PG_TS_CONFIG.oid

+

拥有这个映射记录的PG_TS_CONFIG记录的OID。

+

maptokentype

+

integer

+

-

+

由配置的解析器发出的一个符号类型。

+

mapseqno

+

integer

+

-

+

以什么顺序咨询这个记录。

+

mapdict

+

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 new file mode 100644 index 000000000..5b17128b6 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TS_DICT.md @@ -0,0 +1,76 @@ +# PG\_TS\_DICT + +PG\_TS\_DICT系统表包含定义文本搜索字典的记录。字典取决于文本搜索模板,该模板声明所有需要的实现函数;字典本身提供模板支持的用户可设置的参数的值。 + +这种分工允许字典通过非权限用户创建。参数由文本字符串dictinitoption指定,参数的格式和意义取决于模板。 + +**表 1** PG\_TS\_DICT字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

dictname

+

name

+

-

+

文本搜索字典名。

+

dictnamespace

+

oid

+

PG_NAMESPACE.oid

+

包含这个字典的名称空间的OID。

+

dictowner

+

oid

+

PG_AUTHID.oid

+

字典的所有者。

+

dicttemplate

+

oid

+

PG_TS_TEMPLATE.oid

+

这个字典的文本搜索模板的OID。

+

dictinitoption

+

text

+

-

+

该模板的初始化选项字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TS_PARSER.md b/content/zh/docs/Developerguide/PG_TS_PARSER.md new file mode 100644 index 000000000..725df7ca5 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TS_PARSER.md @@ -0,0 +1,92 @@ +# PG\_TS\_PARSER + +PG\_TS\_PARSER系统表包含定义文本解析器的记录。解析器负责分裂输入文本为词位,并且为每个词位分配标记类型。因为解析器必须通过C语言级别的函数实现,所以新解析器必须由数据库系统管理员创建。 + +**表 1** PG\_TS\_PARSER字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性;必须明确选择)。

+

prsname

+

name

+

-

+

文本搜索解析器名。

+

prsnamespace

+

oid

+

PG_NAMESPACE.oid

+

包含这个解析器的名称空间的OID。

+

prsstart

+

regproc

+

PG_PROC.proname

+

解析器的启动函数名。

+

prstoken

+

regproc

+

PG_PROC.proname

+

解析器的下一个标记函数名。

+

prsend

+

regproc

+

PG_PROC.proname

+

解析器的关闭函数名。

+

prsheadline

+

regproc

+

PG_PROC.proname

+

解析器的标题函数名。

+

prslextype

+

regproc

+

PG_PROC.proname

+

解析器的lextype函数名。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md b/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md new file mode 100644 index 000000000..c7127859f --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TS_TEMPLATE.md @@ -0,0 +1,65 @@ +# PG\_TS\_TEMPLATE + +PG\_TS\_TEMPLATE系统表包含定义文本搜索模板的记录。模板是文本搜索字典的类的实现框架。因为模板必须通过C语言级别的函数实现,索引新模板的创建必须由数据库系统管理员创建。 + +**表 1** PG\_TS\_TEMPLATE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性;必须明确选择)。

+

tmplname

+

name

+

-

+

文本搜索模板名。

+

tmplnamespace

+

oid

+

PG_NAMESPACE.oid

+

包含这个模板的名称空间的OID。

+

tmplinit

+

regproc

+

PG_PROC.proname

+

模板的初始化函数名。

+

tmpllexize

+

regproc

+

PG_PROC.proname

+

模板的lexize函数名。

+
+ diff --git a/content/zh/docs/Developerguide/PG_TYPE.md b/content/zh/docs/Developerguide/PG_TYPE.md new file mode 100644 index 000000000..8f3a26ad5 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_TYPE.md @@ -0,0 +1,243 @@ +# PG\_TYPE + +PG\_TYPE系统表存储数据类型的相关信息。 + +**表 1** PG\_TYPE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

typname

+

name

+

数据类型名称。

+

typnamespace

+

oid

+

包含这个类型的名称空间的OID。

+

typowner

+

oid

+

该类型的所有者。

+

typlen

+

smallint

+
对于定长类型是该类型内部表现形式的字节数目。对于变长类型是负数。
  • -1表示一种“变长”(有长度字属性的数据)。
  • -2表示这是一个NULL结尾的C字符串。
+
+

typbyval

+

Boolean

+

指定内部传递这个类型的数值时是传值还是传引用。如果该类型的TYPLEN不是1,2,4,8, TYPBYVAL最好为假。变长类型通常是传引用。即使TYPLEN允许传值,TYPBYVAL也可以为假。

+

typtype

+

"char"

+
  • 对于基础类型是b。
  • 对于复合类型是c(比如,一个表的行类型)。
  • 对于域类型是d。
  • 对于伪类型是p。
+

参见typrelid和typbasetype。

+

typcategory

+

"char"

+

是数据类型的模糊分类,可用于解析器做为数据转换的依据。

+

typispreferred

+

Boolean

+

如果为真,则数据符合TYPCATEGORY所指定的转换规则时进行转换。

+

typisdefined

+

Boolean

+

如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。如果为假,则除了该类型名称,名称空间和OID之外没有可靠的信息。

+

typdelim

+

"char"

+

当分析数组输入时,分隔两个此类型数值的字符请注意该分隔符是与数组元素数据类型相关联的,而不是和数组数据类型关联。

+

typrelid

+

oid

+

如果是复合类型(请参见typtype),则这个字段指向pg_class中定义该表的行。对于自由存在的复合类型,pg_class记录并不表示一个表,但是总需要它来查找该类型连接的pg_attribute记录。对于非复合类型为零。

+

typelem

+

oid

+

如果不为0,则它标识pg_type里面的另外一行。当前类型可以当做一个产生类型为typelem的数组来描述。一个"真正的"数组类型是变长的(typlen= -1),但是一些定长的(typlen > 0)类型也拥有非零的typelem(比如name和point)。如果一个定长类型拥有一个typelem ,则他的内部形式必须是typelem数据类型的某个数目的个数值,不能有其他数据。变长数组类型有一个该数组子过程定义的头(文件)。

+

typarray

+

oid

+

如果不为0,则表示在pg_type中有对应的类型记录。

+

typinput

+

regproc

+

输入转换函数(文本格式)。

+

typoutput

+

regproc

+

输出转换函数(文本格式)。

+

typreceive

+

regproc

+

输入转换函数(二进制格式),如果没有则为0。

+

typsend

+

regproc

+

输出转换函数(二进制格式),如果没有则为0。

+

typmodin

+

regproc

+

输入类型修改符函数,如果为0,则不支持。

+

typmodout

+

regproc

+

输出类型修改符函数,如果为0,则不支持。

+

typanalyze

+

regproc

+

自定义的ANALYZE函数,如果使用标准函数,则为0。

+

typalign

+

"char"

+
当存储此类型的数值时要求的对齐性质。它应用于磁盘存储以及该值在PostgreSQL内部的大多数形式。如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时,则先在此类型的数据前填充空白,这样它就可以按照要求的界限存储。对齐引用是该序列中第一个数据的开头。可能的值包含:
  • c = char对齐,也就是不需要对齐。
  • s = short对齐(在大多数机器上是2字节)
  • i = int对齐(在大多数机器上是4字节)
  • d = double对齐(在大多数机器上是8字节,但不一定是全部)
+
+
须知:

对于在系统表里使用的类型,在pg_type里定义的尺寸和对齐必须和编译器在一个表示表的一行的结构里的布局一样。

+
+

typstorage

+

"char"

+
指明一个变长类型(那些有typlen = -1)是否准备好应付非常规值,以及对这种属性的类型的缺省策略是什么。可能的值包含:
  • p:数值总是以简单方式存储。
  • e:数值可以存储在一个"次要"关系中(如果该关系有这么一个,请参见pg_class.reltoastrelid)。
  • m:数值可以以内联的压缩方式存储。
  • x:数值可以以内联的压缩方式或者在"次要"表里存储。
+
+
须知:

m域也可以移到从属表里存储,但只是最后的解决方法(e和x域先移走)。

+
+

typenotnull

+

Boolean

+

代表在某类型上的一个NOTNULL约束。目前只用于域。

+

typbasetype

+

oid

+

如果这是一个衍生类型(请参见typtype),则该标识作为这个类型的基础的类型。如果不是衍生类型则为零。

+

typtypmod

+

integer

+

域使用typtypmod记录要作用到它们的基础类型上的typmod(如果基础类型不使用typmod则为-1)。如果这种类型不是域,则为-1。

+

typndims

+

integer

+

如果一个域是数组,则typndims是数组维数的数值(也就是说,typbasetype是一个数组类型;域的typelem将匹配基本类型的typelem)。非域非数组域为零。

+

typcollation

+

oid

+

指定类型的排序规则。如果为0,则表示不支持排序。

+

typdefaultbin

+

pg_node_tree

+

如果为非NULL,则它是该类型缺省表达式的nodeToString() 表现形式。目前这个字段只用于域。

+

typdefault

+

text

+

如果某类型没有相关缺省值,则取值是NULL。如果typdefaultbin不是NULL,则typdefault必须包含一个typdefaultbin代表的缺省表达式的人类可读的版本。如果typdefaultbin为NULL但typdefault不是,typdefault则是该类型缺省值的外部表现形式,可以把它交给该类型的输入转换器生成一个常量。

+

typacl

+

aclitem[]

+

访问权限。

+
+ diff --git a/content/zh/docs/Developerguide/PG_USER.md b/content/zh/docs/Developerguide/PG_USER.md new file mode 100644 index 000000000..502be4fa1 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_USER.md @@ -0,0 +1,151 @@ +# PG\_USER + +PG\_USER视图提供了访问数据库用户的信息。 + +**表 1** PG\_USER字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

usename

+

name

+

用户名。

+

usesysid

+

oid

+

此用户的ID。

+

usecreatedb

+

Boolean

+

用户是否可以创建数据库。

+

usesuper

+

Boolean

+

用户是否是拥有最高权限的初始系统管理员。

+

usecatupd

+

Boolean

+

用户是否可以直接更新系统表。只有usesysid=10的初始系统管理员拥有此权限。其他用户无法获得此权限。

+

userepl

+

Boolean

+

用户是否可以复制数据流。

+

passwd

+

text

+

密文存储后的用户口令,始终为********。

+

valbegin

+

timestamp with time zone

+

帐户的有效开始时间;如果没有设置有效开始时间,则为NULL。

+

valuntil

+

timestamp with time zone

+

帐户的有效结束时间;如果没有设置有效结束时间,则为NULL。

+

respool

+

name

+

用户所在的资源池。

+

parent

+

oid

+

父用户OID。

+

spacelimit

+

text

+

永久表存储空间限额。

+

tempspacelimit

+

text

+

临时表存储空间限额。

+

spillspacelimit

+

text

+

算子落盘空间限额。

+

useconfig

+

text[]

+

运行时配置参数的会话缺省。

+

nodegroup

+

name

+

用户关联的逻辑openGauss名称,如果该用户没有管理逻辑openGauss,则该字段为空。

+

usemonitoradmin

+

Boolean

+

用户是否是监控管理员

+

useoperatoradmin

+

Boolean

+

用户是否是运维管理员

+

usepolicyadmin

+

Boolean

+

用户是否是安全策略管理员

+
+ diff --git a/content/zh/docs/Developerguide/PG_USER_MAPPING.md b/content/zh/docs/Developerguide/PG_USER_MAPPING.md new file mode 100644 index 000000000..fb83515b6 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_USER_MAPPING.md @@ -0,0 +1,58 @@ +# PG\_USER\_MAPPING + +PG\_USER\_MAPPING系统表存储从本地用户到远程的映射。 + +需要有系统管理员权限才可以访问此系统表。普通用户可以使用视图[PG\_USER\_MAPPINGS](PG_USER_MAPPINGS.md#ZH-CN_TOPIC_0242386000)进行查询。 + +**表 1** PG\_USER\_MAPPING字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

oid

+

oid

+

-

+

行标识符(隐藏属性,必须明确选择)。

+

umuser

+

oid

+

PG_AUTHID.oid

+

被映射的本地用户的OID,如果用户映射是公共的则为0。

+

umserver

+

oid

+

PG_FOREIGN_SERVER.oid

+

包含这个映射的外部服务器的OID。

+

umoptions

+

text[]

+

-

+

用户映射指定选项,使用“keyword=value”格式的字符串。

+
+ diff --git a/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md b/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md new file mode 100644 index 000000000..78aed44bc --- /dev/null +++ b/content/zh/docs/Developerguide/PG_USER_MAPPINGS.md @@ -0,0 +1,76 @@ +# PG\_USER\_MAPPINGS + +PG\_USER\_MAPPINGS视图提供访问关于用户映射的信息的接口。 + +这个视图只是一个[PG\_USER\_MAPPING](PG_USER_MAPPING.md#ZH-CN_TOPIC_0242385856)的可读部分的视图化表现,如果用户无权使用它则查询此表时,有些选项字段会显示为空。普通用户需要授权才可以访问。 + +**表 1** PG\_USER\_MAPPINGS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

umid

+

oid

+

PG_USER_MAPPING.oid

+

用户映射的OID。

+

srvid

+

oid

+

PG_FOREIGN_SERVER.oid

+

包含这个映射的外部服务器的OID。

+

srvname

+

name

+

PG_FOREIGN_SERVER.srvname

+

外部服务器的名称。

+

umuser

+

oid

+

PG_AUTHID.oid

+

被映射的本地角色的OID,如果用户映射是公共的则为0。

+

usename

+

name

+

-

+

被映射的本地用户的名称。

+

umoptions

+

text[ ]

+

-

+

如果当前用户是外部服务器的所有者,则为用户映射指定选项, 使用“keyword=value”字符串,否则为null。

+
+ diff --git a/content/zh/docs/Developerguide/PG_USER_STATUS.md b/content/zh/docs/Developerguide/PG_USER_STATUS.md new file mode 100644 index 000000000..850232c08 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_USER_STATUS.md @@ -0,0 +1,61 @@ +# PG\_USER\_STATUS + +PG\_USER\_STATUS系统表提供了访问数据库用户的状态。需要有系统管理员权限才可以访问此系统表 + +**表 1** PG\_USER\_STATUS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

roloid

+

oid

+

角色的标识。

+

failcount

+

integer

+

尝试失败次数。

+

locktime

+

timestamp with time zone

+

角色被锁定的时间点。

+

rolstatus

+

smallint

+
角色的状态。
  • 0:正常状态。
  • 1:由于登录失败次数超过阈值被锁定了一定的时间。
  • 2:被管理员锁定。
+
+

permspace

+

bigint

+

角色已经使用的永久表存储空间大小。

+

tempspace

+

bigint

+

角色已经使用的临时表存储空间大小。

+
+ diff --git a/content/zh/docs/Developerguide/PG_VARIABLE_INFO.md b/content/zh/docs/Developerguide/PG_VARIABLE_INFO.md new file mode 100644 index 000000000..b5da9c6b0 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_VARIABLE_INFO.md @@ -0,0 +1,95 @@ +# PG\_VARIABLE\_INFO + +PG\_VARIABLE\_INFO视图用于查询openGauss中当前节点的xid、oid的状态。 + +**表 1** PG\_VARIABLE\_INFO字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

node_name

+

text

+

节点名称。

+

nextOid

+

oid

+

该节点下一次生成的oid。

+

nextXid

+

xid

+

该节点下一次生成的事务号。

+

oldestXid

+

xid

+

该节点最老的事务号。

+

xidVacLimit

+

xid

+

强制autovacuum的临界点。

+

oldestXidDB

+

oid

+

该节点datafrozenxid最小的数据库oid。

+

lastExtendCSNLogpage

+

xid

+

最后一次扩展csnlog的页面号。

+

startExtendCSNLogpage

+

xid

+

csnlog扩展的起始页面号。

+

nextCommitSeqNo

+

xid

+

该节点下次生成的csn号。

+

latestCompletedXid

+

xid

+

该节点提交或者回滚后节点上的最新事务号。

+

startupMaxXid

+

xid

+

该节点关机前的最后一个事务号。

+
+ diff --git a/content/zh/docs/Developerguide/PG_VIEWS.md b/content/zh/docs/Developerguide/PG_VIEWS.md new file mode 100644 index 000000000..8d2323433 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_VIEWS.md @@ -0,0 +1,56 @@ +# PG\_VIEWS + +PG\_VIEWS视图提供访问数据库中每个视图的有用信息。 + +**表 1** PG\_VIEWS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

引用

+

描述

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

包含视图的模式名。

+

viewname

+

name

+

PG_CLASS.relname

+

视图名。

+

viewowner

+

name

+

PG_AUTHID.Erolname

+

视图的所有者。

+

definition

+

text

+

-

+

视图的定义。

+
+ diff --git a/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md b/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md new file mode 100644 index 000000000..eae16d0c8 --- /dev/null +++ b/content/zh/docs/Developerguide/PG_WLM_STATISTICS.md @@ -0,0 +1,83 @@ +# PG\_WLM\_STATISTICS + +PG\_WLM\_STATISTICS视图显示作业结束后或已被处理异常后的负载管理相关信息。 + +**表 1** PG\_WLM\_STATISTICS字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

statement

+

text

+

执行了异常处理的语句。

+

block_time

+

bigint

+

语句执行前的阻塞时间。

+

elapsed_time

+

bigint

+

语句的实际执行时间。

+

total_cpu_time

+

bigint

+

语句执行异常处理时数据库节点上CPU使用的总时间。

+

qualification_time

+

bigint

+

语句检查倾斜率的时间周期。

+

cpu_skew_percent

+

integer

+

语句在执行异常处理时数据库节点上CPU使用的倾斜率。

+

control_group

+

text

+

该字段不支持

+

status

+

text

+
语句执行异常处理后的状态,包括:
  • pending:执行前预备状态。
  • running:执行进行状态。
  • finished:执行正常结束。
  • abort:执行异常终止。
+
+

action

+

text

+
语句执行的异常处理动作,包括:
  • abort:执行终止操作。
  • adjust:执行Cgroups调整操作,目前只有降级操作。
  • finish:正常结束。
+
+
+ diff --git a/content/zh/docs/Developerguide/PG_WORKLOAD_GROUP.md b/content/zh/docs/Developerguide/PG_WORKLOAD_GROUP.md new file mode 100644 index 000000000..0a5fc35ce --- /dev/null +++ b/content/zh/docs/Developerguide/PG_WORKLOAD_GROUP.md @@ -0,0 +1,46 @@ +# PG\_WORKLOAD\_GROUP + +PG\_WORKLOAD\_GROUP系统表提供了数据库负载组的信息。 + +**表 1** PG\_WORKLOAD\_GROUP字段 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

oid

+

oid

+

行标识符(隐藏属性,必须明确选择)。

+

workload_gpname

+

name

+

负载组名称。

+

respool_oid

+

oid

+

绑定到的资源池的id。

+

act_statements

+

integer

+

负载组内最大的活跃语句数。

+
+ diff --git a/content/zh/docs/Developerguide/PLAN_TABLE.md b/content/zh/docs/Developerguide/PLAN_TABLE.md new file mode 100644 index 000000000..4612c3148 --- /dev/null +++ b/content/zh/docs/Developerguide/PLAN_TABLE.md @@ -0,0 +1,87 @@ +# PLAN\_TABLE + +PLAN\_TABLE显示用户通过执行EXPLAIN PLAN收集到的计划信息。计划信息的生命周期是session级别,session退出后相应的数据将被清除。同时不同session和不同user间的数据是相互隔离的。 + +**表 1** PLAN\_TABLE字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

statement_id

+

varchar2(30)

+

用户输入的查询标签。

+

plan_id

+

bigint

+

查询标识。

+

id

+

int

+

查询生成的计划中的每一个执行算子的编号。

+

operation

+

varchar2(30)

+

计划中算子的操作描述。

+

options

+

varchar2(255)

+

操作选项。

+

object_name

+

name

+

操作对应的对象名,非查询中使用到的对象别名。来自于用户定义。

+

object_type

+

varchar2(30)

+

对象类型。

+

object_owner

+

name

+

对象所属schema,来自于用户定义。

+

projection

+

varchar2(4000)

+

操作输出的列信息。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- object\_type取值范围为[PG\_CLASS](PG_CLASS.md)中定义的relkind类型(TABLE普通表,INDEX索引,SEQUENCE序列,VIEW视图,COMPOSITE TYPE复合类型,TOASTVALUE TOAST表)和计划使用到的rtekind\(SUBQUERY, JOIN, FUNCTION, VALUES, CTE, REMOTE\_QUERY\)。 +>- object\_owner对于RTE来说是计划中使用的对象描述,非用户定义的类型不存在object\_owner。 +>- statement\_id、object\_name、object\_owner、projection字段内容遵循用户定义的大小写存储,其它字段内容采用大写存储。 +>- 支持用户对PLAN\_TABLE进行SELECT和DELETE操作,不支持其它DML操作。 + diff --git a/content/zh/docs/Developerguide/PLAN_TABLE_DATA.md b/content/zh/docs/Developerguide/PLAN_TABLE_DATA.md new file mode 100644 index 000000000..a268b2c78 --- /dev/null +++ b/content/zh/docs/Developerguide/PLAN_TABLE_DATA.md @@ -0,0 +1,100 @@ +# PLAN\_TABLE\_DATA + +PLAN\_TABLE\_DATA存储了用户通过执行EXPLAIN PLAN收集到的计划信息。与PLAN\_TABLE视图不同的是PLAN\_TABLE\_DATA表存储了所有session和user执行EXPLAIN PLAN收集的计划信息。 + +**表 1** PLAN\_TABLE\_DATA字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

session_id

+

text

+

表示插入该条数据的会话,由服务线程启动时间戳和服务线程ID组成。受非空约束限制。

+

user_id

+

oid

+

用户ID,用于标识触发插入该条数据的用户。受非空约束限制。

+

statement_id

+

varchar2(30)

+

用户输入的查询标签。

+

plan_id

+

bigint

+

查询标识。

+

id

+

int

+

计划中的节点编号。

+

operation

+

varchar2(30)

+

操作描述。

+

options

+

varchar2(255)

+

操作选项。

+

object_name

+

name

+

操作对应的对象名,来自于用户定义。

+

object_type

+

varchar2(30)

+

对象类型。

+

object_owner

+

name

+

对象所属schema,来自于用户定义。

+

projection

+

varchar2(4000)

+

操作输出的列信息。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- PLAN\_TABLE\_DATA中包含了当前节点所有用户、所有会话的数据,仅管理员有访问权限。普通用户可以通过[PLAN\_TABLE](PLAN_TABLE.md)视图查看属于自己的数据。 +>- PLAN\_TABLE\_DATA中的数据是用户通过执行EXPLAIN PLAN命令后由系统自动插入表中,因此禁止用户手动对数据进行插入或更新,否则会引起表中的数据混乱。需要对表中数据删除时,建议通过[PLAN\_TABLE](PLAN_TABLE.md)视图。 +>- statement\_id、object\_name、object\_owner和projection字段内容遵循用户定义的大小写存储,其它字段内容采用大写存储。 + diff --git a/content/zh/docs/Developerguide/PQcancel.md b/content/zh/docs/Developerguide/PQcancel.md new file mode 100644 index 000000000..494e69b63 --- /dev/null +++ b/content/zh/docs/Developerguide/PQcancel.md @@ -0,0 +1,54 @@ +# PQcancel + +## 功能描述 + +要求服务器放弃处理当前命令。 + +## 原型 + +``` +int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize); +``` + +## 参数 + +**表 1** PQcancel参数 + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

cancel

+

指向包含cancel信息的对象指针。

+

errbuf

+

出错保存错误信息的buffer。

+

errbufsize

+

保存错误信息的buffer大小。

+
+ +## 返回值 + +int:执行结果为1表示成功,0表示失败,失败原因存到errbuf中。 + +## 注意事项 + +- 成功发送并不保证请求将产生任何效果。如果取消有效,当前命令将提前终止并返回错误结果。如果取消失败(例如,因为服务器已经处理完命令),无返回结果。 +- 如果errbuf是信号处理程序中的局部变量,则可以安全地从信号处理程序中调用PQcancel。就PQcancel而言,PGcancel对象是只读的,因此它也可以从一个线程中调用,这个线程与操作PGconn对象线程是分离的。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQclear.md b/content/zh/docs/Developerguide/PQclear.md new file mode 100644 index 000000000..688cbe855 --- /dev/null +++ b/content/zh/docs/Developerguide/PQclear.md @@ -0,0 +1,39 @@ +# PQclear + +## 功能描述 + +释放与PGresult相关联的存储空间,任何不再需要的查询结果都应该用PQclear释放掉。 + +## 原型 + +``` +void PQclear(PGresult *res); +``` + +## 参数 + +**表 1** PQclear参数 + + + + + + + + + + +

关键字

+

参数说明

+

res

+

包含查询结果的对象指针。

+
+ +## 注意事项 + +PGresult不会自动释放,当提交新的查询时它并不消失,甚至断开连接后也不会。要删除它,必须调用PQclear,否则则会有内存泄漏。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQconnectStart.md b/content/zh/docs/Developerguide/PQconnectStart.md new file mode 100644 index 000000000..0987b9de2 --- /dev/null +++ b/content/zh/docs/Developerguide/PQconnectStart.md @@ -0,0 +1,35 @@ +# PQconnectStart + +## 功能描述 + +与数据库服务器建立一次非阻塞的连接。 + +## 原型 + +``` +PGconn* PQconnectStart(const char* conninfo); +``` + +## 参数 + +**表 1** + + + + + + + + + + +

关键字

+

参数说明

+

conninfo

+

连接信息字符串。可以为空,这样将会使用默认参数。也可以包含由空格分隔的一个或多个参数设置,还可以包含一个URI。

+
+ +## 返回值 + +PGconn类型指针。 + diff --git a/content/zh/docs/Developerguide/PQconnectdb.md b/content/zh/docs/Developerguide/PQconnectdb.md new file mode 100644 index 000000000..6879345f6 --- /dev/null +++ b/content/zh/docs/Developerguide/PQconnectdb.md @@ -0,0 +1,44 @@ +# PQconnectdb + +## 功能描述 + +与数据库服务器建立一个新的连接。 + +## 原型 + +``` +PGconn *PQconnectdb(const char *conninfo); +``` + +## 参数 + +**表 1** PQconnectdb参数 + + + + + + + + + + +

关键字

+

参数说明

+

conninfo

+

链接字符串,字符串中的字段见5.6.4.5章节描述章节。

+
+ +## 返回值 + +PGconn \*:指向包含链接的对象指针,内存在函数内部申请。 + +## 注意事项 + +- 这个函数用从一个字符串conninfo来的参数与数据库打开一个新的链接。 +- 传入的参数可以为空,表明使用所有缺省的参数,或者可以包含一个或更多个用空白间隔的参数设置,或者它可以包含一个URL。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQconnectdbParams.md b/content/zh/docs/Developerguide/PQconnectdbParams.md new file mode 100644 index 000000000..6ab4d9645 --- /dev/null +++ b/content/zh/docs/Developerguide/PQconnectdbParams.md @@ -0,0 +1,55 @@ +# PQconnectdbParams + +## 功能描述 + +与数据库服务器建立一个新的连接。 + +## 原型 + +``` +PGconn *PQconnectdbParams(const char * const *keywords, + const char * const *values, + int expand_dbname); +``` + +## 参数 + +**表 1** PQconnectdbParams参数 + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

keywords

+

定义为一个字符串的数组,每个都成为一个关键字。

+

values

+

给每个关键字一个值。

+

expand_dbname

+

当expand_dbname是非零的时,允许将dbname的关键字值看做一个连接字符串。只有第一个出现的dbname是这样展开的,任何随后的dbname值作为纯数据库名处理。

+
+ +## 返回值 + +PGconn \*:指向包含链接的对象指针,内存在函数内部申请。 + +## 注意事项 + +这个函数用从两个NULL结束的数组中来的参数打开一个新的数据库连接。与PQsetdbLogin不同的是,可以不必更换函数签名(名字)就可以扩展参数集,所以建议应用程序中使用这个函数(或者它的类似的非阻塞变种PQconnectStartParams和PQconnectPoll)。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQconninfoParse.md b/content/zh/docs/Developerguide/PQconninfoParse.md new file mode 100644 index 000000000..5938033a1 --- /dev/null +++ b/content/zh/docs/Developerguide/PQconninfoParse.md @@ -0,0 +1,40 @@ +# PQconninfoParse + +## 功能描述 + +根据连接,返回已解析的连接选项。 + +## 原型 + +``` +PQconninfoOption* PQconninfoParse(const char* conninfo, char** errmsg); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + +

关键字

+

参数说明

+

conninfo

+

被传递的字符串。可以为空,这样将会使用默认参数。也可以包含由空格分隔的一个或多个参数设置,还可以包含一个URI。

+

errmsg

+

错误信息。

+
+ +## 返回值 + +PQconninfoOption类型指针。 + diff --git a/content/zh/docs/Developerguide/PQerrorMessage.md b/content/zh/docs/Developerguide/PQerrorMessage.md new file mode 100644 index 000000000..21567be02 --- /dev/null +++ b/content/zh/docs/Developerguide/PQerrorMessage.md @@ -0,0 +1,39 @@ +# PQerrorMessage + +## 功能描述 + +返回连接上的错误信息。 + +## 原型 + +``` +char* PQerrorMessage(const PGconn* conn); +``` + +## 参数 + +**表 1** + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

连接句柄。

+
+ +## 返回值 + +char类型指针。 + +## 示例 + +参见:[示例](示例-10.md) + diff --git a/content/zh/docs/Developerguide/PQexec.md b/content/zh/docs/Developerguide/PQexec.md new file mode 100644 index 000000000..1ca53bee7 --- /dev/null +++ b/content/zh/docs/Developerguide/PQexec.md @@ -0,0 +1,51 @@ +# PQexec + +## 功能描述 + +向服务器提交一条命令并等待结果。 + +## 原型 + +``` +PGresult *PQexec(PGconn *conn, const char *command); +``` + +## 参数 + +**表 1** PQexec参数 + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+

command

+

需要执行的查询字符串。

+
+ +## 返回值 + +PGresult:包含查询结果的对象指针。 + +## 注意事项 + +应该调用PQresultStatus函数来检查任何错误的返回值(包括空指针的值,在这种情况下它将返回PGRES\_FATAL\_ERROR)。使用PQerrorMessage获取有关错误的更多信息。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>命令字符串可以包括多个SQL命令(用分号分隔)。在一个PQexec调用中发送的多个查询是在一个事务里处理的,除非在查询字符串里有明确的BEGIN/COMMIT命令把整个字符串分隔成多个事务。请注意,返回的PGresult结构只描述字符串里执行的最后一条命令的结果,如果有一个命令失败,那么字符串处理的过程就会停止,并且返回的PGresult会描述错误条件。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQexecParams.md b/content/zh/docs/Developerguide/PQexecParams.md new file mode 100644 index 000000000..5127f2869 --- /dev/null +++ b/content/zh/docs/Developerguide/PQexecParams.md @@ -0,0 +1,72 @@ +# PQexecParams + +## 功能描述 + +执行一个绑定参数的命令。 + +## 原型 + +``` +PGresult* PQexecParams(PGconn* conn, + const char* command, + int nParams, + const Oid* paramTypes, + const char* const* paramValues, + const int* paramLengths, + const int* paramFormats, + int resultFormat); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

连接句柄。

+

command

+

SQL文本串。

+

paramTypes

+

绑定参数类型。

+

paramValues

+

绑定参数的值。

+

paramLengths

+

参数长度。

+

paramFormats

+

参数格式(文本或二进制)。

+

resultFormat

+

返回结果格式(文本或二进制)。

+
+ +## 返回值 + +PGresult类型指针。 + diff --git a/content/zh/docs/Developerguide/PQexecParamsBatch.md b/content/zh/docs/Developerguide/PQexecParamsBatch.md new file mode 100644 index 000000000..c17ce11e4 --- /dev/null +++ b/content/zh/docs/Developerguide/PQexecParamsBatch.md @@ -0,0 +1,78 @@ +# PQexecParamsBatch + +## 功能描述 + +执行一个批量绑定参数的命令。 + +## 原型 + +``` +PGresult* PQexecParamsBatch(PGconn* conn, + const char* command, + int nParams, + int nBatch, + const Oid* paramTypes, + const char* const* paramValues, + const int* paramLengths, + const int* paramFormats, + int resultFormat); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

连接句柄。

+

command

+

SQL文本串。

+

nBatch

+

批量操作数。

+

paramTypes

+

绑定参数类型。

+

paramValues

+

绑定参数的值。

+

paramLengths

+

参数长度。

+

paramFormats

+

参数格式(文本或二进制)。

+

resultFormat

+

返回结果格式(文本或二进制)。

+
+ +## 返回值 + +PGresult类型指针。 + diff --git a/content/zh/docs/Developerguide/PQexecPrepared.md b/content/zh/docs/Developerguide/PQexecPrepared.md new file mode 100644 index 000000000..376321e9a --- /dev/null +++ b/content/zh/docs/Developerguide/PQexecPrepared.md @@ -0,0 +1,71 @@ +# PQexecPrepared + +## 功能描述 + +发送一个请求来用给定参数执行一个预备语句,并且等待结果。 + +## 原型 + +``` +PGresult* PQexecPrepared(PGconn* conn, + const char* stmtName, + int nParams, + const char* const* paramValues, + const int* paramLengths, + const int* paramFormats, + int resultFormat); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

连接句柄。

+

stmtName

+

stmt名称,可以用""或者NULL来引用未命名语句,否则它必须是一个现有预备语句的名字。

+

nParams

+

参数个数。

+

paramValues

+

参数的实际值。

+

paramLengths

+

参数的实际数据长度。

+

paramFormats

+

参数的格式(文本或二进制)。

+

resultFormat

+

结果的格式(文本或二进制)。

+
+ +## 返回值 + +PGresult类型指针。 + diff --git a/content/zh/docs/Developerguide/PQexecPreparedBatch.md b/content/zh/docs/Developerguide/PQexecPreparedBatch.md new file mode 100644 index 000000000..a3ac57975 --- /dev/null +++ b/content/zh/docs/Developerguide/PQexecPreparedBatch.md @@ -0,0 +1,77 @@ +# PQexecPreparedBatch + +## 功能描述 + +发送一个请求来用给定的批量参数执行一个预备语句,并且等待结果。 + +## 原型 + +``` +PGresult* PQexecPreparedBatch(PGconn* conn, + const char* stmtName, + int nParams, + int nBatchCount, + const char* const* paramValues, + const int* paramLengths, + const int* paramFormats, + int resultFormat); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

连接句柄。

+

stmtName

+

stmt名称,可以用""或者NULL来引用未命名语句,否则它必须是一个现有预备语句的名字。

+

nParams

+

参数个数。

+

nBatchCount

+

批量数。

+

paramValues

+

参数的实际值。

+

paramLengths

+

参数的实际数据长度。

+

paramFormats

+

参数的格式(文本或二进制)。

+

resultFormat

+

结果的格式(文本或二进制)。

+
+ +## 返回值 + +PGresult类型指针。 + diff --git a/content/zh/docs/Developerguide/PQfinish.md b/content/zh/docs/Developerguide/PQfinish.md new file mode 100644 index 000000000..cf368e948 --- /dev/null +++ b/content/zh/docs/Developerguide/PQfinish.md @@ -0,0 +1,39 @@ +# PQfinish + +## 功能描述 + +关闭与服务器的连接,同时释放被PGconn对象使用的存储器。 + +## 原型 + +``` +void PQfinish(PGconn *conn); +``` + +## 参数 + +**表 1** PQfinish参数 + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+
+ +## 注意事项 + +若PQstatus判断服务器链接尝试失败,应用程序调用PQfinish释放被PGconn对象使用的存储器,PQfinish调用后PGconn指针不可再次使用。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQflush.md b/content/zh/docs/Developerguide/PQflush.md new file mode 100644 index 000000000..09da9f5e1 --- /dev/null +++ b/content/zh/docs/Developerguide/PQflush.md @@ -0,0 +1,43 @@ +# PQflush + +## 功能描述 + +尝试将任何排队的输出数据刷新到服务器。 + +## 原型 + +``` +int PQflush(PGconn *conn); +``` + +## 参数 + +**表 1** PQflush参数 + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接信息的对象指针

+
+ +## 返回值 + +int:如果成功(或者如果发送队列为空),则返回0;如果由于某种原因失败,则返回-1;如果发送队列中的所有数据都发送失败,则返回1。(此情况只有在连接为非阻塞时才能发生),失败原因存到conn-\>error\_message中。 + +## 注意事项 + +在非阻塞连接上发送任何命令或数据之后,调用PQflush。如果返回1,则等待套接字变为读或写就绪。如果为写就绪状态,则再次调用PQflush。如果已经读到,调用PQconsumeInput,然后再次调用PQflush。重复,直到PQflush返回0。\(必须检查读就绪,并用PQconsumeInput排出输入,因为服务器可以阻止试图向我们发送数据,例如。通知信息,直到我们读完它才会读我们的数据。\)一旦PQflush返回0,就等待套接字准备好,然后按照上面描述读取响应。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQfname.md b/content/zh/docs/Developerguide/PQfname.md new file mode 100644 index 000000000..bc9ecee0c --- /dev/null +++ b/content/zh/docs/Developerguide/PQfname.md @@ -0,0 +1,45 @@ +# PQfname + +## 功能描述 + +返回与给定列号相关联的列名。列号从 0 开始。调用者不应该直接释放该结果。它将在相关的PGresult句柄被传递给PQclear之后被释放。 + +## 原型 + +``` +char *PQfname(const PGresult *res, + int column_number); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + +

关键字

+

参数说明

+

res

+

操作结果句柄。

+

column_number

+

列数。

+
+ +## 返回值 + +char类型指针。 + +## 示例 + +参见:[示例](示例-10.md) + diff --git a/content/zh/docs/Developerguide/PQfreeCancel.md b/content/zh/docs/Developerguide/PQfreeCancel.md new file mode 100644 index 000000000..4231ee222 --- /dev/null +++ b/content/zh/docs/Developerguide/PQfreeCancel.md @@ -0,0 +1,39 @@ +# PQfreeCancel + +## 功能描述 + +释放PQgetCancel创建的数据结构。 + +## 原型 + +``` +void PQfreeCancel(PGcancel *cancel); +``` + +## 参数 + +**表 1** PQfreeCancel参数 + + + + + + + + + + +

关键字

+

参数说明

+

cancel

+

指向包含cancel信息的对象指针。

+
+ +## 注意事项 + +PQfreeCancel释放一个由前面的PQgetCancel创建的数据对象。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQgetCancel.md b/content/zh/docs/Developerguide/PQgetCancel.md new file mode 100644 index 000000000..50f8dcc1d --- /dev/null +++ b/content/zh/docs/Developerguide/PQgetCancel.md @@ -0,0 +1,43 @@ +# PQgetCancel + +## 功能描述 + +创建一个数据结构,其中包含取消通过特定数据库连接发出的命令所需的信息。 + +## 原型 + +``` +PGcancel *PQgetCancel(PGconn *conn); +``` + +## 参数 + +**表 1** PQgetCancel参数 + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接信息的对象指针。

+
+ +## 返回值 + +PGcancel:指向包含cancel信息对象的指针。 + +## 注意事项 + +PQgetCancel创建一个给定PGconn连接对象的PGcancel对象。如果给定的conn是NULL或无效连接,它将返回NULL。PGcancel对象是一个不透明的结构,应用程序不能直接访问它;它只能传递给PQcancel或PQfreeCancel。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQgetvalue.md b/content/zh/docs/Developerguide/PQgetvalue.md new file mode 100644 index 000000000..301efb978 --- /dev/null +++ b/content/zh/docs/Developerguide/PQgetvalue.md @@ -0,0 +1,55 @@ +# PQgetvalue + +## 功能描述 + +返回一个PGresult的一行的单一域值。行和列号从 0 开始。调用者不应该直接释放该结果。它将在相关的PGresult句柄被传递给PQclear之后被释放。 + +## 原型 + +``` +char *PQgetvalue(const PGresult *res, + int row_number, + int column_number); +``` + +## 参数 + +**表 1** + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

res

+

操作结果句柄。

+

row_number

+

行数。

+

column_number

+

列数。

+
+ +## 返回值 + +对于文本格式的数据,PQgetvalue返回的值是该域值的一种空值结束的字符串表示。 + +对于二进制格式的数据,该值是由该数据类型的typsend和typreceive函数决定的二进制表示。 + +如果该域值为空,则返回一个空串。 + +## 示例 + +参见:[示例](示例-10.md) + diff --git a/content/zh/docs/Developerguide/PQnfields.md b/content/zh/docs/Developerguide/PQnfields.md new file mode 100644 index 000000000..f088ea31c --- /dev/null +++ b/content/zh/docs/Developerguide/PQnfields.md @@ -0,0 +1,39 @@ +# PQnfields + +## 功能描述 + +返回查询结果中每一行的列(域)数。 + +## 原型 + +``` +int PQnfields(const PGresult *res); +``` + +## 参数 + +**表 1** + + + + + + + + + + +

关键字

+

参数说明

+

res

+

操作结果句柄。

+
+ +## 返回值 + +int类型数字。 + +## 示例 + +参见:[示例](示例-10.md) + diff --git a/content/zh/docs/Developerguide/PQntuples.md b/content/zh/docs/Developerguide/PQntuples.md new file mode 100644 index 000000000..61b41a05b --- /dev/null +++ b/content/zh/docs/Developerguide/PQntuples.md @@ -0,0 +1,39 @@ +# PQntuples + +## 功能描述 + +返回查询结果中的行(元组)数。因为它返回一个整数结果,在 32 位操作系统上大型的结果集可能使返回值溢出。 + +## 原型 + +``` +int PQntuples(const PGresult *res); +``` + +## 参数 + +**表 1** + + + + + + + + + + +

关键字

+

参数说明

+

res

+

操作结果句柄。

+
+ +## 返回值 + +int类型数字 + +## 示例 + +参见:[示例](示例-10.md) + diff --git a/content/zh/docs/Developerguide/PQprepare.md b/content/zh/docs/Developerguide/PQprepare.md new file mode 100644 index 000000000..10a3fde90 --- /dev/null +++ b/content/zh/docs/Developerguide/PQprepare.md @@ -0,0 +1,71 @@ +# PQprepare + +## 功能描述 + +用给定的参数提交请求,创建一个预备语句,然后等待结束。 + +## 原型 + +``` +PGresult *PQprepare(PGconn *conn, + const char *stmtName, + const char *query, + int nParams, + const Oid *paramTypes); +``` + +## 参数 + +**表 1** PQprepare参数 + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+

stmtName

+

需要执行的prepare语句。

+

query

+

需要执行的查询字符串。

+

nParams

+

参数个数。

+

paramTypes

+

声明参数类型的数组。

+
+ +## 返回值 + +PGresult:包含查询结果的对象指针。 + +## 注意事项 + +- PQprepare创建一个为PQexecPrepared执行用的预备语句,本特性支持命令的重复执行,不需要每次都进行解析和规划。PQprepare仅在协议3.0及以后的连接中支持,使用协议2.0时,PQprepare将失败。 +- 该函数从查询字符串创建一个名为stmtName的预备语句,该查询字符串必须包含一个SQL命令。stmtName可以是""来创建一个未命名的语句,在这种情况下,任何预先存在的未命名的语句都将被自动替换;否则,如果在当前会话中已经定义了语句名称,则这是一个错误。如果使用了任何参数,那么在查询中将它们称为$1,$2等。nParams是在paramTypes\[\]数组中预先指定类型的参数的数量。(当nParams为0时,数组指针可以为NULL) paramTypes\[\]通过OID指定要分配给参数符号的数据类型。如果paramTypes为NULL ,或者数组中的任何特定元素为零,服务器将按照对非类型化字面字符串的相同方式为参数符号分配数据类型。另外,查询可以使用数字高于nParams的参数符号;还将推断这些符号的数据类型。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>通过执行SQLPREPARE语句,还可以创建与PQexecPrepared一起使用的预备语句。此外,虽然没有用于删除预备语句的libpq函数,但是SQL DEALLOCATE语句可用于此目的。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQreset.md b/content/zh/docs/Developerguide/PQreset.md new file mode 100644 index 000000000..1ccb98dda --- /dev/null +++ b/content/zh/docs/Developerguide/PQreset.md @@ -0,0 +1,39 @@ +# PQreset + +## 功能描述 + +重置与服务器的通讯端口。 + +## 原型 + +``` +void PQreset(PGconn *conn); +``` + +## 参数 + +**表 1** PQreset参数 + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+
+ +## 注意事项 + +此函数将关闭与服务器的连接并且试图与同一个服务器重建新的连接,并使用所有前面使用过的参数。该函数在链接异常后进行故障恢复时很有用。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQresultStatus.md b/content/zh/docs/Developerguide/PQresultStatus.md new file mode 100644 index 000000000..3e2dcb310 --- /dev/null +++ b/content/zh/docs/Developerguide/PQresultStatus.md @@ -0,0 +1,78 @@ +# PQresultStatus + +## 功能描述 + +返回命令的结果状态。 + +## 原型 + +``` +ExecStatusType PQresultStatus(const PGresult *res); +``` + +## 参数 + +**表 1** PQresultStatus参数 + + + + + + + + + + +

关键字

+

参数说明

+

res

+

包含查询结果的对象指针。

+
+ +## 返回值 + +PQresultStatus:命令执行结果的枚举,包括: + +``` +PQresultStatus可以返回下面数值之一: +PGRES_EMPTY_QUERY +发送给服务器的字串是空的。 + +PGRES_COMMAND_OK +成功完成一个不返回数据的命令。 + +PGRES_TUPLES_OK +成功执行一个返回数据的查询(比如SELECT或者SHOW)。 + +PGRES_COPY_OUT +(从服务器)Copy Out (拷贝出)数据传输开始。 + +PGRES_COPY_IN +Copy In(拷贝入)(到服务器)数据传输开始。 + +PGRES_BAD_RESPONSE +服务器的响应无法理解。 + +PGRES_NONFATAL_ERROR +发生了一个非致命错误(通知或者警告)。 + +PGRES_FATAL_ERROR +发生了一个致命错误。 + +PGRES_COPY_BOTH +拷贝入/出(到和从服务器)数据传输开始。这个特性当前只用于流复制, 所以这个状态不会在普通应用中发生。 + +PGRES_SINGLE_TUPLE +PGresult包含一个来自当前命令的结果元组。 这个状态只在查询选择了单行模式时发生 +``` + +## 注意事项 + +- 如果结果状态为PGRES\_TUPLES\_OK或PGRES\_SINGLE\_TUPLE,则可以使用下面描述的函数来检索查询返回的行。请注意,恰好检索到零行的SELECT命令仍然显示PGRES\_TUPLES\_OK。PGRES\_COMMAND\_OK用于永远不能返回行的命令(插入或更新,不带返回子句等)。PGRES\_EMPTY\_QUERY响应可能表明客户端软件存在bug。 + +- 状态为PGRES\_NONFATAL\_ERROR的结果永远不会由PQexec或其他查询执行函数直接返回,此类结果将传递给通知处理程序。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQsendPrepare.md b/content/zh/docs/Developerguide/PQsendPrepare.md new file mode 100644 index 000000000..67edd4572 --- /dev/null +++ b/content/zh/docs/Developerguide/PQsendPrepare.md @@ -0,0 +1,67 @@ +# PQsendPrepare + +## 功能描述 + +发送一个请求,创建一个给定参数的预备语句,而不等待结束。 + +## 原型 + +``` +int PQsendPrepare(PGconn *conn, + const char *stmtName, + const char *query, + int nParams, + const Oid *paramTypes); +``` + +## 参数 + +**表 1** PQsendPrepare参数 + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+

stmtName

+

需要执行的prepare语句。

+

query

+

需要执行的查询字符串。

+

nParams

+

参数个数。

+

paramTypes

+

声明参数类型的数组。

+
+ +## 返回值 + +int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>errorMessage中。 + +## 注意事项 + +该函数为PQprepare的异步版本:如果能够分派请求,则返回1,否则返回0。调用成功后,调用PQgetResult判断服务端是否成功创建了preparedStatement。函数的参数与PQprepare一样处理。与PQprepare一样,它也不能在2.0协议的连接上工作。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQsendQuery.md b/content/zh/docs/Developerguide/PQsendQuery.md new file mode 100644 index 000000000..215695f0f --- /dev/null +++ b/content/zh/docs/Developerguide/PQsendQuery.md @@ -0,0 +1,48 @@ +# PQsendQuery + +## 功能描述 + +向服务器提交一个命令而不等待结果。如果查询成功发送则返回1,否则返回0。 + +## 原型 + +``` +int PQsendQuery(PGconn *conn, const char *command); +``` + +## 参数 + +**表 1** PQsendQuery参数 + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+

command

+

需要执行的查询字符串.

+
+ +## 返回值 + +int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>errorMessage中。 + +## 注意事项 + +在成功调用PQsendQuery后,调用PQgetResult一次或者多次获取结果。PQgetResult返回空指针表示命令已执行完成,否则不能再次调用PQsendQuery(在同一连接上)。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQsendQueryParams.md b/content/zh/docs/Developerguide/PQsendQueryParams.md new file mode 100644 index 000000000..871ad31c8 --- /dev/null +++ b/content/zh/docs/Developerguide/PQsendQueryParams.md @@ -0,0 +1,85 @@ +# PQsendQueryParams + +## 功能描述 + +给服务器提交一个命令和分隔的参数,而不等待结果。 + +## 原型 + +``` +int PQsendQueryParams(PGconn *conn, + const char *command, + int nParams, + const Oid *paramTypes, + const char * const *paramValues, + const int *paramLengths, + const int *paramFormats, + int resultFormat); +``` + +## 参数 + +**表 1** PQsendQueryParams参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+

command

+

需要执行的查询字符串。

+

nParams

+

参数个数。

+

paramTypes

+

参数类型。

+

paramValues

+

参数值。

+

paramLengths

+

参数长度。

+

paramFormats

+

参数格式。

+

resultFormat

+

结果的格式。

+
+ +## 返回值 + +int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>errorMessage中。 + +## 注意事项 + +该函数等效于PQsendQuery,只是查询参数可以和查询字串分开声明。函数的参数处理和PQexecParams一样,和PQexecParams类似,它不能在2.0版本的协议连接上工作,并且它只允许在查询字串里出现一条命令。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQsendQueryPrepared.md b/content/zh/docs/Developerguide/PQsendQueryPrepared.md new file mode 100644 index 000000000..81e54c5ba --- /dev/null +++ b/content/zh/docs/Developerguide/PQsendQueryPrepared.md @@ -0,0 +1,79 @@ +# PQsendQueryPrepared + +## 功能描述 + +发送一个请求执行带有给出参数的预备语句,不等待结果。 + +## 原型 + +``` +int PQsendQueryPrepared(PGconn *conn, + const char *stmtName, + int nParams, + const char * const *paramValues, + const int *paramLengths, + const int *paramFormats, + int resultFormat); +``` + +## 参数 + +**表 1** PQsendQueryPrepared参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接信息的对象指针。

+

stmtName

+

需要执行的prepare语句。

+

nParams

+

参数类型。

+

paramValues

+

参数值。

+

paramLengths

+

参数长度。

+

paramFormats

+

参数格式。

+

resultFormat

+

结果的格式。

+
+ +## 返回值 + +int:执行结果为1表示成功,0表示失败,失败原因存到conn-\>error\_message中。 + +## 注意事项 + +该函数类似于PQsendQueryParams,但是要执行的命令是通过命名一个预先准备的语句来指定的,而不是提供一个查询字符串。该函数的参数与PQexecPrepared一样处理。和PQexecPrepared一样,它也不能在2.0协议的连接上工作。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQsetdbLogin.md b/content/zh/docs/Developerguide/PQsetdbLogin.md new file mode 100644 index 000000000..c801b7a56 --- /dev/null +++ b/content/zh/docs/Developerguide/PQsetdbLogin.md @@ -0,0 +1,80 @@ +# PQsetdbLogin + +## 功能描述 + +与数据库服务器建立一个新的链接。 + +## 原型 + +``` +PGconn *PQsetdbLogin(const char *pghost, + const char *pgport, + const char *pgoptions, + const char *pgtty, + const char *dbName, + const char *login, + const char *pwd); +``` + +## 参数 + +**表 1** PQsetdbLogin参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

pghost

+

要链接的主机名,详见链接字符章节描述的host字段。

+

pgport

+

主机服务器的端口号,详见链接字符描述的port字段。

+

pgoptions

+

添加命令行选项以在运行时发送到服务器,详见链接字符描述的option字段。

+

pgtty

+

忽略(以前,这个选项声明服务器日志的输出方向)

+

dbName

+

要链接的数据库名,详见链接字符描述的dbname字段。

+

login

+

要链接的用户名,详见链接字符章节描述的user字段。

+

pwd

+

如果服务器要求口令认证,所用的口令,详见链接字符描述的password字段。

+
+ +## 返回值 + +PGconn \*:指向包含链接的对象指针,内存在函数内部申请。 + +## 注意事项 + +- 该函数为PQconnectdb前身,参数个数固定,未定义参数被调用时使用缺省值,若需要给固定参数设置缺省值,则可赋值NULL或者空字符串。 +- 若dbName中包含“=”或链接URL的有效前缀,则该dbName被看做一个conninfo字符串并传递至PQconnectdb中,其余参数与PQconnectdbParams保持一致。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PQstatus.md b/content/zh/docs/Developerguide/PQstatus.md new file mode 100644 index 000000000..754b925f8 --- /dev/null +++ b/content/zh/docs/Developerguide/PQstatus.md @@ -0,0 +1,69 @@ +# PQstatus + +## 功能描述 + +返回链接的状态。 + +## 原型 + +``` +ConnStatusType PQstatus(const PGconn *conn); +``` + +## 参数 + +**表 1** PQstatus参数 + + + + + + + + + + +

关键字

+

参数说明

+

conn

+

指向包含链接的对象指针。

+
+ +## 返回值 + +ConnStatusType:链接状态的枚举,包括: + +``` +CONNECTION_STARTED +等待进行连接。 + +CONNECTION_MADE +连接成功;等待发送。 + +CONNECTION_AWAITING_RESPONSE +等待来自服务器的响应。 + +CONNECTION_AUTH_OK +已收到认证;等待后端启动结束。 + +CONNECTION_SSL_STARTUP +协商SSL加密。 + +CONNECTION_SETENV +协商环境驱动的参数设置。 + +CONNECTION_OK +链接正常。 + +CONNECTION_BAD +链接故障。 +``` + +## 注意事项 + +状态可以是多个值之一。但是,在异步连接过程之外只能看到其中两个:CONNECTION\_OK和CONNECTION\_BAD。与数据库的良好连接状态为CONNECTION\_OK。状态表示连接尝试失败CONNECTION\_BAD。通常,“正常”状态将一直保持到PQfinish,但通信失败可能会导致状态CONNECTION\_BAD过早变为。在这种情况下,应用程序可以尝试通过调用进行恢复PQreset。 + +## 示例 + +请参见[示例](示例-10.md)章节。 + diff --git a/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md b/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md new file mode 100644 index 000000000..4e3d538bd --- /dev/null +++ b/content/zh/docs/Developerguide/PREPARE-TRANSACTION.md @@ -0,0 +1,37 @@ +# PREPARE TRANSACTION + +## 功能描述 + +为当前事务做两阶段提交的准备。 + +在命令之后,事务就不再和当前会话关联了;它的状态完全保存在磁盘上,它被提交成功的可能性非常高,即使是在请求提交之前数据库发生了崩溃也如此。 + +一旦准备好了,一个事务就可以在稍后用[COMMIT PREPARED](COMMIT-PREPARED.md#ZH-CN_TOPIC_0242370559)或 [ROLLBACK PREPARED](ROLLBACK-PREPARED.md#ZH-CN_TOPIC_0242370645)命令分别进行提交或者回滚。这些命令可以从任何会话中发出,而不光是最初执行事务的那个会话。 + +从发出命令的会话的角度来看,PREPARE TRANSACTION不同于ROLLBACK:在执行它之后,就不再有活跃的当前事务了,并且预备事务的效果无法见到 \(在事务提交的时候其效果会再次可见\)。 + +如果PREPARE TRANSACTION因为某些原因失败,那么它就会变成一个ROLLBACK,当前事务被取消。 + +## 注意事项 + +- 事务功能由数据库自动维护,不应显式使用事务功能。 +- 在运行PREPARE TRANSACTION命令时,必须在postgresql.conf配置文件中增大max\_prepared\_transactions的数值。建议至少将其设置为等于max\_connections,这样每个会话都可以有一个等待中的预备事务。 + +## 语法格式 + +``` +PREPARE TRANSACTION transaction_id; +``` + +## 参数说明 + +**transaction\_id** + +待提交事务的标识符,用于后面在COMMIT PREPARED或ROLLBACK PREPARED的时候标识这个事务。它不能和任何当前预备事务已经使用了的标识符同名。 + +取值范围:标识符必须以字符串文本的方式书写,并且必须小于200字节长。 + +## 相关链接 + +[COMMIT PREPARED](COMMIT-PREPARED.md#ZH-CN_TOPIC_0242370559),[ROLLBACK PREPARED](ROLLBACK-PREPARED.md#ZH-CN_TOPIC_0242370645) + diff --git a/content/zh/docs/Developerguide/PREPARE.md b/content/zh/docs/Developerguide/PREPARE.md new file mode 100644 index 000000000..ddb5f1821 --- /dev/null +++ b/content/zh/docs/Developerguide/PREPARE.md @@ -0,0 +1,41 @@ +# PREPARE + +## 功能描述 + +创建一个预备语句。 + +预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用[DEALLOCATE](DEALLOCATE.md#ZH-CN_TOPIC_0242370593)进行删除,会话结束时,PREPARE也会自动删除。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +PREPARE name [ ( data_type [, ...] ) ] AS statement; +``` + +## 参数说明 + +- **name** + + 指定预备语句的名称。它必须在该会话中是唯一的。 + +- **data\_type** + + 参数的数据类型。 + +- **statement** + + 是SELECT INSERT、UPDATE、DELETE、MERGE INTO或VALUES语句之一。 + + +## 示例 + +请参见EXECUTE的[示例](EXECUTE.md#zh-cn_topic_0237122161_zh-cn_topic_0059777447_s8a46083a59d940c3aaa2535b2f783645)。 + +## 相关链接 + +[DEALLOCATE](DEALLOCATE.md#ZH-CN_TOPIC_0242370593) + diff --git a/content/zh/docs/Developerguide/Query.md b/content/zh/docs/Developerguide/Query.md new file mode 100644 index 000000000..7c87ec35d --- /dev/null +++ b/content/zh/docs/Developerguide/Query.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/REASSIGN-OWNED.md b/content/zh/docs/Developerguide/REASSIGN-OWNED.md new file mode 100644 index 000000000..65638f2e1 --- /dev/null +++ b/content/zh/docs/Developerguide/REASSIGN-OWNED.md @@ -0,0 +1,34 @@ +# REASSIGN OWNED + +## 功能描述 + +修改数据库对象的属主。 + +REASSIGN OWNED要求系统将所有old\_roles拥有的数据库对象的属主更改为new\_role。 + +## 注意事项 + +- REASSIGN OWNED常用于在删除角色之前的准备工作。 +- 执行REASSIGN OWNED需要有原角色和目标角色上的权限。 + +## 语法格式 + +``` +REASSIGN OWNED BY old_role [, ...] TO new_role; +``` + +## 参数说明 + +- **old\_role** + + 旧属主的角色名。 + +- **new\_role** + + 将要成为这些对象属主的新角色的名称。 + + +## 示例 + +无。 + diff --git a/content/zh/docs/Developerguide/REINDEX.md b/content/zh/docs/Developerguide/REINDEX.md new file mode 100644 index 000000000..efc1d9329 --- /dev/null +++ b/content/zh/docs/Developerguide/REINDEX.md @@ -0,0 +1,139 @@ +# REINDEX + +## 功能描述 + +为表中的数据重建索引。 + +在以下几种情况下需要使用REINDEX重建索引: + +- 索引崩溃,并且不再包含有效的数据。 +- 索引变得“臃肿”,包含大量的空页或接近空页。 +- 为索引更改了存储参数(例如填充因子),并且希望这个更改完全生效。 + + 使用CONCURRENTLY选项创建索引失败,留下了一个“非法”索引。 + + +## 注意事项 + +REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。 + +## 语法格式 + +- 重建普通索引。 + + ``` + REINDEX { INDEX | [INTERNAL] TABLE | DATABASE | SYSTEM } name [ FORCE ]; + ``` + + +- 重建索引分区。 + + ``` + REINDEX { INDEX| [INTERNAL] TABLE} name + PARTITION partition_name [ FORCE ]; + ``` + + +## 参数说明 + +- **INDEX** + + 重新建立指定的索引。 + +- **INTERNAL TABLE** + + 重建列存表或Hadoop内表的Desc表的索引,如果表有从属的"TOAST"表,则这个表也会重建索引。 + +- **TABLE** + + 重新建立指定表的所有索引,如果表有从属的"TOAST"表,则这个表也会重建索引。 + +- **DATABASE** + + 重建当前数据库里的所有索引。 + +- **SYSTEM** + + 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 + +- **name** + + 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 + +- **FORCE** + + 无效选项,会被忽略。 + +- **partition\_name** + + 需要重建索引的分区的名称或者索引分区的名称。 + + 取值范围: + + - 如果前面是REINDEX INDEX,则这里应该指定索引分区的名称; + - 如果前面是REINDEX TABLE,则这里应该指定分区的名称; + - 如果前面是REINDEX INTERNAL TABLE,则这里应该指定列存分区表的分区的名称。 + + +>![](public_sys-resources/icon-notice.gif) **须知:** +>REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。 + +## 示例 + +``` +--创建一个行存表tpcds.customer_t1,并在tpcds.customer_t1表上的c_customer_sk字段创建索引。 +postgres=# CREATE TABLE tpcds.customer_t1 +( + 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) +) +WITH (orientation = row) + +postgres=# CREATE INDEX tpcds_customer_index1 ON tpcds.customer_t1 (c_customer_sk); + +postgres=# INSERT INTO tpcds.customer_t1 SELECT * FROM tpcds.customer WHERE c_customer_sk < 10; + +--重建一个单独索引。 +postgres=# REINDEX INDEX tpcds.tpcds_customer_index1; + +--重建表tpcds.customer_t1上的所有索引。 +postgres=# REINDEX TABLE tpcds.customer_t1; + +--删除tpcds.customer_t1表。 +postgres=# DROP TABLE tpcds.customer_t1; +``` + +## 优化建议 + +- INTERNAL TABLE + + 此种情况大多用于故障恢复,不建议进行并发操作。 + +- DATABASE + + 不建议在事务中reindex database。 + +- SYSTEM + + 不建议在事务中reindex系统表。 + + diff --git a/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md b/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md new file mode 100644 index 000000000..55f60f3a2 --- /dev/null +++ b/content/zh/docs/Developerguide/RELEASE-SAVEPOINT.md @@ -0,0 +1,63 @@ +# RELEASE SAVEPOINT + +## 功能描述 + +RELEASE SAVEPOINT删除一个当前事务先前定义的保存点。 + +把一个保存点删除就令其无法作为回滚点使用,除此之外它没有其它用户可见的行为。它并不能撤销在保存点建立起来之后执行的命令的影响。要撤销那些命令可以使用ROLLBACK TO SAVEPOINT 。在不再需要的时候删除一个保存点可以令系统在事务结束之前提前回收一些资源。 + +RELEASE SAVEPOINT也删除所有在指定的保存点建立之后的所有保存点。 + +## 注意事项 + +- 不能RELEASE一个没有定义的保存点,语法上会报错。 +- 如果事务在回滚状态,则不能释放保存点。 +- 如果多个保存点拥有同样的名称,只有最近定义的那个才被释放。 + +## 语法格式 + +``` +RELEASE [ SAVEPOINT ] savepoint_name; +``` + +## 参数说明 + +**savepoint\_name** + +要删除的保存点的名称 + +## 示例 + +``` +--创建一个新表。 +postgres=# CREATE TABLE tpcds.table1(a int); + +--开启事务。 +postgres=# START TRANSACTION; + +--插入数据。 +postgres=# INSERT INTO tpcds.table1 VALUES (3); + +--建立保存点。 +postgres=# SAVEPOINT my_savepoint; + +--插入数据。 +postgres=# INSERT INTO tpcds.table1 VALUES (4); + +--删除保存点。 +postgres=# RELEASE SAVEPOINT my_savepoint; + +--提交事务。 +postgres=# COMMIT; + +--查询表的内容,会同时看到3和4。 +postgres=# SELECT * FROM tpcds.table1; + +--删除表。 +postgres=# DROP TABLE tpcds.table1; +``` + +## 相关链接 + +[SAVEPOINT](SAVEPOINT.md#ZH-CN_TOPIC_0242370647),[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md#ZH-CN_TOPIC_0242370646) + diff --git a/content/zh/docs/Developerguide/RESET.md b/content/zh/docs/Developerguide/RESET.md new file mode 100644 index 000000000..b780a44c0 --- /dev/null +++ b/content/zh/docs/Developerguide/RESET.md @@ -0,0 +1,63 @@ +# RESET + +## 功能描述 + +RESET将指定的运行时参数恢复为缺省值。这些参数的缺省值是指postgresql.conf配置文件中所描述的参数缺省值。 + +RESET命令与如下命令的作用相同: + +SET configuration\_parameter TO DEFAULT + +## 注意事项 + +RESET的事务性行为和SET相同:它的影响将会被事务回滚撤销。 + +## 语法格式 + +``` +RESET {configuration_parameter | CURRENT_SCHEMA | TIME ZONE | TRANSACTION ISOLATION LEVEL | SESSION AUTHORIZATION | ALL }; +``` + +## 参数说明 + +- **configuration\_parameter** + + 运行时参数的名称。 + + 取值范围:可以使用SHOW ALL命令查看运行时参数。 + +- **CURRENT\_SCHEMA** + + 当前模式 + +- **TIME ZONE** + + 时区。 + +- **TRANSACTION ISOLATION LEVEL** + + 事务的隔离级别。 + +- **SESSION AUTHORIZATION** + + 当前会话的用户标识符。 + +- **ALL** + + 所有运行时参数。 + + +## 示例 + +``` +--把timezone设为缺省值。 +postgres=# RESET timezone; + +--把所有参数设置为缺省值。 +postgres=# RESET ALL; +``` + +## 相关链接 + +[SET](SET.md),[SHOW](SHOW.md) + diff --git a/content/zh/docs/Developerguide/REVOKE.md b/content/zh/docs/Developerguide/REVOKE.md new file mode 100644 index 000000000..fc7f96698 --- /dev/null +++ b/content/zh/docs/Developerguide/REVOKE.md @@ -0,0 +1,149 @@ +# REVOKE + +## 功能描述 + +REVOKE用于撤销一个或多个角色的权限。 + +## 注意事项 + +非对象所有者试图在对象上REVOKE权限,命令按照以下规则执行: + +- 如果授权用户没有该对象上的权限,则命令立即失败。 +- 如果授权用户有部分权限,则只撤销那些有授权选项的权限。 +- 如果授权用户没有授权选项,REVOKE ALL PRIVILEGES形式将发出一个错误信息,而对于其他形式的命令而言,如果是命令中指定名称的权限没有相应的授权选项,该命令将发出一个警告。 +- 不允许对表分区进行REVOKE操作,对分区表进行REVOKE操作会引起告警。 + +## 语法格式 + +- 回收指定表和视图上权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES }[, ...] + | ALL [ PRIVILEGES ] } + ON { [ TABLE ] table_name [, ...] + | ALL TABLES IN SCHEMA schema_name [, ...] } + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收表上指定字段权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )}[, ...] + | ALL [ PRIVILEGES ] ( column_name [, ...] ) } + ON [ TABLE ] table_name [, ...] + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收指定数据库上权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] + | ALL [ PRIVILEGES ] } + ON DATABASE database_name [, ...] + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收指定函数上权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { EXECUTE | ALL [ PRIVILEGES ] } + ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] + | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收指定大对象上权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } + ON LARGE OBJECT loid [, ...] + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收指定模式上权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } + ON SCHEMA schema_name [, ...] + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收指定表空间上权限。 + + ``` + REVOKE [ GRANT OPTION FOR ] + { CREATE | ALL [ PRIVILEGES ] } + ON TABLESPACE tablespace_name [, ...] + FROM { [ GROUP ] role_name | PUBLIC } [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 按角色回收角色上的权限。 + + ``` + REVOKE [ ADMIN OPTION FOR ] + role_name [, ...] FROM role_name [, ...] + [ CASCADE | RESTRICT ]; + ``` + +- 回收角色上的sysadmin权限。 + + ``` + REVOKE ALL { PRIVILEGES | PRIVILEGE } FROM role_name; + ``` + + +- 回收Data Source对象上的权限。 + + ``` + REVOKE {USAGE | ALL [PRIVILEGES]} + ON DATA SOURCE src_name [, ...] + FROM {[GROUP] role_name | PUBLIC} [, ...]; + ``` + + +- 回收directory对象的权限。 + + ``` + REVOKE {READ|WRITE| ALL [PRIVILEGES]} + ON DIRECTORY src_name [, ...] + FROM {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION]; + ``` + + +## 参数说明 + +关键字PUBLIC表示一个隐式定义的拥有所有角色的组。 + +权限类别和参数说明,请参见GRANT的[参数说明](GRANT.md#zh-cn_topic_0237122166_zh-cn_topic_0059778755_s3557d45c54124d86bc3f619358d806f8)。 + +任何特定角色拥有的特权包括直接授予该角色的特权、从该角色作为其成员的角色中得到的权限以及授予给PUBLIC的权限。因此,从PUBLIC收回SELECT特权并不一定会意味着所有角色都会失去在该对象上的SELECT特权,那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户收回SELECT后,如果PUBLIC仍有SELECT权限,该用户还是可以使用SELECT。 + +指定GRANT OPTION FOR时,只撤销对该权限授权的权力,而不撤销该权限本身。 + +如用户A拥有某个表的UPDATE权限,及WITH GRANT OPTION选项,同时A把这个权限赋予了用户B,则用户B持有的权限称为依赖性权限。当用户A持有的权限或者授权选项被撤销时,依赖性权限仍然存在,但如果声明了CASCADE,则所有依赖性权限都被撤销。 + +一个用户只能撤销由它自己直接赋予的权限。例如,如果用户A被指定授权(WITH ADMIN OPTION)选项,且把一个权限赋予了用户B,然后用户B又赋予了用户C,则用户A不能直接将C的权限撤销。但是,用户A可以撤销用户B的授权选项,并且使用CASCADE。这样,用户C的权限就会自动被撤销。另外一个例子:如果A和B都赋予了C同样的权限,则A可以撤销他自己的授权选项,但是不能撤销B的,因此C仍然拥有该权限。 + +如果执行REVOKE的角色持有的权限是通过多层成员关系获得的,则具体是哪个包含的角色执行的该命令是不确定的。在这种场合下,最好的方法是使用SET ROLE成为特定角色,然后执行REVOKE,否则可能导致删除了不想删除的权限,或者是任何权限都没有删除。 + +## 示例 + +请参考GRANT的[示例](GRANT.md#zh-cn_topic_0237122166_zh-cn_topic_0059778755_s724dfb1c8978412b95cb308b64dfa447)。 + +## 相关链接 + +[GRANT](GRANT.md) + diff --git a/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md b/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md new file mode 100644 index 000000000..afaceb70e --- /dev/null +++ b/content/zh/docs/Developerguide/ROLLBACK-PREPARED.md @@ -0,0 +1,28 @@ +# ROLLBACK PREPARED + +## 功能描述 + +取消一个先前为两阶段提交准备好的事务。 + +## 注意事项 + +- 该功能仅在维护模式\(GUC参数xc\_maintenance\_mode为on时\)下可用。该模式谨慎打开,一般供维护人员排查问题使用,一般用户不应使用该模式。 +- 要想回滚一个预备事务,必须是最初发起事务的用户,或者是系统管理员。 +- 事务功能由数据库自动维护,不应显式使用事务功能。 + +## 语法格式 + +``` +ROLLBACK PREPARED transaction_id ; +``` + +## 参数说明 + +**transaction\_id** + +待提交事务的标识符。它不能和任何当前预备事务已经使用了的标识符同名。 + +## 相关链接 + +[COMMIT PREPARED](COMMIT-PREPARED.md#ZH-CN_TOPIC_0242370559),[PREPARE TRANSACTION](PREPARE-TRANSACTION.md#ZH-CN_TOPIC_0242370636)。 + diff --git a/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md b/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md new file mode 100644 index 000000000..bef789e31 --- /dev/null +++ b/content/zh/docs/Developerguide/ROLLBACK-TO-SAVEPOINT.md @@ -0,0 +1,53 @@ +# ROLLBACK TO SAVEPOINT + +## 功能描述 + +ROLLBACK TO SAVEPOINT用于回滚到一个保存点,隐含地删除所有在该保存点之后建立的保存点。 + +回滚所有指定保存点建立之后执行的命令。保存点仍然有效,并且需要时可以再次回滚到该点。 + +## 注意事项 + +- 不能回滚到一个未定义的保存点,语法上会报错。 +- 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置\(也就是FETCH不会被回滚\)。关闭一个游标的行为也不会被回滚给撤消掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。 +- 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。 + +## 语法格式 + +``` +ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name; +``` + +## 参数说明 + +savepoint\_name + +回滚截至的保存点 + +## 示例 + +``` +--撤销 my_savepoint 建立之后执行的命令的影响。 +postgres=# START TRANSACTION; +postgres=# SAVEPOINT my_savepoint; +postgres=# ROLLBACK TO SAVEPOINT my_savepoint; +--游标位置不受保存点回滚的影响。 +postgres=# DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; +postgres=# SAVEPOINT foo; +postgres=# FETCH 1 FROM foo; + ?column? +---------- + 1 +postgres=# ROLLBACK TO SAVEPOINT foo; +postgres=# FETCH 1 FROM foo; + ?column? +---------- + 2 +postgres=# RELEASE SAVEPOINT my_savepoint; +postgres=# COMMIT; +``` + +## 相关链接 + +[SAVEPOINT](SAVEPOINT.md#ZH-CN_TOPIC_0242370647),[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md#ZH-CN_TOPIC_0242370641) + diff --git a/content/zh/docs/Developerguide/ROLLBACK.md b/content/zh/docs/Developerguide/ROLLBACK.md new file mode 100644 index 000000000..c6fc014ab --- /dev/null +++ b/content/zh/docs/Developerguide/ROLLBACK.md @@ -0,0 +1,38 @@ +# ROLLBACK + +## 功能描述 + +回滚当前事务并取消当前事务中的所有更新。 + +在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,数据库状态回到事务开始时。 + +## 注意事项 + +如果不在一个事务内部发出ROLLBACK不会有问题,但是将抛出一个警告信息。 + +## 语法格式 + +``` +ROLLBACK [ WORK | TRANSACTION ]; +``` + +## 参数说明 + +**WORK | TRANSACTION** + +可选关键字。除了增加可读性,没有任何其他作用。 + +## 示例 + +``` +--开启一个事务 +postgres=# START TRANSACTION; + +--取消所有更改 +postgres=# ROLLBACK; +``` + +## 相关链接 + +[COMMIT | END](COMMIT-END.md) + diff --git a/content/zh/docs/Developerguide/SAVEPOINT.md b/content/zh/docs/Developerguide/SAVEPOINT.md new file mode 100644 index 000000000..e7c7fb0c6 --- /dev/null +++ b/content/zh/docs/Developerguide/SAVEPOINT.md @@ -0,0 +1,93 @@ +# SAVEPOINT + +## 功能描述 + +SAVEPOINT用于在当前事务里建立一个新的保存点。 + +保存点是事务中的一个特殊记号,它允许将那些在它建立后执行的命令全部回滚,把事务的状态恢复到保存点所在的时刻。 + +## 注意事项 + +- 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。 +- 保存点只能在一个事务块里面建立。在一个事务里面可以定义多个保存点。 +- 函数、匿名块和存储过程中不支持使用SAVEPOINT语法。 +- 由于节点故障或者通信故障引起的分布式节点线程或进程退出导致的报错,以及由于COPY FROM操作中源数据与目标表的表结构不一致导致的报错,均不能正常回滚到保存点之前,而是整个事务回滚。 +- SQL标准要求,使用savepoint建立一个同名保存点时,需要自动删除前面那个同名保存点。在openGauss数据库里,我们将保留旧的保存点,但是在回滚或者释放的时候,只使用最近的那个。释放了新的保存点将导致旧的再次成为ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT可以访问的保存点。除此之外,SAVEPOINT是完全符合SQL标准的。 + +## 语法格式 + +``` +SAVEPOINT savepoint_name; +``` + +## 参数说明 + +savepoint\_name + +新建保存点的名称。 + +## 示例 + +``` +--创建一个新表。 +postgres=# CREATE TABLE table1(a int); + +--开启事务。 +postgres=# START TRANSACTION; + +--插入数据。 +postgres=# INSERT INTO table1 VALUES (1); + +--建立保存点。 +postgres=# SAVEPOINT my_savepoint; + +--插入数据。 +postgres=# INSERT INTO table1 VALUES (2); + +--回滚保存点。 +postgres=# ROLLBACK TO SAVEPOINT my_savepoint; + +--插入数据。 +postgres=# INSERT INTO table1 VALUES (3); + +--提交事务。 +postgres=# COMMIT; + +--查询表的内容,会同时看到1和3,不能看到2,因为2被回滚。 +postgres=# SELECT * FROM table1; + +--删除表。 +postgres=# DROP TABLE table1; + +--创建一个新表。 +postgres=# CREATE TABLE table2(a int); + +--开启事务。 +postgres=# START TRANSACTION; + +--插入数据。 +postgres=# INSERT INTO table2 VALUES (3); + +--建立保存点。 +postgres=# SAVEPOINT my_savepoint; + +--插入数据。 +postgres=# INSERT INTO table2 VALUES (4); + +--回滚保存点。 +postgres=# RELEASE SAVEPOINT my_savepoint; + +--提交事务。 +postgres=# COMMIT; + +--查询表的内容,会同时看到3和4。 +postgres=# SELECT * FROM table2; + +--删除表。 +postgres=# DROP TABLE table2; +``` + +## 相关链接 + +[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md#ZH-CN_TOPIC_0242370641),[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md#ZH-CN_TOPIC_0242370646) + diff --git a/content/zh/docs/Developerguide/SELECT-INTO.md b/content/zh/docs/Developerguide/SELECT-INTO.md new file mode 100644 index 000000000..5aa73250e --- /dev/null +++ b/content/zh/docs/Developerguide/SELECT-INTO.md @@ -0,0 +1,69 @@ +# SELECT INTO + +## 功能描述 + +SELECT INTO用于根据查询结果创建一个新表,并且将查询到的数据插入到新表中。 + +数据并不返回给客户端,这一点和普通的SELECT不同。新表的字段具有和SELECT的输出字段相同的名称和数据类型。 + +## 注意事项 + +CREATE TABLE AS的作用和SELECT INTO类似,且提供了SELECT INTO所提供功能的超集。建议使用CREATE TABLE AS语法替代SELECT INTO,因为SELECT INTO不能在存储过程中使用。 + +## 语法格式 + +``` +[ WITH [ RECURSIVE ] with_query [, ...] ] +SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] + { * | {expression [ [ AS ] output_name ]} [, ...] } + INTO [ UNLOGGED ] [ TABLE ] new_table + [ FROM from_item [, ...] ] + [ WHERE condition ] + [ GROUP BY expression [, ...] ] + [ HAVING condition [, ...] ] + [ WINDOW {window_name AS ( window_definition )} [, ...] ] + [ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ] + [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] + [ LIMIT { count | ALL } ] + [ OFFSET start [ ROW | ROWS ] ] + [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] + [ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ]} [...] ]; +``` + +## 参数说明 + +**INTO \[ UNLOGGED \] \[ TABLE \] new\_table** + +UNLOGGED指定表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是,它也是不安全的,非日志表在冲突或异常关机后会被自动删截。非日志表中的内容也不会被复制到备用服务器中。在该类表中创建的索引也不会被自动记录。 + +new\_table指定新建表的名称。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>SELECT INTO的其它参数可参考SELECT的[参数说明](SELECT.md#zh-cn_topic_0237122184_zh-cn_topic_0059777449_sa812f65b8e8c4c638ec7840697222ddc)。 + +## 示例 + +``` +--将tpcds.reason表中r_reason_sk小于5的值加入到新建表中。 +postgres=# SELECT * INTO tpcds.reason_t1 FROM tpcds.reason WHERE r_reason_sk < 5; +INSERT 0 6 + +--删除tpcds.reason_t1表。 +postgres=# DROP TABLE tpcds.reason_t1; +``` + +## 相关链接 + +[SELECT](SELECT.md) + +## 优化建议 + +- **DATABASE** + + 不建议在事务中reindex database。 + +- **SYSTEM** + + 不建议在事务中reindex系统表。 + + diff --git a/content/zh/docs/Developerguide/SELECT.md b/content/zh/docs/Developerguide/SELECT.md new file mode 100644 index 000000000..e9cd0381f --- /dev/null +++ b/content/zh/docs/Developerguide/SELECT.md @@ -0,0 +1,591 @@ +# SELECT + +## 功能描述 + +SELECT用于从表或视图中取出数据。 + +SELECT语句就像叠加在数据库表上的过滤器,利用SQL关键字从数据表中过滤出用户需要的数据。 + +## 注意事项 + +- 必须对每个在SELECT命令中使用的字段有SELECT权限。 + +- 使用FOR UPDATE或FOR SHARE还要求UPDATE权限。 + +## 语法格式 + +- 查询数据 + +``` +[ WITH [ RECURSIVE ] with_query [, ...] ] +SELECT [/*+ plan_hint */] [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] +{ * | {expression [ [ AS ] output_name ]} [, ...] } +[ FROM from_item [, ...] ] +[ WHERE condition ] +[ GROUP BY grouping_element [, ...] ] +[ HAVING condition [, ...] ] +[ WINDOW {window_name AS ( window_definition )} [, ...] ] +[ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ] +[ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] +[ LIMIT { [offset,] count | ALL } ] +[ OFFSET start [ ROW | ROWS ] ] +[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] +[ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ]} [...] ]; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>condition和expression中可以使用targetlist中表达式的别名。 +>- 只能同一层引用。 +>- 只能引用targetlist中的别名。 +>- 只能是后面的表达式引用前面的表达式。 +>- 不能包含volatile函数。 +>- 不能包含Window function函数。 +>- 不支持在join on条件中引用别名。 +>- targetlist中有多个要应用的别名则报错。 + +- 其中子查询with\_query为: + + ``` + with_query_name [ ( column_name [, ...] ) ] + AS ( {select | values | insert | update | delete} ) + ``` + +- 其中指定查询源from\_item为: + + ``` + {[ ONLY ] table_name [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ] + [ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ] + |( select ) [ AS ] alias [ ( column_alias [, ...] ) ] + |with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] + |function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ] + |function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] ) + |from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]} + ``` + +- 其中group子句为: + + ``` + ( ) + | expression + | ( expression [, ...] ) + | ROLLUP ( { expression | ( expression [, ...] ) } [, ...] ) + | CUBE ( { expression | ( expression [, ...] ) } [, ...] ) + | GROUPING SETS ( grouping_element [, ...] ) + ``` + +- 其中指定分区partition\_clause为: + + ``` + PARTITION { ( partition_name ) | + FOR ( partition_value [, ...] ) } + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >指定分区只适合普通表。 + +- 其中设置排序方式nlssort\_expression\_clause为: + + ``` + NLSSORT ( column_name, ' NLS_SORT = { SCHINESE_PINYIN_M | generic_m_ci } ' ) + ``` + +- 简化版查询语法,功能相当于select \* from table\_name。 + + ``` + TABLE { ONLY {(table_name)| table_name} | table_name [ * ]}; + ``` + + +## 参数说明 + +- **WITH \[ RECURSIVE \] with\_query \[, ...\]** + + 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 + + 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 + + 其中with\_query的详细格式为:with\_query\_name \[ \( column\_name \[, ...\] \) \] AS \( \{select | values | insert | update | delete\} \) + + - with\_query\_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 + - column\_name指定子查询结果集中显示的列名。 + - 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 + +- **plan\_hint子句** + + 以/\*+ \*/的形式在SELECT关键字后,用于对SELECT对应的语句块生成的计划进行hint调优。 + +- **ALL** + + 声明返回所有符合条件的行,是默认行为,可以省略该关键字。 + +- **DISTINCT \[ ON \( expression \[, ...\] \) \]** + + 从SELECT的结果集中删除所有重复的行,使结果集中的每行都是唯一的。 + + ON \( expression \[, ...\] \) 只保留那些在给出的表达式上运算出相同结果的行集合中的第一行。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >DISTINCT ON表达式是使用与ORDER BY相同的规则进行解释的。除非使用了ORDER BY来保证需要的行首先出现,否则,"第一行" 是不可预测的。 + +- **SELECT列表** + + 指定查询表中列名,可以是部分列或者是全部(使用通配符\*表示)。 + + 通过使用子句AS output\_name可以为输出字段取个别名,这个别名通常用于输出字段的显示。 + + 列名可以用下面几种形式表达: + + - 手动输入列名,多个列之间用英文逗号(,)分隔。 + - 可以是FROM子句里面计算出来的字段。 + +- **FROM子句** + + 为SELECT声明一个或者多个源表。 + + FROM子句涉及的元素如下所示。 + + - table\_name + + 表名或视图名,名称前可加上模式名,如:schema\_name.table\_name。 + + - alias + + 给表或复杂的表引用起一个临时的表别名,以便被其余的查询引用。 + + 别名用于缩写或者在自连接中消除歧义。如果提供了别名,它就会完全隐藏表的实际名称。 + + - TABLESAMPLE _sampling\_method_ \( _argument_ \[, ...\] \) \[ REPEATABLE \( _seed_ \) \] + + _table\_name_之后的TABLESAMPLE子句表示应该用指定的_sampling\_method_来检索表中行的子集。 + + 可选的REPEATABLE子句指定一个用于产生采样方法中随机数的_种子_数。种子值可以是任何非空常量值。如果查询时表没有被更改,指定相同种子和_argument_值的两个查询将会选择该表相同的采样。但是不同的种子值通常将会产生不同的采样。如果没有给出REPEATABLE,则会基于一个系统产生的种子为每一个查询选择一个新的随机采样。 + + - column\_alias + + 列别名 + + - PARTITION + + 查询分区表的某个分区的数据。 + + - partition\_name + + 分区名。 + + - partition\_value + + 指定的分区键值。在创建分区表时,如果指定了多个分区键,可以通过PARTITION FOR子句指定的这一组分区键的值,唯一确定一个分区。 + + - subquery + + FROM子句中可以出现子查询,创建一个临时表保存子查询的输出。 + + - with\_query\_name + + WITH子句同样可以作为FROM子句的源,可以通过WITH查询的名称对其进行引用。 + + - function\_name + + 函数名称。函数调用也可以出现在FROM子句中。 + + - join\_type + + 有5种类型,如下所示。 + + - \[ INNER \] JOIN + + 一个JOIN子句组合两个FROM项。可使用圆括弧以决定嵌套的顺序。如果没有圆括弧,JOIN从左向右嵌套。 + + 在任何情况下,JOIN都比逗号分隔的FROM项绑定得更紧。 + + - LEFT \[ OUTER \] JOIN + + 返回笛卡尔积中所有符合连接条件的行,再加上左表中通过连接条件没有匹配到右表行的那些行。这样,左边的行将扩展为生成表的全长,方法是在那些右表对应的字段位置填上NULL。请注意,只在计算匹配的时候,才使用JOIN子句的条件,外层的条件是在计算完毕之后施加的。 + + - RIGHT \[ OUTER \] JOIN + + 返回所有内连接的结果行,加上每个不匹配的右边行(左边用NULL扩展)。 + + 这只是一个符号上的方便,因为总是可以把它转换成一个LEFT OUTER JOIN,只要把左边和右边的输入互换位置即可。 + + - FULL \[ OUTER \] JOIN + + 返回所有内连接的结果行,加上每个不匹配的左边行(右边用NULL扩展),再加上每个不匹配的右边行(左边用NULL扩展)。 + + - CROSS JOIN + + CROSS JOIN等效于INNER JOIN ON(TRUE) ,即没有被条件删除的行。这种连接类型只是符号上的方便,因为它们与简单的FROM和WHERE的效果相同。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >必须为INNER和OUTER连接类型声明一个连接条件,即NATURAL ON,join\_condition,USING \(join\_column \[, ...\]\) 之一。但是它们不能出现在CROSS JOIN中。 + + + 其中CROSS JOIN和INNER JOIN生成一个简单的笛卡尔积,和在FROM的顶层列出两个项的结果相同。 + + - ON join\_condition + + 连接条件,用于限定连接中的哪些行是匹配的。如:ON left\_table.a = right\_table.a。 + + - USING\(join\_column\[,...\]\) + + ON left\_table.a = right\_table.a AND left\_table.b = right\_table.b ... 的简写。要求对应的列必须同名。 + + - NATURAL + + NATURAL是具有相同名称的两个表的所有列的USING列表的简写。 + + - from item + + 用于连接的查询源对象的名称。 + + +- **WHERE子句** + + WHERE子句构成一个行选择表达式,用来缩小SELECT查询的范围。condition是返回值为布尔型的任意表达式,任何不满足该条件的行都不会被检索。 + + WHERE子句中可以通过指定"\(+\)"操作符的方法将表的连接关系转换为外连接。但是不建议用户使用这种用法,因为这并不是SQL的标准语法,在做平台迁移的时候可能面临语法兼容性的问题。同时,使用"\(+\)"有很多限制: + + 1. "\(+\)"只能出现在where子句中。 + 2. 如果from子句中已经有指定表连接关系,那么不能再在where子句中使用"\(+\)"。 + 3. "\(+\)"只能作用在表或者视图的列上,不能作用在表达式上。 + 4. 如果表A和表B有多个连接条件,那么必须在所有的连接条件中指定"\(+\)",否则"\(+\)"将不会生效,表连接会转化成内连接,并且不给出任何提示信息。 + 5. "\(+\)"作用的连接条件中的表不能跨查询或者子查询。如果"\(+\)"作用的表,不在当前查询或者子查询的from子句中,则会报错。如果"\(+\)"作用的对端的表不存在,则不报错,同时连接关系会转化为内连接。 + 6. "\(+\)"作用的表达式不能直接通过"OR"连接。 + 7. 如果"\(+\)"作用的列是和一个常量的比较关系, 那么这个表达式会成为join条件的一部分。 + 8. 同一个表不能对应多个外表。 + 9. "\(+\)"只能出现"比较表达式","NOT表达式",“ANY表达式”,“ALL表达式”,“IN表达式”,“NULLIF表达式”,“IS DISTINCT FROM表达式”,“IS OF”表达式。"\(+\)"不能出现在其他类型表达式中,并且这些表达式中不允许出现通过“AND”和“OR”连接的表达式。 + 10. "\(+\)"只能转化为左外连接或者右外连接,不能转化为全连接,即不能在一个表达式的两个表上同时指定"\(+\)" + + >![](public_sys-resources/icon-notice.gif) **须知:** + >对于WHERE子句的LIKE操作符,当LIKE中要查询特殊字符“%”、“\_”、“\\”的时候需要使用反斜杠“\\”来进行转义。 + +- **GROUP BY子句** + + 将查询结果按某一列或多列的值分组,值相等的为一组。 + + - CUBE \( \{ expression | \( expression \[, ...\] \) \} \[, ...\] \) + + CUBE是自动对group by子句中列出的字段进行分组汇总,结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。它会为每个分组返回一行汇总信息, 用户可以使用CUBE来产生交叉表值。比如,在CUBE子句中给出三个表达式(n = 3),运算结果为2n = 23 = 8组。 以n个表达式的值分组的行称为常规行,其余的行称为超级聚集行。 + + - GROUPING SETS \( grouping\_element \[, ...\] \) + + GROUPING SETS子句是GROUP BY子句的进一步扩展,它可以使用户指定多个GROUP BY选项。 这样做可以通过裁剪用户不需要的数据组来提高效率。 当用户指定了所需的数据组时,数据库不需要执行完整CUBE或ROLLUP生成的聚合集合。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >如果SELECT列表的表达式中引用了那些没有分组的字段,则会报错,除非使用了聚集函数,因为对于未分组的字段,可能返回多个数值。 + +- **HAVING子句** + + 与GROUP BY子句配合用来选择特殊的组。HAVING子句将组的一些属性与一个常数值比较,只有满足HAVING子句中的逻辑表达式的组才会被提取出来。 + +- **WINDOW子句** + + 一般形式为WINDOW window\_name AS \( window\_definition \) \[, ...\],window\_name是可以被随后的窗口定义所引用的名称,window\_definition可以是以下的形式: + + \[ existing\_window\_name \] + + \[ PARTITION BY expression \[, ...\] \] + + \[ ORDER BY expression \[ ASC | DESC | USING operator \] \[ NULLS \{ FIRST | LAST \} \] \[, ...\] \] + + \[ frame\_clause \] + + frame\_clause为窗函数定义一个窗口框架window frame,窗函数(并非所有)依赖于框架,window frame是当前查询行的一组相关行。frame\_clause可以是以下的形式: + + \[ RANGE | ROWS \] frame\_start + + \[ RANGE | ROWS \] BETWEEN frame\_start AND frame\_end + + frame\_start和frame\_end可以是: + + UNBOUNDED PRECEDING + + value PRECEDING + + CURRENT ROW + + value FOLLOWING + + UNBOUNDED FOLLOWING + + >![](public_sys-resources/icon-notice.gif) **须知:** + >对列存表的查询目前只支持row\_number窗口函数,不支持frame\_clause。 + +- **UNION子句** + + UNION计算多个SELECT语句返回行集合的并集。 + + UNION子句有如下约束条件: + + - 除非声明了ALL子句,否则缺省的UNION结果不包含重复的行。 + - 同一个SELECT语句中的多个UNION操作符是从左向右计算的,除非用圆括弧进行了标识。 + - FOR UPDATE不能在UNION的结果或输入中声明。 + + 一般表达式: + + select\_statement UNION \[ALL\] select\_statement + + - select\_statement可以是任何没有ORDER BY、LIMIT、FOR UPDATE子句的SELECT语句。 + - 如果用圆括弧包围,ORDER BY和LIMIT可以附着在子表达式里。 + +- **INTERSECT子句** + + INTERSECT计算多个SELECT语句返回行集合的交集,不含重复的记录。 + + INTERSECT子句有如下约束条件: + + - 同一个SELECT语句中的多个INTERSECT操作符是从左向右计算的,除非用圆括弧进行了标识。 + - 当对多个SELECT语句的执行结果进行UNION和INTERSECT操作的时候,会优先处理INTERSECT。 + + 一般形式: + + select\_statement INTERSECT select\_statement + + select\_statement可以是任何没有FOR UPDATE子句的SELECT语句。 + +- **EXCEPT子句** + + EXCEPT子句有如下的通用形式: + + select\_statement EXCEPT \[ ALL \] select\_statement + + select\_statement是任何没有FOR UPDATE子句的SELECT表达式。 + + EXCEPT操作符计算存在于左边SELECT语句的输出而不存在于右边SELECT语句输出的行。 + + EXCEPT的结果不包含任何重复的行,除非声明了ALL选项。使用ALL时,一个在左边表中有m个重复而在右边表中有n个重复的行将在结果中出现max\(m-n,0\) 次。 + + 除非用圆括弧指明顺序,否则同一个SELECT语句中的多个EXCEPT操作符是从左向右计算的。EXCEPT和UNION的绑定级别相同。 + + 目前,不能给EXCEPT的结果或者任何EXCEPT的输入声明FOR UPDATE子句。 + +- **MINUS子句** + + 与EXCEPT子句具有相同的功能和用法。 + +- **ORDER BY子句** + + 对SELECT语句检索得到的数据进行升序或降序排序。对于ORDER BY表达式中包含多列的情况: + + - 首先根据最左边的列进行排序,如果这一列的值相同,则根据下一个表达式进行比较,依此类推。 + - 如果对于所有声明的表达式都相同,则按随机顺序返回。 + - ORDER BY中排序的列必须包括在SELECT语句所检索的结果集的列中。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >如果要支持中文拼音排序和不区分大小写排序,需要在初始化数据库时指定编码格式为UTF-8或GBK。 命令如下: + >initdb –E UTF8 –D ../data –locale=zh\_CN.UTF-8或initdb –E GBK –D ../data –locale=zh\_CN.GBK。 + +- **LIMIT子句** + + LIMIT子句由两个独立的子句组成: + + LIMIT \{ count | ALL \} + + OFFSET start count声明返回的最大行数,而start声明开始返回行之前忽略的行数。如果两个都指定了,会在开始计算count个返回行之前先跳过start行。 + +- **OFFSET子句** + + SQL:2008开始提出一种不同的语法: + + OFFSET start \{ ROW | ROWS \} + + start声明开始返回行之前忽略的行数。 + +- **FETCH \{ FIRST | NEXT \} \[ count \] \{ ROW | ROWS \} ONLY** + + 如果不指定count,默认值为1,FETCH子句限定返回查询结果从第一行开始的总行数。 + +- **FOR UPDATE子句** + + FOR UPDATE子句将对SELECT检索出来的行进行加锁。这样避免它们在当前事务结束前被其他事务修改或者删除,即其他企图UPDATE、 DELETE、 SELECT FOR UPDATE这些行的事务将被阻塞,直到当前事务结束。 + + 为了避免操作等待其他事务提交,可使用NOWAIT选项,如果被选择的行不能立即被锁住,执行SELECT FOR UPDATE NOWAIT将会立即汇报一个错误,而不是等待。 + + FOR SHARE的行为类似,只是它在每个检索出来的行上要求一个共享锁,而不是一个排他锁。一个共享锁阻塞其它事务执行UPDATE、DELETE、SELECT,不阻塞SELECT FOR SHARE。 + + 如果在FOR UPDATE或FOR SHARE中明确指定了表名称,则只有这些指定的表被锁定,其他在SELECT中使用的表将不会被锁定。否则,将锁定该命令中所有使用的表。 + + 如果FOR UPDATE或FOR SHARE应用于一个视图或者子查询,它同样将锁定所有该视图或子查询中使用到的表。 + + 多个FOR UPDATE和FOR SHARE子句可以用于为不同的表指定不同的锁定模式。 + + 如果一个表中同时出现(或隐含同时出现)在FOR UPDATE和FOR SHARE子句中,则按照FOR UPDATE处理。类似的,如果影响一个表的任意子句中出现了NOWAIT,该表将按照NOWAIT处理。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >对列存表的查询不支持for update/share。 + +- **NLS\_SORT** + + 指定某字段按照特殊方式排序。目前仅支持中文拼音格式排序和不区分大小写排序。 + + 取值范围: + + - SCHINESE\_PINYIN\_M,按照中文拼音排序。如果要支持此排序方式,在创建数据库时需要指定编码格式为“GBK”,否则排序无效。 + - generic\_m\_ci,不区分大小写排序。 + +- **PARTITION子句** + + 查询某个分区表中相应分区的数据。 + + +## 示例 + +``` +--先通过子查询得到一张临时表temp_t,然后查询表temp_t中的所有数据。 +postgres=# WITH temp_t(name,isdba) AS (SELECT usename,usesuper FROM pg_user) SELECT * FROM temp_t; + +--查询tpcds.reason表的所有r_reason_sk记录,且去除重复。 +postgres=# SELECT DISTINCT(r_reason_sk) FROM tpcds.reason; + +--LIMIT子句示例:获取表中一条记录。 +postgres=# SELECT * FROM tpcds.reason LIMIT 1; + +--查询所有记录,且按字母升序排列。 +postgres=# SELECT r_reason_desc FROM tpcds.reason ORDER BY r_reason_desc; + +--通过表别名,从pg_user和pg_user_status这两张表中获取数据。 +postgres=# SELECT a.usename,b.locktime FROM pg_user a,pg_user_status b WHERE a.usesysid=b.roloid; + +--FULL JOIN子句示例:将pg_user和pg_user_status这两张表的数据进行全连接显示,即数据的合集。 +postgres=# SELECT a.usename,b.locktime,a.usesuper FROM pg_user a FULL JOIN pg_user_status b on a.usesysid=b.roloid; + +--GROUP BY子句示例:根据查询条件过滤,并对结果进行分组。 +postgres=# SELECT r_reason_id, AVG(r_reason_sk) FROM tpcds.reason GROUP BY r_reason_id HAVING AVG(r_reason_sk) > 25; + +--GROUP BY CUBE子句示例:根据查询条件过滤,并对结果进行分组汇总。 +postgres=# SELECT r_reason_id,AVG(r_reason_sk) FROM tpcds.reason GROUP BY CUBE(r_reason_id,r_reason_sk); + +--GROUP BY GROUPING SETS子句示例:根据查询条件过滤,并对结果进行分组汇总。 +postgres=# SELECT r_reason_id,AVG(r_reason_sk) FROM tpcds.reason GROUP BY GROUPING SETS((r_reason_id,r_reason_sk),r_reason_sk); + +--UNION子句示例:将表tpcds.reason里r_reason_desc字段中的内容以W开头和以N开头的进行合并。 +postgres=# SELECT r_reason_sk, tpcds.reason.r_reason_desc + FROM tpcds.reason + WHERE tpcds.reason.r_reason_desc LIKE 'W%' +UNION +SELECT r_reason_sk, tpcds.reason.r_reason_desc + FROM tpcds.reason + WHERE tpcds.reason.r_reason_desc LIKE 'N%'; + +--NLS_SORT子句示例:中文拼音排序。 +postgres=# SELECT * FROM tpcds.reason ORDER BY NLSSORT( r_reason_desc, 'NLS_SORT = SCHINESE_PINYIN_M'); + + +--不区分大小写排序: +postgres=# SELECT * FROM tpcds.reason ORDER BY NLSSORT( r_reason_desc, 'NLS_SORT = generic_m_ci'); + +--创建分区表tpcds.reason_p +postgres=# CREATE TABLE tpcds.reason_p +( + r_reason_sk integer, + r_reason_id character(16), + r_reason_desc character(100) +) +PARTITION BY RANGE (r_reason_sk) +( + partition P_05_BEFORE values less than (05), + partition P_15 values less than (15), + partition P_25 values less than (25), + partition P_35 values less than (35), + partition P_45_AFTER values less than (MAXVALUE) +) +; + +--插入数据。 +postgres=# INSERT INTO tpcds.reason_p values(3,'AAAAAAAABAAAAAAA','reason 1'),(10,'AAAAAAAABAAAAAAA','reason 2'),(4,'AAAAAAAABAAAAAAA','reason 3'),(10,'AAAAAAAABAAAAAAA','reason 4'),(10,'AAAAAAAABAAAAAAA','reason 5'),(20,'AAAAAAAACAAAAAAA','reason 6'),(30,'AAAAAAAACAAAAAAA','reason 7'); + +--PARTITION子句示例:从tpcds.reason_p的表分区P_05_BEFORE中获取数据。 +postgres=# SELECT * FROM tpcds.reason_p PARTITION (P_05_BEFORE); + r_reason_sk | r_reason_id | r_reason_desc +-------------+------------------+------------------------------------ + 4 | AAAAAAAABAAAAAAA | reason 3 + 3 | AAAAAAAABAAAAAAA | reason 1 +(2 rows) + +--GROUP BY子句示例:按r_reason_id分组统计tpcds.reason_p表中的记录数。 +postgres=# SELECT COUNT(*),r_reason_id FROM tpcds.reason_p GROUP BY r_reason_id; + count | r_reason_id +-------+------------------ + 2 | AAAAAAAACAAAAAAA + 5 | AAAAAAAABAAAAAAA +(2 rows) + +--GROUP BY CUBE子句示例:根据查询条件过滤,并对查询结果分组汇总。 +postgres=# SELECT * FROM tpcds.reason GROUP BY CUBE (r_reason_id,r_reason_sk,r_reason_desc); + +--GROUP BY GROUPING SETS子句示例:根据查询条件过滤,并对查询结果分组汇总。 +postgres=# SELECT * FROM tpcds.reason GROUP BY GROUPING SETS ((r_reason_id,r_reason_sk),r_reason_desc); + +--HAVING子句示例:按r_reason_id分组统计tpcds.reason_p表中的记录,并只显示r_reason_id个数大于2的信息。 +postgres=# SELECT COUNT(*) c,r_reason_id FROM tpcds.reason_p GROUP BY r_reason_id HAVING c>2; + c | r_reason_id +---+------------------ + 5 | AAAAAAAABAAAAAAA +(1 row) + +--IN子句示例:按r_reason_id分组统计tpcds.reason_p表中的r_reason_id个数,并只显示r_reason_id值为 AAAAAAAABAAAAAAA或AAAAAAAADAAAAAAA的个数。 +postgres=# SELECT COUNT(*),r_reason_id FROM tpcds.reason_p GROUP BY r_reason_id HAVING r_reason_id IN('AAAAAAAABAAAAAAA','AAAAAAAADAAAAAAA'); +count | r_reason_id +-------+------------------ + 5 | AAAAAAAABAAAAAAA +(1 row) + +--INTERSECT子句示例:查询r_reason_id等于AAAAAAAABAAAAAAA,并且r_reason_sk小于5的信息。 +postgres=# SELECT * FROM tpcds.reason_p WHERE r_reason_id='AAAAAAAABAAAAAAA' INTERSECT SELECT * FROM tpcds.reason_p WHERE r_reason_sk<5; + r_reason_sk | r_reason_id | r_reason_desc +-------------+------------------+------------------------------------ + 4 | AAAAAAAABAAAAAAA | reason 3 + 3 | AAAAAAAABAAAAAAA | reason 1 +(2 rows) + +--EXCEPT子句示例:查询r_reason_id等于AAAAAAAABAAAAAAA,并且去除r_reason_sk小于4的信息。 +postgres=# SELECT * FROM tpcds.reason_p WHERE r_reason_id='AAAAAAAABAAAAAAA' EXCEPT SELECT * FROM tpcds.reason_p WHERE r_reason_sk<4; +r_reason_sk | r_reason_id | r_reason_desc +-------------+------------------+------------------------------------ + 10 | AAAAAAAABAAAAAAA | reason 2 + 10 | AAAAAAAABAAAAAAA | reason 5 + 10 | AAAAAAAABAAAAAAA | reason 4 + 4 | AAAAAAAABAAAAAAA | reason 3 +(4 rows) + +--通过在where子句中指定"(+)"来实现左连接。 +postgres=# select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk = t2.c_customer_sk(+) +order by 1 desc limit 1; + sr_item_sk | c_customer_id +------------+--------------- + 18000 | +(1 row) + +--通过在where子句中指定"(+)"来实现右连接。 +postgres=# select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk(+) = t2.c_customer_sk +order by 1 desc limit 1; + sr_item_sk | c_customer_id +------------+------------------ + | AAAAAAAAJNGEBAAA +(1 row) + +--通过在where子句中指定"(+)"来实现左连接,并且增加连接条件。 +postgres=# select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk = t2.c_customer_sk(+) and t2.c_customer_sk(+) < 1 order by 1 limit 1; + sr_item_sk | c_customer_id +------------+--------------- + 1 | +(1 row) + +--不支持在where子句中指定"(+)"的同时使用内层嵌套AND/OR的表达式。 +postgres=# select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where not(t1.sr_customer_sk = t2.c_customer_sk(+) and t2.c_customer_sk(+) < 1); +ERROR: Operator "(+)" can not be used in nesting expression. +LINE 1: ...tomer_id from store_returns t1, customer t2 where not(t1.sr_... + ^ +--where子句在不支持表达式宏指定"(+)"会报错。 +postgres=# select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where (t1.sr_customer_sk = t2.c_customer_sk(+))::bool; +ERROR: Operator "(+)" can only be used in common expression. + +--where子句在表达式的两边都指定"(+)"会报错。 +postgres=# select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk(+) = t2.c_customer_sk(+); +ERROR: Operator "(+)" can't be specified on more than one relation in one join condition +HINT: "t1", "t2"...are specified Operator "(+)" in one condition. + +--删除表。 +postgres=# DROP TABLE tpcds.reason_p; +``` + 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" new file mode 100644 index 000000000..67b12ab58 --- /dev/null +++ "b/content/zh/docs/Developerguide/SEQUENCE\345\207\275\346\225\260.md" @@ -0,0 +1,118 @@ +# SEQUENCE函数 + +序列函数为用户从序列对象中获取后续的序列值提供了简单的多用户安全的方法。 + +- nextval\(regclass\) + + 描述:递增序列并返回新值。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >为了避免从同一个序列获取值的并发事务被阻塞, nextval操作不会回滚;也就是说,一旦一个值已经被抓取, 那么就认为它已经被用过了,并且不会再被返回。 即使该操作处于事务中,当事务之后中断,或者如果调用查询结束不使用该值,也是如此。这种情况将在指定值的顺序中留下未使用的"空洞"。 因此,openGauss序列对象不能用于获得"无间隙"序列。 + + 返回类型:bigint + + nextval函数有两种调用方式(其中第二种调用方式兼容A DB的语法,目前不支持Sequence命名中有特殊字符"."的情况),如下: + + 示例1: + + ``` + postgres=# select nextval('seqDemo'); + nextval + --------- + 2 + (1 row) + ``` + + 示例2: + + ``` + postgres=# select seqDemo.nextval; + nextval + --------- + 2 + (1 row) + ``` + +- currval\(regclass\) + + 返回当前会话里最近一次nextval返回的指定的sequence的数值。如果当前会话还没有调用过指定的sequence的nextval,那么调用currval将会报错。需要注意的是,这个函数在默认情况下是不支持的,需要通过设置enable\_beta\_features为true之后,才能使用这个函数。 + + 返回类型:bigint + + currval函数有两种调用方式(其中第二种调用方式兼容A DB的语法,目前不支持Sequence命名中有特殊字符"."的情况),如下: + + 示例1: + + ``` + postgres=# select currval('seq1'); + currval + --------- + 2 + (1 row) + ``` + + 示例2: + + ``` + postgres=# select seq1.currval; + currval + --------- + 2 + (1 row) + ``` + +- lastval\(\) + + 描述:返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 + + 需要注意的是,这个函数在默认情况下是不支持的,需要通过设置enable\_beta\_features或者lastval\_supported为true之后,才能使用这个函数。 + + 返回类型:bigint + + 示例: + + ``` + postgres=# select lastval(); + lastval + --------- + 2 + (1 row) + ``` + +- setval\(regclass, bigint\) + + 描述:设置序列的当前数值。 + + 返回类型:bigint + + 示例: + + ``` + postgres=# select setval('seqDemo',1); + setval + -------- + 1 + (1 row) + ``` + +- setval\(regclass, bigint, Boolean\) + + 描述:设置序列的当前数值以及is\_called标志。 + + 返回类型:bigint + + 示例: + + ``` + postgres=# select setval('seqDemo',1,true); + setval + -------- + 1 + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >Setval后当前会话及GTM上会立刻生效,但如果其他会话有缓存的序列值,只能等到缓存值用尽才能感知Setval的作用。所以为了避免序列值冲突,setval要谨慎使用。 + >因为序列是非事务的,setval造成的改变不会由于事务的回滚而撤销。 + + diff --git a/content/zh/docs/Developerguide/SET-CONSTRAINTS.md b/content/zh/docs/Developerguide/SET-CONSTRAINTS.md new file mode 100644 index 000000000..9e8b1c29c --- /dev/null +++ b/content/zh/docs/Developerguide/SET-CONSTRAINTS.md @@ -0,0 +1,54 @@ +# SET CONSTRAINTS + +## 功能描述 + +SET CONSTRAINTS设置当前事务检查行为的约束条件。 + +IMMEDIATE约束是在每条语句后面进行检查。DEFERRED约束一直到事务提交时才检查。每个约束都有自己的模式。 + +从创建约束条件开始,一个约束总是设定为DEFERRABLE INITIALLY DEFERRED,DEFERRABLE INITIALLY IMMEDIATE,NOT DEFERRABLE三个特性之一。第三种总是IMMEDIATE,并且不会受SET CONSTRAINTS影响。前两种以指定的方式启动每个事务,但是其行为可以在事务里用SET CONSTRAINTS改变。 + +带着一个约束名列表的SET CONSTRAINTS改变这些约束的模式(都必须是可推迟的)。如果有多个约束匹配某个名称,则所有都会被影响。SET CONSTRAINTS ALL改变所有可推迟约束的模式。 + +当SET CONSTRAINTS把一个约束从DEFERRED改成IMMEDIATE的时候,新模式反作用式地起作用:任何将在事务结束准备进行的数据修改都将在SET CONSTRAINTS的时候执行检查。如果违反了任何约束,SET CONSTRAINTS都会失败(并且不会修改约束模式)。因此,SET CONSTRAINTS可以用于强制在事务中某一点进行约束检查。 + +目前,只有外键约束被该设置影响。检查和唯一约束总是不可推迟的。 + +## 注意事项 + +SET CONSTRAINTS只在当前事务里设置约束的行为。因此,如果用户在事务块之外(START TRANSACTION/COMMIT对)执行这个命令,它将没有任何作用。 + +## 语法格式 + +``` +SET CONSTRAINTS { ALL | { name } [, ...] } { DEFERRED | IMMEDIATE } ; +``` + +## 参数说明 + +- **name** + + 约束名。 + + 取值范围:已存在的约束名。可以在系统表pg\_constraint中查到。 + +- **ALL** + + 所有约束。 + +- **DEFERRED** + + 约束一直到事务提交时才检查。 + +- **IMMEDIATE** + + 约束在每条语句后进行检查。 + + +## 示例 + +``` +--设置所有约束在事务提交时检查。 +postgres=# SET CONSTRAINTS ALL DEFERRED; +``` + diff --git a/content/zh/docs/Developerguide/SET-ROLE.md b/content/zh/docs/Developerguide/SET-ROLE.md new file mode 100644 index 000000000..3a1f69c85 --- /dev/null +++ b/content/zh/docs/Developerguide/SET-ROLE.md @@ -0,0 +1,72 @@ +# SET ROLE + +## 功能描述 + +设置当前会话的当前用户标识符。 + +## 注意事项 + +- 当前会话的用户必须是指定的rolename角色的成员,但系统管理员可以选择任何角色。 +- 使用这条命令,它可能会增加一个用户的权限,也可能会限制一个用户的权限。如果会话用户的角色有INHERITS属性,则它自动拥有它能SET ROLE变成的角色的所有权限;在这种情况下,SET ROLE实际上是删除了所有直接赋予会话用户的权限,以及它的所属角色的权限,只剩下指定角色的权限。另一方面,如果会话用户的角色有NOINHERITS属性,SET ROLE删除直接赋予会话用户的权限,而获取指定角色的权限。 + +## 语法格式 + +- 设置当前会话的当前用户标识符。 + + ``` + SET [ SESSION | LOCAL ] ROLE role_name PASSWORD 'password'; + ``` + +- 重置当前用户标识为当前会话用户标识符。 + + ``` + RESET ROLE; + ``` + + +## 参数说明 + +- **SESSION** + + 声明这个命令只对当前会话起作用,此参数为缺省值。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **LOCALE** + + 声明该命令只在当前事务中有效。 + +- **role\_name** + + 角色名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **password** + + 角色的密码。要求符合密码的命名规则。 + +- **RESET ROLE** + + 用于重置当前用户标识。 + + +## 示例 + +``` +--创建角色paul。 +postgres=# CREATE ROLE paul IDENTIFIED BY 'Bigdata@123'; + +--设置当前用户为paul。 +postgres=# SET ROLE paul PASSWORD 'Bigdata@123'; + +--查看当前会话用户,当前用户。 +postgres=# SELECT SESSION_USER, CURRENT_USER; + +--重置当前用户。 +postgres=# RESET role; + +--删除用户。 +postgres=# DROP USER paul; +``` + diff --git a/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md b/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md new file mode 100644 index 000000000..782582dd9 --- /dev/null +++ b/content/zh/docs/Developerguide/SET-SESSION-AUTHORIZATION.md @@ -0,0 +1,76 @@ +# SET SESSION AUTHORIZATION + +## 功能描述 + +把当前会话里的会话用户标识和当前用户标识都设置为指定的用户。 + +## 注意事项 + +只有在初始会话用户有系统管理员权限的时候,会话用户标识符才能改变。否则,只有在指定了被认证的用户名的情况下,系统才接受该命令。 + +## 语法格式 + +- 为当前会话设置会话用户标识符和当前用户标识符。 + + ``` + SET [ SESSION | LOCAL ] SESSION AUTHORIZATION role_name PASSWORD 'password'; + ``` + +- 重置会话和当前用户标识符为初始认证的用户名。 + + ``` + {SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT + | RESET SESSION AUTHORIZATION}; + ``` + + +## 参数说明 + +- **SESSION** + + 声明这个命令只对当前会话起作用。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **LOCALE** + + 声明该命令只在当前事务中有效。 + +- **role\_name** + + 用户名。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **password** + + 角色的密码。要求符合密码的命名规则。 + +- **DEFAULT** + + 重置会话和当前用户标识符为初始认证的用户名。 + + +## 示例 + +``` +--创建角色paul。 +postgres=# CREATE ROLE paul IDENTIFIED BY 'Bigdata@123'; + +--设置当前用户为paul。 +postgres=# SET SESSION AUTHORIZATION paul password 'Bigdata@123'; + +--查看当前会话用户,当前用户。 +postgres=# SELECT SESSION_USER, CURRENT_USER; + +--重置当前用户。 +postgres=# RESET SESSION AUTHORIZATION; + +--删除用户。 +postgres=# DROP USER paul; +``` + +## 相关参考 + +[SET ROLE](SET-ROLE.md#ZH-CN_TOPIC_0242370652) + diff --git a/content/zh/docs/Developerguide/SET-TRANSACTION.md b/content/zh/docs/Developerguide/SET-TRANSACTION.md new file mode 100644 index 000000000..0cb5566c2 --- /dev/null +++ b/content/zh/docs/Developerguide/SET-TRANSACTION.md @@ -0,0 +1,60 @@ +# SET TRANSACTION + +## 功能描述 + +为当前事务设置特性。它对后面的事务没有影响。事务特性包括事务隔离级别、事务访问模式\(读/写或者只读\)。 + +## 注意事项 + +无。 + +## 语法格式 + +设置事务的隔离级别、读写模式。 + +``` +{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION } + { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + | { READ WRITE | READ ONLY } } [, ...] +``` + +## 参数说明 + +- **LOCAL** + + 声明该命令只在当前事务中有效。 + +- **SESSION** + + 声明这个命令只对当前会话起作用。 + + 取值范围:字符串,要符合标识符的命名规范。 + +- **ISOLATION\_LEVEL\_CLAUSE** + + 指定事务隔离级别,该参数决定当一个事务中存在其他并发运行事务时能够看到什么数据。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 + + 取值范围: + + - READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 + - READ UNCOMMITTED:读未提交隔离级别,可能会读到未提交的数据。建议这种隔离级别下仅作只读操作,避免造成数据不一致。 + - REPEATABLE READ:可重复读隔离级别,仅仅能看到事务开始之前提交的数据,不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 + - SERIALIZABLE:openGauss目前功能上不支持此隔离级别,等价于REPEATABLE READ。 + +- **READ WRITE | READ ONLY** + + 指定事务访问模式(读/写或者只读)。 + + +## 示例 + +``` +--开启一个事务,设置事务的隔离级别为READ COMMITTED,访问模式为READ ONLY。 +postgres=# START TRANSACTION; +postgres=# SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY; +postgres=# COMMIT; +``` + diff --git a/content/zh/docs/Developerguide/SET.md b/content/zh/docs/Developerguide/SET.md new file mode 100644 index 000000000..ae4d52508 --- /dev/null +++ b/content/zh/docs/Developerguide/SET.md @@ -0,0 +1,116 @@ +# SET + +## 功能描述 + +用于修改运行时配置参数。 + +## 注意事项 + +大多数运行时参数都可以用SET在运行时设置,但有些则在服务运行过程中或会话开始之后不能修改。 + +## 语法格式 + +- 设置所处的时区。 + + ``` + SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }; + ``` + +- 设置所属的模式。 + + ``` + SET [ SESSION | LOCAL ] + {CURRENT_SCHEMA { TO | = } { schema | DEFAULT } + | SCHEMA 'schema'}; + ``` + +- 设置客户端编码集。 + + ``` + SET [ SESSION | LOCAL ] NAMES encoding_name; + ``` + +- 设置XML的解析方式。 + + ``` + SET [ SESSION | LOCAL ] XML OPTION { DOCUMENT | CONTENT }; + ``` + +- 设置其他运行时参数。 + + ``` + SET [ LOCAL | SESSION ] + { {config_parameter { { TO | = } { value | DEFAULT } + | FROM CURRENT }}}; + ``` + + +## 参数说明 + +- **SESSION** + + 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 + + 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 + +- **LOCAL** + + 声明的参数只在当前事务中有效。在COMMIT或ROLLBACK之后,会话级别的设置将再次生效。 + + 不论事务是否提交,此命令的影响只持续到当前事务结束。一个特例是:在一个事务里面,即有SET命令,又有SET LOCAL命令,且SET LOCAL在SET后面,则在事务结束之前,SET LOCAL命令会起作用,但事务提交之后,则是SET命令会生效。 + +- **TIME ZONE timezone** + + 用于指定当前会话的本地时区。 + + 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 + +- **CURRENT\_SCHEMA** + + **schema** + + CURRENT\_SCHEMA用于指定当前的模式。 + + 取值范围:已存在模式名称。 + +- **SCHEMA schema** + + 同CURRENT\_SCHEMA。此处的schema是个字符串。 + + 例如:set schema 'public'; + +- **NAMES encoding\_name** + + 用于设置客户端的字符编码。等价于set client\_encoding to encoding\_name。 + + 取值范围:有效的字符编码。该选项对应的运行时参数名称为client\_encoding,默认编码为SQL\_ASCII。 + +- **XML OPTION option** + + 用于设置XML的解析方式。 + + 取值范围:CONTENT(缺省)、DOCUMENT + +- **config\_parameter** + + 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 + +- **value** + + config\_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。 + + +## 示例 + +``` +--设置模式搜索路径。 +postgres=# SET search_path TO tpcds, public; + +--把日期时间风格设置为传统的 POSTGRES 风格(日在月前)。 +postgres=# SET datestyle TO postgres; +``` + +## 相关链接 + +[RESET](RESET.md),[SHOW](SHOW.md) + diff --git a/content/zh/docs/Developerguide/SHOW.md b/content/zh/docs/Developerguide/SHOW.md new file mode 100644 index 000000000..d611832f6 --- /dev/null +++ b/content/zh/docs/Developerguide/SHOW.md @@ -0,0 +1,42 @@ +# SHOW + +## 功能描述 + +SHOW将显示当前运行时参数的数值。 + +## 注意事项 + +无。 + +## 语法格式 + +``` +SHOW + { + configuration_parameter | + CURRENT_SCHEMA | + TIME ZONE | + TRANSACTION ISOLATION LEVEL | + SESSION AUTHORIZATION | + ALL + }; +``` + +## 参数说明 + +显示变量的参数请参见RESET的[参数说明](RESET.md#zh-cn_topic_0237122178_zh-cn_topic_0059779097_s46998dbd2cc84394b47aad2adc8ea141)。 + +## 示例 + +``` +--显示 timezone 参数值。 +postgres=# SHOW timezone; + +--显示所有参数。 +postgres=# SHOW ALL; +``` + +## 相关链接 + +[SET](SET.md),[RESET](RESET.md) + diff --git a/content/zh/docs/Developerguide/SQLAllocConnect.md b/content/zh/docs/Developerguide/SQLAllocConnect.md new file mode 100644 index 000000000..c7299f9e0 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLAllocConnect.md @@ -0,0 +1,4 @@ +# SQLAllocConnect + +在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocConnect已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md#ZH-CN_TOPIC_0242371438)。 + diff --git a/content/zh/docs/Developerguide/SQLAllocEnv.md b/content/zh/docs/Developerguide/SQLAllocEnv.md new file mode 100644 index 000000000..193f707f2 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLAllocEnv.md @@ -0,0 +1,4 @@ +# SQLAllocEnv + +在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocEnv已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md#ZH-CN_TOPIC_0242371438)。 + diff --git a/content/zh/docs/Developerguide/SQLAllocHandle.md b/content/zh/docs/Developerguide/SQLAllocHandle.md new file mode 100644 index 000000000..61075aa1f --- /dev/null +++ b/content/zh/docs/Developerguide/SQLAllocHandle.md @@ -0,0 +1,61 @@ +# SQLAllocHandle + +## 功能描述 + +分配环境、连接、语句或描述符的句柄,它替代了ODBC 2.x函数SQLAllocEnv、SQLAllocConnect及SQLAllocStmt。 + +## 原型 + +``` +SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType, + SQLHANDLE InputHandle, + SQLHANDLE *OutputHandlePtr); +``` + +## 参数 + +**表 1** SQLAllocHandle参数 + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

HandleType

+

由SQLAllocHandle分配的句柄类型。必须为下列值之一:

+
  • SQL_HANDLE_ENV(环境句柄)
  • SQL_HANDLE_DBC(连接句柄)
  • SQL_HANDLE_STMT(语句句柄)
  • SQL_HANDLE_DESC(描述句柄)
+

申请句柄顺序为,先申请环境句柄,再申请连接句柄,最后申请语句句柄,后申请的句柄都要依赖它前面申请的句柄。

+

InputHandle

+

将要分配的新句柄的类型。

+
  • 如果HandleType为SQL_HANDLE_ENV,则这个值为SQL_NULL_HANDLE。
  • 如果HandleType为SQL_HANDLE_DBC,则这一定是一个环境句柄。
  • 如果HandleType为SQL_HANDLE_STMT或SQL_HANDLE_DESC,则它一定是一个连接句柄。
+

OutputHandlePtr

+

输出参数:一个缓冲区的指针,此缓冲区以新分配的数据结构存放返回的句柄。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确, +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息, +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等、 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当分配的句柄并非环境句柄时,如果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值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLAllocStmt.md b/content/zh/docs/Developerguide/SQLAllocStmt.md new file mode 100644 index 000000000..9bb5f3f90 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLAllocStmt.md @@ -0,0 +1,4 @@ +# SQLAllocStmt + +在ODBC 3.x版本中,ODBC 2.x的函数SQLAllocStmt已被SQLAllocHandle代替。有关详细信息请参阅[SQLAllocHandle](SQLAllocHandle.md#ZH-CN_TOPIC_0242371438)。 + diff --git a/content/zh/docs/Developerguide/SQLBindCol.md b/content/zh/docs/Developerguide/SQLBindCol.md new file mode 100644 index 000000000..f377c558c --- /dev/null +++ b/content/zh/docs/Developerguide/SQLBindCol.md @@ -0,0 +1,76 @@ +# SQLBindCol + +## 功能描述 + +将应用程序数据缓冲区绑定到结果集的列中。 + +## 原型 + +``` +SQLRETURN SQLBindCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, + SQLSMALLINT TargetType, + SQLPOINTER TargetValuePtr, + SQLINTEGER BufferLength, + SQLINTEGER *StrLen_or_IndPtr); +``` + +## 参数 + +**表 1** SQLBindCol参数 + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄。

+

ColumnNumber

+

要绑定结果集的列号。起始列号为0,以递增的顺序计算列号,第0列是书签列。若未设置书签页,则起始列号为1。

+

TargetType

+

缓冲区中C数据类型的标识符。

+

TargetValuePtr

+

输出参数:指向与列绑定的数据缓冲区的指针。SQLFetch函数返回这个缓冲区中的数据。如果此参数为一个空指针,则StrLen_or_IndPtr是一个有效值。

+

BufferLength

+

TargetValuePtr指向缓冲区的长度,以字节为单位。

+

StrLen_or_IndPtr

+

输出参数:缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当SQLBindCol返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLBindParameter.md b/content/zh/docs/Developerguide/SQLBindParameter.md new file mode 100644 index 000000000..85dee6214 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLBindParameter.md @@ -0,0 +1,100 @@ +# SQLBindParameter + +## 功能描述 + +将一条SQL语句中的一个参数标志和一个缓冲区绑定起来。 + +## 原型 + +``` +SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, + SQLSMALLINT InputOutputType, + SQLSMALLINT ValuetType, + SQLSMALLINT ParameterType, + SQLSMALLINT ColumnSize, + SQLSMALLINT DecimalDigits, + SQLPOINTER ParameterValuePtr, + SQLINTEGER BufferLength, + SQLINTEGER *StrLen_or_IndPtr); +``` + +## 参数 + +**表 1** SQLBindParameter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键词

+

参数说明

+

StatementHandle

+

语句句柄。

+

ParameterNumber

+

参数序号,起始为1,依次递增。

+

InputOutputType

+

输入输出参数类型。

+

ValueType

+

参数的C数据类型。

+

ParameterType

+

参数的SQL数据类型。

+

ColumnSize

+

列的大小或相应参数标记的表达式。

+

DecimalDigits

+

列的十进制数字或相应参数标记的表达式。

+

ParameterValuePtr

+

指向存储参数数据缓冲区的指针。

+

BufferLength

+

ParameterValuePtr指向缓冲区的长度,以字节为单位。

+

StrLen_or_IndPtr

+

缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当SQLBindCol返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLColAttribute.md b/content/zh/docs/Developerguide/SQLColAttribute.md new file mode 100644 index 000000000..1f52d6e53 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLColAttribute.md @@ -0,0 +1,82 @@ +# SQLColAttribute + +## 功能描述 + +返回结果集中一列的描述符信息。 + +## 原型 + +``` +SQLRETURN SQLColAttibute(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, + SQLUSMALLINT FieldIdentifier, + SQLPOINTER CharacterAtrriburePtr, + SQLSMALLINT BufferLength, + SQLSMALLINT *StringLengthPtr, + SQLPOINTE NumericAttributePtr); +``` + +## 参数 + +**表 1** SQLColAttribute参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄。

+

ColumnNumber

+

要检索字段的列号,起始为1,依次递增。

+

FieldIdentifier

+

IRD中ColumnNumber行的字段。

+

CharacterAttributePtr

+

输出参数:一个缓冲区指针,返回FieldIdentifier字段值。

+

BufferLength

+
  • 如果FieldIdentifier是一个ODBC定义的字段,而且CharacterAttributePtr指向一个字符串或二进制缓冲区,则此参数为该缓冲区的长度。
  • 如果FieldIdentifier是一个ODBC定义的字段,而且CharacterAttributePtr指向一个整数,则会忽略该字段。
+

StringLengthPtr

+

输出参数:缓冲区指针,存放*CharacterAttributePtr中字符类型数据的字节总数,对于非字符类型,忽略BufferLength的值。

+

NumericAttributePtr

+

输出参数:指向一个整型缓冲区的指针,返回IRD中ColumnNumber行FieldIdentifier字段的值。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当SQLColAttribute返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLConnect.md b/content/zh/docs/Developerguide/SQLConnect.md new file mode 100644 index 000000000..4bf400341 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLConnect.md @@ -0,0 +1,83 @@ +# SQLConnect + +## 功能描述 + +在驱动程序和数据源之间建立连接。连接上数据源之后,可以通过连接句柄访问到所有有关连接数据源的信息,包括程序运行状态、事务处理状态和错误信息。 + +## 原型 + +``` +SQLRETURN SQLConnect(SQLHDBC ConnectionHandle, + SQLCHAR *ServerName, + SQLSMALLINT NameLength1, + SQLCHAR *UserName, + SQLSMALLINT NameLength2, + SQLCHAR *Authentication, + SQLSMALLINT NameLength3); +``` + +## 参数 + +**表 1** SQLConnect参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

ConnectionHandle

+

连接句柄,通过SQLAllocHandle获得。

+

ServerName

+

要连接数据源的名称。

+

NameLength1

+

ServerName的长度。

+

UserName

+

数据源中数据库用户名。

+

NameLength2

+

UserName的长度。

+

Authentication

+

数据源中数据库用户密码。

+

NameLength3

+

Authentication的长度。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 +- SQL\_STILL\_EXECUTING:表示语句正在执行。 + +## 注意事项 + +当调用SQLConnect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLDisconnect.md b/content/zh/docs/Developerguide/SQLDisconnect.md new file mode 100644 index 000000000..dd5fa6280 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLDisconnect.md @@ -0,0 +1,46 @@ +# SQLDisconnect + +## 功能描述 + +关闭一个与特定连接句柄相关的连接。 + +## 原型 + +``` +SQLRETURN SQLDisconnect(SQLHDBC ConnectionHandle); +``` + +## 参数 + +**表 1** SQLDisconnect参数 + + + + + + + + + + +

关键字

+

参数说明

+

ConnectionHandle

+

连接句柄,通过SQLAllocHandle获得。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当调用SQLDisconnect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLExecDirect.md b/content/zh/docs/Developerguide/SQLExecDirect.md new file mode 100644 index 000000000..81e528765 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLExecDirect.md @@ -0,0 +1,61 @@ +# SQLExecDirect + +## 功能描述 + +使用参数的当前值,执行一条准备好的语句。对于一次只执行一条SQL语句,SQLExecDirect是最快的执行方式。 + +## 原型 + +``` +SQLRETURN SQLExecDirect(SQLHSTMT StatementHandle, + SQLCHAR *StatementText, + SQLINTEGER TextLength); +``` + +## 参数 + +**表 1** SQLExecDirect参数 + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄,通过SQLAllocHandle获得。

+

StatementText

+

要执行的SQL语句。不支持一次执行多条语句。

+

TextLength

+

StatementText的长度。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_NEED\_DATA:在执行SQL语句前没有提供足够的参数。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 +- SQL\_STILL\_EXECUTING:表示语句正在执行。 +- SQL\_NO\_DATA:表示SQL语句不返回结果集。 + +## 注意事项 + +当调用SQLExecDirect函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLExecute.md b/content/zh/docs/Developerguide/SQLExecute.md new file mode 100644 index 000000000..6a8bbbc99 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLExecute.md @@ -0,0 +1,49 @@ +# SQLExecute + +## 功能描述 + +如果语句中存在参数标记的话,SQLExecute函数使用参数标记参数的当前值,执行一条准备好的SQL语句。 + +## 原型 + +``` +SQLRETURN SQLExecute(SQLHSTMT StatementHandle); +``` + +## 参数 + +**表 1** SQLExecute参数 + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

要执行语句的语句句柄。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_NEED\_DATA:表示在执行SQL语句前没有提供足够的参数。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_NO\_DATA:表示SQL语句不返回结果集。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 +- SQL\_STILL\_EXECUTING:表示语句正在执行。 + +## 注意事项 + +当SQLExecute函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,可通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLFetch.md b/content/zh/docs/Developerguide/SQLFetch.md new file mode 100644 index 000000000..95e8b263b --- /dev/null +++ b/content/zh/docs/Developerguide/SQLFetch.md @@ -0,0 +1,48 @@ +# SQLFetch + +## 功能描述 + +从结果集中取下一个行集的数据,并返回所有被绑定列的数据。 + +## 原型 + +``` +SQLRETURN SQLFetch(SQLHSTMT StatementHandle); +``` + +## 参数 + +**表 1** SQLFetch参数 + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄,通过SQLAllocHandle获得。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_NO\_DATA:表示SQL语句不返回结果集。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 +- SQL\_STILL\_EXECUTING:表示语句正在执行。 + +## 注意事项 + +当调用SQLFetch函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLFreeConnect.md b/content/zh/docs/Developerguide/SQLFreeConnect.md new file mode 100644 index 000000000..3b9d2dd6e --- /dev/null +++ b/content/zh/docs/Developerguide/SQLFreeConnect.md @@ -0,0 +1,4 @@ +# SQLFreeConnect + +在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeConnect已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md#ZH-CN_TOPIC_0242371450)。 + diff --git a/content/zh/docs/Developerguide/SQLFreeEnv.md b/content/zh/docs/Developerguide/SQLFreeEnv.md new file mode 100644 index 000000000..e3614790f --- /dev/null +++ b/content/zh/docs/Developerguide/SQLFreeEnv.md @@ -0,0 +1,4 @@ +# SQLFreeEnv + +在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeEnv已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md#ZH-CN_TOPIC_0242371450)。 + diff --git a/content/zh/docs/Developerguide/SQLFreeHandle.md b/content/zh/docs/Developerguide/SQLFreeHandle.md new file mode 100644 index 000000000..827b6e1e2 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLFreeHandle.md @@ -0,0 +1,54 @@ +# SQLFreeHandle + +## 功能描述 + +释放与指定环境、连接、语句或描述符相关联的资源,它替代了ODBC 2.x函数SQLFreeEnv、SQLFreeConnect及SQLFreeStmt。 + +## 原型 + +``` +SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType, + SQLHANDLE Handle); +``` + +## 参数 + +**表 1** SQLFreeHandle参数 + + + + + + + + + + + + + +

关键字

+

参数说明

+

HandleType

+

SQLFreeHandle要释放的句柄类型。必须为下列值之一:

+
  • SQL_HANDLE_ENV
  • SQL_HANDLE_DBC
  • SQL_HANDLE_STMT
  • SQL_HANDLE_DESC
+

如果HandleType不是这些值之一,SQLFreeHandle返回SQL_INVALID_HANDLE。

+

Handle

+

要释放的句柄。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +如果SQLFreeHandle返回SQL\_ERROR,句柄仍然有效。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLFreeStmt.md b/content/zh/docs/Developerguide/SQLFreeStmt.md new file mode 100644 index 000000000..fcc06bc8e --- /dev/null +++ b/content/zh/docs/Developerguide/SQLFreeStmt.md @@ -0,0 +1,4 @@ +# SQLFreeStmt + +在ODBC 3.x版本中,ODBC 2.x的函数SQLFreeStmt已被SQLFreeHandle代替。有关详细信息请参阅[SQLFreeHandle](SQLFreeHandle.md#ZH-CN_TOPIC_0242371450)。 + diff --git a/content/zh/docs/Developerguide/SQLGetData.md b/content/zh/docs/Developerguide/SQLGetData.md new file mode 100644 index 000000000..d720560cc --- /dev/null +++ b/content/zh/docs/Developerguide/SQLGetData.md @@ -0,0 +1,78 @@ +# SQLGetData + +## 功能描述 + +SQLGetData返回结果集中某一列的数据。可以多次调用它来部分地检索不定长度的数据。 + +## 原型 + +``` +SQLRETURN SQLGetData(SQLHSTMT StatementHandle, + SQLUSMALLINT Col_or_Param_Num, + SQLSMALLINT TargetType, + SQLPOINTER TargetValuePtr, + SQLLEN BufferLength, + SQLLEN *StrLen_or_IndPtr); +``` + +## 参数 + +**表 1** SQLGetData参数 + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄,通过SQLAllocHandle获得。

+

Col_or_Param_Num

+

要返回数据的列号。结果集的列按增序从1开始编号。书签列的列号为0。

+

TargetType

+

TargetValuePtr缓冲中的C数据类型的类型标识符。若TargetType为SQL_ARD_TYPE,驱动使用ARD中SQL_DESC_CONCISE_TYPE字段的类型标识符。若为SQL_C_DEFAULT,驱动根据源的SQL数据类型选择缺省的数据类型。

+

TargetValuePtr

+

输出参数:指向返回数据所在缓冲区的指针。

+

BufferLength

+

TargetValuePtr所指向缓冲区的长度。

+

StrLen_or_IndPtr

+

输出参数:指向缓冲区的指针,在此缓冲区中返回长度或标识符的值。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_NO\_DATA:表示SQL语句不返回结果集。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 +- SQL\_STILL\_EXECUTING:表示语句正在执行。 + +## 注意事项 + +当调用SQLFetch函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数分别设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLGetDiagRec.md b/content/zh/docs/Developerguide/SQLGetDiagRec.md new file mode 100644 index 000000000..f6f5ae63c --- /dev/null +++ b/content/zh/docs/Developerguide/SQLGetDiagRec.md @@ -0,0 +1,159 @@ +# SQLGetDiagRec + +## 功能描述 + +返回诊断记录的多个字段的当前值,其中诊断记录包含错误、警告及状态信息。 + +## 原型 + +``` +SQLRETURN SQLGetDiagRec(SQLSMALLINT HandleType + SQLHANDLE Handle, + SQLSMALLINT RecNumber, + SQLCHAR *SQLState, + SQLINTEGER *NativeErrorPtr, + SQLCHAR *MessageText, + SQLSMALLINT BufferLength + SQLSMALLINT *TextLengthPtr); +``` + +## 参数 + +**表 1** SQLGetDiagRec参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

HandleType

+

句柄类型标识符,它说明诊断所要求的句柄类型。必须为下列值之一:

+
  • SQL_HANDLE_ENV
  • SQL_HANDLE_DBC
  • SQL_HANDLE_STMT
  • SQL_HANDLE_DESC
+

Handle

+

诊断数据结构的句柄,其类型由HandleType来指出。如果HandleType是SQL_HANDLE_ENV,Handle可以是共享的或非共享的环境句柄。

+

RecNumber

+

指出应用从查找信息的状态记录。状态记录从1开始编号。

+

SQLState

+

输出参数:指向缓冲区的指针,该缓冲区存储着有关RecNumber的五字符的SQLSTATE码。

+

NativeErrorPtr

+

输出参数:指向缓冲区的指针,该缓冲区存储着本地的错误码。

+

MessageText

+

指向缓冲区的指针,该缓冲区存储着诊断信息文本串。

+

BufferLength

+

MessageText的长度。

+

TextLengthPtr

+

输出参数:指向缓冲区的指针,返回MessageText中的字节总数。如果返回字节数大于BufferLength,则MessageText中的诊断信息文本被截断成BufferLength减去NULL结尾字符的长度。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +SQLGetDiagRec不发布自己的诊断记录。它用下列返回值来报告它自己的执行结果: + +- SQL\_SUCCESS:函数成功返回诊断信息。 +- SQL\_SUCCESS\_WITH\_INFO:\*MessageText太小以致不能容纳所请求的诊断信息。没有诊断记录生成。 +- SQL\_INVALID\_HANDLE:由HandType和Handle所指出的句柄是不合法句柄。 +- SQL\_ERROR:RecNumber小于等于0或BufferLength小于0。 + +如果调用ODBC函数返回SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO,可调用SQLGetDiagRec返回诊断信息值SQLSTATE,SQLSTATE值的如下表。 + +**表 2** SQLSTATE值 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

SQLSATATE

+

错误

+

描述

+

HY000

+

一般错误

+

未定义特定的SQLSTATE所产生的一个错误。

+

HY001

+

内存分配错误

+

驱动程序不能分配所需要的内存来支持函数的执行或完成。

+

HY008

+

取消操作

+

调用SQLCancel取消执行语句后,依然在StatementHandle上调用函数。

+

HY010

+

函数系列错误

+

在为执行中的所有数据参数或列发送数据前就调用了执行函数。

+

HY013

+

内存管理错误

+

不能处理函数调用,可能由当前内存条件差引起。

+

HYT01

+

连接超时

+

数据源响应请求之前,连接超时。

+

IM001

+

驱动程序不支持此函数

+

调用了StatementHandle相关的驱动程序不支持的函数

+
+ +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLPrepare.md b/content/zh/docs/Developerguide/SQLPrepare.md new file mode 100644 index 000000000..eedc796ba --- /dev/null +++ b/content/zh/docs/Developerguide/SQLPrepare.md @@ -0,0 +1,59 @@ +# SQLPrepare + +## 功能描述 + +准备一个将要进行的SQL语句。 + +## 原型 + +``` +SQLRETURN SQLPrepare(SQLHSTMT StatementHandle, + SQLCHAR *StatementText, + SQLINTEGER TextLength); +``` + +## 参数 + +**表 1** SQLPrepare参数 + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄。

+

StatementText

+

SQL文本串。

+

TextLength

+

StatementText的长度。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 +- SQL\_STILL\_EXECUTING:表示语句正在执行。 + +## 注意事项 + +当SQLPrepare返回的值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)函数,并将HandleType和Handle参数分别设置为SQL\_HANDLE\_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLSetConnectAttr.md b/content/zh/docs/Developerguide/SQLSetConnectAttr.md new file mode 100644 index 000000000..db4f85d73 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLSetConnectAttr.md @@ -0,0 +1,64 @@ +# SQLSetConnectAttr + +## 功能描述 + +设置控制连接各方面的属性。 + +## 原型 + +``` +SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle + SQLINTEGER Attribute, + SQLPOINTER ValuePtr, + SQLINTEGER StringLength); +``` + +## 参数 + +**表 1** SQLSetConnectAttr参数 + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

ConnectionHandle

+

连接句柄。

+

Attribute

+

设置属性。

+

ValuePtr

+

指向对应Attribute的值。依赖于Attribute的值,ValuePtr是32位无符号整型值或指向以空结束的字符串。注意,如果ValuePtr参数是驱动程序指定值。ValuePtr可能是有符号的整数。

+

StringLength

+

如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当SQLSetConnectAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_DBC的HandleType和ConnectionHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLSetEnvAttr.md b/content/zh/docs/Developerguide/SQLSetEnvAttr.md new file mode 100644 index 000000000..bd3551d45 --- /dev/null +++ b/content/zh/docs/Developerguide/SQLSetEnvAttr.md @@ -0,0 +1,65 @@ +# SQLSetEnvAttr + +## 功能描述 + +设置控制环境各方面的属性。 + +## 原型 + +``` +SQLRETURN SQLSetEnvAttr(SQLHENV EnvironmentHandle + SQLINTEGER Attribute, + SQLPOINTER ValuePtr, + SQLINTEGER StringLength); +``` + +## 参数 + +**表 1** SQLSetEnvAttr参数 + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

EnvironmentHandle

+

环境句柄。

+

Attribute

+

需设置的环境属性,可为如下值:

+
  • SQL_ATTR_ODBC_VERSION:指定ODBC版本。
  • SQL_CONNECTION_POOLING:连接池属性。
  • SQL_OUTPUT_NTS:指明驱动器返回字符串的形式。
+

ValuePtr

+

指向对应Attribute的值。依赖于Attribute的值,ValuePtr可能是32位整型值,或为以空结束的字符串。

+

StringLength

+

如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当SQLSetEnvAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_ENV的HandleType和EnvironmentHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + diff --git a/content/zh/docs/Developerguide/SQLSetStmtAttr.md b/content/zh/docs/Developerguide/SQLSetStmtAttr.md new file mode 100644 index 000000000..c080ea01b --- /dev/null +++ b/content/zh/docs/Developerguide/SQLSetStmtAttr.md @@ -0,0 +1,64 @@ +# SQLSetStmtAttr + +## 功能描述 + +设置相关语句的属性。 + +## 原型 + +``` +SQLRETURN SQLSetStmtAttr(SQLHSTMT StatementHandle + SQLINTEGER Attribute, + SQLPOINTER ValuePtr, + SQLINTEGER StringLength); +``` + +## 参数 + +**表 1** SQLSetStmtAttr参数 + + + + + + + + + + + + + + + + + + + +

关键字

+

参数说明

+

StatementHandle

+

语句句柄。

+

Attribute

+

需设置的属性。

+

ValuePtr

+

指向对应Attribute的值。依赖于Attribute的值,ValuePtr可能是32位无符号整型值,或指向以空结束的字符串,二进制缓冲区,或者驱动定义值。注意,如果ValuePtr参数是驱动程序指定值。ValuePtr可能是有符号的整数。

+

StringLength

+

如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。

+
+ +## 返回值 + +- SQL\_SUCCESS:表示调用正确。 +- SQL\_SUCCESS\_WITH\_INFO:表示会有一些警告信息。 +- SQL\_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 +- SQL\_INVALID\_HANDLE:表示调用无效句柄。其他API的返回值同理。 + +## 注意事项 + +当SQLSetStmtAttr的返回值为SQL\_ERROR或SQL\_SUCCESS\_WITH\_INFO时,通过借助SQL\_HANDLE\_STMT的HandleType和StatementHandle的Handle,调用[SQLGetDiagRec](SQLGetDiagRec.md#ZH-CN_TOPIC_0242371454)可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。 + +## 示例 + +参见:[示例](示例.md#ZH-CN_TOPIC_0242377033) + 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" new file mode 100644 index 000000000..5599c7dfd --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\345\217\202\350\200\203.md" @@ -0,0 +1,33 @@ +# SQL参考 + +- **[openGauss SQL](openGauss-SQL.md)** + +- **[关键字](关键字.md)** + +- **[数据类型](数据类型.md)** + +- **[常量与宏](常量与宏.md)** + +- **[函数和操作符](函数和操作符.md)** + +- **[表达式](表达式.md)** + +- **[类型转换](类型转换.md)** + +- **[全文检索](全文检索.md)** + +- **[系统操作](系统操作.md)** + +- **[事务控制](事务控制.md)** + +- **[DDL语法一览表](DDL语法一览表.md)** + +- **[DML语法一览表](DML语法一览表.md)** + +- **[DCL语法一览表](DCL语法一览表.md)** + +- **[SQL语法](SQL语法.md)** + +- **[附录](附录-16.md)** + + 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/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" new file mode 100644 index 000000000..67d719811 --- /dev/null +++ "b/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" @@ -0,0 +1,11 @@ +# SQL执行时间预测特性 + +- **[概述](概述-14.md)** + +- **[使用指南](使用指南.md)** + +- **[最佳实践](最佳实践.md)** + +- **[常见问题处理](常见问题处理.md)** + + 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" new file mode 100644 index 000000000..284266fcb --- /dev/null +++ "b/content/zh/docs/Developerguide/SQL\350\257\255\346\263\225.md" @@ -0,0 +1,229 @@ +# SQL语法 + +- **[ABORT](ABORT.md)** + +- **[ALTER DATABASE](ALTER-DATABASE.md)** + +- **[ALTER DATA SOURCE](ALTER-DATA-SOURCE.md)** + +- **[ALTER DEFAULT PRIVILEGES](ALTER-DEFAULT-PRIVILEGES.md)** + +- **[ALTER DIRECTORY](ALTER-DIRECTORY.md)** + +- **[ALTER FUNCTION](ALTER-FUNCTION.md)** + +- **[ALTER GROUP](ALTER-GROUP.md)** + +- **[ALTER INDEX](ALTER-INDEX.md)** + +- **[ALTER LARGE OBJECT](ALTER-LARGE-OBJECT.md)** + +- **[ALTER ROLE](ALTER-ROLE.md)** + +- **[ALTER ROW LEVEL SECURITY POLICY](ALTER-ROW-LEVEL-SECURITY-POLICY.md)** + +- **[ALTER SCHEMA](ALTER-SCHEMA.md)** + +- **[ALTER SEQUENCE](ALTER-SEQUENCE.md)** + +- **[ALTER SESSION](ALTER-SESSION.md)** + +- **[ALTER SYSTEM KILL SESSION](ALTER-SYSTEM-KILL-SESSION.md)** + +- **[ALTER TABLE](ALTER-TABLE.md)** + +- **[ALTER TABLE PARTITION](ALTER-TABLE-PARTITION.md)** + +- **[ALTER TABLESPACE](ALTER-TABLESPACE.md)** + +- **[ALTER TEXT SEARCH CONFIGURATION](ALTER-TEXT-SEARCH-CONFIGURATION.md)** + +- **[ALTER TEXT SEARCH DICTIONARY](ALTER-TEXT-SEARCH-DICTIONARY.md)** + +- **[ALTER TRIGGER](ALTER-TRIGGER.md)** + +- **[ALTER TYPE](ALTER-TYPE.md)** + +- **[ALTER USER](ALTER-USER.md)** + +- **[ALTER VIEW](ALTER-VIEW.md)** + +- **[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md)** + +- **[BEGIN](BEGIN.md)** + +- **[CALL](CALL.md)** + +- **[CHECKPOINT](CHECKPOINT.md)** + +- **[CLOSE](CLOSE.md)** + +- **[CLUSTER](CLUSTER.md)** + +- **[COMMENT](COMMENT.md)** + +- **[COMMIT | END](COMMIT-END.md)** + +- **[COMMIT PREPARED](COMMIT-PREPARED.md)** + +- **[COPY](COPY.md)** + +- **[CREATE DATABASE](CREATE-DATABASE.md)** + +- **[CREATE DATA SOURCE](CREATE-DATA-SOURCE.md)** + +- **[CREATE DIRECTORY](CREATE-DIRECTORY.md)** + +- **[CREATE FUNCTION](CREATE-FUNCTION.md)** + +- **[CREATE GROUP](CREATE-GROUP.md)** + +- **[CREATE INDEX](CREATE-INDEX.md)** + +- **[CREATE ROW LEVLEL SECURITY POLICY](CREATE-ROW-LEVLEL-SECURITY-POLICY.md)** + +- **[CREATE PROCEDURE](CREATE-PROCEDURE.md)** + +- **[CREATE ROLE](CREATE-ROLE.md)** + +- **[CREATE SCHEMA](CREATE-SCHEMA.md)** + +- **[CREATE SEQUENCE](CREATE-SEQUENCE.md)** + +- **[CREATE TABLE](CREATE-TABLE.md)** + +- **[CREATE TABLE AS](CREATE-TABLE-AS.md)** + +- **[CREATE TABLE PARTITION](CREATE-TABLE-PARTITION.md)** + +- **[CREATE TABLESPACE](CREATE-TABLESPACE.md)** + +- **[CREATE TEXT SEARCH CONFIGURATION](CREATE-TEXT-SEARCH-CONFIGURATION.md)** + +- **[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md)** + +- **[CREATE TRIGGER](CREATE-TRIGGER.md)** + +- **[CREATE TYPE](CREATE-TYPE.md)** + +- **[CREATE USER](CREATE-USER.md)** + +- **[CREATE VIEW](CREATE-VIEW.md)** + +- **[CURSOR](CURSOR.md)** + +- **[DEALLOCATE](DEALLOCATE.md)** + +- **[DECLARE](DECLARE.md)** + +- **[DELETE](DELETE.md)** + +- **[DO](DO.md)** + +- **[DROP DATABASE](DROP-DATABASE.md)** + +- **[DROP DATA SOURCE](DROP-DATA-SOURCE.md)** + +- **[DROP DIRECTORY](DROP-DIRECTORY.md)** + +- **[DROP FUNCTION](DROP-FUNCTION.md)** + +- **[DROP GROUP](DROP-GROUP.md)** + +- **[DROP INDEX](DROP-INDEX.md)** + +- **[DROP OWNED](DROP-OWNED.md)** + +- **[DROP ROW LEVEL SECURITY POLICY](DROP-ROW-LEVEL-SECURITY-POLICY.md)** + +- **[DROP PROCEDURE](DROP-PROCEDURE.md)** + +- **[DROP ROLE](DROP-ROLE.md)** + +- **[DROP SCHEMA](DROP-SCHEMA.md)** + +- **[DROP SEQUENCE](DROP-SEQUENCE.md)** + +- **[DROP TABLE](DROP-TABLE.md)** + +- **[DROP TABLESPACE](DROP-TABLESPACE.md)** + +- **[DROP TEXT SEARCH CONFIGURATION](DROP-TEXT-SEARCH-CONFIGURATION.md)** + +- **[DROP TEXT SEARCH DICTIONARY](DROP-TEXT-SEARCH-DICTIONARY.md)** + +- **[DROP TRIGGER](DROP-TRIGGER.md)** + +- **[DROP TYPE](DROP-TYPE.md)** + +- **[DROP USER](DROP-USER.md)** + +- **[DROP VIEW](DROP-VIEW.md)** + +- **[EXECUTE](EXECUTE.md)** + +- **[EXPLAIN](EXPLAIN.md)** + +- **[EXPLAIN PLAN](EXPLAIN-PLAN.md)** + +- **[FETCH](FETCH.md)** + +- **[GRANT](GRANT.md)** + +- **[INSERT](INSERT.md)** + +- **[LOCK](LOCK.md)** + +- **[MOVE](MOVE.md)** + +- **[MERGE INTO](MERGE-INTO.md)** + +- **[PREPARE](PREPARE.md)** + +- **[PREPARE TRANSACTION](PREPARE-TRANSACTION.md)** + +- **[REASSIGN OWNED](REASSIGN-OWNED.md)** + +- **[REINDEX](REINDEX.md)** + +- **[RELEASE SAVEPOINT](RELEASE-SAVEPOINT.md)** + +- **[RESET](RESET.md)** + +- **[REVOKE](REVOKE.md)** + +- **[ROLLBACK](ROLLBACK.md)** + +- **[ROLLBACK PREPARED](ROLLBACK-PREPARED.md)** + +- **[ROLLBACK TO SAVEPOINT](ROLLBACK-TO-SAVEPOINT.md)** + +- **[SAVEPOINT](SAVEPOINT.md)** + +- **[SELECT](SELECT.md)** + +- **[SELECT INTO](SELECT-INTO.md)** + +- **[SET](SET.md)** + +- **[SET CONSTRAINTS](SET-CONSTRAINTS.md)** + +- **[SET ROLE](SET-ROLE.md)** + +- **[SET SESSION AUTHORIZATION](SET-SESSION-AUTHORIZATION.md)** + +- **[SET TRANSACTION](SET-TRANSACTION.md)** + +- **[SHOW](SHOW.md)** + +- **[START TRANSACTION](START-TRANSACTION.md)** + +- **[TRUNCATE](TRUNCATE.md)** + +- **[UPDATE](UPDATE.md)** + +- **[VACUUM](VACUUM.md)** + +- **[VALUES](VALUES.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" new file mode 100644 index 000000000..18cafffc9 --- /dev/null +++ "b/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206-6.md" @@ -0,0 +1,9 @@ +# 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" new file mode 100644 index 000000000..a0916fa9c --- /dev/null +++ "b/content/zh/docs/Developerguide/SSL\350\257\201\344\271\246\347\256\241\347\220\206.md" @@ -0,0 +1,9 @@ +# SSL证书管理 + +openGauss默认配置了通过openssl生成的安全证书、私钥。并且提供证书替换的接口,方便用户进行证书的替换。 + +- **[证书生成](证书生成.md)** + +- **[证书替换](证书替换.md)** + + diff --git a/content/zh/docs/Developerguide/START-TRANSACTION.md b/content/zh/docs/Developerguide/START-TRANSACTION.md new file mode 100644 index 000000000..cab33dd78 --- /dev/null +++ b/content/zh/docs/Developerguide/START-TRANSACTION.md @@ -0,0 +1,84 @@ +# START TRANSACTION + +## 功能描述 + +通过START TRANSACTION启动事务。如果声明了隔离级别、读写模式,那么新事务就使用这些特性,类似执行了[SET TRANSACTION](SET-TRANSACTION.md)。 + +## 注意事项 + +无。 + +## 语法格式 + +格式一:START TRANSACTION格式 + +``` +START TRANSACTION + [ + { + ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + | { READ WRITE | READ ONLY } + } [, ...] + ]; +``` + +格式二:BEGIN格式 + +``` +BEGIN [ WORK | TRANSACTION ] + [ + { + ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } + | { READ WRITE | READ ONLY } + } [, ...] + ]; +``` + +## 参数说明 + +- **WORK | TRANSACTION** + + BEGIN格式中的可选关键字,没有实际作用。 + +- **ISOLATION LEVEL** + + 指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 + + 取值范围: + + - READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 + - READ UNCOMMITTED:读未提交隔离级别,可能会读到未提交的数据。建议这种隔离级别下仅作只读操作,避免造成数据不一致。 + - REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 + - SERIALIZABLE:openGauss目前功能上不支持此隔离级别,等价于REPEATABLE READ。 + +- **READ WRITE | READ ONLY** + + 指定事务访问模式(读/写或者只读)。 + + +## 示例 + +``` +--以默认方式启动事务。 +postgres=# START TRANSACTION; +postgres=# SELECT * FROM tpcds.reason; +postgres=# END; + +--以默认方式启动事务。 +postgres=# BEGIN; +postgres=# SELECT * FROM tpcds.reason; +postgres=# END; + +--以隔离级别为READ COMMITTED,读/写方式启动事务。 +postgres=# START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE; +postgres=# SELECT * FROM tpcds.reason; +postgres=# COMMIT; +``` + +## 相关链接 + +[COMMIT | END](COMMIT-END.md),[ROLLBACK](ROLLBACK.md),[SET TRANSACTION](SET-TRANSACTION.md) + diff --git a/content/zh/docs/Developerguide/Schema.md b/content/zh/docs/Developerguide/Schema.md new file mode 100644 index 000000000..f9bd93344 --- /dev/null +++ b/content/zh/docs/Developerguide/Schema.md @@ -0,0 +1,63 @@ +# Schema + +Schema又称作模式。通过管理Schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的Schema下而不引起冲突。 + +每个数据库包含一个或多个Schema。数据库中的每个Schema包含表和其他类型的对象。数据库创建初始,默认具有一个名为public的Schema,且所有用户都拥有此Schema的权限。可以通过Schema分组数据库对象。Schema类似于操作系统目录,但Schema不能嵌套。 + +相同的数据库对象名称可以应用在同一数据库的不同Schema中,而没有冲突。例如,a\_schema和b\_schema都可以包含名为mytable的表。具有所需权限的用户可以访问数据库的多个Schema中的对象。 + +在初始数据库postgres中创建用户时,系统会自动帮助用户创建一个同名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内创建表,请以schema\_name.table\_name格式创建表。不指定schema\_name时,对象默认创建到[搜索路径](#zh-cn_topic_0237121104_zh-cn_topic_0156599225_section03655314403)中的第一个Schema内。 +- 要查看Schema所有者,请对系统表PG\_NAMESPACE和PG\_USER执行如下关联查询。语句中的schema\_name请替换为实际要查找的Schema名称。 + + ``` + postgres=# SELECT s.nspname,u.usename AS nspowner FROM pg_namespace s, pg_user u WHERE nspname='schema_name' AND s.nspowner = u.usesysid; + ``` + +- 要查看所有Schema的列表,请查询PG\_NAMESPACE系统表。 + + ``` + postgres=# SELECT * FROM pg_namespace; + ``` + +- 要查看属于某Schema下的表列表,请查询系统视图PG\_TABLES。例如,以下查询会返回Schema PG\_CATALOG中的表列表。 + + ``` + postgres=# SELECT distinct(tablename),schemaname from pg_tables where schemaname = 'pg_catalog'; + ``` + + +## 搜索路径 + +搜索路径定义在[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)。 + + ``` + postgres=# SHOW SEARCH_PATH; + search_path + ---------------- + "$user",public + (1 row) + ``` + + search\_path参数的默认值为:"$user",public。$user表示与当前会话用户名同名的Schema名,如果这样的模式不存在,$user将被忽略。所以默认情况下,用户连接数据库后,如果数据库下存在同名Schema,则对象会添加到同名Schema下,否则对象被添加到Public Schema下。 + +- 要更改当前会话的默认Schema,请使用SET命令。 + + 执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。 + + ``` + postgres=# SET SEARCH_PATH TO myschema, public; + SET + ``` + + 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" new file mode 100644 index 000000000..cd5a72baf --- /dev/null +++ "b/content/zh/docs/Developerguide/Simple\350\257\215\345\205\270.md" @@ -0,0 +1,59 @@ +# Simple词典 + +Simple词典首先将输入标记转换为小写字母,然后检查停用词表。如果识别为停用词则返回空数组,即表示该标记会被丢弃。否则,输入标记的小写形式作为规范化后的lexeme返回。此外,Simple词典可通过设置参数Accept为false(默认值true),将非停用词报告为未识别,传递给后继词典继续处理。 + +## 注意事项 + +- 大多数词典的功能依赖于词典定义文件,词典定义文件名仅支持小写字母、数字、下划线组合。 +- 临时模式pg\_temp下不允许创建词典。 +- 词典定义文件的字符集编码必须为UTF-8格式。实际应用时,如果与数据库的字符编码格式不一致,在读入词典定义文件时会进行编码转换。 +- 通常情况下,每个session仅读取词典定义文件一次,当且仅当在第一次使用该词典时。需要修改词典文件时,可通过ALTER TEXT SEARCH DICTIONARY命令进行词典定义文件的更新和重新加载。 + +## 操作步骤 + +1. 创建Simple词典。 + + ``` + postgres=# CREATE TEXT SEARCH DICTIONARY public.simple_dict ( + TEMPLATE = pg_catalog.simple, + STOPWORDS = english + ); + ``` + + 其中,停用词表文件全名为english.stop。关于创建simple词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + +2. 使用Simple词典。 + + ``` + postgres=# SELECT ts_lexize('public.simple_dict','YeS'); + ts_lexize + ----------- + {yes} + (1 row) + + postgres=# SELECT ts_lexize('public.simple_dict','The'); + ts_lexize + ----------- + {} + (1 row) + ``` + +3. 设置参数ACCEPT=false,使Simple词典返回NULL,而不是返回非停用词的小写形式。 + + ``` + postgres=# ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false ); + ALTER TEXT SEARCH DICTIONARY + postgres=# SELECT ts_lexize('public.simple_dict','YeS'); + ts_lexize + ----------- + + (1 row) + + postgres=# SELECT ts_lexize('public.simple_dict','The'); + ts_lexize + ----------- + {} + (1 row) + ``` + + 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" new file mode 100644 index 000000000..23529ea58 --- /dev/null +++ "b/content/zh/docs/Developerguide/Snowball\350\257\215\345\205\270.md" @@ -0,0 +1,8 @@ +# Snowball词典 + +Snowball词典模板支持词干分析词典,基于Martin Porter的Snowball项目,内置有许多语言的词干分析算法。openGauss中预定义有多种语言的Snowball词典,可通过系统表[PG\_TS\_DICT](PG_TS_DICT.md#ZH-CN_TOPIC_0242385852)查看预定义的词干分析词典以及支持的语言词干分析算法。 + +无论是否可以简化,Snowball词典将标示所有输入为已识别,因此它应当被放置在词典列表的最后。把Snowball词典放在任何其他词典前面会导致后继词典失效,因为输入token不会通过Snowball词典进入到下一个词典。 + +关于Snowball词典的语法,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + 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" new file mode 100644 index 000000000..38de7b7cf --- /dev/null +++ "b/content/zh/docs/Developerguide/Synonym\350\257\215\345\205\270.md" @@ -0,0 +1,111 @@ +# Synonym词典 + +Synonym词典用于定义、识别token的同义词并转化,不支持词组(词组形式的同义词可用Thesaurus词典定义,详细请参见[Thesaurus词典](Thesaurus词典.md#ZH-CN_TOPIC_0242370502))。 + +## 示例 + +- Synonym词典可用于解决语言学相关问题,例如,为避免使单词"Paris"变成"pari",可在Synonym词典文件中定义一行"Paris paris",并将该词典放置在预定义的english\_stem词典之前。 + + ``` + postgres=# SELECT * FROM ts_debug('english', 'Paris'); + alias | description | token | dictionaries | dictionary | lexemes + -----------+-----------------+-------+----------------+--------------+--------- + asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari} + (1 row) + + postgres=# CREATE TEXT SEARCH DICTIONARY my_synonym ( + TEMPLATE = synonym, + SYNONYMS = my_synonyms, + FILEPATH = 'file:///home/dicts/' + ); + + postgres=# ALTER TEXT SEARCH CONFIGURATION english + ALTER MAPPING FOR asciiword + WITH my_synonym, english_stem; + + postgres=# SELECT * FROM ts_debug('english', 'Paris'); + alias | description | token | dictionaries | dictionary | lexemes + -----------+-----------------+-------+---------------------------+------------+--------- + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} + (1 row) + + postgres=# SELECT * FROM ts_debug('english', 'paris'); + alias | description | token | dictionaries | dictionary | lexemes + -----------+-----------------+-------+---------------------------+------------+--------- + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} + (1 row) + + postgres=# ALTER TEXT SEARCH DICTIONARY my_synonym ( CASESENSITIVE=true); + + postgres=# SELECT * FROM ts_debug('english', 'Paris'); + alias | description | token | dictionaries | dictionary | lexemes + -----------+-----------------+-------+---------------------------+------------+--------- + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} + (1 row) + + postgres=# SELECT * FROM ts_debug('english', 'paris'); + alias | description | token | dictionaries | dictionary | lexemes + -----------+-----------------+-------+---------------------------+------------+--------- + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {pari} + (1 row) + + ``` + + 其中,同义词词典文件全名为my\_synonyms.syn,所在目录为当前连接数据库主节点的/home/dicts/下。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + +- 星号(\*)可用于词典文件中的同义词结尾,表示该同义词是一个前缀。在to\_tsvector\(\)中该星号将被忽略,但在to\_tsquery\(\)中会匹配该前缀并对应输出结果(参照[处理查询](处理查询.md#ZH-CN_TOPIC_0242370493)一节)。 + + 假设词典文件synonym\_sample.syn内容如下: + + ``` + postgres pgsql + postgresql pgsql + postgre pgsql + gogle googl + indices index* + ``` + + 创建并使用词典: + + ``` + postgres=# CREATE TEXT SEARCH DICTIONARY syn ( + TEMPLATE = synonym, + SYNONYMS = synonym_sample + ); + + postgres=# SELECT ts_lexize('syn','indices'); + ts_lexize + ----------- + {index} + (1 row) + + postgres=# CREATE TEXT SEARCH CONFIGURATION tst (copy=simple); + + postgres=# ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn; + + postgres=# SELECT to_tsvector('tst','indices'); + to_tsvector + ------------- + 'index':1 + (1 row) + + postgres=# SELECT to_tsquery('tst','indices'); + to_tsquery + ------------ + 'index':* + (1 row) + + postgres=# SELECT 'indexes are very useful'::tsvector; + tsvector + --------------------------------- + 'are' 'indexes' 'useful' 'very' + (1 row) + + postgres=# SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst','indices'); + ?column? + ---------- + t + (1 row) + ``` + + diff --git a/content/zh/docs/Developerguide/TRUNCATE.md b/content/zh/docs/Developerguide/TRUNCATE.md new file mode 100644 index 000000000..fc8d79c7f --- /dev/null +++ b/content/zh/docs/Developerguide/TRUNCATE.md @@ -0,0 +1,123 @@ +# TRUNCATE + +## 功能描述 + +清理表数据,TRUNCATE快速地从表中删除所有行。 + +它和在目标表上进行无条件的DELETE有同样的效果,但由于TRUNCATE不做表扫描,因而快得多。在大表上操作效果更明显。 + +## 注意事项 + +- TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同:二者均删除表中的全部行。 +- TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少: + - DELETE语句每次删除一行,并在事务日志中为所删除每行记录一项。 + - TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放。 + +- TRUNCATE,DELETE,DROP三者的差异如下: + - TRUNCATE TABLE,删除内容,释放空间,但不删除定义。 + - DELETE TABLE,删除内容,不删除定义,不释放空间。 + - DROP TABLE,删除内容和定义,释放空间。 + + +## 语法格式 + +- 清理表数据。 + +``` +TRUNCATE [ TABLE ] [ ONLY ] {table_name [ * ]} [, ... ] + [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]; +``` + +- 清理表分区的数据。 + +``` +ALTER TABLE [ IF EXISTS ] { [ ONLY ] table_name + | table_name * + | ONLY ( table_name ) } + TRUNCATE PARTITION { partition_name + | FOR ( partition_value [, ...] ) } ; +``` + +## 参数说明 + +- **ONLY** + + 如果声明ONLY,只有指定的表会被清空。如果没有声明ONLY,这个表以及其所有子表(若有)会被清空。 + +- **table\_name** + + 目标表的名称(可以有模式修饰)。 + + 取值范围:已存在的表名。 + +- **CONTINUE IDENTITY** + + 不改变序列的值。这是缺省值。 + +- **CASCADE | RESTRICT** + - CASCADE:级联清空所有在该表上有外键引用的表,或者由于CASCADE而被添加到组中的表。 + - RESTRICT(缺省值):如果其他表在该表上有外键引用则拒绝清空。 + +- **partition\_name** + + 目标分区表的分区名。 + + 取值范围:已存在的分区名。 + +- **partition\_value** + + 指定的分区键值。 + + 通过PARTITION FOR子句指定的这一组值,可以唯一确定一个分区。 + + 取值范围:需要进行删除数据分区的分区键的取值范围。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >使用PARTITION FOR子句时,partition\_value所在的整个分区会被清空。 + + +## 示例 + +``` +--创建表。 +postgres=# CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason; + +--清空表tpcds.reason_t1。 +postgres=# TRUNCATE TABLE tpcds.reason_t1; + +--删除表。 +postgres=# DROP TABLE tpcds.reason_t1; +``` + +``` +--创建分区表。 +postgres=# CREATE TABLE tpcds.reason_p +( + r_reason_sk integer, + r_reason_id character(16), + r_reason_desc character(100) +)PARTITION BY RANGE (r_reason_sk) +( + partition p_05_before values less than (05), + partition p_15 values less than (15), + partition p_25 values less than (25), + partition p_35 values less than (35), + partition p_45_after values less than (MAXVALUE) +); + +--插入数据。 +postgres=# INSERT INTO tpcds.reason_p SELECT * FROM tpcds.reason; + +--清空分区p_05_before。 +postgres=# ALTER TABLE tpcds.reason_p TRUNCATE PARTITION p_05_before; + +--清空分区p_15。 +postgres=# ALTER TABLE tpcds.reason_p TRUNCATE PARTITION for (13); + +--清空分区表。 +postgres=# TRUNCATE TABLE tpcds.reason_p; + +--删除表。 +postgres=# DROP TABLE tpcds.reason_p; +``` + 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" new file mode 100644 index 000000000..ff996e0cf --- /dev/null +++ "b/content/zh/docs/Developerguide/Thesaurus\350\257\215\345\205\270.md" @@ -0,0 +1,87 @@ +# Thesaurus词典 + +Thesaurus词典,也叫做分类词典(缩写为TZ),是一组定义了词以及词组间关系的集合,包括广义词(BT)、狭义词(NT)、首选词、非首选词、相关词等。根据词典文件中的定义,TZ词典用一个指定的短语替换对应匹配的所有短语,并且可选择保留原始短语进行索引。TZ词典实际上是Synonym词典的一个扩展,增加了短语支持。 + +## 注意事项 + +- 由于TZ词典需要识别短语,所以在处理过程中必须保存当前状态并与解析器进行交互,以决定是否处理下一个token或是结束当前识别。此外,TZ词典配置时需谨慎,如果设置TZ词典仅处理asciiword类型的token,则类似one 7的分类词典定义将不会生效,因为uint类型的token不会传给TZ词典处理。 +- 在索引期间要用到分类词典,因此分类词典参数中的任何变化都要求重新索引。对于其他大多数类型的词典来说,类似添加或删除停用词这种修改并不需要强制重新索引。 + +## 操作步骤 + +1. 创建一个名为thesaurus\_astro的TZ词典。 + + 以一个简单的天文学词典thesaurus\_astro为例,其中定义了两组天文短语及其同义词如下: + + ``` + supernovae stars : sn + crab nebulae : crab + ``` + + 执行如下语句创建TZ词典: + + ``` + postgres=# CREATE TEXT SEARCH DICTIONARY thesaurus_astro ( + TEMPLATE = thesaurus, + DictFile = thesaurus_astro, + Dictionary = pg_catalog.english_stem, + FILEPATH = 'file:///home/dicts/' + ); + ``` + + 其中,词典定义文件全名为thesaurus\_astro.ths,所在目录为当前连接数据库主节点的/home/dicts/下 。子词典pg\_catalog.english\_stem是预定义的Snowball类型的英语词干词典,用于规范化输入词,子词典自身相关配置(例如停用词等)不在此处显示。关于创建词典的语法和更多参数,请参见[CREATE TEXT SEARCH DICTIONARY](CREATE-TEXT-SEARCH-DICTIONARY.md#ZH-CN_TOPIC_0242370586)。 + +2. 创建词典后,将其绑定到对应文本搜索配置中需要处理的token类型上: + + ``` + postgres=# ALTER TEXT SEARCH CONFIGURATION russian + ALTER MAPPING FOR asciiword, asciihword, hword_asciipart + WITH thesaurus_astro, english_stem; + ``` + +3. 使用TZ词典。 + - 测试TZ词典。 + + ts\_lexize函数对于测试TZ词典作用不大,因为该函数是按照单个token处理输入。可以使用plainto\_tsquery、to\_tsvector、to\_tsquery函数测试TZ词典,这些函数能够将输入分解成多个token(to\_tsquery函数需要将输入加上引号)。 + + ``` + postgres=# SELECT plainto_tsquery('russian','supernova star'); + plainto_tsquery + ----------------- + 'sn' + (1 row) + + postgres=# SELECT to_tsvector('russian','supernova star'); + to_tsvector + ------------- + 'sn':1 + (1 row) + + postgres=# SELECT to_tsquery('russian','''supernova star'''); + to_tsquery + ------------ + 'sn' + (1 row) + + ``` + + 其中,supernova star匹配了词典thesaurus\_astro定义中的supernovae stars,这是因为在thesaurus\_astro词典定义中指定了Snowball类型的子词典english\_stem,该词典移除了e和s。 + + - 如果同时需要索引原始短语,只要将其同时放置在词典定义文件中对应定义的右侧即可,如下: + + ``` + supernovae stars : sn supernovae stars + + postgres=# ALTER TEXT SEARCH DICTIONARY thesaurus_astro ( + DictFile = thesaurus_astro, + FILEPATH = 'file:///home/dicts/'); + + postgres=# SELECT plainto_tsquery('russian','supernova star'); + plainto_tsquery + ----------------------------- + 'sn' & 'supernova' & 'star' + (1 row) + ``` + + + diff --git "a/content/zh/docs/Developerguide/UNION-CASE\345\222\214\347\233\270\345\205\263\346\236\204\351\200\240.md" "b/content/zh/docs/Developerguide/UNION-CASE\345\222\214\347\233\270\345\205\263\346\236\204\351\200\240.md" new file mode 100644 index 000000000..8355b05a3 --- /dev/null +++ "b/content/zh/docs/Developerguide/UNION-CASE\345\222\214\347\233\270\345\205\263\346\236\204\351\200\240.md" @@ -0,0 +1,115 @@ +# UNION,CASE和相关构造 + +SQL UNION构造必须把那些可能不太相似的类型匹配起来成为一个结果集。解析算法分别应用于联合查询的每个输出字段。INTERSECT和EXCEPT构造对不相同的类型使用和UNION相同的算法进行解析。CASE、ARRAY、VALUES、GREATEST和LEAST构造也使用同样的算法匹配它的部件表达式并且选择一个结果数据类型。 + +## UNION,CASE和相关构造解析 + +- 如果所有输入都是相同的类型,并且不是unknown类型,那么解析成这种类型。 +- 如果所有输入都是unknown类型则解析成text类型(字符串类型范畴的首选类型)。否则,忽略unknown输入。 +- 如果输入不属于同一个类型范畴,失败。(unknown类型除外) +- 如果输入类型是同一个类型范畴,则选择该类型范畴的首选类型。(例外:union操作会选择第一个分支的类型作为所选类型。) + + >![](public_sys-resources/icon-note.gif) **说明:** + >系统表pg\_type中typcategory表示数据类型范畴, typispreferred表示是否是typcategory分类中的首选类型。 + +- 把所有输入转换为所选的类型(对于字符串保持原有长度)。如果从给定的输入到所选的类型没有隐式转换则失败。 +- 若输入中含json、txid\_snapshot、sys\_refcursor或几何类型,则不能进行union。 + +## 对于case和coalesce,在TD兼容模式下的处理 + +- 如果所有输入都是相同的类型,并且不是unknown类型,那么解析成这种类型。 +- 如果所有输入都是unknown类型则解析成text类型。 +- 如果输入字符串(包括unknown,unknown当text来处理)和数字类型,那么解析成字符串类型,如果是其他不同的类型范畴,则报错。 +- 如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。 +- 把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。 + +## 示例 + +示例1:Union中的待定类型解析。这里,unknown类型文本'b'将被解析成text类型。 + +``` +postgres=# SELECT text 'a' AS "text" UNION SELECT 'b'; + text +------ + a + b +(2 rows) +``` + +示例2:简单Union中的类型解析。文本1.2的类型为numeric,而且integer类型的1可以隐含地转换为numeric,因此使用这个类型。 + +``` +postgres=# SELECT 1.2 AS "numeric" UNION SELECT 1; + numeric +--------- + 1 + 1.2 +(2 rows) +``` + +示例3:转置Union中的类型解析。这里,因为类型real不能被隐含转换成integer,但是integer可以隐含转换成real,那么联合的结果类型将是real。 + +``` +postgres=# SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL); + real +------ + 1 + 2.2 +(2 rows) +``` + +示例4:TD模式下,coalesce参数输入int和varchar类型,那么解析成varchar类型。ORA模式下会报错。 + +``` +--在A模式下,创建A兼容模式的数据库a_1。 +postgres=# CREATE DATABASE a_1 dbcompatibility = 'A'; + +--切换数据库为a_1。 +postgres=# \c a_1 + +--创建表t1。 +a_1=# CREATE TABLE t1(a int, b varchar(10)); + +--查看coalesce参数输入int和varchar类型的查询语句的执行计划。 +a_1=# EXPLAIN SELECT coalesce(a, b) FROM t1; +ERROR: COALESCE types integer and character varying cannot be matched +LINE 1: EXPLAIN SELECT coalesce(a, b) FROM t1; + ^ +CONTEXT: referenced column: coalesce + +--删除表。 +a_1=# DROP TABLE t1; + +--切换数据库为postgres。 +a_1=# \c postgres + +--在TD模式下,创建TD兼容模式的数据库td_1。 +postgres=# CREATE DATABASE td_1 dbcompatibility = 'C'; + +--切换数据库为td_1。 +postgres=# \c td_1 + +--创建表t2。 +td_1=# CREATE TABLE t2(a int, b varchar(10)); + +--查看coalesce参数输入int和varchar类型的查询语句的执行计划。 +td_1=# EXPLAIN VERBOSE select coalesce(a, b) from t2; + QUERY PLAN +--------------------------------------------------------------------------------------- + Data Node Scan (cost=0.00..0.00 rows=0 width=0) + Output: (COALESCE((t2.a)::character varying, t2.b)) + Node/s: All dbnodes + Remote query: SELECT COALESCE(a::character varying, b) AS "coalesce" FROM public.t2 +(4 rows) + +--删除表。 +td_1=# DROP TABLE t2; + +--切换数据库为postgres。 +td_1=# \c postgres + +--删除A和TD模式的数据库。 +postgres=# DROP DATABASE a_1; +postgres=# DROP DATABASE td_1; +``` + diff --git a/content/zh/docs/Developerguide/UPDATE.md b/content/zh/docs/Developerguide/UPDATE.md new file mode 100644 index 000000000..e10d1973a --- /dev/null +++ b/content/zh/docs/Developerguide/UPDATE.md @@ -0,0 +1,125 @@ +# UPDATE + +## 功能描述 + +更新表中的数据。UPDATE修改满足条件的所有行中指定的字段值,WHERE子句声明条件,SET子句指定的字段会被修改,没有出现的字段则保持它们的原值。 + +## 注意事项 + +- 要修改表,用户必须对该表有UPDATE权限。 +- 对expression或condition条件里涉及到的任何表要有SELECT权限。 +- 不允许对表的分布列(distribute column)进行修改。 +- 对于列存表,暂时不支持RETURNING子句。 +- 列存表不支持结果不确定的更新\(non-deterministic update\)。试图对列存表用多行数据更新一行时会报错。 +- 列存表的更新操作,旧记录空间不会回收,需要执行VACUUM FULL table\_name进行清理。 +- 对于列存复制表,暂不支持UPDATE操作。 + +## 语法格式 + +``` +UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] +SET {column_name = { expression | DEFAULT } + |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...] + [ FROM from_list] [ WHERE condition ] + [ RETURNING {* + | {output_expression [ [ AS ] output_name ]} [, ...] }]; + +where sub_query can be: +SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] +{ * | {expression [ [ AS ] output_name ]} [, ...] } +[ FROM from_item [, ...] ] +[ WHERE condition ] +[ GROUP BY grouping_element [, ...] ] +[ HAVING condition [, ...] ] +``` + +## 参数说明 + +- **table\_name** + + 要更新的表名,可以使用模式修饰。 + + 取值范围:已存在的表名称。 + +- **alias** + + 目标表的别名。 + + 取值范围:字符串,符合标识符命名规范。 + +- **column\_name** + + 要修改的字段名。 + + 支持使用目标表的别名加字段名来引用这个字段。例如: + + UPDATE foo AS f SET f.col\_name = 'postgres'; + + 取值范围:已存在的字段名。 + +- **expression** + + 赋给字段的值或表达式。 + +- **DEFAULT** + + 用对应字段的缺省值填充该字段。 + + 如果没有缺省值,则为NULL。 + +- **sub\_query** + + 子查询。 + + 使用同一数据库里其他表的信息来更新一个表可以使用子查询的方法。其中SELECT子句具体介绍请参考[SELECT](SELECT.md)。 + +- **from\_list** + + 一个表的表达式列表,允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >目标表绝对不能出现在from\_list里,除非在使用一个自连接(此时它必须以from\_list的别名出现)。 + +- **condition** + + 一个返回Boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。 + +- **output\_expression** + + 在所有需要更新的行都被更新之后,UPDATE命令用于计算返回值的表达式。 + + 取值范围:使用任何table以及FROM中列出的表的字段。\*表示返回所有字段。 + +- **output\_name** + + 字段的返回名称。 + + +## 示例 + +``` +--创建表student1。 +postgres=# CREATE TABLE student1 +( + stuno int, + classno int +) + +--插入数据。 +postgres=# INSERT INTO student1 VALUES(1,1); +postgres=# INSERT INTO student1 VALUES(2,2); +postgres=# INSERT INTO student1 VALUES(3,3); + +--查看数据。 +postgres=# SELECT * FROM student1; + +--直接更新所有记录的值。 +postgres=# UPDATE student1 SET classno = classno*2; + +--查看数据。 +postgres=# SELECT * FROM student1; + +--删除表。 +postgres=# DROP TABLE student1; +``` + diff --git "a/content/zh/docs/Developerguide/UUID\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/UUID\347\261\273\345\236\213.md" new file mode 100644 index 000000000..f4ab7e7bc --- /dev/null +++ "b/content/zh/docs/Developerguide/UUID\347\261\273\345\236\213.md" @@ -0,0 +1,23 @@ +# UUID类型 + +UUID数据类型用来存储RFC 4122,ISO/IEF 9834-8:2005以及相关标准定义的通用唯一标识符(UUID)。这个标识符是一个由算法产生的128位标识符,确保它不可能使用相同算法在已知的模块中产生的相同标识符。 + +因此,对分布式系统而言,这种标识符比序列能更好的保证唯一性,因为序列只能在单一数据库中保证是唯一。 + +UUID是一个小写十六进制数字的序列,由分字符分成几组,一组8位数字+三组4位数字+一组12位数字,总共32个数字代表128位,标准的UUID示例如下: + +``` +a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 +``` + +openGauss同样支持以其他方式输入:大写字母和数字、由花括号包围的标准格式、省略部分或所有连字符、在任意一组四位数字之后加一个连字符。示例: + +``` +A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11 +{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} +a0eebc999c0b4ef8bb6d6bb9bd380a11 +a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11 +``` + +一般是以标准格式输出。 + diff --git a/content/zh/docs/Developerguide/VACUUM.md b/content/zh/docs/Developerguide/VACUUM.md new file mode 100644 index 000000000..90abb60ab --- /dev/null +++ b/content/zh/docs/Developerguide/VACUUM.md @@ -0,0 +1,118 @@ +# VACUUM + +## 功能描述 + +VACUUM回收表或B-Tree索引中已经删除的行所占据的存储空间。在一般的数据库操作里,那些已经DELETE的行并没有从它们所属的表中物理删除;在完成VACUUM之前它们仍然存在。因此有必要周期地运行VACUUM,特别是在经常更新的表上。 + +## 注意事项 + +- 如果没有参数,VACUUM处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,VACUUM只处理指定的那个表。 +- 要对一个表进行VACUUM操作,通常用户必须是表的所有者或系统管理员。数据库的所有者允许对数据库中除了共享目录以外的所有表进行VACUUM操作(该限制意味着只有系统管理员才能真正对一个数据库进行VACUUM操作)。VACUUM命令会跳过那些用户没有权限的表进行垃圾回收操作。 +- VACUUM不能在事务块内执行。 +- 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的习惯。这样将更新系统目录为最近的更改,并且允许查询优化器在规划用户查询时有更好的选择。 +- 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL通常要比单纯的VACUUM收缩更多的表尺寸。FULL选项并不清理索引,所以推荐周期性的运行[REINDEX](REINDEX.md)命令。实际上,首先删除所有索引,再运行VACUUM FULL命令,最后重建索引通常是更快的选择。如果执行此命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有等其他活跃事务退出进行重试。 +- VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。 +- 如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。但是对于列存表执行VACUUM操作,指定了VERBOSE选项,无信息输出。 +- 当含有带括号的选项列表时,选项可以以任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。 +- VACUUM和VACUUM FULL时,会根据参数vacuum\_defer\_cleanup\_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。 +- VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。 +- 简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。 +- VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。 + +## 语法格式 + +- 回收空间并更新统计信息,对关键字顺序无要求。 + + ``` + VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ] + [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ]; + ``` + +- 仅回收空间,不更新统计信息。 + + ``` + VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ]; + ``` + +- 回收空间并更新统计信息,且对关键字顺序有要求。 + + ``` + VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] + [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ]; + ``` + + +## 参数说明 + +- **FULL** + + 选择“FULL”清理,这样可以恢复更多的空间,但是需要耗时更多,并且在表上施加了排他锁。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >使用FULL参数会导致统计信息丢失,如果需要收集统计信息,请在VACUUM FULL语句中加上analyze关键字。 + +- **FREEZE** + + 指定FREEZE相当于执行VACUUM时将vacuum\_freeze\_min\_age参数设为0。 + +- **VERBOSE** + + 为每个表打印一份详细的清理工作报告。 + +- **ANALYZE | ANALYSE** + + 更新用于优化器的统计信息,以决定执行查询的最有效方法。 + +- **table\_name** + + 要清理的表的名称(可以有模式修饰)。 + + 取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。 + +- **column\_name** + + 要分析的具体的字段名称。 + + 取值范围:要分析的具体的字段名称。缺省时为所有字段。 + +- **PARTITION** + + COMPACT和PARTITION参数不能同时使用。 + +- **partition\_name** + + 要清理的表的分区名称。缺省时为所有分区。 + +- **DELTAMERGE** + + 只针对列存表,将列存表的delta table中的数据转移到主表存储上。对列存表而言,此操作受[enable\_delta\_store](并行导入.md#zh-cn_topic_0237124705_section1035224982816)和[参数说明](CREATE-TABLE.md#zh-cn_topic_0237122117_zh-cn_topic_0059778169_s99cf2ac11c79436c93385e4efd7c4428)中的deltarow\_threshold控制。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >为了检查列存delta表中的信息,提供下述DFX函数,用于获取某个列存表的delta表中数据存储情况: + >- pgxc\_get\_delta\_info\(TEXT\),传入参数为列存表名,搜集并显示各个节点上的对应delta表信息,包括当前存活tuple数量、表大小、使用的最大block ID。 + >- get\_delta\_info\(TEXT\),传入参数为列存表名,汇总pgxc\_get\_delta\_info得到的结果,返回其delta表整体的当前存活tuple数量、表大小、使用的最大block ID。 + + +## 示例 + +``` +--在表tpcds.reason上创建索引 +CREATE UNIQUE INDEX ds_reason_index1 ON tpcds.reason(r_reason_sk); + +--对带索引的表tpcds.reason执行VACUUM操作。 +postgres=# VACUUM (VERBOSE, ANALYZE) tpcds.reason; + +--删除索引 +postgres=# DROP INDEX ds_reason_index1 CASCADE; +postgres=# DROP TABLE tpcds.reason; +``` + +## 优化建议 + +- vacuum + - VACUUM不能在事务块内执行。 + - 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录后,对相关表执行VACUUM ANALYZE命令。 + - 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如,一个例子就是在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。 + - 执行VACUUM FULL操作时,建议首先删除相关表上的所有索引,再运行VACUUM FULL命令,最后重建索引。 + + diff --git a/content/zh/docs/Developerguide/VALUES.md b/content/zh/docs/Developerguide/VALUES.md new file mode 100644 index 000000000..504e81922 --- /dev/null +++ b/content/zh/docs/Developerguide/VALUES.md @@ -0,0 +1,62 @@ +# VALUES + +## 功能描述 + +根据给定的值表达式计算一个或一组行的值。它通常用于在一个较大的命令内生成一个“常数表”。 + +## 注意事项 + +- 应当避免使用VALUES返回数量非常大的结果行,否则可能会遭遇内存耗尽或者性能低下。出现在INSERT中的VALUES是一个特殊情况,因为目标字段类型可以从INSERT的目标表获知,并不需要通过扫描VALUES列表来推测,所以在此情况下可以处理非常大的结果行。 +- 如果指定了多行,那么每一行都必须拥有相同的元素个数。 + +## 语法格式 + +``` +VALUES {( expression [, ...] )} [, ...] + [ ORDER BY { sort_expression [ ASC | DESC | USING operator ] } [, ...] ] + [ LIMIT { count | ALL } ] + [ OFFSET start [ ROW | ROWS ] ] + [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]; +``` + +## 参数说明 + +- **expression** + + 用于计算或插入结果表指定地点的常量或者表达式。 + + 在一个出现在INSERT顶层的VALUES列表中,expression可以被DEFAULT替换以表示插入目的字段的缺省值。除此以外,当VALUES出现在其他场合的时候是不能使用DEFAULT的。 + +- **sort\_expression** + + 一个表示如何排序结果行的表达式或者整数常量。 + +- **ASC** + + 指定按照升序排列。 + +- **DESC** + + 指定按照降序排列。 + +- **operator** + + 一个排序操作符。 + +- **count** + + 返回的最大行数。 + +- **OFFSET start \{ ROW | ROWS \}** + + 声明返回的最大行数,而start声明开始返回行之前忽略的行数。 + +- **FETCH \{ FIRST | NEXT \} \[ count \] \{ ROW | ROWS \} ONLY** + + FETCH子句限定返回查询结果从第一行开始的总行数,count的缺省值为1。 + + +## 示例 + +请参见INSERT的[示例](INSERT.md#zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d)。 + diff --git "a/content/zh/docs/Developerguide/core\351\227\256\351\242\230\345\256\232\344\275\215.md" "b/content/zh/docs/Developerguide/core\351\227\256\351\242\230\345\256\232\344\275\215.md" new file mode 100644 index 000000000..e4936525d --- /dev/null +++ "b/content/zh/docs/Developerguide/core\351\227\256\351\242\230\345\256\232\344\275\215.md" @@ -0,0 +1,7 @@ +# core问题定位 + +- **[磁盘满故障引起的core问题](磁盘满故障引起的core问题.md)** + +- **[GUC参数log\_directory设置不正确引起的core问题](GUC参数log_directory设置不正确引起的core问题.md)** + + diff --git a/content/zh/docs/Developerguide/java-sql-CallableStatement.md b/content/zh/docs/Developerguide/java-sql-CallableStatement.md new file mode 100644 index 000000000..f86e69f92 --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-CallableStatement.md @@ -0,0 +1,135 @@ +# java.sql.CallableStatement + +java.sql.CallableStatement是存储过程执行接口。 + +**表 1** 对java.sql.CallableStatement的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

registerOutParameter(int parameterIndex, int type)

+

void

+

Yes

+

wasNull()

+

Boolean

+

Yes

+

getString(int parameterIndex)

+

String

+

Yes

+

getBoolean(int parameterIndex)

+

Boolean

+

Yes

+

getByte(int parameterIndex)

+

byte

+

Yes

+

getShort(int parameterIndex)

+

short

+

Yes

+

getInt(int parameterIndex)

+

int

+

Yes

+

getLong(int parameterIndex)

+

long

+

Yes

+

getFloat(int parameterIndex)

+

float

+

Yes

+

getDouble(int parameterIndex)

+

double

+

Yes

+

getBigDecimal(int parameterIndex)

+

BigDecimal

+

Yes

+

getBytes(int parameterIndex)

+

byte[]

+

Yes

+

getDate(int parameterIndex)

+

Date

+

Yes

+

getTime(int parameterIndex)

+

Time

+

Yes

+

getTimestamp(int parameterIndex)

+

Timestamp

+

Yes

+

getObject(int parameterIndex)

+

Object

+

Yes

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- 不允许含有OUT参数的语句执行批量操作。 +>- 以下方法是从java.sql.Statement继承而来:close,execute,executeQuery,executeUpdate,getConnection,getResultSet,getUpdateCount,isClosed,setMaxRows , setFetchSize。 +>- 以下方法是从java.sql.PreparedStatement继承而来:addBatch,clearParameters,execute,executeQuery,executeUpdate,getMetaData,setBigDecimal,setBoolean,setByte,setBytes,setDate,setDouble,setFloat,setInt,setLong,setNull,setObject,setString,setTime,setTimestamp 。 + diff --git a/content/zh/docs/Developerguide/java-sql-Connection.md b/content/zh/docs/Developerguide/java-sql-Connection.md new file mode 100644 index 000000000..a06ca6dd1 --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-Connection.md @@ -0,0 +1,119 @@ +# java.sql.Connection + +java.sql.Connection是数据库连接接口。 + +**表 1** 对java.sql.Connection接口的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

close()

+

void

+

Yes

+

commit()

+

void

+

Yes

+

createStatement()

+

Statement

+

Yes

+

getAutoCommit()

+

Boolean

+

Yes

+

getClientInfo()

+

Properties

+

Yes

+

getClientInfo(String name)

+

String

+

Yes

+

getTransactionIsolation()

+

int

+

Yes

+

isClosed()

+

Boolean

+

Yes

+

isReadOnly()

+

Boolean

+

Yes

+

prepareStatement(String sql)

+

PreparedStatement

+

Yes

+

rollback()

+

void

+

Yes

+

setAutoCommit(boolean autoCommit)

+

void

+

Yes

+

setClientInfo(Properties properties)

+

void

+

Yes

+

setClientInfo(String name,String value)

+

void

+

Yes

+
+ +>![](public_sys-resources/icon-notice.gif) **须知:** +>接口内部默认使用自动提交模式,若通过setAutoCommit\(false\)关闭自动提交,将会导致后面执行的语句都受到显式事务包裹,数据库中不支持事务中执行的语句不能在此模式下执行。 + diff --git a/content/zh/docs/Developerguide/java-sql-DatabaseMetaData.md b/content/zh/docs/Developerguide/java-sql-DatabaseMetaData.md new file mode 100644 index 000000000..1af274860 --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-DatabaseMetaData.md @@ -0,0 +1,438 @@ +# java.sql.DatabaseMetaData + +java.sql.DatabaseMetaData是数据库对象定义接口。 + +**表 1** 对java.sql.DatabaseMetaData的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)

+

ResultSet

+

Yes

+

getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)

+

ResultSet

+

Yes

+

getTableTypes()

+

ResultSet

+

Yes

+

getUserName()

+

String

+

Yes

+

isReadOnly()

+

boolean

+

Yes

+

nullsAreSortedHigh()

+

boolean

+

Yes

+

nullsAreSortedLow()

+

boolean

+

Yes

+

nullsAreSortedAtStart()

+

boolean

+

Yes

+

nullsAreSortedAtEnd()

+

boolean

+

Yes

+

getDatabaseProductName()

+

String

+

Yes

+

getDatabaseProductVersion()

+

String

+

Yes

+

getDriverName()

+

String

+

Yes

+

getDriverVersion()

+

String

+

Yes

+

getDriverMajorVersion()

+

int

+

Yes

+

getDriverMinorVersion()

+

int

+

Yes

+

usesLocalFiles()

+

boolean

+

Yes

+

usesLocalFilePerTable()

+

boolean

+

Yes

+

supportsMixedCaseIdentifiers()

+

boolean

+

Yes

+

storesUpperCaseIdentifiers()

+

boolean

+

Yes

+

storesLowerCaseIdentifiers()

+

boolean

+

Yes

+

supportsMixedCaseQuotedIdentifiers()

+

boolean

+

Yes

+

storesUpperCaseQuotedIdentifiers()

+

boolean

+

Yes

+

storesLowerCaseQuotedIdentifiers()

+

boolean

+

Yes

+

storesMixedCaseQuotedIdentifiers()

+

boolean

+

Yes

+

supportsAlterTableWithAddColumn()

+

boolean

+

Yes

+

supportsAlterTableWithDropColumn()

+

boolean

+

Yes

+

supportsColumnAliasing()

+

boolean

+

Yes

+

nullPlusNonNullIsNull()

+

boolean

+

Yes

+

supportsConvert()

+

boolean

+

Yes

+

supportsConvert(int fromType, int toType)

+

boolean

+

Yes

+

supportsTableCorrelationNames()

+

boolean

+

Yes

+

supportsDifferentTableCorrelationNames()

+

boolean

+

Yes

+

supportsExpressionsInOrderBy()

+

boolean

+

Yes

+

supportsOrderByUnrelated()

+

boolean

+

Yes

+

supportsGroupBy()

+

boolean

+

Yes

+

supportsGroupByUnrelated()

+

boolean

+

Yes

+

supportsGroupByBeyondSelect()

+

boolean

+

Yes

+

supportsLikeEscapeClause()

+

boolean

+

Yes

+

supportsMultipleResultSets()

+

boolean

+

Yes

+

supportsMultipleTransactions()

+

boolean

+

Yes

+

supportsNonNullableColumns()

+

boolean

+

Yes

+

supportsMinimumSQLGrammar()

+

boolean

+

Yes

+

supportsCoreSQLGrammar()

+

boolean

+

Yes

+

supportsExtendedSQLGrammar()

+

boolean

+

Yes

+

supportsANSI92EntryLevelSQL()

+

boolean

+

Yes

+

supportsANSI92IntermediateSQL()

+

boolean

+

Yes

+

supportsANSI92FullSQL()

+

boolean

+

Yes

+

supportsIntegrityEnhancementFacility()

+

boolean

+

Yes

+

supportsOuterJoins()

+

boolean

+

Yes

+

supportsFullOuterJoins()

+

boolean

+

Yes

+

supportsLimitedOuterJoins()

+

boolean

+

Yes

+

isCatalogAtStart()

+

boolean

+

Yes

+

supportsSchemasInDataManipulation()

+

boolean

+

Yes

+

supportsSavepoints()

+

boolean

+

Yes

+

supportsResultSetHoldability(int holdability)

+

boolean

+

Yes

+

getResultSetHoldability()

+

int

+

Yes

+

getDatabaseMajorVersion()

+

int

+

Yes

+

getDatabaseMinorVersion()

+

int

+

Yes

+

getJDBCMajorVersion()

+

int

+

Yes

+

getJDBCMinorVersion()

+

int

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/java-sql-Driver.md b/content/zh/docs/Developerguide/java-sql-Driver.md new file mode 100644 index 000000000..1c6bfbd02 --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-Driver.md @@ -0,0 +1,53 @@ +# java.sql.Driver + +java.sql.Driver是数据库驱动接口。 + +**表 1** 对java.sql.Driver的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

acceptsURL(String url)

+

Boolean

+

Yes

+

connect(String url, Properties info)

+

Connection

+

Yes

+

jdbcCompliant()

+

Boolean

+

Yes

+

getMajorVersion()

+

int

+

Yes

+

getMinorVersion()

+

int

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/java-sql-PreparedStatement.md b/content/zh/docs/Developerguide/java-sql-PreparedStatement.md new file mode 100644 index 000000000..305eddf9b --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-PreparedStatement.md @@ -0,0 +1,164 @@ +# java.sql.PreparedStatement + +java.sql.PreparedStatement是预处理语句接口。 + +**表 1** 对java.sql.PreparedStatement的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

clearParameters()

+

void

+

Yes

+

execute()

+

Boolean

+

Yes

+

executeQuery()

+

ResultSet

+

Yes

+

excuteUpdate()

+

int

+

Yes

+

getMetaData()

+

ResultSetMetaData

+

Yes

+

setBoolean(int parameterIndex, boolean x)

+

void

+

Yes

+

setBigDecimal(int parameterIndex, BigDecimal x)

+

void

+

Yes

+

setByte(int parameterIndex, byte x)

+

void

+

Yes

+

setBytes(int parameterIndex, byte[] x)

+

void

+

Yes

+

setDate(int parameterIndex, Date x)

+

void

+

Yes

+

setDouble(int parameterIndex, double x)

+

void

+

Yes

+

setFloat(int parameterIndex, float x)

+

void

+

Yes

+

setInt(int parameterIndex, int x)

+

void

+

Yes

+

setLong(int parameterIndex, long x)

+

void

+

Yes

+

setNString(int parameterIndex, String value)

+

void

+

Yes

+

setShort(int parameterIndex, short x)

+

void

+

Yes

+

setString(int parameterIndex, String x)

+

void

+

Yes

+

addBatch()

+

void

+

Yes

+

executeBatch()

+

int[]

+

Yes

+

clearBatch()

+

void

+

Yes

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- addBatch\(\)、execute\(\)必须在clearBatch\(\)之后才能执行。 +>- 调用executeBatch\(\)方法并不会清除batch。用户必须显式使用clearBatch\(\)清除 。 +>- 在添加了一个batch的绑定变量后,用户若想重用这些值\(再次添加一个batch\),无需再次使用set\*\(\)方法 。 +>- 以下方法是从java.sql.Statement继承而来:close,execute,executeQuery,executeUpdate,getConnection,getResultSet,getUpdateCount,isClosed,setMaxRows, setFetchSize。 + diff --git a/content/zh/docs/Developerguide/java-sql-ResultSet.md b/content/zh/docs/Developerguide/java-sql-ResultSet.md new file mode 100644 index 000000000..6742712a2 --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-ResultSet.md @@ -0,0 +1,239 @@ +# java.sql.ResultSet + +java.sql.ResultSet是执行结果集接口。 + +**表 1** 对java.sql.ResultSet的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

findColumn(String columnLabel)

+

int

+

Yes

+

getBigDecimal(int columnIndex)

+

BigDecimal

+

Yes

+

getBigDecimal(String columnLabel)

+

BigDecimal

+

Yes

+

getBoolean(int columnIndex)

+

Boolean

+

Yes

+

getBoolean(String columnLabel)

+

Boolean

+

Yes

+

getByte(int columnIndex)

+

byte

+

Yes

+

getBytes(int columnIndex)

+

byte[]

+

Yes

+

getByte(String columnLabel)

+

byte

+

Yes

+

getBytes(String columnLabel)

+

byte[]

+

Yes

+

getDate(int columnIndex)

+

Date

+

Yes

+

getDate(String columnLabel)

+

Date

+

Yes

+

getDouble(int columnIndex)

+

double

+

Yes

+

getDouble(String columnLabel)

+

double

+

Yes

+

getFloat(int columnIndex)

+

float

+

Yes

+

getFloat(String columnLabel)

+

float

+

Yes

+

getInt(int columnIndex)

+

int

+

Yes

+

getInt(String columnLabel)

+

int

+

Yes

+

getLong(int columnIndex)

+

long

+

Yes

+

getLong(String columnLabel)

+

long

+

Yes

+

getShort(int columnIndex)

+

short

+

Yes

+

getShort(String columnLabel)

+

short

+

Yes

+

getString(int columnIndex)

+

String

+

Yes

+

getString(String columnLabel)

+

String

+

Yes

+

getTime(int columnIndex)

+

Time

+

Yes

+

getTime(String columnLabel)

+

Time

+

Yes

+

getTimestamp(int columnIndex)

+

Timestamp

+

Yes

+

getTimestamp(String columnLabel)

+

Timestamp

+

Yes

+

isAfterLast()

+

Boolean

+

Yes

+

isBeforeFirst()

+

Boolean

+

Yes

+

isFirst()

+

Boolean

+

Yes

+

next()

+

Boolean

+

Yes

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- 一个Statement不能有多个处于“open”状态的ResultSet。 +>- 用于遍历结果集\(ResultSet\)的游标\(Cursor\)在被提交后不能保持“open”的状态。 + diff --git a/content/zh/docs/Developerguide/java-sql-ResultSetMetaData.md b/content/zh/docs/Developerguide/java-sql-ResultSetMetaData.md new file mode 100644 index 000000000..96fb6de1e --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-ResultSetMetaData.md @@ -0,0 +1,46 @@ +# java.sql.ResultSetMetaData + +java.sql.ResultSetMetaData是对ResultSet对象相关信息的具体描述。 + +**表 1** 对java.sql.ResultSetMetaData的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

getColumnCount()

+

int

+

Yes

+

getColumnName(int column)

+

String

+

Yes

+

getColumnType(int column)

+

int

+

Yes

+

getColumnTypeName(int column)

+

String

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/java-sql-Statement.md b/content/zh/docs/Developerguide/java-sql-Statement.md new file mode 100644 index 000000000..64387af72 --- /dev/null +++ b/content/zh/docs/Developerguide/java-sql-Statement.md @@ -0,0 +1,106 @@ +# java.sql.Statement + +java.sql.Statement是SQL语句接口。 + +**表 1** 对java.sql.Statement的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

close()

+

void

+

Yes

+

execute(String sql)

+

Boolean

+

Yes

+

executeQuery(String sql)

+

ResultSet

+

Yes

+

executeUpdate(String sql)

+

int

+

Yes

+

getConnection()

+

Connection

+

Yes

+

getResultSet()

+

ResultSet

+

Yes

+

getQueryTimeout()

+

int

+

Yes

+

getUpdateCount()

+

int

+

Yes

+

isClosed()

+

Boolean

+

Yes

+

setQueryTimeout(int seconds)

+

void

+

Yes

+

setFetchSize(int rows)

+

void

+

Yes

+

cancel()

+

void

+

Yes

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- 通过setFetchSize可以减少结果集在客户端的内存占用情况。它的原理是通过将结果集打包成游标,然后分段处理,所以会加大数据库与客户端的通信量,会有性能损耗。 +>- 由于数据库游标是事务内有效,所以,在设置setFetchSize的同时,需要将连接设置为非自动提交模式,setAutoCommit\(false\)。同时在业务数据需要持久化到数据库中时,在连接上执行提交操作。 + diff --git a/content/zh/docs/Developerguide/javax-naming-Context.md b/content/zh/docs/Developerguide/javax-naming-Context.md new file mode 100644 index 000000000..9ea547612 --- /dev/null +++ b/content/zh/docs/Developerguide/javax-naming-Context.md @@ -0,0 +1,88 @@ +# javax.naming.Context + +javax.naming.Context是连接配置的上下文接口。 + +**表 1** 对javax.naming.Context的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

bind(Name name, Object obj)

+

void

+

Yes

+

bind(String name, Object obj)

+

void

+

Yes

+

lookup(Name name)

+

Object

+

Yes

+

lookup(String name)

+

Object

+

Yes

+

rebind(Name name, Object obj)

+

void

+

Yes

+

rebind(String name, Object obj)

+

void

+

Yes

+

rename(Name oldName, Name newName)

+

void

+

Yes

+

rename(String oldName, String newName)

+

void

+

Yes

+

unbind(Name name)

+

void

+

Yes

+

unbind(String name)

+

void

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/javax-naming-spi-InitialContextFactory.md b/content/zh/docs/Developerguide/javax-naming-spi-InitialContextFactory.md new file mode 100644 index 000000000..52482b871 --- /dev/null +++ b/content/zh/docs/Developerguide/javax-naming-spi-InitialContextFactory.md @@ -0,0 +1,25 @@ +# javax.naming.spi.InitialContextFactory + +javax.naming.spi.InitialContextFactory是初始连接上下文工厂接口。 + +**表 1** 对javax.naming.spi.InitialContextFactory的支持情况 + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

getInitialContext(Hashtable<?,?> environment)

+

Context

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/javax-sql-ConnectionPoolDataSource.md b/content/zh/docs/Developerguide/javax-sql-ConnectionPoolDataSource.md new file mode 100644 index 000000000..b9dbe6591 --- /dev/null +++ b/content/zh/docs/Developerguide/javax-sql-ConnectionPoolDataSource.md @@ -0,0 +1,60 @@ +# javax.sql.ConnectionPoolDataSource + +javax.sql.ConnectionPoolDataSource是数据源连接池接口。 + +**表 1** 对javax.sql.ConnectionPoolDataSource的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

getLoginTimeout()

+

int

+

Yes

+

getLogWriter()

+

PrintWriter

+

Yes

+

getPooledConnection()

+

PooledConnection

+

Yes

+

getPooledConnection(String user,String password)

+

PooledConnection

+

Yes

+

setLoginTimeout(int seconds)

+

void

+

Yes

+

setLogWriter(PrintWriter out)

+

void

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/javax-sql-DataSource.md b/content/zh/docs/Developerguide/javax-sql-DataSource.md new file mode 100644 index 000000000..b5d224d01 --- /dev/null +++ b/content/zh/docs/Developerguide/javax-sql-DataSource.md @@ -0,0 +1,60 @@ +# javax.sql.DataSource + +javax.sql.DataSource是数据源接口。 + +**表 1** 对javax.sql.DataSource接口的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

getConneciton()

+

Connection

+

Yes

+

getConnection(String username,String password)

+

Connection

+

Yes

+

getLoginTimeout()

+

int

+

Yes

+

getLogWriter()

+

PrintWriter

+

Yes

+

setLoginTimeout(int seconds)

+

void

+

Yes

+

setLogWriter(PrintWriter out)

+

void

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/javax-sql-PooledConnection.md b/content/zh/docs/Developerguide/javax-sql-PooledConnection.md new file mode 100644 index 000000000..abe6c78f8 --- /dev/null +++ b/content/zh/docs/Developerguide/javax-sql-PooledConnection.md @@ -0,0 +1,60 @@ +# javax.sql.PooledConnection + +javax.sql.PooledConnection是由连接池创建的连接接口。 + +**表 1** 对javax.sql.PooledConnection的支持情况 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法名

+

返回值类型

+

支持JDBC 4

+

addConnectionEventListener (ConnectionEventListener listener)

+

void

+

Yes

+

close()

+

void

+

Yes

+

getConnection()

+

Connection

+

Yes

+

removeConnectionEventListener (ConnectionEventListener listener)

+

void

+

Yes

+

addStatementEventListener (StatementEventListener listener)

+

void

+

Yes

+

removeStatementEventListener (StatementEventListener listener)

+

void

+

Yes

+
+ diff --git a/content/zh/docs/Developerguide/libpq.md b/content/zh/docs/Developerguide/libpq.md new file mode 100644 index 000000000..3652014c1 --- /dev/null +++ b/content/zh/docs/Developerguide/libpq.md @@ -0,0 +1,15 @@ +# libpq + +- **[数据库连接控制函数](数据库连接控制函数.md)** + +- **[数据库执行语句函数](数据库执行语句函数.md)** + +- **[异步命令处理](异步命令处理.md)** + +- **[取消正在处理的查询](取消正在处理的查询.md)** + +- **[示例](示例-10.md)** + +- **[链接字符](链接字符.md)** + + diff --git a/content/zh/docs/Developerguide/openGauss-SQL.md b/content/zh/docs/Developerguide/openGauss-SQL.md new file mode 100644 index 000000000..6ba055fbe --- /dev/null +++ b/content/zh/docs/Developerguide/openGauss-SQL.md @@ -0,0 +1,31 @@ +# openGauss SQL + +## 什么是SQL + +SQL是用于访问和处理数据库的标准计算机语言。 + +SQL提供了各种任务的语句,包括: + +- 查询数据。 +- 在表中插入,更新和删除行。 +- 创建,替换,更改和删除对象。 +- 控制对数据库及其对象的访问。 +- 保证数据库的一致性和完整性。 + +SQL语言由用于处理数据库和数据库对象的命令和函数组成。该语言还会强制实施有关数据类型、表达式和文本使用的规则。因此在[SQL参考](SQL参考.md)章节,除了SQL语法参考外,还会看到有关数据类型、表达式、函数和操作符等信息。 + +## SQL发展简史 + +SQL发展简史如下: + +- 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86 +- 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89 +- 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2) +- 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3) +- 2003年,ISO/IEC 9075:2003,SQL:2003(SQL4) +- 2011年,ISO/IEC 9075:200N,SQL:2011(SQL5) + +## openGauss支持的SQL标准 + +openGauss默认支持SQL2、SQL3和SQL4的主要特性。 + 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" new file mode 100644 index 000000000..44d1d063b --- /dev/null +++ "b/content/zh/docs/Developerguide/openGauss\344\272\213\345\212\241.md" @@ -0,0 +1,124 @@ +# openGauss事务 + +介绍openGauss事务隔离、事务只读、最大prepared事务数、维护模式目的参数设置及取值范围等内容。 + +## transaction\_isolation + +**参数说明:**设置当前事务的隔离级别。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,只识别以下字符串,大小写空格敏感: + +- serializable:openGauss中等价于REPEATABLE READ。 +- read committed:只能读取已提交的事务的数据(缺省),不能读取到未提交的数据。 +- repeatable read:仅能读取事务开始之前提交的数据,不能读取未提交的数据以及在事务执行期间由其它并发事务提交的修改。 +- read uncommitted:读未提交,可以读取任何时刻的数据。 +- default:设置为defualt\_transaction\_isolation所设隔离级别。 + +**默认值:**read committed + +## transaction\_read\_only + +**参数说明:**设置当前事务是只读事务。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示设置当前事务为只读事务。 +- off表示该事务可以是非只读事务。 + +**默认值:**off + +## xc\_maintenance\_mode + +**参数说明:**设置系统进入维护模式。 + +该参数属于SUSET类型参数,仅支持[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中的方式三进行设置。 + +**取值范围:**布尔型 + +- on表示该功能启用。 +- off表示该功能被禁用。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>谨慎打开这个开关,避免引起openGauss数据不一致。 + +**默认值:**off + +## allow\_concurrent\_tuple\_update + +**参数说明:**设置是否允许并发更新。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示该功能启用。 +- off表示该功能被禁用。 + +**默认值:**on + +## pgxc\_node\_name + +**参数说明:**指定节点名称。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值:**当前节点名称。 + +## transaction\_deferrable + +**参数说明:**指定是否允许一个只读串行事务延迟执行,使其不会执行失败。该参数设置为on时,当一个只读事务发现读取的元组正在被其他事务修改,则延迟该只读事务直到其他事务修改完成。目前,openGauss暂时未用到这个参数。与该参数类似的还有一个[default\_transaction\_deferrable](语句行为.md#zh-cn_topic_0237124732_zh-cn_topic_0059779117_s031e2bbea2cf42a5a1c24e6dbaa70365),设置它来指定一个事务是否允许延迟。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许执行。 +- off表示不允许执行。 + +**默认值:**off + +## enforce\_two\_phase\_commit + +**参数说明:**强制使用两阶段提交,为了兼容历史版本功能保留该参数,当前版本设置无效。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示强制使用两阶段提交。 +- off表示不强制使用两阶段提交。 + +**默认值:**on + +## enable\_show\_any\_tuples + +**参数说明:**该参数只有在只读事务中可用,用于分析。当这个参数被置为on/true时,表中元组的所有版本都会可见。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示表中元组的所有版本都会可见。 +- off/false表示表中元组的所有版本都不可见。 + +**默认值:**off + +## replication\_type + +**参数说明:**标记当前HA模式是主备从模式还是一主多备模式。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0\~3 + +- 1 表示使用一主多备模式。 +- 0 表示主备从模式。 + +**默认值:**1 + diff --git a/content/zh/docs/Developerguide/public_sys-resources/.keep b/content/zh/docs/Developerguide/public_sys-resources/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Developerguide/public_sys-resources/icon-caution.gif b/content/zh/docs/Developerguide/public_sys-resources/icon-caution.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/Developerguide/public_sys-resources/icon-danger.gif b/content/zh/docs/Developerguide/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/Developerguide/public_sys-resources/icon-note.gif b/content/zh/docs/Developerguide/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/Developerguide/public_sys-resources/icon-notice.gif b/content/zh/docs/Developerguide/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/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" new file mode 100644 index 000000000..eb576e6e4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\270\211\346\235\203\345\210\206\347\253\213.md" @@ -0,0 +1,188 @@ +# 三权分立 + +[默认权限机制](默认权限机制.md#ZH-CN_TOPIC_0246507958)和[管理员](管理员.md)两节的描述基于的是openGauss创建之初的默认情况。从前面的介绍可以看出,默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。 + +在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的权限分立给安全管理员和审计管理员。 + +三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。即不再拥有创建角色和用户的权限,并不再拥有查看和维护数据库审计日志的权限。关于CREATEROLE属性和AUDITADMIN属性的更多信息请参考[CREATE ROLE](CREATE-ROLE.md)。 + +三权分立后,系统管理员只会对自己作为所有者的对象有权限。 + +初始用户的权限不受三权分立设置影响。因此建议仅将此初始用户作为DBA管理用途,而非业务应用。 + +三权分立的设置办法为:将参数[enableSeparationOfDuty](操作审计.md#zh-cn_topic_0237124747_zh-cn_topic_0059777487_s0a79ea55efa1431d8e3e06e4b8219cd6)设置为on。 + +三权分立前的权限详情及三权分立后的权限变化,请分别参见[表1](#zh-cn_topic_0237121101_zh-cn_topic_0155089861_t58384b51e1fd4e67ab393f4bb6103a16)和[表2](#zh-cn_topic_0237121101_zh-cn_topic_0155089861_t12fe700a5db44d748cb0dc123012289b)。 + +**表 1** 默认的用户权限 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

对象名称

+

初始用户(id为10)

+

系统管理员

+

监控管理员

+

运维管理员

+

安全策略管理员

+

安全管理员

+

审计管理员

+

普通用户

+

表空间

+

具有除私有用户表对象访问权限外,所有的权限。

+

对表空间有创建、修改、删除、访问、分配操作的权限。

+

不具有对表空间进行创建、修改、删除、分配的权限,访问需要被赋权。

+

+

对所有表有所有的权限。

+

仅对自己的表有所有的权限,对其他用户的表无权限

+

索引

+

可以在所有的表上建立索引。

+

仅可以在自己的表上建立索引。

+

模式

+

对除dbms_perf以外的所有模式有所有的权限。

+

仅对dbms_perf模式和自己的模式有所有的权限,对其他用户的模式无权限。

+

仅对自己的模式有所有的权限,对其他用户的模式无权限。

+

函数

+

对除dbms_perf模式下的函数以外的所有的函数有所有的权限。

+

仅对dbms_perf模式下的和自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。

+

仅对自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。

+

自定义视图

+

对除dbms_perf模式下的视图以外的所有的视图有所有的权限。

+

仅对dbms_perf模式下的和自己的视图有所有的权限,对其他用户的视图无权限。

+

仅对自己的视图有所有的权限,对其他用户的视图无权限。

+

系统表和系统视图

+

可以查看所有系统表和视图。

+

只可以查看部分系统表和视图。详细请参见系统表和系统视图

+
+ +**表 2** 三权分立较非三权分立权限变化说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

对象名称

+

初始用户(id为10)

+

系统管理员

+

监控管理员

+

运维管理员

+

安全策略管理员

+

安全管理员

+

审计管理员

+

普通用户

+

表空间

+

无变化。

+

依然具有除私有用户表对象访问权限外,所有的权限。

+

无变化

+

无变化。

+

+

权限缩小。

+

只对自己的表及其他用户放在public模式下的表有所有的权限,对其他用户放在属于各自模式下的表无权限。

+

无变化。

+

索引

+

权限缩小。

+

只可以在自己的表及其他用户放在public模式下的表上建立索引。

+

无变化。

+

模式

+

权限缩小。

+

只对自己的模式有所有的权限,对其他用户的模式无权限。

+

无变化

+

无变化。

+

函数

+

权限缩小。

+

只对自己的函数及其他用户放在public模式下的函数有所有的权限,对其他用户放在属于各自模式下的函数无权限。

+

无变化

+

无变化。

+

自定义视图

+

权限缩小。

+

只对自己的视图及其他用户放在public模式下的视图有所有的权限,对其他用户放在属于各自模式下的视图无权限。

+

无变化

+

无变化。

+

系统表和系统视图

+

无变化。

+

无变化。

+
+ 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" new file mode 100644 index 000000000..7d1eb680c --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\270\273\346\234\215\345\212\241\345\231\250.md" @@ -0,0 +1,144 @@ +# 主服务器 + +## synchronous\_standby\_names + +**参数说明:**潜在同步复制的备机名称列表,每个名称用逗号分隔。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当前连接的同步备机是列表中的第一个名称。如果当前同步备机失去连接,则它会立即更换下一个优先级更高的备机,并将此备机的名称放入列表中。 +>- 备机名称可以通过设置环境变量PGAPPNAME指定。 + +**取值范围:**字符串。当取值为\*,表示不启用同步复制。 + +**默认值:**\* + +## most\_available\_sync + +**参数说明:**指定在备机同步失败时,是否阻塞主机。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在备机同步失败时,不阻塞主机。 +- off表示在备机同步失败时,阻塞主机。 + +**默认值**:off + +## enable\_stream\_replication + +**参数说明:**控制主备、主从是否进行数据和日志同步。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 此参数属于性能测试参数,用于测试带有备机和不带备机的性能参数。关闭参数后,不能进行升级、切换、故障等异常场景测试,否则会出现主备从不一致的情况。 +>- 此参数属于受控参数,不建议正常业务场景下关闭此参数。 + +**取值范围:**布尔型 + +- on表示打开主备、主从同步。 +- off表示关闭主备、主从同步。 + +**默认值**:on + +## enable\_mix\_replication + +**参数说明:**控制主备、主从之间WAL日志及数据复制的方式。 + +该参数属于INTERNAL类型参数,默认值为off,不允许外部修改。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数属于内部参数,目前不允许正常业务场景下改变其值,即关闭WAL日志、数据页混合复制模式。 + +**取值范围:**布尔型 + +- on表示打开WAL日志、数据页混合复制模式。 +- off表示关闭WAL日志、数据页混合复制模式。 + +**默认值**:off + +## vacuum\_defer\_cleanup\_age + +**参数说明:**指定VACUUM使用的事务数,VACUUM会延迟清除无效的行存表记录,延迟的事务个数通过vacuum\_defer\_cleanup\_age进行设置。即VACUUM和VACUUM FULL操作不会立即清理刚刚被删除元组。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~1000000,值为0表示不延迟。 + +**默认值**:0 + +## data\_replicate\_buffer\_size + +**参数说明:**发送端与接收端传递数据页时,队列占用内存的大小。此参数会影响主备之间复制的缓冲大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,4096\~1072693248,单位为KB。 + +**默认值:**128MB(即131072KB) + +## walsender\_max\_send\_size + +**参数说明:**设置主机端日志或数据发送缓冲区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,8\~INT\_MAX,单位为KB。 + +**默认值:**8M(即8192KB) + +## enable\_data\_replicate + +**参数说明:**当数据库在数据导入行存表时,主机与备机的数据同步方式可以进行选择。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示导入数据行存表时主备数据采用数据页的方式进行同步。当replication\_type参数为1时,不允许设置为on,如果此时用guc工具设置成on,会强制改为off。 +- off表示导入数据行存表时主备数据采用日志(Xlog)方式进行同步。 + +**默认值:**off + +## ha\_module\_debug + +**参数说明:**用于查看数据复制时具体数据块的复制状态日志。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示日志中将打印数据复制时每个数据块的状态。 +- off表示日志中不打印数据复制时每个数据块的状态。 + +**默认值:**off + +## enable\_incremental\_catchup + +**参数说明:**控制主备之间数据追赶(catchup)的方式。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示备机catchup时用增量catchup方式,即从从备本地数据文件扫描获得主备差异数据文件列表,进行主备之间的catchup。 +- off表示备机catchup时用全量catchup方式,即从主机本地所有数据文件扫描获得主备差异数据文件列表,进行主备之间的catchup。 + +**默认值**:on + +## wait\_dummy\_time + +**参数说明:**同时控制增量数据追赶(catchup)时,openGauss主备从按顺序启动时等待从备启动的最长时间以及等待从备发回扫描列表的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,范围1\~INT\_MAX,单位为秒 + +**默认值**:300 + +>![](public_sys-resources/icon-note.gif) **说明:** +>单位只能设置为秒。 + 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" new file mode 100644 index 000000000..f72b35160 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\346\216\247\345\210\266.md" @@ -0,0 +1,23 @@ +# 事务控制 + +事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。 + +## 启动事务 + +openGauss通过START TRANSACTION和BEGIN语法启动事务,请参考[SET TRANSACTION](SET-TRANSACTION.md)和[BEGIN](BEGIN.md)。 + +## 设置事务 + +openGauss通过SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务,请参考[SET TRANSACTION](SET-TRANSACTION.md)。 + +## 提交事务 + +openGauss通过COMMIT或者END可完成提交事务的功能,即提交事务的所有操作,请参考[COMMIT | END](COMMIT-END.md)。 + +## 回滚事务 + +回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。请参考[ROLLBACK](ROLLBACK.md#ZH-CN_TOPIC_0242370644)。 + +>![](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" new file mode 100644 index 000000000..a451aba70 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\347\233\221\346\216\247.md" @@ -0,0 +1,29 @@ +# 事务监控 + +通过设置事务超时预警,可以监控自动回滚的事务并定位其中的语句问题,并且也可以监控执行时间过长的语句。 + +## 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\213\345\212\241\351\232\224\347\246\273\350\257\264\346\230\216.md" "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\351\232\224\347\246\273\350\257\264\346\230\216.md" new file mode 100644 index 000000000..7c8d79862 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\272\213\345\212\241\351\232\224\347\246\273\350\257\264\346\230\216.md" @@ -0,0 +1,13 @@ +# 事务隔离说明 + +openGauss基于MVCC(多版本并发控制)并结合两阶段锁的方式进行事务管理,其特点是读写之间不阻塞。SELECT是纯读操作,UPDATE和DELETE是读写操作。 + +- 读写操作和纯读操作之间并不会发生冲突,读写操作之间也不会发生冲突。每个并发事务在事务开始时创建事务快照,并发事务之间不能检测到对方的更改。 + - 读已提交隔离级别中,如果事务T1提交后,事务T2就可以看到事务T1更改的结果。 + - 可重复读级别中,如果事务T1提交事务前事务T2开始执行,则事务T1提交后,事务T2依旧看不到事务T1更改的结果,保证了一个事务开始后,查询的结果前后一致,不受其他事务的影响。 + +- 读写操作,支持的是行级锁,不同的事务可以并发更新同一个表,只有更新同一行时才需等待,后发生的事务会等待先发生的事务提交后,再执行更新操作。 + - READ COMMITTED:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。 + - REPEATABLE READ: 事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改。 + + diff --git "a/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..79deb8fd2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,172 @@ +# 二进制字符串函数和操作符 + +## 字符串操作符 + +SQL定义了一些字符串函数,在这些函数里使用关键字而不是逗号来分隔参数。 + +- octet\_length\(string\) + + 描述:二进制字符串中的字节数。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT octet_length(E'jo\\000se'::bytea) AS RESULT; + result + -------- + 5 + (1 row) + ``` + +- overlay\(string placing string from int \[for int\]\) + + 描述:替换子串。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3) AS RESULT; + result + ---------------- + \x5402036d6173 + (1 row) + ``` + +- position\(substring in string\) + + 描述:特定子字符串的位置。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT position(E'\\000om'::bytea in E'Th\\000omas'::bytea) AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- substring\(string \[from int\] \[for int\]\) + + 描述:截取子串。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT substring(E'Th\\000omas'::bytea from 2 for 3) AS RESULT; + result + ---------- + \x68006f + (1 row) + ``` + +- trim\(\[both\] bytes from string\) + + 描述:从string的开头和结尾删除只包含bytes中字节的最长字符串。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) AS RESULT; + result + ---------- + \x546f6d + (1 row) + ``` + + +## 二进制字符串函数 + +openGauss也提供了函数调用所使用的常用语法。 + +- btrim\(string bytea,bytes bytea\) + + 描述:从string的开头和结尾删除只包含bytes中字节的最长的字符串。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea) AS RESULT; + result + ------------ + \x7472696d + (1 row) + ``` + +- get\_bit\(string, offset\) + + 描述:从字符串中抽取位。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT get_bit(E'Th\\000omas'::bytea, 45) AS RESULT; + result + -------- + 1 + (1 row) + ``` + +- get\_byte\(string, offset\) + + 描述:从字符串中抽取字节。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT get_byte(E'Th\\000omas'::bytea, 4) AS RESULT; + result + -------- + 109 + (1 row) + ``` + +- set\_bit\(string,offset, newvalue\) + + 描述:设置字符串中的位。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT set_bit(E'Th\\000omas'::bytea, 45, 0) AS RESULT; + result + ------------------ + \x5468006f6d4173 + (1 row) + ``` + +- set\_byte\(string,offset, newvalue\) + + 描述:设置字符串中的字节。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT set_byte(E'Th\\000omas'::bytea, 4, 64) AS RESULT; + result + ------------------ + \x5468006f406173 + (1 row) + ``` + + 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" new file mode 100644 index 000000000..b740e30f1 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\272\214\350\277\233\345\210\266\347\261\273\345\236\213.md" @@ -0,0 +1,73 @@ +# 二进制类型 + +openGauss支持的二进制类型请参见[表1](#zh-cn_topic_0237121951_zh-cn_topic_0059778141_t910f42f45b374d94afe2798c42fc5ef6)。 + +**表 1** 二进制类型 + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

BLOB

+

二进制大对象

+
说明:

列存不支持BLOB类型

+
+

最大为1GB-8203字节(即1073733621字节)。

+

RAW

+

变长的十六进制类型

+
说明:

列存不支持RAW类型

+
+

4字节加上实际的十六进制字符串。最大为1GB-8203字节(即1073733621字节)。

+

BYTEA

+

变长的二进制字符串

+

4字节加上实际的二进制字符串。最大为1GB-8203字节(即1073733621字节)。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>除了每列的大小限制以外,每个元组的总大小也不可超过1GB-8203字节(即1073733621字节)。 + +示例: + +``` +--创建表。 +postgres=# CREATE TABLE blob_type_t1 +( + BT_COL1 INTEGER, + BT_COL2 BLOB, + BT_COL3 RAW, + BT_COL4 BYTEA +) ; + +--插入数据。 +postgres=# INSERT INTO blob_type_t1 VALUES(10,empty_blob(), +HEXTORAW('DEADBEEF'),E'\\xDEADBEEF'); + +--查询表中的数据。 +postgres=# SELECT * FROM blob_type_t1; + bt_col1 | bt_col2 | bt_col3 | bt_col4 +---------+---------+----------+------------ + 10 | | DEADBEEF | \xdeadbeef +(1 row) + +--删除表。 +postgres=# DROP TABLE blob_type_t1; +``` + diff --git "a/content/zh/docs/Developerguide/\344\273\213\347\273\215-17.md" "b/content/zh/docs/Developerguide/\344\273\213\347\273\215-17.md" new file mode 100644 index 000000000..098e514ea --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\273\213\347\273\215-17.md" @@ -0,0 +1,10 @@ +# 介绍 + +GIN(Generalized Inverted Index)通用倒排索引。设计为处理索引项为组合值的情况,查询时需要通过索引搜索出出现在组合值中的特定元素值。例如,文档是由多个单词组成,需要查询出文档中包含的特定单词。 + +使用item表示索引的组合值,key表示一个元素值。GIN用来存储和搜索key,而不是item。 + +GIN索引存储一系列(key,posting list)键值对,这里的posting list是一组出现key的行ID。由于每个item都可能包含多个key,同一个行ID可能会出现在多个posting list中,而每个key值只被存储一次,所以在相同的key在item中出现多次的情况下,GIN索引是非常简洁的。 + +因为GIN索引的访问方式不需要了解他的运行方式,所以GIN索引是通用的。GIN索引使用为特殊数据类型定义的策略。策略定义了如何从索引选项和查询条件中抽出key,以及如何确定在查询中包含某些key值的行是否实际满足查询条件。 + diff --git "a/content/zh/docs/Developerguide/\344\273\213\347\273\215.md" "b/content/zh/docs/Developerguide/\344\273\213\347\273\215.md" new file mode 100644 index 000000000..34f69807b --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\273\213\347\273\215.md" @@ -0,0 +1,11 @@ +# 介绍 + +- **[全文检索概述](全文检索概述.md)** + +- **[文档概念](文档概念.md)** + +- **[基本文本匹配](基本文本匹配.md)** + +- **[分词器](分词器.md)** + + 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" new file mode 100644 index 000000000..09132cd98 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\273\216\350\277\231\351\207\214\345\274\200\345\247\213.md" @@ -0,0 +1,145 @@ +# 从这里开始 + +本节描述使用数据库的基本操作。通过此节您可以完成创建数据库、创建表及向表中插入数据和查询表中数据等操作。 + +## 前提条件 + +openGauss正常运行。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 + + 若不确定数据库主节点部署在哪台服务器,请参考[确认连接信息](确认连接信息.md)。 + +2. 连接数据库。 + + ``` + gsql -d postgres -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. + + postgres=# + ``` + + 其中,postgres为openGauss安装完成后默认生成的数据库。初始可以连接到此数据库进行新数据库的创建。8000为数据库主节点的端口号,需根据openGauss的实际情况做替换,请参考[确认连接信息](确认连接信息.md)获取。 + + **引申信息:** + + - 使用数据库前,需先使用客户端程序或工具连接到数据库,然后就可以通过客户端程序或工具执行SQL来使用数据库了。 + - gsql是本产品提供的命令行方式的数据库连接工具。更多的数据库连接办法可参考[连接数据库](连接数据库.md)。 + +3. 创建数据库用户。 + + 默认只有openGauss安装时创建的管理员用户可以访问初始数据库,您还可以创建其他数据库用户帐号。 + + ``` + postgres=# CREATE USER joe WITH PASSWORD "Bigdata@123"; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE ROLE + ``` + + 如上创建了一个用户名为joe,密码为Bigdata@123的用户。 + +4. 创建数据库。 + + ``` + postgres=# CREATE DATABASE db_tpcc OWNER joe; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE DATABASE + ``` + + 创建完db\_tpcc数据库后,就可以按如下方法退出postgres数据库,使用新用户连接到此数据库执行接下来的创建表等操作。当然,也可以选择继续在默认的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 + Non-SSL connection (SSL connection is recommended when requiring high-security) + Type "help" for help. + + db_tpcc=> + ``` + + 创建SCHEMA + + ``` + db_tpcc=> CREATE SCHEMA joe AUTHORIZATION joe; + ``` + + 当结果显示为如下信息,则表示创建SCHEMA成功。 + + ``` + CREATE SCHEMA + ``` + + **引申信息:** + + 数据库默认创建在pg\_default表空间下。若要指定表空间,可以使用如下语句: + + ``` + postgres=# CREATE DATABASE db_tpcc WITH TABLESPACE = hr_local; + CREATE DATABASE + ``` + + 其中hr\_local为表空间名称,关于如何创建表空间,请参考[创建和管理表空间](创建和管理表空间.md)。 + +5. 创建表。 + + - 创建一个名称为mytable,只有一列的表。字段名为firstcol,字段类型为integer。 + + ``` + db_tpcc=> CREATE TABLE mytable (firstcol int); + ``` + + ``` + + CREATE TABLE + ``` + + - 向表中插入数据: + + ``` + db_tpcc=> INSERT INTO mytable values (100); + ``` + + 当结果显示为如下信息,则表示插入数据成功。 + + ``` + INSERT 0 1 + ``` + + - 查看表中数据: + + ``` + db_tpcc=> SELECT * from mytable; + firstcol + ---------- + 100 + (1 row) + ``` + + **引申信息:** + + - 默认情况下,新的数据库对象是创建在“$user”模式下的,例如刚刚新建的表。关于模式的更多信息请参考[创建和管理schema](创建和管理schema.md)。 + - 关于创建表的更多信息请参见[创建和管理表](创建和管理表.md)。 + - 除了创建的表以外,数据库还包含很多系统表。这些系统表包含openGauss安装信息以及openGauss上运行的各种查询和进程的信息。可以通过查询系统表来收集有关数据库的信息。请参见[查看系统表](查看系统表.md)。 + + openGauss支持行列混合存储,为各种复杂场景下的交互分析提供极致查询性能,关于存储模型的选择,请参考[规划存储模型](规划存储模型.md)。 + + + diff --git "a/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" "b/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" new file mode 100644 index 000000000..c0135b67a --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\345\274\200\351\224\200\345\270\270\351\207\217.md" @@ -0,0 +1,87 @@ +# 优化器开销常量 + +介绍优化器开销常量。这里描述的开销可以按照任意标准度量。只关心其相对值,因此以相同的系数缩放它们将不会对优化器的选择产生任何影响。缺省时,它们以抓取顺序页的开销为基本单位。也就是说将seq\_page\_cost设为1.0,同时其他开销参数以它为基准设置。也可以使用其他基准,比如以毫秒计的实际执行时间。 + +## seq\_page\_cost + +**参数说明**:设置优化器计算一次顺序磁盘页面抓取的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:1 + +## random\_page\_cost + +**参数说明**:设置优化器计算一次非顺序抓取磁盘页面的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>虽然服务器允许将random\_page\_cost设置的比seq\_page\_cost小,但是物理上实际不受影响。如果所有数据库都位于随机访问内存中时,两者设置为相等很合理。因为在此种情况下,非顺序抓取页并没有副作用。同样,在缓冲率很高的数据库上,应该相对于CPU参数同时降低这两个值,因为获取内存中的页要比通常情况下开销小很多。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:4 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 对于特别表空间中的表和索引,可以通过设置同名的表空间的参数来覆盖这个值。 +>- 相对于seq\_page\_cost,减少这个值将导致系统更倾向于使用索引扫描,而增加这个值使得索引扫描开销比较高。可以通过同时增加或减少这两个值来调整磁盘I/O相对于CPU的开销。 + +## cpu\_tuple\_cost + +**参数说明**:设置优化器计算在一次查询中处理每一行数据的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0.01 + +## cpu\_index\_tuple\_cost + +**参数说明**:设置优化器计算在一次索引扫描中处理每条索引的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0.005 + +## cpu\_operator\_cost + +**参数说明**:设置优化器计算一次查询中执行一个操作符或函数的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0.0025 + +## effective\_cache\_size + +**参数说明**:设置优化器在一次单一的查询中可用的磁盘缓冲区的有效大小。 + +设置这个参数,还要考虑openGauss的共享缓冲区以及内核的磁盘缓冲区。另外,还要考虑预计的在不同表之间的并发查询数目,因为它们将共享可用的空间。 + +这个参数对openGauss分配的共享内存大小没有影响,它也不会使用内核磁盘缓冲,它只用于估算。数值是用磁盘页来计算的,通常每个页面是8192字节。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX,单位为8KB。 + +比默认值高的数值可能会导致使用索引扫描,更低的数值可能会导致选择顺序扫描。 + +**默认值**:128MB + +## allocate\_mem\_cost + +**参数说明**:设置优化器计算Hash Join创建Hash表开辟内存空间所需的开销,供Hash join估算不准时调优使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~DBL\_MAX。 + +**默认值**:0 + diff --git "a/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" "b/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" new file mode 100644 index 000000000..8a1cfe90a --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" @@ -0,0 +1,335 @@ +# 优化器方法配置 + +这些配置参数提供了影响查询优化器选择查询规划的原始方法。如果优化器为特定的查询选择的缺省规划并不是最优的,可以通过使用这些配置参数强制优化器选择一个不同的规划来临时解决这个问题。更好的方法包括调节优化器开销常量、手动运行ANALYZE、增加配置参数default\_statistics\_target的值、增加使用ALTER TABLE SET STATISTICS为指定列增加收集的统计信息。 + +## enable\_bitmapscan + +**参数说明**:控制优化器对位图扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## force\_bitmapand + +**参数说明**:控制优化器强制使用bitmapand规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_hashagg + +**参数说明**:控制优化器对Hash聚集规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_hashjoin + +**参数说明**:控制优化器对Hash连接规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_indexscan + +**参数说明**:控制优化器对索引扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_indexonlyscan + +**参数说明**:控制优化器对仅索引扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_material + +**参数说明**:控制优化器对实体化的使用。消除整个实体化是不可能的,但是可以关闭这个变量以防止优化器插入实体节点。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_mergejoin + +**参数说明**:控制优化器对融合连接规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_nestloop + +**参数说明**:控制优化器对内表全表扫描嵌套循环连接规划类型的使用。完全消除嵌套循环连接是不可能的,但是关闭这个变量就会让优化器在存在其他方法的时候优先选择其他方法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_index\_nestloop + +**参数说明**:控制优化器对内表参数化索引扫描嵌套循环连接规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_seqscan + +**参数说明**:控制优化器对顺序扫描规划类型的使用。完全消除顺序扫描是不可能的,但是关闭这个变量会让优化器在存在其他方法的时候优先选择其他方法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_sort + +**参数说明**:控制优化器使用的排序步骤。完全消除明确的排序是不可能的,但是关闭这个变量可以让优化器在存在其他方法的时候优先选择其他方法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_tidscan + +**参数说明**:控制优化器对TID扫描规划类型的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_kill\_query + +**参数说明**:CASCADE模式删除用户时,会删除此用户拥有的所有对象。此参数标识是否允许在删除用户的时候,取消锁定此用户所属对象的query。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示允许取消锁定。 +- off表示不允许取消锁定。 + +**默认值**:off + +## enforce\_a\_behavior + +**参数说明:**控制正则表达式的规则匹配模式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示正则表达式采用A格式的匹配规则。 +- off表示正则表达式采用POSIX格式的匹配规则。 + +**默认值:**on + +## max\_recursive\_times + +**参数说明**:控制with recursive的最大迭代次数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX。 + +**默认值**:200 + +## enable\_vector\_engine + +**参数说明**:控制优化器对向量化执行引擎的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_broadcast + +**参数说明**:控制优化器对stream代价估算时对broadcast分布方式的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## enable\_change\_hjcost + +**参数说明**:控制优化器在Hash Join代价估算路径选择时,是否使用将内表运行时代价排除在Hash Join节点运行时代价外的估算方式。如果使用,则有利于选择条数少,但运行代价大的表做内表。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## enable\_absolute\_tablespace + +**参数说明:**控制表空间是否可以使用绝对路径。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示可以使用绝对路径。 +- off表示不可以使用绝对路径。 + +**默认值:**on + +## enable\_valuepartition\_pruning + +**参数说明:**是否对DFS分区表进行静态/动态优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示对DFS分区表进行静态/动态优化。 +- off表示不对DFS分区表进行静态/动态优化。 + +**默认值:**on + +## expected\_computing\_nodegroup + +**参数说明**:标识选定的计算Node Group模式或目标计算Node Group。Node Group目前为内部用机制,用户无需设置。 + +共4种计算Node Group模式,用于关联操作和聚集操作时选定计算Node Group。在每一种模式中,优化器有针对性地选定几个候选计算Node Group,然后根据代价,从中为当前算子挑选最佳计算Node Group。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- optimal:候选计算Node Group列表包含算子操作对象所在的Node Group和由当前用户具有COMPUTE权限的所有Node Group包含的数据库节点构成的Node Group +- query:候选计算Node Group列表包含算子操作对象所在的Node Group和由当前查询涉及的所有基表所在Node Group包含的数据库节点构成的Node Group +- Node Group名([enable\_nodegroup\_debug](#zh-cn_topic_0237124716_section1426622145210)被设置为off):候选计算Node Group列表包含算子操作对象所在的Node Group和该指定的Node Group +- Node Group名([enable\_nodegroup\_debug](#zh-cn_topic_0237124716_section1426622145210)被设置为on):候选计算Node Group为指定的Node Group + +**默认值**:query + +## enable\_nodegroup\_debug + +**参数说明**:控制优化器在多Node Group环境下,是否使用强制弹性计算。Node Group目前为内部用机制,用户无需设置。 + +该参数只在[expected\_computing\_nodegroup](#zh-cn_topic_0237124716_section746841514523)被设置为具体Node Group时生效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示强制将计算弹性到expected\_computing\_nodegroup所指定的Node Group进行计算。 +- off表示不强制使用某个Node Group进行计算。 + +**默认值**:off + +## qrw\_inlist2join\_optmode + +**参数说明**:控制是否使用inlist-to-join查询重写。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- disable:关闭inlist2join查询重写。 +- cost\_base:基于代价的inlist2join查询重写。 +- rule\_base:基于规则的inlist2join查询重写,即强制使用inlist2join查询重写。 +- 任意正整数:inlist2join查询重写阈值,即list内元素个数大于该阈值,进行inlist2join查询重写。 + +**默认值**:cost\_base + +## skew\_option + +**参数说明**:控制是否使用优化策略。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- off:关闭策略。 +- normal:采用激进策略。对于不确定是否出现倾斜的场景,认为存在倾斜,并进行相应优化。 +- lazy:采用保守策略。对于不确定是否出现倾斜场景,认为不存在倾斜,不进行优化。 + +**默认值**:normal + diff --git "a/content/zh/docs/Developerguide/\344\274\252\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\344\274\252\347\261\273\345\236\213.md" new file mode 100644 index 000000000..c50609c96 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\274\252\347\261\273\345\236\213.md" @@ -0,0 +1,122 @@ +# 伪类型 + +openGauss数据类型中包含一系列特殊用途的类型,这些类型按照类别被称为伪类型。伪类型不能作为字段的数据类型,但是可以用于声明函数的参数或者结果类型。 + +当一个函数不仅是简单地接受并返回某种SQL数据类型的情况下伪类型是很有用的。[表1](#zh-cn_topic_0237121961_zh-cn_topic_0059778153_t0c2699d96e0a4d17ae1c6b8908892f8d)列出了所有的伪类型。 + +**表 1** 伪类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

any

+

表示函数接受任何输入数据类型。

+

anyelement

+

表示函数接受任何数据类型。

+

anyarray

+

表示函数接受任意数组数据类型。

+

anynonarray

+

表示函数接受任意非数组数据类型。

+

anyenum

+

表示函数接受任意枚举数据类型。

+

anyrange

+

表示函数接受任意范围数据类型。

+

cstring

+

表示函数接受或者返回一个空结尾的C字符串。

+

internal

+

表示函数接受或者返回一种服务器内部的数据类型。

+

language_handler

+

声明一个过程语言调用句柄返回language_handler。

+

fdw_handler

+

声明一个外部数据封装器返回fdw_handler。

+

record

+

标识函数返回一个未声明的行类型。

+

trigger

+

声明一个触发器函数返回trigger。

+

void

+

表示函数不返回数值。

+

opaque

+

一个已经过时的类型,以前用于所有上面这些用途。

+
+ +声明用C编写的函数(不管是内置的还是动态装载的)都可以接受或者返回任何这样的伪数据类型。当伪类型作为参数类型使用时,用户需要保证函数的正常运行。 + +用过程语言编写的函数只能使用实现语言允许的伪类型。目前,过程语言都不允许使用作为参数类型的伪类型,并且只允许使用void和record作为结果类型。一些多态的函数还支持使用anyelement,anyarray,anynonarray anyenum和anyrange类型。 + +伪类型internal用于声明那种只能在数据库系统内部调用的函数,他们不能直接在SQL查询里调用。如果函数至少有一个internal类型的参数,则不能从SQL里调用他。建议不要创建任何声明返回internal的函数,除非他至少有一个internal类型的参数。 + +示例: + +``` +--创建表 +postgres=# create table t1 (a int); + +--插入两条数据 +postgres=# insert into t1 values(1),(2); + +--创建函数showall()。 +postgres=# CREATE OR REPLACE FUNCTION showall() RETURNS SETOF record +AS $$ SELECT count(*) from t1; $$ +LANGUAGE SQL; + +--调用函数showall()。 +postgres=# SELECT showall(); + showall +--------- + (2) +(1 row) + +--删除函数。 +postgres=# DROP FUNCTION showall(); + +--删除表 +postgres=# drop table t1; +``` + diff --git "a/content/zh/docs/Developerguide/\344\275\215\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\344\275\215\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..14f1d80c5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\215\344\270\262\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,144 @@ +# 位串函数和操作符 + +## 位串操作符 + +除了常用的比较操作符之外,还可以使用以下的操作符。&,|和\#的位串操作数必须等长。在位移的时候,保留原始的位串长度(并以0填充)。 + +- || + + 描述:位串之间进行连接。 + + 示例: + + ``` + postgres=# SELECT B'10001' || B'011' AS RESULT; + result + ---------- + 10001011 + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >单字段内部连续连接操作不能超过180次,若超过需拆分为多个连续连接的字符串,它们之间再做连接操作。 + >例如:str1||str2||str3||str4 拆分为 \(str1||str2\)||\(str3||str4\)。 + +- & + + 描述:位串之间进行“与”操作。 + + 示例: + + ``` + postgres=# SELECT B'10001' & B'01101' AS RESULT; + result + -------- + 00001 + (1 row) + ``` + +- | + + 描述:位串之间进行“或”操作。 + + 示例: + + ``` + postgres=# SELECT B'10001' | B'01101' AS RESULT; + result + -------- + 11101 + (1 row) + ``` + +- \# + + 描述:位串之间如果不一致进行“或”操作。如果两个位串中对应位置都为1或者0,则该位置返回为0。 + + 示例: + + ``` + postgres=# SELECT B'10001' # B'01101' AS RESULT; + result + -------- + 11100 + (1 row) + ``` + +- \~ + + 描述:位串之间进行“非”操作。 + + 示例: + + ``` + postgres=# SELECT ~B'10001'AS RESULT; + result + ---------- + 01110 + (1 row) + ``` + +- << + + 描述:位串进行左移操作。 + + 示例: + + ``` + postgres=# SELECT B'10001' << 3 AS RESULT; + result + ---------- + 01000 + (1 row) + ``` + +- \>\> + + 描述:位串进行右移操作。 + + 示例: + + ``` + postgres=# SELECT B'10001' >> 2 AS RESULT; + result + ---------- + 00100 + (1 row) + ``` + + +下面的SQL标准函数除了可以用于字符串之外,也可以用于位串:length,bit\_length,octet\_length,position,substring,overlay。 + +下面的函数用于位串和二进制字符串:get\_bit,set\_bit。当用于位串时,这些函数位数从字符串的第一位(最左边)作为0位。 + +另外,可以在整数和bit之间来回转换。示例: + +``` +postgres=# SELECT 44::bit(10) AS RESULT; + result +------------ + 0000101100 +(1 row) + +postgres=# SELECT 44::bit(3) AS RESULT; + result +-------- + 100 +(1 row) + +postgres=# SELECT cast(-44 as bit(12)) AS RESULT; + result +-------------- + 111111010100 +(1 row) + +postgres=# SELECT '1110'::bit(4)::integer AS RESULT; + result +-------- + 14 +(1 row) +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>只是转换为“bit”的意思是转换成bit\(1\),因此只会转换成整数的最低位。 + diff --git "a/content/zh/docs/Developerguide/\344\275\215\344\270\262\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\344\275\215\344\270\262\347\261\273\345\236\213.md" new file mode 100644 index 000000000..245035af4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\215\344\270\262\347\261\273\345\236\213.md" @@ -0,0 +1,44 @@ +# 位串类型 + +位串就是一串1和0的字符串。它们可以用于存储位掩码。 + +openGauss支持两种位串类型:bit\(n\)和bit varying\(n\),这里的n是一个正整数。 + +bit类型的数据必须准确匹配长度n,如果存储短或者长的数据都会报错。bit varying类型的数据是最长为n的变长类型,超过n的类型会被拒绝。一个没有长度的bit等效于bit\(1\),没有长度的bit varying表示没有长度限制。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果用户明确地把一个位串值转换成bit\(n\),则此位串右边的内容将被截断或者在右边补齐零,直到刚好n位,而不会抛出任何错误。 +>如果用户明确地把一个位串数值转换成bit varying\(n\),如果它超过了n位,则它的右边将被截断。 + +``` +--创建表。 +postgres=# CREATE TABLE bit_type_t1 +( + BT_COL1 INTEGER, + BT_COL2 BIT(3), + BT_COL3 BIT VARYING(5) +) ; + +--插入数据。 +postgres=# INSERT INTO bit_type_t1 VALUES(1, B'101', B'00'); + +--插入数据的长度不符合类型的标准会报错。 +postgres=# INSERT INTO bit_type_t1 VALUES(2, B'10', B'101'); +ERROR: bit string length 2 does not match type bit(3) +CONTEXT: referenced column: bt_col2 + +--将不符合类型长度的数据进行转换。 +postgres=# INSERT INTO bit_type_t1 VALUES(2, B'10'::bit(3), B'101'); + +--查看数据。 +postgres=# SELECT * FROM bit_type_t1; + bt_col1 | bt_col2 | bt_col3 +---------+---------+--------- + 1 | 101 | 00 + 2 | 100 | 101 +(2 rows) + +--删除表。 +postgres=# DROP TABLE bit_type_t1; +``` + 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" new file mode 100644 index 000000000..8223c25d5 --- /dev/null +++ "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" @@ -0,0 +1,11 @@ +# 使用COPY FROM STDIN导入数据 + +- **[关于COPY FROM STDIN导入数据](关于COPY-FROM-STDIN导入数据.md)** + +- **[CopyManager类简介](CopyManager类简介.md)** + +- **[示例1:通过本地文件导入导出数据](示例1-通过本地文件导入导出数据.md)** + +- **[示例2:从MySQL向openGauss进行数据迁移](示例2-从MySQL向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" new file mode 100644 index 000000000..c30c31d0c --- /dev/null +++ "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" @@ -0,0 +1,31 @@ +# 使用CREATE TABLE LIKE执行深层复制 + +该方法使用CREATE TABLE LIKE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。该方法不继承父表的主键和外键属性,您可以使用ALTER TABLE语句来添加它们。 + +## 操作步骤 + +1. 使用CREATE TABLE LIKE语句创建表customer\_t的副本customer\_t\_copy。 + + ``` + postgres=# CREATE TABLE customer_t_copy (LIKE customer_t); + ``` + +2. 使用INSERT INTO…SELECT语句向副本填充原始表中的数据。 + + ``` + postgres=# INSERT INTO customer_t_copy (SELECT * FROM customer_t); + ``` + +3. 删除原始表。 + + ``` + postgres=# DROP TABLE customer_t; + ``` + +4. 使用ALTER TABLE语句将副本重命名为原始表名称。 + + ``` + postgres=# ALTER TABLE customer_t_copy RENAME TO customer_t; + ``` + + 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" new file mode 100644 index 000000000..1ba5075d4 --- /dev/null +++ "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" @@ -0,0 +1,40 @@ +# 使用CREATE TABLE执行深层复制 + +该方法使用CREATE TABLE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。 + +在创建新表时,可以指定表以及列属性,包括主键和外键。 + +## 操作步骤 + +执行如下步骤对表customer\_t进行深层复制。 + +1. 使用CREATE TABLE语句创建表customer\_t的副本customer\_t\_copy。 + + ``` + postgres=# CREATE TABLE customer_t_copy + ( c_customer_sk integer, + c_customer_id char(5), + c_first_name char(6), + c_last_name char(8) + ) ; + ``` + +2. 使用INSERT INTO…SELECT语句向副本填充原始表中的数据。 + + ``` + postgres=# INSERT INTO customer_t_copy (SELECT * FROM customer_t); + ``` + +3. 删除原始表。 + + ``` + postgres=# DROP TABLE customer_t; + ``` + +4. 使用ALTER TABLE语句将副本重命名为原始表名称。 + + ``` + postgres=# ALTER TABLE customer_t_copy RENAME TO customer_t; + ``` + + 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" new file mode 100644 index 000000000..209d954b7 --- /dev/null +++ "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" @@ -0,0 +1,187 @@ +# 使用CSV格式写日志 + +## 前提条件 + +- [log\_destination](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_sb6c9884f69bd4765a60f80810c94f194)的值设置为csvlog。 +- [logging\_collector](记录日志的位置.md#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s61d6090c04ee464fb54f8b31936ba818)的值设置为on。 + +## csvlog定义 + +以“逗号分隔值” 即CSV(Comma Separated Value)的形式发出日志。 + +以下是简单的用来存储CSV形式日志输出的表定义: + +``` +CREATE TABLE postgres_log +( +log_time timestamp(3) with time zone, +user_name text, +database_name text, +process_id integer, +connection_from text, +"session_id" text, +session_line_num bigint, +command_tag text, +session_start_time timestamp with time zone, +virtual_transaction_id text, +transaction_id bigint, +error_severity text, +sql_state_code text, +message text, +detail text, +hint text, +internal_query text, +internal_query_pos integer, +context text, +query text, +query_pos integer, +location text, +application_name text, +PRIMARY KEY ("transaction_id", session_line_num) +); +``` + +详细说明请参见[表1](#zh-cn_topic_0237124724_zh-cn_topic_0059779007_zh-cn_topic_0058967802_table44188316)。 + +**表 1** csvlog字段含义表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

字段名

+

字段含义

+

字段名

+

字段含义

+

log_time

+

毫秒级的时间戳

+

sql_state_code

+

SQLSTATE代码

+

user_name

+

用户名

+

message

+

错误消息

+

database_name

+

数据库名

+

detail

+

详细错误消息

+

process_id

+

进程ID

+

hint

+

提示

+

connection_from

+

客户主机:端口号

+

internal_query

+

内部查询(查询那些导致错误的信息,如果有的话)

+

session_id

+

会话ID

+

internal_query_pos

+

内部查询指针

+

session_line_num

+

每个会话的行数

+

context

+

环境

+

command_tag

+

命令标签

+

query

+

错误发生位置的字符统计

+

session_start_time

+

会话开始时间

+

query_pos

+

错误发生位置指针

+

virtual_transaction_id

+

常规事务

+

location

+

openGauss源代码中错误的位置(如果log_error_verbosity的值设为verbose )

+

transaction_id

+

事务ID

+

application_name

+

应用名称

+

error_state_code

+

ERRORSTATE代码

+

-

+

-

+
+ +使用COPY FROM命令将日志文件导入这个表: + +``` +COPY postgres_log FROM '/opt/data/pg_log/logfile.csv' WITH csv; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>此处的日志名“logfile.csv”要换成实际生成的日志的名称。 + +## 简化输入 + +简化输入到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\250DML\345\221\275\344\273\244\346\233\264\346\226\260\350\241\250.md" "b/content/zh/docs/Developerguide/\344\275\277\347\224\250DML\345\221\275\344\273\244\346\233\264\346\226\260\350\241\250.md" new file mode 100644 index 000000000..d935f39ae --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250DML\345\221\275\344\273\244\346\233\264\346\226\260\350\241\250.md" @@ -0,0 +1,70 @@ +# 使用DML命令更新表 + +openGauss支持标准的数据库操作语言(DML)命令,对表进行更新。 + +## 操作步骤 + +假设存在表customer\_t,表结构如下: + +``` +postgres=# CREATE TABLE customer_t +( c_customer_sk integer, + c_customer_id char(5), + c_first_name char(6), + c_last_name char(8) +) ; +``` + +可以使用如下DML命令对表进行数据更新。 + +- 使用INSERT向表中插入数据。 + - 向表customer\_t中插入一行。 + + ``` + postgres=# INSERT INTO customer_t (c_customer_sk, c_customer_id, c_first_name,c_last_name) VALUES (3769, 5, 'Grace','White'); + ``` + + - 向表customer\_t中插入多行数据。 + + ``` + postgres=# INSERT INTO customer_t (c_customer_sk, c_customer_id, c_first_name,c_last_name) VALUES + (6885, 1, 'Joes', 'Hunter'), + (4321, 2, 'Lily','Carter'), + (9527, 3, 'James', 'Cook'), + (9500, 4, 'Lucy', 'Baker'); + ``` + + 更多关于INSERT的使用方法,请参见[向表中插入数据](向表中插入数据.md)。 + + +- 使用UPDATE更新表中数据。修改字段c\_customer\_id值为0。 + + ``` + postgres=# UPDATE customer_t SET c_customer_id = 0; + ``` + + 更多关于UPDATE的使用方法,请参见[UPDATE](UPDATE.md)。 + +- 使用DELETE删除表中的行。 + + 可以使用WHERE子句指定需要删除的行,若不指定即删除表中所有的行,只保留数据结构。 + + ``` + postgres=# DELETE FROM customer_t WHERE c_last_name = 'Baker'; + ``` + + 更多关于DELETE的使用方法,请参见[DELETE](DELETE.md)。 + +- 使用TRUNCATE命令快速从表中删除所有的行。 + + ``` + postgres=# TRUNCATE TABLE customer_t; + ``` + + 更多关于TRUNCATE的使用方法,请参见[TRUNCATE](TRUNCATE.md)。 + + 删除表时,DELETE语句每次删除一行数据而TRUNCATE语句是通过释放表存储的数据页来删除数据,使用TRUNCATE语句比使用DELETE语句更加快速。 + + 使用DELETE语句删除表时,仅删除数据,不释放存储空间。使用TRUNCATE语句删除表时,删除数据且释放存储空间。 + + 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" new file mode 100644 index 000000000..764699237 --- /dev/null +++ "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" @@ -0,0 +1,11 @@ +# 使用gs\_dump和gs\_dumpall命令导出数据 + +- **[概述](概述-12.md)** + +- **[导出单个数据库](导出单个数据库.md)** + +- **[导出所有数据库](导出所有数据库.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" new file mode 100644 index 000000000..5b78d7ae6 --- /dev/null +++ "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" @@ -0,0 +1,303 @@ +# 使用gs\_restore命令导入数据 + +## 操作场景 + +gs\_restore是openGauss提供的与gs\_dump配套的导入工具。通过该工具,可将gs\_dump导出的文件导入至数据库。gs\_restore支持导入的文件格式包含自定义归档格式、目录归档格式和tar归档格式。 + +gs\_restore具备如下两种功能。 + +- 导入至数据库 + + 如果指定了数据库,则数据将被导入到指定的数据库中。其中,并行导入必须指定连接数据库的密码。 + +- 导入至脚本文件 + + 如果未指定导入数据库,则创建包含重建数据库所需的SQL语句脚本,并将其写入至文件或者标准输出。该脚本文件等效于gs\_dump导出的纯文本格式文件。 + + +gs\_restore工具在导入时,允许用户选择需要导入的内容,并支持在数据导入前对等待导入的内容进行排序。 + +## 操作步骤 + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_restore默认是以追加的方式进行数据导入。为避免多次导入造成数据异常,在进行导入时,建议选择使用"-c" 和"-e"参数。"-c"表示在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象;"-e"表示当发送SQL语句到数据库时如果出现错误请退出,默认状态下会继续,且在导入后会显示一系列错误信息。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_restore命令,从postgres整个数据库内容的导出文件中,将数据库的所有对象的定义导入到backupdb。 + + ``` + gs_restore -W Bigdata@123 -U jack /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb -s -e -c + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名。

+

-U jack

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项;
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-d

+

连接数据库dbname,并直接将数据导入到该数据库中。

+

-d backupdb

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+

-e

+

当发送SQL语句到数据库时如果出现错误,退出当前出现错误的任务,并执行其他导入任务。即默认状态下会忽略错误任务并继续执行导入,且在导入后会显示一系列错误信息。

+

-

+

-c

+

在重新创建数据库对象前,清理(删除)已存在于将要导入的数据库中的数据库对象。

+

-

+

-s

+

只导入模式定义,不导入数据。当前的序列值也不会被导入。

+

-

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_restor”章节。 + + +## 示例 + +示例一:执行gs\_restore,导入指定MPPDB\_backup.dmp文件(自定义归档格式)中postgres数据库的数据和对象定义。 + +``` +gs_restore -W Bigdata@123 backup/MPPDB_backup.dmp -p 8000 -d backupdb +gs_restore[2017-07-21 19:16:26]: restore operation successful +gs_restore: total time: 13053 ms +``` + +示例二:执行gs\_restore,导入指定MPPDB\_backup.tar文件(tar归档格式)中postgres数据库的数据和对象定义。 + +``` +gs_restore backup/MPPDB_backup.tar -p 8000 -d backupdb +gs_restore[2017-07-21 19:21:32]: restore operation successful +gs_restore[2017-07-21 19:21:32]: total time: 21203 ms +``` + +示例三:执行gs\_restore,导入指定MPPDB\_backup目录文件(目录归档格式)中postgres数据库的数据和对象定义。 + +``` +gs_restore backup/MPPDB_backup -p 8000 -d backupdb +gs_restore[2017-07-21 19:26:46]: restore operation successful +gs_restore[2017-07-21 19:26:46]: total time: 21003 ms +``` + +示例四:执行gs\_restore,将postgres数据库的所有对象的定义导入至backupdb数据库。导入前,postgres存在完整的定义和数据,导入后,backupdb数据库只存在所有对象定义,表没有数据。 + +``` +gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb -s -e -c +gs_restore[2017-07-21 19:46:27]: restore operation successful +gs_restore[2017-07-21 19:46:27]: total time: 32993 ms +``` + +示例五:执行gs\_restore,导入MPPDB\_backup.dmp文件中PUBLIC模式的所有定义和数据。在导入时会先删除已经存在的对象,如果原对象存在跨模式的依赖则需手工强制干预。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -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 8000 -d backupdb -e -c -n PUBLIC +gs_restore[2017-07-21 19:52:26]: restore operation successful +gs_restore[2017-07-21 19:52:26]: total time: 2203 ms +``` + +示例六:执行gs\_restore,导入MPPDB\_backup.dmp文件中PUBLIC模式下表hr.staffs的定义。在导入之前,hr.staffs表不存在。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -e -c -s -n PUBLIC -t hr.staffs +gs_restore[2017-07-21 19:56:29]: restore operation successful +gs_restore[2017-07-21 19:56:29]: total time: 21000 ms +``` + +示例七:执行gs\_restore,导入MPPDB\_backup.dmp文件中PUBLIC模式下表hr.staffs的数据。在导入之前,hr.staffs表不存在数据。 + +``` +gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -e -a -n PUBLIC -t hr.staffs +gs_restore[2017-07-21 20:12:32]: restore operation successful +gs_restore[2017-07-21 20:12:32]: total time: 20203 ms +``` + +示例八:执行gs\_restore,导入指定表hr.staffs的定义。在导入之前,hr.staffs表的数据是存在的。 + +``` +human_resource=# select * from hr.staffs; + staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id +----------+-------------+-------------+----------+--------------------+---------------------+---------------+----------+----------------+------------+------------ + 200 | Jennifer | Whalen | JWHALEN | 515.123.4444 | 1987-09-17 00:00:00 | AD_ASST | 4400.00 | | 101 | 10 + 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. + +human_resource=# drop table hr.staffs CASCADE; +NOTICE: drop cascades to view hr.staff_details_view +DROP TABLE + +gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup.tar -p 8000 -d human_resource -n hr -t staffs -s -e +restore operation successful +total time: 904 ms + +human_resource=# select * from hr.staffs; + staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id +----------+------------+-----------+-------+--------------+-----------+---------------+--------+----------------+------------+------------ +(0 rows) +``` + +示例九:执行gs\_restore,导入staffs和areas两个指定表的定义和数据。在导入之前,staffs和areas表不存在。 + +``` +human_resource=# \d + List of relations + Schema | Name | Type | Owner | Storage +--------+--------------------+-------+----------+---------------------------------- + hr | employment_history | table | omm | {orientation=row,compression=no} + hr | employments | table | omm | {orientation=row,compression=no} + hr | places | table | omm | {orientation=row,compression=no} + hr | sections | table | omm | {orientation=row,compression=no} + hr | states | table | omm | {orientation=row,compression=no} +(5 rows) + +gs_restore -W Bigdata@123 /home/gaussdb/backup/MPPDB_backup.tar -p 8000 -d human_resource -n hr -t staffs -n hr -t areas +restore operation successful +total time: 724 ms + +human_resource=# \d + List of relations + Schema | Name | Type | Owner | Storage +--------+--------------------+-------+----------+---------------------------------- + hr | areas | table | omm | {orientation=row,compression=no} + hr | employment_history | table | omm | {orientation=row,compression=no} + hr | employments | table | omm | {orientation=row,compression=no} + hr | places | table | omm | {orientation=row,compression=no} + hr | sections | table | omm | {orientation=row,compression=no} + hr | staffs | table | omm | {orientation=row,compression=no} + hr | states | table | omm | {orientation=row,compression=no} +(7 rows) + +human_resource=# select * from hr.areas; + area_id | area_name +---------+------------------------ + 4 | Middle East and Africa + 1 | Europe + 2 | Americas + 3 | Asia +(4 rows) +``` + +示例十:执行gs\_restore,导入hr的模式,包含模式下的所有对象定义和数据。 + +``` +gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup1.sql -p 8000 -d backupdb -n hr -e -c +restore operation successful +total time: 702 ms +``` + +示例十一:执行gs\_restore,同时导入hr和hr1两个模式,仅导入模式下的所有对象定义。 + +``` +gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup2.dmp -p 8000 -d backupdb -n hr -n hr1 -s +restore operation successful +total time: 665 ms +``` + +示例十二:执行gs\_restore,将human\_resource数据库导出文件进行解密并导入至backupdb数据库中。 + +``` +postgres=# create database backupdb; +CREATE DATABASE + +gs_restore /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb --with-key=1234567812345678 +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. + +backupdb=# select * from hr.areas; + area_id | area_name +---------+------------------------ + 4 | Middle East and Africa + 1 | Europe + 2 | Americas + 3 | Asia +(4 rows) +``` + +示例十三:用户user1不具备将导出文件中数据导入至数据库backupdb的权限,而角色role1具备该权限,要实现将文件数据导入数据库backupdb,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。 + +``` +human_resource=# CREATE USER user1 IDENTIFIED BY "1234@abc"; +CREATE ROLE + +gs_restore -U user1 -W 1234@abc /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb --role role1 --rolepassword abc@1234 +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. + +backupdb=# select * from hr.areas; + area_id | area_name +---------+------------------------ + 4 | Middle East and Africa + 1 | Europe + 2 | Americas + 3 | Asia +(4 rows) +``` + diff --git "a/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\345\205\203\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\250gsql\345\205\203\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" new file mode 100644 index 000000000..943997903 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\345\205\203\345\221\275\344\273\244\345\257\274\345\205\245\346\225\260\346\215\256.md" @@ -0,0 +1,199 @@ +# 使用gsql元命令导入数据 + +DWS的gsql工具提供了元命令\\copy进行数据导入。 + +## \\copy命令 + +\\copy命令格式以及说明参见[表 1 \\copy元命令说明](#zh-cn_topic_0237121136_zh-cn_topic_0117407672_table65007762203657)。 + +**表 1** \\copy元命令说明 + + + + + + + + + + +

语法

+

说明

+

\copy { table [ ( column_list ) ] |

+

( query ) } { from | to } { filename |

+

stdin | stdout | pstdin | pstdout }

+

[ with ] [ binary ] [ delimiter

+

[ as ] 'character' ] [ null [ as ] 'string' ]

+

[ csv [ header ] [ quote [ as ]

+

'character' ] [ escape [ as ] 'character' ]

+

[ force quote column_list | * ] [ force

+

not null column_list ] ]

+

在任何gsql客户端登录数据库成功后,可以使用该命令进行数据的导入/导出。但是与SQL的COPY命令不同,该命令读取/写入的文件是本地文件,而非数据库服务器端文件;所以,要操作的文件的可访问性、权限等,都是受限于本地用户的权限。

+
说明:

\COPY只适合小批量、格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。导入数据应优先选择GDS或COPY。

+
+
+ +## 参数说明 + +- table + + 表的名称(可以有模式修饰)。 + + 取值范围:已存在的表名。 + +- column\_list + + 可选的待拷贝字段列表。 + + 取值范围:任意字段。如果没有声明字段列表,将使用所有字段。 + +- query + + 其结果将被拷贝。 + + 取值范围:一个必须用圆括弧包围的SELECT或VALUES命令。 + +- filename + + 文件的绝对路径。执行copy命令的用户必须有此路径的写权限。 + +- stdin + + 声明输入是来自标准输入。 + +- stdout + + 声明输出打印到标准输出。 + +- pstdin + + 声明输入是来自gsql的标准输入。 + +- pstout +- 声明输出打印到gsql的标准输出。 +- binary + + 使用二进制格式存储和读取,而不是以文本的方式。在二进制模式下,不能声明DELIMITER,NULL,CSV选项。指定binary类型后,不能再通过option或copy\_option指定CSV、FIXED、TEXT等类型。 + +- delimiter \[ as \] 'character' + + 指定数据文件行数据的字段分隔符。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 分隔符不能是\\r和\\n。 + >- 分隔符不能和null参数相同,CSV格式数据的分隔符不能和quote参数相同。 + >- TEXT格式数据的分隔符不能包含: \\.abcdefghijklmnopqrstuvwxyz0123456789。 + >- 数据文件中单行数据长度需<1GB,如果分隔符较长且数据列较多的情况下,会影响导出有效数据的长度。 + >- 分隔符推荐使用多字符和不可见字符。多字符例如'$^&';不可见字符例如0x07,0x08,0x1b等。 + + 取值范围:支持多字符分隔符,但分隔符不能超过10个字节。 + + 默认值: + + - TEXT格式的默认分隔符是水平制表符(tab)。 + - CSV格式的默认分隔符为“,”。 + - FIXED格式没有分隔符。 + +- null \[ as \] 'string' + + 用来指定数据文件中空值的表示。 + + 取值范围: + + - null值不能是\\r和\\n,最大为100个字符。 + - null值不能和分隔符、quote参数相同。 + + 默认值: + + - CSV格式下默认值是一个没有引号的空字符串。 + - 在TEXT格式下默认值是\\N。 + +- header + + 指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。header只能用于CSV,FIXED格式的文件中。 + + 在导入数据时,如果header选项为on,则数据文本第一行会被识别为标题行,会忽略此行。如果header为off,而数据文件中第一行会被识别为数据。 + + 在导出数据时,如果header选项为on,则需要指定fileheader。fileheader是指定导出数据包含标题行的定义文件。如果header为off,则导出数据文件不包含标题行。 + + 取值范围:true/on,false/off。 + + 默认值:false + +- quote \[ as \] 'character' + + CSV格式文件下的引号字符。 + + 默认值:双引号。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- quote参数不能和分隔符、null参数相同。 + >- quote参数只能是单字节的字符。 + >- 推荐不可见字符作为quote,例如0x07,0x08,0x1b等。 + +- escape \[ as \] 'character' + + CSV格式下,用来指定逃逸字符,逃逸字符只能指定为单字节字符。 + + 默认值:双引号。当与quote值相同时,会被替换为'\\0'。 + +- force quote column\_list | \* + + 在CSV COPY TO模式下,强制在每个声明的字段周围对所有非NULL值都使用引号包围。NULL输出不会被引号包围。 + + 取值范围:已存在的字段。 + +- force not null column\_list + + 在CSV COPY FROM模式下,指定的字段输入不能为空。 + + 取值范围:已存在的字段。 + + +## 任务示例 + +1. 创建目标表a。 + + ``` + postgres=# CREATE TABLE a(a int); + ``` + +2. 导入数据。 + 1. 从stdin拷贝数据到目标表a。 + + ``` + postgres=# \copy a from stdin; + ``` + + 出现\>\>符号提示时,输入数据,输入\\.时结束。 + + ``` + Enter data to be copied followed by a newline. + End with a backslash and a period on a line by itself. + >> 1 + >> 2 + >> \. + ``` + + 查询导入目标表a的数据。 + + ``` + postgres=# SELECT * FROM a; + a + --- + 1 + 2 + (2 rows) + ``` + + 2. 从本地文件拷贝数据到目标表a。假设存在本地文件/home/omm/2.csv。 + + - 分隔符为‘,’。 + - 在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 + + ``` + postgres=# \copy a FROM '/home/omm/2.csv' WITH (delimiter',',IGNORE_EXTRA_DATA 'on'); + ``` + + + 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" new file mode 100644 index 000000000..8d081fde5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250gsql\350\277\236\346\216\245.md" @@ -0,0 +1,114 @@ +# 使用gsql连接 + +gsql是openGauss提供的在命令行下运行的数据库连接工具。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节只介绍如何使用gsql连接数据库,关于gsql使用方法的更多信息请参考《工具参考》中“客户端工具 \> gsql”章节。 + +## 注意事项 + +缺省情况下,客户端连接数据库后处于空闲状态时会根据参数[session\_timeout](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_see4820fb6c024e0aa4c56882aeae204a)的默认值自动断开连接。如果要关闭超时设置,设置参数[session\_timeout](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_see4820fb6c024e0aa4c56882aeae204a)为0即可。 + +## 前提条件 + +已[确认连接信息](确认连接信息.md)。 + +## 本地连接数据库 + +1. 以操作系统用户omm登录数据库主节点。 +2. 连接数据库。 + + 数据库安装完成后,默认生成名称为postgres的数据库。第一次连接数据库时可以连接到此数据库。 + + 执行如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + 其中postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + omm用户是管理员用户,因此系统显示“DBNAME=\#”。若使用普通用户身份登录和连接数据库,系统显示“DBNAME=\>”。 + + “Non-SSL connection”表示未使用SSL方式连接数据库。 + +3. 首次登录需要修改密码。原始密码固定为XuanYuan@2012,需将原始密码修改为自定义的密码,例如Mypwd123,命令如下: + + ``` + postgres=# ALTER ROLE omm IDENTIFIED BY 'Mypwd123' REPLACE 'XuanYuan@2012'; + ``` + +4. 退出数据库。 + + ``` + postgres=# \q + ``` + + +## 远程连接数据库 + +1. 完成远程连接配置,操作步骤参见[配置服务端远程连接](配置服务端远程连接.md)。 +2. 在客户端机器(10.10.0.30)上,上传客户端工具包并配置gsql的执行环境变量。 + 1. 以root用户登录客户端机器。 + 2. 创建“/tmp/tools”目录。 + + ``` + mkdir /tmp/tools + ``` + + 3. 获取软件安装包中的“-EULER-64bit-ClientTools.tar.gz”上传到“/tmp/tools”路径下。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 软件包相对位置为安装时所放位置,根据实际情况填写。 + >- 不同的操作系统,工具包文件名称会有差异。请根据实际的操作系统类型选择对应的工具包。 + + 4. 解压文件。 + + ``` + cd /tmp/tools + tar -zxvf openGauss-1.0.0-EULER-64bit-ClientTools.tar.gz + ``` + + 5. 设置环境变量。 + + 打开“\~/.bashrc”文件。 + + ``` + vi ~/.bashrc + ``` + + 在其中输入如下内容后,使用“:wq!”命令保存并退出。 + + ``` + export PATH=/tmp/tools/bin:$PATH + export LD_LIBRARY_PATH=/tmp/tools/lib:$LD_LIBRARY_PATH + ``` + + 6. 使环境变量配置生效。 + + ``` + source ~/.bashrc + ``` + +3. 连接数据库。 + + 数据库安装完成后,默认生成名称为postgres的数据库。第一次连接数据库时可以连接到此数据库。 + + ``` + gsql -d postgres -h 10.10.0.11 -U jack -p 8000 -W Test@123 + ``` + + postgres为需要连接的数据库名称,10.10.0.11为数据库主节点所在的服务器IP地址,jack为连接数据库的用户,8000为数据库主节点的端口号,Test@123为连接数据库用户jack的密码。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 连接openGauss的机器与openGauss不在同一网段时,-h指定的IP地址应为Manager界面上所设的coo.cooListenIp2(应用访问IP)的取值。 + >- 禁止使用omm用户进行远程连接数据库。 + + 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" new file mode 100644 index 000000000..fd0ac3edf --- /dev/null +++ "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" @@ -0,0 +1,142 @@ +# 使用合并方式更新和插入数据 + +在用户需要将一个表中所有的数据或大量的数据添加至现有表的场景下,openGauss提供了MERGE INTO语句通过两个表合并的方式高效地将新数据添加到现有表。 + +MERGE INTO语句将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,关联条件不匹配时对目标表执行INSERT。此方法可以很方便地用来将两个表合并执行UPDATE和INSERT,避免多次执行。 + +## 前提条件 + +进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。 + +## 操作步骤 + +1. 创建源表products,并插入数据。 + + ``` + postgres=# CREATE TABLE products + ( product_id INTEGER, + product_name VARCHAR2(60), + category VARCHAR2(60) + ); + + postgres=# INSERT INTO products VALUES + (1502, 'olympus camera', 'electrncs'), + (1601, 'lamaze', 'toys'), + (1666, 'harry potter', 'toys'), + (1700, 'wait interface', 'books'); + ``` + +2. 创建目标表newproducts,并插入数据。 + + ``` + postgres=# CREATE TABLE newproducts + ( product_id INTEGER, + product_name VARCHAR2(60), + category VARCHAR2(60) + ); + + postgres=# INSERT INTO newproducts VALUES + (1501, 'vivitar 35mm', 'electrncs'), + (1502, 'olympus ', 'electrncs'), + (1600, 'play gym', 'toys'), + (1601, 'lamaze', 'toys'), + (1666, 'harry potter', 'dvd'); + ``` + +3. 使用MERGE INTO 语句将源表products的数据合并至目标表newproducts。 + + ``` + postgres=# MERGE INTO newproducts np + USING products p + ON (np.product_id = p.product_id ) + WHEN MATCHED THEN + UPDATE SET np.product_name = p.product_name, np.category = p.category + WHEN NOT MATCHED THEN + 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** MERGE INTO语句参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

举例

+

INTO 子句

+

指定需要更新或插入数据的目标表。

+
  • 目标表支持指定别名。
  • 目标表不支持复制表。
+

取值:newproducts np

+

说明:名为newproducts,别名为np的目标表。

+

USING子句

+

指定源表。源表支持指定别名。

+

取值:products p

+

名为products,别名为p的源表。

+

ON子句

+

指定目标表和源表的关联条件。

+

关联条件中的字段不支持更新。

+

取值:np.product_id = p.product_id

+

说明:指定的关联条件为,目标表newproducts的product_id字段和源表products的product_id字段相等。

+

+

WHEN MATCHED子句

+

当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。

+
  • 仅支持指定一个WHEN MATCHED子句。
  • WHEN MATCHED子句可缺省,缺省时,对于满足ON子句条件的行,不进行任何操作。
  • 若目标表中存在分布列,则该列不支持更新。
+

取值:WHEN MATCHED THEN UPDATE SET np.product_name = p.product_name, np.category = p.category

+

说明:当满足ON子句条件时,将目标表newproducts的product_name、category字段的值替换为源表products相对应字段的值。

+

WHEN NOT MATCHED子句

+

当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。

+
  • 仅支持指定一个WHEN NOT MATCHED子句。
  • WHEN NOT MATCHED子句可缺省。
  • 不支持INSERT子句中包含多个VALUES。

    +
  • WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省。

    +
+

取值:WHEN NOT MATCHED THEN

+

INSERT VALUES (p.product_id, p.product_name, p.category)

+

说明:将源表products中,不满足ON子句条件的行插入目标表products。

+
+ +4. 查询合并后的目标表newproducts。 + + ``` + postgres=# SELECT * FROM newproducts; + ``` + + 返回信息如下: + + ``` + product_id | product_name | category + ------------+----------------+----------- + 1501 | vivitar 35mm | electrncs + 1502 | olympus camera | electrncs + 1666 | harry potter | toys + 1600 | play gym | toys + 1601 | lamaze | toys + 1700 | wait interface | books + (6 rows) + ``` + + 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\215\227.md" new file mode 100644 index 000000000..26b3219a1 --- /dev/null +++ "b/content/zh/docs/Developerguide/\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -0,0 +1,192 @@ +# 使用指南 + +## 数据收集 + +1. 打开数据收集。 + 1. 设置ActiveSQL operator信息相关参数: + + ``` + enable_resource_track=on + resource_track_level=operator + enable_resource_record=on + resource_track_cost=10(默认值为100000) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- resource\_track\_cost需设置为小于需要收集的查询总代价,满足条件的信息才能被收集。 + >- Cgroups功能正常加载。 + + 2. 信息收集: + + 执行业务查询语句。 + + 查看实时收集数据: + + ``` + select * from gs_wlm_plan_operator_history; + ``` + + 预期:满足resource\_track\_duration和resource\_track\_cost的作业被全量收集。 + +2. 关闭数据收集。 + 1. 设置ActiveSQL operator信息相关参数: + + ``` + enable_resource_track=off 或 + resource_track_level=none 或 + resource_track_level=query + ``` + + 2. 执行业务查询语句。 + + 等待三分钟之后查看当前节点上的数据: + + ``` + select * from gs_wlm_plan_operator_info; + ``` + + 预期:所查表和视图无新增数据。 + +3. 数据持久化保存。 + 1. 设置ActiveSQL operator信息相关参数: + + ``` + enable_resource_track=on + resource_track_level=operator + enable_resource_record=on + resource_track_duration=0(默认值为60s) + resource_track_cost=10(默认值为100000) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- resource\_track\_cost需设置为小于需要收集的查询总代价,满足条件的信息才能被收集。 + >- Cgroups功能正常加载。 + + 2. 执行业务查询语句。 + + 等待三分钟之后查看当前节点上的数据: + + ``` + select * from gs_wlm_plan_operator_info; + ``` + + 预期:满足resource\_track\_duration和resource\_track\_cost的作业被全量收集。 + + + +## 模型管理(系统管理员用户) + +>![](public_sys-resources/icon-note.gif) **说明:** +>模型管理操作需要在数据库正常的状态下进行。 + +1. 新增模型: + + INSERT INTO gs\_opt\_model values\('......'\); + + 示例: + + ``` + INSERT INTO gs_opt_model values('rlstm', 'model_name', 'datname', '127.0.0.1', 5000, 2000, 1, -1, 64, 512, 0 , false, false, '{S, T}', '{0,0}', '{0,0}', 'Text'); + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 具体模型参数设置请参考[GS\_OPT\_MODEL](GS_OPT_MODEL.md)。 + >- 目前 "template\_name" 列只支持 "rlstm"; + >- "datname" 列请和用于模型使用和训练的数据库保持一致,否则无法使用。 + >- "model\_name" 一列需要满足unique约束。 + >- 其他参数设置见产品文档[最佳实践](最佳实践.md)部分。 + +2. 修改模型参数: + + ``` + UPDATE gs_opt_model SET = WHERE model_name = ; + ``` + +3. 删除模型: + + ``` + DELETE FROM gs_opt_model WHERE model_name = ; + ``` + +4. 查询现有模型及其状态: + + ``` + SELECT * FROM gs_opt_model; + ``` + + +## 模型训练(系统管理员用户) + +1. 配置/添加模型训练参数:参考[模型管理(系统管理员用户)](#section16140101211372)进行模型添加、模型参数修改,来指定训练参数。 + + 例: + + 模型添加: + + ``` + INSERT INTO gs_opt_model values('rlstm', 'default', 'postgres', '127.0.0.1', 5000, 2000, 1, -1, 64, 512, 0 , false, false, '{S, T}', '{0,0}', '{0,0}', 'Text'); + ``` + + 训练参数更新: + + ``` + UPDATE gs_opt_model SET = WHERE model_name = ; + ``` + +2. 前提条件为数据库状态正常且历史数据正常收集: + + 删除原有encoding数据: + + ``` + DELETE FROM gs_wlm_plan_encoding_table; + ``` + + 进行数据编码,需要指定数据库名: + + ``` + SELECT gather_encoding_info('postgres'); + ``` + + 开始训练: + + ``` + SELECT model_train_opt('rlstm', 'default'); + ``` + +3. 查看模型训练状态: + + ``` + SELECT * FROM track_model_train_opt('rlstm', 'default'); + ``` + + 返回Tensorboard所用URL: + + ![](figures/url.png) + + 打开URL查看模型训练状态: + + ![](figures/zh-cn_image_0243595915.png) + + +## 模型预测 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 模型预测功能需在数据库状态正常、指定模型已被训练且收敛的条件下进行。 +>- 目前,模型训练参数的标签设置中需要包含“S”标签,explain中才可显示“p-time”预测值。 +> 例:INSERT INTO gs\_opt\_model values\('rlstm', 'default', 'postgres', '127.0.0.1', 5000, 1000, 1, -1, 50, 500, 0 , false, false, '\{**S**, T\}', '\{0,0\}', '\{0,0\}', 'Text'\); + +1. 调用explain接口: + + ``` + explain (analyze on, predictor ) + SELECT ... + ``` + + 预期结果: + + ``` + 例:Row Adapter (cost=110481.35..110481.35 rows=100 p-time=99..182 width=100) (actual time=375.158..375.160 rows=2 loops=1) + 其中,“p-time”列为标签预测值。 + ``` + + diff --git "a/content/zh/docs/Developerguide/\345\200\274\345\255\230\345\202\250.md" "b/content/zh/docs/Developerguide/\345\200\274\345\255\230\345\202\250.md" new file mode 100644 index 000000000..2a1633c6a --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\200\274\345\255\230\345\202\250.md" @@ -0,0 +1,30 @@ +# 值存储 + +## 值存储数据类型解析 + +1. 查找与目标字段准确的匹配。 +2. 试着将表达式直接转换成目标类型。如果已知这两种类型之间存在一个已注册的转换函数,那么直接调用该转换函数即可。如果表达式是一个未知类型文本,该文本字符串的内容将交给目标类型的输入转换过程。 +3. 检查一下看目标类型是否有长度转换。长度转换是一个从某类型到自身的转换。如果在pg\_cast表里面找到一个,那么在存储到目标字段之前先在表达式上应用。这样的转换函数总是接受一个额外的类型为integer的参数,它接收目标字段的atttypmod值(实际上是其声明长度,atttypmod的解释随不同的数据类型而不同),并且它可能接受一个Boolean类型的第三个参数,表示转换是显式的还是隐式的。转换函数负责施加那些长度相关的语义,比如长度检查或者截断。 + +## 示例 + +character存储类型转换。对一个目标列定义为character\(20\)的语句,下面的语句显示存储值的长度正确: + +``` +postgres=# CREATE TABLE tpcds.value_storage_t1 ( + VS_COL1 CHARACTER(20) +); +postgres=# INSERT INTO tpcds.value_storage_t1 VALUES('abcdef'); +postgres=# SELECT VS_COL1, octet_length(VS_COL1) FROM tpcds.value_storage_t1; + vs_col1 | octet_length +----------------------+-------------- + abcdef | 20 +(1 row) +) + +postgres=# DROP TABLE tpcds.value_storage_t1; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>这里真正发生的事情是两个unknown文本缺省解析成text,这样就允许||操作符解析成text连接。然后操作符的text结果转换成bpchar\("空白填充的字符型", character类型内部名称\)以匹配目标字段类型。不过,从text到bpchar的转换是二进制兼容的,这样的转换是隐含的并且实际上不做任何函数调用。最后,在系统表里找到长度转换函数bpchar\(bpchar, integer, Boolean\) 并且应用于该操作符的结果和存储的字段长。这个类型相关的函数执行所需的长度检查和额外的空白填充。 + diff --git "a/content/zh/docs/Developerguide/\345\201\234\347\224\250\350\257\215.md" "b/content/zh/docs/Developerguide/\345\201\234\347\224\250\350\257\215.md" new file mode 100644 index 000000000..33e86fccd --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\201\234\347\224\250\350\257\215.md" @@ -0,0 +1,27 @@ +# 停用词 + +停用词是很常见的词,几乎出现在每一个文档中,并且没有区分值。因此,在全文搜索的语境下可忽视它们。停用词处理逻辑和词典类型相关。例如,Ispell词典会先对标记进行规范化,然后再查看停用词表,而Snowball词典会最先检查输入标记是否为停用词。 + +例如,每个英文文本包含像a和the的单词,因此没必要将它们存储在索引中。然而,停用词影响tsvector中的位置,同时位置也会影响相关度: + +``` +postgres=# SELECT to_tsvector('english','in the list of stop words'); + to_tsvector +---------------------------- + 'list':3 'stop':5 'word':6 +``` + +位置1、2、4是停用词,所以不显示。为包含和不包含停用词的文档计算出的排序是完全不同的: + +``` +postgres=# SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop')); + ts_rank_cd +------------ + .05 + +postgres=# SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop')); + ts_rank_cd +------------ + .1 +``` + 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" new file mode 100644 index 000000000..04ad3327c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242.md" @@ -0,0 +1,23 @@ +# 全文检索 + +全文检索(或者说文本搜索)提供了查询可读性文档的能力,并且通过查询相关度将结果进行排序。搜索最常见的方式是:找到包含指定查询词的所有记录,并且按照查询顺序返回这些记录。 + +- **[介绍](介绍.md)** + +- **[表和索引](表和索引.md)** + +- **[控制文本搜索](控制文本搜索.md)** + +- **[附加功能](附加功能.md)** + +- **[解析器](解析器.md)** + +- **[词典](词典.md)** + +- **[配置示例](配置示例.md)** + +- **[测试和调试文本搜索](测试和调试文本搜索.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" new file mode 100644 index 000000000..1dce73f4a --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\250\346\226\207\346\243\200\347\264\242\346\246\202\350\277\260.md" @@ -0,0 +1,35 @@ +# 全文检索概述 + +文本搜索操作符在数据库中已存在多年。openGauss为文本数据类型提供\~、\~\*、LIKE和ILIKE操作符;但它们缺乏现代信息系统所要求的许多必要属性。这些缺憾可以通过使用索引及词典进行解决。 + +文本检索缺乏信息系统所要求的必要属性: + +- 没有语义支持,即使是英语。 + + 由于要识别派生词并不是那么容易,因此正则表达式也不能满足要求。如,satisfies和satisfy,当使用正则表达式寻找satisfy时,并不会查询到包含satisfies的文档。用户可以使用OR搜索多种派生形式,但过程非常繁琐。并且有些词会有上千的派生词,因此容易出错。 + + +- 没有对搜索结果的分类(排序)。当搜索出成千的文档时,查找效率很低。 + +- 由于没有索引的支持,每一次的搜索需要遍历所有的文档,整体搜索比较缓慢。 + +使用全文索引可以对文档进行预处理,并且可以使后续的搜索更快速。预处理过程包括: + +- 将文档解析成token。 + + 为每个文档标记不同类别的token是非常有必要的,例如:数字、文字、复合词、电子邮件地址,这样就可以做不同的处理。原则上token的类别依赖于具体的应用,但对于大多数的应用来说,可以使用一组预定义的token类。 + +- 将token转换为词素。 + + 词素像token一样是一个字符串,但它已经标准化处理,这样同一个词的不同形式是一样的。例如,标准化通常包括:将大写字母折成小写字母、删除后缀(如英语中的s或者es)。这将允许通过搜索找到同一个词的不同形式,不需要繁琐地输入所有可能的变形样式。同时,这一步通常会删除停用词。这些停用词通常因为太常见而对搜索无用。(总之,token是文档文本的原片段,而词素被认为是有用的索引和搜索词。)openGauss使用词典执行这一步,且提供了各种标准的词典。 + + +- 保存搜索优化后的预处理文档。 + + 比如,每个文档可以呈现为标准化词素的有序组合。伴随词素,通常还需要存储词素位置信息以用于邻近排序。因此文档包含的查询词越密集其排序越高。 + + +词典能够对token如何标准化做到细粒度控制。使用合适的词典,可以定义不被索引的停用词。 + +数据类型tsvector用于存储预处理文档,tsquery用于存储查询条件,详细请参见[文本搜索类型](文本搜索类型.md#ZH-CN_TOPIC_0242370420)。为这些数据类型提供的函数和操作符请参见[文本检索函数和操作符](文本检索函数和操作符.md#ZH-CN_TOPIC_0242370440)。其中最重要的是匹配运算符@@,将在[基本文本匹配](基本文本匹配.md#ZH-CN_TOPIC_0242370480)中介绍。 + 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" new file mode 100644 index 000000000..31ca91d1d --- /dev/null +++ "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" @@ -0,0 +1,9 @@ +# 关于COPY FROM STDIN导入数据 + +这种方式适合数据写入量不太大, 并发度不太高的场景。 + +用户可以使用以下方式通过COPY FROM STDIN语句直接向openGauss写入数据。 + +- 通过键盘输入向openGauss写入数据。详细请参见[COPY](COPY.md)。 +- 通过JDBC驱动的CopyManager接口从文件或者数据库向openGauss写入数据。此方法支持COPY语法中copy option的所有参数。 + 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" new file mode 100644 index 000000000..f28d8699e --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" @@ -0,0 +1,6293 @@ +# 关键字 + +SQL里有保留字和非保留字之分。根据标准,保留字决不能用做其他标识符。非保留字只是在特定的环境里有特殊的含义,而在其他环境里是可以用做标识符的。 + +**表 1** SQL关键字 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

关键字

+

openGauss

+

SQL:1999

+

SQL-92

+

ABORT

+

非保留

+

-

+

-

+

ABS

+

-

+

非保留

+

-

+

ABSOLUTE

+

非保留

+

保留

+

保留

+

ACCESS

+

非保留

+

-

+

-

+

ACCOUNT

+

非保留

+

-

+

-

+

ACTION

+

非保留

+

保留

+

保留

+

ADA

+

-

+

非保留

+

非保留

+

ADD

+

非保留

+

保留

+

保留

+

ADMIN

+

非保留

+

保留

+

-

+

AFTER

+

非保留

+

保留

+

-

+

AGGREGATE

+

非保留

+

保留

+

-

+

ALIAS

+

-

+

保留

+

-

+

ALL

+

保留

+

保留

+

保留

+

ALLOCATE

+

-

+

保留

+

保留

+

ALSO

+

非保留

+

-

+

-

+

ALTER

+

非保留

+

保留

+

保留

+

ALWAYS

+

非保留

+

-

+

-

+

ANALYSE

+

保留

+

-

+

-

+

ANALYZE

+

保留

+

-

+

-

+

AND

+

保留

+

保留

+

保留

+

ANY

+

保留

+

保留

+

保留

+

APP

+

非保留

+

-

+

-

+

ARE

+

-

+

保留

+

保留

+

ARRAY

+

保留

+

保留

+

-

+

AS

+

保留

+

保留

+

保留

+

ASC

+

保留

+

保留

+

保留

+

ASENSITIVE

+

-

+

非保留

+

-

+

ASSERTION

+

非保留

+

保留

+

保留

+

ASSIGNMENT

+

非保留

+

非保留

+

-

+

ASYMMETRIC

+

保留

+

非保留

+

-

+

AT

+

非保留

+

保留

+

保留

+

ATOMIC

+

-

+

非保留

+

-

+

ATTRIBUTE

+

非保留

+

-

+

-

+

AUTHID

+

保留

+

-

+

-

+

AUTHORIZATION

+

保留(可以是函数或类型)

+

保留

+

保留

+

AUTOEXTEND

+

非保留

+

-

+

-

+

AUTOMAPPED

+

非保留

+

-

+

-

+

AVG

+

-

+

非保留

+

保留

+

BACKWARD

+

非保留

+

-

+

-

+

BARRIER

+

非保留

+

-

+

-

+

BEFORE

+

非保留

+

保留

+

-

+

BEGIN

+

非保留

+

保留

+

保留

+

BEGIN_NON_ANOYBLOCK

+

非保留

+

-

+

-

+

BETWEEN

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

BIGINT

+

非保留(不能是函数或类型)

+

-

+

-

+

BINARY

+

保留(可以是函数或类型)

+

保留

+

-

+

BINARY_DOUBLE

+

非保留(不能是函数或类型)

+

-

+

-

+

BINARY_INTEGER

+

非保留(不能是函数或类型)

+

-

+

-

+

BIT

+

非保留(不能是函数或类型)

+

保留

+

保留

+

BITVAR

+

-

+

非保留

+

-

+

BIT_LENGTH

+

-

+

非保留

+

保留

+

BLOB

+

非保留

+

保留

+

-

+

BOOLEAN

+

非保留(不能是函数或类型)

+

保留

+

-

+

BOTH

+

保留

+

保留

+

保留

+

BUCKETS

+

保留

+

-

+

-

+

BREADTH

+

-

+

保留

+

-

+

BY

+

非保留

+

保留

+

保留

+

C

+

-

+

非保留

+

非保留

+

CACHE

+

非保留

+

-

+

-

+

CALL

+

非保留

+

保留

+

-

+

CALLED

+

非保留

+

非保留

+

-

+

CARDINALITY

+

-

+

非保留

+

-

+

CASCADE

+

非保留

+

保留

+

保留

+

CASCADED

+

非保留

+

保留

+

保留

+

CASE

+

保留

+

保留

+

保留

+

CAST

+

保留

+

保留

+

保留

+

CATALOG

+

非保留

+

保留

+

保留

+

CATALOG_NAME

+

-

+

非保留

+

非保留

+

CHAIN

+

非保留

+

非保留

+

-

+

CHAR

+

非保留(不能是函数或类型)

+

保留

+

保留

+

CHARACTER

+

非保留(不能是函数或类型)

+

保留

+

保留

+

CHARACTERISTICS

+

非保留

+

-

+

-

+

CHARACTER_LENGTH

+

-

+

非保留

+

保留

+

CHARACTER_SET_CATALOG

+

-

+

非保留

+

非保留

+

CHARACTER_SET_NAME

+

-

+

非保留

+

非保留

+

CHARACTER_SET_SCHEMA

+

-

+

非保留

+

非保留

+

CHAR_LENGTH

+

-

+

非保留

+

保留

+

CHECK

+

保留

+

保留

+

保留

+

CHECKED

+

-

+

非保留

+

-

+

CHECKPOINT

+

非保留

+

-

+

-

+

CLASS

+

非保留

+

保留

+

-

+

CLEAN

+

非保留

+

-

+

-

+

CLASS_ORIGIN

+

-

+

非保留

+

非保留

+

CLOB

+

非保留

+

保留

+

-

+

CLOSE

+

非保留

+

保留

+

保留

+

CLUSTER

+

非保留

+

-

+

-

+

COALESCE

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

COBOL

+

-

+

非保留

+

非保留

+

COLLATE

+

保留

+

保留

+

保留

+

COLLATION

+

保留(可以是函数或类型)

+

保留

+

保留

+

COLLATION_CATALOG

+

-

+

非保留

+

非保留

+

COLLATION_NAME

+

-

+

非保留

+

非保留

+

COLLATION_SCHEMA

+

-

+

非保留

+

非保留

+

COLUMN

+

保留

+

保留

+

保留

+

COLUMN_NAME

+

-

+

非保留

+

非保留

+

COMMAND_FUNCTION

+

-

+

非保留

+

非保留

+

COMMAND_FUNCTION_CODE

+

-

+

非保留

+

-

+

COMMENT

+

非保留

+

-

+

-

+

COMMENTS

+

非保留

+

-

+

-

+

COMMIT

+

非保留

+

保留

+

保留

+

COMMITTED

+

非保留

+

非保留

+

非保留

+

COMPRESS

+

非保留

+

-

+

-

+

COMPLETION

+

-

+

保留

+

-

+

CONCURRENTLY

+

保留(可以是函数或类型)

+

-

+

-

+

CONDITION

+

-

+

-

+

-

+

CONDITION_NUMBER

+

-

+

非保留

+

非保留

+

CONFIGURATION

+

非保留

+

-

+

-

+

CONNECT

+

-

+

保留

+

保留

+

CONNECTION

+

非保留

+

保留

+

保留

+

CONNECTION_NAME

+

-

+

非保留

+

非保留

+

CONSTRAINT

+

保留

+

保留

+

保留

+

CONSTRAINTS

+

非保留

+

保留

+

保留

+

CONSTRAINT_CATALOG

+

-

+

非保留

+

非保留

+

CONSTRAINT_NAME

+

-

+

非保留

+

非保留

+

CONSTRAINT_SCHEMA

+

-

+

非保留

+

非保留

+

CONSTRUCTOR

+

-

+

保留

+

-

+

CONTAINS

+

-

+

非保留

+

-

+

CONTENT

+

非保留

+

-

+

-

+

CONTINUE

+

非保留

+

保留

+

保留

+

CONVERSION

+

非保留

+

-

+

-

+

CONVERT

+

-

+

非保留

+

保留

+

COORDINATOR

+

非保留

+

-

+

-

+

COPY

+

非保留

+

-

+

-

+

CORRESPONDING

+

-

+

保留

+

保留

+

COST

+

非保留

+

-

+

-

+

COUNT

+

-

+

非保留

+

保留

+

CREATE

+

保留

+

保留

+

保留

+

CROSS

+

保留(可以是函数或类型)

+

保留

+

保留

+

CSV

+

非保留

+

-

+

-

+

CUBE

+

-

+

保留

+

-

+

CURRENT

+

非保留

+

保留

+

保留

+

CURRENT_CATALOG

+

保留

+

-

+

-

+

CURRENT_DATE

+

保留

+

保留

+

保留

+

CURRENT_PATH

+

-

+

保留

+

-

+

CURRENT_ROLE

+

保留

+

保留

+

-

+

CURRENT_SCHEMA

+

保留(可以是函数或类型)

+

-

+

-

+

CURRENT_TIME

+

保留

+

保留

+

保留

+

CURRENT_TIMESTAMP

+

保留

+

保留

+

保留

+

CURRENT_USER

+

保留

+

保留

+

保留

+

CURSOR

+

非保留

+

保留

+

保留

+

CURSOR_NAME

+

-

+

非保留

+

非保留

+

CYCLE

+

非保留

+

保留

+

-

+

DATA

+

非保留

+

保留

+

非保留

+

DATABASE

+

非保留

+

-

+

-

+

DATAFILE

+

非保留

+

-

+

-

+

DATE

+

非保留(不能是函数或类型)

+

保留

+

保留

+

DATETIME_INTERVAL_CODE

+

-

+

非保留

+

非保留

+

DATETIME_INTERVAL_PRECISION

+

-

+

非保留

+

非保留

+

DAY

+

非保留

+

保留

+

保留

+

DBCOMPATIBILITY

+

非保留

+

-

+

-

+

DEALLOCATE

+

非保留

+

保留

+

保留

+

DEC

+

非保留(不能是函数或类型)

+

保留

+

保留

+

DECIMAL

+

非保留(不能是函数或类型)

+

保留

+

保留

+

DECLARE

+

非保留

+

保留

+

保留

+

DECODE

+

非保留(不能是函数或类型)

+

-

+

-

+

DEFAULT

+

保留

+

保留

+

保留

+

DEFAULTS

+

非保留

+

-

+

-

+

DEFERRABLE

+

保留

+

保留

+

保留

+

DEFERRED

+

非保留

+

保留

+

保留

+

DEFINED

+

-

+

非保留

+

-

+

DEFINER

+

非保留

+

非保留

+

-

+

DELETE

+

非保留

+

保留

+

保留

+

DELIMITER

+

非保留

+

-

+

-

+

DELIMITERS

+

非保留

+

-

+

-

+

DELTA

+

非保留

+

-

+

-

+

DEPTH

+

-

+

保留

+

-

+

DEREF

+

-

+

保留

+

-

+

DESC

+

保留

+

保留

+

保留

+

DESCRIBE

+

-

+

保留

+

保留

+

DESCRIPTOR

+

-

+

保留

+

保留

+

DESTROY

+

-

+

保留

+

-

+

DESTRUCTOR

+

-

+

保留

+

-

+

DETERMINISTIC

+

非保留

+

保留

+

-

+

DIAGNOSTICS

+

-

+

保留

+

保留

+

DICTIONARY

+

非保留

+

保留

+

-

+

DIRECT

+

非保留

+

-

+

-

+

DIRECTORY

+

非保留

+

-

+

-

+

DISABLE

+

非保留

+

-

+

-

+

DISCARD

+

非保留

+

-

+

-

+

DISCONNECT

+

-

+

保留

+

保留

+

DISPATCH

+

-

+

非保留

+

-

+

DISTINCT

+

保留

+

保留

+

保留

+

DISTRIBUTE

+

非保留

+

-

+

-

+

DISTRIBUTION

+

非保留

+

-

+

-

+

DO

+

保留

+

-

+

-

+

DOCUMENT

+

非保留

+

-

+

-

+

DOMAIN

+

非保留

+

保留

+

保留

+

DOUBLE

+

非保留

+

保留

+

保留

+

DROP

+

非保留

+

保留

+

保留

+

DUPLICATE

+

非保留

+

-

+

-

+

DYNAMIC

+

-

+

保留

+

-

+

DYNAMIC_FUNCTION

+

-

+

非保留

+

非保留

+

DYNAMIC_FUNCTION_CODE

+

-

+

非保留

+

-

+

EACH

+

非保留

+

保留

+

-

+

ELSE

+

保留

+

保留

+

保留

+

ENABLE

+

非保留

+

-

+

-

+

ENCODING

+

非保留

+

-

+

-

+

ENCRYPTED

+

非保留

+

-

+

-

+

END

+

保留

+

保留

+

保留

+

END-EXEC

+

-

+

保留

+

保留

+

ENFORCED

+

非保留

+

-

+

-

+

ENUM

+

非保留

+

-

+

-

+

EOL

+

非保留

+

-

+

-

+

EQUALS

+

-

+

保留

+

-

+

ESCAPE

+

非保留

+

保留

+

保留

+

ESCAPING

+

非保留

+

-

+

-

+

EVERY

+

非保留

+

保留

+

-

+

EXCEPT

+

保留

+

保留

+

保留

+

EXCEPTION

+

-

+

保留

+

保留

+

EXCHANGE

+

非保留

+

-

+

-

+

EXCLUDE

+

非保留

+

-

+

-

+

EXCLUDING

+

非保留

+

-

+

-

+

EXCLUSIVE

+

非保留

+

-

+

-

+

EXEC

+

-

+

保留

+

保留

+

EXECUTE

+

非保留

+

保留

+

保留

+

EXISTING

+

-

+

非保留

+

-

+

EXISTS

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

EXPLAIN

+

非保留

+

-

+

-

+

EXTENSION

+

非保留

+

-

+

-

+

EXTERNAL

+

非保留

+

保留

+

保留

+

EXTRACT

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

FALSE

+

保留

+

保留

+

保留

+

FAMILY

+

非保留

+

-

+

-

+

FAST

+

非保留

+

-

+

-

+

FETCH

+

保留

+

保留

+

保留

+

FILEHEADER

+

非保留

+

-

+

-

+

FINAL

+

-

+

非保留

+

-

+

FIRST

+

非保留

+

保留

+

保留

+

FIXED

+

非保留

+

保留

+

保留

+

FLOAT

+

非保留(不能是函数或类型)

+

保留

+

保留

+

FOLLOWING

+

非保留

+

-

+

-

+

FOR

+

保留

+

保留

+

保留

+

FORCE

+

非保留

+

-

+

-

+

FOREIGN

+

保留

+

保留

+

保留

+

FORMATTER

+

非保留

+

-

+

-

+

FORTRAN

+

-

+

非保留

+

非保留

+

FORWARD

+

非保留

+

-

+

-

+

FOUND

+

-

+

保留

+

保留

+

FREE

+

-

+

保留

+

-

+

FREEZE

+

保留(可以是函数或类型)

+

-

+

-

+

FROM

+

保留

+

保留

+

保留

+

FULL

+

保留(可以是函数或类型)

+

保留

+

保留

+

FUNCTION

+

非保留

+

保留

+

-

+

FUNCTIONS

+

非保留

+

-

+

-

+

G

+

-

+

非保留

+

-

+

GENERAL

+

-

+

保留

+

-

+

GENERATED

+

-

+

非保留

+

-

+

GET

+

-

+

保留

+

保留

+

GLOBAL

+

非保留

+

保留

+

保留

+

GO

+

-

+

保留

+

保留

+

GOTO

+

-

+

保留

+

保留

+

GRANT

+

保留

+

保留

+

保留

+

GRANTED

+

非保留

+

非保留

+

-

+

GREATEST

+

非保留(不能是函数或类型)

+

-

+

-

+

GROUP

+

保留

+

保留

+

保留

+

GROUPING

+

-

+

保留

+

-

+

HANDLER

+

非保留

+

-

+

-

+

HAVING

+

保留

+

保留

+

保留

+

HEADER

+

非保留

+

-

+

-

+

HIERARCHY

+

-

+

非保留

+

-

+

HOLD

+

非保留

+

非保留

+

-

+

HOST

+

-

+

保留

+

-

+

HOUR

+

非保留

+

保留

+

保留

+

IDENTIFIED

+

非保留

+

-

+

-

+

IDENTITY

+

非保留

+

保留

+

保留

+

IF

+

非保留

+

-

+

-

+

IGNORE

+

-

+

保留

+

-

+

ILIKE

+

保留(可以是函数或类型)

+

-

+

-

+

IMMEDIATE

+

非保留

+

保留

+

保留

+

IMMUTABLE

+

非保留

+

-

+

-

+

IMPLEMENTATION

+

-

+

非保留

+

-

+

IMPLICIT

+

非保留

+

-

+

-

+

IN

+

保留

+

保留

+

保留

+

INCLUDING

+

非保留

+

-

+

-

+

INCREMENT

+

非保留

+

-

+

-

+

INDEX

+

非保留

+

-

+

-

+

INDEXES

+

非保留

+

-

+

-

+

INDICATOR

+

-

+

保留

+

保留

+

INFIX

+

-

+

非保留

+

-

+

INHERIT

+

非保留

+

-

+

-

+

INHERITS

+

非保留

+

-

+

-

+

INITIAL

+

非保留

+

-

+

-

+

INITIALIZE

+

-

+

保留

+

-

+

INITIALLY

+

保留

+

保留

+

保留

+

INITRANS

+

非保留

+

-

+

-

+

INLINE

+

非保留

+

-

+

-

+

INNER

+

保留(可以是函数或类型)

+

保留

+

保留

+

INOUT

+

非保留(不能是函数或类型)

+

保留

+

-

+

INPUT

+

非保留

+

保留

+

保留

+

INSENSITIVE

+

非保留

+

非保留

+

保留

+

INSERT

+

非保留

+

保留

+

保留

+

INSTANCE

+

-

+

非保留

+

-

+

INSTANTIABLE

+

-

+

非保留

+

-

+

INSTEAD

+

非保留

+

-

+

-

+

INT

+

非保留(不能是函数或类型)

+

保留

+

保留

+

INTEGER

+

非保留(不能是函数或类型)

+

保留

+

保留

+

INTERSECT

+

保留

+

保留

+

保留

+

INTERVAL

+

非保留(不能是函数或类型)

+

保留

+

保留

+

INTO

+

保留

+

保留

+

保留

+

INVOKER

+

非保留

+

非保留

+

-

+

IS

+

保留

+

保留

+

保留

+

ISNULL

+

非保留

+

-

+

-

+

ISOLATION

+

非保留

+

保留

+

保留

+

ITERATE

+

-

+

保留

+

-

+

JOIN

+

保留(可以是函数或类型)

+

保留

+

保留

+

K

+

-

+

非保留

+

-

+

KEY

+

非保留

+

保留

+

保留

+

KEY_MEMBER

+

-

+

非保留

+

-

+

KEY_TYPE

+

-

+

非保留

+

-

+

LABEL

+

非保留

+

-

+

-

+

LANGUAGE

+

非保留

+

保留

+

保留

+

LARGE

+

非保留

+

保留

+

-

+

LAST

+

非保留

+

保留

+

保留

+

LATERAL

+

-

+

保留

+

-

+

LC_COLLATE

+

非保留

+

-

+

-

+

LC_CTYPE

+

非保留

+

-

+

-

+

LEADING

+

保留

+

保留

+

保留

+

LEAKPROOF

+

非保留

+

-

+

-

+

LEAST

+

非保留(不能是函数或类型)

+

-

+

-

+

LEFT

+

保留(可以是函数或类型)

+

保留

+

保留

+

LENGTH

+

-

+

非保留

+

非保留

+

LESS

+

保留

+

保留

+

-

+

LEVEL

+

非保留

+

保留

+

保留

+

LIKE

+

保留(可以是函数或类型)

+

保留

+

保留

+

LIMIT

+

保留

+

保留

+

-

+

LISTEN

+

非保留

+

-

+

-

+

LOAD

+

非保留

+

-

+

-

+

LOCAL

+

非保留

+

保留

+

保留

+

LOCALTIME

+

保留

+

保留

+

-

+

LOCALTIMESTAMP

+

保留

+

保留

+

-

+

LOCATION

+

非保留

+

-

+

-

+

LOCATOR

+

-

+

保留

+

-

+

LOCK

+

非保留

+

-

+

-

+

LOG

+

非保留

+

-

+

-

+

LOGGING

+

非保留

+

-

+

-

+

LOGIN

+

非保留

+

-

+

-

+

LOOP

+

非保留

+

-

+

-

+

LOWER

+

-

+

非保留

+

保留

+

M

+

-

+

非保留

+

-

+

MAP

+

-

+

保留

+

-

+

MAPPING

+

非保留

+

-

+

-

+

MATCH

+

非保留

+

保留

+

保留

+

MATCHED

+

非保留

+

-

+

-

+

MAX

+

-

+

非保留

+

保留

+

MAXEXTENTS

+

非保留

+

-

+

-

+

MAXSIZE

+

非保留

+

-

+

-

+

MAXTRANS

+

非保留

+

-

+

-

+

MAXVALUE

+

保留

+

-

+

-

+

MERGE

+

非保留

+

-

+

-

+

MESSAGE_LENGTH

+

-

+

非保留

+

非保留

+

MESSAGE_OCTET_LENGTH

+

-

+

非保留

+

非保留

+

MESSAGE_TEXT

+

-

+

非保留

+

非保留

+

METHOD

+

-

+

非保留

+

-

+

MIN

+

-

+

非保留

+

保留

+

MINEXTENTS

+

非保留

+

-

+

-

+

MINUS

+

保留

+

-

+

-

+

MINUTE

+

非保留

+

保留

+

保留

+

MINVALUE

+

非保留

+

-

+

-

+

MOD

+

-

+

非保留

+

-

+

MODE

+

非保留

+

-

+

-

+

MODIFIES

+

-

+

保留

+

-

+

MODIFY

+

保留

+

保留

+

-

+

MODULE

+

-

+

保留

+

保留

+

MONTH

+

非保留

+

保留

+

保留

+

MORE

+

-

+

非保留

+

非保留

+

MOVE

+

非保留

+

-

+

-

+

MOVEMENT

+

非保留

+

-

+

-

+

MUMPS

+

-

+

非保留

+

非保留

+

NAME

+

非保留

+

非保留

+

非保留

+

NAMES

+

非保留

+

保留

+

保留

+

NATIONAL

+

非保留(不能是函数或类型)

+

保留

+

保留

+

NATURAL

+

保留(可以是函数或类型)

+

保留

+

保留

+

NCHAR

+

非保留(不能是函数或类型)

+

保留

+

保留

+

NCLOB

+

-

+

保留

+

-

+

NEW

+

-

+

保留

+

-

+

NEXT

+

非保留

+

保留

+

保留

+

NLSSORT

+

保留

+

-

+

-

+

NO

+

非保留

+

保留

+

保留

+

NOCOMPRESS

+

非保留

+

-

+

-

+

NOCYCLE

+

非保留

+

-

+

-

+

NODE

+

非保留

+

-

+

-

+

NOLOGGING

+

非保留

+

-

+

-

+

NOLOGIN

+

非保留

+

-

+

-

+

NOMAXVALUE

+

非保留

+

-

+

-

+

NOMINVALUE

+

非保留

+

-

+

-

+

NONE

+

非保留(不能是函数或类型)

+

保留

+

-

+

NOT

+

保留

+

保留

+

保留

+

NOTHING

+

非保留

+

-

+

-

+

NOTIFY

+

非保留

+

-

+

-

+

NOTNULL

+

保留(可以是函数或类型)

+

-

+

-

+

NOWAIT

+

非保留

+

-

+

-

+

NULL

+

保留

+

保留

+

保留

+

NULLABLE

+

-

+

非保留

+

非保留

+

NULLIF

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

NULLS

+

非保留

+

-

+

-

+

NUMBER

+

非保留(不能是函数或类型)

+

非保留

+

非保留

+

NUMERIC

+

非保留(不能是函数或类型)

+

保留

+

保留

+

NUMSTR

+

非保留

+

-

+

-

+

NVARCHAR2

+

非保留(不能是函数或类型)

+

-

+

-

+

NVL

+

非保留(不能是函数或类型)

+

-

+

-

+

OBJECT

+

非保留

+

保留

+

-

+

OCTET_LENGTH

+

-

+

非保留

+

保留

+

OF

+

非保留

+

保留

+

保留

+

OFF

+

非保留

+

保留

+

-

+

OFFSET

+

保留

+

-

+

-

+

OIDS

+

非保留

+

-

+

-

+

OLD

+

-

+

保留

+

-

+

ON

+

保留

+

保留

+

保留

+

ONLY

+

保留

+

保留

+

保留

+

OPEN

+

-

+

保留

+

保留

+

OPERATION

+

-

+

保留

+

-

+

OPERATOR

+

非保留

+

-

+

-

+

OPTIMIZATION

+

非保留

+

-

+

-

+

OPTION

+

非保留

+

保留

+

保留

+

OPTIONS

+

非保留

+

非保留

+

-

+

OR

+

保留

+

保留

+

保留

+

ORDER

+

保留

+

保留

+

保留

+

ORDINALITY

+

-

+

保留

+

-

+

OUT

+

非保留(不能是函数或类型)

+

保留

+

-

+

OUTER

+

保留(可以是函数或类型)

+

保留

+

保留

+

OUTPUT

+

-

+

保留

+

保留

+

OVER

+

非保留

+

-

+

-

+

OVERLAPS

+

保留(可以是函数或类型)

+

非保留

+

保留

+

OVERLAY

+

非保留(不能是函数或类型)

+

非保留

+

-

+

OVERRIDING

+

-

+

非保留

+

-

+

OWNED

+

非保留

+

-

+

-

+

OWNER

+

非保留

+

-

+

-

+

PAD

+

-

+

保留

+

保留

+

PARAMETER

+

-

+

保留

+

-

+

PARAMETERS

+

-

+

保留

+

-

+

PARAMETER_MODE

+

-

+

非保留

+

-

+

PARAMETER_NAME

+

-

+

非保留

+

-

+

PARAMETER_ORDINAL_POSITION

+

-

+

非保留

+

-

+

PARAMETER_SPECIFIC_CATALOG

+

-

+

非保留

+

-

+

PARAMETER_SPECIFIC_NAME

+

-

+

非保留

+

-

+

PARAMETER_SPECIFIC_SCHEMA

+

-

+

非保留

+

-

+

PARSER

+

非保留

+

-

+

-

+

PARTIAL

+

非保留

+

保留

+

保留

+

PARTITION

+

非保留

+

-

+

-

+

PARTITIONS

+

非保留

+

-

+

-

+

PASCAL

+

-

+

非保留

+

非保留

+

PASSING

+

非保留

+

-

+

-

+

PASSWORD

+

非保留

+

-

+

-

+

PATH

+

-

+

保留

+

-

+

PCTFREE

+

非保留

+

-

+

-

+

PER

+

非保留

+

-

+

-

+

PERCENT

+

非保留

+

-

+

-

+

PERFORMANCE

+

保留

+

-

+

-

+

PLACING

+

保留

+

-

+

-

+

PLANS

+

非保留

+

-

+

-

+

PLI

+

-

+

非保留

+

非保留

+

POOL

+

非保留

+

-

+

-

+

POSITION

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

POSTFIX

+

-

+

保留

+

-

+

PRECEDING

+

非保留

+

-

+

-

+

PRECISION

+

非保留(不能是函数或类型)

+

保留

+

保留

+

PREFERRED

+

非保留

+

-

+

-

+

PREFIX

+

非保留

+

保留

+

-

+

PREORDER

+

-

+

保留

+

-

+

PREPARE

+

非保留

+

保留

+

保留

+

PREPARED

+

非保留

+

-

+

-

+

PRESERVE

+

非保留

+

保留

+

保留

+

PRIMARY

+

保留

+

保留

+

保留

+

PRIOR

+

非保留

+

保留

+

保留

+

PRIVILEGE

+

非保留

+

-

+

-

+

PRIVILEGES

+

非保留

+

保留

+

保留

+

PROCEDURAL

+

非保留

+

-

+

-

+

PROCEDURE

+

保留

+

保留

+

保留

+

PROFILE

+

非保留

+

-

+

-

+

PUBLIC

+

-

+

保留

+

保留

+

QUERY

+

非保留

+

-

+

-

+

QUOTE

+

非保留

+

-

+

-

+

RANGE

+

非保留

+

-

+

-

+

RAW

+

非保留

+

-

+

-

+

READ

+

非保留

+

保留

+

保留

+

READS

+

-

+

保留

+

-

+

REAL

+

非保留(不能是函数或类型)

+

保留

+

保留

+

REASSIGN

+

非保留

+

-

+

-

+

REBUILD

+

非保留

+

-

+

-

+

RECHECK

+

非保留

+

-

+

-

+

RECURSIVE

+

非保留

+

保留

+

-

+

REF

+

非保留

+

保留

+

-

+

REFERENCES

+

保留

+

保留

+

保留

+

REFERENCING

+

-

+

保留

+

-

+

REINDEX

+

非保留

+

-

+

-

+

REJECT

+

保留

+

-

+

-

+

RELATIVE

+

非保留

+

保留

+

保留

+

RELEASE

+

非保留

+

-

+

-

+

RELOPTIONS

+

非保留

+

-

+

-

+

REMOTE

+

非保留

+

-

+

-

+

RENAME

+

非保留

+

-

+

-

+

REPEATABLE

+

非保留

+

非保留

+

非保留

+

REPLACE

+

非保留

+

-

+

-

+

REPLICA

+

非保留

+

-

+

-

+

RESET

+

非保留

+

-

+

-

+

RESIZE

+

非保留

+

-

+

-

+

RESOURCE

+

非保留

+

-

+

-

+

RESTART

+

非保留

+

-

+

-

+

RESTRICT

+

非保留

+

保留

+

保留

+

RESULT

+

-

+

保留

+

-

+

RETURN

+

非保留

+

保留

+

-

+

RETURNED_LENGTH

+

-

+

非保留

+

非保留

+

RETURNED_OCTET_LENGTH

+

-

+

非保留

+

非保留

+

RETURNED_SQLSTATE

+

-

+

非保留

+

非保留

+

RETURNING

+

保留

+

-

+

-

+

RETURNS

+

非保留

+

保留

+

-

+

REUSE

+

非保留

+

-

+

-

+

REVOKE

+

非保留

+

保留

+

保留

+

RIGHT

+

保留(可以是函数或类型)

+

保留

+

保留

+

ROLE

+

非保留

+

保留

+

-

+

ROLLBACK

+

非保留

+

保留

+

保留

+

ROLLUP

+

-

+

保留

+

-

+

ROUTINE

+

-

+

保留

+

-

+

ROUTINE_CATALOG

+

-

+

非保留

+

-

+

ROUTINE_NAME

+

-

+

非保留

+

-

+

ROUTINE_SCHEMA

+

-

+

非保留

+

-

+

ROW

+

非保留(不能是函数或类型)

+

保留

+

-

+

ROWS

+

非保留

+

保留

+

保留

+

ROW_COUNT

+

-

+

非保留

+

非保留

+

RULE

+

非保留

+

-

+

-

+

SAVEPOINT

+

非保留

+

保留

+

-

+

SCALE

+

-

+

非保留

+

非保留

+

SCHEMA

+

非保留

+

保留

+

保留

+

SCHEMA_NAME

+

-

+

非保留

+

非保留

+

SCOPE

+

-

+

保留

+

-

+

SCROLL

+

非保留

+

保留

+

保留

+

SEARCH

+

非保留

+

保留

+

-

+

SECOND

+

非保留

+

保留

+

保留

+

SECTION

+

-

+

保留

+

保留

+

SECURITY

+

非保留

+

非保留

+

-

+

SELECT

+

保留

+

保留

+

保留

+

SELF

+

-

+

非保留

+

-

+

SENSITIVE

+

-

+

非保留

+

-

+

SEQUENCE

+

非保留

+

保留

+

-

+

SEQUENCES

+

非保留

+

-

+

-

+

SERIALIZABLE

+

非保留

+

非保留

+

非保留

+

SERVER

+

非保留

+

-

+

-

+

SERVER_NAME

+

-

+

非保留

+

非保留

+

SESSION

+

非保留

+

保留

+

保留

+

SESSION_USER

+

保留

+

保留

+

保留

+

SET

+

非保留

+

保留

+

保留

+

SETOF

+

非保留(不能是函数或类型)

+

-

+

-

+

SETS

+

-

+

保留

+

-

+

SHARE

+

非保留

+

-

+

-

+

SHOW

+

非保留

+

-

+

-

+

SIMILAR

+

保留(可以是函数或类型)

+

非保留

+

-

+

SIMPLE

+

非保留

+

非保留

+

-

+

SIZE

+

非保留

+

保留

+

保留

+

SMALLDATETIME

+

非保留(不能是函数或类型)

+

-

+

-

+

SMALLINT

+

非保留(不能是函数或类型)

+

保留

+

保留

+

SNAPSHOT

+

非保留

+

-

+

-

+

SOME

+

保留

+

保留

+

保留

+

SOURCE

+

-

+

非保留

+

-

+

SPACE

+

-

+

保留

+

保留

+

SPECIFIC

+

-

+

保留

+

-

+

SPECIFICTYPE

+

-

+

保留

+

-

+

SPECIFIC_NAME

+

-

+

非保留

+

-

+

SPILL

+

非保留

+

-

+

-

+

SPLIT

+

保留

+

-

+

-

+

SQL

+

-

+

保留

+

保留

+

SQLCODE

+

-

+

-

+

保留

+

SQLERROR

+

-

+

-

+

保留

+

SQLEXCEPTION

+

-

+

保留

+

-

+

SQLSTATE

+

-

+

保留

+

保留

+

SQLWARNING

+

-

+

保留

+

-

+

STABLE

+

非保留

+

-

+

-

+

STANDALONE

+

非保留

+

-

+

-

+

START

+

非保留

+

保留

+

-

+

STATE

+

-

+

保留

+

-

+

STATEMENT

+

非保留

+

保留

+

-

+

STATIC

+

-

+

保留

+

-

+

STATISTICS

+

非保留

+

-

+

-

+

STDIN

+

非保留

+

-

+

-

+

STDOUT

+

非保留

+

-

+

-

+

STORAGE

+

非保留

+

-

+

-

+

STORE

+

非保留

+

-

+

-

+

STRICT

+

非保留

+

-

+

-

+

STRIP

+

非保留

+

-

+

-

+

STRUCTURE

+

-

+

保留

+

-

+

STYLE

+

-

+

非保留

+

-

+

SUBCLASS_ORIGIN

+

-

+

非保留

+

非保留

+

SUBLIST

+

-

+

非保留

+

-

+

SUBSTRING

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

SUM

+

-

+

非保留

+

保留

+

SUPERUSER

+

非保留

+

-

+

-

+

SYMMETRIC

+

保留

+

非保留

+

-

+

SYNONYM

+

非保留

+

-

+

-

+

SYS_REFCURSOR

+

非保留

+

-

+

-

+

SYSDATE

+

保留

+

-

+

-

+

SYSID

+

非保留

+

-

+

-

+

SYSTEM

+

非保留

+

非保留

+

-

+

SYSTEM_USER

+

-

+

保留

+

保留

+

TABLE

+

保留

+

保留

+

保留

+

TABLES

+

非保留

+

-

+

-

+

TABLE_NAME

+

-

+

非保留

+

非保留

+

TEMP

+

非保留

+

-

+

-

+

TEMPLATE

+

非保留

+

-

+

-

+

TEMPORARY

+

非保留

+

保留

+

保留

+

TERMINATE

+

-

+

保留

+

-

+

TEXT

+

非保留

+

-

+

-

+

THAN

+

非保留

+

保留

+

-

+

THEN

+

保留

+

保留

+

保留

+

TIME

+

非保留(不能是函数或类型)

+

保留

+

保留

+

TIMESTAMP

+

非保留(不能是函数或类型)

+

保留

+

保留

+

TIMESTAMPDIFF

+

非保留(不能是函数或类型)

+

-

+

-

+

TIMEZONE_HOUR

+

-

+

保留

+

保留

+

TIMEZONE_MINUTE

+

-

+

保留

+

保留

+

TINYINT

+

非保留(不能是函数或类型)

+

-

+

-

+

TO

+

保留

+

保留

+

保留

+

TRAILING

+

保留

+

保留

+

保留

+

TRANSACTION

+

非保留

+

保留

+

保留

+

TRANSACTIONS_COMMITTED

+

-

+

非保留

+

-

+

TRANSACTIONS_ROLLED_BACK

+

-

+

非保留

+

-

+

TRANSACTION_ACTIVE

+

-

+

非保留

+

-

+

TRANSFORM

+

-

+

非保留

+

-

+

TRANSFORMS

+

-

+

非保留

+

-

+

TRANSLATE

+

-

+

非保留

+

保留

+

TRANSLATION

+

-

+

保留

+

保留

+

TREAT

+

非保留(不能是函数或类型)

+

保留

+

-

+

TRIGGER

+

非保留

+

保留

+

-

+

TRIGGER_CATALOG

+

-

+

非保留

+

-

+

TRIGGER_NAME

+

-

+

非保留

+

-

+

TRIGGER_SCHEMA

+

-

+

非保留

+

-

+

TRIM

+

非保留(不能是函数或类型)

+

非保留

+

保留

+

TRUE

+

保留

+

保留

+

保留

+

TRUNCATE

+

非保留

+

-

+

-

+

TRUSTED

+

非保留

+

-

+

-

+

TSFIELD

+

非保留

+

-

+

-

+

TSTAG

+

非保留

+

-

+

-

+

TSTIME

+

非保留

+

-

+

-

+

TYPE

+

非保留

+

非保留

+

非保留

+

TYPES

+

非保留

+

-

+

-

+

UESCAPE

+

-

+

-

+

-

+

UNBOUNDED

+

非保留

+

-

+

-

+

UNCOMMITTED

+

非保留

+

非保留

+

非保留

+

UNDER

+

-

+

保留

+

-

+

UNENCRYPTED

+

非保留

+

-

+

-

+

UNION

+

保留

+

保留

+

保留

+

UNIQUE

+

保留

+

保留

+

保留

+

UNKNOWN

+

非保留

+

保留

+

保留

+

UNLIMITED

+

非保留

+

-

+

-

+

UNLISTEN

+

非保留

+

-

+

-

+

UNLOCK

+

非保留

+

-

+

-

+

UNLOGGED

+

非保留

+

-

+

-

+

UNNAMED

+

-

+

非保留

+

非保留

+

UNNEST

+

-

+

保留

+

-

+

UNTIL

+

非保留

+

-

+

-

+

UNUSABLE

+

非保留

+

-

+

-

+

UPDATE

+

非保留

+

保留

+

保留

+

UPPER

+

-

+

非保留

+

保留

+

USAGE

+

-

+

保留

+

保留

+

USER

+

保留

+

保留

+

保留

+

USER_DEFINED_TYPE_CATALOG

+

-

+

非保留

+

-

+

USER_DEFINED_TYPE_NAME

+

-

+

非保留

+

-

+

USER_DEFINED_TYPE_SCHEMA

+

-

+

非保留

+

-

+

USING

+

保留

+

保留

+

保留

+

VACUUM

+

非保留

+

-

+

-

+

VALID

+

非保留

+

-

+

-

+

VALIDATE

+

非保留

+

-

+

-

+

VALIDATION

+

非保留

+

-

+

-

+

VALIDATOR

+

非保留

+

-

+

-

+

VALUE

+

非保留

+

保留

+

保留

+

VALUES

+

非保留(不能是函数或类型)

+

保留

+

保留

+

VARCHAR

+

非保留(不能是函数或类型)

+

保留

+

保留

+

VARCHAR2

+

非保留(不能是函数或类型)

+

-

+

-

+

VARIABLE

+

-

+

保留

+

-

+

VARIADIC

+

保留

+

-

+

-

+

VARYING

+

非保留

+

保留

+

保留

+

VERBOSE

+

保留(可以是函数或类型)

+

-

+

-

+

VERSION

+

非保留

+

-

+

-

+

VIEW

+

非保留

+

保留

+

保留

+

VOLATILE

+

非保留

+

-

+

-

+

WHEN

+

保留

+

保留

+

保留

+

WHENEVER

+

-

+

保留

+

保留

+

WHERE

+

保留

+

保留

+

保留

+

WHITESPACE

+

非保留

+

-

+

-

+

WINDOW

+

保留

+

-

+

-

+

WITH

+

保留

+

保留

+

保留

+

WITHIN

+

非保留

+

-

+

-

+

WITHOUT

+

非保留

+

保留

+

-

+

WORK

+

非保留

+

保留

+

保留

+

WORKLOAD

+

非保留

+

-

+

-

+

WRAPPER

+

非保留

+

-

+

-

+

WRITE

+

非保留

+

保留

+

保留

+

XML

+

非保留

+

-

+

-

+

XMLATTRIBUTES

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLCONCAT

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLELEMENT

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLEXISTS

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLFOREST

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLPARSE

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLPI

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLROOT

+

非保留(不能是函数或类型)

+

-

+

-

+

XMLSERIALIZE

+

非保留(不能是函数或类型)

+

-

+

-

+

YEAR

+

非保留

+

保留

+

保留

+

YES

+

非保留

+

-

+

-

+

ZONE

+

非保留

+

保留

+

保留

+
+ 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" new file mode 100644 index 000000000..ad11998c6 --- /dev/null +++ "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" @@ -0,0 +1,345 @@ +# 其他优化器选项 + +## default\_statistics\_target + +**参数说明**:为没有用ALTER TABLE SET STATISTICS设置字段目标的表设置缺省统计目标。此参数设置为正数是代表统计信息的样本数量,为负数时,代表使用百分比的形式设置统计目标,负数转换为对应的百分比,即-5代表5%。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-100~10000。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 比默认值大的正数数值增加了ANALYZE所需的时间,但是可能会改善优化器的估计质量。 +>- 调整此参数可能存在性能劣化的风险,如果某个查询劣化,可以考虑 +> 1. 恢复默认的统计信息。 +> 2. 使用plan hint来调整到之前的查询计划。 +>- 当此guc参数设置为负数时,如果计算的采样样本数大于等于总数据量的2%,且用户表的数据量小于1600000时,ANALYZE所需时间相比guc参数为默认值的时间会有所增加。 +>- 当此guc参数设置为负数时,则autoanalyze不生效。 + +**默认值**:100 + +## constraint\_exclusion + +**参数说明**:控制查询优化器使用表约束查询的优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型 + +- on表示检查所有表的约束。 +- off表示不检查约束。 +- partition表示只检查继承的子表和UNION ALL子查询。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >当constraint\_exclusion为on,优化器用查询条件和表的CHECK约束比较,并且在查询条件和约束冲突的时候忽略对表的扫描。 + + +**默认值**:partition + +>![](public_sys-resources/icon-note.gif) **说明:** +>目前, constraint\_exclusion缺省被打开,通常用来实现表分区。为所有的表打开它时,对于简单的查询强加了额外的规划,并且对简单查询没有什么好处。如果不用分区表,可以关掉它。 + +## cursor\_tuple\_fraction + +**参数说明**:优化器估计游标获取行数在总行数中的占比。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0.0~1.0。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>比默认值小的值与使用 “fast start” 为游标规划的值相偏离,从而使得前几行恢复的很快而抓取全部的行需要很长的时间。比默认值大的值加大了总的估计的时间。在最大的值1.0处,像正常的查询一样规划游标,只考虑总的估计时间和传送第一行的时间。 + +**默认值**:0.1 + +## from\_collapse\_limit + +**参数说明**:根据生成的FROM列表的项数来判断优化器是否将把子查询合并到上层查询,如果FROM列表项个数小于等于该参数值,优化器会将子查询合并到上层查询。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>比默认值小的数值将降低规划时间,但是可能生成差的执行计划。 + +**默认值**:8 + +## join\_collapse\_limit + +**参数说明**:根据得出的列表项数来判断优化器是否执行把除FULL JOINS之外的JOIN构造重写到FROM列表中。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 设置为1会避免任何JOIN重排。这样就使得查询中指定的连接顺序就是实际的连接顺序。查询优化器并不是总能选取最优的连接顺序,高级用户可以选择暂时把这个变量设置为1,然后指定它们需要的连接顺序。 +>- 比默认值小的数值减少规划时间但也降低了执行计划的质量。 + +**默认值**:8 + +## plan\_mode\_seed + +**参数说明**:该参数为调测参数,目前仅支持OPTIMIZE\_PLAN和RANDOM\_PLAN两种。其中:OPTIMIZE\_PLAN表示通过动态规划算法进行代价估算的最优plan,参数值设置为0;RANDOM\_PLAN表示随机生成的plan;如果设置为-1,表示用户不指定随机数的种子标识符seed值,由优化器随机生成\[1, 2147483647\]范围整型值的随机数,并根据随机数生成随机的执行计划;如果用户指定guc参数值为\[1, 2147483647\]范围的整型值,表示指定的生成随机数的种子标识符seed,优化器需要根据seed值生成随机的执行计划。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-1\~ 2147483647 + +**默认值**:0 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当该参数设置为随机执行计划模式时,优化器会生成不同的随机执行计划,该执行计划可能不是最优计划。因此在随机计划模式下,会对查询性能产生影响,所以建议在升级、扩容、缩容等正常业务操作或运维过程中将该参数保持为默认值0。 +>- 当该参数不为0时,查询指定的plan hint不会生效。 + +## hashagg\_table\_size + +**参数说明**:用于设置执行HASH JOIN操作时HASH表的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX/2。 + +**默认值**:0 + +## enable\_codegen + +**参数说明:**标识是否允许开启代码生成优化,目前代码生成使用的是LLVM优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许开启代码生成优化。 +- off表示不允许开启代码生成优化。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >目前LLVM优化仅支持向量化执行引擎特性和SQL on Hadoop特性,在其他场景下建议关闭此参数。 + + +**默认值:**on + +## codegen\_strategy + +**参数说明:**标识在表达式codegen化过程中所使用的代码生成优化策略。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- partial表示当所计算表达式中即使包含部分未被codegen化的函数时,仍可借助表达式全codegen框架调用LLVM动态编译优化策略。 +- pure表示当所计算表达式整体可被codegen化时,才考虑调用LLVM动态编译优化策略。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >在开启代码生成优化会导致查询性能下降的场景下可以设置此参数为pure,其他场景下建议不改变此参数的默认值partial。 + + +**默认值:**partial + +## enable\_codegen\_print + +**参数说明:**标识是否允许在log日志中打印所生成的LLVM IR函数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许在log日志中打印IR函数。 +- off表示不允许在log日志中打印IR函数。 + +**默认值:**off + +## codegen\_cost\_threshold + +**参数说明:**由于LLVM编译生成最终的可执行机器码需要一定时间,因此只有当实际执行的代价大于编译生成机器码所需要的代码和优化后的执行代价之和时,利用代码生成才有收益。codegen\_cost\_threshold标识代价的阈值,当执行估算代价大于该代价时,使用LLVM优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ 2147483647。 + +**默认值:**10000 + +## enable\_bloom\_filter + +**参数说明: **标识是否允许使用BloomFilter优化。该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许使用BloomFilter优化。 +- off表示不允许使用BloomFilter优化。 + +**默认值:**on + +## enable\_extrapolation\_stats + +**参数说明: **标识对于日期类型是否允许基于历史统计信息使用推理估算的逻辑。使用该逻辑对于未及时收集统计信息的表可以增大估算准确的可能性,但也存在错误推理导致估算过大的可能性,需要对于日期类型数据定期插入的场景开启此开关。该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许基于历史统计信息使用推理估算的逻辑。 +- off表示不允许基于历史统计信息使用推理估算的逻辑。 + +**默认值:**off + +## autoanalyze + +**参数说明: **标识是否允许在生成计划的时候,对于没有统计信息的表进行统计信息自动收集。对于外表和临时表,不支持autoanalyze,如果需要收集统计信息,用户需手动执行analyze操作。如果在auto analyze某个表的过程中数据库发生异常,当数据库正常运行之后再执行语句有可能仍提示需要收集此表的统计信息。此时需要用户对该表手动执行一次analyze操作,以同步统计信息数据。该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许自动进行统计信息收集。 +- off表示不允许自动进行统计信息收集。 + +**默认值:**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的表,检查该表是否曾进行过统计信息收集。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许检查。 +- off表示不允许检查。 + +**默认值:**on + +## enable\_sonic\_hashagg + +**参数说明:**标识是否依据规则约束使用基于面向列的hash表设计的Hash Agg算子。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在满足约束条件时使用基于面向列的hash表设计的Hash Agg算子。 +- off表示不使用面向列的hash表设计的Hash Agg算子。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 在开启enable\_sonic\_hashagg,且查询达到约束条件使用基于面向列的hash表设计的Hash Agg算子时,查询对应的Hash Agg算子内存使用通常可获得精简。但对于代码生成技术可获得显著性能提升的场景\([enable\_codegen](#zh-cn_topic_0237124719_zh-cn_topic_0059779049_sbe5e1dbabf214873baf37dbb7580a7a3)打开后获得较大性能提升\),对应的算子查询性能可能会出现劣化。 +>- 开启enable\_sonic\_hashagg,且查询达到约束条件使用基于面向列的hash表设计的Hash Agg算子时,在Explain Analyze/Performance的执行计划和执行信息中,算子显示为“Sonic Hash Aggregation”,而未达到该约束条件时,算子名称将显示为“Hash Aggregation”。 + +**默认值:**on + +## enable\_sonic\_hashjoin + +**参数说明:**标识是否依据规则约束使用基于面向列的hash表设计的Hash Join算子。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在满足约束条件时使用基于面向列的hash表设计的Hash Join算子。 +- off表示不使用面向列的hash表设计的Hash Join算子。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 当前开关仅适用于Inner Join的场景。 +>- 在开启enable\_sonic\_hashjoin,查询对应的Hash Inner算子内存使用通常可获得精简。但对于代码生成技术可获得显著性能提升的场景,对应的算子查询性能可能会出现劣化。 +>- 开启enable\_sonic\_hashjoin,且查询达到约束条件使用基于面向列的hash表设计的Hash Join算子时,在Explain Analyze/Performance的执行计划和执行信息中,算子显示为“Sonic Hash Join”,而未达到该约束条件时,算子名称将显示为“Hash Join”。 + +**默认值:**on + +## enable\_sonic\_optspill + +**参数说明:**标识是否对面向列的hash表设计的Hash Join算子进行下盘文件数优化。该参数打开时,在Hash Join算子下盘文件较多的时候,下盘文件数不会显著增加。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示优化面向列的hash表设计的Hash Join算子的下盘文件数。 +- off表示不优化面向列的hash表设计的Hash Join算子的下盘文件数。 + +**默认值:**on + +## log\_parser\_stats + +**参数说明**:控制优化器输出parser模块的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## log\_planner\_stats + +**参数说明**:控制优化器输出planner模块的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## log\_executor\_stats + +**参数说明**:控制优化器输出executor模块的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## log\_statement\_stats + +**参数说明**:控制优化器输出该语句的性能日志。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:off + +## plan\_cache\_mode + +**参数说明**:标识在prepare语句中,选择生成执行计划的策略。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型 + +- auto表示按照默认的方式选择custom plan或者generic plan。 +- force\_generic\_plan表示强制走generic plan。 +- force\_custom\_plan表示强制走custom plan。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 此参数只对prepare语句生效,一般用在prepare语句中参数化字段存在比较严重的数据倾斜的场景下。 +>- custom plan是指对于preapre语句,在执行execute的时候,把execute语句中的参数嵌套到语句之后生成的计划。custom plan会根据execute语句中具体的参数生成计划,这种方案的优点是每次都按照具体的参数生成优选计划,执行性能比较好;缺点是每次执行前都需要重新生成计划,存在大量的重复的优化器开销。 +>- generic plan是指对于preapre语句生成计划,该计划策略会在执行execute语句的时候把参数bind到plan中,然后执行计划。这种方案的优点是每次执行可以省去重复的优化器开销;缺点是当bind参数字段上数据存在倾斜时该计划可能不是最优的,部分bind参数场景下执行性能较差。 + +**默认值**:auto + diff --git "a/content/zh/docs/Developerguide/\345\205\266\344\273\226\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\346\223\215\344\275\234.md" new file mode 100644 index 000000000..b24555560 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\346\223\215\344\275\234.md" @@ -0,0 +1,13 @@ +# 其他操作 + +- **[创建和管理schema](创建和管理schema.md)** + +- **[创建和管理分区表](创建和管理分区表.md)** + +- **[创建和管理索引](创建和管理索引.md)** + +- **[创建和管理视图](创建和管理视图.md)** + +- **[创建和管理序列](创建和管理序列.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\205\266\344\273\226\347\274\272\347\234\201.md" "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\347\274\272\347\234\201.md" new file mode 100644 index 000000000..70f51555f --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\266\344\273\226\347\274\272\347\234\201.md" @@ -0,0 +1,48 @@ +# 其他缺省 + +主要介绍数据库系统默认的库加载参数。 + +## dynamic\_library\_path + +**参数说明:**设置数据查找动态加载的共享库文件的路径。当需要打开一个可以动态装载的模块并且在CREATE FUNCTION或LOAD命令里面声明的名称没有目录部分时,系统将搜索这个目录以查找声明的文件。 + +用于dynamic\_library\_path的数值必须是一个冒号分隔的绝对路径列表。当一个路径名称以特殊变量$libdir为开头时,会替换为openGauss发布提供的模块安装路径。例如: + +``` +dynamic_library_path = '/usr/local/lib/postgresql:/opt/testgs/lib:$libdir' +``` + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>设置为空字符串,表示关闭自动路径搜索。 + +**默认值:**$libdir + +## gin\_fuzzy\_search\_limit + +**参数说明:**设置GIN索引返回的集合大小的上限。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0\~2147483647 + +**默认值:**0 + +## local\_preload\_libraries + +**参数说明:**指定一个或多个共享库,它们在开始连接前预先加载。多个加载库之间用逗号分隔,除了双引号,所有的库名都转换为小写。 + +- 并非只有系统管理员才能更改此选项,因此只能加载安装的标准库目录下plugins子目录中的库文件,数据库管理员有责任确保该目录中的库都是安全的。local\_preload\_libraries中指定的项可以明确含有该目录,例如$libdir/plugins/mylib;也可以仅指定库的名称,例如mylib(等价于$libdir/plugins/mylib)。 +- 与shared\_preload\_libraries不同,在会话开始之前加载模块与在会话中使用到该模块的时候临时加载相比并不具有性能优势。相反,这个特性的目的是为了调试或者测量在特定会话中不明确使用LOAD加载的库。例如针对某个用户将该参数设为ALTER USER SET来进行调试。 +- 当指定的库未找到时,连接会失败。 +- 每一个支持openGauss的库都有一个“magic block”用于确保兼容性,因此不支持openGauss的库不能通过这个方法加载。 + +该参数属于BACKEND类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + diff --git "a/content/zh/docs/Developerguide/\345\205\266\345\256\203\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\205\266\345\256\203\345\207\275\346\225\260.md" new file mode 100644 index 000000000..e13a28c22 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\266\345\256\203\345\207\275\346\225\260.md" @@ -0,0 +1,250 @@ +# 其它函数 + +- pgxc\_pool\_check\(\) + + 描述:检查连接池中缓存的连接数据是否与pgxc\_node一致。 + + 返回值类型:Boolean + +- pgxc\_pool\_reload\(\) + + 描述:更新连接池中缓存的连接信息。 + + 返回值类型:Boolean + +- pgxc\_lock\_for\_backup\(\) + + 描述:为备份操作给openGauss加锁,这些备份是为在新增节点上做恢复。 + + 返回值类型:Boolean + +- plan\_seed\(\) + + 描述:获取前一次查询语句的seed值(内部使用)。 + + 返回值类型:int + +- pg\_stat\_get\_env\(\) + + 描述:提供获取当前节点的环境变量信息。 + + 返回值类型:record + +- pg\_stat\_get\_thread\(\) + + 描述:提供当前节点下所有线程的状态信息。 + + 返回值类型:record + +- pg\_stat\_get\_sql\_count\(\) + + 描述:提供当前节点中所有用户执行的SELECT/UPDATE/INSERT/DELETE/MERGE INTO语句的计数结果。 + + 返回值类型:record + +- copy\_error\_log\_create\(\) + + 描述:创建COPY FROM容错机制所需要的错误表(public.pgxc\_copy\_error\_log)。 + + 返回值类型:Boolean + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 此函数会尝试创建public.pgxc\_copy\_error\_log表,表的详细信息请参见[表1](#zh-cn_topic_0237121997_table138318280213)。 + >- 在relname列上创建B-tree索引,并REVOKE ALL on public.pgxc\_copy\_error\_log FROM public对错误表进行权限控制(与COPY语句权限一致)。 + >- 由于尝试创建的public.pgxc\_copy\_error\_log定义是一张行存表,因此openGauss上必须支持行存表的创建才能够正常运行此函数,并使用后续的COPY容错功能。需要特别注意的是,enable\_hadoop\_env这个GUC参数开启后会禁止在openGauss内创建行存表(openGauss默认为off)。 + >- 此函数自身权限为Sysadmin及以上(与错误表、COPY权限一致)。 + >- 若创建前public.pgxc\_copy\_error\_log表已存在或者copy\_error\_log\_relname\_idx索引已存在,则此函数会报错回滚。 + + **表 1** 错误表public.pgxc\_copy\_error\_log信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

列名称

+

类型

+

描述

+

relname

+

varchar

+

表名称。以模式名.表名形式显示。

+

begintime

+

timestamp with time zone

+

出现数据格式错误的时间。

+

filename

+

character varying

+

出现数据格式错误的数据源文件名。

+

rownum

+

bigint

+

在数据源文件中,出现数据格式错误的行号。

+

rawrecord

+

text

+

在数据源文件中,出现数据格式错误的原始记录。

+

detail

+

text

+

详细错误信息。

+
+ +- pg\_stat\_get\_data\_senders\(\) + + 描述:提供当前活跃的数据复制发送线程的详细信息。 + + 返回值类型:record + +- generate\_wdr\_report\(begin\_snap\_id Oid, end\_snap\_id Oid, int report\_type, int report\_scope, int node\_name\) + + 描述:基于两个snapshot生成系统诊断报告。 + + 返回值类型:record + + **表 2** generate\_wdr\_report 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

取值范围

+

begin_snap_id

+

生成某段时间内性能诊断报告的开始snapshotid。

+

-

+

end_snap_id

+

结束snapshot的id,默认end_snap_id大于begin_snap_id。

+

-

+

report_type

+

指定生成report的类型。

+
  • summary
  • detail
  • all,即同时包含summary 和 detail。
+

report_scope

+

指定生成report的范围。

+

node:openGauss中的节点。

+

node_name

+

“report_scope”指定为“node”时,需要把该参数指定为对应节点的名称。

+

-

+
+ +- create\_wdr\_snapshot\(stat text, dbid Oid\) + + 描述:手工生成系统诊断快照。 + + 返回值类型:record + + **表 3** create\_wdr\_snapshot参数说明 + + + + + + + + + + + + +

参数

+

描述

+

stat

+

表示每次snapshot时节点的名称,默认为收集所有节点的状态信息。

+

dbid

+

表示数据库的ID,收集指定数据库的状态信息。

+
+ +- wdr\_xdb\_query\(db\_name\_str text, query text\) + + 描述:提供本地跨数据库执行query的能力。例如: 在连接到postgres库时, 访问test库下的表。 + + ``` + select col1 from wdr_xdb_query('dbname=test','select col1 from t1') as dd(col1 int); + ``` + + 返回值类型:record + +- pg\_wlm\_jump\_queue\(pid int\) + + 描述:调整任务到数据库主节点队列的最前端。 + + 返回值类型:boolean + + - true:成功。 + - false:失败。 + +- gs\_wlm\_switch\_cgroup\(pid int, cgroup text\) + + 描述:调整作业的优先级到新控制组。 + + 返回值类型:boolean + + - true:成功。 + - false:失败。 + +- pv\_session\_memctx\_detail\(threadid tid, MemoryContextName text\) + + 描述:将线程tid的MemoryContextName内存上下文信息记录到“/tmp/dumpmem”目录下的“threadid\_timestamp.log”文件中。其中threadid可通过表PV\_SESSION\_MEMORY\_DETAIL中的sessid后获得。当MemoryContextName为 '' 时,会记录所有的内存上下文信息。 + + 返回值类型:boolean + + - true:成功。 + - false:失败。 + +- pg\_shared\_memctx\_detail\(MemoryContextName text\) + + 描述:将MemoryContextName内存上下文信息记录到“/tmp/dumpmem”目录下的“threadid\_timestamp.log”文件中。 + + 返回值类型:boolean + + - true:成功。 + - false:失败。 + + +>![](public_sys-resources/icon-note.gif) **说明:** +>pgxc\_lock\_for\_backup是在使用gs\_dump或gs\_dumpall工具备份openGauss前,用来给openGauss加锁的。当给openGauss加锁后,不允许有改变系统结构的操作。该函数不影响DML语句。 + 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" new file mode 100644 index 000000000..8c6bb7ae6 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\205\266\345\256\203\351\200\211\351\241\271.md" @@ -0,0 +1,401 @@ +# 其它选项 + +## server\_version + +**参数说明:**报告服务器版本号\(字符串形式\)。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**字符串 + +**默认值:**9.2.4 + +## server\_version\_num + +**参数说明:**报告服务器版本号\(整数形式\)。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**整数 + +**默认值:**90204 + +## block\_size + +**参数说明:**报告当前数据库所使用的块大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**8192 + +**默认值:**8192 + +## segment\_size + +**参数说明:**报告当前数据库所使用的段文件大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**131072 + +## max\_index\_keys + +**参数说明:**报告当前数据库能够支持的索引键值的最大数目。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**32 + +## integer\_datetimes + +**参数说明:**报告是否支持64位整数形式的日期和时间格式。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**布尔型 + +- on表示支持。 +- off表示不支持。 + +**默认值:**on + +## lc\_collate + +**参数说明:**报告当前数据库的字符串排序区域设置。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**依赖于openGauss安装部署时的配置 + +## lc\_ctype + +**参数说明:**报告当前数据库的字母类别区域设置。如:哪些字符属于字母,它对应的大写形式是什么。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**依赖于openGauss安装部署时的配置 + +## max\_identifier\_length + +**参数说明:**报告当前系统允许的标识符最大长度。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**整型 + +**默认值:**63 + +## server\_encoding + +**参数说明:**报告当前数据库的服务端编码字符集。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**默认值:**在创建数据库的时候决定的。 + +## enable\_upgrade\_merge\_lock\_mode + +**参数说明:**当该参数设置为on时,通过提升deltamerge内部实现的锁级别,避免和update/delete并发操作时的报错。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:** 布尔型 + +- on,提升deltamerge内部实现的锁级别,并发执行deltamerge和update/delete操作时,一个操作先执行,另一个操作被阻塞,在前一个操作完成后,后一个操作再执行。 +- off,在对表的delta table的同一行并发执行deltamerge和update/delete操作时,后一个对同一行数据更新的操作会报错退出。 + +**默认值:**off + +## job\_queue\_processes + +**参数说明:**表示系统可以并发执行的job数目。该参数为postmaster级别,通过gs\_guc设置,需要重启gaussdb才能生效。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0~1000 + +功能: + +- 当job\_queue\_processes设置为0值,表示不启用定时任务功能,任何job都不会被执行(因为开启定时任务的功能会对系统的性能有影响,有些局点可能不需要定时任务的功能,可以通过设置为0不启用定时任务功能)。 +- 当job\_queue\_processes为大于0时,表示启用定时任务功能且系统能够并发处理的最大任务数。 + +启用定时任务功能后,job\_scheduler线程会在定时时间间隔轮询pg\_job系统表,系统设置定时任务检查周期默认为1s。 + +由于并行运行的任务数太多会消耗更多的系统资源,因此需要设置系统并发处理的任务数,当前并发的任务数达到job\_queue\_processes时,且此时又有任务到期,那么这些任务本次得不到执行而延期到下一轮询周期。因此,建议用户需要根据每个任务的执行时长合理的设置任务的时间间隔(即submit接口中的interval参数),来避免由于任务执行时间太长而导致下个轮询周期无法正常执行。 + +注:如果同一时间内并行的job数很多,过小的参数值会导致job等待。而过大的参数值则消耗更多的系统资源,建议设置此参数为100,用户可以根据系统资源情况合理调整。 + +**默认值:**10 + +## ngram\_gram\_size + +**参数说明:**ngram解析器分词的长度。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型 ,1~4 + +**默认值:**2 + +## ngram\_grapsymbol\_ignore + +**参数说明:**ngram解析器是否忽略图形化字符。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示忽略图形化字符。 +- off表示不忽略图形化字符。 + +**默认值:**off + +## ngram\_punctuation\_ignore + +**参数说明:**ngram解析器是否忽略标点符号。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示忽略标点符号。 +- off表示不忽略标点符号。 + +**默认值:**on + +## transparent\_encrypted\_string + +**参数说明:**它存储的是透明加密的一个样本串,使用数据库加密密钥加密固定串“TRANS\_ENCRYPT\_SAMPLE\_STRING”后的密文,用来校验二次启动时获取的DEK是否正确。如果校验失败,那么数据库节点将拒绝启动。该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,设置为空表示openGauss非加密。 + +**默认值:**空 + +>![](public_sys-resources/icon-note.gif) **说明:** +>请勿手动设置该参数,设置不当将导致openGauss不可用。 + +## transparent\_encrypt\_kms\_url + +**参数说明:**它存储的是透明加密的数据库密钥获取地址,内容要求不可出现RFC3986标准外的字符,最大长度2047字节。格式为“kms://协议@KMS主机名1;KMS主机名2:KMS端口号/kms”,例如 kms://https@linux175:29800/。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## transparent\_encrypt\_kms\_region + +**参数说明:**它存储的是openGauss的部署区域,内容要求不可出现RFC3986标准外的字符,最大长度2047字节。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## behavior\_compat\_options + +**参数说明:**数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 当前只支持[表1](#zh-cn_topic_0237124754_table182861153114812)。 +>- 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set behavior\_compat\_options='end\_month\_calculate,display\_leading\_zero'; + +**表 1** 兼容性配置项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

兼容性配置项

+

兼容性行为控制

+

display_leading_zero

+

浮点数显示配置项。

+
  • 不设置此配置项时,对于-1~0和0~1之间的小数,不显示小数点前的0。比如,0.25显示为.25。
  • 设置此配置项时,对于-1~0和0~1之间的小数,显示小数点前的0。比如,0.25显示为0.25。
+

end_month_calculate

+

add_months函数计算逻辑配置项。

+

假定函数add_months的两个参数分别为param1和param2,param1的月份和param2的和为月份result。

+
  • 不设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期小,计算结果中的日期字段(Day字段)和param1的日期字段保持一致。比如,
+
postgres=# select add_months('2018-02-28',3) from dual;
+add_months
+---------------------
+2018-05-28 00:00:00
+(1 row)
+
  • 设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期比小,计算结果中的日期字段(Day字段)和result的月末日期保持一致。比如,
+
postgres=# select add_months('2018-02-28',3) from dual;
+add_months
+---------------------
+2018-05-31 00:00:00
+(1 row)
+

compat_analyze_sample

+

analyze采样行为配置项。

+

设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时DBnode端的内存消耗,保证analyze性能的稳定性。

+

bind_schema_tablespace

+

绑定模式与同名表空间配置项。

+

如果存在与模式名sche_name相同的表空间名,那么如果设置search_path为sche_name, default_tablespace也会同步切换到sche_name。

+

bind_procedure_searchpath

+

未指定模式名的数据库对象的搜索路径配置项。

+

在存储过程中如果不显示指定模式名,会优先在存储过程所属的模式下搜索。

+

如果找不到,则有两种情况:

+
  • 若不设置此参数,报错退出。
  • 若设置此参数,按照search_path中指定的顺序继续搜索。如果还是找不到,报错退出。
+

correct_to_number

+

控制to_number()结果兼容性的配置项。

+

若设置此配置项,则to_number()函数结果与pg11保持一致,否则默认与a db保持一致。

+

unbind_dive_bound

+

控制对整数除法的结果进行范围校验。

+

若设置此配置项,则不需要对除法结果做范围校验,例如,INT_MIN/(-1)可以得到输出结果为INT_MAX+1,反之,则会因为超过结果大于INT_MAX而报越界错误。

+

merge_update_multi

+

控制merge into匹配多行时是否进行update操作。

+

若设置此配置项,匹配多行时update不报错,否则默认与a db保持一致,报错。

+

return_null_string

+

控制函数lpad()和rpad()结果为空字符串''的显示配置项。

+
  • 不设置此配置项时,空字符串显示为NULL。
+
postgres=# select length(lpad('123',0,'*')) from dual;
+length
+--------
+
+(1 row)
+
  • 设置此配置项时,空字符串显示为''。
+
postgres=# select length(lpad('123',0,'*')) from dual;
+length
+--------
+0
+(1 row)
+

compat_concat_variadic

+

控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。

+

若设置此配置项,当concat函数参数为variadic类型时,保留a db和Teradata兼容模式下不同的结果形式;否则默认a db和Teradata兼容模式下结果相同,且与a db保持一致。由于mysql无variadic类型,所以该选项对MySQL无影响。

+

merge_update_multi

+

控制在使用MERGE INTO ... WHEN MATCHED THEN UPDATE(参考MERGE INTO) 和INSERT ... ON DUPLICATE KEY UPDATE(参考INSERT)时,当目标表中一条目标数据与多条源数据冲突时UPDATE行为。

+

若设置此配置项,当存在上述场景时,该冲突行将会多次执行UPDATE;否则(默认)报错,即MERGE或INSERT操作失败。

+
+ +## table\_skewness\_warning\_threshold + +**参数说明**:设置用于表倾斜告警的阈值。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0~1 + +**默认值**:1 + +## table\_skewness\_warning\_rows + +**参数说明**:设置用于表倾斜告警的行数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX + +**默认值**:100000 + +## datanode\_heartbeat\_interval + +**参数说明**:设置心跳线程间心跳消息发送时间间隔,建议值不超过wal\_receiver\_timeout / 2。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1000~60000(毫秒) + +**默认值**:1s + +## pagewriter\_thread\_num + +**参数说明**:设置用于增量检查点打开后后台刷页的线程数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~8 + +**默认值**:2 + +## pagewriter\_threshold + +**参数说明**:设置用于增量检查点打开后脏页数量达到这个数值时,后台刷页线程将一直刷脏页,不sleep。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX + +**默认值**:818 + +## pagewriter\_sleep + +**参数说明**:设置用于增量检查点打开后,脏页数量不足pagewriter\_threshold时,后台刷页线程将sleep设置的时间继续刷页。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~3600000(毫秒) + +**默认值**:100ms + +## remote\_read\_mode + +参数说明:远程读功能开关。读取主机上的页面失败时可以从备机上读取对应的页面。 + +取值范围:枚举类型 + +- off表示关闭远程读功能 +- non\_authentication表示开启远程读功能,但不进行证书认证 +- authentication表示开启远程读功能,但要进行证书认证 + +默认值: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\206\205\345\255\230.md" "b/content/zh/docs/Developerguide/\345\206\205\345\255\230.md" new file mode 100644 index 000000000..37b0ef3fa --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\206\205\345\255\230.md" @@ -0,0 +1,281 @@ +# 内存 + +介绍与内存相关的参数设置。 + +>![](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。 + +**设置建议:** + +数据库节点上该数值需要根据系统物理内存及单节点部署主数据库节点个数决定的。计算公式如下:(物理内存大小 – 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" new file mode 100644 index 000000000..2125106d4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\206\205\345\255\230\350\241\250.md" @@ -0,0 +1,67 @@ +# 内存表 + +介绍内存表的配置参数。 + +## 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\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" "b/content/zh/docs/Developerguide/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" new file mode 100644 index 000000000..dd3295ea5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\206\205\346\240\270\350\265\204\346\272\220\344\275\277\347\224\250.md" @@ -0,0 +1,34 @@ +# 内核资源使用 + +介绍与操作系统内核相关的参数,这些参数是否生效依赖于操作系统的设置。 + +## max\_files\_per\_process + +**参数说明:**设置每个服务器进程允许同时打开的最大文件数目。如果操作系统内核强制一个合理的数目,则不需要设置。 + +但是在一些平台上(特别是大多数BSD系统),内核允许独立进程打开比系统真正可以支持的数目大得多得文件数。如果用户发现有的“Too many open files”这样的失败现象,请尝试缩小这个设置。通常情况下需要满足,系统FD(file descriptor)数量\>=最大并发数\*数据库节点个数\*max\_files\_per\_process\*3。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,25\~2147483647。 + +**默认值:**1000 + +## shared\_preload\_libraries + +**参数说明:**此参数用于声明一个或者多个在服务器启动的时候预先装载的共享库,多个库名称之间用逗号分隔。比如 '$libdir/mylib' 会在加载标准库目录中的库文件之前预先加载mylib.so(某些平台上可能是mylib.sl)库文件。 + +可以用这个方法预先装载openGauss的存储过程库,通常是使用 '$libdir/plXXX' 语法。XXX只能是pgsql,perl,tcl,python之一。 + +通过预先装载一个共享库并在需要的时候初始化它,可以避免第一次使用这个库的加载时间。但是启动每个服务器进程的时间可能会增加,即使进程从来没有使用过这些库。因此建议对那些将被大多数会话使用的库才使用这个选项。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果被声明的库不存在,openGauss服务将会启动失败。 +>- 每一个支持openGauss的库都有一个特殊的标记用于保证兼容性。因此,不支持openGauss的库不能用这种方法加载。 + +**取值范围:**字符串 + +**默认值:**空 + 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\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" new file mode 100644 index 000000000..b32e0910e --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\206\205\351\203\250\346\216\245\345\217\243\345\207\275\346\225\260.md" @@ -0,0 +1,2225 @@ +# 内部接口函数 + +- 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 +- anynonarray\_out +- anyrange\_in +- anyrange\_out +- anytextcat +- area +- areajoinsel +- areasel +- array\_agg +- array\_agg\_finalfn +- array\_agg\_transfn +- array\_append +- array\_cat +- array\_dims +- array\_eq +- array\_extend +- array\_fill +- array\_ge +- array\_gt +- array\_in +- array\_larger +- array\_le +- array\_length +- array\_lower +- array\_lt +- array\_ndims +- array\_ne +- array\_out +- array\_prepend +- array\_recv +- array\_send +- array\_smaller +- array\_to\_json +- array\_to\_string +- array\_typanalyze +- array\_upper +- arraycontained +- arraycontains +- arraycontjoinsel +- arraycontsel +- arrayoverlap +- ascii +- asin +- atan +- atan2 +- avg +- bigint\_tid +- bit +- bit\_and +- bit\_in +- bit\_length +- bit\_or +- bit\_out +- bit\_recv +- bit\_send +- bitand +- bitcat +- bitcmp +- biteq +- bitge +- bitgt +- bitle +- bitlt +- bitne +- bitnot +- bitor +- bitshiftleft +- bitshiftright +- bittypmodin +- bittypmodout +- bitxor +- bool +- bool\_and +- bool\_int1 +- bool\_int2 +- bool\_int8 +- bool\_or +- booland\_statefunc +- booleq +- boolge +- boolgt +- boolin +- boolle +- boollt +- boolne +- boolor\_statefunc +- boolout +- boolrecv +- boolsend +- box +- box\_above +- box\_above\_eq +- box\_add +- box\_below +- box\_below\_eq +- box\_center +- box\_contain +- box\_contain\_pt +- box\_contained +- box\_distance +- box\_div +- box\_eq +- box\_ge +- box\_gt +- box\_in +- box\_intersect +- box\_le +- box\_left +- box\_lt +- box\_mul +- box\_out +- box\_overabove +- box\_overbelow +- box\_overlap +- box\_overleft +- box\_overright +- box\_recv +- box\_right +- box\_same +- box\_send +- box\_sub +- bpchar +- bpchar\_date +- bpchar\_float4 +- bpchar\_float8 +- bpchar\_int4 +- bpchar\_int8 +- bpchar\_larger +- bpchar\_numeric +- bpchar\_pattern\_ge +- bpchar\_pattern\_gt +- bpchar\_pattern\_le +- bpchar\_pattern\_lt +- bpchar\_smaller +- bpchar\_sortsupport +- bpchar\_timestamp +- bpcharcmp +- bpchareq +- bpcharge +- bpchargt +- bpchariclike +- bpcharicnlike +- bpcharicregexeq +- bpcharicregexne +- bpcharin +- bpcharle +- bpcharlike +- bpcharlt +- bpcharne +- bpcharnlike +- bpcharout +- bpcharrecv +- bpcharregexeq +- bpcharregexne +- bpcharsend +- bpchartypmodin +- bpchartypmodout +- broadcast +- btabstimecmp +- btarraycmp +- btbeginscan +- btboolcmp +- btbpchar\_pattern\_cmp +- btbuild +- btbuildempty +- btbulkdelete +- btcanreturn +- btcharcmp +- btcostestimate +- btendscan +- btfloat48cmp +- btfloat4cmp +- btfloat4sortsupport +- btfloat84cmp +- btfloat8cmp +- btfloat8sortsupport +- btgetbitmap +- btgettuple +- btinsert +- btint24cmp +- btint28cmp +- btint2cmp +- btint2sortsupport +- btint42cmp +- btint48cmp +- btint4cmp +- btint4sortsupport +- btint82cmp +- btint84cmp +- btint8cmp +- btint8sortsupport +- btmarkpos +- btmerge +- btnamecmp +- btnamesortsupport +- btoidcmp +- btoidsortsupport +- btoidvectorcmp +- btoptions +- btrecordcmp +- btreltimecmp +- btrescan +- btrestrpos +- btrim +- bttext\_pattern\_cmp +- bttextcmp +- bttextsortsupport +- bttidcmp +- bttintervalcmp +- btvacuumcleanup +- bucketabstime +- bucketbool +- bucketbpchar +- bucketbytea +- bucketcash +- bucketchar +- bucketdate +- bucketfloat4 +- bucketfloat8 +- bucketint1 +- bucketint2 +- bucketint2vector +- bucketint4 +- bucketint8 +- bucketinterval +- bucketname +- bucketnumeric +- bucketnvarchar2 +- bucketoid +- bucketoidvector +- bucketraw +- bucketreltime +- bucketsmalldatetime +- buckettext +- buckettime +- buckettimestamp +- buckettimestamptz +- buckettimetz +- bucketuuid +- bucketvarchar +- bytea\_sortsupport +- bytea\_string\_agg\_finalfn +- bytea\_string\_agg\_transfn +- byteacat +- byteacmp +- byteaeq +- byteage +- byteagt +- byteain +- byteale +- bytealike +- bytealt +- byteane +- byteanlike +- byteaout +- bytearecv +- byteasend +- cash\_cmp +- cash\_div\_cash +- cash\_div\_flt4 +- cash\_div\_flt8 +- cash\_div\_int1 +- cash\_div\_int2 +- cash\_div\_int4 +- cash\_div\_int8 +- cash\_eq +- cash\_ge +- cash\_gt +- cash\_in +- cash\_le +- cash\_lt +- cash\_mi +- cash\_mul\_flt4 +- cash\_mul\_flt8 +- cash\_mul\_int1 +- cash\_mul\_int2 +- cash\_mul\_int4 +- cash\_mul\_int8 +- cash\_ne +- cash\_out +- cash\_pl +- cash\_recv +- cash\_send +- cash\_words +- cashlarger +- cashsmaller +- cbrt +- cbtreebuild +- cbtreecanreturn +- cbtreecostestimate +- cbtreegetbitmap +- cbtreegettuple +- cbtreeoptions +- ceil +- ceiling +- center +- cginbuild +- cgingetbitmap +- char +- char\_length +- character\_length +- chareq +- charge +- chargt +- charin +- charle +- charlt +- charne +- charout +- charrecv +- charsend +- check\_engine\_status +- checksum +- checksumtext\_agg\_transfn +- chr +- cideq +- cidin +- cidout +- cidr +- cidr\_in +- cidr\_out +- cidr\_recv +- cidr\_send +- cidrecv +- cidsend +- circle +- circle\_above +- circle\_add\_pt +- circle\_below +- circle\_center +- circle\_contain +- circle\_contain\_pt +- circle\_contained +- circle\_distance +- circle\_div\_pt +- circle\_eq +- circle\_ge +- circle\_gt +- circle\_in +- circle\_le +- circle\_left +- circle\_lt +- circle\_mul\_pt +- circle\_ne +- circle\_out +- circle\_overabove +- circle\_overbelow +- circle\_overlap +- circle\_overleft +- circle\_overright +- circle\_recv +- circle\_right +- circle\_same +- circle\_send +- circle\_sub\_pt +- clock\_timestamp +- close\_lb +- close\_ls +- close\_lseg +- close\_pb +- close\_pl +- close\_ps +- close\_sb +- close\_sl +- col\_description +- comm\_client\_info +- complex\_array\_in +- concat +- concat\_ws +- contjoinsel +- contsel +- convert +- convert\_from +- convert\_to +- convert\_to\_nocase +- corr +- cos +- cot +- count +- covar\_pop +- covar\_samp +- create\_wdr\_snapshot +- cstore\_tid\_out +- cstring\_in +- cstring\_out +- cstring\_recv +- cstring\_send +- cume\_dist +- cupointer\_bigint +- current\_database +- current\_query +- current\_schema +- current\_schemas +- current\_setting +- current\_user +- currtid +- currtid2 +- currval +- cursor\_to\_xml +- cursor\_to\_xmlschema +- database\_to\_xml +- database\_to\_xml\_and\_xmlschema +- database\_to\_xmlschema +- datalength +- date +- date\_bpchar +- date\_cmp +- date\_cmp\_timestamp +- date\_cmp\_timestamptz +- date\_eq +- date\_eq\_timestamp +- date\_eq\_timestamptz +- date\_ge +- date\_ge\_timestamp +- date\_ge\_timestamptz +- date\_gt +- date\_gt\_timestamp +- date\_gt\_timestamptz +- date\_in +- date\_larger +- date\_le +- date\_le\_timestamp +- date\_le\_timestamptz +- date\_list\_agg\_noarg2\_transfn +- date\_list\_agg\_transfn +- date\_lt +- date\_lt\_timestamp +- date\_lt\_timestamptz +- date\_mi +- date\_mi\_interval +- date\_mii +- date\_ne +- date\_ne\_timestamp +- date\_ne\_timestamptz +- date\_out +- date\_part +- date\_pl\_interval +- date\_pli +- date\_recv +- date\_send +- date\_smaller +- date\_sortsupport +- date\_text +- date\_trunc +- date\_varchar +- daterange +- daterange\_canonical +- daterange\_subdiff +- datetime\_pl +- datetimetz\_pl +- dcbrt +- decode +- definer\_current\_user +- degrees +- dense\_rank +- dexp +- diagonal +- diameter +- disable\_conn +- dispell\_init +- dispell\_lexize +- dist\_cpoly +- dist\_lb +- dist\_pb +- dist\_pc +- dist\_pl +- dist\_ppath +- dist\_ps +- dist\_sb +- dist\_sl +- div +- dlog1 +- dlog10 +- domain\_in +- domain\_recv +- dpow +- dround +- dsimple\_init +- dsimple\_lexize +- dsqrt +- dsynonym\_init +- dsynonym\_lexize +- dtrunc +- elem\_contained\_by\_range +- empty\_blob +- encode +- encode\_plan\_node +- enum\_cmp +- enum\_eq +- enum\_first +- enum\_ge +- enum\_gt +- enum\_in +- enum\_larger +- enum\_last +- enum\_le +- enum\_lt +- enum\_ne +- enum\_out +- enum\_range +- enum\_recv +- enum\_send +- enum\_smaller +- eqjoinsel +- eqsel +- every +- exec\_hadoop\_sql +- exec\_on\_extension +- exp +- f4toi1 +- f8toi1 +- factorial +- family +- fdw\_handler\_in +- fdw\_handler\_out +- first\_value +- float4 +- float4\_accum +- float4\_bpchar +- float4\_list\_agg\_noarg2\_transfn +- float4\_list\_agg\_transfn +- float4\_text +- float4\_varchar +- float48div +- float48eq +- float48ge +- float48gt +- float48le +- float48lt +- float48mi +- float48mul +- float48ne +- float48pl +- float4abs +- float4div +- float4eq +- float4ge +- float4gt +- float4in +- float4larger +- float4le +- float4lt +- float4mi +- float4mul +- float4ne +- float4out +- float4pl +- float4recv +- float4send +- float4smaller +- float4um +- float4up +- float8 +- float8\_accum +- float8\_avg +- float8\_bpchar +- float8\_collect +- float8\_corr +- float8\_covar\_pop +- float8\_covar\_samp +- float8\_interval +- float8\_list\_agg\_noarg2\_transfn +- float8\_list\_agg\_transfn +- float8\_regr\_accum +- float8\_regr\_avgx +- float8\_regr\_avgy +- float8\_regr\_collect +- float8\_regr\_intercept +- float8\_regr\_r2 +- float8\_regr\_slope +- float8\_regr\_sxx +- float8\_regr\_sxy +- float8\_regr\_syy +- float8\_stddev\_pop +- float8\_stddev\_samp +- float8\_text +- float8\_var\_pop +- float8\_var\_samp +- float8\_varchar +- float84div +- float84eq +- float84ge +- float84gt +- float84le +- float84lt +- float84mi +- float84mul +- float84ne +- float84pl +- float8abs +- float8div +- float8eq +- float8ge +- float8gt +- float8in +- float8larger +- float8le +- float8lt +- float8mi +- float8mul +- float8ne +- float8out +- float8pl +- float8recv +- float8send +- float8smaller +- float8um +- float8up +- floor +- flt4\_mul\_cash +- flt8\_mul\_cash +- fmgr\_c\_validator +- fmgr\_internal\_validator +- fmgr\_sql\_validator +- format +- format\_type +- generate\_series +- generate\_subscripts +- generate\_wdr\_report +- get\_gtm\_lite\_status +- get\_hostname +- get\_nodename +- get\_prepared\_pending\_xid +- get\_schema\_oid +- getbucket +- getdatabaseencoding +- getpgusername +- gin\_clean\_pending\_list +- gin\_cmp\_prefix +- gin\_cmp\_tslexeme +- gin\_extract\_tsquery +- gin\_extract\_tsvector +- gin\_tsquery\_consistent +- gin\_tsquery\_triconsistent +- ginarrayconsistent +- ginarrayextract +- ginarraytriconsistent +- ginbeginscan +- ginbuild +- ginbuildempty +- ginbulkdelete +- gincostestimate +- ginendscan +- gingetbitmap +- gininsert +- ginmarkpos +- ginmerge +- ginoptions +- ginqueryarrayextract +- ginrescan +- ginrestrpos +- ginvacuumcleanup +- gist\_box\_compress +- gist\_box\_consistent +- gist\_box\_decompress +- gist\_box\_penalty +- gist\_box\_picksplit +- gist\_box\_same +- gist\_box\_union +- gist\_circle\_compress +- gist\_circle\_consistent +- gist\_point\_compress +- gist\_point\_consistent +- gist\_point\_distance +- gist\_poly\_compress +- gist\_poly\_consistent +- gistbeginscan +- gistbuild +- gistbuildempty +- gistbulkdelete +- gistcostestimate +- gistendscan +- gistgetbitmap +- gistgettuple +- gistinsert +- gistmarkpos +- gistmerge +- gistoptions +- gistrescan +- gistrestrpos +- gistvacuumcleanup +- global\_comm\_get\_client\_info +- global\_comm\_get\_recv\_stream +- global\_comm\_get\_send\_stream +- global\_comm\_get\_status +- gs\_all\_control\_group\_info +- gs\_all\_nodegroup\_control\_group\_info +- gs\_cgroup\_map\_ng\_conf +- gs\_extend\_library +- gs\_fault\_inject +- gs\_get\_next\_xid\_csn +- gs\_get\_nodegroup\_tablecount +- gs\_password\_notifytime +- gs\_stat\_get\_wlm\_plan\_operator\_info +- gs\_switch\_relfilenode +- gs\_total\_nodegroup\_memory\_detail +- gs\_wlm\_get\_resource\_pool\_info +- gs\_wlm\_get\_session\_info +- gs\_wlm\_get\_user\_info +- gs\_wlm\_get\_user\_session\_info +- gs\_wlm\_get\_workload\_records +- gs\_wlm\_node\_clean +- gs\_wlm\_node\_recover +- gs\_wlm\_readjust\_user\_space +- gs\_wlm\_readjust\_user\_space\_through\_username +- gs\_wlm\_readjust\_user\_space\_with\_reset\_flag +- gs\_wlm\_rebuild\_user\_resource\_pool +- gs\_wlm\_session\_respool +- gtsquery\_compress +- gtsquery\_consistent +- gtsquery\_decompress +- gtsquery\_penalty +- gtsquery\_picksplit +- gtsquery\_same +- gtsquery\_union +- gtsvector\_compress +- gtsvector\_consistent +- gtsvector\_decompress +- gtsvector\_penalty +- gtsvector\_picksplit +- gtsvector\_same +- gtsvector\_union +- gtsvectorin +- gtsvectorout +- has\_any\_column\_privilege +- has\_column\_privilege +- has\_database\_privilege +- has\_directory\_privilege +- has\_foreign\_data\_wrapper\_privilege +- has\_function\_privilege +- has\_language\_privilege +- has\_nodegroup\_privilege +- has\_schema\_privilege +- has\_sequence\_privilege +- has\_server\_privilege +- has\_table\_privilege +- has\_tablespace\_privilege +- has\_type\_privilege +- hash\_aclitem +- hash\_array +- hash\_numeric +- hash\_range +- hashbeginscan +- hashbpchar +- hashbuild +- hashbuildempty +- hashbulkdelete +- hashchar +- hashcostestimate +- hashendscan +- hashenum +- hashfloat4 +- hashfloat8 +- hashgetbitmap +- hashgettuple +- hashinet +- hashinsert +- hashint1 +- hashint2 +- hashint2vector +- hashint4 +- hashint8 +- hashmacaddr +- hashmarkpos +- hashmerge +- hashname +- hashoid +- hashoidvector +- hashoptions +- hashrescan +- hashrestrpos +- hashtext +- hashvacuumcleanup +- hashvarlena +- height +- hextoraw +- host +- hostmask +- i1tof4 +- i1tof8 +- i1toi2 +- i1toi4 +- i1toi8 +- i2toi1 +- i4toi1 +- i8toi1 +- iclikejoinsel +- iclikesel +- icnlikejoinsel +- icnlikesel +- icregexeqjoinsel +- icregexeqsel +- icregexnejoinsel +- icregexnesel +- inet\_client\_addr +- inet\_client\_port +- inet\_in +- inet\_out +- inet\_recv +- inet\_send +- inet\_server\_addr +- inet\_server\_port +- inetand +- inetmi +- inetmi\_int8 +- inetnot +- inetor +- inetpl +- initcap +- instr +- int1\_avg\_accum +- int1\_bool +- int1\_bpchar +- int1\_mul\_cash +- int1\_numeric +- int1\_nvarchar2 +- int1\_text +- int1\_varchar +- int1abs +- int1and +- int1cmp +- int1div +- int1eq +- int1ge +- int1gt +- int1in +- int1inc +- int1larger +- int1le +- int1lt +- int1mi +- int1mod +- int1mul +- int1ne +- int1not +- int1or +- int1out +- int1pl +- int1recv +- int1send +- int1shl +- int1shr +- int1smaller +- int1um +- int1up +- int1xor +- int2 +- int2\_accum +- int2\_avg\_accum +- int2\_bool +- int2\_bpchar +- int2\_list\_agg\_noarg2\_transfn +- int2\_list\_agg\_transfn +- int2\_mul\_cash +- int2\_sum +- int2\_text +- int2\_varchar +- int24div +- int24eq +- int24ge +- int24gt +- int24le +- int24lt +- int24mi +- int24mul +- int24ne +- int24pl +- int28div +- int28eq +- int28ge +- int28gt +- int28le +- int28lt +- int28mi +- int28mul +- int28ne +- int28pl +- int2abs +- int2and +- int2div +- int2eq +- int2ge +- int2gt +- int2in +- int2larger +- int2le +- int2lt +- int2mi +- int2mod +- int2mul +- int2ne +- int2not +- int2or +- int2out +- int2pl +- int2recv +- int2send +- int2shl +- int2shr +- int2smaller +- int2um +- int2up +- int2vectoreq +- int2vectorin +- int2vectorout +- int2vectorrecv +- int2vectorsend +- int2xor +- int4 +- int4\_accum +- int4\_avg\_accum +- int4\_bpchar +- int4\_list\_agg\_noarg2\_transfn +- int4\_list\_agg\_transfn +- int4\_mul\_cash +- int4\_sum +- int4\_text +- int4\_varchar +- int42div +- int42eq +- int42ge +- int42gt +- int42le +- int42lt +- int42mi +- int42mul +- int42ne +- int42pl +- int48div +- int48eq +- int48ge +- int48gt +- int48le +- int48lt +- int48mi +- int48mul +- int48ne +- int48pl +- int4abs +- int4and +- int4div +- int4eq +- int4ge +- int4gt +- int4in +- int4inc +- int4larger +- int4le +- int4lt +- int4mi +- int4mod +- int4mul +- int4ne +- int4not +- int4or +- int4out +- int4pl +- int4range +- int4range\_canonical +- int4range\_subdiff +- int4recv +- int4send +- int4shl +- int4shr +- int4smaller +- int4um +- int4up +- int4xor +- int8 +- int8\_accum +- int8\_avg +- int8\_avg\_accum +- int8\_avg\_collect +- int8\_bool +- int8\_bpchar +- int8\_list\_agg\_noarg2\_transfn +- int8\_list\_agg\_transfn +- int8\_mul\_cash +- int8\_sum +- int8\_sum\_to\_int8 +- int8\_text +- int8\_varchar +- int82div +- int82eq +- int82ge +- int82gt +- int82le +- int82lt +- int82mi +- int82mul +- int82ne +- int82pl +- int84div +- int84eq +- int84ge +- int84gt +- int84le +- int84lt +- int84mi +- int84mul +- int84ne +- int84pl +- int8abs +- int8and +- int8div +- int8eq +- int8ge +- int8gt +- int8in +- int8inc +- int8inc\_any +- int8inc\_float8\_float8 +- int8larger +- int8le +- int8lt +- int8mi +- int8mod +- int8mul +- int8ne +- int8not +- int8or +- int8out +- int8pl +- int8pl\_inet +- int8range +- int8range\_canonical +- int8range\_subdiff +- int8recv +- int8send +- int8shl +- int8shr +- int8smaller +- int8um +- int8up +- int8xor +- integer\_pl\_date +- inter\_lb +- inter\_sb +- inter\_sl +- internal\_in +- internal\_out +- interval +- interval\_accum +- interval\_avg +- interval\_cmp +- interval\_collect +- interval\_div +- interval\_eq +- interval\_ge +- interval\_gt +- interval\_hash +- interval\_in +- interval\_larger +- interval\_le +- interval\_list\_agg\_noarg2\_transfn +- interval\_list\_agg\_transfn +- interval\_lt +- interval\_mi +- interval\_mul +- interval\_ne +- interval\_out +- interval\_pl +- interval\_pl\_date +- interval\_pl\_time +- interval\_pl\_timestamp +- interval\_pl\_timestamptz +- interval\_pl\_timetz +- interval\_recv +- interval\_send +- interval\_smaller +- interval\_transform +- interval\_um +- intervaltypmodin +- intervaltypmodout +- intinterval +- isclosed +- isempty +- isfinite +- ishorizontal +- isopen +- isparallel +- isperp +- isvertical +- json\_in +- json\_out +- json\_recv +- json\_send +- justify\_days +- justify\_hours +- justify\_interval +- kill\_snapshot +- lag +- language\_handler\_in +- language\_handler\_out +- last\_day +- last\_value +- lastval +- lead +- left +- length +- lengthb +- like +- like\_escape +- likejoinsel +- likesel +- line +- line\_distance +- line\_eq +- line\_horizontal +- line\_in +- line\_interpt +- line\_intersect +- line\_out +- line\_parallel +- line\_perp +- line\_recv +- line\_send +- line\_vertical +- list\_agg\_finalfn +- list\_agg\_noarg2\_transfn +- list\_agg\_transfn +- listagg +- ln +- lo\_close +- lo\_creat +- lo\_create +- lo\_export +- lo\_import +- lo\_lseek +- lo\_open +- lo\_tell +- lo\_truncate +- lo\_unlink +- local\_ckpt\_stat +- local\_double\_write\_stat +- local\_pagewriter\_stat +- local\_recovery\_status +- local\_redo\_stat +- local\_rto\_stat +- log +- loread +- lower +- lower\_inc +- lower\_inf +- lowrite +- lpad +- lseg +- lseg\_center +- lseg\_distance +- lseg\_eq +- lseg\_ge +- lseg\_gt +- lseg\_horizontal +- lseg\_in +- lseg\_interpt +- lseg\_intersect +- lseg\_le +- lseg\_length +- lseg\_lt +- lseg\_ne +- lseg\_out +- lseg\_parallel +- lseg\_perp +- lseg\_recv +- lseg\_send +- lseg\_vertical +- ltrim +- macaddr\_and +- macaddr\_cmp +- macaddr\_eq +- macaddr\_ge +- macaddr\_gt +- macaddr\_in +- macaddr\_le +- macaddr\_lt +- macaddr\_ne +- macaddr\_not +- macaddr\_or +- macaddr\_out +- macaddr\_recv +- macaddr\_send +- makeaclitem +- masklen +- max +- md5 +- min +- mktinterval +- mod +- model\_train\_opt +- money +- mul\_d\_interval +- multiply +- name +- nameeq +- namege +- namegt +- nameiclike +- nameicnlike +- nameicregexeq +- nameicregexne +- namein +- namele +- namelike +- namelt +- namene +- namenlike +- nameout +- namerecv +- nameregexeq +- nameregexne +- namesend +- neqjoinsel +- neqsel +- netmask +- network +- network\_cmp +- network\_eq +- network\_ge +- network\_gt +- network\_le +- network\_lt +- network\_ne +- network\_sub +- network\_subeq +- network\_sup +- network\_supeq +- next\_day +- nextval +- ngram\_end +- ngram\_lextype +- ngram\_nexttoken +- ngram\_start +- nlikejoinsel +- nlikesel +- node\_oid\_name +- notlike +- now +- npoints +- nth\_value +- ntile +- numeric +- numeric\_abs +- numeric\_accum +- numeric\_add +- numeric\_avg +- numeric\_avg\_accum +- numeric\_avg\_collect +- numeric\_bpchar +- numeric\_cmp +- numeric\_collect +- numeric\_div +- numeric\_div\_trunc +- numeric\_eq +- numeric\_exp +- numeric\_fac +- numeric\_ge +- numeric\_gt +- numeric\_in +- numeric\_inc +- numeric\_int1 +- numeric\_larger +- numeric\_le +- numeric\_list\_agg\_noarg2\_transfn +- numeric\_list\_agg\_transfn +- numeric\_ln +- numeric\_log +- numeric\_lt +- numeric\_mod +- numeric\_mul +- numeric\_ne +- numeric\_out +- numeric\_power +- numeric\_recv +- numeric\_send +- numeric\_smaller +- numeric\_sortsupport +- numeric\_sqrt +- numeric\_stddev\_pop +- numeric\_stddev\_samp +- numeric\_sub +- numeric\_text +- numeric\_transform +- numeric\_uminus +- numeric\_uplus +- numeric\_var\_pop +- numeric\_var\_samp +- numeric\_varchar +- numerictypmodin +- numerictypmodout +- numnode +- numrange +- numrange\_subdiff +- numtoday +- numtodsinterval +- nvarchar2 +- nvarchar2in +- nvarchar2out +- nvarchar2recv +- nvarchar2send +- nvarchar2typmodin +- nvarchar2typmodout +- obj\_description +- octet\_length +- oid +- oideq +- oidge +- oidgt +- oidin +- oidlarger +- oidle +- oidlt +- oidne +- oidout +- oidrecv +- oidsend +- oidsmaller +- oidvectoreq +- oidvectorge +- oidvectorgt +- oidvectorin +- oidvectorin\_extend +- oidvectorle +- oidvectorlt +- oidvectorne +- oidvectorout +- oidvectorout\_extend +- oidvectorrecv +- oidvectorrecv\_extend +- oidvectorsend +- oidvectorsend\_extend +- oidvectortypes +- on\_pb +- on\_pl +- on\_ppath +- on\_ps +- on\_sb +- on\_sl +- opaque\_in +- opaque\_out +- ordered\_set\_transition +- overlaps +- overlay +- path +- path\_add +- path\_add\_pt +- path\_center +- path\_contain\_pt +- path\_distance +- path\_div\_pt +- path\_in +- path\_inter +- path\_length +- path\_mul\_pt +- path\_n\_eq +- path\_n\_ge +- path\_n\_gt +- path\_n\_le +- path\_n\_lt +- path\_npoints +- path\_out +- path\_recv +- path\_send +- path\_sub\_pt +- percent\_rank +- percentile\_cont +- percentile\_cont\_float8\_final +- percentile\_cont\_interval\_final +- pg\_autovac\_coordinator +- pg\_available\_extension\_versions +- pg\_available\_extensions +- pg\_buffercache\_pages +- pg\_cancel\_invalid\_query +- pg\_char\_to\_encoding +- pg\_check\_xidlimit +- pg\_clean\_region\_info +- pg\_collation\_for +- pg\_comm\_delay +- pg\_comm\_recv\_stream +- pg\_comm\_send\_stream +- pg\_comm\_status +- pg\_control\_group\_config +- pg\_create\_physical\_replication\_slot +- pg\_current\_sessid +- pg\_current\_sessionid +- pg\_current\_userid +- pg\_cursor +- pg\_encoding\_max\_length +- pg\_encoding\_to\_char +- pg\_extension\_config\_dump +- pg\_extension\_update\_paths +- pg\_filenode\_relation +- pg\_get\_replication\_slot\_name +- pg\_get\_replication\_slots +- pg\_get\_xidlimit +- pg\_lock\_status +- pg\_log\_comm\_status +- pg\_logical\_slot\_get\_binary\_changes +- pg\_logical\_slot\_peek\_binary\_changes +- pg\_node\_tree\_in +- pg\_node\_tree\_out +- pg\_node\_tree\_recv +- pg\_node\_tree\_send +- pg\_notify +- pg\_parse\_clog +- pg\_partition\_filenode +- pg\_pool\_ping +- pg\_pool\_validate +- pg\_prepared\_statement +- pg\_prepared\_xact +- pg\_relation\_compression\_ratio +- pg\_relation\_with\_compression +- pg\_resume\_bkp\_flag +- pg\_sequence\_parameters +- pg\_show\_all\_settings +- pg\_stat\_file\_recursive +- pg\_stat\_get\_activity\_for\_temptable +- pg\_stat\_get\_activity\_ng +- pg\_stat\_get\_bgwriter\_stat\_reset\_time +- pg\_stat\_get\_buf\_fsync\_backend +- pg\_stat\_get\_cgroup\_info +- pg\_stat\_get\_checkpoint\_sync\_time +- pg\_stat\_get\_checkpoint\_write\_time +- pg\_stat\_get\_db\_blk\_read\_time +- pg\_stat\_get\_db\_blk\_write\_time +- pg\_stat\_get\_db\_conflict\_all +- pg\_stat\_get\_db\_conflict\_bufferpin +- pg\_stat\_get\_db\_conflict\_snapshot +- pg\_stat\_get\_db\_conflict\_startup\_deadlock +- pg\_stat\_get\_db\_conflict\_tablespace +- pg\_stat\_get\_db\_stat\_reset\_time +- pg\_stat\_get\_db\_temp\_bytes +- pg\_stat\_get\_db\_temp\_files +- pg\_stat\_get\_file\_stat +- pg\_stat\_get\_function\_total\_time +- pg\_stat\_get\_mem\_mbytes\_reserved +- pg\_stat\_get\_partition\_tuples\_hot\_updated +- pg\_stat\_get\_pooler\_status +- pg\_stat\_get\_realtime\_info\_internal +- pg\_stat\_get\_redo\_stat +- pg\_stat\_get\_role\_name +- pg\_stat\_get\_session\_wlmstat +- pg\_stat\_get\_status +- pg\_stat\_get\_stream\_replications +- pg\_stat\_get\_wal\_receiver +- pg\_stat\_get\_wal\_senders +- pg\_stat\_get\_wlm\_ec\_operator\_info +- pg\_stat\_get\_wlm\_instance\_info +- pg\_stat\_get\_wlm\_instance\_info\_with\_cleanup +- pg\_stat\_get\_wlm\_node\_resource\_info +- pg\_stat\_get\_wlm\_operator\_info +- pg\_stat\_get\_wlm\_realtime\_ec\_operator\_info +- pg\_stat\_get\_wlm\_realtime\_operator\_info +- pg\_stat\_get\_wlm\_realtime\_session\_info +- pg\_stat\_get\_wlm\_session\_info +- pg\_stat\_get\_wlm\_session\_info\_internal +- pg\_stat\_get\_wlm\_session\_iostat\_info +- pg\_stat\_get\_wlm\_statistics +- pg\_stat\_get\_workload\_struct\_info +- pg\_stat\_get\_xact\_blocks\_fetched +- pg\_stat\_get\_xact\_blocks\_hit +- pg\_stat\_get\_xact\_function\_calls +- pg\_stat\_get\_xact\_function\_self\_time +- pg\_stat\_get\_xact\_function\_total\_time +- pg\_stat\_get\_xact\_numscans +- pg\_stat\_get\_xact\_tuples\_fetched +- pg\_stat\_get\_xact\_tuples\_returned +- pg\_stat\_reset +- pg\_sync\_cstore\_delta +- pg\_tde\_info +- pg\_test\_err\_contain\_err +- pg\_timezone\_abbrevs +- 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 +- pgxc\_pool\_connection\_status +- pgxc\_snapshot\_status +- pgxc\_stat\_dirty\_tables +- pgxc\_unlock\_for\_sp\_database +- pi +- plainto\_tsquery +- plancache\_clean +- plancache\_status +- point +- point\_above +- point\_add +- point\_below +- point\_distance +- point\_div +- point\_eq +- point\_horiz +- point\_in +- point\_left +- point\_mul +- point\_ne +- point\_out +- point\_recv +- point\_right +- point\_send +- point\_sub +- point\_vert +- poly\_above +- poly\_below +- poly\_center +- poly\_contain +- poly\_contain\_pt +- poly\_contained +- poly\_distance +- poly\_in +- poly\_left +- poly\_npoints +- poly\_out +- poly\_overabove +- poly\_overbelow +- poly\_overlap +- poly\_overleft +- poly\_overright +- poly\_recv +- poly\_right +- poly\_same +- poly\_send +- polygon +- position +- positionjoinsel +- positionsel +- postgresql\_fdw\_validator +- pound\_end +- pound\_lextype +- pound\_nexttoken +- pound\_start +- pow +- power +- prepare\_statement\_status +- prsd\_end +- prsd\_headline +- prsd\_lextype +- prsd\_nexttoken +- prsd\_start +- psortbuild +- psortcanreturn +- psortcostestimate +- psortgetbitmap +- psortgettuple +- psortoptions +- pt\_contained\_circle +- pt\_contained\_poly +- pv\_builtin\_functions +- pv\_compute\_pool\_workload +- pv\_os\_run\_info +- pv\_session\_memory +- pv\_session\_memory\_detail +- pv\_session\_stat +- pv\_session\_time +- pv\_thread\_memory\_detail +- pv\_total\_memory\_detail +- query\_to\_xml +- query\_to\_xml\_and\_xmlschema +- query\_to\_xmlschema +- querytree +- quote\_ident +- quote\_literal +- quote\_nullable +- radians +- radius +- random +- range\_adjacent +- range\_after +- range\_before +- range\_cmp +- range\_contained\_by +- range\_contains +- range\_contains\_elem +- range\_eq +- range\_ge +- range\_gist\_compress +- range\_gist\_consistent +- range\_gist\_decompress +- range\_gist\_penalty +- range\_gist\_picksplit +- range\_gist\_same +- range\_gist\_union +- range\_gt +- range\_in +- range\_intersect +- range\_le +- range\_lt +- range\_minus +- range\_ne +- range\_out +- range\_overlaps +- range\_overleft +- range\_overright +- range\_recv +- range\_send +- range\_typanalyze +- range\_union +- rank +- rawcat +- rawcmp +- raweq +- rawge +- rawgt +- rawin +- rawle +- rawlike +- rawlt +- rawne +- rawnlike +- rawout +- rawrecv +- rawsend +- rawtohex +- read\_disable\_conn\_file +- record\_eq +- record\_ge +- record\_gt +- record\_in +- record\_le +- record\_lt +- record\_ne +- record\_out +- record\_recv +- record\_send +- regclass +- regclassin +- regclassout +- regclassrecv +- regclasssend +- regconfigin +- regconfigout +- regconfigrecv +- regconfigsend +- regdictionaryin +- regdictionaryout +- regdictionaryrecv +- regdictionarysend +- regexeqjoinsel +- regexeqsel +- regexnejoinsel +- regexnesel +- regexp\_matches +- regexp\_replace +- regexp\_split\_to\_array +- regexp\_split\_to\_table +- regoperatorin +- regoperatorout +- regoperatorrecv +- regoperatorsend +- regoperin +- regoperout +- regoperrecv +- regopersend +- regprocedurein +- regprocedureout +- regprocedurerecv +- regproceduresend +- regprocin +- regprocout +- regprocrecv +- regprocsend +- regr\_avgx +- regr\_avgy +- regr\_count +- regr\_intercept +- regr\_r2 +- regr\_slope +- regr\_sxx +- regr\_sxy +- regr\_syy +- regtypein +- regtypeout +- regtyperecv +- regtypesend +- reltime +- reltimeeq +- reltimege +- reltimegt +- reltimein +- reltimele +- reltimelt +- reltimene +- reltimeout +- reltimerecv +- reltimesend +- remote\_ckpt\_stat +- remote\_double\_write\_stat +- remote\_pagewriter\_stat +- remote\_recovery\_status +- remote\_redo\_stat +- remote\_rto\_stat +- repeat +- replace +- report\_fatal +- reset\_unique\_sql +- reverse +- RI\_FKey\_cascade\_del +- RI\_FKey\_cascade\_upd +- RI\_FKey\_check\_ins +- RI\_FKey\_check\_upd +- RI\_FKey\_noaction\_del +- RI\_FKey\_noaction\_upd +- RI\_FKey\_restrict\_del +- RI\_FKey\_restrict\_upd +- RI\_FKey\_setdefault\_del +- RI\_FKey\_setdefault\_upd +- RI\_FKey\_setnull\_del +- RI\_FKey\_setnull\_upd +- right +- round +- row\_number +- row\_to\_json +- rpad +- rtrim +- scalargtjoinsel +- scalargtsel +- scalarltjoinsel +- scalarltsel +- schema\_to\_xml +- schema\_to\_xml\_and\_xmlschema +- schema\_to\_xmlschema +- session\_user +- sessionid2pid +- set\_bit +- set\_byte +- set\_config +- set\_hashbucket\_info +- set\_masklen +- set\_working\_grand\_version\_num\_manually +- setseed +- setval +- setweight +- shell\_in +- shell\_out +- shobj\_description +- sign +- signal\_backend +- similar\_escape +- sin +- slope +- smalldatetime\_cmp +- smalldatetime\_eq +- smalldatetime\_ge +- smalldatetime\_gt +- smalldatetime\_hash +- smalldatetime\_in +- smalldatetime\_larger +- smalldatetime\_le +- smalldatetime\_lt +- smalldatetime\_ne +- smalldatetime\_out +- smalldatetime\_recv +- smalldatetime\_send +- smalldatetime\_smaller +- smgreq +- smgrin +- smgrne +- smgrout +- spg\_kd\_choose +- spg\_kd\_config +- spg\_kd\_inner\_consistent +- spg\_kd\_picksplit +- spg\_quad\_choose +- spg\_quad\_config +- spg\_quad\_inner\_consistent +- spg\_quad\_leaf\_consistent +- spg\_quad\_picksplit +- spg\_text\_choose +- spg\_text\_config +- spg\_text\_inner\_consistent +- spg\_text\_leaf\_consistent +- spg\_text\_picksplit +- spgbeginscan +- spgbuild +- spgbuildempty +- spgbulkdelete +- spgcanreturn +- spgcostestimate +- spgendscan +- spggetbitmap +- spggettuple +- spginsert +- spgmarkpos +- spgmerge +- spgoptions +- spgrescan +- spgrestrpos +- spgvacuumcleanup +- split\_part +- sqrt +- statement\_timestamp +- stddev +- stddev\_pop +- stddev\_samp +- string\_agg +- string\_agg\_finalfn +- string\_agg\_transfn +- string\_to\_array +- strip +- strpos +- substr +- substrb +- substring +- substring\_inner +- sum +- suppress\_redundant\_updates\_trigger +- sysdate +- table\_data\_skewness +- table\_distribution +- table\_to\_xml +- table\_to\_xml\_and\_xmlschema +- table\_to\_xmlschema +- tablespace\_oid\_name +- tan +- text +- text\_date +- text\_float4 +- text\_float8 +- text\_ge +- text\_gt +- text\_int1 +- text\_int2 +- text\_int4 +- text\_int8 +- text\_larger +- text\_le +- text\_lt + +- text\_numeric +- text\_pattern\_ge +- text\_pattern\_gt +- text\_pattern\_le +- text\_pattern\_lt +- text\_smaller +- text\_timestamp +- textanycat +- textcat +- texteq +- texticlike +- texticnlike +- texticregexeq +- texticregexne +- textin +- textlen +- textlike +- textne +- textnlike +- textout +- textrecv +- textregexeq +- textregexne +- textsend +- thesaurus\_init +- thesaurus\_lexize +- threadpool\_status +- tideq +- tidge +- tidgt +- tidin +- tidlarger +- tidle +- tidlt +- tidne +- tidout +- tidrecv +- tidsend +- tidsmaller +- time +- time\_cmp +- time\_eq +- time\_ge +- time\_gt +- time\_hash +- time\_in +- time\_larger +- time\_le +- time\_lt +- time\_mi\_interval +- time\_mi\_time +- time\_ne +- time\_out +- time\_pl\_interval +- time\_recv +- time\_send +- time\_smaller +- time\_transform +- timedate\_pl +- timemi +- timenow +- timeofday +- timepl +- timestamp +- timestamp\_cmp +- timestamp\_cmp\_date +- timestamp\_cmp\_timestamptz +- timestamp\_diff +- timestamp\_eq +- timestamp\_eq\_date +- timestamp\_eq\_timestamptz +- timestamp\_ge +- timestamp\_ge\_date +- timestamp\_ge\_timestamptz +- timestamp\_gt +- timestamp\_gt\_date +- timestamp\_gt\_timestamptz +- timestamp\_hash +- timestamp\_in +- timestamp\_larger +- timestamp\_le +- timestamp\_le\_date +- timestamp\_le\_timestamptz +- timestamp\_list\_agg\_noarg2\_transfn +- timestamp\_list\_agg\_transfn +- timestamp\_lt +- timestamp\_lt\_date +- timestamp\_lt\_timestamptz +- timestamp\_mi +- timestamp\_mi\_interval +- timestamp\_ne +- timestamp\_ne\_date +- timestamp\_ne\_timestamptz +- timestamp\_out +- timestamp\_pl\_interval +- timestamp\_recv +- timestamp\_send +- timestamp\_smaller +- timestamp\_sortsupport +- timestamp\_text +- timestamp\_transform +- timestamp\_varchar +- timestamptypmodin +- timestamptypmodout +- timestamptz +- timestamptz\_cmp +- timestamptz\_cmp\_date +- timestamptz\_cmp\_timestamp +- timestamptz\_eq +- timestamptz\_eq\_date +- timestamptz\_eq\_timestamp +- timestamptz\_ge +- timestamptz\_ge\_date +- timestamptz\_ge\_timestamp +- timestamptz\_gt +- timestamptz\_gt\_date +- timestamptz\_gt\_timestamp +- timestamptz\_in +- timestamptz\_larger +- timestamptz\_le +- timestamptz\_le\_date +- timestamptz\_le\_timestamp +- timestamptz\_list\_agg\_noarg2\_transfn +- timestamptz\_list\_agg\_transfn +- timestamptz\_lt +- timestamptz\_lt\_date +- timestamptz\_lt\_timestamp +- timestamptz\_mi +- timestamptz\_mi\_interval +- timestamptz\_ne +- timestamptz\_ne\_date +- timestamptz\_ne\_timestamp +- timestamptz\_out +- timestamptz\_pl\_interval +- timestamptz\_recv +- timestamptz\_send +- timestamptz\_smaller +- timestamptztypmodin +- timestamptztypmodout +- timestampzone\_text +- timetypmodin +- timetypmodout +- timetz +- timetz\_cmp +- timetz\_eq +- timetz\_ge +- timetz\_gt +- timetz\_hash +- timetz\_in +- timetz\_larger +- timetz\_le +- timetz\_lt +- timetz\_mi\_interval +- timetz\_ne +- timetz\_out +- timetz\_pl\_interval +- timetz\_recv +- timetz\_send +- timetz\_smaller +- timetzdate\_pl +- timetztypmodin +- timetztypmodout +- timezone +- tinterval +- tintervalct +- tintervalend +- tintervaleq +- tintervalge +- tintervalgt +- tintervalin +- tintervalle +- tintervalleneq +- tintervallenge +- tintervallengt +- tintervallenle +- tintervallenlt +- tintervallenne +- tintervallt +- tintervalne +- tintervalout +- tintervalov +- tintervalrecv +- tintervalrel +- tintervalsame +- tintervalsend +- tintervalstart +- to\_ascii +- to\_char +- to\_date +- to\_hex +- to\_number +- to\_timestamp +- to\_tsquery +- to\_tsvector +- to\_tsvector\_for\_batch +- total\_cpu +- total\_memory +- track\_model\_train\_opt +- transaction\_timestamp +- translate +- trigger\_in +- trigger\_out +- trunc +- ts\_headline +- ts\_lexize +- ts\_match\_qv +- ts\_match\_tq +- ts\_match\_tt +- ts\_match\_vq +- ts\_parse +- ts\_rank +- ts\_rank\_cd +- ts\_rewrite +- ts\_stat +- ts\_token\_type +- ts\_typanalyze +- tsmatchjoinsel +- tsmatchsel +- tsq\_mcontained +- tsq\_mcontains +- tsquery\_and +- tsquery\_cmp +- tsquery\_eq +- tsquery\_ge +- tsquery\_gt +- tsquery\_le +- tsquery\_lt +- tsquery\_ne +- tsquery\_not +- tsquery\_or +- tsqueryin +- tsqueryout +- tsqueryrecv +- tsquerysend +- tsrange +- tsrange\_subdiff +- tstzrange +- tstzrange\_subdiff +- tsvector\_cmp +- tsvector\_concat +- tsvector\_eq +- tsvector\_ge +- tsvector\_gt +- tsvector\_le +- tsvector\_lt +- tsvector\_ne +- tsvector\_update\_trigger +- tsvector\_update\_trigger\_column +- tsvectorin +- tsvectorout +- tsvectorrecv +- tsvectorsend +- txid\_current +- txid\_current\_snapshot +- txid\_snapshot\_in +- txid\_snapshot\_out +- txid\_snapshot\_recv +- txid\_snapshot\_send +- txid\_snapshot\_xip +- txid\_snapshot\_xmax +- txid\_snapshot\_xmin +- txid\_visible\_in\_snapshot +- unique\_key\_recheck +- unknownin +- unknownout +- unknownrecv +- unknownsend +- unnest +- update\_pgjob +- upper +- upper\_inc +- upper\_inf +- uuid\_cmp +- uuid\_eq +- uuid\_ge +- uuid\_gt +- uuid\_hash +- uuid\_in +- uuid\_le +- uuid\_lt +- uuid\_ne +- uuid\_out +- uuid\_recv +- uuid\_send +- var\_pop +- var\_samp +- varbit +- varbit\_in +- varbit\_out +- varbit\_recv +- varbit\_send +- varbit\_transform +- varbitcmp +- varbiteq +- varbitge +- varbitgt +- varbitle +- varbitlt +- varbitne +- varbittypmodin +- varbittypmodout +- varchar +- varchar\_date +- varchar\_float4 +- varchar\_float8 +- varchar\_int4 +- varchar\_int8 +- varchar\_numeric +- varchar\_timestamp +- varchar\_transform +- varcharin +- varcharout +- varcharrecv +- varcharsend +- varchartypmodin +- varchartypmodout +- variance +- version +- void\_in +- void\_out +- void\_recv +- void\_send +- wdr\_xdb\_query +- width +- width\_bucket +- xideq +- xideq4 +- xideqint4 +- xideqint8 +- xidin +- xidin4 +- xidlt +- xidlt4 +- xidout +- xidout4 +- xidrecv +- xidrecv4 +- xidsend +- xidsend4 +- xml +- xml\_in +- xml\_is\_well\_formed +- xml\_is\_well\_formed\_content +- xml\_is\_well\_formed\_document +- xml\_out +- xml\_recv +- xml\_send +- xmlagg +- xmlcomment +- xmlconcat2 +- xmlexists +- xmlvalidate +- xpath +- xpath\_exists +- zhprs\_end +- zhprs\_getlexeme +- zhprs\_lextype +- zhprs\_start + diff --git "a/content/zh/docs/Developerguide/\345\206\231\345\205\245\345\222\214\350\257\273\345\206\231\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\345\206\231\345\205\245\345\222\214\350\257\273\345\206\231\346\223\215\344\275\234.md" new file mode 100644 index 000000000..b5505f37c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\206\231\345\205\245\345\222\214\350\257\273\345\206\231\346\223\215\344\275\234.md" @@ -0,0 +1,13 @@ +# 写入和读写操作 + +关于写入和读写操作的命令: + +- INSERT,可向表中插入一行或多行数据。 +- UPDATE,可修改表中现有数据。 +- DELETE,可删除表中现有数据。 +- COPY,导入数据。 + +INSERT和COPY是纯写入的操作。并发写入操作,需要等待,对同一个表的操作,当事务T1的INSERT或COPY未解除锁定时,事务T2的INSERT或COPY需等待,事务T1解除锁定时,事务T2正常继续。 + +UPDATE和DELETE是读写操作(先查询出要操作的行)。UPDATE和DELETE执行前需要先查询数据,由于并发事务彼此不可见,所以UPDATE和DELETE操作是读取事务发生前提交的数据的快照。写入操作,是行级锁,当事务T1和事务T2并发更新同一行时,后发生的事务T2会等待,根据设置的等待时长,若超时事务T1未提交则事务T2执行失败;当事务T1和事务T2并发更新的行不同时,事务T1和事务2都会执行成功。 + 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" new file mode 100644 index 000000000..c7722c873 --- /dev/null +++ "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" @@ -0,0 +1,929 @@ +# 几何函数和操作符 + +## 几何操作符 + +- + + + 描述:平移。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(1,1))' + point '(2.0,0)' AS RESULT; + result + ------------- + (3,1),(2,0) + (1 row) + ``` + +- - + + 描述:平移。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(1,1))' - point '(2.0,0)' AS RESULT; + result + --------------- + (-1,1),(-2,0) + (1 row) + ``` + +- \* + + 描述:伸展/旋转。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(1,1))' * point '(2.0,0)' AS RESULT; + result + ------------- + (2,2),(0,0) + (1 row) + ``` + +- / + + 描述:收缩/旋转。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(2,2))' / point '(2.0,0)' AS RESULT; + result + ------------- + (1,1),(0,0) + (1 row) + ``` + +- \# + + 描述:两个图形交面。 + + 示例: + + ``` + postgres=# SELECT box '((1,-1),(-1,1))' # box '((1,1),(-2,-2))' AS RESULT; + result + --------------- + (1,1),(-1,-1) + (1 row) + ``` + +- \# + + 描述:图形的路径数目或多边形顶点数。 + + 示例: + + ``` + postgres=# SELECT # path'((1,0),(0,1),(-1,0))' AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- @-@ + + 描述:图形的长度或者周长。 + + 示例: + + ``` + postgres=# SELECT @-@ path '((0,0),(1,0))' AS RESULT; + result + -------- + 2 + (1 row) + ``` + +- @@ + + 描述:图形的中心。 + + 示例: + + ``` + postgres=# SELECT @@ circle '((0,0),10)' AS RESULT; + result + -------- + (0,0) + (1 row) + ``` + +- <-\> + + 描述:两个图形之间的距离。 + + 示例: + + ``` + postgres=# SELECT circle '((0,0),1)' <-> circle '((5,0),1)' AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- && + + 描述:两个图形是否重叠(有一个共同点就为真)。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(1,1))' && box '((0,0),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- << + + 描述:图形是否全部在另一个图形的左边(没有相同的横坐标)。 + + 示例: + + ``` + postgres=# SELECT circle '((0,0),1)' << circle '((5,0),1)' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>\> + + 描述:图形是否全部在另一个图形的右边(没有相同的横坐标)。 + + 示例: + + ``` + postgres=# SELECT circle '((5,0),1)' >> circle '((0,0),1)' AS RESULT; + result + -------- + t + (1 row) + ``` + +- &< + + 描述:图形的最右边是否不超过在另一个图形的最右边。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(1,1))' &< box '((0,0),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- &\> + + 描述:图形的最左边是否不超过在另一个图形的最左边。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(3,3))' &> box '((0,0),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- <<| + + 描述:图形是否全部在另一个图形的下边(没有相同的纵坐标)。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(3,3))' <<| box '((3,4),(5,5))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- |\>\> + + 描述:图形是否全部在另一个图形的上边(没有相同的纵坐标)。 + + 示例: + + ``` + postgres=# SELECT box '((3,4),(5,5))' |>> box '((0,0),(3,3))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- &<| + + 描述:图形的最上边是否不超过另一个图形的最上边。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(1,1))' &<| box '((0,0),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- |&\> + + 描述:图形的最下边是否不超过另一个图形的最下边。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(3,3))' |&> box '((0,0),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- <^ + + 描述:图形是否低于另一个图形(允许两个图形有接触)。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(-3,-3))' <^ box '((0,0),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>^ + + 描述:图形是否高于另一个图形(允许两个图形有接触)。 + + 示例: + + ``` + postgres=# SELECT box '((0,0),(2,2))' >^ box '((0,0),(-3,-3))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- ?\# + + 描述:两个图形是否相交。 + + 示例: + + ``` + postgres=# SELECT lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- ?- + + 描述:图形是否处于水平位置。 + + 示例: + + ``` + postgres=# SELECT ?- lseg '((-1,0),(1,0))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- ?- + + 描述:图形是否水平对齐。 + + 示例: + + ``` + postgres=# SELECT point '(1,0)' ?- point '(0,0)' AS RESULT; + result + -------- + t + (1 row) + ``` + +- ?| + + 描述:图形是否处于竖直位置。 + + 示例: + + ``` + postgres=# SELECT ?| lseg '((-1,0),(1,0))' AS RESULT; + result + -------- + f + (1 row) + ``` + +- ?| + + 描述:图形是否竖直对齐。 + + 示例: + + ``` + postgres=# SELECT point '(0,1)' ?| point '(0,0)' AS RESULT; + result + -------- + t + (1 row) + ``` + +- ?-| + + 描述:两条线是否垂直。 + + 示例: + + ``` + postgres=# SELECT lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- ?|| + + 描述:两条线是否平行。 + + 示例: + + ``` + postgres=# SELECT lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))' AS RESULT; + result + -------- + t + (1 row) + ``` + +- @\> + + 描述:图形是否包含另一个图形。 + + 示例: + + ``` + postgres=# SELECT circle '((0,0),2)' @> point '(1,1)' AS RESULT; + result + -------- + t + (1 row) + ``` + +- <@ + + 描述:图形是否被包含于另一个图形。 + + 示例: + + ``` + postgres=# SELECT point '(1,1)' <@ circle '((0,0),2)' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \~= + + 描述:两个图形是否相同? + + 示例: + + ``` + postgres=# SELECT polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' AS RESULT; + result + -------- + t + (1 row) + ``` + + +## 几何函数 + +- area\(object\) + + 描述:计算图形的面积。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT area(box '((0,0),(1,1))') AS RESULT; + result + -------- + 1 + (1 row) + ``` + +- center\(object\) + + 描述:计算图形的中心。 + + 返回类型:point + + 示例: + + ``` + postgres=# SELECT center(box '((0,0),(1,2))') AS RESULT; + result + --------- + (0.5,1) + (1 row) + ``` + +- diameter\(circle\) + + 描述:计算圆的直径。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT diameter(circle '((0,0),2.0)') AS RESULT; + result + -------- + 4 + (1 row) + ``` + +- height\(box\) + + 描述:矩形的竖直高度。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT height(box '((0,0),(1,1))') AS RESULT; + result + -------- + 1 + (1 row) + ``` + +- isclosed\(path\) + + 描述:图形是否为闭合路径。 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT isclosed(path '((0,0),(1,1),(2,0))') AS RESULT; + result + -------- + t + (1 row) + ``` + +- isopen\(path\) + + 描述:图形是否为开放路径。 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT isopen(path '[(0,0),(1,1),(2,0)]') AS RESULT; + result + -------- + t + (1 row) + ``` + +- length\(object\) + + 描述:计算图形的长度。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT length(path '((-1,0),(1,0))') AS RESULT; + result + -------- + 4 + (1 row) + ``` + +- npoints\(path\) + + 描述:计算路径的顶点数。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT npoints(path '[(0,0),(1,1),(2,0)]') AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- npoints\(polygon\) + + 描述:计算多边形的顶点数。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT npoints(polygon '((1,1),(0,0))') AS RESULT; + result + -------- + 2 + (1 row) + ``` + +- pclose\(path\) + + 描述:把路径转换为闭合路径。 + + 返回类型:path + + 示例: + + ``` + postgres=# SELECT pclose(path '[(0,0),(1,1),(2,0)]') AS RESULT; + result + --------------------- + ((0,0),(1,1),(2,0)) + (1 row) + ``` + +- popen\(path\) + + 描述:把路径转换为开放路径。 + + 返回类型:path + + 示例: + + ``` + postgres=# SELECT popen(path '((0,0),(1,1),(2,0))') AS RESULT; + result + --------------------- + [(0,0),(1,1),(2,0)] + (1 row) + ``` + +- radius\(circle\) + + 描述:计算圆的半径。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT radius(circle '((0,0),2.0)') AS RESULT; + result + -------- + 2 + (1 row) + ``` + +- width\(box\) + + 描述:计算矩形的水平尺寸。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT width(box '((0,0),(1,1))') AS RESULT; + result + -------- + 1 + (1 row) + ``` + + +## 几何类型转换函数 + +- box\(circle\) + + 描述:将圆转换成矩形 + + 返回类型:box + + 示例: + + ``` + postgres=# SELECT box(circle '((0,0),2.0)') AS RESULT; + result + --------------------------------------------------------------------------- + (1.41421356237309,1.41421356237309),(-1.41421356237309,-1.41421356237309) + (1 row) + ``` + +- box\(point, point\) + + 描述:将点转换成矩形 + + 返回类型:box + + 示例: + + ``` + postgres=# SELECT box(point '(0,0)', point '(1,1)') AS RESULT; + result + ------------- + (1,1),(0,0) + (1 row) + ``` + +- box\(polygon\) + + 描述:将多边形转换成矩形 + + 返回类型:box + + 示例: + + ``` + postgres=# SELECT box(polygon '((0,0),(1,1),(2,0))') AS RESULT; + result + ------------- + (2,1),(0,0) + (1 row) + ``` + +- circle\(box\) + + 描述:矩形转换成圆 + + 返回类型:circle + + 示例: + + ``` + postgres=# SELECT circle(box '((0,0),(1,1))') AS RESULT; + result + ------------------------------- + <(0.5,0.5),0.707106781186548> + (1 row) + ``` + +- circle\(point, double precision\) + + 描述:将圆心和半径转换成圆 + + 返回类型:circle + + 示例: + + ``` + postgres=# SELECT circle(point '(0,0)', 2.0) AS RESULT; + result + ----------- + <(0,0),2> + (1 row) + ``` + +- circle\(polygon\) + + 描述:将多边形转换成圆 + + 返回类型:circle + + 示例: + + ``` + postgres=# SELECT circle(polygon '((0,0),(1,1),(2,0))') AS RESULT; + result + ------------------------------------------- + <(1,0.333333333333333),0.924950591148529> + (1 row) + ``` + +- lseg\(box\) + + 描述:矩形对角线转化成线段 + + 返回类型:lseg + + 示例: + + ``` + postgres=# SELECT lseg(box '((-1,0),(1,0))') AS RESULT; + result + ---------------- + [(1,0),(-1,0)] + (1 row) + ``` + +- lseg\(point, point\) + + 描述:点转换成线段 + + 返回类型:lseg + + 示例: + + ``` + postgres=# SELECT lseg(point '(-1,0)', point '(1,0)') AS RESULT; + result + ---------------- + [(-1,0),(1,0)] + (1 row) + ``` + +- path\(polygon\) + + 描述:多边形转换成路径 + + 返回类型:path + + 示例: + + ``` + postgres=# SELECT path(polygon '((0,0),(1,1),(2,0))') AS RESULT; + result + --------------------- + ((0,0),(1,1),(2,0)) + (1 row) + ``` + +- point\(double precision, double precision\) + + 描述:结点 + + 返回类型:point + + 示例: + + ``` + postgres=# SELECT point(23.4, -44.5) AS RESULT; + result + -------------- + (23.4,-44.5) + (1 row) + ``` + +- point\(box\) + + 描述:矩形的中心 + + 返回类型:point + + 示例: + + ``` + postgres=# SELECT point(box '((-1,0),(1,0))') AS RESULT; + result + -------- + (0,0) + (1 row) + ``` + +- point\(circle\) + + 描述:圆心 + + 返回类型:point + + 示例: + + ``` + postgres=# SELECT point(circle '((0,0),2.0)') AS RESULT; + result + -------- + (0,0) + (1 row) + ``` + +- point\(lseg\) + + 描述:线段的中心 + + 返回类型:point + + 示例: + + ``` + postgres=# SELECT point(lseg '((-1,0),(1,0))') AS RESULT; + result + -------- + (0,0) + (1 row) + ``` + +- point\(polygon\) + + 描述:多边形的中心 + + 返回类型:point + + 示例: + + ``` + postgres=# SELECT point(polygon '((0,0),(1,1),(2,0))') AS RESULT; + result + ----------------------- + (1,0.333333333333333) + (1 row) + ``` + +- polygon\(box\) + + 描述:矩形转换成4点多边形 + + 返回类型:polygon + + 示例: + + ``` + postgres=# SELECT polygon(box '((0,0),(1,1))') AS RESULT; + result + --------------------------- + ((0,0),(0,1),(1,1),(1,0)) + (1 row) + ``` + +- polygon\(circle\) + + 描述:圆转换成12点多边形 + + 返回类型:polygon + + 示例: + + ``` + postgres=# SELECT polygon(circle '((0,0),2.0)') AS RESULT; + result + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22464679914735e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.44929359829471e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67394039744206e-16,-2),(-0.999999999999999,-1.73205080756888),(-1.73205080756888,-1)) + (1 row) + ``` + +- polygon\(npts, circle\) + + 描述:圆转换成npts点多边形 + + 返回类型:polygon + + 示例: + + ``` + postgres=# SELECT polygon(12, circle '((0,0),2.0)') AS RESULT; + result + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22464679914735e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.44929359829471e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67394039744206e-16,-2),(-0.999999999999999,-1.73205080756888),(-1.73205080756888,-1)) + (1 row) + ``` + +- polygon\(path\) + + 描述:路径转换成多边形 + + 返回类型:polygon + + 示例: + + ``` + postgres=# SELECT polygon(path '((0,0),(1,1),(2,0))') AS RESULT; + result + --------------------- + ((0,0),(1,1),(2,0)) + (1 row) + ``` + + 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" new file mode 100644 index 000000000..ea8dbe83e --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\207\240\344\275\225\347\261\273\345\236\213.md" @@ -0,0 +1,179 @@ +# 几何类型 + +openGauss支持的几何类型请参见[表1](#zh-cn_topic_0237121953_zh-cn_topic_0059779139_td12ab9adf8514c2cbd4b5b6aace3ab7e)。最基本的类型:点,是其它类型的基础。 + +**表 1** 几何类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

存储空间

+

说明

+

表现形式

+

point

+

16字节

+

平面中的点

+

(x,y)

+

lseg

+

32字节

+

(有限)线段

+

((x1,y1),(x2,y2))

+

box

+

32字节

+

矩形

+

((x1,y1),(x2,y2))

+

path

+

16+16n字节

+

闭合路径(与多边形类似)

+

((x1,y1),...)

+

path

+

16+16n字节

+

开放路径

+

[(x1,y1),...]

+

polygon

+

40+16n字节

+

多边形(与闭合路径相似)

+

((x1,y1),...)

+

circle

+

24 字节

+

+

<(x,y),r> (圆心和半径)

+
+ +openGauss提供了一系列的函数和操作符用来进行各种几何计算,如拉伸、转换、旋转、计算相交等。详细信息请参考[几何函数和操作符](几何函数和操作符.md#ZH-CN_TOPIC_0242370438)。 + +## 点 + +点是几何类型的基本二维构造单位。用下面语法描述point的数值: + +``` +( x , y ) +x , y +``` + +x和y是用浮点数表示的点的坐标。 + +点输出使用第一种语法。 + +## 线段 + +线段(lseg)是用一对点来代表的。用下面的语法描述lseg的数值: + +``` +[ ( x1 , y1 ) , ( x2 , y2 ) ] +( ( x1 , y1 ) , ( x2 , y2 ) ) +( x1 , y1 ) , ( x2 , y2 ) +x1 , y1 , x2 , y2 +``` + +\(x1,y1\)和\(x2,y2\)表示线段的端点。 + +线段输出使用第一种语法。 + +## 矩形 + +矩形是用一对对角点来表示的。用下面的语法描述box的值: + +``` +( ( x1 , y1 ) , ( x2 , y2 ) ) +( x1 , y1 ) , ( x2 , y2 ) +x1 , y1 , x2 , y2 +``` + +\(x1,y1\)和\(x2,y2\)表示矩形的一对对角点。 + +矩形的输出使用第二种语法。 + +任何两个对角都可以出现在输入中,但按照那样的顺序,右上角和左下角的值会被重新排序以存储。 + +## 路径 + +路径由一系列连接的点组成。路径可能是开放的,也就是认为列表中第一个点和最后一个点没有连接,也可能是闭合的,这时认为第一个和最后一个点连接起来。 + +用下面的语法描述path的数值: + +``` +[ ( x1 , y1 ) , ... , ( xn , yn ) ] +( ( x1 , y1 ) , ... , ( xn , yn ) ) +( x1 , y1 ) , ... , ( xn , yn ) +( x1 , y1 , ... , xn , yn ) +x1 , y1 , ... , xn , yn +``` + +点表示组成路径的线段的端点。方括弧(\[\])表明一个开放的路径,圆括弧(\(\))表明一个闭合的路径。当最外层的括号被省略,如在第三至第五语法,会假定一个封闭的路径。 + +路径的输出使用第一种或第二种语法输出。 + +## 多边形 + +多边形由一系列点代表(多边形的顶点)。多边形可以认为与闭合路径一样,但是存储方式不一样而且有自己的一套支持函数。 + +用下面的语法描述polygon的数值: + +``` +( ( x1 , y1 ) , ... , ( xn , yn ) ) +( x1 , y1 ) , ... , ( xn , yn ) +( x1 , y1 , ... , xn , yn ) +x1 , y1 , ... , xn , yn +``` + +点表示多边形的端点。 + +多边形输出使用第一种语法。 + +## 圆 + +圆由一个圆心和半径标识。用下面的语法描述circle的数值: + +``` +< ( x , y ) , r > +( ( x , y ) , r ) +( x , y ) , r +x , y , r +``` + +\(x,y\)表示圆心,r表示半径。 + +圆的输出用第一种格式。 + diff --git "a/content/zh/docs/Developerguide/\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\207\275\346\225\260.md" new file mode 100644 index 000000000..62da43fb6 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\207\275\346\225\260.md" @@ -0,0 +1,91 @@ +# 函数 + +## 函数类型解析 + +1. 从系统表pg\_proc中选择所有可能被选到的函数。如果使用了一个不带模式修饰的函数名称,那么认为该函数是那些在当前搜索路径中的函数。如果给出一个带修饰的函数名,那么只考虑指定模式中的函数。 + + 如果搜索路径中找到了多个不同参数类型的函数。将从中选择一个合适的函数。 + +2. 查找和输入参数类型完全匹配的函数。如果找到一个,则用之。如果输入的实参类型都是unknown类型,则不会找到匹配的函数。 +3. 如果未找到完全匹配,请查看该函数是否为一个特殊的类型转换函数。 +4. 寻找最优匹配。 + 1. 抛弃那些输入类型不匹配并且也不能隐式转换成匹配的候选函数。unknown文本在这种情况下可以转换成任何东西。如果只剩下一个候选项,则用之,否则继续下一步。 + 2. 遍历所有候选函数,保留那些输入类型匹配最准确的。此时,域被看作和它们的基本类型相同。如果没有一个函数能准确匹配,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 + 3. 遍历所有候选函数,保留那些需要类型转换时接受首选类型位置最多的函数。如果没有接受首选类型的函数,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 + 4. 如果有任何输入参数是unknown类型,检查剩余的候选函数对应参数位置的类型范畴。在每一个能够接受字符串类型范畴的位置使用string类型(这种对字符串的偏爱是合适的,因为unknown文本确实像字符串)。另外,如果所有剩下的候选函数都接受相同的类型范畴,则选择该类型范畴,否则抛出一个错误(因为在没有更多线索的条件下无法作出正确的选择)。现在抛弃不接受选定的类型范畴的候选函数,然后,如果任意候选函数在那个范畴接受一个首选类型,则抛弃那些在该参数位置接受非首选类型的候选函数。如果没有一个候选符合这些测试则保留所有候选。如果只有一个候选函数符合,则使用它;否则,继续下一步。 + 5. 如果同时有unknown和已知类型的参数,并且所有已知类型的参数有相同的类型,假设unknown参数也是这种类型,检查哪个候选函数可以在unknown参数位置接受这种类型。如果正好一个候选符合,那么使用它。否则,产生一个错误。 + + +## 示例 + +示例1:圆整函数参数类型解析。只有一个round函数有两个参数(第一个是numeric,第二个是integer)。所以下面的查询自动把第一个类型为integer的参数转换成numeric类型。 + +``` +postgres=# SELECT round(4, 4); + round +-------- + 4.0000 +(1 row) +``` + +实际上它被分析器转换成: + +``` +postgres=# SELECT round(CAST (4 AS numeric), 4); +``` + +因为带小数点的数值常量初始时被赋予numeric类型,因此下面的查询将不需要类型转换,并且可能会略微高效一些: + +``` +postgres=# SELECT round(4.0, 4); +``` + +示例2:子字符串函数类型解析。有好几个substr函数,其中一个接受text和integer类型。如果用一个未声明类型的字符串常量调用它,系统将选择接受string类型范畴的首选类型(也就是text类型)的候选函数。 + +``` +postgres=# SELECT substr('1234', 3); + substr +-------- + 34 +(1 row) +``` + +如果该字符串声明为varchar类型,就像从表中取出来的数据一样,分析器将试着将其转换成text类型: + +``` +postgres=# SELECT substr(varchar '1234', 3); + substr +-------- + 34 +(1 row) +``` + +被分析器转换后实际上变成: + +``` +postgres=# SELECT substr(CAST (varchar '1234' AS text), 3); +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>分析器从pg\_cast表中了解到text和varchar是二进制兼容的,意思是说一个可以传递给接受另一个的函数而不需要做任何物理转换。因此,在这种情况下,实际上没有做任何类型转换。 + +而且,如果以integer为参数调用函数,分析器将试图将其转换成text类型: + +``` +postgres=# SELECT substr(1234, 3); +substr +-------- + 34 +(1 row) +``` + +被分析器转换后实际上变成: + +``` +postgres=# SELECT substr(CAST (1234 AS text), 3); + substr +-------- + 34 +(1 row) +``` + 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" new file mode 100644 index 000000000..b64c62bc1 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,61 @@ +# 函数和操作符 + +操作符可以对一个或多个操作数进行处理,位置上可能处于操作数之前、之后,或两个操作数中间。完成处理之后,返回处理结果。 + +函数是对一些业务逻辑的封装,以完成特定的功能。函数可以有参数,也可以没有参数。函数是有返回类型的,执行完成后,会返回执行结果。 + +对于系统函数,用户可以进行修改,但是修改之后系统函数的语义可能会发生改变,从而导致系统控制紊乱。正常情况下不允许用户手工修改系统函数。 + +- **[逻辑操作符](逻辑操作符.md)** + +- **[比较操作符](比较操作符.md)** + +- **[字符处理函数和操作符](字符处理函数和操作符.md)** + +- **[二进制字符串函数和操作符](二进制字符串函数和操作符.md)** + +- **[位串函数和操作符](位串函数和操作符.md)** + +- **[模式匹配操作符](模式匹配操作符.md)** + +- **[数字操作函数和操作符](数字操作函数和操作符.md)** + +- **[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)** + +- **[类型转换函数](类型转换函数.md)** + +- **[几何函数和操作符](几何函数和操作符.md)** + +- **[网络地址函数和操作符](网络地址函数和操作符.md)** + +- **[文本检索函数和操作符](文本检索函数和操作符.md)** + +- **[JSON函数](JSON函数.md)** + +- **[SEQUENCE函数](SEQUENCE函数.md)** + +- **[数组函数和操作符](数组函数和操作符.md)** + +- **[范围函数和操作符](范围函数和操作符.md)** + +- **[聚集函数](聚集函数.md)** + +- **[窗口函数](窗口函数.md)** + +- **[安全函数](安全函数.md)** + +- **[返回集合的函数](返回集合的函数.md)** + +- **[条件表达式函数](条件表达式函数.md)** + +- **[系统信息函数](系统信息函数.md)** + +- **[系统管理函数](系统管理函数.md)** + +- **[统计信息函数](统计信息函数.md)** + +- **[触发器函数](触发器函数.md)** + +- **[内部接口函数](内部接口函数.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\210\206\346\236\220\350\241\250.md" "b/content/zh/docs/Developerguide/\345\210\206\346\236\220\350\241\250.md" new file mode 100644 index 000000000..0279c27c2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\206\346\236\220\350\241\250.md" @@ -0,0 +1,40 @@ +# 分析表 + +执行计划生成器需要使用表的统计信息,以生成最有效的查询执行计划,提高查询性能。因此数据导入完成后,建议执行ANALYZE语句生成最新的表统计信息。统计结果存储在系统表PG\_STATISTIC中。 + +## 分析表 + +ANALYZE支持的表类型有行/列存表。ANALYZE同时也支持对本地表的指定列进行信息统计。下面以表的ANALYZE为例,更多关于ANALYZE的信息,请参见[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md)。 + +1. 更新表统计信息。 + + 以表product\_info为例,ANALYZE命令如下: + + ``` + postgres=# ANALYZE product_info; + ``` + + ``` + ANALYZE + ``` + + +## 表自动分析 + +openGauss提供了GUC参数[autovacuum](自动清理.md#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s995913ca9df54ae5bb488d1e810bd824)用于控制数据库自动清理功能的启动。 + +autovacuum设置为on时,系统定时启动autovacuum线程来进行表自动分析,如果表中数据量发生较大变化达到阈值时,会触发表自动分析,即autoanalyze。 + +- 对于空表而言,当表中插入数据的行数大于50时,会触发表自动进行ANALYZE。 +- 对于表中已有数据的情况,阈值设定为50+10%\*reltuples,其中reltuples是表的总行数。 + +autovacuum自动清理功能的生效还依赖于下面两个GUC参数: + +- [track\_counts](查询和索引统计收集器.md#zh-cn_topic_0237124727_zh-cn_topic_0059779313_s3f4fb0b1004041f69e1454c701952411) 参数需要设置为on,表示开启收集收据库统计数据功能。 +- [autovacuum\_max\_workers](自动清理.md#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)参数需要大于0,该参数表示能同时运行的自动清理线程的最大数量。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- autoanalyze只支持默认采样方式,不支持百分比采样方式。 +>- 多列统计信息仅支持百分比采样,因此autoanalyze不收集多列统计信息。 +>- autoanalyze支持行存表和列存表,不支持外表、临时表、unlogged表和toast表。 + diff --git "a/content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250.md" "b/content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250.md" new file mode 100644 index 000000000..013b75516 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250.md" @@ -0,0 +1,15 @@ +# 分词器 + +全文检索功能还可以做更多事情:忽略索引某个词(停用词),处理同义词和使用复杂解析,例如:不仅基于空格的解析。这些功能通过文本搜索分词器控制。openGauss支持多语言的预定义的分词器,并且可以创建分词器(gsql的\\dF命令显示了所有可用分词器)。 + +在安装期间选择一个合适的分词器,并且在postgresql.conf中相应的设置default\_text\_search\_config。如果为了openGauss使用同一个文本搜索分词器可以使用postgresql.conf中的值。如果需要在openGauss中使用不同分词器,可以使用ALTER DATABASE ... SET在任一数据库进行配置。用户也可以在每个会话中设置default\_text\_search\_config。 + +每个依赖于分词器的文本搜索函数有一个可选的配置参数,用以明确声明所使用的分词器。仅当忽略这个参数的时候,才使用default\_text\_search\_config。 + +为了更方便的建立自定义文本搜索分词器,可以通过简单的数据库对象建立分词器。 openGauss文本搜索功能提供了四种类型与分词器相关的数据库对象: + +- 文本搜索解析器将文档分解为token,并且分类每个token(例如:词和数字)。 +- 文本搜索词典将token转换成规范格式并且丢弃停用词。 +- 文本搜索模板提供潜在的词典功能:一个词典指定一个模板,并且为模板设置参数。 +- 文本搜索分词器选择一个解析器,并且使用一系列词典规范化语法分析器产生的token。 + diff --git "a/content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250\346\265\213\350\257\225.md" "b/content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250\346\265\213\350\257\225.md" new file mode 100644 index 000000000..40476895c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\206\350\257\215\345\231\250\346\265\213\350\257\225.md" @@ -0,0 +1,59 @@ +# 分词器测试 + +函数ts\_debug允许简单测试文本搜索分词器。 + +``` +ts_debug([ config regconfig, ] document text, + OUT alias text, + OUT description text, + OUT token text, + OUT dictionaries regdictionary[], + OUT dictionary regdictionary, + OUT lexemes text[]) + returns setof record +``` + +ts\_debug显示document的每个token信息,token是由解析器生成,由指定的词典进行处理。如果忽略对应参数,则使用config指定的分词器或者default\_text\_search\_config指定的分词器。 + +ts\_debug为文本解析器标识的每个token返回一行记录。记录中的列分别是: + +- alias:text类型,token的别名。 +- description:text类型,token的描述。 +- token:text类型,token的文本内容。 +- dictionaries:regdictionary数组类型,是分词器为token选定的词典。 +- dictionary:regdictionary类型,用来识别token的词典。如果为空,则不做识别。 +- lexemes:text数组类型,词典识别token时生成的词素。如果为空,则不生成词素。空数组(\{\})意味着token将被识别成停用词。 + +一个简单的例子: + +``` +postgres=# SELECT * FROM ts_debug('english','a fat cat sat on a mat - it ate a fat rats'); + alias | description | token | dictionaries | dictionary | lexemes +-----------+-----------------+-------+----------------+--------------+--------- + asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | cat | {english_stem} | english_stem | {cat} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | sat | {english_stem} | english_stem | {sat} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | on | {english_stem} | english_stem | {} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | mat | {english_stem} | english_stem | {mat} + blank | Space symbols | | {} | | + blank | Space symbols | - | {} | | + asciiword | Word, all ASCII | it | {english_stem} | english_stem | {} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | ate | {english_stem} | english_stem | {ate} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat} + blank | Space symbols | | {} | | + asciiword | Word, all ASCII | rats | {english_stem} | english_stem | {rat} +(24 rows) +``` + diff --git "a/content/zh/docs/Developerguide/\345\210\227\345\255\230\350\241\250\346\224\257\346\214\201\347\232\204\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\345\210\227\345\255\230\350\241\250\346\224\257\346\214\201\347\232\204\346\225\260\346\215\256\347\261\273\345\236\213.md" new file mode 100644 index 000000000..4a10d41a8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\227\345\255\230\350\241\250\346\224\257\346\214\201\347\232\204\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -0,0 +1,214 @@ +# 列存表支持的数据类型 + +列存表支持的数据类型如[表1](#zh-cn_topic_0237121962_table1899319136548)所示。 + +**表 1** 列存表支持的数据类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类别

+

数据类型

+

长度

+

是否支持

+

Numeric Types

+

smallint

+

2

+

支持

+

integer

+

4

+

支持

+

bigint

+

8

+

支持

+

decimal

+

-1

+

支持

+

numeric

+

-1

+

支持

+

real

+

4

+

支持

+

double precision

+

8

+

支持

+

smallserial

+

2

+

支持

+

serial

+

4

+

支持

+

bigserial

+

8

+

支持

+

Monetary Types

+

money

+

8

+

支持

+

Character Types

+

character varying(n), varchar(n)

+

-1

+

支持

+

character(n), char(n)

+

n

+

支持

+

character、char

+

1

+

支持

+

text

+

-1

+

支持

+

nvarchar2

+

-1

+

支持

+

name

+

64

+

不支持

+

Date/Time Types

+

timestamp with time zone

+

8

+

支持

+

timestamp without time zone

+

8

+

支持

+

date

+

4

+

支持

+

time without time zone

+

8

+

支持

+

time with time zone

+

12

+

支持

+

interval

+

16

+

支持

+

big object

+

clob

+

-1

+

支持

+

blob

+

-1

+

不支持

+

other types

+

+

+

不支持

+
+ 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" new file mode 100644 index 000000000..a21c7f649 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206schema.md" @@ -0,0 +1,155 @@ +# 创建和管理schema + +## 背景信息 + +schema又称作模式。通过管理schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的schema下而不引起冲突。 管理schema包括:创建schema、使用schema、删除schema、设置schema的搜索路径以及schema的权限控制。 + +## 注意事项 + +- openGauss包含一个或多个已命名数据库。用户和用户组在openGauss范围内是共享的,但是其数据并不共享。任何与服务器连接的用户都只能访问连接请求里声明的那个数据库。 +- 一个数据库可以包含一个或多个已命名的schema,schema又包含表及其他数据库对象,包括数据类型、函数、操作符等。同一对象名可以在不同的schema中使用而不会引起冲突。例如,schema1和schema2都可以包含一个名为mytable的表。 +- 和数据库不同,schema不是严格分离的。用户根据其对schema的权限,可以访问所连接数据库的schema中的对象。进行schema权限管理首先需要对数据库的权限控制进行了解。 +- 不能创建以PG\_为前缀的schema名,该类schema为数据库系统预留的。 +- 在每次创建新用户时,系统会在当前登录的数据库中为新用户创建一个同名Schema。对于其他数据库,若需要同名Schema,则需要用户手动创建。 +- 通过未修饰的表名(名称中只含有表名,没有“schema名”)引用表时,系统会通过search\_path(搜索路径)来判断该表是哪个schema下的表。pg\_temp和pg\_catalog始终会作为搜索路径顺序中的前两位,无论二者是否出现在search\_path中,或者出现在search\_path中的任何位置。search\_path(搜索路径)是一个schema名列表,在其中找到的第一个表就是目标表,如果没有找到则报错。(某个表即使存在,如果它的schema不在search\_path中,依然会查找失败)在搜索路径中的第一个schema叫做"当前schema"。它是搜索时查询的第一个schema,同时在没有声明schema名时,新创建的数据库对象会默认存放在该schema下。 +- 每个数据库都包含一个pg\_catalog schema,它包含系统表和所有内置数据类型、函数、操作符。pg\_catalog是搜索路径中的一部分,始终在临时表所属的模式后面,并在search\_path中所有模式的前面,即具有第二搜索优先级。这样确保可以搜索到数据库内置对象。如果用户需要使用和系统内置对象重名的自定义对象时,可以在操作自定义对象时带上自己的模式。 + +## 操作步骤 + +- 创建schema + - 执行如下命令来创建一个schema。 + + ``` + postgres=# CREATE SCHEMA myschema; + ``` + + 当结果显示为如下信息,则表示成功创建一个名为myschema的schema。 + + ``` + CREATE SCHEMA + ``` + + 如果需要在模式中创建或者访问对象,其完整的对象名称由模式名称和具体的对象名称组成。中间由符号“.”隔开。例如:myschema.table。 + + - 执行如下命令在创建schema时指定owner。 + + ``` + postgres=# CREATE SCHEMA myschema AUTHORIZATION omm; + ``` + + 当结果显示为如下信息,则表示成功创建一个属于omm用户,名为myschema的schema。 + + ``` + CREATE SCHEMA + ``` + + +- 使用schema + + 在特定schema下创建对象或者访问特定schema下的对象,需要使用有schema修饰的对象名。该名称包含schema名以及对象名,他们之间用“.”号分开。 + + - 执行如下命令在myschema下创建mytable表。 + + ``` + postgres=# CREATE TABLE myschema.mytable(id int, name varchar(20)); + CREATE TABLE + ``` + + 如果在数据库中指定对象的位置,就需要使用有schema修饰的对象名称。 + + - 执行如下命令查询myschema下mytable表的所有数据。 + + ``` + postgres=# SELECT * FROM myschema.mytable; + id | name + ----+------ + (0 rows) + ``` + + +- schema的搜索路径 + + 可以设置search\_path配置参数指定寻找对象可用schema的顺序。在搜索路径列出的第一个schema会变成默认的schema。如果在创建对象时不指定schema,则会创建在默认的schema中。 + + - 执行如下命令查看搜索路径。 + + ``` + postgres=# SHOW SEARCH_PATH; + search_path + ---------------- + "$user",public + (1 row) + ``` + + - 执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。 + + ``` + postgres=# SET SEARCH_PATH TO myschema, public; + SET + ``` + + +- schema的权限控制 + + 默认情况下,用户只能访问属于自己的schema中的数据库对象。如果需要访问其他schema的对象,则该schema的所有者应该赋予他对该schema的usage权限。 + + 通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。注意默认情况下,所有角色都拥有在public模式上的USAGE权限,但是普通用户没有在public模式上的CREATE权限。普通用户能够连接到一个指定数据库并在它的public模式中创建对象是不安全的,如果普通用户可以在public模式上的CREATE权限则建议通过如下语句撤销该权限。 + + - 撤销PUBLIC在public模式下创建对象的权限,下面语句中第一个“public”是模式,第二个“PUBLIC”指的是所有角色。 + + ``` + postgres=# REVOKE CREATE ON SCHEMA public FROM PUBLIC; + REVOKE + ``` + + - 使用以下命令查看现有的schema: + + ``` + postgres=# SELECT current_schema(); + current_schema + ---------------- + myschema + (1 row) + ``` + + - 执行如下命令创建用户jack,并将myschema的usage权限赋给用户jack。 + + ``` + postgres=# CREATE USER jack IDENTIFIED BY 'Bigdata@123'; + CREATE ROLE + postgres=# GRANT USAGE ON schema myschema TO jack; + GRANT + ``` + + - 将用户jack对于myschema的usage权限收回。 + + ``` + postgres=# REVOKE USAGE ON schema myschema FROM jack; + REVOKE + ``` + + +- 删除schema + - 当schema为空时,即该schema下没有数据库对象,使用DROP SCHEMA命令进行删除。例如删除名为nullschema的空schema。 + + ``` + postgres=# DROP SCHEMA IF EXISTS nullschema; + DROP SCHEMA + ``` + + - 当schema非空时,如果要删除一个schema及其包含的所有对象,需要使用CASCADE关键字。例如删除myschema及该schema下的所有对象。 + + ``` + postgres=# DROP SCHEMA myschema CASCADE; + DROP SCHEMA + ``` + + - 执行如下命令删除用户jack。 + + ``` + postgres=# DROP USER jack; + DROP ROLE + ``` + + + 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" new file mode 100644 index 000000000..644ce8e76 --- /dev/null +++ "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" @@ -0,0 +1,199 @@ +# 创建和管理分区表 + +## 背景信息 + +openGauss数据库支持的分区表为范围分区表。 + +范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。 + +分区表和普通表相比具有以下优点: + +- 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 +- 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 +- 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 +- 均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。 + +普通表若要转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。 + +## 操作步骤 + +按照以下方式对范围分区表的进行操作。 + +- 创建表空间 + + ``` + postgres=# CREATE TABLESPACE example1 RELATIVE LOCATION 'tablespace1/tablespace_1'; + postgres=# CREATE TABLESPACE example2 RELATIVE LOCATION 'tablespace2/tablespace_2'; + postgres=# CREATE TABLESPACE example3 RELATIVE LOCATION 'tablespace3/tablespace_3'; + postgres=# CREATE TABLESPACE example4 RELATIVE LOCATION 'tablespace4/tablespace_4'; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE TABLESPACE + ``` + +- 创建分区表 + + ``` + postgres=# CREATE TABLE tpcds.customer_address + ( + ca_address_sk integer NOT NULL , + ca_address_id character(16) NOT NULL , + ca_street_number character(10) , + ca_street_name character varying(60) , + ca_street_type character(15) , + ca_suite_number character(10) , + ca_city character varying(60) , + ca_county character varying(30) , + ca_state character(2) , + ca_zip character(10) , + ca_country character varying(20) , + ca_gmt_offset numeric(5,2) , + ca_location_type character(20) + ) + TABLESPACE example1 + PARTITION BY RANGE (ca_address_sk) + ( + PARTITION P1 VALUES LESS THAN(5000), + PARTITION P2 VALUES LESS THAN(10000), + PARTITION P3 VALUES LESS THAN(15000), + PARTITION P4 VALUES LESS THAN(20000), + PARTITION P5 VALUES LESS THAN(25000), + PARTITION P6 VALUES LESS THAN(30000), + PARTITION P7 VALUES LESS THAN(40000), + PARTITION P8 VALUES LESS THAN(MAXVALUE) TABLESPACE example2 + ) + ENABLE ROW MOVEMENT; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE TABLE + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >创建列存分区表的数量建议不超过1000个。 + +- 插入数据 + + 将表tpcds.customer\_address的数据插入到表tpcds.web\_returns\_p2中。 + + 例如在数据库中创建了一个表tpcds.customer\_address的备份表tpcds.web\_returns\_p2,现在需要将表tpcds.customer\_address中的数据插入到表tpcds.web\_returns\_p2中,则可以执行如下命令。 + + ``` + postgres=# CREATE TABLE tpcds.web_returns_p2 + ( + ca_address_sk integer NOT NULL , + ca_address_id character(16) NOT NULL , + ca_street_number character(10) , + ca_street_name character varying(60) , + ca_street_type character(15) , + ca_suite_number character(10) , + ca_city character varying(60) , + ca_county character varying(30) , + ca_state character(2) , + ca_zip character(10) , + ca_country character varying(20) , + ca_gmt_offset numeric(5,2) , + ca_location_type character(20) + ) + TABLESPACE example1 + PARTITION BY RANGE (ca_address_sk) + ( + PARTITION P1 VALUES LESS THAN(5000), + PARTITION P2 VALUES LESS THAN(10000), + PARTITION P3 VALUES LESS THAN(15000), + PARTITION P4 VALUES LESS THAN(20000), + PARTITION P5 VALUES LESS THAN(25000), + PARTITION P6 VALUES LESS THAN(30000), + PARTITION P7 VALUES LESS THAN(40000), + PARTITION P8 VALUES LESS THAN(MAXVALUE) TABLESPACE example2 + ) + ENABLE ROW MOVEMENT; + CREATE TABLE + postgres=# INSERT INTO tpcds.web_returns_p2 SELECT * FROM tpcds.customer_address; + INSERT 0 0 + ``` + +- 修改分区表行迁移属性 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 DISABLE ROW MOVEMENT; + ALTER TABLE + ``` + +- 删除分区 + + 删除分区P8。 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 DROP PARTITION P8; + ALTER TABLE + ``` + +- 增加分区 + + 增加分区P8,范围为 40000<= P8<=MAXVALUE。 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 ADD PARTITION P8 VALUES LESS THAN (MAXVALUE); + ALTER TABLE + ``` + +- 重命名分区 + - 重命名分区P8为P\_9。 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 RENAME PARTITION P8 TO P_9; + ALTER TABLE + ``` + + - 重命名分区P\_9为P8。 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 RENAME PARTITION FOR (40000) TO P8; + ALTER TABLE + ``` + + +- 修改分区的表空间 + - 修改分区P6的表空间为example3。 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 MOVE PARTITION P6 TABLESPACE example3; + ALTER TABLE + ``` + + - 修改分区P4的表空间为example4。 + + ``` + postgres=# ALTER TABLE tpcds.web_returns_p2 MOVE PARTITION P4 TABLESPACE example4; + ALTER TABLE + ``` + + +- 查询分区 + + 查询分区P6。 + + ``` + postgres=# SELECT * FROM tpcds.web_returns_p2 PARTITION (P6); + postgres=# SELECT * FROM tpcds.web_returns_p2 PARTITION FOR (35888); + ``` + +- 删除分区表和表空间 + + ``` + postgres=# DROP TABLE tpcds.web_returns_p2; + DROP TABLE + postgres=# DROP TABLESPACE example1; + postgres=# DROP TABLESPACE example2; + postgres=# DROP TABLESPACE example3; + postgres=# DROP TABLESPACE example4; + DROP TABLESPACE + ``` + + diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\272\217\345\210\227.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\272\217\345\210\227.md" new file mode 100644 index 000000000..6ecec0527 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\345\272\217\345\210\227.md" @@ -0,0 +1,78 @@ +# 创建和管理序列 + +## 背景信息 + +序列Sequence是用来产生唯一整数的数据库对象。序列的值是按照一定规则自增的整数。因为自增所以不重复,因此说Sequence具有唯一标识性。这也是Sequence常被用作主键的原因。 + +通过序列使某字段成为唯一标识符的方法有两种: + +- 一种是声明字段的类型为[序列整型](数值类型.md#zh-cn_topic_0237121927_zh-cn_topic_0059778296_t5262f987c61c4a8caff8c8037e912874),由数据库在后台自动创建一个对应的Sequence。 +- 另一种是使用[CREATE SEQUENCE](CREATE-SEQUENCE.md)自定义一个新的Sequence,然后将nextval\('sequence\_name'\)函数读取的序列值,指定为某一字段的默认值,这样该字段就可以作为唯一标识符。 + +## 操作步骤 + +方法一: 声明字段类型为序列整型来定义标识符字段。例如: + +``` +postgres=# CREATE TABLE T1 +( + id serial, + name text +); +``` + +当结果显示为如下信息,则表示创建成功。 + +``` +CREATE TABLE +``` + +方法二: 创建序列,并通过nextval\('sequence\_name'\)函数指定为某一字段的默认值。 + +1. 创建序列 + + ``` + postgres=# CREATE SEQUENCE seq1 cache 100; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE SEQUENCE + ``` + +2. 指定为某一字段的默认值,使该字段具有唯一标识属性。 + + ``` + postgres=# CREATE TABLE T2 + ( + id int not null default nextval('seq1'), + name text + ); + ``` + + 当结果显示为如下信息,则表示默认值指定成功。 + + ``` + CREATE TABLE + ``` + +3. 指定序列与列的归属关系。 + + 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。 + + ``` + postgres=# ALTER SEQUENCE seq1 OWNED BY T2.id; + ``` + + 当结果显示为如下信息,则表示指定成功。 + + ``` + ALTER SEQUENCE + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>除了为序列指定了cache,方法二所实现的功能基本与方法一类似。但是一旦定义cache,序列将会产生空洞\(序列值为不连贯的数值,如:1.4.5\),并且不能保序。另外为某序列指定从属列后,该列删除,对应的sequence也会被删除。 虽然数据库并不限制序列只能为一列产生默认值,但最好不要多列共用同一个序列。 +>当前版本只支持在定义表的时候指定自增列,或者指定某列的默认值为nextval\('seqname'\), 不支持在已有表中增加自增列或者增加默认值为nextval\('seqname'\)的列。 + 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" new file mode 100644 index 000000000..6d32b736d --- /dev/null +++ "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" @@ -0,0 +1,99 @@ +# 创建和管理数据库 + +## 前提条件 + +用户必须拥有数据库创建的权限或者是数据库的系统管理员权限才能创建数据库。 + +## 背景信息 + +- 初始时,openGauss包含两个模板数据库template0、template1,以及一个默认的用户数据库postgres。 +- CREATE DATABASE实际上通过拷贝模板数据库来创建新数据库。默认情况下,拷贝template1。请避免使用客户端或其他手段连接及操作两个模板数据库。 +- openGauss允许创建的数据库总数目上限为128个。 +- 数据库系统中会有多个数据库,但是客户端程序一次只能连接一个数据库。也不能在不同的数据库之间相互查询。一个openGauss中存在多个数据库时,需要通过-d参数指定相应的数据库实例进行连接。 + +## 注意事项 + +如果数据库的编码为SQL\_ASCII(可以通过“show server\_encoding”命令查看当前数据库存储编码),则在创建数据库对象时,如果对象名中含有多字节字符(例如中文),超过数据库对象名长度限制(63字节)的时候,数据库将会将最后一个字节(而不是字符)截断,可能造成出现半个字符的情况。 + +针对这种情况,请遵循以下条件: + +- 保证数据对象的名称不超过限定长度。 +- 使用例如utf-8编码集做为数据库的默认存储编码集(server\_encoding)。 +- 不要使用多字节字符做为对象名。 +- 创建的数据库总数目不得超过128个。 +- 如果出现因为误操作导致在多字节字符的中间截断而无法删除数据库对象的现象,请使用截断前的数据库对象名进行删除操作,或将该对象从各个数据库节点的相应系统表中依次删掉。 + +## 操作步骤 + +1. 创建数据库 + + 1. 使用如下命令创建一个新的表空间tpcds\_local。 + + ``` + postgres=# CREATE TABLESPACE tpcds_local RELATIVE LOCATION 'tablespace/tablespace_1' ; + CREATE TABLESPACE + ``` + + 2. 使用如下命令创建一个新的数据库db\_tpcc。 + + ``` + postgres=# CREATE DATABASE db_tpcc WITH TABLESPACE = tpcds_local; + CREATE DATABASE + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 数据库名称遵循SQL标识符的一般规则。当前角色自动成为此新数据库的所有者。 + >- 如果一个数据库系统用于承载相互独立的用户和项目,建议把它们放在不同的数据库里。 + >- 如果项目或者用户是相互关联的,并且可以相互使用对方的资源,则应该把它们放在同一个数据库里,但可以规划在不同的模式中。模式只是一个纯粹的逻辑结构,某个模式的访问权限由权限系统模块控制。 + >- 创建数据库时,若数据库名称长度超过63字节,server端会对数据库名称进行截断,保留前63个字节,因此建议数据库名称长度不要超过63个字节。 + +2. 查看数据库 + - 使用\\l元命令查看数据库系统的数据库列表。 + + ``` + postgres=# \l + ``` + + - 使用如下命令通过系统表pg\_database查询数据库列表。 + + ``` + postgres=# SELECT datname FROM pg_database; + ``` + +3. 修改数据库 + + 用户可以使用如下命令修改数据库属性(比如:owner、名称和默认的配置属性)。 + + - 使用以下命令为数据库设置默认的模式搜索路径。 + + ``` + postgres=# ALTER DATABASE db_tpcc SET search_path TO pa_catalog,public; + ALTER DATABASE + ``` + + - 使用如下命令修改数据库表空间。 + + ``` + postgres=# ALTER DATABASE db_tpcc SET TABLESPACE tpcds; + ALTER DATABASE + ``` + + - 使用如下命令为数据库重新命名。 + + ``` + postgres=# ALTER DATABASE db_tpcc RENAME TO human_tpcds; + ALTER DATABASE + ``` + +4. 删除数据库 + + 用户可以使用[DROP DATABASE](DROP-DATABASE.md)命令删除数据库。这个命令删除了数据库中的系统目录,并且删除了带有数据的磁盘上的数据库目录。用户必须是数据库的owner或者系统管理员才能删除数据库。当有人连接数据库时,删除操作会失败。删除数据库时请先连接到其他的数据库。 + + 使用如下命令删除数据库: + + ``` + postgres=# DROP DATABASE human_tpcds; + DROP DATABASE + ``` + + 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" new file mode 100644 index 000000000..99e8c86d3 --- /dev/null +++ "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" @@ -0,0 +1,239 @@ +# 创建和管理索引 + +## 背景信息 + +索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间。所以是否要为表增加索引,索引建立在哪些字段上,是创建索引前必须要考虑的问题。需要分析应用程序的业务处理、数据使用、经常被用作查询的条件或者被要求排序的字段来确定是否建立索引。 + +索引建立在数据库表中的某些列上。因此,在创建索引时,应该仔细考虑在哪些列上创建索引。 + +- 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。 +- 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。 +- 在经常使用连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度。 +- 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。 +- 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。 +- 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。 +- 为经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。 + >- 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。 + + +## 操作步骤 + +创建分区表的步骤请参考[创建和管理分区表](创建和管理分区表.md)。 + +- 创建索引 + - 创建分区表索引tpcds\_web\_returns\_p2\_index1,不指定索引分区的名称。 + + ``` + postgres=# CREATE INDEX tpcds_web_returns_p2_index1 ON tpcds.web_returns_p2 (ca_address_id) LOCAL; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE INDEX + ``` + + - 创建分区索引tpcds\_web\_returns\_p2\_index2,并指定索引分区的名称。 + + ``` + postgres=# CREATE INDEX tpcds_web_returns_p2_index2 ON tpcds.web_returns_p2 (ca_address_sk) LOCAL + ( + PARTITION web_returns_p2_P1_index, + PARTITION web_returns_p2_P2_index TABLESPACE example3, + PARTITION web_returns_p2_P3_index TABLESPACE example4, + PARTITION web_returns_p2_P4_index, + PARTITION web_returns_p2_P5_index, + PARTITION web_returns_p2_P6_index, + PARTITION web_returns_p2_P7_index, + PARTITION web_returns_p2_P8_index + ) TABLESPACE example2; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE INDEX + ``` + + +- 修改索引分区的表空间 + - 修改索引分区_web\_returns\_p2\_P2\_index_的表空间为example1。 + + ``` + postgres=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P2_index TABLESPACE example1; + ``` + + 当结果显示为如下信息,则表示修改成功。 + + ``` + ALTER INDEX + ``` + + - 修改索引分区_web\_returns\_p2\_P3\_index_的表空间为example2。 + + ``` + postgres=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P3_index TABLESPACE example2; + ``` + + 当结果显示为如下信息,则表示修改成功。 + + ``` + ALTER INDEX + ``` + + +- 重命名索引分区 + + 执行如下命令对索引分区_web\_returns\_p2\_P8\_index_重命名_web\_returns\_p2\_P8\_index\__new。 + + ``` + postgres=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 RENAME PARTITION web_returns_p2_P8_index TO web_returns_p2_P8_index_new; + ``` + + 当结果显示为如下信息,则表示重命名成功。 + + ``` + ALTER INDEX + ``` + +- 查询索引 + - 执行如下命令查询系统和用户定义的所有索引。 + + ``` + postgres=# SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i'; + ``` + + - 执行如下命令查询指定索引的信息。 + + ``` + postgres=# \di+ tpcds.tpcds_web_returns_p2_index2 + ``` + + +- 删除索引 + + ``` + postgres=# DROP INDEX tpcds.tpcds_web_returns_p2_index1; + postgres=# DROP INDEX tpcds.tpcds_web_returns_p2_index2; + ``` + + 当结果显示为如下信息,则表示删除成功。 + + ``` + DROP INDEX + ``` + + +openGauss支持4种创建索引的方式请参见[表1](#zh-cn_topic_0237120308_zh-cn_topic_0059777978_tf6189b97ccf4474e871a7a982b53c2e4)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。 +>- 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。 + +**表 1** 索引方式 + + + + + + + + + + + + + + + + + + + +

索引方式

+

描述

+

唯一索引

+

可用于约束索引属性值的唯一性,或者属性组合值的唯一性。如果一个表声明了唯一约束或者主键,则openGauss自动在组成主键或唯一约束的字段上创建唯一索引(可能是多字段索引),以实现这些约束。目前,openGauss只有B-Tree可以创建唯一索引。

+

多字段索引

+

一个索引可以定义在表中的多个属性上。目前,openGauss中的B-Tree支持多字段索引,且最多可在32个字段上创建索引。

+

部分索引

+

建立在一个表的子集上的索引,这种索引方式只包含满足条件表达式的元组。

+

表达式索引

+

索引建立在一个函数或者从表中一个或多个属性计算出来的表达式上。表达式索引只有在查询时使用与创建时相同的表达式才会起作用。

+
+ +- 创建一个普通表。 + + ``` + postgres=# CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address; + INSERT 0 0 + ``` + + +- 创建普通索引 + + 如果对于tpcds.customer\_address\_bak表,需要经常进行以下查询。 + + ``` + postgres=# SELECT ca_address_sk FROM tpcds.customer_address_bak WHERE ca_address_sk=14888; + ``` + + 通常,数据库系统需要逐行扫描整个tpcds.customer\_address\_bak表以寻找所有匹配的元组。如果表tpcds.customer\_address\_bak的规模很大,但满足WHERE条件的只有少数几个(可能是零个或一个),则这种顺序扫描的性能就比较差。如果让数据库系统在ca\_address\_sk属性上维护一个索引,用于快速定位匹配的元组,则数据库系统只需要在搜索树上查找少数的几层就可以找到匹配的元组,这将会大大提高数据查询的性能。同样,在数据库中进行更新和删除操作时,索引也可以提升这些操作的性能。 + + 使用以下命令创建索引。 + + ``` + postgres=# CREATE INDEX index_wr_returned_date_sk ON tpcds.customer_address_bak (ca_address_sk); + CREATE INDEX + ``` + +- 创建多字段索引 + + 假如用户需要经常查询表tpcds.customer\_address\_bak中ca\_address\_sk是5050,且ca\_street\_number小于1000的记录,使用以下命令进行查询。 + + ``` + postgres=# SELECT ca_address_sk,ca_address_id FROM tpcds.customer_address_bak WHERE ca_address_sk = 5050 AND ca_street_number < 1000; + ``` + + 使用以下命令在字段ca\_address\_sk和ca\_street\_number上定义一个多字段索引。 + + ``` + postgres=# CREATE INDEX more_column_index ON tpcds.customer_address_bak(ca_address_sk ,ca_street_number ); + CREATE INDEX + ``` + +- 创建部分索引 + + 如果只需要查询ca\_address\_sk为5050的记录,可以创建部分索引来提升查询效率。 + + ``` + postgres=# CREATE INDEX part_index ON tpcds.customer_address_bak(ca_address_sk) WHERE ca_address_sk = 5050; + CREATE INDEX + ``` + +- 创建表达式索引 + + 假如经常需要查询ca\_street\_number小于1000的信息,执行如下命令进行查询。 + + ``` + postgres=# SELECT * FROM tpcds.customer_address_bak WHERE trunc(ca_street_number) < 1000; + ``` + + 可以为上面的查询创建表达式索引: + + ``` + postgres=# CREATE INDEX para_index ON tpcds.customer_address_bak (trunc(ca_street_number)); + CREATE INDEX + ``` + +- 删除tpcds.customer\_address\_bak表。 + + ``` + postgres=# DROP TABLE tpcds.customer_address_bak; + DROP TABLE + ``` + + 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.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250.md" new file mode 100644 index 000000000..db3268f2c --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\241\250.md" @@ -0,0 +1,13 @@ +# 创建和管理表 + +- **[创建表](创建表.md)** + +- **[向表中插入数据](向表中插入数据.md)** + +- **[更新表中数据](更新表中数据.md)** + +- **[查看数据](查看数据.md)** + +- **[删除表中数据](删除表中数据.md)** + + 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" new file mode 100644 index 000000000..0ac6ce74a --- /dev/null +++ "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" @@ -0,0 +1,176 @@ +# 创建和管理表空间 + +## 背景信息 + +通过使用表空间,管理员可以控制一个数据库安装的磁盘布局。这样有以下优点: + +- 如果初始化数据库所在的分区或者卷空间已满,又不能逻辑上扩展更多空间,可以在不同的分区上创建和使用表空间,直到系统重新配置空间。 + +- 表空间允许管理员根据数据库对象的使用模式安排数据位置,从而提高性能。 + - 一个频繁使用的索引可以放在性能稳定且运算速度较快的磁盘上,比如一种固态设备。 + - 一个存储归档的数据,很少使用的或者对性能要求不高的表可以存储在一个运算速度较慢的磁盘上。 + + +- 管理员通过表空间可以设置占用的磁盘空间。用以在和其他数据共用分区的时候,防止表空间占用相同分区上的其他空间。 +- 表空间可以控制数据库数据占用的磁盘空间,当表空间所在磁盘的使用率达到90%时,数据库将被设置为只读模式,当磁盘使用率降到90%以下时,数据库将恢复到读写模式。 + + 建议用户使用数据库时,通过后台监控程序或者Database Manager进行磁盘空间使用率监控,以免出现数据库只读情况。 + +- 表空间对应于一个文件系统目录,假定数据库节点数据目录/pg\_location/mount1/path1是用户拥有读写权限的空目录。 + + MAXSIZE使用该表空间配额管理性能会有30%左右的影响,MAXSIZE指定每个数据库节点的配额大小,误差范围在500M 个数以内。请根据实际的情况确认是否需要设置表空间的最大值。 + + +## 操作步骤 + +- 创建表空间 + 1. 执行如下命令创建用户jack。 + + ``` + postgres=# CREATE USER jack IDENTIFIED BY 'Bigdata@123'; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE ROLE + ``` + + 2. 执行如下命令创建表空间。 + + ``` + postgres=# CREATE TABLESPACE fastspace RELATIVE LOCATION 'tablespace/tablespace_1'; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + CREATE TABLESPACE + ``` + + 其中“fastspace”为新创建的表空间,“数据库节点数据目录_/pg\_location/tablespace/tablespace\_1_”是用户拥有读写权限的空目录。 + + 3. 数据库系统管理员执行如下命令将“fastspace”表空间的访问权限赋予数据用户jack。 + + ``` + postgres=# GRANT CREATE ON TABLESPACE fastspace TO jack; + ``` + + 当结果显示为如下信息,则表示赋予成功。 + + ``` + GRANT + ``` + + + +- 在表空间中创建对象 + + 如果用户拥有表空间的CREATE权限,就可以在表空间上创建数据库对象,比如:表和索引等。 + + 以创建表为例。 + + - 方式1:执行如下命令在指定表空间创建表。 + + ``` + postgres=# CREATE TABLE foo(i int) TABLESPACE fastspace; + ``` + + 当结果显示为如下信息,则表示创建成功。 + + ``` + + CREATE TABLE + ``` + + - 方式2:先使用set default\_tablespace设置默认表空间,再创建表。 + + ``` + postgres=# SET default_tablespace = 'fastspace'; + SET + postgres=# CREATE TABLE foo2(i int); + CREATE TABLE + ``` + + 假设设置“fastspace”为默认表空间,然后创建表foo2。 + + +- 查询表空间 + - 方式1:检查pg\_tablespace系统表。如下命令可查到系统和用户定义的全部表空间。 + + ``` + postgres=# SELECT spcname FROM pg_tablespace; + ``` + + - 方式2:使用gsql程序的元命令查询表空间。 + + ``` + postgres=# \db + ``` + + +- 查询表空间使用率 + 1. 查询表空间的当前使用情况。 + + ``` + postgres=# SELECT PG_TABLESPACE_SIZE('example'); + ``` + + 返回如下信息: + + ``` + pg_tablespace_size + -------------------- + 2146304 + (1 row) + ``` + + 其中2146304表示表空间的大小,单位为字节。 + + 2. 计算表空间使用率。 + + 表空间使用率=PG\_TABLESPACE\_SIZE/表空间所在目录的磁盘大小。 + + +- 修改表空间 + + 执行如下命令对表空间fastspace重命名为fspace。 + + ``` + postgres=# ALTER TABLESPACE fastspace RENAME TO fspace; + ALTER TABLESPACE + ``` + +- 删除表空间 + - 执行如下命令删除用户jack。 + + ``` + postgres=# DROP USER jack CASCADE; + DROP ROLE + ``` + + - 执行如下命令删除表foo和foo2。 + + ``` + postgres=# DROP TABLE foo; + postgres=# DROP TABLE foo2; + ``` + + 当结果显示为如下信息,则表示删除成功。 + + ``` + DROP TABLE + ``` + + - 执行如下命令删除表空间fspace。 + + ``` + postgres=# DROP TABLESPACE fspace; + DROP TABLESPACE + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >用户必须是表空间的owner或者系统管理员才能删除表空间。 + + + diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\247\206\345\233\276.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\247\206\345\233\276.md" new file mode 100644 index 000000000..ad1084e5a --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\350\247\206\345\233\276.md" @@ -0,0 +1,55 @@ +# 创建和管理视图 + +## 背景信息 + +当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 + +视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。视图每次被引用的时候都会运行一次。 + +## 管理视图 + +- 创建视图 + + 执行如下命令创建新视图MyView。 + + ``` + postgres=# CREATE OR REPLACE VIEW MyView AS SELECT * FROM tpcds.web_returns WHERE trunc(wr_refunded_cash) > 10000; + CREATE VIEW + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >CREATE VIEW中的OR REPLACE可有可无,当存在OR REPLACE时,表示若以前存在该视图就进行替换。 + +- 查询视图 + + 执行如下命令查询MyView视图。 + + ``` + postgres=# SELECT * FROM MyView; + ``` + +- 查看某视图的具体信息 + + 执行如下命令查询dba\_users视图的详细信息。 + + ``` + postgres=# \d+ dba_users + View "PG_CATALOG.DBA_USERS" + Column | Type | Modifiers | Storage | Description + ----------+-----------------------+-----------+----------+------------- + USERNAME | CHARACTER VARYING(64) | | extended | + View definition: + SELECT PG_AUTHID.ROLNAME::CHARACTER VARYING(64) AS USERNAME + FROM PG_AUTHID; + ``` + +- 删除视图 + + 执行如下命令删除MyView视图。 + + ``` + postgres=# DROP VIEW MyView; + DROP VIEW + ``` + + diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\347\264\242\345\274\225.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\347\264\242\345\274\225.md" new file mode 100644 index 000000000..837ee5954 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\347\264\242\345\274\225.md" @@ -0,0 +1,59 @@ +# 创建索引 + +为了加速文本搜索,可以创建GIN索引。 + +``` +postgres=# CREATE INDEX pgweb_idx_1 ON tsearch.pgweb USING gin(to_tsvector('english', body)); +``` + +to\_tsvector\(\)函数有两个版本。只输一个参数的版本和输两个参数的版本。只输一个参数时,系统默认采用default\_text\_search\_config所指定的分词器。 + +请注意:创建索引时必须使用to\_tsvector的两参数版本。只有指定了分词器名称的全文检索函数才可以在索引表达式中使用。这是因为索引的内容必须不受default\_text\_search\_config的影响,否则索引内容可能不一致。由于default\_text\_search\_config的值可以随时调整,从而导致不同条目生成的tsvector采用了不同的分词器,并且没有办法区分究竟使用了哪个分词器。正确地转储和恢复这样的索引也是不可能的。 + +因为在上述创建索引中to\_tsvector使用了两个参数,只有当查询时也使用了两个参数,且参数值与索引中相同时,才会使用该索引。也就是说,WHERE to\_tsvector\('english', body\) @@ 'a & b' 可以使用索引,但WHERE to\_tsvector\(body\) @@ 'a & b'不能使用索引。这确保只使用这样的索引——索引各条目是使用相同的分词器创建的。 + +索引中的分词器名称由另一列指定时可以建立更复杂的表达式索引。例如: + +``` +postgres=# CREATE INDEX pgweb_idx_2 ON tsearch.pgweb USING gin(to_tsvector('ngram', body)); +``` + +其中body是pgweb表中的一列。当对索引的各条目使用了哪个分词器进行记录时,允许在同一索引中存在混合分词器。在某些场景下这将是有用的。例如,文档集合中包含不同语言的文档时。再次强调,打算使用索引的查询必须措辞匹配,例如,WHERE to\_tsvector\(config\_name, body\) @@ 'a & b'与索引中的to\_tsvector措辞匹配。 + +索引甚至可以连接列: + +``` +postgres=# CREATE INDEX pgweb_idx_3 ON tsearch.pgweb USING gin(to_tsvector('english', title || ' ' || body)); +``` + +另一个方法是创建一个单独的tsvector列控制to\_tsvector的输出。下面的例子是title和body的连接, 当其它是NULL的时候,使用coalesce确保一个字段仍然会被索引: + +``` +postgres=# ALTER TABLE tsearch.pgweb ADD COLUMN textsearchable_index_col tsvector; +postgres=# UPDATE tsearch.pgweb SET textsearchable_index_col = to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,'')); +``` + +然后为加速搜索创建一个GIN索引: + +``` +postgres=# CREATE INDEX textsearch_idx_4 ON tsearch.pgweb USING gin(textsearchable_index_col); +``` + +现在,就可以执行一个快速全文搜索了: + +``` +postgres=# SELECT title +FROM tsearch.pgweb +WHERE textsearchable_index_col @@ to_tsquery('north & america') +ORDER BY last_mod_date DESC +LIMIT 10; + + title +-------- + Canada + Mexico +(2 rows) +``` + +相比于一个表达式索引,单独列方法的一个优势是:它没有必要在查询时明确指定分词器以便能使用索引。正如上面例子所示,查询可以依赖于default\_text\_search\_config。另一个优势是搜索比较快速,因为它没有必要重新利用to\_tsvector调用来验证索引匹配。表达式索引方法更容易建立,且它需要较少的磁盘空间,因为tsvector形式没有明确存储。 + diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\350\241\250.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\350\241\250.md" new file mode 100644 index 000000000..da5364bf7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\350\241\250.md" @@ -0,0 +1,28 @@ +# 创建表 + +## 背景信息 + +表是建立在数据库中的,在不同的数据库中可以存放相同的表。甚至可以通过使用模式在同一个数据库中创建相同名称的表。创建表前请先[规划存储模型](规划存储模型.md)。 + +## 创建表 + +执行如下命令创建表。 + +``` +postgres=# CREATE TABLE customer_t1 +( + c_customer_sk integer, + c_customer_id char(5), + c_first_name char(6), + c_last_name char(8) +); +``` + +当结果显示为如下信息,则表示创建成功。 + +``` + CREATE TABLE +``` + +其中c\_customer\_sk 、c\_customer\_id、c\_first\_name和c\_last\_name是表的字段名,integer、char\(5\)、char\(6\)和char\(8\)分别是这四字段名称的类型。 + diff --git "a/content/zh/docs/Developerguide/\345\210\240\351\231\244\350\241\250\344\270\255\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\345\210\240\351\231\244\350\241\250\344\270\255\346\225\260\346\215\256.md" new file mode 100644 index 000000000..61f36cd49 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\210\240\351\231\244\350\241\250\344\270\255\346\225\260\346\215\256.md" @@ -0,0 +1,32 @@ +# 删除表中数据 + +在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。 + +SQL不能直接访问独立的行,只能通过声明被删除行匹配的条件进行。如果表中有一个主键,用户可以指定准确的行。用户可以删除匹配条件的一组行或者一次删除表中的所有行。 + +使用DELETE命令删除行,如果删除表customer\_t1中所有c\_customer\_sk为3869的记录: + +``` +postgres=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869; +``` + +如果执行如下命令之一,会删除表中所有的行。 + +``` +postgres=# DELETE FROM customer_t1; +``` + +``` +或: +postgres=# TRUNCATE TABLE customer_t1; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>全表删除的场景下,建议使用truncate,不建议使用delete。 + +删除创建的表: + +``` +postgres=# DROP TABLE customer_t1; +``` + 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" new file mode 100644 index 000000000..26aadfbf5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\214\272\345\237\237\345\222\214\346\240\274\345\274\217\345\214\226.md" @@ -0,0 +1,178 @@ +# 区域和格式化 + +介绍时间格式设置的相关参数。 + +## DateStyle + +**参数说明:**设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 + +这个变量包含两个独立的加载部分:输出格式声明(ISO、Postgres、SQL、German)和输入输出的年/月/日顺序(DMY、MDY、YMD)。这两个可以独立设置或者一起设置。关键字Euro和European等价于DMY;关键字US、NonEuro、NonEuropean等价于MDY 。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**ISO, MDY + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_initdb会将这个参数初始化成与[lc\_time](#zh-cn_topic_0237124733_zh-cn_topic_0059778109_scbb410b3c5c94682a3eec218c7ff0220)一致的值。 + +**设置建议:**优先推荐使用ISO格式。Postgres、SQL和German均采用字母缩写的形式来表示时区,例如“EST、WST、CST”等。这些缩写可同时指代不同的时区,比如CST可同时代表美国中部时间\(Central Standard Time \(USA\) UT-6:00\)、澳大利亚中部时间\(Central Standard Time \(Australia\) UT+9:30\)、中国标准时间\(China Standard Time UT+8:00\)、古巴标准时间\(Cuba Standard Time UT-4:00\)。这种情况下在时区转化时可能会得不到正确的结果,从而引发其他问题。 + +## IntervalStyle + +**参数说明:**设置区间值的显示格式。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- sql\_standard表示产生与SQL标准规定匹配的输出。 +- 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)。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>IntervalStyle参数也会影响不明确的间隔输入的说明。 + +**默认值:**postgres + +## TimeZone + +**参数说明:**设置显示和解释时间类型数值时使用的时区。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串,可查询视图[PG\_TIMEZONE\_NAMES](PG_TIMEZONE_NAMES.md)获得。 + +**默认值:**PRC + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_initdb将设置一个与其系统环境一致的时区值。 + +## timezone\_abbreviations + +**参数说明:**设置服务器接受的时区缩写值。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串,可查询视图pg\_timezone\_names获得。 + +**默认值:**Default + +>![](public_sys-resources/icon-note.gif) **说明:** +>Default表示通用时区的缩写。但也有其他诸如 'Australia' 和 'India' 等用来定义特定的安装。 + +## extra\_float\_digits + +**参数说明:**这个参数为浮点数值调整显示的数据位数,浮点类型包括float4、float8 以及几何数据类型。参数值加在标准的数据位数上(FLT\_DIG或DBL\_DIG中合适的)。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,-15~3 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 设置为3,表示包括部分关键的数据位。这个功能对转储那些需要精确恢复的浮点数据特别有用。 +>- 设置为负数,表示消除不需要的数据位。 + +**默认值:**0 + +## client\_encoding + +**参数说明:**设置客户端的字符编码类型。 + +请根据前端业务的情况确定。尽量客户端编码和服务器端编码一致,提高效率。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**兼容PostgreSQL所有的字符编码类型。其中UTF8表示使用数据库的字符编码类型。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 +>- 参数建议保持默认值,不建议通过gs\_guc工具或其他方式直接在postgresql.conf文件中设置client\_encoding参数,即使设置也不会生效,以保证openGauss内部通信编码格式一致。 + +**默认值:**UTF8 + +**推荐值:**SQL\_ASCII/UTF8 + +## lc\_messages + +**参数说明:**设置信息显示的语言。 + +- 可接受的值是与系统相关的。 +- 在一些系统上,这个区域范畴并不存在,不过仍然允许设置这个变量,只是不会有任何效果。同样,也有可能是所期望的语言的翻译信息不存在。在这种情况下,用户仍然能看到英文信息。 + + 该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## lc\_monetary + +**参数说明:**设置货币值的显示格式,影响to\_char之类的函数的输出。可接受的值是系统相关的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## lc\_numeric + +**参数说明:**设置数值的显示格式,影响to\_char之类的函数的输出。可接受的值是系统相关的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## lc\_time + +**参数说明:**设置时间和区域的显示格式,影响to\_char之类的函数的输出。可接受的值是系统相关的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 +>- 默认情况下,gs\_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 + +**默认值:**C + +## default\_text\_search\_config + +**参数说明:**设置全文检索的配置信息。 + +如果设置为不存在的文本搜索配置时将会报错。如果default\_text\_search\_config对应的文本搜索配置被删除,需要重新设置default\_text\_search\_config,否则会报设置错误。 + +- 其被文本搜索函数使用,这些函数并没有一个明确指定的配置。 +- 当与环境相匹配的配置文件确定时,gs\_initdb会选择一个与环境相对应的设置来初始化配置文件。 + + 该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>openGauss支持pg\_catalog.english,pg\_catalog.simple两种配置。 + +**默认值:**pg\_catalog.english + diff --git "a/content/zh/docs/Developerguide/\345\215\207\347\272\247\345\217\202\346\225\260.md" "b/content/zh/docs/Developerguide/\345\215\207\347\272\247\345\217\202\346\225\260.md" new file mode 100644 index 000000000..5b7dafcdd --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\215\207\347\272\247\345\217\202\346\225\260.md" @@ -0,0 +1,37 @@ +# 升级参数 + +## IsInplaceUpgrade + +**参数说明:**标示是否在升级的过程中。该参数属于升级内部参数,用户无法修改。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在升级过程中。 +- off表示不在升级过程中。 + +**默认值:**off + +## inplace\_upgrade\_next\_system\_object\_oids + +**参数说明:**标示就地升级过程中,新增系统对象的OID。该参数属于升级内部参数,用户无法修改。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## upgrade\_mode + +**参数说明**:标示升级模式。该参数属于升级内部参数,不建议用户自己修改。 + +**取值范围:**整数,0\~INT\_MAX + +- 0表示不在升级过程中。 +- 1表示在就地升级过程中。 +- 2表示在灰度升级过程中。 + +**默认值**:0 + 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" new file mode 100644 index 000000000..d82e9e120 --- /dev/null +++ "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" @@ -0,0 +1,127 @@ +# 历史版本兼容性 + +openGauss介绍数据库的向下兼容性和对外兼容性特性的参数控制。数据库系统的向后兼容性能够为对旧版本的数据库应用提供支持。本节介绍的参数主要控制数据库的向后兼容性。 + +## array\_nulls + +**参数说明:**控制数组输入解析器是否将未用引用的NULL识别为数组的一个NULL元素。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许向数组中输入空元素。 +- off表示向下兼容旧式模式。仍然能够创建包含NULL值的数组。 + +**默认值:**on + +## backslash\_quote + +**参数说明:**控制字符串文本中的单引号是否能够用\\'表示。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>在字符串文本符合SQL标准的情况下,\\没有任何其他含义。这个参数影响的是如何处理不符合标准的字符串文本,包括明确的字符串转义语法是(E'...')。 + +**取值范围:**枚举类型 + +- on表示一直允许使用\\'表示。 +- off表示拒绝使用\\'表示。 +- safe\_encoding表示仅在客户端字符集编码不会在多字节字符末尾包含\\的ASCII值时允许。 + +**默认值:**safe\_encoding + +## escape\_string\_warning + +**参数说明:**警告在普通字符串中直接使用反斜杠转义。 + +- 如果需要使用反斜杠作为转义,可以调整为使用转义字符串语法\(E'...'\)来做转义,因为在每个SQL标准中,普通字符串的默认行为现在将反斜杠作为一个普通字符。 +- 这个变量可以帮助定位需要改变的代码。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +**默认值:**on + +## lo\_compat\_privileges + +**参数说明:**控制是否启动对大对象权限检查的向后兼容模式。 + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +on表示当读取或修改大对象时禁用权限检查,与PostgreSQL 9.0以前的版本兼容。 + +**默认值:**off + +## quote\_all\_identifiers + +**参数说明:**当数据库生成SQL时,此选项强制引用所有的标识符(包括非关键字)。这将影响到EXPLAIN的输出及函数的结果,例如pg\_get\_viewdef。详细说明请参见gs\_dump的--quote-all-identifiers选项。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开强制引用。 +- off表示关闭强制引用。 + +**默认值:**off + +## sql\_inheritance + +**参数说明:**控制继承语义。用来控制继承表的访问策略,off表示各种命令不能访问子表,即默认使用ONLY关键字。这是为了兼容7.1之前版本而设置的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示可以访问子表。 +- off表示不访问子表。 + +**默认值:**on + +## standard\_conforming\_strings + +**参数说明:**控制普通字符串文本('...')中是否按照SQL标准把反斜扛当普通文本。 + +- 应用程序通过检查这个参数可以判断字符串文本的处理方式。 +- 建议明确使用转义字符串语法(E'...')来转义字符。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开控制功能。 +- off表示关闭控制功能。 + +**默认值:**on + +## synchronize\_seqscans + +**参数说明:**控制启动同步的顺序扫描。在大约相同的时间内并行扫描读取相同的数据块,共享I/O负载。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示扫描可能从表的中间开始,然后选择"环绕"方式来覆盖所有的行,为了与已经在进行中的扫描活动同步。这可能会造成没有用ORDER BY子句的查询得到行排序造成不可预测的后果。 +- off表示确保顺序扫描是从表头开始的。 + +**默认值:**on + +## enable\_beta\_features + +**参数说明:**控制开启某些非正式发布的特性,仅用于POC验证。这些特性属于延伸特性,建议客户谨慎开启,在某些功能场景下可能存在问题。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启这些功能受限的特性,保持前向兼容。但某些场景可能存在功能上的问题。 +- off表示禁止使用这些特性。 + +**默认值:**off + diff --git "a/content/zh/docs/Developerguide/\345\217\214\346\234\272\345\244\215\345\210\266.md" "b/content/zh/docs/Developerguide/\345\217\214\346\234\272\345\244\215\345\210\266.md" new file mode 100644 index 000000000..86d130237 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\217\214\346\234\272\345\244\215\345\210\266.md" @@ -0,0 +1,9 @@ +# 双机复制 + +- **[发送端服务器](发送端服务器.md)** + +- **[主服务器](主服务器.md)** + +- **[备服务器](备服务器.md)** + + 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" new file mode 100644 index 000000000..1d77fff52 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\217\221\351\200\201\347\253\257\346\234\215\345\212\241\345\231\250.md" @@ -0,0 +1,115 @@ +# 发送端服务器 + +## max\_wal\_senders + +**参数说明:**指定事务日志发送进程的并发连接最大数量。不可大于等于[max\_connections](连接设置.md#zh-cn_topic_0237124695_zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>[wal\_level](设置.md#zh-cn_topic_0237124707_zh-cn_topic_0059778393_s2c76f5957066407a959191148f2c780f)必须设置为archive或者hot\_standby以允许备机的连接。 + +**取值范围**:整型,0~262143 + +**默认值:**100 + +## wal\_keep\_segments + +**参数说明:**Xlog日志文件段数量。设置“pg\_xlog”目录下保留事务日志文件的最小数目,备机通过获取主机的日志进行流复制。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,2 \~ INT\_MAX + +**默认值:**65 + +**设置建议:** + +- 当服务器开启日志归档或者从检查点恢复时,保留的日志文件数量可能大于wal\_keep\_segments设定的值。 +- 如果此参数设置过小,则在备机请求事务日志时,此事务日志可能已经被产生的新事务日志覆盖,导致请求失败,主备关系断开。 +- 当双机为异步传输时,以COPY方式连续导入4G以上数据需要增大wal\_keep\_segments配置。以T6000单板为例,如果导入数据量为50G,建议调整参数为1000。您可以在导入完成并且日志同步正常后,动态恢复此参数设置。 + +## wal\_sender\_timeout + +**参数说明:**设置本端等待事务日志接收端接收日志的最大等待时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果主机数据较大,重建操作需要增大此参数的值,主机数据在 500G时,此参数的参考值为 600s。 +>- 此值不能大于wal\_receiver\_timeout或数据库重建时的超时参数。 + +**取值范围:**整型, 0 \~ INT\_MAX,单位为毫秒(ms)。 + +**默认值:6**s + +## replconninfo1 + +**参数说明:**设置本端监听和鉴权的第一个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第一个节点信息。 + +**默认值:**空字符串 + +## replconninfo2 + +**参数说明:**设置本端监听和鉴权的第二个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第二个节点信息。 + +**默认值:**空字符串 + +## replconninfo3 + +**参数说明:**设置本端监听和鉴权的第三个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第三个节点信息。 + +**默认值:**空字符串 + +## replconninfo4 + +**参数说明:**设置本端监听和鉴权的第四个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第四个节点信息。 + +**默认值:**空字符串 + +## replconninfo5 + +**参数说明:**设置本端监听和鉴权的第五个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第五个节点信息。 + +**默认值:**空字符串 + +## replconninfo6 + +**参数说明:**设置本端监听和鉴权的第六个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第六个节点信息。 + +**默认值:**空字符串 + +## replconninfo7 + +**参数说明:**设置本端监听和鉴权的第七个节点信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。其中空字符串表示没有配置第七个节点信息。 + +**默认值:**空字符串 + diff --git "a/content/zh/docs/Developerguide/\345\217\226\346\266\210\346\255\243\345\234\250\345\244\204\347\220\206\347\232\204\346\237\245\350\257\242.md" "b/content/zh/docs/Developerguide/\345\217\226\346\266\210\346\255\243\345\234\250\345\244\204\347\220\206\347\232\204\346\237\245\350\257\242.md" new file mode 100644 index 000000000..d2fe37081 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\217\226\346\266\210\346\255\243\345\234\250\345\244\204\347\220\206\347\232\204\346\237\245\350\257\242.md" @@ -0,0 +1,11 @@ +# 取消正在处理的查询 + +客户端应用可以使用本节描述的函数,要求取消一个仍在被服务器处理的命令。 + +- **[PQgetCancel](PQgetCancel.md)** + +- **[PQfreeCancel](PQfreeCancel.md)** + +- **[PQcancel](PQcancel.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" "b/content/zh/docs/Developerguide/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" new file mode 100644 index 000000000..c2c861ad8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\220\216\347\253\257\345\206\231\350\277\233\347\250\213.md" @@ -0,0 +1,49 @@ +# 后端写进程 + +介绍后端写(background writer)进程的参数配置。后端写进程的功能就是把共享缓冲区中的脏数据(指共享缓冲区中新增或者修改的内容)写入到磁盘。目的是让数据库进程在进行用户查询时可以很少或者几乎不等待写动作的发生(写动作由后端写进程完成)。 + +此机制同样也减少了检查点造成的性能下降。后端写进程将持续的把脏页面刷新到磁盘上,所以在检查点到来的时候,只有几个页面需要刷新到磁盘上。但是这样还是增加了I/O的总净负荷,因为以前的检查点间隔里,一个重复弄脏的页面可能只会冲刷一次,而同一个间隔里,后端写进程可能会写好几次。在大多数情况下,连续的低负荷要比周期性的尖峰负荷好,但是在本节讨论的参数可以用于按实际需要调节其行为。 + +## bgwriter\_delay + +**参数说明**:设置后端写进程写"脏"共享缓冲区之间的时间间隔。每一次,后端写进程都会为一些脏的缓冲区发出写操作(用bgwriter\_lru\_maxpages参数控制每次写的量),然后休眠bgwriter\_delay毫秒后才再次启动。 + +在许多系统上,休眠延时的有效分辨率是10毫秒。因此,设置一个不是10的倍数的数值与把它设置为下一个10的倍数是一样的效果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,10\~10000,单位为毫秒。 + +**默认值:**10s + +**设置建议:**在数据写压力比较大的场景中可以尝试减小该值以降低checkpoint的压力。 + +## bgwriter\_lru\_maxpages + +**参数说明:**设置后端写进程每次可写入磁盘的“脏”缓存区的个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~1000 + +>![](public_sys-resources/icon-note.gif) **说明:** +>此参数设置为0表示禁用后端写功能,禁用后端写功能不会对checkpoints产生影响。 + +**默认值:**100 + +## bgwriter\_lru\_multiplier + +**参数说明:**通过与已使用缓存区数目的乘积评估下次服务器需要的缓存区数目。 + +写“脏”缓存区到磁盘的数目取决于服务器最近几次使用的缓存区数目。最近的buffers数目的平均值乘以bgwriter\_lru\_multiplier是为了评估下次服务器进程需要的buffers数目。在有足够多的干净的、可用的缓存区之前,后端写进程会一直写“脏”缓存区的(每次写的缓存区数目不会超过bgwriter\_lru\_maxpages的值)。 + +设置bgwriter\_lru\_multiplier的值为1.0表示一种“实时”策略,其作用是精准预测下次写“脏”缓冲区的数目。设置为较大的值可以应对突然的需求高峰,而较小的值则可以让服务器进程执行更多的写操作。 + +设置较小的bgwriter\_lru\_maxpages和bgwriter\_lru\_multiplier会减小后端写进程导致的额外I/O开销,但是服务器进程必须自己发出写操作,增加了对查询的响应时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**浮点型,0\~10。 + +**默认值:**2 + diff --git "a/content/zh/docs/Developerguide/\345\220\221\350\241\250\344\270\255\346\217\222\345\205\245\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\345\220\221\350\241\250\344\270\255\346\217\222\345\205\245\346\225\260\346\215\256.md" new file mode 100644 index 000000000..6aec620ad --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\220\221\350\241\250\344\270\255\346\217\222\345\205\245\346\225\260\346\215\256.md" @@ -0,0 +1,219 @@ +# 向表中插入数据 + +在创建一个表后,表中并没有数据,在使用这个表之前,需要向表中插入数据。本小节介绍如何使用[INSERT](INSERT.md)命令插入一行或多行数据,及从指定表插入数据。如果有大量数据需要批量导入表中,请参考[导入数据](导入数据.md)。 + +## 背景信息 + +服务端与客户端使用不同的字符集时,两者字符集中单个字符的长度也会不同,客户端输入的字符串会以服务端字符集的格式进行处理,所以产生的最终结果可能会与预期不一致。 + +**表 1** 客户端和服务端设置字符集的输出结果对比 + + + + + + + + + + + + + + + + + + + + +

操作过程

+

服务端和客户端编码一致

+

服务端和客户端编码不一致

+

存入和取出过程中没有对字符串进行操作

+

输出预期结果

+

输出预期结果(输入与显示的客户端编码必须一致)。

+

存入取出过程对字符串有做一定的操作(如字符串函数操作)

+

输出预期结果

+

根据对字符串具体操作可能产生非预期结果。

+

存入过程中对超长字符串有截断处理

+

输出预期结果

+

字符集中字符编码长度是否一致,如果不一致可能会产生非预期的结果。

+
+ +上述字符串函数操作和自动截断产生的效果会有叠加效果,例如:在客户端与服务端字符集不一致的场景下,如果既有字符串操作,又有字符串截断,在字符串被处理完以后的情况下继续截断,这样也会产生非预期的效果。详细的示例请参见[表2](#zh-cn_topic_0237120300_zh-cn_topic_0059779039_t8b4da148118a4913925a053cd07ca3c0)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>数据库[DBCOMPATIBILITY](CREATE-DATABASE.md#zh-cn_topic_0237122099_zh-cn_topic_0059778277_l4aa2b919b99d47caa81872841c30b8c4)设为兼容TD模式,且[td\_compatible\_truncation](平台和客户端兼容性.md#zh-cn_topic_0237124738_zh-cn_topic_0059779195_sb8212ce57eb9432a972e390f77203b7c)参数设置为on的情况下,才会对超长字符串进行截断。 + +执行如下命令建立示例中需要使用的表table1、table2。 + +``` +postgres=# CREATE TABLE table1(id int, a char(6), b varchar(6),c varchar(6)); +postgres=# CREATE TABLE table2(id int, a char(20), b varchar(20),c varchar(20)); +``` + +**表 2** 示例 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

编号

+

服务端字符集

+

客户端字符集

+

是否启用自动截断

+

示例

+

结果

+

说明

+

1

+

SQL_ASCII

+

UTF8

+

+
postgres=# INSERT INTO table1 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78'));
+
id |a|b|c
+----+------+------+------
+1 | 87| 87| 87
+

字符串在服务端翻转后,并进行截断,由于服务端和客户端的字符集不一致,字符A在客户端由多个字节表示,结果产生异常。

+

2

+

SQL_ASCII

+

UTF8

+

+
postgres=# INSERT INTO table1 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78'));
+
id |a|b|c
+----+------+------+------
+2 | 873| 873| 873
+

字符串翻转后,又进行了自动截断,所以产生了非预期的效果。

+

3

+

SQL_ASCII

+

UTF8

+

+
postgres=# INSERT INTO table1 VALUES(3,'87A123','87A123','87A123');
+
id |   a   |   b   |   c
+----+-------+-------+-------
+  3 | 87A1 | 87A1 | 87A1
+

字符串类型的字段长度是客户端字符编码长度的整数倍,所以截断后产生结果正常。

+

4

+

SQL_ASCII

+

UTF8

+

+
postgres=# INSERT INTO table2 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78'));
+postgres=# INSERT INTO table2 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78'));
+
id |a|b|c
+----+-------------------+--------+--------
+1 | 87 321| 87 321 | 87 321
+2 | 87321| 87321| 87321
+

与示例1类似,多字节字符翻转之后不再表示原来的字符。

+
+ +## 操作步骤 + +向表中插入数据前,意味着表已创建成功。创建表的步骤请参考[创建和管理表](创建和管理表.md)。 + +- 向表customer\_t1中插入一行: + + 数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。 + + ``` + postgres=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace'); + ``` + + 如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。 + + ``` + postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace'); + ``` + + 如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如: + + ``` + postgres=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace'); + + postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello'); + ``` + + 用户也可以对独立的字段或者整个行明确缺省值: + + ``` + postgres=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT); + + postgres=# INSERT INTO customer_t1 DEFAULT VALUES; + ``` + +- 如果需要在表中插入多行,请使用以下命令: + + ``` + postgres=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES + (6885, 'maps', 'Joes'), + (4321, 'tpcds', 'Lily'), + (9527, 'world', 'James'); + ``` + + 如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现。但是建议使用此命令可以提升效率。 + +- 如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer\_t1的备份表customer\_t2,现在需要将表customer\_t1中的数据插入到表customer\_t2中,则可以执行如下命令。 + + ``` + postgres=# CREATE TABLE customer_t2 + ( + c_customer_sk integer, + c_customer_id char(5), + c_first_name char(6), + c_last_name char(8) + ); + + postgres=# INSERT INTO customer_t2 SELECT * FROM customer_t1; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >从指定表插入数据到当前表时,若指定表与当前表对应的字段数据类型之间不存在隐式转换,则这两种数据类型必须相同。 + +- 删除备份表 + + ``` + postgres=# DROP TABLE customer_t2 CASCADE; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >在删除表的时候,若当前需删除的表与其他表有依赖关系,需先删除关联的表,然后再删除当前表。 + + diff --git "a/content/zh/docs/Developerguide/\345\221\212\350\255\246\346\243\200\346\265\213.md" "b/content/zh/docs/Developerguide/\345\221\212\350\255\246\346\243\200\346\265\213.md" new file mode 100644 index 000000000..193e4ee06 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\221\212\350\255\246\346\243\200\346\265\213.md" @@ -0,0 +1,47 @@ +# 告警检测 + +在openGauss运行的过程中,会对数据库中的错误场景进行检测,便于用户及早感知到openGauss的错误。 + +## enable\_alarm + +**参数说明:**允许打开告警检测线程,检测数据库中可能的错误场景。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许打开告警检测线程。 +- off表示不允许打开告警检测线程。 + +**默认值:**on + +## connection\_alarm\_rate + +**参数说明:**允许和数据库连接的最大并发连接数的比率限制。数据库连接的最大并发连接数为[max\_connections](连接设置.md#zh-cn_topic_0237124695_zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79)\* connection\_alarm\_rate。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**浮点型,0.0\~1.0 + +**默认值:**0.9 + +## alarm\_report\_interval + +**参数说明:**指定告警上报的时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,单位为秒。 + +**默认值:**10 + +## alarm\_component + +**参数说明:**在对告警做上报时,会进行告警抑制,即同一个实例的同一个告警项在alarm\_report\_interval(默认值为10s)内不做重复上报。在这种情况下设置用于处理告警内容的告警组件的位置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**/opt/huawei/snas/bin/snas\_cm\_cmd + diff --git "a/content/zh/docs/Developerguide/\345\222\250\350\257\242\351\224\201\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\222\250\350\257\242\351\224\201\345\207\275\346\225\260.md" new file mode 100644 index 000000000..9ec566784 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\222\250\350\257\242\351\224\201\345\207\275\346\225\260.md" @@ -0,0 +1,171 @@ +# 咨询锁函数 + +咨询锁函数用于管理咨询锁(Advisory Lock)。 + +- pg\_advisory\_lock\(key bigint\) + + 描述:获取会话级别的排它咨询锁。 + + 返回值类型:void + + 备注:pg\_advisory\_lock锁定应用程序定义的资源,该资源可以用一个64位或两个不重叠的32位键值标识。如果已经有另外的会话锁定了该资源,则该函数将阻塞到该资源可用为止。这个锁是排它的。多个锁定请求将会被压入栈中,因此,如果同一个资源被锁定了三次,它必须被解锁三次以将资源释放给其他会话使用。 + +- pg\_advisory\_lock\(key1 int, key2 int\) + + 描述:获取会话级别的排它咨询锁。 + + 返回值类型:void + + 备注:只允许sysadmin对键值对\(65535, 65535\)加会话级别的排它咨询锁,普通用户无权限。 + +- pg\_advisory\_lock\_shared\(key bigint\) + + 描述:获取会话级别的共享咨询锁。 + + 返回值类型:void + +- pg\_advisory\_lock\_shared\(key1 int, key2 int\) + + 描述:获取会话级别的共享咨询锁。 + + 返回值类型:void + + 备注:pg\_advisory\_lock\_shared类似于pg\_advisory\_lock,不同之处仅在于共享锁会话可以和其他请求共享锁的会话共享资源,但排它锁除外。 + +- pg\_advisory\_unlock\(key bigint\) + + 描述:释放会话级别的排它咨询锁。 + + 返回值类型:Boolean + +- pg\_advisory\_unlock\(key1 int, key2 int\) + + 描述:释放会话级别的排它咨询锁。 + + 返回值类型:Boolean + + 备注:pg\_advisory\_unlock释放先前取得的排它咨询锁。如果释放成功则返回true。如果实际上并未持有指定的锁,将返回false并在服务器中产生一条SQL警告信息。 + +- pg\_advisory\_unlock\_shared\(key bigint\) + + 描述:释放会话级别的共享咨询锁。 + + 返回值类型:Boolean + +- pg\_advisory\_unlock\_shared\(key1 int, key2 int\) + + 描述:释放会话级别的共享咨询锁。 + + 返回值类型:Boolean + + 备注:pg\_advisory\_unlock\_shared类似于pg\_advisory\_unlock,不同之处在于该函数释放的是共享咨询锁。 + +- pg\_advisory\_unlock\_all\(\) + + 描述:释放当前会话持有的所有咨询锁。 + + 返回值类型:void + + 备注:pg\_advisory\_unlock\_all将会释放当前会话持有的所有咨询锁,该函数在会话结束的时候被隐含调用,即使客户端异常地断开连接也是一样。 + +- pg\_advisory\_xact\_lock\(key bigint\) + + 描述:获取事务级别的排它咨询锁。 + + 返回值类型:void + +- pg\_advisory\_xact\_lock\(key1 int, key2 int\) + + 描述:获取事务级别的排它咨询锁。 + + 返回值类型:void + + 备注:pg\_advisory\_xact\_lock类似于pg\_advisory\_lock,不同之处在于锁是自动在当前事务结束时释放,而且不能被显式的释放。只允许sysadmin对键值对\(65535, 65535\)加事务级别的排它咨询锁,普通用户无权限。 + +- pg\_advisory\_xact\_lock\_shared\(key bigint\) + + 描述:获取事务级别的共享咨询锁。 + + 返回值类型:void + +- pg\_advisory\_xact\_lock\_shared\(key1 int, key2 int\) + + 描述:获取事务级别的共享咨询锁。 + + 返回值类型:void + + 备注:pg\_advisory\_xact\_lock\_shared类似于pg\_advisory\_lock\_shared,不同之处在于锁是在当前事务结束时自动释放,而且不能被显式的释放。 + +- pg\_try\_advisory\_lock\(key bigint\) + + 描述:尝试获取会话级排它咨询锁。 + + 返回值类型:Boolean + + 备注:pg\_try\_advisory\_lock类似于pg\_advisory\_lock,不同之处在于该函数不会阻塞以等待资源的释放。它要么立即获得锁并返回true,要么返回false表示目前不能锁定。 + +- pg\_try\_advisory\_lock\(key1 int, key2 int\) + + 描述:尝试获取会话级排它咨询锁。 + + 返回值类型:Boolean + + 备注:只允许sysadmin对键值对\(65535, 65535\)加会话级别的排它咨询锁,普通用户无权限。 + +- pg\_try\_advisory\_lock\_shared\(key bigint\) + + 描述:尝试获取会话级共享咨询锁。 + + 返回值类型:Boolean + +- pg\_try\_advisory\_lock\_shared\(key1 int, key2 int\) + + 描述:尝试获取会话级共享咨询锁。 + + 返回值类型:Boolean + + 备注:pg\_try\_advisory\_lock\_shared类似于pg\_try\_advisory\_lock,不同之处在于该函数尝试获得共享锁而不是排它锁。 + +- pg\_try\_advisory\_xact\_lock\(key bigint\) + + 描述:尝试获取事务级别的排它咨询锁。 + + 返回值类型:Boolean + +- pg\_try\_advisory\_xact\_lock\(key1 int, key2 int\) + + 描述:尝试获取事务级别的排它咨询锁。 + + 返回值类型:Boolean + + 备注:pg\_try\_advisory\_xact\_lock类似于pg\_try\_advisory\_lock,不同之处在于如果得到锁,在当前事务的结束时自动释放,而且不能被显式的释放。只允许sysadmin对键值对\(65535, 65535\)加事务级别的排它咨询锁,普通用户无权限。 + +- pg\_try\_advisory\_xact\_lock\_shared\(key bigint\) + + 描述:尝试获取事务级别的共享咨询锁。 + + 返回值类型:Boolean + +- pg\_try\_advisory\_xact\_lock\_shared\(key1 int, key2 int\) + + 描述:尝试获取事务级别的共享咨询锁。 + + 返回值类型:Boolean + + 备注:pg\_try\_advisory\_xact\_lock\_shared类似于pg\_try\_advisory\_lock\_shared,不同之处在于如果得到锁,在当前事务结束时自动释放,而且不能被显式的释放。 + +- lock\_cluster\_ddl\(\) + + 描述:尝试对openGauss内所有存活的数据库主节点获取会话级别的排他咨询锁。 + + 返回值类型:Boolean + + 备注:只允许sysadmin调用,普通用户无权限。 + +- unlock\_cluster\_ddl\(\) + + 描述:尝试对数据库主节点会话级别的排他咨询锁。 + + 返回值类型:Boolean + + 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" new file mode 100644 index 000000000..881bb34fd --- /dev/null +++ "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" @@ -0,0 +1,69 @@ +# 基于开销的清理延迟 + +这个特性的目的是允许管理员减少VACUUM和ANALYZE语句在并发活动的数据库上的I/O影响。比如,像VACUUM和ANALYZE这样的维护语句并不需要迅速完成,并且不希望他们严重干扰系统执行其他的数据库操作。基于开销的清理延迟为管理员提供了一个实现这个目的手段。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>有些清理操作会持有关键的锁,这些操作应该尽快结束并释放锁。所以openGauss的机制是,在这类操作过程中,基于开销的清理延迟不会发生作用。为了避免在这种情况下的长延时,实际的开销限制取下面两者之间的较大值: +>- vacuum\_cost\_delay\*accumulated\_balance/vacuum\_cost\_limit +>- vacuum\_cost\_delay\*4 + +## 背景信息 + +在[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md)和[VACUUM](VACUUM.md#ZH-CN_TOPIC_0242370659)语句执行过程中,系统维护一个内部的记数器,跟踪所执行的各种I/O操作的近似开销。如果积累的开销达到了vacuum\_cost\_limit声明的限制,则执行这个操作的进程将睡眠vacuum\_cost\_delay指定的时间。然后它会重置记数器然后继续执行。 + +这个特性是缺省关闭的。要想打开它,把vacuum\_cost\_delay变量设置为一个非零值。 + +## vacuum\_cost\_delay + +**参数说明:**指定开销超过vacuum\_cost\_limit的值时,进程睡眠的时间。 + +要注意在许多系统上,睡眠的有效分辨率是10毫秒。因此把vacuum\_cost\_delay设置为一个不是10的整数倍的数值与将它设置为下一个10的整数倍作用相同。 + +此参数一般设置较小,常见的设置是10或20毫秒。调整此特性资源占用率时,最好是调整其他参数,而不是此参数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer(毫秒),0\~100,正数值表示打开基于开销的清理延迟特性;0表示关闭基于开销的清理延迟特性。 + +**默认值:**0 + +## vacuum\_cost\_page\_hit + +**参数说明:**清理一个在共享缓存里找到的缓冲区的预计开销。他代表锁住缓冲池、查找共享的Hash表、扫描页面内容的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,0\~10000。 + +**默认值:**1 + +## vacuum\_cost\_page\_miss + +**参数说明:**清理一个要从磁盘上读取的缓冲区的预计开销。他代表锁住缓冲池、查找共享Hash表、从磁盘读取需要的数据块、扫描它的内容的开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,0\~10000。 + +**默认值:**10 + +## vacuum\_cost\_page\_dirty + +**参数说明:**清理修改一个原先是干净的块的预计开销。他代表把一个脏的磁盘块再次刷新到磁盘上的额外开销。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,0\~1000 + +**默认值:**20 + +## vacuum\_cost\_limit + +**参数说明:**导致清理进程休眠的开销限制。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**integer,1\~10000。 + +**默认值:**200 + diff --git "a/content/zh/docs/Developerguide/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" "b/content/zh/docs/Developerguide/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" new file mode 100644 index 000000000..20718dbcd --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\345\233\240\346\237\245\350\257\242\344\274\230\345\214\226\345\231\250.md" @@ -0,0 +1,99 @@ +# 基因查询优化器 + +介绍基因查询优化器相关的参数。基因查询优化器(GEQO)是一种启发式的查询规划算法。这个算法减少了对复杂查询规划的时间,而且生成规划的开销有时也小于正常的详尽的查询算法。 + +## geqo + +**参数说明**:控制基因查询优化的使用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>通常情况下在执行过程中不要关闭,geqo\_threshold变量提供了更精细的控制GEQO的方法。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## geqo\_threshold + +**参数说明**:如果执行语句的数量超过设计的FROM的项数,则会使用基因查询优化来执行查询。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 对于简单的查询,通常用详尽搜索方法,当涉及多个表的查询的时候,用GEQO可以更好的管理查询。 +>- 一个FULL OUTER JOIN构造仅作为一个FROM项。 + +**取值范围**:整型,2~INT\_MAX。 + +**默认值**:12 + +## geqo\_effort + +**参数说明**:控制GEQO在规划时间和规划质量之间的平衡。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>geqo\_effort实际上并没有直接做任何事情,只是用于计算其他影响GEQO的变量的默认值。如果愿意,可以手工设置其他参数。 + +**取值范围**:整型,1~10。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>比默认值大的数值增加了查询规划的时间,但是也增加了选中有效查询的几率。 + +**默认值**:5 + +## geqo\_pool\_size + +**参数说明**:控制GEQO使用池的大小,也就是基因全体中的个体数量。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>至少是2,且有用的值一般在100到1000之间。设置为0,表示使用系统自适应方式,openGauss会基于geqo\_effort和表的个数选取合适的值。 + +**默认值**:0 + +## geqo\_generations + +**参数说明**:控制GEQO使用的算法的迭代次数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0~INT\_MAX。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>必须至少是1,且有用的值介于100和1000之间。如果设置为0,则基于geqo\_pool\_size选取合适的值。 + +**默认值**:0 + +## geqo\_selection\_bias + +**参数说明**:控制GEQO的选择性偏好,即就是一个种群中的选择性压力。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,1.5~2.0。 + +**默认值**:2 + +## geqo\_seed + +**参数说明**:控制GEQO使用的随机数生产器的初始化值,用来从顺序连接在一起的查询空间中查找随机路径。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:浮点型,0.0~1.0。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>不同的值会改变搜索的连接路径,从而影响了所找路径的优劣。 + +**默认值**:0 + 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" new file mode 100644 index 000000000..901b3cbf2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\237\272\346\234\254\346\226\207\346\234\254\345\214\271\351\205\215.md" @@ -0,0 +1,53 @@ +# 基本文本匹配 + +openGauss的全文检索基于匹配算子@@,当一个tsvector\(document\)匹配到一个tsquery\(query\)时,则返回true。其中,tsvector\(document\)和tsquery\(query\)两种数据类型可以任意排序。 + +``` +postgres=# SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery AS RESULT; + result +---------- + t +(1 row) +``` + +``` +postgres=# SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector AS RESULT; + result +---------- + f +(1 row) +``` + +正如上面例子表明,tsquery不仅是文本,且比tsvector包含的要多。tsquery包含已经标注化为词条的搜索词,同时可能是使用AND、OR、或NOT操作符连接的多个术语。详细请参见[文本搜索类型](文本搜索类型.md#ZH-CN_TOPIC_0242370420)。函数to\_tsquery和plainto\_tsquery对于将用户书写文本转换成适合的tsquery是非常有用的,比如将文本中的词标准化。类似地,to\_tsvector用于解析和标准化文档字符串。因此,实际中文本搜索匹配看起来更像这样: + +``` +postgres=# SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat') AS RESULT; +result +---------- + t +(1 row) +``` + +需要注意的是,下面这种方式是不可行的: + +``` +postgres=# SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat')AS RESULT; +result +---------- + f +(1 row) +``` + +由于tsvector没有对rats进行标准化,所以rats不匹配rat。 + +@@操作符也支持text输入,允许一个文本字符串的显示转换为tsvector或者在简单情况下忽略tsquery。可用形式是: + +``` +tsvector @@ tsquery +tsquery @@ tsvector +text @@ tsquery +text @@ text +``` + +我们已经看到了前面两种,形式text @@ tsquery等价于to\_tsvector\(text\) @@ tsquery,而text @@ text等价于to\_tsvector\(text\) @@ plainto\_tsquery\(text\)。 + diff --git "a/content/zh/docs/Developerguide/\345\244\204\347\220\206tsvector.md" "b/content/zh/docs/Developerguide/\345\244\204\347\220\206tsvector.md" new file mode 100644 index 000000000..d72783599 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\244\204\347\220\206tsvector.md" @@ -0,0 +1,26 @@ +# 处理tsvector + +openGauss提供了用来操作tsvector类型的函数和操作符。 + +- tsvector || tsvector + + tsvector连接操作符返回一个新的tsvector类型,它综合了两个tsvector中词素和位置信息,并保留词素的位置信息和权重标签。右侧的tsvector的起始位置位于左侧tsvector的最后位置,因此,新生成的tsvector几乎等同于将两个原始文档字串连接后进行to\_tsvector操作。(这个等价是不准确的,因为任何从左边tsvector中删除的停用词都不会影响结果,但是,在使用文本连接时,则会影响词素在右侧tsvector中的位置。) + + 相较于对文本进行连接后再执行to\_tsvector操作,使用tsvector类型进行连接操作的优势在于,可以对文档的不同部分使用不同配置进行解析。因为setweight函数会对给定的tsvector中的语素进行统一设置,如果想要对文档的不同部分设置不同的权重,需要在连接之前对文本进行解析和权重设置。 + +- setweight\(vector tsvector, weight "char"\) returns tsvector + + setweight返回一个输入tsvector的副本,其中每一个位置都使用给定的权重做了标记。权值可以为A、B、C或D(D是tsvector副本的默认权重,并且不在输出中呈现)。当对tsvector进行连接操作时,这些权重标签将会被保留,文档不同部分以不同的权重进行排序。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >权重标签作用于位置,而不是词素。如果传入的tsvector已经被剥离了位置信息,那么setweight函数将什么都不做。 + +- length\(vector tsvector\) returns integer + + 返回vector中的词素的数量。 + +- strip\(vector tsvector\) returns tsvector + + 返回一个tsvector类型,其中包含输入的tsvector的同义词,但不包含任何位置和权重信息。虽然在相关性排序中,这里返回的tsvector要比未拆分的tsvector的作用小很多,但它通常都比未拆分的tsvector小的多。 + + diff --git "a/content/zh/docs/Developerguide/\345\244\204\347\220\206\346\237\245\350\257\242.md" "b/content/zh/docs/Developerguide/\345\244\204\347\220\206\346\237\245\350\257\242.md" new file mode 100644 index 000000000..5cf0e8334 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\244\204\347\220\206\346\237\245\350\257\242.md" @@ -0,0 +1,51 @@ +# 处理查询 + +openGauss提供了函数和操作符用来操作tsquery类型的查询。 + +- tsquery && tsquery + + 返回两个给定查询tsquery的与结果。 + + +- tsquery || tsquery + + 返回两个给定查询tsquery的或结果。 + + +- !! tsquery + + 返回给定查询tsquery的非结果。 + + +- numnode\(query tsquery\) returns integer + + 返回tsquery中的节点数目(词素加操作符),这个函数在检查查询是否有效(返回值大于0),或者只包含停用词(返回值等于0)时,是有用的。例如: + + ``` + postgres=# SELECT numnode(plainto_tsquery('the any')); + NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored + CONTEXT: referenced column: numnode + numnode + --------- + 0 + + postgres=# SELECT numnode('foo & bar'::tsquery); + numnode + --------- + 3 + ``` + + +- querytree\(query tsquery\) returns text + + 返回可用于索引搜索的tsquery部分,该函数对于检测非索引查询是有用的(例如只包含停用词或否定项)。例如: + + ``` + postgres=# SELECT querytree(to_tsquery('!defined')); + querytree + ----------- + T + (1 row) + ``` + + 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" new file mode 100644 index 000000000..726ad692f --- /dev/null +++ "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" @@ -0,0 +1,217 @@ +# 备份恢复控制函数 + +## 备份控制函数 + +备份控制函数可帮助进行在线备份。 + +- pg\_create\_restore\_point\(name text\) + + 描述:为执行恢复创建一个命名点。(需要管理员角色) + + 返回值类型:text + + 备注:pg\_create\_restore\_point创建了一个可以用作恢复目的、有命名的事务日志记录,并返回相应的事务日志位置。在恢复过程中,recovery\_target\_name可以通过这个名称定位对应的日志恢复点,并从此处开始执行恢复操作。避免使用相同的名称创建多个恢复点,因为恢复操作将在第一个匹配(恢复目标)的名称上停止。 + +- pg\_current\_xlog\_location\(\) + + 描述:获取当前事务日志的写入位置。 + + 返回值类型:text + + 备注:pg\_current\_xlog\_location使用与前面那些函数相同的格式显示当前事务日志的写入位置。如果是只读操作,不需要系统管理员权限。 + +- pg\_current\_xlog\_insert\_location\(\) + + 描述:获取当前事务日志的插入位置。 + + 返回值类型:text + + 备注:pg\_current\_xlog\_insert\_location显示当前事务日志的插入位置。插入点是事务日志在某个瞬间的“逻辑终点”,而实际的写入位置则是从服务器内部缓冲区写出时的终点。写入位置是可以从服务器外部检测到的终点,如果要归档部分完成事务日志文件,则该操作即可实现。插入点主要用于服务器调试目的。如果是只读操作,不需要系统管理员权限。 + +- pg\_start\_backup\(label text \[, fast boolean \]\) + + 描述:开始执行在线备份。(需要管理员角色或复制的角色) + + 返回值类型:text + + 备注:pg\_start\_backup接受一个用户定义的备份标签(通常这是备份转储文件存放地点的名称)。这个函数向openGauss的数据目录写入一个备份标签文件,然后以文本方式返回备份的事务日志起始位置。 + + ``` + postgres=# SELECT pg_start_backup('label_goes_here'); + pg_start_backup + ----------------- + 0/3000020 + (1 row) + ``` + +- pg\_stop\_backup\(\) + + 描述:完成执行在线备份。(需要管理员角色或复制的角色) + + 返回值类型:text + + 备注:pg\_stop\_backup删除pg\_start\_backup创建的标签文件,并且在事务日志归档区里创建一个备份历史文件。这个历史文件包含给予pg\_start\_backup的标签、备份的事务日志起始与终止位置、备份的起始和终止时间。返回值是备份的事务日志终止位置。计算出中止位置后,当前事务日志的插入点将自动前进到下一个事务日志文件,这样,结束的事务日志文件可以被立即归档从而完成备份。 + +- pg\_switch\_xlog\(\) + + 描述:切换到一个新的事务日志文件。(需要管理员角色) + + 返回值类型:text + + 备注:pg\_switch\_xlog移动到下一个事务日志文件,以允许将当前日志文件归档(假定使用连续归档)。返回值是刚完成的事务日志文件的事务日志结束位置+1。如果从最后一次事务日志切换以来没有活动的事务日志,则pg\_switch\_xlog什么事也不做,直接返回当前事务日志文件的开始位置。 + +- pg\_xlogfile\_name\(location text\) + + 描述:将事务日志的位置字符串转换为文件名。 + + 返回值类型:text + + 备注:pg\_xlogfile\_name仅抽取事务日志文件名称。如果给定的事务日志位置恰好位于事务日志文件的交界上,这两个函数都返回前一个事务日志文件的名称。这对于管理事务日志归档来说是非常有利的,因为前一个文件是当前最后一个需要归档的文件。 + +- pg\_xlogfile\_name\_offset\(location text\) + + 描述:将事务日志的位置字符串转换为文件名并返回在文件中的字节偏移量。 + + 返回值类型:text,integer + + 备注:可以使用pg\_xlogfile\_name\_offset从前述函数的返回结果中抽取相应的事务日志文件名称和字节偏移量。例如: + + ``` + postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup()); + NOTICE: pg_stop_backup cleanup done, waiting for required WAL segments to be archived + NOTICE: pg_stop_backup complete, all required WAL segments have been archived + file_name | file_offset + --------------------------+------------- + 000000010000000000000003 | 272 + (1 row) + ``` + +- pg\_xlog\_location\_diff\(location text, location text\) + + 描述:计算两个事务日志位置之间在字节上的区别。 + + 返回值类型:numeric + +- pg\_cbm\_tracked\_location\(\) + + 描述:用于查询cbm解析到的lsn位置。 + + 返回值类型:text + +- pg\_cbm\_get\_merged\_file\(startLSNArg text, endLSNArg text\) + + 描述:用于将指定lsn范围之内的cbm文件合并成一个cbm文件,并返回合并完的cbm文件名。 + + 返回值类型:text + +- pg\_cbm\_get\_changed\_block\(startLSNArg text, endLSNArg text\) + + 描述:用于将指定lsn范围之内的cbm文件合并成一个表,并返回表的各行记录。 + + 返回值类型:records + + 备注:pg\_cbm\_get\_changed\_block返回的表字段包含:合并起始的lsn,合并截止的lsn, 表空间oid,库oid,表的relfilenode,表的fork number,表是否被删除,表是否被创建,表是否被截断,表被截断后的页面数,有多少页被修改以及被修改的页号的列表。 + +- pg\_cbm\_recycle\_file\(targetLSNArg text\) + + 描述:删除不再使用的cbm文件,并返回删除后的第一条lsn。 + + 返回值类型:text + +- pg\_cbm\_force\_track\(targetLSNArg text,timeOut int\) + + 描述:强制执行一次cbm追踪到指定的xlog位置,并返回实际追踪结束点的xlog位置。 + + 返回值类型:text + +- pg\_enable\_delay\_ddl\_recycle\(is\_full\_backup boolean, backup\_key text\) + + 描述:开启延迟DDL功能,并返回开启点的xlog位置。 + + 返回值类型:text + +- pg\_disable\_delay\_ddl\_recycle\(barrierLSNArg text, isForce bool, is\_full\_backup boolean, backup\_key text\) + + 描述:关闭延迟DDL功能,并返回本次延迟DDL生效的xlog范围。 + + 返回值类型:records + +- pg\_enable\_delay\_xlog\_recycle\(\) + + 描述:开启延迟xlog回收功能,cn修复使用。 + + 返回值类型: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备份使用。 + + 返回值类型:void + + +## 恢复控制函数 + +恢复信息函数提供了当前备机状态的信息。这些函数可能在恢复期间或正常运行中执行。 + +- pg\_is\_in\_recovery\(\) + + 描述:如果恢复仍然在进行中则返回true。 + + 返回值类型:bool + +- pg\_last\_xlog\_receive\_location\(\) + + 描述:获取最后接收事务日志的位置并通过流复制将其同步到磁盘。当流复制正在进行时,事务日志将持续递增。如果恢复已完成,则最后一次获取的WAL记录会被静态保持并在恢复过程中同步到磁盘。如果流复制不可用,或还没有开始,这个函数返回NULL。 + + 返回值类型:text + +- pg\_last\_xlog\_replay\_location\(\) + + 描述:获取最后一个事务日志在恢复时重放的位置。如果恢复仍在进行,事务日志将持续递增。如果已经完成恢复,则将保持在恢复期间最后接收WAL记录的值。如果未进行恢复但服务器正常启动时,则这个函数返回NULL。 + + 返回值类型:text + +- pg\_last\_xact\_replay\_timestamp\(\) + + 描述:获取最后一个事务在恢复时重放的时间戳。这是为在主节点上生成事务提交或终止WAL记录的时间。如果在恢复时没有事务重放,则这个函数返回NULL。如果恢复仍在进行,则事务日志将持续递增。如果恢复已经完成,则将保持在恢复期间最后接收WAL记录的值。如果服务器无需恢复就已正常启动,则这个函数返回NULL。 + + 返回值类型:timestamp with time zone + + +恢复控制函数控制恢复的进程。这些函数可能只在恢复时被执行。 + +- pg\_is\_xlog\_replay\_paused\(\) + + 描述:如果恢复暂停则返回true。 + + 返回值类型:bool + +- pg\_xlog\_replay\_pause\(\) + + 描述:立即暂停恢复。 + + 返回值类型:void + +- pg\_xlog\_replay\_resume\(\) + + 描述:如果恢复处于暂停状态,则重新启动。 + + 返回值类型:void + + +当恢复暂停时,没有发生数据库更改。如果是在热备里,所有新的查询将看到一致的数据库快照,并且不会有进一步的查询冲突产生,直到恢复继续。 + +如果不能使用流复制,则暂停状态将无限的延续。当流复制正在进行时,将连续接收WAL记录,最终将填满可用磁盘空间,这个进度取决于暂停的持续时间,WAL生成的速度和可用的磁盘空间。 + 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" new file mode 100644 index 000000000..8080b72ae --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\244\207\346\234\215\345\212\241\345\231\250.md" @@ -0,0 +1,118 @@ +# 备服务器 + +## hot\_standby + +**参数说明:**设置是否允许备机在恢复过程中连接和查询。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果此参数设置为on,[wal\_level](设置.md#zh-cn_topic_0237124707_zh-cn_topic_0059778393_s2c76f5957066407a959191148f2c780f)必须设置为hot\_standby,否则将导致数据库无法启动。 +>- 在双机环境中,因为会对双机其他一些功能产生影响,hot\_standby参数不能设置成off。 + +**取值范围:**布尔型 + +- on表示允许备机在恢复过程中连接和查询。 +- off表示不允许备机在恢复过程中连接和查询。 + +**默认值:**on + +## max\_standby\_archive\_delay + +**参数说明:**当开启双机热备模式时,如果备机正处理归档WAL日志数据,这时进行查询就会产生冲突,此参数就是设置备机取消查询之前所等待的时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>-1表示允许备机一直等待冲突的查询完成。 + +**取值范围:**整型,范围:-1\~INT\_MAX,单位为毫秒。 + +**默认值:**3s**(即**3000ms) + +## max\_standby\_streaming\_delay + +**参数说明:**当开启双机热备模式时,如果备机正通过流复制接收WAL日志数据,这时进行查询就会产生冲突,这个参数就是设置备机取消查询之前所等待的时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>-1表示允许备机一直等待冲突的查询完成。 + +**取值范围:**整型(毫秒),范围:-1\~INT\_MAX + +**默认值:3s(即**3000ms) + +## wal\_receiver\_status\_interval + +**参数说明:**设置WAL日志接收进程的状态通知给主机的最大时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX / 1000,单位为毫秒。 + +**默认值:**5s + +## hot\_standby\_feedback + +**参数说明:**设置是否允许将备机上执行查询的结果反馈给主机,这可以避免查询冲突。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许将备机上执行查询的结果反馈给主机。 +- off表示不允许将备机上执行查询的结果反馈给主机。 + +**默认值:**off + +## wal\_receiver\_timeout + +**参数说明:**设置从主机接收数据的最大等待时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型, 0 \~ INT\_MAX,单位为毫秒。 + +**默认值:**6s(即6000ms) + +## wal\_receiver\_connect\_timeout + +**参数说明:**设置连接主机的最大等待超时时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型, 0 \~ INT\_MAX / 1000,单位为秒。 + +**默认值:**2s + +## wal\_receiver\_connect\_retries + +**参数说明:**设置连接主机的最大尝试次数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型, 1\~ INT\_MAX。 + +**默认值:**1 + +## wal\_receiver\_buffer\_size + +**参数说明:**备机与从备接收Xlog存放到内存缓冲区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,4096\~1047552,单位为KB。 + +**默认值:**64MB(即65536KB) + +## primary\_slotname + +**参数说明:**设置备机对应主机的slot name,用于主备校验,与wal日志删除机制。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符型 + +**默认值:**空字符串 + diff --git "a/content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\241\250\350\276\276\345\274\217.md" "b/content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 000000000..e58b99e24 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\220\346\237\245\350\257\242\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,135 @@ +# 子查询表达式 + +子查询表达式主要有以下几种: + +- EXISTS/NOT EXISTS + + EXISTS/NOT EXISTS的语法图请参见[图1](#zh-cn_topic_0237122003_zh-cn_topic_0059777701_f0d971ea580d241e5a0dca682165b4d16)。 + + **图 1** EXISTS/NOT EXISTS::= + ![](figures/EXISTS-NOT-EXISTS.png "EXISTS-NOT-EXISTS") + + EXISTS的参数是一个任意的SELECT语句,或者说子查询。系统对子查询进行运算以判断它是否返回行。如果它至少返回一行,则EXISTS结果就为"真";如果子查询没有返回任何行, EXISTS的结果是"假"。 + + 这个子查询通常只是运行到能判断它是否可以生成至少一行为止,而不是等到全部结束。 + + 示例: + + ``` + postgres=# SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE EXISTS (SELECT d_dom FROM tpcds.date_dim WHERE d_dom = store_returns.sr_reason_sk and sr_customer_sk <10); + sr_reason_sk | sr_customer_sk + --------------+---------------- + 13 | 2 + 22 | 5 + 17 | 7 + 25 | 7 + 3 | 7 + 31 | 5 + 7 | 7 + 14 | 6 + 20 | 4 + 5 | 6 + 10 | 3 + 1 | 5 + 15 | 2 + 4 | 1 + 26 | 3 + (15 rows) + ``` + +- IN/NOT IN + + IN/NOT IN的语法请参见[图2](#zh-cn_topic_0237122003_zh-cn_topic_0059777701_fd3c74d5deb5f456bab447575214b74b0)。 + + **图 2** IN/NOT IN::= + ![](figures/IN-NOT-IN.png "IN-NOT-IN") + + 右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式对子查询结果的每一行进行一次计算和比较。如果找到任何相等的子查询行,则IN结果为"真"。如果没有找到任何相等行,则结果为"假"(包括子查询没有返回任何行的情况)。 + + 表达式或子查询行里的NULL遵照SQL处理布尔值和NULL组合时的规则。如果两个行对应的字段都相等且非空,则这两行相等;如果任意对应字段不等且非空,则这两行不等;否则结果是未知(NULL)。如果每一行的结果都是不等或NULL ,并且至少有一个NULL ,则IN的结果是NULL 。 + + 示例: + + ``` + postgres=# SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE sr_customer_sk IN (SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10); + sr_reason_sk | sr_customer_sk + --------------+---------------- + 10 | 3 + 26 | 3 + 22 | 5 + 31 | 5 + 1 | 5 + 32 | 5 + 32 | 5 + 4 | 1 + 15 | 2 + 13 | 2 + 33 | 4 + 20 | 4 + 33 | 8 + 5 | 6 + 14 | 6 + 17 | 7 + 3 | 7 + 25 | 7 + 7 | 7 + (19 rows) + ``` + +- ANY/SOME + + ANY/SOME的语法图请参见[图3](#zh-cn_topic_0237122003_zh-cn_topic_0059777701_f34ef57cea9fe4936b6874f259ee5bc0f)。 + + **图 3** any/some::= + ![](figures/any-some.png "any-some") + + 右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较,其结果必须是布尔值。如果至少获得一个真值,则ANY结果为“真”。如果全部获得假值,则结果是“假”(包括子查询没有返回任何行的情况)。SOME是ANY的同义词。IN与ANY可以等效替换 。 + + 示例: + + ``` + postgres=# SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE sr_customer_sk < ANY (SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10); + sr_reason_sk | sr_customer_sk + --------------+---------------- + 26 | 3 + 17 | 7 + 32 | 5 + 32 | 5 + 13 | 2 + 31 | 5 + 25 | 7 + 5 | 6 + 7 | 7 + 10 | 3 + 1 | 5 + 14 | 6 + 4 | 1 + 3 | 7 + 22 | 5 + 33 | 4 + 20 | 4 + 33 | 8 + 15 | 2 + (19 rows) + ``` + +- ALL + + ALL的语法请参见[图4](#zh-cn_topic_0237122003_zh-cn_topic_0059777701_fdf5a38b067314bf7b8847e80f5346f52)。 + + **图 4** all::= + ![](figures/all.png "all") + + 右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较,其结果必须是布尔值。如果全部获得真值,ALL结果为"真"(包括子查询没有返回任何行的情况)。如果至少获得一个假值,则结果是"假"。 + + 示例: + + ``` + postgres=# SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE sr_customer_sk < all(SELECT d_dom FROMOM tpcds.date_dim WHERE d_dom < 10); + sr_reason_sk | sr_customer_sk + --------------+---------------- + (0 rows) + + ``` + + 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" new file mode 100644 index 000000000..a792c6381 --- /dev/null +++ "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" @@ -0,0 +1,1522 @@ +# 字符处理函数和操作符 + +openGauss提供的字符处理函数和操作符主要用于字符串与字符串、字符串与非字符串之间的连接,以及字符串的模式匹配操作。 + +- bit\_length\(string\) + + 描述:字符串的位数。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT bit_length('world'); + bit_length + ------------ + 40 + (1 row) + ``` + +- btrim\(string text \[, characters text\]\) + + 描述:从string开头和结尾删除只包含characters中字符(缺省是空白)的最长字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT btrim('sring' , 'ing'); + btrim + ------- + sr + (1 row) + ``` + +- char\_length\(string\)或character\_length\(string\) + + 描述:字符串中的字符个数。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT char_length('hello'); + char_length + ------------- + 5 + (1 row) + ``` + +- instr\(text,text,int,int\) + + 描述:instr\(string1,string2,int1,int2\)返回在string1中从int1位置开始匹配到第int2次string2的位置,第一个int表示开始匹配起始位置,第二个int表示匹配的次数。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT instr( 'abcdabcdabcd', 'bcd', 2, 2 ); + instr + ------- + 6 + (1 row) + ``` + +- lengthb\(text/bpchar\) + + 描述:获取指定字符串的字节数。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT lengthb('hello'); + lengthb + --------- + 5 + (1 row) + ``` + +- left\(str text, n int\) + + 描述:返回字符串的前n个字符。当n是负数时,返回除最后|n|个字符以外的所有字符。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT left('abcde', 2); + left + ------ + ab + (1 row) + ``` + +- length\(string bytea, encoding name \) + + 描述:指定encoding编码格式的string的字符数。在这个编码格式中,string必须是有效的。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT length('jose', 'UTF8'); + length + -------- + 4 + (1 row) + ``` + +- lpad\(string text, length int \[, fill text\]\) + + 描述:通过填充字符fill(缺省时为空白),把string填充为length长度。如果string已经比length长则将其尾部截断。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT lpad('hi', 5, 'xyza'); + lpad + ------- + xyzhi + (1 row) + ``` + +- octet\_length\(string\) + + 描述:字符串中的字节数。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT octet_length('jose'); + octet_length + -------------- + 4 + (1 row) + ``` + +- overlay\(string placing string FROM int \[for int\]\) + + 描述:替换子字符串。FROM int表示从第一个string的第几个字符开始替换,for int表示替换第一个string的字符数目。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT overlay('hello' placing 'world' from 2 for 3 ); + overlay + --------- + hworldo + (1 row) + ``` + +- position\(substring in string\) + + 描述:指定子字符串的位置。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT position('ing' in 'string'); + position + ---------- + 4 + (1 row) + ``` + +- pg\_client\_encoding\(\) + + 描述:当前客户端编码名称。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT pg_client_encoding(); + pg_client_encoding + -------------------- + UTF8 + (1 row) + ``` + +- quote\_ident\(string text\) + + 描述:返回适用于SQL语句的标识符形式(使用适当的引号进行界定)。只有在必要的时候才会添加引号(字符串包含非标识符字符或者会转换大小写的字符)。返回值中嵌入的引号都写了两次。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT quote_ident('hello world'); + quote_ident + -------------- + "hello world" + (1 row) + ``` + +- quote\_literal\(string text\) + + 描述:返回适用于在SQL语句里当作文本使用的形式(使用适当的引号进行界定)。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT quote_literal('hello'); + quote_literal + --------------- + 'hello' + (1 row) + ``` + + 如果出现如下写法,text文本将进行转义。 + + ``` + postgres=# SELECT quote_literal(E'O\'hello'); + quote_literal + --------------- + 'O''hello' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ``` + postgres=# SELECT quote_literal('O\hello'); + quote_literal + --------------- + E'O\\hello' + (1 row) + ``` + + 如果参数为NULL,返回空。如果参数可能为null,通常使用函数quote\_nullable更适用。 + + ``` + postgres=# SELECT quote_literal(NULL); + quote_literal + --------------- + + (1 row) + ``` + +- quote\_literal\(value anyelement\) + + 描述:将给定的值强制转换为text,加上引号作为文本。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT quote_literal(42.5); + quote_literal + --------------- + '42.5' + (1 row) + ``` + + 如果出现如下写法,定值将进行转义。 + + ``` + postgres=# SELECT quote_literal(E'O\'42.5'); + quote_literal + --------------- + '0''42.5' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ``` + postgres=# SELECT quote_literal('O\42.5'); + quote_literal + --------------- + E'O\\42.5' + (1 row) + ``` + +- quote\_nullable\(string text\) + + 描述:返回适用于在SQL语句里当作字符串使用的形式(使用适当的引号进行界定)。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT quote_nullable('hello'); + quote_nullable + ---------------- + 'hello' + (1 row) + ``` + + 如果出现如下写法,text文本将进行转义。 + + ``` + postgres=# SELECT quote_nullable(E'O\'hello'); + quote_nullable + ---------------- + 'O''hello' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ``` + postgres=# SELECT quote_nullable('O\hello'); + quote_nullable + ---------------- + E'O\\hello' + (1 row) + ``` + + 如果参数为NULL,返回NULL。 + + ``` + postgres=# SELECT quote_nullable(NULL); + quote_nullable + ---------------- + NULL + (1 row) + ``` + +- quote\_nullable\(value anyelement\) + + 描述:将给定的参数值转化为text,加上引号作为文本。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT quote_nullable(42.5); + quote_nullable + ---------------- + '42.5' + (1 row) + ``` + + 如果出现如下写法,定值将进行转义。 + + ``` + postgres=# SELECT quote_nullable(E'O\'42.5'); + quote_nullable + ---------------- + 'O''42.5' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ``` + postgres=# SELECT quote_nullable('O\42.5'); + quote_nullable + ---------------- + E'O\\42.5' + (1 row) + ``` + + 如果参数为NULL,返回NULL。 + + ``` + postgres=# SELECT quote_nullable(NULL); + quote_nullable + ---------------- + NULL + (1 row) + ``` + +- substring\(string \[from int\] \[for int\]\) + + 描述:截取子字符串,from int表示从第几个字符开始截取,for int表示截取几个字节。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT substring('Thomas' from 2 for 3); + substring + ----------- + hom + (1 row) + ``` + +- substring\(string from _pattern_\) + + 描述:截取匹配POSIX正则表达式的子字符串。如果没有匹配它返回空值,否则返回文本中匹配模式的那部分。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT substring('Thomas' from '...$'); + substring + ----------- + mas + (1 row) + postgres=# SELECT substring('foobar' from 'o(.)b'); + result + -------- + o + (1 row) + postgres=# SELECT substring('foobar' from '(o(.)b)'); + result + -------- + oob + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果POSIX正则表达式模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。如果你想在表达式里使用圆括号而又不想导致这个例外,那么你可以在整个表达式外边放上一对圆括号。 + +- substring\(string from _pattern_ for _escape_\) + + 描述:截取匹配SQL正则表达式的子字符串。声明的模式必须匹配整个数据串,否则函数失败并返回空值。为了标识在成功的时候应该返回的模式部分,模式必须包含逃逸字符的两次出现,并且后面要跟上双引号(")。匹配这两个标记之间的模式的文本将被返回。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT substring('Thomas' from '%#"o_a#"_' for '#'); + substring + ----------- + oma + (1 row) + ``` + +- rawcat\(raw,raw\) + + 描述:字符串拼接函数。 + + 返回值类型:raw + + 示例: + + ``` + postgres=# SELECT rawcat('ab','cd'); + rawcat + -------- + ABCD + (1 row) + ``` + +- regexp\_like\(text,text,text\) + + 描述:正则表达式的模式匹配函数。 + + 返回值类型:bool + + 示例: + + ``` + postgres=# SELECT regexp_like('str','[ac]'); + regexp_like + ------------- + f + (1 row) + ``` + +- regexp\_substr\(text,text\) + + 描述:正则表达式的抽取子串函数。与substr功能相似,正则表达式出现多个并列的括号时,也全部处理。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT regexp_substr('str','[ac]'); + regexp_substr + --------------- + + (1 row) + ``` + +- regexp\_matches\(string text, pattern text \[, flags text\]\) + + 描述:返回string中所有匹配POSIX正则表达式的子字符串。如果pattern不匹配,该函数不返回行。如果模式不包含圆括号子表达式,则每一个被返回的行都是一个单一元素的文本数组,其中包括匹配整个模式的子串。如果模式包含圆括号子表达式,该函数返回一个文本数组,它的第n个元素是匹配模式的第n个圆括号子表达式的子串。 + + flags参数为可选参数,包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 + + >![](public_sys-resources/icon-notice.gif) **须知:** + >如果提供了最后一个参数,但参数值是空字符串(''),且数据库SQL兼容模式设置为ORA的情况下,会导致返回结果为空集。这是因为ORA兼容模式将''作为NULL处理,避免此类行为的方式有如下几种: + >- 将数据库SQL兼容模式改为TD; + >- 不提供最后一个参数,或最后一个参数不为空字符串。 + + 返回值类型:setof text\[\] + + 示例: + + ``` + postgres=# SELECT regexp_matches('foobarbequebaz', '(bar)(beque)'); + regexp_matches + ---------------- + {bar,beque} + (1 row) + postgres=# SELECT regexp_matches('foobarbequebaz', 'barbeque'); + regexp_matches + ---------------- + {barbeque} + (1 row) + postgres=# SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g'); + result + -------------- + {bar,beque} + {bazil,barf} + (2 rows) + ``` + +- regexp\_split\_to\_array\(string text, pattern text \[, flags text \]\) + + 描述:用POSIX正则表达式作为分隔符,分隔string。和regexp\_split\_to\_table相同,不过regexp\_split\_to\_array会把它的结果以一个text数组的形式返回。 + + 返回值类型:text\[\] + + 示例: + + ``` + postgres=# SELECT regexp_split_to_array('hello world', E'\\s+'); + regexp_split_to_array + ----------------------- + {hello,world} + (1 row) + ``` + +- regexp\_split\_to\_table\(string text, pattern text \[, flags text\]\) + + 描述:用POSIX正则表达式作为分隔符,分隔string。如果没有与pattern的匹配,该函数返回string。如果有至少有一个匹配,对每一个匹配它都返回从上一个匹配的末尾(或者串的开头)到这次匹配开头之间的文本。当没有更多匹配时,它返回从上一次匹配的末尾到串末尾之间的文本。 + + flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 + + 返回值类型:setof text + + 示例: + + ``` + postgres=# SELECT regexp_split_to_table('hello world', E'\\s+'); + regexp_split_to_table + ----------------------- + hello + world + (2 rows) + ``` + +- repeat\(string text, number int \) + + 描述:将string重复number次。 + + 返回值类型:text。 + + 示例: + + ``` + postgres=# SELECT repeat('Pg', 4); + repeat + ---------- + PgPgPgPg + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于数据库内存分配机制限制单次内存分配不可超过1GB,因此number最大值不应超过\(1G-x\)/lengthb\(string\) - 1。x为头信息长度,通常大于4字节,其具体值在不同的场景下存在差异。 + +- replace\(string text, from text, to text\) + + 描述:把字符串string里出现地所有子字符串from的内容替换成子字符串to的内容。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT replace('abcdefabcdef', 'cd', 'XXX'); + replace + ---------------- + abXXXefabXXXef + (1 row) + ``` + + +- reverse\(str\) + + 描述:返回颠倒的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT reverse('abcde'); + reverse + --------- + edcba + (1 row) + ``` + +- right\(str text, n int\) + + 描述:返回字符串中的后n个字符。当n是负值时,返回除前|n|个字符以外的所有字符。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT right('abcde', 2); + right + ------- + de + (1 row) + + postgres=# SELECT right('abcde', -2); + right + ------- + cde + (1 row) + ``` + +- rpad\(string text, length int \[, fill text\]\) + + 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT rpad('hi', 5, 'xy'); + rpad + ------- + hixyx + (1 row) + ``` + +- rtrim\(string text \[, characters text\]\) + + 描述:从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT rtrim('trimxxxx', 'x'); + rtrim + ------- + trim + (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表示提取的起始位置,第二个表示提取几位字符。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT substrb('string',2,3); + substrb + --------- + tri + (1 row) + ``` + +- substrb\(text,int\) + + 描述:提取子字符串,int表示提取的起始位置。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT substrb('string',2); + substrb + --------- + tring + (1 row) + ``` + +- substr\(bytea,from,count\) + + 描述:从参数bytea中抽取子字符串。from表示抽取的起始位置,count表示抽取的子字符串长度。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT substr('string',2,3); + substr + -------- + tri + (1 row) + ``` + +- string || string + + 描述:连接字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT 'MPP'||'DB' AS RESULT; + result + -------- + MPPDB + (1 row) + ``` + +- string || non-string或non-string || string + + 描述:连接字符串和非字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT 'Value: '||42 AS RESULT; + result + ----------- + Value: 42 + (1 row) + ``` + +- split\_part\(string text, delimiter text, field int\) + + 描述:根据delimiter分隔string返回生成的第field个子字符串(从出现第一个delimiter的text为基础)。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT split_part('abc~@~def~@~ghi', '~@~', 2); + split_part + ------------ + def + (1 row) + ``` + +- strpos\(string, substring\) + + 描述:指定的子字符串的位置。和position\(substring in string\)一样,不过参数顺序相反。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT strpos('source', 'rc'); + strpos + -------- + 4 + (1 row) + ``` + +- to\_hex\(number int or bigint\) + + 描述:把number转换成十六进制表现形式。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT to_hex(2147483647); + to_hex + ---------- + 7fffffff + (1 row) + ``` + +- translate\(string text, from text, to text\) + + 描述:把在string中包含的任何匹配from中字符的字符转化为对应的在to中的字符。如果from比to长,删掉在from中出现的额外的字符。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT translate('12345', '143', 'ax'); + translate + ----------- + a2x5 + (1 row) + ``` + + +- length\(string\) + + 描述:获取参数string中字符的数目。 + + 返回值类型:integer + + 示例: + + ``` + postgres=# SELECT length('abcd'); + length + -------- + 4 + (1 row) + ``` + +- lengthb\(string\) + + 描述:获取参数string中字节的数目。与字符集有关,同样的中文字符,在GBK与UTF8中,返回的字节数不同。 + + 返回值类型:integer + + 示例: + + ``` + postgres=# SELECT lengthb('Chinese'); + lengthb + --------- + 7 + (1 row) + ``` + +- substr\(string,from\) + + 描述: + + 从参数string中抽取子字符串。 + + from表示抽取的起始位置。 + + - from为0时,按1处理。 + - from为正数时,抽取从from到末尾的所有字符。 + - from为负数时,抽取字符串的后n个字符,n为from的绝对值。 + + 返回值类型:varchar + + 示例: + + from为正数时: + + ``` + postgres=# SELECT substr('ABCDEF',2); + substr + -------- + BCDEF + (1 row) + ``` + + from为负数时: + + ``` + postgres=# SELECT substr('ABCDEF',-2); + substr + -------- + EF + (1 row) + ``` + +- substr\(string,from,count\) + + 描述: + + 从参数string中抽取子字符串。 + + from表示抽取的起始位置。 + + count表示抽取的子字符串长度。 + + - from为0时,按1处理。 + - from为正数时,抽取从from开始的count个字符。 + - from为负数时,抽取从倒数第n个开始的count个字符,n为from的绝对值。 + - count小于1时,返回null。 + + 返回值类型:varchar + + 示例: + + from为正数时: + + ``` + postgres=# SELECT substr('ABCDEF',2,2); + substr + -------- + BC + (1 row) + ``` + + from为负数时: + + ``` + postgres=# SELECT substr('ABCDEF',-3,2); + substr + -------- + DE + (1 row) + ``` + +- substrb\(string,from\) + + 描述:该函数和SUBSTR\(string,from\)函数功能一致,但是计算单位为字节。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT substrb('ABCDEF',-2); + substrb + --------- + EF + (1 row) + ``` + +- substrb\(string,from,count\) + + 描述:该函数和SUBSTR\(string,from,count\)函数功能一致,但是计算单位为字节。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT substrb('ABCDEF',2,2); + substrb + --------- + BC + (1 row) + ``` + +- trim\(\[leading |trailing |both\] \[characters\] from string\) + + 描述:从字符串string的开头、结尾或两边删除只包含characters中字符(缺省是一个空白)的最长的字符串。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT trim(BOTH 'x' FROM 'xTomxx'); + btrim + ------- + Tom + (1 row) + ``` + + ``` + postgres=# SELECT trim(LEADING 'x' FROM 'xTomxx'); + ltrim + ------- + Tomxx + (1 row) + ``` + + ``` + postgres=# SELECT trim(TRAILING 'x' FROM 'xTomxx'); + rtrim + ------- + xTom + (1 row) + ``` + +- rtrim\(string \[, characters\]\) + + 描述:从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT rtrim('TRIMxxxx','x'); + rtrim + ------- + TRIM + (1 row) + ``` + +- ltrim\(string \[, characters\]\) + + 描述:从字符串string的开头删除只包含characters中字符(缺省是一个空白)的最长的字符串。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT ltrim('xxxxTRIM','x'); + ltrim + ------- + TRIM + (1 row) + ``` + +- upper\(string\) + + 描述:把字符串转化为大写。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT upper('tom'); + upper + ------- + TOM + (1 row) + ``` + +- lower\(string\) + + 描述:把字符串转化为小写。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT lower('TOM'); + lower + ------- + tom + (1 row) + ``` + +- rpad\(string varchar, length int \[, fill varchar\]\) + + 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 + + length参数在openGauss中表示字符长度。一个汉字长度计算为一个字符。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT rpad('hi',5,'xyza'); + rpad + ------- + hixyx + (1 row) + ``` + + ``` + postgres=# SELECT rpad('hi',5,'abcdefg'); + rpad + ------- + hiabc + (1 row) + ``` + +- instr\(string,substring\[,position,occurrence\]\) + + 描述:从字符串string的position(缺省时为1)所指的位置开始查找并返回第occurrence(缺省时为1)次出现子串substring的位置的值。 + + - 当position为0时,返回0。 + - 当position为负数时,从字符串倒数第n个字符往前逆向搜索。n为position的绝对值。 + + 本函数以字符为计算单位,如一个汉字为一个字符。 + + 返回值类型:integer + + 示例: + + ``` + postgres=# SELECT instr('corporate floor','or', 3); + instr + ------- + 5 + (1 row) + ``` + + ``` + postgres=# SELECT instr('corporate floor','or',-3,2); + instr + ------- + 2 + (1 row) + ``` + +- initcap\(string\) + + 描述:将字符串中的每个单词的首字母转化为大写,其他字母转化为小写。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT initcap('hi THOMAS'); + initcap + ----------- + Hi Thomas + (1 row) + ``` + +- ascii\(string\) + + 描述:参数string的第一个字符的ASCII码。 + + 返回值类型:integer + + 示例: + + ``` + postgres=# SELECT ascii('xyz'); + ascii + ------- + 120 + (1 row) + ``` + +- replace\(string varchar, search\_string varchar, replacement\_string varchar\) + + 描述:把字符串string中所有子字符串search\_string替换成子字符串replacement\_string。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT replace('jack and jue','j','bl'); + replace + ---------------- + black and blue + (1 row) + ``` + +- lpad\(string varchar, length int\[, repeat\_string varchar\]\) + + 描述:在string的左侧添上一系列的repeat\_string(缺省为空白)来组成一个总长度为n的新字符串。 + + 如果string本身的长度比指定的长度length长,则本函数将把string截断并把前面长度为length的字符串内容返回。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT lpad('PAGE 1',15,'*.'); + lpad + ----------------- + *.*.*.*.*PAGE 1 + (1 row) + ``` + + ``` + postgres=# SELECT lpad('hello world',5,'abcd'); + lpad + ------- + hello + (1 row) + ``` + +- concat\(str1,str2\) + + 描述:将字符串str1和str2连接并返回,若str1或str2为NULL时,返回NULL。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT concat('Hello', ' World!'); + concat + -------------- + Hello World! + (1 row) + postgres=# SELECT concat('Hello', NULL); + concat + -------- + + (1 row) + ``` + +- chr\(integer\) + + 描述:给出ASCII码的字符。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT chr(65); + chr + ----- + A + (1 row) + ``` + +- regexp\_substr\(source\_char, pattern\) + + 描述:正则表达式的抽取子串函数。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT regexp_substr('500 Hello World, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR"; + REGEXPR_SUBSTR + ------------------- + , Redwood Shores, + (1 row) + ``` + +- regexp\_replace\(string, pattern, replacement \[,flags \]\) + + 描述:替换匹配POSIX正则表达式的子字符串。 如果没有匹配pattern,那么返回不加修改的string串。 如果有匹配,则返回的string串里面的匹配子串将被replacement串替换掉。 + + replacement串可以包含\\n, 其中\\n是1 到9, 表明string串里匹配模式里第n个圆括号子表达式的子串应该被插入, 并且它可以包含\\&表示应该插入匹配整个模式的子串。 + + 可选的flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT regexp_replace('Thomas', '.[mN]a.', 'M'); + regexp_replace + ---------------- + ThM + (1 row) + postgres=# SELECT regexp_replace('foobarbaz','b(..)', E'X\\1Y', 'g') AS RESULT; + result + ------------- + fooXarYXazY + (1 row) + ``` + +- concat\_ws\(sep text, str"any" \[, str"any" \[, ...\] \]\) + + 描述:以第一个参数为分隔符,链接第二个以后的所有参数。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT concat_ws(',', 'ABCDE', 2, NULL, 22); + concat_ws + ------------ + ABCDE,2,22 + (1 row) + ``` + +- convert\(string bytea, src\_encoding name, dest\_encoding name\) + + 描述:以dest\_encoding指定的目标编码方式转化字符串bytea。src\_encoding指定源编码方式,在该编码下,string必须是合法的。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT convert('text_in_utf8', 'UTF8', 'GBK'); + convert + ---------------------------- + \x746578745f696e5f75746638 + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果源编码格式到目标编码格式的转化规则不存在,则字符串不进行任何转换直接返回,如GBK和LATIN1之间的转换规则是不存在的,具体转换规则可以通过查看系统表pg\_conversion获得。 + >示例: + >``` + >postgres=# show server_encoding; + > server_encoding + >----------------- + > LATIN1 + >(1 row) + >postgres=# SELECT convert_from('some text', 'GBK'); + > convert_from + >-------------- + > some text + >(1 row) + >db_latin1=# SELECT convert_to('some text', 'GBK'); + > convert_to + >---------------------- + > \x736f6d652074657874 + >(1 row) + >db_latin1=# SELECT convert('some text', 'GBK', 'LATIN1'); + > convert + >---------------------- + > \x736f6d652074657874 + >(1 row) + >``` + +- convert\_from\(string bytea, src\_encoding name\) + + 描述:以数据库的编码方式转化字符串bytea。 + + src\_encoding指定源编码方式,在该编码下,string必须是合法的。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT convert_from('text_in_utf8', 'UTF8'); + convert_from + -------------- + text_in_utf8 + (1 row) + ``` + +- convert\_to\(string text, dest\_encoding name\) + + 描述:将字符串转化为dest\_encoding的编码格式。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT convert_to('some text', 'UTF8'); + convert_to + ---------------------- + \x736f6d652074657874 + (1 row) + ``` + +- string \[NOT\] LIKE pattern \[ESCAPE escape-character\] + + 描述:模式匹配函数。 + + 如果pattern不包含百分号或者下划线,该模式只代表它本身,这时候LIKE的行为就像等号操作符。在pattern里的下划线(\_)匹配任何单个字符;而一个百分号(%)匹配零或多个任何字符。 + + 要匹配下划线或者百分号本身,在pattern里相应的字符必须前导逃逸字符。缺省的逃逸字符是反斜杠,但是用户可以用ESCAPE子句指定一个。要匹配逃逸字符本身,写两个逃逸字符。 + + 返回值类型:Boolean + + 示例: + + ``` + postgres=# SELECT 'AA_BBCC' LIKE '%A@_B%' ESCAPE '@' AS RESULT; + result + -------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'AA_BBCC' LIKE '%A@_B%' AS RESULT; + result + -------- + f + (1 row) + ``` + + ``` + postgres=# SELECT 'AA@_BBCC' LIKE '%A@_B%' AS RESULT; + result + -------- + t + (1 row) + ``` + +- REGEXP\_LIKE\(source\_string, pattern \[, match\_parameter\]\) + + 描述:正则表达式的模式匹配函数。 + + source\_string为源字符串,pattern为正则表达式匹配模式。 match\_parameter为匹配选项,可取值为: + + - 'i':大小写不敏感。 + - 'c':大小写敏感。 + - 'n':允许正则表达式元字符“.”匹配换行符。 + - 'm':将source\_string视为多行。 + + 若忽略match\_parameter选项,默认为大小写敏感,“.”不匹配换行符,source\_string视为单行。 + + 返回值类型:Boolean + + 示例: + + ``` + postgres=# SELECT regexp_like('ABC', '[A-Z]'); + regexp_like + ------------- + t + (1 row) + ``` + + ``` + postgres=# SELECT regexp_like('ABC', '[D-Z]'); + regexp_like + ------------- + f + (1 row) + ``` + + ``` + postgres=# SELECT regexp_like('ABC', '[A-Z]','i'); + regexp_like + ------------- + t + (1 row) + ``` + + ``` + postgres=# SELECT regexp_like('ABC', '[A-Z]'); + regexp_like + ------------- + t + (1 row) + ``` + +- format\(formatstr text \[, str"any" \[, ...\] \]\) + + 描述:格式化字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT format('Hello %s, %1$s', 'World'); + format + -------------------- + Hello World, World + (1 row) + ``` + +- md5\(string\) + + 描述:将string使用MD5加密,并以16进制数作为返回值。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >MD5的安全性较低,不建议使用。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT md5('ABC'); + md5 + ---------------------------------- + 902fbdd2b1df0c4f70b4a5d23525e932 + (1 row) + ``` + +- decode\(string text, format text\) + + 描述:将二进制数据从文本数据中解码。 + + 返回值类型:bytea + + 示例: + + ``` + postgres=# SELECT decode('MTIzAAE=', 'base64'); + decode + -------------- + \x3132330001 + (1 row) + ``` + +- encode\(data bytea, format text\) + + 描述:将二进制数据编码为文本数据。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT encode(E'123\\000\\001', 'base64'); + encode + ---------- + MTIzAAE= + (1 row) + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 若字符串中存在换行符,如字符串由一个换行符和一个空格组成,在openGauss中LENGTH和LENGTHB的值为2。 +>- 对于CHAR\(n\) 类型,openGauss中n是指字符个数。因此,对于多字节编码的字符集, LENGTHB函数返回的长度可能大于n。 + 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" new file mode 100644 index 000000000..9a7b2761b --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\255\227\347\254\246\347\261\273\345\236\213.md" @@ -0,0 +1,152 @@ +# 字符类型 + +openGauss支持的字符类型请参见[表1](#zh-cn_topic_0237121950_zh-cn_topic_0059777889_zh-cn_topic_0058966269_table29186418)。字符串操作符和相关的内置函数请参见[字符处理函数和操作符](字符处理函数和操作符.md)。 + +**表 1** 字符类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

CHAR(n)

+

CHARACTER(n)

+

NCHAR(n)

+

定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。

+

最大为10MB。

+

VARCHAR(n)

+

CHARACTER VARYING(n)

+

变长字符串。n是指字节长度。

+

最大为10MB。

+

VARCHAR2(n)

+

变长字符串。是VARCHAR(n)类型的别名,为兼容A类型。n是指字节长度。

+

最大为10MB。

+

NVARCHAR2(n)

+

变长字符串。n是指字节长度。

+

最大为10MB。

+

CLOB

+

文本大对象。是TEXT类型的别名,为兼容A类型。

+

最大为1GB-8203字节(即1073733621字节)。

+

TEXT

+

变长字符串。

+

最大为1GB-8203字节(即1073733621字节)。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>除了每列的大小限制以外,每个元组的总大小也不可超过1GB-8203字节(即1073733621字节)。 + +在openGauss里另外还有两种定长字符类型。在[表2](#zh-cn_topic_0237121950_zh-cn_topic_0059777889_tf74658686f5e4d979adf0ac04769ea16)里显示。name类型只用在内部系统表中,作为存储标识符,不建议普通用户使用。该类型长度当前定为64字节(63可用字符加结束符)。类型"char"只用了一个字节的存储空间。他在系统内部主要用于系统表,主要作为简单化的枚举类型使用。 + +**表 2** 特殊字符类型 + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

name

+

用于对象名的内部类型。

+

64字节。

+

"char"

+

单字节内部类型。

+

1字节。

+
+ +## 示例 + +``` +--创建表。 +postgres=# CREATE TABLE char_type_t1 +( + CT_COL1 CHARACTER(4) +); + +--插入数据。 +postgres=# INSERT INTO char_type_t1 VALUES ('ok'); + +--查询表中的数据。 +postgres=# SELECT ct_col1, char_length(ct_col1) FROM char_type_t1; + ct_col1 | char_length +---------+------------- + ok | 4 +(1 row) + +--删除表。 +postgres=# DROP TABLE char_type_t1; +``` + +``` +--创建表。 +postgres=# CREATE TABLE char_type_t2 +( + CT_COL1 VARCHAR(5) +); + +--插入数据。 +postgres=# INSERT INTO char_type_t2 VALUES ('ok'); + +postgres=# INSERT INTO char_type_t2 VALUES ('good'); + +--插入的数据长度超过类型规定的长度报错。 +postgres=# INSERT INTO char_type_t2 VALUES ('too long'); +ERROR: value too long for type character varying(4) +CONTEXT: referenced column: ct_col1 + +--明确类型的长度,超过数据类型长度后会自动截断。 +postgres=# INSERT INTO char_type_t2 VALUES ('too long'::varchar(5)); + +--查询数据。 +postgres=# SELECT ct_col1, char_length(ct_col1) FROM char_type_t2; + ct_col1 | char_length +---------+------------- + ok | 2 + good | 5 + too l | 5 +(3 rows) + +--删除数据。 +postgres=# DROP TABLE char_type_t2; +``` + 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" new file mode 100644 index 000000000..2afdd15d4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\211\345\205\250\345\207\275\346\225\260.md" @@ -0,0 +1,298 @@ +# 安全函数 + +## 安全函数 + +- gs\_encrypt\_aes128\(encryptstr,keystr\) + + 描述:以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为1\~16字节。支持的加密数据类型:目前数据库支持的数值类型,字符类型,二进制类型中的RAW,日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。 + + 返回值类型:text + + 返回值长度:至少为92字节,不超过 4\*\[\(Len+68\)/3\] 字节,其中Len为加密前数据长度(单位为字节)。 + + 示例: + + ``` + postgres=# SELECT gs_encrypt_aes128('MPPDB','1234'); + + gs_encrypt_aes128 + ------------------------------------------------------------------------------------- + gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A= + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。 + +- gs\_decrypt\_aes128\(decryptstr,keystr\) + + 描述:以keystr为密钥对decrypt字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此参数需要结合gs\_encrypt\_aes128加密函数共同使用。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT gs_decrypt_aes128('gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=','1234'); + gs_decrypt_aes128 + ------------------- + MPPDB + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将该函数记录入执行历史;即无法在gsql里通过上下翻页功能找到该函数的执行历史。 + +- gs\_password\_deadline + + 描述:显示当前帐户密码离过期还距离多少天。 + + 返回值类型:interval + + 示例: + + ``` + postgres=# SELECT gs_password_deadline(); + gs_password_deadline + ------------------------- + 83 days 17:44:32.196094 + (1 row) + ``` + +- login\_audit\_messages + + 描述:查看登录用户的登录信息。 + + 返回值类型:元组 + + 示例: + + - 查看上一次登录认证通过的日期、时间和IP等信息。 + + ``` + postgres=# SELECT * FROM login_audit_messages(true); + username | database | logintime | type | result | client_conninfo + ------------+----------+------------------------+---------------+--------+-------------------- + omm | postgres | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] + (1 row) + ``` + + - 查看上一次登录认证失败的日期、时间和IP等信息。 + + ``` + postgres=# SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1; + username | database | logintime | type | result | client_conninfo + ------------+----------+------------------------+--------------+--------+------------------------- + (0 rows) + ``` + + - 查看自从最后一次认证通过以来失败的尝试次数、日期和时间。 + + ``` + postgres=# SELECT * FROM login_audit_messages(false); + username | database | logintime | type | result | client_conninfo + ------------+----------+------------------------+--------------+--------+------------------------- + (0 rows) + ``` + + +- login\_audit\_messages\_pid + + 描述:查看登录用户的登录信息。与login\_audit\_messages的区别在于结果基于当前backendid向前查找。所以不会因为同一用户的后续登录,而影响本次登录的查询结果。也就是查询不到该用户后续登录的信息。 + + 返回值类型:元组 + + 示例: + + - 查看上一次登录认证通过的日期、时间和IP等信息。 + + ``` + postgres=# SELECT * FROM login_audit_messages(true); + username | database | logintime | type | result | client_conninfo | backendid + ------------+----------+------------------------+---------------+--------+-------------------- + omm | postgres | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 140311900702464 + (1 row) + ``` + + - 查看上一次登录认证失败的日期、时间和IP等信息。 + + ``` + postgres=# SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1; + username | database | logintime | type | result | client_conninfo | backendid + ------------+----------+------------------------+--------------+--------+------------------------- + (0 rows) + ``` + + - 查看自从最后一次认证通过以来失败的尝试次数、日期和时间。 + + ``` + postgres=# SELECT * FROM login_audit_messages(false); + username | database | logintime | type | result | client_conninfo | backendid + ------------+----------+------------------------+--------------+--------+------------------------- + (0 rows) + ``` + + +- inet\_server\_addr + + 描述:显示服务器IP信息。 + + 返回值类型:inet + + 示例: + + ``` + postgres=# SELECT inet_server_addr(); + inet_server_addr + ------------------ + 10.10.0.13 + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 上面是以客户端在10.10.0.50上,服务器端在10.10.0.13上为例。 + >- 如果是通过本地连接,使用此接口显示为空。 + +- inet\_client\_addr + + 描述:显示客户端IP信息。 + + 返回值类型:inet + + 示例: + + ``` + postgres=# SELECT inet_client_addr(); + inet_client_addr + ------------------ + 10.10.0.50 + (1 row) + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 上面是以客户端在10.10.0.50上,服务器端在10.10.0.13上为例。 + >- 如果是通过本地连接,使用此接口显示为空。 + +- pg\_query\_audit + + 描述:查看数据库主节点审计日志。 + + 返回值类型:record + + 函数返回字段如下: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

time

+

timestamp with time zone

+

操作时间

+

type

+

text

+

操作类型

+

result

+

text

+

操作结果

+

username

+

text

+

执行操作的用户名

+

database

+

text

+

数据库名称

+

client_conninfo

+

text

+

客户端连接信息

+

object_name

+

text

+

操作对象名称

+

detail_info

+

text

+

执行操作详细信息

+

node_name

+

text

+

节点名称

+

thread_id

+

text

+

线程id

+

local_port

+

text

+

本地端口

+

remote_port

+

text

+

远端端口

+
+ +- pgxc\_query\_audit + + 描述:查看数据库主节点审计日志。 + + 返回值类型:record + + 函数返回字段同pg\_query\_audit函数。 + +- pg\_delete\_audit + + 描述:删除指定时间段的审计日志。 + + 返回值类型:void + + + 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" new file mode 100644 index 000000000..c0af033a5 --- /dev/null +++ "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" @@ -0,0 +1,381 @@ +# 安全和认证(postgresql.conf) + +介绍设置客户端和服务器的安全认证方式的相关参数。 + +## authentication\_timeout + +**参数说明:**完成客户端认证的最长时间。如果一个客户端没有在这段时间里完成与服务器端的认证,则服务器自动中断与客户端的连接,这样就避免了出问题的客户端无限制地占用连接数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为1,最大值为600,最小单位为s。 + +**默认值:**1min + +## auth\_iteration\_count + +**参数说明:**认证加密信息生成过程中使用的迭代次数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,2048-134217728。 + +**默认值:**10000 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>迭代次数设置过小会降低口令存储的安全性,设置过大会导致认证、用户创建等涉及口令加密的场景性能劣化,请根据实际硬件条件合理设置迭代次数,推荐采用默认迭代次数。 + +## session\_timeout + +**参数说明:**表明与服务器建立链接后,不进行任何操作的最长时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0-86400,最小单位为s,0表示关闭超时设置。 + +**默认值:**10min + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss gsql客户端中有自动重连机制,所以针对初始化用户本地连接,超时后gsql表现的现象为断开后重连。 + +## ssl + +**参数说明:**启用SSL连接。请在使用这个选项之前阅读[使用gsql连接](使用gsql连接.md)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示启用SSL连接。 +- off表示不启用SSL连接。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss目前支持SSL的场景为客户端连接数据库主节点场景,该参数目前建议只在数据库主节点中开启,数据库节点默认值为off。开启此参数需要同时配置ssl\_cert\_file、ssl\_key\_file和ssl\_ca\_file等参数及对应文件,不正确的配置可能会导致openGauss无法正常启动。 + +**默认值:**on + +## require\_ssl + +**参数说明:**设置服务器端是否强制要求SSL连接,该参数只有当参数[ssl](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s8c4647db116f44c4b9ce3dceee3d6ffa)为on时才有效。请在使用这个选项之前阅读[使用gsql连接](使用gsql连接.md)。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示服务器端强制要求SSL连接。 +- off表示服务器端对是否通过SSL连接不作强制要求。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss目前支持SSL的场景为客户端连接数据库主节点场景,该参数目前建议只在数据库主节点中开启。 + +**默认值:**off + +## ssl\_ciphers + +**参数说明:**指定SSL支持的加密算法列表。 + +该参数属于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)获取支持的加密算法。 + +**默认值:**ALL + +## ssl\_renegotiation\_limit + +**参数说明:**指定在会话密钥重新协商之前,通过SSL加密通道可以传输的流量。这个重新协商流量限制机制可以减少攻击者针对大量数据使用密码分析法破解密钥的几率,但是也带来较大的性能损失。流量是指发送和接受的流量总和。使用SSL重协商机制可能引入其他风险,因此已禁用SSL重协商机制,为保持版本兼容保留此参数,修改参数配置不再起作用。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483647。单位为KB。其中0表示禁用重新协商机制。 + +**默认值:**0 + +## ssl\_cert\_file + +**参数说明:**指定包含SSL服务器证书的文件的名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**server.crt + +## ssl\_key\_file + +**参数说明:**指定包含SSL私钥的文件名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**server.key + +## ssl\_ca\_file + +**参数说明:**指定包含CA信息的文件的名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**cacert.pem + +## ssl\_crl\_file + +**参数说明**:指定包含CRL信息的文件的名称。必须使用相对路径,相对路径是相对于数据目录的。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串,其中空表示没有CA文件被加载,不进行客户端证书验证。 + +**默认值**:空 + +## krb\_server\_keyfile + +**参数说明:**指定Kerberos服务主配置文件的位置,详细请参见[客户端接入认证](客户端接入认证.md)。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**空 + +## krb\_srvname + +**参数说明:**设置Kerberos服务名,详细请参见[客户端接入认证](客户端接入认证.md)。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**postgres + +## krb\_caseins\_users + +**参数说明:**设置Kerberos用户名是否大小写敏感。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示大小写不敏感 +- off表示大小写敏感 + +**默认值:**off + +## modify\_initial\_password + +**参数说明:**当openGauss安装成功后,数据库中仅存在一个初始用户(UID为10的用户)。客户通过该帐户初次登录数据库进行操作时,该参数决定是否要对该初始帐户的密码进行修改。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示openGauss安装成功后初始用户首次登录操作前需要修改初始密码。 +- off表示openGauss安装成功后初始用户无需修改初始密码即可进行操作。 + +**默认值:**off + +## password\_policy + +**参数说明:**在使用CREATE ROLE/USER或者ALTER ROLE/USER命令创建或者修改openGauss帐户时,该参数决定是否进行密码复杂度检查。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>从安全性考虑,请勿关闭密码复杂度策略。 + +**取值范围:**0、1 + +- 0表示不采用任何密码复杂度策略。 +- 1表示采用默认密码复杂度校验策略。 + +**默认值:**1 + +## password\_reuse\_time + +**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用天数检查。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>修改密码时会检查配置参数[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)。 +>- 当[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为正数时,只要满足其中任一个,即可认为密码可以重用。 +>- 当[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)为0时,表示不限制密码重用天数,仅限制密码重用次数。 +>- 当[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)为0时,表示不限制密码重用次数,仅限制密码重用天数。 +>- 当[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为0时,表示不对密码重用进行限制。 + +**取值范围:**浮点型(天),最小值为0,最大值为3650。 + +- 0表示不检查密码可重用的天数。 +- 正数表示新密码不能为该值指定的天数内使用过的密码。 + +**默认值:**60 + +## password\_reuse\_max + +**参数说明:**在使用ALTER USER或者ALTER ROLE修改用户密码时,该参数指定是否对新密码进行可重用次数检查。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>修改密码时会检查配置参数[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)。 +>- 当[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为正数时,只要满足其中任一个,即可认为密码可以重用。 +>- 当[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)为0时,表示不限制密码重用天数,仅限制密码重用次数。 +>- 当[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)为0时,表示不限制密码重用次数,仅限制密码重用天数。 +>- 当[password\_reuse\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794)和[password\_reuse\_max](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53)都为0时,表示不对密码重用进行限制。 + +**取值范围:**整型,最小值为0,最大值为1000。 + +- 0表示不检查密码可重用次数。 +- 正整数表示新密码不能为该值指定的次数内使用过的密码。 + +**默认值:**0 + +## password\_lock\_time + +**参数说明:**该参数指定帐户被锁定后自动解锁的时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>password\_lock\_time和[failed\_login\_attempts](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_sc155ec2258b34e78a2ffcf797e66b959)必须都为正数时锁定和解锁功能才能生效。 + +**取值范围:**浮点型,最小值为0,最大值为365,单位为天。 + +- 0表示密码验证失败时,自动锁定功能不生效。 +- 正数表示帐户被锁定后,当锁定时间超过password\_lock\_time设定的值时,帐户将会被自行解锁。 + +**默认值:**1 + +## failed\_login\_attempts + +**参数说明:**在任意时候,如果输入密码错误的次数达到failed\_login\_attempts则当前帐户被锁定,password\_lock\_time秒后被自动解锁。 例如,登录时输入密码失败,ALTER USER时修改密码失败等。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>failed\_login\_attempts和[password\_lock\_time](#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s5e488e82235e4bd5b470b57a44a38c27)必须都为正数时锁定和解锁功能才能生效。 + +**取值范围:**整型,最小值为0,最大值为1000。 + +- 0表示自动锁定功能不生效。 +- 正整数表示当错误密码次数达到failed\_login\_attempts设定的值时,当前帐户将被锁定。 + +**默认值:**10 + +## password\_encryption\_type + +**参数说明:**该字段决定采用何种加密方式对用户密码进行加密存储。修改此参数的配置不会自动触发已有用户密码加密方式的修改,只会影响新创建用户或修改用户密码操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0、1、2 + +- 0表示采用md5方式对密码加密。 +- 1表示采用sha256和md5两种方式分别对密码加密。 +- 2表示采用sha256方式对密码加密。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>md5为不安全的加密算法,不建议用户使用。 + +**默认值:**2 + +## password\_min\_length + +**参数说明:**该字段决定帐户密码的最小长度。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,6\~999个字符。 + +**默认值:**8 + +## password\_max\_length + +**参数说明:**该字段决定帐户密码的最大长度。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,6\~999个字符。 + +**默认值:**32 + +## password\_min\_uppercase + +**参数说明:**该字段决定帐户密码中至少需要包含大写字母个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建账户所指定的密码中至少需要包含大写字母个数。 + +**默认值:**0 + +## password\_min\_lowercase + +**参数说明:**该字段决定帐户密码中至少需要包含小写字母的个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建帐户所指定的密码中至少需要包含小写字母个数。 + +**默认值:**0 + +## password\_min\_digital + +**参数说明:**该字段决定帐户密码中至少需要包含数字的个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建帐户所指定的密码中至少需要包含数字个数。 + +**默认值:**0 + +## password\_min\_special + +**参数说明:**该字段决定帐户密码中至少需要包含特殊字符个数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~999 + +- 0表示没有限制。 +- 1\~999表示创建帐户所指定的密码中至少需要包含特殊字符个数。 + +**默认值:**0 + +## password\_effect\_time + +**参数说明:**该字段决定帐户密码的有效时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**浮点型,最小值为0,最大值为999,单位为天。 + +- 0表示不开启有效期限制功能。 +- 1\~999表示创建帐户所指定的密码有效期,临近或超过有效期系统会提示用户修改密码。 + +**默认值:**90 + +## password\_notify\_time + +**参数说明:**该字段决定帐户密码到期前提醒的天数。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为999,单位为天。 + +- 0表示不开启提醒功能。 +- 1\~999表示帐户密码到期前提醒的天数。 + +**默认值:**7 + diff --git "a/content/zh/docs/Developerguide/\345\256\236\347\216\260.md" "b/content/zh/docs/Developerguide/\345\256\236\347\216\260.md" new file mode 100644 index 000000000..4c809752d --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\236\347\216\260.md" @@ -0,0 +1,18 @@ +# 实现 + +在内部,GIN索引包含一个在键上构造的B-tree索引,每个键是一个或多个被索引项的一个元素(比如,一个数组的一个成员)。并且页面上每个元组包含了堆指针的B-tree的一个指针(一个posting tree),当列表小到足以和键值一起存储到一个索引元组中时,则是堆指针的一个简单列表(一个posting list)。 + +多列GIN索引通过在组合值(列号,键值)上建立一个单个的B-tree实现。不同列的键值可以有不同的类型。 + +## GIN快速更新技术 + +由于倒排索引的本身特性影响,更新一个GIN索引可能会比较慢。插入或更新一个堆行可能导致许多往索引的插入。当对表执行VACUUM后,或者如果待处理实体的列表太大了(大于work\_mem),这些实体被使用和初始索引创建时用到的相同的bulk插入方法,移动到主要的GIN数据结构。即使把额外的VACUUM开销算进去,这也大大提升了GIN索引更新的速度。而且,这种额外开销的工作可以通过后台进程而不是前端查询来处理。 + +这种方法的主要缺点在于搜索时除了常规的索引还必须要扫描待处理实体的列表。因此,大的待处理实体的列表会显著的拖慢搜索。另一个缺点是,虽然大多数更新很快,但是一个导致待处理列表(pending list)变得“太大”的更新将引发一个立即清理,并因此比起其它更新会非常慢。恰当的使用autovacuum可以弱化这两个问题。 + +如果一致的响应时间(清理实体速度和更新速度的响应时间)比更新速度更重要,可以通过把GIN索引的存储参数FASTUPDATE设置为off而不使用待处理实体。详细请参考[CREATE INDEX](CREATE-INDEX.md)。 + +## 部分匹配算法 + +GIN可以支持“部分匹配”查询。即:查询并不决定单个或多个键的一个精确的匹配,而是,可能的匹配落在一个合理的狭窄键值范围内(根据compare支持函数决定的键值排序顺序)。此时,extractQuery方法并不返回一个用于精确匹配的键值,取而代之的是,返回一个要被搜索的键值范围的下边界,并且设置pmatch为true。然后,使用comparePartial方式扫描这个键值范围。comparePartial必须为一个相匹配的索引键返回0,如果不匹配但依然在被搜索范围内时返回小于0的值,对超过可以匹配的范围的索引键则返回大于0的值。 + diff --git "a/content/zh/docs/Developerguide/\345\256\241\350\256\241.md" "b/content/zh/docs/Developerguide/\345\256\241\350\256\241.md" new file mode 100644 index 000000000..dd0b7bcf3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\241\350\256\241.md" @@ -0,0 +1,9 @@ +# 审计 + +- **[审计开关](审计开关.md)** + +- **[用户和权限审计](用户和权限审计.md)** + +- **[操作审计](操作审计.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\256\241\350\256\241\345\274\200\345\205\263.md" "b/content/zh/docs/Developerguide/\345\256\241\350\256\241\345\274\200\345\205\263.md" new file mode 100644 index 000000000..7525c863d --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\241\350\256\241\345\274\200\345\205\263.md" @@ -0,0 +1,107 @@ +# 审计开关 + +## audit\_enabled + +**参数说明:**控制审计进程的开启和关闭。审计进程开启后,将从管道读取后台进程写入的审计信息,并写入审计文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示启动审计功能。 +- off表示关闭审计功能。 + +**默认值:**on + +## audit\_directory + +**参数说明:**审计文件的存储目录。一个相对于数据目录data的路径,可自行指定。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**pg\_audit。如果使用om工具部署openGauss,则审计日志路径为“$GAUSSLOG/pg\_audit/实例名称”。 + +## audit\_data\_format + +**参数说明:**审计日志文件的格式。当前仅支持二进制格式。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**binary + +## audit\_rotation\_interval + +**参数说明**:指定创建一个新审计日志文件的时间间隔。当现在的时间减去上次创建一个审计日志的时间超过了此参数值时,服务器将生成一个新的审计日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~INT\_MAX/60,单位为min。 + +**默认值**:1d + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请不要随意调整此参数,否侧可能会导致audit\_resource\_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用[audit\_resource\_policy](#zh-cn_topic_0237124745_section939915522551)、[audit\_space\_limit](#zh-cn_topic_0237124745_zh-cn_topic_0059777744_s167d5900250946bca199444c0617c714)和[audit\_file\_remain\_time](#zh-cn_topic_0237124745_section149961828185211)参数进行控制。 + +## audit\_rotation\_size + +**参数说明**:指定审计日志文件的最大容量。当审计日志消息的总量超过此参数值时,服务器将生成一个新的审计日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1024\~1048576,单位为KB。 + +**默认值**:10MB + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请不要随意调整此参数,否侧可能会导致audit\_resource\_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit\_resource\_policy、audit\_space\_limit和audit\_file\_remain\_time参数进行控制。 + +## audit\_resource\_policy + +**参数说明**:控制审计日志的保存策略,以空间还是时间限制为优先策略。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示采用空间优先策略,最多存储[audit\_space\_limit](#zh-cn_topic_0237124745_zh-cn_topic_0059777744_s167d5900250946bca199444c0617c714)大小的日志。 +- off表示采用时间优先策略,最少存储[audit\_file\_remain\_time](#zh-cn_topic_0237124745_section149961828185211)长度时间的日志。 + +**默认值:**on + +## audit\_file\_remain\_time + +**参数说明**:表示需记录审计日志的最短时间要求,该参数在[audit\_resource\_policy](#zh-cn_topic_0237124745_section939915522551)为off时生效。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~730,单位为day,0表示无时间限制。 + +**默认值**:90 + +## audit\_space\_limit + +**参数说明:**审计文件占用的磁盘空间总量。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024KB\~1024GB,单位为KB。 + +**默认值:**1GB + +## audit\_file\_remain\_threshold + +**参数说明:**审计目录下审计文件个数的最大值。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1\~1048576 + +**默认值:**1048576 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请尽量保证此参数为1048576,并不要随意调整此参数,否则可能会导致audit\_resource\_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit\_resource\_policy、audit\_space\_limit和audit\_file\_remain\_time参数进行控制。 + 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" new file mode 100644 index 000000000..5b457ed00 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\241\350\256\241\346\246\202\350\277\260.md" @@ -0,0 +1,471 @@ +# 审计概述 + +## 背景信息 + +数据库安全对数据库系统来说至关重要。openGauss将用户对数据库的所有操作写入审计日志。数据库安全管理员可以利用这些日志信息,重现导致数据库现状的一系列事件,找出非法操作的用户、时间和内容等。 + +关于审计功能,用户需要了解以下几点内容: + +- 审计总开关[audit\_enabled](审计开关.md#zh-cn_topic_0237124745_zh-cn_topic_0059777744_sb3d1b703f24c49f096b36087a60fdfcd)支持动态加载。在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。默认值为on,表示开启审计功能。 +- 除了审计总开关,各个审计项也有对应的开关。只有开关开启,对应的审计功能才能生效。 +- 各审计项的开关支持动态加载。在数据库运行期间修改审计开关的值,不需要重启数据库便可生效。 + +目前,openGauss支持以下审计项如[表1](#zh-cn_topic_0237121112_zh-cn_topic_0059778562_t126500e4696c4a9fadb15d0437679eb0)所示。 + +**表 1** 配置审计项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置项

+

描述

+

用户登录、注销审计

+

参数:audit_login_logout

+

默认值为7,表示开启用户登录、退出的审计功能。设置为0表示关闭用户登录、退出的审计功能。不推荐设置除0和7之外的值。

+

数据库启动、停止、恢复和切换审计

+

参数:audit_database_process

+

默认值为1,表示开启数据库启动、停止、恢复和切换的审计功能。

+

用户锁定和解锁审计

+

参数:audit_user_locked

+

默认值为1,表示开启审计用户锁定和解锁功能。

+

用户访问越权审计

+

参数:audit_user_violation

+

默认值为0,表示关闭用户越权操作审计功能。

+

授权和回收权限审计

+

参数:audit_grant_revoke

+

默认值为1,表示开启审计用户权限授予和回收功能。

+

数据库对象的CREATE,ALTER,DROP操作审计

+

参数:audit_system_object

+

默认值为12295,表示只对DATABASE、SCHEMA、USER、DATA SOURCE、NODE GROUP这五类数据库对象的CREATE、ALTER、DROP操作进行审计。

+

具体表的INSERT、UPDATE和DELETE操作审计

+

参数:audit_dml_state

+

默认值为0,表示关闭具体表的DML操作(SELECT除外)审计功能。

+

SELECT操作审计

+

参数:audit_dml_state_select

+

默认值为0,表示关闭SELECT操作审计功能。

+

COPY审计

+

参数:audit_copy_exec

+

默认值为0,表示关闭copy操作审计功能。

+

存储过程和自定义函数的执行审计

+

参数:audit_function_exec

+

默认值为0,表示不记录存储过程和自定义函数的执行审计日志。

+

SET审计

+

参数:audit_set_parameter

+

默认值为1,表示记录set操作审计日志

+
+ +安全相关参数及默认值请参见[表2](#zh-cn_topic_0237121112_zh-cn_topic_0059778562_t62477343f6ff4b3592c6ae8d040bc607)。 + +**表 2** 安全相关参数及默认值 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

默认值

+

说明

+

ssl

+

on

+

指定是否启用SSL连接。

+

require_ssl

+

off

+

指定服务器端是否强制要求SSL连接。

+

ssl_ciphers

+

ALL

+

指定SSL支持的加密算法列表。

+

ssl_cert_file

+

server.crt

+

指定包含SSL服务器证书的文件的名称。

+

ssl_key_file

+

server.key

+

指定包含SSL私钥的文件名称。

+

ssl_ca_file

+

cacert.pem

+

指定包含CA信息的文件的名称。

+

ssl_crl_file

+

NULL

+

指定包含CRL信息的文件的名称。

+

password_policy

+

1

+

指定是否进行密码复杂度检查。

+

password_reuse_time

+

60

+

指定是否对新密码进行可重用天数检查。

+

password_reuse_max

+

0

+

指定是否对新密码进行可重用次数检查。

+

password_lock_time

+

1

+

指定帐户被锁定后自动解锁的时间。

+

failed_login_attempts

+

10

+

如果输入密码错误的次数达到此参数值时,当前帐户被锁定。

+

password_encryption_type

+

2

+

指定采用何种加密方式对用户密码进行加密存储。

+

password_min_uppercase

+

0

+

密码中至少需要包含大写字母的个数。

+

password_min_lowercase

+

0

+

密码中至少需要包含小写字母的个数。

+

password_min_digital

+

0

+

密码中至少需要包含数字的个数。

+

password_min_special

+

0

+

密码中至少需要包含特殊字符的个数。

+

password_min_length

+

8

+

密码的最小长度。

+
说明:

在设置此参数时,请将其设置成不大于password_max_length,否则进行涉及密码的操作会一直出现密码长度错误的提示

+
+

password_max_length

+

32

+

密码的最大长度。

+
说明:

在设置此参数时,请将其设置成不小于password_min_length,否则进行涉及密码的操作会一直出现密码长度错误的提示。

+
+

password_effect_time

+

90

+

密码的有效期限。

+

password_notify_time

+

7

+

密码到期提醒的天数。

+

audit_enabled

+

on

+

控制审计进程的开启和关闭。

+

audit_directory

+

pg_audit

+

审计文件的存储目录。

+

audit_data_format

+

binary

+

审计日志文件的格式,当前仅支持二进制格式(binary)。

+

audit_rotation_interval

+

1d

+

指定创建一个新审计日志文件的时间间隔。当现在的时间减去上次创建一个审计日志的时间超过了此参数值时,服务器将生成一个新的审计日志文件。

+

audit_rotation_size

+

10MB

+

指定审计日志文件的最大容量。当审计日志消息的总量超过此参数值时,服务器将生成一个新的审计日志文件。

+

audit_resource_policy

+

on

+

控制审计日志的保存策略,以空间还是时间限制为优先策略,on表示以空间为优先策略。

+

audit_file_remain_time

+

90

+

表示需记录审计日志的最短时间要求,该参数在audit_resource_policy为off时生效。

+

audit_space_limit

+

1GB

+

审计文件占用磁盘空间的最大值。

+

audit_file_remain_threshold

+

1048576

+

审计目录下审计文件的最大数量。

+

audit_login_logout

+

7

+

指定是否审计数据库用户的登录(包括登录成功和登录失败)、注销。

+

audit_database_process

+

1

+

指定是否审计数据库启动、停止、切换和恢复的操作。

+

audit_user_locked

+

1

+

指定是否审计数据库用户的锁定和解锁。

+

audit_user_violation

+

0

+

指定是否审计数据库用户的越权访问操作。

+

audit_grant_revoke

+

1

+

指定是否审计数据库用户权限授予和回收的操作。

+

audit_system_object

+

12295

+

指定是否审计数据库对象的CREATE、DROP、ALTER操作。

+

audit_dml_state

+

0

+

指定是否审计具体表的INSERT、UPDATE、DELETE操作。

+

audit_dml_state_select

+

0

+

指定是否审计SELECT操作。

+

audit_copy_exec

+

0

+

指定是否审计COPY操作。

+

audit_function_exec

+

0

+

指定在执行存储过程、匿名块或自定义函数(不包括系统自带函数)时是否记录审计信息。

+

audit_set_parameter

+

1

+

指定是否审计SET操作。

+

enableSeparationOfDuty

+

off

+

指定是否开启三权分立。

+

session_timeout

+

10min

+

建立连接会话后,如果超过此参数的设置时间,则会自动断开连接。

+

auth_iteration_count

+

10000

+

认证加密信息生成过程中使用的迭代次数。

+
+ +## 操作步骤 + +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. 检查审计总开关状态。 + 1. 用show命令显示审计总开关audit\_enabled的值。 + + ``` + postgres=# SHOW audit_enabled; + ``` + + 如果显示为off,执行“\\q”命令退出数据库。 + + 2. 执行如下命令开启审计功能,参数设置立即生效。 + + ``` + gs_guc set -Z coordinator -Z datanode -N all -I all -c "audit_enabled=on" + ``` + +4. 配置具体的审计项。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 只有开启审计功能,用户的操作才会被记录到审计文件中。 + >- 各审计项的默认参数都符合安全标准,用户可以根据需要开启其他审计功能,但会对性能有一定影响。 + + 以开启对数据库所有对象的增删改操作的审计开关为例,其他配置项的修改方法与此相同,修改配置项的方法如下所示: + + ``` + gs_guc reload -Z coordinator -Z datanode -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" new file mode 100644 index 000000000..662972982 --- /dev/null +++ "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" @@ -0,0 +1,15 @@ +# 客户端接入认证 + +- **[配置客户端接入认证](配置客户端接入认证-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" new file mode 100644 index 000000000..b135d09a8 --- /dev/null +++ "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" @@ -0,0 +1,15 @@ +# 客户端接入认证 + +- **[配置客户端接入认证](配置客户端接入认证.md)** + +- **[配置文件参考](配置文件参考.md)** + +- **[用SSL进行安全的TCP/IP连接](用SSL进行安全的TCP-IP连接.md)** + +- **[用SSH隧道进行安全的TCP/IP连接](用SSH隧道进行安全的TCP-IP连接.md)** + +- **[查看数据库连接数](查看数据库连接数.md)** + +- **[SSL证书管理](SSL证书管理.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" "b/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" new file mode 100644 index 000000000..66d74d907 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245\347\274\272\347\234\201\350\256\276\347\275\256.md" @@ -0,0 +1,9 @@ +# 客户端连接缺省设置 + +- **[语句行为](语句行为.md)** + +- **[区域和格式化](区域和格式化.md)** + +- **[其他缺省](其他缺省.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\256\271\351\224\231\346\200\247.md" "b/content/zh/docs/Developerguide/\345\256\271\351\224\231\346\200\247.md" new file mode 100644 index 000000000..0c844b250 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\256\271\351\224\231\346\200\247.md" @@ -0,0 +1,99 @@ +# 容错性 + +当数据库系统发生错误时,以下参数控制服务器处理错误的方式。 + +## exit\_on\_error + +**参数说明:**控制终止会话。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示任何错误都会终止当前的会话。 +- off表示只有FATAL级别的错误才会终止会话。 + +**默认值:**off + +## restart\_after\_crash + +**参数说明:**设置为on,后端进程崩溃时,openGauss将自动重新初始化此后端进程。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示能够最大限度地提高数据库的可用性。 + + 在某些情况(比如当采用管理工具(例如xCAT)管理openGauss时),能够最大限度地提高数据库的可用性。 + +- off表示能够使得管理工具在后端进程崩溃时获取控制权并采取适当的措施进行处理。 + +**默认值:**on + +## omit\_encoding\_error + +**参数说明:**设置为on,数据库的客户端字符集编码为UTF-8时,出现的字符编码转换错误将打印在日志中,有转换错误的被转换字符会被忽略,以"?"代替。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示有转换错误的字符将被忽略,以"?"代替,打印错误信息到日志中。 +- off表示有转换错误的字符不能被转换,打印错误信息到终端。 + +**默认值:**off + +## max\_query\_retry\_times + +**参数说明:**指定SQL语句出错自动重试功能的最大重跑次数(目前支持重跑的错误类型为“Connection reset by peer”、“Lock wait timeout”和“Connection timed out”等),设定为0时关闭重跑功能。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0\~20。 + +**默认值:**0 + +## cn\_send\_buffer\_size + +**参数说明:**指定数据库主节点发送数据缓存区的大小。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,8\~128, 单位为KB。 + +**默认值:**8KB + +## max\_cn\_temp\_file\_size + +**参数说明:**指定SQL语句出错自动重试功能中数据库主节点端使用临时文件的最大值,设定为0表示不使用临时文件。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0\~10485760, 单位为KB。 + +**默认值:**5GB + +## retry\_ecode\_list + +**参数说明:**指定SQL语句出错自动重试功能支持的错误类型列表。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值:**YY001 YY002 YY003 YY004 YY005 YY006 YY007 YY008 YY009 YY010 YY011 YY012 YY013 YY014 YY015 53200 08006 08000 57P01 XX003 XX009 YY016 + +## data\_sync\_retry + +**参数说明:**控制当fsync到磁盘失败后是否继续运行数据库。由于在某些操作系统的场景下,fsync失败后重试阶段即使再次fsync失败也不会报错,从而导致数据丢失。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示当fsync同步到磁盘失败后采取重试机制,数据库继续运行。 +- off表示当fsync同步到磁盘失败后直接报panic,停止数据库。 + +**默认值:**off + diff --git "a/content/zh/docs/Developerguide/\345\257\271\350\241\250\346\211\247\350\241\214VACUUM.md" "b/content/zh/docs/Developerguide/\345\257\271\350\241\250\346\211\247\350\241\214VACUUM.md" new file mode 100644 index 000000000..761d7f6e6 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\271\350\241\250\346\211\247\350\241\214VACUUM.md" @@ -0,0 +1,17 @@ +# 对表执行VACUUM + +如果导入过程中,进行了大量的更新或删除行时,应运行VACUUM FULL命令,然后运行ANALYZE命令。大量的更新和删除操作,会产生大量的磁盘页面碎片,从而逐渐降低查询的效率。VACUUM FULL可以将磁盘页面碎片恢复并交还操作系统。 + +1. 对表执行VACUUM FULL。 + + 以表product\_info为例,VACUUM FULL命令如下: + + ``` + postgres=# VACUUM FULL product_info + ``` + + ``` + VACUUM + ``` + + diff --git "a/content/zh/docs/Developerguide/\345\257\271\350\261\241\346\240\207\350\257\206\347\254\246\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\345\257\271\350\261\241\346\240\207\350\257\206\347\254\246\347\261\273\345\236\213.md" new file mode 100644 index 000000000..4c2687982 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\271\350\261\241\346\240\207\350\257\206\347\254\246\347\261\273\345\236\213.md" @@ -0,0 +1,191 @@ +# 对象标识符类型 + +openGauss在内部使用对象标识符(OID)作为各种系统表的主键。系统不会给用户创建的表增加一个OID系统字段,OID类型代表一个对象标识符。 + +目前OID类型用一个四字节的无符号整数实现。因此不建议在创建的表中使用OID字段做主键。 + +**表 1** 对象标识符类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

引用

+

描述

+

示例

+

OID

+

-

+

数字化的对象标识符。

+

564182

+

CID

+

-

+

命令标识符。它是系统字段cmin和cmax的数据类型。命令标识符是32位的量。

+

-

+

XID

+

-

+

事务标识符。它是系统字段xmin和xmax的数据类型。事务标识符也是32位的量。

+

-

+

TID

+

-

+

行标识符。它是系统表字段ctid的数据类型。行ID是一对数值(块号,块内的行索引),它标识该行在其所在表内的物理位置。

+

-

+

REGCONFIG

+

pg_ts_config

+

文本搜索配置。

+

english

+

REGDICTIONARY

+

pg_ts_dict

+

文本搜索字典。

+

simple

+

REGOPER

+

pg_operator

+

操作符名。

+

-

+

REGOPERATOR

+

pg_operator

+

带参数类型的操作符。

+

*(integer,integer)或-(NONE,integer)

+

REGPROC

+

pg_proc

+

函数名称。

+

sum

+

REGPROCEDURE

+

pg_proc

+

带参数类型的函数。

+

sum(int4)

+

REGCLASS

+

pg_class

+

关系名。

+

pg_type

+

REGTYPE

+

pg_type

+

数据类型名。

+

integer

+
+ +OID类型:主要作为数据库系统表中字段使用。 + +示例: + +``` +postgres=# SELECT oid FROM pg_class WHERE relname = 'pg_type'; + oid +------ + 1247 +(1 row) +``` + +OID别名类型REGCLASS:主要用于对象OID值的简化查找。 + +示例: + +``` +postgres=# SELECT attrelid,attname,atttypid,attstattarget FROM pg_attribute WHERE attrelid = 'pg_type'::REGCLASS; + attrelid | attname | atttypid | attstattarget +----------+------------+----------+--------------- + 1247 | xc_node_id | 23 | 0 + 1247 | tableoid | 26 | 0 + 1247 | cmax | 29 | 0 + 1247 | xmax | 28 | 0 + 1247 | cmin | 29 | 0 + 1247 | xmin | 28 | 0 + 1247 | oid | 26 | 0 + 1247 | ctid | 27 | 0 + 1247 | typname | 19 | -1 + 1247 | typnamespace | 26 | -1 + 1247 | typowner | 26 | -1 + 1247 | typlen | 21 | -1 + 1247 | typbyval | 16 | -1 + 1247 | typtype | 18 | -1 + 1247 | typcategory | 18 | -1 + 1247 | typispreferred | 16 | -1 + 1247 | typisdefined | 16 | -1 + 1247 | typdelim | 18 | -1 + 1247 | typrelid | 26 | -1 + 1247 | typelem | 26 | -1 + 1247 | typarray | 26 | -1 + 1247 | typinput | 24 | -1 + 1247 | typoutput | 24 | -1 + 1247 | typreceive | 24 | -1 + 1247 | typsend | 24 | -1 + 1247 | typmodin | 24 | -1 + 1247 | typmodout | 24 | -1 + 1247 | typanalyze | 24 | -1 + 1247 | typalign | 18 | -1 + 1247 | typstorage | 18 | -1 + 1247 | typnotnull | 16 | -1 + 1247 | typbasetype | 26 | -1 + 1247 | typtypmod | 23 | -1 + 1247 | typndims | 23 | -1 + 1247 | typcollation | 26 | -1 + 1247 | typdefaultbin | 194 | -1 + 1247 | typdefault | 25 | -1 + 1247 | typacl | 1034 | -1 +(38 rows) +``` + 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" new file mode 100644 index 000000000..5aef9d375 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\205\245\346\225\260\346\215\256.md" @@ -0,0 +1,53 @@ +# 导入数据 + +openGauss提供了灵活的数据入库方式:INSERT、COPY以及gsql元命令\\copy。各方式具有不同的特点,具体请参见[表1](#zh-cn_topic_0237121116_table59418455192145)。 + +**表 1** 导入方式特点说明 + + + + + + + + + + + + + + + + +

方式

+

特点

+

INSERT

+

通过INSERT语句插入一行或多行数据,及从指定表插入数据。

+

COPY

+

通过COPY FROM STDIN语句直接向openGauss写入数据。

+

通过JDBC驱动的CopyManager接口从其他数据库向openGauss写入数据时,具有业务数据无需落地成文件的优势。

+

gsql工具的元命令\copy

+

与直接使用SQL语句COPY不同,该命令读取/写入的文件只能是gsql客户端所在机器上的本地文件。

+
说明:

\COPY只适合小批量、格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。导入数据应优先选择COPY。

+
+
+ +- **[通过INSERT语句直接写入数据](通过INSERT语句直接写入数据.md)** + +- **[使用COPY FROM STDIN导入数据](使用COPY-FROM-STDIN导入数据.md)** + +- **[使用gsql元命令导入数据](使用gsql元命令导入数据.md)** + +- **[使用gs\_restore命令导入数据](使用gs_restore命令导入数据.md)** + +- **[更新表中数据](更新表中数据-11.md)** + +- **[深层复制](深层复制.md)** + +- **[分析表](分析表.md)** + +- **[对表执行VACUUM](对表执行VACUUM.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" new file mode 100644 index 000000000..e43e30732 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\205\250\345\261\200\345\257\271\350\261\241.md" @@ -0,0 +1,92 @@ +# 导出全局对象 + +openGauss支持使用gs\_dumpall工具导出所有数据库公共的全局对象,包含数据库用户和组,表空间及属性(例如:适用于数据库整体的访问权限)信息。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_dumpall导出表空间对象信息。 + + ``` + gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_tablespace.sql -p 8000 -t + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名,需要是openGauss管理员用户。

+

-U omm

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项;
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-f

+

将导出文件发送至指定目录文件夹。如果这里省略,则使用标准输出。

+

-f /home/omm/backup/MPPDB_tablespace.sql

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+

-t

+

或者--tablespaces-only,只转储表空间,不转储数据库或角色。

+

-

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_dumpall”章节。 + + +## 示例 + +示例一:执行gs\_dumpall,导出所有数据库的公共全局表空间信息和用户信息(omm用户为管理员用户),导出文件为文本格式。 + +``` +gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_globals.sql -p 8000 -g +gs_dumpall[port='8000'][2018-11-14 19:06:24]: dumpall operation successful +gs_dumpall[port='8000'][2018-11-14 19:06:24]: total time: 1150 ms +``` + +示例二: 执行gs\_dumpall,导出所有数据库的公共全局表空间信息(omm用户为管理员用户),并对导出文件进行加密,导出文件为文本格式。 + +``` +gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_tablespace.sql -p 8000 -t --with-encryption AES128 --with-key 1212121212121212 +gs_dumpall[port='8000'][2018-11-14 19:00:58]: dumpall operation successful +gs_dumpall[port='8000'][2018-11-14 19:00:58]: total time: 186 ms +``` + +示例三:执行gs\_dumpall,导出所有数据库的公共全局用户信息(omm用户为管理员用户),导出文件为文本格式。 + +``` +gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_user.sql -p 8000 -r +gs_dumpall[port='8000'][2018-11-14 19:03:18]: dumpall operation successful +gs_dumpall[port='8000'][2018-11-14 19:03:18]: total time: 162 ms +``` + diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\215\225\344\270\252\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\215\225\344\270\252\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..f63171552 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\345\215\225\344\270\252\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,9 @@ +# 导出单个数据库 + +- **[导出数据库](导出数据库.md)** + +- **[导出模式](导出模式.md)** + +- **[导出表](导出表.md)** + + 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-13.md" new file mode 100644 index 000000000..6efccec95 --- /dev/null +++ "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-13.md" @@ -0,0 +1,95 @@ +# 导出所有数据库 + +openGauss支持使用gs\_dumpall工具导出所有数据库的全量信息,包含openGauss中每个数据库信息和公共的全局对象信息。可根据需要自定义导出如下信息: + +- 导出所有数据库全量信息,包含openGauss中每个数据库信息和公共的全局对象信息(包含角色和表空间信息)。 + + 使用导出的全量信息可以创建与openGauss相同的一个openGauss,拥有相同数据库和公共全局对象,且库中数据也与当前各库相同。 + +- 仅导出数据,即导出每个数据库中的数据,且不包含所有对象定义和公共的全局对象信息。 +- 仅导出所有对象定义,包括:表空间、库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。 + + 使用导出的对象定义,可以快速创建与openGauss相同的一个openGauss,拥有相同的数据库和表空间,但是库中并无原数据库的数据。 + + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_dumpall一次导出所有数据库信息。 + + ``` + gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_backup.sql -p 8000 + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名,需要是openGauss管理员用户。

+

-U omm

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项;
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-f

+

将导出文件发送至指定目录文件夹。如果这里省略,则使用标准输出。

+

-f /home/omm/backup/MPPDB_backup.sql

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_dumpall”章节。 + + +## 示例 + +示例一:执行gs\_dumpall,导出所有数据库全量信息(omm用户为管理员用户),导出文件为文本格式。执行命令后,会有很长的打印信息,最终出现total time即代表执行成功。示例中将不体现中间的打印信息。 + +``` +gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_backup.sql -p 8000 +gs_dumpall[port='8000'][2017-07-21 15:57:31]: dumpall operation successful +gs_dumpall[port='8000'][2017-07-21 15:57:31]: total time: 9627 ms +``` + +示例二:执行gs\_dumpall,仅导出所有数据库定义(omm用户为管理员用户),导出文件为文本格式。执行命令后,会有很长的打印信息,最终出现total time即代表执行成功。示例中将不体现中间的打印信息。 + +``` +gs_dumpall -W Bigdata@123 -U omm -f /home/omm/backup/MPPDB_backup.sql -p 8000 -s +gs_dumpall[port='8000'][2018-11-14 11:28:14]: dumpall operation successful +gs_dumpall[port='8000'][2018-11-14 11:28:14]: total time: 4147 ms +``` + +示例三:执行gs\_dumpall,仅导出所有数据库中数据,并对导出文件进行加密,导出文件为文本格式。执行命令后,会有很长的打印信息,最终出现total time即代表执行成功。示例中将不体现中间的打印信息。 + +``` +gs_dumpall -f /home/omm/backup/MPPDB_backup.sql -p 8000 -a --with-encryption AES128 --with-key 1234567812345678 +gs_dumpall[port='8000'][2018-11-14 11:32:26]: dumpall operation successful +gs_dumpall[port='8000'][2018-11-14 11:23:26]: total time: 4147 ms +``` + 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" new file mode 100644 index 000000000..d8708a75f --- /dev/null +++ "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" @@ -0,0 +1,7 @@ +# 导出所有数据库 + +- **[导出所有数据库](导出所有数据库-13.md)** + +- **[导出全局对象](导出全局对象.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256.md" new file mode 100644 index 000000000..2a61741b4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256.md" @@ -0,0 +1,5 @@ +# 导出数据 + +- **[使用gs\_dump和gs\_dumpall命令导出数据](使用gs_dump和gs_dumpall命令导出数据.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..c313a18b7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,129 @@ +# 导出数据库 + +openGauss支持使用gs\_dump工具导出某个数据库级的内容,包含数据库的数据和所有对象定义。可根据需要自定义导出如下信息: + +- 导出数据库全量信息,包含数据和所有对象定义。 + + 使用导出的全量信息可以创建一个与当前库相同的数据库,且库中数据也与当前库相同。 + +- 仅导出所有对象定义,包括:库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。 + + 使用导出的对象定义,可以快速创建一个相同的数据库,但是库中并无原数据库的数据。 + +- 仅导出数据,不包含所有对象定义。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_dump导出postgres数据库。 + + ``` + gs_dump -W Bigdata@123 -U jack -f /home/omm/backup/postgres_backup.tar -p 8000 postgres -F t + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名。

+
说明:

不指定连接数据库的用户名时,默认以安装时创建的初始系统管理员连接。

+
+

-U jack

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项;
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-f

+

将导出文件发送至指定目录文件夹。如果这里省略,则使用标准输出。

+

-f /home/omm/backup/postgres_backup.tar

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+

dbname

+

需要导出的数据库名称

+

postgres

+

-F

+

选择导出文件格式。-F参数值如下:

+
  • p:纯文本格式
  • c:自定义归档
  • d:目录归档格式
  • t:tar归档格式
+

-F t

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_dump”章节。 + + +## 示例 + +示例一:执行gs\_dump,导出postgres数据库全量信息,并对导出文件进行压缩,导出文件格式为sql文本格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/postgres_backup.sql -p 8000 postgres -Z 8 -F p +gs_dump[port='8000'][postgres][2017-07-21 15:36:13]: dump database postgres successfully +gs_dump[port='8000'][postgres][2017-07-21 15:36:13]: total time: 3793 ms +``` + +示例二:执行gs\_dump,仅导出postgres数据库中的数据,不包含数据库对象定义,导出文件格式为自定义归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/postgres_data_backup.dmp -p 8000 postgres -a -F c +gs_dump[port='8000'][postgres][2017-07-21 15:36:13]: dump database postgres successfully +gs_dump[port='8000'][postgres][2017-07-21 15:36:13]: total time: 3793 ms +``` + +示例三:执行gs\_dump,仅导出postgres数据库所有对象的定义,导出文件格式为sql文本格式。 + +``` +--导出前,表nation有数据 +postgres=# select n_nationkey,n_name,n_regionkey from nation limit 3; + n_nationkey | n_name | n_regionkey +-------------+---------------------------+------------- + 0 | ALGERIA | 0 + 3 | CANADA | 1 + 11 | IRAQ | 4 +(3 rows) + +gs_dump -W Bigdata@123 -f /home/omm/backup/postgres_def_backup.sql -p 8000 postgres -s -F p +gs_dump[port='8000'][postgres][2017-07-20 15:04:14]: dump database postgres successfully +gs_dump[port='8000'][postgres][2017-07-20 15:04:14]: total time: 472 ms +``` + +示例四:执行gs\_dump,仅导出postgres数据库的所有对象的定义,导出文件格式为文本格式,并对导出文件进行加密。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/postgres_def_backup.sql -p 8000 postgres --with-encryption AES128 --with-key 1234567812345678 -s -F p +gs_dump[port='8000'][postgres][2018-11-14 11:25:18]: dump database postgres successfully +gs_dump[port='8000'][postgres][2018-11-14 11:25:18]: total time: 1161 ms +``` + diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\250\241\345\274\217.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\250\241\345\274\217.md" new file mode 100644 index 000000000..69f611cb4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\346\250\241\345\274\217.md" @@ -0,0 +1,144 @@ +# 导出模式 + +openGauss目前支持使用gs\_dump工具导出模式级的内容,包含模式的数据和定义。用户可通过灵活的自定义方式导出模式内容,不仅支持选定一个模式或多个模式的导出,还支持排除一个模式或者多个模式的导出。可根据需要自定义导出如下信息: + +- 导出模式全量信息,包含数据和对象定义。 +- 仅导出数据,即模式包含表中的数据,不包含对象定义。 +- 仅导出模式对象定义,包括:表定义、存储过程定义和索引定义等。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_dump同时导出hr和public模式。 + + ``` + gs_dump -W Bigdata@123 -U jack -f /home/omm/backup/MPPDB_schema_backup -p 8000 human_resource -n hr -F d + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名。

+

-U jack

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项。
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-f

+

将导出文件发送至指定目录文件夹。如果这里省略,则使用标准输出。

+

-f /home/omm/backup/MPPDB_schema_backup

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+

dbname

+

需要导出的数据库名称

+

human_resource

+

-n

+

只导出与模式名称匹配的模式,此选项包括模式本身和所有它包含的对象。

+
  • 单个模式:-n schemaname
  • 多个模式:多次输入-n schemaname
+
  • 单个模式:-n hr
  • 多个模式:-n hr -n public
+

-F

+

选择导出文件格式。-F参数值如下:

+
  • p:纯文本格式
  • c:自定义归档
  • d:目录归档格式
  • t:tar归档格式
+

-F d

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_dump”章节。 + + +## 示例 + +示例一:执行gs\_dump,导出hr模式全量信息,并对导出文件进行压缩,导出文件格式为文本格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_schema_backup.sql -p 8000 human_resource -n hr -Z 6 -F p +gs_dump[port='8000'][human_resource][2017-07-21 16:05:55]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 16:05:55]: total time: 2425 ms +``` + +示例二:执行gs\_dump,仅导出hr模式的数据,导出文件格式为tar归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_schema_data_backup.tar -p 8000 human_resource -n hr -a -F t +gs_dump[port='8000'][human_resource][2018-11-14 15:07:16]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2018-11-14 15:07:16]: total time: 1865 ms +``` + +示例三:执行gs\_dump,仅导出hr模式的定义,导出文件格式为目录归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_schema_def_backup -p 8000 human_resource -n hr -s -F d +gs_dump[port='8000'][human_resource][2018-11-14 15:11:34]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2018-11-14 15:11:34]: total time: 1652 ms +``` + +示例四:执行gs\_dump,导出human\_resource数据库时,排除hr模式,导出文件格式为自定义归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_schema_backup.dmp -p 8000 human_resource -N hr -F c +gs_dump[port='8000'][human_resource][2017-07-21 16:06:31]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 16:06:31]: total time: 2522 ms +``` + +示例五:执行gs\_dump,同时导出hr和public模式,且仅导出模式定义,并对导出文件进行加密,导出文件格式为tar归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_schema_backup1.tar -p 8000 human_resource -n hr -n public -s --with-encryption AES128 --with-key 1234567812345678 -F t +gs_dump[port='8000'][human_resource][2017-07-21 16:07:16]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 16:07:16]: total time: 2132 ms +``` + +示例六:执行gs\_dump,导出human\_resource数据库时,排除hr和public模式,导出文件格式为自定义归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_schema_backup2.dmp -p 8000 human_resource -N hr -N public -F c +gs_dump[port='8000'][human_resource][2017-07-21 16:07:55]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 16:07:55]: total time: 2296 ms +``` + +示例七:执行gs\_dump,导出public模式下所有表(视图、序列和外表)和hr模式中staffs表,包含数据和表定义,导出文件格式为自定义归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_backup3.dmp -p 8000 human_resource -t public.* -t hr.staffs -F c +gs_dump[port='8000'][human_resource][2018-12-13 09:40:24]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2018-12-13 09:40:24]: total time: 896 ms +``` + diff --git "a/content/zh/docs/Developerguide/\345\257\274\345\207\272\350\241\250.md" "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\350\241\250.md" new file mode 100644 index 000000000..0c43719a3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\257\274\345\207\272\350\241\250.md" @@ -0,0 +1,168 @@ +# 导出表 + +openGauss支持使用gs\_dump工具导出表级的内容,包含表定义和表数据。视图、序列和外表属于特殊的表。用户可通过灵活的自定义方式导出表内容,不仅支持选定一个表或多个表的导出,还支持排除一个表或者多个表的导出。可根据需要自定义导出如下信息: + +- 导出表全量信息,包含表数据和表定义。 +- 仅导出数据,不包含表定义。 +- 仅导出表定义。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_dump同时导出指定表hr.staffs和hr.employments。 + + ``` + gs_dump -W Bigdata@123 -U jack -f /home/omm/backup/MPPDB_table_backup -p 8000 human_resource -t hr.staffs -F d + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名。

+

-U jack

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项。
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-f

+

将导出文件发送至指定目录文件夹。如果这里省略,则使用标准输出。

+

-f /home/omm/backup/MPPDB_table_backup

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+

dbname

+

需要导出的数据库名称

+

human_resource

+

-t

+

指定导出的表(或视图、序列、外表),可以使用多个-t选项来选择多个表,也可以使用通配符指定多个表对象。当使用通配符指定多个表对象时,注意给pattern打引号,防止shell扩展通配符。

+
  • 单个表:-t schema.table
  • 多个表:多次输入-t schema.table
+
  • 单个表:-t hr.staffs
  • 多个表:-t hr.staffs -t hr.employments
+

-F

+

选择导出文件格式。-F参数值如下:

+
  • p:纯文本格式
  • c:自定义归档
  • d:目录归档格式
  • t:tar归档格式
+

-F d

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_dump”章节。 + + +## 示例 + +示例一:执行gs\_dump,导出表hr.staffs的定义和数据,并对导出文件进行压缩,导出文件格式为文本格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup.sql -p 8000 human_resource -t hr.staffs -Z 6 -F p +gs_dump[port='8000'][human_resource][2017-07-21 17:05:10]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 17:05:10]: total time: 3116 ms +``` + +示例二:执行gs\_dump,只导出表hr.staffs的数据,导出文件格式为tar归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_data_backup.tar -p 8000 human_resource -t hr.staffs -a -F t +gs_dump[port='8000'][human_resource][2017-07-21 17:04:26]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 17:04:26]: total time: 2570 ms +``` + +示例三:执行gs\_dump,导出表hr.staffs的定义,导出文件格式为目录归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_def_backup -p 8000 human_resource -t hr.staffs -s -F d +gs_dump[port='8000'][human_resource][2017-07-21 17:03:09]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 17:03:09]: total time: 2297 ms +``` + +示例四:执行gs\_dump,不导出表hr.staffs,导出文件格式为自定义归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup4.dmp -p 8000 human_resource -T hr.staffs -F c +gs_dump[port='8000'][human_resource][2017-07-21 17:14:11]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 17:14:11]: total time: 2450 ms +``` + +示例五:执行gs\_dump,同时导出两个表hr.staffs和hr.employments,导出文件格式为文本格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup1.sql -p 8000 human_resource -t hr.staffs -t hr.employments -F p +gs_dump[port='8000'][human_resource][2017-07-21 17:19:42]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 17:19:42]: total time: 2414 ms +``` + +示例六:执行gs\_dump,导出时,排除两个表hr.staffs和hr.employments,导出文件格式为文本格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup2.sql -p 8000 human_resource -T hr.staffs -T hr.employments -F p +gs_dump[port='8000'][human_resource][2017-07-21 17:21:02]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 17:21:02]: total time: 3165 ms +``` + +示例七:执行gs\_dump,导出表hr.staffs的定义和数据,只导出表hr.employments的定义,导出文件格式为tar归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup3.tar -p 8000 human_resource -t hr.staffs -t hr.employments --exclude-table-data hr.employments -F t +gs_dump[port='8000'][human_resource][2018-11-14 11:32:02]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2018-11-14 11:32:02]: total time: 1645 ms +``` + +示例八:执行gs\_dump,导出表hr.staffs的定义和数据,并对导出文件进行加密,导出文件格式为文本格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup4.sql -p 8000 human_resource -t hr.staffs --with-encryption AES128 --with-key 1212121212121212 -F p +gs_dump[port='8000'][human_resource][2018-11-14 11:35:30]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2018-11-14 11:35:30]: total time: 6708 ms +``` + +示例九:执行gs\_dump,导出public模式下所有表(包括视图、序列和外表)和hr模式中staffs表,包含数据和表定义,导出文件格式为自定义归档格式。 + +``` +gs_dump -W Bigdata@123 -f /home/omm/backup/MPPDB_table_backup5.dmp -p 8000 human_resource -t public.* -t hr.staffs -F c +gs_dump[port='8000'][human_resource][2018-12-13 09:40:24]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2018-12-13 09:40:24]: total time: 896 ms +``` + +示例十: 执行gs\_dump,仅导出依赖于t1模式下的test1表对象的视图信息,导出文件格式为目录归档格式。 + +``` +gs_dump -W Bigdata@123 -U jack -f /home/omm/backup/MPPDB_view_backup6 -p 8000 human_resource -t t1.test1 --include-depend-objs --exclude-self -F d +gs_dump[port='8000'][jack][2018-11-14 17:21:18]: dump database human_resource successfully +gs_dump[port='8000'][jack][2018-11-14 17:21:23]: total time: 4239 ms +``` + diff --git "a/content/zh/docs/Developerguide/\345\270\203\345\260\224\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\345\270\203\345\260\224\347\261\273\345\236\213.md" new file mode 100644 index 000000000..1c81ec78d --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\270\203\345\260\224\347\261\273\345\236\213.md" @@ -0,0 +1,72 @@ +# 布尔类型 + +**表 1** 布尔类型 + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

取值

+

BOOLEAN

+

布尔类型

+

1字节。

+
  • true:真
  • false:假
  • null:未知(unknown)
+
+ +“真”值的有效文本值是: + +TRUE、't'、'true'、'y'、'yes'、'1'。 + +“假”值的有效文本值是: + +FALSE、'f'、'false'、'n'、'no'、'0'。 + +使用TRUE和FALSE是比较规范的用法(也是SQL兼容的用法)。 + +## 示例 + +显示用字母t和f输出Boolean值。 + +``` +--创建表。 +postgres=# CREATE TABLE bool_type_t1 +( + BT_COL1 BOOLEAN, + BT_COL2 TEXT +); + +--插入数据。 +postgres=# INSERT INTO bool_type_t1 VALUES (TRUE, 'sic est'); + +postgres=# INSERT INTO bool_type_t1 VALUES (FALSE, 'non est'); + +--查看数据。 +postgres=# SELECT * FROM bool_type_t1; + bt_col1 | bt_col2 +---------+--------- + t | sic est + f | non est +(2 rows) + +postgres=# SELECT * FROM bool_type_t1 WHERE bt_col1 = 't'; + bt_col1 | bt_col2 +---------+--------- + t | sic est +(1 row) + +--删除表。 +postgres=# DROP TABLE bool_type_t1; +``` + 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" new file mode 100644 index 000000000..170ba6717 --- /dev/null +++ "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" @@ -0,0 +1,5 @@ +# 常见故障定位指南 + +- **[core问题定位](core问题定位.md)** + + 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" new file mode 100644 index 000000000..87fde7d76 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\270\270\350\247\201\351\227\256\351\242\230\345\244\204\347\220\206.md" @@ -0,0 +1,20 @@ +# 常见问题处理 + +问题:AiEngine链接失败。 + +``` +ERROR: AI engine connection failed. +CONTEXT: referenced column: model_train_opt +``` + +处理方法:检查AIEngine是否正常拉起或重启AIEngine;检查通信双方CA证书是否一致;检查模型配置信息中的ip和端口是否匹配; + +问题:模型不存在。 + +``` +ERROR: OPT_Model not found for model name XXX +CONTEXT: referenced column: track_model_train_opt +``` + +处理方法:检查[GS\_OPT\_MODEL](GS_OPT_MODEL.md)表中是否存在执行语句中“model\_name”对应的模型;使用预测功能报错时,检查模型是否已被训练; + diff --git "a/content/zh/docs/Developerguide/\345\270\270\351\207\217\344\270\216\345\256\217.md" "b/content/zh/docs/Developerguide/\345\270\270\351\207\217\344\270\216\345\256\217.md" new file mode 100644 index 000000000..2ea0519a9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\270\270\351\207\217\344\270\216\345\256\217.md" @@ -0,0 +1,113 @@ +# 常量与宏 + +openGauss支持的常量和宏请参见[表1](#zh-cn_topic_0237121963_zh-cn_topic_0059778360_zh-cn_topic_0058965862_table49126904)。 + +**表 1** 常量和宏 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

描述

+

示例

+

CURRENT_CATALOG

+

当前数据库

+
postgres=# SELECT CURRENT_CATALOG;
+current_database
+------------------
+postgres
+(1 row)
+

CURRENT_ROLE

+

当前用户

+
postgres=# SELECT CURRENT_ROLE;
+current_user
+--------------
+omm
+(1 row)
+

CURRENT_SCHEMA

+

当前数据库模式

+
postgres=# SELECT CURRENT_SCHEMA;
+current_schema
+----------------
+public
+(1 row)
+

CURRENT_USER

+

当前用户

+
postgres=# SELECT CURRENT_USER;
+current_user
+--------------
+omm
+(1 row)
+

LOCALTIMESTAMP

+

当前会话时间(无时区)

+
postgres=# SELECT LOCALTIMESTAMP;
+         timestamp
+----------------------------
+2015-10-10 15:37:30.968538
+(1 row)
+

NULL

+

空值

+

-

+

SESSION_USER

+

当前系统用户

+
postgres=# SELECT SESSION_USER;
+session_user
+--------------
+omm
+(1 row)
+

SYSDATE

+

当前系统日期

+
postgres=# SELECT SYSDATE;
+sysdate
+---------------------
+2015-10-10 15:48:53
+(1 row)
+

USER

+

当前用户,此用户为CURRENT_USER的别名。

+
postgres=# SELECT USER;
+current_user
+--------------
+omm
+(1 row)
+
+ diff --git "a/content/zh/docs/Developerguide/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" "b/content/zh/docs/Developerguide/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" new file mode 100644 index 000000000..38f985956 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\271\263\345\217\260\345\222\214\345\256\242\346\210\267\347\253\257\345\205\274\345\256\271\346\200\247.md" @@ -0,0 +1,53 @@ +# 平台和客户端兼容性 + +很多平台都使用数据库系统,数据库系统的对外兼容性给平台提供了很大的方便。 + +## transform\_null\_equals + +**参数说明:**控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。 + +- 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。 +- Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。 +- off表示不控制,即expr = NULL总是返回NULL(未知)。 + +**默认值:**off + +>![](public_sys-resources/icon-note.gif) **说明:** +>新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。 + +## support\_extended\_features + +**参数说明:**控制是否支持数据库的扩展特性。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示支持数据库的扩展特性。 +- off表示不支持数据库的扩展特性。 + +**默认值:**off + +## td\_compatible\_truncation + +**参数说明:**控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>超长字符串自动截断功能不适用于insert语句包含外表的场景。 +>如果向字符集为字节类型编码(SQL\_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示启动超长字符串自动截断功能。 +- off表示停止超长字符串自动截断功能。 + +**默认值:**off + diff --git "a/content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\344\272\213\345\212\241\347\232\204\346\275\234\345\234\250\346\255\273\351\224\201\346\203\205\345\206\265.md" "b/content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\344\272\213\345\212\241\347\232\204\346\275\234\345\234\250\346\255\273\351\224\201\346\203\205\345\206\265.md" new file mode 100644 index 000000000..2ffd6f12b --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\344\272\213\345\212\241\347\232\204\346\275\234\345\234\250\346\255\273\351\224\201\346\203\205\345\206\265.md" @@ -0,0 +1,7 @@ +# 并发写入事务的潜在死锁情况 + +只要事务涉及多个表的或者同一个表相同行的更新时,同时运行的事务就可能在同时尝试写入时变为死锁状态。事务会在提交或回滚时一次性解除其所有锁定,而不会逐一放弃锁定。 例如,假设事务T1和T2在大致相同的时间开始: + +- 如果T1开始对表A进行写入且T2开始对表B进行写入,则两个事务均可继续而不会发生冲突;但是,如果T1完成了对表A的写入操作并需要开始对表B进行写入,此时操作的行数正好与T2一致,它将无法继续,因为T2仍保持对表B对应行的锁定,此时T2开始更新表A中与T1相同的行数,此时也将无法继续,产生死锁,在锁等待超时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛错,有一个事务退出。 +- 如果T1,T2都对表A进行写入,此时T1更新1-5行的数据,T2更新6-10行的数据,两个事务不会发生冲突,但是,如果T1完成后开始对表A的6-10行数据进行更新,T2完成后开始更新1-5行的数据,此时两个事务无法继续,在锁等待超时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛错,有一个事务退出。 + diff --git "a/content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\347\244\272\344\276\213.md" "b/content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\347\244\272\344\276\213.md" new file mode 100644 index 000000000..0862a66ec --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\271\266\345\217\221\345\206\231\345\205\245\347\244\272\344\276\213.md" @@ -0,0 +1,17 @@ +# 并发写入示例 + +本章节以表test为例,分别介绍相同表的INSERT和DELETE并发,相同表的并发INSERT,相同表的并发UPDATE,以及数据导入和查询的并发的执行详情。 + +``` +CREATE TABLE test(id int, name char(50), address varchar(255)); +``` + +- **[相同表的INSERT和DELETE并发](相同表的INSERT和DELETE并发.md)** + +- **[相同表的并发INSERT](相同表的并发INSERT.md)** + +- **[相同表的并发UPDATE](相同表的并发UPDATE.md)** + +- **[数据导入和查询的并发](数据导入和查询的并发.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\271\266\350\241\214\345\257\274\345\205\245.md" "b/content/zh/docs/Developerguide/\345\271\266\350\241\214\345\257\274\345\205\245.md" new file mode 100644 index 000000000..213dd54c4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\271\266\350\241\214\345\257\274\345\205\245.md" @@ -0,0 +1,52 @@ +# 并行导入 + +openGauss提供了并行导入功能,以快速、高效地完成大量数据导入。介绍openGauss并行导入的相关参数。 + +## raise\_errors\_if\_no\_files + +**参数说明:**导入时是否区分“导入文件记录数为空”和“导入文件不存在”。raise\_errors\_if\_no\_files=TRUE,则“导入文件不存在”的时候,openGauss将抛出“文件不存在的”错误。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示导入时区分“导入文件记录数为空”和“导入文件不存在”。 +- off表示导入时不区分“导入文件记录数为空”和“导入文件不存在”。 + +**默认值:**off + +## partition\_mem\_batch + +**参数说明:**为了优化对列存分区表的批量插入,在批量插入过程中会对数据进行缓存后再批量写盘。通过partition\_mem\_batch可指定缓存个数。该值设置过大,将消耗较多系统内存资源;设置过小,将降低系统列存分区表批量插入性能。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:1\~ 65535 + +**默认值:**256 + +## partition\_max\_cache\_size + +**参数说明:**为了优化对列存分区表的批量插入,在批量插入过程中会对数据进行缓存后再批量写盘。通过partition\_max\_cache\_size可指定数据缓存区大小。该值设置过大,将消耗较多系统内存资源;设置过小,将降低列存分区表批量插入性能。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**: + +列存分区表:4096\~ INT\_MAX / 2,最小单位为KB。 + +**默认值:**2GB + +## enable\_delta\_store + +**参数说明:**为了增强列存单条数据导入的性能和解决磁盘冗余问题,可通过此参数选择是否开启支持列存delta表功能。该参数开启时,数据导入列存表,会根据表定义时指定的[DELTAROW\_THRESHOLD](CREATE-TABLE.md#zh-cn_topic_0237122117_zh-cn_topic_0059778169_lb0b5377e83534b3eac0e425f44b60166)决定数据进入delta表存储还是主表CU存储,当数据量小于DELTAROW\_THRESHOLD时,数据进入delta表。该参数影响的操作包括insert,copy,vacuum,vacuum full,vacuum deltamerge重分布等所有涉及列存表数据移动的操作。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**: + +- on表示开启列存delta表功能。 +- off表示不开启列存delta表功能。 + +**默认值:**off + 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" new file mode 100644 index 000000000..ce433220a --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243.md" @@ -0,0 +1,34 @@ +# 应用程序接口 + +用户可以使用标准的数据库应用程序接口(如ODBC和JDBC),开发基于openGauss的应用程序。 + +## 支持的应用程序接口 + +每个应用程序是一个独立的openGauss开发项目。应用程序通过API与数据库进行交互,在避免了应用程序直接操作数据库系统的同时,增强了应用程序的可移植性、扩展性和可维护性。[表1](#zh-cn_topic_0237120293_zh-cn_topic_0059777757_tc44f4815cb564ea182d5864daa2709b4)为openGauss所支持的应用程序接口及其下载地址。 + +**表 1** 数据库应用程序接口 + + + + + + + + + + + + + +

API

+

下载地址

+

ODBC

+
+

JDBC

+
  • 驱动程序:openGauss-x.x-EULER-64bit-Jdbc.tar.gz
  • 驱动类:org.postgresql.Driver
+
+ +使用JDBC和ODBC接口连接数据库属远程连接,因此需要openGauss已经做了支持[远程连接的配置](配置服务端远程连接.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" new file mode 100644 index 000000000..e78e053f1 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\274\200\345\217\221\344\272\272\345\221\230\351\200\211\351\241\271.md" @@ -0,0 +1,657 @@ +# 开发人员选项 + +## allow\_system\_table\_mods + +**参数说明:**设置是否允许修改系统表的结构。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许修改系统表的结构。 +- off表示不允许修改系统表的结构。 + +**默认值:**off + +## debug\_assertions + +**参数说明:**控制打开各种断言检查。能够协助调试,当遇到奇怪的问题或者崩溃,请把此参数打开,因为它能暴露编程的错误。要使用这个参数,必须在编译openGauss的时候定义宏USE\_ASSERT\_CHECKING(通过configure选项 --enable-cassert完成)。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开断言检查。 +- off表示不打开断言检查。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>当启用断言选项编译openGauss时,debug\_assertions缺省值为on 。 + +**默认值:**off + +## ignore\_checksum\_failure + +**参数说明: **设置读取数据时是否忽略校验信息检查失败(但仍然会告警),继续执行可能导致崩溃,传播或隐藏损坏数据,无法从远程节点恢复数据及其他严重问题。不建议用户修改设置。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示忽略数据校验错误。 +- off表示数据校验错误正常报错。 + +**默认值:**off + +## enable\_force\_vector\_engine + +**参数说明**:对于支持向量化的执行器算子,如果其子节点是非向量化的算子,通过设置此参数为on,强制生成向量化的执行计划。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值**:off + +## explain\_dna\_file + +**参数说明:**指定[explain\_perf\_mode](#zh-cn_topic_0237124743_zh-cn_topic_0059778871_s05e1286701bc4b8d9e1c0c9aecae3a0e)为run,导出的csv信息的目标文件。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这个参数的取值必须是绝对路径加上.csv格式的文件名。 + +**取值范围:**字符串 + +**默认值:**空 + +## explain\_perf\_mode + +**参数说明**:此参数用来指定explain的显示格式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:normal、pretty、summary、run + +- normal:代表使用默认的打印格式。 +- pretty:代表使用openGauss改进后的新显示格式。新的格式层次清晰,计划包含了plan node id,性能分析简单直接。 +- summary:是在pretty的基础上增加了对打印信息的分析。 +- run:在summary的基础上,将统计的信息输出到csv格式的文件中,以便于进一步分析。 + +**默认值**:pretty + +## ignore\_system\_indexes + +**参数说明:**读取系统表时忽略系统索引(但是修改系统表时依然同时修改索引)。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这个参数在从系统索引被破坏的表中恢复数据的时候非常有用。 + +**取值范围:**布尔型 + +- on表示忽略系统索引。 +- off表示不忽略系统索引。 + +**默认值:**off + +## post\_auth\_delay + +**参数说明:**在认证成功后,延迟指定时间,启动服务器连接。允许调试器附加到启动进程上。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为INT\_MAX/1000000,单位为秒。 + +**默认值:**0 + +## pre\_auth\_delay + +**参数说明:**启动服务器连接后,延迟指定时间,进行认证。允许调试器附加到认证过程上。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0~60,单位为秒。 + +**默认值:**0 + +## trace\_notify + +**参数说明:**为LISTEN和NOTIFY命令生成大量调试输出。[client\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)或[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)级别必须是DEBUG1或者更低时,才能把这些输出分别发送到客户端或者服务器日志。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开输出功能。 +- off表示关闭输出功能。 + +**默认值:**off + +## trace\_recovery\_messages + +**参数说明:**启用恢复相关调试输出的日志录,否则将不会被记录。该参数允许覆盖正常设置的[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a),但是仅限于特定的消息,这是为了在调试备机中使用。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型,有效值有debug5、debug4、debug3、debug2、debug1、log,取值的详细信息请参见[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)。 + +**默认值:**log + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 默认值log表示不影响记录决策。 +>- 除默认值外,其他值会导致优先级更高的恢复相关调试信息被记录,因为它们有log优先权。对于常见的log\_min\_messages设置,这会导致无条件地将它们记录到服务器日志上。 + +## trace\_sort + +**参数说明:**控制是否在日志中打印排序操作中的资源使用相关信息。这个选项只有在编译openGauss的时候定义了TRACE\_SORT宏的时候才可用,不过目前TRACE\_SORT是由缺省定义的。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开控制功能。 +- off表示关闭控制功能。 + +**默认值:**off + +## zero\_damaged\_pages + +**参数说明:**控制检测导致openGauss报告错误的损坏的页头,终止当前事务。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +设置为on时,会导致系统报告一个警告,把损坏的页面填充为零然后继续处理。这种行为会破坏数据,也就是所有在已经损坏页面上的行记录。但是它允许绕开坏页面然后从表中尚存的未损坏页面上继续检索数据行。因此它在因为硬件或者软件错误导致的崩溃中进行恢复是很有用的。通常不应该把它设置为on,除非不需要从崩溃的页面中恢复数据。 + +**默认值:**off + +## string\_hash\_compatible + +**参数说明:**该参数用来说明char类型和varchar/text类型的hash值计算方式是否相同,以此来判断进行分布列从char类型到相同值的varchar/text类型转换,数据分布变化时,是否需要进行重分布。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示计算方式相同,不需要进行重分布。 +- off表示计算方式不同,需要进行重分布。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>计算方式的不同主要体现在字符串计算hash值时传入的字节长度上。(如果为char,则会忽略字符串后面空格的长度,如果为text或varchar,则会保留字符串后面空格的长度。)hash值的计算会影响到查询的计算结果,因此此参数一旦设置后,在整个数据库使用过程中不能再对其进行修改,以避免查询错误。 + +**默认值:**off + +## cost\_param + +**参数说明**:该参数用于控制在特定的客户场景中,使用不同的估算方法使得估算值与真实值更接近。此参数可以同时控制多种方法,与某一方法对应的位做与操作,不为0表示该方法被选择。 + +当cost\_param & 1 不为0,表示对于求不等值连接选择率时选择一种改良机制,此方法在自连接(两个相同的表之间连接)的估算中更加准确,V300R002C00版本开始,已弃用cost\_param & 1 不为0时的路径,默认选择更优的估算公式; + +当cost\_param & 2 不为0,表示求多个过滤条件(Filter)的选择率时,选择最小的作为总的选择率,而非两者乘积,此方法在过滤条件的列之间关联性较强时估算更加准确; + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~INT\_MAX + +**默认值**:0 + +## convert\_string\_to\_digit + +**参数说明**:设置隐式转换优先级,是否优先将字符串转为数字。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示优先将字符串转为数字。 +- off表示不优先将字符串转为数字。 + +**默认值**:on + +>![](public_sys-resources/icon-notice.gif) **须知:** +>请谨慎调整该参数,调整该参数会修改内部数据类型转换规则并可能导致不可预期的行为。 + +## nls\_timestamp\_format + +**参数说明**:设置时间戳默认格式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +**默认值**:DD-Mon-YYYY HH:MI:SS.FF AM + +## remotetype + +**参数说明**:设置远程连接类型。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型,有效值有application,dbnode,gtm,gtmproxy,internaltool,gtmtool。 + +**默认值**:application + +## enable\_partitionwise + +**参数说明**:分区表连接操作是否选择智能算法。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示选择智能算法。 +- off表示不选择智能算法。 + +**默认值**:off + +## max\_function\_args + +**参数说明**:函数参数最大个数。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围**:整型 + +**默认值**:666 + +## max\_user\_defined\_exception + +**参数说明**:异常最大个数,默认值不可更改。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,当前只能取固定值1000 + +**默认值**:1000 + +## enable\_debug\_vacuum + +**参数说明:**允许输出一些与VACUUM相关的日志,便于定位VACUUM相关问题。开发人员专用,不建议普通用户使用。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启此日志开关。 +- off/false表示关闭此日志开关。 + +**默认值:**off + +## enable\_global\_stats + +**参数说明:**标识当前统计信息模式,区别采用全局统计信息收集模式还是单节点统计信息收集模式,默认创建为采用全局统计信息模式。当关闭该参数时,则默认收集openGauss第一个节点的统计信息,此时可能会影响生成查询计划的质量,但信息收集性能较优,建议客户谨慎考虑。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示全局统计信息。 +- off/false表示数据库节点统计信息。 + +**默认值:**on + +## enable\_fast\_numeric + +**参数说明:**标识是否开启Numeric类型数据运算优化。Numeric数据运算是较为耗时的操作之一,通过将Numeric转化为int64/int128类型,提高Numeric运算的性能。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启Numeric优化。 +- off/false表示关闭Numeric优化。 + +**默认值:**on + +## rewrite\_rule + +**参数说明**:标识开启的可选查询重写规则。有部分查询重写规则是可选的,开启它们并不能总是对查询效率有提升效果。在特定的客户场景中,通过此GUC参数对查询重写规则进行设置,使得查询效率最优。 + +此参数可以控制查询重写规则的组合,比如有多个重写规则:rule1、rule2、rule3、rule4。可以设置: + +``` +set rewrite_rule=rule1; --启用查询重写规则rule1 +set rewrite_rule=rule2,rule3; --启用查询重写规则rule2和rule3 +set rewrite_rule=none; --关闭所有可选查询重写规则 +``` + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串 + +- none:不使用任何可选查询重写规则 +- lazyagg:使用Lazy Agg查询重写规则(消除子查询中的聚集运算) + +**默认值**:magicset + +## enable\_compress\_spill + +**参数说明:**标识是否开启下盘压缩功能。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启下盘优化。 +- off/false表示关闭下盘优化。 + +**默认值:**on + +## analysis\_options + +**参数说明:**通过开启对应选项中所对应的功能选项使用相应的定位功能,包括数据校验,性能统计等,参见取值范围中的选项说明。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +- LLVM\_COMPILE表示在explain performance显示界面中显示每个线程的codegen编译时间。 +- HASH\_CONFLICT表示在数据库节点进程的pg\_log目录中的log日志中显示hash表的统计信息,包括hash表大小,hash链长,hash冲突情况。 +- STREAM\_DATA\_CHECK表示对网络传输前后的数据进行CRC校验。 + +**默认值:**ALL,on\(\),off\(LLVM\_COMPILE,HASH\_CONFLICT,STREAM\_DATA\_CHECK\),不开启任何定位功能。 + +## resource\_track\_log + +**参数说明**:控制自诊断的日志级别。目前仅对多列统计信息进行控制。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +- summary:显示简略的诊断信息。 +- detail:显示详细的诊断信息。 + +目前这两个参数值只在显示多列统计信息未收集的告警的情况下有差别,summary不显示未收集多列统计信息的告警,detail会显示这类告警。 + +**默认值:**summary + +## udf\_memory\_limit + +**参数说明:**控制每个数据库节点执行UDF时可用的最大物理内存量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,200\*1024~2147483647,单位为KB。 + +**默认值:**200MB + +## FencedUDFMemoryLimit + +**参数说明:**控制每个fenced udf worker进程使用的虚拟内存。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**设置建议:**不建议设置此参数,可用[udf\_memory\_limit](#zh-cn_topic_0237124743_section1765913299426)代替。 + +**取值范围:**整数,0 \~ 2147483647,单位为KB,设置可带单位(KB,MB,GB)。其中0表示不做内存控制。 + +**默认值:**0 + +## UDFWorkerMemHardLimit + +**参数说明:**控制fencedUDFMemoryLimit的最大值。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**设置建议:**不建议设置此参数,可用[udf\_memory\_limit](#zh-cn_topic_0237124743_section1765913299426)代替。 + +**取值范围:**整数,0 \~ 2147483647,单位为KB,设置时可带单位(KB,MB,GB)。 + +**默认值:**1GB + +## pljava\_vmoptions + +**参数说明**:用户自定义设置PL/Java函数所使用的JVM虚拟机的启动参数。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串, 支持: + +- JDK8 JVM启动参数(可参见JDK[官方](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html)说明) +- JDK8 JVM系统属性参数(以–D开头如–Djava.ext.dirs,可参见JDK[官方](https://docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html)说明) +- 用户自定义参数(以–D开头,如–Duser.defined.option) + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果用户在pljava\_vmoptions中设置参数不满足上述取值范围,会在使用PL/Java语言函数时报错。 + +**默认值:**空 + +## enable\_pbe\_optimization + +**参数说明**:设置优化器是否对以PBE(Parse Bind Execute)形式执行的语句进行查询计划的优化。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型。 + +- on表示优化器将优化PBE语句的查询计划。 +- off表示不使用优化。 + +**默认值**:on + +## enable\_light\_proxy + +**参数说明**:设置优化器是否对简单查询在数据库主节点上优化执行,应用端和内核端字符集不匹配时,该参数不生效,建议建库时将字符集设为UTF8。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型。 + +- on表示优化器将优化数据库主节点上简单查询的执行。 +- off表示不使用优化。 + +**默认值**:on + +## enable\_global\_plancache + +**参数说明**:设置是否对PBE查询的执行计划进行缓存共享,开启该功能可以节省高并发下数据库节点的内存使用。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型。 + +- on表示对PBE查询的执行计划进行缓存共享。 +- off表示不共享。 + +**默认值**:off + +## checkpoint\_flush\_after + +**参数说明**:设置checkpointer线程在连续写多少个磁盘页后会进行异步刷盘操作。openGauss中,磁盘页大小为8KB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~256 (0表示关闭异步刷盘功能)。例如,取值32,表示checkpointer线程连续写32个磁盘页,即32\*8=256KB磁盘空间后会进行异步刷盘。 + +**默认值**:32 + +## bgwriter\_flush\_after + +**参数说明**:设置background writer线程在连续写多少个磁盘页后会进行异步刷盘操作。openGauss中,磁盘页大小为8KB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~256 (0表示关闭异步刷盘功能),单位页面(8K)。例如,取值64,表示background writer线程连续写64个磁盘页,即64\*8=512KB磁盘空间后会进行异步刷盘。 + +**默认值**:256KB(即32个页面) + +## backend\_flush\_after + +**参数说明**:设置backend线程在连续写多少个磁盘页后会产生异步刷盘操作。openGauss中,磁盘页大小为8KB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~256 (0表示关闭异步刷盘功能),单位页面(8K)。例如,取值64,表示backend线程连续写64个磁盘页,即64\*8=512KB磁盘空间后会进行异步刷盘。 + +**默认值**:512KB(即64个页面) + +## enable\_parallel\_ddl + +**参数说明**:控制多数据库节点对同一数据库对象是否能安全的并发执行DDL操作。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示可以安全的并发执行DDL操作,不会出现分布式死锁。 +- off表示不能安全的并发执行DDL操作,可能会出现分布式死锁。 + +**默认值**:on + +## show\_acce\_estimate\_detail + +**参数说明**:评估信息一般用于运维人员在维护工作中使用,因此该参数默认关闭,此外为了避免这些信息干扰正常的explain信息显示,只有在explain命令的verbose选项打开的情况下才显示评估信息 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示可以在explain命令的输出中显示评估信息。 +- off表示不在explain命令的输出中显示评估信息。 + + +**默认值**:off + +## enable\_prevent\_job\_task\_startup + +**参数说明**:控制是否启动job线程。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示不能启动job线程。 +- off表示可以启动job线程。 + +**默认值**:off + +## enable\_early\_free + +**参数说明**:控制是否可以实现算子内存的提前释放。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示支持算子内存提前释放。 +- off表示不支持算子内存提前释放。 + +**默认值**:on + +## support\_batch\_bind + +**参数说明**:控制是否允许通过JDBC、ODBC、Libpq等接口批量绑定和执行PBE形式的语句。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用批量绑定和执行。 +- off表示不使用批量绑定和执行。 + +**默认值**:on + +## check\_implicit\_conversions + +**参数说明**:控制是否对查询中有隐式类型转换的索引列是否会生成候选索引路径进行检查。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示对查询中有隐式类型转换的索引列是否会生成候选索引路径进行检查。 +- off表示不进行相关检查。 + +**默认值**:off + +## enable\_thread\_pool + +**参数说明**:控制是否使用线程池功能。该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启线程池功能。 +- off表示不开启线程池功能。 + +**默认值**:off + +## thread\_pool\_attr + +**参数说明**:用于控制线程池功能的详细属性,该参数仅在enable\_thread\_pool打开后生效。该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串,长度大于0 + +该参数分为3个部分,'thread\_num, group\_num, cpubind\_info',这3个部分的具体含义如下: + +- thread\_num:线程池中的线程总数,取值范围是0\~4096。其中0的含义是数据库根据系统CPU core的数量来自动配置线程池的线程数,如果参数值大于0,线程池中的线程数等于thread\_num。 +- group\_num:线程池中的线程分组个数,取值范围是0\~64。其中0的含义是数据库根据系统NUMA组的个数来自动配置线程池的线程分组个数,如果参数值大于0,线程池中的线程组个数等于group\_num。 +- cpubind\_info:线程池是否绑核的配置参数。可选择的配置方式有集中:1. '\(nobind\)' ,线程不做绑核;2. '\(allbind\)',利用当前系统所有能查询到的CPU core做线程绑核;3. '\(nodebind: 1, 2\)',利用NUMA组1,2中的CPU core进行绑核;4. '\(cpubind: 0-30\)',利用0-30号CPU core进行绑核。该参数不区分大小写。 + +**默认值**:'16, 2, \(nobind\)' + +## numa\_distribute\_mode + +**参数说明**:用于控制部分共享数据和线程在NUMA节点间分布的属性。用于大型多NUMA节点的ARM服务器性能调优,一般不用设置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符串,当前有效取值为'none', 'all'。 + +- none: 表示不启用本特性。 +- all:表示将部分共享数据和线程分布到不同的NUMA节点下,减少远端访存次数,提高性能。目前仅适用于拥有多个NUMA节点的ARM服务器,并且要求全部NUMA节点都可用于数据库进程,不支持仅选择一部分NUMA节点。 + +**默认值**:'none' + +## log\_pagewriter + +**参数说明**:设置用于增量检查点打开后,显示线程的刷页信息以及增量检查点的详细信息,信息比较多,不建议设置为ture。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值**:off + +## enable\_opfusion + +**参数说明**:控制是否对简单查询进行查询优化。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示使用。 +- off表示不使用。 + +**默认值**:on + +## advance\_xlog\_file\_num + +**参数说明**:用于控制在后台周期性地提前初始化xlog文件的数目。该参数是为了避免事务提交时执行xlog文件初始化影响性能,但仅在超重负载时才可能出现,因此一般不用配置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~100(0表示不提前初始化)。例如,取值10,表示后台线程会周期性地根据当前xlog写入位置提前初始化10个xlog文件。 + +**默认值**:0 + +## enable\_beta\_opfusion + +**参数说明**:在enable\_opfusion参数打开的状态下,如果开启该参数,可以支持TPCC中出现的聚集函数,排序和nestloop join三类SQL语句的加速执行,提升SQL执行性能。需要注意的是nestloop join类型的支持,还需要打开下面的enable\_beta\_nestloop\_fusion参数。 + +**取值范围**:布尔型 + +**默认值**:off + +## enable\_beta\_nestloop\_fusion + +**参数说明**:在enable\_opfusion和enable\_beta\_opfusion两个参数都打开的状态下,如果开启该参数,可以支持TPCC中出现的nestloop join类SQL语句的加速执行,提升SQL执行性能。 + +**取值范围**:布尔型 + +**默认值**:off + diff --git "a/content/zh/docs/Developerguide/\345\274\202\346\255\245IO.md" "b/content/zh/docs/Developerguide/\345\274\202\346\255\245IO.md" new file mode 100644 index 000000000..37213c584 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\274\202\346\255\245IO.md" @@ -0,0 +1,111 @@ +# 异步IO + +## enable\_adio\_debug + +**参数说明:**允许维护人员输出一些与ADIO相关的日志,便于定位ADIO相关问题。开发人员专用,不建议普通用户使用。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启此日志开关。 +- off/false表示关闭此日志开关。 + +**默认值:**off + +## enable\_adio\_function + +**参数说明:**是否开起ADIO功能。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on/true表示开启此功能。 +- off/false表示关闭此功能。 + +**默认值:**off + +## enable\_fast\_allocate + +**参数说明:**磁盘空间快速分配开关。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。只有在XFS文件系统上才能开启该开关。 + +**取值范围:**布尔型 + +- on/true表示开启此功能。 +- off/false表示关闭此功能。 + +**默认值:**off + +## prefetch\_quantity + +**参数说明:**描述行存储使用ADIO预读取IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,128~131072,单位为8KB。 + +**默认值:**32MB \(4096 \* 8KB\) + +## backwrite\_quantity + +**参数说明:**描述行存储使用ADIO写入IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,128~131072,单位为8KB。 + +**默认值:**8MB \(1024 \* 8KB\) + +## cstore\_prefetch\_quantity + +**参数说明:**描述列存储使用ADIO预取IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024~1048576,单位为KB。 + +**默认值:**32MB + +## cstore\_backwrite\_quantity + +**参数说明:**描述列存储使用ADIO写入IO量的大小。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024~1048576,单位为KB。 + +**默认值:**8MB + +## cstore\_backwrite\_max\_threshold + +**参数说明:**描述列存储使用ADIO写入数据库可缓存最大的IO量。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,4096~INT\_MAX/2,单位为KB。 + +**默认值:**2GB + +## fast\_extend\_file\_size + +**参数说明:**描述列存储使用ADIO预扩展磁盘的大小。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1024~1048576,单位为KB。 + +**默认值:**8MB + +## effective\_io\_concurrency + +**参数说明:**磁盘子系统可以同时有效处理的请求数。对于RAID阵列,此参数应该是阵列中驱动器主轴的数量。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型 ,0\~1000 + +**默认值:**1 + diff --git "a/content/zh/docs/Developerguide/\345\274\202\346\255\245\345\221\275\344\273\244\345\244\204\347\220\206.md" "b/content/zh/docs/Developerguide/\345\274\202\346\255\245\345\221\275\344\273\244\345\244\204\347\220\206.md" new file mode 100644 index 000000000..0915883fb --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\274\202\346\255\245\345\221\275\344\273\244\345\244\204\347\220\206.md" @@ -0,0 +1,26 @@ +# 异步命令处理 + +PQexec函数对普通的同步应用里提交命令已经足够使用。但是它却有几个缺陷,而这些缺陷可能对某些用户很重要: + +- PQexec等待命令结束,而应用可能还有其它的工作要做(比如维护用户界面等),此时PQexec可不想阻塞在这里等待响应。 + +- 因为客户端应用在等待结果的时候是处于挂起状态的,所以应用很难判断它是否该尝试结束正在进行的命令。 + +- PQexec只能返回一个PGresult结构。如果提交的命令字符串包含多个SQL命令,除了最后一个PGresult以外都会被PQexec丢弃。 + +- PQexec总是收集命令的整个结果,将其缓存在一个PGresult中。虽然这为应用简化了错误处理逻辑,但是对于包含多行的结果是不切实际的。 + + +不想受到这些限制的应用可以改用下面的函数,这些函数也是构造PQexec的函数:PQsendQuery和PQgetResult。PQsendQueryParams,PQsendPrepare,PQsendQueryPrepared也可以和PQgetResult一起使用。 + +- **[PQsendQuery](PQsendQuery.md)** + +- **[PQsendQueryParams](PQsendQueryParams.md)** + +- **[PQsendPrepare](PQsendPrepare.md)** + +- **[PQsendQueryPrepared](PQsendQueryPrepared.md)** + +- **[PQflush](PQflush.md)** + + diff --git "a/content/zh/docs/Developerguide/\345\275\222\346\241\243.md" "b/content/zh/docs/Developerguide/\345\275\222\346\241\243.md" new file mode 100644 index 000000000..32cba83b6 --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\275\222\346\241\243.md" @@ -0,0 +1,50 @@ +# 归档 + +## archive\_mode + +**参数说明:**表示是否进行归档操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当[wal\_level](设置.md#zh-cn_topic_0237124707_zh-cn_topic_0059778393_s2c76f5957066407a959191148f2c780f)设置成minimal时,archive\_mode参数无法使用。 + +**取值范围: **布尔型 + +- on表示进行归档。 +- off表示不进行归档。 + +**默认值:**off + +## archive\_command + +**参数说明:**由管理员设置的用于归档WAL日志的命令,建议归档路径为绝对路径。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 字符串中任何%p都被要归档的文件的绝对路径代替,而任何%f都只被该文件名代替(相对路径都相对于数据目录的)。如果需要在命令里嵌入%字符就必须双写%。 +>- 这个命令当且仅当成功的时候才返回零。示例如下: +> ``` +> archive_command = 'cp --remove-destination %p /mnt/server/archivedir/%f' +> ``` +>- --remove-destination选项作用为:拷贝前如果目标文件已存在,会先删除已存在的目标文件,然后执行拷贝操作。 + +**取值范围**:字符串 + +**默认值:**\(disabled\) + +## archive\_timeout + +**参数说明:**表示归档周期。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 超过该参数设定的时间时强制切换WAL段。 +>- 由于强制切换而提早关闭的归档文件仍然与完整的归档文件长度相同。因此,将archive\_timeout设为很小的值将导致占用巨大的归档存储空间,建议将archive\_timeout设置为60秒。 + +**取值范围**:整型,0 \~ INT\_MAX,单位为秒。其中0表示禁用该功能。 + +**默认值:**0 + diff --git "a/content/zh/docs/Developerguide/\345\277\253\347\205\247\345\220\214\346\255\245\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\345\277\253\347\205\247\345\220\214\346\255\245\345\207\275\346\225\260.md" new file mode 100644 index 000000000..17a07d36e --- /dev/null +++ "b/content/zh/docs/Developerguide/\345\277\253\347\205\247\345\220\214\346\255\245\345\207\275\346\225\260.md" @@ -0,0 +1,18 @@ +# 快照同步函数 + +快照同步函数是导出当前快照的标识符。 + +pg\_export\_snapshot\(\) + +描述:保存当前的快照并返回它的标识符。 + +返回值类型:text + +备注:函数pg\_export\_snapshot保存当前的快照并返回一个文本字符串标识此快照。这个字符串必须传递给想要导入快照的客户端。可用在set transaction snapshot snapshot\_id时导入snapshot,但是应用的前提是该事务设置了SERIALIZABLE或REPEATABLE READ隔离级别。而openGauss目前是不支持这两种隔离级别的。该函数的输出不可用做set transaction snapshot的输入。 + +pg\_export\_snapshot\_and\_csn\(\) + +描述:保存当前的快照并返回它的标识符。比pg\_export\_snapshot\(\)多返回一列CSN,表示当前快照的CSN。 + +返回值类型:text + 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" new file mode 100644 index 000000000..938daed50 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\200\247\350\203\275\347\273\237\350\256\241.md" @@ -0,0 +1,28 @@ +# 性能统计 + +在数据库运行过程中,会涉及到锁的访问、磁盘IO操作、无效消息的处理,这些操作都可能是数据库的性能瓶颈,通过openGauss提供的性能统计方法,可以方便定位性能问题。 + +## 输出性能统计日志 + +**参数说明:**对每条查询,以下4个选项控制在服务器日志里记录相应模块的性能统计数据,具体含义如下: + +- log\_parser\_stats控制在服务器日志里记录解析器的性能统计数据。 +- log\_planner\_stats控制在服务器日志里记录查询优化器的性能统计数据。 +- log\_executor\_stats控制在服务器日志里记录执行器的性能统计数据。 +- log\_statement\_stats控制在服务器日志里记录整个语句的性能统计数据。 + +这些参数只能辅助管理员进行粗略分析,类似Linux中的操作系统工具getrusage\(\) 。 + +这些参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- log\_statement\_stats记录总的语句统计数据,而其他的只记录针对每个模块的统计数据。 +>- log\_statement\_stats不能和其他任何针对每个模块统计的选项一起打开。 + +**取值范围:**布尔型 + +- on表示开启记录性能统计数据的功能。 +- off表示关闭记录性能统计数据的功能。 + +**默认值:on** + 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" new file mode 100644 index 000000000..d50254e81 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\345\207\275\346\225\260.md" @@ -0,0 +1,45 @@ +# 扩展函数 + +openGauss针对扩展数据类型,提供了一些对应的操作函数。这些操作函数依赖于扩展数据类型,目前处于Beta阶段,可能在功能上存在不稳定性,或者在后续版本发生变更。请在商用业务场景下谨慎使用,以免对正式业务系统的升级、扩容等方面产生不利影响。 + +该部分内容由GUC参数support\_extended\_features控制,请参见[support\_extended\_features](平台和客户端兼容性.md#zh-cn_topic_0237124738_zh-cn_topic_0059779195_s1b60ec6dbc79490bbadf5dd62ba2538c)进行配置。 + +下表列举了openGauss中支持的扩展函数,不作为商用特性交付,仅供参考。 + + + + + + + + + + + + + + + + + + + + + + +

分类

+

函数名称

+

描述

+

访问权限查询函数

+

+

has_sequence_privilege(user, sequence, privilege)

+

指定用户是否有访问序列的权限

+

has_sequence_privilege(sequence, privilege)

+

当前用户是否有访问序列的权限

+

触发器函数

+

pg_get_triggerdef(trigger_oid)

+

为触发器获取CREATE [ CONSTRAINT ] TRIGGER命令

+

pg_get_triggerdef(trigger_oid, pretty_bool)

+

为触发器获取CREATE [ CONSTRAINT ] TRIGGER命令

+
+ diff --git "a/content/zh/docs/Developerguide/\346\211\251\345\261\225\346\200\247.md" "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\346\200\247.md" new file mode 100644 index 000000000..76d2c7950 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\346\200\247.md" @@ -0,0 +1,49 @@ +# 扩展性 + +GIN索引的接口实现了一个高层次的抽象,要求访问用户仅需要实现被访问数据类型的语义。GIN层自身可以处理并发操作、记录日志、搜索树结构的任务。 + +定义GIN索引的访问方式所要做的事情就是实现多个用户定义的方法,这些方法定义了键在树中的行为、键与键之间的关系、需要索引的item、能够使用索引的查询。简而言之,GIN索引将扩展性与普遍性、代码重用、清晰的接口结合在了一起。 + +实现GIN索引的操作符类有如下四个方法: + +- int compare\(Datum a, Datum b\) + + 比较两个key(不是索引的item)然后返回一个小于零、零或大于零的值,分别表示第一个key小于、等于或大于第二个key。NULL不会被传入这个函数。 + + +- Datum \*extractValue\(Datum itemValue, int32 \*nkeys, bool \*\*nullFlags\) + + 给定一个要被索引的item,返回一个对应key的数组。返回key的数目必须存储在\*nkeys中。如果任何key都可能为NULL,还要分配包含\*nkeys个布尔元素的数组,将地址存储到\*nullFlags,并且根据需要设置NULL值。 如果所有key都是非NULL,可以让\*nullFlags保持为NULL(他的初始值)。如果item不包含任何key,返回值可以为NULL。 + + +- Datum \*extractQuery\(Datum query, int32 \*nkeys, StrategyNumber n, bool \*\*pmatch, Pointer \*\*extra\_data, bool \*\*nullFlags, int32 \*searchMode\) + + 给定一个被查询的值,返回一个对应的key的数组。也就是说,query是可索引操作符右侧的值,而该操作符左侧是被索引的字段。 n是操作符类中操作符的策略号。通常,extractQuery需要参考n来决定query的数据类型以及抽取键值的方法。返回key的个数必须存放在\*nkeys中。如果任何key都可能为NULL,还要分配包含\*nkeys个布尔元素的数组,将地址存储到\*nullFlags,并且根据需要设置NULL值。 如果所有key都是非NULL的,可以让\*nullFlags保持为NULL(他的初始值)。如果query不包含任何key,返回值可以为NULL。 + + searchMode是一个输出参数,他允许extractQuery指定一些关于如何执行搜索的细节。如果设置\*searchMode为GIN\_SEARCH\_MODE\_DEFAULT(这也是调用函数前此参数的初始化值),只有那些至少返回一个key的item才能被考虑作为候选匹配项。如果设置\*searchMode为GIN\_SEARCH\_MODE\_INCLUDE\_EMPTY,除了包含至少一个匹配key的item之外,根本不包含任何key的item也被考虑作为候选匹配项。(这个模式对于实现像“是否是子集”这样的操作是有用的)如果设置\*searchMode为GIN\_SEARCH\_MODE\_ALL,索引中所有非NULL的item都被考虑作为候选匹配项,不管他们是否匹配返回key中的任何一个。 + + pmatch是一个允许支持部分匹配的输出参数。如果使用此参数,extractQuery必须分配有\*nkeys个布尔元素的数组,并把数组地址保存到\*pmatch。如果需要部分匹配相应的key,则数组的每个元素应该设置为TRUE;如果不需要匹配,则设置为FALSE。如果设置\*pmatch为NULL,则假设GIN不需要部分匹配。在函数调用前这个值被初始化为NULL,因此,对于不支持部分匹配的操作符类,可以忽略这个参数。 + + extra\_data是一个允许extractQuery以consistent和comparePartial的方式传递额外数据的输出参数。如果使用他,extractQuery必须分配一个包含\*nkeys个Pointer元素的数组,并把数组地址保存到\*extra\_data,然后把他想附加的东西存储到各个独立的指针中。在函数调用前这个值初始化为NULL,因此,对于不需要附加数据的操作符类,可以忽略这个参数。如果设置了\*extra\_data,那么以consistent方式传递整个数组,使用comparePartial方式传递适当的元素。 + + +- bool consistent\(bool check\[\], StrategyNumber n, Datum query, int32 nkeys, Pointer extra\_data\[\], bool \*recheck, Datum queryKeys\[\], bool nullFlags\[\]\) + + 如果被索引项满足StrategyNumber为n的查询操作符则返回TRUE。这个函数并不直接访问被索引项的值,因为GIN并没有精确的把项目保存下来,但是需要知道从查询中提取的哪些键值出现在给定的被索引项中。 check数组的长度是nkeys,这个与query调用extractQuery函数返回的键值的数目相同。如果索引项包含了相应的查询键,check数组中对应的元素值就是TRUE。比如,如果\(check\[i\] == TRUE\),那么意味着extractQuery的结果数组的第i个键出现在索引项中。考虑可能会用到consistent方式,原始的query也被作为参数传入进来。与此相同的还有extractQuery函数返回的queryKeys\[\]和nullFlags\[\]。 extra\_data是extractQuery函数返回的额外数据数组,如果没有的话就是NULL。 + + 当extractQuery在queryKeys\[\]中返回一个NULL的键值,如果被索引项包含NULL键值,相应的check\[\]中的元素是TRUE。也就是说,check\[\]的语义很像IS NOT DISTINCT FROM。如果需要知道是通常值匹配还是NULL匹配,consistent函数可以检查相应的nullFlags\[\]元素。 + + 成功执行后,如果堆元组需要针对查询运算符进行重新检查,\*recheck需要设置为TRUE,如果索引测试已经是精确的了,则设为FALSE。也就是说,FALSE的返回值确保堆元组不匹配这个查询;设置\*recheck为FALSE的TRUE的返回值确保堆元组匹配这个查询;设置\*recheck为TRUE的TRUE的返回值意味着堆元组可能匹配这个查询,因此需要通过直接对照原始索引项对查询运算符进行获取和重新检查。 + + +GIN操作符类可以可选地提供第五个函数。 + +- int comparePartial\(Datum partial\_key, Datum key, StrategyNumber n, Pointer extra\_data\) + + 比较一个部分匹配查询键和一个索引键。返回一个整型值,它的符号代表了不同的含义:小于0意味着索引键不匹配查询,但是索引扫描应该继续; 0意味着索引键匹配查询;大于0指示应该终止索引扫描,因为不可能再有更多的匹配。在需要确定何时结束扫描的语义的情况下,这里提供了生成部分一致查询的操作符的策略号n。同样的,extra\_data是extractQuery生成的额外数据数组中的相应元素,如果没有对应的元素,则为NULL。 NULL的键永远不会被传入这个函数。 + + +为了支持"部分匹配"查询,一个操作符类必须提供comparePartial方法,并且当遇到部分匹配查询时,他的extractQuery方法必须设置pmatch参数。详细信息请参考[部分匹配算法](实现.md#zh-cn_topic_0237122201_zh-cn_topic_0059778495_s9dc41ea95b9144c38d709b0b9a43fe9e)。 + +上面的各种Datum值的实际数据类型根据操作符类的不同而不同。传入到extractValue中的项目值总是操作符类的输入类型,所有的键值类型必须是这个类的STORAGE类型。传入到extractQuery和consistent的query参数的类型是由策略号识别的类成员操作符的右操作数的输入类型。他不需要和项目类型相同,只要可以从中抽取出正确类型的键值。 + 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" new file mode 100644 index 000000000..6d0368cfa --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\211\251\345\261\225\350\257\255\346\263\225.md" @@ -0,0 +1,321 @@ +# 扩展语法 + +openGauss提供了一些扩展语法,目前处于Beta阶段,仅供内部使用,外部不可用。 + +下表列举了openGauss中支持的扩展语法,不作为商用特性交付,仅供参考。 + +**表 1** 扩展SQL语法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类别

+

语法关键字

+

描述

+
  

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 ]

+

不支持用EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] )为表创建排除约束。

+

修改表(ALTER TABLE)

+

TO { GROUP groupname | NODE ( nodename [, ... ] ) }

+

修改表数据分布的数据节点列表。

+

DELETE NODE ( nodename [, ... ] )

+

删除表数据分布的数据节点。

+

加载模块

+

CREATE EXTENSION

+

把一个新的模块(例如DBLINK)加载进当前数据库中。

+

ALTER EXTENSION

+

修改已加载的模块。

+

DROP EXTENSION

+

删除已加载的模块。

+

聚集函数

+

CREATE AGGREGATE

+

定义一个新的聚集函数。

+

ALTER AGGREGATE

+

修改一个聚集函数的定义。

+

DROP AGGREGATE

+

删除一个现存的聚集函数。

+

操作符

+

CREATE OPERATOR

+

定义一个新的操作符。

+

ALTER OPERATOR

+

修改一个操作符的定义。

+

DROP OPERATOR

+

从数据库中删除一个现存的操作符。

+

操作符类

+

CREATE OPERATOR CLASS

+

定义一个新的操作符类。

+

ALTER OPERATOR CLASS

+

修改一个操作符类的定义。

+

DROP OPERATOR CLASS

+

删除一个现有操作符类。

+

操作符族

+

CREATE OPERATOR FAMILY

+

定义一个新的操作符族。

+

ALTER OPERATOR FAMILY

+

修改一个操作符族的定义。

+

DROP OPERATOR FAMILY

+

删除一个已有的操作符族。

+

文本检索解析器

+

CREATE TEXT SEARCH PARSER

+

创建一个新的文本检索解析器。

+

ALTER TEXT SEARCH PARSER

+

修改文本检索解析器。

+

DROP TEXT SEARCH PARSER

+

删除现有的文本检索解析器。

+

文本检索模板

+

CREATE TEXT SEARCH TEMPLATE

+

创建一个新的文本检索模板。

+

ALTER TEXT SEARCH TEMPLATE

+

修改文本检索模板。

+

DROP TEXT SEARCH TEMPLATE

+

删除现有的文本检索模板。

+

排序规则

+

CREATE COLLATION

+

创建排序规则。

+

排序规则使得用户可以定义数据在列级,甚至是操作级的排序规则和字符分类行为。

+

ALTER COLLATION

+

修改排序规则。

+

DROP COLLATION

+

删除排序规则。

+

规则

+

CREATE RULE

+

创建规则。

+

规则是在指定表上执行指定动作的时候,将执行一些额外的动作。

+

DROP RULE

+

删除规则。

+

生成一个通知

+

NOTIFY

+

NOTIFY命令发送带有可选的“有效载荷”字符串的通知给先前执行监听数据库中指定的同一渠道的每一个客户端。

+

监听一个通知

+

LISTEN

+

给当前会话注册一个监听器。

+

停止监听通知信息

+

UNLISTEN

+

清除本次会话注册的所有监听器。

+

加载或重新加载一个共享库文件

+

LOAD

+

加载一个共享库文件到数据库服务器的地址空间。

+

释放一个数据库的会话资源

+

DISCARD

+

释放与此数据库会话的相关资源。

+

过程语言

+

CREATE LANGUAGE

+

注册一个新的语言。

+

ALTER LANGUAGE

+

修改一个过程语言的定义。

+

DROP LANGUAGE

+

删除一个过程语言。

+

+

CREATE DOMAIN

+

创建一个新的域。

+

ALTER DOMAIN

+

修改现有域的定义。

+

DROP DOMAIN

+

删除一个域。

+

编码转换

+

CREATE CONVERSION

+

定义字符集之间的转换。

+

ALTER CONVERSION

+

修改一个编码转换的定义。

+

DROP CONVERSION

+

删除一个先前定义过的编码转换。

+

类型转换

+

CREATE CAST

+

定义一个新的转换。一个转换说明如何在两个类型之间进行转换。

+

DROP CAST

+

删除一个先前定义过的类型转换。

+

创建游标

+

CURSOR name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] [ WITH HOLD ] FOR query

+

INSENSITIVE:

+

这个关键字没有什么作用,只在为了兼容SQL标准。

+

SCROLL:声明该游标可以用于反向检索。

+

WITH HOLD:声明该游标可以在创建它的事务成功提交后继续使用。

+

移动游标

+

MOVE BACKWARD

+

反向移动游标,需与SCROLL结合才能使用。

+
+ diff --git "a/content/zh/docs/Developerguide/\346\216\222\345\272\217\346\237\245\350\257\242\347\273\223\346\236\234.md" "b/content/zh/docs/Developerguide/\346\216\222\345\272\217\346\237\245\350\257\242\347\273\223\346\236\234.md" new file mode 100644 index 000000000..d5b1169b0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\216\222\345\272\217\346\237\245\350\257\242\347\273\223\346\236\234.md" @@ -0,0 +1,102 @@ +# 排序查询结果 + +排序试图针对特定查询衡量文档的相关度,从而将众多的匹配文档中相关度最高的文档排在最前。openGauss提供了两个预置的排序函数。函数考虑了词法,距离,和结构信息;也就是,他们考虑查询词在文档中出现的频率、紧密程度、以及他们出现的地方在文档中的重要性。然而,相关性的概念是模糊的,并且是跟应用强相关的。不同的应用程序可能需要额外的信息来排序,比如,文档的修改时间,内置的排序函数等。也可以开发自己的排序函数或者采用附加因素组合这些排序函数的结果来满足特定需求。 + +两个预置的排序函数: + +``` +ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 +``` + +基于词素匹配率对vector进行排序: + +``` +ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 +``` + +该函数需要位置信息的输入。因此它不能在"剥离"tsvector值的情况下运行—它将总是返回零。 + +对于这两个函数,可选的weights参数提供给词加权重的能力,词的权重大小取决于所加的权值。权重阵列指定在排序时为每类词汇加多大的权重。 + +``` +{D-weight, C-weight, B-weight, A-weight} +``` + +如果没有提供weights,则使用缺省值:\{0.1, 0.2, 0.4, 1.0\}。 + +通常的权重是用来标记文档特殊领域的词,如标题或最初的摘要,所以相对于文章主体中的词它们有着更高或更低的重要性。 + +由于较长的文档有更多的机会包含查询词,因此有必要考虑文档的大小。例如,包含有5个搜索词的一百字文档比包含有5个搜索词的一千字文档相关性更高。两个预置的排序函数都采用了一个整型的标准化选项来定义文档长度是否影响排序及如何影响。这个整型选项控制多个行为,所以它是一个屏蔽字:可以使用|指定一个或多个行为(例如,2|4)。 + +- 0(缺省)表示:跟长度大小没有关系 +- 1 表示:排名(rank)除以\(文档长度的对数+1\) +- 2表示:排名除以文档的长度 +- 4表示:排名除以两个扩展词间的调和平均距离。只能使用ts\_rank\_cd实现 +- 8表示:排名除以文档中单独词的数量 +- 16表示:排名除以单独词数量的对数+1 +- 32表示:排名除以排名本身+1 + +当指定多个标志位时,会按照所列的顺序依次进行转换。 + +需要特别注意的是,排序函数不使用任何全局信息,所以不可能产生一个某些情况下需要的1%或100%的理想标准值。标准化选项32 \(rank/\(rank+1\)\)可用于所有规模的从零到一之间的排序,当然,这只是一个表面变化;它不会影响搜索结果的排序。 + +下面是一个例子,仅选择排名前十的匹配: + +``` +postgres=# SELECT id, title, ts_rank_cd(to_tsvector(body), query) AS rank +FROM tsearch.pgweb, to_tsquery('america') query +WHERE query @@ to_tsvector(body) +ORDER BY rank DESC +LIMIT 10; + id | title | rank +----+---------+------ + 11 | Brazil | .2 + 2 | America | .1 + 12 | Canada | .1 + 13 | Mexico | .1 +(4 rows) +``` + +这是使用标准化排序的相同例子: + +``` +postgres=# SELECT id, title, ts_rank_cd(to_tsvector(body), query, 32 /* rank/(rank+1) */ ) AS rank +FROM tsearch.pgweb, to_tsquery('america') query +WHERE query @@ to_tsvector(body) +ORDER BY rank DESC +LIMIT 10; + id | title | rank +----+---------+---------- + 11 | Brazil | .166667 + 2 | America | .0909091 + 12 | Canada | .0909091 + 13 | Mexico | .0909091 +(4 rows) +``` + +下面是使用中文分词法排序查询的例子: + +``` +postgres=# CREATE TABLE tsearch.ts_ngram(id int, body text); +postgres=# INSERT INTO tsearch.ts_ngram VALUES(1, '中文'); +postgres=# INSERT INTO tsearch.ts_ngram VALUES(2, '中文检索'); +postgres=# INSERT INTO tsearch.ts_ngram VALUES(3, '检索中文'); +--精确匹配 +postgres=# SELECT id, body, ts_rank_cd(to_tsvector('ngram',body), query) AS rank FROM tsearch.ts_ngram, to_tsquery('中文') query WHERE query @@ to_tsvector(body); + id | body | rank +----+------+------ + 1 | 中文 | .1 +(1 row) + +--模糊匹配 +postgres=# SELECT id, body, ts_rank_cd(to_tsvector('ngram',body), query) AS rank FROM tsearch.ts_ngram, to_tsquery('中文') query WHERE query @@ to_tsvector('ngram',body); + id | body | rank +----+----------+------ + 3 | 检索中文 | .1 + 1 | 中文 | .1 + 2 | 中文检索 | .1 +(3 rows) +``` + +排序要遍历每个匹配的tsvector,因此资源消耗多,可能会因为I/O限制导致排序慢。可是这是很难避免的,因为实际查询中通常会有大量的匹配。 + diff --git "a/content/zh/docs/Developerguide/\346\216\245\345\217\243\345\217\202\350\200\203.md" "b/content/zh/docs/Developerguide/\346\216\245\345\217\243\345\217\202\350\200\203.md" new file mode 100644 index 000000000..a5b64bca5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\216\245\345\217\243\345\217\202\350\200\203.md" @@ -0,0 +1,9 @@ +# 接口参考 + +- **[JDBC](JDBC.md)** + +- **[ODBC](ODBC.md)** + +- **[libpq](libpq.md)** + + 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" new file mode 100644 index 000000000..76bef3f61 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\216\247\345\210\266\346\226\207\346\234\254\346\220\234\347\264\242.md" @@ -0,0 +1,13 @@ +# 控制文本搜索 + +为了执行全文搜索,必须有个函数创建来自文档的tsvector和来自用户查询的tsquery。同时,为了以有效的顺序返回结果,需要一个函数对比文档的查询相关性。同时,能很好地显示结果也是很重要的。openGauss支持所有这些函数。 + +- **[解析文档](解析文档.md)** + +- **[解析查询](解析查询.md)** + +- **[排序查询结果](排序查询结果.md)** + +- **[高亮搜索结果](高亮搜索结果.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\220\234\347\264\242\350\241\250.md" "b/content/zh/docs/Developerguide/\346\220\234\347\264\242\350\241\250.md" new file mode 100644 index 000000000..9f2490dac --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\220\234\347\264\242\350\241\250.md" @@ -0,0 +1,86 @@ +# 搜索表 + +在不使用索引的情况下也可以进行全文检索。 + +- 一个简单查询:将body字段中包含america的每一行打印出来。 + + ``` + postgres=# DROP SCHEMA IF EXISTS tsearch CASCADE; + + postgres=# CREATE SCHEMA tsearch; + + postgres=# CREATE TABLE tsearch.pgweb(id int, body text, title text, last_mod_date date); + + postgres=# INSERT INTO tsearch.pgweb VALUES(1, 'China, officially the People''s Republic of China (PRC), located in Asia, is the world''s most populous state.', 'China', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(2, 'America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley.', 'America', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(3, 'England is a country that is part of the United Kingdom. It shares land borders with Scotland to the north and Wales to the west.', 'England', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(4, 'Australia, officially the Commonwealth of Australia, is a country comprising the mainland of the Australian continent, the island of Tasmania, and numerous smaller islands.', 'Australia', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(5, 'Russia, also officially known as the Russian Federation, is a sovereign state in northern Eurasia.', 'Russia', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(6, 'Japan is an island country in East Asia.', 'Japan', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(7, 'Germany, officially the Federal Republic of Germany, is a sovereign state and federal parliamentary republic in central-western Europe.', 'Germany', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(8, 'France, is a sovereign state comprising territory in western Europe and several overseas regions and territories.', 'France', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(9, 'Italy officially the Italian Republic, is a unitary parliamentary republic in Europe.', 'Italy', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(10, 'India, officially the Republic of India, is a country in South Asia.', 'India', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(11, 'Brazil, officially the Federative Republic of Brazil, is the largest country in both South America and Latin America.', 'Brazil', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(12, 'Canada is a country in the northern half of North America.', 'Canada', '2010-1-1'); + + postgres=# INSERT INTO tsearch.pgweb VALUES(13, 'Mexico, officially the United Mexican States, is a federal republic in the southern part of North America.', 'Mexico', '2010-1-1'); + + postgres=# SELECT id, body, title FROM tsearch.pgweb WHERE to_tsvector('english', body) @@ to_tsquery('english', 'america'); + id | body | title + ----+-------------------------------------------------------------------------------------------------------------------------+--------- + 2 | America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley. | America + 12 | Canada is a country in the northern half of North America. | Canada + 13 | Mexico, officially the United Mexican States, is a federal republic in the southern part of North America. | Mexico + 11 | Brazil, officially the Federative Republic of Brazil, is the largest country in both South America and Latin America. | Brazil + (4 rows) + ``` + + 像America这样的相关词也会被找到,因为这些词都被处理成了相同标准的词条。 + + 上面的查询指定english配置来解析和规范化字符串。当然也可以省略此配置,通过default\_text\_search\_config进行配置设置: + + ``` + postgres=# SHOW default_text_search_config; + default_text_search_config + ---------------------------- + pg_catalog.english + (1 row) + + postgres=# SELECT id, body, title FROM tsearch.pgweb WHERE to_tsvector(body) @@ to_tsquery('america'); + id | body | title + ----+-------------------------------------------------------------------------------------------------------------------------+--------- + 11 | Brazil, officially the Federative Republic of Brazil, is the largest country in both South America and Latin America. | Brazil + 2 | America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley. | America + 12 | Canada is a country in the northern half of North America. | Canada + 13 | Mexico, officially the United Mexican States, is a federal republic in the southern part of North America. | Mexico + (4 rows) + ``` + +- 一个复杂查询:检索出在title或者body字段中包含north和america的最近10篇文档: + + ``` + postgres=# SELECT title FROM tsearch.pgweb WHERE to_tsvector(title || ' ' || body) @@ to_tsquery('north & america') ORDER BY last_mod_date DESC LIMIT 10; + title + -------- + Mexico + Canada + (2 rows) + ``` + + 为了清晰,举例中没有调用coalesce函数在两个字段中查找包含NULL的行。 + + 以上例子均在没有索引的情况下进行查询。对于大多数应用程序来说,这个方法很慢。因此除了偶尔的特定搜索,文本搜索在实际使用中通常需要创建索引。 + + 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" new file mode 100644 index 000000000..9b1690209 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\345\256\241\350\256\241.md" @@ -0,0 +1,310 @@ +# 操作审计 + +## audit\_system\_object + +**参数说明:**该参数决定是否对openGauss数据库对象的CREATE、DROP、ALTER操作进行审计。openGauss数据库对象包括DATABASE、USER、schema、TABLE等。通过修改该配置参数的值,可以只审计需要的数据库对象的操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0~262143 + +- 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)。 + +**默认值:**12295 + +**表 1** audit\_system\_object取值含义说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

二进制位

+

含义

+

取值说明

+

第0位

+

是否审计DATABASE对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第1位

+

是否审计SCHEMA对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第2位

+

是否审计USER对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第3位

+

是否审计TABLE对象的CREATE、DROP、ALTER、TRUNCATE操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER、TRUNCATE操作;
  • 1表示审计该对象的CREATE、DROP、ALTER、TRUNCATE操作。
+

第4位

+

是否审计INDEX对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第5位

+

是否审计VIEW对象的CREATE、DROP操作。

+
  • 0表示不审计该对象的CREATE、DROP操作;
  • 1表示审计该对象的CREATE、DROP操作。
+

第6位

+

是否审计TRIGGER对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第7位

+

是否审计PROCEDURE/FUNCTION对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第8位

+

是否审计TABLESPACE对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第9位

+

是否审计RESOURCE POOL对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作
+

第10位

+

是否审计WORKLOAD对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作
+

第11位

+

是否审计SERVER FOR HADOOP对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作
+

第12位

+

是否审计DATA SOURCE对象的CRAETE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
+
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第13位

+

是否审计NODE GROUP对象的CREATE、DROP操作。

+
  • 0表示不审计该对象的CREATE、DROP操作;
+
  • 1表示审计该对象的CREATE、DROP操作。
+

第14位

+

是否审计ROW LEVEL SECURITY对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计该对象的CREATE、DROP、ALTER操作;
  • 1表示审计该对象的CREATE、DROP、ALTER操作。
+

第15位

+

是否审计TYPE对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计TYPE对象的CREATE、DROP、ALTER操作;
  • 1表示审计TYPE对象的CREATE、DROP、ALTER操作。
+

第16位

+

是否审计TEXT SEARCH对象(CONFIGURATION和DICTIONARY)的CREATE、DROP、ALTER操作。

+
  • 0表示不审计TEXT SEARCH对象的CREATE、DROP、ALTER操作;
  • 1表示审计TEXT SEARCH对象的CREATE、DROP、ALTER操作。
+

第17位

+

是否审计DIRECTORY对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计DIRECTORY对象的CREATE、DROP、ALTER操作;
  • 1表示审计DIRECTORY对象的CREATE、DROP、ALTER操作。
+

第18位

+

是否审计SYNONYM对象的CREATE、DROP、ALTER操作。

+
  • 0表示不审计SYNONYM对象的CREATE、DROP、ALTER操作;
  • 1表示审计SYNONYM对象的CREATE、DROP、ALTER操作。
+
+ +## audit\_dml\_state + +**参数说明:**这个参数决定是否对具体表的INSERT、UPDATE、DELETE操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭具体表的DML操作(SELECT除外)审计功能。 +- 1表示开启具体表的DML操作(SELECT除外)审计功能。 + +**默认值:**0 + +## audit\_dml\_state\_select + +**参数说明:**这个参数决定是否对SELECT操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭SELECT操作审计功能。 +- 1表示开启SELECT审计操作功能。 + +**默认值:**0 + +## audit\_function\_exec + +参数说明:这个参数决定在执行存储过程、匿名块或自定义函数(不包括系统自带函数)时是否记录审计信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭过程或函数执行的审计功能。 +- 1表示开启过程或函数执行的审计功能。 + +**默认值:**0 + +## audit\_copy\_exec + +**参数说明:**这个参数决定是否对COPY操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭COPY审计功能。 +- 1表示开启COPY审计功能。 + +**默认值:**0 + +## audit\_set\_parameter + +**参数说明:**这个参数决定是否对SET操作进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭SET审计功能。 +- 1表示开启SET审计功能。 + +**默认值:**1 + +## sql\_compatibility + +**参数说明:**控制数据库的SQL语法和语句行为同哪一个主流数据库兼容。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围:**枚举型 + +- A表示同a db兼容。 +- TD表示同Teradata兼容。 +- MYSQL表示同MySQL兼容。 + +**默认值:**MYSQL + +>![](public_sys-resources/icon-notice.gif) **须知:** +>在数据库中,该参数只能是确定的一个值,要么始终设置为ORA,要么始终设置为TD,不能随便改动,否则会导致数据库行为不一致。 + +## enableSeparationOfDuty + +**参数说明:**是否开启三权分立选项。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启三权分立。 +- off表示不开启三权分立。 + +**默认值:**off + +## enable\_nonsysadmin\_execute\_direct + +**参数说明:**是否允许非系统管理员执行EXECUTE DIRECT ON语句。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许任意用户执行EXECUTE DIRECT ON语句。 +- off表示只允许系统管理员执行EXECUTE DIRECT ON语句。 + +**默认值:**off + +## enable\_copy\_server\_files + +**参数说明:**是否开启copy服务器端文件的权限。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启copy服务端文件的权限。 +- off表示不开启copy服务端文件的权限。 + +**默认值:**off + +>![](public_sys-resources/icon-notice.gif) **须知:** +>copy from/to file要求具有系统管理员权限的用户或初始用户才能使用,但是,在三权分立开启的状态下,系统管理员与初始用户的权限不同,可以通过使用enable\_copy\_server\_file控制系统管理员的copy权限,当前默认不允许系统管理员权限用户进行对文件的copy操作,此参数打开后系统管理员方可执行该类型操作。 + +## enable\_access\_server\_directory + +**参数说明:**是否开启系统管理员用户创建和删除DIRECTORY的权限。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启系统管理员用户创建和删除DIRECTORY的权限。 +- off表示不开启系统管理员用户创建和删除DIRECTORY的权限。 + +**默认值:**off + +>![](public_sys-resources/icon-notice.gif) **须知:** +>用户在使用高级包UTL\_FILE访问服务器端文件时,要求必须拥有所指定的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" new file mode 100644 index 000000000..2f924781f --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,82 @@ +# 操作符 + +## 操作符类型解析 + +1. 从系统表pg\_operator中选出要考虑的操作符。如果可以找到一个参数类型以及参数个数都一致的操作符,那么这个操作符就是最终使用的操作符。如果找到了多个备选的操作符,我们将从中选择一个最合适的。 +2. 寻找最优匹配。 + 1. 抛弃那些输入类型不匹配并且也不能隐式转换成匹配的候选操作符。unknown文本在这种情况下可以转换成任何东西。如果只剩下一个候选项,则用之,否则继续下一步。 + 2. 遍历所有候选操作符,保留那些输入类型匹配最准确的。此时,域被看作和他们的基本类型相同。如果没有一个操作符能被保留,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 + 3. 遍历所有候选操作符,保留那些需要类型转换时接受\(属于输入数据类型的类型范畴的\)首选类型位置最多的操作符。如果没有接受首选类型的操作符,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 + 4. 如果有任何输入参数是unknown类型,检查剩余的候选操作符对应参数位置的类型范畴。在每一个能够接受字符串类型范畴的位置使用string类型(这种对字符串的偏爱是合适的,因为unknown文本确实像字符串)。另外,如果所有剩下的候选操作符都接受相同的类型范畴,则选择该类型范畴,否则抛出一个错误(因为在没有更多线索的条件下无法作出正确的选择)。现在抛弃不接受选定的类型范畴的候选操作符,然后,如果任意候选操作符在某个给定的参数位置接受一个首选类型,则抛弃那些在该参数位置接受非首选类型的候选操作符。如果没有一个操作符能被保留,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 + 5. 如果同时有unknown和已知类型的参数,并且所有已知类型的参数都是相同的类型,那么假设unknown参数也是那种类型,并检查哪个候选操作符在unknown参数位置接受那个类型。如果只有一个操作符符合,那么使用它。否则,产生一个错误。 + + +## 示例 + +示例1:阶乘操作符类型解析。在系统表中里只有一个阶乘操作符(后缀!),它以bigint作为参数。扫描器给下面查询表达式的参数赋予bigint的初始类型: + +``` +postgres=# SELECT 40 ! AS "40 factorial"; + + 40 factorial +-------------------------------------------------- + 815915283247897734345611269596115894272000000000 +(1 row) +``` + +分析器对参数做类型转换,查询等效于: + +``` +postgres=# SELECT CAST(40 AS bigint) ! AS "40 factorial"; +``` + +示例2:字符串连接操作符类型分析。一种字符串风格的语法既可以用于字符串也可以用于复杂的扩展类型。未声明类型的字符串将被所有可能的候选操作符匹配。有一个未声明的参数的例子: + +``` +postgres=# SELECT text 'abc' || 'def' AS "text and unknown"; + text and unknown +------------------ + abcdef +(1 row) +``` + +本例中分析器寻找两个参数都是text的操作符。确实有这样的操作符,两个参数都是text类型。 + +下面是连接两个未声明类型的值: + +``` +postgres=# SELECT 'abc' || 'def' AS "unspecified"; + unspecified +------------- + abcdef +(1 row) +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>因为查询中没有声明任何类型,所以本例中对类型没有任何初始提示。因此,分析器查找所有候选操作符,发现既存在接受字符串类型范畴的操作符也存在接受位串类型范畴的操作符。因为字符串类型范畴是首选,所以选择字符串类型范畴的首选类型text作为解析未知类型文本的声明类型。 + +示例3:绝对值和取反操作符类型分析。openGauss操作符表里面有几条记录对应于前缀操作符@,它们都用于为各种数值类型实现绝对值操作。其中之一用于float8类型,它是数值类型范畴中的首选类型。因此,在面对unknown输入的时候, openGauss会使用该类型: + +``` +postgres=# SELECT @ '-4.5' AS "abs"; + abs +----- + 4.5 +(1 row) +``` + +此处,系统在应用选定的操作符之前隐式的转换unknown类型的文字为float8类型。 + +示例4:数组包含操作符类型分析。这里是解决一个操作符带有一个已知和一个未知类型输入的例子: + +``` +postgres=# SELECT array[1,2] <@ '{1,2,3}' as "is subset"; + is subset +----------- + t +(1 row) +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>openGauss操作符表有几条记录对应于中缀操作符<@,但是只有两个可以在左侧接受一个整数数组的操作符是数组包含\(anyarray <@ anyarray\) 和范围包含\(anyelement <@ anyrange\)的。因为没有多态的伪类型\(参阅[伪类型](伪类型.md#ZH-CN_TOPIC_0242370425)\)是首选的,所以解析器不能解决这个基础上的歧义。然而,最后一个解析规则告诉用户,假设未知类型的文字是和另外一个输入相同的类型,也就是,整数数组。现在只有两个操作符中的一个可以匹配,所以选择数组包含。(如果用户选择了范围包含,用户将得到一个错误,因为字符串没有正确的格式成为范围的文字。) + diff --git "a/content/zh/docs/Developerguide/\346\224\266\351\233\206\346\226\207\347\214\256\347\273\237\350\256\241.md" "b/content/zh/docs/Developerguide/\346\224\266\351\233\206\346\226\207\347\214\256\347\273\237\350\256\241.md" new file mode 100644 index 000000000..66ea72099 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\224\266\351\233\206\346\226\207\347\214\256\347\273\237\350\256\241.md" @@ -0,0 +1,44 @@ +# 收集文献统计 + +函数ts\_stat可用于检查配置和查找候选停用词。 + +``` +ts_stat(sqlquery text, [ weights text, ] + OUT word text, OUT ndoc integer, + OUT nentry integer) returns setof record +``` + +sqlquery是一个包含SQL查询语句的文本,该SQL查询将返回一个tsvector。ts\_stat执行SQL查询语句并返回一个包含tsvector中每一个不同的语素(词)的统计信息。返回信息包括: + +- word text:词素。 +- ndoc integer:词素在文档(tsvector)中的编号。 +- nentry integer:词素出现的频率。 + +如果设置了权重条件,只有标记了对应权重的词素才会统计频率。例如,在一个文档集中检索使用频率最高的十个单词: + +``` +postgres=# SELECT * FROM ts_stat('SELECT to_tsvector(''english'', sr_reason_sk) FROM tpcds.store_returns WHERE sr_customer_sk < 10') ORDER BY nentry DESC, ndoc DESC, word LIMIT 10; + word | ndoc | nentry +------+------+-------- + 32 | 2 | 2 + 33 | 2 | 2 + 1 | 1 | 1 + 10 | 1 | 1 + 13 | 1 | 1 + 14 | 1 | 1 + 15 | 1 | 1 + 17 | 1 | 1 + 20 | 1 | 1 + 22 | 1 | 1 +(10 rows) +``` + +同样的情况,但是只计算权重为A或者B的单词使用频率: + +``` +postgres=# SELECT * FROM ts_stat('SELECT to_tsvector(''english'', sr_reason_sk) FROM tpcds.store_returns WHERE sr_customer_sk < 10', 'a') ORDER BY nentry DESC, ndoc DESC, word LIMIT 10; + word | ndoc | nentry +------+------+-------- +(0 rows) +``` + 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" new file mode 100644 index 000000000..21f95a6b9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\345\200\274\347\261\273\345\236\213.md" @@ -0,0 +1,417 @@ +# 数值类型 + +[表1](#zh-cn_topic_0237121927_zh-cn_topic_0059778296_zh-cn_topic_0058965945_table40398258)列出了所有的可用类型。数字操作符和相关的内置函数请参见[数字操作函数和操作符](数字操作函数和操作符.md)。 + +**表 1** 整数类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

范围

+

TINYINT

+

微整数,别名为INT1。

+

1字节

+

0 ~ 255

+

SMALLINT

+

小范围整数,别名为INT2。

+

2字节

+

-32,768 ~ +32,767

+

INTEGER

+

常用的整数,别名为INT4。

+

4字节

+

-2,147,483,648 ~ +2,147,483,647

+

BINARY_INTEGER

+

常用的整数INTEGER的别名,为兼容A类型。

+

4字节

+

-2,147,483,648 ~ +2,147,483,647

+

BIGINT

+

大范围的整数,别名为INT8。

+

8字节

+

-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807

+
+ +示例: + +``` +--创建具有TINYINT类型数据的表。 +postgres=# CREATE TABLE int_type_t1 + ( + IT_COL1 TINYINT + ); + +--创建具有TINYINT类型数据的表。 +postgres=# INSERT INTO int_type_t1 VALUES(10); + +--查看数据。 +postgres=# SELECT * FROM int_type_t1; + it_col1 +--------- + 10 +(1 row) + +--删除表。 +postgres=# DROP TABLE int_type_t1; + +``` + +``` +--创建具有TINYINT,INTEGER,BIGINT类型数据的表。 +postgres=# CREATE TABLE int_type_t2 +( + a TINYINT, + b TINYINT, + c INTEGER, + d BIGINT +); + +--插入数据。 +postgres=# INSERT INTO int_type_t2 VALUES(100, 10, 1000, 10000); + +--查看数据。 +postgres=# SELECT * FROM int_type_t2; + a | b | c | d +-----+----+------+------- + 100 | 10 | 1000 | 10000 +(1 row) + +--删除表。 +postgres=# DROP TABLE int_type_t2; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>- TINYINT、SMALLINT、INTEGER和BIGINT类型存储各种范围的数字,也就是整数。试图存储超出范围以外的数值将会导致错误。 +>- 常用的类型是INTEGER,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。 + +**表 2** 任意精度型 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

范围

+

NUMERIC[(p[,s])],

+

DECIMAL[(p[,s])]

+

精度p取值范围为[1,1000],标度s取值范围为[0,p]。

+
说明:

p为总位数,s为小数位数。

+
+

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

+

未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。

+

NUMBER[(p[,s])]

+

NUMERIC类型的别名,为兼容A数据类型。

+

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

+

未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。

+
+ +示例: + +``` +--创建表。 +postgres=# CREATE TABLE decimal_type_t1 +( + DT_COL1 DECIMAL(10,4) +); + +--插入数据。 +postgres=# INSERT INTO decimal_type_t1 VALUES(123456.122331); + +--查询表中的数据。 +postgres=# SELECT * FROM decimal_type_t1; + dt_col1 +------------- + 123456.1223 +(1 row) + +--删除表。 +postgres=# DROP TABLE decimal_type_t1; +``` + +``` +--创建表。 +postgres=# CREATE TABLE numeric_type_t1 +( + NT_COL1 NUMERIC(10,4) +); + +--插入数据。 +postgres=# INSERT INTO numeric_type_t1 VALUES(123456.12354); + +--查询表中的数据。 +postgres=# SELECT * FROM numeric_type_t1; + nt_col1 +------------- + 123456.1235 +(1 row) + +--删除表。 +postgres=# DROP TABLE numeric_type_t1; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。在进行数值类型定义时,优先选择整数类型。当且仅当数值超出整数可表示最大范围时,再选用任意精度类型。 +>- 使用Numeric/Decimal进行列定义时,建议指定该列的精度p以及标度s。 + +**表 3** 序列整型 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

范围

+

SMALLSERIAL

+

二字节序列整型。

+

2字节

+

1 ~ 32,767

+

SERIAL

+

四字节序列整型。

+

4字节

+

1 ~ 2,147,483,647

+

BIGSERIAL

+

八字节序列整型。

+

8字节

+

1 ~ 9,223,372,036,854,775,807

+
+ +示例: + +``` +--创建表。 +postgres=# CREATE TABLE smallserial_type_tab(a SMALLSERIAL); + +--插入数据。 +postgres=# INSERT INTO smallserial_type_tab VALUES(default); + +--再次插入数据。 +postgres=# INSERT INTO smallserial_type_tab VALUES(default); + +--查看数据。 +postgres=# SELECT * FROM smallserial_type_tab; + a +--- + 1 + 2 +(2 rows) + +--创建表。 +postgres=# CREATE TABLE serial_type_tab(b SERIAL); + +--插入数据。 +postgres=# INSERT INTO serial_type_tab VALUES(default); + +--再次插入数据。 +postgres=# INSERT INTO serial_type_tab VALUES(default); + +--查看数据。 +postgres=# SELECT * FROM serial_type_tab; + b +--- + 1 + 2 +(2 rows) + +--创建表。 +postgres=# CREATE TABLE bigserial_type_tab(c BIGSERIAL); + +--插入数据。 +postgres=# INSERT INTO bigserial_type_tab VALUES(default); + +--插入数据。 +postgres=# INSERT INTO bigserial_type_tab VALUES(default); + +--查看数据。 +postgres=# SELECT * FROM bigserial_type_tab; + c +--- + 1 + 2 +(2 rows) + +--删除表。 +postgres=# DROP TABLE smallserial_type_tab; + +postgres=# DROP TABLE serial_type_tab; + +postgres=# DROP TABLE bigserial_type_tab; +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识做的概念上的便利。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值,但这个不是自动的。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除它。目前只支持在创建表时候指定SERIAL列,不可以在已有的表中,增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型,也不可以将表中存在的列类型转化为SERIAL。 + +**表 4** 浮点类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

范围

+

REAL,

+

FLOAT4

+

单精度浮点数,不精准。

+

4字节

+

6位十进制数字精度。

+

DOUBLE PRECISION,

+

FLOAT8

+

双精度浮点数,不精准。

+

8字节

+

1E-307~1E+308,

+

15位十进制数字精度。

+

FLOAT[(p)]

+

浮点数,不精准。精度p取值范围为[1,53]。

+
说明:

p为精度,表示总位数。

+
+

4字节或8字节

+

根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。

+

BINARY_DOUBLE

+

是DOUBLE PRECISION的别名,为兼容A类型。

+

8字节

+

1E-307~1E+308,

+

15位十进制数字精度。

+

DEC[(p[,s])]

+

精度p取值范围为[1,1000],标度s取值范围为[0,p]。

+
说明:

p为总位数,s为小数位位数。

+
+

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

+

未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。

+

INTEGER[(p[,s])]

+

精度p取值范围为[1,1000],标度s取值范围为[0,p]。

+

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

+

未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。

+
+ +示例: + +``` +--创建表。 +postgres=# CREATE TABLE float_type_t2 +( + FT_COL1 INTEGER, + FT_COL2 FLOAT4, + FT_COL3 FLOAT8, + FT_COL4 FLOAT(3), + FT_COL5 BINARY_DOUBLE, + FT_COL6 DECIMAL(10,4), + FT_COL7 INTEGER(6,3) +); + +--插入数据。 +postgres=# INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); + +--查看数据。 +postgres=# SELECT * FROM float_type_t2 ; + ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 +---------+---------+-------------+---------+---------+----------+--------- + 10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124 +(1 row) + +--删除表。 +postgres=# DROP TABLE float_type_t2; +``` + 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" new file mode 100644 index 000000000..706aadb91 --- /dev/null +++ "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" @@ -0,0 +1,830 @@ +# 数字操作函数和操作符 + +## 数字操作符 + +- + + + 描述:加 + + 示例: + + ``` + postgres=# SELECT 2+3 AS RESULT; + result + -------- + 5 + (1 row) + ``` + +- - + + 描述:减 + + 示例: + + ``` + postgres=# SELECT 2-3 AS RESULT; + result + -------- + -1 + (1 row) + ``` + +- \* + + 描述:乘 + + 示例: + + ``` + postgres=# SELECT 2*3 AS RESULT; + result + -------- + 6 + (1 row) + ``` + +- / + + 描述:除(除法操作符不会取整) + + 示例: + + ``` + postgres=# SELECT 4/2 AS RESULT; + result + -------- + 2 + (1 row) + ``` + + ``` + postgres=# SELECT 4/3 AS RESULT; + result + ------------------ + 1.33333333333333 + (1 row) + ``` + +- +/- + + 描述:正/负 + + 示例: + + ``` + postgres=# SELECT -2 AS RESULT; + result + -------- + -2 + (1 row) + ``` + +- % + + 描述:模(求余) + + 示例: + + ``` + postgres=# SELECT 5%4 AS RESULT; + result + -------- + 1 + (1 row) + ``` + +- @ + + 描述:绝对值 + + 示例: + + ``` + postgres=# SELECT @ -5.0 AS RESULT; + result + -------- + 5.0 + (1 row) + ``` + +- ^ + + 描述:幂(指数运算) + + 示例: + + ``` + postgres=# SELECT 2.0^3.0 AS RESULT; + result + -------------------- + 8.0000000000000000 + (1 row) + ``` + +- |/ + + 描述:平方根 + + 示例: + + ``` + postgres=# SELECT |/ 25.0 AS RESULT; + result + -------- + 5 + (1 row) + ``` + +- ||/ + + 描述:立方根 + + 示例: + + ``` + postgres=# SELECT ||/ 27.0 AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- ! + + 描述:阶乘 + + 示例: + + ``` + postgres=# SELECT 5! AS RESULT; + result + -------- + 120 + (1 row) + ``` + +- !! + + 描述:阶乘(前缀操作符) + + 示例: + + ``` + postgres=# SELECT !!5 AS RESULT; + result + -------- + 120 + (1 row) + ``` + +- & + + 描述:二进制AND + + 示例: + + ``` + postgres=# SELECT 91&15 AS RESULT; + result + -------- + 11 + (1 row) + ``` + +- | + + 描述:二进制OR + + 示例: + + ``` + postgres=# SELECT 32|3 AS RESULT; + result + -------- + 35 + (1 row) + ``` + +- \# + + 描述:二进制XOR + + 示例: + + ``` + postgres=# SELECT 17#5 AS RESULT; + result + -------- + 20 + (1 row) + ``` + +- \~ + + 描述:二进制NOT + + 示例: + + ``` + postgres=# SELECT ~1 AS RESULT; + result + -------- + -2 + (1 row) + ``` + +- << + + 描述:二进制左移 + + 示例: + + ``` + postgres=# SELECT 1<<4 AS RESULT; + result + -------- + 16 + (1 row) + ``` + +- \>\> + + 描述:二进制右移 + + 示例: + + ``` + postgres=# SELECT 8>>2 AS RESULT; + result + -------- + 2 + (1 row) + ``` + + +## 数字操作函数 + +- abs\(x\) + + 描述:绝对值。 + + 返回值类型:和输入相同。 + + 示例: + + ``` + postgres=# SELECT abs(-17.4); + abs + ------ + 17.4 + (1 row) + ``` + +- acos\(x\) + + 描述:反余弦。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT acos(-1); + acos + ------------------ + 3.14159265358979 + (1 row) + ``` + +- asin\(x\) + + 描述:反正弦。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT asin(0.5); + asin + ------------------ + .523598775598299 + (1 row) + ``` + +- atan\(x\) + + 描述:反正切。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT atan(1); + atan + ------------------ + .785398163397448 + (1 row) + ``` + +- atan2\(y, x\) + + 描述:y/x的反正切。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT atan2(2, 1); + atan2 + ------------------ + 1.10714871779409 + (1 row) + ``` + +- bitand\(integer, integer\) + + 描述:计算两个数字与运算\(&\)的结果。 + + 返回值类型:bigint类型数字。 + + 示例: + + ``` + postgres=# SELECT bitand(127, 63); + bitand + -------- + 63 + (1 row) + ``` + +- cbrt\(dp\) + + 描述:立方根。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT cbrt(27.0); + cbrt + ------ + 3 + (1 row) + ``` + +- ceil\(x\) + + 描述:不小于参数的最小的整数。 + + 返回值类型:整数。 + + 示例: + + ``` + postgres=# SELECT ceil(-42.8); + ceil + ------ + -42 + (1 row) + ``` + +- ceiling\(dp or numeric\) + + 描述:不小于参数的最小整数(ceil的别名)。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT ceiling(-95.3); + ceiling + --------- + -95 + (1 row) + ``` + +- cos\(x\) + + 描述:余弦。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT cos(-3.1415927); + cos + ------------------- + -.999999999999999 + (1 row) + ``` + +- cot\(x\) + + 描述:余切。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT cot(1); + cot + ------------------ + .642092615934331 + (1 row) + ``` + +- degrees\(dp\) + + 描述:把弧度转为角度。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT degrees(0.5); + degrees + ------------------ + 28.6478897565412 + (1 row) + ``` + +- div\(y numeric, x numeric\) + + 描述:y除以x的商的整数部分。 + + 返回值类型:numeric + + 示例: + + ``` + postgres=# SELECT div(9,4); + div + ----- + 2 + (1 row) + ``` + +- exp\(x\) + + 描述:自然指数。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT exp(1.0); + exp + -------------------- + 2.7182818284590452 + (1 row) + ``` + +- floor\(x\) + + 描述:不大于参数的最大整数。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT floor(-42.8); + floor + ------- + -43 + (1 row) + ``` + +- radians\(dp\) + + 描述:把角度转为弧度。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT radians(45.0); + radians + ------------------ + .785398163397448 + (1 row) + ``` + +- random\(\) + + 描述:0.0到1.0之间的随机数。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT random(); + random + ------------------ + .824823560658842 + (1 row) + ``` + +- ln\(x\) + + 描述:自然对数。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT ln(2.0); + ln + ------------------- + .6931471805599453 + (1 row) + ``` + +- log\(x\) + + 描述:以10为底的对数。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT log(100.0); + log + -------------------- + 2.0000000000000000 + (1 row) + ``` + +- log\(b numeric, x numeric\) + + 描述:以b为底的对数。 + + 返回值类型:numeric + + 示例: + + ``` + postgres=# SELECT log(2.0, 64.0); + log + -------------------- + 6.0000000000000000 + (1 row) + ``` + +- mod\(x,y\) + + 描述: + + x/y的余数(模) + + 如果x是0,则返回y。 + + 返回值类型:与参数类型相同。 + + 示例: + + ``` + postgres=# SELECT mod(9,4); + mod + ----- + 1 + (1 row) + ``` + + ``` + postgres=# SELECT mod(9,0); + mod + ----- + 9 + (1 row) + ``` + +- pi\(\) + + 描述:“π”常量。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT pi(); + pi + ------------------ + 3.14159265358979 + (1 row) + ``` + +- power\(a double precision, b double precision\) + + 描述:a的b次幂。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT power(9.0, 3.0); + power + ---------------------- + 729.0000000000000000 + (1 row) + ``` + +- round\(x\) + + 描述:离输入参数最近的整数。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT round(42.4); + round + ------- + 42 + (1 row) + + postgres=# SELECT round(42.6); + round + ------- + 43 + (1 row) + ``` + +- round\(v numeric, s int\) + + 描述:保留小数点后s位,s后一位进行四舍五入。 + + 返回值类型:numeric + + 示例: + + ``` + postgres=# SELECT round(42.4382, 2); + round + ------- + 42.44 + (1 row) + ``` + +- setseed\(dp\) + + 描述:为随后的random\(\)调用设置种子\(-1.0到1.0之间,包含\)。 + + 返回值类型:void + + 示例: + + ``` + postgres=# SELECT setseed(0.54823); + setseed + --------- + + (1 row) + ``` + +- sign\(x\) + + 描述:输出此参数的符号。 + + 返回值类型:-1表示负数,0表示0,1表示正数。 + + 示例: + + ``` + postgres=# SELECT sign(-8.4); + sign + ------ + -1 + (1 row) + ``` + +- sin\(x\) + + 描述:正弦。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT sin(1.57079); + sin + ------------------ + .999999999979986 + (1 row) + ``` + +- sqrt\(x\) + + 描述:平方根。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT sqrt(2.0); + sqrt + ------------------- + 1.414213562373095 + (1 row) + ``` + +- tan\(x\) + + 描述:正切。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT tan(20); + tan + ------------------ + 2.23716094422474 + (1 row) + ``` + +- trunc\(x\) + + 描述:截断(取整数部分)。 + + 返回值类型:与输入相同。 + + 示例: + + ``` + postgres=# SELECT trunc(42.8); + trunc + ------- + 42 + (1 row) + ``` + +- trunc\(v numeric, s int\) + + 描述:截断为s位小数。 + + 返回值类型:numeric + + 示例: + + ``` + postgres=# SELECT trunc(42.4382, 2); + trunc + ------- + 42.43 + (1 row) + ``` + +- width\_bucket\(op numeric, b1 numeric, b2 numeric, count int\) + + 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT width_bucket(5.35, 0.024, 10.06, 5); + width_bucket + -------------- + 3 + (1 row) + ``` + +- width\_bucket\(op dp, b1 dp, b2 dp, count int\) + + 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT width_bucket(5.35, 0.024, 10.06, 5); + width_bucket + -------------- + 3 + (1 row) + ``` + + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\257\274\345\205\245\345\222\214\346\237\245\350\257\242\347\232\204\345\271\266\345\217\221.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\257\274\345\205\245\345\222\214\346\237\245\350\257\242\347\232\204\345\271\266\345\217\221.md" new file mode 100644 index 000000000..18bfb2799 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\257\274\345\205\245\345\222\214\346\237\245\350\257\242\347\232\204\345\271\266\345\217\221.md" @@ -0,0 +1,33 @@ +# 数据导入和查询的并发 + +事务T1: + +``` +START TRANSACTION; +COPY test FROM '...'; +COMMIT; +``` + +事务T2: + +``` +START TRANSACTION; +SELECT * FROM test; +COMMIT; +``` + +场景1: + +开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,事务T2开始执行SELECT,事务T1和事务T2都执行成功。事务T2中查询看不到事务T1新COPY进来的数据。 + +场景2: + +- READ COMMITTED级别 + + 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,然后提交,事务T2查询,可以看到事务T1中COPY的数据。 + +- REPEATABLE READ级别 + + 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,然后提交,事务T2 查询,看不到事务T1中COPY的数据。 + + 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" new file mode 100644 index 000000000..870831ade --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\344\275\277\347\224\250.md" @@ -0,0 +1,21 @@ +# 数据库使用 + +- **[从这里开始](从这里开始.md)** + +- **[连接数据库](连接数据库.md)** + +- **[创建和管理数据库](创建和管理数据库.md)** + +- **[规划存储模型](规划存储模型.md)** + +- **[创建和管理表空间](创建和管理表空间.md)** + +- **[创建和管理表](创建和管理表.md)** + +- **[查看系统表](查看系统表.md)** + +- **[其他操作](其他操作.md)** + +- **[附录](附录.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\257\271\350\261\241\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\257\271\350\261\241\345\207\275\346\225\260.md" new file mode 100644 index 000000000..35e32f813 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\345\257\271\350\261\241\345\207\275\346\225\260.md" @@ -0,0 +1,454 @@ +# 数据库对象函数 + +## 数据库对象尺寸函数 + +数据库对象尺寸函数计算数据库对象使用的实际磁盘空间。 + +- pg\_column\_size\(any\) + + 描述:存储一个指定的数值需要的字节数(可能压缩过)。 + + 返回值类型:int + + 备注:pg\_column\_size显示用于存储某个独立数据值的空间。 + + ``` + postgres=# SELECT pg_column_size(1); + pg_column_size + ---------------- + 4 + (1 row) + ``` + +- pg\_database\_size\(oid\) + + 描述:指定OID代表的数据库使用的磁盘空间。 + + 返回值类型:bigint + +- pg\_database\_size\(name\) + + 描述:指定名称的数据库使用的磁盘空间。 + + 返回值类型:bigint + + 备注:pg\_database\_size接受一个数据库的OID或者名称,然后返回该对象使用的全部磁盘空间。 + + 示例: + + ``` + postgres=# SELECT pg_database_size('postgres'); + pg_database_size + ------------------ + 51590112 + (1 row) + ``` + +- pg\_relation\_size\(oid\) + + 描述:指定OID代表的表或者索引所使用的磁盘空间。 + + 返回值类型:bigint + +- get\_db\_source\_datasize\(\) + + 描述:估算当前数据库非压缩态的数据总容量 + + 返回值类型:bigint + + 备注:(1)调用该函数前需要做analyze;(2)通过估算列存的压缩率计算非压缩态的数据总容量。 + + 示例: + + ``` + postgres=# analyze; + ANALYZE + postgres=# select get_db_source_datasize(); + get_db_source_datasize + ------------------------ + 35384925667 + (1 row) + ``` + +- pg\_relation\_size\(text\) + + 描述:指定名称的表或者索引使用的磁盘空间。表名称可以用模式名修饰。 + + 返回值类型:bigint + +- pg\_relation\_size\(relation regclass, fork text\) + + 描述:指定表或索引的指定分叉树('main','fsm'或'vm')使用的磁盘空间。 + + 返回值类型:bigint + +- pg\_relation\_size\(relation regclass\) + + 描述:pg\_relation\_size\(..., 'main'\)的简写。 + + 返回值类型:bigint + + 备注:pg\_relation\_size接受一个表、索引、压缩表的OID或者名称,然后返回它们的字节大小。 + +- pg\_partition\_size\(oid,oid\) + + 描述:指定OID代表的分区使用的磁盘空间。其中,第一个oid为表的OID,第二个oid为分区的OID。 + + 返回值类型:bigint + +- pg\_partition\_size\(text, text\) + + 描述:指定名称的分区使用的磁盘空间。其中,第一个text为表名,第二个text为分区名。 + + 返回值类型:bigint + +- pg\_partition\_indexes\_size\(oid,oid\) + + 描述:指定OID代表的分区的索引使用的磁盘空间。其中,第一个oid为表的OID,第二个oid为分区的OID。 + + 返回值类型:bigint + +- pg\_partition\_indexes\_size\(text,text\) + + 描述:指定名称的分区的索引使用的磁盘空间。其中,第一个text为表名,第二个text为分区名。 + + 返回值类型:bigint + +- pg\_indexes\_size\(regclass\) + + 描述:附加到指定表的索引使用的总磁盘空间。 + + 返回值类型:bigint + +- pg\_size\_pretty\(bigint\) + + 描述:将以64位整数表示的字节值转换为具有单位的易读格式。 + + 返回值类型:text + +- pg\_size\_pretty\(numeric\) + + 描述:将以数值表示的字节值转换为具有单位的易读格式。 + + 返回值类型:text + + 备注:pg\_size\_pretty用于把其他函数的结果格式化成一种易读的格式,可以根据情况使用KB 、MB 、GB 、TB。 + +- pg\_table\_size\(regclass\) + + 描述:指定的表使用的磁盘空间,不计索引(但是包含TOAST,自由空间映射和可见性映射)。 + + 返回值类型:bigint + +- pg\_tablespace\_size\(oid\) + + 描述:指定OID代表的表空间使用的磁盘空间。 + + 返回值类型:bigint + +- pg\_tablespace\_size\(name\) + + 描述:指定名称的表空间使用的磁盘空间。 + + 返回值类型:bigint + + 备注: + + pg\_tablespace\_size接受一个数据库的OID或者名称,然后返回该对象使用的全部磁盘空间。 + +- pg\_total\_relation\_size\(oid\) + + 描述:指定OID代表的表使用的磁盘空间,包括索引和压缩数据。 + + 返回值类型:bigint + +- pg\_total\_relation\_size\(regclass\) + + 描述:指定的表使用的总磁盘空间,包括所有的索引和TOAST数据。 + + 返回值类型:bigint + +- pg\_total\_relation\_size\(text\) + + 描述:指定名称的表所使用的全部磁盘空间,包括索引和压缩数据。表名称可以用模式名修饰。 + + 返回值类型:bigint + + 备注:pg\_total\_relation\_size接受一个表或者一个压缩表的OID或者名称,然后返回以字节计的数据和所有相关的索引和压缩表的尺寸。 + +- datalength\(any\) + + 描述:计算一个指定的数据需要的字节数(不考虑数据的管理空间和数据压缩,数据类型转换等情况)。 + + 返回值类型:int + + 备注:datalength用于计算某个独立数据值的空间。 + + 示例: + + ``` + postgres=# SELECT datalength(1); + datalength + ------------ + 4 + (1 row) + ``` + + 目前支持的数据类型及计算方式见下表: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

数据类型

+

存储空间

+

数值类型

+

整数类型

+

TINYINT

+

1

+

SMALLINT

+

2

+

INTEGER

+

4

+

BINARY_INTEGER

+

4

+

BIGINT

+

8

+

任意精度型

+

DECIMAL

+

每4位十进制数占两个字节,小数点前后数字分别计算

+

NUMERIC

+

每4位十进制数占两个字节,小数点前后数字分别计算

+

NUMBER

+

每4位十进制数占两个字节,小数点前后数字分别计算

+

序列整型

+

SMALLSERIAL

+

2

+

SERIAL

+

4

+

BIGSERIAL

+

8

+

浮点类型

+

FLOAT4

+

4

+

DOUBLE PRECISION

+

8

+

FLOAT8

+

8

+

BINARY_DOUBLE

+

8

+

FLOAT[(p)]

+

每4位十进制数占两个字节,小数点前后数字分别计算

+

DEC[(p[,s])]

+

每4位十进制数占两个字节,小数点前后数字分别计算

+

INTEGER[(p[,s])]

+

每4位十进制数占两个字节,小数点前后数字分别计算

+

布尔类型

+

布尔类型

+

BOOLEAN

+

1

+

字符类型

+

字符类型

+

CHAR

+

n

+

CHAR(n)

+

n

+

CHARACTER(n)

+

n

+

NCHAR(n)

+

n

+

VARCHAR(n)

+

n

+

CHARACTER

+

字符实际字节数

+

VARYING(n)

+

字符实际字节数

+

VARCHAR2(n)

+

字符实际字节数

+

NVARCHAR2(n)

+

字符实际字节数

+

TEXT

+

字符实际字节数

+

CLOB

+

字符实际字节数

+

时间类型

+

时间类型

+

DATE

+

8

+

TIME

+

8

+

TIMEZ

+

12

+

TIMESTAMP

+

8

+

TIMESTAMPZ

+

8

+

SMALLDATETIME

+

8

+

INTERVAL DAY TO SECOND

+

16

+

INTERVAL

+

16

+

RELTIME

+

4

+

ABSTIME

+

4

+

TINTERVAL

+

12

+
+ + +## 数据库对象位置函数 + +- pg\_relation\_filenode\(relation regclass\) + + 描述:指定关系的文件节点数。 + + 返回值类型:oid + + 备注:pg\_relation\_filenode接受一个表、索引、序列或压缩表的OID或者名称,并且返回当前分配给它的"filenode"数。文件节点是关系使用的文件名称的基本组件。对大多数表来说,结果和pg\_class.relfilenode相同,但对确定的系统目录来说, relfilenode为0而且这个函数必须用来获取正确的值。如果传递一个没有存储的关系,比如一个视图,那么这个函数返回NULL。 + +- pg\_relation\_filepath\(relation regclass\) + + 描述:指定关系的文件路径名。 + + 返回值类型:text + + 备注:pg\_relation\_filepath类似于pg\_relation\_filenode,但是它返回关系的整个文件路径名(相对于openGauss的数据目录PGDATA)。 + + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\346\211\247\350\241\214\350\257\255\345\217\245\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\346\211\247\350\241\214\350\257\255\345\217\245\345\207\275\346\225\260.md" new file mode 100644 index 000000000..6955e54a5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\346\211\247\350\241\214\350\257\255\345\217\245\345\207\275\346\225\260.md" @@ -0,0 +1,29 @@ +# **数据库执行语句函数** + +与数据库服务器的连接成功建立,便可以使用这里描述的函数执行SQL查询和命令。 + +- **[PQclear](PQclear.md)** + +- **[PQexec](PQexec.md)** + +- **[PQexecParams](PQexecParams.md)** + +- **[PQexecParamsBatch](PQexecParamsBatch.md)** + +- **[PQexecPrepared](PQexecPrepared.md)** + +- **[PQexecPreparedBatch](PQexecPreparedBatch.md)** + +- **[PQfname](PQfname.md)** + +- **[PQgetvalue](PQgetvalue.md)** + +- **[PQnfields](PQnfields.md)** + +- **[PQntuples](PQntuples.md)** + +- **[PQprepare](PQprepare.md)** + +- **[PQresultStatus](PQresultStatus.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\216\247\345\210\266\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\216\247\345\210\266\345\207\275\346\225\260.md" new file mode 100644 index 000000000..81169247e --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\216\247\345\210\266\345\207\275\346\225\260.md" @@ -0,0 +1,23 @@ +# 数据库连接控制函数 + +数据库连接控制函数控制与GaussDB服务器链接的事情。一个应用程序一次可以与多个服务器建立链接,如一个客户端链接多个数据库的场景。每个链接都是用一个从函数PQconnectdb、PQconnectdbParams或PQsetdbLogin获得的PGconn对象表示。注意,这些函数总是返回一个非空的对象指针,除非内存分配失败,会返回一个空的指针。链接建立的接口保存在PGconn对象中,可以调用PQstatus函数来检查一下返回值看看连接是否成功。 + +- **[PQconnectdbParams](PQconnectdbParams.md)** + +- **[PQconnectdb](PQconnectdb.md)** + +- **[PQconninfoParse](PQconninfoParse.md)** + +- **[PQconnectStart](PQconnectStart.md)** + +- **[PQerrorMessage](PQerrorMessage.md)** + +- **[PQsetdbLogin](PQsetdbLogin.md)** + +- **[PQfinish](PQfinish.md)** + +- **[PQreset](PQreset.md)** + +- **[PQstatus](PQstatus.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.md" new file mode 100644 index 000000000..1d2feaa3a --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.md" @@ -0,0 +1,14 @@ +# 数据库逻辑结构图 + +openGauss的数据库节点负责存储数据,其存储介质也是磁盘,本节主要从逻辑视角介绍数据库节点都有哪些对象,以及这些对象之间的关系。数据库逻辑结构如[图1](#zh-cn_topic_0237120245_zh-cn_topic_0059779316_fb2fa3b3cc8824dea95318504e0537913)。 + +**图 1** 数据库逻辑结构图 +![](figures/数据库逻辑结构图.png "数据库逻辑结构图") + +>![](public_sys-resources/icon-note.gif) **说明:** +>- Tablespace,即表空间,是一个目录,可以存在多个,里面存储的是它所包含的数据库的各种物理文件。每个表空间可以对应多个Database。 +>- Database,即数据库,用于管理各类数据对象,各数据库间相互隔离。数据库管理的对象可分布在多个Tablespace上。 +>- Datafile Segment,即数据文件,通常每张表只对应一个数据文件。如果某张表的数据大于1GB,则会分为多个数据文件存储。 +>- Table,即表,每张表只能属于一个数据库,也只能对应到一个Tablespace。每张表对应的数据文件必须在同一个Tablespace中。 +>- Block,即数据块,是数据库管理的基本单位,默认大小为8KB。 + diff --git "a/content/zh/docs/Developerguide/\346\225\260\346\215\256\346\237\245\350\257\242\350\257\267\346\261\202\345\244\204\347\220\206\350\277\207\347\250\213.md" "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\346\237\245\350\257\242\350\257\267\346\261\202\345\244\204\347\220\206\350\277\207\347\250\213.md" new file mode 100644 index 000000000..631a530d9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\346\237\245\350\257\242\350\257\267\346\261\202\345\244\204\347\220\206\350\277\207\347\250\213.md" @@ -0,0 +1,5 @@ +# 数据查询请求处理过程 + +**图 1** openGauss服务响应流程 +![](figures/openGauss服务响应流程.jpg "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" new file mode 100644 index 000000000..00ca1532c --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -0,0 +1,37 @@ +# 数据类型 + +数据类型是数据的一个基本属性,用于区分不同类型的数据。不同的数据类型所占的存储空间不同,能够进行的操作也不相同。数据库中的数据存储在数据表中。数据表中的每一列都定义了数据类型,用户存储数据时,须遵从这些数据类型的属性,否则可能会出错。 + +openGauss支持某些数据类型间的隐式转换,具体转化关系请参见[PG\_CAST](PG_CAST.md#ZH-CN_TOPIC_0242385803)。 + +- **[数值类型](数值类型.md)** + +- **[货币类型](货币类型.md)** + +- **[布尔类型](布尔类型.md)** + +- **[字符类型](字符类型.md)** + +- **[二进制类型](二进制类型.md)** + +- **[日期/时间类型](日期-时间类型.md)** + +- **[几何类型](几何类型.md)** + +- **[网络地址类型](网络地址类型.md)** + +- **[位串类型](位串类型.md)** + +- **[文本搜索类型](文本搜索类型.md)** + +- **[UUID类型](UUID类型.md)** + +- **[JSON类型](JSON类型.md)** + +- **[对象标识符类型](对象标识符类型.md)** + +- **[伪类型](伪类型.md)** + +- **[列存表支持的数据类型](列存表支持的数据类型.md)** + + 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" new file mode 100644 index 000000000..9b9bd3227 --- /dev/null +++ "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" @@ -0,0 +1,380 @@ +# 数组函数和操作符 + +## 数组操作符 + +- = + + 描述:两个数组是否相等 + + 示例: + + ``` + postgres=# SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] AS RESULT ; + result + -------- + t + (1 row) + ``` + +- <\> + + 描述:两个数组是否不相等 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,2,3] <> ARRAY[1,2,4] AS RESULT; + result + -------- + t + (1 row) + ``` + +- < + + 描述:一个数组是否小于另一个数组 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,2,3] < ARRAY[1,2,4] AS RESULT; + result + -------- + t + (1 row) + ``` + +- \> + + 描述:一个数组是否大于另一个数组 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,4,3] > ARRAY[1,2,4] AS RESULT; + result + -------- + t + (1 row) + ``` + +- <= + + 描述:一个数组是否小于或等于另一个数组 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,2,3] <= ARRAY[1,2,3] AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>= + + 描述:一个数组是否大于或等于另一个数组 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,4,3] >= ARRAY[1,4,3] AS RESULT; + result + -------- + t + (1 row) + ``` + +- @\> + + 描述:一个数组是否包含另一个数组 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,4,3] @> ARRAY[3,1] AS RESULT; + result + -------- + t + (1 row) + ``` + +- <@ + + 描述:一个数组是否被包含于另一个数组 + + 示例: + + ``` + postgres=# SELECT ARRAY[2,7] <@ ARRAY[1,7,4,2,6] AS RESULT; + result + -------- + t + (1 row) + ``` + +- && + + 描述:一个数组是否和另一个数组重叠(有共同元素) + + 示例: + + ``` + postgres=# SELECT ARRAY[1,4,3] && ARRAY[2,1] AS RESULT; + result + -------- + t + (1 row) + ``` + +- || + + 描述:数组与数组进行连接 + + 示例: + + ``` + postgres=# SELECT ARRAY[1,2,3] || ARRAY[4,5,6] AS RESULT; + result + --------------- + {1,2,3,4,5,6} + (1 row) + ``` + + ``` + postgres=# SELECT ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] AS RESULT; + result + --------------------------- + {{1,2,3},{4,5,6},{7,8,9}} + (1 row) + ``` + +- || + + 描述:元素与数组进行连接 + + 示例: + + ``` + postgres=# SELECT 3 || ARRAY[4,5,6] AS RESULT; + result + ----------- + {3,4,5,6} + (1 row) + ``` + +- || + + 描述:数组与元素进行连接 + + 示例: + + ``` + postgres=# SELECT ARRAY[4,5,6] || 7 AS RESULT; + result + ----------- + {4,5,6,7} + (1 row) + ``` + + +数组比较是使用默认的B-tree比较函数对所有元素逐一进行比较的。多维数组的元素按照行顺序进行访问。如果两个数组的内容相同但维数不等,决定排序顺序的首要因素是维数。 + +## 数组函数 + +- array\_append\(anyarray, anyelement\) + + 描述:向数组末尾添加元素,只支持一维数组。 + + 返回类型:anyarray + + 示例: + + ``` + postgres=# SELECT array_append(ARRAY[1,2], 3) AS RESULT; + result + --------- + {1,2,3} + (1 row) + ``` + +- array\_prepend\(anyelement, anyarray\) + + 描述:向数组开头添加元素,只支持一维数组。 + + 返回类型:anyarray + + 示例: + + ``` + postgres=# SELECT array_prepend(1, ARRAY[2,3]) AS RESULT; + result + --------- + {1,2,3} + (1 row) + ``` + +- array\_cat\(anyarray, anyarray\) + + 描述:连接两个数组,支持多维数组。 + + 返回类型:anyarray + + 示例: + + ``` + postgres=# SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) AS RESULT; + result + ------------- + {1,2,3,4,5} + (1 row) + + postgres=# SELECT array_cat(ARRAY[[1,2],[4,5]], ARRAY[6,7]) AS RESULT; + result + --------------------- + {{1,2},{4,5},{6,7}} + (1 row) + ``` + +- array\_ndims\(anyarray\) + + 描述:返回数组的维数。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT; + result + -------- + 2 + (1 row) + ``` + +- array\_dims\(anyarray\) + + 描述:返回数组维数的文本表示。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT; + result + ------------ + [1:2][1:3] + (1 row) + ``` + +- array\_length\(anyarray, int\) + + 描述:返回数组维度的长度。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT array_length(array[1,2,3], 1) AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- array\_lower\(anyarray, int\) + + 描述:返回数组维数的下界。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT array_lower('[0:2]={1,2,3}'::int[], 1) AS RESULT; + result + -------- + 0 + (1 row) + ``` + +- array\_upper\(anyarray, int\) + + 描述:返回数组维数的上界。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT array_upper(ARRAY[1,8,3,7], 1) AS RESULT; + result + -------- + 4 + (1 row) + ``` + +- array\_to\_string\(anyarray, text \[, text\]\) + + 描述:使用第一个text作为数组的新分隔符,使用第二个text替换数组值为null的值。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') AS RESULT; + result + ----------- + 1,2,3,*,5 + (1 row) + ``` + +- string\_to\_array\(text, text \[, text\]\) + + 描述:使用第二个text指定分隔符,使用第三个可选的text作为NULL值替换模板,如果分隔后的子串与第三个可选的text完全匹配,则将其替换为NULL。 + + 返回类型:text\[\] + + 示例: + + ``` + postgres=# SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy') AS RESULT; + result + -------------- + {xx,NULL,zz} + (1 row) + postgres=# SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'y') AS RESULT; + result + ------------ + {xx,yy,zz} + (1 row) + ``` + +- unnest\(anyarray\) + + 描述:扩大一个数组为一组行。 + + 返回类型:setof anyelement + + 示例: + + ``` + postgres=# SELECT unnest(ARRAY[1,2]) AS RESULT; + result + -------- + 1 + 2 + (2 rows) + ``` + + +在string\_to\_array中,如果分隔符参数是NULL,输入字符串中的每个字符将在结果数组中变成一个独立的元素。如果分隔符是一个空白字符串,则整个输入的字符串将变为一个元素的数组。否则输入字符串将在每个分隔字符串处分开。 + +在string\_to\_array中,如果省略null字符串参数或为NULL,将字符串中没有输入内容的子串替换为NULL。 + +在array\_to\_string中,如果省略null字符串参数或为NULL,运算中将跳过在数组中的任何null元素,并且不会在输出字符串中出现。 + diff --git "a/content/zh/docs/Developerguide/\346\225\260\347\273\204\350\241\250\350\276\276\345\274\217.md" "b/content/zh/docs/Developerguide/\346\225\260\347\273\204\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 000000000..1f74d8b12 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\225\260\347\273\204\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,94 @@ +# 数组表达式 + +## IN + +_expression _**IN **_\(value \[, ...\]\)_ + +右侧括号中的是一个表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果列表中的内容符合左侧表达式的结果,则IN的结果为true。如果没有相符的结果,则IN的结果为false。 + +示例如下: + +``` +postgres=# SELECT 8000+500 IN (10000, 9000) AS RESULT; + result +---------- + f +(1 row) +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果表达式结果为null,或者表达式列表不符合表达式的条件且右侧表达式列表返回结果至少一处为空,则IN的返回结果为null,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。 + +## NOT IN + +_expression _**NOT IN**_ \(value \[, ...\]\)_ + +右侧括号中的是一个表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果在列表中的内容没有符合左侧表达式结果的内容,则NOT IN的结果为true。如果有符合的内容,则NOT IN的结果为false。 + +示例如下: + +``` +postgres=# SELECT 8000+500 NOT IN (10000, 9000) AS RESULT; + result +---------- + t +(1 row) +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果查询语句返回结果为空,或者表达式列表不符合表达式的条件且右侧表达式列表返回结果至少一处为空,则NOT IN的返回结果为null,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。 + +提示:在所有情况下X NOT IN Y等价于NOT\(X IN Y\)。 + +## ANY/SOME \(array\) + +_expression operator _**ANY **_\(array expression\)_ + +_expression operator _**SOME **_\(array expression\)_ + +``` +postgres=# SELECT 8000+500 < SOME (array[10000,9000]) AS RESULT; + result +---------- + t +(1 row) + +``` + +``` +postgres=# SELECT 8000+500 < ANY (array[10000,9000]) AS RESULT; + result +---------- + t +(1 row) +``` + +右侧括号中的是一个数组表达式,它必须产生一个数组值。左侧表达式的结果使用操作符对数组表达式的每一行结果都进行计算和比较,比较结果必须是布尔值。 + +- 如果对比结果至少获取一个真值,则ANY的结果为true。 +- 如果对比结果没有真值,则ANY的结果为false。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果结果没有真值,并且数组表达式生成至少一个值为null,则ANY的值为NULL,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。 + +SOME是ANY的同义词。 + +## ALL \(array\) + +_expression operator _**ALL **_\(array expression\)_ + +右侧括号中的是一个数组表达式,它必须产生一个数组值。左侧表达式的结果使用操作符对数组表达式的每一行结果都进行计算和比较,比较结果必须是布尔值。 + +- 如果所有的比较结果都为真值(包括数组不含任何元素的情况),则ALL的结果为true。 +- 如果存在一个或多个比较结果为假值,则ALL的结果为false。 + +如果数组表达式产生一个NULL数组,则ALL的结果为NULL。如果左边表达式的值为NULL ,则ALL的结果通常也为NULL\(某些不严格的比较操作符可能得到不同的结果\)。另外,如果右边的数组表达式中包含null元素并且比较结果没有假值,则ALL的结果将是NULL\(某些不严格的比较操作符可能得到不同的结果\), 而不是真。这样的处理方式和SQL返回空值的布尔组合规则是一致的。 + +``` +postgres=# SELECT 8000+500 < ALL (array[10000,9000]) AS RESULT; + result +---------- + t +(1 row) +``` + diff --git "a/content/zh/docs/Developerguide/\346\226\207\344\273\266\344\275\215\347\275\256.md" "b/content/zh/docs/Developerguide/\346\226\207\344\273\266\344\275\215\347\275\256.md" new file mode 100644 index 000000000..2d56da64c --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\226\207\344\273\266\344\275\215\347\275\256.md" @@ -0,0 +1,63 @@ +# 文件位置 + +数据库安装后会自动生成三个配置文件(postgresql.conf、pg\_hba.conf和pg\_ident.conf),并统一存放在数据目录(data)下。用户可以使用本节介绍的方法修改配置文件的名称和存放路径。 + +修改任意一个配置文件的存放目录时,postgresql.conf里的data\_directory参数必须设置为实际数据目录(data)。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>考虑到配置文件修改一旦出错对数据库的影响很大,不建议安装后再修改本节的配置文件。 + +## data\_directory + +**参数说明:**设置openGauss的数据目录(data目录)。此参数可以通过如下方式指定。 + +- 在安装openGauss时指定。 +- 该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,长度大于0 + +**默认值:**安装时指定,如果在安装时不指定,则默认不初始化数据库。 + +## config\_file + +**参数说明:**设置主服务器配置文件名称(postgresql.conf)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,长度大于0 + +**默认值:**postgresql.conf\(实际安装可能带有绝对目录\) + +## hba\_file + +**参数说明:**设置基于主机认证(HBA)的配置文件(pg\_hba.conf)。此参数只能在配置文件postgresql.conf中指定。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**pg\_hba.conf\(实际安装可能带有绝对目录\) + +## ident\_file + +**参数说明:**设置用于客户端认证的配置文件的名称(pg\_ident.conf)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**pg\_ident.conf\(实际安装可能带有绝对目录\) + +## external\_pid\_file + +**参数说明:**声明可被服务器管理程序使用的额外PID文件。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>这个参数只能在数据库服务重新启动后生效。 + +**取值范围:**字符串 + +**默认值:**空 + diff --git "a/content/zh/docs/Developerguide/\346\226\207\346\234\254\346\220\234\347\264\242\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\346\226\207\346\234\254\346\220\234\347\264\242\347\261\273\345\236\213.md" new file mode 100644 index 000000000..28abad6fc --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\226\207\346\234\254\346\220\234\347\264\242\347\261\273\345\236\213.md" @@ -0,0 +1,162 @@ +# 文本搜索类型 + +openGauss提供了两种数据类型用于支持全文检索。tsvector类型表示为文本搜索优化的文件格式,tsquery类型表示文本查询。 + +## tsvector + +tsvector类型表示一个检索单元,通常是一个数据库表中一行的文本字段或者这些字段的组合,tsvector类型的值是一个标准词位的有序列表,标准词位就是把同一个词的变型体都标准化相同的,在输入的同时会自动排序和消除重复。to\_tsvector函数通常用于解析和标准化文档字符串。 + +tsvector的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会自动去掉分词中重复的词条,按照一定的顺序录入。如: + +``` +postgres=# SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; + tsvector +---------------------------------------------------- + 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat' +(1 row) +``` + +从上面的例子可以看出,通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照长短和字母排序的。但是如果词条中需要包含空格或标点符号,可以用引号标记: + +``` +postgres=# SELECT $$the lexeme ' ' contains spaces$$::tsvector; + tsvector +------------------------------------------- + ' ' 'contains' 'lexeme' 'spaces' 'the' +(1 row) +``` + +如果在词条中使用引号,可以使用双$$符号作为标记: + +``` +postgres=# SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; + tsvector +------------------------------------------------ + 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the' +(1 row) +``` + +词条位置常量也可以放到词汇中: + +``` +postgres=# SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector; + tsvector +------------------------------------------------------------------------------- + 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4 +(1 row) +``` + +位置常量通常表示文档中源字的位置。位置信息可以用于进行排名。位置常量的范围是1到16383,最大值默认是16383。相同词的重复位会被忽略掉。 + +拥有位置的词汇甚至可以用一个权来标记,这个权可以是A,B,C或D。默认的是D,因此输出中不会出现: + +``` +postgres=# SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; + tsvector +---------------------------- + 'a':1A 'cat':5 'fat':2B,4C +(1 row) +``` + +权可以用来反映文档结构,如:标记标题与主体文字的区别。全文检索排序函数可以为不同的权标记分配不同的优先级。 + +下面的示例是tsvector类型标准用法。如: + +``` +postgres=# SELECT 'The Fat Rats'::tsvector; + tsvector +-------------------- + 'Fat' 'Rats' 'The' +(1 row) +``` + +但是对于英文全文检索应用来说,上面的单词会被认为非规范化的,所以需要通过to\_tsvector函数对这些单词进行规范化处理: + +``` +postgres=# SELECT to_tsvector('english', 'The Fat Rats'); + to_tsvector +----------------- + 'fat':2 'rat':3 +(1 row) +``` + +## tsquery + +tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组。to\_tsquery函数及plainto\_tsquery函数会将单词转换为tsquery类型前进行规范化处理。 + +``` +postgres=# SELECT 'fat & rat'::tsquery; + tsquery +--------------- + 'fat' & 'rat' +(1 row) + +postgres=# SELECT 'fat & (rat | cat)'::tsquery; + tsquery +--------------------------- + 'fat' & ( 'rat' | 'cat' ) +(1 row) + +postgres=# SELECT 'fat & rat & ! cat'::tsquery; + tsquery +------------------------ + 'fat' & 'rat' & !'cat' +(1 row) +``` + +在没有括号的情况下,!(非)结合的最紧密,而&(和)结合的比|(或)紧密。 + +tsquery中的词汇可以用一个或多个权字母来标记,这些权字母限制这次词汇只能与带有匹配权的tsvector词汇进行匹配。 + +``` +postgres=# SELECT 'fat:ab & cat'::tsquery; + tsquery +------------------ + 'fat':AB & 'cat' +(1 row) +``` + +同样,tsquery中的词汇可以用\*标记来指定前缀匹配: + +``` +postgres=# SELECT 'super:*'::tsquery; + tsquery +----------- + 'super':* +(1 row) +``` + +这个查询可以匹配tsvector中以“super”开始的任意单词。 + +请注意,前缀首先被文本搜索分词器处理,这也就意味着下面的结果为真: + +``` +postgres=# SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ) AS RESULT; + result +---------- + t +(1 row) +``` + +因为postgres经过处理后得到postgr: + +``` +postgres=# SELECT to_tsquery('postgres:*'); + to_tsquery +------------ + 'postgr':* +(1 row) +``` + +这样就匹配postgraduate了。 + +'Fat:ab & Cats'规范化转为tsquery类型结果如下: + +``` +postgres=# SELECT to_tsquery('Fat:ab & Cats'); + to_tsquery +------------------ + 'fat':AB & 'cat' +(1 row) +``` + diff --git "a/content/zh/docs/Developerguide/\346\226\207\346\234\254\346\243\200\347\264\242\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\226\207\346\234\254\346\243\200\347\264\242\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..5f6adcd41 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\226\207\346\234\254\346\243\200\347\264\242\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,516 @@ +# 文本检索函数和操作符 + +## 文本检索操作符 + +- @@ + + 描述:tsvector类型的词汇与tsquery类型的词汇是否匹配 + + 示例: + + ``` + postgres=# SELECT to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') AS RESULT; + result + -------- + t + (1 row) + ``` + +- @@@ + + 描述:@@的同义词 + + 示例: + + ``` + postgres=# SELECT to_tsvector('fat cats ate rats') @@@ to_tsquery('cat & rat') AS RESULT; + result + -------- + t + (1 row) + ``` + +- || + + 描述:连接两个tsvector类型的词汇 + + 示例: + + ``` + postgres=# SELECT 'a:1 b:2'::tsvector || 'c:1 d:2 b:3'::tsvector AS RESULT; + result + --------------------------- + 'a':1 'b':2,5 'c':3 'd':4 + (1 row) + ``` + +- && + + 描述:将两个tsquery类型的词汇进行“与”操作 + + 示例: + + ``` + postgres=# SELECT 'fat | rat'::tsquery && 'cat'::tsquery AS RESULT; + result + --------------------------- + ( 'fat' | 'rat' ) & 'cat' + (1 row) + ``` + +- || + + 描述:将两个tsquery类型的词汇进行“或”操作 + + 示例: + + ``` + postgres=# SELECT 'fat | rat'::tsquery || 'cat'::tsquery AS RESULT; + result + --------------------------- + ( 'fat' | 'rat' ) | 'cat' + (1 row) + ``` + +- !! + + 描述:tsquery类型词汇的非关系 + + 示例: + + ``` + postgres=# SELECT !! 'cat'::tsquery AS RESULT; + result + -------- + !'cat' + (1 row) + ``` + +- @\> + + 描述:一个tsquery类型的词汇是否包含另一个tsquery类型的词汇 + + 示例: + + ``` + postgres=# SELECT 'cat'::tsquery @> 'cat & rat'::tsquery AS RESULT; + result + -------- + f + (1 row) + ``` + +- <@ + + 描述:一个tsquery类型的词汇是否被包含另一个tsquery类型的词汇 + + 示例: + + ``` + postgres=# SELECT 'cat'::tsquery <@ 'cat & rat'::tsquery AS RESULT; + result + -------- + t + (1 row) + ``` + + +除了上述的操作符,还为tsvector类型和tsquery类型的数据定义了普通的B-tree比较操作符(=,<等)。 + +## 文本检索函数 + +- get\_current\_ts\_config\(\) + + 描述:获取文本检索的默认配置。 + + 返回类型:regconfig + + 示例: + + ``` + postgres=# SELECT get_current_ts_config(); + get_current_ts_config + ----------------------- + english + (1 row) + ``` + +- length\(tsvector\) + + 描述:tsvector类型词汇的单词数。 + + 返回类型:integer + + 示例: + + ``` + postgres=# SELECT length('fat:2,4 cat:3 rat:5A'::tsvector); + length + -------- + 3 + (1 row) + ``` + +- numnode\(tsquery\) + + 描述:tsquery类型的单词加上操作符的数量。 + + 返回类型:integer + + 示例: + + ``` + postgres=# SELECT numnode('(fat & rat) | cat'::tsquery); + numnode + --------- + 5 + (1 row) + ``` + +- plainto\_tsquery\(\[ config regconfig , \] query text\) + + 描述:产生tsquery类型的词汇,并忽略标点 + + 返回类型:tsquery + + 示例: + + ``` + postgres=# SELECT plainto_tsquery('english', 'The Fat Rats'); + plainto_tsquery + ----------------- + 'fat' & 'rat' + (1 row) + ``` + +- querytree\(query tsquery\) + + 描述:获取tsquery类型的词汇可加索引的部分。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT querytree('foo & ! bar'::tsquery); + querytree + ----------- + 'foo' + (1 row) + ``` + +- setweight\(tsvector, "char"\) + + 描述:给tsvector类型的每个元素分配权值。 + + 返回类型:tsvector + + 示例: + + ``` + postgres=# SELECT setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A'); + setweight + ------------------------------- + 'cat':3A 'fat':2A,4A 'rat':5A + (1 row) + ``` + +- strip\(tsvector\) + + 描述:删除tsvector类型单词中的position和权值。 + + 返回类型:tsvector + + 示例: + + ``` + postgres=# SELECT strip('fat:2,4 cat:3 rat:5A'::tsvector); + strip + ------------------- + 'cat' 'fat' 'rat' + (1 row) + ``` + +- to\_tsquery\(\[ config regconfig , \] query text\) + + 描述:标准化单词,并转换为tsquery类型。 + + 返回类型:tsquery + + 示例: + + ``` + postgres=# SELECT to_tsquery('english', 'The & Fat & Rats'); + to_tsquery + --------------- + 'fat' & 'rat' + (1 row) + ``` + +- to\_tsvector\(\[ config regconfig , \] document text\) + + 描述:去除文件信息,并转换为tsvector类型。 + + 返回类型:tsvector + + 示例: + + ``` + postgres=# SELECT to_tsvector('english', 'The Fat Rats'); + to_tsvector + ----------------- + 'fat':2 'rat':3 + (1 row) + ``` + +- ts\_headline\(\[ config regconfig, \] document text, query tsquery \[, options text \]\) + + 描述:高亮显示查询的匹配项。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT ts_headline('x y z', 'z'::tsquery); + ts_headline + -------------- + x y z + (1 row) + ``` + +- ts\_rank\(\[ weights float4\[\], \] vector tsvector, query tsquery \[, normalization integer \]\) + + 描述:文档查询排名。 + + 返回类型:float4 + + 示例: + + ``` + postgres=# SELECT ts_rank('hello world'::tsvector, 'world'::tsquery); + ts_rank + ---------- + .0607927 + (1 row) + ``` + +- ts\_rank\_cd\(\[ weights float4\[\], \] vector tsvector, query tsquery \[, normalization integer \]\) + + 描述:排序文件查询使用覆盖密度。 + + 返回类型:float4 + + 示例: + + ``` + postgres=# SELECT ts_rank_cd('hello world'::tsvector, 'world'::tsquery); + ts_rank_cd + ------------ + .1 + (1 row) + ``` + +- ts\_rewrite\(query tsquery, target tsquery, substitute tsquery\) + + 描述:替换目标tsquery类型的单词。 + + 返回类型:tsquery + + 示例: + + ``` + postgres=# SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'foo|bar'::tsquery); + ts_rewrite + ------------------------- + 'b' & ( 'foo' | 'bar' ) + (1 row) + ``` + +- ts\_rewrite\(query tsquery, select text\) + + 描述:使用SELECT命令的结果替代目标中tsquery类型的单词。 + + 返回类型:tsquery + + 示例: + + ``` + postgres=# SELECT ts_rewrite('world'::tsquery, 'select ''world''::tsquery, ''hello''::tsquery'); + ts_rewrite + ------------ + 'hello' + (1 row) + ``` + + +## 文本检索调试函数 + +- ts\_debug\(\[ config regconfig, \] document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary\[\], OUT dictionary regdictionary, OUT lexemes text\[\]\) + + 描述:测试一个配置。 + + 返回类型:setof record + + 示例: + + ``` + postgres=# SELECT ts_debug('english', 'The Brightest supernovaes'); + ts_debug + ----------------------------------------------------------------------------------- + (asciiword,"Word, all ASCII",The,{english_stem},english_stem,{}) + (blank,"Space symbols"," ",{},,) + (asciiword,"Word, all ASCII",Brightest,{english_stem},english_stem,{brightest}) + (blank,"Space symbols"," ",{},,) + (asciiword,"Word, all ASCII",supernovaes,{english_stem},english_stem,{supernova}) + (5 rows) + ``` + +- ts\_lexize\(dict regdictionary, token text\) + + 描述:测试一个数据字典。 + + 返回类型:text\[\] + + 示例: + + ``` + postgres=# SELECT ts_lexize('english_stem', 'stars'); + ts_lexize + ----------- + {star} + (1 row) + ``` + +- ts\_parse\(parser\_name text, document text, OUT tokid integer, OUT token text\) + + 描述:测试一个解析。 + + 返回类型:setof record + + 示例: + + ``` + postgres=# SELECT ts_parse('default', 'foo - bar'); + ts_parse + ----------- + (1,foo) + (12," ") + (12,"- ") + (1,bar) + (4 rows) + ``` + +- ts\_parse\(parser\_oid oid, document text, OUT tokid integer, OUT token text\) + + 描述:测试一个解析。 + + 返回类型:setof record + + 示例: + + ``` + postgres=# SELECT ts_parse(3722, 'foo - bar'); + ts_parse + ----------- + (1,foo) + (12," ") + (12,"- ") + (1,bar) + (4 rows) + ``` + +- ts\_token\_type\(parser\_name text, OUT tokid integer, OUT alias text, OUT description text\) + + 描述:获取分析器定义的记号类型。 + + 返回类型:setof record + + 示例: + + ``` + postgres=# SELECT ts_token_type('default'); + ts_token_type + -------------------------------------------------------------- + (1,asciiword,"Word, all ASCII") + (2,word,"Word, all letters") + (3,numword,"Word, letters and digits") + (4,email,"Email address") + (5,url,URL) + (6,host,Host) + (7,sfloat,"Scientific notation") + (8,version,"Version number") + (9,hword_numpart,"Hyphenated word part, letters and digits") + (10,hword_part,"Hyphenated word part, all letters") + (11,hword_asciipart,"Hyphenated word part, all ASCII") + (12,blank,"Space symbols") + (13,tag,"XML tag") + (14,protocol,"Protocol head") + (15,numhword,"Hyphenated word, letters and digits") + (16,asciihword,"Hyphenated word, all ASCII") + (17,hword,"Hyphenated word, all letters") + (18,url_path,"URL path") + (19,file,"File or path name") + (20,float,"Decimal notation") + (21,int,"Signed integer") + (22,uint,"Unsigned integer") + (23,entity,"XML entity") + (23 rows) + ``` + +- ts\_token\_type\(parser\_oid oid, OUT tokid integer, OUT alias text, OUT description text\) + + 描述:获取分析器定义的记号类型。 + + 返回类型:setof record + + 示例: + + ``` + postgres=# SELECT ts_token_type(3722); + ts_token_type + -------------------------------------------------------------- + (1,asciiword,"Word, all ASCII") + (2,word,"Word, all letters") + (3,numword,"Word, letters and digits") + (4,email,"Email address") + (5,url,URL) + (6,host,Host) + (7,sfloat,"Scientific notation") + (8,version,"Version number") + (9,hword_numpart,"Hyphenated word part, letters and digits") + (10,hword_part,"Hyphenated word part, all letters") + (11,hword_asciipart,"Hyphenated word part, all ASCII") + (12,blank,"Space symbols") + (13,tag,"XML tag") + (14,protocol,"Protocol head") + (15,numhword,"Hyphenated word, letters and digits") + (16,asciihword,"Hyphenated word, all ASCII") + (17,hword,"Hyphenated word, all letters") + (18,url_path,"URL path") + (19,file,"File or path name") + (20,float,"Decimal notation") + (21,int,"Signed integer") + (22,uint,"Unsigned integer") + (23,entity,"XML entity") + (23 rows) + ``` + +- ts\_stat\(sqlquery text, \[ weights text, \] OUT word text, OUT ndoc integer, OUT nentry integer\) + + 描述:获取tsvector列的统计数据。 + + 返回类型:setof record + + 示例: + + ``` + postgres=# SELECT ts_stat('select ''hello world''::tsvector'); + ts_stat + ------------- + (world,1,1) + (hello,1,1) + (2 rows) + ``` + + diff --git "a/content/zh/docs/Developerguide/\346\226\207\346\241\243\346\246\202\345\277\265.md" "b/content/zh/docs/Developerguide/\346\226\207\346\241\243\346\246\202\345\277\265.md" new file mode 100644 index 000000000..5851e88f9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\226\207\346\241\243\346\246\202\345\277\265.md" @@ -0,0 +1,27 @@ +# 文档概念 + +文档是全文搜索系统的搜索单元,例如:杂志上的一篇文章或电子邮件消息。文本搜索引擎必须能够解析文档,而且可以存储父文档的关联词素(关键词)。后续,这些关联词素用来搜索包含查询词的文档。 + +在openGauss中,文档通常是一个数据库表中一行的文本字段,或者这些字段的可能组合(级联)。文档可能存储在多个表中或者需动态获取。换句话说,一个文档由被索引化的不同部分构成,因此无法存储为一个整体。比如: + +``` +postgres=# SELECT d_dow || '-' || d_dom || '-' || d_fy_week_seq AS identify_serials FROM tpcds.date_dim WHERE d_fy_week_seq = 1; +identify_serials +------------------ + 5-6-1 + 0-8-1 + 2-3-1 + 3-4-1 + 4-5-1 + 1-2-1 + 6-7-1 +(7 rows) +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** +>实际上,在这些示例查询中,应该使用coalesce防止一个独立的NULL属性导致整个文档的NULL结果。 + +另外一种可能是:文档在文件系统中作为简单的文本文件存储。在这种情况下,数据库可以用于存储全文索引并且执行搜索,同时可以使用一些唯一标识从文件系统中检索文档。然而,从数据库外部检索文件需要拥有系统管理员权限或者特殊函数支持。因此,还是将所有数据保存在数据库中比较方便。同时,将所有数据保存在数据库中可以方便地访问文档元数据以便于索引和显示。 + +为了实现文本搜索目的,必须将每个文档减少至预处理后的tsvector格式。搜索和相关性排序都是在tsvector形式的文档上执行的。原始文档只有在被选中要呈现给用户时才会被检索。因此,我们常将tsvector说成文档,但是很显然其实它只是完整文档的一种紧凑表示。 + diff --git "a/content/zh/docs/Developerguide/\346\227\240\346\235\203\351\231\220\350\247\222\350\211\262\345\257\274\345\207\272\346\225\260\346\215\256.md" "b/content/zh/docs/Developerguide/\346\227\240\346\235\203\351\231\220\350\247\222\350\211\262\345\257\274\345\207\272\346\225\260\346\215\256.md" new file mode 100644 index 000000000..196fbdec4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\227\240\346\235\203\351\231\220\350\247\222\350\211\262\345\257\274\345\207\272\346\225\260\346\215\256.md" @@ -0,0 +1,125 @@ +# 无权限角色导出数据 + +gs\_dump和gs\_dumpall通过-U指定执行导出的用户帐户。如果当前使用的帐户不具备导出所要求的权限时,会无法导出数据。此时,可在导出命令中设置--role参数来指定具备权限的角色。在执行命令后,gs\_dump和gs\_dumpall会使用--role参数指定的角色,完成导出动作。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用gs\_dump导出human\_resource数据库数据。 + + 用户jack不具备导出数据库human\_resource的权限,而角色role1具备该权限,要实现导出数据库human\_resource,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为tar归档格式。 + + ``` + gs_dump -U jack -W Bigdata@234 -f /home/omm/backup/MPPDB_backup.tar -p 8000 human_resource --role role1 --rolepassword abc@1234 -F t + ``` + + **表 1** 常用参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

举例

+

-U

+

连接数据库的用户名。

+

-U jack

+

-W

+

指定用户连接的密码。

+
  • 如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项。
  • 如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。
+

-W Bigdata@123

+

-f

+

将导出文件发送至指定目录文件夹。如果这里省略,则使用标准输出。

+

-f /home/omm/backup/MPPDB_backup.tar

+

-p

+

指定服务器所监听的TCP端口或本地Unix域套接字后缀,以确保连接。

+

-p 8000

+

dbname

+

需要导出的数据库名称

+

human_resource

+

--role

+

指定导出使用的角色名。选择该选项,会使导出工具连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有导出工具要求的权限时,该选项会起到作用,即切换到具备相应权限的角色。

+

-r role1

+

--rolepassword

+

指定具体角色用户的角色密码。

+

--rolepassword abc@1234

+

-F

+

选择导出文件格式。-F参数值如下:

+
  • p:纯文本格式
  • c:自定义归档
  • d:目录归档格式
  • t:tar归档格式
+

-F t

+
+ + 其他参数说明请参见《工具参考》中“服务端工具 \> gs\_dump”章节或“服务端工具 \> gs\_dumpall”章节。 + + +## 示例 + +示例一:执行gs\_dump导出数据,用户jack不具备导出数据库human\_resource的权限,而角色role1具备该权限,要实现导出数据库human\_resource,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为tar归档格式。 + +``` +human_resource=# CREATE USER jack IDENTIFIED BY "1234@abc"; +CREATE ROLE + +gs_dump -U jack -W 1234@abc -f /home/omm/backup/MPPDB_backup11.tar -p 8000 human_resource --role role1 --rolepassword abc@1234 -F t +gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: total time: 4239 ms +``` + +示例二:执行gs\_dump导出数据,用户jack不具备导出模式public的权限,而角色role1具备该权限,要实现导出模式public,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为tar归档格式。 + +``` +human_resource=# CREATE USER jack IDENTIFIED BY "1234@abc"; +CREATE ROLE + +gs_dump -U jack -W 1234@abc -f /home/omm/backup/MPPDB_backup12.tar -p 8000 human_resource -n public --role role1 --rolepassword abc@1234 -F t +gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfully +gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: total time: 3278 ms +``` + +示例三:执行gs\_dumpall导出数据,用户jack不具备导出所有数据库的权限,而角色role1(管理员)具备该权限,要实现导出所有数据库,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为文本归档格式。 + +``` +human_resource=# CREATE USER jack IDENTIFIED BY "1234@abc"; +CREATE ROLE + +gs_dumpall -U jack -W 1234@abc -f /home/omm/backup/MPPDB_backup.sql -p 8000 --role role1 --rolepassword abc@1234 +gs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: dumpall operation successful +gs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: total time: 6437 ms +``` + 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" new file mode 100644 index 000000000..6adfc4e08 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\227\245\345\277\227\345\233\236\346\224\276.md" @@ -0,0 +1,70 @@ +# 日志回放 + +## recovery\_time\_target + +**参数说明:**设置recovery\_time\_target秒能够让备机完成日志写入和回放。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~3600 (秒) + +0是指不开启日志流控,1\~3600是指备机能够在recovery\_time\_target时间内完成日志的写入和回放,可以保证主机与备机切换时能够在recovery\_time\_target秒完成日志写入和回放,保证备机能够快速升主机。recovery\_time\_target设置时间过小会影响主机的性能,设置过大会失去流控效果。 + +**默认值:**0 + +## recovery\_max\_workers + +**参数说明:**设置最大并行回放线程个数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~20 + +**默认值:**1 + +## recovery\_parse\_workers + +**参数说明:**是极致RTO特性中ParseRedoRecord线程的数量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~16 + +0是指不开极致RTO,1\~16是指开极致RTO。需要配合recovery\_redo\_workers使用。若同时开启recovery\_parse\_workers和recovery\_max\_workers,以开启极致RTO的recovery\_parse\_workers为准,并行回放特性失效。 + +**默认值:**0 + +## recovery\_redo\_workers + +**参数说明:**是极致RTO特性中每个ParseRedoRecord线程对应的PageRedoWorker数量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~8 + +需要配合recovery\_parse\_workers使用。recovery\_redo\_workers是极致RTO特性中每个ParseRedoRecord线程对应的PageRedoWorker线程数量。在配合recovery\_parse\_workers使用时,只有recovery\_parse\_workers大于0 + +recovery\_redo\_workers参数才生效。 + +**默认值:**1 + +## recovery\_parallelism + +**参数说明:**查询实际回放线程个数,该参数为只读参数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~2147483647 + +**默认值:**1 + +## enable\_page\_lsn\_check + +**参数说明:**数据页lsn检查开关。回放时,检查数据页当前的lsn是否是期望的lsn。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**true + 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" new file mode 100644 index 000000000..0975a590e --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\227\245\346\234\237-\346\227\266\351\227\264\347\261\273\345\236\213.md" @@ -0,0 +1,616 @@ +# 日期/时间类型 + +openGauss支持的日期/时间类型请参见[表1](#zh-cn_topic_0237121952_zh-cn_topic_0059779229_zh-cn_topic_0058965827_table60826369)。该类型的操作符和内置函数请参见[时间和日期处理函数和操作符](时间和日期处理函数和操作符.md)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>如果其他的数据库时间格式和openGauss的时间格式不一致,可通过修改配置参数DateStyle的值来保持一致。 + +**表 1** 日期/时间类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

存储空间

+

DATE

+

日期和时间。

+

4字节(实际存储空间大小为8字节)

+

TIME [(p)] [WITHOUT TIME ZONE]

+

只用于一日内时间。

+

p表示小数点后的精度,取值范围为0~6。

+

8字节

+

TIME [(p)] [WITH TIME ZONE]

+

只用于一日内时间,带时区。

+

p表示小数点后的精度,取值范围为0~6。

+

12字节

+

TIMESTAMP[(p)] [WITHOUT TIME ZONE]

+

日期和时间。

+

p表示小数点后的精度,取值范围为0~6。

+

8字节

+

TIMESTAMP[(p)][WITH TIME ZONE]

+

日期和时间,带时区。TIMESTAMP的别名为TIMESTAMPTZ。

+

p表示小数点后的精度,取值范围为0~6。

+

8字节

+

SMALLDATETIME

+

日期和时间,不带时区。

+

精确到分钟,秒位大于等于30秒进一位。

+

8字节

+

INTERVAL DAY (l) TO SECOND (p)

+

时间间隔,X天X小时X分X秒。

+
  • l:天数的精度,取值范围为0~6。为适配A语法,未实现具体功能。
  • p:秒数的精度,取值范围为0~6。小数末尾的零不显示。
+

16字节

+

INTERVAL [FIELDS] [ (p) ]

+

时间间隔。

+
  • fields:可以是YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,DAY TO HOUR,DAY TO MINUTE,DAY TO SECOND,HOUR TO MINUTE,HOUR TO SECOND,MINUTE TO SECOND。
+
  • p:秒数的精度,取值范围为0~6,且fields为SECOND,DAY TO SECOND,HOUR TO SECOND或MINUTE TO SECOND时,参数p才有效。小数末尾的零不显示。
+

12字节

+

reltime

+

相对时间间隔。格式为:

+

X years X mons X days XX:XX:XX。

+
  • 采用儒略历计时,规定一年为365.25天,一个月为30天,计算输入值对应的相对时间间隔,输出采用POSTGRES格式。
+

4字节

+
+ +示例: + +``` +--创建表。 +postgres=# CREATE TABLE date_type_tab(coll date); + +--插入数据。 +postgres=# INSERT INTO date_type_tab VALUES (date '12-10-2010'); + +--查看数据。 +postgres=# SELECT * FROM date_type_tab; + coll +--------------------- + 2010-12-10 00:00:00 +(1 row) + +--删除表。 +postgres=# DROP TABLE date_type_tab; + +--创建表。 +postgres=# CREATE TABLE time_type_tab (da time without time zone ,dai time with time zone,dfgh timestamp without time zone,dfga timestamp with time zone, vbg smalldatetime); + +--插入数据。 +postgres=# INSERT INTO time_type_tab VALUES ('21:21:21','21:21:21 pst','2010-12-12','2013-12-11 pst','2003-04-12 04:05:06'); + +--查看数据。 +postgres=# SELECT * FROM time_type_tab; + da | dai | dfgh | dfga | vbg +----------+-------------+---------------------+------------------------+--------------------- + 21:21:21 | 21:21:21-08 | 2010-12-12 00:00:00 | 2013-12-11 16:00:00+08 | 2003-04-12 04:05:00 +(1 row) + +--删除表。 +postgres=# DROP TABLE time_type_tab; + +--创建表。 +postgres=# CREATE TABLE day_type_tab (a int,b INTERVAL DAY(3) TO SECOND (4)); + +--插入数据。 +postgres=# INSERT INTO day_type_tab VALUES (1, INTERVAL '3' DAY); + +--查看数据。 +postgres=# SELECT * FROM day_type_tab; + a | b +---+-------- + 1 | 3 days +(1 row) + +--删除表。 +postgres=# DROP TABLE day_type_tab; + +--创建表。 +postgres=# CREATE TABLE year_type_tab(a int, b interval year (6)); + +--插入数据。 +postgres=# INSERT INTO year_type_tab VALUES(1,interval '2' year); + +--查看数据。 +postgres=# SELECT * FROM year_type_tab; + a | b +---+--------- + 1 | 2 years +(1 row) + +--删除表。 +postgres=# DROP TABLE year_type_tab; +``` + +## 日期输入 + +日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。 + +日期的文本输入需要加单引号包围,语法如下: + +type \[ \( p \) \] 'value' + +可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。[表2](#zh-cn_topic_0237121952_zh-cn_topic_0059779229_t0606b0d8bec74d34a6440ef1de8d1e67)显示了date类型的输入方式。 + +**表 2** 日期输入方式 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

例子

+

描述

+

1999-01-08

+

ISO 8601格式(建议格式),任何方式下都是1999年1月8号。

+

January 8, 1999

+

在任何datestyle输入模式下都无歧义。

+

1/8/1999

+

有歧义,在MDY模式下是一月八号,在DMY模式下是八月一号。

+

1/18/1999

+

MDY模式下是一月十八日,其它模式下被拒绝。

+

01/02/03

+
  • MDY模式下的2003年1月2日。
  • DMY模式下的2003年2月1日。
  • YMD模式下的2001年2月3日。
+

1999-Jan-08

+

任何模式下都是1月8日。

+

Jan-08-1999

+

任何模式下都是1月8日。

+

08-Jan-1999

+

任何模式下都是1月8日。

+

99-Jan-08

+

YMD模式下是1月8日,否则错误。

+

08-Jan-99

+

一月八日,除了在YMD模式下是错误的之外。

+

Jan-08-99

+

一月八日,除了在YMD模式下是错误的之外。

+

19990108

+

ISO 8601;任何模式下都是1999年1月8日。

+

990108

+

ISO 8601;任何模式下都是1999年1月8日。

+

1999.008

+

年和年里的第几天。

+

J2451187

+

儒略日。

+

January 8, 99 BC

+

公元前99年。

+
+ +示例: + +``` +--创建表。 +postgres=# CREATE TABLE date_type_tab(coll date); + +--插入数据。 +postgres=# INSERT INTO date_type_tab VALUES (date '12-10-2010'); + +--查看数据。 +postgres=# SELECT * FROM date_type_tab; + coll +--------------------- + 2010-12-10 00:00:00 +(1 row) + +--查看日期格式。 +postgres=# SHOW datestyle; + DateStyle +----------- + ISO, MDY +(1 row) + +--设置日期格式。 +postgres=# SET datestyle='YMD'; +SET + +--插入数据。 +postgres=# INSERT INTO date_type_tab VALUES(date '2010-12-11'); + +--查看数据。 +postgres=# SELECT * FROM date_type_tab; + coll +--------------------- + 2010-12-10 00:00:00 + 2010-12-11 00:00:00 +(2 rows) + +--删除表。 +postgres=# DROP TABLE date_type_tab; +``` + +## 时间 + +时间类型包括time \[ \(p\) \] without time zone和time \[ \(p\) \] with time zone。如果只写time等效于time without time zone。 + +如果在time without time zone类型的输入中声明了时区,则会忽略这个时区。 + +时间输入类型的详细信息请参见[表3](#zh-cn_topic_0237121952_zh-cn_topic_0059779229_tc5d1089552ca4fb2a9f5ba27767a26b6),时区输入类型的详细信息请参加[表4](#zh-cn_topic_0237121952_zh-cn_topic_0059779229_te78a582bdc984cd3b5ecac5502f7793e)。 + +**表 3** 时间输入 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

例子

+

描述

+

05:06.8

+

ISO 8601

+

4:05:06

+

ISO 8601

+

4:05

+

ISO 8601

+

40506

+

ISO 8601

+

4:05 AM

+

与04:05一样,AM不影响数值

+

4:05 PM

+

与16:05一样,输入小时数必须<= 12

+

04:05:06.789-8

+

ISO 8601

+

04:05:06-08:00

+

ISO 8601

+

04:05-08:00

+

ISO 8601

+

040506-08

+

ISO 8601

+

04:05:06 PST

+

缩写的时区

+

2003-04-12 04:05:06 America/New_York

+

用名称声明的时区

+
+ +**表 4** 时区输入 + + + + + + + + + + + + + + + + + + + + + + +

例子

+

描述

+

PST

+

太平洋标准时间(Pacific Standard Time)

+

America/New_York

+

完整时区名称

+

-8:00

+

ISO 8601与PST的偏移

+

-800

+

ISO 8601与PST的偏移

+

-8

+

ISO 8601与PST的偏移

+
+ +示例: + +``` +postgres=# SELECT time '04:05:06'; + time +---------- + 04:05:06 +(1 row) + +postgres=# SELECT time '04:05:06 PST'; + time +---------- + 04:05:06 +(1 row) + +postgres=# SELECT time with time zone '04:05:06 PST'; + timetz +------------- + 04:05:06-08 +(1 row) +``` + +## 特殊值 + +openGauss支持几个特殊值,在读取的时候将被转换成普通的日期/时间值,请参考[表5](#zh-cn_topic_0237121952_zh-cn_topic_0059779229_t8366745d681748c28d5a76843c7f0d4b)。 + +**表 5** 特殊值 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

输入字符串

+

适用类型

+

描述

+

epoch

+

date,timestamp

+

1970-01-01 00:00:00+00 (Unix系统零时)

+

infinity

+

timestamp

+

比任何其他时间戳都晚

+

-infinity

+

timestamp

+

比任何其他时间戳都早

+

now

+

date,time,timestamp

+

当前事务的开始时间

+

today

+

date,timestamp

+

今日午夜

+

tomorrow

+

date,timestamp

+

明日午夜

+

yesterday

+

date,timestamp

+

昨日午夜

+

allballs

+

time

+

00:00:00.00 UTC

+
+ +## 时间段输入 + +reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外,文本输入需要加单引号。 + +时间段输入的详细信息请参考[表6 时间段输入](#zh-cn_topic_0237121952_table1747116463276)。 + +**表 6** 时间段输入 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

输入示例

+

输出结果

+

描述

+

60

+

2 mons

+

采用数字表示时间段,默认单位是day,可以是小数或负数。特别的,负数时间段,在语义上,可以理解为“早于多久”。

+

31.25

+

1 mons 1 days 06:00:00

+

-365

+

-12 mons -5 days

+

1 years 1 mons 8 days 12:00:00

+

1 years 1 mons 8 days 12:00:00

+

采用POSTGRES格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。

+

-13 months -10 hours

+

-1 years -25 days -04:00:00

+

-2 YEARS +5 MONTHS 10 DAYS

+

-1 years -6 mons -25 days -06:00:00

+

P-1.1Y10M

+

-3 mons -5 days -06:00:00

+

采用ISO-8601格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。

+

+

-12H

+

-12:00:00

+
+ +示例: + +``` +--创建表。 +postgres=# CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime); + +--插入数据。 +postgres=# INSERT INTO reltime_type_tab VALUES ('90', '90'); +postgres=# INSERT INTO reltime_type_tab VALUES ('-366', '-366'); +postgres=# INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25'); +postgres=# INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS'); +postgres=# INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00'); +postgres=# INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M'); + +--查看数据。 +postgres=# SELECT * FROM reltime_type_tab; + col1 | col2 +--------------------------------+------------------------------------- + 1975.25 | 5 years 4 mons 29 days + -2 YEARS +5 MONTHS 10 DAYS | -1 years -6 mons -25 days -06:00:00 + P-1.1Y10M | -3 mons -5 days -06:00:00 + -366 | -1 years -18:00:00 + 90 | 3 mons + 30 DAYS 12:00:00 | 1 mon 12:00:00 +(6 rows) + +--删除表。 +postgres=# DROP TABLE reltime_type_tab; +``` + 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" new file mode 100644 index 000000000..59123b7df --- /dev/null +++ "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" @@ -0,0 +1,1333 @@ +# 时间和日期处理函数和操作符 + +## 时间日期操作符 + +>![](public_sys-resources/icon-warning.gif) **警告:** +>用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。 +>比如下面示例没有明确数据类型就会出现异常错误。 +>``` +>SELECT date '2001-10-01' - '7' AS RESULT; +>``` + +**表 1** 时间和日期操作符 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

操作符

+

示例

+

+

+
postgres=# SELECT date '2001-09-28' + integer '7' AS RESULT;
+       result        
+---------------------
+ 2001-10-05 00:00:00
+(1 row)
+
postgres=# SELECT date '2001-09-28' + interval '1 hour' AS RESULT;
+       result        
+---------------------
+ 2001-09-28 01:00:00
+(1 row)
+
postgres=# SELECT date '2001-09-28' + time '03:00' AS RESULT;
+       result        
+---------------------
+ 2001-09-28 03:00:00
+(1 row)
+
postgres=# SELECT interval '1 day' + interval '1 hour' AS RESULT;
+     result     
+----------------
+ 1 day 01:00:00
+(1 row)
+
postgres=# SELECT timestamp '2001-09-28 01:00' + interval '23 hours' AS RESULT;
+       result        
+---------------------
+ 2001-09-29 00:00:00
+(1 row)
+
postgres=# SELECT time '01:00' + interval '3 hours' AS RESULT;
+  result  
+----------
+ 04:00:00
+(1 row)
+

-

+
postgres=# SELECT date '2001-10-01' - date '2001-09-28' AS RESULT;
+ result 
+--------
+ 3 days
+(1 row)
+
postgres=# SELECT date '2001-10-01' - integer '7' AS RESULT;
+       result        
+---------------------
+ 2001-09-24 00:00:00
+(1 row)
+
postgres=# SELECT date '2001-09-28' - interval '1 hour' AS RESULT;
+       result        
+---------------------
+ 2001-09-27 23:00:00
+(1 row)
+
postgres=# SELECT time '05:00' - time '03:00' AS RESULT;
+  result  
+----------
+ 02:00:00
+(1 row)
+
postgres=# SELECT time '05:00' - interval '2 hours' AS RESULT;
+  result  
+----------
+ 03:00:00
+(1 row)
+
postgres=# SELECT timestamp '2001-09-28 23:00' - interval '23 hours' AS RESULT;
+       result        
+---------------------
+ 2001-09-28 00:00:00
+(1 row)
+
postgres=# SELECT interval '1 day' - interval '1 hour' AS RESULT;
+  result  
+----------
+ 23:00:00
+(1 row)
+
postgres=# SELECT timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' AS RESULT;
+     result     
+----------------
+ 1 day 15:00:00
+(1 row)
+

*

+
postgres=# SELECT 900 * interval '1 second' AS RESULT;
+  result  
+----------
+ 00:15:00
+(1 row)
+
postgres=# SELECT 21 * interval '1 day' AS RESULT;
+ result  
+---------
+ 21 days
+(1 row)
+
postgres=# SELECT double precision '3.5' * interval '1 hour' AS RESULT;
+  result  
+----------
+ 03:30:00
+(1 row)
+

/

+
postgres=# SELECT interval '1 hour' / double precision '1.5' AS RESULT;
+  result  
+----------
+ 00:40:00
+(1 row)
+
+ +## 时间/日期函数 + +- age\(timestamp, timestamp\) + + 描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负。 + + 返回值类型:interval + + 示例: + + ``` + postgres=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13'); + age + ------------------------- + 43 years 9 mons 27 days + (1 row) + ``` + +- age\(timestamp\) + + 描述:当前时间和参数相减。 + + 返回值类型:interval + + 示例: + + ``` + postgres=# SELECT age(timestamp '1957-06-13'); + age + ------------------------- + 60 years 2 mons 18 days + (1 row) + ``` + +- clock\_timestamp\(\) + + 描述:实时时钟的当前时间戳。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT clock_timestamp(); + clock_timestamp + ------------------------------- + 2017-09-01 16:57:36.636205+08 + (1 row) + ``` + +- current\_date + + 描述:当前日期。 + + 返回值类型:date + + 示例: + + ``` + postgres=# SELECT current_date; + date + ------------ + 2017-09-01 + (1 row) + ``` + +- current\_time + + 描述:当前时间。 + + 返回值类型:time with time zone + + 示例: + + ``` + postgres=# SELECT current_time; + timetz + -------------------- + 16:58:07.086215+08 + (1 row) + ``` + +- current\_timestamp + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT current_timestamp; + pg_systimestamp + ------------------------------ + 2017-09-01 16:58:19.22173+08 + (1 row) + ``` + +- date\_part\(text, timestamp\) + + 描述: + + 获取小时的值。 + + 等效于extract\(field from timestamp\)。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40'); + date_part + ----------- + 20 + (1 row) + ``` + +- date\_part\(text, interval\) + + 描述:获取月份的值。如果大于12,则取与12的模。等效于extract\(field from timestamp\)。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT date_part('month', interval '2 years 3 months'); + date_part + ----------- + 3 + (1 row) + ``` + +- date\_trunc\(text, timestamp\) + + 描述:截取到参数text指定的精度。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40'); + date_trunc + --------------------- + 2001-02-16 20:00:00 + (1 row) + ``` + +- trunc\(timestamp\) + + 描述:默认按天截取。 + + 示例: + + ``` + postgres=# SELECT trunc(timestamp '2001-02-16 20:38:40'); trunc + --------------------- + 2001-02-16 00:00:00 + (1 row) + ``` + +- extract\(field from timestamp\) + + 描述:获取小时的值。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT extract(hour from timestamp '2001-02-16 20:38:40'); + date_part + ----------- + 20 + (1 row) + ``` + +- extract\(field from interval\) + + 描述:获取月份的值。如果大于12,则取与12的模。 + + 返回值类型:double precision + + 示例: + + ``` + postgres=# SELECT extract(month from interval '2 years 3 months'); + date_part + ----------- + 3 + (1 row) + ``` + +- isfinite\(date\) + + 描述:测试是否为有效日期。 + + 返回值类型:Boolean + + 示例: + + ``` + postgres=# SELECT isfinite(date '2001-02-16'); + isfinite + ---------- + t + (1 row) + ``` + +- isfinite\(timestamp\) + + 描述:测试判断是否为有效时间。 + + 返回值类型:Boolean + + 示例: + + ``` + postgres=# SELECT isfinite(timestamp '2001-02-16 21:28:30'); + isfinite + ---------- + t + (1 row) + ``` + +- isfinite\(interval\) + + 描述:测试是否为有效区间。 + + 返回值类型:Boolean + + 示例: + + ``` + postgres=# SELECT isfinite(interval '4 hours'); + isfinite + ---------- + t + (1 row) + ``` + +- justify\_days\(interval\) + + 描述:将时间间隔以月(30天为一月)为单位。 + + 返回值类型:interval + + 示例: + + ``` + postgres=# SELECT justify_days(interval '35 days'); + justify_days + -------------- + 1 mon 5 days + (1 row) + ``` + +- justify\_hours\(interval\) + + 描述:将时间间隔以天(24小时为一天)为单位。 + + 返回值类型:interval + + 示例: + + ``` + postgres=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS'); + justify_hours + ---------------- + 1 day 03:00:00 + (1 row) + ``` + +- justify\_interval\(interval\) + + 描述:结合justify\_days和justify\_hours,调整interval。 + + 返回值类型:interval + + 示例: + + ``` + postgres=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR'); + justify_interval + ------------------ + 29 days 23:00:00 + (1 row) + ``` + +- localtime + + 描述:当前时间。 + + 返回值类型:time + + 示例: + + ``` + postgres=# SELECT localtime AS RESULT; + result + ---------------- + 16:05:55.664681 + (1 row) + ``` + +- localtimestamp + + 描述:当前日期及时间。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT localtimestamp; + timestamp + ---------------------------- + 2017-09-01 17:03:30.781902 + (1 row) + ``` + +- now\(\) + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT now(); + now + ------------------------------- + 2017-09-01 17:03:42.549426+08 + (1 row) + ``` + +- numtodsinterval\(num, interval\_unit\) + + 描述:将数字转换为interval类型。num为numeric类型数字,interval\_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 + + 可以通过设置参数[IntervalStyle](区域和格式化.md#zh-cn_topic_0237124733_zh-cn_topic_0059778109_s89302a8dcd7f46ecb7167574d6397dc0)为a,兼容该函数在A DB中的interval输出格式。 + + 示例: + + ``` + postgres=# SELECT numtodsinterval(100, 'HOUR'); + numtodsinterval + ----------------- + 100:00:00 + (1 row) + + postgres=# SET intervalstyle = a; + SET + postgres=# SELECT numtodsinterval(100, 'HOUR'); + numtodsinterval + ------------------------------- + +000000004 04:00:00.000000000 + (1 row) + ``` + +- pg\_sleep\(seconds\) + + 描述:服务器线程延迟时间,单位为秒。 + + 返回值类型:void + + 示例: + + ``` + postgres=# SELECT pg_sleep(10); + pg_sleep + ---------- + + (1 row) + ``` + +- statement\_timestamp\(\) + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT statement_timestamp(); + statement_timestamp + ------------------------------- + 2017-09-01 17:04:39.119267+08 + (1 row) + ``` + +- sysdate + + 描述:当前日期及时间。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT sysdate; + sysdate + --------------------- + 2017-09-01 17:04:49 + (1 row) + ``` + +- timeofday\(\) + + 描述:当前日期及时间(像clock\_timestamp,但是返回时为text)。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT timeofday(); + timeofday + ------------------------------------- + Fri Sep 01 17:05:01.167506 2017 CST + (1 row) + ``` + +- transaction\_timestamp\(\) + + 描述:当前日期及时间,与current\_timestamp等效。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT transaction_timestamp(); + transaction_timestamp + ------------------------------- + 2017-09-01 17:05:13.534454+08 + (1 row) + ``` + +- add\_months\(d,n\) + + 描述:用于计算时间点d再加上n个月的时间。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM dual; + add_months + --------------------- + 2018-04-29 00:00:00 + (1 row) + ``` + +- last\_day\(d\) + + 描述:用于计算时间点d当月最后一天的时间。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result; + cal_result + --------------------- + 2017-01-31 00:00:00 + (1 row) + ``` + + +- next\_day\(x,y\) + + 描述:用于计算时间点x开始的下一个星期几(y)的时间。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# select next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result; + cal_result + --------------------- + 2017-05-28 00:00:00 + (1 row) + ``` + + +## TIMESTAMPDIFF + +**TIMESTAMPDIFF\(**_unit , timestamp\_expr1, timestamp\_expr2_**\)** + +timestampdiff函数是计算两个日期时间之间\(timestamp\_expr2-timestamp\_expr1\)的差值,并以unit形式范围结果。timestamp\_expr1,timestamp\_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。extract函数返回类型为int64的数值。unit的取值范围如下所示。 + +- year + + 年份。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 2 + (1 row) + ``` + + +- quarter + + 季度。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(QUARTER, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 8 + (1 row) + ``` + +- month + + 月份。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 24 + (1 row) + ``` + +- week + + 星期。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(WEEK, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 104 + (1 row) + ``` + +- day + + 天。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(DAY, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 730 + (1 row) + ``` + + +- hour + + 小时。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(HOUR, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); + timestamp_diff + ---------------- + 1 + (1 row) + + ``` + + +- minute + + 分钟。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(MINUTE, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); + timestamp_diff + ---------------- + 61 + (1 row) + + ``` + + +- second + + 秒。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(SECOND, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); + timestamp_diff + ---------------- + 3661 + (1 row) + + + ``` + + +- microseconds + + 秒域(包括小数部分)乘以1,000,000。 + + ``` + postgres=# SELECT TIMESTAMPDIFF(MICROSECOND, '2020-01-01 10:10:10.000000', '2020-01-01 10:10:10.111111'); + timestamp_diff + ---------------- + 111111 + (1 row) + + ``` + + +## EXTRACT + +**EXTRACT\(**_field _**FROM **_source_**\)** + +extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。 + +- century + + 世纪。 + + 第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。 + + 示例: + + ``` + postgres=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); + date_part + ----------- + 20 + (1 row) + ``` + +- day + - 如果source为timestamp,表示月份里的日期(1-31)。 + + ``` + postgres=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 16 + (1 row) + ``` + + - 如果source为interval,表示天数。 + + ``` + postgres=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); + date_part + ----------- + 40 + (1 row) + ``` + + +- decade + + 年份除以10。 + + ``` + postgres=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 200 + (1 row) + ``` + +- dow + + 每周的星期几,星期天(0)到星期六(6)。 + + ``` + postgres=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 5 + (1 row) + ``` + +- doy + + 一年的第几天(1\~365/366)。 + + ``` + postgres=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 47 + (1 row) + ``` + +- epoch + - 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); + + 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; + + 如果source为interval,表示时间间隔的总秒数。 + + ``` + postgres=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); + date_part + -------------- + 982384720.12 + (1 row) + ``` + + ``` + postgres=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); + date_part + ----------- + 442800 + (1 row) + ``` + + - 将epoch值转换为时间戳的方法。 + + ``` + postgres=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; + result + --------------------------- + 2001-02-17 12:38:40.12+08 + (1 row) + ``` + + +- hour + + 小时域(0-23)。 + + ``` + postgres=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 20 + (1 row) + ``` + +- isodow + + 一周的第几天(1-7)。 + + 星期一为1,星期天为7。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >除了星期天外,都与dow相同。 + + ``` + postgres=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); + date_part + ----------- + 7 + (1 row) + ``` + +- isoyear + + 日期中的ISO 8601标准年(不适用于间隔)。 + + 每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。 + + ``` + postgres=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); + date_part + ----------- + 2005 + (1 row) + ``` + + ``` + postgres=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); + date_part + ----------- + 2006 + (1 row) + ``` + +- microseconds + + 秒域(包括小数部分)乘以1,000,000。 + + ``` + postgres=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); + date_part + ----------- + 28500000 + (1 row) + ``` + +- millennium + + 千年。 + + 20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。 + + ``` + postgres=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 3 + (1 row) + ``` + +- milliseconds + + 秒域(包括小数部分)乘以1000。请注意它包括完整的秒。 + + ``` + postgres=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); + date_part + ----------- + 28500 + (1 row) + ``` + +- minute + + 分钟域(0-59)。 + + ``` + postgres=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 38 + (1 row) + ``` + +- month + + 如果source为timestamp,表示一年里的月份数(1-12)。 + + ``` + postgres=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 2 + (1 row) + ``` + + 如果source为interval,表示月的数目,然后对12取模(0-11)。 + + ``` + postgres=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); + date_part + ----------- + 1 + (1 row) + ``` + +- quarter + + 该天所在的该年的季度(1-4)。 + + ``` + postgres=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 1 + (1 row) + ``` + +- second + + 秒域,包括小数部分(0-59)。 + + ``` + postgres=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); + date_part + ----------- + 28.5 + (1 row) + ``` + +- timezone + + 与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。 + +- timezone\_hour + + 时区偏移量的小时部分。 + +- timezone\_minute + + 时区偏移量的分钟部分。 + +- week + + 该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。 + + 在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2005-01-01是2004年的第53周,而2006-01-01是2005年的第52周,2012-12-31是2013年的第一周。建议isoyear字段和week一起使用以得到一致的结果。 + + ``` + postgres=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 7 + (1 row) + ``` + +- year + + 年份域。 + + ``` + postgres=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 2001 + (1 row) + ``` + + +## date\_part + +date\_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract): + +**date\_part\('**_field_**', **_source_**\)** + +这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见[EXTRACT](#zh-cn_topic_0237121972_zh-cn_topic_0059779084_scb40477163d740de80f0e984cad28e7b)。 + +示例: + +``` +postgres=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); + date_part +----------- + 16 +(1 row) +``` + +``` +postgres=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); + date_part +----------- + 4 +(1 row) +``` + +[表2](#zh-cn_topic_0237121972_zh-cn_topic_0059779084_t2e5425ae98464c3dab59352ff3bfa786)显示了可以用于格式化日期和时间值的模版。 + +**表 2** 用于日期/时间格式化的模式 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类别

+

模式

+

描述

+

小时

+

HH

+

一天的小时数(01-12)

+

HH12

+

一天的小时数(01-12)

+

HH24

+

一天的小时数(00-23)

+

分钟

+

MI

+

分钟(00-59)

+

+

SS

+

秒(00-59)

+

FF

+

微秒(000000-999999)

+

SSSSS

+

午夜后的秒(0-86399)

+

上、下午

+

AM或A.M.

+

上午标识

+

PM或P.M.

+

下午标识

+

+

Y,YYY

+

带逗号的年(4和更多位)

+

SYYYY

+

公元前四位年

+

YYYY

+

年(4和更多位)

+

YYY

+

年的后三位

+

YY

+

年的后两位

+

Y

+

年的最后一位

+

IYYY

+

ISO年(4位或更多位)

+

IYY

+

ISO年的最后三位

+

IY

+

ISO年的最后两位

+

I

+

ISO年的最后一位

+

RR

+

年的后两位(可在21世纪存储20世纪的年份)

+

RRRR

+

可接收4位年或两位年。若是两位,则和RR的返回值相同,若是四位,则和YYYY相同。

+
  • BC或B.C.
  • AD或A.D.
+

纪元标识。BC(公元前),AD(公元后)。

+

+

MONTH

+

全长大写月份名(空白填充为9字符)

+

MON

+

大写缩写月份名(3字符)

+

MM

+

月份数(01-12)

+

RM

+

罗马数字的月份(I-XII ;I=JAN)(大写)

+

+

DAY

+

全长大写日期名(空白填充为9字符)

+

DY

+

缩写大写日期名(3字符)

+

DDD

+

一年里的日(001-366)

+

DD

+

一个月里的日(01-31)

+

D

+

一周里的日(1-7 ;周日是 1)

+

+

W

+

一个月里的周数(1-5)(第一周从该月第一天开始)

+

WW

+

一年里的周数(1-53)(第一周从该年的第一天开始)

+

IW

+

ISO一年里的周数(第一个星期四在第一周里)

+

世纪

+

CC

+

世纪(2位)(21 世纪从 2001-01-01 开始)

+

儒略日

+

J

+

儒略日(自公元前 4712 年 1 月 1 日来的天数)

+

季度

+

Q

+

季度

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>上表中RR计算年的规则如下: +>- 输入的两位年份在00\~49之间: +> 当前年份的后两位在00\~49之间,返回值年份的前两位和当前年份的前两位相同; +> 当前年份的后两位在50\~99之间,返回值年份的前两位是当前年份的前两位加1。 +>- 输入的两位年份在50\~99之间: +> 当前年份的后两位在00\~49之间,返回值年份的前两位是当前年份的前两位减1; +> 当前年份的后两位在50\~99之间,返回值年份的前两位和当前年份的前两位相同。 + 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-11.md" new file mode 100644 index 000000000..7f2e853c0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256-11.md" @@ -0,0 +1,7 @@ +# 更新表中数据 + +- **[使用DML命令更新表](使用DML命令更新表.md)** + +- **[使用合并方式更新和插入数据](使用合并方式更新和插入数据.md)** + + 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.md" "b/content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256.md" new file mode 100644 index 000000000..75fc7f756 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\233\264\346\226\260\350\241\250\344\270\255\346\225\260\346\215\256.md" @@ -0,0 +1,40 @@ +# 更新表中数据 + +修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行,所有行或者指定的部分行。还可以独立更新每个字段,而其他字段则不受影响。 + +使用UPDATE命令更新现有行,需要提供以下三种信息: + +- 表的名称和要更新的字段名 +- 字段的新值 +- 要更新哪些行 + +SQL通常不会为数据行提供唯一标识,因此无法直接声明需要更新哪一行。但是可以通过声明一个被更新的行必须满足的条件。只有在表里存在主键的时候,才可以通过主键指定一个独立的行。 + +建立表和插入数据的步骤请参考[创建表](创建表.md)和[向表中插入数据](向表中插入数据.md)。 + +需要将表customer\_t1中c\_customer\_sk为9527的地域重新定义为9876: + +``` +postgres=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527; +``` + +这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量,也可以是变量表达式。 + +比如,把所有c\_customer\_sk的值增加100: + +``` +postgres=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100; +``` + +在这里省略了WHERE子句,表示表中的所有行都要被更新。如果出现了WHERE子句,那么只有匹配其条件的行才会被更新。 + +在SET子句中的等号是一个赋值,而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试,许多其他的操作符也可以使用。 + +用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,比如: + +``` +postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421; +``` + +批量更新或删除数据后,会在数据文件中产生大量的删除标记,查询过程中标记删除的数据也是需要扫描的。故多次批量更新/删除后,标记删除的数据量过大会严重影响查询的性能。建议在批量更新/删除业务会反复执行的场景下,定期执行VACUUM FULL以保持查询性能。 + diff --git "a/content/zh/docs/Developerguide/\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/content/zh/docs/Developerguide/\346\234\200\344\275\263\345\256\236\350\267\265.md" new file mode 100644 index 000000000..fe8a796b4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -0,0 +1,79 @@ +# 最佳实践 + +相关参数解释参考表[GS\_OPT\_MODEL](GS_OPT_MODEL.md)。 + +**表 1** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

模型参数

+

参数建议

+

template_name

+

‘rlstm’

+

model_name

+

自定义,如‘open_ai’,需满足unique约束。

+

datname

+

所服务database名称,如‘postgres’。

+

ip

+

aiEngine-ip地址,如‘127.0.0.1’。

+

port

+

aiEngine监听端口,如‘5000’。

+

max_epoch

+

迭代次数,推荐较大数值,保证收敛效果,如‘2000’。

+

learning_rate

+

(0, 1]浮点数,推荐较大的学习率,助于加快收敛速度。

+

dim_red

+

特征值降维系数:

+

‘-1’:不采用PCA降维,全量特征;

+

‘(0,1] ’区间浮点数:越小,训练维度越小,收敛速度越快,但影响训练准确率。

+

hidden_units

+

特征值维度较高时,建议适度增大此参数,提高模型复杂度,如 ‘64,128……’

+

batch_size

+

根据编码数据量,较大数据量推荐适度增大此参数,加快模型收敛,如‘256,512……’

+

其他参数

+

参考表GS_OPT_MODEL

+
+ +推荐参数配置: + +``` +INSERT INTO gs_opt_model values('rlstm', 'open_ai', 'postgres', '127.0.0.1', 5000, 2000,1, -1, 64, 512, 0 , false, false, '{S, T}', '{0,0}', '{0,0}', 'Text'); +``` + diff --git "a/content/zh/docs/Developerguide/\346\234\215\345\212\241\345\231\250\344\277\241\345\217\267\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\346\234\215\345\212\241\345\231\250\344\277\241\345\217\267\345\207\275\346\225\260.md" new file mode 100644 index 000000000..445fc0afc --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\234\215\345\212\241\345\231\250\344\277\241\345\217\267\345\207\275\346\225\260.md" @@ -0,0 +1,53 @@ +# 服务器信号函数 + +服务器信号函数向其他服务器进程发送控制信号。只有系统管理员才能使用这些函数。 + +- pg\_cancel\_backend\(pid int\) + + 描述:取消一个后端的当前查询。 + + 返回值类型:Boolean + + 备注:pg\_cancel\_backend向由pid标识的后端进程发送一个查询取消(SIGINT)信号。一个活动的后端进程的PID可以从pg\_stat\_activity视图的pid字段找到,或者在服务器上用ps列出数据库进程。 + +- pg\_reload\_conf\(\) + + 描述:导致所有服务器进程重新装载它们的配置文件。 + + 返回值类型:Boolean + + 备注:pg\_reload\_conf给服务器发送一个SIGHUP信号,导致所有服务器进程重新装载配置文件。 + +- pg\_rotate\_logfile\(\) + + 描述:滚动服务器的日志文件。 + + 返回值类型:Boolean + + 备注:pg\_rotate\_logfile给日志文件管理器发送信号,告诉它立即切换到一个新的输出文件。这个函数只有在redirect\_stderr用于日志输出的时候才有用,否则根本不存在日志文件管理器子进程。 + +- pg\_terminate\_backend\(pid int\) + + 描述:终止一个后台线程。 + + 返回值类型:Boolean + + 备注:如果成功,函数返回true,否则返回false。 + + 示例: + + ``` + postgres=# SELECT pid from pg_stat_activity; + pid + ----------------- + 140657876268816 + (1 rows) + + postgres=# SELECT pg_terminate_backend(140657876268816); + pg_terminate_backend + ---------------------- + t + (1 row) + ``` + + diff --git "a/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" "b/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 000000000..f42e38f0b --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,214 @@ +# 条件表达式 + +在执行SQL语句时,可通过条件表达式筛选出符合条件的数据。 + +条件表达式主要有以下几种: + +- CASE + + CASE表达式是条件表达式,类似于其他编程语言中的CASE语句。 + + CASE表达式的语法图请参考[图1](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f6defc8307fd0434380b6ba22838ed5f1)。 + + **图 1** case::= + ![](figures/case.jpg "case") + + CASE子句可以用于合法的表达式中。condition是一个返回BOOLEAN数据类型的表达式: + + - 如果结果为真,CASE表达式的结果就是符合该条件所对应的result。 + - 如果结果为假,则以相同方式处理随后的WHEN或ELSE子句。 + - 如果各WHEN condition都不为真,表达式的结果就是在ELSE子句执行的result。如果省略了ELSE子句且没有匹配的条件,结果为NULL。 + + 示例: + + ``` + postgres=# CREATE TABLE tpcds.case_when_t1(CW_COL1 INT); + + postgres=# INSERT INTO tpcds.case_when_t1 VALUES (1), (2), (3); + + postgres=# SELECT * FROM tpcds.case_when_t1; + a + --- + 1 + 2 + 3 + (3 rows) + + postgres=# SELECT CW_COL1, CASE WHEN CW_COL1=1 THEN 'one' WHEN CW_COL1=2 THEN 'two' ELSE 'other' END FROM tpcds.case_when_t1 ORDER BY 1; + cw_col1 | case + ---------+------- + 1 | one + 2 | two + 3 | other + (3 rows) + + postgres=# DROP TABLE tpcds.case_when_t1; + ``` + +- DECODE + + DECODE的语法图请参见[图2](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f8e62b15fa92349339fcdb77fcc5fef4d)。 + + **图 2** decode::= + ![](figures/decode.png "decode") + + 将表达式base\_expr与后面的每个compare\(n\) 进行比较,如果匹配返回相应的value\(n\)。如果没有发生匹配,则返回default。 + + 示例请参见[条件表达式函数](条件表达式函数.md)。 + + ``` + postgres=# SELECT DECODE('A','A',1,'B',2,0); + case + ------ + 1 + (1 row) + ``` + +- COALESCE + + COALESCE的语法图请参见[图3](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f1877c9f8d2ac4964828a6eaaddf5f35f)。 + + **图 3** coalesce::= + ![](figures/coalesce.png "coalesce") + + COALESCE返回它的第一个非NULL的参数值。如果参数都为NULL,则返回NULL。它常用于在显示数据时用缺省值替换NULL。和CASE表达式一样,COALESCE只计算用来判断结果的参数,即在第一个非空参数右边的参数不会被计算。 + + 示例 + + ``` + postgres=# CREATE TABLE tpcds.c_tabl(description varchar(10), short_description varchar(10), last_value varchar(10)) + ; + + postgres=# INSERT INTO tpcds.c_tabl VALUES('abc', 'efg', '123'); + postgres=# INSERT INTO tpcds.c_tabl VALUES(NULL, 'efg', '123'); + + postgres=# INSERT INTO tpcds.c_tabl VALUES(NULL, NULL, '123'); + + postgres=# SELECT description, short_description, last_value, COALESCE(description, short_description, last_value) FROM tpcds.c_tabl ORDER BY 1, 2, 3, 4; + description | short_description | last_value | coalesce + -------------+-------------------+------------+---------- + abc | efg | 123 | abc + | efg | 123 | efg + | | 123 | 123 + (3 rows) + + postgres=# DROP TABLE tpcds.c_tabl; + ``` + + 如果description不为NULL,则返回description的值,否则计算下一个参数short\_description;如果short\_description不为NULL,则返回short\_description的值,否则计算下一个参数last\_value;如果last\_value不为NULL,则返回last\_value的值,否则返回(none)。 + + ``` + postgres=# SELECT COALESCE(NULL,'Hello World'); + coalesce + --------------- + Hello World + (1 row) + ``` + +- NULLIF + + NULLIF的语法图请参见[图4](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f6c5bc64bf5de4b728ed1d73d97768e6e)。 + + **图 4** nullif::= + ![](figures/nullif.png "nullif") + + 只有当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。 + + 示例 + + ``` + postgres=# CREATE TABLE tpcds.null_if_t1 ( + NI_VALUE1 VARCHAR(10), + NI_VALUE2 VARCHAR(10) + ); + + postgres=# INSERT INTO tpcds.null_if_t1 VALUES('abc', 'abc'); + postgres=# INSERT INTO tpcds.null_if_t1 VALUES('abc', 'efg'); + + postgres=# SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM tpcds.null_if_t1 ORDER BY 1, 2, 3; + + ni_value1 | ni_value2 | nullif + -----------+-----------+-------- + abc | abc | + abc | efg | abc + (2 rows) + postgres=# DROP TABLE tpcds.null_if_t1; + ``` + + 如果value1等于value2则返回NULL,否则返回value1。 + + ``` + postgres=# SELECT NULLIF('Hello','Hello World'); + nullif + -------- + Hello + (1 row) + ``` + +- GREATEST(最大值),LEAST(最小值) + + GREATEST的语法图请参见[图5](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f23a83b0f987a49e0b6890280568afbd2)。 + + **图 5** greatest::= + ![](figures/greatest.png "greatest") + + 从一个任意数字表达式的列表里选取最大的数值。 + + ``` + postgres=# SELECT greatest(9000,155555,2.01); + greatest + ---------- + 155555 + (1 row) + ``` + + LEAST的语法图请参见[图6](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f30a16b0edbde4750a42053619840b384)。 + + **图 6** least::= + ![](figures/least.png "least") + + 从一个任意数字表达式的列表里选取最小的数值。 + + 以上的数字表达式必须都可以转换成一个普通的数据类型,该数据类型将是结果类型。 + + 列表中的NULL值将被忽略。只有所有表达式的结果都是NULL的时候,结果才是NULL。 + + ``` + postgres=# SELECT least(9000,2); + least + ------- + 2 + (1 row) + ``` + + 示例请参见[条件表达式函数](条件表达式函数.md)。 + +- NVL + + NVL的语法图请参见[图7](#zh-cn_topic_0237122002_zh-cn_topic_0059777797_f69cd4e01dd6e4280b756eb98d3c77c91)。 + + **图 7** nvl::= + ![](figures/nvl.jpg "nvl") + + 如果value1为NULL则返回value2,如果value1非NULL,则返回value1。 + + 示例: + + ``` + postgres=# SELECT nvl(null,1); + NVL + ----- + 1 + (1 row) + + ``` + + ``` + postgres=# SELECT nvl ('Hello World' ,1); + nvl + --------------- + Hello World + (1 row) + ``` + + 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" new file mode 100644 index 000000000..502825577 --- /dev/null +++ "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" @@ -0,0 +1,193 @@ +# 条件表达式函数 + +## 条件表达式函数 + +- coalesce\(expr1, expr2, ..., exprn\) + + 描述: + + 返回参数列表中第一个非NULL的参数值。 + + COALESCE\(expr1, expr2\) 等价于CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END。 + + 示例: + + ``` + postgres=# SELECT coalesce(NULL,'hello'); + coalesce + ---------- + hello + (1 row) + ``` + + 备注: + + - 如果表达式列表中的所有表达式都等于NULL,则本函数返回NULL。 + - 它常用于在显示数据时用缺省值替换NULL。 + - 和CASE表达式一样,COALESCE不会计算不需要用来判断结果的参数;即在第一个非空参数右边的参数不会被计算。 + +- decode\(base\_expr, compare1, value1, Compare2,value2, … default\) + + 描述:把base\_expr与后面的每个compare\(n\) 进行比较,如果匹配返回相应的value\(n\)。如果没有发生匹配,则返回default。 + + 示例: + + ``` + postgres=# SELECT decode('A','A',1,'B',2,0); + case + ------ + 1 + (1 row) + ``` + +- nullif\(expr1, expr2\) + + 描述:当且仅当expr1和expr2相等时,NULLIF才返回NULL,否则它返回expr1。 + + nullif\(expr1, expr2\) 逻辑上等价于CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END。 + + 示例: + + ``` + postgres=# SELECT nullif('hello','world'); + nullif + -------- + hello + (1 row) + ``` + + 备注: + + 如果两个参数的数据类型不同,则: + + - 若两种数据类型之间存在隐式转换,则以其中优先级较高的数据类型为基准将另一个参数隐式转换成该类型,转换成功则进行计算,转换失败则返回错误。如: + + ``` + postgres=# SELECT nullif('1234'::VARCHAR,123::INT4); + nullif + -------- + 1234 + (1 row) + ``` + + ``` + postgres=# SELECT nullif('1234'::VARCHAR,'2012-12-24'::DATE); + ERROR: invalid input syntax for type timestamp: "1234" + ``` + + - 若两种数据类型之间不存在隐式转换,则返回错误 。如: + + ``` + postgres=# SELECT nullif(TRUE::BOOLEAN,'2012-12-24'::DATE); + ERROR: operator does not exist: boolean = timestamp without time zone + LINE 1: SELECT nullif(TRUE::BOOLEAN,'2012-12-24'::DATE) FROM DUAL; + ^ + HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. + ``` + + +- nvl\( expr1 , expr2 \) + + 描述: + + - 如果expr1为NULL则返回expr2。 + - 如果expr1非NULL,则返回expr1。 + + 示例: + + ``` + postgres=# SELECT nvl('hello','world'); + nvl + ------- + hello + (1 row) + ``` + + 备注:参数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 \[, ...\]\) + + 描述:获取并返回参数列表中值最大的表达式的值。 + + 返回值类型: + + 示例: + + ``` + postgres=# SELECT greatest(1*2,2-3,4-1); + greatest + ---------- + 3 + (1 row) + ``` + + ``` + postgres=# SELECT greatest('HARRY', 'HARRIOT', 'HAROLD'); + greatest + ---------- + HARRY + (1 row) + ``` + +- least\(expr1 \[, ...\]\) + + 描述:获取并返回参数列表中值最小的表达式的值。 + + 示例: + + ``` + postgres=# SELECT least(1*2,2-3,4-1); + least + ------- + -1 + (1 row) + ``` + + ``` + postgres=# SELECT least('HARRY','HARRIOT','HAROLD'); + least + -------- + HAROLD + (1 row) + ``` + +- EMPTY\_BLOB\(\) + + 描述:使用EMPTY\_BLOB在INSERT或UPDATE语句中初始化一个BLOB变量,取值为NULL。 + + 返回值类型:BLOB + + 示例: + + ``` + --新建表 + postgres=# CREATE TABLE blob_tb(b blob,id int); + --插入数据 + postgres=# INSERT INTO date_tb VALUES (empty_blob(),1); + --删除表 + postgres=# DROP TABLE blob_tb; + ``` + + 备注:使用DBMS.GETLENGTH求得的长度为0。 + + diff --git "a/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" new file mode 100644 index 000000000..86c331b15 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\217\202\346\225\260\345\275\223\345\211\215\345\217\226\345\200\274.md" @@ -0,0 +1,70 @@ +# 查看参数当前取值 + +openGauss安装后,有一套默认的运行参数,为了使openGauss与业务的配合度更高,用户需要根据业务场景和数据量的大小进行GUC参数调整。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +3. 查看数据库运行参数当前取值。 + - 方法一:使用SHOW命令。 + - 使用如下命令查看单个参数: + + ``` + postgres=# SHOW server_version; + ``` + + server\_version显示数据库版本信息的参数。 + + - 使用如下命令查看所有参数: + + ``` + postgres=# SHOW ALL; + ``` + + + - 方法二:使用pg\_settings视图。 + - 使用如下命令查看单个参数: + + ``` + postgres=# SELECT * FROM pg_settings WHERE NAME='server_version'; + ``` + + - 使用如下命令查看所有参数: + + ``` + postgres=# SELECT * FROM pg_settings; + ``` + + + + +## 示例 + +查看服务器的版本号。 + +``` +postgres=# SHOW server_version; + server_version +---------------- + 9.2.4 +(1 row) +``` + 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" new file mode 100644 index 000000000..97d685582 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\345\256\241\350\256\241\347\273\223\346\236\234.md" @@ -0,0 +1,92 @@ +# 查看审计结果 + +## 前提条件 + +- 审计功能总开关已开启。 +- 需要审计的审计项开关已开启。 +- 数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。 +- 数据库各个节点审计日志单独记录。 + +## 背景信息 + +- 只有拥有AUDITADMIN属性的用户才可以查看审计记录。有关数据库用户及创建用户的办法请参见[用户](用户.md#ZH-CN_TOPIC_0246507961)。 +- 审计查询命令是数据库提供的sql函数pg\_query\_audit,其原型为: + + ``` + pg_query_audit(timestamptz startime,timestamptz endtime,audit_log) + ``` + + 参数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之间的任何值。请正确指定这两个参数,否则将查不到需要的审计信息。 + + +## 操作步骤 + +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=# SELECT * FROM pg_query_audit('2015-07-15 08:00:00','2015-07-15 09:47:33'); + ``` + + 查询结果如下: + + ``` + time | type | result | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port + ------------------------+---------------+--------+----------+----------------+-----------------+----------------+---------------------------------------------------------------+-----------+---------------------------------+------------+------------- + 2015-07-15 08:03:55+08 | login_success | ok | omm | postgres | gs_clean@::1 | postgres | login db(postgres) success,the current user is:omm | cn_5003 | 139808902997776@490233835920483 | 9000 | 55805 + ``` + + 该条记录表明,用户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.md" "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256.md" new file mode 100644 index 000000000..a3183d3a3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\346\225\260\346\215\256.md" @@ -0,0 +1,51 @@ +# 查看数据 + +- 使用系统表pg\_tables查询数据库所有表的信息。 + + ``` + postgres=# SELECT * FROM pg_tables; + ``` + +- 使用gsql的\\d+命令查询表的属性。 + + ``` + postgres=# \d+ customer_t1; + ``` + +- 执行如下命令查询表customer\_t1****的数据量。 + + ``` + postgres=# SELECT count(*) FROM customer_t1; + ``` + +- 执行如下命令查询表customer\_t1的所有数据。 + + ``` + postgres=# SELECT * FROM customer_t1; + ``` + +- 执行如下命令只查询字段c\_customer\_sk的数据。 + + ``` + postgres=# SELECT c_customer_sk FROM customer_t1; + ``` + +- 执行如下命令过滤字段c\_customer\_sk的重复数据。 + + ``` + postgres=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1; + ``` + +- 执行如下命令查询字段c\_customer\_sk为3869的所有数据。 + + ``` + postgres=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869; + ``` + +- 执行如下命令按照字段c\_customer\_sk进行排序。 + + ``` + postgres=# SELECT * FROM customer_t1 ORDER BY c_customer_sk; + ``` + + 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" new file mode 100644 index 000000000..02527318a --- /dev/null +++ "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" @@ -0,0 +1,116 @@ +# 查看数据库连接数 + +## 背景信息 + +当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 + +- 全局的最大连接数:由运行参数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" new file mode 100644 index 000000000..0f2bd5f17 --- /dev/null +++ "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" @@ -0,0 +1,115 @@ +# 查看数据库连接数 + +## 背景信息 + +当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 + +- 全局的最大连接数:由运行参数max\_connections指定,默认值为800。 +- 某用户的连接数:在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。 +- 某数据库的连接数:在创建数据库时,由CREATE DATABASE的CONNECTION LIMIT connlimit参数指定。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + 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\347\263\273\347\273\237\350\241\250.md" "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\347\263\273\347\273\237\350\241\250.md" new file mode 100644 index 000000000..d49928556 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\237\245\347\234\213\347\263\273\347\273\237\350\241\250.md" @@ -0,0 +1,137 @@ +# 查看系统表 + +除了创建的表以外,数据库还包含很多系统表。这些系统表包含openGauss安装信息以及openGauss上运行的各种查询和进程的信息。可以通过查询系统表来收集有关数据库的信息。 + +“[查看系统表和系统视图](系统表和系统视图.md)”中每个表的说明指出了表是对所有用户可见还是只对初始化用户可见。必须以初始化用户身份登录才能查询只对初始化用户可见的表。 + +openGauss提供了以下类型的系统表和视图: + +- 继承自PG的系统表和视图 + + 这类系统表和视图具有PG前缀。 + +- openGaussl新增的系统表和视图 + + 这类系统表和视图具有GS前缀。 + + +## 查看数据库中包含的表 + +例如,在PG\_TABLES系统表中查看public schema中包含的所有表。 + +``` +SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; +``` + +结果类似如下这样: + +``` + tablename +------------------- + err_hr_staffs + test + err_hr_staffs_ft3 + web_returns_p1 + mig_seq_table + films4 +(6 rows) +``` + +## 查看数据库用户 + +通过PG\_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。 + +``` +SELECT * FROM pg_user; +``` + +``` + usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | valuntil | respool + | parent | spacelimit | useconfig +-----------------------------------+----------+-------------+----------+-----------+---------+----------+----------+----------+---------- +----+--------+------------+----------- +dfc22b86afbd9a745668c3ecd0f15ec18 | 17107 | f | f | f | f | ******** | | | default_p +ool | 0 | | +guest | 17103 | f | f | f | f | ******** | | | default_p +ool | 0 | | +omm | 10 | t | t | t | t | ******** | | | default_p +ool | 0 | | +omm | 16404 | f | f | f | f | ******** | | | default_p +ool | 0 | | +lily | 16482 | f | f | f | f | ******** | | | default_p +ool | 0 | | +jack | 16478 | f | f | f | f | ******** | | | default_p +ool | 0 | | + + +(6 rows) +``` + +## 查看和停止正在运行的查询语句 + +通过视图[PG\_STAT\_ACTIVITY](PG_STAT_ACTIVITY.md)可以查看正在运行的查询语句。方法如下: + +1. 设置参数track\_activities为on。 + + ``` + SET track_activities = on; + ``` + + 当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 + +2. 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: + + ``` + SELECT datname, usename, state,pid FROM pg_stat_activity; + ``` + + ``` + datname | usename | state | pid + ----------+---------+--------+----------------- + postgres | Ruby | active | 140298793514752 + postgres | Ruby | active | 140298718004992 + postgres | Ruby | idle | 140298650908416 + postgres | Ruby | idle | 140298625742592 + postgres | omm | active | 140298575406848 + (5 rows) + ``` + + 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 + + 如果仅需要查看非空闲的查询语句,则使用如下命令查看: + + ``` + SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle'; + ``` + +3. 若需要取消运行时间过长的查询,通过PG\_TERMINATE\_BACKEND函数,根据线程ID结束会话。 + + ``` + SELECT PG_TERMINATE_BACKEND(139834759993104); + ``` + + 显示类似如下信息,表示结束会话成功。 + + ``` + PG_TERMINATE_BACKEND + ---------------------- + t + (1 row) + ``` + + 显示类似如下信息,表示用户执行了结束当前会话的操作。 + + ``` + FATAL: terminating connection due to administrator command + FATAL: terminating connection due to administrator command + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >gsql客户端使用PG\_TERMINATE\_BACKEND函数结束当前会话后台线程时,客户端不会退出而是自动重连。即还会返回“The connection to the server was lost. Attempting reset: Succeeded.” + >``` + >FATAL: terminating connection due to administrator command + >FATAL: terminating connection due to administrator command + >The connection to the server was lost. Attempting reset: Succeeded. + >``` + + 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" new file mode 100644 index 000000000..016385ebb --- /dev/null +++ "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" @@ -0,0 +1,144 @@ +# 查询和索引统计收集器 + +查询和索引统计收集器负责收集数据库系统运行中的统计数据,如在一个表和索引上进行了多少次插入与更新操作、磁盘块的数量和元组的数量、每个表上最近一次执行清理和分析操作的时间等。可以通过查询系统视图pg\_stats和pg\_statistic查看统计数据。下面的参数设置服务器范围内的统计收集特性。 + +## track\_activities + +**参数说明:**控制收集每个会话中当前正在执行命令的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能。 +- off表示关闭收集功能。 + +**默认值:**on + +## track\_counts + +**参数说明:**控制收集数据库活动的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能。 +- off表示关闭收集功能。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在AutoVacuum自动清理进程中选择清理的数据库时,需要数据库的统计数据,故默认值设为on。 + +**默认值:**on + +## track\_io\_timing + +**参数说明:**控制收集数据库I/O调用时序的统计数据。I/O时序统计数据可以在pg\_stat\_database中查询。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能,开启时,收集器会在重复地去查询当前时间的操作系统,这可能会引起某些平台的重大开销,故默认值设置为off。 +- off表示关闭收集功能。 + +**默认值:**off + +## track\_functions + +**参数说明:**控制收集函数的调用次数和调用耗时的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当SQL语言函数设置为调用查询的“内联”函数时,不管是否设置此选项,这些SQL语言函数无法被追踪到。 + +**取值范围:**枚举类型 + +- pl表示只追踪过程语言函数。 +- all表示追踪SQL和C语言函数。 +- none表示关闭函数追踪功能。 + +**默认值:**none + +## track\_activity\_query\_size + +**参数说明:**设置用于跟踪每一个活动会话的当前正在执行命令的字节数。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,100~102400 + +**默认值:**1024 + +## update\_process\_title + +**参数说明:**控制收集因每次服务器接收到一个新的SQL语句时而产生的进程名称更新的统计数据。 + +进程名称可以通过ps命令进行查看。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启收集功能。 +- off表示关闭收集功能。 + +**默认值:**off + +## stats\_temp\_directory + +**参数说明:**设置存储临时统计数据的目录。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>将其设置为一个基于RAM的文件系统目录会减少实际的I/O开销并可以提升其性能。 + +**取值范围:**字符串 + +**默认值:**pg\_stat\_tmp + +## track\_thread\_wait\_status\_interval + +**参数说明:**用来定期收集thread状态信息的时间间隔。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0~1天,单位为min。 + +**默认值:**30min + +## enable\_save\_datachanged\_timestamp + +**参数说明:**确定是否收集insert/update/delete, exchange/truncate/drop partition操作对表数据改动的时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示允许收集相关操作对表数据改动的时间。 +- off表示禁止收集相关操作对表数据改动的时间。 + +**默认值:**on + +## track\_sql\_count + +**参数说明:**控制对每个会话中当前正在执行的SELECT、INSERT、UPDATE、DELETE、MERGE INTO语句进行计数的统计数据。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启计数功能。 +- off表示关闭计数功能。 + +**默认值:on** + +>![](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是关闭。 +>- 当参数关闭时,查询视图的结果为0行。 + diff --git "a/content/zh/docs/Developerguide/\346\237\245\350\257\242\350\247\204\345\210\222.md" "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\350\247\204\345\210\222.md" new file mode 100644 index 000000000..a5c2e60f8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\350\247\204\345\210\222.md" @@ -0,0 +1,18 @@ +# 查询规划 + +介绍查询优化器方法配置、开销常量、规划算法以及一些配置参数。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>优化器中涉及的两个参数: +>- INT\_MAX数据类型INT的最大值,其值为2147483647。 +>- DBL\_MAX数据类型FLOAT的最大值。 + +- **[优化器方法配置](优化器方法配置.md)** + +- **[优化器开销常量](优化器开销常量.md)** + +- **[基因查询优化器](基因查询优化器.md)** + +- **[其他优化器选项](其他优化器选项.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\237\245\350\257\242\351\207\215\345\206\231.md" "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\351\207\215\345\206\231.md" new file mode 100644 index 000000000..5031811ba --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\237\245\350\257\242\351\207\215\345\206\231.md" @@ -0,0 +1,63 @@ +# 查询重写 + +ts\_rewrite函数族可以从tsquery中搜索一个特定的目标子查询,并在该子查询每次出现的地方都替换为另一个子查询。 实际上这只是通过字串替换而得到的一个特定tsquery版本。目标子查询和替换查询组合起来可以被认为是一个重写规则。一组类似的重写规则可以为搜索提供强大的帮助。例如,可以使用同义词扩大搜索范围(例如,new york, big apple, nyc, gotham)或限制搜索范围在用户直接感兴趣的热点话题上。 + +- ts\_rewrite \(query tsquery, target tsquery, substitute tsquery\) returns tsquery + + ts\_rewrite的这种形式只适用于一个单一的重写规则:任何出现目标子查询的地方都被无条件替换。例如: + + ``` + postgres=# SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery); + ts_rewrite + ------------ + 'b' & 'c' + ``` + +- ts\_rewrite \(query tsquery, select text\) returns tsquery + + ts\_rewrite的这种形式接受一个起始查询和SQL查询命令。 这里的查询命令是文本字串形式,必须产生两个tsquery列。查询结果的每一行,第一个字段的值(目标子查询) 都会被第二个字段(替代子查询)替换。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >当多个规则需要重写时,重写顺序非常重要; 因此在实践中需要使用ORDER BY将源查询按照某些字段进行排序。 + + 例如:举一个现实生活中天文学上的例子。我们将使用表驱动的重写规则扩大supernovae的查询范围: + + ``` + postgres=# CREATE TABLE tsearch.aliases (id int, t tsquery, s tsquery); + + postgres=# INSERT INTO tsearch.aliases VALUES(1, to_tsquery('supernovae'), to_tsquery('supernovae|sn')); + + postgres=# SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT t, s FROM tsearch.aliases'); + + ts_rewrite + --------------------------------- + 'crab' & ( 'supernova' | 'sn' ) + ``` + + 可以通过更新表修改重写规则: + + ``` + postgres=# UPDATE tsearch.aliases + SET s = to_tsquery('supernovae|sn & !nebulae') + WHERE t = to_tsquery('supernovae'); + + postgres=# SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT t, s FROM tsearch.aliases'); + + ts_rewrite + --------------------------------------------- + 'crab' & ( 'supernova' | 'sn' & !'nebula' ) + ``` + + 需要重写的规则越多,重写操作就越慢。因为它要检查每一个可能匹配的规则。为了过滤明显的非候选规则,可以使用tsquery类型的操作符来实现。在下面的例子中, 我们只选择那些可能与原始查询匹配的规则: + + ``` + postgres=# SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM tsearch.aliases WHERE ''a & b''::tsquery @> t'); + + ts_rewrite + ------------ + 'b' & 'a' + (1 row) + postgres=# DROP TABLE tsearch.aliases; + ``` + + 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" new file mode 100644 index 000000000..3a1f4178b --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\243\200\346\237\245\347\202\271.md" @@ -0,0 +1,101 @@ +# 检查点 + +## checkpoint\_segments + +**参数说明:**设置[checkpoint\_timeout](#zh-cn_topic_0237124708_zh-cn_topic_0059778936_s880baa9f9b594980afbbe95fb8a77182)周期内所保留的最少WAL日志段文件数量。每个日志文件大小为16MB。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,最小值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日志段文件,不会被真正删除。 + +**默认值:**64 + +## checkpoint\_timeout + +**参数说明:**设置自动WAL检查点之间的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型, 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)的负担,需要综合考虑。 + +**默认值:**15min + +## checkpoint\_completion\_target + +**参数说明:**指定检查点完成的目标。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:0.0~1.0 + +**默认值:**0.5 + +>![](public_sys-resources/icon-note.gif) **说明:** +>默认值0.5表示:每个checkpoint需要在checkpoints间隔时间的50%内完成。 + +## checkpoint\_warning + +**参数说明:**如果由于填充检查点段文件导致检查点发生的时间间隔接近这个参数表示的秒数,就向服务器日志发送一个建议增加[checkpoint\_segments](#zh-cn_topic_0237124708_zh-cn_topic_0059778936_sbadc77895e6643b882a5e7557e405373)值的消息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0\~INT\_MAX(秒),其中0表示关闭警告。 + +**默认值:**5min + +**推荐值:**5min + +## checkpoint\_wait\_timeout + +**参数说明:**设置请求检查点等待checkpointer线程启动的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,2~3600(秒) + +**默认值:**1min + +## enable\_incremental\_checkpoint + +**参数说明:**增量检查点开关。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**on + +## enable\_double\_write + +**参数说明:**双写开关,增量检查点开关打开时,不再使用full\_page\_writes防止半页写问题,而是依赖双写特性保护。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**on + +## incremental\_checkpoint\_timeout + +**参数说明:**增量检查点开关打开之后,设置自动WAL检查点之间的最长时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1\~3600(秒) + +**默认值:**1min + +## enable\_xlog\_prune + +**参数说明:**设置主机是否在任一备机断联时候保留全部xlog不回收。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +**默认值:**on + 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-12.md" new file mode 100644 index 000000000..9f3ef6eef --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-12.md" @@ -0,0 +1,77 @@ +# 概述 + +openGauss提供的gs\_dump和gs\_dumpall工具,能够帮助用户导出需要的数据库对象或其相关信息。通过导入工具将导出的数据信息导入至需要的数据库,可以完成数据库信息的迁移。gs\_dump支持导出单个数据库或其内的对象,而gs\_dumpall支持导出openGauss中所有数据库或各库的公共全局对象。详细的使用场景见[表1](#zh-cn_topic_0237121167_table08278213504)。 + +**表 1** 适用场景 + + + + + + + + + + + + + + + + + + + + + + + + + +

适用场景

+

支持的导出粒度

+

支持的导出格式

+

配套的导入方法

+

导出单个数据库

+

数据库级导出

+
  • 导出全量信息。

    使用导出的全量信息可以创建一个与当前库相同的数据库,且库中数据也与当前库相同。

    +
  • 仅导出库中所有对象的定义,包含库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。

    使用导出的对象定义,可以快速创建一个相同的数据库,但是库中并无原数据库的数据。

    +
  • 仅导出数据。
+
  • 纯文本格式
  • 自定义归档格式
  • 目录归档格式
  • tar归档格式
+
+

模式级导出

+
  • 导出模式的全量信息。
  • 仅导出模式中数据。
  • 仅导出对象的定义,包含表定义、存储过程定义和索引定义等。
+
表级导出
  • 导出表的全量信息。
  • 仅导出表中数据。
  • 仅导出表的定义。
+
+

导出所有数据库

+

数据库级导出

+
  • 导出全量信息。

    使用导出的全量信息可以创建与openGauss相同的一个openGauss,拥有相同数据库和公共全局对象,且库中数据也与当前各库相同。

    +
  • 仅导出各数据库中的对象定义,包含表空间、库定义、函数定义、模式定义、表定义、索引定义和存储过程定义等。

    使用导出的对象定义,可以快速创建与openGauss相同的一个openGauss,拥有相同的数据库和表空间,但是库中并无原数据库的数据。

    +
  • 仅导出数据。
+

纯文本格式

+

数据文件导入请参见使用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通过对导出的数据文件加密,导入时对加密的数据文件进行解密,可以防止数据信息泄露,为数据库的安全提供保证。 + +gs\_dump和gs\_dumpall工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。 + +gs\_dump和gs\_dumpall工具支持导出完整一致的数据。例如,T1时刻启动gs\_dump导出A数据库,或者启动gs\_dumpall导出openGauss数据库,那么导出数据结果将会是T1时刻A数据库或者该openGauss数据库的数据状态,T1时刻之后对A数据库或openGauss数据库的修改不会被导出。 + +## 注意事项 + +- 禁止修改导出的文件和内容,否则可能无法恢复成功。 +- 如果数据库中包含的对象数量(数据表、视图、索引)在50万以上,为了提高性能且避免出现内存问题,建议通过gs\_guc工具设置数据库节点的如下参数(如果参数值大于如下建议值,则无需设置)。 + + ``` + gs_guc set -N all -I all -c 'max_prepared_transactions = 1000' + gs_guc set -N all -I all -c 'max_locks_per_transaction = 512' + ``` + +- 为了保证数据一致性和完整性,导出工具会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs\_dump和gs\_dumpall会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 +- 由于gs\_dumpall读取所有数据库中的表,因此必须以openGauss管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。 + 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" new file mode 100644 index 000000000..1fbc471f0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-14.md" @@ -0,0 +1,4 @@ +# 概述 + +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-15.md" new file mode 100644 index 000000000..62e0f7855 --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260-15.md" @@ -0,0 +1,47 @@ +# 概述 + +## 背景信息 + +在SQL语言中,每个数据都与一个决定其行为和用法的数据类型相关。openGauss提供一个可扩展的数据类型系统,该系统比其它SQL实现更具通用性和灵活性。因而,openGauss中大多数类型转换是由通用规则来管理的,这种做法允许使用混合类型的表达式。 + +openGauss扫描/分析器只将词法元素分解成五个基本种类:整数、浮点数、字符串、标识符和关键字。大多数非数字类型首先表现为字符串。SQL语言的定义允许将常量字符串声明为具体的类型。例,下面查询: + +``` +postgres=# SELECT text 'Origin' AS "label", point '(0,0)' AS "value"; + label | value +--------+------- + Origin | (0,0) +(1 row) +``` + +示例中有两个文本常量,类型分别为text和point。如果没有为字符串文本声明类型,则该文本首先被定义成一个unknown类型。 + +在openGauss分析器里,有四种基本的SQL结构需要独立的类型转换规则: + +- 函数调用 + + 多数SQL类型系统是建筑在一套丰富的函数上的。函数调用可以有一个或多个参数。因为SQL允许函数重载,所以不能通过函数名直接找到要调用的函数,分析器必须根据函数提供的参数类型选择正确的函数。 + +- 操作符 + + SQL允许在表达式上使用前缀或后缀(单目)操作符,也允许表达式内部使用双目操作符(两个参数)。像函数一样,操作符也可以被重载,因此操作符的选择也和函数一样取决于参数类型。 + +- 值存储 + + INSERT和UPDATE语句将表达式结果存入表中。语句中的表达式类型必须和目标字段的类型一致或者可以转换为一致。 + +- UNION,CASE和相关构造 + + 因为联合SELECT语句中的所有查询结果必须在一列里显示出来,所以每个SELECT子句中的元素类型必须相互匹配并转换成一个统一类型。类似地,一个CASE构造的结果表达式必须转换成统一的类型,这样整个case表达式会有一个统一的输出类型。同样的要求也存在于ARRAY构造以及GREATEST和LEAST函数中。 + + +系统表pg\_cast存储了有关数据类型之间的转换关系以及如何执行这些转换的信息。详细信息请参见[PG\_CAST](PG_CAST.md#ZH-CN_TOPIC_0242385803)。 + +语义分析阶段会决定表达式的返回值类型并选择适当的转换行为。数据类型的基本类型分类,包括:Boolean,numeric,string,bitstring,datetime,timespan,geometric和network。每种类型都有一种或多种首选类型用于解决类型选择的问题。根据首选类型和可用的隐含转换,就可能保证有歧义的表达式(那些有多个候选解析方案的)得到有效的方式解决。 + +所有类型转换规则都是建立在下面几个基本原则上的: + +- 隐含转换决不能有奇怪的或不可预见的输出。 +- 如果一个查询不需要隐含的类型转换,分析器和执行器不应该进行更多的额外操作。这就是说,任何一个类型匹配、格式清晰的查询不应该在分析器里耗费更多的时间,也不应该向查询中引入任何不必要的隐含类型转换调用。 +- 另外,如果一个查询在调用某个函数时需要进行隐式转换,当用户定义了一个有正确参数的函数后,解释器应该选择使用新函数。 + diff --git "a/content/zh/docs/Developerguide/\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\346\246\202\350\277\260.md" new file mode 100644 index 000000000..1ece1f45c --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\246\202\350\277\260.md" @@ -0,0 +1,11 @@ +# 概述 + +- **[数据库逻辑结构图](数据库逻辑结构图.md)** + +- **[数据查询请求处理过程](数据查询请求处理过程.md)** + +- **[管理事务](管理事务.md)** + +- **[相关概念](相关概念.md)** + + 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" new file mode 100644 index 000000000..b5d986c14 --- /dev/null +++ "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" @@ -0,0 +1,311 @@ +# 模式匹配操作符 + +数据库提供了三种独立的实现模式匹配的方法:SQL LIKE操作符、SIMILAR TO操作符和POSIX-风格的正则表达式。除了这些基本的操作符外,还有一些函数可用于提取或替换匹配子串并在匹配位置分离一个串。 + +- LIKE + + 描述:判断字符串是否能匹配上LIKE后的模式字符串。如果字符串与提供的模式匹配,则LIKE表达式返回为真(NOT LIKE表达式返回假),否则返回为假(NOT LIKE表达式返回真)。 + + 匹配规则: + + 1. 此操作符只有在它的模式匹配整个串的时候才能成功。如果要匹配在串内任何位置的序列,该模式必须以百分号开头和结尾。 + 2. 下划线 (\_)代表(匹配)任何单个字符; 百分号(%)代表任意串的通配符。 + 3. 要匹配文本里的下划线或者百分号,在提供的模式里相应字符必须前导逃逸字符。逃逸字符的作用是禁用元字符的特殊含义,缺省的逃逸字符是反斜线,也可以用ESCAPE子句指定一个不同的逃逸字符。 + 4. 要匹配逃逸字符本身,写两个逃逸字符。例如要写一个包含反斜线的模式常量,那你就要在SQL语句里写两个反斜线。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >参数standard\_conforming\_strings设置为off时,在文串常量中写的任何反斜线都需要被双写。因此,写一个匹配单个反斜线的模式实际上要在语句里写四个反斜线。(你可以通过用ESCAPE选择一个不同的逃逸字符来避免这种情况,这样反斜线就不再是LIKE的特殊字符了。但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜线。)我们也可以通过写ESCAPE ''的方式不选择逃逸字符,这样可以有效地禁用逃逸机制,但是没有办法关闭下划线和百分号在模式中的特殊含义。 + + 5. 关键字ILIKE可以用于替换LIKE,区别是LIKE大小写敏感,ILIKE大小写不敏感。 + 6. 操作符\~\~等效于LIKE,操作符\~\~\*等效于ILIKE。 + + 示例: + + ``` + postgres=# SELECT 'abc' LIKE 'abc' AS RESULT; + result + ----------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' LIKE 'a%' AS RESULT; + result + ----------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' LIKE '_b_' AS RESULT; + result + ----------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' LIKE 'c' AS RESULT; + result + ----------- + f + (1 row) + ``` + +- SIMILAR TO + + 描述:SIMILAR TO操作符根据自己的模式是否匹配给定串而返回真或者假。他和LIKE非常类似,只不过他使用SQL标准定义的正则表达式理解模式。 + + 匹配规则: + + 1. 和LIKE一样,此操作符只有在它的模式匹配整个串的时候才能成功。如果要匹配在串内任何位置的序列,该模式必须以百分号开头和结尾。 + 2. 下划线 (\_)代表(匹配)任何单个字符; 百分号(%)代表任意串的通配符。 + 3. SIMILAR TO也支持下面这些从POSIX正则表达式借用的模式匹配元字符。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

元字符

+

含义

+

|

+

表示选择(两个候选之一)

+

*

+

表示重复前面的项零次或更多次

+

+

+

表示重复前面的项一次或更多次

+

?

+

表示重复前面的项零次或一次

+

{m}

+

表示重复前面的项刚好m次

+

{m,}

+

表示重复前面的项m次或更多次

+

{m,n}

+

表示重复前面的项至少m次并且不超过n次

+

()

+

把多个项组合成一个逻辑项

+

[...]

+

声明一个字符类,就像POSIX正则表达式一样

+
+ + 4. 前导逃逸字符可以禁止所有这些元字符的特殊含义。逃逸字符的使用规则和LIKE一样。 + + 正则表达式函数: + + 支持使用函数[•substring\(string from pattern for escape\)](字符处理函数和操作符.md#zh-cn_topic_0237121967_zh-cn_topic_0059779223_la1fee63f0fe34c148a0649f508a3048c)截取匹配SQL正则表达式的子字符串。 + + 示例: + + ``` + postgres=# SELECT 'abc' SIMILAR TO 'abc' AS RESULT; + result + ----------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' SIMILAR TO 'a' AS RESULT; + result + ----------- + f + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' SIMILAR TO '%(b|d)%' AS RESULT; + result + ----------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' SIMILAR TO '(b|c)%' AS RESULT; + result + ----------- + f + (1 row) + ``` + +- POSIX正则表达式 + + 描述:正则表达式是一个字符序列,它是定义一个串集合 (一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 POSIX正则表达式提供了比LIKE和SIMILAR TO操作符更强大的含义。[表 1 正则表达式匹配操作符](#zh-cn_topic_0237121970_table6512684711360)列出了所有可用于POSIX正则表达式模式匹配的操作符。 + + **表 1** 正则表达式匹配操作符 + + + + + + + + + + + + + + + + + + + + + + + + +

操作符

+

描述

+

例子

+

~

+

匹配正则表达式,大小写敏感

+

'thomas' ~ '.*thomas.*'

+

~*

+

匹配正则表达式,大小写不敏感

+

'thomas' ~* '.*Thomas.*'

+

!~

+

不匹配正则表达式,大小写敏感

+

'thomas' !~ '.*Thomas.*'

+

!~*

+

不匹配正则表达式,大小写不敏感

+

'thomas' !~* '.*vadim.*'

+
+ + 匹配规则: + + 1. 与LIKE不同,正则表达式允许匹配串里的任何位置,除非该正则表达式显式地挂接在串的开头或者结尾。 + 2. 除了上文提到的元字符外, POSIX正则表达式还支持下列模式匹配元字符。 + + + + + + + + + + + + + + + + +

元字符

+

含义

+

^

+

表示串开头的匹配

+

$

+

表示串末尾的匹配

+

.

+

匹配任意单个字符

+
+ + 正则表达式函数: + + 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数组的形式返回。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >正则表达式分离函数会忽略零长度的匹配,这种匹配发生在串的开头或结尾或者正好发生在前一个匹配之后。这和正则表达式匹配的严格定义是相悖的,后者由regexp\_matches实现,但是通常前者是实际中最常用的行为。 + + + 示例: + + ``` + postgres=# SELECT 'abc' ~ 'Abc' AS RESULT; + result + -------- + f + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' ~ '* Abc' AS RESULT; + result + -------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' !~ 'Abc' AS RESULT; + result + -------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc'!~* 'Abc' AS RESULT; + result + -------- + f + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' ~ '^a' AS RESULT; + result + -------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' ~ '(b|d)'AS RESULT; + result + -------- + t + (1 row) + ``` + + ``` + postgres=# SELECT 'abc' ~ '^(b|c)'AS RESULT; + result + -------- + f + (1 row) + ``` + + 虽然大部分的正则表达式搜索都能很快地执行,但是正则表达式仍可能被人为地弄成需要任意长的时间和任意量的内存进行处理。不建议从非安全模式来源接受正则表达式搜索模式,如果必须这样做,建议加上语句超时限制。使用SIMILAR TO模式的搜索具有同样的安全性危险, 因为SIMILAR TO提供了很多和POSIX-风格正则表达式相同的能力。LIKE搜索比其他两种选项简单得多,因此在接受非安全模式来源搜索时要更安全些。 + + diff --git "a/content/zh/docs/Developerguide/\346\257\224\350\276\203\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\346\257\224\350\276\203\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..ccb97ed5e --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\257\224\350\276\203\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,52 @@ +# 比较操作符 + +所有数据类型都可用比较操作符进行比较,并返回一个布尔类型的值。 + +比较操作符均为双目操作符,被比较的两个数据类型必须是相同的数据类型或者是可以进行隐式转换的类型。 + +openGauss提供的比较操作符请参见[表1](#zh-cn_topic_0237121966_zh-cn_topic_0059777421_zh-cn_topic_0058965550_table65067702)。 + +**表 1** 比较操作符 + + + + + + + + + + + + + + + + + + + + + + + + + +

操作符

+

描述

+

<

+

小于

+

>

+

大于

+

<=

+

小于或等于

+

>=

+

大于或等于

+

=

+

等于

+

<> 或 !=

+

不等于

+
+ +比较操作符可以用于所有相关的数据类型。所有比较操作符都是双目操作符,返回布尔类型数值。像1<2<3这样的表达式是非法的。(因为布尔值和3之间不能做比较。) + 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" new file mode 100644 index 000000000..870a66ffe --- /dev/null +++ "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" @@ -0,0 +1,11 @@ +# 测试和调试文本搜索 + +自定义文本搜索分词器的行为很容易变得混乱,本节中描述的函数用于对文本搜索对象进行测试。可以测试分词器整体,也可以单独测试解析器和词典。 + +- **[分词器测试](分词器测试.md)** + +- **[解析器测试](解析器测试.md)** + +- **[词典测试](词典测试.md)** + + diff --git "a/content/zh/docs/Developerguide/\346\267\261\345\261\202\345\244\215\345\210\266.md" "b/content/zh/docs/Developerguide/\346\267\261\345\261\202\345\244\215\345\210\266.md" new file mode 100644 index 000000000..f3f8736bb --- /dev/null +++ "b/content/zh/docs/Developerguide/\346\267\261\345\261\202\345\244\215\345\210\266.md" @@ -0,0 +1,13 @@ +# 深层复制 + +数据导入后,如果需要修改表的分区键、或者将行存表改列存、添加PCK(Partial Cluster Key)约束等场景下,可以使用深层复制的方式对表进行调整。深层复制是指重新创建表,然后使用批量插入填充表的过程。 + +openGauss提供了三种深层复制的方式供用户选择。 + +- **[使用CREATE TABLE执行深层复制](使用CREATE-TABLE执行深层复制.md)** + +- **[使用CREATE TABLE LIKE执行深层复制](使用CREATE-TABLE-LIKE执行深层复制.md)** + +- **[通过创建临时表并截断原始表来执行深层复制](通过创建临时表并截断原始表来执行深层复制.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" "b/content/zh/docs/Developerguide/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" new file mode 100644 index 000000000..3b2cc4faa --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\211\210\346\234\254\345\222\214\345\271\263\345\217\260\345\205\274\345\256\271\346\200\247.md" @@ -0,0 +1,7 @@ +# 版本和平台兼容性 + +- **[历史版本兼容性](历史版本兼容性.md)** + +- **[平台和客户端兼容性](平台和客户端兼容性.md)** + + 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" new file mode 100644 index 000000000..fcdb171a0 --- /dev/null +++ "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" @@ -0,0 +1,30 @@ +# 用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" new file mode 100644 index 000000000..104be8873 --- /dev/null +++ "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" @@ -0,0 +1,30 @@ +# 用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\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" new file mode 100644 index 000000000..662e24fc3 --- /dev/null +++ "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" @@ -0,0 +1,544 @@ +# 用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" new file mode 100644 index 000000000..49daefeae --- /dev/null +++ "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" @@ -0,0 +1,543 @@ +# 用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\250\346\210\267.md" "b/content/zh/docs/Developerguide/\347\224\250\346\210\267.md" new file mode 100644 index 000000000..237947ab0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\224\250\346\210\267.md" @@ -0,0 +1,47 @@ +# 用户 + +使用CREATE USER和ALTER USER可以创建和管理数据库用户。openGauss包含一个或多个已命名数据库。用户和角色在openGauss范围内是共享的,但是其数据并不共享。即用户可以连接任何数据库,但当连接成功后,任何用户都只能访问连接请求里声明的那个数据库。 + +非[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960)下,openGauss用户帐户只能由系统管理员或拥有CREATEROLE属性的安全管理员创建和删除。三权分立时,用户帐户只能由初始用户和安全管理员创建。 + +在用户登录openGauss时会对其进行身份验证。用户可以拥有数据库和数据库对象(例如表),并且可以向用户和角色授予对这些对象的权限以控制谁可以访问哪个对象。除系统管理员外,具有CREATEDB属性的用户可以创建数据库并授予对这些数据库的权限。 + +## 创建、修改和删除用户 + +- 要创建用户,请使用SQL语句[CREATE USER](CREATE-USER.md#ZH-CN_TOPIC_0242370589)。 + + 例如:创建用户joe,并设置用户拥有CREATEDB属性。 + + ``` + postgres=# CREATE USER joe WITH CREATEDB PASSWORD "Bigdata@123"; + CREATE ROLE + ``` + +- 要创建系统管理员,请使用带有SYSADMIN选项的[CREATE USER](CREATE-USER.md#ZH-CN_TOPIC_0242370589)语句 。 +- 要删除现有用户,请使用[DROP USER](DROP-USER.md)。 +- 要更改用户帐户(例如,重命名用户或更改密码),请使用[ALTER USER](ALTER-USER.md#ZH-CN_TOPIC_0242370547)。 +- 要查看用户列表,请查询视图[PG\_USER](PG_USER.md#ZH-CN_TOPIC_0242385999): + + ``` + postgres=# SELECT * FROM pg_user; + ``` + +- 要查看用户属性,请查询系统表[PG\_AUTHID](PG_AUTHID.md): + + ``` + postgres=# SELECT * FROM pg_authid; + ``` + + +## 私有用户 + +对于有多个业务部门,各部门间使用不同的数据库用户进行业务操作,同时有一个同级的数据库维护部门使用数据库管理员进行维护操作的场景下,业务部门可能希望在未经授权的情况下,管理员用户只能对各部门的数据进行控制操作(DROP、ALTER、TRUNCATE),但是不能进行访问操作(INSERT、DELETE、UPDATE、SELECT、COPY)。即针对管理员用户,表对象的控制权和访问权要能够分离,提高普通用户数据安全性。 + +[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960)情况下,管理员对其他用户放在属于各自模式下的表无权限。但是,这种无权限包含了无控制权限,因此不能满足上面的诉求。为此,openGauss提供了私有用户方案。即在非三权分立模式下,创建具有INDEPENDENT属性的私有用户。 + +``` +postgres=# CREATE USER user_independent WITH INDEPENDENT IDENTIFIED BY "1234@abc"; +``` + +针对该用户的对象,系统管理员和拥有CREATEROLE属性的安全管理员在未经其授权前,只能进行控制操作(DROP、ALTER、TRUNCATE),无权进行INSERT、DELETE、SELECT、UPDATE、COPY、GRANT、REVOKE、ALTER OWNER操作。 + diff --git "a/content/zh/docs/Developerguide/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" "b/content/zh/docs/Developerguide/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" new file mode 100644 index 000000000..1bb2fd757 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\224\250\346\210\267\345\222\214\346\235\203\351\231\220\345\256\241\350\256\241.md" @@ -0,0 +1,73 @@ +# 用户和权限审计 + +## audit\_login\_logout + +**参数说明:**这个参数决定是否审计openGauss用户的登录(包括登录成功和登录失败)、注销。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0\~7。 + +- 0表示关闭用户登录、注销审计功能。 +- 1表示只审计用户登录成功。 +- 2表示只审计用户登录失败。 +- 3表示只审计用户登录成功和失败。 +- 4表示只审计用户注销。 +- 5表示只审计用户注销和登录成功。 +- 6表示只审计用户注销和登录失败。 +- 7表示审计用户登录成功、失败和注销。 + +**默认值:**7 + +## audit\_database\_process + +**参数说明:**该参数决定是否对openGauss的启动、停止、切换和恢复进行审计。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭openGauss启动、停止、恢复和切换审计功能。 +- 1表示开启openGauss启动、停止、恢复和切换审计功能。 + +**默认值:**1 + +## audit\_user\_locked + +**参数说明:**该参数决定是否审计openGauss用户的锁定和解锁。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭用户锁定和解锁审计功能。 +- 1表示开启审计用户锁定和解锁功能。 + +**默认值:**1 + +## audit\_user\_violation + +**参数说明:**该参数决定是否审计用户的越权访问操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭用户越权操作审计功能。 +- 1表示开启用户越权操作审计功能。 + +**默认值:**0 + +## audit\_grant\_revoke + +**参数说明:**该参数决定是否审计openGauss用户权限授予和回收的操作。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0、1。 + +- 0表示关闭审计用户权限授予和回收功能。 +- 1表示开启审计用户权限授予和回收功能。 + +**默认值:**1 + diff --git "a/content/zh/docs/Developerguide/\347\224\250\346\210\267\346\235\203\351\231\220\350\256\276\347\275\256.md" "b/content/zh/docs/Developerguide/\347\224\250\346\210\267\346\235\203\351\231\220\350\256\276\347\275\256.md" new file mode 100644 index 000000000..949fd53fb --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\224\250\346\210\267\346\235\203\351\231\220\350\256\276\347\275\256.md" @@ -0,0 +1,43 @@ +# 用户权限设置 + +- 给用户直接授予某对象的权限,请使用[GRANT](GRANT.md)。 + + 将Schema中的表或者视图对象授权给其他用户或角色时,需要将表或视图所属Schema的USAGE权限同时授予该用户或角色。否则用户或角色将只能看到这些对象的名称,并不能实际进行对象访问。 + + 例如,下面示例将Schema tpcds的权限赋给用户joe后,将表tpcds.web\_returns的select权限赋给用户joe。 + + ``` + postgres=# GRANT USAGE ON SCHEMA tpcds TO joe; + postgres=# GRANT SELECT ON TABLE tpcds.web_returns to joe; + ``` + +- 给用户指定角色,使用户继承角色所拥有的对象权限。 + 1. 创建角色。 + + 新建一个角色lily,同时给角色指定系统权限CREATEDB: + + ``` + postgres=# CREATE ROLE lily WITH CREATEDB PASSWORD "Bigdata@123"; + ``` + + 2. 给角色赋予对象权限,请使用[GRANT](GRANT.md)。 + + 例如,将模式tpcds的权限赋给角色lily后,将表tpcds.web\_returns的select权限赋给角色lily。 + + ``` + postgres=# GRANT USAGE ON SCHEMA tpcds TO lily; + postgres=# GRANT SELECT ON TABLE tpcds.web_returns to lily; + ``` + + 3. 将角色的权限赋予用户。 + + ``` + postgres=# GRANT lily to joe; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >当将角色的权限赋予用户时,角色的属性并不会传递到用户。 + + +- 回收用户权限,请使用[REVOKE](REVOKE.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" new file mode 100644 index 000000000..b6d5c04c3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\233\270\345\205\263\346\246\202\345\277\265.md" @@ -0,0 +1,22 @@ +# 相关概念 + +## 数据库 + +数据库用于管理各类数据对象,与其他数据库隔离。创建数据对象时可以指定对应的表空间,如果不指定相应的表空间,相关的对象会默认保存在PG\_DEFAULT空间中。数据库管理的对象可分布在多个表空间上。 + +## 表空间 + +在openGauss中,表空间是一个目录,可以存在多个,里面存储的是它所包含的数据库的各种物理文件。由于表空间是一个目录,仅是起到了物理隔离的作用,其管理功能依赖于文件系统。 + +## 模式 + +openGauss的模式是对数据库做一个逻辑分割。所有的数据库对象都建立在模式下面。openGauss的模式和用户是弱绑定的,所谓的弱绑定是指虽然创建用户的同时会自动创建一个同名模式,但用户也可以单独创建模式,并且为用户指定其他的模式。 + +## 用户和角色 + +openGauss使用用户和角色来控制对数据库的访问。根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数据库用户。在openGauss中角色和用户之间的区别只在于角色默认是没有LOGIN权限的。在openGauss中一个用户唯一对应一个角色,不过可以使用角色叠加来更灵活地进行管理。 + +## 事务管理 + +在事务管理上,openGauss采取了MVCC(多版本并发控制)结合两阶段锁的方式,其特点是读写之间不阻塞。openGauss的MVCC没有将历史版本数据统一存放,而是和当前元组的版本放在了一起。openGauss没有回滚段的概念,但是为了定期清除历史版本数据openGauss引入了一个VACUUM线程。一般情况下用户不用关注它,除非要做性能调优。此外,openGauss是自动提交事务。 + diff --git "a/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204INSERT\345\222\214DELETE\345\271\266\345\217\221.md" "b/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204INSERT\345\222\214DELETE\345\271\266\345\217\221.md" new file mode 100644 index 000000000..2536c74e0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204INSERT\345\222\214DELETE\345\271\266\345\217\221.md" @@ -0,0 +1,33 @@ +# 相同表的INSERT和DELETE并发 + +事务T1: + +``` +START TRANSACTION; +INSERT INTO test VALUES(1,'test1','test123'); +COMMIT; +``` + +事务T2: + +``` +START TRANSACTION; +DELETE test WHERE NAME='test1'; +COMMIT; +``` + +场景1: + +开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执行事务T2的DELETE,此时显示DELETE 0,由于事务T1未提交,事务2看不到事务插入的数据; + +场景2: + +- READ COMMITTED级别 + + 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,提交事务T1,事务T2再执行DELETE语句时,此时显示DELETE 1,事务T1提交完成后,事务T2可以看到此条数据,可以删除成功。 + +- REPEATABLE READ级别 + + 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,提交事务T1,事务T2再执行DELETE语句时,此时显示DELETE 0,事务T1提交完成后,事务T2依旧看不到事务T1的数据,一个事务中前后查询到的数据是一致的。 + + diff --git "a/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221INSERT.md" "b/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221INSERT.md" new file mode 100644 index 000000000..3816fb7ab --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221INSERT.md" @@ -0,0 +1,33 @@ +# 相同表的并发INSERT + +事务T1: + +``` +START TRANSACTION; +INSERT INTO test VALUES(2,'test2','test123'); +COMMIT; +``` + +事务T2: + +``` +START TRANSACTION; +INSERT INTO test VALUES(3,'test3','test123'); +COMMIT; +``` + +场景1: + +开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执行事务T2的INSERT语句,可以执行成功,读已提交和可重复读隔离级别下,此时在事务T1中执行SELECT语句,看不到事务T2中插入的数据,事务T2中执行查询语句看不到事务T1中插入的数据。 + +场景2: + +- READ COMMITTED级别 + + 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后直接提交,事务T2中执行INSERT语句后执行查询语句,可以看到事务T1中插入的数据。 + +- REPEATABLE READ级别 + + 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后直接提交,事务T2中执行INSERT语句后执行查询语句,看不到事务T1中插入的数据。 + + diff --git "a/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221UPDATE.md" "b/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221UPDATE.md" new file mode 100644 index 000000000..8a8a131c4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\233\270\345\220\214\350\241\250\347\232\204\345\271\266\345\217\221UPDATE.md" @@ -0,0 +1,34 @@ +# 相同表的并发UPDATE + +事务T1: + +``` +START TRANSACTION; +UPDATE test SET address='test1234' WHERE name='test1'; +COMMIT; +``` + +事务T2: + +``` +START TRANSACTION; +UPDATE test SET address='test1234' WHERE name='test2'; +COMMIT; +``` + +事务T3: + +``` +START TRANSACTION; +UPDATE test SET address='test1234' WHERE name='test1'; +COMMIT; +``` + +场景1: + +开启事务T1,不提交的同时开启事务T2,事务T1开始执行UPDATE,事务T2开始执行UPDATE,事务T1和事务T2都执行成功。更新不同行时,更新操作拿的是行级锁,不会发生冲突,两个事务都可以执行成功。 + +场景2: + +开启事务T1,不提交的同时开启事务T3,事务T1开始执行UPDATE,事务T3开始执行UPDATE,事务T1执行成功,事务T3等待超时后会出错。更新相同行时,事务T1未提交时,未释放锁,导致事务T3执行不成功。 + diff --git "a/content/zh/docs/Developerguide/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" "b/content/zh/docs/Developerguide/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" new file mode 100644 index 000000000..89ea83d4f --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\241\256\350\256\244\350\277\236\346\216\245\344\277\241\346\201\257.md" @@ -0,0 +1,48 @@ +# 确认连接信息 + +客户端工具通过数据库主节点连接数据库。因此连接前,需获取数据库主节点所在服务器的IP地址及数据库主节点的端口号信息。 + +## 操作步骤 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用“gs\_om -t status --detail”命令查询openGauss各实例情况。 + + ``` + gs_om -t status --detail + ``` + + ``` + [ DBnode State ] + + node node_ip instance state + ----------------------------------------------------------------------------- + 1 plat1 192.168.0.11 5001 /srv/BigData/gaussdb/data1/dbnode Normal + 2 plat2 192.168.0.12 5002 /srv/BigData/gaussdb/data1/dbnode Normal + 3 plat3 192.168.0.13 5003 /srv/BigData/gaussdb/data1/dbnode Normal + ``` + + 如上部署了数据库主节点实例的服务器IP地址分别为192.168.10.11、192.168.10.12和192.168.0.13。数据库主节点数据路径为“/srv/BigData/gaussdb/data1/dbnode”。 + +3. 确认数据库主节点的端口号。 + + 在[2](#zh-cn_topic_0237120290_zh-cn_topic_0062129725_li736435692628)查到的数据库主节点数据路径下的postgresql.conf文件中查看端口号信息。示例如下: + + ``` + cat /srv/BigData/gaussdb/data1/dbnode/postgresql.conf | grep port + ``` + + ``` + port = 8000 # (change requires restart) + #comm_sctp_port = 1024 # Assigned by installation (change requires restart) + #comm_control_port = 10001 # Assigned by installation (change requires restart) + # supported by the operating system: + # e.g. 'localhost=10.145.130.2 localport=12211 remotehost=10.145.130.3 remoteport=12212, localhost=10.145.133.2 localport=12213 remotehost=10.145.133.3 remoteport=12214' + # e.g. 'localhost=10.145.130.2 localport=12311 remotehost=10.145.130.4 remoteport=12312, localhost=10.145.133.2 localport=12313 remotehost=10.145.133.4 remoteport=12314' + # %r = remote host and port + alarm_report_interval = 10 + support_extended_features=true + ``` + + 8000为数据库主节点的端口号。 + + diff --git "a/content/zh/docs/Developerguide/\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" "b/content/zh/docs/Developerguide/\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" new file mode 100644 index 000000000..7b705b7a8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\243\201\347\233\230\346\273\241\346\225\205\351\232\234\345\274\225\350\265\267\347\232\204core\351\227\256\351\242\230.md" @@ -0,0 +1,16 @@ +# 磁盘满故障引起的core问题 + +## 问题现象 + +TPCC运行时,注入磁盘满故障,数据库进程gaussdb core掉,如下图所示。 + +![](figures/zh-cn_image_0244851037.png) + +## 原因分析 + +数据库本身机制,在磁盘满时,XLOG日志无法进行写入,通过panic日志退出程序。 + +## 处理办法 + +外部监控磁盘使用状况,定时进行清理磁盘。 + diff --git "a/content/zh/docs/Developerguide/\347\243\201\347\233\230\347\251\272\351\227\264.md" "b/content/zh/docs/Developerguide/\347\243\201\347\233\230\347\251\272\351\227\264.md" new file mode 100644 index 000000000..5680d039d --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\243\201\347\233\230\347\251\272\351\227\264.md" @@ -0,0 +1,29 @@ +# 磁盘空间 + +介绍与磁盘空间相关的参数,用于限制临时文件所占用的磁盘空间。 + +## sql\_use\_spacelimit + +**参数说明:**限制单个SQL在单个数据库节点上,触发落盘操作时,落盘文件的空间大小,管控的空间包扩普通表、临时表以及中间结果集落盘占用的空间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置 + +**取值范围:**整型,-1\~2147483647,单位为KB。其中-1表示没有限制。 + +**默认值:-1** + +## temp\_file\_limit + +**参数说明:**限制一个会话中,触发下盘操作时,单个下盘文件的空间大小。例如一次会话中,排序和哈希表使用的临时文件,或者游标占用的临时文件。 + +此设置为会话级别的下盘文件控制。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>SQL查询执行时使用的临时表空间不在此限制。 + +**取值范围:**整型,-1\~2147483647,单位为KB。其中-1表示没有限制。 + +**默认值:**-1 + 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-10.md" new file mode 100644 index 000000000..3d185d738 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213-10.md" @@ -0,0 +1,446 @@ +# 示例 + +## 常用功能示例代码1 + +``` +// 此示例演示如何通过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); + } +``` + +## 常用功能示例代码2 + +``` +#include +#include +#include + +static void exit_nicely(PGconn *conn) +{ + PQfinish(conn); + exit(1); +} + +int main(int argc, char **argv) +{ + const char *conninfo; + PGconn *conn; + PGresult *res; + int nFields; + int i,j; + + /* + * 如果用户在命令行上提供了一个参数,将它用作连接信息串。 + * 否则默认用设置 dbname=postgres 并且为所有其他链接参数使用环境变量或默认值。 + */ + if (argc > 1) + conninfo = argv[1]; + else + conninfo = "dbname = postgres"; + + /* 建立到数据库的一个连接 */ + conn = PQconnectdb(conninfo); + + /* 检查看后端连接是否成功建立 */ + if (PQstatus(conn) != CONNECTION_OK) + { + fprintf(stderr, "Connection to database failed: %s", + PQerrorMessage(conn)); + exit_nicely(conn); + } + + /* + * 我们的测试案例这里涉及使用一个游标,对它我们必须用在一个事务块内。 + * 我们可以在一个单一的 "select * from pg_database" 的 PQexec() 中做整个事情, + * 但是作为一个好的例子它太琐碎。 + */ + + /* 开始一个事务块 */ + res = PQexec(conn, "BEGIN"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn)); + PQclear(res); + exit_nicely(conn); + } + + /* 任何时候不再需要 PGresult 时,应该 PQclear 它来避免内存泄露 */ + PQclear(res); + + /* 从 pg_database 取得行,它是数据库的系统目录 */ + res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn)); + PQclear(res); + exit_nicely(conn); + } + PQclear(res); + + res = PQexec(conn, "FETCH ALL in myportal"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn)); + PQclear(res); + exit_nicely(conn); + } + + /* 首先,打印出属性名 */ + nFields = PQnfields(res); + for (i = 0; i < nFields; i++) + printf("%-15s", PQfname(res, i)); + printf("\n\n"); + + /* 接下来,打印出行 */ + for (i = 0; i < PQntuples(res); i++) + { + for (j = 0; j < nFields; j++) + printf("%-15s", PQgetvalue(res, i, j)); + printf("\n"); + } + + PQclear(res); + + /* 关闭入口,我们不需要考虑检查错误 */ + res = PQexec(conn, "CLOSE myportal"); + PQclear(res); + + /* 结束事务 */ + res = PQexec(conn, "END"); + PQclear(res); + + /* 关闭到数据库的连接并且清理 */ + PQfinish(conn); + + 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); + } + + 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.md" "b/content/zh/docs/Developerguide/\347\244\272\344\276\213.md" new file mode 100644 index 000000000..13413d1f0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\213.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\2131-\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\2131-\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..7bf0d911f --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\244\272\344\276\2131-\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,111 @@ +# 示例1:通过本地文件导入导出数据 + +在使用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://localhost:8000/postgres"); //数据库URL + String username = new String("username"); //用户名 + String password = new String("passwd"); //密码 + 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); + } + + // 将表migration_table中数据导出到本地文件d:/data.txt + try { + copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //将d:/data.txt中的数据导入到migration_table_1中。 + try { + copyFromFile(conn, "d:/data.txt", tablename1); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 将表migration_table_1中的数据导出到本地文件d:/data1.txt + try { + copyToFile(conn, "d:/data1.txt", tablename1); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + 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 with (" + "DELIMITER"+"'"+ delimiter + "'" + "ENCODING " + "'" + encoding + "')", fileInputStream); + } finally { + if (fileInputStream != null) { + try { + fileInputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + 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\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\216MySQL\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..f9d418a21 --- /dev/null +++ "b/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" @@ -0,0 +1,91 @@ +# 示例2:从MySQL向openGauss进行数据迁移 + +下面示例演示如何通过CopyManager从MySQL向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://localhost:8000/postgres"); //数据库URL + 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"); //定义字符集 + 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 with (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.mysql.jdbc.Driver").newInstance(); + Connection conn = DriverManager.getConnection("jdbc:mysql://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\252\227\345\217\243\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\347\252\227\345\217\243\345\207\275\346\225\260.md" new file mode 100644 index 000000000..a3df5afe4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\252\227\345\217\243\345\207\275\346\225\260.md" @@ -0,0 +1,625 @@ +# 窗口函数 + +## 窗口函数 + +列存表目前只支持rank\(expression\)和row\_number\(expression\)两个函数。 + +窗口函数与OVER语句一起使用。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>窗口函数中的order by后面必须跟字段名,若order by后面跟数字,该数字会被按照常量处理,因此对目标列没有起到排序的作用。 + +- RANK\(\) + + 描述:RANK函数为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。 + + 返回值类型: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) + ``` + +- ROW\_NUMBER\(\) + + 描述:ROW\_NUMBER函数为各组内值生成连续排序序号,其中,相同的值其序号也不相同。 + + 返回值类型:BIGINT + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, Row_number() 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 | row_number + -------+---------------+------------ + 1 | 1 | 1 + 1 | 1 | 2 + 1 | 1 | 3 + 1 | 1 | 4 + 1 | 1 | 5 + 1 | 1 | 6 + 1 | 1 | 7 + 1 | 2 | 8 + 1 | 2 | 9 + 1 | 2 | 10 + 1 | 2 | 11 + 1 | 2 | 12 + 1 | 2 | 13 + 1 | 2 | 14 + 1 | 3 | 15 + 1 | 3 | 16 + 1 | 3 | 17 + 1 | 3 | 18 + 1 | 3 | 19 + 1 | 3 | 20 + 1 | 3 | 21 + 1 | 4 | 22 + 1 | 4 | 23 + 1 | 4 | 24 + 1 | 4 | 25 + 1 | 4 | 26 + 1 | 4 | 27 + 1 | 4 | 28 + 1 | 5 | 29 + 1 | 5 | 30 + 2 | 5 | 1 + 2 | 5 | 2 + 2 | 5 | 3 + 2 | 5 | 4 + 2 | 5 | 5 + 2 | 6 | 6 + 2 | 6 | 7 + 2 | 6 | 8 + 2 | 6 | 9 + 2 | 6 | 10 + 2 | 6 | 11 + 2 | 6 | 12 + (42 rows) + ``` + +- DENSE\_RANK\(\) + + 描述:DENSE\_RANK函数为各组内值生成连续排序序号,其中,相同的值具有相同序号。 + + 返回值类型:BIGINT + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, dense_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 | dense_rank + -------+---------------+------------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 5 | 5 + 1 | 5 | 5 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + (42 rows) + ``` + +- PERCENT\_RANK\(\) + + 描述:PERCENT\_RANK函数为各组内对应值生成相对序号,即根据公式 \(rank - 1\) / \(total rows - 1\)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。 + + 返回值类型:DOUBLE PRECISION + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, percent_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 | percent_rank + -------+---------------+------------------ + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 5 | .96551724137931 + 1 | 5 | .96551724137931 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + (42 rows) + ``` + +- CUME\_DIST\(\) + + 描述:CUME\_DIST函数为各组内对应值生成累积分布序号。即根据公式\(小于等于当前值的数据行数\)/\(该分组总行数totalrows\)计算所得的相对序号。 + + 返回值类型:DOUBLE PRECISION + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, cume_dist() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim e_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | cume_dist + -------+---------------+------------------ + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + (42 rows) + ``` + +- NTILE\(num\_buckets integer\) + + 描述:NTILE函数根据num\_buckets integer将有序的数据集合平均分配到num\_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。 + + 返回值类型:INTEGER + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, ntile(3) 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 | ntile + -------+---------------+------- + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 5 | 3 + 1 | 5 | 3 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 3 + 2 | 6 | 3 + 2 | 6 | 3 + 2 | 6 | 3 + (42 rows) + ``` + +- LAG\(value any \[, offset integer \[, default any \]\]\) + + 描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 + + 返回值类型:与参数数据类型相同 + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, lag(d_moy,3,null) 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 | lag + -------+---------------+----- + 1 | 1 | + 1 | 1 | + 1 | 1 | + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | + 2 | 5 | + 2 | 5 | + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + (42 rows) + ``` + +- LEAD\(value any \[, offset integer \[, default any \]\]\) + + 描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, lead(d_fy_week_seq,2) 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 | lead + -------+---------------+------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 2 + 1 | 1 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 3 + 1 | 2 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 4 + 1 | 3 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 5 + 1 | 4 | 5 + 1 | 5 | + 1 | 5 | + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 6 + 2 | 5 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | + 2 | 6 | + (42 rows) + ``` + +- FIRST\_VALUE\(value any\) + + 描述:FIRST\_VALUE函数取各组内的第一个值作为返回结果。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, first_value(d_fy_week_seq) 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 | first_value + -------+---------------+------------- + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + (42 rows) + ``` + +- LAST\_VALUE\(value any\) + + 描述:LAST\_VALUE函数取各组内的最后一个值作为返回结果。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, last_value(d_moy) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2; + d_moy | d_fy_week_seq | last_value + -------+---------------+------------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 5 | 2 + (35 rows) + ``` + +- NTH\_VALUE\(value any, nth integer\) + + 描述:NTH\_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ``` + postgres=# SELECT d_moy, d_fy_week_seq, nth_value(d_fy_week_seq,6) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2; + d_moy | d_fy_week_seq | nth_value + -------+---------------+----------- + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | + 2 | 5 | + 2 | 5 | + 2 | 5 | + 2 | 5 | + (35 rows) + ``` + + diff --git "a/content/zh/docs/Developerguide/\347\255\211\345\276\205\344\272\213\344\273\266.md" "b/content/zh/docs/Developerguide/\347\255\211\345\276\205\344\272\213\344\273\266.md" new file mode 100644 index 000000000..dbe0cdd3c --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\255\211\345\276\205\344\272\213\344\273\266.md" @@ -0,0 +1,15 @@ +# 等待事件 + +## enable\_instr\_track\_wait + +**参数说明:**是否开启等待事件信息实时收集功能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:表示打开等待事件信息收集功能。 +- off:表示关闭等待事件信息收集功能。 + +**默认值**:on + 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" new file mode 100644 index 000000000..58197c897 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\256\200\345\215\225\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,98 @@ +# 简单表达式 + +## 逻辑表达式 + +逻辑表达式的操作符和运算规则,请参见[逻辑操作符](逻辑操作符.md#ZH-CN_TOPIC_0242370429)。 + +## 比较表达式 + +常用的比较操作符,请参见[比较操作符](比较操作符.md#ZH-CN_TOPIC_0242370430)。 + +除比较操作符外,还可以使用以下句式结构: + +- BETWEEN操作符 + + a BETWEEN x_ _ AND y等效于a \>= x AND a <= y + + a NOT BETWEEN_ _ x AND y等效于a < x OR a \> y + +- 检查一个值是不是null,可使用: + + expression_ _IS NULL + + expression IS NOT NULL + + 或者与之等价的句式结构,但不是标准的: + + expression_ _ ISNULL + + expression NOTNULL + + >![](public_sys-resources/icon-notice.gif) **须知:** + >不要写expression=NULL或expression<\>\(!=\)NULL,因为NULL代表一个未知的值,不能通过该表达式判断两个未知值是否相等。 + + +## 示例 + +``` +postgres=# SELECT 2 BETWEEN 1 AND 3 AS RESULT; + result +---------- + t +(1 row) + +postgres=# SELECT 2 >= 1 AND 2 <= 3 AS RESULT; + result +---------- + t +(1 row) + +postgres=# SELECT 2 NOT BETWEEN 1 AND 3 AS RESULT; + result +---------- + f +(1 row) + +postgres=# SELECT 2 < 1 OR 2 > 3 AS RESULT; + result +---------- + f +(1 row) + +postgres=# SELECT 2+2 IS NULL AS RESULT; + result +---------- + f +(1 row) + +postgres=# SELECT 2+2 IS NOT NULL AS RESULT; + result +---------- + t +(1 row) + +postgres=# SELECT 2+2 ISNULL AS RESULT; + result +---------- + f +(1 row) + +postgres=# SELECT 2+2 NOTNULL AS RESULT; + result +---------- + t +(1 row) + +postgres=# SELECT 2+2 IS DISTINCT FROM NULL AS RESULT; + result +---------- + t +(1 row) + +postgres=# SELECT 2+2 IS NOT DISTINCT FROM NULL AS RESULT; + result +---------- + f +(1 row) +``` + 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" new file mode 100644 index 000000000..b039f912c --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\344\272\213\345\212\241.md" @@ -0,0 +1,42 @@ +# 管理事务 + +事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。openGauss数据库支持的事务控制命令有启动、设置、提交、回滚事务。openGauss数据库支持的事务隔离级别有读已提交和可重复读。 + +## 事务控制 + +以下是数据库支持的事务命令: + +- 启动事务 + + 用户可以使用[START TRANSACTION](START-TRANSACTION.md)和[BEGIN](BEGIN.md)语法启动事务。 + +- 设置事务 + + 用户可以使用SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务特性,详细操作请参考[SET TRANSACTION](SET-TRANSACTION.md)。 + +- 提交事务 + + 用户可以使用COMMIT或者END可完成提交事务的功能,即提交事务的所有操作,详细操作请参考[COMMIT | END](COMMIT-END.md)。 + +- 回滚事务 + + 回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,详细操作请参考[ROLLBACK](ROLLBACK.md)。 + + +## 事务隔离级别 + +事务隔离级别,它决定多个事务并发操作同一个对象时的处理方式。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在事务中第一个数据修改语句(SELECT,INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 + +- **READ COMMITTED**:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。 + + 实际上,SELECT查询会查看到在查询开始运行的瞬间该数据库的一个快照。不过,SELECT能查看到其自身所在事务中先前更新的执行结果。即使先前更新尚未提交。请注意,在同一个事务里两个相邻的SELECT命令可能会查看到不同的快照,因为其它事务会在第一个SELECT执行期间提交。 + + 因为在读已提交模式里,每个新的命令都是从一个新的快照开始的,而这个快照包含所有到该时刻为止已提交的事务,因此同一事务中后面的命令将看到任何已提交的其它事务的效果。这里关心的问题是在单个命令里是否看到数据库里绝对一致的视图。 + + 读已提交模式提供的部分事务隔离对于许多应用而言是足够的,并且这个模式速度快,使用简单。不过,对于做复杂查询和更新的应用,可能需要保证数据库有比读已提交模式更加严格的一致性视图。 + +- **REPEATABLE READ**:事务可重复读隔离级别,事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前更新的执行结果,即使先前更新尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务,因为可能会发生串行化失败。 + 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" new file mode 100644 index 000000000..e67b0155d --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\221\230.md" @@ -0,0 +1,44 @@ +# 管理员 + +## 初始用户 + +openGauss安装过程中自动生成的帐户称为初始用户。初始用户也是系统管理员、监控管理员、运维管理员和安全策略管理员,拥有系统的最高权限,能够执行所有的操作。该帐户与进行openGauss安装的操作系统用户同名,其初始密码为GaussDB@2012。在第一次登录数据库后,请及时修改此初始化密码。 + +初始用户会绕过所有权限检查。建议仅将此初始用户作为DBA管理用途,而非业务应用。 + +## 系统管理员 + +系统管理员是指具有SYSADMIN属性的帐户,默认安装情况下具有与对象所有者相同的权限,但不包括dbms\_perf模式的对象权限。 + +要创建新的系统管理员,请以初始用户或者系统管理员用户身份连接数据库,并使用带SYSADMIN选项的[CREATE USER](CREATE-USER.md)语句或 [ALTER USER](ALTER-USER.md)语句进行设置。 + +``` +postgres=# CREATE USER sysadmin WITH SYSADMIN password "Bigdata@123"; +``` + +或者 + +``` +postgres=# ALTER USER joe SYSADMIN; +``` + +ALTER USER时,要求用户已存在。 + +## 监控管理员 + +监控管理员是指具有MONADMIN属性的帐户,具有查看dbms\_perf模式下视图和函数的权限,亦可以对dbms\_perf模式的对象权限进行授予或收回。 + +要创建新的监控管理员,请以初始用户身份连接数据库,并使用带MONADMIN选项的[CREATE USER](CREATE-USER.md)语句或 [ALTER USER](ALTER-USER.md)语句进行设置。 + +``` +postgres=# CREATE USER monadmin WITH MONADMIN password "Bigdata@123"; +``` + +或者 + +``` +postgres=# ALTER USER joe MONADMIN; +``` + +ALTER USER时,要求用户已存在。 + diff --git "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\271\266\345\217\221\345\206\231\345\205\245\346\223\215\344\275\234.md" "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\271\266\345\217\221\345\206\231\345\205\245\346\223\215\344\275\234.md" new file mode 100644 index 000000000..1e3b52e61 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\345\271\266\345\217\221\345\206\231\345\205\245\346\223\215\344\275\234.md" @@ -0,0 +1,11 @@ +# 管理并发写入操作 + +- **[事务隔离说明](事务隔离说明.md)** + +- **[写入和读写操作](写入和读写操作.md)** + +- **[并发写入事务的潜在死锁情况](并发写入事务的潜在死锁情况.md)** + +- **[并发写入示例](并发写入示例.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" new file mode 100644 index 000000000..6f718c316 --- /dev/null +++ "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" @@ -0,0 +1,9 @@ +# 管理数据库安全 + +- **[客户端接入认证](客户端接入认证-0.md)** + +- **[管理用户及权限](管理用户及权限.md)** + +- **[设置数据库审计](设置数据库审计.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\256\241\347\220\206\347\224\250\346\210\267\345\217\212\346\235\203\351\231\220.md" "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\347\224\250\346\210\267\345\217\212\346\235\203\351\231\220.md" new file mode 100644 index 000000000..cb1428d2e --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\256\241\347\220\206\347\224\250\346\210\267\345\217\212\346\235\203\351\231\220.md" @@ -0,0 +1,21 @@ +# 管理用户及权限 + +- **[默认权限机制](默认权限机制.md)** + +- **[管理员](管理员.md)** + +- **[三权分立](三权分立.md)** + +- **[用户](用户.md)** + +- **[角色](角色.md)** + +- **[Schema](Schema.md)** + +- **[用户权限设置](用户权限设置.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" new file mode 100644 index 000000000..e97377642 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242.md" @@ -0,0 +1,13 @@ +# 类型转换 + +- **[概述](概述-15.md)** + +- **[操作符](操作符.md)** + +- **[函数](函数.md)** + +- **[值存储](值存储.md)** + +- **[UNION,CASE和相关构造](UNION-CASE和相关构造.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242\345\207\275\346\225\260.md" new file mode 100644 index 000000000..879f31a8b --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\261\273\345\236\213\350\275\254\346\215\242\345\207\275\346\225\260.md" @@ -0,0 +1,588 @@ +# 类型转换函数 + +## 类型转换函数 + +- cast\(x as y\) + + 描述:类型转换函数,将x转换成y指定的类型。 + + 示例: + + ``` + postgres=# SELECT cast('22-oct-1997' as timestamp); + timestamp + --------------------- + 1997-10-22 00:00:00 + (1 row) + ``` + +- hextoraw\(string\) + + 描述:将一个十六进制构成的字符串转换为二进制。 + + 返回值类型:raw + + 示例: + + ``` + postgres=# SELECT hextoraw('7D'); + hextoraw + ---------- + 7D + (1 row) + ``` + +- numtoday\(numeric\) + + 描述:将数字类型的值转换为指定格式的时间戳。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT numtoday(2); + numtoday + ---------- + 2 days + (1 row) + ``` + +- pg\_systimestamp\(\) + + 描述:获取系统时间戳。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT pg_systimestamp(); + pg_systimestamp + ------------------------------- + 2015-10-14 11:21:28.317367+08 + (1 row) + ``` + +- rawtohex\(string\) + + 描述:将一个二进制构成的字符串转换为十六进制的字符串。 + + 结果为输入字符的ACSII码,以十六进制表示。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT rawtohex('1234567'); + rawtohex + ---------------- + 31323334353637 + (1 row) + ``` + +- to\_char \(datetime/interval \[, fmt\]\) + + 描述:将一个DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE或者TIMESTAMP WITH LOCAL TIME ZONE类型的DATETIME或者INTERVAL值按照fmt指定的格式转换为VARCHAR类型。 + + - 可选参数fmt可以为以下几类:日期、时间、星期、季度和世纪。每类都可以有不同的模板,模板之间可以合理组合,常见的模板有:HH、MM、SS、YYYY、MM、DD。 + - 模板可以有修饰词,常用的修饰词是FM,可以用来抑制前导的零或尾随的空白。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT to_char(current_timestamp,'HH12:MI:SS'); + to_char + ---------- + 10:19:26 + (1 row) + ``` + + ``` + postgres=# SELECT to_char(current_timestamp,'FMHH12:FMMI:FMSS'); + to_char + ---------- + 10:19:46 + (1 row) + ``` + +- to\_char\(double precision, text\) + + 描述:将双精度类型的值转换为指定格式的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT to_char(125.8::real, '999D99'); + to_char + --------- + 125.80 + (1 row) + ``` + +- to\_char \(integer/number\[, fmt\]\) + + 描述:将一个整型或者浮点类型的值转换为指定格式的字符串。 + + - 可选参数fmt可以为以下几类:十进制字符、“分组”符、正负号和货币符号,每类都可以有不同的模板,模板之间可以合理组合,常见的模板有:9、0、,(千分隔符)、.(小数点)。 + - 模板可以有类似FM的修饰词,但FM不抑制由模板0指定而输出的0。 + - 要将整型类型的值转换成对应16进制值的字符串,使用模板X或x。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT to_char(1485,'9,999'); + to_char + --------- + 1,485 + (1 row) + ``` + + ``` + postgres=# SELECT to_char( 1148.5,'9,999.999'); + to_char + ------------ + 1,148.500 + (1 row) + ``` + + ``` + postgres=# SELECT to_char(148.5,'990999.909'); + to_char + ------------- + 0148.500 + (1 row) + ``` + + ``` + postgres=# SELECT to_char(123,'XXX'); + to_char + --------- + 7B + (1 row) + ``` + +- to\_char\(interval, text\) + + 描述:将时间间隔类型的值转换为指定格式的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT to_char(interval '15h 2m 12s', 'HH24:MI:SS'); + to_char + ---------- + 15:02:12 + (1 row) + ``` + +- to\_char\(int, text\) + + 描述:将整数类型的值转换为指定格式的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT to_char(125, '999'); + to_char + --------- + 125 + (1 row) + ``` + +- to\_char\(numeric, text\) + + 描述:将数字类型的值转换为指定格式的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT to_char(-125.8, '999D99S'); + to_char + --------- + 125.80- + (1 row) + ``` + +- to\_char \(string\) + + 描述:将CHAR、VARCHAR、VARCHAR2、CLOB类型转换为VARCHAR类型。 + + 如使用该函数对CLOB类型进行转换,且待转换CLOB类型的值超出目标类型的范围,则返回错误。 + + 返回值类型:varchar + + 示例: + + ``` + postgres=# SELECT to_char('01110'); + to_char + --------- + 01110 + (1 row) + ``` + +- to\_char\(timestamp, text\) + + 描述:将时间戳类型的值转换为指定格式的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT to_char(current_timestamp, 'HH12:MI:SS'); + to_char + ---------- + 10:55:59 + (1 row) + ``` + +- to\_clob\(char/nchar/varchar/nvarchar/varchar2/nvarchar2/text/raw\) + + 描述:将RAW类型或者文本字符集类型CHAR、NCHAR、VARCHAR、VARCHAR2、NVARCHAR2、TEXT转成CLOB类型。 + + 返回值类型:clob + + 示例: + + ``` + postgres=# SELECT to_clob('ABCDEF'::RAW(10)); + to_clob + --------- + ABCDEF + (1 row) + ``` + + ``` + postgres=# SELECT to_clob('hello111'::CHAR(15)); + to_clob + ---------- + hello111 + (1 row) + ``` + + ``` + postgres=# SELECT to_clob('gauss123'::NCHAR(10)); + to_clob + ---------- + gauss123 + (1 row) + ``` + + ``` + postgres=# SELECT to_clob('gauss234'::VARCHAR(10)); + to_clob + ---------- + gauss234 + (1 row) + ``` + + ``` + postgres=# SELECT to_clob('gauss345'::VARCHAR2(10)); + to_clob + ---------- + gauss345 + (1 row) + ``` + + ``` + postgres=# SELECT to_clob('gauss456'::NVARCHAR2(10)); + to_clob + ---------- + gauss456 + (1 row) + ``` + + ``` + postgres=# SELECT to_clob('World222!'::TEXT); + to_clob + ----------- + World222! + (1 row) + ``` + +- to\_date\(text\) + + 描述:将文本类型的值转换为指定格式的时间戳。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT to_date('2015-08-14'); + to_date + --------------------- + 2015-08-14 00:00:00 + (1 row) + ``` + +- to\_date\(text, text\) + + 描述:将字符串类型的值转换为指定格式的日期。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT to_date('05 Dec 2000', 'DD Mon YYYY'); + to_date + --------------------- + 2000-12-05 00:00:00 + (1 row) + ``` + +- to\_date\(string, fmt\) + + 描述: + + 将字符串string按fmt指定格式转化为DATE类型的值。 + + 该函数不能直接支持CLOB类型,但是CLOB类型的参数能够通过隐式转换实现。 + + 返回值类型:date + + 示例: + + ``` + postgres=# SELECT TO_DATE('05 Dec 2010','DD Mon YYYY'); + to_date + --------------------- + 2010-12-05 00:00:00 + (1 row) + ``` + +- to\_number \( expr \[, fmt\]\) + + 描述:将expr按指定格式转换为一个NUMBER类型的值。 + + 类型转换格式请参考[表1](#zh-cn_topic_0237121973_zh-cn_topic_0059778246_t3987a5bb00154b0f9e55863b4ababd3d)。 + + 转换十六进制字符串为十进制数字时,最多支持16个字节的十六进制字符串转换为无符号数。 + + 转换十六进制字符串为十进制数字时,格式字符串中不允许出现除'x'或'X'以外的其他字符,否则报错。 + + 返回值类型:number + + 示例: + + ``` + postgres=# SELECT to_number('12,454.8-', '99G999D9S'); + to_number + ----------- + -12454.8 + (1 row) + ``` + +- to\_number\(text, text\) + + 描述:将字符串类型的值转换为指定格式的数字。 + + 返回值类型:numeric + + 示例: + + ``` + postgres=# SELECT to_number('12,454.8-', '99G999D9S'); + to_number + ----------- + -12454.8 + (1 row) + ``` + +- to\_timestamp\(double precision\) + + 描述:把UNIX纪元转换成时间戳。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT to_timestamp(1284352323); + to_timestamp + ------------------------ + 2010-09-13 12:32:03+08 + (1 row) + ``` + +- to\_timestamp\(string \[,fmt\]\) + + 描述:将字符串string按fmt指定的格式转换成时间戳类型的值。不指定fmt时,按参数nls\_timestamp\_format所指定的格式转换。 + + openGauss的to\_timestamp中, + + - 如果输入的年份YYYY=0,系统报错。 + - 如果输入的年份YYYY<0,在fmt中指定SYYYY,则正确输出公元前绝对值n的年份。 + + fmt中出现的字符必须与日期/时间格式化的模式相匹配,否则报错。 + + 返回值类型:timestamp without time zone + + 示例: + + ``` + postgres=# SHOW nls_timestamp_format; + nls_timestamp_format + ---------------------------- + DD-Mon-YYYY HH:MI:SS.FF AM + (1 row) + + postgres=# SELECT to_timestamp('12-sep-2014'); + to_timestamp + --------------------- + 2014-09-12 00:00:00 + (1 row) + ``` + + ``` + postgres=# SELECT to_timestamp('12-Sep-10 14:10:10.123000','DD-Mon-YY HH24:MI:SS.FF'); + to_timestamp + ------------------------- + 2010-09-12 14:10:10.123 + (1 row) + ``` + + ``` + postgres=# SELECT to_timestamp('-1','SYYYY'); + to_timestamp + ------------------------ + 0001-01-01 00:00:00 BC + (1 row) + ``` + + ``` + postgres=# SELECT to_timestamp('98','RR'); + to_timestamp + --------------------- + 1998-01-01 00:00:00 + (1 row) + ``` + + ``` + postgres=# SELECT to_timestamp('01','RR'); + to_timestamp + --------------------- + 2001-01-01 00:00:00 + (1 row) + ``` + +- to\_timestamp\(text, text\) + + 描述:将字符串类型的值转换为指定格式的时间戳。 + + 返回值类型:timestamp + + 示例: + + ``` + postgres=# SELECT to_timestamp('05 Dec 2000', 'DD Mon YYYY'); + to_timestamp + --------------------- + 2000-12-05 00:00:00 + (1 row) + ``` + + +**表 1** 数值格式化的模版模式 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

模式

+

描述

+

9

+

带有指定数值位数的值

+

0

+

带前导零的值

+

.(句点)

+

小数点

+

,(逗号)

+

分组(千)分隔符

+

PR

+

尖括号内负值

+

S

+

带符号的数值(使用区域设置)

+

L

+

货币符号(使用区域设置)

+

D

+

小数点(使用区域设置)

+

G

+

分组分隔符(使用区域设置)

+

MI

+

在指明的位置的负号(如果数字 < 0)

+

PL

+

在指明的位置的正号(如果数字 > 0)

+

SG

+

在指明的位置的正/负号

+

RN

+

罗马数字(输入在 1 和 3999 之间)

+

TH或th

+

序数后缀

+

V

+

移动指定位(小数)

+
+ 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" new file mode 100644 index 000000000..ab5509a16 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\344\277\241\346\201\257\345\207\275\346\225\260.md" @@ -0,0 +1,1162 @@ +# 系统信息函数 + +## 会话信息函数 + +- current\_catalog + + 描述:当前数据库的名称(在标准SQL中称"catalog")。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT current_catalog; + current_database + ------------------ + postgres + (1 row) + ``` + +- current\_database\(\) + + 描述:当前数据库的名称。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT current_database(); + current_database + ------------------ + postgres + (1 row) + ``` + +- current\_query\(\) + + 描述:由客户端提交的当前执行语句(可能包含多个声明)。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT current_query(); + current_query + ------------------------- + SELECT current_query(); + (1 row) + ``` + +- current\_schema\[\(\)\] + + 描述:当前模式的名称。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT current_schema(); + current_schema + ---------------- + public + (1 row) + ``` + + 备注:current\_schema返回在搜索路径中第一个顺位有效的模式名。(如果搜索路径为空则返回NULL,没有有效的模式名也返回NULL)。如果创建表或者其他命名对象时没有声明目标模式,则将使用这些对象的模式。 + +- current\_schemas\(Boolean\) + + 描述:搜索路径中的模式名称。 + + 返回值类型:name\[\] + + 示例: + + ``` + postgres=# SELECT current_schemas(true); + current_schemas + --------------------- + {pg_catalog,public} + (1 row) + ``` + + 备注: + + current\_schemas\(Boolean\)返回搜索路径中所有模式名称的数组。布尔选项决定像pg\_catalog这样隐含包含的系统模式是否包含在返回的搜索路径中。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >搜索路径可以通过运行时设置更改。命令是: + >``` + >SET search_path TO schema [, schema, ...] + >``` + +- current\_user + + 描述:当前执行环境下的用户名。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT current_user; + current_user + -------------- + omm + (1 row) + ``` + + 备注:current\_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过[SET ROLE](SET-ROLE.md#ZH-CN_TOPIC_0242370652)改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 + +- pg\_current\_user\(\) + + 描述:当前执行环境下的会话ID。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT pg_current_sessionid(); + pg_current_sessionid + ---------------------------- + 1579228402.140190434944768 + (1 row) + ``` + + 备注:pg\_current\_sessionid\(\)是用于获取当前执行环境下的会话ID。其组成结构为:时间戳.会话ID,当线程池模式开启(enable\_thread\_pool=on)时,会话ID为SessionID;而线程池模式关闭时,会话ID为ThreadID。 + +- inet\_client\_addr\(\) + + 描述:连接的远端地址。inet\_client\_addr返回当前客户端的IP地址。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此函数只有在远程连接模式下有效。 + + 返回值类型:inet + + 示例: + + ``` + postgres=# SELECT inet_client_addr(); + inet_client_addr + ------------------ + 10.10.0.50 + (1 row) + ``` + +- inet\_client\_port\(\) + + 描述:连接的远端端口。inet\_client\_port返回当前客户端的端口号。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此函数只有在远程连接模式下有效。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT inet_client_port(); + inet_client_port + ------------------ + 33143 + (1 row) + ``` + +- inet\_server\_addr\(\) + + 描述:连接的本地地址。inet\_server\_addr返回服务器接收当前连接用的IP地址。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此函数只有在远程连接模式下有效。 + + 返回值类型:inet + + 示例: + + ``` + postgres=# SELECT inet_server_addr(); + inet_server_addr + ------------------ + 10.10.0.13 + (1 row) + ``` + +- inet\_server\_port\(\) + + 描述:连接的本地端口。inet\_server\_port返回接收当前连接的端口号。如果是通过Unix-domain socket连接的,则所有这些函数都返回NULL。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >此函数只有在远程连接模式下有效。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT inet_server_port(); + inet_server_port + ------------------ + 8000 + (1 row) + ``` + +- pg\_backend\_pid\(\) + + 描述:当前会话连接的服务进程的进程ID。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT pg_backend_pid(); + pg_backend_pid + ----------------- + 140229352617744 + (1 row) + ``` + +- pg\_conf\_load\_time\(\) + + 描述:配置加载时间。pg\_conf\_load\_time返回最后加载服务器配置文件的时间戳。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT pg_conf_load_time(); + pg_conf_load_time + ------------------------------ + 2017-09-01 16:05:23.89868+08 + (1 row) + ``` + +- pg\_my\_temp\_schema\(\) + + 描述:会话的临时模式的OID,不存在则为0。 + + 返回值类型:oid + + 示例: + + ``` + postgres=# SELECT pg_my_temp_schema(); + pg_my_temp_schema + ------------------- + 0 + (1 row) + ``` + + 备注:pg\_my\_temp\_schema返回当前会话中临时模式的OID,如果不存在(没有创建临时表)的话则返回0。如果给定的OID是其它会话中临时模式的OID,pg\_is\_other\_temp\_schema则返回true。 + +- pg\_is\_other\_temp\_schema\(oid\) + + 描述:是否为另一个会话的临时模式。 + + 返回值类型:Boolean + + 示例: + + ``` + postgres=# SELECT pg_is_other_temp_schema(25356); + pg_is_other_temp_schema + ------------------------- + f + (1 row) + ``` + +- pg\_listening\_channels\(\) + + 描述:会话正在监听的信道名称。 + + 返回值类型:setof text + + 示例: + + ``` + postgres=# SELECT pg_listening_channels(); + pg_listening_channels + ----------------------- + (0 rows) + ``` + + 备注:pg\_listening\_channels返回当前会话正在监听的一组信道名称。 + +- pg\_postmaster\_start\_time\(\) + + 描述:服务器启动时间。pg\_postmaster\_start\_time返回服务器启动时的timestamp with time zone。 + + 返回值类型:timestamp with time zone + + 示例: + + ``` + postgres=# SELECT pg_postmaster_start_time(); + pg_postmaster_start_time + ------------------------------ + 2017-08-30 16:02:54.99854+08 + (1 row) + ``` + +- pg\_trigger\_depth\(\) + + 描述:触发器的嵌套层次。 + + 返回值类型:int + + 示例: + + ``` + postgres=# SELECT pg_trigger_depth(); + pg_trigger_depth + ------------------ + 0 + (1 row) + ``` + +- pgxc\_version\(\) + + 描述:Postgres-XC版本信息。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT pgxc_version(); + pgxc_version + ------------------------------------------------------------------------------------------------------------- + Postgres-XC 1.1 on x86_64-unknown-linux-gnu, based on PostgreSQL 9.2.4, compiled by g++ (GCC) 5.4.0, 64-bit + (1 row) + ``` + +- session\_user + + 描述:会话用户名。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT session_user; + session_user + -------------- + omm + (1 row) + ``` + + 备注:session\_user通常是连接当前数据库的初始用户,不过系统管理员可以用[SET SESSION AUTHORIZATION](SET-SESSION-AUTHORIZATION.md#ZH-CN_TOPIC_0242370653)修改这个设置。 + +- user + + 描述:等价于current\_user。 + + 返回值类型:name + + 示例: + + ``` + postgres=# SELECT user; + current_user + -------------- + omm + (1 row) + ``` + +- version\(\) + + 描述:版本信息。version返回一个描述服务器版本信息的字符串。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT version(); + version + --------------------------------------------------------------------------------------------------------------------------------------- + PostgreSQL 9.2.4 (openGauss-1.0.0 build 66e54e4d) compiled at 2020-01-02 13:02:26 commit 7218 last mr 10175 on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 8.2.0, 64-bit + + (1 row) + ``` + + +## 访问权限查询函数 + +- has\_any\_column\_privilege\(user, table, privilege\) + + 描述:指定用户是否有访问表任何列的权限。 + + 返回类型:Boolean + +- has\_any\_column\_privilege\(table, privilege\) + + 描述:当前用户是否有访问表任何列的权限。 + + 返回类型:Boolean + + 备注:has\_any\_column\_privilege检查用户是否以特定方式访问表的任何列。其参数可能与has\_table\_privilege类似,除了访问权限类型必须是SELECT、INSERT、UPDATE或REFERENCES的一些组合。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >拥有表的表级别权限则隐含的拥有该表每列的列级权限,因此如果与has\_table\_privilege参数相同,has\_any\_column\_privilege总是返回true。但是如果授予至少一列的列级权限也返回成功。 + +- has\_column\_privilege\(user, table, column, privilege\) + + 描述:指定用户是否有访问列的权限。 + + 返回类型:Boolean + +- has\_column\_privilege\(table, column, privilege\) + + 描述:当前用户是否有访问列的权限。 + + 返回类型:Boolean + + 备注:has\_column\_privilege检查用户是否以特定方式访问一列。其参数类似于has\_table\_privilege,可以通过列名或属性号添加列。想要的访问权限类型必须是SELECT、INSERT、UPDATE或REFERENCES的一些组合。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >拥有表的表级别权限则隐含的拥有该表每列的列级权限。 + +- has\_database\_privilege\(user, database, privilege\) + + 描述:指定用户是否有访问数据库的权限。 + + 返回类型:Boolean + +- has\_database\_privilege\(database, privilege\) + + 描述:当前用户是否有访问数据库的权限。 + + 返回类型:Boolean + + 备注:has\_database\_privilege检查用户是否能以在特定方式访问数据库。其参数类似has\_table\_privilege。访问权限类型必须是CREATE、CONNECT、TEMPORARY或TEMP(等价于TEMPORARY)的一些组合。 + +- has\_directory\_privilege\(user, database, privilege\) + + 描述:指定用户是否有访问directory的权限。 + + 返回类型:Boolean + +- has\_directory\_privilege\(database, privilege\) + + 描述:当前用户是否有访问directory的权限。 + + 返回类型:Boolean + +- has\_foreign\_data\_wrapper\_privilege\(user, fdw, privilege\) + + 描述:指定用户是否有访问外部数据封装器的权限。 + + 返回类型:Boolean + +- has\_foreign\_data\_wrapper\_privilege\(fdw, privilege\) + + 描述:当前用户是否有访问外部数据封装器的权限。 + + 返回类型:Boolean + + 备注:has\_foreign\_data\_wrapper\_privilege检查用户是否能以特定方式访问外部数据封装器。其参数类似has\_table\_privilege。访问权限类型必须是USAGE。 + +- has\_function\_privilege\(user, function, privilege\) + + 描述:指定用户是否有访问函数的权限。 + + 返回类型:Boolean + +- has\_function\_privilege\(function, privilege\) + + 描述:当前用户是否有访问函数的权限。 + + 返回类型:Boolean + + 备注:has\_function\_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has\_table\_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考[对象标识符类型](对象标识符类型.md#ZH-CN_TOPIC_0242370424))。访问权限类型必须是EXECUTE。 + +- has\_language\_privilege\(user, language, privilege\) + + 描述:指定用户是否有访问语言的权限。 + + 返回类型:Boolean + +- has\_language\_privilege\(language, privilege\) + + 描述:当前用户是否有访问语言的权限。 + + 返回类型:Boolean + + 备注:has\_language\_privilege检查用户是否能以特定方式访问一个过程语言。其参数类似has\_table\_privilege。访问权限类型必须是USAGE。 + +- has\_schema\_privilege\(user, schema, privilege\) + + 描述:指定用户是否有访问模式的权限。 + + 返回类型:Boolean + +- has\_schema\_privilege\(schema, privilege\) + + 描述:当前用户是否有访问模式的权限。 + + 返回类型:Boolean + + 备注:has\_schema\_privilege检查用户是否能以特定方式访问一个模式。其参数类似has\_table\_privilege。访问权限类型必须是CREATE或USAGE的一些组合。 + +- has\_server\_privilege\(user, server, privilege\) + + 描述:指定用户是否有访问外部服务的权限。 + + 返回类型:Boolean + +- has\_server\_privilege\(server, privilege\) + + 描述:当前用户是否有访问外部服务的权限。 + + 返回类型:Boolean + + 备注:has\_server\_privilege检查用户是否能以指定方式访问一个外部服务器。其参数类似has\_table\_privilege。访问权限类型必须是USAGE。 + +- has\_table\_privilege\(user, table, privilege\) + + 描述:指定用户是否有访问表的权限。 + + 返回类型:Boolean + +- has\_table\_privilege\(table, privilege\) + + 描述:当前用户是否有访问表的权限。 + + 返回类型:Boolean + + 备注:has\_table\_privilege检查用户是否以特定方式访问表。用户可以通过名称或OID(pg\_authid.oid)来指定,public表明PUBLIC伪角色,或如果缺省该参数,则使用current\_user。该表可以通过名称或者OID声明。如果用名称声明,则在必要时可以用模式进行修饰。如果使用文本字符串来声明所希望的权限类型,这个文本字符串必须是SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES或TRIGGER之一的值。可以给权限类型添加WITH GRANT OPTION,用来测试权限是否拥有授权选项。也可以用逗号分隔列出的多个权限类型,如果拥有任何所列出的权限,则结果便为true。 + + 示例: + + ``` + postgres=# SELECT has_table_privilege('tpcds.web_site', 'select'); + has_table_privilege + --------------------- + t + (1 row) + + postgres=# SELECT has_table_privilege('omm', 'tpcds.web_site', 'select,INSERT WITH GRANT OPTION '); + has_table_privilege + --------------------- + t + (1 row) + ``` + +- has\_tablespace\_privilege\(user, tablespace, privilege\) + + 描述:指定用户是否有访问表空间的权限。 + + 返回类型:Boolean + +- has\_tablespace\_privilege\(tablespace, privilege\) + + 描述:当前用户是否有访问表空间的权限。 + + 返回类型:Boolean + + 备注:has\_tablespace\_privilege检查用户是否能以特定方式访问一个表空间。其参数类似has\_table\_privilege。访问权限类型必须是CREATE。 + +- pg\_has\_role\(user, role, privilege\) + + 描述:指定用户是否有角色的权限。 + + 返回类型:Boolean + +- pg\_has\_role\(role, privilege\) + + 描述:当前用户是否有角色的权限。 + + 返回类型:Boolean + + 备注:pg\_has\_role检查用户是否能以特定方式访问一个角色。其参数类似has\_table\_privilege,除了public不能用做用户名。访问权限类型必须是MEMBER或USAGE的一些组合。 MEMBER表示的是角色中的直接或间接成员关系(也就是SET ROLE的权限),而USAGE表示无需通过SET ROLE也直接拥有角色的使用权限。 + + +## 模式可见性查询函数 + +每个函数执行检查数据库对象类型的可见性。对于函数和操作符,如果在前面的搜索路径中没有相同的对象名称和参数的数据类型,则此对象是可见的。对于操作符类,则要同时考虑名称和相关索引的访问方法。 + +所有这些函数都需要使用OID来标识要需要检查的对象。如果用户想通过名称测试对象,则使用OID别名类型(regclass、regtype、regprocedure、regoperator、regconfig或regdictionary)将会很方便。 + +比如,如果一个表所在的模式在搜索路径中,并且在前面的搜索路径中没有同名的表,则这个表是可见的。它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的名称: + +``` +postgres=# SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); +``` + +- pg\_collation\_is\_visible\(collation\_oid\) + + 描述:该排序是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_conversion\_is\_visible\(conversion\_oid\) + + 描述:该转换是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_function\_is\_visible\(function\_oid\) + + 描述:该函数是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_opclass\_is\_visible\(opclass\_oid\) + + 描述:该操作符类是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_operator\_is\_visible\(operator\_oid\) + + 描述:该操作符是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_opfamily\_is\_visible\(opclass\_oid\) + + 描述:该操作符族是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_table\_is\_visible\(table\_oid\) + + 描述:该表是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_ts\_config\_is\_visible\(config\_oid\) + + 描述:该文本检索配置是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_ts\_dict\_is\_visible\(dict\_oid\) + + 描述:该文本检索词典是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_ts\_parser\_is\_visible\(parser\_oid\) + + 描述:该文本搜索解析是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_ts\_template\_is\_visible\(template\_oid\) + + 描述:该文本检索模板是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg\_type\_is\_visible\(type\_oid\) + + 描述:该类型(或域)是否在搜索路径中可见。 + + 返回类型:Boolean + + +## 系统表信息函数 + +- format\_type\(type\_oid, typemod\) + + 描述:获取数据类型的SQL名称 + + 返回类型:text + + 备注:format\_type通过某个数据类型的类型OID以及可能的类型修饰词,返回其SQL名称。如果不知道具体的修饰词,则在类型修饰词的位置传入NULL。类型修饰词一般只对有长度限制的数据类型有意义。format\_type所返回的SQL名称中包含数据类型的长度值,其大小是:实际存储长度len - sizeof\(int32\),单位字节。原因是数据存储时需要32位的空间来存储用户对数据类型的自定义长度信息,即实际存储长度要比用户定义长度多4个字节。在下例中,format\_type返回的SQL名称为“character varying\(6\)”,6表示varchar类型的长度值是6字节,因此该类型的实际存储长度为10字节。 + + ``` + postgres=# SELECT format_type((SELECT oid FROM pg_type WHERE typname='varchar'), 10); + format_type + ---------------------- + character varying(6) + (1 row) + ``` + +- pg\_check\_authid\(role\_oid\) + + 描述:检查是否存在给定oid的角色名 + + 返回类型:bool + +- pg\_describe\_object\(catalog\_id, object\_id, object\_sub\_id\) + + 描述:获取数据库对象的描述 + + 返回类型:text + + 备注:pg\_describe\_object返回由目录OID,对象OID和一个(或许0个)子对象ID指定的数据库对象的描述。这有助于确认存储在pg\_depend系统表中对象的身份。 + +- pg\_get\_constraintdef\(constraint\_oid\) + + 描述:获取约束的定义 + + 返回类型:text + +- pg\_get\_constraintdef\(constraint\_oid, pretty\_bool\) + + 描述:获取约束的定义 + + 返回类型:text + + 备注:pg\_get\_constraintdef和pg\_get\_indexdef分别从约束或索引上使用创建命令进行重构。 + +- pg\_get\_expr\(pg\_node\_tree, relation\_oid\) + + 描述:反编译表达式的内部形式,假设其中的任何Vars都引用第二个参数指定的关系。 + + 返回类型:text + +- pg\_get\_expr\(pg\_node\_tree, relation\_oid, pretty\_bool\) + + 描述:反编译表达式的内部形式,假设其中的任何Vars都引用第二个参数指定的关系。 + + 返回类型:text + + 备注:pg\_get\_expr反编译一个独立表达式的内部形式,比如一个字段的缺省值。在检查系统表的内容的时候很有用。如果表达式可能包含关键字,则指定他们引用相关的OID作为第二个参数;如果没有关键字,零就足够了。 + +- pg\_get\_functiondef\(func\_oid\) + + 描述:获取函数的定义 + + 返回类型:text + +- pg\_get\_function\_arguments\(func\_oid\) + + 描述:获取函数定义的参数列表(带默认值) + + 返回类型:text + + 备注:pg\_get\_function\_arguments返回一个函数的参数列表,需要在CREATE FUNCTION中使用这种格式。 + +- pg\_get\_function\_identity\_arguments\(func\_oid\) + + 描述:获取参数列表来确定一个函数 \(不带默认值\) + + 返回类型:text + + 备注:pg\_get\_function\_identity\_arguments返回需要的参数列表用来标识函数,这种形式需要在ALTER FUNCTION中使用,并且这种形式省略了默认值。 + +- pg\_get\_function\_result\(func\_oid\) + + 描述:获取函数的RETURNS子句 + + 返回类型:text + + 备注:pg\_get\_function\_result为函数返回适当的RETURNS子句。 + +- pg\_get\_indexdef\(index\_oid\) + + 描述:获取索引的CREATE INDEX命令 + + 返回类型:text + +- pg\_get\_indexdef\(index\_oid, column\_no, pretty\_bool\) + + 描述:获取索引的CREATE INDEX命令,或者如果column\_no不为零,则只获取一个索引字段的定义。 + + 返回类型:text + + 备注:pg\_get\_functiondef为函数返回一个完整的CREATE OR REPLACE FUNCTION语句。 + +- pg\_get\_keywords\(\) + + 描述:获取SQL关键字和类别列表 + + 返回类型:setof record + + 备注: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的角色名 + + 返回类型:name + + 备注:pg\_get\_userbyid通过角色的OID抽取对应的用户名。 + +- pg\_get\_viewdef\(view\_name\) + + 描述:为视图获取底层的SELECT命令 + + 返回类型:text + +- pg\_get\_viewdef\(view\_name, pretty\_bool\) + + 描述:为视图获取底层的SELECT命令,如果pretty\_bool为true,行字段可以包含80列。 + + 返回类型:text + + 备注:pg\_get\_viewdef重构出定义视图的SELECT查询。这些函数大多数都有两种形式,其中带有pretty\_bool参数,且参数为true时,是"适合打印"的结果,这种格式更容易读。另一种是缺省的格式,更有可能被将来的不同版本用同样的方法解释。如果是用于转储,那么尽可能避免使用适合打印的格式。给pretty-print参数传递false生成的结果和没有这个参数的变种生成的结果是完全一样。 + +- pg\_get\_viewdef\(view\_oid\) + + 描述:为视图获取底层的SELECT命令 + + 返回类型:text + +- pg\_get\_viewdef\(view\_oid, pretty\_bool\) + + 描述:为视图获取底层的SELECT命令,如果pretty\_bool为true,行字段可以包含80列。 + + 返回类型:text + +- pg\_get\_viewdef\(view\_oid, wrap\_column\_int\) + + 描述:为视图获取底层的SELECT命令;行字段被换到指定的列数,打印是隐含的。 + + 返回类型:text + +- pg\_get\_tabledef\(table\_oid\) + + 描述:根据table\_oid获取表定义 + + 返回类型:text + +- pg\_get\_tabledef\(table\_name\) + + 描述:根据table\_name获取表定义 + + 返回类型:text + + 备注:pg\_get\_tabledef重构出表定义的CREATE语句,包含了表定义本身、索引信息、comments信息。对于表对象依赖的group、schema、tablespace、server等信息,需要用户自己去创建,表定义里不会有这些对象的创建语句。 + +- pg\_options\_to\_table\(reloptions\) + + 描述:获取存储选项名称/值对的集合 + + 返回类型:setof record + + 备注:pg\_options\_to\_table当通过pg\_class.reloptions或pg\_attribute.attoptions时返回存储选项名称/值对(option\_name/option\_value)的集合。 + +- pg\_tablespace\_databases\(tablespace\_oid\) + + 描述:获取在指定的表空间中有对象的数据库OID集合 + + 返回类型:setof oid + + 备注:pg\_tablespace\_databases允许检查表空间的状况,返回在该表空间中保存了对象的数据库OID集合。如果这个函数返回数据行,则该表空间就是非空的,因此不能删除。要显示该表空间中的特定对象,用户需要连接pg\_tablespace\_databases标识的数据库与查询pg\_class系统表。 + +- pg\_tablespace\_location\(tablespace\_oid\) + + 描述:获取表空间所在的文件系统的路径 + + 返回类型:text + +- pg\_typeof\(any\) + + 描述:获取任何值的数据类型 + + 返回类型:regtype + + 备注:pg\_typeof返回传递给他的值的数据类型OID。这可能有助于故障排除或动态构造SQL查询。声明此函数返回regtype,这是一个OID别名类型(请参考[对象标识符类型](对象标识符类型.md#ZH-CN_TOPIC_0242370424));这意味着它是一个为了比较而显示类型名称的OID。 + + 示例: + + ``` + postgres=# SELECT pg_typeof(33); + pg_typeof + ----------- + integer + (1 row) + + postgres=# SELECT typlen FROM pg_type WHERE oid = pg_typeof(33); + typlen + -------- + 4 + (1 row) + ``` + +- collation for \(any\) + + 描述:获取参数的排序 + + 返回类型:text + + 备注:表达式collation for返回传递给他的值的排序。示例: + + ``` + postgres=# SELECT collation for (description) FROM pg_description LIMIT 1; + pg_collation_for + ------------------ + "default" + (1 row) + ``` + + 值可能是引号括起来的并且模式限制的。如果没有为参数表达式排序,则返回一个null值。如果参数不是排序的类型,则抛出一个错误。 + +- getdistributekey\(table\_name\) + + 描述:获取一个hash表的分布列。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT getdistributekey('item'); + getdistributekey + ------------------ + i_item_sk + (1 row) + ``` + + +## 注释信息函数 + +- col\_description\(table\_oid, column\_number\) + + 描述:获取一个表字段的注释 + + 返回类型:text + + 备注:col\_description返回一个表中字段的注释,通过表OID和字段号来声明。 + +- obj\_description\(object\_oid, catalog\_name\) + + 描述:获取一个数据库对象的注释 + + 返回类型:text + + 备注:带有两个参数的obj\_description返回一个数据库对象的注释,该对象是通过其OID和其所属的系统表名称声明。比如,obj\_description\(123456,'pg\_class'\)将返回OID为123456的表的注释。只带一个参数的obj\_description只要求对象OID。 + + obj\_description不能用于表字段,因为字段没有自己的OID。 + +- obj\_description\(object\_oid\) + + 描述:获取一个数据库对象的注释 + + 返回类型:text + +- shobj\_description\(object\_oid, catalog\_name\) + + 描述:获取一个共享数据库对象的注释 + + 返回类型:text + + 备注:shobj\_description和obj\_description差不多,不同之处仅在于前者用于共享对象。一些系统表是通用于openGauss中所有数据库的全局表,因此这些表的注释也是全局存储的。 + + +## 事务ID和快照 + +以下的函数在一个输出形式中提供服务器事务信息。这些函数的主要用途是为了确定在两个快照之间有哪个事务提交。 + +- pgxc\_is\_committed\(transaction\_id\) + + 描述:如果提交或忽略给定的XID(gxid)。NULL表示的状态是未知的(运行,准备,冻结等)。 + + 返回类型:bool + +- txid\_current\(\) + + 描述:获取当前事务ID。 + + 返回类型:bigint + +- txid\_current\_snapshot\(\) + + 描述:获取当前快照。 + + 返回类型:txid\_snapshot + +- txid\_snapshot\_xip\(txid\_snapshot\) + + 描述:在快照中获取正在进行的事务ID。 + + 返回类型:setof bigint + +- txid\_snapshot\_xmax\(txid\_snapshot\) + + 描述:获取快照的xmax。 + + 返回类型:bigint + +- txid\_snapshot\_xmin\(txid\_snapshot\) + + 描述:获取快照的xmin。 + + 返回类型:bigint + +- txid\_visible\_in\_snapshot\(bigint, txid\_snapshot\) + + 描述:在快照中事务ID是否可见(不使用子事务ID)。 + + 返回类型:Boolean + +- get\_local\_prepared\_xact\(\) + + 描述:获取当前节点两阶段残留事务信息,包括事务id,两阶段gid名称,prepared的时间,owner的oid,database的oid及当前节点的node\_name。 + + 返回类型:xid, text, timestamptz, oid, oid,text + +- get\_remote\_prepared\_xacts\(\) + + 描述:获取所有远程节点两阶段残留事务信息,包括事务id,两阶段gid名称,prepared的时间,owner的名称,database的名称及node\_name。 + + 返回类型:xid, text, timestamptz, name, name,text + +- global\_clean\_prepared\_xacts\(text, text\) + + 描述:并发清理两阶段残留事务,仅gs\_clean工具可以调用清理,其他用户调用均返回false。 + + 返回类型:Boolean + +- pgxc\_stat\_get\_wal\_senders\_status\(\) + + 描述:返回节点事务日志备机接收状态。 + + 返回值如下: + + **表 1** pgxc\_stat\_get\_wal\_senders\_status返回参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

字段名

+

描述

+

nodename

+

主节点名。

+

source_ip

+

主节点IP。

+

source_port

+

主节点端口。

+

dest_ip

+

备节点IP。

+

dest_port

+

备节点端口。

+

sender_pid

+

发送线程PID。

+

local_role

+

主节点类型。

+

peer_role

+

备节点类型。

+

peer_state

+

备节点状态。

+

state

+

wal sender状态。

+

sender_sent_location

+

主节点发送位置。

+

sender_write_location

+

主节点落盘位置。

+

sender_replay_location

+

主节点redo位置。

+

receiver_received_location

+

备节点接收位置。

+

receiver_write_location

+

备节点落盘位置。

+

receiver_flush_location

+

备节点flush磁盘位置。

+

receiver_replay_location

+

备节点redo位置。

+
+ + +内部事务ID类型(xid)是32位,每40亿事务一次循环。这些函数使用的数据类型txid\_snapshot,存储在特定时刻事务ID可见性的信息。其组件描述在[表2](#zh-cn_topic_0237121987_zh-cn_topic_0059777618_t537e765e3f164cdeb9ca75f865e3aa0d)。 + +**表 2** 快照组件 + + + + + + + + + + + + + + + + +

名称

+

描述

+

xmin

+

最早的事务ID(txid)仍然活动。所有较早事务将是已经提交可见的,或者是直接回滚。

+

xmax

+

作为尚未分配的txid。所有大于或等于此txids的都是尚未开始的快照时间,因此不可见。

+

xip_list

+

当前快照中活动的txids。这个列表只包含在xmin和xmax之间活动的txids;有可能活动的txids高于xmax。 介于大于等于xmin、小于xmax,并且不在这个列表中的txid,在这个时间快照已经完成的,因此按照提交状态查看他是可见还是回滚。这个列表不包含子事务的txids。

+
+ +txid\_snapshot的文本表示为:xmin:xmax:xip\_list。 + +示例:10:20:10,14,15意思为:xmin=10, xmax=20, xip\_list=10, 14, 15。 + diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" new file mode 100644 index 000000000..2ac262386 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\200\247\350\203\275\345\277\253\347\205\247.md" @@ -0,0 +1,45 @@ +# 系统性能快照 + +## enable\_wdr\_snapshot + +**参数说明:**是否开启数据库监控快照功能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on:打开数据库监控快照功能。 +- off:关闭数据库监控快照功能。 + +**默认值**:off + +## wdr\_snapshot\_retention\_days + +**参数说明:**系统中数据库监控快照数据的保留天数,超过设置的值之后,系统每隔wdr\_snapshot\_interval时间间隔,清理snapshot\_id最小的快照数据。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1~8。 + +**默认值**:8 + +## wdr\_snapshot\_query\_timeout + +**参数说明:**系统执行数据库监控快照操作时,设置快照操作相关的sql语句的执行超时时间。如果语句超过设置的时间没有执行完并返回结果,则本次快照操作失败。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,100~INT\_MAX(秒)。 + +**默认值**:100s + +## wdr\_snapshot\_interval + +**参数说明:**后台线程Snapshot自动对数据库监控数据执行快照操作的时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,10~60(分钟)。 + +**默认值**:1h + 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" new file mode 100644 index 000000000..fa62627f6 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\346\223\215\344\275\234.md" @@ -0,0 +1,28 @@ +# 系统操作 + +openGauss通过SQL语句执行不同的系统操作,比如:设置变量,显示执行计划和垃圾收集等操作。 + +## 设置变量 + +设置会话或事务中需要使用的各种参数,请参考[SET](SET.md)。 + +## 显示执行计划 + +显示openGauss为SQL语句规划的执行计划,请参考[EXPLAIN](EXPLAIN.md#ZH-CN_TOPIC_0242370627)。 + +## 事务日志检查点 + +预写式日志(WAL)缺省时在事务日志中每隔一段时间放置一个检查点。CHECKPOINT强迫立即进行检查,而不是等到下一次调度时的检查点。请参考[CHECKPOINT](CHECKPOINT.md#ZH-CN_TOPIC_0242370553)。 + +## 垃圾收集 + +进行垃圾收集以及可选择的对数据库进行分析。请参考[VACUUM](VACUUM.md#ZH-CN_TOPIC_0242370659)。 + +## 收集统计信息 + +收集与数据库中表内容相关的统计信息。请参考[ANALYZE | ANALYSE](ANALYZE-ANALYSE.md)。 + +## 设置当前事务的约束检查模式 + +设置当前事务里的约束检查的特性。请参考[SET CONSTRAINTS](SET-CONSTRAINTS.md#ZH-CN_TOPIC_0242370651)。 + diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\347\256\241\347\220\206\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\347\256\241\347\220\206\345\207\275\346\225\260.md" new file mode 100644 index 000000000..65288dccd --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\347\256\241\347\220\206\345\207\275\346\225\260.md" @@ -0,0 +1,21 @@ +# 系统管理函数 + +- **[配置设置函数](配置设置函数.md)** + +- **[通用文件访问函数](通用文件访问函数.md)** + +- **[服务器信号函数](服务器信号函数.md)** + +- **[备份恢复控制函数](备份恢复控制函数.md)** + +- **[快照同步函数](快照同步函数.md)** + +- **[数据库对象函数](数据库对象函数.md)** + +- **[咨询锁函数](咨询锁函数.md)** + +- **[逻辑复制函数](逻辑复制函数.md)** + +- **[其它函数](其它函数.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250.md" new file mode 100644 index 000000000..f1d19ac64 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250.md" @@ -0,0 +1,145 @@ +# 系统表 + +- **[GS\_OPT\_MODEL](GS_OPT_MODEL.md)** + +- **[GS\_WLM\_INSTANCE\_HISTORY](GS_WLM_INSTANCE_HISTORY.md)** + +- **[GS\_WLM\_OPERATOR\_INFO](GS_WLM_OPERATOR_INFO.md)** + +- **[GS\_WLM\_PLAN\_ENCODING\_TABLE](GS_WLM_PLAN_ENCODING_TABLE.md)** + +- **[GS\_WLM\_PLAN\_OPERATOR\_INFO](GS_WLM_PLAN_OPERATOR_INFO.md)** + +- **[GS\_WLM\_SESSION\_QUERY\_INFO\_ALL](GS_WLM_SESSION_QUERY_INFO_ALL.md)** + +- **[GS\_WLM\_USER\_RESOURCE\_HISTORY](GS_WLM_USER_RESOURCE_HISTORY.md)** + +- **[PG\_AGGREGATE](PG_AGGREGATE.md)** + +- **[PG\_AM](PG_AM.md)** + +- **[PG\_AMOP](PG_AMOP.md)** + +- **[PG\_AMPROC](PG_AMPROC.md)** + +- **[PG\_APP\_WORKLOADGROUP\_MAPPING](PG_APP_WORKLOADGROUP_MAPPING.md)** + +- **[PG\_ATTRDEF](PG_ATTRDEF.md)** + +- **[PG\_ATTRIBUTE](PG_ATTRIBUTE.md)** + +- **[PG\_AUTHID](PG_AUTHID.md)** + +- **[PG\_AUTH\_HISTORY](PG_AUTH_HISTORY.md)** + +- **[PG\_AUTH\_MEMBERS](PG_AUTH_MEMBERS.md)** + +- **[PG\_CAST](PG_CAST.md)** + +- **[PG\_CLASS](PG_CLASS.md)** + +- **[PG\_COLLATION](PG_COLLATION.md)** + +- **[PG\_CONSTRAINT](PG_CONSTRAINT.md)** + +- **[PG\_CONVERSION](PG_CONVERSION.md)** + +- **[PG\_DATABASE](PG_DATABASE.md)** + +- **[PG\_DB\_ROLE\_SETTING](PG_DB_ROLE_SETTING.md)** + +- **[PG\_DEFAULT\_ACL](PG_DEFAULT_ACL.md)** + +- **[PG\_DEPEND](PG_DEPEND.md)** + +- **[PG\_DESCRIPTION](PG_DESCRIPTION.md)** + +- **[PG\_DIRECTORY](PG_DIRECTORY.md)** + +- **[PG\_ENUM](PG_ENUM.md)** + +- **[PG\_EXTENSION](PG_EXTENSION.md)** + +- **[PG\_EXTENSION\_DATA\_SOURCE](PG_EXTENSION_DATA_SOURCE.md)** + +- **[PG\_FOREIGN\_DATA\_WRAPPER](PG_FOREIGN_DATA_WRAPPER.md)** + +- **[PG\_FOREIGN\_SERVER](PG_FOREIGN_SERVER.md)** + +- **[PG\_FOREIGN\_TABLE](PG_FOREIGN_TABLE.md)** + +- **[PG\_INDEX](PG_INDEX.md)** + +- **[PG\_INHERITS](PG_INHERITS.md)** + +- **[PG\_JOB](PG_JOB.md)** + +- **[PG\_JOB\_PROC](PG_JOB_PROC.md)** + +- **[PG\_LANGUAGE](PG_LANGUAGE.md)** + +- **[PG\_LARGEOBJECT](PG_LARGEOBJECT.md)** + +- **[PG\_LARGEOBJECT\_METADATA](PG_LARGEOBJECT_METADATA.md)** + +- **[PG\_NAMESPACE](PG_NAMESPACE.md)** + +- **[PG\_OBJECT](PG_OBJECT.md)** + +- **[PG\_OPCLASS](PG_OPCLASS.md)** + +- **[PG\_OPERATOR](PG_OPERATOR.md)** + +- **[PG\_OPFAMILY](PG_OPFAMILY.md)** + +- **[PG\_PARTITION](PG_PARTITION.md)** + +- **[PG\_PLTEMPLATE](PG_PLTEMPLATE.md)** + +- **[PG\_PROC](PG_PROC.md)** + +- **[PG\_RANGE](PG_RANGE.md)** + +- **[PG\_RESOURCE\_POOL](PG_RESOURCE_POOL.md)** + +- **[PG\_REWRITE](PG_REWRITE.md)** + +- **[PG\_RLSPOLICY](PG_RLSPOLICY.md)** + +- **[PG\_SECLABEL](PG_SECLABEL.md)** + +- **[PG\_SHDEPEND](PG_SHDEPEND.md)** + +- **[PG\_SHDESCRIPTION](PG_SHDESCRIPTION.md)** + +- **[PG\_SHSECLABEL](PG_SHSECLABEL.md)** + +- **[PG\_STATISTIC](PG_STATISTIC.md)** + +- **[PG\_STATISTIC\_EXT](PG_STATISTIC_EXT.md)** + +- **[PG\_TABLESPACE](PG_TABLESPACE.md)** + +- **[PG\_TRIGGER](PG_TRIGGER.md)** + +- **[PG\_TS\_CONFIG](PG_TS_CONFIG.md)** + +- **[PG\_TS\_CONFIG\_MAP](PG_TS_CONFIG_MAP.md)** + +- **[PG\_TS\_DICT](PG_TS_DICT.md)** + +- **[PG\_TS\_PARSER](PG_TS_PARSER.md)** + +- **[PG\_TS\_TEMPLATE](PG_TS_TEMPLATE.md)** + +- **[PG\_TYPE](PG_TYPE.md)** + +- **[PG\_USER\_MAPPING](PG_USER_MAPPING.md)** + +- **[PG\_USER\_STATUS](PG_USER_STATUS.md)** + +- **[PG\_WORKLOAD\_GROUP](PG_WORKLOAD_GROUP.md)** + +- **[PLAN\_TABLE\_DATA](PLAN_TABLE_DATA.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\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\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276.md" new file mode 100644 index 000000000..979dbc319 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276.md" @@ -0,0 +1,9 @@ +# 系统表和系统视图 + +- **[系统表和系统视图概述](系统表和系统视图概述.md)** + +- **[系统表](系统表.md)** + +- **[系统视图](系统视图.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276\346\246\202\350\277\260.md" "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276\346\246\202\350\277\260.md" new file mode 100644 index 000000000..918fdea6e --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\241\250\345\222\214\347\263\273\347\273\237\350\247\206\345\233\276\346\246\202\350\277\260.md" @@ -0,0 +1,13 @@ +# 系统表和系统视图概述 + +系统表是openGauss存放结构元数据的地方,它是openGauss数据库系统运行控制信息的来源,是数据库系统的核心组成部分。 + +系统视图提供了查询系统表和访问数据库内部状态的方法。 + +系统表和系统视图要么只对管理员可见,要么对所有用户可见。下面的系统表和视图有些标识了需要管理员权限,这些系统表和视图只有管理员可以查询。 + +用户可以删除后重新创建这些表、增加列、插入和更新数值,但是用户修改系统表会导致系统信息的不一致,从而导致系统控制紊乱。正常情况下不应该由用户手工修改系统表或系统视图,或者手工重命名系统表或系统视图所在的模式,而是由SQL语句关联的系统表操作自动维护系统表信息。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>用户应该禁止对系统表进行增删改等操作,人为对系统表的修改或破坏可能会导致系统各种异常情况甚至openGauss不可用 + 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" new file mode 100644 index 000000000..8d0fc22f7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\263\273\347\273\237\350\247\206\345\233\276.md" @@ -0,0 +1,185 @@ +# 系统视图 + +- **[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)** + +- **[GS\_SQL\_COUNT](GS_SQL_COUNT.md)** + +- **[GS\_WLM\_OPERATOR\_HISTORY](GS_WLM_OPERATOR_HISTORY.md)** + +- **[GS\_WLM\_OPERATOR\_STATISTICS](GS_WLM_OPERATOR_STATISTICS.md)** + +- **[GS\_WLM\_PLAN\_OPERATOR\_HISTORY](GS_WLM_PLAN_OPERATOR_HISTORY.md)** + +- **[GS\_WLM\_REBUILD\_USER\_RESOURCE\_POOL](GS_WLM_REBUILD_USER_RESOURCE_POOL.md)** + +- **[GS\_WLM\_RESOURCE\_POOL](GS_WLM_RESOURCE_POOL.md)** + +- **[GS\_WLM\_SESSION\_HISTORY](GS_WLM_SESSION_HISTORY.md)** + +- **[GS\_WLM\_SESSION\_INFO\_ALL](GS_WLM_SESSION_INFO_ALL.md)** + +- **[GS\_WLM\_USER\_INFO](GS_WLM_USER_INFO.md)** + +- **[GS\_WLM\_SESSION\_STATISTICS](GS_WLM_SESSION_STATISTICS.md)** + +- **[GS\_STAT\_DB\_CU](GS_STAT_DB_CU.md)** + +- **[GS\_STAT\_SESSION\_CU](GS_STAT_SESSION_CU.md)** + +- **[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)** + +- **[PG\_EXT\_STATS](PG_EXT_STATS.md)** + +- **[PG\_GET\_INVALID\_BACKENDS](PG_GET_INVALID_BACKENDS.md)** + +- **[PG\_GET\_SENDERS\_CATCHUP\_TIME](PG_GET_SENDERS_CATCHUP_TIME.md)** + +- **[PG\_GROUP](PG_GROUP.md)** + +- **[PG\_INDEXES](PG_INDEXES.md)** + +- **[PG\_LOCKS](PG_LOCKS.md)** + +- **[PG\_NODE\_ENV](PG_NODE_ENV.md)** + +- **[PG\_OS\_THREADS](PG_OS_THREADS.md)** + +- **[PG\_PREPARED\_STATEMENTS](PG_PREPARED_STATEMENTS.md)** + +- **[PG\_PREPARED\_XACTS](PG_PREPARED_XACTS.md)** + +- **[PG\_REPLICATION\_SLOTS](PG_REPLICATION_SLOTS.md)** + +- **[PG\_RLSPOLICIES](PG_RLSPOLICIES.md)** + +- **[PG\_ROLES](PG_ROLES.md)** + +- **[PG\_RULES](PG_RULES.md)** + +- **[PG\_RUNNING\_XACTS](PG_RUNNING_XACTS.md)** + +- **[PG\_SECLABELS](PG_SECLABELS.md)** + +- **[PG\_SESSION\_WLMSTAT](PG_SESSION_WLMSTAT.md)** + +- **[PG\_SESSION\_IOSTAT](PG_SESSION_IOSTAT.md)** + +- **[PG\_SETTINGS](PG_SETTINGS.md)** + +- **[PG\_SHADOW](PG_SHADOW.md)** + +- **[PG\_STATS](PG_STATS.md)** + +- **[PG\_STAT\_ACTIVITY](PG_STAT_ACTIVITY.md)** + +- **[PG\_STAT\_ALL\_INDEXES](PG_STAT_ALL_INDEXES.md)** + +- **[PG\_STAT\_ALL\_TABLES](PG_STAT_ALL_TABLES.md)** + +- **[PG\_STAT\_BAD\_BLOCK](PG_STAT_BAD_BLOCK.md)** + +- **[PG\_STAT\_BGWRITER](PG_STAT_BGWRITER.md)** + +- **[PG\_STAT\_DATABASE](PG_STAT_DATABASE.md)** + +- **[PG\_STAT\_DATABASE\_CONFLICTS](PG_STAT_DATABASE_CONFLICTS.md)** + +- **[PG\_STAT\_USER\_FUNCTIONS](PG_STAT_USER_FUNCTIONS.md)** + +- **[PG\_STAT\_USER\_INDEXES](PG_STAT_USER_INDEXES.md)** + +- **[PG\_STAT\_USER\_TABLES](PG_STAT_USER_TABLES.md)** + +- **[PG\_STAT\_REPLICATION](PG_STAT_REPLICATION.md)** + +- **[PG\_STAT\_SYS\_INDEXES](PG_STAT_SYS_INDEXES.md)** + +- **[PG\_STAT\_SYS\_TABLES](PG_STAT_SYS_TABLES.md)** + +- **[PG\_STAT\_XACT\_ALL\_TABLES](PG_STAT_XACT_ALL_TABLES.md)** + +- **[PG\_STAT\_XACT\_SYS\_TABLES](PG_STAT_XACT_SYS_TABLES.md)** + +- **[PG\_STAT\_XACT\_USER\_FUNCTIONS](PG_STAT_XACT_USER_FUNCTIONS.md)** + +- **[PG\_STAT\_XACT\_USER\_TABLES](PG_STAT_XACT_USER_TABLES.md)** + +- **[PG\_STATIO\_ALL\_INDEXES](PG_STATIO_ALL_INDEXES.md)** + +- **[PG\_STATIO\_ALL\_SEQUENCES](PG_STATIO_ALL_SEQUENCES.md)** + +- **[PG\_STATIO\_ALL\_TABLES](PG_STATIO_ALL_TABLES.md)** + +- **[PG\_STATIO\_SYS\_INDEXES](PG_STATIO_SYS_INDEXES.md)** + +- **[PG\_STATIO\_SYS\_SEQUENCES](PG_STATIO_SYS_SEQUENCES.md)** + +- **[PG\_STATIO\_SYS\_TABLES](PG_STATIO_SYS_TABLES.md)** + +- **[PG\_STATIO\_USER\_INDEXES](PG_STATIO_USER_INDEXES.md)** + +- **[PG\_STATIO\_USER\_SEQUENCES](PG_STATIO_USER_SEQUENCES.md)** + +- **[PG\_STATIO\_USER\_TABLES](PG_STATIO_USER_TABLES.md)** + +- **[PG\_THREAD\_WAIT\_STATUS](PG_THREAD_WAIT_STATUS.md)** + +- **[PG\_TABLES](PG_TABLES.md)** + +- **[PG\_TDE\_INFO](PG_TDE_INFO.md)** + +- **[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)** + +- **[PG\_USER\_MAPPINGS](PG_USER_MAPPINGS.md)** + +- **[PG\_VIEWS](PG_VIEWS.md)** + +- **[PG\_WLM\_STATISTICS](PG_WLM_STATISTICS.md)** + +- **[PLAN\_TABLE](PLAN_TABLE.md)** + +- **[GS\_FILE\_STAT](GS_FILE_STAT.md)** + +- **[GS\_OS\_RUN\_INFO](GS_OS_RUN_INFO.md)** + +- **[GS\_REDO\_STAT](GS_REDO_STAT.md)** + +- **[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\_TOTAL\_MEMORY\_DETAIL](GS_TOTAL_MEMORY_DETAIL.md)** + +- **[PG\_TIMEZONE\_ABBREVS](PG_TIMEZONE_ABBREVS.md)** + +- **[PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID](PG_TOTAL_USER_RESOURCE_INFO_OID.md)** + +- **[PG\_VARIABLE\_INFO](PG_VARIABLE_INFO.md)** + +- **[GS\_INSTANCE\_TIME](GS_INSTANCE_TIME.md)** + + diff --git "a/content/zh/docs/Developerguide/\347\264\242\345\274\225\344\275\277\347\224\250\347\272\246\346\235\237.md" "b/content/zh/docs/Developerguide/\347\264\242\345\274\225\344\275\277\347\224\250\347\272\246\346\235\237.md" new file mode 100644 index 000000000..80e6d3ce3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\264\242\345\274\225\344\275\277\347\224\250\347\272\246\346\235\237.md" @@ -0,0 +1,37 @@ +# 索引使用约束 + +下面是一个使用索引的例子: + +``` +postgres=# create table table1 (c_int int,c_bigint bigint,c_varchar varchar,c_text text) with(orientation=row); + +postgres=# create text search configuration ts_conf_1(parser=POUND); +postgres=# create text search configuration ts_conf_2(parser=POUND) with(split_flag='%'); + +postgres=# set default_text_search_config='ts_conf_1'; +postgres=# create index idx1 on table1 using gin(to_tsvector(c_text)); + +postgres=# set default_text_search_config='ts_conf_2'; +postgres=# create index idx2 on tscp_u_m_005_tbl using gin(to_tsvector(c_text)); + +postgres=# select c_varchar,to_tsvector(c_varchar) from table1 where to_tsvector(c_text) @@ plainto_tsquery('¥#@……&**') and to_tsvector(c_text) @@ postgres=# plainto_tsquery('某公司 ') and c_varchar is not null order by 1 desc limit 3; +``` + +该例子的关键点是表table1的同一个列c\_text上建立了两个gin索引:idx1和idx2,但这两个索引是在不同[default\_text\_search\_config](区域和格式化.md#zh-cn_topic_0237124733_zh-cn_topic_0059778109_sd9a07d429cd4498383931c621742b816)的设置下建立的。该例子和同一张表的同一个列上建立普通索引的不同之处在于: + +- gin索引使用了不同的parser(即分隔符不同),那么idx1和idx2的索引数据是不同的; +- 在同一张表的同一个列上建立的多个普通索引的索引数据是相同的。 + +因此当执行同一个查询时,使用idx1和idx2查询出的结果是不同的。 + +## 使用约束 + +通过上面的例子,索引使用满足如下条件时: + +- 在同一个表的同一个列上建立了多个gin索引; +- 这些gin索引使用了不同的parser(即分隔符不同); +- 在查询中使用了该列,且执行计划中使用索引进行扫描; + + 为了避免使用不同gin索引导致查询结果不同的问题,需要保证在物理表的一列上只有一个gin索引可用。 + + 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" new file mode 100644 index 000000000..2d2d38fb3 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\273\237\350\256\241\344\277\241\346\201\257\345\207\275\346\225\260.md" @@ -0,0 +1,1634 @@ +# 统计信息函数 + +统计信息函数根据访问对象分为两种类型:针对某个数据库进行访问的函数,以数据库中每个表或索引的OID作为参数,标识需要报告的数据库;针对某个服务器进行访问的函数,以一个服务器进程号为参数,其范围从1到当前活跃服务器的数目。 + +- pg\_stat\_get\_db\_numbackends\(oid\) + + 描述:处理该数据库活跃的服务器进程数目。 + + 返回值类型:integer + +- pg\_stat\_get\_db\_xact\_commit\(oid\) + + 描述:数据库中已提交事务的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_xact\_rollback\(oid\) + + 描述:数据库中回滚事务的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_blocks\_fetched\(oid\) + + 描述:数据库中磁盘块抓取请求的总数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_blocks\_hit\(oid\) + + 描述:数据库在缓冲区中找到的磁盘块抓取请求的总数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_tuples\_returned\(oid\) + + 描述:为数据库返回的Tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_tuples\_fetched\(oid\) + + 描述:为数据库中获取的Tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_tuples\_inserted\(oid\) + + 描述:在数据库中插入Tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_tuples\_updated\(oid\) + + 描述:在数据库中更新的Tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_tuples\_deleted\(oid\) + + 描述:数据库中删除Tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_conflict\_lock\(oid\) + + 描述:数据库中锁冲突的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_deadlocks\(oid\) + + 描述:数据库中死锁的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_numscans\(oid\) + + 描述:如果参数是一个表,则顺序扫描读取的行数目。如果参数是一个索引,则返回索引行的数目。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_returned\(oid\) + + 描述:如果参数是一个表,则顺序扫描读取的行数目。如果参数是一个索引,则返回的索引行的数目。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_fetched\(oid\) + + 描述:如果参数是一个表,则位图扫描抓取的行数目。如果参数是一个索引,则用简单索引扫描抓取的行数目。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_inserted\(oid\) + + 描述:插入表中行的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_updated\(oid\) + + 描述:在表中已更新行的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_deleted\(oid\) + + 描述:从表中删除行的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_changed\(oid\) + + 描述:该表上一次analyze或autoanalyze之后插入、更新、删除行的总数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_tuples\_hot\_updated\(oid\) + + 描述:热更新的行数表。 + + 返回值类型:bigint + +- pg\_stat\_get\_live\_tuples\(oid\) + + 描述:活行数表。 + + 返回值类型:bigint + +- pg\_stat\_get\_dead\_tuples\(oid\) + + 描述:死行数表。 + + 返回值类型:bigint + +- pg\_stat\_get\_blocks\_fetched\(oid\) + + 描述:表或者索引的磁盘块抓取请求的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_blocks\_hit\(oid\) + + 描述:在缓冲区中找到的表或者索引的磁盘块请求数目。 + + 返回值类型:bigint + +- pg\_stat\_get\_partition\_tuples\_inserted\(oid\) + + 描述:插入相应表分区中行的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_partition\_tuples\_updated\(oid\) + + 描述:在相应表分区中已更新行的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_partition\_tuples\_deleted\(oid\) + + 描述:从相应表分区中删除行的数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_partition\_tuples\_changed\(oid\) + + 描述:该表分区上一次analyze或autoanalyze之后插入、更新、删除行的总数量。 + + 返回值类型:bigint + +- pg\_stat\_get\_partition\_live\_tuples\(oid\) + + 描述:活行数表分区。 + + 返回值类型:bigint + +- pg\_stat\_get\_partition\_dead\_tuples\(oid\) + + 描述:死行数表分区。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_tuples\_inserted\(oid\) + + 描述:表相关的活跃子事务中插入的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_tuples\_deleted\(oid\) + + 描述:表相关的活跃子事务中删除的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_tuples\_hot\_updated\(oid\) + + 描述:表相关的活跃子事务中热更新的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_tuples\_updated\(oid\) + + 描述:表相关的活跃子事务中更新的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_partition\_tuples\_inserted\(oid\) + + 描述:表分区相关的活跃子事务中插入的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_partition\_tuples\_deleted\(oid\) + + 描述:表分区相关的活跃子事务中删除的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_partition\_tuples\_hot\_updated\(oid\) + + 描述:表分区相关的活跃子事务中热更新的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_xact\_partition\_tuples\_updated\(oid\) + + 描述:表分区相关的活跃子事务中更新的tuple数。 + + 返回值类型:bigint + +- pg\_stat\_get\_last\_vacuum\_time\(oid\) + + 描述:用户在该表上最后一次手动启动清理或者autovacuum线程启动清理的时间。 + + 返回值类型:timestamptz + +- pg\_stat\_get\_last\_autovacuum\_time\(oid\) + + 描述:autovacuum守护进程在该表上最后一次启动清理的时间。 + + 返回值类型:timestamptz + +- pg\_stat\_get\_vacuum\_count\(oid\) + + 描述:用户在该表上手动启动清理的次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_autovacuum\_count\(oid\) + + 描述:autovacuum守护进程在该表上启动清理的次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_last\_analyze\_time\(oid\) + + 描述:用户在该表上最后一次手动启动分析或者autovacuum线程启动分析的时间。 + + 返回值类型:timestamptz + +- pg\_stat\_get\_last\_autoanalyze\_time\(oid\) + + 描述:autovacuum守护进程在该表上最后一次启动分析的时间。 + + 返回值类型:timestamptz + +- pg\_stat\_get\_analyze\_count\(oid\) + + 描述:用户在该表上手动启动分析的次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_autoanalyze\_count\(oid\) + + 描述:autovacuum守护进程在该表上启动分析的次数。 + + 返回值类型:bigint + +- pg\_total\_autovac\_tuples\(bool,bool\) + + 描述:返回total autovac相关的tuple记录,如nodename,nspname,relname以及各类tuple的IUD信息,入参分别为:是否查询relation信息,是否查询local信息。 + + 返回值类型:setofrecord + +- pg\_autovac\_status\(oid\) + + 描述:返回和autovac状态相关的参数信息,如nodename,nspname,relname,analyze,vacuum设置,analyze/vacuum阈值, analyze/vacuum tuple数等。 + + 返回值类型:setofrecord + +- pg\_autovac\_timeout\(oid\) + + 描述:返回某个表做autovac连续超时的次数,表信息非法或node信息异常返回NULL。 + + 返回值类型:bigint + +- pg\_autovac\_dbnode\(oid\) + + 描述:返回对某个表做autovac的dbnode名称,表信息非法或node信息异常返回NULL。 + + 返回值类型:text + +- pg\_stat\_get\_last\_data\_changed\_time\(oid\) + + 描述:insert/update/delete, exchange/truncate/drop partition在该表上最后一次操作的时间,[PG\_STAT\_ALL\_TABLES](PG_STAT_ALL_TABLES.md)视图last\_data\_changed列的数据是通过该函数求值,在表数量很大的场景中,通过视图获取表数据最后修改时间的性能较差,建议直接使用该函数获取表数据的最后修改时间。 + + 返回值类型:timestamptz + +- pg\_stat\_set\_last\_data\_changed\_time\(oid\) + + 描述:手动设置该表上最后一次insert/update/delete, exchange/truncate/drop partition操作的时间。 + + 返回值类型:void + +- pg\_backend\_pid\(\) + + 描述:当前会话的服务器线程的线程ID。 + + 返回值类型:integer + +- pg\_stat\_get\_activity\(integer\) + + 描述:返回一个关于带有特殊PID的后台进程的记录信息,当参数为NULL时,则返回每个活动的后台进程的记录。返回结果是[PG\_STAT\_ACTIVITY](PG_STAT_ACTIVITY.md)视图中的一个子集,不包含connection\_info列。 + + 返回值类型:setofrecord + +- pg\_stat\_get\_activity\_with\_conninfo\(integer\) + + 描述:返回一个关于带有特殊PID的后台进程的记录信息,当参数为NULL时,则返回每个活动的后台进程的记录。返回结果是[PG\_STAT\_ACTIVITY](PG_STAT_ACTIVITY.md)视图中的一个子集。 + + 返回值类型:setofrecord + +- pg\_user\_iostat\(text\) + + 描述:显示和当前用户执行作业正在运行时的IO负载管理相关信息。 + + 返回值类型:record + + 函数返回字段说明如下: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

userid

+

oid

+

用户id。

+

min_curr_iops

+

int4

+

当前该用户io在数据库节点中的最小值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

+

max_curr_iops

+

int4

+

当前该用户io在数据库节点中的最大值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

+

min_peak_iops

+

int4

+

该用户io峰值中,数据库节点的最小值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

+

max_peak_iops

+

int4

+

该用户io峰值中,数据库节点的最大值。对于行存,以万次/s为单位;对于列存,以次/s为单位。

+

io_limits

+

int4

+

用户指定的资源池所设置的io_limits。对于行存,以万次/s为单位;对于列存,以次/s为单位。

+

io_priority

+

text

+

该用户所设io_priority。对于行存,以万次/s为单位;对于列存,以次/s为单位。

+
+ +- pg\_stat\_get\_function\_calls\(oid\) + + 描述:函数已被调用次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_function\_time\(oid\) + + 描述:该函数花费的总挂钟时间,单位为微秒。包括在这个函数调用所花费的时间。 + + 返回值类型:bigint + +- pg\_stat\_get\_function\_self\_time\(oid\) + + 描述:只有在此功能所花费的时间。在所谓的功能所花费的时间被排除在外。 + + 返回值类型:bigint + +- pg\_stat\_get\_backend\_idset\(\) + + 描述:设置当前活动的服务器进程数(从1到活动服务器进程的数量)。 + + 返回值类型:setofinteger + +- pg\_stat\_get\_backend\_pid\(integer\) + + 描述:给定的服务器线程的线程ID。 + + 返回值类型:bigint + +- pg\_stat\_get\_backend\_dbid\(integer\) + + 描述:给定服务器进程的数据库ID。 + + 返回值类型:oid + +- pg\_stat\_get\_backend\_userid\(integer\) + + 描述:给定服务器进程的用户ID。 + + 返回值类型:oid + +- pg\_stat\_get\_backend\_activity\(integer\) + + 描述:给定服务器进程的当前活动查询,仅在调用者是系统管理员或被查询会话的用户,并且打开track\_activities的时候才能获得结果。 + + 返回值类型:text + +- pg\_stat\_get\_backend\_waiting\(integer\) + + 描述:如果给定服务器进程在等待某个锁,并且调用者是系统管理员或被查询会话的用户,并且打开track\_activities的时候才返回真。 + + 返回值类型:Boolean + +- pg\_stat\_get\_backend\_activity\_start\(integer\) + + 描述:给定服务器进程当前正在执行的查询的起始时间,仅在调用者是系统管理员或被查询会话的用户,并且打开track\_activities的时候才能获得结果。 + + 返回值类型:timestampwithtimezone + +- pg\_stat\_get\_backend\_xact\_start\(integer\) + + 描述:给定服务器进程当前正在执行的事务的开始时间,但只有当前用户是系统管理员或被查询会话的用户,并且打开track\_activities的时候才能获得结果。 + + 返回值类型:timestampwithtimezone + +- pg\_stat\_get\_backend\_start\(integer\) + + 描述:给定服务器进程启动的时间,如果当前用户不是系统管理员或被查询的后端的用户,则返回NULL。 + + 返回值类型:timestampwithtimezone + +- pg\_stat\_get\_backend\_client\_addr\(integer\) + + 描述:连接到给定客户端后端的IP地址。如果是通过Unix域套接字连接的则返回NULL;如果当前用户不是系统管理员或被查询会话的用户,也返回NULL。 + + 返回值类型:inet + +- pg\_stat\_get\_backend\_client\_port\(integer\) + + 描述:连接到给定客户端后端的TCP端口。如果是通过Unix域套接字连接的则返回-1;如果当前用户不是系统管理员或被查询会话的用户,也返回NULL。 + + 返回值类型:integer + +- pg\_stat\_get\_bgwriter\_timed\_checkpoints\(\) + + 描述:后台写进程开启定时检查点的时间(因为checkpoint\_timeout时间已经过期了)。 + + 返回值类型:bigint + +- pg\_stat\_get\_bgwriter\_requested\_checkpoints\(\) + + 描述:后台写进程开启基于后端请求的检查点的时间,因为已经超过了checkpoint\_segments或因为已经执行了CHECKPOINT。 + + 返回值类型:bigint + +- pg\_stat\_get\_bgwriter\_buf\_written\_checkpoints\(\) + + 描述:在检查点期间后台写进程写入的缓冲区数目。 + + 返回值类型:bigint + +- pg\_stat\_get\_bgwriter\_buf\_written\_clean\(\) + + 描述:为日常清理脏块,后台写进程写入的缓冲区数目。 + + 返回值类型:bigint + +- pg\_stat\_get\_bgwriter\_maxwritten\_clean\(\) + + 描述:后台写进程停止清理扫描的时间,因为已经写入了更多的缓冲区(相比bgwriter\_lru\_maxpages参数声明的缓冲区数)。 + + 返回值类型:bigint + +- pg\_stat\_get\_buf\_written\_backend\(\) + + 描述:后端进程写入的缓冲区数,因为它们需要分配一个新的缓冲区。 + + 返回值类型:bigint + +- pg\_stat\_get\_buf\_alloc\(\) + + 描述:分配的总缓冲区数。 + + 返回值类型:bigint + +- pg\_stat\_clear\_snapshot\(\) + + 描述:清理当前的统计快照。 + + 返回值类型:void + +- pg\_stat\_reset\(\) + + 描述:为当前数据库重置统计计数器为0(需要系统管理员权限)。 + + 返回值类型:void + +- pg\_stat\_reset\_shared\(text\) + + 描述:重置shared cluster每个节点当前数据统计计数器为0(需要系统管理员权限)。 + + 返回值类型:void + +- pg\_stat\_reset\_single\_table\_counters\(oid\) + + 描述:为当前数据库中的一个表或索引重置统计为0(需要系统管理员权限)。 + + 返回值类型:void + +- pg\_stat\_reset\_single\_function\_counters\(oid\) + + 描述:为当前数据库中的一个函数重置统计为0(需要系统管理员权限)。 + + 返回值类型:void + +- pg\_stat\_session\_cu\(int, int, int\) + + 描述:获取当前节点所运行session的CU命中统计信息。 + + 返回值类型:record + +- gs\_get\_stat\_session\_cu\(text, int, int, int\) + + 描述:获取openGauss所有运行session的CU命中统计信息。 + + 返回值类型:record + +- gs\_get\_stat\_db\_cu\(text, text, int, int, int\) + + 描述:获取openGauss一个数据库的CU命中统计信息。 + + 返回值类型:record + +- pg\_stat\_get\_cu\_mem\_hit\(oid\) + + 描述:获取当前节点当前数据库中一个列存表的CU内存命中次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_cu\_hdd\_sync\(oid\) + + 描述:获取当前节点当前数据库中一个列存表从磁盘同步读取CU次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_cu\_hdd\_asyn\(oid\) + + 描述:获取当前节点当前数据库中一个列存表从磁盘异步读取CU次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_cu\_mem\_hit\(oid\) + + 描述:获取当前节点一个数据库CU内存命中次数。 + + 返回值类型:bigint + +- pg\_stat\_get\_db\_cu\_hdd\_sync\(oid\) + + 描述:获取当前节点一个数据库从磁盘同步读取CU次数。 + + 返回值类型:bigint + +- pgxc\_get\_wlm\_current\_instance\_info\(text, int default null\) + + 描述:在数据库主节点上查询当前的资源使用情况,读取内存中还未存到 5.19.2.3 GS\_WLM\_INSTANCE\_HISTORY系统表的数据。入参分别为节点名称 \(可以输入ALL、C、D、实例名称\)、每个节点返回的大数量。返回值为 GS\_WLM\_INSTANCE\_HISTORY。 + + 返回值类型:setofrecord + +- pgxc\_get\_wlm\_history\_instance\_info\(text, TIMESTAMP, TIMESTAMP, int default null\) + + 描述:在数据库主节点上查询历史资源使用情况,读取 GS\_WLM\_INSTANCE\_HISTORY系统表的数据。入参分别为节点名称\(可以输入 ALL、C、D、实例名称\)、起始区间时间、结束区间时间和每个实例返回的大数 量。返回值为GS\_WLM\_INSTANCE\_HISTORY。 + + 返回值类型:setofrecord + + +- pg\_stat\_get\_db\_cu\_hdd\_asyn\(oid\) + + 描述:获取当前节点一个数据库从磁盘异步读取CU次数。 + + 返回值类型:bigint + + +- pg\_stat\_bad\_block\(text, int, int, int, int, int, timestamp with time zone, timestamp with time zone\) + + 描述:获取当前节点自启动后,读取出现Page/CU的损坏信息。 + + 例: select \* from pg\_stat\_bad\_block\(\); + + 返回值类型:record + +- pg\_stat\_bad\_block\_clear\(\) + + 描述:清理节点记录的读取出现的Page/CU损坏信息(需要系统管理员权限)。 + + 返回值类型:void + +- gs\_respool\_exception\_info\(pool text\) + + 描述:查看某个资源池关联的查询规则信息。 + + 返回值类型:record + +- gs\_control\_group\_info\(pool text\) + + 描述:查看资源池关联的控制组信息 + + 返回值类型:record + + 返回信息如下: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

属性值

+

描述

+

name

+

class_a:workload_a1

+

class和workload名称

+

class

+

class_a

+

Class控制组名称

+

workload

+

workload_a1

+

Workload控制组名称

+

type

+

DEFWD

+

控制组类型(Top、CLASS、BAKWD、DEFWD、TSWD)

+

gid

+

87

+

控制组id

+

shares

+

30

+

占父节点CPU资源的百分比

+

limits

+

0

+

占父节点CPU核数的百分比

+

rate

+

0

+

Timeshare中的分配比例

+

cpucores

+

0-3

+

CPU核心数

+
+ +- get\_instr\_workload\_info\(integer\) + + 描述:获取数据库主节点上事务量信息,事务时间信息。 + + 返回值类型:record + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

属性值

+

描述

+

resourcepool_oid

+

10

+

资源池的oid(逻辑同负载等价)

+

commit_counter

+

4

+

前端事务commit数量

+

rollback_counter

+

1

+

前端事务rollback数量

+

resp_min

+

949

+

前端事务最小响应时间(单位:微秒)

+

resp_max

+

201891

+

前端事务最大响应时间(单位:微秒)

+

resp_avg

+

43564

+

前端事务平均响应时间(单位:微秒)

+

resp_total

+

217822

+

前端事务总响应时间(单位:微秒)

+

bg_commit_counter

+

910

+

后端事务commit数量

+

bg_rollback_counter

+

0

+

后端事务rollback数量

+

bg_resp_min

+

97

+

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

+

bg_resp_max

+

678080687

+

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

+

bg_resp_avg

+

327847884

+

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

+

bg_resp_total

+

298341575300

+

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

+
+ +- pv\_instance\_time\(\) + + 描述:获取当前节点上各个关键阶段的时间消耗。 + + 返回值类型:record + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Stat_name属性

+

属性值

+

描述

+

DB_TIME

+

1062385

+

所有线程端到端的墙上时间(WALL TIME)消耗总和(单位: 微秒)

+

CPU_TIME

+

311777

+

所有线程CPU时间消耗总和(单位: 微秒)

+

EXECUTION_TIME

+

380037

+

消耗在执行器上的时间总和(单位: 微秒)

+

PARSE_TIME

+

6033

+

消耗在SQL解析上的时间总和(单位: 微秒)

+

PLAN_TIME

+

173356

+

消耗在执行计划生成上的时间总和(单位: 微秒)

+

REWRITE_TIME

+

2274

+

消耗在查询重写上的时间总和(单位: 微秒)

+

PL_EXECUTION_TIME

+

0

+

消耗在PL/SQL执行上的时间总和(单位: 微秒)

+

PL_COMPILATION_TIME

+

557

+

消耗在SQL编译上的时间总和(单位: 微秒)

+

NET_SEND_TIME

+

1673

+

消耗在网络发送上的时间总和(单位: 微秒)

+

DATA_IO_TIME

+

426622

+

消耗在数据读写上的时间总和(单位: 微秒)

+
+ +- DBMS\_PERF.get\_global\_instance\_time\(\) + + 描述:提供openGauss各个关键阶段的时间消耗,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- get\_instr\_unique\_sql\(\) + + 描述:获取当前结点的执行语句(归一化SQL)信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- reset\_unique\_sql\(text, text, bigint\) + + 描述:重置系统执行语句(归一化SQL)信息,执行该函数必须具有sysadmin权限。第一个参数取值范围“global/local”,global表示清理所有节点上的信息,local表示只清理当前节点;第二参数取值范围“ALL/BY\_USERID/BY\_CNID”,ALL表示清理所有信息,BY\_USERID表示通过指定USERID清理只属于该用户的sql信息,BY\_CNID表示清理系统中涉及到该数据库主节点的sql信息;第三个参数表示具体的CNID和USERID,如果第二个参数为ALL,第三个参数不起作用,可以取任意值。 + + 返回值类型:boolean + +- get\_instr\_wait\_event\(NULL\) + + 描述:获取当前节点event等待的统计信息。 + + 返回值类型:record + +- get\_instr\_user\_login\(\) + + 描述:获取当前结点的用户登入登出次数信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- get\_instr\_rt\_percentile\(\) + + 描述:获取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\(\) + + 描述:显示当前操作系统运行的状态信息,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_os\_threads\(\) + + 描述:提供openGauss中所有正常节点下的线程状态信息,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_os\_threads\(\) + + 描述:提供openGauss中所有正常节点下的线程状态信息,仅在数据库主节点上支持查询,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_workload\_sql\_count\(\) + + 描述:提供openGauss中不同负载SELECT,UPDATE,INSERT,DELETE,DDL, DML,DCL计数信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_workload\_sql\_elapse\_time\(\) + + 描述:提供openGauss中不同负载SELECT,UPDATE,INSERT,DELETE,响应时间信息(TOTAL,AVG, MIN, MAX),查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_workload\_transaction\(\) + + 描述:获取openGauss内所有节点上的事务量信息,事务时间信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_session\_stat\(\) + + 描述:获取openGauss节点上的会话状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + + >![](public_sys-resources/icon-note.gif) **说明:** + >状态信息有如下17项,commit,rollback,sql,table\_scan,blocks\_fetched,physical\_read\_operation, + >shared\_blocks\_dirtied,local\_blocks\_dirtied,shared\_blocks\_read,local\_blocks\_read, + >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\(\) + + 描述:提供openGauss各节点各个关键阶段的时间消耗,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_session\_memory\(\) + + 描述:汇聚各节点的Session级别的内存使用情况,包含执行作业在数据节点上Postgres线程和Stream线程分配的所有内存,单位为MB,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_session\_memory\_detail\(\) + + 描述:汇聚各节点的线程的内存使用情况,以MemoryContext节点来统计,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- gs\_session\_memory\_detail\_tp + + 描述:统计线程的内存使用情况,以MemoryContext节点来统计。当开启线程池(enable\_thread\_pool = on)时,该视图包含所有的线程和会话的内存使用情况。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_session\_stat\_activity\(\) + + 描述:汇聚openGauss内各节点上正在运行的线程相关的信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_thread\_wait\_status\(\) + + 描述:汇聚所有结点上工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_wlm\_controlgroup\_ng\_config\(\) + + 描述:数据库内所有的控制组信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_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\(\) + + 描述:汇聚当前用户数据库主节点上执行作业结束后的算子相关记录(持久化),查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_operator\_history\(\) + + 描述:汇聚当前用户数据库主节点上执行作业结束后的算子相关记录,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_operator\_runtime\(\) + + 描述:汇聚当前用户数据库主节点上执行作业实时的算子相关记录,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statement\_complex\_history\(\) + + 描述:汇聚当前用户数据库主节点上复杂查询的历史记录,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statement\_complex\_history\_table\(\) + + 描述:汇聚当前用户数据库主节点上复杂查询的历史记录(持久化),查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statement\_complex\_runtime\(\) + + 描述:汇聚当前用户数据库主节点上复杂查询的实时信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_memory\_node\_detail\(\) + + 描述:汇聚所有节点某个数据库节点内存使用情况,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_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 + + 描述:汇聚所有节点当前数据库中的每个索引行,显示特定索引的I/O的统计,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_local\_toastname\_and\_toastindexname\(\) + + 描述:提供本地toast表的name和index和其关联表的对应关系。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statio\_all\_indexes + + 描述:统计所有节点当前数据库中的每个索引行,显示特定索引的I/O的统计,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_all\_sequences + + 描述:提供命名空间中所有sequences的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_all\_tables + + 描述:汇聚各节点的数据库中每个表I/O的统计,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statio\_all\_tables + + 描述:统计openGauss内数据库中每个表I/O的统计,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_local\_toast\_relation\(\) + + 描述:提供本地toast表的name和其关联表的对应关系。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_sys\_indexes\(\) + + 描述:汇聚各节点的命名空间中所有系统表索引的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statio\_sys\_indexes\(\) + + 描述:统计各节点的命名空间中所有系统表索引的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_sys\_sequences\(\) + + 描述:提供命名空间中所有系统表为sequences的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_sys\_tables\(\) + + 描述:提供各节点的命名空间中所有系统表的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statio\_sys\_tables\(\) + + 描述:openGauss内汇聚命名空间中所有系统表的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_user\_indexes\(\) + + 描述:各节点的命名空间中所有用户关系表索引的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statio\_user\_indexes\(\) + + 描述:openGauss内汇聚命名空间中所有用户关系表索引的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_user\_sequences\(\) + + 描述:显示各节点的命名空间中所有用户的sequences的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statio\_user\_tables\(\) + + 描述:显示各节点的命名空间中所有用户关系表的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statio\_user\_tables\(\) + + 描述:openGauss内汇聚命名空间中所有用户关系表的IO状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_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\(\) + + 描述:汇聚数据库主节点结点数据库中每个表的统计信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_dn\_stat\_all\_tables\(\) + + 描述:统计数据库节点结点数据库中每个表的统计信息,查询该函数必须具有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\(\) + + 描述:汇聚各节点pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_sys\_tables\(\) + + 描述:统计各节点pg\_catalog、information\_schema模式的所有命名空间中系统表的统计信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_sys\_indexes\(\) + + 描述:汇聚各节点pg\_catalog、information\_schema模式中所有系统表的索引状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_sys\_indexes\(\) + + 描述:统计各节点pg\_catalog、information\_schema模式中所有系统表的索引状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_user\_tables\(\) + + 描述:汇聚所有命名空间中用户自定义普通表的状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_user\_tables\(\) + + 描述:统计所有命名空间中用户自定义普通表的状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_user\_indexes\(\) + + 描述:汇聚所有数据库中用户自定义普通表的索引状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_user\_indexes\(\) + + 描述:统计所有数据库中用户自定义普通表的索引状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_database\(\) + + 描述:汇聚所有节点数据库统计信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_database\_conflicts\(\) + + 描述:统计所有节点数据库统计信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_xact\_all\_tables\(\) + + 描述:汇聚命名空间中所有普通表和toast表的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_xact\_all\_tables\(\) + + 描述:统计命名空间中所有普通表和toast表的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_xact\_sys\_tables\(\) + + 描述:汇聚所有节点命名空间中系统表的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_xact\_sys\_tables\(\) + + 描述:统计所有节点命名空间中系统表的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_xact\_user\_tables\(\) + + 描述:汇聚所有节点命名空间中用户表的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_stat\_xact\_user\_tables\(\) + + 描述:统计所有节点命名空间中用户表的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_user\_functions\(\) + + 描述:汇聚所有节点命名空间中用户定义函数的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_xact\_user\_functions\(\) + + 描述:统计所有节点命名空间中用户定义函数的事务状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_stat\_bad\_block\(\) + + 描述:汇聚所有节点表、索引等文件的读取失败信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_file\_redo\_iostat\(\) + + 描述:统计所有节点表、索引等文件的读取失败信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_file\_iostat\(\) + + 描述:汇聚所有节点数据文件IO的统计,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_locks\(\) + + 描述:汇聚所有节点的锁信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_replication\_slots\(\) + + 描述:汇聚所有节点上逻辑复制信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_bgwriter\_stat\(\) + + 描述:汇聚所有节点后端写进程活动的统计信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_replication\_stat\(\) + + 描述:汇聚各节点日志同步状态信息,如发起端发送日志位置,收端接收日志位置等,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_pooler\_status\(\) + + 描述:汇聚数据库主节点的pooler中的缓存连接状态,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_transactions\_running\_xacts\(\) + + 描述:汇聚各节点运行事务的信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_transactions\_running\_xacts\(\) + + 描述:统计各节点运行事务的信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_transactions\_prepared\_xacts\(\) + + 描述:汇聚各节点当前准备好进行两阶段提交的事务的信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_transactions\_prepared\_xacts\(\) + + 描述:统计各节点当前准备好进行两阶段提交的事务的信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_statement\(\) + + 描述:汇聚各节点历史执行语句状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_statement\_count\(\) + + 描述:汇聚各节点SELECT,UPDATE,INSERT,DELETE,响应时间信息(TOTAL,AVG, MIN, MAX),查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_config\_settings\(\) + + 描述:汇聚各节点GUC参数配置信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_wait\_events\(\) + + 描述:汇聚各节点wait events状态信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_statement\_responsetime\_percentile\(\) + + 描述:获取openGaussSQL响应时间P80,P95分布信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_summary\_user\_login\(\) + + 描述:统计openGauss各节点用户登入登出次数信息,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- DBMS\_PERF.get\_global\_record\_reset\_time\(\) + + 描述:汇聚openGauss统计信息重置(重启,主备倒换,数据库删除)时间,查询该函数必须具有sysadmin权限。 + + 返回值类型:record + +- gs\_wlm\_user\_resource\_info\(name text\) + + 描述:查询具体某个用户的资源限额和资源使用情况。 + + 返回值类型:record + +- get\_local\_rel\_iostat\(\) + + 描述:查询当前节点的数据文件IO状态累计值。 + + 返回值类型:record + +- DBMS\_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

+

当前活跃的事务号。

+
+ + +示例: + +pg\_backend\_pid函数显示当前后台服务线程ID。 + +``` +postgres=# SELECT pg_backend_pid(); + pg_backend_pid +----------------- + 139706243217168 +(1 row) +``` + +pg\_stat\_get\_backend\_pid函数显示后台线程ID。 + +``` +postgres=# SELECT pg_stat_get_backend_pid(1); + pg_stat_get_backend_pid +------------------------- + 139706243217168 +(1 row) +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** + 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" new file mode 100644 index 000000000..b3e9f34d0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\273\264\346\212\244\345\256\241\350\256\241\346\227\245\345\277\227.md" @@ -0,0 +1,196 @@ +# 维护审计日志 + +## 前提条件 + +用户必须拥有审计权限。 + +## 背景信息 + +- 与审计日志相关的配置参数及其含义请参见[表1](#zh-cn_topic_0237121114_zh-cn_topic_0059778793_t611ff04302e6463c8850c39d3e1d78fb)。 + + **表 1** 审计日志相关配置参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置项

+

含义

+

默认值

+

audit_directory

+

审计文件的存储目录。

+

/var/log/gaussdb/用户名/pg_audit

+

audit_resource_policy

+

审计日志的保存策略。

+

on(表示使用空间配置策略)

+

audit_space_limit

+

审计文件占用的磁盘空间总量。

+

1GB

+

audit_file_remain_time

+

审计日志文件的最小保存时间。

+

90

+

audit_file_remain_threshold

+

审计目录下审计文件的最大数量。

+

1048576

+
+ + >![](public_sys-resources/icon-note.gif) **说明:** + >如果使用gs\_om工具部署openGauss,则审计日志路径为 “/var/log/gaussdb/用户名/pg\_audit”。 + +- 审计日志删除命令为数据库提供的sql函数pg\_delete\_audit,其原型为: + + ``` + pg_delete_audit(timestamp startime,timestamp endtime) + ``` + + 其中参数startime和endtime分别表示审计记录的开始时间和结束时间。 + +- 目前常用的记录审计内容的方式有两种:记录到数据库的表中、记录到OS文件中。这两种方式的优缺点比较如[表2](#zh-cn_topic_0237121114_zh-cn_topic_0059778793_t078fedc6256143429079733b91e11d22)所示。 + + **表 2** 审计日志保存方式比较 + + + + + + + + + + + + + + + + +

方式

+

优点

+

缺点

+

记录到表中

+

不需要用户维护审计日志。

+

由于表是数据库的对象,如果一个数据库用户具有一定的权限,就能够访问到审计表。如果该用户非法操作审计表,审计记录的准确性难以得到保证。

+

记录到OS文件中

+

比较安全,即使一个帐户可以访问数据库,但不一定有访问OS这个文件的权限。

+

需要用户维护审计日志。

+
+ + 从数据库安全角度出发,openGauss采用记录到OS文件的方式来保存审计结果,保证了审计结果的可靠性。 + + +## 操作步骤 + +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. 选择日志维护方式进行维护。 + - 设置自动删除审计日志 + + 审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计文件,并记录审计文件删除信息到审计日志中。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >审计文件占用的磁盘空间大小默认值为1024MB,用户可以根据磁盘空间大小重新设置参数。 + + 配置审计文件占用磁盘空间的大小(audit\_space\_limit)。 + + 1. 查看已配置的参数。 + + ``` + postgres=# SHOW audit_space_limit; + audit_space_limit + ------------------- + 1GB + (1 row) + ``` + + 如果显示结果不为1GB(1024MB),执行“\\q”命令退出数据库。 + + 2. 建议执行如下命令设置成默认值1024MB。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_space_limit=1024MB" + ``` + + 配置审计文件个数的最大值(audit\_file\_remain\_threshold)。 + + 1. 查看已配置的参数。 + + ``` + postgres=# SHOW audit_file_remain_threshold; + audit_file_remain_threshold + ----------------------------- + 1048576 + (1 row) + ``` + + 如果显示结果不为1048576,执行“\\q”命令退出数据库。 + + 2. 建议执行如下命令设置成默认值1048576。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_file_remain_threshold=1048576" + ``` + + - 手动备份审计文件 + + 当审计文件占用的磁盘空间或者审计文件的个数超过配置文件指定的值时,系统将会自动删除较早的审计文件,因此建议用户周期性地对比较重要的审计日志进行保存。 + + 1. 使用show命令获得审计文件所在目录(audit\_directory)。 + + ``` + postgres=# SHOW audit_directory; + ``` + + 2. 将审计目录整个拷贝出来进行保存。 + + - 手动删除审计日志 + + 当不再需要某时段的审计记录时,可以使用审计接口命令pg\_delete\_audit进行手动删除。 + + 以删除2012/9/20到2012/9/21之间的审计记录为例: + + ``` + postgres=# SELECT pg_delete_audit('2012-09-20 ','2012-09-21'); + ``` + + + diff --git "a/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..bd46192cd --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,452 @@ +# 网络地址函数和操作符 + +## cidr和inet操作符 + +操作符<<,<<=,\>\>,\>\>=对子网进行测试。它们只考虑两个地址的网络部分(忽略任何主机部分),然后判断其中一个网络是等于另外一个网络,还是另外一个网络的子网。 + +- < + + 描述:小于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' < inet '192.168.1.6' AS RESULT; + result + -------- + t + (1 row) + ``` + +- <= + + 描述:小于或等于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' <= inet '192.168.1.5' AS RESULT; + result + -------- + t + (1 row) + ``` + +- = + + 描述:等于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' = inet '192.168.1.5' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>= + + 描述:大于或等于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' >= inet '192.168.1.5' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \> + + 描述:大于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' > inet '192.168.1.4' AS RESULT; + result + -------- + t + (1 row) + ``` + +- <\> + + 描述:不等于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' <> inet '192.168.1.4' AS RESULT; + result + -------- + t + (1 row) + ``` + +- << + + 描述:包含于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.5' << inet '192.168.1/24' AS RESULT; + result + -------- + t + (1 row) + ``` + +- <<= + + 描述:包含于或等于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1/24' <<= inet '192.168.1/24' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>\> + + 描述:包含 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1/24' >> inet '192.168.1.5' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>\>= + + 描述:包含或等于 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1/24' >>= inet '192.168.1/24' AS RESULT; + result + -------- + t + (1 row) + ``` + +- \~ + + 描述:位非 + + 示例: + + ``` + postgres=# SELECT ~ inet '192.168.1.6' AS RESULT; + result + --------------- + 63.87.254.249 + (1 row) + ``` + +- & + + 描述:两个网络地址的每一位都进行“与”操作。 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.6' & inet '10.0.0.0' AS RESULT; + result + --------- + 0.0.0.0 + (1 row) + ``` + +- | + + 描述:两个网络地址的每一位都进行“或”操作。 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.6' | inet '10.0.0.0' AS RESULT; + result + ------------- + 202.168.1.6 + (1 row) + ``` + +- + + + 描述:加 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.6' + 25 AS RESULT; + result + -------------- + 192.168.1.31 + (1 row) + ``` + +- - + + 描述:减 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.43' - 36 AS RESULT; + result + ------------- + 192.168.1.7 + (1 row) + ``` + +- - + + 描述:减 + + 示例: + + ``` + postgres=# SELECT inet '192.168.1.43' - inet '192.168.1.19' AS RESULT; + result + -------- + 24 + (1 row) + ``` + + +## cidr和inet函数 + +函数abbrev,host,text主要是为了提供可选的显示格式。 + +- abbrev\(inet\) + + 描述:缩写显示格式文本。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT abbrev(inet '10.1.0.0/16') AS RESULT; + result + ------------- + 10.1.0.0/16 + (1 row) + ``` + +- abbrev\(cidr\) + + 描述:缩写显示格式文本。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT abbrev(cidr '10.1.0.0/16') AS RESULT; + result + --------- + 10.1/16 + (1 row) + ``` + +- broadcast\(inet\) + + 描述:网络广播地址。 + + 返回类型:inet + + 示例: + + ``` + postgres=# SELECT broadcast('192.168.1.5/24') AS RESULT; + result + ------------------ + 192.168.1.255/24 + (1 row) + ``` + +- family\(inet\) + + 描述:抽取地址族,4为IPv4,6为IPv6。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT family('::1') AS RESULT; + result + -------- + 6 + (1 row) + ``` + +- host\(inet\) + + 描述:将主机地址类型抽出为文本。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT host('192.168.1.5/24') AS RESULT; + result + ------------- + 192.168.1.5 + (1 row) + ``` + +- hostmask\(inet\) + + 描述:为网络构造主机掩码。 + + 返回类型:inet + + 示例: + + ``` + postgres=# SELECT hostmask('192.168.23.20/30') AS RESULT; + result + --------- + 0.0.0.3 + (1 row) + ``` + +- masklen\(inet\) + + 描述:抽取子网掩码长度。 + + 返回类型:int + + 示例: + + ``` + postgres=# SELECT masklen('192.168.1.5/24') AS RESULT; + result + -------- + 24 + (1 row) + ``` + +- netmask\(inet\) + + 描述:为网络构造子网掩码。 + + 返回类型:inet + + 示例: + + ``` + postgres=# SELECT netmask('192.168.1.5/24') AS RESULT; + result + --------------- + 255.255.255.0 + (1 row) + ``` + +- network\(inet\) + + 描述:抽取地址的网络部分。 + + 返回类型:cidr + + 示例: + + ``` + postgres=# SELECT network('192.168.1.5/24') AS RESULT; + result + ---------------- + 192.168.1.0/24 + (1 row) + ``` + +- set\_masklen\(inet, int\) + + 描述:为inet数值设置子网掩码长度。 + + 返回类型:inet + + 示例: + + ``` + postgres=# SELECT set_masklen('192.168.1.5/24', 16) AS RESULT; + result + ---------------- + 192.168.1.5/16 + (1 row) + ``` + +- set\_masklen\(cidr, int\) + + 描述:为cidr数值设置子网掩码长度。 + + 返回类型:cidr + + 示例: + + ``` + postgres=# SELECT set_masklen('192.168.1.0/24'::cidr, 16) AS RESULT; + result + ---------------- + 192.168.0.0/16 + (1 row) + ``` + +- text\(inet\) + + 描述:把IP地址和掩码长度抽取为文本。 + + 返回类型:text + + 示例: + + ``` + postgres=# SELECT text(inet '192.168.1.5') AS RESULT; + result + ---------------- + 192.168.1.5/32 + (1 row) + ``` + + +任何cidr值都能以显式或者隐式的方式转换为inet值,因此上述能够操作inet值的函数也同样能够操作cidr值。inet值也可以转换为cidr值,此时inet子网掩码右侧的所有位都将转换为零,以创建一个有效的cidr值。另外,用户还可以使用常规的类型转换语法将一个文本字符串转换为inet或cidr值。例如:inet\(expression\)或colname::cidr。 + +## macaddr函数 + +函数trunc\(macaddr\)返回一个MAC地址,该地址的最后三个字节设置为零。 + +trunc\(macaddr\) + +描述:把后三个字节置为零。 + +返回类型:macaddr + +示例: + +``` +postgres=# SELECT trunc(macaddr '12:34:56:78:90:ab') AS RESULT; + result +------------------- + 12:34:56:00:00:00 +(1 row) +``` + +macaddr类型还支持标准关系操作符(\>,<=等)用于词法排序,和按位运算符(\~,&和|)非,与和或。 + 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" new file mode 100644 index 000000000..909caa229 --- /dev/null +++ "b/content/zh/docs/Developerguide/\347\275\221\347\273\234\345\234\260\345\235\200\347\261\273\345\236\213.md" @@ -0,0 +1,175 @@ +# 网络地址类型 + +openGauss提供用于存储IPv4、IPv6、MAC地址的数据类型。 + +用这些数据类型存储网络地址比用纯文本类型好,因为这些类型提供输入错误检查和特殊的操作和功能(请参见[网络地址函数和操作符](网络地址函数和操作符.md#ZH-CN_TOPIC_0242370439))。 + +**表 1** 网络地址类型 + + + + + + + + + + + + + + + + + + + + +

名称

+

存储空间

+

描述

+

cidr

+

7或19字节

+

IPv4或IPv6网络

+

inet

+

7或19字节

+

IPv4或IPv6主机和网络

+

macaddr

+

6字节

+

MAC地址

+
+ +在对inet或cidr数据类型进行排序的时候,IPv4地址总是排在IPv6地址前面,包括那些封装或者是映射在IPv6地址里的IPv4地址,比如::10.2.3.4或::ffff:10.4.3.2。 + +## cidr + +cidr(无类别域间路由,Classless Inter-Domain Routing)类型,保存一个IPv4或IPv6网络地址。声明网络格式为address/y,address表示IPv4或者IPv6地址,y表示子网掩码的二进制位数。如果省略y,则掩码部分使用已有类别的网络编号系统进行计算,但要求输入的数据已经包括了确定掩码所需的所有字节。 + +**表 2** cidr类型输入举例 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cidr输入

+

cidr输出

+

abbrev(cidr)

+

192.168.100.128/25

+

192.168.100.128/25

+

192.168.100.128/25

+

192.168/24

+

192.168.0.0/24

+

192.168.0/24

+

192.168/25

+

192.168.0.0/25

+

192.168.0.0/25

+

192.168.1

+

192.168.1.0/24

+

192.168.1/24

+

192.168

+

192.168.0.0/24

+

192.168.0/24

+

10.1.2

+

10.1.2.0/24

+

10.1.2/24

+

10.1

+

10.1.0.0/16

+

10.1/16

+

10

+

10.0.0.0/8

+

10/8

+

10.1.2.3/32

+

10.1.2.3/32

+

10.1.2.3/32

+

2001:4f8:3:ba::/64

+

2001:4f8:3:ba::/64

+

2001:4f8:3:ba::/64

+

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

+

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

+

2001:4f8:3:ba:2e0:81ff:fe22:d1f1

+

::ffff:1.2.3.0/120

+

::ffff:1.2.3.0/120

+

::ffff:1.2.3/120

+

::ffff:1.2.3.0/128

+

::ffff:1.2.3.0/128

+

::ffff:1.2.3.0/128

+
+ +## inet + +inet类型在一个数据区域内保存主机的IPv4或IPv6地址,以及一个可选子网。主机地址中网络地址的位数表示子网(“子网掩码”)。如果子网掩码是32并且地址是IPv4,则这个值不表示任何子网,只表示一台主机。在IPv6里,地址长度是128位,因此128位表示唯一的主机地址。 + +该类型的输入格式是address/y,address表示IPv4或者IPv6地址,y是子网掩码的二进制位数。如果省略/y,则子网掩码对IPv4是32,对IPv6是128,所以该值表示只有一台主机。如果该值表示只有一台主机,/y将不会显示。 + +inet和cidr类型之间的基本区别是inet接受子网掩码,而cidr不接受。 + +## macaddr + +macaddr类型存储MAC地址,也就是以太网卡硬件地址(尽管MAC地址还用于其它用途)。可以接受下列格式: + +``` +'08:00:2b:01:02:03' +'08-00-2b-01-02-03' +'08002b:010203' +'08002b-010203' +'0800.2b01.0203' +'08002b010203' +``` + +这些示例都表示同一个地址。对于数据位a到f,大小写都行。输出时都是以第一种形式展示。 + 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" new file mode 100644 index 000000000..d48607e8c --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\201\232\351\233\206\345\207\275\346\225\260.md" @@ -0,0 +1,730 @@ +# 聚集函数 + +## 聚集函数 + +- sum\(expression\) + + 描述:所有输入行的expression总和。 + + 返回类型: + + 通常情况下输入数据类型和输出数据类型是相同的,但以下情况会发生类型转换: + + - 对于SMALLINT或INT输入,输出类型为BIGINT。 + - 对于BIGINT输入,输出类型为NUMBER 。 + - 对于浮点数输入,输出类型为DOUBLE PRECISION。 + + 示例: + + ``` + postgres=# SELECT SUM(ss_ext_tax) FROM tpcds.STORE_SALES; + sum + -------------- + 213267594.69 + (1 row) + ``` + +- max\(expression\) + + 描述:所有输入行中expression的最大值。 + + 参数类型:任意数组、数值、字符串、日期/时间类型。 + + 返回类型:与参数数据类型相同 + + 示例: + + ``` + postgres=# SELECT MAX(inv_quantity_on_hand) FROM tpcds.inventory; + ``` + +- min\(expression\) + + 描述:所有输入行中expression的最小值。 + + 参数类型:任意数组、数值、字符串、日期/时间类型。 + + 返回类型:与参数数据类型相同 + + 示例: + + ``` + postgres=# SELECT MIN(inv_quantity_on_hand) FROM tpcds.inventory; + min + ----- + 0 + (1 row) + ``` + +- avg\(expression\) + + 描述:所有输入值的均值(算术平均)。 + + 返回类型: + + 对于任何整数类型输入,结果都是NUMBER类型。 + + 对于任何浮点输入,结果都是DOUBLE PRECISION类型。 + + 否则和输入数据类型相同。 + + 示例: + + ``` + postgres=# SELECT AVG(inv_quantity_on_hand) FROM tpcds.inventory; + avg + ---------------------- + 500.0387129084044604 + (1 row) + ``` + +- count\(expression\) + + 描述:返回表中满足expression不为NULL的行数。 + + 返回类型:BIGINT + + 示例: + + ``` + postgres=# SELECT COUNT(inv_quantity_on_hand) FROM tpcds.inventory; + count + ---------- + 11158087 + (1 row) + ``` + +- count\(\*\) + + 描述:返回表中的记录行数。 + + 返回类型:BIGINT + + 示例: + + ``` + postgres=# SELECT COUNT(*) FROM tpcds.inventory; + count + ---------- + 11745000 + (1 row) + ``` + +- array\_agg\(expression\) + + 描述:将所有输入值(包括空)连接成一个数组。 + + 返回类型:参数类型的数组 + + 示例: + + ``` + postgres=# SELECT ARRAY_AGG(sr_fee) FROM tpcds.store_returns WHERE sr_customer_sk = 2; + array_agg + --------------- + {22.18,63.21} + (1 row) + ``` + +- string\_agg\(expression, delimiter\) + + 描述:将输入值连接成为一个字符串,用分隔符分开。 + + 返回类型:和参数数据类型相同。 + + 示例: + + ``` + postgres=# SELECT string_agg(sr_item_sk, ',') FROM tpcds.store_returns where sr_item_sk < 3; + string_agg + --------------------------------------------------------------------------------- + ------------------------------ + 1,2,1,2,2,1,1,2,2,1,2,1,2,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,2,2,1,1,2,1,1,1 + (1 row) + ``` + +- listagg\(expression \[, delimiter\]\) WITHIN GROUP\(ORDER BY order-list\) + + 描述:将聚集列数据按WITHIN GROUP指定的排序方式排列,并用delimiter指定的分隔符拼接成一个字符串。 + + - expression:必选。指定聚集列名或基于列的有效表达式,不支持DISTINCT关键字和VARIADIC参数。 + - delimiter:可选。指定分隔符,可以是字符串常数或基于分组列的确定性表达式,缺省时表示分隔符为空。 + - order-list:必选。指定分组内的排序方式。 + + 返回类型:text + + 示例: + + 聚集列是文本字符集类型。 + + ``` + postgres=# SELECT deptno, listagg(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees FROM emp GROUP BY deptno; + deptno | employees + --------+-------------------------------------- + 10 | CLARK,KING,MILLER + 20 | ADAMS,FORD,JONES,SCOTT,SMITH + 30 | ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD + (3 rows) + ``` + + 聚集列是整型。 + + ``` + postgres=# SELECT deptno, listagg(mgrno, ',') WITHIN GROUP(ORDER BY mgrno NULLS FIRST) AS mgrnos FROM emp GROUP BY deptno; + deptno | mgrnos + --------+------------------------------- + 10 | 7782,7839 + 20 | 7566,7566,7788,7839,7902 + 30 | 7698,7698,7698,7698,7698,7839 + (3 rows) + ``` + + 聚集列是浮点类型。 + + ``` + postgres=# SELECT job, listagg(bonus, '($); ') WITHIN GROUP(ORDER BY bonus DESC) || '($)' AS bonus FROM emp GROUP BY job; + job | bonus + ------------+------------------------------------------------- + CLERK | 10234.21($); 2000.80($); 1100.00($); 1000.22($) + PRESIDENT | 23011.88($) + ANALYST | 2002.12($); 1001.01($) + MANAGER | 10000.01($); 2399.50($); 999.10($) + SALESMAN | 1000.01($); 899.00($); 99.99($); 9.00($) + (5 rows) + ``` + + 聚集列是时间类型。 + + ``` + postgres=# SELECT deptno, listagg(hiredate, ', ') WITHIN GROUP(ORDER BY hiredate DESC) AS hiredates FROM emp GROUP BY deptno; + deptno | hiredates + --------+------------------------------------------------------------------------------------------------------------------------------ + 10 | 1982-01-23 00:00:00, 1981-11-17 00:00:00, 1981-06-09 00:00:00 + 20 | 2001-04-02 00:00:00, 1999-12-17 00:00:00, 1987-05-23 00:00:00, 1987-04-19 00:00:00, 1981-12-03 00:00:00 + 30 | 2015-02-20 00:00:00, 2010-02-22 00:00:00, 1997-09-28 00:00:00, 1981-12-03 00:00:00, 1981-09-08 00:00:00, 1981-05-01 00:00:00 + (3 rows) + ``` + + 聚集列是时间间隔类型。 + + ``` + postgres=# SELECT deptno, listagg(vacationTime, '; ') WITHIN GROUP(ORDER BY vacationTime DESC) AS vacationTime FROM emp GROUP BY deptno; + deptno | vacationtime + --------+------------------------------------------------------------------------------------ + 10 | 1 year 30 days; 40 days; 10 days + 20 | 70 days; 36 days; 9 days; 5 days + 30 | 1 year 1 mon; 2 mons 10 days; 30 days; 12 days 12:00:00; 4 days 06:00:00; 24:00:00 + (3 rows) + ``` + + 分隔符缺省时,默认为空。 + + ``` + postgres=# SELECT deptno, listagg(job) WITHIN GROUP(ORDER BY job) AS jobs FROM emp GROUP BY deptno; + deptno | jobs + --------+---------------------------------------------- + 10 | CLERKMANAGERPRESIDENT + 20 | ANALYSTANALYSTCLERKCLERKMANAGER + 30 | CLERKMANAGERSALESMANSALESMANSALESMANSALESMAN + (3 rows) + ``` + + listagg作为窗口函数时,OVER子句不支持ORDER BY的窗口排序,listagg列为对应分组的有序聚集。 + + ``` + postgres=# SELECT deptno, mgrno, bonus, listagg(ename,'; ') WITHIN GROUP(ORDER BY hiredate) OVER(PARTITION BY deptno) AS employees FROM emp; + deptno | mgrno | bonus | employees + --------+-------+----------+------------------------------------------- + 10 | 7839 | 10000.01 | CLARK; KING; MILLER + 10 | | 23011.88 | CLARK; KING; MILLER + 10 | 7782 | 10234.21 | CLARK; KING; MILLER + 20 | 7566 | 2002.12 | FORD; SCOTT; ADAMS; SMITH; JONES + 20 | 7566 | 1001.01 | FORD; SCOTT; ADAMS; SMITH; JONES + 20 | 7788 | 1100.00 | FORD; SCOTT; ADAMS; SMITH; JONES + 20 | 7902 | 2000.80 | FORD; SCOTT; ADAMS; SMITH; JONES + 20 | 7839 | 999.10 | FORD; SCOTT; ADAMS; SMITH; JONES + 30 | 7839 | 2399.50 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN + 30 | 7698 | 9.00 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN + 30 | 7698 | 1000.22 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN + 30 | 7698 | 99.99 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN + 30 | 7698 | 1000.01 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN + 30 | 7698 | 899.00 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN + (14 rows) + ``` + +- covar\_pop\(Y, X\) + + 描述:总体协方差。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT COVAR_POP(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + covar_pop + ------------------ + 829.749627587403 + (1 row) + ``` + +- covar\_samp\(Y, X\) + + 描述:样本协方差。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT COVAR_SAMP(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + covar_samp + ------------------ + 830.052235037289 + (1 row) + ``` + +- stddev\_pop\(expression\) + + 描述:总体标准差。 + + 返回类型:对于浮点类型的输入返回double precision,其他输入返回numeric。 + + 示例: + + ``` + postgres=# SELECT STDDEV_POP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + stddev_pop + ------------------ + 289.224294957556 + (1 row) + ``` + +- stddev\_samp\(expression\) + + 描述:样本标准差。 + + 返回类型:对于浮点类型的输入返回double precision,其他输入返回numeric。 + + 示例: + + ``` + postgres=# SELECT STDDEV_SAMP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + stddev_samp + ------------------ + 289.224359757315 + (1 row) + ``` + +- var\_pop\(expression\) + + 描述:总体方差(总体标准差的平方) + + 返回类型:对于浮点类型的输入返回double precision类型,其他输入返回numeric类型。 + + 示例: + + ``` + postgres=# SELECT VAR_POP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + var_pop + -------------------- + 83650.692793695475 + (1 row) + ``` + +- var\_samp\(expression\) + + 描述:样本方差(样本标准差的平方) + + 返回类型:对于浮点类型的输入返回double precision类型,其他输入返回numeric类型。 + + 示例: + + ``` + postgres=# SELECT VAR_SAMP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + var_samp + -------------------- + 83650.730277028768 + (1 row) + ``` + +- bit\_and\(expression\) + + 描述:所有非NULL输入值的按位与\(AND\),如果全部输入值皆为NULL,那么结果也为NULL 。 + + 返回类型:和参数数据类型相同。 + + 示例: + + ``` + postgres=# SELECT BIT_AND(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + bit_and + --------- + 0 + (1 row) + ``` + +- bit\_or\(expression\) + + 描述:所有非NULL输入值的按位或\(OR\),如果全部输入值皆为NULL,那么结果也为NULL。 + + 返回类型:和参数数据类型相同 + + 示例: + + ``` + postgres=# SELECT BIT_OR(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + bit_or + -------- + 1023 + (1 row) + ``` + +- bool\_and\(expression\) + + 描述:如果所有输入值都是真,则为真,否则为假。 + + 返回类型:bool + + 示例: + + ``` + postgres=# SELECT bool_and(100 <2500); + bool_and + ---------- + t + (1 row) + ``` + +- bool\_or\(expression\) + + 描述:如果所有输入值只要有一个为真,则为真,否则为假。 + + 返回类型:bool + + 示例: + + ``` + postgres=# SELECT bool_or(100 <2500); + bool_or + ---------- + t + (1 row) + ``` + +- corr\(Y, X\) + + 描述:相关系数 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT CORR(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + corr + ------------------- + .0381383624904186 + (1 row) + ``` + +- every\(expression\) + + 描述:等效于bool\_and。 + + 返回类型:bool + + 示例: + + ``` + postgres=# SELECT every(100 <2500); + every + ------- + t + (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\) + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_AVGX(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_avgx + ------------------ + 578.606576740795 + (1 row) + ``` + +- regr\_avgy\(Y, X\) + + 描述:因变量的平均值 \(sum\(Y\)/N\) + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_AVGY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_avgy + ------------------ + 50.0136711629602 + (1 row) + ``` + +- regr\_count\(Y, X\) + + 描述:两个表达式都不为NULL的输入行数。 + + 返回类型:bigint + + 示例: + + ``` + postgres=# SELECT REGR_COUNT(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_count + ------------ + 2743 + (1 row) + ``` + +- regr\_intercept\(Y, X\) + + 描述:根据所有输入的点\(X, Y\)按照最小二乘法拟合成一个线性方程,然后返回该直线的Y轴截距。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_INTERCEPT(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_intercept + ------------------ + 49.2040847848607 + (1 row) + ``` + +- regr\_r2\(Y, X\) + + 描述:相关系数的平方 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_R2(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_r2 + -------------------- + .00145453469345058 + (1 row) + ``` + +- regr\_slope\(Y, X\) + + 描述:根据所有输入的点\(X, Y\)按照最小二乘法拟合成一个线性方程, 然后返回该直线的斜率。 + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_SLOPE(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_slope + -------------------- + .00139920009665259 + (1 row) + ``` + +- regr\_sxx\(Y, X\) + + 描述:sum\(X^2\) - sum\(X\)^2/N (自变量的“平方和”) + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_SXX(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_sxx + ------------------ + 1626645991.46135 + (1 row) + ``` + +- regr\_sxy\(Y, X\) + + 描述:sum\(X\*Y\) - sum\(X\) \* sum\(Y\)/N (自变量和因变量的“乘方积”) + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_SXY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_sxy + ------------------ + 2276003.22847225 + (1 row) + ``` + +- regr\_syy\(Y, X\) + + 描述:sum\(Y^2\) - sum\(Y\)^2/N(因变量的"平方和") + + 返回类型:double precision + + 示例: + + ``` + postgres=# SELECT REGR_SYY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000; + regr_syy + ----------------- + 2189417.6547314 + (1 row) + ``` + +- stddev\(expression\) + + 描述:stddev\_samp的别名。 + + 返回类型:对于浮点类型的输入返回double precision,其他输入返回numeric。 + + 示例: + + ``` + postgres=# SELECT STDDEV(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + stddev + ------------------ + 289.224359757315 + (1 row) + ``` + +- variance\(expexpression,ression\) + + 描述:var\_samp的别名。 + + 返回类型:对于浮点类型的输入返回double precision类型,其他输入返回numeric类型。 + + 示例: + + ``` + postgres=# SELECT VARIANCE(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; + variance + -------------------- + 83650.730277028768 + (1 row) + ``` + +- checksum\(expression\) + + 描述:返回所有输入值的CHECKSUM值。使用该函数可以用来验证openGauss数据库(不支持openGauss之外的其他数据库)的备份恢复或者数据迁移操作前后表中的数据是否相同。在备份恢复或者数据迁移操作前后都需要用户通过手工执行SQL命令的方式获取执行结果,通过对比获取的执行结果判断操作前后表中的数据是否相同。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 对于大表,CHECKSUM函数可能会需要很长时间。 + >- 如果某两表的CHECKSUM值不同,则表明两表的内容是不同的。由于CHECKSUM函数中使用散列函数不能保证无冲突,因此两个不同内容的表可能会得到相同的CHECKSUM值,存在这种情况的可能性较小。对于列进行的CHECKSUM也存在相同的情况。 + >- 对于时间类型timestamp, timestamptz和smalldatetime,计算CHECKSUM值时请确保时区设置一致。 + + - 若计算某列的CHECKSUM值,且该列类型可以默认转为TEXT类型,则expression为列名。 + - 若计算某列的CHECKSUM值,且该列类型不能默认转为TEXT类型,则expression为列名::TEXT。 + - 若计算所有列的CHECKSUM值,则expression为表名::TEXT。 + + 可以默认转换为TEXT类型的类型包括:char, name, int8, int2, int1, int4, raw, pg\_node\_tree, float4, float8, bpchar, varchar, nvarchar2, date, timestamp, timestamptz, numeric, smalldatetime,其他类型需要强制转换为TEXT。 + + 返回类型:numeric。 + + 示例: + + 表中可以默认转为TEXT类型的某列的CHECKSUM值。 + + ``` + postgres=# SELECT CHECKSUM(inv_quantity_on_hand) FROM tpcds.inventory; + checksum + ------------------- + 24417258945265247 + (1 row) + ``` + + 表中不能默认转为TEXT类型的某列的CHECKSUM值。注意此时CHECKSUM参数是列名::TEXT。 + + ``` + postgres=# SELECT CHECKSUM(inv_quantity_on_hand::TEXT) FROM tpcds.inventory; + checksum + ------------------- + 24417258945265247 + (1 row) + ``` + + 表中所有列的CHECKSUM值。注意此时CHECKSUM参数是表名::TEXT,且表名前不加Schema。 + + ``` + postgres=# SELECT CHECKSUM(inventory::TEXT) FROM tpcds.inventory; + checksum + ------------------- + 25223696246875800 + (1 row) + ``` + + diff --git "a/content/zh/docs/Developerguide/\350\207\252\345\212\250\346\270\205\347\220\206.md" "b/content/zh/docs/Developerguide/\350\207\252\345\212\250\346\270\205\347\220\206.md" new file mode 100644 index 000000000..fab39d777 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\207\252\345\212\250\346\270\205\347\220\206.md" @@ -0,0 +1,192 @@ +# 自动清理 + +系统自动清理进程(autovacuum)自动执行VACUUM和ANALYZE命令,回收被标识为删除状态的记录空间,并更新表的统计数据。 + +## autovacuum + +**参数说明:**控制数据库自动清理进程(autovacuum)的启动。自动清理进程运行的前提是将[track\_counts](查询和索引统计收集器.md#zh-cn_topic_0237124727_zh-cn_topic_0059779313_s3f4fb0b1004041f69e1454c701952411)设置为on。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 如果希望系统在故障恢复后,具备自动清理两阶段事务的功能,请将autovacuum设置为on; +>- 当设置autovacuum为on,[autovacuum\_max\_workers](#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)为0时,表示系统不会自动进行autovacuum,只会在故障恢复后,自动清理两阶段事务; +>- 当设置autovacuum为on,[autovacuum\_max\_workers](#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s76932f79410248ba8923017d19982673)大于0时,表示系统不仅在故障恢复后,自动清理两阶段事务,并且还可以自动清理进程。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>即使此参数设置为off,当事务ID回绕即将发生时,数据库也会自动启动自动清理进程。对于create/drop database发生异常时,可能有的节点提交或回滚,有的节点未提交(prepared状态),此时系统不能自动修复,需要手动修复,修复步骤: +>1. 使用gs\_clean工具(-N参数)查询出异常两阶段事务的xid以及处于prepared的节点; +>2. 登录事务处于prepared状态的节点,系统管理员连接一个可用的数据库(如postgres),执行语句set xc\_maintenance\_mode = on; +>3. 根据事务全局状态提交或者回滚此两阶段事务(如提交语句;回滚语句)。 + +**取值范围:**布尔型 + +- on表示开启数据库自动清理进程。 +- off表示关闭数据库自动清理进程。 + +**默认值:**on + +## autovacuum\_mode + +**参数说明:**该参数仅在autovacuum设置为on的场景下生效,它控制autoanalyze或autovacuum的打开情况。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- analyze表示只做autoanalyze。 +- vacuum表示只做autovacuum。 +- mix表示autoanalyze和autovacuum都做。 +- none表示二者都不做。 + +**默认值:**mix + +## autoanalyze\_timeout + +**参数说明:**设置autoanalyze的超时时间。在对某张表做autoanalyze时,如果该表的analyze时长超过了autoanalyze\_timeout,则自动取消该表此次analyze。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**int类型,单位是s,0\~2147483。 + +**默认值:**5min(即300s) + +## autovacuum\_io\_limits + +**参数说明:**控制autovacuum进程每秒触发IO的上限。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0~1073741823和-1。其中-1表示不控制,而是使用系统默认控制组。 + +**默认值:**-1 + +## log\_autovacuum\_min\_duration + +**参数说明:**当自动清理的执行时间大于或者等于某个特定的值时,向服务器日志中记录自动清理执行的每一步操作。设置此选项有助于追踪自动清理的行为。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +举例如下: + +将log\_autovacuum\_min\_duration设置为250ms,记录所有运行大于或者等于250ms的自动清理命令的相关信息。 + +**取值范围:**整型,最小值为-1,最大值为2147483647,单位为毫秒。 + +- 当参数设置为0时,表示所有的自动清理操作都记录到日志中。 +- 当参数设置为-1时,表示所有的自动清理操作都不记录到日志中。 +- 当参数设置为非-1时,当由于锁冲突的存在导致一个自动清理操作被跳过,记录一条消息。 + +**默认值:**-1 + +## autovacuum\_max\_workers + +**参数说明:**设置能同时运行的自动清理线程的最大数量,该参数的取值上限与GUC参数max\_connections和job\_queue\_processes大小有关。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0(表示不会自动进行autovacuum),理论最大值为262143,实际最大值为动态值,计算公式为“262143 - max\_connections - job\_queue\_processes - 辅助线程数 – autovacuum的lancher线程数 - 1”,其中辅助线程数和autovacuum的lancher线程数由两个宏来指定,当前版本的默认值分别为20和2。 + +**默认值:**3 + +## autovacuum\_naptime + +**参数说明:**设置两次自动清理操作的时间间隔。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,单位为s,最小值为1,最大值为2147483。 + +**默认值:**10min(即600s) + +## autovacuum\_vacuum\_threshold + +**参数说明:**设置触发VACUUM的阈值。当表上被删除或更新的记录数超过设定的阈值时才会对这个表执行VACUUM操作。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483647。 + +**默认值:**50 + +## autovacuum\_analyze\_threshold + +**参数说明:**设置触发ANALYZE操作的阈值。当表上被删除、插入或更新的记录数超过设定的阈值时才会对这个表执行ANALYZE操作。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483647。 + +**默认值:**50 + +## autovacuum\_vacuum\_scale\_factor + +**参数说明:**设置触发一个VACUUM时增加到autovacuum\_vacuum\_threshold的表大小的缩放系数。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**浮点型,0.0~100.0 + +**默认值:**0.2 + +## autovacuum\_analyze\_scale\_factor + +**参数说明:**设置触发一个ANALYZE时增加到autovacuum\_analyze\_threshold的表大小的缩放系数。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**浮点型,0.0~100.0 + +**默认值:**0.1 + +## autovacuum\_freeze\_max\_age + +**参数说明:**设置事务内的最大时间,使得表的pg\_class.relfrozenxid字段在VACUUM操作执行之前被写入。 + +- VACUUM也可以删除pg\_clog/子目录中的旧文件。 +- 即使自动清理进程被禁止,系统也会调用自动清理进程来防止循环重复。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:长**整型,100 000~576 460 752 303 423 487 + +**默认值:**20000000000 + +## autovacuum\_vacuum\_cost\_delay + +**参数说明:**设置在自动VACUUM操作里使用的开销延迟数值。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,-1~100,单位为毫秒(ms)。其中-1表示使用常规的vacuum\_cost\_delay。 + +**默认值:**20ms + +## autovacuum\_vacuum\_cost\_limit + +**参数说明:**设置在自动VACUUM操作里使用的开销限制数值。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,-1~10000。其中-1表示使用常规的vacuum\_cost\_limit。 + +**默认值:**-1 + +## twophase\_clean\_workers + +**参数说明:**该参数用来控制内核调度gs\_clean工具的并发清理数。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,1~10 + +**默认值:**3 + +## defer\_csn\_cleanup\_time + +**参数说明:**用来指定本地回收时间间隔,单位为毫秒(ms)。 + +**取值范围:**整型,0\~INT\_MAX。 + +**默认值**:5s(即5000ms) + diff --git "a/content/zh/docs/Developerguide/\350\214\203\345\233\264\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\350\214\203\345\233\264\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..37d134c96 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\214\203\345\233\264\345\207\275\346\225\260\345\222\214\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,394 @@ +# 范围函数和操作符 + +## 范围操作符 + +- = + + 描述:等于 + + 示例: + + ``` + postgres=# SELECT int4range(1,5) = '[1,4]'::int4range AS RESULT; + result + -------- + t + (1 row) + ``` + +- <\> + + 描述:不等于 + + 示例: + + ``` + postgres=# SELECT numrange(1.1,2.2) <> numrange(1.1,2.3) AS RESULT; + result + -------- + t + (1 row) + ``` + +- < + + 描述:小于 + + 示例: + + ``` + postgres=# SELECT int4range(1,10) < int4range(2,3) AS RESULT; + result + -------- + t + (1 row) + ``` + +- \> + + 描述:大于 + + 示例: + + ``` + postgres=# SELECT int4range(1,10) > int4range(1,5) AS RESULT; + result + -------- + t + (1 row) + ``` + +- <= + + 描述:小于或等于 + + 示例: + + ``` + postgres=# SELECT numrange(1.1,2.2) <= numrange(1.1,2.2) AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>= + + 描述:大于或等于 + + 示例: + + ``` + postgres=# SELECT numrange(1.1,2.2) >= numrange(1.1,2.0) AS RESULT; + result + -------- + t + (1 row) + ``` + +- @\> + + 描述:包含范围 + + 示例: + + ``` + postgres=# SELECT int4range(2,4) @> int4range(2,3) AS RESULT; + result + -------- + t + (1 row) + ``` + +- @\> + + 描述:包含元素 + + 示例: + + ``` + postgres=# SELECT '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp AS RESULT; + result + -------- + t + (1 row) + ``` + +- <@ + + 描述:范围包含于 + + 示例: + + ``` + postgres=# SELECT int4range(2,4) <@ int4range(1,7) AS RESULT; + result + -------- + t + (1 row) + ``` + +- <@ + + 描述:元素包含于 + + 示例: + + ``` + postgres=# SELECT 42 <@ int4range(1,7) AS RESULT; + result + -------- + f + (1 row) + ``` + +- && + + 描述:重叠(有共同点) + + 示例: + + ``` + postgres=# SELECT int8range(3,7) && int8range(4,12) AS RESULT; + result + -------- + t + (1 row) + ``` + +- << + + 描述:范围值是否比另一个范围值的最小值还小(没有交集) + + 示例: + + ``` + postgres=# SELECT int8range(1,10) << int8range(100,110) AS RESULT; + result + -------- + t + (1 row) + ``` + +- \>\> + + 描述:范围值是否比另一个范围值的最大值还大(没有交集) + + 示例: + + ``` + postgres=# SELECT int8range(50,60) >> int8range(20,30) AS RESULT; + result + -------- + t + (1 row) + ``` + +- &< + + 描述:范围值的最大值是否不超过另一个范围值的最大值。 + + 示例: + + ``` + postgres=# SELECT int8range(1,20) &< int8range(18,20) AS RESULT; + result + -------- + t + (1 row) + ``` + +- &\> + + 描述:范围值的最小值是否不小于另一个范围值的最小值。 + + 示例: + + ``` + postgres=# SELECT int8range(7,20) &> int8range(5,10) AS RESULT; + result + -------- + t + (1 row) + ``` + +- -|- + + 描述:相邻 + + 示例: + + ``` + postgres=# SELECT numrange(1.1,2.2) -|- numrange(2.2,3.3) AS RESULT; + result + -------- + t + (1 row) + ``` + +- + + + 描述:并集 + + 示例: + + ``` + postgres=# SELECT numrange(5,15) + numrange(10,20) AS RESULT; + result + -------- + [5,20) + (1 row) + ``` + +- \* + + 描述:交集 + + 示例: + + ``` + postgres=# SELECT int8range(5,15) * int8range(10,20) AS RESULT; + result + --------- + [10,15) + (1 row) + ``` + +- - + + 描述:差集 + + 示例: + + ``` + postgres=# SELECT int8range(5,15) - int8range(10,20) AS RESULT; + result + -------- + [5,10) + (1 row) + ``` + + +简单的比较操作符<,\>,<=和\>=先比较下界,只有下界相等时才比较上界。 + +<<、\>\>和-|-操作符当包含空范围时也会返回false;也就是,不认为空范围在其他范围之前或之后。 + +并集和差集操作符的执行结果无法包含两个不相交的子范围。 + +## 范围函数 + +- lower\(anyrange\) + + 描述:范围的下界 + + 返回类型:范围元素类型 + + 示例: + + ``` + postgres=# SELECT lower(numrange(1.1,2.2)) AS RESULT; + result + -------- + 1.1 + (1 row) + ``` + +- upper\(anyrange\) + + 描述:范围的上界 + + 返回类型:范围元素类型 + + 示例: + + ``` + postgres=# SELECT upper(numrange(1.1,2.2)) AS RESULT; + result + -------- + 2.2 + (1 row) + ``` + +- isempty\(anyrange\) + + 描述:范围是否为空 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT isempty(numrange(1.1,2.2)) AS RESULT; + result + -------- + f + (1 row) + ``` + +- lower\_inc\(anyrange\) + + 描述:是否包含下界 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT lower_inc(numrange(1.1,2.2)) AS RESULT; + result + -------- + t + (1 row) + ``` + +- upper\_inc\(anyrange\) + + 描述:是否包含上界 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT upper_inc(numrange(1.1,2.2)) AS RESULT; + result + -------- + f + (1 row) + ``` + +- lower\_inf\(anyrange\) + + 描述:下界是否为无穷 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT lower_inf('(,)'::daterange) AS RESULT; + result + -------- + t + (1 row) + ``` + +- upper\_inf\(anyrange\) + + 描述:上界是否为无穷 + + 返回类型:Boolean + + 示例: + + ``` + postgres=# SELECT upper_inf('(,)'::daterange) AS RESULT; + result + -------- + t + (1 row) + ``` + + +如果范围是空或者需要的界限是无穷的,lower和upper函数将返回null。lower\_inc、upper\_inc、lower\_inf和upper\_inf函数均对空范围返回false。 + diff --git "a/content/zh/docs/Developerguide/\350\241\214\347\272\247\350\256\277\351\227\256\346\216\247\345\210\266.md" "b/content/zh/docs/Developerguide/\350\241\214\347\272\247\350\256\277\351\227\256\346\216\247\345\210\266.md" new file mode 100644 index 000000000..729258ef7 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\241\214\347\272\247\350\256\277\351\227\256\346\216\247\345\210\266.md" @@ -0,0 +1,83 @@ +# 行级访问控制 + +行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。 + +用户可以在数据表创建行访问控制\(Row Level Security\)策略,该策略是指针对特定数据库用户、特定SQL操作生效的表达式。当数据库用户对数据表访问时,若SQL满足数据表特定的Row Level Security策略,在查询优化阶段将满足条件的表达式,按照属性\(PERMISSIVE | RESTRICTIVE\)类型,通过AND或OR方式拼接,应用到执行计划上。 + +行级访问控制的目的是控制表中行级数据可见性,通过在数据表上预定义Filter,在查询优化阶段将满足条件的表达式应用到执行计划上,影响最终的执行结果。当前受影响的SQL语句包括SELECT,UPDATE,DELETE。 + +场景一:某表中汇总了不同用户的数据,但是不同用户只能查看自身相关的数据信息,不能查看其他用户的数据信息。 + +``` +--创建用户alice, bob, peter +postgres=# CREATE ROLE alice PASSWORD 'Gauss@123'; +postgres=# CREATE ROLE bob PASSWORD 'Gauss@123'; +postgres=# CREATE ROLE peter PASSWORD 'Gauss@123'; + +--创建表all_data,包含不同用户数据信息 +postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100)); + +--向数据表插入数据 +postgres=# INSERT INTO all_data VALUES(1, 'alice', 'alice data'); +postgres=# INSERT INTO all_data VALUES(2, 'bob', 'bob data'); +postgres=# INSERT INTO all_data VALUES(3, 'peter', 'peter data'); + +--将表all_data的读取权限赋予alice,bob和peter用户 +postgres=# GRANT SELECT ON all_data TO alice, bob, peter; + +--打开行访问控制策略开关 +postgres=# ALTER TABLE all_data ENABLE ROW LEVEL SECURITY; + +--创建行访问控制策略,当前用户只能查看用户自身的数据 +postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER); + +--查看表详细信息 +postgres=# \d+ all_data + Table "public.all_data" + Column | Type | Modifiers | Storage | Stats target | Description +--------+------------------------+-----------+----------+--------------+------------- + id | integer | | plain | | + role | character varying(100) | | extended | | + data | character varying(100) | | extended | | +Row Level Security Policies: + POLICY "all_data_rls" + USING (((role)::name = "current_user"())) +Has OIDs: no +Location Nodes: ALL DATANODES +Options: orientation=row, compression=no, enable_rowsecurity=true + +--切换至用户alice,执行SQL"SELECT * FROM public.all_data" +postgres=# SELECT * FROM public.all_data; + id | role | data +----+-------+------------ + 1 | alice | alice data +(1 row) + +postgres=# EXPLAIN(COSTS OFF) SELECT * FROM public.all_data; + QUERY PLAN +---------------------------------------------------------------- + Streaming (type: GATHER) + Node/s: All datanodes + -> Seq Scan on all_data + Filter: ((role)::name = 'alice'::name) + Notice: This query is influenced by row level security feature +(5 rows) + +--切换至用户peter,执行SQL"SELECT * FROM public.all_data" +postgres=# SELECT * FROM public.all_data; + id | role | data +----+-------+------------ + 3 | peter | peter data +(1 row) + +postgres=# EXPLAIN(COSTS OFF) SELECT * FROM public.all_data; + QUERY PLAN +---------------------------------------------------------------- + Streaming (type: GATHER) + Node/s: All datanodes + -> Seq Scan on all_data + Filter: ((role)::name = 'peter'::name) + Notice: This query is influenced by row level security feature +(5 rows) +``` + diff --git "a/content/zh/docs/Developerguide/\350\241\214\350\241\250\350\276\276\345\274\217.md" "b/content/zh/docs/Developerguide/\350\241\214\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 000000000..6ec057824 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\241\214\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,22 @@ +# 行表达式 + +语法: + +_row\_constructor operator row\_constructor_ + +两边都是一个行构造器,两行值必须具有相同数目的字段,每一行都进行比较,行比较允许使用=,<\>,<,<=,\>=等操作符,或其中一个相似的语义符。 + +=<\>和别的操作符使用略有不同。如果两行值的所有字段都是非空并且相等,则认为两行是相等的;如果两行值的任意字段为非空并且不相等,则认为两行是不相等的;否则比较结果是未知的(null)。 + +对于<,<=,\>,\> =的情况下,行中元素从左到右依次比较,直到遇到一对不相等的元素或者一对为空的元素。如果这对元素中存在至少一个null值,则比较结果是未知的(null),否则这对元素的比较结果为最终的结果。 + +示例: + +``` +postgres=# SELECT ROW(1,2,NULL) < ROW(1,3,0) AS RESULT; + result +---------- + t +(1 row) +``` + diff --git "a/content/zh/docs/Developerguide/\350\241\250\345\222\214\347\264\242\345\274\225.md" "b/content/zh/docs/Developerguide/\350\241\250\345\222\214\347\264\242\345\274\225.md" new file mode 100644 index 000000000..f4cfe4e5d --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\241\250\345\222\214\347\264\242\345\274\225.md" @@ -0,0 +1,9 @@ +# 表和索引 + +- **[搜索表](搜索表.md)** + +- **[创建索引](创建索引.md)** + +- **[索引使用约束](索引使用约束.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\241\250\350\276\276\345\274\217.md" "b/content/zh/docs/Developerguide/\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 000000000..8df329ddc --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,13 @@ +# 表达式 + +- **[简单表达式](简单表达式.md)** + +- **[条件表达式](条件表达式.md)** + +- **[子查询表达式](子查询表达式.md)** + +- **[数组表达式](数组表达式.md)** + +- **[行表达式](行表达式.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\247\204\345\210\222\345\255\230\345\202\250\346\250\241\345\236\213.md" "b/content/zh/docs/Developerguide/\350\247\204\345\210\222\345\255\230\345\202\250\346\250\241\345\236\213.md" new file mode 100644 index 000000000..f288be217 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\204\345\210\222\345\255\230\345\202\250\346\250\241\345\236\213.md" @@ -0,0 +1,119 @@ +# 规划存储模型 + +openGauss支持行列混合存储。行、列存储模型各有优劣,建议根据实际情况选择。通常openGauss用于TP场景的数据库,默认使用行存储,仅对执行复杂查询且数据量大的AP场景时,才使用列存储。 + +行存储是指将表按行存储到硬盘分区上,列存储是指将表按列存储到硬盘分区上。默认情况下,创建的表为行存储。行存储和列存储的差异请参见[图1](#zh-cn_topic_0237120296_fig1417354233018)。 + +**图 1** 行存储和列存储的差异 + + +![](figures/zh-cn_image_0242381725.png) + +上图中,左上为行存表,右上为行存表在硬盘上的存储方式。左下为列存表,右下为列存表在硬盘上的存储方式。 + +行、列存储有如下优缺点: + + + + + + + + + + + + + + + + +

存储模型

+

优点

+

缺点

+

行存

+

数据被保存在一起。INSERT/UPDATE容易。

+

选择(Selection)时即使只涉及某几列,所有数据也都会被读取。

+

列存

+
  • 查询时只有涉及到的列会被读取。
  • 投影(Projection)很高效。
  • 任何列都能作为索引。
+
  • 选择完成时,被选择的列要重新组装。
  • INSERT/UPDATE比较麻烦。
+
+ +一般情况下,如果表的字段比较多(大宽表),查询中涉及到的列不多的情况下,适合列存储。如果表的字段个数比较少,查询大部分字段,那么选择行存储比较好。 + + + + + + + + + + + + + +

存储类型

+

适用场景

+

行存

+
  • 点查询(返回记录少,基于索引的简单查询)。
  • 增、删、改操作较多的场景。
+

列存

+
  • 统计分析类查询 (关联、分组操作较多的场景)。
  • 即席查询(查询条件不确定,行存表扫描难以使用索引)。
+
+ +## 行存表 + +默认创建表的类型。数据按行进行存储,即一行数据是连续存储。适用于对数据需要经常更新的场景。 + +``` +postgres=# CREATE TABLE customer_t1 +( + state_ID CHAR(2), + state_NAME VARCHAR2(40), + area_ID NUMBER +); + +--删除表 +postgres=# DROP TABLE customer_t1; +``` + +## 列存表 + +数据按列进行存储,即一列所有数据是连续存储的。单列查询IO小,比行存表占用更少的存储空间。适合数据批量插入、更新较少和以查询为主统计分析类的场景。列存表不适合点查询。 + +``` +postgres=# CREATE TABLE customer_t2 +( + state_ID CHAR(2), + state_NAME VARCHAR2(40), + area_ID NUMBER +) +WITH (ORIENTATION = COLUMN); + +--删除表 +postgres=# DROP TABLE customer_t2; +``` + +## 行存表和列存表的选择 + +- 更新频繁程度 + + 数据如果频繁更新,选择行存表。 + +- 插入频繁程度 + + 频繁的少量插入,选择行存表。一次插入大批量数据,选择列存表。 + +- 表的列数 + + 表的列数很多,选择列存表。 + +- 查询的列数 + + 如果每次查询时,只涉及了表的少数(<50%总列数)几个列,选择列存表。 + +- 压缩率 + + 列存表比行存表压缩率高。但高压缩率会消耗更多的CPU资源。 + + 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" new file mode 100644 index 000000000..7af9c132b --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\222\350\211\262.md" @@ -0,0 +1,20 @@ +# 角色 + +角色是一组用户的集合。通过GRANT把角色授予用户后,用户即具有了角色的所有权限。推荐使用角色进行高效权限分配。例如,可以为设计、开发和维护人员创建不同的角色,将角色GRANT给用户后,再向每个角色中的用户授予其工作所需数据的差异权限。在角色级别授予或撤消权限时,这些更改将作用到角色下的所有成员。 + +openGauss提供了一个隐式定义的拥有所有角色的组PUBLIC,所有创建的用户和角色默认拥有PUBLIC所拥有的权限。关于PUBLIC默认拥有的权限请参考[GRANT](GRANT.md)。要撤销或重新授予用户和角色对PUBLIC的权限, 可通过在GRANT和REVOKE指定关键字PUBLIC实现。 + +要查看所有角色,请查询系统表PG\_ROLES: + +``` +SELECT * FROM PG_ROLES; +``` + +## 创建、修改和删除角色 + +非[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960)时,只有系统管理员和具有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只会删除角色,并不会删除角色中的成员用户帐户。 + diff --git "a/content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250.md" "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250.md" new file mode 100644 index 000000000..3bc3dd3a5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250.md" @@ -0,0 +1,338 @@ +# 解析器 + +文本搜索解析器负责将原文档文本分解为多个token,并标识每个token的类型。这里的类型集由解析器本身定义。注意,解析器并不修改文本,它只是确定合理的单词边界。由于这一限制,人们更需要定制词典,而不是为每个应用程序定制解析器。 + +目前openGauss提供了三个内置的解析器,分别为pg\_catalog.default/pg\_catalog.ngram/pg\_catalog.pound,其中pg\_catalog.default适用于英文分词场景,pg\_catalog.ngram/pg\_catalog.pound是为了支持中文全文检索功能新增的两种解析器,适用于中文及中英混合分词场景。 + +内置解析器pg\_catalog.default,它能识别23种token类型,显示在[表1](#zh-cn_topic_0237122032_zh-cn_topic_0059778480_t0a8cd80932c5462fbea1e45540d72aea)中。 + +**表 1** 默认解析器类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

别名

+

描述

+

示例

+

asciiword

+

Word, all ASCII letters

+

elephant

+

word

+

Word, all letters

+

mañana

+

numword

+

Word, letters and digits

+

beta1

+

asciihword

+

Hyphenated word, all ASCII

+

up-to-date

+

hword

+

Hyphenated word, all letters

+

lógico-matemática

+

numhword

+

Hyphenated word, letters and digits

+

postgresql-beta1

+

hword_asciipart

+

Hyphenated word part, all ASCII

+

postgresql in the context postgresql-beta1

+

hword_part

+

Hyphenated word part, all letters

+

lógico or matemática in the context lógico-matemática

+

hword_numpart

+

Hyphenated word part, letters and digits

+

beta1 in the context postgresql-beta1

+

email

+

Email address

+

foo@example.com

+

protocol

+

Protocol head

+

http://

+

url

+

URL

+

example.com/stuff/index.html

+

host

+

Host

+

example.com

+

url_path

+

URL path

+

/stuff/index.html, in the context of a URL

+

file

+

File or path name

+

/usr/local/foo.txt, if not within a URL

+

sfloat

+

Scientific notation

+

-1.23E+56

+

float

+

Decimal notation

+

-1.234

+

int

+

Signed integer

+

-1234

+

uint

+

Unsigned integer

+

1234

+

version

+

Version number

+

8.3.0

+

tag

+

XML tag

+

<a href="dictionaries.html">

+

entity

+

XML entity

+

&amp;

+

blank

+

Space symbols

+

(any whitespace or punctuation not otherwise recognized)

+
+ +注意:对于解析器来说,一个“字母”的概念是由数据库的语言区域设置,即lc\_ctype设置决定的。只包含基本ASCII字母的词被报告为一个单独的token类型,因为这类词有时需要被区分出来。大多数欧洲语言中,对token类型word和asciiword的处理方法是类似的。 + +email不支持某些由RFC 5322定义的有效电子邮件字符。具体来说,可用于email用户名的非字母数字字符仅包含句号、破折号和下划线。 + +解析器可能对同一内容进行重叠token。例如,包含连字符的单词将作为一个整体进行报告,其组件也会分别被报告: + +``` +postgres=# SELECT alias, description, token FROM ts_debug('english','foo-bar-beta1'); + alias | description | token +-----------------+------------------------------------------+--------------- + numhword | Hyphenated word, letters and digits | foo-bar-beta1 + hword_asciipart | Hyphenated word part, all ASCII | foo + blank | Space symbols | - + hword_asciipart | Hyphenated word part, all ASCII | bar + blank | Space symbols | - + hword_numpart | Hyphenated word part, letters and digits | beta1 +``` + +这种行为是有必要的,因为它支持搜索整个复合词和各组件。这里是另一个例子: + +``` +postgres=# SELECT alias, description, token FROM ts_debug('english','http://example.com/stuff/index.html'); + alias | description | token +----------+---------------+------------------------------ + protocol | Protocol head | http:// + url | URL | example.com/stuff/index.html + host | Host | example.com + url_path | URL path | /stuff/index.html +``` + +N-gram是一种机械分词方法,适用于无语义中文分词场景。N-gram分词法可以保证分词的完备性,但是为了照顾所有可能,把很多不必要的词也加入到索引中,导致索引项增加。N-gram支持中文编码包括GBK、UTF-8。内置6种token类型,如[表2](#zh-cn_topic_0237122032_zh-cn_topic_0059778480_t1ca85b79b4344a59a8aca574c9fdc12f) 所示。 + +**表 2** token类型 + + + + + + + + + + + + + + + + + + + + + + + + + +

别名

+

描述

+

zh_words

+

chinese words

+

en_word

+

english word

+

numeric

+

numeric data

+

alnum

+

alnum string

+

grapsymbol

+

graphic symbol

+

multisymbol

+

multiple symbol

+
+ +Pound是一种固定格式分词方法,适用于无语意但待解析文本以固定分隔符分割开来的中英文分词场景。支持中文编码包括GBK、UTF8,支持英文编码包括ASCII。内置6种token类型,如[表4 token类型](#zh-cn_topic_0237122032_table18356541133518)所示;支持5种分隔符,如[表4](#zh-cn_topic_0237122032_table14245115444310)所示,在用户不进行自定义设置的情况下分隔符默认为“\#”。Pound限制单个token长度不能超过256个字符。 + +**表 3** token类型 + + + + + + + + + + + + + + + + + + + + + + + + + +

别名

+

描述

+

zh_words

+

chinese words

+

en_word

+

english word

+

numeric

+

numeric data

+

alnum

+

alnum string

+

grapsymbol

+

graphic symbol

+

multisymbol

+

multiple symbol

+
+ +**表 4** 分隔符类型 + + + + + + + + + + + + + + + + + + + + + + +

分隔符

+

描述

+

@

+

Special character

+

#

+

Special character

+

$

+

Special character

+

%

+

Special character

+

/

+

Special character

+
+ diff --git "a/content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250\346\265\213\350\257\225.md" "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250\346\265\213\350\257\225.md" new file mode 100644 index 000000000..4663fb544 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\345\231\250\346\265\213\350\257\225.md" @@ -0,0 +1,63 @@ +# 解析器测试 + +函数ts\_parse可以直接测试文本搜索解析器。 + +``` +ts_parse(parser_name text, document text, + OUT tokid integer, OUT token text) returns setof record +``` + +ts\_parse解析指定的document并返回一系列的记录,一条记录代表一个解析生成的token。每条记录包括标识token类型的tokid,及token文本。例如: + +``` +postgres=# SELECT * FROM ts_parse('default', '123 - a number'); + tokid | token +-------+-------- + 22 | 123 + 12 | + 12 | - + 1 | a + 12 | + 1 | number +(6 rows) +``` + +函数ts\_token\_type返回指定解析器的token类型及其描述信息。 + +``` +ts_token_type(parser_name text, OUT tokid integer, + OUT alias text, OUT description text) returns setof record +``` + +ts\_token\_type返回一个表,这个表描述了指定解析器可以识别的每种token类型。对于每个token类型,表中给出了整数类型的tokid--用于解析器标记对应的token类型;alias——命名分词器命令中的token类型;及简单描述。比如: + +``` +postgres=# SELECT * FROM ts_token_type('default'); + tokid | alias | description +-------+-----------------+------------------------------------------ + 1 | asciiword | Word, all ASCII + 2 | word | Word, all letters + 3 | numword | Word, letters and digits + 4 | email | Email address + 5 | url | URL + 6 | host | Host + 7 | sfloat | Scientific notation + 8 | version | Version number + 9 | hword_numpart | Hyphenated word part, letters and digits + 10 | hword_part | Hyphenated word part, all letters + 11 | hword_asciipart | Hyphenated word part, all ASCII + 12 | blank | Space symbols + 13 | tag | XML tag + 14 | protocol | Protocol head + 15 | numhword | Hyphenated word, letters and digits + 16 | asciihword | Hyphenated word, all ASCII + 17 | hword | Hyphenated word, all letters + 18 | url_path | URL path + 19 | file | File or path name + 20 | float | Decimal notation + 21 | int | Signed integer + 22 | uint | Unsigned integer + 23 | entity | XML entity +(23 rows) +``` + 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" new file mode 100644 index 000000000..446669b80 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\226\207\346\241\243.md" @@ -0,0 +1,46 @@ +# 解析文档 + +openGauss中提供了to\_tsvector函数把文档处理成tsvector数据类型。 + +``` +to_tsvector([ config regconfig, ] document text) returns tsvector +``` + +to\_tsvector将文本文档解析为token,再将token简化到词素,并返回一个tsvector。其中tsvector中列出了词素及它们在文档中的位置。文档是根据指定的或默认的文本搜索分词器进行处理的。这里有一个简单的例子: + +``` +postgres=# SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats'); + to_tsvector +----------------------------------------------------- + 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4 +``` + +通过以上例子可发现结果tsvector不包含词a、on或者it,rats变成rat,并且忽略标点符号-。 + +to\_tsvector函数内部调用一个解析器,将文档的文本分解成token并给每个token指定一个类型。对于每个token,有一系列词典可供查询。词典系列因token类型的不同而不同。识别token的第一本词典将发出一个或多个标准词素来表示token。例如: + +- rats变成rat因为词典认为词rats是rat的复数形式。 +- 有些词被作为停用词(请参考[停用词](停用词.md#ZH-CN_TOPIC_0242370499)),这样它们就会被忽略,因为它们出现得太过频繁以致于搜索中没有用处。比如例子中的a、on和it。 +- 如果没有词典识别token,那么它也被忽略。在这个例子中,符号“-”被忽略,因为词典没有给它分配token类型(空间符号),即空间记号永远不会被索引。 + +语法解析器、词典和要索引的token类型由选定的文本搜索分词器决定。可以在同一个数据库中有多种不同的分词器,以及提供各种语言的预定义分词器。在以上例子中,使用缺省分词器english。 + +函数setweight可以给tsvector的记录加权重,权重是字母A、B、C、D之一。这通常用于标记来自文档不同部分的记录,比如标题、正文。之后,这些信息可以用于排序搜索结果。 + +因为to\_tsvector\(NULL\)会返回空,当字段可能是空的时候,建议使用coalesce。以下是推荐的为结构化文档创建tsvector的方法: + +``` +postgres=# CREATE TABLE tsearch.tt (id int, title text, keyword text, abstract text, body text, ti tsvector); + +postgres=# INSERT INTO tsearch.tt(id, title, keyword, abstract, body) VALUES (1, 'China', 'Beijing', 'China','China, officially the People''s Republic of China (PRC), located in Asia, is the world''s most populous state.'); + +postgres=# UPDATE tsearch.tt SET ti = + setweight(to_tsvector(coalesce(title,'')), 'A') || + setweight(to_tsvector(coalesce(keyword,'')), 'B') || + setweight(to_tsvector(coalesce(abstract,'')), 'C') || + setweight(to_tsvector(coalesce(body,'')), 'D'); +postgres=# DROP TABLE tsearch.tt; +``` + +上例使用setweight标记已完成的tsvector中的每个词的来源,并且使用tsvector连接操作符||合并标记过的tsvector值,[处理tsvector](处理tsvector.md#ZH-CN_TOPIC_0242370492)一节详细介绍了这些操作。 + 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" new file mode 100644 index 000000000..2cc0d1b0b --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\243\346\236\220\346\237\245\350\257\242.md" @@ -0,0 +1,68 @@ +# 解析查询 + +openGauss提供了函数to\_tsquery和plainto\_tsquery将查询转换为tsquery数据类型,to\_tsquery提供比plainto\_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。例如: + +``` +postgres=# SELECT to_tsquery('english', 'The & Fat & Rats'); + to_tsquery +--------------- + 'fat' & 'rat' +(1 row) +``` + +像在基本tsquery中的输入一样,weight\(s\)可以附加到每个词素来限制它只匹配那些有相同weight\(s\)的tsvector词素。比如: + +``` +postgres=# SELECT to_tsquery('english', 'Fat | Rats:AB'); + to_tsquery +------------------ + 'fat' | 'rat':AB +(1 row) +``` + +同时,\*也可以附加到词素来指定前缀匹配: + +``` +postgres=# SELECT to_tsquery('supern:*A & star:A*B'); + to_tsquery +-------------------------- + 'supern':*A & 'star':*AB +(1 row) +``` + +这样的词素将匹配tsquery中指定字符串和权重的项。 + +``` +plainto_tsquery([ config regconfig, ] querytext text) returns tsquery +``` + +plainto\_tsquery将未格式化的文本querytext变换为tsquery。类似于to\_tsvector,文本被解析并且标准化,然后在存在的词之间插入&\(AND\)布尔算子。 + +比如: + +``` +postgres=# SELECT plainto_tsquery('english', 'The Fat Rats'); + plainto_tsquery +----------------- + 'fat' & 'rat' +(1 row) +``` + +请注意,plainto\_tsquery无法识别布尔运算符、权重标签,或在其输入中的前缀匹配标签: + +``` +postgres=# SELECT plainto_tsquery('english', 'The Fat & Rats:C'); + plainto_tsquery +--------------------- + 'fat' & 'rat' & 'c' +(1 row) +``` + +在这里,所有输入的标点符号作为空格符号丢弃。 + diff --git "a/content/zh/docs/Developerguide/\350\247\246\345\217\221\345\231\250\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\350\247\246\345\217\221\345\231\250\345\207\275\346\225\260.md" new file mode 100644 index 000000000..9c6b43b0c --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\247\246\345\217\221\345\231\250\345\207\275\346\225\260.md" @@ -0,0 +1,37 @@ +# 触发器函数 + +- pg\_get\_triggerdef\(oid\) + + 描述:获取触发器的定义信息。 + + 参数:待查触发器的OID。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT pg_get_triggerdef(oid) FROM pg_trigger; + pg_get_triggerdef + ---------------------------------------------------------------------------------------------------------------------- + (0 rows) + ``` + +- pg\_get\_triggerdef\(oid, boolean\) + + 描述:获取触发器的定义信息。 + + 参数:待查触发器的OID及是否以pretty方式展示。 + + 返回值类型:text + + 示例: + + ``` + postgres=# SELECT pg_get_triggerdef(oid, true) FROM pg_trigger; + pg_get_triggerdef + ---------------------------------------------------------------------------------------------------------------------- + (0 rows) + ``` + + 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" new file mode 100644 index 000000000..220372ffe --- /dev/null +++ "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" @@ -0,0 +1,160 @@ +# 记录日志的位置 + +## log\_destination + +**参数说明:**openGauss支持多种方法记录服务器日志,log\_destination的取值为一个逗号分隔开的列表(如log\_destination="stderr,csvlog")。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +有效值为stderr、csvlog、syslog。 + +- 取值为stderr,表示日志打印到屏幕。 +- 取值为csvlog,表示日志的输出格式为“逗号分隔值”即CSV (Comma Separated Value)格式。使用csvlog记录日志的前提是将[logging\_collector](#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s61d6090c04ee464fb54f8b31936ba818)设置为on,请参见[使用CSV格式写日志](使用CSV格式写日志.md)。 +- 取值为syslog,表示通过操作系统的syslog记录日志。openGauss使用syslog的LOCAL0 ~ LOCAL7记录日志,请参见[syslog\_facility](#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s853e14ac6a8a47678036cdc8e5119090)。使用syslog记录日志需在操作系统后台服务配置文件中添加代码: + + ``` + local0.* /var/log/postgresql + ``` + + +**默认值:**stderr + +## logging\_collector + +**参数说明:**控制开启后端日志收集进程logger进行日志收集。该进程捕获发送到stderr或csvlog的日志消息并写入日志文件。 + +这种记录日志的方法比将日志记录到syslog更加有效,因为某些类型的消息在syslog的输出中无法显示。例如动态链接库加载失败消息和脚本(例如archive\_command)产生的错误消息。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>将服务器日志发送到stderr时可以不使用logging\_collector参数,此时日志消息会被发送到服务器的stderr指向的空间。这种方法的缺点是日志回滚困难,只适用于较小的日志容量。 + +**取值范围:**布尔型 + +- on表示开启日志收集功能。 +- off表示关闭日志收集功能。 + +**默认值:**on + +## log\_directory + +**参数说明:**logging\_collector设置为on时,log\_directory决定存放服务器日志文件的目录。 它可以是绝对路径,或者是相对路径(相对于数据目录的路径)。log\_directory支持动态修改,可以通过gs\_guc reload实现。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 当配置文件中log\_directory的值为非法路径时,会导致openGauss无法重新启动。 +>- 通过gs\_guc reload动态修改log\_directory时,当指定路径为合法路径时,日志输出到新的路径下。当指定路径为非法路径时,日志输出到上一次合法的日志输出路径下而不影响数据库正常运行。此时即使指定的log\_directory的值非法,也会写入到配置文件中。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>合法路径:用户对此路径有读写权限 +>非法路径:用户对此路径无读写权限 + +**取值范围:**字符串 + +**默认值:**安装时指定。 + +## log\_filename + +**参数说明:**logging\_collector设置为on时,log\_filename决定服务器运行日志文件的名称。通常日志文件名是按照strftime模式生成,因此可以用系统时间定义日志文件名,用%转义字符实现。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 建议使用%转义字符定义日志文件名称,否则难以对日志文件进行有效的管理。 +>- 当log\_destination设为csvlog时,系统会生成附加了时间戳的日志文件名,文件格式为csv格式,例如“server\_log.1093827753.csv”。 + +**取值范围:**字符串 + +**默认值:**postgresql-%Y-%m-%d\_%H%M%S.log + +## log\_file\_mode + +**参数说明:**[logging\_collector](#zh-cn_topic_0237124721_zh-cn_topic_0059778787_s61d6090c04ee464fb54f8b31936ba818)设置为on时,log\_file\_mode设置服务器日志文件的权限。通常log\_file\_mode的取值是能够被chmod和umask系统调用接受的数字。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 使用此选项前请设置log\_directory,将日志存储到数据目录之外的地方。 +>- 因日志文件可能含有敏感数据,故不能将其设为对外可读。 + +**取值范围:**整型,0000~0777 (8进制计数,转化为十进制 0 \~ 511)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 0600表示只允许服务器管理员读写日志文件。 +>- 0640表示允许管理员所在用户组成员只能读日志文件。 + +**默认值:**0600 + +## log\_truncate\_on\_rotation + +**参数说明:**logging\_collector设置为on时,log\_truncate\_on\_rotation设置日志消息的写入方式。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +示例如下: + +假设日志需要保留7天,每天生成一个日志文件,日志文件名设置为server\_log.Mon、server\_log.Tue等。第二周的周二生成的日志消息会覆盖写入到server\_log.Tue。设置方法:将log\_filename设置为server\_log.%a ,log\_truncate\_on\_rotation设置为on,log\_rotation\_age设置为1440,即日志有效时间为1天。 + +**取值范围:** 布尔型 + +- on表示openGauss以覆盖写入的方式写服务器日志消息。 +- off表示openGauss将日志消息附加到同名的现有日志文件上。 + +**默认值:**off + +## log\_rotation\_age + +**参数说明:**logging\_collector设置为on时,log\_rotation\_age决定创建一个新日志文件的时间间隔。当现在的时间减去上次创建一个服务器日志的时间超过了log\_rotation\_age的值时,将生成一个新的日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ 35791394,单位为min。其中0表示关闭基于时间的新日志文件的创建。 + +**默认值:**1440\(min\) + +## log\_rotation\_size + +**参数说明:**logging\_collector设置为on时,log\_rotation\_size决定服务器日志文件的最大容量。当日志消息的总量超过日志文件容量时,服务器将生成一个新的日志文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX / 1024,单位为KB。 + +0表示关闭基于容量的新日志文件的创建。 + +**默认值:**20MB + +## syslog\_facility + +**参数说明:**log\_destination设置为syslog时,syslog\_facility配置使用syslog记录日志的“设备”。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型,有效值有local0、local1、local2、local3、local4、local5、local6、local7。 + +**默认值:**local0 + +## syslog\_ident + +**参数说明:**[log\_destination](#zh-cn_topic_0237124721_zh-cn_topic_0059778787_sb6c9884f69bd4765a60f80810c94f194)设置为syslog时,syslog\_ident设置在syslog日志中openGauss日志消息的标识。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**postgres + +## event\_source + +**参数说明:**该参数openGauss暂未使用。windows环境下log\_destination设置为eventlog时,event\_source设置在日志中openGauss日志消息的标识。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**PostgreSQL + 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" new file mode 100644 index 000000000..6cb653b6a --- /dev/null +++ "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" @@ -0,0 +1,389 @@ +# 记录日志的内容 + +## debug\_print\_parse + +**参数说明:**用于控制打印解析树结果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启打印结果的功能。 +- off表示关闭打印结果的功能。 + +**默认值:**off + +## debug\_print\_rewritten + +**参数说明:**用于控制打印查询重写结果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启打印结果的功能。 +- off表示关闭打印结果的功能。 + +**默认值:**off + +## debug\_print\_plan + +**参数说明:**用于控制打印查询执行结果。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启打印结果的功能。 +- off表示关闭打印结果的功能。 + +**默认值:**off + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 只有当日志的级别为log及以上时,debug\_print\_parse、debug\_print\_rewritten和debug\_print\_plan的调试信息才会输出。当这些选项打开时,调试信息只会记录在服务器的日志中,而不会输出到客户端的日志中。通过设置[client\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)和[log\_min\_messages](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)参数可以改变日志级别。 +>- 在打开debug\_print\_plan开关的情况下需尽量避免调用gs\_encrypt\_aes128及gs\_decrypt\_aes128函数,避免敏感参数信息在日志中泄露的风险。同时建议用户在打开debug\_print\_plan开关生成的日志中对gs\_encrypt\_aes128及gs\_decrypt\_aes128函数的参数信息进行过滤后再提供给外部维护人员定位,日志使用完成后请及时删除。 + +## debug\_pretty\_print + +**参数说明:**设置此选项对debug\_print\_parse、debug\_print\_rewritten和debug\_print\_plan产生的日志进行缩进,会生成易读但比设置为off时更长的输出格式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示进行缩进。 +- off表示不进行缩进。 + +**默认值:**on + +## log\_checkpoints + +**参数说明:**控制在服务器日志中记录检查点和重启点的信息。打开此参数时,服务器日志消息包含涉及检查点和重启点的统计量,其中包含需要写的缓存区的数量及写入所花费的时间等。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打开此参数时,服务器日志消息包含涉及检查点和重启点的统计量。 +- off表示关闭此参数时,服务器日志消息包含不涉及检查点和重启点的统计量。 + +**默认值:**off + +## log\_connections + +**参数说明:**控制记录客户端的连接请求信息。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>有些客户端程序(例如gsql),在判断是否需要口令的时候会尝试连接两次,因此日志消息中重复的“connection receive”(收到连接请求)并不意味着一定是问题。 + +**取值范围:**布尔型 + +- on表示记录信息。 +- off表示不记录信息。 + +**默认值:**off + +## log\_disconnections + +**参数说明:**控制记录客户端结束连接信息。 + +该参数属于BACKEND类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示记录信息。 +- off表示不记录信息。 + +**默认值:**off + +## log\_duration + +**参数说明:**控制记录每个已完成SQL语句的执行时间。对使用扩展查询协议的客户端、会记录语法分析、绑定和执行每一步所花费的时间。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- 设置为off ,该选项与[log\_min\_duration\_statement](记录日志的时间.md#zh-cn_topic_0237124722_zh-cn_topic_0059778452_s62cf0fb833324a82a841f02134a932e5)的不同之处在于log\_min\_duration\_statement强制记录查询文本。 +- 设置为on并且log\_min\_duration\_statement大于零,记录所有持续时间,但是仅记录超过阈值的语句。这可用于在高负载情况下搜集统计信息。 + +**默认值:**on + +## log\_error\_verbosity + +**参数说明:**控制服务器日志中每条记录的消息写入的详细度。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- terse输出不包括DETAIL、HINT、QUERY及CONTEXT错误信息的记录。 +- verbose输出包括SQLSTATE错误代码 、源代码文件名、函数名及产生错误所在的行号。 +- default输出包括DETAIL、HINT、QUERY及CONTEXT错误信息的记录,不包括SQLSTATE错误代码 、源代码文件名、函数名及产生错误所在的行号。 + +**默认值:**default + +## log\_hostname + +**参数说明:**选项关闭状态下,连接消息日志只显示正在连接主机的IP地址。打开此选项同时可以记录主机名。由于解析主机名可能需要一定的时间,可能影响数据库的性能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示可以同时记录主机名。 +- off表示不可以同时记录主机名。 + +**默认值:**on + +## log\_line\_prefix + +**参数说明:**控制每条日志信息的前缀格式。日志前缀类似于printf风格的字符串,在日志的每行开头输出。用以%为开头的“转义字符”代替[表1](#zh-cn_topic_0237124723_zh-cn_topic_0059778400_zh-cn_topic_0058967718_table27298862)中的状态信息。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**表 1** 转义字符表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

转义字符

+

效果

+

%a

+

应用程序名称。

+

%u

+

用户名。

+

%d

+

数据库名。

+

%r

+

远端主机名或者IP地址以及远端端口,在不启动log_hostname时显示IP地址及远端端口。

+

%h

+

远端主机名或者IP地址,在不启动log_hostname时只显示IP地址。

+

%p

+

线程ID。

+

%t

+

时间戳(没有毫秒)。

+

%m

+

带毫秒的时间戳。

+

%n

+

表示指定错误从哪个节点上报的。

+

%i

+

命令标签:会话当前执行的命令类型。

+

%e

+

SQLSTATE错误码。

+

%c

+

会话ID,详见说明。

+

%l

+

每个会话或线程的日志编号,从1开始。

+

%s

+

进程启动时间。

+

%v

+

虚拟事务ID(backendID/ localXID)

+

%x

+

事务ID(0表示没有分配事务ID)。

+

%q

+

不产生任何输出。如果当前线程是后端线程,忽略这个转义序列,继续处理后面的转义序列;如果当前线程不是后端线程,忽略这个转义序列和它后面的所有转义序列。

+

%%

+

字符% 。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>转义字符%c打印一个独一无二的会话ID,由两个4字节的十六进制数组成,通过字符“.”分开。这两个十六进制数分别表示进程的启动时间及进程编号,所以%c也可以看作是保存打印这些名目的途径的空间。比如,从pg\_stat\_activity中产生会话ID,可以用下面的查询: +>``` +>SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' || +> to_hex(pid) +>FROM pg_stat_activity; +>``` +>- 当log\_line\_prefix设置为空值时,请将其最后一个字符作为一个独立的段,以此来直观地与后续的日志进行区分,也可以使用一个标点符号。 +>- Syslog生成自己的时间戳及进程ID信息,所以当登录日志时,不需要包含这些转义字符。 + +**取值范围:**字符串 + +**默认值:**%m %c %d %p %a %x %n %e + +>![](public_sys-resources/icon-note.gif) **说明:** +>%m %c %d %p %a %x %n %e表示在日志开头附加会话开始时间戳,会话ID,数据库名,线程ID,应用程序名,事务ID,报错节点,SQLSTATE错误码。 + +## log\_lock\_waits + +**参数说明:**当一个会话的等待获得一个锁的时间超过[deadlock\_timeout](锁管理.md#zh-cn_topic_0237124735_zh-cn_topic_0059778102_se697b4ff00b643938b67eb5e08206cd5)的值时,此选项控制在数据库日志中记录此消息。这对于决定锁等待是否会产生一个坏的行为是非常有用的。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示记录此信息。 +- off表示不记录此信息。 + +**默认值:**off + +## log\_statement + +**参数说明:**控制记录SQL语句。对于使用扩展查询协议的客户端,记录接收到执行消息的事件和绑定参数的值(内置单引号要双写)。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>即使log\_statement设置为all,包含简单语法错误的语句也不会被记录,因为仅在完成基本的语法分析并确定了语句类型之后才记录日志。在使用扩展查询协议的情况下,在执行阶段之前(语法分析或规划阶段)同样不会记录。将log\_min\_error\_statement设为ERROR或更低才能记录这些语句。 + +**取值范围:**枚举类型 + +- none表示不记录语句。 +- ddl表示记录所有的数据定义语句,比如CREATE、ALTER和DROP语句。 +- mod表示记录所有DDL语句,还包括数据修改语句INSERT、UPDATE、DELETE、TRUNCATE和COPY FROM 。 +- all表示记录所有语句,PREPARE、EXECUTE和EXPLAIN ANALYZE语句也同样被记录。 + +**默认值:**none + +## log\_temp\_files + +**参数说明:**控制记录临时文件的删除信息。临时文件可以用来排序、哈希及临时查询结果。当一个临时文件被删除时,将会产生一条日志消息。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为-1,最大值2147483647,单位KB。 + +- 正整数表示只记录比log\_temp\_files设定值大的临时文件的删除信息。 +- 值0 表示记录所有的临时文件的删除信息。 +- 值-1 表示不记录任何临时文件的删除信息。 + +**默认值:**-1 + +## log\_timezone + +**参数说明:**设置服务器写日志文件时使用的时区。与[TimeZone](区域和格式化.md#zh-cn_topic_0237124733_zh-cn_topic_0059778109_sa60c5d71347646c2ad97ccb7541c6f12)不同,这个值是数据库范围的,针对所有连接到本数据库的会话生效。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**PRC + +>![](public_sys-resources/icon-note.gif) **说明:** +>gs\_initdb进行相应系统环境设置时会对默认值进行修改。 + +## logging\_module + +**参数说明:**用于设置或者显示模块日志在服务端的可输出性。该参数属于会话级参数,不建议通过gs\_guc工具来设置。 + +该参数属于USERSET类型参数,设置请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置的方法进行设置。 + +**取值范围:**字符串 + +**默认值:**所有模块日志在服务端是不输出的,可由SHOW logging\_module查看。为ALL,on\(\),off\(DFS,GUC,ORC,SLRU,MEM\_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,OPFUSION,VEC\_EXECUTOR,LLVM,OPT,OPT\_REWRITE,OPT\_JOIN,OPT\_AGG,OPT\_SUBPLAN,OPT\_SETOP,OPT\_SKEW,UDF,COOP\_ANALYZE,WLMCP,ACCELERATE,,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN\_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE\_CKPT,DBL\_WRT,RTO,HEARTBEAT\)。 + +**设置方法**:首先,可以通过SHOW logging\_module来查看哪些模块是支持可控制的。例如,查询输出结果为: + +``` +postgres=# show logging_module; +logging_module +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,T,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT) +(1 row) +``` + +支持可控制的模块使用大写来标识,特殊标识ALL用于对所有模块日志进行设置。可以使用on/off来控制模块日志的输出。设置SSL模块日志为可输出,使用如下命令: + +``` +postgres=# set logging_module='on(SSL)'; +SET +postgres=# show logging_module; logging_module +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(SSL),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PARAM) +(1 row) +``` + +可以看到模块SSL的日志输出被打开。 + +ALL标识是相当于一个快捷操作,即对所有模块的日志可输出进行开启或关闭。 + +``` +postgres=# set logging_module='off(ALL)'; +SET +postgres=# show logging_module; logging_module +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT) +(1 row) + +postgres=# set logging_module='on(ALL)'; +SET +postgres=# show logging_module; logging_module +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,TBLSPC,WLM,EXECUTOR,VEC_EXECUTOR,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT),off() +(1 row) +``` + +**依赖关系**:该参数依赖于log\_min\_level参数的设置 + +## opfusion\_debug\_mode + +**参数说明:**用于调试简单查询是否进行查询优化。设置成log级别可以在数据库节点的执行计划中看到没有查询优化的具体原因。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- off表示不打开该功能。 +- log表示打开该功能,可以在数据库节点的执行计划中看到没有查询优化的具体原因。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>提供在log中显示语句没有查询优化的具体原因,需要将参数设置成log级别,log\_min\_messages设置成debug4级别,logging\_module设置'on\(OPFUSION\)',注意log内容可能会比较多,尽可能在调优期间执行少量作业使用。 + +**默认值:**off + 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" new file mode 100644 index 000000000..131019550 --- /dev/null +++ "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" @@ -0,0 +1,183 @@ +# 记录日志的时间 + +## client\_min\_messages + +**参数说明:**控制发送到客户端的消息级别。每个级别都包含排在它后面的所有级别中的信息。级别越低,发送给客户端的消息就越少。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当client\_min\_messages和[log\_min\_messages](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_sc6c47ec8cc1b47e28be98dbb24b1b39a)取相同值时,其值所代表的级别不同。 + +**取值范围:**枚举类型,有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。在实际设置过程中,如果设置的级别大于error,为fatal或panic,系统会默认将级别转为error。 + +**默认值:**notice + +## log\_min\_messages + +**参数说明:**控制写到服务器日志文件中的消息级别。每个级别都包含排在它后面的所有级别中的信息。级别越低,服务器运行日志中记录的消息就越少。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当[client\_min\_messages](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_s2955da1f1cb24b0aa68ddc77700233e0)和log\_min\_messages取相同值log时所代表的消息级别不同。 + +**取值范围:**枚举类型,有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。 + +**默认值:**warning + +## log\_min\_error\_statement + +**参数说明:**控制在服务器日志中记录错误的SQL语句。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**枚举类型,有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 设置为error ,表示导致错误、日志消息、致命错误、panic的语句都将被记录。 +>- 设置为panic,表示关闭此特性。 + +**默认值:**error + +## log\_min\_duration\_statement + +**参数说明:**当某条语句的持续时间大于或者等于特定的毫秒数时,log\_min\_duration\_statement参数用于控制记录每条完成语句的持续时间。 + +设置log\_min\_duration\_statement可以很方便地跟踪需要优化的查询语句。对于使用扩展查询协议的客户端,语法分析、绑定、执行每一步所花时间被独立记录。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>当此选项与[log\_statement](记录日志的内容.md#zh-cn_topic_0237124723_zh-cn_topic_0059778400_s77b3e2e16a3e4705a139bef98688be8a)同时使用时,已经被log\_statement记录的语句文本不会被重复记录。在没有使用syslog情况下,推荐使用[log\_line\_prefix](记录日志的内容.md#zh-cn_topic_0237124723_zh-cn_topic_0059778400_sd57ce2167a8149239e10ab0cef12b949)记录PID或会话ID,方便将当前语句消息连接到最后的持续时间消息。 + +**取值范围:**整型,-1 \~ INT\_MAX,单位为毫秒。 + +- 设置为250,所有运行时间不短于250ms的SQL语句都会被记录。 +- 设置为0,输出所有语句的持续时间。 +- 设置为-1,关闭此功能。 + +**默认值:**30min + +## backtrace\_min\_messages + +**参数说明:**控制当产生该设置参数级别相等或更高级别的信息时,会打印函数的堆栈信息到服务器日志文件中。 + +该参数属于SUSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该参数作为客户现场问题定位手段使用,且由于频繁的打印函数栈会对系统的开销及稳定性有一定的影响,因此如果需要进行问题定位时,建议避免将backtrace\_min\_messages的值设置为fatal及panic以外的级别。 + +**取值范围:**枚举类型 + +有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)。 + +**默认值:**panic + +[表1](#zh-cn_topic_0237124722_zh-cn_topic_0059778452_zh-cn_topic_0058967791_table55180162)解释openGauss中使用的消息安全级别。当日志输出到syslog或者eventlog时,openGauss进行如表中的转换。 + +**表 1** 信息严重程度分类 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

信息严重程度类型

+

详细说明

+

系统日志

+

事件日志

+

debug[1-5]

+

报告详细调试信息。

+

DEBUG

+

INFORMATION

+

log

+

报告对数据库管理员有用的信息, 比如检查点操作统计信息。

+

INFO

+

INFORMATION

+

info

+

报告用户可能需求的信息, 比如在VACUUM VERBOSE过程中的信息。

+

INFO

+

INFORMATION

+

notice

+

报告可能对用户有帮助的信息, 比如, 长标识符的截断, 作为主键一部分创建的索引等。

+

NOTICE

+

INFORMATION

+

warning

+

报告警告信息, 比如在事务块范围之外的COMMIT。

+

NOTICE

+

WARNING

+

error

+

报告导致当前命令退出的错误。

+

WARNING

+

ERROR

+

fatal

+

报告导致当前会话终止的原因。

+

ERR

+

ERROR

+

panic

+

报告导致整个数据库被关闭的原因。

+

CRIT

+

ERROR

+
+ +## plog\_merge\_age + +**参数说明:**该参数用于控制性能日志数据输出的周期。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该参数以毫秒为单位的,建议在使用过程中设置值为1000的整数倍,即设置值以秒为最小单位。该参数所控制的性能日志文件以prf为扩展名,文件放置在$GAUSSLOG/gs\_profile/ 目录下面,其中node\_name是由postgres.conf文件中的pgxc\_node\_name的值,不建议外部使用该参数。 + +**取值范围:**0\~2147483647,单位为毫秒(ms)。 + +当设置为0时,当前会话不再输出性能日志数据。当设置为非0时,当前会话按照指定的时间周期进行输出性能日志数据。 + +该参数设置得越小,输出的日志数据越多,对性能的负面影响越大。 + +**默认值:**3s + 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" new file mode 100644 index 000000000..1bbd1dedf --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256.md" @@ -0,0 +1,189 @@ +# 设置 + +## wal\_level + +**参数说明:**设置写入WAL信息量的级别。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果需要启用WAL日志归档和主备机的数据流复制,必须将此参数设置为archive或者hot\_standby。 +>- 如果此参数设置为archive,hot\_standby必须设置为off,否则将导致数据库无法启动。但是,hot\_standby在双机环境中不能设置为off,具体参见hot\_standby参数说明。 + +**取值范围**:枚举类型 + +- minimal + + 优点:一些重要操作(包括创建表、创建索引、簇操作和表的复制)都能安全的跳过,这样就可以使操作变得更快。 + + 缺点:WAL仅提供从数据库服务器崩溃或者紧急关闭状态恢复时所需要的基本信息,无法用WAL归档日志恢复数据。 + +- archive + + 这个参数增加了WAL归档需要的日志信息,从而可以支持数据库的归档恢复。 + +- hot\_standby + - 这个参数进一步增加了在备机上运行的SQL查询的信息,这个参数只能在数据库服务重新启动后生效。 + - 为了在备机上开启只读查询,wal\_level必须在主机上设置成hot\_standby ,并且备机必须打开hot\_standby参数。hot\_standby和archive级别之间的性能只有微小的差异,如果它们的设置对产品的性能影响有明显差异,欢迎反馈。 + + +**默认值:**hot\_standby + +## fsync + +**参数说明:**设置openGauss服务器是否使用fsync\(\)系统函数(请参见[wal\_sync\_method](#zh-cn_topic_0237124707_zh-cn_topic_0059778393_s9fc8bf6fcd2b474d894fc8ee7385fe86))确保数据的更新及时写入物理磁盘中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 使用fsync\(\)系统函数可以保证在操作系统或者硬件崩溃的情况下将数据恢复到一个已知的状态。 +>- 如果将此参数关闭,可能会在系统崩溃时无法恢复原来的数据,导致数据库不可用。 + +**取值范围:**布尔型 + +- on表示使用fsync\(\)系统函数。 +- off表示不使用fsync\(\)系统函数。 + +**默认值:**on + +## synchronous\_commit + +**参数说明:**设置当前事务的同步方式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举类型 + +- on表示将备机的同步日志刷新到磁盘。 +- off表示异步提交。 +- local表示为本地提交。 +- remote\_write表示要备机的同步日志写到磁盘。 +- remote\_receive表示要备机同步日志接收数据。 + +**默认值:**on + +## wal\_sync\_method + +**参数说明:**设置向磁盘强制更新WAL数据的方法。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果将[fsync](#zh-cn_topic_0237124707_zh-cn_topic_0059778393_sb6cc47bbe02c47a785c873b1959ad0df)关闭,这个参数的设置就没有意义,因为所有数据更新都不会强制写入磁盘。 + +**取值范围**:枚举类型 + +- open\_datasync表示用带O\_DSYNC选项的open\(\)打开“WAL”文件。 +- fdatasync表示每次提交的时候都调用fdatasync\(\)。(支持suse10和suse11)。 +- fsync\_writethrough表示每次提交的时候调用fsync\(\)强制把缓冲区任何数据写入磁盘。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >由于历史原因,我们允许在Windows平台上将wal\_sync\_method设置为fsync\_writethrough,尽管它和fsync等效。 + +- fsync表示每次提交的时候调用fsync\(\)。(支持suse10和suse11) +- open\_sync表示用带O\_SYNC选项的open\(\)写“WAL”文件。(支持suse10和suse11) + +**默认值:**fdatasync + +## full\_page\_writes + +**参数说明:**设置openGauss服务器在检查点之后对页面的第一次修改时,是否将每个磁盘页面的全部内容写到WAL日志中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 设置这个参数是因为在操作系统崩溃过程中可能磁盘页面只写入了一部分内容,从而导致在同一个页面中包含新旧数据的混合。在崩溃后的恢复期间,由于在WAL日志中存储的行变化信息不够完整,因此无法完全恢复该页。把完整的页面影像保存下来就可以保证页面被正确还原,代价是增加了写入WAL日志的数据量。 +>- 关闭此参数,在系统崩溃的时候,可能无法恢复原来的数据。如果服务器硬件的特质(比如电池供电的磁盘控制器)可以减小部分页面的写入风险,或者文件系统特性支持(比如ReiserFS 4),并且清楚知道写入风险在一个可以接受的范畴,可以关闭这个参数。 + +**取值范围:**布尔型 + +- on表示启用此特性。 +- off表示关闭此特性。 + +**默认值:**on + +## wal\_log\_hints + +**参数说明:**设置在检查点之后对页面的第一次修改为页面上元组hint bits的修改时,是否将整个页面的全部内容写到WAL日志中。不推荐用户修改此设置。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示整个页面全部内容写到WAL日志中。 +- off表示整个页面内容不会写到WAL日志中。 + +**默认值:**on + +## wal\_buffers + +**参数说明:**设置用于存放WAL数据的共享内存空间的XLOG\_BLCKSZ数,XLOG\_BLCKSZ的大小默认为8KB。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**-1\~218 + +- 如果设置为-1,表示wal\_buffers的大小随着参数shared\_buffers自动调整,为shared\_buffers的1/32,最小值为8个XLOG\_BLCKSZ,最大值为2048个XLOG\_BLCKSZ。 +- 如果设置为其他值,当小于8时,会被默认设置为8;当大于2048的时,会被强制设置为2048。 + +**默认值:**16MB + +**设置建议:**每次事务提交时,WAL缓冲区的内容都写入到磁盘中,因此设置为很大的值不会带来明显的性能提升。如果将它设置成几百兆,就可以在有很多即时事务提交的服务器上提高写入磁盘的性能。根据经验来说,默认值可以满足大多数的情况。 + +## wal\_writer\_delay + +**参数说明:**WalWriter进程的写间隔时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果时间过长可能造成WAL缓冲区的内存不足,时间过短会引起WAL不断写入,增加磁盘I/O负担。 + +**取值范围**:整型, 1~10000(毫秒) + +**默认值:**200ms + +## commit\_delay + +**参数说明:**表示一个已经提交的数据在WAL缓冲区中存放的时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 设置为非 0 值时事务执行commit后不会立即写入WAL中,而仍存放在WAL缓冲区中,等待WalWriter进程周期性写入磁盘。 +>- 如果系统负载很高,在延迟时间内,其他事务可能已经准备好提交。但如果没有事务准备提交,这个延迟就是在浪费时间。 + +**取值范围**:整型, 0~100000(微秒),其中0表示无延迟。 + +**默认值:**0 + +## commit\_siblings + +**参数说明:**当一个事务发出提交请求时,如果数据库中正在执行的事务数量大于此参数的值,则该事务将等待一段时间([commit\_delay](#zh-cn_topic_0237124707_zh-cn_topic_0059778393_s4a63dd7d4d794286a990ae2123a328fd)的值),否则该事务则直接写入WAL。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型, 0~1000 + +**默认值:**5 + +## wal\_block\_size + +**参数说明:**说明WAL日志段文件中日志页面的大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围**:整型,单位为Byte。 + +**默认值:**8192 + +## wal\_segment\_size + +**参数说明:**说明WAL日志段文件的大小。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +**取值范围**:整型,单位为8KB。 + +**默认值:**16MB \(2048 \* 8KB\) + diff --git "a/content/zh/docs/Developerguide/\350\256\276\347\275\256\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\256\211\345\205\250\347\255\226\347\225\245.md" new file mode 100644 index 000000000..df15138f9 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\256\276\347\275\256\345\256\211\345\205\250\347\255\226\347\225\245.md" @@ -0,0 +1,9 @@ +# 设置安全策略 + +- **[设置帐户安全策略](设置帐户安全策略.md)** + +- **[设置帐号有效期](设置帐号有效期.md)** + +- **[设置密码安全策略](设置密码安全策略.md)** + + 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" new file mode 100644 index 000000000..edce2c41e --- /dev/null +++ "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" @@ -0,0 +1,518 @@ +# 设置密码安全策略 + +## 操作步骤 + +用户密码存储在系统表pg\_authid中,为防止用户密码泄露,openGauss对用户密码进行加密存储,所采用的加密算法由配置参数password\_encryption\_type决定。 + +- 当参数password\_encryption\_type设置为0时,表示采用md5方式对密码加密。md5为不安全的加密算法,不建议使用。 +- 当参数password\_encryption\_type设置为1时,表示采用sha256和md5方式对密码加密。其中包含md5为不安全的加密算法,不建议使用。 +- 当参数password\_encryption\_type设置为2时,表示采用sha256方式对密码加密,为默认配置。 + +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 password_encryption_type; + password_encryption_type + -------------------------- + 2 + (1 row) + ``` + + 如果显示结果为0或1,执行“\\q”命令退出数据库。 + +4. 执行如下命令将其设置为安全的加密算法。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_encryption_type=2" + ``` + + >![](public_sys-resources/icon-notice.gif) **须知:** + >为防止用户密码泄露,在执行CREATE USER/ROLE命令创建数据库用户时,不能指定UNENCRYPTED属性,即新创建的用户的密码只能是加密存储的。 + +5. 配置密码安全参数。 + + - 密码复杂度 + + 初始化数据库、创建用户、修改用户时需要指定密码。密码必须要符合复杂度([password\_policy](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s3db9d0a21a4d48b98ea4afc1f2e44626))的要求,否则会提示用户重新输入密码。 + + - 参数password\_policy设置为1时表示采用密码复杂度校验,默认值。 + - 参数password\_policy设置为0时表示不采用任何密码复杂度校验,设置为0会存在安全风险,不建议设置为0,即使需要设置也要将所有openGauss节点中的password\_policy都设置为0才能生效。 + + 配置password\_policy参数。 + + 1. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 2. 查看已配置的参数。 + + ``` + postgres=# SHOW password_policy; + password_policy + --------------------- + 1 + (1 row) + ``` + + 如果显示结果不为1,执行“\\q”命令退出数据库。 + + 3. 执行如下命令设置成默认值1。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_policy=1" + ``` + + 帐户密码的复杂度要求如下: + + - 包含大写字母(A-Z)的最少个数(password\_min\_uppercase) + - 包含小写字母(a-z)的最少个数(password\_min\_lowercase) + - 包含数字(0-9)的最少个数(password\_min\_digital) + - 包含特殊字符的最少个数(password\_min\_special)(特殊字符的列表请参见[表1](#zh-cn_topic_0237121110_zh-cn_topic_0151096202_zh-cn_topic_0085033092_zh-cn_topic_0059779155_t850059f5d3e64bc78857b77fc8ffbba8)) + - 密码的最小长度(password\_min\_length) + - 密码的最大长度(password\_max\_length) + - 至少包含上述四类字符中的三类。 + - 不能和用户名、用户名倒写相同,本要求为非大小写敏感。 + - 不能和当前密码、当前密码的倒写相同。 + + - 密码重用 + + 用户修改密码时,只有超过不可重用天数([password\_reuse\_time](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s36625909efc14a42af3e142435ae9794))或不可重用次数([password\_reuse\_max](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_scad28ae18dfc4557b10f51bf147a9e53))的密码才可以使用。参数配置说明如[表2](#zh-cn_topic_0237121110_zh-cn_topic_0151096202_zh-cn_topic_0085033092_zh-cn_topic_0059779155_t2013c9d251bc4cf5be274ef279c4faee)所示。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >不可重用天数默认值为60天,不可重用次数默认值是0。这两个参数值越大越安全,但是在使用过程中会带来不便,其默认值符合安全标准,用户可以根据需要重新设置参数,提高安全等级。 + + 配置password\_reuse\_time参数。 + + 1. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 2. 查看已配置的参数。 + + ``` + postgres=# SHOW password_reuse_time; + password_reuse_time + --------------------- + 60 + (1 row) + ``` + + 如果显示结果不为60,执行“\\q”命令退出数据库。 + + 3. 执行如下命令设置成默认值60。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >不建议设置为0,即使需要设置也要将所有openGauss节点中的password\_reuse\_time都设置为0才能生效。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_reuse_time=60" + ``` + + 配置password\_reuse\_max参数。 + + 1. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 2. 查看已配置的参数。 + + ``` + postgres=# SHOW password_reuse_max; + password_reuse_max + -------------------- + 0 + (1 row) + ``` + + 如果显示结果不为0,执行“\\q”命令退出数据库。 + + 3. 执行如下命令设置成默认值0。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_reuse_max = 0" + ``` + + - 密码有效期限 + + 数据库用户的密码都有密码有效期([password\_effect\_time](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_sfcc6124115734728917a548a8bd8f0d4)),当达到密码到期提醒天数([password\_notify\_time](安全和认证(postgresql-conf).md#zh-cn_topic_0237124696_zh-cn_topic_0059778664_s1beab889ab8d49848ef28bf60c10d8f7))时,系统会在用户登录数据库时提示用户修改密码。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >考虑到数据库使用特殊性及业务连续性,密码过期后用户还可以登录数据库,但是每次登录都会提示修改密码,直至修改为止。 + + 配置password\_effect\_time参数。 + + 1. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 2. 查看已配置的参数。 + + ``` + postgres=# SHOW password_effect_time; + password_effect_time + ---------------------- + 90 + (1 row) + ``` + + 如果显示结果不为90,执行“\\q”命令退出数据库。 + + 3. 执行如下命令设置成默认值90(不建议设置为0)。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_effect_time = 90" + ``` + + 配置password\_notify\_time参数。 + + 1. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 2. 查看已配置的参数。 + + ``` + postgres=# SHOW password_notify_time; + password_notify_time + ---------------------- + 7 + (1 row) + ``` + + 3. 如果显示结果不为7,执行如下命令设置成默认值7(不建议设置为0)。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_notify_time = 7" + ``` + + - 密码修改 + + - 在安装数据库时,会新建一个和初始化用户重名的操作系统用户,为了保证帐户安全,请定期修改操作系统用户的密码。 + + 以修改用户user1密码为例,命令格式如下: + + ``` + passwd user1 + ``` + + 根据提示信息完成修改密码操作。 + + - 建议系统管理员和普通用户都要定期修改自己的帐户密码,避免帐户密码被非法窃取。 + + 以修改用户user1密码为例,以系统管理员用户连接数据库并执行如下命令: + + ``` + postgres=# ALTER USER user1 IDENTIFIED BY "1234@abc" REPLACE "5678@def"; + ALTER ROLE + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >1234@abc、5678@def分别代表用户user1的新密码和原始密码,这些密码要符合规则,否则会执行失败。 + + - 管理员可以修改自己的或者其他帐户的密码。通过修改其他帐户的密码,解决用户密码遗失所造成无法登录的问题。 + + 以修改用户joe帐户密码为例,命令格式如下: + + ``` + postgres=# ALTER USER joe IDENTIFIED BY "abc@1234"; + ALTER ROLE + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 系统管理员之间不允许互相修改对方密码。 + >- 系统管理员可以修改普通用户密码且不需要用户原密码。 + >- 系统管理员修改自己密码但需要管理员原密码。 + + - 密码验证 + + 设置当前会话的用户和角色时,需要验证密码。如果输入密码与用户的存储密码不一致,则会报错。 + + 以设置用户joe为例,命令格式如下: + + ``` + postgres=# SET ROLE joe PASSWORD "abc@1234"; + ERROR: Invalid username/password,set role denied. + ``` + + **表 1** 特殊字符 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

编号

+

字符

+

编号

+

字符

+

编号

+

字符

+

编号

+

字符

+

1

+

~

+

9

+

*

+

17

+

|

+

25

+

<

+

2

+

+

10

+

(

+

18

+

[

+

26

+

.

+

3

+

@

+

11

+

)

+

19

+

{

+

27

+

>

+

4

+

#

+

12

+

-

+

20

+

}

+

28

+

/

+

5

+

$

+

13

+

_

+

21

+

]

+

29

+

+

6

+

%

+

14

+

=

+

22

+

+

-

+

-

+

7

+

^

+

15

+

+

+

23

+

+

-

+

-

+

8

+

&

+

16

+

\

+

24

+

+

-

+

-

+
+ + **表 2** 不可重用天数和不可重用次数参数说明 + + + + + + + + + + + + + + + + +

参数

+

取值范围

+

配置说明

+

不可重用天数(password_reuse_time)

+

正数或0,其中整数部分表示天数,小数部分可以换算成时,分,秒。

+

默认值为60。

+
  • 如果参数变小,则后续修改密码按新的参数进行检查。
  • 如果参数变大(比如由a变大为b),因为b天之前的历史密码可能已经删除,所以b天之前的密码仍有可能被重用。则后续修改密码按新的参数进行检查。
    说明:

    时间以绝对时间为准,历史密码记录的都是当时的时间,不识别时间的修改。

    +
    +
+

不可重用次数(password_reuse_max)

+

正整数或0。

+

默认值为0,表示不检查重用次数。

+
  • 如果参数变小,则后续修改密码按新的参数进行检查。
  • 如果参数变大(比如由a变大为b),因为b次之前的历史密码可能已经删除,所以b次之前的密码仍有可能被重用。则后续修改密码按新的参数进行检查。
+
+ + 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" new file mode 100644 index 000000000..c514fa947 --- /dev/null +++ "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" @@ -0,0 +1,57 @@ +# 设置帐号有效期 + +## 注意事项 + +创建新用户时,需要限制用户的操作期限(有效开始时间和有效结束时间)。 + +不在有效操作期内的用户需要重新设定帐号的有效操作期。 + +## 操作步骤 + +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=# CREATE USER joe WITH PASSWORD 'Bigdata@123' VALID BEGIN '2015-10-10 08:00:00' VALID UNTIL '2016-10-10 08:00:00'; + ``` + + 显示如下信息表示创建用户成功。 + + ``` + CREATE ROLE + ``` + +4. 用户已不在有效使用期内,需要重新设定帐号的有效期,这包括有效开始时间和有效结束时间。 + + ``` + postgres=# ALTER USER joe WITH VALID BEGIN '2016-11-10 08:00:00' VALID UNTIL '2017-11-10 08:00:00'; + ``` + + 显示如下信息表示重新设定成功。 + + ``` + ALTER ROLE + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>若在“CREATE ROLE”或“ALTER ROLE”语法中不指定“VALID BEGIN”,表示不对用户的开始操作时间做限定;若不指定“VALID UNTIL”,表示不对用户的结束操作时间做限定;若两者均不指定,表示该用户一直有效。 + 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" new file mode 100644 index 000000000..64d20584f --- /dev/null +++ "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" @@ -0,0 +1,133 @@ +# 设置帐户安全策略 + +## 背景信息 + +openGauss为帐户提供了自动锁定和解锁帐户、手动锁定和解锁异常帐户和删除不再使用的帐户等一系列的安全措施,保证数据安全。 + +## 自动锁定和解锁帐户 + +- 为了保证帐户安全,如果用户输入密码次数超过一定次数(failed\_login\_attempts),系统将自动锁定该帐户,默认值为10。次数设置越小越安全,但是在使用过程中会带来不便。 +- 当帐户被锁定时间超过设定值(password\_lock\_time),则当前帐户自动解锁,默认值为1天。时间设置越长越安全,但是在使用过程中会带来不便。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 参数password\_lock\_time的整数部分表示天数,小数部分可以换算成时、分、秒。 + >- 当failed\_login\_attempts设置为0时,表示不限制密码错误次数。当password\_lock\_time设置为0时,表示即使超过密码错误次数限制导致帐户锁定,也会在短时间内自动解锁。因此,只有两个配置参数都为正数时,才可以进行常规的密码失败检查、帐户锁定和解锁操作。 + >- 这两个参数的默认值都符合安全标准,用户可以根据需要重新设置参数,提高安全等级。建议用户使用默认值。 + + +配置failed\_login\_attempts参数。 + +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 failed_login_attempts; + failed_login_attempts + ----------------------- + 10 + (1 row) + ``` + + 如果显示结果不为10,执行“\\q”命令退出数据库。 + +4. 执行如下命令设置成默认值10。 + + ``` + gs_guc reload -Z coordinator -D /gaussdb/data/dbnode -c "failed_login_attempts=10" + ``` + + +配置password\_lock\_time参数。 + +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 password_lock_time; + password_lock_time + ----------------------- + 1 + (1 row) + ``` + + 如果显示结果不为1,执行“\\q”命令退出数据库。 + +4. 执行如下命令设置成默认值1。 + + ``` + gs_guc reload -Z coordinator -Z datanode -N all -I all -c "password_lock_time=1" + ``` + + +## 手动锁定和解锁帐户 + +若管理员发现某帐户被盗、非法访问等异常情况,可手动锁定该帐户。 + +当管理员认为帐户恢复正常后,可手动解锁该帐户。 + +以手动锁定和解锁用户joe为例,用户的创建请参见[用户](用户.md),命令格式如下: + +- 手动锁定 + + ``` + postgres=# ALTER USER joe ACCOUNT LOCK; + ALTER ROLE + ``` + +- 手动解锁 + + ``` + postgres=# ALTER USER joe ACCOUNT UNLOCK; + ALTER ROLE + ``` + + +## 删除不再使用的帐户 + +当确认帐户不再使用,管理员可以删除帐户。该操作不可恢复。 + +当删除的用户正处于活动状态时,此会话状态不会立马断开,用户在会话状态断开后才会被完全删除。 + +以删除帐户joe为例,命令格式如下: + +``` +postgres=# DROP USER joe CASCADE; +DROP ROLE +``` + 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" new file mode 100644 index 000000000..8702bd2b5 --- /dev/null +++ "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" @@ -0,0 +1,11 @@ +# 设置数据库审计 + +- **[审计概述](审计概述.md)** + +- **[查看审计结果](查看审计结果.md)** + +- **[维护审计日志](维护审计日志.md)** + +- **[设置文件权限安全策略](设置文件权限安全策略-9.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" new file mode 100644 index 000000000..7b7c5ca7d --- /dev/null +++ "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" @@ -0,0 +1,211 @@ +# 设置文件权限安全策略 + +## 背景信息 + +数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置。其权限规则如下: + +- 数据库程序目录的权限为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" new file mode 100644 index 000000000..1f7742325 --- /dev/null +++ "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" @@ -0,0 +1,169 @@ +# 设置文件权限安全策略 + +## 背景信息 + +数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置。其权限规则如下: + +- 数据库程序目录的权限为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

+

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

+

archive_status

+

pg_xlog

+

0700

+

libpq.so.5.5

+

lib

+

0600

+
+ +## 建议 + +数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置,适合大多数情况下的权限要求。如果用户产品对相关权限有特殊要求,建议用户安装后定期检查相关权限设置,确保完全符合产品要求。 + 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" new file mode 100644 index 000000000..72ffec9a5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242-8.md" @@ -0,0 +1,62 @@ +# 证书替换 + +## 操作场景 + +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" new file mode 100644 index 000000000..3c90f8be8 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\346\233\277\346\215\242.md" @@ -0,0 +1,62 @@ +# 证书替换 + +## 操作场景 + +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\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" new file mode 100644 index 000000000..62727ed6d --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220-7.md" @@ -0,0 +1,269 @@ +# 证书生成 + +## 操作场景 + +在测试环境下,用户可以用通过以下方式进行数字证书测试。在客户的运行环境中,请使用从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" new file mode 100644 index 000000000..be9c79eba --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\201\344\271\246\347\224\237\346\210\220.md" @@ -0,0 +1,269 @@ +# 证书生成 + +## 操作场景 + +在测试环境下,用户可以用通过以下方式进行数字证书测试。在客户的运行环境中,请使用从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\215\345\205\270.md" "b/content/zh/docs/Developerguide/\350\257\215\345\205\270.md" new file mode 100644 index 000000000..9db3e92fb --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\215\345\205\270.md" @@ -0,0 +1,17 @@ +# 词典 + +- **[词典概述](词典概述.md)** + +- **[停用词](停用词.md)** + +- **[Simple词典](Simple词典.md)** + +- **[Synonym词典](Synonym词典.md)** + +- **[Thesaurus词典](Thesaurus词典.md)** + +- **[Ispell词典](Ispell词典.md)** + +- **[Snowball词典](Snowball词典.md)** + + 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" new file mode 100644 index 000000000..4514e863d --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\246\202\350\277\260.md" @@ -0,0 +1,33 @@ +# 词典概述 + +词典用于定义停用词(stop words),即全文检索时不搜索哪些词。 + +词典还可以用于对同一词的不同形式进行规范化,这样同一个词的不同派生形式都可以进行匹配。规范化后的词称为词位(lexeme)。 + +除了提高检索质量外,词的规范化和删除停用词可以减少文档tsvector格式的大小, 从而提高性能。词的规范化和删除停用词并不总是具有语言学意义,用户可以根据应用环境在词典定义文件中自定义规范化和删除规则。 + +一个词典是一个程序,接收标记(token)作为输入,并返回: + +- 如果token在词典中已知,返回对应lexeme数组(注意,一个标记可能对应多个lexeme)。 + +- 一个lexeme。(该lexeme为设置了TSL\_FILTER标志的lexeme,TSL\_FILTER标志为过滤词典内部自动设置,用户不感知。)一个新token会代替输入token被传递给后继词典(当前词典可被称为过滤词典)。 +- 如果token在词典中已知,但它是一个停用词,返回空数组。 + +- 如果词典不能识别输入的token,返回NULL。 + + +openGauss提供了多种语言的预定义字典,同时提供了五种预定义的词典模板,分别是Simple,Synonym,Thesaurus,Ispell,和Snowball,可用于创建自定义参数的新词典。 + +在使用全文检索时,建议用户: + +- 可以在文本搜索配置中定义一个解析器,以及一组用于处理该解析器的输出标记词典。对于解析器返回的每个标记类型,可以在配置中指定不同的词典列表进行处理。当解析器输出一种类型的标记后,在对应列表的每个字典中会查阅该标记,直到某个词典识别它。如果它被识别为一个停用词, 或者没有任何词典识别,该token将被丢弃,即不被索引或检索到。通常情况下,第一个返回非空结果的词典决定了最终结果,后继词典将不会继续处理。但是一个过滤类型的词典可以依据规则替换输入token,然后将替换后的token传递给后继词典进行处理。 +- 配置字典列表的一般规则是,第一个位置放置一个应用范围最小的、最具体化定义的词典,其次是更一般化定义的词典, 最后是一个普适定义的词典,比如Snowball词干词典或Simple词典。在下面例子中,对于一个针对天文学的文本搜索配置astro\_en,可以定义标记类型asciiword(ASCII词)对应的词典列表为:天文术语的Synonym同义词词典, Ispell英语词典和Snowball 英语词干词典。 + + ``` + postgres=# ALTER TEXT SEARCH CONFIGURATION astro_en + ADD MAPPING FOR asciiword WITH astro_syn, english_ispell, english_stem; + ``` + + 过滤类型的词典可以放置在词典列表中除去末尾的任何地方,放置在末尾时是无效的。使用这些词典对标记进行部分规范化,可以有效简化后继词典的处理。 + + diff --git "a/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\265\213\350\257\225.md" "b/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\265\213\350\257\225.md" new file mode 100644 index 000000000..4a3ff27ce --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\215\345\205\270\346\265\213\350\257\225.md" @@ -0,0 +1,23 @@ +# 词典测试 + +函数ts\_lexize用于进行词典测试。 + +ts\_lexize\(dict regdictionary, token text\) returns text\[\]如果输入的token可以被词典识别,那么ts\_lexize返回词素的数组;如果token可以被词典识别到它是一个停用词,则返回空数组;如果是一个不可识别的词则返回NULL。 + +比如: + +``` +postgres=# SELECT ts_lexize('english_stem', 'stars'); + ts_lexize +----------- + {star} + +postgres=# SELECT ts_lexize('english_stem', 'a'); + ts_lexize +----------- + {} +``` + +>![](public_sys-resources/icon-notice.gif) **须知:** +>ts\_lexize函数支持单一token,不支持文本。 + 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" new file mode 100644 index 000000000..14d07e9d0 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\257\255\345\217\245\350\241\214\344\270\272.md" @@ -0,0 +1,248 @@ +# 语句行为 + +介绍SQL语句执行过程的相关默认参数。 + +## search\_path + +**参数说明:**当一个被引用对象没有指定模式时,此参数设置模式搜索顺序。它的值由一个或多个模式名构成,不同的模式名用逗号隔开。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +- 当前会话如果存放临时表的模式时,可以使用别名pg\_temp将它列在搜索路径中,如'pg\_temp,public' 。 存放临时表的模式始终会作为第一个被搜索的对象,排在pg\_catalog和search\_path中所有模式的前面,即具有第一搜索优先级。建议用户不要在search\_path中显示设置pg\_temp。如果在search\_path中指定了pg\_temp,但不是在最前面,系统会提示设置无效,pg\_temp仍被优先搜索。通过使用别名pg\_temp,系统只会在存放临时表的模式中搜索表、视图和数据类型这样的数据库对象,不会在里面搜索函数或运算符这样的数据库对象。 +- 系统表所在的模式pg\_catalog,总是排在search\_path中指定的所有模式前面被搜索,即具有第二搜索优先级(pg\_temp具有第一搜索优先级)。建议用户不要在search\_path中显式设置pg\_catalog。如果在search\_path中指定了pg\_catalog,但不是在最前面,系统会提示设置无效,pg\_catalog仍被第二优先搜索。 +- 当没有指定一个特定模式而创建一个对象时,它们被放置到以search\_path为命名的第一个有效模式中。当搜索路径为空时,会报错误。 +- 通过SQL函数current\_schema可以检测当前搜索路径的有效值。这和检测search\_path的值不尽相同,因为current\_schema显示search\_path中首位有效的模式名称。 + +**取值范围:**字符串 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 设置为"$user",public时,支持共享数据库(没有用户具有私有模式和所有共享使用public),用户私有模式和这些功能的组合使用。可以通过改变默认搜索路径来获得其他效果,无论是全局化的还是私有化的。 +>- 设置为空串('')的时候,系统会自动转换成一对双引号。 +>- 设置的内容中包含双引号,系统会认为是不安全字符,会将每个双引号转换成一对双引号。 + +**默认值:**"$user",public + +>![](public_sys-resources/icon-note.gif) **说明:** +>$user表示与当前会话用户名同名的模式名,如果这样的模式不存在,$user将被忽略。 + +## current\_schema + +**参数说明:**此参数设置当前的模式。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串 + +**默认值:**"$user",public + +>![](public_sys-resources/icon-note.gif) **说明:** +>$user表示与当前会话用户名同名的模式名,如果这样的模式不存在,$user将被忽略。 + +## default\_tablespace + +**参数说明:**当CREATE命令没有明确声明表空间时,所创建对象\(表和索引等\)的缺省表空间。 + +- 值是一个表空间的名称或者一个表示使用当前数据库缺省表空间的空字符串。若指定的是一个非默认表空间,用户必须具有它的CREATE权限,否则尝试创建会失败。 +- 临时表不使用此参数,可以用[temp\_tablespaces](#zh-cn_topic_0237124732_zh-cn_topic_0059779117_sd5bfdc9f2696411894b2912cf3f23fcc)代替。 +- 创建数据库时不使用此参数。默认情况下,一个新的数据库从模板数据库继承表空间配置。 + + 该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**字符串,其中空表示使用默认表空间。 + +**默认值:**空 + +## default\_storage\_nodegroup + +**参数说明:**此参数设置当前的默认建表所在的Node Group,目前只适用普通表。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +- 值为“installation”表示建表会默认建在安装的Node Group上。 +- 值为其他字符串表示建表会默认建在设置的Node Group上。 + +**取值范围:**字符串 + +**默认值:**installation + +## temp\_tablespaces + +**参数说明:**当一个CREATE命令没有明确指定一个表空间时,temp\_tablespaces指定了创建临时对象(临时表和临时表的索引)所在的表空间。在这些表空间中创建临时文件用来做大型数据的排序工作。 + +其值是一系列表空间名的列表。如果列表中有多个表空间时,每次临时对象的创建,openGauss会在列表中随机选择一个表空间;如果在事务中,连续创建的临时对象被放置在列表里连续的表空间中。如果选择的列表中的元素是一个空串,openGauss将自动将当前的数据库设为默认的表空间。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**字符串。空字符串表示所有的临时对象仅在当前数据库默认的表空间中创建,请参见[default\_tablespace](#zh-cn_topic_0237124732_zh-cn_topic_0059779117_sa058ceea3c3142f0a8a40b5799a682d3)。 + +**默认值:**空 + +## check\_function\_bodies + +**参数说明:**设置是否在CREATE FUNCTION执行过程中进行函数体字符串的合法性验证。为了避免产生问题(比如避免从转储中恢复函数定义时向前引用的问题),偶尔会禁用验证。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示在CREATE FUNCTION执行过程中进行函数体字符串的合法性验证。 +- off表示在CREATE FUNCTION执行过程中不进行函数体字符串的合法性验证。 + +**默认值:**on + +## default\_transaction\_isolation + +**参数说明:**设置默认的事务隔离级别。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- read uncommitted表示隔离级别是读未提交。 +- read committed表示事务读已提交。 +- repeatable read表示事务可重复读。 +- serializable,openGauss目前功能上不支持此隔离级别,等价于repeatable read。 + +**默认值:**read committed + +## default\_transaction\_read\_only + +**参数说明:**设置每个新创建事务是否是只读状态。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示只读状态。 +- off表示非只读状态。 + +**默认值:**off + +## default\_transaction\_deferrable + +**参数说明:**控制每个新事务的默认延迟状态。只读事务或者那些比序列化更加低的隔离级别的事务除外。 + +openGauss不支持可串行化的隔离级别,因此,该参数无实际意义。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示默认延迟。 +- off表示默认不延迟。 + +**默认值:**off + +## session\_replication\_role + +**参数说明:**控制当前会话与复制相关的触发器和规则的行为。 + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置此参数会丢弃之前任何缓存的执行计划。 + +**取值范围:**枚举类型 + +- origin表示从当前会话中复制插入、删除、更新等操作。 +- replica表示从其他地方复制插入、删除、更新等操作到当前会话。 +- local表示函数执行复制时会检测当前登录数据库的角色并采取相应的操作。 + +**默认值:**origin + +## statement\_timeout + +**参数说明:**当语句执行时间超过该参数设置的时间(从服务器收到命令时开始计时)时,该语句将会报错并退出执行。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2147483648,单位为毫秒。 + +**默认值:**0 + +## vacuum\_freeze\_min\_age + +**参数说明:**指定VACUUM在扫描一个表时用于判断是否用FrozenXID替换事务ID的中断寿命\(在同一个事务中\)。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0~576 460 752 303 423 487 + +>![](public_sys-resources/icon-note.gif) **说明:** +>尽管随时可以将此参数设为0到10亿之间的任意值,但是,VACUUM将默认其有效值范围限制在[autovacuum\_freeze\_max\_age](自动清理.md#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s7857d2d0002547a3853b7aac36a458b3)的50%以内。 + +**默认值:**5000000000 + +## vacuum\_freeze\_table\_age + +**参数说明:**指定VACUUM对全表的扫描冻结元组的时间。如果表的pg\_class.relfrozenxid字段的值已经达到了参数指定的时间,VACUUM对全表进行扫描。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0~576 460 752 303 423 487 + +>![](public_sys-resources/icon-note.gif) **说明:** +>尽管随时可以将此参数设为零到20亿之间的值,但是,VACUUM将默认其有效值范围限制在[autovacuum\_freeze\_max\_age](自动清理.md#zh-cn_topic_0237124730_zh-cn_topic_0059778244_s7857d2d0002547a3853b7aac36a458b3)的95%以内。定期的手动VACUUM可以在对此表的反重叠自动清理启动之前运行。 + +**默认值:**15000000000 + +## bytea\_output + +**参数说明:**设置bytea类型值的输出格式。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- hex:将二进制数据编码为每字节2位十六进制数字。 +- escape:传统化的PostgreSQL格式。采用以ASCII字符序列表示二进制串的方法,同时将那些无法表示成ASCII字符的二进制串转换成特殊的转义序列。 + +**默认值:**hex + +## xmlbinary + +**参数说明:**设置二进制值是如何在XML中进行编码的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- base64 +- hex + +**默认值:**base64 + +## xmloption + +**参数说明:**当XML和字符串值之间进行转换时,设置document或content是否是隐含的。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**枚举类型 + +- document:表示HTML格式的文档。 +- content:普通的字符串。 + +**默认值:**content + +## max\_compile\_functions + +**参数说明:**设置服务器存储的函数编译结果的最大数量。存储过多的函数和存储过程的编译结果可能占用很大内存。将此参数设置为一个合理的值,有助于减少内存占用,提升系统性能。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,取值必须大于等于1。 + +**默认值:**1000 + +## gin\_pending\_list\_limit + +**参数说明:**设置当GIN索引启用fastupdate时,pending list容量的最大值。当pending list的容量大于设置值时,会把pending list中数据批量移动到GIN索引数据结构中以进行清理。单个GIN索引可通过更改索引存储参数覆盖此设置值。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为64,最大值为INT\_MAX,单位为KB。 + +**默认值:**4MB + 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" new file mode 100644 index 000000000..864cb5dc2 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\264\237\350\275\275\347\256\241\347\220\206.md" @@ -0,0 +1,376 @@ +# 负载管理 + +未对数据库资源做控制时,容易出现并发任务抢占资源导致操作系统过载甚至最终崩溃。操作系统过载时,其响应用户任务的速度会变慢甚至无响应;操作系统崩溃时,整个系统将无法对用户提供任何服务。openGauss的负载管理功能能够基于可用资源的多少均衡数据库的负载,以避免数据库系统过载。 + +## use\_workload\_manager + +参数说明:是否开启资源管理功能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示打开资源管理。 +- off表示关闭资源管理。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 当使用[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中的方式二来修改参数值时,新参数值只能对更改操作执行后启动的线程生效。此外,对于后台线程以及线程复用执行的新作业,该参数值的改动不会生效。如果希望这类线程即时识别参数变化,可以使用kill session或重启节点的方式来实现。 + >- use\_workload\_manager参数由off变为on状态后,不会统计off时的存储资源。如果需要统计off时用户使用的存储资源,请在数据库中执行以下命令: + > ``` + > select gs_wlm_readjust_user_space(0); + > ``` + + +**默认值:**on + +## cgroup\_name + +**参数说明:**设置当前使用的Cgroups的名称或者调整当前group下排队的优先级。 + +即如果先设置cgroup\_name,再设置session\_respool,那么session\_respool关联的控制组起作用,如果再切换cgroup\_name,那么新切换的cgroup\_name起作用。 + +切换cgroup\_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +建议尽量不要混合使用cgroup\_name和session\_respool。 + +**取值范围**:字符串 + +**默认值:**DefaultClass:Medium + +>![](public_sys-resources/icon-note.gif) **说明:** +>DefaultClass:Medium表示DefaultClass下Timeshare控制组中的Medium控制组。 + +## cpu\_collect\_timer + +**参数说明:**设置语句执行时在数据库节点上收集CPU时间的周期。 + +数据库管理员需根据系统资源(如CPU资源、IO资源和内存资源)情况,调整此数值大小,使得系统支持较合适的收集周期,太小会影响执行效率,太大会影响异常处理的精确度。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1 ~ INT\_MAX, 单位为秒。 + +**默认值:**30 + +## memory\_tracking\_mode + +**参数说明:**设置记录内存信息的模式。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**: + +- none,不启动内存统计功能。 +- normal,仅做内存实时统计,不生成文件。 +- executor,生成统计文件,包含执行层使用过的所有已分配内存的上下文信息。 +- fullexec,生成文件包含执行层申请过的所有内存上下文信息。 + +**默认值:**none + +## memory\_detail\_tracking + +**参数说明:**设置需要的线程内分配内存上下文的顺序号以及当前线程所在query的plannodeid。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符型 + +**默认值:**空 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>该参数不允许用户进行设置,建议保持默认值。 + +## enable\_resource\_track + +参数说明:是否开启资源实时监控功能。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示打开资源监控。 +- off表示关闭资源监控。 + +**默认值:**on + +## 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)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启资源监控记录归档功能。 +- off表示关闭资源监控记录归档功能。 + +**默认值:**off + +## enable\_logical\_io\_statistics + +**参数说明:**设置是否开启资源监控逻辑IO统计功能。开启时,对于PG\_TOTAL\_USER\_RESOURCE\_INFO视图中的read\_kbytes、write\_kbytes、read\_counts、write\_counts、read\_speed和write\_speed字段,会统计对应用户的逻辑读写字节数、次数以及速率。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启资源监控逻辑IO统计功能。 +- off表示关闭资源监控逻辑IO统计功能。 + +**默认值:**on + +## enable\_user\_metric\_persistent + +参数说明:设置是否开启用户历史资源监控转存功能。开启时,对于PG\_TOTAL\_USER\_RESOURCE\_INFO视图中数据,会定期采样保存到[GS\_WLM\_USER\_RESOURCE\_HISTORY](GS_WLM_USER_RESOURCE_HISTORY.md)系统表中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +取值范围:布尔型 + +● on表示开启用户历史资源监控转存功能。 + +● off表示关闭用户历史资源监控转存功能。 + +默认值:on + +## user\_metric\_retention\_time + +参数说明:设置用户历史资源监控数据的保存天数。该参数仅在 enable\_user\_metric\_persistent为on时有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +取值范围:整型,0 ~ 730,单位为天。 + +● 值等于0时,用户历史资源监控数据将永久保存。 + +● 值大于0时,用户历史资源监控数据将保存对应天数。 + +默认值:7 + +## enable\_instance\_metric\_persistent + +**参数说明:**设置是否开启实例资源监控转存功能。开启时,对实例的监控数据会保存到[GS\_WLM\_INSTANCE\_HISTORY](GS_WLM_INSTANCE_HISTORY.md)系统表中。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示开启实例资源监控转存功能。 +- off表示关闭实例资源监控转存功能。 + +**默认值:**on + +## instance\_metric\_retention\_time + +**参数说明:**设置实例历史资源监控数据的保存天数。该参数仅在enable\_instance\_metric\_persistent为on时有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0 ~3650,单位为天。 + +- 值等于0时,实例历史资源监控数据将永久保存。 +- 值大于0时,实例历史资源监控数据将保存对应设置天数。 + +**默认值:**7 + +## resource\_track\_level + +**参数说明:**设置当前会话的资源监控的等级。该参数只有当参数enable\_resource\_track为on时才有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:枚举型 + +- none,不开启资源监控功能。 +- query,开启query级别资源监控功能。 +- operator,开启query级别和算子级别资源监控功能。 + +**默认值:**query + +## resource\_track\_cost + +**参数说明:**设置对当前会话的语句进行资源监控的最小执行代价。该参数只有当参数enable\_resource\_track为on时才有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-1 ~ INT\_MAX + +- 值为-1时,不进行资源监控。 +- 值大于或等于0时,值大于或等于0且小于等于9时,对执行代价大于等于10的语句进行资源监控。 +- 值大于或等于10时,对执行代价超过该参数值的语句进行资源监控。 + +**默认值:**100000 + +## resource\_track\_duration + +**参数说明:**设置资源监控实时视图中记录的语句执行结束后进行历史信息转存的最小执行时间。当执行完成的作业,其执行时间不小于此参数值时,作业信息会从实时视图(以statistics为后缀的视图)转存到相应的历史视图(以history为后缀的视图)中。该参数只有当[enable\_resource\_track](#zh-cn_topic_0237124729_zh-cn_topic_0059777791_sb8ca264785d649368247597883d52ffd)为on时才有效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,0 ~ INT\_MAX,单位为秒。 + +- 值为0时,资源监控实时视图中记录的所有语句都进行历史信息归档。 +- 值大于0时,资源监控实时视图中记录的语句的执行时间超过这个值就会进行历史信息归档。 + +**默认值:**1min + +## disable\_memory\_protect + +**参数说明:**禁止内存保护功能。当系统内存不足时如果需要查询系统视图,可以先将此参数置为on,禁止内存保护功能,保证视图可以正常查询。该参数只适用于在系统内存不足时进行系统诊断和调试,正常运行时请保持该参数配置为off。 + +该参数属于USERSET类型参数,且只对当前会话有效。请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +**取值范围**:布尔型 + +- on表示禁止内存保护功能。 +- off表示启动内存保护功能。 + +**默认值:**off + +## query\_band + +**参数说明:**用于标示当前会话的作业类型,由用户自定义。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符型 + +**默认值:**空 + +## enable\_bbox\_dump + +**参数说明**:是否开启黑匣子功能,在系统不配置core机制的时候仍可产生core文件。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- on表示打开黑匣子功能。 +- off表示关闭黑匣子功能。 + +**默认值:**off + +## bbox\_dump\_count + +**参数说明:**在[bbox\_dump\_path](#zh-cn_topic_0237124729_zh-cn_topic_0059777791_s4fe2520e9c914f1293e1f9314db2d519)定义的路径下,允许存储的openGauss所产生core文件最大数。超过此数量,旧的core文件会被删除。此参数只有当[enable\_bbox\_dump](#zh-cn_topic_0237124729_zh-cn_topic_0059777791_section10758942101117)为on时才生效。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,1~20 + +**默认值:**8 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在并发产生core文件时,core文件的产生个数可能大于bbox\_dump\_count。 + +## bbox\_dump\_path + +**参数说明:**黑匣子core文件的生成路径。此参数只有当[enable\_bbox\_dump](#zh-cn_topic_0237124729_zh-cn_topic_0059777791_section10758942101117)为on时才生效。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:字符型 + +**默认值:**空。默认生成黑匣子core文件的路径为读取/proc/sys/opengauss/core\_pattern下的路径,如果这个路径不是一个目录,或者用户对此目录没有写权限,黑匣子core文件将生成在数据库的data目录下。或者以安装时指定的目录为准。 + +## io\_limits + +**参数说明**:每秒触发IO的上限。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +**取值范围**:整型,0~1073741823 + +**默认值:**0 + +## io\_priority + +**参数说明**:IO利用率高达50%时,重消耗IO作业进行IO资源管控时关联的优先级等级。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +**取值范围**:枚举型 + +- None: 表示不受控。 +- Low: 表示限制iops为该作业原始触发数值的10%。 +- Medium: 表示限制iops为该作业原始触发数值的20%。 +- High: 表示限制iops为该作业原始触发数值的50%。 + +**默认值:**None + +## io\_control\_unit + +**参数说明**:行存场景下,io管控时用来对io次数进行计数的单位。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +记多少次io触发为一计数单位,通过此计数单位所记录的次数进行io管控。 + +**取值范围**:整型,1000\~1000000 + +**默认值:**6000 + +## session\_respool + +**参数说明**:当前的session关联的resource pool。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中方式三的方法进行设置。 + +即如果先设置cgroup\_name,再设置session\_respool,那么session\_respool关联的控制组起作用,如果再切换cgroup\_name,那么新切换的cgroup\_name起作用。 + +切换cgroup\_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 + +建议尽量不要混合使用cgroup\_name和session\_respool。 + +**取值范围**:string类型,通过create resource pool所设置的资源池。 + +**默认值:**invalid\_pool + +## session\_statistics\_memory + +**参数说明**:设置实时查询视图的内存大小。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,5 \* 1024 ~ max\_process\_memory的50%,单位KB。 + +**默认值:**5MB + +## topsql\_retention\_time + +**参数说明**:设置历史TopSQL中gs\_wlm\_session\_query\_info\_all和gs\_wlm\_operator\_info表中数据 的保存时间。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +取值范围:整型,0 \~ 730,单位为天。 + +- 值为0时,表示数据永久保存。 +- 值大于0时,表示数据能够保存的对应天数。 + +默认值:0 + +## session\_history\_memory + +**参数说明**:设置历史查询视图的内存大小。 + +该参数属于SIGHUP类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,10 \* 1024 ~ max\_process\_memory的50%,单位KB。 + +**默认值:**10MB + +## transaction\_pending\_time + +**参数说明**:事务块语句和存储过程语句排队的最大时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:整型,-1 ~ INT\_MAX/2,单位为秒。 + +- 值为-1或0:事务块语句和存储过程语句无超时判断,排队至资源满足可执行条件。 +- 值大于0:事务块语句和存储过程语句排队超过所设数值的时间后,无视当前资源情况强制执行。 + +**默认值:**0 + diff --git "a/content/zh/docs/Developerguide/\350\264\247\345\270\201\347\261\273\345\236\213.md" "b/content/zh/docs/Developerguide/\350\264\247\345\270\201\347\261\273\345\236\213.md" new file mode 100644 index 000000000..c99f2b1d5 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\264\247\345\270\201\347\261\273\345\236\213.md" @@ -0,0 +1,47 @@ +# 货币类型 + +货币类型存储带有固定小数精度的货币金额。 + +[表1](#zh-cn_topic_0237121928_zh-cn_topic_0059778615_t7ceeb3b97d5d489a84770f824d7e017b)中显示的范围假设有两位小数。可以以任意格式输入,包括整型、浮点型或者典型的货币格式(如“$1,000.00”)。根据区域字符集,输出一般是最后一种形式。 + +**表 1** 货币类型 + + + + + + + + + + + + + + +

名称

+

存储容量

+

描述

+

范围

+

money

+

8 字节

+

货币金额

+

-92233720368547758.08 到 +92233720368547758.07

+
+ +numeric,int和bigint类型的值可以转化为money类型。如果从real和double precision类型转换到money类型,可以先转化为numeric类型,再转化为money类型,例如: + +``` +postgres=# SELECT '12.34'::float8::numeric::money; +``` + +这种用法是不推荐使用的。浮点数不应该用来处理货币类型,因为小数点的位数可能会导致错误。 + +money类型的值可以转换为numeric类型而不丢失精度。转换为其他类型可能丢失精度,并且必须通过以下两步来完成: + +``` +postgres=# SELECT '52093.89'::money::numeric::float8; +``` + +当一个money类型的值除以另一个money类型的值时,结果是double precision(也就是,一个纯数字,而不是money类型);在运算过程中货币单位相互抵消。 + 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" new file mode 100644 index 000000000..0d2973e1e --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\265\204\346\272\220\346\266\210\350\200\227.md" @@ -0,0 +1,15 @@ +# 资源消耗 + +- **[内存](内存.md)** + +- **[磁盘空间](磁盘空间.md)** + +- **[内核资源使用](内核资源使用.md)** + +- **[基于开销的清理延迟](基于开销的清理延迟.md)** + +- **[后端写进程](后端写进程.md)** + +- **[异步IO](异步IO.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" "b/content/zh/docs/Developerguide/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" new file mode 100644 index 000000000..50b63e773 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\220\350\241\214\346\227\266\347\273\237\350\256\241.md" @@ -0,0 +1,7 @@ +# 运行时统计 + +- **[查询和索引统计收集器](查询和索引统计收集器.md)** + +- **[性能统计](性能统计.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\277\224\345\233\236\351\233\206\345\220\210\347\232\204\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\350\277\224\345\233\236\351\233\206\345\220\210\347\232\204\345\207\275\346\225\260.md" new file mode 100644 index 000000000..0f9c84ff4 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\224\345\233\236\351\233\206\345\220\210\347\232\204\345\207\275\346\225\260.md" @@ -0,0 +1,130 @@ +# 返回集合的函数 + +## 序列号生成函数 + +- generate\_series\(start, stop\) + + 描述:生成一个数值序列,从start到stop,步长为1。 + + 参数类型:int、bigint、numeric + + 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) + +- generate\_series\(start, stop, step\) + + 描述:生成一个数值序列,从start到stop,步长为step。 + + 参数类型:int、bigint、numeric + + 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) + +- generate\_series\(start, stop, step interval\) + + 描述:生成一个数值序列,从start到stop,步长为step。 + + 参数类型:timestamp或timestamp with time zone + + 返回值类型:setof timestamp或setof timestamp with time zone(与参数类型相同) + + +如果step是正数且start大于stop,则返回零行。相反,如果step是负数且start小于stop,则也返回零行。如果输入是NULL,同样产生零行。如果step为零则是一个错误。 + +示例: + +``` +postgres=# SELECT * FROM generate_series(2,4); + generate_series +----------------- + 2 + 3 + 4 +(3 rows) + +postgres=# SELECT * FROM generate_series(5,1,-2); + generate_series +----------------- + 5 + 3 + 1 +(3 rows) + +postgres=# SELECT * FROM generate_series(4,3); + generate_series +----------------- +(0 rows) + +--这个示例应用于date-plus-integer操作符。 +postgres=# SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a); + dates +------------ + 2017-06-02 + 2017-06-09 + 2017-06-16 +(3 rows) + +postgres=# SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, '2008-03-04 12:00', '10 hours'); + generate_series +--------------------- + 2008-03-01 00:00:00 + 2008-03-01 10:00:00 + 2008-03-01 20:00:00 + 2008-03-02 06:00:00 + 2008-03-02 16:00:00 + 2008-03-03 02:00:00 + 2008-03-03 12:00:00 + 2008-03-03 22:00:00 + 2008-03-04 08:00:00 +(9 rows) +``` + +## 下标生成函数 + +- generate\_subscripts\(array anyarray, dim int\) + + 描述:生成一系列包括给定数组的下标。 + + 返回值类型:setof int + +- generate\_subscripts\(array anyarray, dim int, reverse boolean\) + + 描述:生成一系列包括给定数组的下标。当reverse为真时,该系列则以相反的顺序返回。 + + 返回值类型:setof int + + +generate\_subscripts是一个为给定数组中的指定维度生成有效下标集的函数。如果数组中没有所请求的维度或者NULL数组,返回零行(但是会给数组元素为空的返回有效下标)。示例: + +``` +--基本用法。 +postgres=# SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s; + s +--- + 1 + 2 + 3 + 4 +(4 rows) +``` + +``` +--unnest一个2D数组。 +postgres=# CREATE OR REPLACE FUNCTION unnest2(anyarray) +RETURNS SETOF anyelement AS $$ +SELECT $1[i][j] + FROM generate_subscripts($1,1) g1(i), + generate_subscripts($1,2) g2(j); +$$ LANGUAGE sql IMMUTABLE; + +postgres=# SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]); + unnest2 +--------- + 1 + 2 + 3 + 4 +(4 rows) + +--删除函数。 +postgres=# DROP FUNCTION unnest2; +``` + diff --git "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" new file mode 100644 index 000000000..ce66550fe --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\345\222\214\350\256\244\350\257\201.md" @@ -0,0 +1,9 @@ +# 连接和认证 + +- **[连接设置](连接设置.md)** + +- **[安全和认证(postgresql.conf)](安全和认证(postgresql-conf).md)** + +- **[通信库参数](通信库参数.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..355293eda --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,16 @@ +# 连接数据库 + +连接数据库的客户端工具包括gsql、应用程序接口(如ODBC和JDBC)。 + +- gsql是openGauss自带的客户端工具。[使用gsql连接](使用gsql连接.md)数据库,可以交互式地输入、编辑、执行SQL语句。 +- 用户可以使用标准的数据库[应用程序接口](应用程序接口.md)(如ODBC和JDBC),开发基于openGauss的应用程序。 + +- **[确认连接信息](确认连接信息.md)** + +- **[配置服务端远程连接](配置服务端远程连接.md)** + +- **[使用gsql连接](使用gsql连接.md)** + +- **[应用程序接口](应用程序接口.md)** + + diff --git "a/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\261\240\345\217\202\346\225\260.md" "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\261\240\345\217\202\346\225\260.md" new file mode 100644 index 000000000..9a852bc63 --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\346\261\240\345\217\202\346\225\260.md" @@ -0,0 +1,37 @@ +# 连接池参数 + +当使用连接池访问数据库时,在系统运行过程中,数据库连接是被当作对象存储在内存中的,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接来使用。用户使用完毕后,数据库并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。 + +## pooler\_maximum\_idle\_time + +**参数说明:**Pooler链接自动清理功能使用,当链接池中链接空闲时间超过所设置值时,会触发自动清理机制,清理各节点的空闲链接数到minimum\_pool\_size。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为INT\_MAX,最小单位为分钟 + +**默认值:**1h(即60min) + +## minimum\_pool\_size + +**参数说明:**Pooler链接自动清理功能使用,自动清理后各pooler链接池对应节点的链接数最小剩余量,当参数设置为0时,可以关闭pooler链接自动清理功能。 + +该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为1,最大值为65535 + +**默认值:**200 + +## cache\_connection + +**参数说明:**是否回收连接池的连接。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示回收连接池的连接。 +- off表示不回收连接池的连接。 + +**默认值:**on + 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" new file mode 100644 index 000000000..a008f394f --- /dev/null +++ "b/content/zh/docs/Developerguide/\350\277\236\346\216\245\350\256\276\347\275\256.md" @@ -0,0 +1,143 @@ +# 连接设置 + +介绍设置客户端和服务器连接方式相关的参数。 + +## listen\_addresses + +**参数说明:**声明服务器监听客户端的TCP/IP地址。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:** + +- 主机名或IP地址,多个值之间用英文逗号分隔。 +- 星号“\*”或“0.0.0.0”表示监听所有IP地址。配置监听所有IP地址存在安全风险,不推荐用户使用。必须与有效地址结合使用(比如本地IP等),否则,可能造成Build失败的问题。 +- 置空则服务器不会监听任何IP地址,这种情况下,只有Unix域套接字可以用于连接数据库。 + +**默认值:**localhost + +>![](public_sys-resources/icon-note.gif) **说明:** +>localhost表示只允许进行本地“回环”连接。 + +## local\_bind\_address + +**参数说明:**声明当前节点连接openGauss其他节点绑定的本地IP地址。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**默认值:**0.0.0.0(实际值由安装时的配置文件指定) + +## port + +**参数说明:**openGauss服务监听的TCP端口号。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,1~65535 + +**默认值:**5432(实际值有安装时的配置文件指定) + +## max\_connections + +**参数说明:**允许和数据库连接的最大并发连接数。此参数会影响openGauss的并发能力。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型。最小值为1,最大值为262143。 + +**默认值:**数据库节点:5000。如果该默认值超过内核支持的最大值(在执行gs\_initdb的时候判断),系统会提示错误。 + +**设置建议:** + +数据库主节点中此参数建议保持默认值。数据库节点中此参数建议设置为数据库主节点的个数乘以数据库主节点中此参数的值。 + +增大这个参数可能导致openGauss要求更多的SystemV共享内存或者信号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加以调整。 + +## sysadmin\_reserved\_connections + +**参数说明:**为管理员用户预留的最少连接数, 不建议设置过大。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为MIN\(262143, max\_connections\)。 + +**默认值:**3 + +## unix\_socket\_directory + +**参数说明:**设置openGauss服务器监听客户端连接的Unix域套接字目录。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +该参数的长度限制于操作系统的长度,超过该限制将会导致Unix-domain socket path "xxx" is too long的问题。 + +**取值范围:**字符串 + +**默认值:**空字符串(实际值由安装时配置文件指定) + +## unix\_socket\_group + +**参数说明:**设置Unix域套接字的所属组(套接字的所属用户总是启动服务器的用户)。可以与选项[unix\_socket\_permissions](#zh-cn_topic_0237124695_zh-cn_topic_0059777636_s09d0cf55124b4f1aa3d401d18b9b4151)一起用于对套接字进行访问控制。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串,其中空字符串表示当前用户的缺省组。 + +**默认值:**空字符串 + +## unix\_socket\_permissions + +**参数说明:**设置Unix域套接字的访问权限。 + +Unix域套接字使用普通的Unix文件系统权限集。这个参数的值应该是数值的格式(chmod和umask命令可接受的格式)。如果使用自定义的八进制格式,数字必须以0开头。 + +建议设置为0770(只有当前连接数据库的用户和同组的人可以访问)或者0700(只有当前连接数据库的用户自己可以访问,同组或者其他人都没有权限)。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0000-0777 + +**默认值:**0700 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在Linux中,文档具有十个属性,其中第一个属性为文档类型,后面九个为权限属性,分别为Owner,Group及Others这三个组别的read、write、execute属性。 +>文档的权限属性分别简写为r,w,x,这九个属性三个为一组,也可以使用数字来表示文档的权限,对照表如下: +>r:4 +>w: 2 +>x:1 +>-:0 +>同一组(owner/group/others)的三个属性是累加的。 +>例如,-rwxrwx---表示这个文档的权限为: +>owner = rwx = 4+2+1 = 7 +>group = rwx = 4+2+1 = 7 +>others = --- = 0+0+0 = 0 +>所以其权限为0770。 + +## application\_name + +**参数说明:**当前连接请求当中,所使用的客户端名称。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**字符串。 + +**默认值:**空字符串\(连接到后端的应用名,以实际安装为准\) + +## connection\_info + +**参数说明:**连接数据库的驱动类型、驱动版本号、当前驱动的部署路径和进程属主用户。 + +该参数属于USERSET类型参数,属于运维类参数,不建议用户设置。 + +**取值范围:**字符串。 + +**默认值:**空字符串**。** + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 空字符串,表示当前连接数据库的驱动不支持自动设置connection\_info参数或应用程序未设置。 +>- 驱动连接数enable\_resource\_record据库的时候自行拼接的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和driver\_version,driver\_path和os\_user的显示由用户控制。 + 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" new file mode 100644 index 000000000..524fa1b79 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\200\232\344\277\241\345\272\223\345\217\202\346\225\260.md" @@ -0,0 +1,215 @@ +# 通信库参数 + +本节介绍通信库相关的参数设置及取值范围等内容。 + +## tcp\_keepalives\_idle + +**参数说明:**在支持TCP\_KEEPIDLE套接字选项的系统上,设置发送活跃信号的间隔秒数。不设置发送保持活跃信号,连接就会处于闲置状态。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果操作系统不支持TCP\_KEEPIDLE选项 ,这个参数的值必须为0。 +>- 在通过Unix域套接字进行的连接的操作系统上,这个参数将被忽略。 + +**取值范围:**0-3600,单位为s。 + +**默认值:**60 + +## tcp\_keepalives\_interval + +**参数说明:**在支持TCP\_KEEPINTVL套接字选项的操作系统上,以秒数声明在重新传输之间等待响应的时间。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**0-180,单位为s。 + +**默认值:**30 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果操作系统不支持TCP\_KEEPINTVL选项,这个参数的值必须为0。 +>- 在通过Unix域套接字进行的连接的操作系统上,这个参数将被忽略。 + +## tcp\_keepalives\_count + +**参数说明:**在支持TCP\_KEEPCNT套接字选项的操作系统上,设置openGauss服务端在断开与客户端连接之前可以等待的保持活跃信号个数。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>- 如果操作系统不支持TCP\_KEEPCNT选项,这个参数的值必须为0。 +>- 在通过Unix域套接字进行连接的操作系统上,这个参数将被忽略。 + +**取值范围:**0-100,其中0表示openGauss未收到客户端反馈的保持活跃信号则立即断开连接。 + +**默认值:**20 + +## comm\_tcp\_mode + +**参数说明:**通信库使用TCP或SCTP协议建立数据通道的切换开关,重启openGauss生效。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>SCTP协议的连接不再提供支持,为了保持兼容,提供此参数的接口,但此参数会在设置过程中强制改为on。 + +**取值范围:**布尔型,数据库主节点设置为on表示使用TCP模式连接数据库节点。 + +**默认值:**on + +## comm\_sctp\_port + +**参数说明:**TCP代理通信库或SCTP通信库使用的TCP或SCTP协议监听端口,负责监听数据报文通道。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss部署时会自动分配此端口号,请不要轻易修改此参数,如端口号配置不正确会导致数据库通信失败。 + +**取值范围:**整型,最小值为0,最大值为65535。 + +**默认值:**7000 + +## comm\_control\_port + +**参数说明:**TCP代理通信库或SCTP通信库使用的TCP协议监听端口。 + +该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>openGauss部署时会自动分配此端口号,请不要轻易修改此参数,如端口号配置不正确会导致数据库通信失败。 + +**取值范围:**整型,最小值为0,最大值为65535。 + +**默认值:**7001 + +## comm\_max\_receiver + +**参数说明:**TCP代理通信库或SCTP通信库内部接收线程数量。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为1,最大值为50。 + +**默认值:**4 + +## comm\_quota\_size + +**参数说明:**TCP代理通信库或SCTP通信库最大可连续发送包总大小。使用1GE网卡时,建议取较小值,推荐设置为20KB\~40KB。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为2048000,默认单位为KB。 + +**默认值:**1MB + +## comm\_usable\_memory + +**参数说明:**单个数据库节点内TCP代理通信库或SCTP通信库缓存最大可使用内存。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数需根据环境内存及部署方式具体配置,过大会造成OOM,过小会降低TCP代理通信库或SCTP通信库性能。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为100\*1024,最大值为INT\_MAX/2,默认单位为KB。 + +**默认值:**4000MB + +## comm\_memory\_pool + +**参数说明:**单个数据库节点内TCP代理通信库或SCTP通信库可使用内存池资源的容量大小。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数需根据实际业务情况做调整,若通信库使用内存小,可设置该参数数值较小,反之设置数值较大。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为100\*1024,最大值为INT\_MAX/2,默认单位为KB。 + +**默认值:**2000MB + +## comm\_memory\_pool\_percent + +**参数说明:**单个数据库节点内TCP代理通信库或SCTP通信库可使用内存池资源的百分比,用于自适应负载预留通信库通信消耗的内存大小。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>此参数需根据实际业务情况做调整,若通信库使用内存小,可设置该参数数值较小,反之设置数值较大。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为100。 + +**默认值:**0 + +## comm\_no\_delay + +**参数说明:**是否使用通信库连接的NO\_DELAY属性,重启openGauss生效。 + +该参数属于POSTMASTER类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>如果openGauss出现因每秒接收数据包过多导致的丢包时,需设置为off,以便小包合并成大包发送,减少数据包总数。 + +**默认值:**off + +## comm\_debug\_mode + +**参数说明:**TCP代理通信库或SCTP通信库debug模式开关,该参数设置是否打印通信层详细日志。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置为on时,打印日志量较大,会增加额外的overhead并降低数据库性能,仅在调试时打开。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打印通信库详细debug日志。 +- off表示不打印通信库详细debug日志。 + +**默认值:**off + +## comm\_ackchk\_time + +**参数说明:**无数据包接收情况下,该参数设置通信库服务端主动ACK触发时长。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**整型,最小值为0,最大值为20000,单位为毫秒。取值为0表示关闭此功能。 + +**默认值:**2000 + +## comm\_timer\_mode + +**参数说明:**TCP代理通信库或SCTP通信库timer模式开关,该参数设置是否打印通信层各阶段时间桩。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置为on时,打印日志量较大,会增加额外的overhead并降低数据库性能,仅在调试时打开。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打印通信库详细时间桩日志。 +- off表示不打印通信库详细时间桩日志。 + +**默认值:**off + +## comm\_stat\_mode + +**参数说明:**TCP代理通信库或SCTP通信库stat模式开关,该参数设置是否打印通信层的统计信息。 + +>![](public_sys-resources/icon-notice.gif) **须知:** +>设置为on时,打印日志量较大,会增加额外的overhead并降低数据库性能,仅在调试时打开。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示打印通信库统计信息日志。 +- off表示不打印通信库统计信息日志。 + +**默认值:**off + 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" new file mode 100644 index 000000000..a8f69bb93 --- /dev/null +++ "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" @@ -0,0 +1,143 @@ +# 通用文件访问函数 + +通用文件访问函数提供了对数据库服务器上的文件的本地访问接口。只有openGauss目录和log\_directory目录里面的文件可以访问。使用相对路径访问openGauss目录里面的文件,以及匹配log\_directory配置而设置的路径访问日志文件。只有数据库初始化用户才能使用这些函数。 + +- pg\_ls\_dir\(dirname text\) + + 描述:列出目录中的文件。 + + 返回值类型:setof text + + 备注:pg\_ls\_dir返回指定目录里面的除了特殊项“.”和“..”之外所有名称。 + + 示例: + + ``` + postgres=# SELECT pg_ls_dir('./'); + pg_ls_dir + ---------------------- + .postgresql.conf.swp + postgresql.conf + pg_tblspc + PG_VERSION + pg_ident.conf + core + server.crt + pg_serial + pg_twophase + postgresql.conf.lock + pg_stat_tmp + pg_notify + pg_subtrans + pg_ctl.lock + pg_xlog + pg_clog + base + pg_snapshots + postmaster.opts + postmaster.pid + server.key.rand + server.key.cipher + pg_multixact + pg_errorinfo + server.key + pg_hba.conf + pg_replslot + .pg_hba.conf.swp + cacert.pem + pg_hba.conf.lock + global + gaussdb.state + (32 rows) + ``` + +- pg\_read\_file\(filename text, offset bigint, length bigint\) + + 描述:返回一个文本文件的内容。 + + 返回值类型:text + + 备注:pg\_read\_file返回一个文本文件的一部分,从offset开始,最多返回length字节(如果先达到文件结尾,则小于这个数值)。如果offset是负数,则它是相对于文件结尾回退的长度。如果省略了offset和length,则返回整个文件。 + + 示例: + + ``` + postgres=# SELECT pg_read_file('postmaster.pid',0,100); + pg_read_file + --------------------------------------- + 53078 + + /srv/BigData/hadoop/data1/dbnode+ + 1500022474 + + 8000 + + /var/run/FusionInsight + + localhost + + 2 + (1 row) + ``` + +- pg\_read\_binary\_file\(filename text \[, offset bigint, length bigint,missing\_ok boolean\]\) + + 描述:返回一个二进制文件的内容。 + + 返回值类型:bytea + + 备注:pg\_read\_binary\_file的功能与pg\_read\_file类似,除了结果的返回值为bytea类型不一致,相应地不会执行编码检查。与convert\_from函数结合,这个函数可以用来读取用指定编码的一个文件。 + + ``` + postgres=# SELECT convert_from(pg_read_binary_file('filename'), 'UTF8'); + ``` + +- pg\_stat\_file\(filename text\) + + 描述:返回一个文本文件的状态信息。 + + 返回值类型:record + + 备注:pg\_stat\_file返回一条记录,其中包含:文件大小、最后访问时间戳、最后更改时间戳、最后文件状态修改时间戳以及标识传入参数是否为目录的Boolean值。典型的用法: + + ``` + postgres=# SELECT * FROM pg_stat_file('filename'); + ``` + + ``` + postgres=# SELECT (pg_stat_file('filename')).modification; + ``` + + 示例: + + ``` + postgres=# SELECT convert_from(pg_read_binary_file('postmaster.pid'), 'UTF8'); + convert_from + -------------------------------------- + 4881 + + /srv/BigData/gaussdb/data1/dbnode+ + 1496308688 + + 25108 + + /opt/huawei/Bigdata/gaussdb/gaussdb_tmp + + * + + 25108001 43352069 + + + (1 row) + ``` + + ``` + postgres=# SELECT * FROM pg_stat_file('postmaster.pid'); + + size | access | modification | change + | creation | isdir + ------+------------------------+------------------------+------------------------ + +----------+------- + 117 | 2017-06-05 11:06:34+08 | 2017-06-01 17:18:08+08 | 2017-06-01 17:18:08+08 + | | f + (1 row) + ``` + + ``` + postgres=# SELECT (pg_stat_file('postmaster.pid')).modification; + modification + ------------------------ + 2017-06-01 17:18:08+08 + (1 row) + ``` + + 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" new file mode 100644 index 000000000..e341b6ff9 --- /dev/null +++ "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" @@ -0,0 +1,15 @@ +# 通过INSERT语句直接写入数据 + +用户可以通过以下方式执行[INSERT](INSERT.md)语句直接向openGauss写入数据: + +- 使用openGauss提供的客户端工具向openGauss写入数据。 + + 请参见[向表中插入数据](向表中插入数据.md)。 + +- 通过JDBC/ODBC驱动连接数据库执行INSERT语句向openGauss写入数据。 + + 详细内容请参见[连接数据库](连接数据库.md)。 + + +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" new file mode 100644 index 000000000..23053ce83 --- /dev/null +++ "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" @@ -0,0 +1,36 @@ +# 通过创建临时表并截断原始表来执行深层复制 + +该方法使用CREATE TABLE ... AS语句创建原始表的临时表,然后截断原始表并从临时表填充它完成原始表的深层复制。 + +在新建表需要保留父表的主键和外键属性,或如果父表具有依赖项的情况下,建议使用此方法。 + +## 操作步骤 + +1. 使用CREATE TABLE AS语句创建表customer\_t的临时表副本customer\_t\_temp。 + + ``` + postgres=# CREATE TABLE customer_t_temp AS SELECT * FROM customer_t; + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >与使用永久表相比,使用临时表可以提高性能,但存在丢失数据的风险。临时表只在当前会话可见,本会话结束后将自动删除。如果数据丢失是不可接受的,请使用永久表。 + +2. 截断当前表customer\_t。 + + ``` + postgres=# TRUNCATE customer_t; + ``` + +3. 使用INSERT INTO…SELECT语句从副本中向原始表中填充数据。 + + ``` + postgres=# INSERT INTO customer_t (SELECT * FROM customer_t_temp); + ``` + +4. 删除临时表副本customer\_t\_temp。 + + ``` + postgres=# DROP TABLE customer_t_temp; + ``` + + diff --git "a/content/zh/docs/Developerguide/\351\200\273\350\276\221\345\244\215\345\210\266\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\351\200\273\350\276\221\345\244\215\345\210\266\345\207\275\346\225\260.md" new file mode 100644 index 000000000..fa81c191e --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\200\273\350\276\221\345\244\215\345\210\266\345\207\275\346\225\260.md" @@ -0,0 +1,127 @@ +# 逻辑复制函数 + +- pg\_create\_logical\_replication\_slot\('slot\_name', 'plugin\_name'\) + + 描述:创建逻辑复制槽。 + + 参数说明: + + - slot\_name + + 流复制槽名称。 + + 取值范围:字符串,不支持除字母,数字,以及(\_?-.)以外的字符。 + + - plugin\_name + + 插件名称。 + + 取值范围:字符串,当前只支持“gaussdb\_decoding”。 + + 返回值类型:name, text + + 备注:第一个返回值表示slot\_name,第二个返回值表示该逻辑复制槽解码的起始LSN位置。 + +- pg\_drop\_replication\_slot\('slot\_name'\) + + 描述:删除流复制槽。 + + 参数说明: + + - slot\_name + + 流复制槽名称。 + + 取值范围:字符串,不支持除字母,数字,以及(\_?-.)以外的字符。 + + 返回值类型:void + +- pg\_logical\_slot\_peek\_changes\('slot\_name', 'LSN', upto\_nchanges, 'options\_name', 'options\_value'\) + + 描述:解码并不推进流复制槽(下次解码可以再次获取本次解出的数据)。 + + 参数说明: + + - slot\_name + + 流复制槽名称。 + + 取值范围:字符串,不支持除字母,数字,以及(\_?-.)以外的字符。 + + - LSN + + 日志的LSN,表示只解码小于等于此LSN的日志。 + + 取值范围:字符串(LSN,格式为xlogid/xrecoff),如'1/2AAFC60'。为NULL时表示不对解码截止的日志位置做限制。 + + - upto\_nchanges + + 解码条数(包含begin和commit)。假设一共有三条事务,分别包含3、5、7条记录,如果upto\_nchanges为4,那么会解码出前两个事务共8条记录。解码完第二条事务时发现解码条数记录大于等于upto\_nchanges,会停止解码。 + + 取值范围:非负整数。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >LSN和upto\_nchanges中任一参数达到限制,解码都会结束。 + + - options:此项为可选参数。 + - include-xids + + 解码出的data列是否包含xid信息。 + + 取值范围:0或1,默认值为1。 + + - 0:设为0时,解码出的data列不包含xid信息。 + - 1:设为1时,解码出的data列包含xid信息。 + + - skip-empty-xacts + + 解码时是否忽略空事务信息。 + + 取值范围:0或1,默认值为0。 + + - 0:设为0时,解码时不忽略空事务信息。 + - 1:设为1时,解码时会忽略空事务信息。 + + - include-timestamp + + 解码信息是否包含commit时间戳。 + + 取值范围:0或1,默认值为0。 + + - 0:设为0时,解码信息不包含commit时间戳。 + - 1:设为1时,解码信息包含commit时间戳。 + + + 返回值类型:text, uint, text + + 备注:函数返回解码结果,每一条解码结果包含三列,对应上述返回值类型,分别表示LSN位置、xid和解码内容。 + +- pg\_logical\_slot\_get\_changes\('slot\_name', 'LSN', upto\_nchanges, 'options\_name', 'options\_value'\) + + 描述:解码并推进流复制槽。 + + 参数说明: 与pg\_logical\_slot\_peek\_changes一致,详细内容请参见[ pg\_logical\_slot\_peek\_ch...](#zh-cn_topic_0237121996_li11712645125)。 + +- pg\_replication\_slot\_advance \('slot\_name', 'LSN'\) + + 描述:直接推进流复制槽到指定LSN,不输出解码结果。 + + 参数说明: + + - slot\_name + + 流复制槽名称。 + + 取值范围:字符串,不支持除字母,数字,以及(\_?-.)以外的字符。 + + - LSN + + 推进到的日志LSN位置,下次解码时只会输出提交位置比该LSN大的事务结果。如果输入的LSN比当前流复制槽记录的推进位置还要小,则直接返回;如果输入的LSN比当前最新物理日志LSN还要大,则推进到当前最新物理日志LSN。 + + 取值范围:字符串(LSN,格式为xlogid/xrecoff)。 + + 返回值类型:name, text + + 备注:返回值分别对应slot\_name和实际推进至的LSN。 + + diff --git "a/content/zh/docs/Developerguide/\351\200\273\350\276\221\346\223\215\344\275\234\347\254\246.md" "b/content/zh/docs/Developerguide/\351\200\273\350\276\221\346\223\215\344\275\234\347\254\246.md" new file mode 100644 index 000000000..5033755ec --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\200\273\350\276\221\346\223\215\344\275\234\347\254\246.md" @@ -0,0 +1,93 @@ +# 逻辑操作符 + +常用的逻辑操作符有AND、OR和NOT,他们的运算结果有三个值,分别为TRUE、FALSE和NULL,其中NULL代表未知。他们运算优先级顺序为:NOT\>AND\>OR。 + +运算规则请参见[表1](#zh-cn_topic_0237121965_zh-cn_topic_0059778733_zh-cn_topic_0058966260_table261968),表中的a和b代表逻辑表达式。 + +**表 1** 运算规则表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

a

+

b

+

a AND b的结果

+

a OR b的结果

+

NOT a的结果

+

TRUE

+

TRUE

+

TRUE

+

TRUE

+

FALSE

+

TRUE

+

FALSE

+

FALSE

+

TRUE

+

FALSE

+

TRUE

+

NULL

+

NULL

+

TRUE

+

FALSE

+

FALSE

+

FALSE

+

FALSE

+

FALSE

+

TRUE

+

FALSE

+

NULL

+

FALSE

+

NULL

+

TRUE

+

NULL

+

NULL

+

NULL

+

NULL

+

NULL

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>操作符AND和OR具有交换性,即交换左右两个操作数,不影响其结果。 + 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" new file mode 100644 index 000000000..895ff5512 --- /dev/null +++ "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" @@ -0,0 +1,115 @@ +# 配置客户端接入认证 + +## 背景信息 + +如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为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" new file mode 100644 index 000000000..77ac7307a --- /dev/null +++ "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" @@ -0,0 +1,115 @@ +# 配置客户端接入认证 + +## 背景信息 + +如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为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\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" new file mode 100644 index 000000000..643de1b57 --- /dev/null +++ "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" @@ -0,0 +1,133 @@ +# 配置文件参考 + +**表 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" new file mode 100644 index 000000000..6d93c8441 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\346\226\207\344\273\266\345\217\202\350\200\203.md" @@ -0,0 +1,133 @@ +# 配置文件参考 + +**表 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\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" new file mode 100644 index 000000000..8481e7346 --- /dev/null +++ "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" @@ -0,0 +1,41 @@ +# 配置服务端远程连接 + +进行远程连接前,需要在所有部署了数据库主节点的机器上设置允许客户端访问数据库,并配置远程连接。 + +## 操作步骤 + +以下步骤需要在openGauss的数据库主节点所在主机上执行。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 配置客户端认证方式,请参考[配置客户端接入认证](配置客户端接入认证.md#ZH-CN_TOPIC_0242376654)。 +3. 配置[listen\_addresses](连接设置.md#zh-cn_topic_0237124695_zh-cn_topic_0059777636_sed0adde99a3f47669f5d4ab557b36b35),listen\_addresses即远程客户端连接使用的数据库主节点ip或者主机名。 + 1. 使用如下命令查看数据库主节点目前的listen\_addresses配置。 + + ``` + gs_guc check -I all -c "listen_addresses" + ``` + + 查询到的信息类似如下: + + ``` + expected guc information: plat1: listen_addresses=NULL: [/gaussdb/data/data_cn/postgresql.conf] + gs_guc check: plat1: listen_addresses='localhost, 192.168.0.100': [/gaussdb/data/data_cn/postgresql.conf] + + Total GUC values: 1. Failed GUC values: 0. + The value of parameter listen_addresses is same on all instances. + listen_addresses='localhost, 192.168.0.100' + ``` + + 2. 使用如下命令把要添加的IP追加到listen\_addresses后面,多个配置项之间用英文逗号分隔。例如,追加IP地址10.11.12.13。 + + ``` + gs_guc set -I all -c "listen_addresses='localhost,192.168.0.100,10.11.12.13'" + ``` + +4. 执行如下命令重启openGauss。 + + ``` + gs_om -t stop && gs_om -t start + ``` + + 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" new file mode 100644 index 000000000..71607e01a --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\347\244\272\344\276\213.md" @@ -0,0 +1,111 @@ +# 配置示例 + +文本搜索配置(Text Search Configuration),指定了将文档转换成tsvector过程中所必需的组件: + +- 解析器,用于把文本分解成标记token; +- 词典列表,用于将每个token转换成词位lexeme。 + +每次to\_tsvector或to\_tsquery函数调用时,都需要指定一个文本搜索配置来指定具体的处理过程。GUC参数[default\_text\_search\_config](区域和格式化.md#zh-cn_topic_0237124733_zh-cn_topic_0059778109_sd9a07d429cd4498383931c621742b816)指定了默认的文本搜索配置,当文本搜索函数中没有显式指定文本搜索配置参数时,将会使用该默认值进行处理。 + +openGauss中预定义有一些可用的文本搜索配置,用户也可创建自定义的文本搜索配置。此外,为了便于管理文本搜索对象,还提供有多个gsql元命令,可以显示有关文本搜索对象的信息(详细请参见《工具参考》中“客户端工具 \>元命令参考”章节)。 + +## 操作步骤 + +1. 创建一个文本搜索配置ts\_conf,复制预定义的文本搜索配置english。 + + ``` + postgres=# CREATE TEXT SEARCH CONFIGURATION ts_conf ( COPY = pg_catalog.english ); + CREATE TEXT SEARCH CONFIGURATION + ``` + +2. 创建Synonym词典。 + + 假设同义词词典定义文件pg\_dict.syn内容如下: + + ``` + postgres pg + pgsql pg + postgresql pg + ``` + + 执行如下语句创建Synonym词典: + + ``` + postgres=# CREATE TEXT SEARCH DICTIONARY pg_dict ( + TEMPLATE = synonym, + SYNONYMS = pg_dict, + FILEPATH = 'file:///home/dicts' + ); + ``` + +3. 创建一个Ispell词典english\_ispell(词典定义文件来自开源词典)。 + + ``` + postgres=# CREATE TEXT SEARCH DICTIONARY english_ispell ( + TEMPLATE = ispell, + DictFile = english, + AffFile = english, + StopWords = english, + FILEPATH = 'file:///home/dicts' + ); + ``` + +4. 设置文本搜索配置ts\_conf,修改某些类型的token对应的词典列表。关于token类型的详细信息,请参见[解析器](解析器.md#ZH-CN_TOPIC_0242370496)。 + + ``` + postgres=# ALTER TEXT SEARCH CONFIGURATION ts_conf + ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, + word, hword, hword_part + WITH pg_dict, english_ispell, english_stem; + ``` + +5. 在文本搜索配置中,选择设置不索引或搜索某些token类型。 + + ``` + postgres=# ALTER TEXT SEARCH CONFIGURATION ts_conf + DROP MAPPING FOR email, url, url_path, sfloat, float; + ``` + +6. 使用文本检索调测函数ts\_debug\(\)对所创建的词典配置ts\_conf进行测试。 + + ``` + postgres=# SELECT * FROM ts_debug('ts_conf', ' + PostgreSQL, the highly scalable, SQL compliant, open source object-relational + database management system, is now undergoing beta testing of the next + version of our software. + '); + ``` + +7. 可以设置当前session使用ts\_conf作为默认的文本搜索配置。此设置仅在当前session有效。 + + ``` + postgres=# \dF+ ts_conf + Text search configuration "public.ts_conf" + Parser: "pg_catalog.default" + Token | Dictionaries + -----------------+------------------------------------- + asciihword | pg_dict,english_ispell,english_stem + asciiword | pg_dict,english_ispell,english_stem + file | simple + host | simple + hword | pg_dict,english_ispell,english_stem + hword_asciipart | pg_dict,english_ispell,english_stem + hword_numpart | simple + hword_part | pg_dict,english_ispell,english_stem + int | simple + numhword | simple + numword | simple + uint | simple + version | simple + word | pg_dict,english_ispell,english_stem + + postgres=# SET default_text_search_config = 'public.ts_conf'; + SET + postgres=# SHOW default_text_search_config; + default_text_search_config + ---------------------------- + public.ts_conf + (1 row) + ``` + + diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\350\256\276\347\275\256\345\207\275\346\225\260.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\350\256\276\347\275\256\345\207\275\346\225\260.md" new file mode 100644 index 000000000..9ec0de337 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\350\256\276\347\275\256\345\207\275\346\225\260.md" @@ -0,0 +1,39 @@ +# 配置设置函数 + +配置设置函数是可以用于查询以及修改运行时配置参数的函数。 + +- current\_setting\(setting\_name\) + + 描述:当前的设置值。 + + 返回值类型:text + + 备注:current\_setting用于以查询形式获取setting\_name的当前值。和SQL语句SHOW是等效的。比如: + + ``` + postgres=# SELECT current_setting('datestyle'); + + current_setting + ----------------- + ISO, MDY + (1 row) + ``` + +- set\_config\(setting\_name, new\_value, is\_local\) + + 描述:设置参数并返回新值。 + + 返回值类型:text + + 备注:set\_config将参数setting\_name设置为new\_value,如果is\_local为true,则新值将只应用于当前事务。如果希望新值应用于当前会话,可以使用false,和SQL语句SET是等效的。比如: + + ``` + postgres=# SELECT set_config('log_statement_stats', 'off', false); + + set_config + ------------ + off + (1 row) + ``` + + diff --git "a/content/zh/docs/Developerguide/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" new file mode 100644 index 000000000..716c25f77 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\205\215\347\275\256\350\277\220\350\241\214\345\217\202\346\225\260.md" @@ -0,0 +1,7 @@ +# 配置运行参数 + +- **[查看参数当前取值](查看参数当前取值.md)** + +- **[重设参数](重设参数.md)** + + 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" new file mode 100644 index 000000000..1cade6753 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\207\215\350\256\276\345\217\202\346\225\260.md" @@ -0,0 +1,635 @@ +# 重设参数 + +## 背景信息 + +openGauss提供了多种修改GUC参数的方法,用户可以方便的针对数据库、用户、会话进行设置。 + +- 参数名称不区分大小写。 +- 参数取值有整型、浮点型、字符串、布尔型和枚举型五类。 + - 布尔值可以是(on,off)、(true,false)、(yes,no)或者(1,0),且不区分大小写。 + - 枚举类型的取值是在系统表pg\_settings的enumvals字段取值定义的。 + +- 对于有单位的参数,在设置时请指定单位,否则将使用默认的单位。 + - 参数的默认单位在系统表pg\_settings的unit字段定义的。 + - 内存单位有:KB(千字节)、MB(兆字节)和GB(吉字节)。 + - 时间单位:ms(毫秒)、s(秒)、min(分钟)、h(小时)和d(天)。 + + +具体参数说明请参见[GUC参数说明](GUC参数说明.md)。 + +## GUC参数设置 + +openGauss提供了六类GUC参数,具体分类和设置方式请参考[表1](#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846): + +**表 1** GUC参数分类 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数类型

+

说明

+

设置方式

+

INTERNAL

+

固定参数,在创建数据库的时候确定,用户无法修改,只能通过show语法或者pg_settings视图进行查看。

+

+

POSTMASTER

+

数据库服务端参数,在数据库启动时确定,可以通过配置文件指定。

+

支持表2中的方式一。

+

SIGHUP

+

数据库全局参数,可在数据库启动时设置或者在数据库启动后,发送指令重新加载。

+

支持表2中的方式一、方式二。

+

BACKEND

+

会话连接参数。在创建会话连接时指定,连接建立后无法修改。连接断掉后参数失效。内部使用参数,不推荐用户设置。

+

支持表2中的方式一、方式二。

+
说明:

设置该参数后,下一次建立会话连接时生效。

+
+

SUSET

+

数据库管理员参数。可在数据库启动时、数据库启动后或者数据库管理员通过SQL进行设置。

+

支持表2中的方式一、方式二或由数据库管理员通过方式三设置。

+

USERSET

+

普通用户参数。可被任何用户在任何时刻设置。

+

支持表2中的方式一、方式二或方式三设置。

+
+ +openGauss提供了三种方式来修改GUC参数,具体操作请参考[表2](#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d): + +**表 2** GUC参数设置方式 + + + + + + + + + + + + + + + + +

序号

+

设置方法

+

方式一

+
  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操作会导致用户执行操作中断,请在操作之前规划好合适的执行窗口。

    +
    +
    gs_om -t stop && gs_om -t start
    +
+

方式二

+
gs_guc reload -D datadir -c "paraname=value"
+
说明:

使用以下命令在数据库节点上同时设置某个参数。

+
gs_guc reload -N all -I all -c "paraname=value"
+
+

方式三

+

修改指定数据库,用户,会话级别的参数。

+
  • 设置数据库级别的参数
    postgres=# ALTER DATABASE dbname SET paraname TO value;
    +

    在下次会话中生效。

    +
  • 设置用户级别的参数
    postgres=# ALTER USER username SET paraname TO value;
    +

    在下次会话中生效。

    +
  • 设置会话级别的参数
    postgres=# SET paraname TO value;
    +

    修改本次会话中的取值。退出会话后,设置将失效。

    +
+
+ +## 操作步骤 + +使用方式一设置数据库参数,以在数据库主节点设置archive\_mode参数为例。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 查看archive\_mode参数。 + + ``` + cat /gaussdb/data/dbnode/postgresql.conf | grep archive_mode + ``` + + ``` + archive_mode = on + ``` + + on表示日志要进行归档操作。 + +3. 设置archive\_mode参数为off,关闭日志的归档操作。 + + ``` + gs_guc set -D /gaussdb/data/dbnode -c "archive_mode=off" + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >可以使用以下命令在数据库节点上设置archive\_mode参数为off。 + >``` + >gs_guc set -N all -I all -c "archive_mode=off" + >``` + +4. 重启数据库使参数生效。 + + ``` + gs_om -t stop && gs_om -t start + ``` + +5. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +6. 检查参数设置的正确性。 + + ``` + postgres=# SHOW archive_mode; + archive_mode + -------------- + off + (1 row) + ``` + + +使用方式二设置参数,以在数据库主节点设置authentication\_timeout参数为例。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 查看authentication\_timeout参数。 + + ``` + cat /gaussdb/data/dbnode/postgresql.conf | grep authentication_timeout + ``` + + ``` + authentication_timeout = 1min + ``` + +3. 设置authentication\_timeout参数为59s。 + + ``` + gs_guc reload -N all -I all -c "authentication_timeout = 59s" + + Total instances: 2. Failed instances: 0. + Success to perform gs_guc! + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >可以使用以下命令在数据库节点上设置authentication\_timeout参数为59s。 + >``` + >gs_guc reload -N all -I all -c "authentication_timeout = 59s" + >``` + +4. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +5. 检查参数设置的正确性。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 59s + (1 row) + ``` + + +使用方式三设置参数,以设置explain\_perf\_mode参数为例。 + +1. 以操作系统用户omm登录数据库主节点。 +2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + +3. 查看explain\_perf\_mode参数。 + + ``` + postgres=# SHOW explain_perf_mode; + explain_perf_mode + ------------------- + normal + (1 row) + ``` + +4. 设置explain\_perf\_mode参数。 + + 使用以下任意方式进行设置: + + - 设置数据库级别的参数 + + ``` + postgres=# ALTER DATABASE postgres SET explain_perf_mode TO pretty; + ``` + + 当结果显示为如下信息,则表示设置成功。 + + ``` + ALTER DATABASE + ``` + + 在下次会话中生效。 + + - 设置用户级别的参数 + + ``` + postgres=# ALTER USER omm SET explain_perf_mode TO pretty; + ``` + + 当结果显示为如下信息,则表示设置成功。 + + ``` + ALTER ROLE + ``` + + 在下次会话中生效。 + + - 设置会话级别的参数 + + ``` + postgres=# SET explain_perf_mode TO pretty; + ``` + + 当结果显示为如下信息,则表示设置成功。 + + ``` + SET + ``` + +5. 检查参数设置的正确性。 + + ``` + postgres=# SHOW explain_perf_mode; + explain_perf_mode + -------------- + pretty + (1 row) + ``` + + +## 示例 + +- 示例1:使用方式一修改openGauss数据库主节点的最大连接数。 + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 200 + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库主节点的最大连接数。 + + ``` + gs_guc set -N all -I all -c "max_connections = 800" + ``` + + 6. 重启openGauss。 + + ``` + gs_om -t stop && gs_om -t start + ``` + + 7. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 8. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 800 + (1 row) + ``` + + +- 示例2:使用方式二设置数据库主节点的客户端认证最长时间参数“authentication\_timeout” + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 1min + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库主节点的客户端认证最长时间。 + + ``` + gs_guc reload -N all -I all -c "authentication_timeout = 59s" + ``` + + 6. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 7. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 59s + (1 row) + ``` + + +- 示例3:修改openGauss数据库节点的最大连接数。 + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 200 + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库节点的最大连接数。 + + ``` + gs_guc set -N all -I all -c "max_connections = 500" + ``` + + 6. 重启openGauss。 + + ``` + gs_om -t stop + gs_om -t start + ``` + + 7. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 8. 查看最大连接数。 + + ``` + postgres=# SHOW max_connections; + max_connections + ----------------- + 500 + (1 row) + ``` + + +- 示例4:设置数据库节点的客户端认证最长时间参数“authentication\_timeout” + 1. 以操作系统用户omm登录数据库主节点。 + 2. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 3. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 1min + (1 row) + ``` + + 4. 使用如下命令退出数据库。 + + ``` + postgres=# \q + ``` + + 5. 修改openGauss数据库节点的客户端认证最长时间。 + + ``` + gs_guc reload -N all -I all -c "authentication_timeout = 30s" + ``` + + 6. 使用如下命令连接数据库。 + + ``` + gsql -d postgres -p 8000 + ``` + + postgres为需要连接的数据库名称,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. + + postgres=# + ``` + + 7. 查看客户端认证的最长时间。 + + ``` + postgres=# SHOW authentication_timeout; + authentication_timeout + ------------------------ + 30s + (1 row) + ``` + + + 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" new file mode 100644 index 000000000..c139ca32f --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\223\276\346\216\245\345\255\227\347\254\246.md" @@ -0,0 +1,83 @@ +# 链接字符 + +**表 1** 链接字符串 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

字符串

+

描述

+

host

+

要链接的主机名。如果主机名以斜杠开头,则它声明使用Unix域套接字通讯而不是TCP/IP通讯;该值就是套接字文件所存储的目录。如果没有声明host,那么默认是与位于/tmp目录(或者安装GaussDB的时候声明的套接字目录)里面的Unix-域套接字链接。在没有Unix域套接字的机器上,默认与localhost链接。

+

hostaddr

+

与之链接的主机的IP地址,是标准的IPv4地址格式,比如,172.28.40.9。如果机器支持IPv6,那么也可以使用IPv6的地址。如果声明了一个非空的字符串,那么使用TCP/IP通讯机制。

+

使用hostaddr取代host可以让应用避免一次主机名查找,这一点对于那些有时间约束的应用来说可能是非常重要的。不过,GSSAPI或SSPI认证方法要求主机名(host)。因此,应用下面的规则:

+
  1. 如果声明了不带hostaddr的host那么就强制进行主机名查找。
  2. 如果声明中没有host,hostaddr的值给出服务器网络地址;如果认证方法要求主机名,那么链接尝试将失败。
  3. 如果同时声明了host和hostaddr,那么hostaddr的值作为服务器网络地址。host的值将被忽略,除非认证方法需要它,在这种情况下它将被用作主机名。
    须知:
    • 要注意如果host不是网络地址hostaddr处的服务器名,那么认证很有可能失败。
    • 如果主机名(host)和主机地址都没有,那么libpq将使用一个本地的Unix域套接字进行链接;或者是在没有Unix域套接字的机器上,它将尝试与localhost链接。
    +
    +
+

port

+

主机服务器的端口号,或者在Unix域套接字链接时的套接字扩展文件名。

+

user

+

要链接的用户名,缺省是与运行该应用的用户操作系统名同名的用户。

+

password

+

如果服务器要求口令认证,所用的口令。

+

connect_timeout

+

链接的最大等待时间,以秒计(用十进制整数字串书写),0或者不声明表示无穷。不建议把链接超时的值设置得小于2秒。

+

client_encoding

+

为这个链接设置client_encoding配置参数。除了对应的服务器选项接受的值,你可以使用auto从客户端中的当前环境中确定正确的编码(Unix系统上是LC_CTYPE环境变量)。

+

options

+

添加命令行选项以在运行时发送到服务器。例如,设置为-c comm_debug_mode=off设置guc参数comm_debug_mode参数的会话的值为off。

+

application_name

+

为application_name配置参数指定一个值,表明当前用户身份。

+

keepalives

+

控制客户端侧的TCP保持激活是否使用。缺省值是1,意思为打开,但是如果不想要保持激活,你可以更改为0,意思为关闭。通过Unix域套接字做的链接忽略这个参数。

+

keepalives_idle

+

在TCP应该发送一个保持激活的信息给服务器之后,控制不活动的秒数。0值表示使用系统缺省。通过Unix域套接字做的链接或者如果禁用了保持激活则忽略这个参数。

+

keepalives_interval

+

在TCP保持激活信息没有被应该传播的服务器承认之后,控制秒数。0值表示使用系统缺省。通过Unix域套接字做的链接或者如果禁用了保持激活则忽略这个参数。

+

keepalives_count

+

添加命令行选项以在运行时发送到服务器。例如,设置为-c comm_debug_mode=off设置guc参数comm_debug_mode参数的会话的值为off。

+
+ diff --git "a/content/zh/docs/Developerguide/\351\224\201\347\256\241\347\220\206.md" "b/content/zh/docs/Developerguide/\351\224\201\347\256\241\347\220\206.md" new file mode 100644 index 000000000..bff229f44 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\224\201\347\256\241\347\220\206.md" @@ -0,0 +1,124 @@ +# 锁管理 + +在openGauss中,并发执行的事务由于竞争资源会导致死锁。本节介绍的参数主要管理事务锁的机制。 + +## deadlock\_timeout + +**参数说明:**设置死锁超时检测时间,以毫秒为单位。当申请的锁超过设定值时,系统会检查是否产生了死锁。 + +- 死锁的检查代价是比较高的,服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中死锁是不经常出现的,因此在检查死锁前只需等待一个相对较短的时间。增加这个值就减少了无用的死锁检查浪费的时间,但是会减慢真正的死锁错误报告的速度。在一个负载过重的服务器上,用户可能需要增大它。这个值的设置应该超过事务持续时间,这样就可以减少在锁释放之前就开始死锁检查的问题。 +- 如果要通过设置[log\_lock\_waits](记录日志的内容.md#zh-cn_topic_0237124723_zh-cn_topic_0059778400_s0e43c2815b8a4f369d5b150535d1703f)来将查询执行过程中的锁等待耗时信息写入日志,请确保[log\_lock\_waits](记录日志的内容.md#zh-cn_topic_0237124723_zh-cn_topic_0059778400_s0e43c2815b8a4f369d5b150535d1703f)的设置值小于deadlock\_timeout的设置值(或默认值)。 + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,1\~2147483647,单位为毫秒(ms)。 + +**默认值:**1s + +## lockwait\_timeout + +**参数说明:**控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。 + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX,单位为毫秒(ms)。 + +**默认值:**20min + +## update\_lockwait\_timeout + +**参数说明:**允许并发更新参数开启情况下,该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。 + +该参数属于SUSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX,单位为毫秒(ms)。 + +**默认值:**2min + +## max\_locks\_per\_transaction + +**参数说明:**控制每个事务能够得到的平均的对象锁的数量。 + +- 共享的锁表的大小是以假设任意时刻最多只有max\_locks\_per\_transaction\*\(max\_connections+max\_prepared\_transactions\) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在数据库启动的时候设置。 +- 增大这个参数可能导致openGauss请求更多的System V共享内存,有可能超过操作系统的缺省配置。 +- 当运行备机时,请将此参数设置不小于主机上的值,否则,在备机上查询操作不会被允许。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,10 \~ INT\_MAX + +**默认值:**256 + +## max\_pred\_locks\_per\_transaction + +**参数说明:**控制每个事务允许断定锁的最大数量,是一个平均值。 + +- 共享的断定锁表的大小是以假设任意时刻最多只有max\_pred\_locks\_per\_transaction\*\(max\_connections+max\_prepared\_transactions\) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在服务器启动的时候设置。 +- 增大这个参数可能导致openGauss请求更多的System V共享内存,有可能超过操作系统的缺省配置。 + +该参数属于POSTMASTER类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,10 \~ INT\_MAX + +**默认值:**64 + +## gs\_clean\_timeout + +**参数说明:**控制DBnode周期性调用gs\_clean工具的时间,是一个平均值。 + +- openGauss数据库中事务处理使用的是两阶段提交的方法,当有两阶段事务残留时,该事务通常会拿着表级锁,导致其它连接无法加锁,此时需要调用gs\_clean工具对openGauss中两阶段事务进行清理,gs\_clean\_timeout是控制DBnode周期性调用gs\_clean的时间。 +- 增大这个参数可能导致openGauss周期性调用gs\_clean工具的时间延长,导致两阶段事务清理时间延长。 + +该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,0 \~ INT\_MAX / 1000,单位为秒(s)。 + +**默认值:**5min + +## partition\_lock\_upgrade\_timeout + +**参数说明:**在执行某些查询语句的过程中,会需要将分区表上的锁级别由允许读的ExclusiveLock级别升级到读写阻塞的AccessExclusiveLock级别。如果此时已经存在并发的读事务,那么该锁升级操作将阻塞等待。partition\_lock\_upgrade\_timeout为尝试锁升级的等待超时时间。 + +- 在分区表上进行MERGE PARTITION和CLUSTER PARTITION操作时,都利用了临时表进行数据重排和文件交换,为了最大程度提高分区上的操作并发度,在数据重排阶段给相关分区加锁ExclusiveLock,在文件交换阶段加锁AccessExclusiveLock。 +- 常规加锁方式是等待加锁,直到加锁成功,或者等待时间超过[lockwait\_timeout](#zh-cn_topic_0237124735_zh-cn_topic_0059778102_s6569557a768f4a80b5cade038eafb31b)发生超时失败。 +- 在分区表上进行MERGE PARTITION或CLUSTER PARTITION操作时,进入文件交换阶段需要申请加锁AccessExclusiveLock,加锁方式是尝试性加锁,加锁成功了则立即返回,不成功则等待50ms后继续下次尝试,加锁超时时间使用会话级设置参数partition\_lock\_upgrade\_timeout。 +- 特殊值:若partition\_lock\_upgrade\_timeout取值-1,表示无限等待,即不停的尝试锁升级,直到加锁成功。 + + 该参数属于USERSET类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + + +**取值范围:**整型,最小值-1,最大值3000,单位为秒(s)。 + +**默认值:**1800 + +## fault\_mon\_timeout + +**参数说明:**轻量级死锁检测周期。该参数属于SIGHUP类型参数,请参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**整型,最小值0,最大值1440,单位为分钟(min) + +**默认值:**5min + +## enable\_online\_ddl\_waitlock + +**参数说明:**控制DDL是否会阻塞等待pg\_advisory\_lock/pgxc\_lock\_for\_backup等openGauss锁。主要用于OM在线操作场景,不建议用户设置。 + +该参数属于SIGHUP类型参数,参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +**取值范围:**布尔型 + +- on表示开启。 +- off表示关闭。 + +**默认值:**off + +## xloginsert\_locks + +参数说明:控制用于并发写预写式日志锁的个数。主要用于提高写预写式日志的效率。 + +该参数属于POSTMASTER类型参数,参考[表2](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。 + +取值范围:整型,最小值1,最大值1000 + +默认值:8 + diff --git "a/content/zh/docs/Developerguide/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" "b/content/zh/docs/Developerguide/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" new file mode 100644 index 000000000..5f915bdcd --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\224\231\350\257\257\346\212\245\345\221\212\345\222\214\346\227\245\345\277\227.md" @@ -0,0 +1,11 @@ +# 错误报告和日志 + +- **[记录日志的位置](记录日志的位置.md)** + +- **[记录日志的时间](记录日志的时间.md)** + +- **[记录日志的内容](记录日志的内容.md)** + +- **[使用CSV格式写日志](使用CSV格式写日志.md)** + + diff --git "a/content/zh/docs/Developerguide/\351\231\204\345\212\240\345\212\237\350\203\275.md" "b/content/zh/docs/Developerguide/\351\231\204\345\212\240\345\212\237\350\203\275.md" new file mode 100644 index 000000000..d65b6987d --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\231\204\345\212\240\345\212\237\350\203\275.md" @@ -0,0 +1,11 @@ +# 附加功能 + +- **[处理tsvector](处理tsvector.md)** + +- **[处理查询](处理查询.md)** + +- **[查询重写](查询重写.md)** + +- **[收集文献统计](收集文献统计.md)** + + diff --git "a/content/zh/docs/Developerguide/\351\231\204\345\275\225-16.md" "b/content/zh/docs/Developerguide/\351\231\204\345\275\225-16.md" new file mode 100644 index 000000000..c4bc9532a --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\231\204\345\275\225-16.md" @@ -0,0 +1,9 @@ +# 附录 + +- **[GIN索引](GIN索引.md)** + +- **[扩展函数](扩展函数.md)** + +- **[扩展语法](扩展语法.md)** + + diff --git "a/content/zh/docs/Developerguide/\351\231\204\345\275\225.md" "b/content/zh/docs/Developerguide/\351\231\204\345\275\225.md" new file mode 100644 index 000000000..f6be15669 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\231\204\345\275\225.md" @@ -0,0 +1,7 @@ +# 附录 + +- **[客户端接入认证](客户端接入认证.md)** + +- **[设置文件权限安全策略](设置文件权限安全策略.md)** + + diff --git "a/content/zh/docs/Developerguide/\351\231\220\345\210\266\347\272\246\346\235\237.md" "b/content/zh/docs/Developerguide/\351\231\220\345\210\266\347\272\246\346\235\237.md" new file mode 100644 index 000000000..3289f93fe --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\231\220\345\210\266\347\272\246\346\235\237.md" @@ -0,0 +1,10 @@ +# 限制约束 + +openGauss的全文检索功能当前限制约束是: + +- 每个分词长度必须小于2K字节。 +- tsvector结构(分词+位置)的长度必须小于1兆字节。 +- tsvector的位置值必须大于0,且小于等于16,383。 +- 每个分词在文档中位置数必须小于256,若超过将舍弃后面的位置信息。 +- tsquery中的关键字及对应运算符最大支持到32768。 + diff --git "a/content/zh/docs/Developerguide/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" "b/content/zh/docs/Developerguide/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" new file mode 100644 index 000000000..e5bbeb797 --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\242\204\345\206\231\345\274\217\346\227\245\345\277\227.md" @@ -0,0 +1,11 @@ +# 预写式日志 + +- **[设置](设置.md)** + +- **[检查点](检查点.md)** + +- **[日志回放](日志回放.md)** + +- **[归档](归档.md)** + + diff --git "a/content/zh/docs/Developerguide/\351\253\230\344\272\256\346\220\234\347\264\242\347\273\223\346\236\234.md" "b/content/zh/docs/Developerguide/\351\253\230\344\272\256\346\220\234\347\264\242\347\273\223\346\236\234.md" new file mode 100644 index 000000000..a184f6ccb --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\253\230\344\272\256\346\220\234\347\264\242\347\273\223\346\236\234.md" @@ -0,0 +1,64 @@ +# 高亮搜索结果 + +搜索结果的理想显示是:列出每篇文档中与搜索相关的部分,并标识为什么与查询相关。搜索引擎能够显示标识了搜索词的文档片段。openGauss提供了函数ts\_headline支持这部分功能。 + +``` +ts_headline([ config regconfig, ] document text, query tsquery [, options text ]) returns text +``` + +ts\_headline的输入是带有查询条件的文档,其返回文档中的摘录,在摘录中查询词是高亮显示的。用来解析文档的分词器由config参数指定。如果省略config,则使用default\_text\_search\_config的值所指定的分词器。 + +指定options字符串时,需由一个或多个option=value对组成,且必须用逗号分隔。options可以是下面的选项: + +- StartSel,StopSel:分隔文档中出现的查询词,以区别于其他摘录词。当包含有空格或逗号时,必须用双引号将字符串引起来。 +- MaxWords,MinWords:定义摘录的最长和最短值。 + +- ShortWord:在摘录的开始和结束会丢弃此长度或更短的词。默认值3会消除常见的英语冠词。 + +- HighlightAll:布尔标志。如果为真,整个文档将作为摘录。忽略前面三个参数的值。 + +- MaxFragments:要显示的文本摘录或片段的最大数量。默认值0表示选择非片段的摘录生成方法。 大于0的值表示选择基于片段的摘录生成。此方法查找带有尽可能多查询词的文本片段,并显示查询词周围的上下文片段。因此,查询词临近每个片段的中间,且查询词两边都有词。每个片段至多有MaxWords,并且长度为ShortWord或更短的词在每一个片段开始和结束被丢弃。如果在文档中没有找到所有的查询词,则文档中开头将显示MinWords单片段。 + +- FragmentDelimiter:当有一个以上的片段时,通过该字符串分隔这些片段。 + +不声明选项时,采用下面的缺省值: + +``` +StartSel=, StopSel=, +MaxWords=35, MinWords=15, ShortWord=3, HighlightAll=FALSE, +MaxFragments=0, FragmentDelimiter=" ... " +``` + +例如: + +``` +postgres=# SELECT ts_headline('english', +'The most common type of search +is to find all documents containing given query terms +and return them in order of their similarity to the +query.', +to_tsquery('english', 'query & similarity')); + ts_headline +------------------------------------------------------------ + containing given query terms + and return them in order of their similarity to the + query. +(1 row) + +postgres=# SELECT ts_headline('english', +'The most common type of search +is to find all documents containing given query terms +and return them in order of their similarity to the +query.', +to_tsquery('english', 'query & similarity'), +'StartSel = <, StopSel = >'); + ts_headline +------------------------------------------------------- + containing given terms + and return them in order of their to the + . +(1 row) +``` + +ts\_headline使用原始文档,而不是tsvector摘录,因此使用起来会慢,应慎重使用。 + diff --git "a/content/zh/docs/Developerguide/\351\273\230\350\256\244\346\235\203\351\231\220\346\234\272\345\210\266.md" "b/content/zh/docs/Developerguide/\351\273\230\350\256\244\346\235\203\351\231\220\346\234\272\345\210\266.md" new file mode 100644 index 000000000..afc8999fc --- /dev/null +++ "b/content/zh/docs/Developerguide/\351\273\230\350\256\244\346\235\203\351\231\220\346\234\272\345\210\266.md" @@ -0,0 +1,14 @@ +# 默认权限机制 + +数据库对象创建后,进行对象创建的用户就是该对象的所有者。openGauss安装后的默认情况下,未开启[三权分立](三权分立.md#ZH-CN_TOPIC_0246507960),数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和销毁对象,以及通过[GRANT](GRANT.md)将对象的权限授予其他用户。 + +为使其他用户能够使用对象,必须向用户或包含该用户的角色授予必要的权限。 + +openGauss支持以下的权限:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、CREATE、CONNECT、EXECUTE和USAGE。不同的权限与不同的对象类型关联。有关各权限的详细信息,请参见[GRANT](GRANT.md)。 + +要撤消已经授予的权限,可以使用[REVOKE](REVOKE.md)。对象所有者的权限(例如ALTER、 DROP、GRANT和REVOKE)是隐式的,无法授予或撤消。即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤消自己的普通权限,例如,使表对自己以及其他人只读。 + +系统表和系统视图要么只对系统管理员可见,要么对所有用户可见。标识了需要系统管理员权限的系统表和视图只有系统管理员可以查询。 有关信息,请参考[系统表和系统视图](系统表和系统视图.md#ZH-CN_TOPIC_0242385743)。 + +数据库提供对象隔离的特性,对象隔离特性开启时,用户只能查看有权限访问的对象\(表、视图、字段、函数\),系统管理员不受影响。有关信息,请参考[ALTER DATABASE](ALTER-DATABASE.md#ZH-CN_TOPIC_0242370519)。 + -- Gitee From 60691ae56839a2330307f606061a5383f1069ced Mon Sep 17 00:00:00 2001 From: liyang0608 <554903772@qq.com> Date: Thu, 28 May 2020 17:49:17 +0800 Subject: [PATCH 28/35] =?UTF-8?q?opengauss=E8=B5=84=E6=96=99=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Developerguide/figures/.keep | 0 .../figures/EXISTS-NOT-EXISTS.png | Bin 0 -> 2885 bytes .../docs/Developerguide/figures/IN-NOT-IN.png | Bin 0 -> 2970 bytes content/zh/docs/Developerguide/figures/all.png | Bin 0 -> 2167 bytes .../docs/Developerguide/figures/any-some.png | Bin 0 -> 3304 bytes .../zh/docs/Developerguide/figures/case.jpg | Bin 0 -> 11302 bytes .../docs/Developerguide/figures/coalesce.png | Bin 0 -> 2148 bytes .../zh/docs/Developerguide/figures/decode.png | Bin 0 -> 3098 bytes .../docs/Developerguide/figures/greatest.png | Bin 0 -> 2197 bytes .../zh/docs/Developerguide/figures/least.png | Bin 0 -> 1983 bytes .../zh/docs/Developerguide/figures/nullif.png | Bin 0 -> 1693 bytes content/zh/docs/Developerguide/figures/nvl.jpg | Bin 0 -> 4295 bytes ...15\345\272\224\346\265\201\347\250\213.jpg" | Bin 0 -> 56220 bytes content/zh/docs/Developerguide/figures/url.png | Bin 0 -> 7896 bytes .../figures/zh-cn_image_0242381460.png | Bin 0 -> 2277 bytes .../figures/zh-cn_image_0242381461.png | Bin 0 -> 2372 bytes .../figures/zh-cn_image_0242381462.png | Bin 0 -> 1607 bytes .../figures/zh-cn_image_0242381463.png | Bin 0 -> 1858 bytes .../figures/zh-cn_image_0242381464.png | Bin 0 -> 2419 bytes .../figures/zh-cn_image_0242381725.png | Bin 0 -> 308881 bytes .../figures/zh-cn_image_0243595915.png | Bin 0 -> 48636 bytes .../figures/zh-cn_image_0244851037.png | Bin 0 -> 53601 bytes ...21\347\273\223\346\236\204\345\233\276.png" | Bin 0 -> 29796 bytes .../figures/\346\226\207\346\241\243.png" | Bin 0 -> 24624 bytes 24 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/zh/docs/Developerguide/figures/.keep create mode 100644 content/zh/docs/Developerguide/figures/EXISTS-NOT-EXISTS.png create mode 100644 content/zh/docs/Developerguide/figures/IN-NOT-IN.png create mode 100644 content/zh/docs/Developerguide/figures/all.png create mode 100644 content/zh/docs/Developerguide/figures/any-some.png create mode 100644 content/zh/docs/Developerguide/figures/case.jpg create mode 100644 content/zh/docs/Developerguide/figures/coalesce.png create mode 100644 content/zh/docs/Developerguide/figures/decode.png create mode 100644 content/zh/docs/Developerguide/figures/greatest.png create mode 100644 content/zh/docs/Developerguide/figures/least.png create mode 100644 content/zh/docs/Developerguide/figures/nullif.png create mode 100644 content/zh/docs/Developerguide/figures/nvl.jpg create mode 100644 "content/zh/docs/Developerguide/figures/openGauss\346\234\215\345\212\241\345\223\215\345\272\224\346\265\201\347\250\213.jpg" create mode 100644 content/zh/docs/Developerguide/figures/url.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0242381460.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0242381461.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0242381462.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0242381463.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0242381464.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0242381725.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0243595915.png create mode 100644 content/zh/docs/Developerguide/figures/zh-cn_image_0244851037.png create mode 100644 "content/zh/docs/Developerguide/figures/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.png" create mode 100644 "content/zh/docs/Developerguide/figures/\346\226\207\346\241\243.png" diff --git a/content/zh/docs/Developerguide/figures/.keep b/content/zh/docs/Developerguide/figures/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/zh/docs/Developerguide/figures/EXISTS-NOT-EXISTS.png b/content/zh/docs/Developerguide/figures/EXISTS-NOT-EXISTS.png new file mode 100644 index 0000000000000000000000000000000000000000..e94b8279b0646be5f2ff8961f87a3da6132200fe GIT binary patch literal 2885 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 rR1}Vkgn<m4Y)8iuYKEDZkdTaR zhGXYgCfi^rov&dmNtU53V;IYs{(-` z2$b>n3&KbEeO=^-K7R4+wlG)upTW;lE1x_$*My1i-)@uBoR(8bz;)CK!&0>yF# z1SEhbYii#&(C5@{O8^2A+;~obur(mqnh8+W&eW#ozyQJ5=+d9I2z5gQ57Ro0Kq)CZ zeVZ$6otSB2W8ryBF<21k68b4e>7U#BoRLn5Z}8WHwqZzq$XD-l&swbj{eUa|4+ok3 z)~h+CA_*pV6MJR6N8P6fWf?Kg5<@z?iKg8%+Vi9(kBi1H!E%Db%ryQbN~o|j+7di9tO z&D@!H+8L-F`Y^hp;D5eXp)lc^-qFUYF{}O{V_{HJO=B?mUh@DESyb$Hk47^0kZe=K z9cbVk+7*+BWR~;k)kBV?lwEG_156BVKGn@OaKp6UnH>}7NkA%DyQvPaNPr{zS)WuQ~D2)0l+_gb`fF~#7nO7FlI=!pV(ah~MB_pAy8Dv#tF*tyx5X^j7u|Q8 zZ{E0_gxX4<%~wB>wKk(K5MwA0{xkHZ^wf}|XH!`;J%n0`e+$%(SY82)OOXV#M#Q&j zSaYa`rS@a6=Y1$7D~B~+8)q>8`pV%T?*o$W7S+A!OYnO0{xA@qZRj2~{y3R23CT2R8n zq}vbni!9pv^!^@et?78z+ibVL#Jumq8rzT8C;ti&=P(YsCdhxS>2AX-Q_^m4Vj8w( zVfm?$%z&^0rlU_5Rg06FdfJtUNGg;(%u?s6j|}_O-xc$1anrfIx*c+vI&_uMG(b=O z?}NW7F>g~O_BFOPb29HkS7elil>6w;#2jszjmdySs5uTW;wUsJpF8Dq5wK5-@HBTV z8MrSQ>m^Hw@48VPo)_yb+gLhxL|vtEDVGk3Cf(eHU%=q7k7#x8%c(w&$GdLzhM4ZJ z>`<@^Ha?GvUn&yqO;+P<&n#(y^c6p^a{TTA`aW|zD%&RG;-rAaOXH3Wt8hbO*<;7w z4}9J)(v(II^|}Nx6}R>%gOPu=Xd}j39>qG57+?ApTUdDy06D$z7S9(NZl3nTR`Nzc zRta;OH>=LqaRPm%>kmyChU81)^`zawYN)8Kp$gVsJ;zhtJbX9ZF<3ah zKX=dtjUHOG2+c~m$Kr065yY K!pSzjKm8Y|@)D&0 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/any-some.png b/content/zh/docs/Developerguide/figures/any-some.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c566b94615d884c92cb7a6aa4212548c5446ee GIT binary patch literal 3304 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 Uhb@oLrxSpwp}D~uJ^Pq{13sG|g#Z8m literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/case.jpg b/content/zh/docs/Developerguide/figures/case.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1c19617092c24a213aef5f0b06e7472ab9b3b42 GIT binary patch literal 11302 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/coalesce.png b/content/zh/docs/Developerguide/figures/coalesce.png new file mode 100644 index 0000000000000000000000000000000000000000..681174f67ca9f63a0489ee649716ef3ca84f1004 GIT binary patch literal 2148 zcmcImYdF&lAO6qzuqbn^&?S@{(*6#U^C=^ukz-EfkjSwZ!!{+EBvg#8J(W`-7E!91 zGo>wg3Xww?ir9mU4bR>W@3;5s`{8%Euj{^k_qY50WxJhm*dwuD0sw$Ljz~Kc06;+g z?k*<4@2Rho=J*4WfO4<_o-+&iTYWB1`7^p2Z#k%N>JPg^sVkdk&$*wFUtA|dC+5JwGdp)*KF1>hW-8%V zS2|SN^A2k5miUy2)#2MHnW`f?wX*fy#Jo{1as{)yk!lg$>~Q0d7-!S*xdtAS!GYy6 zZuWR>kEkQpmUl3zyIXME<}}+M;URZ$PV3q|F(6FGarN|@5StzHLJ2*}8AkV*bNa_J z+HN{i{K0fEXe)%8JU_^NCIv&sjVa7dfTDxYFB;6c=m}B+4VtLwGGOM%sV2hil>HcB z*C|Cvm2H;$=CLdlta2EszsYWKb4N{dPiQU^-^lxzv=LfkOd|mE_i?LRZttDQ3)yJv zTW}Ff7_7CUGs^HO+JkqqX;|emuQm)>$Lyt0b%o=)nSgugo5qj#8UyZB7F7+sf{y(* zeS8nQQEFN!FYtmK>F`qZC{jB{flK!B6@9RxuvyX1Hhulcjrqp1t z6>cSDe`v3<3pNlLQw0qd!GY1tQ`vtwnmbjX|JJv*CcSf|%x?0T^suQMN4qBW!Rx4> zd9w?-MlC9OdgYWrZ8y$d-1Ln{sEz4y?lelS^VnsplVITYmbeN`(5>Rt1cSJShF=V5 zbNzgCFhbuG9 z{X3VOqE9c>hU|=8H(LsGaNPat=31@gwXVo`dRp+%8fW2%Yo-e^p~U6y+^bP9qs+18 z8ol^3uN=p*rp=YS?u=Hr{+Qyp&5*(f4AS78?wx+HoN%8UhPi^g4MTvcF4RfSkDo}{ zOjKcL1tu+DH5|p9iI3j59I;w$5eW~L`PLrzfdubdEZC^mp;058RzYJ5{9(Nn%AwM) zk7!-glU3un#4Nev8m+lkZ|j!LB`-v$oLv>M+KWjdpA)| zP?@25nCW%Jq#{ffGQ!m=dDe5%MO^efG3klB={}2!9e(Z(GQ0Uy6k8(vE-_~RtwY%v zUXhvthb8n>H7-kD?2%O?JXj>E31Jc5$5fO9X``gVRvnzdE=sFB=;ri+q|MJfRQ#l~ z*2N5t6kEbJ!@+Hiw^}fC>}RpP)n3y^!S2bsONy8gQx)|+v6^p8XYk4&sV?n&lj&mz zm^d*!<2vuxnCue_Lz{yPz=(#tLpsk2bbG?F#dkjG<4aMQ{>m4Fz!fsicaow zA`9h_Q{ZWQc^^Wn}r~5T06SR*Xm1-KVQTtP?AQ?`WX;O}Q=VQOD!8ol_* zq_gH(ta_AxD*>L9VOkYPZWS!JDn`-@?N8*jJdg{O7f#Zroy3Z&FYHCQzc1e8*!ycc zX-hnS(+pnAIwzTtMqJ2Kcs;) z`u#R=ZDyscBP$cUFUD3Wew?Dcs;~hzR5-+25&fvSf!^j4e0qoY9y^-NouIb zNzy{WHr0K;MgA z8g{JEy!VSQ+xL7d%QwCC2!_?)zN=ultlOGJq&ZFXTa4=yf^f;zeNb*ZVXFUl46bk1 z*nbFG4DF3Ni5RT8>Wd$mQ2RviRn|kelhpws5hIaF=SGO)r(S^c^sHQvfMBd<3IM$n z0x8_Za|F#DN3+ zBt0w`TXE_fPMlAghv@&64?(y;IYt-alh%O$tL!c$Mejw}_+kx){}}*|_Gj##+XQ9& E3v{3E^8f$< literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/decode.png b/content/zh/docs/Developerguide/figures/decode.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6cd8c0b68ec844bb4b85ad90bdc4ab9c364824 GIT binary patch literal 3098 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 QT?xSDsQVEXCh*dK02%rRbpQYW literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/least.png b/content/zh/docs/Developerguide/figures/least.png new file mode 100644 index 0000000000000000000000000000000000000000..b42a2f1f9c45e37dcbf7a2634f8d9e0404d13cc9 GIT binary patch literal 1983 zcmchY`#%#3AIIm~40W7nCLMPgs>57Pk4qSH$=z7aa?52>a;c7)gD4%BNp7K)k&MU4 zHPW$k!jNTbO^33u6+0_48|K>4>-GE%&kx_v_w#;zfB1fW`{en0yDEb;KmY(h+1<_A z9{`Y2+4liJ>3y|UdHnq#b=BY13GifGleZ7D7)LKh0HD1{aVJ7F(@^#D;zi;in!oQxahzBOENawZzN+Bl3nONU>Cn9k=aS#ZH_b= z-0t-(1?^!UFeNwqqL~tUm-0g08eCK~NDRb3zC+3`$Qw`8C0xNc{35m=DWBUq+3gpOZ=}`aD{cfw7^#*D*%jeXV~eVE&MLJfA! zFJ_j!*sobZfj=$G?rCUsNKrULH9WGOaCdj*>^3?6<-SJ{Lw2h<^>V`PV{Y))I(leC%!8fzwSFzw|XaE zSEpn0I_#gS#96<^RJQd8yun9TLj+sOc^x8P{B(xcQcAMYtitGjd9`&qU~!oqnSka6PdP@WS(zU1c{A|(3hac&DI>#Q~%}!XB&cG(K{J;id{g*8hFr}wE)FguxBVgHs zso4_Dt*M!a`FUf6Rq)NF>E=9iIQ>>9bqJL6TUgR9p9Z2SdQbS!rXthcCiQqwpksYb zG@A)rF%$r}!O_LV(J_BolWaNSkERJC8 zT@GuZULTmfWgojoGKY^k%ynUs&)&NLa?`>g^if-?GoMp16XtbT755WBFOo*sGp|QN zKeiZ;Yd~{=A{C2qb1BeACm6&e9z|bxUus5qD2gO6xH-$>^-K1UW$W3m5WC{cmxDUqG~I=-Wtyb zXyT}D=S-WgA64KeMyOja!^&|-+iVKfSYc;o&*Q zr-W+ITKEzKX=c(F0&^_ZX>(HKOY+Mmbi_(cl{)N3Volo*>a155zud=b_|O~cVUXC# zKwnRAUmxMhP-jGA5R|uI5#VfX=b8iR`uf)A_r_rGN(r3o`Rh=xd(Q;S8ajAdx#tqU zzoN96XoA-!QWW*=m@ZXKB|BU80p+{9@=VwU*`1G9tq%5A|KiE=K;cN`B^!lx>$G%e zx+M(vnYe<{+q-30+{d{SSD?B%9eFfngI(b`>*ln zOW0nf8E5$R!Q{Y;*KI1RdEM9C7MzTL5hFC23%n|+0*!j47_PF?e>`x(onEG@v6Q+e zdYzR!<6n!pycR7Ms@7nrWGH0X*n$4{KVwTAr~@633NY^oyiwiGs+b%OxKRyhB}GM% z0d|q(Q*}iR06SQy*XT%)6pk7chS2hn!o~F6FDY)37UNr9;O(oW#Wbv?fgW0J34%_C zq}$3ZRSDxf5Z(J_)V*cCh27sARvG@XTFw7Ez>dr__RCc7({A7E8Q|{X?fk?kJo{hM C_0v@V literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/nullif.png b/content/zh/docs/Developerguide/figures/nullif.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0e74363d02b682efe4cc63350c7ee514f80a79 GIT binary patch literal 1693 zcmds2`9ISQ0REa=BfTqyTp3=?)r84Qn`WD2OjM57IY+3Rvzkr9>khNz=+!GCxyzjK z7PFzl5vdq*hF64!nR@m98Sf9z`FVbSlI`(WX(|znUBe^|;MPx#7plM)qS=d`}<U3c%LZjWpPw9_Q{CW4!A zRi0G!DkyMbDG_@vB_Ib1Tj#5=+=~^2HKyl7qhRf`3qh-H)sd6@$km$B*Lk9ajXTp? zPny%*SiE6_A-N@!cAr|PG>6QZBe`;EN++=S@nD0Cn%~^=zfCrtU>?55MfM;p3;Tl8f_LFt-ogcCN~isndm|THxT*@st3TZQ ztl6ZRFv6X-4&5qP!X@~auqPHi7O(z`^TZ4`*F`o`amei4$@S2kz*|I}3{FF>gyQmi zors~6>Fmf^OmcQhPEfy5>LSGWm_=iI-VL~L#K-K@Wp%2xX`D(p>@FU%j z%saje=m|5+&GXd`Yl)}+fiPl77B=t)Q)16Im~OBSx%6*en}^LCeCguPxsvo3{_WRK zHf3CnfPMw9;>UBXBJy+4pWTyh%7#t@>!WG`ZaG`&~8<9d()Z{tc zjds2o$jki~_-*peia(;82IKP9FU_@3BFuv;KTeD?KJ(44u-x%~8vfolW@}u@+r@a# z$GTIQrUvCxwkh;1*nz0f&<|x5f7G%We?L`BTnteXrp6Pu${y&+GZ^cf$@u_!MP$3aIXs(}bCzFZA|7Qmv!4!XXZL6mJM4BI_guGsznS@t!1m{YYu z$+&AwBd-X5G9*K0SMZt1vIGcTUu%$EGGaK4|8C*U^|0L-KQU{TBo!a%o1&Pl=KUfk zO;G)iC>ULMX>l>B%_gqPb)30vQdC-B^Ck;y$$va;XDR51Qa4pp%dIi}#GSC2eDL(9 z>%g(fk}m@|XMf1((XQbLReEhuU|~V%KZD$U*#as&YIM0D%PuW`S$95 zr*s|-l^fteI>M~Mc&&TH;J-T!k~aB|BkXIMlyO@1`(EwR1mGyH%qbdnT={nE3_1S2 zw}z?uxt+S6>+^7?{xP}D@bRHy4Rz-`;vLTu*uw|e?08e@FzgzQqPIk+w$WcnHkkOg ztBjb=hg^^zE;-JzQ9r(>{a1Bp8t$=?N$7OA5DJcY8AILdtI`-Lblp+ojiLN_UzN3$ zvrlbh9uyZRXbqcsOtI%n#d|VsFjO^rM1R&HhqYlXvMs zI2P{`-jyHzZaz|`X=JoTA)nY!4Fhq#U_}SGO!|QBbSpS%$WsjDC;154sbd6{*>gzv zs~qLzxSR0+^o*sng{o%`0PPH3$U;cqB#?0E(4_GHek2gufkk*?Xik}XmjYN@;nCHW Hp11x5ajgKv literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/nvl.jpg b/content/zh/docs/Developerguide/figures/nvl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c378ec205db7c788fa900344dbcc2aecb25f120 GIT binary patch literal 4295 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 F{R6S;@vQ&= literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/openGauss\346\234\215\345\212\241\345\223\215\345\272\224\346\265\201\347\250\213.jpg" "b/content/zh/docs/Developerguide/figures/openGauss\346\234\215\345\212\241\345\223\215\345\272\224\346\265\201\347\250\213.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ad6fb7bd992acfddba71c2b91a68a6b1caac5d16 GIT binary patch literal 56220 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/url.png b/content/zh/docs/Developerguide/figures/url.png new file mode 100644 index 0000000000000000000000000000000000000000..df71e9ed0c52decce90ef85868f0a03cf7f33c09 GIT binary patch literal 7896 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 BWrhF% literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0242381460.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0242381460.png new file mode 100644 index 0000000000000000000000000000000000000000..069d09f018ebb9d24d11603941aee4987e4df724 GIT binary patch literal 2277 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 FV1id93qSw> literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0242381463.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0242381463.png new file mode 100644 index 0000000000000000000000000000000000000000..a32856aa08e459ed0f51f8fcf4c2f51511c12095 GIT binary patch literal 1858 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0242381725.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0242381725.png new file mode 100644 index 0000000000000000000000000000000000000000..35508eb6ef278ccaac3b902b262391e5bb6a3552 GIT binary patch literal 308881 zcmeFZRX|+Z(lr{~LU0K#Nw5$sc;ha?-6c4|T>~`1f+djP8ri%o(3=+Prw1$k+WM~_f8A6|Hv z=nwC7BBQcAdPMg~L0Uq~2k9UaqnTRHw<~y2rA51AzIKaY1lQZr(a{LWvJ|Tj6_e## z!V2XbmMVk@Q-Mz8*)x2<$6ST;#9=i^i_MoN&*r~aog1pmUj(nr3r{A${Gp4nXF#}m zM0J?8%(B|vHkYv)u=*3#O8-mkThx#52{@5uyD`a;7|s5^P^JuVSum*m@LxY9N0RIA zZ|=bS&ma9cLSgFrsAD^Hr_rbXKHlGhb2-8O+kE69b}!5<0@6YZ-T&*T${!bn|7Uf7 zkA^I3mWGu=o^8E0oAF<)AV(tFym<0&-~JyfQ>>9+d@p+1%xm+v&Hw(r2lG(=>q7ot zH*ZQM=jDi<^Jxpk86Szvad|mnrOt^;oa{oDHZT+6^Ju-c^7lfo5+7{8Pb4rv`(vpg zw6w^Pr9WtaW%r_~y;}|$pWBBr1DxGb!KYN|Cjjpk-|Qf9pARn@-TO>~MGxWXi-lGC zU!pp1z&)2D$p8*h{zKnR|5Dtt!G9fvZiGsA{}lp(IvVuH$>@Gfh#4yWSuFBZr@t%s z%{m2E$eevc#@Z&us^Ew9&hua~khE!al}=d;!b6C9E@EOrT}Hj$inHg^HCS{~_ePp_ z@Am4dc|%~u(s<+APeO&VzM)FwRAg4aZ0KJzipQgdo`{ogz-mr)e*X2ISNwaj)jLxR zh9|kvpq)t23C%Cr{9OGy>nKLakNZnSkHP*LSBEBeS;G7mfe_8?NwUr(G$v+Mp}l7v zx63fE#wjvFI4GNF+`k)iHA#hO*NR9{*Hui{ubM%cHn~Ye^&CDR)XcH`D*-%Nt_+fw`@)n}-iQ>tPW!q8@^GaDZt5SG%-AqKtI8{7M4 zrC?acrOD+%+GyeaepYQp>$*HSAQ4@f>X|}qQE8LkZ}+3ZM^*kviyuEBWd6r-O`$=? ze2L0pqS}AuIcHq7=-jo8<%mkYq6!te-ukTa%{1tG`)1{`v*@xNEF!cK$(XSwm63SC z3*+{h5<57dafw3+$*p$n<#u=*uKRL<-pd!RX27Dhe0}3o0mnenmwIaq41hV2iMW|R z=X=-yvtXtN{|pWeweI@E(ab2Y@Pj@Mo#c_w>sHNWqH*~2;Jg+P*zIS_9gi17G!yxl z-Y(2}9Q9!A$0K&*jRan&c2qAgg4RFh4uhIstWK!=D`6^Js zTkfGS%_h}O+Ruxth^%|);hI3plVB(eRy<~Ge0qMn8RvL>89-V8BL~yBL?Ftd>wW$kMwK(znu&>ZP*ypU)AQbyYe8ONxg3X^vMjTo8Q-$7L2H#(vZ;*9?qCj%A zfm-*+wD-B=flzmq_rYM{)rrNG3qES!t;8`Yp%y?frg70L$fd={{m zM{9faHjUM_%NYE}wbAp>h~sU66M8Y)t_6XZ1m9!GQT|RA|Om=jz~zfTUc&_`;%i z$I>Y+Wakdr2Af^Ihp#&HeZYmlU}WY;py3E^&Xe|HZ#OZ4%kyghRn6DhEwHHE%}6V1 zz~#Byv#zR$0MLl%$#s7q;hchKm-Ccyeemz&cOdf+EH4?1$`=0Et)orJM+6_3Ex7oB z%j*%emD$&+*%KtXM!AWJ1m4uD*AsHIhtl!jP<)1uscPP+3-l3Gc|+;H#6P(NsiE^7L@>3YJyp(CK*9gdOm0zs8{qL=M|*+dMDl3 z2T@X##kw=#9yn8~Ewq~xmN8l%K6>Um5KYp0kGNg-_ThA_NZ*~EpSQFxUFIda-;6!Na9=c+Fu8fN2tc`s!ju8HtMp32hZy5+&ml8H z5AM_8vM%YJeX}NQ>h-1lXu#UBXdF-EEP-fIS6F|05EPb0A`VxP91G&>&42tph#myh_j9SQCTHXRaJ02YFWzIy4AG$z@ILE2m2hMb zQZPANn~)X{TtlIC!6~3$z_$msXd=9WFTKwpx?KxcY>=x>F@$B{%~ZA*atuk=JvbOK z7$t}LY-KLyRqIfcK9DMR0#g)7BYA*_Si?J83&U%@^MS+*?vUGzXdxu(>20xU?!WVQ zuItdrB{1NdUiFeenu2eeJnxPNg+rp{pTmD--$ivI&Z`_o(|9X6R@g?w``cE|Uv(T< zakw{{(ORVUVCG@IYCGT_#3JR)r-s}_WnW>$2hHqKM=8wwoVHd0kt#Gp2BD z-C6&k5|lAm@cr$wcrVX5V3SSno$#B^TXYoF5ICW zBYmy|>gm+rjc$9TVi4*?qXu2<*J=(slc{t@!` z81;T8T4_4>2m)Q7xUcMnJJKYQ80I5720nVnwhX8QPFqay(bc=yQ~a*W4w&aQLFfH# z*Zn>!^@=8BO=@`+4)xBQOLIp(VsBc?!+F)*-4M=CBV3J_8`tFFP55rWL4%?@kV_iZMro<{lP@GmYH%oZY>G@BuP^e*I)+juuI~}BdoRP1M2wz& zjMrvdmfs)G$#Gkbh#@w`gt+3EpJ&sOi#sA77STpj2J>INUGiKQ9Er=hM_hKnAhJMB zyxy-i;xt(#a#x4UiP;Y!2=b6O#xn$`X7<9lSKdLo`CyqvcxO>CD!aiLlRWgb;|k}% z5w3wgJVQc0_(Md>Cb};NjkkqRw=>ma@B;x1Su6w~FcHdYQ#eF-`F3CpY1`+C(V!E$ z;!zUgG@SJw^gW{e%kMCxOcr8O6~}GNZYca0HgoC57bo^x4^LnKz*Xe4J~4wcBykEQVW%b#;pG`mVadzmCAjB;M21OdZP@WPp{Ge z+H;1(2(i1|wug|f?alGJB)!p#iJqYbO?VY?(Ik8+_j^cL z)hv_PwZgiqEav?>Eh5*cc^#c8p$5ZMCCj0zV|HE=J{>sqhQH-5fGPBm>+P4O_5my} z4hw=IP-mU=ZFvTsAv%SR>~t8X+(DfWE$s@*&HF(LYk)Jl;gPf@tO~wR)#3nPBK6r6 z$#uFp#pyc2fl{vx@ebD#-g6)}IE46&!UW%4h2Q`MvRp(#co?L3z-+P&>Brq$U5Ndz zB`^Q!9iGV;A8YTQy%&EWy$~VfpBp7E z8F_yTZ(b=6$o3iYQ;#I=R6smYa*Vc0m*Ff1L4Gd-ch9DV#bpC2G)i#^noW3za zcr!T5f9VmniM^v0f)^fen!ef|jvE+?o8^N}B5%~EgZ`{I0!VJ16Y9Wuy={uHf=_b5 zKkefY5TC^$Q4(t6l6MQ9{gN{FJ?V?-!PzO}Ar}wcV~X-3*xqKp`f}@J4}5!n)vdX-XKIWV}P<+kSEs zq)1U9={5l@X~6KK9ErNz(}NuL6CPFST!p8iTXIM1doNsLk$|gLv8yg7CjDGdJ>i-v zf>tq@He7t|JKih4MW^MT@fNStFz9C^mBx;zHx5nOyedv>yEds|F3QzdlJM#aNmVh5>VD%mMac$7Ed(%sL$8f~DH26UO8m+J22)543}@NU715!7BO zIAn6Dn*0o3Lmut)TCxS^2SPR?GmkO@po`u9xF`oelrR(oJf|yiXFOns=at)g@c60h zw<$hP?)T#Q=p180`!99BoE*{nJ$eC>dX1ilWCW%_dD3plX_52c2A~<2727lw_nX;W zya)j!f>%4{TW8+=MFTNVk%0IyHuN|6agmy+6lJ!5WX~eR3CH~;7A=r;V~7cmkI6=8 z5ec;Iw~R@Vbg97>ut03YaLi`I=d%T2Jnnr2?LgYkc+Twf%RcI<5pm>l0TZIgIJu*t z#+WiY9+oKJEs4jUG4KR(56S~nGL58$HUtZtI7nOK1i(WWJxb}3u0SUDni^UT-qRw2 zjkDP5caZ1nhq784{GNe(N~Ug}>&HyQRFnuv6=FDCTa!t7kAqL`3mO!E&1c435ss;Z zjxA6`EqN_CDTm5@k+{nbw;1pm{uE)eeGBG(b2B&>xE@X>v(ag^S5 zoo-NV7Qz-zJ)Vr;H?3q)`!>qIGvn6b423=xe^7J*h(b#^SDgvp_YJlsy1lOE7CS$J z9tEwjT%u5NZu+X@q0miBncUN7KmRQvOv!Zbd{iZ~bNG`^x;!EhUuyq@ke#|!wVx<< zfJI=gD~9dcJ^}=qCLW9#_+gPOfOZoqzua(J87+Db0;NcWF@jOdpcBSoe1qwjZVQKs z?3Jq-^Iz%&_`juSjtH5`5`3;DKs(tkl+rz6?$q*2fS$t+HYF2@M!0YG$l{K z|7dbF`2svG({c2Hj87fU3Sc^R?UL;lsogonF(wFQHYa=68zzC?K5-Vq9UyufrMe3a zf`XSC-`2PBNGQSUTH=PCq~1J;DEcX1@iOvaO|)B79Ueg@lAqd1G6PSr$&;58;$hVW&3 z-wM?XtoDiC18iv%l|`~de6dEDCd3ZDz2y5Gpnvjt_p|C50nL$lLf9S_Vm>i~JD}(Z zXKzscI^GLF0{hWXXYw}X<7FW*MU4@ku|1CeL~(E0Hzff+>4#r1D6{ZA%n3D2`V zCKW1i5Bl5U-&;HJUAKJKLS9%~THL^PzKn-41=?isHy)XrZNU&wScXl8jrccY8aD=l zEVdpT#PsMI4h%(;pgOkS0I6OkxOxivXx6+3Z6QnIiGlHNK@E^I3a4 z(2=pV`Tl0EYb6|$QIDYd4~&$ln<|74@@cmV^8>wjOdsna$w?nc&|DvtkQW35+$Ma^ zepfy;7;!TsCIpScezHK%QFI@z@1bZp%8gd!UOyjp9mIJcsX}`N+Dp? z?yFFHQ)t z#w?Y0Uq6z#i?l%h={;C>8PuDD%Qq>8Zlfodb+Jo1o_)B*49kuw^XX+&2@J4}zmG2f1^3Pbl6@*N@MG$uK79 zmMJ(NFzEg>)Y#GP`;w!M+F)Hw5vlrFE?(eJ1t2cx+0uN>Gg5EH`sEmQNdL$vWG5bQ zGDIq&5-F5rK)69oFH0`Sw_YG}+)var9m09eka%+^_%1;};|Yw%m%w$)GM)VbP$YKN z7m+u`PpZkt0WZKy8VrMXUUrQ87S(Kzm?CP4N|TCIq?xc_95LDSy9Dvl$aIJrlnHq~ zf%Qeub)|R5NO*`lbqJO)soyDlz*@2`weL{o`4pPyRS#aPQ0GH57iuH;m1Gsde{dY- z=bZ!~LVvUJKo;6;A}T=r(Z^@0wE$hmZ7L2?ubKp!ZLGec_;UO4*GOYe%juCHnSdT^ zW|1{=jlTEW8>C#lk|pyM7loXR17XiV?wQhyk*+>dVhc8KMX#@+<&eWmP~oakkqF@SWvA>e|0=;`aM|aS)ITer)0^4T&RkTss-y2$~RKLf1J8P^ngfvGd%BA zF;t-_KtT1Vm};jblZkg@&uuq`=o)%J3O14{gbq*6vDZZDH%Q7-MV`1NZ*BS;l}4ks zgJc1Oq_NdKJfo%SL1L~zYDwJn=s}`*fek#@*aRtZZai}OC_R~H^qu&L2b80V8}X&bJ@ro;JF*~?ws202{>8PA8d<$^D_E_o@~GCI8IZhXYws*>=7~w3MdRT zcpJx`?0^}x({X<=jwmN;!&DeHV?s_6+U2K((u))9MN0QGm{>Z7B6)H%uZIipY1}KB zoDhOrwlPg1Z#hFkFae95Z?0V8$kHS*cA_+!@KkNo!Y+KRF$45AN5O)0ANFV)`v{>w zw^!8j-W{B6qmLT|gO0*H*X`IR_3&ShpL2!V|r$_pq zaFT@Beo*4*n8sb`2I6^|v7umtdd$%F36Gw1M|P@nyqn_4dO8loyKGiTcVPf#Uta^l z4vDT`{?-gqo*+y7xNp-G-Ieiep^paFP!$*8QOzz5KYKdrp zlNAMN<}C9rTrx>wjxw^nBu4rZW|&O!-T<6t`x!ZLU`H^}xj^||mv$P2U2!T})Jz;=wJg8Rq-bgv<~4#d0$ zx=zx%P#9*r`x3a%6LNO#i{~p>lI;%~5SCpA3{pRb{68`w#`nKYL$O2pyn%$F7!%>- zX&Lwvn6j0hoo{caWhCVjhg3Tv1yMQj;(^T!c%BoaQ8)N+MO~@=ZNu895BJY~y}Zug zN67fDkMPTQ4oW9I&|8{nhDcPGDS@}AZx zFP{z0@y^Sd&Yp%-A2Q^LNR4MV4h<$cv{?Xgv#@*x!J8P2#StMSK4xXkDE`IS?Nrxl zA4J`uQ*jGmiogPu@z1r>uvE2`)y*^*zh_^DR}*-IcXI2ZgPIBs|1o#4^jie{ztm_B zGp}cQ_)?fc9J518qSrK~3wo2a89I3En5y7krwuRuAbl@h)*6 zB=(_rxB#g!jRSKz`#!{I5&`!}}m4}B;MibzaA{wk;ZM|H58616dw zaVa+R%gn#_;6KWQyRi>HUuo87`90q6`1Ge5AwtB-wZbFBX8Yf&c{%(K^0oh_b-`~T z={Ly!b0ufW-Tgk}yX86m0+Ih%Sjfr)1&76^C;xWRe-t5q@jMh5Me^%H|FM?e7k-Rp z7VZ2_I>Z0XAo1}B!SM3q7&gT}=KI&h{~G)EuKfS;&W>*=XZ`L4_}?Qf`@jDCcU1fT zX0U3+OJ-%7=T1IVnD_RD>~9DdgUPoRZ`8-V=Uc$d^D(%cj|ah{Fmcff+WcQ9Q zP*MZNvsF8t!M}s;U!mP>oG9`#Ai1sB^#r!0F+8d4Dx#B`jGbrZ(36ui90mLQ%6YUp zV!ZJ>&_q6OBI*OYLra6fZs7xm?UkSq9+R)XId{uP{tThgeHjzham4}G@^0^{gwP*> ztUrX0u~2?ANGx||fp72T;V)w}kf_}noeq_M@URuot@yo5cTyu^VS9Fh+Px+@P}cfG z(9U%4e(V6N5izQ)*S@`$Wp`fT5m@H;xnUtXJr?r4|Ca8gw>G8!y#vAHz(RIj7%daD zW2kAtKm{>w@+vtz8lX#lyALgJWgf2eYg)Q(Xh0X{LH>umV%#A)TXQ@01sXDmY#CQv z2SJx|1zO5CiScxVVj200*XSmq2h@zqFb}4?9?s+AQ0b89JS}pWf zR!O3n({ZfC0JO;mk|RA~`ZZ|dqO$`mX{QGf;gL(Z30qubGiy@%#Mr&IN~=Gzi;Q(& zJ-!ysxEk^CI@hew~Y=B`VyU|W|dXOj2+(2r0{NJh!Unt z{sC&zAB^)iVEzj@goucnr49I0wjan_<#8$}k(9V}ZUAF47M~VTiKR^`%Cl&!YwfM5 zBPGAW)&8MjtAm0xbT1y#OGmu2HB2o^Z^9&~fBESCur#OQ-N4kV2nPK0w&YU81V38h zBty|x>`YyKY$l-3T3lqEnbP}SCtjY>RIb(3k4vRArT$e~I>WD(3gPB$OucdRjT8X+A9oPbx#GC?ktA*1Y_Dw5XnMuq6tuut5je1Q~|^t|{7&SlXtjIxh5tda!L5~fb=4a&FMA0CyG+I&+g2sh-&c= zPq=wW?T}Usgtc|@K(Hyz8VB7}%pkX@eGYg9G=F=2^^Lm@T4bQ>b{oal19_UU4DeJJ2T~k>a z#9sPMxOutLFKzyP)~KT_D7Ak=3P>%=IWMvX&02W>(g~!lc-~y-<-a8Oo`;;N#tl^@ zOMH$ESaO=Ks!RmZZ@ZoKL}v%oK_bDl+F5PK(VW;bPY+AG1i#g5GpjIISs7-wSIC+g z>!+2H&Ln|J!UM~^H5)#t=TWya&nRtQt-+a$Xk~%>V5sP~tW;ZzTshIDv(oYyPiP7wVp4*loCSHgEA#iA2 zgW38Wt79O8bmjqRA);MW-r+a%__O(iIK=MaWB!$7g;9eB?4c+7$jz^=Fir;Ah zfBi%;=#`BMap^PVW&f&6^vmHoBcT3sStg)Tu4DtV`mgA75S)!friS#DDYFb_Dz!h| zCD1cj&YJ;1N^3=|@^kT==IGGCm8Po%>s$5X2G^O$tN@FKFE0(h^$4OUCbtNn0`k;8 z1Sb2C<|^uTbu}6<-u}`BG8`CT9s|ifOT;D!;yV$vid*THHr#p~&a6(gU%PuwV~xDd ziepyaKsSLX7%wN0tX|CZ`yUh zi8?HxZoB=0?qA?DA~V|x=gK}I1e@QOt4M8Fm+;Qjj%}sxZ@g)>D@^88?`Id2=2}0c zPjz}brbYf-wJ_ry^zPL>T=p@9x`q0~=8+xKUlN)2GR$69HfytS7?!xNo>;Jp?O|GB z(O5yi!M?mA-B_)^qCCjDL^s6BP9W6y@#fCp>BC&=$nBZ1{SQdP6vjL^^~SPn#pH^>RnfvyYK~ zKQCKQ_Y^O)z-d|?KbdvO2?JOKYmKGB&HiA~-^FQ@(IZm$R!dVOH1xi+pH&Kdo_pp* zI(`-L5wQu+o+MJOa`Sqw&=B`1jQl{->~|N;zsTPK3-Z+6el6jWj2d$ccZrxTfJu|- zscui`Hj%&MaeCJhH*G7(Ar#q2k#c_K2omYV@-6*@(v>|IB zG_Eh?a++xV(68`C!bW?c1+zBW53MKO-vr-baX}FgHdN#0LiEr?w&Q+=OHHENws#jM zuhha9BP#Kn)@zRSB-AyVbeQ)?w8x;u#ZB5TQbY5!#;`XQ{9y|wP-wrAw}FJ~t+xde z*ov-+MVy$`GO-Pyk@SJph8Qx9oy^0tUDrCi(HPq7Vu(jL(MvZoy9O=EQk^I)0WDk7 z{Cu(Sy+U@qUqD!hb8Rp<-eQ{|j5D>?35t+yb=CEK&mXurKzxbdsVDshfep&QR4yZz z+mVeXNyhRAmORGZHrMr?*7!mf$EekJ74zuAX^=U%gqNuo8bJPScP)P;!cYZzl$ZZ zkJrtRAoHU>?$}D@A?^7*P6FIAPm6qK+PK|NOZ4yDKcqv}%wRx3l7-n~z;{DbJ?_eC z8`>RZ(a$AXUaYp=;@;X*Ro(%9+N|btLHf(qR`W{6B0<`9<0BpR5$FiZ-ZtY3a+t{G-Q@@G zXPA;QXunxS}?SHDADU(WS3VLT|KTBcW9GKcV zeTTOF*0tq4fZ@Ks{iedXtSX*uF^dsEuwFyE>k=N&<^w8gssA~FH!NL1vsdl|? zs&HpLR57J7NIRI2Hqz~Mk|s~Yn`sNjv{H)%D|caOf2TFUZPvPgj=+~v-vN|F+ddb^ ztbc`!ZWx|7?RDJ_5rfu@S29~KGuvmfuz~{7gt)kD0vK4kW!9R#a}3HtFMHul=Bs<5 z`WAolpg+nfj|fvtxW+8ZfT15++;sT8v#_nQEp_%c^ zi;tk!bi1V3aW9z(5|?Bt3Xn{9ztNrK7kwPpd;wZ7x1V#q{%*4Ah}S6gV$S9U7o4z% zKQjfkYj!|_5dp}3O2(EEPyh$Ue7KcBk4c9W2^zoJX4bN_h~bKa4x}=R7bbqb@JPYIcFJIVHqGt$j_9#N_gE(r*M8(8X(#g%*48`+*J}5MwX=Q4qc5R^;w(; z(P{N$xUO6$;0LYDK{~dCr=A*#F_4L^_gO4WhsA7}5hjJ9Ls!U{lBzitL?N_BR8&fV5tmltj(rVxQoscxdX6-?m2@O&x|IjOuic5C%YUf zEgiNQmMQzra>M3W+P!4XGE{|<*A_Iwn;5`jol^&bmjc6?Vl}9=O4$X9Van?4YP}5; zl5cvA(oLm%AekUnZapCzWY` zY`c7>h-_uq@~Kv}p*GjABKLfM*50;yPbX^}Yq^qlnjL3mSnr&BvU!0uUpmqM{(G6= zZl<`@XrY0fk`=qw$|0*odNsEOF$3nj4u=}!(_bJ^v47L1Y}dk`^?*XLBS4K<+P;?7 z&s%HxrM8AM>tWJIc=IK{P9Aey(wCA}*TMve53hAUC-;ts>#H$)9#-2oCvnNpKTgKy zTAOuR69EU7Akd>o&5(Fj&?KAo9G;$BHhVrY6Z5Bhad)r%4dY;sjgTrFO6s=d+>0ws zw@@Y#1+R#=uKIVmv>PGwz{v!N>fqnUYGO9+!7W{JiJu#8N#goIr17&qvXmp(1| zTtGp-s~KETnP?IAKC4OCiRAKSH!XG9#9WbASwSA=4CJliXRTxL;@PWWqK{8ae$r`* zL?<^a438N3niS8^6&2~k+wWxPL-uLa)IT6xJ;do6D?=5EnX$EFC?TZ<49V!5PZbveAx>kwSq;fR z&w>iASnI8o%qKWK$4gU{H;O=CIad*_g;yk(a;&W-pJem+!d{pcdog*2aoCAMP+O+j zs-G~#S}`ilsGH_P+Z$Zj6Y`X;*xkzf;ywA46iN8^?ZL(c61mp->y3-{@o%GBTQ;n} z)$g)$Xz+$fA0B`CWRUH4Q5MfQr=l+3Q2bp0$2s>j>ol%fp58Dx5j4~73tC2wFe>T2 zzMK;{SA2WQpYcP+zgi#{N5Sk^hyfGSSP@0td1cW(lMMI$#-K{F`C~+?Aaa>m zhiaC@%e_%cr)-y*nUKUcs?RSP>xYIfIy@06oE-(HAW2Q10^-=?GN+{!4_Hal%D98GKFr%3_ z#0qG{c{e1S)QHaooKj@^?Ubaoxu~6^dohTWsck80U#sn~c%6%nHF~yh>v#ObAD1Z4 zGt>=!ofD9Gww4*ck646F@leh&J9~I+MJajiv~VQZYnXVDJPVIbQoxR?&8q-f9xYCNFX0t^sY_f#Tqv(~}mv9>otrV`=7U299lf(mT z3}mwN&W6WXe9~`HzG9z>tCQ|UMPyG0Hi=fIhPl6Xw=Mk6@98mPwK_Q`27mY55(Rs~ zbLKPBa~VxnVRiP{r1kA_%2t?v{9c>`jRpv!t2LX{h%?iR#G5xy;rLUV-LZITG})?# zqUZ60N+2CCRxJrvFjn{&fyd!OVywm<5FwW!k4m)F7F4UjSi-_W$a@;}+%mBBc-Zj# zI^LwRhIdoQZI7F})u-f!0v;XO8d_dyu%eam{o#=y$o%^c8|KND1(4-d`%RRzr$4px z7k`O!m1{RuO&G8Gh{H3@&q>~FGaBQfp-{{!^VUj)AL=#KzPbp@e)>}_UnIxRUp}m- z`jd*({0oImPu`fPr3GPQV;=Qo0B|d>M6WhF*nJ7C(GH&|$ZTnUDI_CG* zNH^4)vO)a~;wyZO8ah9aasZ_3NXK*>;3-)K=fF52*VI~Q^KAK2PC)&y$$Y#C9~&+2 zC6BfpYJeQi6KM9$sas6{^)XKS2C(G=>*Zlp{{5<&Ay6))Qy#DBFz;*@N3>bbLj#Rsx;mUkZ0 zV+N%WZeRlw z1Zl$ljnKe@paz4ICqh?d>;eIW(Rmfn9j&r#y?mQ2qY7X54-IFaK4Q5j=fPb=0qJ?f)IH{_zZ5ytG+1>1H_%^>)aK zN)BBQV}@NjZ>5fd@+o*+x55@OmJXf8UA+pq0rS0{rI|bI>F^sF?@(6-w91;^EhXP% zJ|EHgR@3P^f7x*Tqv0l24B=TpJ73Nbbi&%PfeW_Z=@}_{T#c=2L(kU!Gr8N-{l|!g zLP~SXYVP9K_R2hJX53cDYgv+UY>)50MUd9A;2cBeP8po9Kj$89ct~w~*~Jw5zy#iT zskg~D8ye%Pnj!;=r*Ax0-{9FEf4cUw-}VbUJk>4h5-hKA?0~`%)P5tX#-%$;sgRGJ zo+IZ?`%5vVT~joO!URH=F`Tw%+<&2p4Z`I(_xp{+$2T) z3V1x!xSk3l7vlS7qWN_r-_(83ja%T>swe|Vi-`~9hhm;|Hhg*;0!uGz>fB^+U28u* zJCkxaU#<#L<#FIisu*urpHPpjQfY7+pb+sm-K5Z;pM+q{+AmvDdV=!$mh6YyIL#Lg ziA<#U8@ysLYSah^Stlz$(WxsG`>DChktR@%EMilJe6ZmsnPI3{y{bpQg|r?m;har5 z2Nb;$x+Pq8-y~`U7bXj>Uuib%9{EzF@#Nr`_c@9Hn{OHK5$X-efV{rq&Zdd z^~(P2M_V)N;+_^1iWs?MT(6mu8UrCsLI{Pgb)76Jj!kdGoEi4IFbBf;eZRWkJP7vz1e2t9J$+7n5@( zJcPT3rk%3O$8ocwJe9cV3qr@!MCXM~_usO7>?^W@>@#0=UTq8Q0XIEvalIWpqzvO% z+7us54ujax73jYdqn&^?KNmlEhXH*b(Pil___-6 zVc$t7;k&)_(98o2HlUpQwWNo^kyZ72^y~;FzC>hpQrq-4+Novl1voj_ahtWFZL@Xz z!q9V)g+pzUjE!UdgjFYtM@wy#z~(8xk|yJt&XP5oaMLgSVn3}p(D%w4iZG{wbDgq$ zfl{`&`>o2u3%O|xA2#STR(>QEDH}3Ri>b{?#E|Xon|3Mk-yg{)4{K8vvp~Ln%9W4# zGUm$WE!JTlrXsZccGQH^&>cKFJI?`7vZR!)_nks-!e1|M=`#rE55OJUpDRb>sdqV+ z95nH|hQVx?zdrL54gVBWN*Bon4VXc)^HfzS269MzrOXv6W>|dAL zyP$+kB!4wMy!aB-qrhZu)@;him_D%Jl3AOtlU4S)aCiy*p@r(U3NOt*hS4wE}j)$10T?K-b%@vdqS}!7C@UT68iW2Mscw1*gTy+DBDQe2R*i2#o!x<1S?YYwV&=16 z-3Oaprd6MkoiVCe{>q!Q%C-xkhjN7#Nc&6EjDq3tY2~n!Twp_C9)p$^IwXc@J2TEf z_%TYjYbCc`iSh!rLpTNeKtxPO#AcR7t+=KpE-9RXDuqRdz{u}skI?0YCNVB?^o_er zV7R?h$gp*(6G-EG=gxr;zODlnU_YuQA>PKg0q38jqZ{)84f(d7d^}8f)86hSRKD+B zavwW&;DQ^k4d3}u^dPUmFSY!t3OQJ?Jny;P)CU5Q>z~-v{=;su5&1$_#b~Yf6LM$W z`491bBF19@jcIS}7CQGGm(pW+p2-$K?t1H@n#rd0Nf+5Wom*m?n%1EqsV>YnrA$!I zoq^3!&hMae(Br(RGk+duUkJMO*#p)Q&vy8|^@_J@roF(ufqwZLgFPFj+jE5}U*pZ3 z5(AC7rE7PR7rdF?6Ec411z&fUzGfF`s))T|)2+~X$2>tlLdp^&#JZtjr^4*^CYOQh zIp}Z`dZGNPtYfi>YoSy5MR&?$&Bx@AC^)`*9Mz%;1zZCHFEq1fqT8~x01F)N6qA~k z_%5)C?6y)}N%C`NE0(?`HoPmaY_XTf{zC2dEoj{)Smo4aY!2nJ(!~Mg?0n{V9_fiR z&j$=%f7v(QOD<)@$MW-fC5Fz35bH5&wZI%znO}*Zyz;msyku|*;YDrLphh>WW5SM;^QzhKDj_)z-@UywuBsBJRMvv92LbrXsb?dII9~fpz>9Iq6y@Hr zf2+p**+2Er`FMMV?4w z9H6mjX-Sb{JeNwARajnC5kB~H?&ozM1l@Sl2=L9iBe&-|(Rw^3_pM5fis_DYl%Zz; zc0EDU%%p92%%eeJ{hSpo%&LI=s=`MDL`s{7T*k)*Ri(~Oc}3a2k`EdHe<$=DVyZUR zBlmMIlYhBnJYbz@I65w`Ck@@^oQ=&;=;F%iX2W<6LX>^gymAu94{1L&{l;O6z=bc$ zA&kS^^^MAZjhNnWSG0ods5=hyl4B)}`3j%t<5GczBmv$?ke3TP2r@0C{WceD)!a)A z`7fDvzqmE@`dRZNWh%;Y2i|mC<&i89e0x2;|60$zyEZW-s(>cI7S9 zPyQZmnyt>aGFjdd=+t#Ivp);**A37PYY2+6`D~gyO-?ajF z>2Y+fq1|kOvwjUC_IXMNc`F>mN={8&8$bD?V54jBN;0rxHwdTCkYj4e8e2)c$lHpr zJ}*iCxL3^hWv|+jZ2!LUrhR9XU)T4Y(J9{3$#4$elC;=Df7(yQ3#xz^WErb(+&J3S zEyL9mTA-a09SNF6qgsyt%U7w9ZyU*NT1qNC5aC5-T=;CUix3a~{dyeLnFZ~#WL}}x zqXw{T&p||kU!TEfmYAGe`vE7rfJG-?Atmo=jzq`FB+m3fS(#u{CByhxT2qIH)WqXh zhq_Q{jaFgIVf!wqy-p)C*!VHAbYcpoGP6&U?S7=?SLWdJc_+h~*9x9Hu1XC@IW1}4 zLsYRC=^iIaaXN{f4Y{D==P_R(Yxz5Nq!v}PGgw8m1uA9J@-`j4eug8e0@CJgH8j4C z1;fn+xqilQg>TmQ_76Cu&9_@3iH(DMz}48dDXooa4Nd0LE$1DUp*NVfG^0qA@O{Ok zngbe%v;LJ+Oe1@l_D<#jlVA5c6#f=o-QwCGvDnoc8CCuarZa0>l86rub@p8gQp=tr zm$61ZjVNNeSvZC-7bOCPTZvhp5EfX;nVYUPmI*`4E$ep^q|Szx;~l1kBJJT()}xsP zIV_p($NFi4;2_Uh$p~7vc9nn$^)%OC%Fj`Faj9RIdw3WzW%<{}32#d`^m0)L4y!|) z;?CY8nxlIp2Qz$Af?Ru4Ay9uBGPahk?InI&sJgq>;|I`FXB69<%YZ%2zcj7S;h$?g zYg1C349Q-s`fB3VxI+Ud{_eQ zhQt|f2{rdHIpMtOGKconMK$*Mo}dlm6dzLPgq!H`OF`uzW#O__5n+A@;Cepm zaXXxCec^(?u``HBuqGxQ2>V)jXqNU$VG!qJi4tp($WuhkOJl$)*X8ShxGN?5*>ib691eB8M5Ww%MZL+G$9$#9h zwTh(2$d~e3c-Fa&3I&MUP`l;XH?&UX<&%&5G8d@p4r9yorK$uk*VsQ#J=OUjQ~VNA zn%R`}({{IfE~_w zL#1mfaX=!;5~1(mWK){^9KGKn6`2kuo#fQ#wFu|5-fmi`)P?Gq6R==$Tj^K6^4V;~ zY2wJM3~kS4z)Xq=CsLFkXd_1^2sQqWjm=M}f#oJ36rw%qT{Tvg+{NZlMl-Y7y1;^q zHr(nsLBfKKO%k0%_S{xmNpD_Mm%WrN{ie@z6#r5@QtWtHu;C&+tt~(v=Syb2HZkj* zUbQ|-1fS=3^CH%0i-Jwd(&u$Xwm$fZ96_TjhCeHray4#D*gSXk<8+t=m9bkDVj{3r^mOk?cldadetdz~&``kGNXx}hMy{eX5``Uf+ zIvEXxECdoOeR$ElVQ>Hpic`b0NS4UWd5iyEA_*cmsdC;gSeEz3=L0zjS<4BtcjE^u z2GX>cG~R~O#+%Q2zWlmR(G*84Mpm7uyq1LpMQ3$Vp1o@C8gk!$S3-JBwy6Dd>;I7T zj?t9>-L`0VY_p?|y<=M)J00%Wwr$(ClO5Z(J9g5s?d0`67Q=2?jOYIGQjxF_L{0e8I3i}M6V99vJ7;pApFwtRSH^> zZ$H1+vZ$bvlym^d+VvFKIqqC1!&4Z~Te~JvKNaJp?N9#}DyvRci>q}$A){AL|Ndbn zoF!k^Vsz%xA*G&$ei?fMB5##d`kzKM7E2#5E>PO?Rst z>%m@8tumz?g>g?bC(N>aBi)z?S9mlf25&f8egt*}3Ye@s`T-U9EFSx*ZLlktk%$A; zb&VE1X$S9$%eEdOj_W?Vd3K*m`c+pqr6j;T!O4cPV31I5tpWy_O>N}SPR{qoHgj~g zWHC(ofZfGb82N-gTrf$Bjal?c_Sq2>RD6|>KGTaTTJR?B{qX`7cO9xTlkoxxV_<6^ zb^)&2SI1`6kN0uM=$7FPL9r?mHnTw@a?h&N&hqyfi^w6OO;+?*uz}6pIuQw%|K~dM zf7={nvU~aIhbdhLCZNb5`vFROs&z5&UKVv0`ctqCCe zGJAvBkEq;@anN*jzmve)=9UHE9jit+k9Q^u#`TsW_P0shUcrpD{{hrDDJb-~Z~k{% z;#C7fe{Olv2+ueNnxzn0RkP%Fe>i$7w-n^*;$khYlmxVyccd+l7+1)3F**G zDTy_S4n9%}l?Rl8HIE4k4#&S;c8*`Z3{E$MuM7;}g~r2i5>I2ux}{6+(z}v`U7M0* zYQww_>Vf6_7T(mR6vm#Lj<`|8r=H+(pv}eh*J4C$Mlk!UfASn6RK`oIecj)Hqk_qQ zc6+H~hYBN>&pU;g{4kz)(Yz=98>0MFNLfgyOaeXtCQB{Nd*`H+NAAAL!F<8vAw&%v zZKv|^qa*nFn!f{Ii*FJ}KhG}P`mW+RaPwlw<)z#T+N+lCs$`KBAqNwjSYJh(R!U4? zR*W$GCf_E#&A*7#iQhy`zi;ahouH5s!~i1L#tF1S5JZs_V5;q1M=^@93~#@@qQ%yE zCOZ_+$iK}~L90XK+kGlt*96E}L`&CD{Mb}%R`X(merxM?>a=7acTWx%5 zdF5io_3Zr`$E{%+ohA3vX3oUY2uz_}{zWhwbqt7nlK$rG7X17T1>hf*SiJGIHg!Si zxw7F70=5j<;?3rSBB$Lmxg^N+JEwL=&Hn1HP(T@kI;t~<7z|XWTQT~x9EjVtP`OsQ z$*1MEO(+D(gIy_W@W;$AOtSnvP9^TO--taH^nZq{&V>Cn1VOhi2DBLqGd0MVhv?GV zTtceuevX~f09M@MAoW5Sa>nd@InLi}wGm=^Lv;%7{tSt;X1wR&r(z2ytE~H6&^A4; zEdqQm6i|9DmHWz*lYS`ttDnDe|Aec=r2fFcpHE|Ni#y6dE4~nJfHG|}i@vdviEp5E zFi3KZr998ED4x?cg4jUKhuBujak#Cc_?|^0@A&Zkf(^B$SEdFo_c@-!yOc2KUUJ9i zl;d_-upBATRDTGSXu@V{$%^MnLNMc;L0aL+QCxV-trk)rjaSaCa&*~bcLfeloKT}G zY4nLT4s7CdQ0A<+0dY^P9QnWT{CoCO*@8_zoELNqnRmG)0jM}78*8_C@S=iSeJ4t- z%Vf}HDu?oF&fD*y@Ax1JMVUaW3wK5O&@PZMqC>R;0=XlZIP}mDx1PJwSeN?*^BizHPUu zQf9TuKofNJPG!0zz|Hyp$i7~f+a905=VGwL5QU2v?~qAMRwL3qPNL5hK5Cu{z_u@A zFG@xhDBsP;{gJUyqq?e^BgL}ErTOtJ^-wqdQRQ*ahfqNcf#Pyjk7_XmJRwm{IixY< zUF2HmB5D-35jQgAuueghZ&V<_BOJS|beW80++P0*>} zn1axTa+Frx5iuYBX6?y(V~tF*pI%h0^z?DfU)^rnBA{kLyl#nq~o33KOGB6$J4te;WUs6V1BZJ7MrT3MWIn%8^_=vVOv!2EiAX9 zQ!SL(*g89r0BM1GBuO)uPm*iAk^`6(mrl#JIEqvZPtk%EB9onY;KFtMTHpg~I`1wk zMb7$xSwFWWpGv1^9sZ-W0>_^kZKZ;`R9%m|;U;l4JOMU(Cx|ehB<%iKq|$lncMJE- z@fzlt(?^S~sw?ZV;1`{>mx+pQ+xgk+;lZ-GmuyMjtIQ2}F0%eS4AEf(3$m*#8e00T zRofx&E_$%xA$V!}igX1QWkjH0_D#%X=dK)|$B`7y()SA zEtQ@AEIhco5cJKkdd87`b=Lr%aWFA+GKzF)jjFJE8}_FyPcN9%8`I&3WO-i^HC>>^+#tbh*>d@wCqKNZr1D(1lL&zX|pW?zc~0J-|H#R4=773`4@I3b7o7zu(ee*KAy<@r0iaprN9%7?Ur_YEKJy{)h=l9&( zOm)<<(3f(k#?ePcva#z5!cC{Y{c_Irvg_sK?1eSBMc%FxM&7zj>v#DV za{33qs=f4*6X@njC^^pBX?^pisg3CY_$=ia_lHa3!QKI z!k73>)&Ivd8;-v=+R6yu{-~eSV{4$+U)UMTysF<)*-Dag3bWD4F%sB0Uk+0m>{YeO zrx`WC(#md!=oA9Sv=n3pXGeKhJ3xO-IXgKlL(ufDU~OX>(ShhJUW93>Mtdx($!eQ#LWi$Vitp+e zNvYL(G!2eP>TlEjs`G%%4_XG^8emo{E*9`_I!#%(@3)U6N2hw6tV1Qc3}6ZV5S1Fp;+m2f^EL74KC50E-!kqw;38935tWruBnf3Fr>pf#4YQpWa zfVf)Yw38%LXSsz}UJsfC|C}2%UEa|aHN8)*DzIqq&WV;jkhd$B+7%xxQw}F{3%j{w z5&!)7%I)I#UccWCf{?#_`KsxHd>p=dlH-b2!+> z&`=?W(MyB2@rMC5_{-;TBK0cU>xFct<0&UnnHN^w{}X716Yc7yO|y#{2E5 zpm5&bxH5&<5vK-GbPD2an>UEgrPgJWTRlHgQy$WAj1dTj$~f}z*2u)$dsD8NTVTOc z`vZ&ceGXk=3P<-d^$S5x4e_ClY2(GzbvK`gH<|^o@$>RP{3+I8x7~-8s&fe{V*Rhgf-rbc)LFM#!7!fEN?W=*D0m?N*hd53?e717Y2Bwr{Y7K8|F_%SR^8z zfZ{VOVmZyYhddP?@T4Aa79aa9N;267sPBP(LcKrrP#9rwAP~TyzDM_pXGB>>{x%Q% zN0AJTUP_0$$Obu|8s98Uh#QnelcCxzFtd6-fV{7>a_@WTx_bM~ziU~#O{5#!T3?ul zvq%)y%sp%tgn$@?oB6U2@5@3q3>Xn@3PW#+V=A!|_w{_`+s$wvv4WND zK*~dz%kMePteu@v)Rk;3r1SOI46PyDv!(p@#)v~v0#99Uf{|egAx-Du5JdG_i|@Q0 z^btFa!;vE#d{kzVhaYh`f1hR?{gD1PTlOhwp7<{Az_H$8eeOa(87%IkDvZ&>q)!8^ z_j@xvZ)RhO{4%~(84_dFs7IV#wPOA0|C(#L6tT6%&InT=vN8B-Z(*!JGBh&6c`#%G zb=|-LJuX}jx*o7DU$?fuTVu-+?v;DG>?!L$7g2?I>V(n#4tDwEwY|r$T$sW~s-9#& zXH6X{++;x7OpgyGYaS4L07M1O^V&fC1XE-9dF@;PrMlr=aCHb_d?O6-Too*-qB` z2seGNT{Qv3naUl|)h42f0kGvSoO+Id(lD3rh4H)N4Cb?bQLe z#3|hJRV$&^^hSjEr8^kG@h}0$raxq#@P_NM$S4Ib?{!P;{z?wFP3yVIhRcODXY&<~ z&&~1ORV8^+7{{;mW6*=a$zHJAGi7X_t?S-wj(!v&UqmEeC8jmLkn((Fbe2lT+l7PT ziR1dbYi2)G_lvq77Jek;*Bti`V(yf^DeT973lF!8@PA%x)6k6druYm3&3L|dO++Mo zDTVGo`*pv3U3YV?wqjFrH==X5+y#7Yvpwg638OAEd!=K$qrhwMds&dr2RS~^*Ev1R zfCgiZ#rwXvrn_#>xiTmA)JZeRXChvWUn{U+0=fym0|{tMmyQ-5c->rjD_f|%mx zN!cE#4xK)4-@Bh1zYvi>j_o@iZW%A12TkqQn{xXvvpeeU>awqybvN3)DZQ==N!Td| z#2euqjoO4$79RMA2Hn6Xpi&E>DdsJL?4$HfUd7P#8M$;)g9|?x2!yx5IyVwu?q4IJ zcTDf$j{6U=wSyVFUZvF=jKF<96Db)VRS9fP_oB6J4UE1Nfo_+<>K(TTymzAjd@ef- z)2j8LA$Tl9yD?^<*NvEZy&G%@vfN&E7j&IbpHh`Z8&q;caKkh=o@ur>yDFVlv|7$; z=uJLFRdZx1k>_{J9&{wk)uBjXbla|4)wpYi-$z}A=9>R6ss4A4%|i2cub)$He)uGy z6P+waFbVI)4#!%+ki4a9vl%0$8)j1$;*!c!(qtg`D;$GPJYH}<$!WCKEBA|6jvGxU zl`F*@k$#MDDEGKlF4;W0KjNkQW#nE{Rk+DHTM{_J(*Z+3WWOPd-(>f=#8P|m?yTss zeu~`-xC8VH+Hzn$KJAy_+5FmZ+8x>c!iB1cyrKPfL*#+(q&mL#M4J251!D-ITlm9= zEFAlHxi4&0+TBRIWb81Vc3yF!W0%Z+74EA7yI zyO_E&+WL;X11F#k@6%~RxH)SH@Twc58(ORfH8MGN!*c~|#> zrirAp@q(ta{XwItNFV}@6qcr4IVU{7RNi;^=f+hrJW_p6yPx&W3rb8qwr&39XK^hM z?}AJ?K>ap$#2&AEh|?O|ADzUcHMlq#3ID(k^!7*4?Qfqrlh-ws3OZ+}FOItu6E{5G z5@<+leP-mMWjn@XqjxkO)r!xR)*}1&{k^ln1f(f(mHTKtM)N^|(uv?q0RLQoy8G}? zsFZvCyA*nfeJrFa+@akraq^F?C3-C*%~6)I_x*-ZPPv&v*Y8POL;t_Z{$D}JC=S8@ zYLta_y$=*8SJwhg1;4``%v)sx#^o^bMu>Wk^SOs(n`%8SpvDBUxf|syoiG2WvOsK< z;B4Uk+&B0J%Lp!;95!*nzcNaGfUbSuNEM;YMHa-`t0)n5x|I@VMmrWSii%Gwa?Eud zfRH%Hn6xf>XFnR#3Kt`o~h)-OO!bin^_irgi6D5#Gq`9%T&QTn`~k9FToL^33QN= zF8JsSd?K;vf{t28(b@x#UH;s0NHTQoMW+;Ex(B4oC7SQ% zUW82f)j=~;`!?jnx!ltenU9c`SRWdHvPsXvOe(-%pr3sLbi!Ise z0OJ`$35ILdQl~z$yJ}hi;`-Leqd1XUr-WpF05}rX3=IoOYMZTwgz0p+!zc;Y!#x-y z=-1hIdn-fdq9}K{hzY%q33)$O5?en@2u8Iq&)1ru69OVn_BZg$F^Pi{yk^o33tjWD zBU2efe`vHiPdyx;!iy1P!{gd152j_Ku7fcYwD7ypGkp7BKJ6pXys^wJhl1<$ z0xKz(xEXWFdc$w=Ot&wS;X<6JepiEy_hq)B42q!ju-y`sV0=!3)F?*y@A@PK) ze+$JqinMwVCpxxZ?YGc`WnR8RP&RS<8xJEpdkj2aGXxY&y!Hrj`%^5TW#^4>-pPmS zhz(0js-|jIkE&A)Cy+ra{wvFP>|*-f#GRt;$WoiFYO@tgpyP_)s?CXj#=8rLk2C6@ z_=gb~nHn*=GdoJyScnxv_(SX}K}RO0S#Wy8qN&#ODf1dg)Z%-(u<{a_?bhoHp^-y8 z#@ve8Tlvi#i&UKMWWh0W>>5K2Vpc|T4^s)zQehnP0{XC1O%BT9ZAb%8s26x-ZN+~i zv+!QxZCb8YPz}4Ad**$m25}XFBW4{6hRkeEz#e{~sQ7#Q;VGhdV?eIKqH85R~uoiwqDg7hxOj|A{QmF^UEcz|;p61m zCVCb`$Mj5_|9<;7mDyvC{bw+;z;vUrgJUGUZ^-O}>UKkT=&GNMLnr3z`s=c0 zqUpzb9*H!zd1Wx^8&YA5A#t;=8?_7n8<#|6)76u1C@zZTvNk@So~ok$^6=Sb;|zO_wM-soq&# zZc|DZc+7P%OC@61b$m!1k*SVxF;oBo<2KtuP`t_Q7Be6If~BHSEZ)#}TusL16-a{1 zyd5>(zl->aZ2t8mW0XFth}e7EUwZ;12;6b9Yb&+JESLYB-dnFgx%vECL8d&{nuPBg z*qCn1H+rRT<>^>!~Y6W7r-Uus@gZ?5`dw~%4CP}4m|EGg9* zQH?ph6u9(Q9{T7JsUE>QppC#l!ATSb```r-Y&CXSRF|BgR1&|e&R{Y)CW zfAwVQU?16lGfBueYq}5`NxMYhn7<-Nb9gDEf(c%jmKE(Ur zU-UQdVB8iV*LND%qf#a`w-em&u=YP>fPc4PhmYjCFTq}a;59gxsSGg22S9Hd{-E(=G3N?qPK=0suDl*c&}^nk!{*_r>`+LX6D zVPQi@M0F}?xPN+R^a6*=F>aX-=zNAnr_J$gUE2Pl6fk(olKNB0`5pk;J=JRNJDEgT zrKjUEBzD=T!?Z!JeSF7kUETKQ^VAusGsDq_??8EMH?YQP*qw~YEt-5ko>Z14so;p2 zL93T_0DLUn1CbWOvbdN$u+(-{@aeSIV-HO44HnvH^_6KS)sD62{l}IR>2#R<#C5#U zwma`E%^KIQJqaM#4jtv|3_c8aACEJiUt4-Yv}`+YTRzvK-JXw-cNw}La_8ny3+63% zD+tv7-HuKq>}&MDG6x5g$66bR&(v7RfI-We&KO&tFFdoRvtxA?f3^HY?R?Yl*t`j` zEYY$c;?CJ$8O9Rm!)(}hlB3NfyUZ%MplRbAc;h1-!Xy6ZX`WBpo5_?Qx~w{5u9T{C ze+Rt0t>*wXOs`j>3&AxxrrK6;Q{7G^cX4UD{M5lD%WR)^F zjH#E7P-a)(_>#GhOR9E9P{!Yc}BpHB3wRig9z);y;472f*-Q|0!38po0E0=*J4>0X+dV1c~6B?b+f zi9I2}*|fU1;$hLdXXj!lw?TdLVh@y z`ggrC1vqYz2~(4WDc(R*tKW&vCt71}Zb-UYCk{Erwe*kdB3UIcw8VhcXW%m^mNzPn z8gl!|{-QdyuuxTmC%5-Ehi;TqQ-nI3g4XfgsTRPWfNb=g9cl&`b&!eGdoew0#aee0 zz^2~e47ql}ZqZcHI!-A}#wS|?yO1RP7;cK=^Kxsoi)>`z}>T%=4s=n+q@?U>I=(~#dwP6!I!LLi3%dwap+lLp7b^rc(_+6WyN>#Ymx@w2$GG)!VL1=W#h{8m zD(820>&x9Tsgkvmvr4W035^wks$eiv+T!Ky86Y567Y>_?0?&EltJga$!5(P8`2gcV z|7QV;mqR3FmefzcS5>H&{sw=yP;Lgl0r$Vu-~S&7+Omb1>9* z@*~&XcKOTR+vo`tPx>OW0sFSHIGDK>x{w?@*&Az0LQA0hJrvrcdJG%%BZGhL#bfg5&<+&y3KhiAzjbx0BwNextHL$miZOtp zuQPs98WeJ5#8S$DZokBCxLwLN*~kxG@x+UHZn=6AP^U1kG58(g53VhpT#eMIQ_7G+ z8?9(G!U}+%W!2}pvW!6edyxQHQ4^XZf$mWneq%LE8qRw0m%>e4QFsuMdWzPDqx4>0 zIO2l6h5_lauy%b8bCX@){-9rH?4!b#7Rk+YrcU$hL+i8fm@S~dj(F_RpDc2hlig}2 z2jG@;Yx5VpovmtBL@1lg})i40GGKl6ONNO$BWKL7# zCC$N=6w^Tar_K~C5;-a zW>Eqh(CmM)F|zwuC|ZCdGCckVOZ+cw16peMB|%5$*%U0P zI2+|Y&R173Z@pTu?n-D@$+SO~OxZSReb6fnt}ch5`F1bt4+ZqFzA@ek7~njh3zT=r zR*sqsNQEZJz*-32a*i)uGm%YoZqIs?gLF^ogT}^WhR}gD&+4!9k~|TGrpV|w)=?5e`qzh&(-@X&&lLD1Za1c_f47*2 zu2@OTRcO8|%M3p!8uUXu(y$$%7UX8!3GI}8h~^izTC68y19E6hrx)$qjM`aa7p{q5 zRSjS;8w!by0_-upq4k=8+;~tDBCHoW+fnejlkO<`&|;{icIZwse7RFW+}zxZ?5ikqtR4t< z@x5rvs4>HfqG?YNdwb2H>g0CR5+g6Xp>2Y7LbR?6AlDphUx2jMx4}&ZayxX^|s$@qwfvidrZDl4rc4aELrV{%w zv}#EG8s-DLB;mY~m~Nn8x^TgpU#L+=n(XdAj+|b@#xZ6e5w1^(7SqiC_v!Y(i}xg= zKXOu3gLI?*oN77+)_i;Pqaxl#meg#c(pmz0IKzkmVzZy82DSAmuTHDI^259J6lVmOLu31T#?btMI`EKs+(d*N>s+!#v;n0j85|Q^lF%~J zW3JsMK^lTgwlgQ1y)l{3R9C{n*fFy1*mjL82Qa>nIheTsXWO>+E7RD(ebNzmzW`4M z$#2;nF7#FstHMAWaOcXVF3Kee_d) z*gD{q{>`D?2>Ume1$6`EkFKbt2Rbx)SR+(AEv${E(mC9gQIFB|-K_yx4>BFN}1iyRhpE_l{5JER?C2PZ)s!N~;N{P)rEQkSv#@%&U=0$O-_ z?m1U3JSffHu(;kQhA9fW-~C)*q#Qfs-kTopFJ;YAihO|t+Ek;%U_416YwQ^UBCbPe zd5uu9M+r;ZTQ4NGE;B?}Xf)=)AqfVyKs}6k$&M$|d8_|GO)QD@F+CGsf5F}1!2e`E zcABVE>3inZ_bSnfabtm@TeZmYTVHfKUiR4MNO<7|P4k#yhU#^*bm98+t44EXFA-I` zDKF8g-Q``7yN8i{90|l9O7a$x*kFrK5fDnTjeF7YRmX`{GNElxDgeBYFz)LgWA) zG-BMn>UtxMpuh2Gnpk?2dr}NHk7(ZnqgI7Aav_q<&&}p29w?;$z>|sg7pLJwuQ{#8C=6BOlIPJFFmsZq`?Ua>|0s*E=mvdX7Wqc+m3ja?ktvc z4a{}eb23rx{2MOV1e2EkB^5RPy!KD9@3!ekfmHjhK{`-yAYJRSNVDP(O>t22)+jxI zo9Gfgnii9oLs*WbvF92Njb$PX_LEgGDD~K6DtfSlYTWhmNLs+q;YCT_VAlu^U|2_f zp+*xF!qr^9G;Q~Le!%R?@H!hQi^nYn#)|3caf2OAbUv9GMvc3AD#gn0gKC||U|zDu zsD&MUfZ}`ch@Z7QYWeLNnMK6SUj&zf60Ql!2`AYtysMF-^Av0qepLQKHTz*4 zyiNg;tOJ$^P`E433T(2 zTg9{L2s4O7XzfR1;5g^%!T($gFmkR62wDcaiJtlQ+(2Mvo!+mXr-U%Nf4<`5Sb~8< zlMje>jhq>7(33!oIj0ooB0lXlvnWG4%~a2cuhx?n{zN!Luf@0`@DdmytFy zx5XDoo~J9OlIDMw1KvfER)tuS<_BLUXQ@aV5JuZp`~wBko&<9=A#3-({<_+xHb zIgV)dpE+@1sY{Oh>*w&;Z_juG&A3Q?DsE8^r4pMf@sd&9H+DDYSOjcD{|h-iegCf- z^_9>U#Z*Ew;H>5a*7KQ}yL`DGj;scma2dt4FFb6msgM29KbL+B6Ws=^gro(%kdWN?Kbf06LD*! z0l5X}OAF|JM;pAr5+1H&;ZCzSo7ac8u?c_UH+);w8ult3jFi9>UVv?CvdYeptF*U_ zY-;QoFf~~`EVegUaoKIum@bel^3-dx(WY{8(g&uHd-xsopu2iJM#r>yURbY zTjL(Nw(DvETlMe)nCs>_mB?a996AZ8sy(9z{EKSrLKBQ5H;;!-0;NwD6AX%_q5det)Jik%<2?ycXAOhVxrND} zS*>Y;BywN?7TeR;l)=mfz6m+8sm(i@=hctcz0001?0@^^SpsRr@D>(l+kZ8ik^co! zqYgEi#}C~4NZT6m&+q&18$$(%(#_#>)G(07r8)7Xx?xWQ<8NuXn;7ey9i?n8&NKmw z)dgnL+=cTV>Jc7@acufEW$Z_27!&2`4=xd6cLS7%mpr?y=&icfOk-i$v;)&}Y zO=DkQf5gf+e4b<)O8u{JS%~QU2ec($j{$(7rTTc2@-X{i_QJSy<|;jpV(FUBDCJh^ z2AJE-+k-5s>!!|)!H-Uq5K@AIu9&Z&pfG9rnkv}uofDSS82Ya^^Om`7NF6E!0X13VmI3JyXCrBSjaC6~)}&hoM{0$fzeLB*v9tJfXZu z=_=8k0gHFaRj8SmW;}0Gxr>dZYyh3eF;oEfk=L*D)!6^8zUKk10;o`wrJ>uX^Tke{MosTq=0NuG?H5-kKsm z8}V5+!TwCg_&bBHs0@QzYzj=x!C9HqpXP{|{?MG_WD!4ipLp&7IA^}|m#`LC1pP-I zhmTSsMly`geTS-GH2Nu|NW-(*&R-^%c*K}VXyi|-4%mSTvEE)^eB^pmRI0K+H)I4M z=3f1D9xMTW9}0|Q_OHL>$wW0e{2fY_Ve-)PWT$u!7L4Spx4nnE|j zl}KPq_R28xC*s26V$&8-IKBq=*r^>o46VteI$4Wh+)@__-L{?o;3GW{9tWlf*-tin`T$;MvFq(5eu~k1Z0xK(FG9Qx~-bK z(~pq$obTUvdbBwNe0*HP{Yulg14H;Bs((AbvQqIWVSSlwjQ}^eML2{<6j$jv%U0p$ zubf}TxC0^Y6yX4fBU5+p&B(+rT|u4(kMKu(YZxTaia!ErHVzg1uE~f~W>2mA3#I7^ z|A||AM{xX~M2BCd%XFighBVHtS#;kgQpax-?blfCS7CQ3gvZOxCcP$w8LbE!te9r% z)9xBOT74c;6t2+I<-hamoy8TAE<}yI}Z%oea z;rWMi29Fpsm;xo4^rouz0H#zpt6)8>y9aAySZF)H;lD+0P>iKr7A3XHAIrO;wUMns z5!k}y<$w20Lj2QR^&@JOGP*Vf9Rrx&#g@}uJ9&pM<9JfHHG+F!4?YfSU|o|80ikN= zb5Fjnnn2Edg2WGpoN3&d!(vR0uslYi{8<6#&GJ$Nn2WhE6`VwJRgZ&x}pGByL4OoKFbzBB*te&_!p&DYX? zz3(d{)X}?@QI>2Q*{XA|-&okY1-kR8t~B!K_AVv(bLHbB%E^gHLPTlM z8gb}2snTfbJG4t~#I7uFT+uD9(b(E)mmU1mSCoXyX;|5b`IA-}>+8Lp@@XQ8@%kO_sJIKb!zi`0vJcqWDif?bP?x`c?4<1bJMW%Un z-w+bm3;~^8YvIdum*R?w{Bq9olZKS^XU`8wQh)a@t84PBR1B(cO{Zj_&Y6h9`+am} zcJ@c?g?%G~t6j^S`^~RxLc7O1dQ_3bntVdbx14Az6wD~u_dwI7E)+2hPDzegGXVoV z4kXz9P6&Pa6IT7kbRFt9&YAO8_MQ`#5~6bUlArA1feaO_q`DwA=xM_pBEkYVwuX_{Q<)Vsh1 zVVKU@YyeZu$S0y{V@^9Bos$vkd8BT#6d2I&$REaBqqrx*#QCW91v^&oAp5GQ6yji& zHFKq#PM>N%AAzUKE7-8lj2Y64{vgU_?7b9Up=>z2eQZojrpc&}PPU7GA`{=a`o_3? zHhtBNHIVkO|8WMr+!JKCj(Z!G4n?(Bs(di!b7M8DEH;A<5}Vu9+UGoCp2H;NyBay6 zpNJ;4x%!6w#_*9cL8O~vuV5LV0h=bEqx8-M6gKQToPZ=ZFKs=Ztp63X3ie!vDU$*C z=atUdsEd3yOUUqw?e*sw#$lgpLp^_GL|4iunds>Dd6EgMG!6NG9vuhRRd`hDRV?`x zX2Mix=GDrfZf*e5Xg&kCT>UNeE-L-GC{n zPFqN!EamhlQw!8GAkMs_V8H9PY-Yowe^Hek9%WMk_xy9X@ukmO017mXa(mkHNb(Wa zp~fqvhnEHvhhtnMvpb;TMP<5l^oPI+GeGK`EH+{PT|4fkEzT9`z9>i=et67^AxBo& z9!v*+U-I#cy70tu~42BKifS&+Rm-9)9X-bwfvR0z&QE$#Z+q05VGbd9HdK(P)E6R zQ0=U~PiYg-gR_D6A)?w-t67(o8XielIMSn(romeCNW-+5dHpZZS*LQ_d8kYLqWi#0 zjJ!Wx4(&&pH80DE%i2U1!d<3MfS9BW9MDKEyQoTe5Hqp1%rLSR$1sv$C4GhF0LE}n zdht!UNkhlN#@XZW7hFHPDV^l&)8w0<@loZ$$}vv<0*PN9b$FCguKmdZFu7n=z; zD8R5J4(MB-$dc$pdP=oKcBIF4)EGUgGQN1HPo)BBrL3m5B|*xm(*65?HGxT)E1PMb zTZT9g{-ps&R0!d)Ih-ns4(6DpgfY|QB|ayDGVYxUi)+gYJ|dFvUHm;lfIp^QT^*QH zJ>A6Mcve?#{67+~J}ILByVLmAEn=2!)Bzqj?HRMKjK;iIY=M>6_YxKg$U**2R^f9H z#oEGq*xQPl5+Q0cQrnn&>T~p8v)WQLSz)_6{D91m_eZzu$MiVdKD5OIGqDx$8JDf7( zcF2{Bn~bM4LVEcaM`!c9f{Y(C4Gq2FKuqsJ+sZNzSSX+G^;5Rgt$xoes7Ozj@O z`Ru18OBtQm4%ED@yE}Gdo1F463nvAW&;Q5PHwB5d1xxlhZQHipr)}G|ZQHhO+qP}n zwsBh1Hzp?H-TNl$Yya-OcCD(ctjwvO9SMGm`^aZCnSz3ux7>+Edt-IB;Q{$d4gDZu z;KeWl*0ojXRh`JYz|V$VdrxfQWfeZbWAM0n-LoQ0{Sx5i){G-fWzxqMbkS+S*H(r* z?bn@?{N#Mnb(7N+wsr8Df|YX(nirvAkOur3j3@E-*%Ab#LjGq@w(`%nHrBvqYSTZ zH0Yp~MUKpX({^GipmMt@;g!?I#mp+!I{k0QbJEp=LR)6_w2wZZi6;a>L1^TfD)`9x z*S!I>{nqVV+)#|U`L$RhieJ9cS~E!hY+L=0yv}_M*69K=nWETD6(72=PBJ~x?+=8D z5vXbPn7C?J*J%W!c#ikT0oTH~D(&0JwBzj?8cykc$FJ3`^1zjfQqH6d)`_86;?ETP z_$QnojF$SMzM>)N$)XEqRHW<@_-EA9>qIG<1U+&WOF)X(2-1%f-dD6K=L#53BpiQ@(VcJ6a_sqj% zzaX4=c?*-$Y3cG~gBUIRo#Af7H2l5TiV;_Hniq$fTF%?F>g`AUm0PmOqufqN+EwBT z?fXdTD^~QB?QgZe@H?o}JkeQYH=&3I<7>-yW*`$9c&4{JL7T;3+0!mKvyesD1$VuK zw+xV9X_&i@E@S(JD$sGp;HffPNkR10k#_m04>hS5_EOGDfm9QAl3KI>>q8uaO{REd z+P4ynC70AJt(7oN?=-r(XO@||chz!?uZ-W?k#CXhc9Vtog^z|z| z4T7ANmm}>fLt2brf(^h;z~Cm~pQ3&s%Dk~&s=2?CO)H}$<6@8O&e>7V3dIDbx#jcJ z`XweW^@o!m7VEO|mu`EAtfm(sO{EdYCu6buOJL)k2-Bl<*P-&6kjAbUeYEAT^qP5L zZNCF-kD$CxiunTY*=wm@feE}nA9PZU^k%%*Hp(NiI7Q6ZqM1jEqsG3}>EOC9JVJ#L zsAhvs*wHa_`a>fotd6s}nxaX=jXDrKcBM*?KGOrnvsdEr>LM-yDHr?3i4plccy+qY ze1>{rdZA{8K(FY4zRXkZI>Z$y^X)oJ(|;2#?Jz-}P?LYJLU%dhHM|Wn#t$=CorbEba9PQ6@k)-pC(ukVN+KsRgIIB{y%^G(Z~0T9G5{M;<~ext zS08sjECdF-AJeAOk8y?*k&COV9w44*EHUC5bfbv?hj}J9F`nnxeL6KnZQnxXGHUR} zVSdWMK@&Af7_j?hB7de@t7CR+Dd=b-C4xA$`s@*=bjh3n_GIpHq=N#r_jD@0coz%r z+7ssGdMm<#*+#fwju&pWi6`j7?fwnNn}WMub*wWtozvI3f_P@|D-Zwi=~;hne~3Sj zjpvN5|BY=UAK#$cVIm=Dm}nvv#5V*iYf6mO=30oGo~HUj#0s-arLV3t{A#k^NJA^Ee9vKOxXPuZm z*Acady2eP8v>%lE8e%S;j@*i63 zD(dGvg~gg9aXR`-OGBi}K%@+G>HYt#n<`ZPU z8+-M;omoHx4pB<=1z#BwVMvVbN?(9#lQXm@53jLCK3&cROah#=8KI}(?%ynvv<^MJbq=(n1A1?&_{%BVi(`Uu;644BpYabLiPhg!?r@~1_$D+`tHI71T#K$V<*op+h+YB zvBy5hmHV`ZOsfg{8DvY)3n^#+&Vpn1Rm zYq%UPd6vX4Lu00GO8N3Mwy~y@ET*eKAA2H5Yadoq6G#HRNIWv`z2@x zD`c((TaBTWKNo0!W9L!nG9+PT)FQZ}wjrog6AnV+KH2vUwf?V)i5B#qMho%x${jHH z$ZraxdO{xGsZXOwv%7stWCz_>+t3zsC8!t2y(-`2M_X^x_*A3(nkXi*p?-;bEK+*T z6@iK^;VNYzEYf`cNdpC&TgDnkPm;Vek-_lvVjN-jcKT~KR@Dj!y@F9>G4?S+EzLKA z8HO78q0Vkfny$uX5G2@xFS2+Uis1$JiNBmRAJbk&ZAkJQ)r=))6RtM2+xK2jE{?mh zXao;llB(=Oi)QVEl~bdsZiT&NMBVZ1lruw8neXD4hu%}`^B>MX+b5ashHN7g_`@CS zc8%)rF0PbNg>velZaT;9aa3`Fr2W@atiT7xkW}`T%vya8kacv1#mJ+3>%SB${LD}F zS?gpUuz}1l5pVbY(sXhPXUCqzS#pR5Ig;|v8&C#X4cXp<)nSXf^V0ayld?JlG8U!E zsF+v(y0vfqeT0!o6_VeYnl&(9iZp%D47Tc)1VM!$p_&RN5UErV3WBm*tK)Z|0#9$) zTau|x0mL$cEoe<-*6~poP811O#_T>D0c2&^>|ce&+N@mfVhLMUF2PREap7yPZl9Bo z47o88Yvh^CxoQSMYdbfo(7FULRVVfsqSW|X0%?aMQMwIt2apr~i>Y${#=Dy5?l3_^INobHs}Y;iiL(sbH2?c?0^DfO=2ymBfQ z8$_f?sg-JYT#Am6ccotts&)VE7EchPvdE4V$L;#}d&+6FpWn`3gzVRWZ(p1m|EHb@ z4cGJRky`fC!QK>aK#}*9f~|#!+lrpw7dKzO4w}3lfwFv$!X&c}TTN_RS-9RGJC_a? zD_};Z4$s1i4gb?A)d}r#CETSEt}J6+=b@h;(#F(X77+NCmXWK~g-x7SMo zC1Z&Fp2?G%6A(vzpySP2R$lQtc-6Nc!q1!$Zh2>#foFqZKsYBT&Z56}!+%6(H*#moFhrPB6Ig0sMiL_bk7g5w13H=d|4$E>7=c z{PSG)l~vw{K4R#6673pDCU*$J$&RKPTMMPqnO0U^#RVY0o^K^FeC(oVSIHJ#>wv%C z3OwSXHz1-xJUW(b6>mZF!;n)}Y0JtvIm;Ah7J~sLYb;`%gDhpe9r?!ZW52!h6CSXZipLQphiRWF!tv%>v;%Su4i5Nz-M(3^^~Vf8 zq&Zt-a&U*4aj}SmaJNRq*s1ZF?19wc1bab#*U4U}>f4*l)akY{t52a-AK{fMH_dbS z8jpK%vwP~;=YV>LQYpx)Q7u17in7&=*2327srN8ieFhf+BMm|F9wdvC1p({)0>5jd zRwJ9O-k67=^3Ky>(;(hyXhhCwb+GeO{?t4-&8{XQ{M}X8)TE{VX$8!JoE$SbruUA7 z+n`s3vR(`4yc|0M5sjTY_2H`=DP9zw=x;{>|AXD=0PdrxI|GRj+s6Faby=BB%@izA z2|73giwELM%)36aU57VM3mWzXj+DwT$ZkU3t*QMUBc=a43b|@`WsK!^M7-J&yu0a1?%u}C zMDJ(K)0_N2>zlKB+wNhz(DSL)Yp?g>&iY-^16~MGJ~6V-VI5GwDHt7;jjhsq>u&KH5pDL)pzc++`SSEy6d7l$1h38?)`TlKI0CsPTG$+%(PN&5hySjBhoLu7S?DR&Y2wK0%W`}$8M-^;W z9~_mq*?KGdAMb+Ui5sGG;%eL^@0@nr$!P0=v7ulnVS7kFYXA7NYU?@d^yRu|E&_9%V6$ z_k~k<4tjE2lleyMh!f3VJIgXrloY>s4C#G%O_O7;! zsBs74iYy}{7wivu59IemEX|Y=u*xWeO8%e{&r^&c^3q> z2!d5;e`WwT!T!wrh`;2XJ4H6e>@|sG^EvI1HT&!_KfWO|<#?fUomBF@kCMS~-eWO) zo~vJaIHPKRt|hE~$#4hckvi|s-E2l}{OENIWyIVJ&c@*MIr)6p#KqtQtT$nf5>RO| z_@3t*$tnYDo!E#p>k`ke6Hv8%kx+GiU|>OZ*iEZ+Ly=C|7WM?^0b1PJ#zYJ$L9S>D zMKnVvHSRjD5Zz|Nz@iM;dSW8^K&ED7zl^)Umtp-v)vDJ-VWpY@;UYTyT|))QjVi`U zkA{%<86wR!G%5E#aEu>V!%xQ?h#QH48#DhVICo)O@?N86#qRs_#b73zi{F#yA#Dci z7cKQt=e8&Ko2Bx+J#G!#!uaQI0PKDkX?E`v%TA<|z`nUOX)cdY<*4B^9(p2aO*O4oBlju3v8_ zcTF{3&=)H;BlATPM-0TxADmjBU)fb#SXY?%1oWvnk;z3xG8%SD|p5PsQ+Y&h?v$ z&3~_92YgWpu{r{b#Rr+fz!G{L zyHT9&&|XZrvD~fk{N=jz zx`5{V9vo10y#Vgz4ecBVT2d0IwS%7iyQC2ZicGcH4E$NKqB~z-dmb*4JIxJRkcFSD zSr2V7%?3-D9rESCY%r#lVMk>?pwk3V#Uz}tj;I7W?h-ru+0}yTaRrso9kRNFkL6qh zDgFalro%?QuV5hYSrf*z@$ZfC10NhEX!gxu!#5vJ?eB+O&@1=`QR&fmv=>Jdd~22z zm6`na0t)XH367jW)j{B}w!?zlD=K;_uc+?7`Tn|zI7&-)h<9qQX_!7+b(KP3{z?+8 zSuzh>av6&!)?d56zRs?Xr&VtR1BJyI1oTygCi{O}09a1n?r!e7$P_Oe42=F_sf=67 zo_k9E>9y%eXBiP69tx{l9Jrhs&m+qETRK+OP@dNS9sqhgVNJ5VPlDnfAoE@B?ECVQ z42&{r9%-SNfPJhrP?<3ccfnt7RSMAv8}x@=(+D4^DEMGIKx)I+q~3Qs3h()8vD2Sd zKv-*u8>I{s0kKUqJSv1G-O+#Hxk_c?Ohvy%z%M=2tZ%T{9_Ty45Ad$qnx?@PudnBe z#O)+HZ16}70gj4riG?i|7_Lv{j0srPtU9~5erk4{YKv?yqGv}qP%1;&#(%R4ly43D zv`2{MeruxYw#VFP5cK|i&e6JiTrsOrwqNtLg}a~Z^U`5^j|KZRrn5KvZ6K@Jsq@jt zrRsL1G)k&o+Eb6a;(e|TRjKM{^L67Bh<7?T-o*8K-}8k#dwM-wTtPG7c49eD*C+j& z^+&VQ@()Zq3`Rvtp23uOWIOkI1<0K0&=D*wG%Y{FEO`Vt-;{{#!=P36-4#CY9mOw_ z1T7U$Z@K#TwNIbz_CEJUb$P+yP@2H zQB*7A55Jn=TKW5Bza{Zi&^3*-L>0hcZaJ^O<+oY>*93P5=bw#j(zSH4)@^8T>Z(yi zrW5D8A=HDS6m5hHh7FpS1^=mMnGt366|r%(V<*$O?N&R&?x!l7y%3&{Jk<`BDs^II zo#85<6OJ7|85!7QYK>r29Zx%RJKws)4wswchvjOm2&;`|DfrKYxs@1s%)yF^3JY{d9A>w_-xIw~$0@l2T&wDGoKi@TUl@)J;=3Du_rt(d1Z5LB0OR-e1^QF$V<@Y&}< z>^7kRmaRBONO4MJUc-} z8!h^}Q+Qu{F5hq_-fs@4+TCC;U(es64_{9<1qN5*joluw{$E3-&@{vQ!v5YZfYL53 z$~vClmFln`+0vF@=P9zdn!(KWm#+=qkRm8g_@}GB7c(3F?I-(3TQvt`YZR?l zC2?cd^4GQOA#$KvNSD}e)gOYucah=wWb(d?(D60Qq@R`HdP356J3`)cT#zD|7QSGm z-o4ydQqhTmr0s+YfyEuh{l3EusJbTU4&b^q`Q?Y=Olkw#>uJIszufaf^S5~Brz9d=(Gvjv4v1k zDUxPK*ry;$y}+-UN%$nfCii|lLluFz^!tei&-0S4lA9se>-#0A;EUzOV9geD<}-z3 z&h^rbRbT+k{ZWm|u3|Kudeh-V$Ka)+Cijf2v;D>?l9(Q&JEVJ}`4{B-9<`SL!*_=d z)J^0c+hp4Qx9>|9T`Tn{S1}%%x00S;9#`UpUS6+*D&C0K^Tehuj=BTUKjs=d3?UaNJ#4(z9cWx7{>;sZ&$;x8`g$FpoYRF}86pTBpzpI2}{bxu4a)152BwyX*HtL$lVc8|Sf77WWPMC#%yTXe?VomW?OG5W8dx zuJh;CQ2^4L1cB6BC!J4u^a=%~l@Jt{6mk0dyOg827dw=svOEka3Gs~Gs4N{JgVTn- zTAY#74$I@o{*Sml$Ga_e9hPw}BQj*Hi^WRdJ-Uk9JOXkjStr#yj7J<1F2L_Mgc|tj z1?9$T+jZG?BSoQ7^{vuq5wCuX#^&J7pSFG5u#j4iN=DzV}od?pUgJk zQjmxq3%klO{|+0;x;DWOK;!H6xI3ctL670Q2eaA*)s}EgpV4%9X z5-rpH-No8^L-uv+;sed|)ly?{RpW_q6&7q4UYA6@hygw52U{S|KhkFa#)K{GfxT|9 zk=sGM8UW~ezwy$0L18dd40$W_eb%FI`^mO?8$Dt7Zo(Y{oUyXkIXzK#kg+qQmQp#g ztBWg)qy>|&V_ih*aZaDTi}di0>oEL|CE%^n$(s~E%< z9sFwbVKJ%P@0fjOChJoS$7QG%r@>%^5d*NU!_A2qK#3tcXF5lnpo0m^JQL31d5<56 zw((c^bOo6g{*1f1=xEzw_RPaEBl;hR?ICuJB|+1u@l&d}RM77R3+o9uLA`7Zw*$_I zjpMt3RC$_*gCNEgu7@ zvDqrPQmCbW1Pb*cdw*joKQa7K94Da=FtEL3u-piISw$=@CRy)bzY7*erRadoXWrZE z-Gard)<|v9L&y0Zsp-2Y*LzE5(c9Sh;2Pf8sNEY_(Hr^h244bhptt>O0>kmb!lq2l zw;~wc2bPe%KKC=~U_F_is#Tfn<6h}~>$#I->X>k~cE(Qee3seMpdoShsCylT?QiiN zNJ7YeP&pX$c@x13iu&rtkwgR6mkBXZiA4j!7{J$TL6kep6SC>J=r`{7M9?Q=BDUEs z4pECllHF(0DqMDvpx zz|alxP2s{g9LO$$+#{wo&T`Bm9-F74$|OE61&|SGqlk$XC0)xgT#P@R$t$Tmp)ndp zkj2$O=p#=Y@$_=N zn%CF*AL&6B?-m#N=i@(QfXC2*V}~J#SxG0i9iOCZaL;hq>0y3Mh%t8MJian~WWMdd za^3>`qy!Sf47bAym73%Ow`uB@O#=K26-~RKz~Y8V^r7uifEkDFr)n3mw1$Kyk9}6@ zmxnSs)}^n7tCPV8Q_p|e`@5$aAFWz^?~lpbuOf*QaT>OpEk%BBeaw=FwqVhy99mWVjuxlx1MZGb zPXO3lsxMst{@xZOYNpOJgb2-6*VUbmLm2i1Nu@Q2bfrJuMoOf+YX)0TkCLAZbScXtcxu z8RX8a{n5mGjw8Wm+VaCW6ICZKm&Vp(!q<2HQ}A2rC2*WQK4Gf;ezHhqj;dHM-?GDY zG@YDEr06wJY(+eao4NkpPPgrkl5kYhBJoEC#9f+5`u0Pw;$c=``Uq=f8_cpaXlCqh zkMq=e&_a}52Ol7%7_NeC*0U zHl5L~{i71bq6h~Fpnr$92v{eDAtxypTi@8q!cdcZ8CY9|as`60biJg%3;P7*FjG)! z!X@Kork7k`)V?JY+xL7*H<8=U$Mt!|4h`{yD^(boz#1xzW~jq78z|OBHkXI(&gag^ z>M5FLi@!_f1BRyaTZWKRT2ZLawmm11GJHUei{}^Dg+4B9;!(5wi7}<6!oF>h53(#J z5y5+OzJWbdgZ-J@;ab{C+?51cO=iZ6v!_(d{pl&$xD|4uB`DOGOuXvi$;ng(C5}J@ z+p=9G9+X~2aw`FHh}@qvF=zRxZHYh9(LsU{fO#f~2K%l>hs-YylI{e1%ePl$zbk-c+zl0c#ZU~v}vs}7*Hr@g-x zRj5W}y59w`I2{3gESsTVckD@@FWo>?yzW0&pQk!(FMA(aKMrtvZ>vpeJ-+p*)Vpx{ zL?OMg2<{9n*IeML>H|(fU=5b`hguKQU3#;ZB3M4pMc@*#B3Us|dM?aOjlr|63c8Qv zU(5XTwt`)jHG7@t%~{E)Ga(n60(D_xBy%-u@aFzpK9lOQ8U=cXi+91~ECCPzx>o^q zuLQDi!?dXPiSCBMPekxb0^tmIqT~}HAISOxbtmJ2Y5aB#gbU8bi{xZ2172Z<55|d9 zg=i~VKeY=LFN<7-g=azbYk|fzPR&OS>DS#-6o4bWEr4T}1dOqR57V22|m~bI>b^09>2FKsZ^WcnxIEj&z=&pmO-$?p-J!G<$SLL|g3 z0^^7iW18f2DVkfdc)>zWvqQ3YejuWuV+c2GM}PVKGDWDy_V<_73^d91-=rv?3=jpE zwwt|^7;k1;Jih`vvx`Jy<5kWJr6F%a!(~!xOYe#hRm$gMbi}6tc_=J{u`;hE#FIuW z3C_{fR%?(?925#-2R47AfPx4jCGXD#mSW-6 zW2BbOLkA&9E?ID@rBW@oxP{Lj#IkZPXaZ_l^u-}Tt2nLImr@+&ViW>rN_7>bWFLhdtL4p>cSN>g6oDfv15lWjJxg^ z()|rU^SbJU_T8t<={oabw}k5{4>aRX>XOS$hnZz%gvFkitIvj}+Jv=!XOjA`1lX{zk3^o1ExRIf zQzb-P?-Z zABX`LYg+(=+?7WSi%PGJ5hsT~h7gVX!mwg}UDxS15t&+br9kZ{t)!TZWwXi9+zu2ffsmC<*-8xz zg-JEk;OcDFKj)XRoRMDR1*11^$y96JYInFxnqO9RG;n19idWe1UP|dRPZuLk$H!8*7n)-c^v6a_wXoHb-x9^IIMbPei zeeUap2H?7wU;#*crvr@=c({yC3Uqiwbx;yuN=U`0m!|?AT^iR-X6mL*7^2h&qiDfp z1?YcEF=!f@_)3T9PPL4*jJHCDF{UuWTmX%JKq{-?;P90GaHhr~@JKn>ukL|Uv{NC@ z<-z3;+`&vpm0k?9y=je}AL|`E;`}%iX2pq8{QlVhoUGO`0yoN58_Shq-!jB?7gHLX}V-iA%ooiM42Rhg!3_b9kiWh4#yKlY71_L#-URI zL+F&xxV06{`d&KeMfEA&YGU?PhI!bt)PDBPD{?wkX5>4Lupf_Cqe$xO{zT<(a-fBs zrU`19a>CS!AnUuc{r6%4V}Zt(7ED28CjLFq<)C)wVIA5W$=y-gn*(dnRA&`=hjt_R zNakg4!j;F|+EDawzkkOH$8Uwy9ZH9?NBM`MoW0FW5-}3|83(%(MhN#gGNj=k+IzQ9 z_V?WrRN74!PoJ;&Y3JA9(hOFs%;FfjDVldQ<_IFyqGH}8Nx1`|zdFySvK$3E@8l@< zx*rdRkzDm#E6e&8{}9njRJ+-KZq{g!IJVyy!X;3fWX~djZ-uqtYKkTi@V%uzSWKMB zck_HtqL5=06XRnkgj}TF4v5m|q$h(I5+!g3b_>eWM-c^u?>|-r$C2qHhA>GIO=>Vg z53cz{n~ghxAQc#Zxk3OP`uoMej0jOi&SGE-cvL}0>0%jU73?Pp#zGQKwt@85`!z52 z4sM&wvQ?nQ;p)CTU!7uH3eYVN!e09TP_k48?1bJm(QXH_be&+A4zpXojnM8{-T1&} zDvk*JuxnRb8kyTGH>Ho@TOyM!P}Q9`;9pb#&-av(Ufv zL((fQ>p4&Nv!PZF&{O-f=;qZslV{7Q$Mb8=Qw1hRu|^UTaW2cR7Do|Qp~#N}0%A8S z_@M%$$0<3)zxY1<@Z&BwkNe-oO#&j)1Kze0v`U^}qclGzazLNs5;UKae44E^{!T_2 zFrRO?S#6QpQsQ0DieOrp$y4RUL^CoM{6u%^|eb7bX5K)+R|_rwM3M+zx;m$E6d5^r@o7t-gLg~sM%^wpr>i-8^3Z53yR zqV=1D(o3R3(+-W(8qrOZDD9wm=K2CFUqWD~K<0d&6*$$T19iy6!1-F1`Kf6y~5^i&GmbBCpD&KhqP<@U9cSereYo3QVN@_ z(dXucE6nOcBVK#A9hEU_%fwpzD7v672H`@O zgPn}ASV`hmow_aLK+l)82%kV0!9tg{^W-gl7*05^G+l^X!k(V%H$x8Q6hLr6K49tz zobWG8jimL76ONn^&un{+?@5oot2EX7=c6y<>{rB%BL`7vp!of|I{GpMUP5#phbd-b zb57FdshP{1&qK7s!dFSm-}aqt#diLGVcPf(4G*ZEk-?Du6O%~4Ygo}wCY-Lpeg2-6 z6hWcU9v>RM9qEv4=;3N69G-0RJiqM+Z68rhDt}C4h2HaELKVUCW39b#_Tvq*bpLfa zCC03)zArDCFJw}%G10DyHHHwNf7F(Uy`_!r{cuQ@z0bgL?0&^84uoB(kY?eGIjN)f z+Cy)c24{ZoI!c#r1z?;LY>gyT-aEgHAvCCF1{_lIGD)JY(AzkW!3#z3{Qkn-e+vjf zKErcE&Ce0xu5dsPwI0N|Bnq}r2Sc;I3Oc3Jay5e@43(3D!awsnDTopV?eSxt;x(|u zDiDr@X$aiCrTc(E#db!o`V=X2cJ}bVp0VBmuIPZ=!q#&A8%8RZy%W=?j{3~ikz%iX zYQquPg;D!G`)d&c5sk~@*EO3n*xy^Z$YvE=$8Q|n73oIU>He;cY`)D$xn`_O&s(`$ zZ=&|-Fq3RQ_##_`<*4A&fEaaVXB^gWTCW3`z_R`h2*hOTTr;9je_p`>$Av-D!!Quv zEeLoGcK+m9eKJ=GA*WNQffCVNz9AcEv)pDOS11h68BkS&Ou=O)xUx#4wv^5sB445` z%?HNs)?3DJYS!&SkclwYJhA*&aX=z!YR74Kwwvh%}PT#53?4MxYUN zk}@d``9>AKV$OrSKSZ|1NFj_ahcTViYxsI2UzHz$VAcfxHIF-zk4qZgghuI%9tzpkPgyS(84NH}7l3)r~8 z23MjLfWjDvePdm+07hbShg%N}m1ga)&eAVZT(Kg>7qaV)RoZ2kFC#%L(C^1`{WdNi zpiI*p<)FEk3uWFC-h7O0WiC%91o2;8);lXMgqA#o5@Qh(%6fvR@>)Abm*N8;867*PS{IDo%?=HU9j8h_? zKh_A=KoU5aJI*06A+{>kDH<;&0N!N=?kE9X66ZflC=JU#utSbDg5`_>As;NyNVJ`c zn+0)6v_5$yT_|I0bul}Kg)W2;czS+5To(X(cSs1k*X?oLCuE_bS6hO5v0OPcU8Mmp z#Z+hfq<;BvMtD1nsoJpTY3X%KY8nhq(|W4U*=2>9E*xG&siOZqttHA%d5U=|;^2xz zts&4=061lgScR~3BEc^`qJ^zA@S}v8s#DC*vJ29S)&rtTTsdU9@J-W_X_%bt`Gp#$ z7YIhy5O9B+a9ak!aU`**hiJ&4!Vjxuzn5ezL#M%yCGZ(1se4Ekp&Y^0z zEU)RX<*~b5(fL;UM<5^1aYFWJK9p;zg&cPQ@zL%yRomqI%nBPiY1pB|h?6wg8+OZ^Bm<|%53Bt3(u61CqNWE25``-E(~^|5 z(k-K=aB z1wh4RgyxO2tbaM#kEi>)MSOze_Vg+{bqTXQcSBsS*SK2m*Dda57hLqe9o}z;VLbt0 zIlGZLU~vSaipqvZ;8>ZJt2KiQLb69x#|G6fl?86d3f9c^?t-C9Yt$l*%MEP5_!U{I z;b&Z3bZ~#RF5p%%D&qr~Lg6-oDSSYB7o_NZ`)a>|L)t1}OULGx3?i8NV*Zwr*fR1a z8Jh;D3S(+XBW-VJ9{7J;0Ga*iPA3HQW!RHA&g7HW@nNW{5;82IXVcZ$rm^$|qB(wl zHw>;TP5}aJC|9viCVetTjhmaIQvQS>nSomp=xs6m!pR}oo6I6D!!$-UAg>dJsvA!R zks8+}L?1>Mbi_p0*}8Ub*mIzI3z#)`7OJ|jTCbbN>>2F1uwlAp>h{ZWf`6=e_l+9= z5bBT2Z(O+w@Qp^!00# zi?Wj1r?{NGs}&zOo{k5a&6h2Y+q0cduaCp*oBck}>yfCQZw}K-H=G!r4~5K*znr@H zK?d(Rpz1j7?jEz|OaKeLY8J}-wg~&(q|JNKDpq~%&=-EwG@71Uw0Y>kx0j_+%zWv>0;q3t2OE;er@$wX#&QjVhi=JR%W+`hP?RpGcZHthE)LG z6dl#EfvjO+;lFi1BQKFFR{b|P`_I!f)BmmBc)rON2YI?b?jI`Pi=~?!7)Z}kiYf`G z;oO%ENq!lTd1Vq{V~5O{<_a(hN@a$x2kZ44Q#;VcdfIQ$p-)7NTJ(!6tjhTt7laLu z!u@S;hhqw^y*MkWb02~Lzxuk9!5Jh@>4X>Xc-aft>43HIn(?r;eRtk;o3LvAiunSY z%Hay|u<5~u{637y!$lXU{l=qX51&@YOs3X>K%+m->;m&PfsRrKWv5w>bWo|`Yv_Rm zwDF*HuU_}ZZwWlV^rl*1!pb{wtwkLW2&pZ(+~;iyx83%<%rYHqDukjgS=DMH7~Hg- zAYewlP4B&T0AWhL6_ftVsm)m)48uO4ptU3} zW4e^9!nUM04DuMsrhpc+ZOkP#G(fdcX+!fNQ>U6;(RmV%89^^(KkHJ!6Th$6 z{Q!}#@x^UF0C7BZ*4r_4pdO@B2Xq}8A}3wrjKGpDgu)4TY`gh>SCNJdRt7LSAH*S#n*cfcDi z*YO9T+R;l}h$e;`_UC|nXeal6uf@rq9*iEL8bZ+siU0o0u3`TG@|gx1fA=#yPPO+_ zO)lv`cqpgr;%T9YClYIK2Vv)q+fAdQ3Lr_w!~C*Wdq?{|O)FAjo7G*f&#+Uw49i?| zee7Rc>Z~7rKs6@2k(3_)3hy&@)+!R~jx&v*+cGp9;#w_C>OtMDN3tk54k|kofdz#-@f4|J-;sP8YcuwI zA_Qc+0ob6%c>avYo#c;OBtM+qL|dC&vAR|`I>KJcU(!ITaWFgbd1q8LBzk-0>ly1~ zZbaFp$n(=uUqazN{4sw_<6uUp@RLG;5Y-L)nI>wd7$yTL?kWeMTS1cc2<0SC;KX{% zvZZ0HgaEScA8j@Ey;IODp#aphThRcC3*tnj-QTlqgyo9g^y5LUf?sCV0?rDV;axU@Gm%qhxulZhK`z@S*3EU)xH) zepVcWnL=k8I8(ep84gXPjAG3a_Z*$b;ahyp)V==KDwyU9Jn>x}p~#$a4Ivc4rRzR8 zRVs&!;)sR8LF!R5eWMlS*WS&SkLPZ{jfjT}t@Zc5l+eiGF6`~0zQpO-EH}V zU7)_c9JsIzX>^?B{Kn>7w7}r99Z_XY_+{`FShXA$q+hPQdq0DEBxkKG(PBj{n{wgui&T%(5!9a zA|Bd=etkm^;b!#eY($SV9P{upbEn5nM$2u6ydhpR5ZhD=-WVG+|F_RLVAW=7pv4%q ztlg+(L*%or191iW< z_k3=*9Q&fmYz6zbp|L26G!WnPp0;ei_8v=?8y;L( zkvuV1A!EMy;b@&y$-Bz}Nu#tMGd`a_<=`pEXJp*}UMSvq@Tnx|B_d2eU1@iu_?IOL z%_M^&$_^j;b|oKYg>G+sbz^thgoJ+oy;88TFAyC;mJC9oq{e+LI*IkTM)kOp5m=kq zDVXZtP{D|zegt>sA1b~i6t16zX=$?7&mkj!baBe7C_seWeBh!==fQ0NH92^$`Jhy; z)(&tpp&pd-d16_0JUdG5a0TyvEb$4ZtnNVhxiE&CGi-)-IjV)d))*8!?a;zPqPv}c zw9g60yBzi$oedt|x&7xe8+4Z}TrY0Ef6YJtc=lm#Kd1Oa;}uP|gbCq(8AX~F-?B}n zM-8k&{@H0GmrahBl|cYLR=Bw5w=qrDM@(DQ;vP6P`y=HPyBu*1g7k`js5*sKPA3k&-h3s-Hp1?_WxM_mcV=$TBJg@~*T*usXRVA`zTAkA!38az#BgRn81C~j{rMq#Ka zN8~+XbZ@T2GEdfnFvo&_Rp)wg#!b5hlF!7eUnE~oJx54nO!XiF#Y-}9E;hqZ@v9~Y zZFV8sZKw^qL1Eg&J2&6UnN?tAsaw)cYkCq)-MPztZtY9OBWaXNe6TiuQZdsKj-ET} z=pBrRHgu5Lh^_l0e`a#@C~Y)j`kGe7^W%YdgBn*zA*XfzHKFwG-bHwyl+_qUh1J%Z zN68$htRsm*et@?!gDeP#zc5r1)ohg?D@YzA=43u_=o&q#Zxrl{TTUoPIGxkozjhRn z+01aiQ~BxQEh>%d7iW~)X=M4VQV>9K&@JJ&tJb{**&D;!(zs!~&;11L^1t~gz`tu4 zfub4P7Fy}L%jaRM9_p~if5U9uW$}Sd#_4~F=6B&Y zl@1-Xf$*c?OYyX@a)eT9fwr3s%yXNS!afif;DyW6t~#j8;S7y_mWHBI4dnQKvPk9d zU{0>qj_Tn4=BfL;>4dh~3Lo=zkW#moA3=Z7AN9JX^^$uZES0*&0!e64kZLLokObkr zQpvliBeJN}hurgG*7)*>cU`$xztauBbWOt~g*fxFZ2Nku=L(pm`qKA8AW4Pw2sr6+ zVBEM5Cg2Ba(dX%^sKeqoCRMzmZII0jMbF%cWm*y+lj5*l7M&%oyUIKUc?RIn5L9Wq z6Cv$=hl4|KBE#loytq7NeEnDFmhmAsNW$c)jN3UaeZJh5HPlwO;w${0T zNZY+y1SxUbB`N4kw74Gz}0WYs#?**XWfu$+NN&%<9 z`IX$Z3SusGv~L}LU`O`wYD!OVK+8^8F1+skKBSxmC#-}dc0d)0@&BRgo!{#UyT8HM zMq@jTd170Qnl$!_Z8p}4-PpG6oTjlFyRq$L@_lFKnt7gg=GuS2{$a1Z?zQfZxHCQX z>+Kv-i2NG&x8OIs;j{11T&oO1GkY!{@DHuQd%7E-fTxSx!L?-<$KlnD&m_(l;Ync| z#C??Ufu#fq%Y{`4@W5$%qpD3U6$@XR<=B^b?+y$Px2^8pdxqp=w5xf(#cld^`|F43=!h)-01Mx= zJX%+TfjKG)S!r+TjssyzPa;e`Ms}9PWz5UMsxo(&Q4;Yt#h8GKs!Yd}(LMv^kSr_5 zs;8Fe9NSbypss!|l7tqEshHGK`?LjafieChqfm)~+1^A+=Y+CK)UfM)E)tlDOc+cFRv7+9-vv{+cE?Ja zMI6o4L6J##tS9!g308;|;VuCmtXz44H&d}6#x7zaSkxR@abqBkiSXH}@D5{?jX3W@ z4Qw(b{;1bPc8H{$KS@EQB7;!$XUz`ZO8!DjU~$pz&tRNppP9XSUSI9KkIL{7QLs*J zB^=XIN>geQiaG)2EVPk*MG~+)`1MasXbVPJ9E8--#z*=utN=+p|I%%t@GAckzJdx| zgoT>>R9HKe#wDrHp9x8iQ}}awcS)JbyRp;e z;p!ZJ2e;dy=e#UlS(=yvwYW?C!*N@*!jC zI)9^YU7S8V8j~>Da1=!YX&!RYSpVLrMrIQxV-p;8OgA zMHZe=mJcsRZ=%;?rNB_dHjBY2Y2cAh!?QCjF>i#>$kIIQwO*w#nP@vM1l;mt49POS z4U50z0?`!lrKDRKQ!Iyg-L#cYnH}Fpi7Ap0g$vxd>+2!Z65EFy*6S`LvN*SIY4*)4gHW3&YieC_>$y$;He^cS&1EP|$uM7@)Zldzo#F(Z(D zwg&Dww~D_?518fd*?7;jgT)okV6tUP6Lki0FsXB1wJR_i3x=+8cV0U}3l6-VuLt>y z{kS7`Hvjue8ydmH_CkKDz%GjcH^frD+zV=l_2^9_mvfts%qXOMpqvr*wgmLA%8n6# z#&=1lk*>ynv+XCNN{;QDEYoekSN=1p(i>?w2|(tAAClCW&Th%yspa(WnZ z>WJWPi8)FWKg$!dRp8eNM8Jw%+VyBPPcnGqE=3H}DKDEAU32O@zh^CR9DN|GGvu90 zx|tt>kGHzGaV&P>ENL#*$ta^EN}!TntP_i7X=$ zkl(@K_ReIIfY~@)C8|>zdO?#tDuyigsHTXOC4HP7ccCnvRPKVS1JkqZLVPkZa8+r`AbIA&YI}aA&X8|Hn)A1+{_MR-Aa@2s z2yF>cta+j~{ilDHwQAX93A$XtvtY{3`0JWZ3y^G*j9_qQ-G{x?K>+J7Oj@F5d+TT9 zfCh8VV@EPbv*mk zBE^}s2=?bgA7#F=Bb4G`Dw&K^=i;tjH~G0OI7P)*R?%xp#}lWrb(-DD_FL!1 zw@b?Or-Y`5txk4Szp_5nYQ~Uwi&cuM@$)P^A}3jvEg99f>-tNdC;^U#Uy_-W@eu^6 zgX|Vz(C;j&Zt*6rAmTVV+oSbK`KeKed54g)A$1gvsBNJa6dp8m)6sLG2r@s(z7@589$)xC@CQv9q zc>EkKo#alhTgiEBZ$+6+6oGVDm-XP%RE%)84z> zZ}vRK)T*@U=7Uzbp z`04u6&?ab_CCZ=PIy$l9=Iy0q6lEpsX7F$rjOl5A^6;>6Cx6m#XspEu1kY@f%Eoa=_R?@iWH{L>W z%y=K$pj&Jy7U||g9q_^>T>uz6pSr)4GPBjD<$Qd_+05)`NoXS9q(Hz0_i7`G(f1pn zY>V!J!zBf|ZtjJS*E@dxO8Aqib|%nLsK-*+TT8~2FHJeJ3n0V)?pyNZK6hHzy25+? zNpE-QF?U>MGB7kuo ziFR!4s-x6ig=V9HdBeuMYp3zIv$q)jZ$3qbx=*uK$lL_>a>Ud}1x08Clf&2;^4RU^ zzay4ku8h83Pv+~gVSLi|u^zrPV`rea@NU5ihY^|5YY{hTt!zcv2#J{xTn<8<(H2^1 z$K{w#8-odF$wkeeTaL)l_)752SAXtt|4b;H&cv=$M2&%nP{Zz74XtmSl6oml%loKM z*k;j1(D;K8`ui&tEU-XKfiA$X{je$Xnifalf13_r1Fd{Uj@$|wwbxV-CAhfrT)tFA zvjky3W06(>k%m!lm8J(SmsDSEA6Tk#xRL#$QwQDTFCTL`4jCO894zh@pF1F@sH8TKq%*`qlh<_0unfI6rw-_x(t0j_mF(&O-MW z^d9uTdO0qmw3cGBUM+a*KKr>YUDUi!x&NZ&EnSoO{&Gn&VWt#0x{-94i=%6=u3!X> zc<-ojX5}1L!K1wu+us1B$DREu&Y-6RgTb++;^3&_bZ$2C^mvTO#Vecx#(B-m($4I< zFZ^z|n@i8kr9q^~<-+d? zGjFGW@sANR^5?~Y@sze%y%Pw=gc1%enB0Px=A6tVxa;CLk~=~wApF#t(F^e<#k?Q4 z6=3=k^CEAM#e9fOv+>7y_v6f2tMTx&8vuA?PQPqEWJ<-Rmns~cud8S`-9L|~4R?!3 zhN$pJusbay6M8&XS0?h5EU0?58)v#xUmfv=AYC0L&H0mWDcHO>fU3zn+W4-8${iI3 zahSr6o%Wjl$!93Qa%;EXJ)7lu`00P^E;KL(<4lJ8hv}7aPA1z}{N4U=)63E3y?3h_ zi-Lv81x=DIn0MKxzbo(&b|ewnK?*f7Ia+ttW4JbjNs5h{cW_k@7~$H)rUx7A z_@tyGZi`*WDe|}pQ}=O6>g}$nh^F>-`*z9aKUSDxjAflGDUbMVg65Dj6D{fE@J8F3 zc!x7t1Sb1LbT1xx&i%F^Z9g~Ho0<-!ncop1CrQr;7Qj3e9xHqc3zSg=xD08eru0<> zXsLagJ)N%kKS3N+g~mR%i)<)OI?QWVDuzRRB-x&;of{0zN5d9WBlrssAXo21Y3D+W z$PzuOIYKTa%&Bn<>h0Ms>|5>943Af8yNMx|*x;}T>B2xPIX*7p&Ii)9*M(Y>xiD1i z4yQswnZ&$5UYX(`skyV&Nfbj{l>%u?i0!vll$5kdU@(jjq+YbaE&lgk1JkZvBLFQ1 zPTrgmM<#eH&iJcLCx{6y4Dvv+lRUUbRRpcpke|Hc5Ym;1ye6II&m+b#!Uan~c9w_o zRFCZ6PCoIk4`)t`yD4$68}mL-P zo@@pQd_33A{IDK;B74IiU2Z1QHwH~|A8e-|75Ge&d$VYV&tB61xvxQr|3?1Zwso{#g^^zlx73gkAS6Tv(`1 z8ADRc#K^5KQjY&E<5F7WXSXLum@%JQUe)|xWAjEPTkK2O-Nd&e)%6TWJE_Ejf;F+aHyvmK| zFQ+~`1Xc8I`Gd&yFD0y08y+ygw*!^!^30wP$AcT~hu(K&G@(0~W3V8Ko*$++d`Dm; zj5OGmsr@-kYJtQh)nr4)AGXG-k0H(R3zbpF3g&}r-Wt+3H%2u`%D?y#$|TW};v2B~ z?@1qWh&`vmH&^MxuXCAP!^{8OjX0zFntrzx zqW#zbOBeCUg0M^&b&{Au8N4d5y&D;>enO(=)2VBF?n{|1F}+ad7rU#Qnn3MhV^1q0 zlVp=5k`cp0cEx+0ihXxK9AYy|aT6ZBEGAmu8_s81mA1}AfI^=DB-j0z(?D7y&W#XD z5IBZIBNdLw&o|yq@ay)&Pv=H9CN^EH0T#g!cE|S|7*DRXmo4I83Ie!7Ou@0n8?R40 z#kR2W#y|Am#y2x z(Fi-oGh@j!#7PpG|F7P|!-EP$>6wFsERwWaU-l!OKw5U(4y<~UQBL{eoC8cG-wa8( zsQv3@=-|NhT)qT3M@r)I$*$>F;)f6q4`u#~{uznmItS&H7D;?H9m9%zjqgRMFuy*0 z$~N3eY|A&p=|H0kNPtY3YPJ@5=}E~3{r~0y_z`gDU)OIvdy?mDY>82t3$s5b?ptp$9%E%lhf3*Y9W{}J|%ohpjZ9(CI4 zprHsI?>Db@jq<2BOdRHH#(4S+PF{Px%d7`Zky7M1VQo{9y<)7a{BfK}^sI|yrXsrb znYg-qKTsg0NSH$QpM2O`ok)lDh;`xoY@gepLZ+B7(6KNw; z+4Lf-c{vdocn9VT*N}bSyKFkw|MTQ!_y$awW(Trxv4$>ehI>{1HJZ$NvOFT>G4w%Q z^XMVLKI3++(utM%ct28+&b8*ho~qV z2!TYQsL4R%gy$@vCJh~ytl-H9o5til0WEmDH3;xMM6hq$hO=F5K{b5(qjg!rYY?T= z9Y!YPDDpo#N#l(*ubup}lcON>!=?&rH&#V zX0EU-kZ3!J*&@|!@BhtAH-S1#h4U<^=oifTBrVS1Nqc!hmVAn}k{S!ZJ(vNq;Hzj( z^=KBm8?*$~pmw)Ab5Ke6$5kk6-u&M%L;oo^wg^O2G23Y_>JYw2sPtIqZ1ZOPh6#A` zZNGWy5J6?CS=|(uaTkJFC1b#~OL?_jRDU4f5^<6R2T)I@@6s1bc63oiO26k{atKY! zVSOtJzA>X8FP*e%G$c9=#i~6P1w^h0YB9BF@Q%f=P-l!n&651j(oT;nIVr$x!65M@ zE$;attIJHh@{IqiRVyvHF_iR4^?rV4%HpjgoASG}_q|DgpKkpie#fmNCGE!}>&J_iL*}veLfVSOgu@u4T*O`1=e2ggyD!B?^cUtKX5Ijj z)fW5Vij=Q=KBHc^q5Hl~UI9H zsNcaV7Jrt{z;Z^7bEXxW+6=Cs#6rXVmpD45q~EF9x5~G|B~( zHQzDjrKh1J@u--19q6!AIBN{H`u|)1iQl@Z0PTv*gideWEQ*)^?Va%>5%NV~%~YMy%<<#R{og5IR5Y3M(DHjNIbq zn@7&jU`}yqPVKcQzYhX`VT=?2*J* z&PTEyEG4;Wo-+Oy$?y?YbW4+RmsL89b(j@68p&puS`If6I^=0-DJwkni(BD7fm&TE zlW&!?zD^|ZR4*br|G;LkW>_WQS^ag-@V%J6w$`xMU|=%W_gan({V~VqJfSz`tJcn+ zueCTk8w(3GyT!n4yQp~0k|ts7UBMqjr2~%|FDidWj!sQqhCnB}4&9mqJG^!)FeTXE zjA8;b62EKXzU1hP(QtZRp7BFM3Oz_ z@}FWm2L#%E;}nzVZbT+^L)B3Vk&Dvt;KiB~pGBhf6^!y-l0%W<%}Z0TEYtQ#mgkX% zQW+VKzZ!DL(_rY2rYx$K^_q&292j~C7=-_p zD+0gy+&Q&-t>Q;4}30&dfqhx z8>R%2h+hX&YE?es4WdvENhDvVn#5xr4c{S7fGn0ipv_azD$BrilI2fdID1nyQd=7X_%}#wPf%^n-n(q#Rc@FGpr|&JbDH$lO z{+#r+G^fUxovN>=UM>O}V!Ca7w=XV1mWDoL$9-^ntO=$6>v*B>Va$c(_+FfuKpuDk zu#_U@`YJsfjVVKF0+tlg;M-Cq&J&rzux99L3$-rm2U@fg77AmMGiF>?!z>Ic4Vgn1 zP<|BV=2!P3D|?Wr_#gOd;GyMtjQ)6>IdBkP9KprccHtr1e1c3}rO_b5emwek#;fw5 z(q+4NP4V0^>TjUdq!nF+m6SJ{xnjk%UgO9uLCI;kc6QdPkILj4Vk)8@}~JYu9-&5+O?90b#J~^V5<{RxofbC&3t)l^p2|uk~M6811fYRUu*+PfN@x^7;SC zrK$^^(D5}b{r3s?jhw9zq08d;<5)XmkLW?v+!`(7{z2z?2lA(})(BYmp1rBHRVC3Z z(SVe5J=Bk(o^y|cZibAE3=g`m!|mkqDlUK+UF5aS^S2zJ)pj|^x|wnNh`P{Y%_$u8 zSzNpMi^2~Pb9LlVo2+y6?CUn(G?Tzv2r3ws-dAUK;c3~cjNT`voV9nZmCnu~PW#N% zka$kAfC_6~C9bFJF^O5tCjs0XWvt0p`_En_@XV|62x&KT%99La% zJZM4!>(eQs38ke#miJ~LBTX4y$OT+zt1G_6jpaZPRR32sJX`@XG zT|Qt&k}xc^Q1{klLh@`#a6v-1)D_w0^S}qwmxErUs$b#fcfj3Ikw?MtyXd;dUkddH zoQ8c_3X@Ws0vizrA7^Oeou?)t-7Z&+bRNc6uRknBz&{rkVkA0(x8(&`-tSZj`6|Oq zq5ayfS>HuG&omX2QK~-X!Q0JgP8urHH}_vLA6j+~hw%6Hec929xCoa%wRR|``S69` z`@dDfDl`^1^tGAh!{`ni$pq1k4?%Iy_>PI6$~?ZWZw|+13tWvY8pch=@(-~66eBK# zxV=ncXi6`#d?HZO8CDy zZ3aMuE^9O2jty;9QlMvJ2_nV&HhMtBh3|oY_+u)oAh!AOdc$;Y*yLR4YglYMo}h z6GxmO?1VonVii%gj`=g(*{C2UTQl3_XBTEM<>`p?-&8yb6U49BY=ba7u(R=fh!VHd zXhGzXW#NF=X>8Bu{Z+^JE-}5{XJ333p=fJEJX+G#Nat{5n>-@ZO&=VC1!=owU%_jK z&7?DPE!%HI zMXVzauR6zG@2VbM;^ZWJMj!$`V88d%%|z6N#I@&$^0e!K2c%;@G&U9JV3Y31)Z|S} z-4c7X6s+5fk%1`A9Jr`2h6PvFwBWde9$)I>1yp>y-=y68@aT3IX{}ODKY3 zqP6w^)%&+YvZ7q=UTlWzI=mCstbOLC8g!yiRbw{su?Pw!TSg|@Pva@GyQIg40`~K_RPAqciu1njE~K9_OWy(GVeo&m5TF7H zWd27i^EAd{=zr7eyE)d*kEOl&5V|Jxd|3FngV#%Mus<`Sy5_!WcX)9Df0O8?M~d|B zyfPKHhkp}l=T!C7CdVQ7_-Paf>pk%F_Wt%Fl?U2zIA3jdDFr1Ik897K1|hS=-`rrh zg*CbO^2zPpM=ES=M!u*VaDso|dy=f}bKDWCluqP&psfOxh3fOgg2Iyc8V`)__zoie z0Bm9!-+4zHjGYBiIgH?>S{u~#v6e7qkte)w>(vl|<;;v>bF4WH8sE!c#tRT4Wp?Za zIG6zT1pZ$!?tD^TubW}mM>~|A(^Jr*q4B9-G{#gk0IqX?F+w2aBLkh7gNzBLgE3N* z7m=yGvfh1#B8?l*{cuEYD3ej3rRVUd6f<>4>iu5W_kGg4jUeyew%Ad4!80wM7;*1Y z0bzdsylx%zLUZ390)A?GIBolE#&+`tK<|bHDv^1T<#=5(gt*~Fr!o!7+77fZIx^!O zbYI0FSo6rg3AJtgYNa@@GOFq%0s5T^O;?(S=)0l#KEFj&nuCrR zE(t}1P||3wfQXP{T7aG#+x8NIk;xJ}&4f;z8xfGY*RdS2qY;r#~8pPEWR?6*nZ^KLhrnnd|xFH&aR9N-xA5}>6X zk_d{2I-Q~}@!Zu?T>D2{t3hpw>xTScl|kI?$t8azA{WfSKheGxvt7io#!GsyM4GWg zd5IM3w!w_e=XXDkBc0Tcq6!<)EIY$&b>Py+#s}%-`@P6=nJ(gKB6IAa8d04uGP=m6 z%i7gl02Ikl%y+Qkf&NF>dyjBc?w|_p#u0n|MT@tfCI1uqf#_sl7BnBcGul7m-+b{dTdkSU z7XW+_!cG;OcfWu(f=ftsFibBsVi$kPv~dDO!vd zJL7R)WaU}E-e){LI2Lsi4rc!Jw-kg8{H@l7&6~}9e%X8wc1;tIl*)GRmX^R$PCIl; z9Vnnq$*Ccly<`Jn$}spwNvlJL-eVQW<4RlSS<}#W2;(kb3bX(eU6hC*R~h9o!zrNT z)i}|Q9s#yPbpwRHRATXxhpy2DSO!;EIM$def6Py7NhRyiZhdGp3K;hX#khC^m)K{% zE2xr@h0dK*c-?b%^&Ft0=y~#2`Q(gz6)*r-#OVd+fB2!hpLs&3z0TMzIUPuMH30Fx zylvB6?sHDI_UUDV zqRE8#Np<$@_%_1M$;{me)CdiPJ56wA+z{NVy;E4wVuaB$&UD515Y?O5_@H{_I=i8U z_JomJ=S?<5StZrC1A61rt05392w0A|(&@4`t00K`#qvN{_G_7v`&4ogvc-_KP&&F7rvVM7cJ|7%Vz;AFFQhh%MEh=ZXRxtl1ayhD8La(hhwH( zpuhm<2q_RjK)%vcn{72}=amVW3It}CZwUvv55mGXTf^Fw#CYTMMXA?w)2_G#WiAmd@937wAQz~{KLbvIGn>2$lEBh z1A<@RA80^dt=n4WX@TdS2`()ka>VMtCUG*7xj9Ndv*mY`?-`;h4e?gnBm3!)QHO81 z{wIC~P7mr+GVsT0=Byxo1uHEZ?bLP-ZZL>uUWAP)vasfKpR>Lby;|e+=xj+$I@6v_ zFDo>}ht^g-%#!no=j={X@fJ{cFN*2L_(2D`;kR7eb~(;z#K&XpghXfRC)mf(2l|S| z!@_~TnCUe=A>56Ck@yuJvWlpdZC?PF0ii?amjD+()!+g{E>sM%68v?XX~Hjt6;Q#E zyZI5IRmNtSp#6edKxZH)l*MQQ!3N}`(8z4 zCj~d#enFNMe>krkh$Q7k|*ft*jx;%+8@dXICGcWmzzS;MRCs#+*q#r>kgyIEG zf349_M;38yxs|V_Y(*u*#hM~v+Af(|*JMsbRM`q3#_!XB#|bA`ZeiruKd+Jh7X%Qu zm?jm(vV$+JRvhzjO%;TIJUr^jF{@jW=@(S|yg|q$f@k1`O*YG!d`T8+b1tImxC@K= zsHttVFBo%%3FJM16WU*T0I={W-z5KkRLKJIV>9Hg9uAoUWyHUMjJ)7P%brR|8oa+< zlQw!9H+sR_yA!!n>|}3q7fEn^=+fdI9eQ z^ivs;k=C$jYjvdg2^7j|uDSIHR5WDz(82h1f~QInBc>7`pLELti2O6kNNfy#b#KK| z=jKR^b$niPBa)6PyAt zM;(~|!No(z<*jnS)XCgo)a*sBb00Z#{kX#?u&ZE34h7)GU7(yvXC5zsV3*PcPy)@# zuWem9HvC4Vy9dK;AT&9ph80wiI6TXtb`hnfX{R_5tECGev@|*+qvWV)q{EH*p?;Mo zZK=Cu8O$)F_sB)Mhy7G@21_Nh9AUGgOa@*>=xzV_x~sR7gegvcH$tsmygkcz5I&K-H>1 zxFaT!ehVz{4*RdXtXV^r<4Dw?c#2g*7}PQSwpD)_ysi+9ja8>c`0h& zQnOpbjWc`6C>6Z79Ht~R zbtfGr^&HtyOe3NuZ^od+i^_m(SVFx@Nk&cgj2w3;NK|8tm>p!?uatt_RA4@+un-1K z)6oJ@E|hl;)83JU9v%-;MaEo#L;GtAIwuU$XOul`_)JVd3sy+&<5d)Vz8uu{zt=(e z^2gJ0P)PgRYIvXtfy%{3pzDdkAw5pQWs}X#K53hJb z{TmGrUoCg&LG%s+&w6vP+Br8Qd1uPk|E8pfnc@(K&3w!5SwC`cU0y z%qJeK)xJrfp>(lMzsr;evX5XNz=S$B)Y-OA_GnBH8?jkZ>p)vYNc)Fuu`79@qyQ$H z@~EeLW6*pMbLXL#X1!7?7JMXbe^H1?esxD1n&qt^U)LF#YN^9GH|WE^Nb-H`b$W^Te>TGOOyZ;E zSDpWy)&JM=c=YdQf)fq@0$2N_l198mHkp*;Yvho8pwo!Czu)S~j%L@VqB19kl!oE& z#i1#*Aa7a?fy$Vd`shM8?UNSttIC%c2vMWjj)74A&26Gr!-I)gtVfRV@BOSs7t4hlsKnb;LLx%a71UL;Y( zxQ#1Fu#0T+l;jMuVCw{%yZd_)^CqMtSVt@^NY^kBq!O*=_4e00A0lFW$~CC<66;ju zaH6AxZps#|FZERZ$dsjVyz_|}O8io32G$?NQa;Ag5n-$$Y?Vmt56K1*{xN{eu#1wp z60Qv)+?CWi#%J=Nkf)Mt=I6Oh({(+a*4DV<(} zGO7tPvl;{Y4ORo;X|icsXWWUr0AX5q^&8IcN%U;)Ie~T;>#4_{S{`vGh1k_r2QbMi*8UtuPK!w5WVvQ=GTU+SW>$6>jVxdHA*rzcd~;1jYk5JXXlqa5p8;5ZPW%J? zubjrJ&ZTS({$hUyr1&)_$d;SrsF$_${F*)Yzx+2HkM7HGu=zIiVq%|3USe7$ zSEk}vQ#1y%yJq=KjW0EU58IIw8yfAbDwv;XPP)DtHK7cgSwK1Eyxamk<)m7zh@eeZ zSMmL;b9SH57?-}hi&b#ePADD^RaxwASL0+~RR;7Wi3|jHznh&cG3=tm7dlEznbf}4 zKRJ?rVkW*i-j7D>N7udl8L+tqeQQAgJw-{N|D-&pkBum_9^c3nN6 zl;PPj0eo1(9!`fX2@3*76i-PA#Ad(u1qCi6FydY{2u=S*6o{Dlt0@lnE>^15*9Pqr z2F5U6V8Z?MONW)ZbbZ97g#n=qn$wFaM|N5wrpuaGvziq&_bH)Vd%sM_d#;z_`4~{O zQC^g(_Vb7=ByQLwp(c$0cKK>;n6a$W;^9#SAD-{e01u}wY`{rkudv0Z({d#7AH0)7 zToe={VPRp82iYDu*6ZZ8D*xR9`f4fQOJGJK`4FGd(-WX7aA=~sez286*o?f{2?7CM zP*$axk?QwBb64dm0Xo$EO(^Epa4Rs=F#jm!?7KF7w;FXOOKOvHl>HF~Kw0!{a zE0wkqD;@f>H$Nbc7YOa2rs1!GFJ8YMH}l&+cW({~ZN3QmE)Eu7w0}7dLv@T2p5%WJ zbY(FNsnY1Xo>LwqT5ah+IgxB{#Fk4YXXvOan|07G!;LNrkCd&VVDG|4EalFTqHiZn zWRqT(mE=bbvezxg`I^czjv-lXcosyjeBwC^XJSvh6l+_7p@HSQ=>#U(kv)IA2y@%gUHFXjwFAU71e>ZC4DNS>i4#3?Esj~E_PB92C0 zZBn~$Jb21dw&*9fW(>OiZl%e^dS3Cx)vuHpGR|&p8`V}E>7|;Y``1hnn$S|tukst2 zE_6z(JW@iL_I1Sk6@RdBh`nQ#6SU={s(BG+rH^om!;m@(B2ZcYhda51MPtl=`8bVc z(6s0GQb^nr!`S9Ti;}Hy`Y=))k$d*YODenw3%4*dMk0>J$LPvncgRB&;{LI*H+YDk z#ez)w2Z}xK%1a#`Ey*SY9()C#ep3PJju4p?e+r=s1<4rr67cq1ym{_zswg>M$IqNH}3|W)JRxbq+34JU#FfJ;|ZQJKc;^q zoWw7q-Rtmp3*j zapyAYv~%GS>B6Kcq@EN5-I;F5(G<)AtP%RbRcs zF2jx|Lu`@{>+S!*Fl(rhk-v2jEoY;GipTqhoqM2q6a3K5FuYlwt}P-zv@F8KcChL7 z=kspuKf3a7zG-VTMXLpd*c3#rNR`alZG`~Hf@EzX4J+O)3_uh~!=V+Krd0aYYrIdL z#7~1hPtFkgrEr<#xw*nr46dPNY*Q5Ms+p@KF?i#cfeeDPC~Py@H$5^&b}{bkT&G~M zxyVHPSM%~1F3l$^h^bc^_0gcH{o9Rk5&RtnaqGXKoWEG&Xcr3ABVaOl=Kx~Fp_daV zJ$8L4)>y%vwT%j=l_vrog{=X!jGyl6u8W!J&6b#9t#)8m9-**1UO$K_p-TwT)msGr z59C}hvWG)ol8Q*^l>dO2)T;?63*duz9vsdtC>VP+9jJONW93Kz>W5A5eV4z5 za|>|+?%q!Ms@ZmfZILLfCm5jg_j{Knj#{ok#R+YV5-@=ZEH4+guA~qNES&*7jc&w98tlIpB%x_;@k{3 z^)O@uzNWr;S*AxTXm(nAdGXx*yn@NW|DY9FV)CA-lpDDbtVZZxSWiE zTd{T7?I(}m(qOtR`W}AbDQn|Ky!NS&3U-MH#qLgM84h+yDX<9(f|#d-gONA=a1BjeRfw>R#=rtL)}90R-|E*5Uc1w+rR8u62S$L+j^pu zmfD+ZsZ5;@J_~>RP@vli+8bIH6s84Y9zb}G)T zu?466X;Fj1ldB`Qq%pS7ii%^eA3>k&3Hc(>n<&x3sV%7YRQzi(U>R-lT z7WCM#+ro`uMoN`W6lN4_pS??h{N zxH2%BntHnKuD9)1eEmj3G91@)qrc|7YF7pV?UWjRz}dguma;$ZldiqQIBe~HJl&LC zkPg^nl7e9m^nW(!ORD6f%sJC!ElRDiAD&5Wc5rKp1VA+RaCo!uBY$0F8ay1g#{qim zHr*_m^d1bHI)FiQsU{Kk_d+C;>zm9z*l_MoJkqPk_|7Px6koO>e4!TXc=G~e(OQ?E z5{UHOI$%V-xe&2tZxcPI*OX~n1C4triCkXG%^b)tgSq_}7bi{nz*Lk7Db{NZa)fr5 zK}Xw&;nAN7vkB=dzQzU_QW!PFm=WKhb~Wds#0In(z_x4j#wNen??Bfo(Q!M`{|1J2!C41m?u6lJfojf_w&ZhBavTH$9X1SC6pu)VRua)cC~xd^|_7@bI_!vLPMFa5b35;#f~BkV^yRu z&N7LW&&SdiA2>!lI9ZcnPj}Y9hKn+z4&Mt*QWnX9f-Wd379^{?2I~T?QDFzA)zDR& zh$XSP$5%zdGMZr;rH?)D&jY}T&6UQ*4F1p64m-0awRnBccOUPYSM^iAaPIwJ(}0f$ z?dMUI0?XB4(P zKY1CeB>B4G$6>3G`N?>Ef@4+k_?Y8OsMfL-CCeZG2V3XZ9ckFE={Oyy<8;_z1s&VA zZKGq`cBb`s)XL*2Lt0hz#Nk?IkGyIUtjs})d zoQ$?auY`3K!J4pIX>a~j5^BQiv_@%}xG?FJE_S7<;n97?(ea6pwl>_<<~zgTWH!)9 z9h>m&@zQu=wZY!Y>$<|P6%t$5`6tX$MyQE3RAwQYNdD{f6)C^?RJY9CM0(gV{ZAR@ zdKBc{yYfo^xh=@@j%Wn_Ctr#Cc4dbO{?FL@pMt7;#L?hKcXKTP)^dIgBCmIGbcjv2 z)F}flcA8<)E|f)SK|%Ew2{>lQ3|D6@etFS(aNx_8Axse`?~FTq7c87qk-YdQCAZ!Z zc1W?-8hi&fEKKn(3h>0I=X>Gd+)8*jN!SncbEm}m`ZP&n>bv?EPn7?3TYk_iW`>A& zUF-hSt-~7oax#(k0d4K*+cPHX)estMZwgFv<4v{~rgC#&pLh7|HncAu8giuhGf#(D zeH<|Z?okYQBpo)3`M~Q``UA*%Er{BXRObYK!86>xJQ{GsDj*1Bcw!j?SPZm^l->)` zX(LaO4BC|f?6{4*bjxQF8g7mzCSW)S2Tw;!6D^de^d#FxC?iA(S&gjb2Dy+a&YQ@^ zJfs?~ginUUxIzQwbE-V>7_AFncx#mDD(`VwpqA`d@*41@ZUY1~$QEDNfUO-#2KX?n z#DIk2{LVqv(LUTM-bDy6E?sm6Id0!T$M3+PtaEahwz!|k@8Hk{&(YQoEHksB(+aP@ za@rjdfXbu3!Ap0icHD<2BX-6k`yt9n?9UW^Cg>o_|FgXL->>YF;Xe&4oU_QYMsH+C z!+xx+@D}ReGEOb3MAk~AIs0Zfaqod27MRB&=ZA=E^9wDB)%u9pCZTt*}nStipu}>r#^~(O%`;@&FJ70n^ zIsF)q0|dsKm#C6NT7v}=GQB`Jda+f*yvyA=!(STyCinO{_kO;FA+dDP8f+yTZRwp2>lF3(RXnzsdd2 z(M+)am{Ihy1Y2=mMRqP1j_vY8udYT?X9Gk^kD?~pty&n+2eIXM(klJWIN;)n;PBJs zri4u32nrZ8G{J@(w@t9lWJ1h##bE9s0IF(^CrynJe+Lq%Phd!JSTIr7tO`XoX+6x= zxcWz+>XGKh^7+i$PMwq(>o6+&g+S7y0lFjuJA?jI@qT69QQhfMr}dyIe1=;59`0Kb z+_K^XwyDy_Nq!9&s-FR`1#N7q?44ug>0^0T6HD^nVotIB5MqZQmU^4EAPDj6BF|Lb z4*q{r^C%7mat65q((UP5(S|fr6?=xz?<)T9uc-Xb2#BBidWc(}PSN=IqCS&gFOwPp zPCAg%;>bCt-Fnt-pWt7fcXLbnp>4izq=|^I*g6ilosSb$`CTf#m+SVBdh0jvt!-Wm z&EDkj@9zwwahv&Dbl?I0AsnDJVL^W$EZ>~~tFwf;_) zfl;ff?;K6WMu-pX;L)}HchOlbIM}czjL~`UL8i`)#?e{pQKHX(8>1`%inE5ySj>gf z&KhQI;piv*!fc2~_%Z?oalI)TD^$H&ssi#^0f#N@oWP(@-?_H1rTSopUp6g88ktn&@!U3u$ZhkP}V(8wOlrF%40jc#(4|DK$ z%FBiFcLcM&M?|0|N<_ zHKTx^km$@I11aGBW-!cq%=5wF0rTHGZ$0V^Nxr8$zo$k(3fP|Xhm!iuRSB9*5AeSu zi-aF9fy11!U@~Jo@LK9fxTsL3ttT2bZJQxqQtra;D7>EVjm3gA*x~^KVwA2~2(jEj z=~`-`96O;Y72hNxmb*klgzM!wd{?qlftwgozm<#}@*@t(f67RwdsOSs(u%<3Tyahw znZ)Pog(xLft{?f+8h`C4L?2%U&)@!^R@xrk-ayJg2Wy%FyflKWt|S6EC2zu$VC2xe z8WdZVdvocQd%4YlMMkxnfYImnfkD9BR#UKTn4=fQSr4mcif?NK=|FIcJt3-Xl+Q2? zl-~3rkn)AC#SP+kOh$QlZ(F;ZmX0IrB zOpiSs?YGe^S7s?FE598!I^8XlSDQ7cvyBj)Y+Od(1@#?jOm?LH=sL{{7K)vk@iSQO z_!z0pVe@WuUsy?aPAmhBmSY%)UYBec5vh3Ws*!yQ;#+VL%#oefya34`Jyk8o{W>TS z??&+0J1Y|K;wGmUfhPz!1tz&LpF4WuKP@dqFXzJIfmlJC*Uy%>oE}mMV1XoDcjeGm z2+&Z5Wd36gI-JFW;Jgt-k|ae?@$&fqW!@B_hHWB?F|kfcugMtnDaG6g9Q3SqC!9uL z8}`09295vm$~PWa490=Z zmcqdhJmgTBxV^E*l3OAsgAgvIrGltqzLHmR29+?#RjiZ8>D@906iA;?_^#_maWS|` zDw*MZF)Rc5og9q&1P$P1MJO@TQR^bq_Qt=W3##nLM>I_Lq0qk_&-LbFBTORU8j%LT z+es*m((vc=mJklh!ZoyzQQ+ZsvDEE|Wg>n<0n|qvN}Gu>SgR6FrmxpKws7|BvLC`X zR@mzMSPQz1){Xz)!<#2ehp+!z210*-&XN-()}A0Y%s2-)vfOqq@Dt8c-v`%e4vdh5 zSZe3--l*A%g29dIVx2EIV9d+@;zkumr&(pb?lDnkT&o)ALBb!hG~@!)yqAqBnxXUl zA2_&-aXr!HQJ|sbHyo4TzSSVa#*doDf(_jOpUnXF6v%OsUgav7MA2V7nyG3?D{QSS?HySSU1qh7GA+A=$=_g zq&)-Iet+d#$wJL1(Fg9~Fw`ntC(dEFjE0XcL)&Ueav)12sx}O5)wd`#_u9~Bwg&Ow>{m;>HEFd`H(&@hi?1NH!*ghlm`;v+SedJJ(2MuE#sydS`nx zs>yAw++F@$2cZf22q8AMj{ z^Oj&n?fcJ8(>{|s*sncEWlw(OC(t)IQ=TWJSN)SRBj7LKmwv4MgvF6gJ;cW>^cD6v zgd2j!Ar2L-a_R1v^Ac*jw3BR~`*7X=^TD6)cm3mJ!2=Zjp#Kc$dr}3nG=nK-g9qKS z*IX9?4HuUIJWx2l6qJ(l5|^u$P#WTcHhNM^n%uBQb6_lo2iRp}Nr6s8z*VBq1QwH!Zi#BH#|B<#ri45eVZ zztC-CbTT+B(CTpAXAQBnk6+LERWocO8YvY{TI#?tBC~aqR;i334#1QaGJLGmz49R< zARyR1;6qGY@+`xz^Lu|F8~CJ^Qv?cW#D=hq^=c@ncI#z)Jd&4E8oycs^Hydq!(css-~> z!9<+|7HZQciw30^O-OF zRbab6i-73W)cEjCZ#}e|A|AK;AD3ot$xa4R@eXuY79a^!0>FgraxAQ~o54LcU(|yZ z5}gqgB2e^Rc1{$vaGBi~)$OC}6J;^05q@l{RbV$j99mq3onTFU-C;4YFllUw#?w(%irHc-7Tp~S=bfp6ZPyuWf~af z?d`t-L{a#Kam1bm)jI=QoIu+h?3;jet}Kw`dwzKGc~|K#uiXq1U=+E&yTIjV{a-)d zTjr-h{trmou4~VKI<5GXmp==rUGPbn32;J@xK(SmL=grh$dGviIVy^hX27?n8@0L_ z30kOB-Ju69VCAT|!C81A6hsNCExHJ4z;xaGm3~KZc?`%ZBFl_Kf!Zgr%9__D6gEHL zhVgvC4}O41C@#QDkRb0f(D4j5p|(O4INi`u-ip}7LNCF~81nhb5R z;U4^0>LP(3+Np0c1|aU}emPsq>qodWd1K&Yg#4R8-@^Qd-9+IG6);jc>?0^w|KheQ zo7oljKO_1u=atoH09Am4CWE7cT(Kz3_Do&#F}UtVs>7J9e@RIZz%fKdez+7aCAP)Y zdT6lg4PjiT`kT*EhkEi2D`h~Rgf`5y9B?8zCeif>x6lLzezhnSxkaQfNwLNG%~siZ zIDsSZ*U3r5I_VS~3*4O?)HWQ)1k=~~JpC6~WN>KcdZ)Znpr?kMsIX+!etzC$xm5lb z^`9Kb841%qZW;|g+>&i;%!D~t4`sU*IS&vh?6on1>2BqTkh#L^y`#bGg&+CG;4L$Ph=^7zTPVxzS z)Jm?!NFH;Q{H}m707hZ3(}VHUUA9n?*@?`$svbq!Bhwz*CI_D6NkAz6&on1Z^a=@2 zGlSR}uu!Nb9r;JenG1tOCRh?`)N`ftE^U%iNJhZgvIl_u5n)Iobp*yFJYk|)@{&oy zq&$C&6Mu+6*!M_v%wpky&H$lc-dPFPMwp+PTEdCDJ}#1*1y&iO!1Gp&CN-1yb=(dB z4uHwx%zm5HAkgd)W-T#%THw8EgGJS%+r9o#n?+df^0e%@^vL+>Mi-_`XMD@<7p&Uk zBY>Z8=WP#3$NlcAaZb<-N~hm08>17fIob{Z>5B}tx&W$p3A`E!1eV%Y!ePyG)*fd( z21Kh5C&AwGM7#_Tp&fsOp_cHB>gKu@o#SD)&F zO$$EJE=F8g4_Q*0n^auNRK_0{cF3^H*~pi5;;j#I^GE8UkC`QS7BWcD%&-syTn1QF z9;Afv$0P?r8U}T6l*&6^fQme;^D^~*_nPSU5Qqm%pK0~$=9FAi8guEN*eBkLY^Z4RD2iJyp>^I49wjJzx z1Tmq{=x5lH3y>w_OBZFf``eq^o1wiP&oLXGF=^Bd#6A(vR_`hF)*5A1*7i8QgRQQu zg$+n!?KPWLpqkvGGrQc5O?@Z6(kflCi~ z6x1Q{9P)@C&a;s5JmI#iE64{=rvpYH2J(rZdf<6BH%8+Yp&k-Om5OvD>3HOjb8zsLk+^h3J z_+Q7B4u<*tcID^wRP*);%?zX67x!)HGS9f0h@dg#T3t{0ZI`B702|qMBk(AL_3Cg+ zVC!wgzIBWNbhnqc#vj;wQpn)NRsGRbDPXvWh$9M{LZ^>Z+$4Kg74m6AbykU18;_DN z#|kFS5`j2}CJVtey{E%oy0~S}ggy2zB^*+E<_=^Ff+KrqI{ff{+M@ikAj!Wf^I5>m z8H;_Nx*K=D4=i1{bNNW4_&mh%D+Z6Qq(9vn?SHY*YMm@#CvZ-`<<8=&rcL`Cx_zt3 znyGhrEq!jO@mPh*ds=s%SzrOG()j?V`P0k)BFvr46-S%(1G) zs@cxYoJ($6el*5c7WFV$aM8jhRDRBkeywuC<`#Gs@3W;ghddu8cqk?gZ}3mwxB9*2 zzy^=KCDU2Z48Iv2U=X7bK^&_X9oH`5kRVHQgaa0e_Qz{c6(=^70$d1!Tr+X4ucPI< zWuGXUfs_Zmh6`{+zd_j{rhM5PRE&ReBV9YJ5fj(|B%=2^IkmU z-cpq<+;Wd=3`dublVVyKmIe$*4E?b;XJq@_)%1RB`=oZ5Mj^!SDJsq$q~yPrwDvVb z@bz4hSGRvI=jzMvD+behTmW7#t>hQvYvHg4+s`0$Hj6*J4rMB3m=jOkV z8X?&dvQ7&}B79aRu3sR?po3N#%#&9F*U|rcSrYYmGj7^&B^lt4HDBRO;~Z3Xm(^8I zz{37_$DR{wS+Q`Wa>J@8<_-+|G`>E5?nq)*5p^pE`=kskdJ>n;P=J+U%oaxajTUOJy{=3FI1`Pq zcrJmWmN+z3-ZhwQ3o+YL56aOaL~^N{pMxo71C=8A`d$6BJ$uKU-}0F_`P8 zt@VJ$+oc{&Mp*vmI{Llwa=O0m!qcm{sdwnfjtkvXmw}e%*Undle0x^2M692LxJe#) z)5>C(y({*I&ZKEeAuCH6VUd3gZufqw={vxUs_O@RDbqlib%fqOZ*|5seJi=#2%OiO zaY~bB5D5wBI?U%4-I(1E2t{Bjj%AnM-@_}Q;w*Yxjx9FP=D;pE>_@$%(W72EPbxC* zttV3wlj|<0<8+L7yrYXU+g<8W)M= z9JdA^Z^r|6w+*G!)0ee$t(9quaTmugCtk|D@s)?>%qaJqmjrrQrL*&wRzF@!s@REu zE>+Jh=$uO)Cwmd?+)3uFygnIHdR=F_54szT1w&hLtIsJ1PI-^_>vKG=MaFU*S&n}u zcU-Jl&&>!=nQpYokK@&t2{wxF6jMxFff@N}r-MvKAFLboX}6>V6c6;4c;&n?Oa z-j)XK0hlZ%5=R8-gbM?#=|7`vHJ_AW`qAm=$U_-;t7(R$65(fPYSD{F(H-~f0u2Yl zvb-z6OHB;Rc9JBw4d8#LvO0nNhjlW={*M3obpIJMK%-_fnZa4z4v_~)oXl72EDHd7 z$lDpEnCO3`F_7sBk~~;=l|oU3AM{`tW}x zsVL1lnC~#(8}0lErg&~?4-qGWE-@WeOjC>>{;lBP5%q0(KikpqHp=q0C=MUItHy&1#$T!i(suyFa1sW82s(d?Vcv0+4>-|*PiqY&sgh`w&nLM~sz z6Evz*sHbwhF@P$^a#{Km0FM}%L2UMca*oVnQ#RuPr((`f5X}f{U(!l)l(P|p=#uCF z)0YHB!!VeZVY>~tmqlpiS1&S2_qUltucIG81I2qh3Qt_N=vDesaPukDXkwwYaapnZn@k#TA0jfiBB;{GFkdJ%2Ua=UAT})H|c+CbhyE zmOAjiq`ZS-^Ws7Oc zqeOSgtzU(FMpqx@Y+mf1$os$>rblg9U|Mb7e!)=>e&H}#pIussFKz_|gEbEY#Z}v- zek(z<(?C=DRcP*#uEpwJy--cyc!C0$eT}VC4gd04n6>9Nu9Bf5p-BaxFQCQFi>3oX6_it$3!_u`R z7gOGJ?AJNb6c!eGRsup!R|$D~2oIaqgi6w}oYPUOg0arRp-Jc4roVKjg=-5oj&ft> zckXGGp3L%#5iF2moEFx4tW&c4kjFPI$5Lr@r=@GEa~X6$!a#kV3^kSifO2Q@U&@w| z*7zdZE;l1&3f>1z*#vQli6FHF^*Mv|c&yiGI&m5cCc8yV%2|`y`^BZ=+Y*nFOQfk4 zpu07>Y;raWhphzAWzlKYdGTDrmkyBL++p)o0O^aUD{)RSM$o5a)5BG@WtX7&X#D?35Us_w+(}sP3PDR$F zY*3tTYi6|K9(}%T;>*W;a@~E9lvBEz8kARk^#B5vBPxkJi}U(IWjP99!t-T$eRzBU zSHa8GDto`A+)&j3249`T{aj;ZPb)slyxmx2?o0@lyTOV{kC=~d^JLW5$9RAAdTnGE z4^j2y-aJXsA1uCBEO6diqAKORjra`pck+IY?4Dj`Idye-lESRqk!bE&^a;dH9C2Jk zTemt_iWA)a2VC~D(ivebW)SRA3S>R2P@_dbfv1v0zXow@4Is>l!)7%weR%~t@(~8K z2<|()c7ACDccgzABk;vO%q8zEv|S{e7H@bHu=(C2N8I~d+cX*NeLi+6xbpn_Pr0zO zwk7Q5hW+)fAgi0s``Xh&W&ncMF_6_}_#*11NC+>lGff73yRIngpC4h0C&wZ#Vz?=v zBSiV-Z73FQaM*r3w@k?pQ-keWp8(pefdG!)K%g(w8uEp(%8de#G1wk1s-}Q;3oN=J zlG;oHQn;l?*s+@-86!j13qvLo1zMnGxmcNF#!kFDG1O<1= zgoD*Qg%5Uh#tue%^rQAe>Yv{`PxJEEV<$J6EHwdXRQPf85b;EhgZ=2<)DQRTJq5)c z$LUC0xM802GgD79yLOkG9kXHXn_FA-2uX*c{WDG+E!+itHGE%a2MYGg%uEA}NH?P% z`|WOU6>3Zjc<8%_htb`DsBN`bv&}Em2-XiDA0MWwgsy#Inz`xeKi;p+(-#*PSvr7* z+RAQA{Xj8WzA)w&I+nWsT#%TK1)e;$m}0KAuHx<(A^Lq%FJ$^H^2iQ}>Rfi06bZp7^S>u6}x+ z>{yS_-=-k^Zq8H|+s@a0h`Iw;HpBFLm-& z(9_FT62BT|nB;%7MnoP@yctl8-iZrx->s2tzF4)IUYmmsorCWaP}>x4+Y&MLR^b^_ zrsEuG(^nf#Xq88Tmg+`#+2>^az6tTTndRV=(D{Br-}NP}+{=f(?z{BE9!sVh>>dZV zZnrBA{-?ACVF#TdJ{osk=^57Q^|U4K8}=R}uVgGtqDjh1%UOI3RmCVdWxdX?#5b{& zil^+P`6Ff1)qSikgT*5DJL6<>46)qxzOuX_sFK%x%4;*oi*1u;r;m0>G<6=;fn9g> z&Q)s`HeD;m8L(pZ_eeA2RqT!2a(RST%H1R8T-GmA53Q$4eP@My{^3$s2Vq9B%FsU- z(ycw9$EDcV8ANx6w+ehl02!ZMQ(hmI(;I%+EEzpE`39cE{v7|z*RDCP>WVy@=-_y* z>h#at`asUx5Y~9X&hAS#&k}cW#xLXu5su)TD2#%>8_y0?^1>T@<*t5fEjMhY2u+#j zY5M@_?=_?}?P=?ONWWcw-g7#;J{r|8#|Es~L0aRHDu(vd(F;L;7ek<1RiEhojguD- z1GsDWlCVSQPm+@+!D&>+um{2wkP{Ir6g|kA^*Y($7qs${4=9GV?h!}IrYeRmJAF^1 zC|me;U_@EFj4BYz5P0mARjXi>-ak4=MgXC-pfe!R)SsN0{zr23IcUP1*eM`~aOd+Q z{WB5(H?yfG)Uzie*)3aj>z#f*3pXrlLF!62sGWku%vj9ueMWH;&fC2OXJ1@}UdHUJ zaJ1<@wjtDK$tHI!`#VVYlSs zB#Wg=-CpIzqz|!gIm3@?OZPGCn}4_*jl&QGZ&L0vV+&r9JtR7r^aBMS3<+Dn$aH_@ z{-uK>^%#5`kzNdICvzv!4TO6zByce1Iw`$1@OhrI5lcJkOZ5KE<3Ji^YShMb&H4Us za?d1oTzKxl!P;6z0PlIS^+qDCfOo?{=k_mHl0e)YCx3Ni>u3C@HSA`3Y`=FZ`zt~Z z2Z*APa>$A%;gESPsVKbFHzQ0tNg}~n!@T3VyX6nD3)jo!%&4sA8T;$wWr|0(amw34 zkrGY91u3`d87kA6_*vge`V#f(cy>h9;B`Tz3t~64-J%{nK;b31Omatj!wIuU+KjWM!D_EOz;Ipz~)U zclKu0Vb%gHh zKpvf+V#2v3Q`F}0Dh8K#$3kr0RL%=3lp}K3!u;X;bmGBY;Mzl8J32e*?wR?1w)#$i z9F6}6Zp6Wc=dt&;M1`jL?B+hTL?*nI$x6FI?W%*wo2U-PJR-6dB1ZQ9jl7rzZd+by zulrUqndpHpJ@Vltf-15B0^+G@?JDxi>^wAb_mx@)!w};9ab;YkVe*Gz=~FP5JoJ94 zxe`qDml_>En*RL=J)NQ64&|fI?+y56gG33{Pj>$!!$^ak>cFNRr(%urWH5#cN5VR$3P;`+LMpkME zoH#p5FIS!^I`2EaxE#!r-Rqon-_7CTS%efw|J45(_zB+_rWgxk5&KR-4Yxf<?~gGPKh<(|n_~_}vTLoxV5M1K&Fa zvaJVUIlm*i>!uIUgY8D>?uu2--~&VZ4meqgPIOq;JEXPOp@;X$*e5iw^9^2X3%@tM z#9ylh?=?!5_KN$XS_U7e-oqTE6E3&w>|h@@-EJJbY={*o~vTT#In_m|Ej(G=XDLcx;(7P=yo|rFJsyRZGcX zSUS%f!i?ISscy>?*>7XZ`=Ru={oSkx1g1bFB&-9YsE?lpdqM}}%v1ffreh{Q*GFAV zS(`cX3Ibhxm)bVTS?3TwM>y@^?^SQBAToH&vvl5g->&-H50cbP1ljC1d2(~IGa*_= z)LlOJp|hCn8jpc~Z^oKuUzJSLg*1Oh4&flmx z_^%1am^YkV^nX@q!r1ctAuRk`A=Uat1t_SgG$;ceBDa%l@^$E z{7qP&_E1IrSsLJw-0HzDkzbWRA9`a)A$2rAs+4^cAw;AK0|h)8)n-0y7ot+_bsq#@ z5Rs+T?u7V?6MJ9Nw}GwqjV;54vW42;)dUS~-XsZebOS$E3#zc-CHr6`=#$e_ZGG72BPRY!@FL}yLur}c*0LB+vIxbZPwlCv1oOID=TfU^(JrBtk9XN^?aW( zy>}C`d)L354H$>KhSI+v7)KlZBpo^C&*^ky`oT*`f72!OEYPPEjJ(6Xs+aGgu%Z8y zUEi$f;~3Z@DUdIo{`tQmQiL?$a?S=C|J^Osp@Q;>I4~;sK0S{=`a#aWO@zp-pacpulum%(GcA& zzw;s>_^+~%mR!llRi(H+AcASpyH#D`8GfS(OPa=avl1w7RHoy4U+-t*y=TB^yHwInFX8pX-PT5?7K2LmxeY?ujTmA#oashf ze>}hJm4e`T-4<>(c!0S3l?`O0(|b46>wH-n5t0M%Zn|zwSTw@gnVhUF>H3HPaa?^n3R+xZIOB0LlA? zjx9|LT}f-#fC6MSo-d>okcAl^zcHh`Vi;2is^kWjS9#Iz-qHy&Il-v;J-HbIL#tQK zj4tlk^XMZ`lUEJ&JmGX8m&YdJZztoBo3fpHN0H}$^sNKR2q%y-;nLS&EuGARC(PE+ zE*N$P{~8DOT;vfai$V|KG|kD_1`hjC6JefaRJ9tl*(h&i-@`Ml1eFRK=eUiA9etRb6^) zU=r;~E(dNG$Hm!L#J2@eZEb7>gXNl6eQ54f4rK+;%AR1+-aiNg8dgJ z)_*|W=R{ef$##RxZUmi=nZQ|69@N*$_p}}4e)!ki1oE`~b`qWM50)S8p0fqPRnIE4kD3e0-RguUc9 zpZz#-k<8~+tCy4&?fZSKhIsIURMhkKJzX=Nos4vb9=lO7c08;Bham zlqHDnQYPn(M#c+(`Iwy-cJxcT8#?+z0$&A>&AR(51QF|PVgJ%1J2<@1V*Vw2`&&H9b68wLX%*(; zH_V=jVpAWr{*Q83ksjN`JB*v2^Hdy^5<+dbP7;$QB zg-CLxK%77BAW{<#tyVQu$HqG`R#6C(u^L`1${1aDwfB4;SYj-8sgew=`M5e9Y)HH4 z0%xEhl`;(bB&x)br_|JOG-CL-9OF?T58Lj%Rl8nU7|1l+h1@?0 zN(&qzAdPPcP=?7l@kPY`$vCTETn0h0LrmF-yD%^YqThvvP(PvQ0!YcKEGk`rn16t1k z$cT|IE=!RI;d4;jHjoGR=Ees%&p2sYQ31fsXi@eJ|Dd|pnGSn6vw2c$?+4R$?2zW2 zUgnxA1+k%7-zRA%>nKQ!SI-^iLL7L=R8yj&wNNRUuWOtOz$fH>TNdCxF2?Qm9RRiR zRr%J1SB}$_Be|L3@acVlJX!8>JAoehxtjLjC3U*C8lJseHJ5(6MVwo4m?A6Y;5I|?OI9 zub0M+XEQ1v$o>8j9Xk;WcRgEGf}F4KuDm4@?suCFwHl`@j6~^Vi+C-C~WC_9Ui=<^(}kJYPSx z&r!$^HfxN_f`aVl%k^od?Z{`MKkH;q^U63Thv~f-bIY`r(4}_c#`Ww{>+!zo@8H_F zC+nSzG%(qN-0E>_cDCN4JkJJT+?G52a;7K*e@28w1S-oG3?TQ!_V93C+cWmto2Ikb z#0T_>&Ten#=7+J^QXnGx2TeTU(|5*K8KbZr0s^8X12h%{_rzIIpI~g zg=dXLfy6*%RH@4cooF~JD*a3$g`a>xrO;aJVozkZNE`G9GNEL%s}2bKgvke`W;L2NT6YXdyYEuRQQL!#yEEDA)9q8Y_!guwOSdx6PI#rE z#{L0}u*Hq^pUdqw$)GgsLw*}!&&f$(n+Z5#SNH`cP4!{&Bgy$uceG1!Ze2yRi5byL z2UDd^Ed;vFd8*rpsD|&R$Fe?c&f^`ES!O4i@WMq z3Ph#U>bfNA%lMs#D+7>v0KTau(&|8+C%# zeT5o*|C(<%2;{x4COz3s)3jt}w1P>8l%3TSLwRM44^K zgjSWxv1sjY1={PsHBK;}>QO4UgXy>NvUMt~QxGWYAyN#gd+gj(M#nlgAycj)s|J}b zad}?@Yvw`T!aYFmXWWZ}67HbiLRsExo(^}LD4u?$$K4=tZBdW>cT};MCHtHwZ6a$& zJ!<+W58zEb9LwnPQ~jxt0WCR7vqEQ&JO^rfFS<=gE3_|!1(qA!=fDS#Y2vkEh)jvmC?drF&sC4>!o6AHi9zi29rA58d{lY zC^kvWAveOH`iO4>SZydc#u&ETFHhbtnU?|;H{`9%ViXTfP5m}DRszQh_da$!{zqC`Q37@Cg z&a0>Nar)WQ4McBlnJ=L!ziZhl*Z6Ot7bv|!zkEPQTXToZ*`-=OGHZ)=^Q$$OXJaPPU-fvmeJ|AsbDIIdg6rzaMx_ZiCXdqM z93@o^!-g%lq8I$|r2gBo`P5-4%>LV(J_%+A?Icv;8zTnMjVT2I9dk(^Y6|a2SEX?? zIu-V@so#)*?Jt~F<>`|RgYqPEWOKu@VmDo%h}xaQoqB(YQ@7@zvBUNn7~BdP>?7cr zby=rJzmvUH%*DkeZjP0U;E@*$#ixFT0lwYaZhH=fs{go8JOZ5$AP#XL#SPA{Zo)8X z&|EU~&|!9kGWCjwNT|MV{jscntNm=4EXNef0!>eKu#1B zI@+JbS1zJr@_UFj(>WqB9qKc4f%6 zH@KvtAcwsNepof&2PBo0y245WI@fRvEl_@ z{}h>1V!^WD=TlOxyQ9VYWd+%B=pCn&z8(rN1xJ58It^7t>O&9ZOx%|b$} z+fx0HDQ@X5?`w;+Z)KxztwnVz9u>JSt(Z4fsuP93%+2_*K$hYSMmM=3>=y!=!|L4E z^)#}o<>FGxP~YJ|#twC)-Vh~9bE*2OYf}p&=+L)-WgE8}!Te2ybxTf^9Ya~mrz{Ew zufrkR6jwC%fh>0lTZ(11ZDY)Mz)%Yi$bM~Wle2l#rR_(geyIa@@rp8J*1n5bWuN@3 zd&k_ye9MmC#VJ+hEJ%!>^#tXIPZUyZL=doZ@HcK!eYaq?jGq|(dOn@-b`b35c7iI} z%Z}o$Hl470k)QY>o5qi%=$#ZngDP)v&BpFfe&20SC+*|G?!q=C$`ckq-%Bi`8vl(% z_zEn&8TukXf6(y0G{fvUtRva<8&7^v^R;?t3qD7HI4^Ya4yA2-8scbuqN!4md8vc@ zo;Y_6Uxb&vaKcQ(SMq|^f#BHQu&0N86J!Fj!=-%OHr3&hY9AzhdeYQ|D4t;nKYW)g zrqAQ)35tf>K6E37@W!Ki*;E`|b`R1om!>#XytQ<}^}cc^HbF$bLmN#ZV!{80+ehRc zZN7)ODXy6!t{aNb!@oVs(OYQ$osF4Lr*xU+XaEL26e5=y7RI677y{4z0HOdwQxF+) ziyE>%AShB0Ux$bJ2QBhD;GKt(-rWO5&t}#ioaA`FhNxbP(z0EEa_Stuvh$}Y>krLt zW+GJ+MSOJ7p28UY154=7!^5mWYE=(O@ss*Y?2BcO@Igkc8YbjXTG{=%nj3m>u>ubH zjg`@VfiGW!exj13{z>chUFgX-{HbZc@1I^i4q<}@(6z>x3!L5X2YV7RNzU?VY4{0C zQuCwQQjqcsJPyd~s~$xWEK1xL03^teI)WHkmUWMd^3_r<#WLi`rw!n6xhjT(^MVa` zk_u!6-!YI*TUE@vBs=)K5Ce)JY@ieZ3prjALh>LVt}8s+|t2cgS4lo~rQvu8Z}VpjlXH z)tX?XaXG2#kX&(>J=PF5|5&Ul$2_!r$zs#1*Sp2Ez5-#a1sFQ4YK-o1pna%{q z53BQKkJ`ylAKd*iS0b`-8$5=XuhU808q#d5HoAgrSfK~@u8rX64jbFAkIV}k%IKLW z=?3hQIc=`|eY+~H(kn58!x(CXfx$KmZ}AlFe9L$zl*tN~vi!^MT zBl@l>-kv8GcQKSlnBuprgF2e_?Nr1!jwvlb;uz4o`?7+6d)K_VMF{=*e*x1#EWdc4 zx{GIh@U1)yr_t4WHCm7jw1Agy?J&V$ z7*4wfhSAgy9x^2_a)megKgw&dfqDUa>IPS6FUzAJ9Lf_XuJncQ$;l8)3E(79E`&0l z;D9fq1=$iOjbL@E{EmC@6#jF-m2nD}0yPhl2#_M9EQIP8{RA!e%^%+I!B%xJ)}`#2=;LR7wNrWAU*}oGq|jDnwgzZ80X@+x41R0 zgCfYqhl}ZL7LsLhYaKP)DgYZ$Csoxc++0rX8Jl(((Gnhc4A@E!TxF zd6B;Jq06;rEYS0Q<(GBK$1hiO@Oo`rQP+LfU8`XI3T;1fyXNnGSXIu3-qq5kRhv{@ zxj|VoQ?z-74nO{Qg;OhZ$*;dz%{2|pjg9Hp*SuP-TBK~W^!Bh9e=OG5o zVDf+Z$=Xws+gn~6qO92C01tJPZx|-_fdXX;)i4u(FH?xqJXR(G zjx4J>kM3!hsltjsp6Wpw;&jhfNFDMy=8WwF#5wCeaL2%Pvf{jJCT1c&Ozf+7h?8PV zL7FK?kq?R^xmdwxCZ$q|G~a0}&OEJ{TH%gei*sLdv#~JM_JEutUGNgcoSzI47Zv*~$g&$vy<6TbnG$he1_-uN?0O zgXaWr5{C}@5Im^zapUL~w!-k-=<0>jFWul-pM#7UML&?hmt z#RD)xR+a(>AiG93-2L!Xu0*)Tb=Sme!d6L!oU|i zz~t927<|h|A4_~t;2H0LpR)hK4}Rb#I=E*5cJ$Fl@5P6l2H_z8_)30%U<>}op;`Odk2%G^$Wdn@4dHoj0WTly`0oPTOQ!k9tgl<;7uA%Z)qDm zV+$WR7~s=i0So@gkAEPnB02t!I!Iqh9kYH6xZor&aP4RKd#~iB{c$BP{6f>6ci!pb zP2Y>BduZt8r3{OAtrRp5cpFmSi$kZp<(lJumT?yomP3kUH%P{ zjgOgk_L!qI*MVauDLS!Y#Tr`O5noxZ`=<8@(M#QwdS>c-5UMyy6>u)x25fe=-%tUuU%PN$DVzzk8#m8snONV3*o)sufA7S*#20iR5Rw zB3AwLRBaA}%Q1y7OtBqpcvMf>b6=!mT@ZIY(PJu4+?mM6vqoFuyD`u*oR@L3N-lj&irl0KGq1D%3C%;nDTq{;s z4c%6PJjG3)a|PfQzfIk-mWzP}KZ0$SDDIxRf9Z!%h6u!W?AWn)aQI|VO?&5KLw`Wu z!v~2~83tu2QVdRM>pZtUqfD#yUF9^3^UMMRJqEETf(#aLgo*P>o0PyQCJGG`rySjd zg3Q35`$G;n#DU=hPk!iG2(RJnz1jzsblzvc2`uP>x6@BQ-N^zu5c=`k3v*xhh7)|? zf__#;kO8M(Km)V+;G|BJWwtNa3q5CWVUxVTW{`veLD`}_Fc60x!g7CWC^IG+P19gRo6(*19Z$J0B&*@+Onh#1Lb7(g!)QaxjtGQ zwR%!6590jDLqI0H4{YE*)xwjaj3X2T%1jX-%(8Hw3Id|Q==A6)m@TA0|NPJYd|-oI zZknwD?+b3=R%JPwtEg;lkckO#SH5Xhm}XHKIVX9~EN5O$>(igTLN{J{m2%%xGsv|j zjTE=qYS(<#+L7=D7&Xv|eJ=$q%V_sDjc$&tsSSM8ydTJ@vR1#`B?I`(rpxT~}W~KF2~q`Vs4xxGsUH1Hcfa#ZWno20NN3nJ8+V55 z1wW6ikaue-ia1oT)q%l^Gjrcp4Sw>U)7EWJLYyB1zEOwrN2833w#vuCJ|gr(d_-A! z!sM2|0eX23t@fcQ!&oS8@EHKH8UhSfL2Olt$w>XyBv=KB%OT54Si`3*mc*bX&=VHu_0^3xz>+l5TVW7g>X!evdeTegizzZSo8g2H^!J@R6sr zMxXY&IG~&Q!S@4)u(U<`0lq2pQ7FRTrGKEG!lDE-_J94?e|1L=@mpK_$1rC%b>Z`9%Z^Urtf zgYg01S0-keI2=Y9r`{tcD}U%FPPthc^@w=64O(3!-JWr!{D4WY>!{^0Ec^qmz?68~ z001BWNkl7JcB`Jl}@b@O)ZY0gO-R%qhk zrXG3ZVbu@bsPz8bnwy^1`Yjt3-*dNS_B^5uM;k+L#>PYG5kLuCsX-#cj zud!CHxpq^}*s@vmXj&2*wgKl^IRQTqKljJJ5140@>5m1%J^KR=~lTbaYfB)Qz6QD5-Ic9nO`XU zOczLWT!GSXUOqBQ19?$f@-YFdD)2FV&kFDLc}Gc56@K3y-T71f=*}HF=D1^Z>>(R) zji)Ajvto}Tui~gXQ?!{_AUGx5uKq8cGH(43oiqbMK4PN|z3tiXS)1o$%7=#!5_B>6 zBQS7fz+~^+)!tv|YJC^|2|ttsRzkl0?Qc7{^v4WJ7!b1R1TF@|tWrS(@1w9X2xS1p zGghM*$N{fBP$|)pgnYpZuh2uVZ{4u`LM!jS z^rbJ=KmYST3zKwAm>J-rAflv$?}{s~(6_$zExq6cFL0))yn`YI9jpKji?<)2mWJ#I zOfaF){N3OEox=r0_6@J$b2~hN)zya&&nM2mx;9H2-dc&EpTu6;Fms&I!oPM z&Hz690hjv1Ae%7}vSqcHdc?{&_=n|}`a{{n4}8$i(GSrcsYl=jCT+#)2zcm|Xv3_Q z({|`bki99$&}j9bpFH}tQQ((hP%oHFVfCMtMd~uo307zN!GY#Mpc7Ws2kK1tVythdgnXe>FN&?E<7{3z)cwd z4|#BfZmWkpUkrWZVZw~bI##OTdDH>AsMPn$q?SSzs2iZW$FgR=YRM?dQL`=wv{C1=^k5z>rf7}LD^)vtDz4NRucj$Ze= z*SSec@_g-UUvqFqZJDqX885?Eh>qv+isIu5dE)bgg7V}(%5QngTUmiNR$DD$9-_D!X){TxXp53aweu)|GePrBjc8jwZGz`sUSF>$J1ZkY-QQjko+zCq3sJ)l*M5-Fl0T zI{P%$+nMg2epu^{JXDR;)2`;M#x}24H0!&)(n%#yCG|Atr%Gy}re;#Na@?#33frmL zK`wu+u3)C)%-C^eR>@e?<-Bst!#U23N_PiWlwL#SCF!*%wBCA zpykfQnpJrYA;+*f$N3U7X<4cYCf|W{`4yLI+q!jn?Q37Huo@N4%NUgTo)Wimg~NzY zS)4jkZ{&{hS=8~O;4oRovpc`JNQ#5P>pN$oqnff`oE39BD}Bc4QJHFZm1pI+3p2=3 z-iu@ASUIO$!O#wixO2{@Sbi4C%LC;>)2(`Yc}2O`bSCQo&y+Zvz|FlxnOAWu>z?Kn zs473N$kUwLv(CPCcUrr1?#5AYxR$FbOnqJRtuN^lSA0pQpK!8Xbn&xQ@vDkE&>Jgr zGm-^es3*{hG7i0NHN3kb?o8FY(jw1OKF|nVTPqaQ+it(jnbj_xZkT>T%U(1%_p$Fb zcKRAV{Pah}`Pm?e!6*Hb4Gb2G!1^}w1B;I~3N{K6$^-o{_pCZGQOW=X9DEqT$(}w2 z;!Ilbfh3)k1Kt~!7HEK9n(l zvwF8Lc#C~bou%Bs$G%isaa-*B3+1zRPgz=fAV2r;#Z~~!)7geV+H!_+*;u=w9`U2? zAZvcMf;$XutDE#Kv;}yBSH@Z>LbORHl7P>1$`<*u@`?E{fp>Y%GZbg~FXRBNW!m>e zS2;iL(a*7UhjL}x3MS*kp#wAK4I6-s99a#<44nxT%8Y*Bc;KEkLm$ES zi}1=$zoRCUeem+GXm&(`WyYxK2`enjV9{Ctg%Pw2BB{;-~V z@x|J-d5doP&h=WcW~G{w6Z&bK>YT=e((Q-nxR<|7)0VP4hQr=2X-BIR+SQ;$1JO-ek^wMGXitwq|?N#w7d(lo_iXMcL6*vsUnQWoJ& zUGf{Da=$Pu528Tg*sTQ5>!H)+oVk2X#~V7und7*aurW{I9H*5e$h1&gDJz_mWqG2M zK_r3>bIl_=SC5JT3yL^zRjM_0T5WmG3@&k=$WiFA9-!=;`ozk0w~mnzQm*s|-E-Pq zjdCm8jtu4O0cU2EGu2US$lCpGxN@c*AQK#)7q!8inNGcOwbdyX7Vi#z;lsfyuFmY- zc~&nft*=N9p@R{+3dSS?`^l+)?saH%2J1A($jLVob&d_~MN7fsKA!koJ#`v0$Cz=x zdR;U*CONVcZ^W5%J?9{@sl7{|4b_WU?nrjZxl7;M_KWnV`d{ixQ3~*!%FjIKm7ZDw zf8}ls{w;TzFVZsn3OGn?73iKB*e&d$Zz$~e*_MFFv6i5}a!wyy9V^nkys(_$Rq)f+ z>>qIGZx|3zZ-))MYke1kTn4TTHW;|FLdnOP4<7?flv7qJP`U}^#Z(@1I|fS(X4vz~ zK6cW%r;nts946QxllS0@+5DY5cRD<*kinaV)hCiYw6Bn~rC21np#P{c|Gt8c8D8_&pr`ZFkyZ>Iv-y-kHP#7Ygcf1fzy0lQ(2FdGRT|1PmgP;{e&Dk@ z!YV3C3@h>YAV6_pRmx~9!&@j$8Ifx(Y^exnS)=lhAXO!OA|LHv18cSos=Q-{G#ef`IO{6{BiRJS)Je56XuTP{jVKTr|h4URzE4)DS%{f)@;9HHbgG`O5KSy8CLlO#dwym{ zwW#7~{oak=($+0oo#K4OWtZt0M;@ueHmuVJ|KZ&_{p@pe;!)4gXFl)&oqECfI`-hh z^o@^vNM}6nBAtHxiMsc?Z|k5{E41mz!?dn3sR=*QifTjWoN6AXR#-W_$XO@v zt+icEv#VO}O-7+Mb*93aYgd^FSy9f#E-UA#tgEoP<TXqUGPPf=VOAh-JRHB6&$6lH=w_wmleuuF_AzX%Zi){@JAv_7s1TG zi;SN0gigAvVNQ8w;A&8ic=6O-+!IXb2{bAumP}Oyeqqw?8W@%b9tY3CPo~%@h{%jQ zfnxU@=v@xFOWoZmw#P^?#J_-7lQ|taA@?|1&K%GcZJKnGc0U$*R_xa=%FlTgaPSJ* zy5h}?i4f|Pt71%j!xUhk;$^Q`Bkd_OJtP-k~oeaAh!rLWY8k z5`mJ2Ln#Z@Se!a6*gWD94B4iM-a{QBbL; z(2lt#$_oQttR0Z0;Tjgc^)9l~iFZT21Sc!%4szZ6*Z z4&_BzSfEZYF;@bI$rWUY^ZJbEXHH<=`>AyU*3`kv7^FHq!dI z_6M`F>_-(PXJ*?{7MpY_X zwCTuWHMwP*{Pi2O{k(HEe(aITHg3|z?|i#61)rUq(k1WvOGS;kno&bXKl3O>QANAt zX~VI{sHH$NS+1PD)bbVMEqL`R&9F~Uq1stqc-8hog;C*k8|FSs}@B8KK^gFXgxQxf>%GLJBnIGMuw*D*WI>&uK?!g zJg;!#=O%nuDfe@?-GT`oK#|TCj9Sqhx=BVGnAk^_L8zsbi7J;{Ih{DqY@o$p2<02| zEdqmEK6<7I(=W0j#Nd~76ma%UGB9CK!$6rqF)*Qn55EoEd+`pscXg_J-ZU!}cot{i zzzR7ZR0c>~$u}r~f0zLO1n6bJ#wJY0!th#;bQ=f9m4qFk72J(TE>tX}%A}FBb2he8?2pp`2loi1N?sCQimsSdp#eA#S`6g16Xov8&0)B`om|Wdj`ggg^L$KX7=!@%MlK_pTou z%5e7;#|)pgLD_!gD_?PzCN{~wuXmUF9KM){Wm1yU43H(0X_%@HwcK;c2%1smy%3ggcoX7CkyjTchr-I8L`czQehb&u?MzLy1WX@ik_Nr zTVaL0zn*5}X0f`N<-*jsQVG>g6Xi+AnLTHDsx*le1->f2Cyz6hpg&V2S+`qHO9p-Q!? z^PhjQZv4ncRUaSIK`*&PS6^|drdF=hYhL$S-FfHt_2{~FI{cYOsd4zx3fHWWzj2FB ze(5W;V%=K#ha9YPe&x*?pPEv>YK6{x^P5#|)YY!lbn)BXs#elbvr^F+uYa8$P21Yz z2dYm_s$CED2p{5!3AOV?ewr&BYiQnC7a+Aw7nL6qA3Q!U-XhQ5 zcgSonl;Un>lKZ0mx%`%`jH7S7yCm-N4~lnbSTxLG@^_hYv<-@P1z4sZNx0Qkt_5M} zI!;mKC^nvv-hGEWSaV}lZSr)wQ5WUX;sx*m`{Uz9O@?l!4T^~(?#SCkxs34=e8;=% zeY$4kU8GiaT~R*a!gJcClPezfyD+;e?8urGcP5kKz*8rnT@_~Syu|b3-NG8h-MGFr zSIe16kim0HYn!3eqo^j3(vsA;2Ss$I7wpyfWa^yci`H<4TVSM~b8oki;06pLWCqK$~DFJyA zj7RD%rueML)zG z4|Not>62)aC^5(pg&Uq}BLv=qKJsvdHeiz9WY$X)v+!K&$aYoV=vN7n1_e0Z!6*r#Fz^FZ9DnK1&A|@c5a+gbWOi(ZSW;DdQQ0 zx16UOFU!s1z`zoM?~F|Xl;0U94()jKX3G_maQvu49GOP>(H}7hX-5DW|MZbK4WtdB zsI$!mSp4Wu$X5>iWKn)@amtOnz@ct)e;@)A+jri1r|bXdlQ8|K4v#X>H!vwie@owf z?X}msw#sDT(_vu=Jic}RC9LDorTRRH{Qe3ICf^? z5$7PsZMPqGyjIsE58bb%-O+|MYjx}OH)!`mkLcOwp0BH}__Xfcxl?a^n^)Y5B>b-`mO)|-*xA=zODy<{-7qu##P(1OOM`ho5FL>)avmS3ZhV9 zZA_=1b(U)5W2$dhr?>uJ|3h9Sbmv9C>UZBF&g7m>DmwZ#FIN;qx;JiX+l!v>_Cnt| z{ir5SIZ>S~)4iC_O^j(C(RIxRbIx@}2AB_3s>(ZwCZ<-YoyMA(Z>nC!;SFYLshf1@ zbYfM)Vr7a>qtkA>hTu%^@f_?-+JeFqnZYG^Y?ZTXn(hkMCRMs6O-Wk+UMLjBgQdo) zA}D%P3DypCZ}HX7DJ;BK{)U$0eQGBipi_D>CoHREGOs zG>&Z8k6fspMf<}^9Q)7xEOh6byH)6{$U(WGl$-n!%l^dCs;OVyxc~?2$%vcZ2_uB_ z-H`)(x|wKnZJ2WDFb!6F&78HE?+i9rw_Po6P| zWst;`fgpJp{4z*k)y6)oyu$#60i?n0H!$m$=ETz-RMPH%`|M{w+YQ8w24KS@bXXV! z%bu67gYv=~Gy@<0!0p;YmN{hrUhFw?8U&||s~le_KX~Ae0DcD9IQoK51~R-$-1S}7 z`Idn%G0vVk_HGl5H}Jt90en`D@IOqT{5U=c(|76;174#aPqx6N&H$G>MlcznSpC_b z{h6yPyf>87c#j{jz`>PvYI#i7 z{os>-P_XyQ&#itKKRhEJ{J=l5AdYOH1DyTflwp?RHGgdi}OjHCS<{Y;RVQjA=!yqJji{ont6 z*MC7nxy=ESd!re82FbNdE3m;~xao(1Z89zAUCuc8=o`3FwoIxMjMwGFRfa{o_|rfA zQ`bf*W2;ByJWt2_OJMQZP@nhd&hXpp2C|&D%u!4fI6F=;cj<6mQcI71^BVaFuhfdu zj#4K#6XBSXl#3spnOOnDL_ABCU=D@pi0>(H&S++Ow+=pNs~*1Nr@H^XpSwLlcinQU zcHVuD&N%OU-FCxGy7#Ufy5I%R*Y%(OwC=p+`+D^s{-J(&>Bsfsn{U=z-}Nr-zUeyM zbLXA%Pd-+)=?Ao`wOf83Ys*p3RBi1hWsM0P{oD(6(EP08jq7##um6g6&F;}BulNr= zkZjTE?|7Sb)hD#=4X;xeM!G*sHF3d(3ab_Etr$bo&R^-#N7 zd)#@}jj1uUJ1zHtL$P;`q3H18H)WO=Ws!ZpzBo%d465>*iJ~~sWOZC=CsE42dOuJa z;BYEZCocAHvcetJBF(pB`JpeL4;LLr=r-^dv@q1qi;o$N71_H``i3~=w^Zijuy4%r z#Jdix_Tq3*yLbKL&TP2v+UQ;&kB>NI90dmlgZwz2i+^@ZSCQ^sa(Rnsp;4^AKBZtf zMKg1X;a+7NCwZJ}zW3*LvO8_mO_U)YEKRy~#7(F?A?~>q;3Ch$@j@9d@*sbdP*#r* zbi9iY3S1QavD%@$Y#%uM7f)TX%jf<;t|{SO*MOcu9$NsMr4gGM001BWNklGuxw0~@?t3B591DqeUpn7}1&ax_}t(egmUas-o`!KLm{mdMm_P_MYRdNd4P zWJa3<4-<{Rv3kKhJc83ERcM#?+^)c&ypa*KK`U@b8#X`(0a!*0@S(xV6=l_)^K5?u zd=RY8S~+r$A_*=6^cW5Hj(e~le+(yb2Byi-z7dQk!%sd-GdxV<@g8|BAJ3Ljx4~&}iBo>I>Q8+F=BNUE(N?%JnE^h+C~+Du z@Q4hlOJzCQ^QW)Nj-Mi6`lvAKk9ozw->9s4g{gp4(;d!oIldH7-g)h){&J&ch z{)}g7UEu4%G*-TKo5r$K_kQNHx<|fdCs!(sJq5MMt=`kH2q?>0eL_@qDj<8;-FO=B z;K(G*6ywYe*+f;PS&nmgr%0>fy8$=@ak8?%o4urN-@0?+gQ;-p_PgV~+hbp8+L0eI z>ybO}+#FTK;x3iG@IYS7!r^R=g*n#P+~*=rl~OjfP;rh)fAN7SlC2;z*!7siX@9CeQPUE?SlxzCpA zWBck0OM^mO#3?m?-MG`%%W+rIZsN`>Y4lHayjrPgZhp?SzrYXWv1*J-TEGfsp|nuL z+;$CQ!lT zZAM2KKd{U1anC!vZ!pMjxb5A3*K!`Cq4!T>vb)rlg>HX*-%@h}_e+I|k zmam4}__H>T45;@e3&Umd0|xK%voym4jD-Sp5x4@^%E7L{>!pi(qsMsUebS9aD<|&D zc}XV?`JwFd4sm`)doR7@A%Kfu?;9@T!P=3fyUe9O_P!-?&(GjndhgZp0hheoTYCZb zzVKQec;sCIG8q&MKKO`((`0Dx7#zFrcQv^f9NvM3h4?kumGfBKXtDc#I7u_wpqZcH zVR6IByQJGQdv5oJ&*};3hR@zJ{gcYe{+ z7Vbg!!JXTqoO^0#u^K^5Au8$Iobn&vrk}n0|JB?z*Q>hoL9MGa^g#TO4u0b+_5E9K z*MGeCAGCg^qun>%qR;>AAszQ;f3CT^?$#aGUZ;!Ce~vUgqq%$TQ8?eyrj_e;=4t0h zK~=|`c#1Y`*(z<^pmSgGGM)KLmnf}AI{pP0>G&62tlg=n+Nq~%ZM&m~rzYjCUZY7* zx}PK1IL3uI1Kr6LZZY4PhNkTGEIO{e?1mNRsoi5nG>_zkWAX!LgFD5MR+!NH#o&^5 z+Ep`LTG4FjD0q%C!jWy=yly$LYy0Zw?=#KN^jBV!^4`+8M?w(V~Q5N9= z|Jit%$JCsA0zBY^i`6uai31J_gxmXzR*v;S7&(V`96!dV5mQ{(DLAk5g#x@+Pja1I zkp_G-Azscnr1OLO;yAftbuq&;zFTR;%p4`%<#5vq#p)?iMs{2W$FX4GP3MI_%iT7I zX1i5*d=GrJ@iV}&a#$jGzS8oTpjGrIxRMC zW#DF&y5(UNlxItdcV*$;&DEKo*O)U&OWf%TRX)sypD?o6wC|Iv;HtsPKpnB+vMj2T=CGB)vDz zdj^j<&&wa$@^e0v;IqLm`S_q3F7lRx;UldVuHh`_v9vM_;@|Am;me3T#emd3R#8+&Flw0s7$d@a9c>6YKF<@7R4p4)1# z<>5-*ro0ylW!U9-?>jsLCqL>8`KgHkiHm%J(Ki%Uiyh+~5&B1gks1AWnK2Mj5ujBCVWmal6|4+!N;tufR9iz}KK) zG}*i5e1?Oo@lbwlaeIdB=!aNIC)oRzulLGx!)x(!9%wWE%IOy8IlNMKlrj7w_l4do z<1zY-27}Aho|V%q&g334B@g9mGF<2#dv~GhzTO8HJX*OzcQ0wTwu zPuWtgl(n@bd%v8oH@=uWz3=qi1H<^Tw%nV??ia(0h?jDDIo=Qc zpfu})cupKR#`BC7@Y zrE1qB_e<@z)@|9Y3tsqg-E#AfwB_h$>cW>^qI7CZhn;t()|`HvW>=2u;6pFarWc)~ zSufCv&Btr%u6SJ}t`w#7@L8cEb0Ee3sv%9Lx6@15YVl}HjXV}^_( zUJ&FGy0kqp9yeRgOMbvCB&M`;ZLOM*wQ8=Tm2+)1CMV=|q_o*`E0H#7^4RJ+pl!mW zH~vI?kC$A(=fD_6`o7>APOcUYq;}#amui?t2cgD0v1)Vkn&_lj>8xFRd2y-+Q$3tL zzIU<$eC3+5l(^B%yH8%cfyGI)tt3qpMAbqDGjpoXbmTQTeZ8mx0kM>}1?Nl_VYHGs z1>H+pg+)u?DPeGp*M4Nx>S)hZeTdod#ok>!&YS0G8?fx_-K9Q9 zzVL=zIiuGGM)1Cz`~si)LZI$Yhu{sI?CG>R#&tRHf{y?{Hn2se+=Cx)z~JHDXfyiU zi%a|iE?^=*t~g`k$9{Wo+8$T(fzN(RM7Q@f;}>|u&3PjV91hvw6*E)t^4!eB_X1dA z1U^wTT#*5Re9IMpOMnmH(njHri5BYfsDkkTuIcG%hm$nqJM8}FVQ56Q zz~_p5;oJJdVc-m#7hJSaM6biz>k-7@LFA342-4ZL9RH3 zL)P$&vq2`aM$IezueBSTq~XhjIyTCHjB$8JpTH58ID}(N0k5Ov*Xl0#iSr|j66Yx8 zxER=84!27UyqRRmLQiSjQIy2m@&12S{E?4q-Q7Dhk+sx$bdRcy)tau4X~j!lEFF5V z)N1P8|Ih!e6HYl<&%XG1%F+&-beuVNr534;X_4Ds!JY>OauUavVJ2I6Q19+{Wag89 zd|0|{uoBE#H!G-J3s1L7j2S)393=DWcGDP6IqtbHoK)dyJuMEwns4f=E5G6z`%5o* ziGuOEGj)D!RhCzIvk)P;-5Rb-D)6!TTvq4Y8%1`9&mr&L1IiR@lx*k?Q@JCLP|k^S zWp6&mBZ1FBcX9wyS1Wf4czKcms-!#ax?5kq@=Bd|?s+=;n4{fFARRYHoE2)XanhBK z(dCF-?mw9`=gqU?qfe*GkLoz6gE84GmJ-f}Pw}Sj23y58ic2s3xK^)Pt+UQPTVsa^P8%zF0tga7}Sz^V+25;N&26ev#*JfN$tx=QDqbB;D{-mEaHh?yFyGwp7Fx{9Z& zTq8Hr%i_1EI7u}-vqx87{WWbp^iZ94{`t;9q?=cxh2YbnJ9y?O#JJUx$I64)BGQo; zMs9**!mp^EH`S;}b6@Vrk@>na%ym~7>w!>exer_v>ygVoEOf37Z0}f@f;;y`*5SU zF(@)G?4!hKl4tP8;Dlpy82G~fr~`ve2B6@?13rB?Wp1(_1%3vC*Ijp=>mx6^=pt9X z@M?p@<-+N{N8POw)F+O`prdzies{`%`(x#Ad% zdlbp?pm3@9%I|>-et}Kh;cR5e7H4=kS0o?<^4Vat{QgqozymHYQ5L~V{lPgJ?G|}( zPrl_0$Qbwp2KL~gy_%l^!@Jyd*3W?hyuR zc0D;_5<1^(D#V+nAF30x%86qXcl@^k56_u%nwT7SX4!Ld^BQl|-6}QC-%zd+_PoX& zRceJp0k;>EM%*3N7WcNoT`1$u?^2Sf8ib1cKpjj`@Mb#V@chd-j4YeexhotC9~G8&c%<-?s2kNXPBsu4HLg@F74R36 zLOk4!ntZw1l>}m~wy>P5BNC|WvHf-W_-zpb>l-E&#e<{n< z32d#5qCkMo82ULUPnYa#y`GJsa0UnAj$R3Azg=6nNj1PN3sRA9mJjjPf{wBf5mL^O3p6Q=5#u z%-!#8lhKI11det6=mBGWs=^W)YqD8eUpOwnN8Q>2(S6lPA~^^%g!A5yB%!?K2lKge zgm4!M-QE$y+ofPgqJIv*i`HK{=t0zWha?+CWz3({>^#Ud`xpHD3AwKp3i0P2mAy$Y z0!PIks*+@z2^P=1P9jxdn>9lrbe^0nA)Z#1xd`qWqWeB%yGTxdc87mA1oBlNYZ;rg zyQfr7aC6>_48}r<>`P(yu!Zjx>=o*C#qkk7=-71k2lu~p-gI^s>*ROPtSk5yy6$&J zJcj|~SUoGXAoC9q*)2Jf?4sewPGUGy9kI=kVzIKuqtIU}JK}jXu3iK$-k!K~DQ}ru zjapakZv@BpbFxdYdhf)|ndi7!tv+<=!8Zyt<7qU7TDl;jw0|pDdagrsVdQFlAeP5@_!vU#rgH*$`5t2E4QE5kFAI8Rd?TU)i9#1 zv0j82>Y3fJUK2>UMM^(m6)`$HqM4Q*%oFRvHASU3C)*jTo>6VDFQK*;&9RG88k6hvxMde!fbP=W{n%e#5-V)wzJwsd7d0 z+O&DNfvKISFn}&RuCiRnd}9D|^h-~+Z$8l3tafPFxqqB(OI zY2P$&L1+q`>(zdpe6pSO+Pc&2+)>= zhZgSq&e!_k+WF<<_vbFxB~`R;BgItZmQl%g=HkqVOiv6z$uN*qZ5cs8E6H6m9y8 zg{3lq(_o=G+^d{^3pQmhX2VF4PAz?#Sxyp*usz+O;W`D8986#pq&Joo`v7VlvU?kX zF9?Vhr2u7L@UQ2WgF8!z(R>Tg4T8K~BIw>A}yQ!g1&!Y7FLkp9ZyA3aG%DW7}_0*gb)S?-d$!^w&e0{;i&@ugs9P1${JB zfZa!dP{+7m{4eglxD@J+Ah%@dTUFQVNbla5K+7b&vGGG)dsQ(DwtJy%vwEX>AHG`% zOvzs^sS+5^crO0m32XDDyA3L*G(}GkUL+_doXCdR{|0D}dP1Hm1QJ_!%c^OEok5gP7<+w=@ZB9T#2XlhhgY zVFWX5d$Fw6>-op$f7^rH-maH(fuZ?u6&#n;F4P;!E_^ckOt1&icZ}7?Z8P)@C4D;y zXUX<8Xl?_!@}ZmTY$VA?T2Vhd0>aE5M~tQ?@eWV9{&Y!l9Uh@&`(}FOp^H%cOc|ge zp*C`Ea`t`Dl&N-YXMgHIskn$`=o!dO`7#6v$u?BovzG@?TwFB?9KK1 zelFOy279&Hq~f;M+qrYgLB9Y&0x9t~$3y2WLV0S_H@(m-hf;cgk_!j7!2LUn^ha6? zoS*;Ic=liEM$e6jWy3=)XC3pEWF*s$cM)1fUwomiw3OjQjOYXc7Sl;Q)PwSVVVTR5 zcHR82VH``oJ9Y?)Eac&A^rT+{DA_JA8g8&4ksM;<9+$k%Z*H)|9@ghiH_ikANuJn3 zqcR4B&v-o%Yf-nK2KbaPzvo(S*=N*?3Kq|^*NX6xh$fVKL4!PFgm~g$0FyCh=yPi1 z`i`ac`zp%Fi82K@qsw#czs5XMaOml1x%7`?uMy zC|qq%!7g%r)SI6R@HM+toQ81=Fv<+vxL*uPW!v|vgjTCLUVK$_kt&kLDWHevd$0Vr zlD#LVqLayNnyZ7E+7}{o#9)k9@0r+I_fP%c2j`Mj>k2#A*V-do#?@7BYIrJ`Pc1_- z$e6Y`7RPW3s4m7wD68EqpA$4Ks$>Uvt@L!WijZJARQtt!wf{AWoOnc#9cfuoDwN@u z*LkT{%+KF|K|FnFf2s>HIh1~jry2{E6hMoXyB`-BISca@4nBJ%X{RkqU4lk2;%Z;R zX3pQnJDmsgz1PF$nmLiOoWj$^hu5Jpw=6uTwzn_>V_G9GFeNncx;3)}@8kM|-eF zI^qW3@ozJ(lc{A<{JjVBp-p=T=&?D7suGK7|Mpo}6m4fk;N4U0-F4R!$G$%*VVgNL zL4haLz@D=d5}H+_^JxCDa;vV`Sm*<{+7Z>()d5aUZ3GUmE?_Cr%ouXRN)zYIo#OQQ-6%z_;?jE8*v32C5RZHX-zvf9=0 zQ!2ACDGT`lBCZ=Jw^-NAI#6_KXoaR5P6BheRP)TeOfoWbwF=9!fZcrg?ZO+%3j@{P zz*21&wzCb(VaZ$ZUSS!@jN!O<0*_%RM0 zIQGCAWXm+eYOT)Mk>(2*=4LD1y`;U>lyR#NJthDCp&m7((sBlImOU>^>1Ol=t5qJp zqH@!k*ZCIL#>4x6ajuqzbD9%S5x(~?mCn<3Vw5_3C35c@P|l-&r<9D&SaojL{EA@p zUL32r-YImR4yYSX!)+u#v~x~0LYTZ7sLfk7R(_*Utu_dlX}@nVdo1_Prow+;LVra# z&#NB%8hUtD$|ZeCp#IAg%ayCain;YUNm6XNPu3ZU&2oxBD&Qxt-g{o%Z$i3`(w-FV z+P-Yn&ALHvQ+FLY;YR2nko9l{g=2@U$MJ2ENKO3W-}7SJw?0_)(uwSNJi_bm=3{{D zv^rov<~;5!DgG6^=|=l4T27^%bzy!|9Q>Rx@y2LAbG(^Hl*JzY?QuS+H?;9)t^6bh zDVs!XbVJUBYrZ-5JbI(>FaQ7T|DK7!vJkM4xoaNmrQsGI##(x0@}IRI6o8*Gp%#&h zrW^w!duTmG6CIG0gOFSHD?FoQ&gp@%9te@_&nwMfKBBOPG@`#O(#&m^{>y8Oa`qCMVORf;?!Kjp{j(+?H@pM33WexKP z+TT|^r$g^jX1L^`40V==j#~TqqijF)S3Z>$l_Oi6BnWAoTFJN*SB&Bc{piG^;v)pM zr-@pI7gJK6K_xeN^{DN#f*6!M(+UWcgMvR9*0Ppnlaz+?<(yK{uGv&^Ob`mcT~`&; z$tt{5NOi{0C!~xXDj50Xt$gD^tH5i;%lEA7NC#U5`P_6@ItP?U{xRdvqm|V;@+p;Y z?2VFCNK`{zDy*OW?lOpRp8Cj~aH{4s&$)a)UC{KpR$W+>IgOR`);)_`uSgNIS#bM$ z+-khg7`D0{H+mT4d#28DpJ`pSzrlVT-+HI#c^mwa(VF6sX@0j4YpUT9u3VBm-EIss z|5&ZY*>Vn_^xTPR{KOuXJX<^|Ug}hA4;0?|dh|O@H_IumJJPFqjcilR^QfEsr>6PG zV&SkTMa8>BA^*4`30=*p5mc`6Mm@m^BYm_IGxjPyVMOJGGi`j|E2NyG38On6?+R7( zaSldKYTE*an>L_~^tu5&H??OD#a$EhjU=E<5&DVj|MLQjr%$7;4KfDZMxjIp4yQaR zT-&x^upW6Iv`+cdfQj(t!ozkG;Pp`T3uQE{a6I1Zuq3_7WU;m`*rGXhgw}V1twNvQ z=@a1mq}s$%P+ZXq`X&`%b@)DuWi;X5Vha;^uM~qFfK8F-IM4prPEpZ`-g((!k593k zKO>H5;Tm2k!HoRIfHNOOGNh7IBe$JjT3hAq_tc?mR*Q}DZr}!Q(H8A#=2zNrrX+c& zZ?RB&!~!|I-AEf(b?VFnK`Kqnko2{a@?apEr&ih1-T`XV6DiRlKRL^pJo1M7NFYn$VqBPv<#o=~X%vRj4JIRrb^yQdcFa>KGJfGgagx(3+xr+6@-wB0abpn(yTS zG83j12LYzTf+lY3e>xUs<_)qM@A&?xlxWVJ8X?TY@x4n-n9*LWa+Z{5UCosiHCdgD zn4PR$z2q+v_|_tL^~2sz$bE+8I-HJh-Y!fnHM?z=8ka*Yf~oM=~9t*mwWa09i1%|RjknQOwwF{ z054DysAAWNU@$V+%P??%H#Hb=L2vlakzsiev|BT2{m~V++Y7ARl+c+Zo%Jr#3`kP? z6FHoNOHRbO%L*o@7D<%XdM?$iw9jZBRw)2^m@%k(9aH(79*N>V#g2#UJ`wMbxW1?1 z&Kp6!)X+4GGpSvi_qKi%48p{tba}`>>)r9tt*GVbn1^b%`INQwUaH>jK~OQV>3LS| z{=5@*b6gZBs~$vIQRjT3xNhGMpU8QTAcmi?R{No**kODE9E#f*1#GG|DX8X7yUjcyM-Os=TG z)a*;aHguvz77;^+w}ySo-DmJkfOWF2~-$3yn3cP4&AXU^6obX7{?v?Brc}oa?QOQ_e@} z+t`>D*B=qezR*jEc!)s2q^%53z``g#At?3JISd(Ps-JmSKq_0`4L3i@{d_Gh;gYK2 zEzIDBNc64rI~6K?zlUgAlzOBWl>PBS6O5n+s>$?q=&S^s>x&bo9cL$rE8erDUs<7saGFV7mNVrJ2DW7*og?4GHC<0(CpmLFr1Ms7TdzIT>(Xd4e3?gu4;NXwINmIkC)KwUi>Sl&VQn z!X)C%O`mG^BGliGYK(c|LSi3#b|S=K1)!O@lxy;m*JPgC(+*@wsjpgtIVp-@fHvsu zsi9p1+702Zd*0CszE?`$6>?l_bm#TV{7&JA^`QcuNtcT)xuNsbJTm!aAE{FwToFgN z;G9#S7c{h$^u{PE><~1oWYj$EvC7|}Hb4N^*#+C&5DOE44Xl~zMOoK*J{X;8da<2x z?`UgoSE64Bb^~2d_=7z|6Y3v3TGzX3T`>t4?RD2l1ieXluW)@iVC+Xqc|DhJ_<;`k zNU*8&0lxZJ7eC~!O4V7-0-zUEG%MJhHU<+n2-7!18@oT~kTq~~w<0*cZa&PZn+aFm zP!6UXdpoUTVGws z?i+~?DBLKVRF?_XU++hJ!%kB?VJelX24{=as5K{mevSy<88sQlysb3wEZ7mIIrwYd zZ%PuW)uSW#Ayo!bxHwi&=CV(? z<4#X9M3OJpQl(~i7N7+ALLtOXufg9Ba4eHqu5tlpKu z5NtZIoxoUADcH%DhYJQFL@2INb@x4&S{AUP6cmiE2Th`Sm$jj2DLUll3x|Gwmk~vG zg>c2n5JxNeXyN{OO<05sIs_cLp(+%VoLqWjnzCS_dz$!`Gc;bsU{)S@XLAEWPxAs% zhj#E9iwMSUJSGUk$mG$xY@~<`BBB7>^yz-}$&%*Q3Ad`@TU%mFc`V4l;7{<HBQ*lK@qJ>Bcbr;3XT|}r#5kG#V^dKWilB-T!U_(tN@-5S zjImqpFP8ed-W{Wx8h5g@Z21{3i7rn?m)fEjNF|Y4X|FNHLx(z+Rbf&zI(H#?%}*$v zRJX}+K=H7QaF~8}0%g}Ede$#3vh~*)ku~XN2}QFre=lm*9`uUov&zuuG@uYk-+<=J zWC?50tf6fi>AXAi3D3@+B&KN%oGYeyC7XEiF}UDfjivjo*0uJx5nuL4aw^xUvsY=)&fTD-zFU>Z;W>Itaz!8fZx?|E z_=Q1t(2cOeP)E?|%t}Q5@AZGUi|6TlxuHi1*Zu3m*&vmSiBn?lo(5Ta0l^ukW|xN9 zW^7Xv>&oU|Gep<(9;!Vt^u~^>tai;nvrf-oA9y#`>dlnUHmT> z`mfcyTyrnSI8fQ}>tQ#ydNMKH8XEv#n?Mvf(jah`5bdTxT>6j`bO=Fh%v`uD-nnUp z)mj)06yU;WJ&z&;?Wq&D!)kCdw*91NpRKO@vLEX~ew8P(l3pvSX{dGC;i>;w@60dy%Fh?~;J|9eZ^Z-J?P4(X z%{SbGpbdXhN$Yw*tt*bh?-l>~JE;fO?~AtTb8RcA*@ElQ_v0BqJqyJn5pcW9uP?5xt<8KB$oH?@Pkl?AELINsSja&| z#l#%GQ`W*6*1Wdfbh$t7=UVn+xdwD{=}xSVzS(d7D}T+R);MYVS}PyLcyEzu)N4WV zKJUv0>*XBSnx3`{IdtFS%3>NKkFKJgcH*usl{b}+k)8aNv}2rrFiMdLqQGVsa2}X~ zkX&^W>Y9GcpFH8nZR1z)4HwWbACU>iY3=Bd&xsW3iM zzRs?$BsaR*Ogt!6FM85Qmn2;=MW0m%#_!AI1P&&33WW0iDf>*4 z>rA3O+-v+P!9X#=;fIGMJ^JEwRTHXoCRguodKDqI84cSM2R7^o$=b+Ue00)!Ok7-) zCzsBCUu=Xcw8OFc9N1WB7Td8;kk2 zXG1_Ped{)OL>_w&%AWE>N*VPI8A!n|Wd&P>6kY_s1#;)f#@+Hj z7TS($-UMSaC&jM@YueOk_*@=iU)EHpNNF_p5!a)+8kVXF|KxX>S9^RbHNB|Xzx4HL z=dii98Gt=ky0i1=gK4qr0?*v$YM`bpmw%~{SKUsBc{yVfFdEhebrh!hHYm6jZS}lS~!eg)QC>B1EY#lNAY; ziP&C^7w`xADE&&P*+t!X0udCqFw)Jkw+NP(_9-={76#k_e4^gKJbRf@zlC(fKPMP6 zGk~7hJOGo}hEXIffJ|mV0i3oDP?I@QpA;{g0nU-yaV-5q6v%OD^zI_On91;%>x8S# z@FNHY#e)>HPCVp+!z}j{&2{;F(c7;qWIPL#|QrIXbMUxyIQ*y z1urM3d%Xj7IVtXiT+QMB`Rn*%zbJEVl1 z{wlP2QIxj10+oif)%rErc8{WL_8@p>-k+IO1NHirzoh9f8DCZxJ!va@HQg8_nt|kC}cR>h632A!7kEzn>Od^LzU__PrI5xFx;JC|A z^4URO+e{qEhEy@+^Teo_?q&Z@t!63QCn3I9B7EOtfp4HE(syV(yy6^6R5KmDO2Qj| zx&tUVnE|ACX-bq5!&aLeJ{{X&Vb0Hy!vp0mGrc0byyd!V@uQ-cY@g7&eZX3#^!)VG zdcHXc4;3Tdy|QAKiSNmP*{xWj-9Db%EihHj_G{({eeJ(X9R%nX9TK|(V=f{;%#wnj z$Y_BUyt)TYjPdQ9ivvA*LCIh;h5=O!ft3Uc+5G_pYd7+k{>@0X`Cj^sVgnWRdaV&Sce{178(*9oH#n!aGWr2 zEaNDNP}BNo$^H6|?E!!P_^5v}J9vD0jzntPB69a#im#}w~PpH)CqLh?WiyTW>h^~Jv+=p^YLfDQ}5vn{XPC^k`? zlb1}sM&Agr*@(ZB-as0ou)5_TAf<9kvJekxxcLFOQKKZIXg{-ShQ-;z;D6Ra+>w$w zz!_MQ6$n+mQME*DD_xtyV1glhvO0${kAfFN5v=NDg0j1MRwGo>I0Q)uWQi^#TBWA- z$E+|j*l1W}d`LaWCz3ouZo~PJsT%!nM&Xw^F@q8oI;PQCbAd%^dXph#ZugxnmJaQ4 zw>vHV%avc)V=Irk;~={G?wwx13Llt~H-QdVKYPm!$9Vc|49{5}YTwER8{V6x&9S7_ z^@OXlwj-tFUoRxtoB*e<=e_GSZRQFUnvY{BJxPSZ6j7HUOI4->LGj3F_k12Eo%#5V>QHSOiU{NIB@b$pML?RfWRlw4sYa)2yk#6t0q5t z=FV*I&LPe_Ohe#Pdw=U-04no}V)6fe3lO06aXk@9H)-WuOn{M@5fheL@yVfJmosT z$ayh)L$b;oXh9l3@S|`#OpPGSLJ5NNmv5yhv_?AHAH9FdMKk_JD->yCg3JBPg9mEb zB~?9b0fffujDw9j*?&!GCpBG~8djQ;*X;OR%q)41;1ktVWfI(5^9ljRM#X$YDI*z< zQcOL}Be&7zM79&g@CF0xE1AVJk)T7e)QUWdzhOTC=Mv))@G@0P*&X4irBlSIkebvi z(MxB$Fw?45A(-xh4Mm}Gj@6N(e<=qB9IXL>HD72UnhG3EgM93e#N5i+>lsB?2XkXI zCn@xCy*5yV{{Cc&!SutT%Id(Ozx4dgG7WMUL(`=f;?ns}o`{QnSH8k5P*GEw5n|o< z@X^g!>{q93J6vwwKP=4P?L4;Hujjlj16I}|YI0qpuYU0};q<=S!!@R6wis9`ghNoL z_Mcr0q!;vCU-56>yP&N%4fL6JXWaSdx)pmJ{QSqpqr}cLQ>>QPNYi!|Np6;O2O^q1c%KWFcpN* zyC0QR76By>EJ`G0`PgH)-UOY$t>UbSpAsr%uNOuzffotLMT(8c!SKasekf6`0PtLP zrA8sRXhW7UtqPiHDqZCz6e8g!$mERGQDaULyn+TLWIPT%nos~6q-F)JpnD-dFmRq( zp{8l{Zp1jqG_sL*E+?>HC2@{3M(Gyd09)#kGzK1_p8>8>6$IdWQD{5;CCNX=(5w9q zFaxtN3QuZ|js>Imit~#Tg(Ot0#A+!}w|<9-jp>Y;xwt`mZG0kI-V>LO2eS{!w=+U= zB}9yvj}f$u{yX50@vvo6xPsh1<8uslpzt`D7pJHwv2b*a!{79{sM8GxhyJ`TU`OEo zk7le*+!yG>jYAdp8O^!xHMzTkG5w^+8w=L+B-k={2V&a#tt;HR52EWciTYDl)-+=+ zV$hoq`xu6i<`FYonv8OVj(W!@?s(S$XLR%GGEWKoU%vY+ za~vFm`BD2eFX0#OwXMbJ%>_umPw#VacxP#g!CDLwAhYs0xC2tYE`fk$Rz4KSMt__) z_DV6lUO&B?h6mU1D>-?ZM+^88pmd&jJ2N)=ba0`~7W~vm1(bb8Ya=KI`EK_A24aX8UGj_|{4GFmozvFWyR^R%TG~ zKTFF0hEDqmWcI|9&k8p#NXi{Lky4eC^+~zC?KCi51Yc~Si68E=AY^O-!CLE%cd&89 z<=kxK2ZGTS*wTu~r-nIz%5{3+;pmsP_WBBnW?rilhu_?03FLM(wh4!UcAEha^!Hs{ zeufDlf`KW<%X^n~(7M>A3}=?chBLH4=>ZQM%5p4x;=Oqyl)uf2VMbh``m6=et^V0Z z&OaYN+o3<{L?D*>dj*FmTcaH;8)rwds>s2r_(+w!6Q*W{Xv2cSg}~qK36oiRWEZwR zHFrDl#V4tEK2`wrv)1lFx5Sy|t|h>;v0*@jGaR=oENaJ#iCMEZ-{QT`X@v`0v>RHS zpx+&jqVMTp`gQ$&DARJhS_!1Z0x3%dvra3T}6Y6KO_wyHF_t0_dsuJ`K*^l(OCl;3M>j#7C zG{sQB03b3BlD8GEr{Z-93t$9wSNveSS^tm>N_;r(rgTaN>?aMRE`GaWQ%!tfE4rzi z*t!wv$b-V`Z8y2P#kwZ1vIwTCr(axo1$tcf-*gXWVy)P^JvOtRjM|^~SicaE2yC5p zct0I!V$aBi9UOiAYF@_Q4{X?DEhCj+!GHdriv1OkBs3J~pmmG($=<-5`FG#g+udE= z(ca15mu6Q0^FdtAA@7AYw#MqVNm8k}9}#r=A!|QkKkbc@n9P{UDlXm`rC=OA<>3gB zW+e+su`3u@Y_Qg3Q=73UVYqy^_?txn3=?5jf)Q?mA4|m0hn2Q*!j<7M)1}T=X9>^< ztkch~ut`H2g6Rtvrf~wAp8b}b7=e9-k7_|fjEdudi;3JXXjq5^iK@94-wvjfu85eU zz$YWNEm7D%eL4Gj{QCdA0GM@foTFTBggV{$@NJcDjfU>Eu{*s)#TV$uMl$Csb+Da( z-{iMif2}oH_kKHX0-J3>dis1DEP6`Y!hRQ_$1Vn#A;1}C zbM%avMDsm?t~+AqLI@j?n9JD=@XE(|pJU;Qk|69Tk1fxIPe+3~3?JRGx{44x52br> zK8l6X)jeBmgk^ym>Edaz@x>(?fT=+7B1=<1riO=OsWf9pO=YhPY%)rpkOu4cYUpKf z6FC{jJs;3MCS)HUeDINHYaf9#@Wrvze&rnZc^$gk;ER3T?wvP(Q>if5p&%gvB6_|w zc25yaAxn2FcUQp=hqlKwcOI>iw0mgc#_h5XeQyU(tF2CD4LizPe}8xXM@0Ldq{c5L zHx&MbZl5hp?zr3G_vM@IG|7QN&h>q%jGayJ7h5wB@N|L^nW;e@r(lX|evqmzcOy%_ zqEe^;C`6Uk%1LijFQ-1bNX%Jj1YGAH1=!fk|5C5b*E2;2Omeqpy4-4_P_%i&)?tiM zhAaqAY2DH!Ws4z`Loh33m|C-qC7+^L($S3qjvL}DPGDyoiWpMUukN_VIznM3Jb$i* z>udQFKu|#NOO;2@ObbC-H!PdLy}7g)L|!f;e2>7yye$MZ<-J1Dl&TP}CBZtqSezt~ ztY_@zA`E8%C<=dN)IG7G#6%66RSQ@^;Rf+%DQOwb3Xt|iqu^=72f2tSTg5@q+ilq~ z*g23ga5BS7;GN&_W5AM`h5o4`4cZ%O32#ztiyBHt3yVvE-van?(B}m3kOjdQe7bhf zGEIJZ9KOU_Nch@EF3-#nj?5_x!blUXz@%5u6py;5Z-@D(A}SQt^*Mn0?; zS2FKiWQ0!C13qjBY5wywlhi)^iv z9kw+R!4?UVYy3om6IpCht{`nwN49Gm9K45Yp4l-*I`@G@CuB2|Bkr4Ys%dF=u6ReZ zv1j+*DE?DJZwbjxio1tdc0+pagL>jR9$vAPySw}USCRkL9v}qA&)q)IqEx;1yvxMG6%O85WJ%$IEF*qQ7W-+s?yY32t`P7ANOVA&ah6HbOMd4 zflJnX_2R^ab!|!G_B$*93~yPH@svs?2@Z0IblHfD$PfACV(OZx^tx5z4veS@uU{h7 znJ&xDJMhH8GKeO_Aw}5B-Cl^LF0Mi9m&=bRrqX8ugH3fFW2X1xnGudF13jNUzbCU{ zxMphYws^mnvxtg4LvLp|r8m?3O&)YPYxOu%v)l;DR(R1Bk#@Wy9!7vEXT4Ig;OkFw z^HXV(QX@z>1@Wa>a2sVXHf2sq%?&Uim{Eo5%+pO#VK455jvrhBNXP%C^+l9X<&dWp z38+o1WL=Z{p}Sz*JtJN9Fh!iFz*l+lEf{3br%&&A`TN1w)x$D=zh>-4Eh}_HZ9=II zMf*%r*KS3qW7Dof!j1W3h7=Niok!6dSZa}{=Cx`@EOJDrkRwYO%tmG>*ggi2Br$UU z`E)^jjr~5GSBPhfzxL&7N2;a)dGD9vk!KH_qN1YL=YOXRX9`6U9pkDe_L@8{PFk*C z%C!Wv!{?5VDZZ~z95{I`Z>0b4D)k2lE{lzg83iOr4IW__I0eYAwvl15AzV(e@4VD z`mlg{fKourTMM2$?`SL-&#eLhw|}BmpoJ!TtsDLKGYf0JkGtU+u1?IH9G#Y@_O0Ia z6(^wCDzoyhCBw%PV$_lH)M`yQ!!mp4b(d&pPFff>!XN-4@fOSKEJ zDEobmm*hVuK&14F5!H>Pa~Kkf#F&!&Lm5=0O`@YxBO|yQt%9>fZ+EwZhmyNuKZGfAwsL~}4;jOEiywTM zuD2fhZVmQ?Ze6k%i4*T>Y#Ce8(u5|9r{uZrpidia1gd{@V_eP_BNn)u4exMr{n}{1 zkDE@AT)$5b?r$hk*_si?l+yp1J+E_1>RSlObtCIVmW<^F#w1f?nQ_F9p(xr(k?$Shp%xCYIQz&nag1u? z^Lf3YYf1xBFLdZHkfLa+=i@&1ksB5?Yn^8d-;X~D@{6kRtWxO)yS-mzrB8AK{?f4% zY_)tar8nCDpzF9-wC;ZLT^>s_coebYxA@{!E|nJ1vf^6Ib|ZRyJu2ch!J+e7TbpKb z!>B6XP=D%uDwv-M-Lb^R{M2jib(LZ_PpvcFp}jo^GYGc0Ta=*s+bIxST%uIM5`-{D z14H?srHyMIOV|)lYfLC^7;FK!-1m-vv%pOAHPtuGH2E9`ETITZIctql)ezUIa3K3Z zusrnPp6?p}>3Ae{;qbv!$9#j~;D%|C=hP&I*K9!7c(Un{_LqcnkNqi@@4}Nmlp{R~ zQeLinu!29dGDjurND%Py2i=Gj0LAi$Eq@q@yCyshH$ckcpu^lr=G4{efS2LVkK4~m zJJK7&{h_0(w)rRI%WMh|Ru3kY(umS#qr5mb3|g)f|5S<|NrMuis^w#a$t=I50R49H4dVTl9s|N zrog6kO4L$^VL1TX%0{y1_r4eGlbLB?xHnkqK!EPxghR;h7oH7Iq4|X~I3Yd`r*liH zL=j^2H4$|2&(d)B+Ag5?mI%Mr+Vmi~e0^6_uq-#YY_}Us9rg{C^!hca-hl;$ z2uHYR_?$yaQOybFDF#)DJy-YW=KE{hAm?7XKg91@L7fz{sG3&&1Bw8nx0c5@lJq<3 zce|Ayn&E1c8fggmwBbEflD{?hA0zT2UU~^*M{uBeo3y=oDLfcwI@yG?_QOw#cT*hb zdhgvLfxv-kLUEaS13@+!c4>=L;ay~YVrnw$q2eeOE`dU^`Y7YHoipwbK(eZxW=-pU zv9g?V3K-`Zk{Fhv3iNZZIyVd*`q>??5HZ0GZlaa!PvfU;-`uee(ZZlzOYK`M+eaJ= z%wI%IKPtu~d|v^<34q#YECGht^G0mlQ zYk)88t(|$_p z+EP&0NakpRU#aSK5*gw{G@RmIyeNGBL&_Ft3Q$Hy6LHQ_ehHD zsYu-|DC%Yb{XS!=J&t$-DL8bmF=smsstK-cJ410kXl+JBH0>>q{oP=Z=`7Bucbgpu z&T)Lk8NVB7Q5jzpw|jHApt>O8JY=vgYz$lF3ej{W>zbi$OVC|PJtg5iF5>~5hE#vi zRLjwUBM#a5<4xee4)$P``hpiAjsgI~mLwcmKq&tAyji)yh-F5IfRz7Jo^W zp(fj{#;qpNmbXLbPsmzB8SPP_q?$b(Lt6Af$1pgYa_EJdQ=?9aIvO*2cKWe-SaNel zLz!DS#R)tbr=6yF+r-`TVIPgZjEmKV10@>`hjX`dls7H0NKlgdv<}OM;1Wp02ET&~ z`k84II@yx2LQ6?Z@LhH@+bhhT4F49>uJlW|nRwM-oX_aaRgP?7jlJKjk*t)eWN%SF z-DHhRP)d0C;uFNKm8~TX58SmryG2a-a(aSf+g??>=l=J@pZgJjO14KOs9uL6QY(H) zfmQOOK^Kbml->qYZMO;H?jNB6IdWA`5c)HPf`)hB?1-l_71Jzp5WxKzNi+-+*lx$_ z+SvjD*8ZqJak}9Ci23V!7BW)g%^s~KKEA~jzb3++uF{38A33xtS05)^>L+DF=QpCudTJMj| z5|>wNd{5Z8*$Y8~&7GJ~*^H%~dsJAV5g!&m%~o;hKCj@xidn+s;3xLy=5Bw(_Ri5l z8L+;@54WU^(OzffQlzI%pa{|jTbv4_kQ{Qc$}kVAs4A&Sdcw>5M-{rX#ij?k+;dN} zfIm1K1lpKGcS4ThbRrur$5Kb0{n%)g(NSJe%EAAMb|EeUby0lQcn5{xIASn>bB#2lgQo3z7t~Lk znYOuhEKG!0)^HN`*+@k2_3u>d!{}!;C2U6GFsfkQDU}>I1V|ElN(8v>}gemWmBb`Lk#o*gd55^L&k&{|bDB2ZE#=VHvQygQ1UkI!S)#ltAJ zLe}*Neg7%T*;aw(Kdx#DB=$}ub^%6NJ=4SPMFF|{X-57UB~iE{AY@0&uN%y+K)v^E z-|>!H?}m>VF^~ySn`@BQOd<1?8{$xc4gx9F+yFd!+y0?2f?o8iF7#i1@6h-!k8U?w zeve1bD{)^Ce4m$Y*HC^BYV6m~kniUO1O_%=hHzca#H_rJ6g3`W2hfF(L&H!Bs@C(9 z+^9ZIM?}ZR1NFabd+M`n1&gX7DmU+JY05O~t&AogmPXQF^DheD`kZE9z}~*EX%3_6Fc47e&?}KvA`k35&mv0#1`>Zrf3^g_{&&CX385#W<&zYU0gK)Xb`*!j!)uG z+@5~WDy54Tj$rslQL1I{Y9Sfors9{GXlyJcIcCz7GRRTIOI80Tsndw<@tI0wNup>H(Vb_Wp2efvMhmSCJ-+% zf+_0m{=@rVa~pf*o%&6^Ch(2d2G+vSR`j~FZyGuX0mG0F&BwVWRen# zJZe9l{E8JQ3*o(#(s8Lg9~U2X1k%iIp@JK_J^vEPmW1Lk}j4q(J_)pgDA+Vc(L4f7$IF6qd!H zaCr6?%l4ZcMiPLow8JZE9$MR<*zu%}xD%Y}EtP=WAL(r0N6LVbo?XT2k#>QfHI(YQ*k zx)6>qg%-vvgW&m$NQT)V;LLn<+-w9n{}$&W4u;0Vo0sp-9rdS*>c?fusP!*D4p$sv zAgvQYns@d3|HIZ>u+_B&O`^Djjk^SQcXxLuxVt+6f(LhZcL*BXogLiWb)&)EhBNp1 z?wxby{)W}-?e40ss*8pkrVd`8`yI8|O{oj0M8&z^LzsDte`3w$bokpJ=c1?VBjHuY z6}8nhe5ID$9~r~sY7esqEPI+|F=l_I(oUl#{uLKTlxv23r{5@cDJ0!)%+DI{ARP0m zy{ADVDWJ_Jr%HZm8jKO311foE1k;$cb$bN}d9z=VDwFC<|p;q0_iC= z!v?EarHut9x2D(|m2~H<`-G!Qb3#E|6-mGyPeJR<5EB#csX_ zm(PDBBv|SCd*`)djeDEqoevZ%^f*PxVmtpfb(>pL(oY1zqsJOYA+;+;eRa;Vdfk~# zn98^idVacjtJ*$t@%uaTvd~89)rLVeWAvp-A$`1IuV*)MVUS$sj7+8cI-HH3RKW

ZE^dQ-r6a>GB$}WV^Y|vJlXR$ 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 z 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/Developerguide/figures/zh-cn_image_0243595915.png b/content/zh/docs/Developerguide/figures/zh-cn_image_0243595915.png new file mode 100644 index 0000000000000000000000000000000000000000..0c3fc11564668cf33c0cea668a2e5314338aaf20 GIT binary patch literal 48636 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

Av;cv#c@Rr4`)i=4Z``xp2Fda=wR;6Xn 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 AIsgCw literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.png" "b/content/zh/docs/Developerguide/figures/\346\225\260\346\215\256\345\272\223\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..b7d2ae3a30c0369406f54dcaeaafd3bffc838552 GIT binary patch literal 29796 zcmb5WbyU>v);B!V07J`2Hz=c`fFK=1V=;q>bW2H>QUgPyq(4wlY5wea=*8BdaGgs_u_h;`tyhW<1P(YXy>FmDI)2+)7`n zLTTCQ=1=~O=~~~svH)VLp~}}M%fD3E?G7!AuLg60Zkv9V$sXUHf1xhC zuP$@hV31|&)mX9gwf*HYFUh&#-iMa8)>?TRcWd`9Tt`b!hhP0%eseg0JFUxQacz7! z8Kt&@n!T8G?e7jcJnE6$;wufyNb&JZ3JEOemPU>dfP;SLJISYba`^80%=i(PiJ#n& zEwM}xt6C0Z4QfDj?M2 zM%KK;x9q;08Y0r#Pm7Q$0<$&5{rhxmCQ8%)@|R7)`0Pv?f%i%$Vr-VfcWE_2G%2%r zQiytuoMz8Zk9FC-F(}SHGQ&u6uIny_hLeCKs-SPyw&hP_h}XQ%L~P9=S}t|#P3FQu zyT^7cSH?A^%h-Mq5mxmNGe#brNqWiIj_!LB50^xRN5CJ8{f>0W|8>B_3^vwb-kRAj zPurp#>(``@iEFv6M`;eLJOku=9r~)e!w~0A>Qj=_Zq46>LJ_CVY*Js_vJ`*SV(S~} zyb+V*;Gq%lMSmm0PTnVw%y6q+Rxu@2C+x@N!Pf*TdMBDp%R7tMvGZOBYAS-m6hzyD|sO#3D(4DF<<0ul6(wP93^LFgjs~i(`eq2Uy&h^$bIt z{laQwhQfqyUXC0>R7mAu>!sm2D=h@T_*@nUQ?qBCq9PP7nummzEHAX4tMMx4edJ=u- z1?<&_WD@a4$4v> z>k@?aJqa9A-hNv?tOO;Q9Wjz#){sZT3n1=K>#_~d=v(*lu5WjtS&^G)Z`*`I3i4sF zFl}lnjW<`m8x3FKKn}S@bZZTpDO3oeD_bWo-%SmVIf>N@0>MWn4m}>3lP!vo7;Zrrai+9Js4}XY8;4y|M zs48xkpDfandfepHa2#w)U@#6c$}f5mFCZyatt+0OqHjoQp9#AB zMB+n_xhL_nxqkW~S^=WiX%=>`x-sBB+%9%IG_lT*bm2`k8@Bxpf1MB+-|wS$kkky@ zOnzC+5;1CDUCtX7+0IZbXZA50zeS9hwFkhsg~S$Z$KAw35{1a`h|3ocNG`(yu|T|F zsBxVQA-~A}jGpUuMWS6Ruz?|sVmpB<*UdPUCuMc7uWQ&d$B<)G90q^noz})g@FIMd zfT4?lfn2IEM67VqVm!~TPNeT6#Wrqb)$1j)nkYlBNmnPHl(RR-1+>VSb22h&9ZS%y zowsSj4DODl56blm>^gCji89ZS)!cEYaH$mARpOr#OnPhS)4&z*j5~ z+MY4^QNOlU^z>gG7uxP>DlSjqzpV{zw>c}LQxt(f&eTLSxV^!qV%sw-p4&&>W#WKZ z7>A40rKuXu6?6O}`(k9@wC$^$-7^Vx^z~cX^jlOCmE=Tdcl8u}0f{I^u`dWW5<%JX<^Jxb-eMgA zg^~9;m62T?CqT|jEikcNJE_0+`0XR4F)MzG!Fr`>l#$@k^#IHFSNa05A;NY>)_b?k z^%}aiK_6QHg&zGREAVRc=$B2ge#8R4aUydpGx}G%>ZAacwI_%Efc3$>k*W*;{qA=88V_1^S37wr||32zfP8xTm&08iUY+u+3Yk)q1(Fxj;? zj?(^<&ImrFK>9SX1c;*v92Ag$F%ZzrREljT{}j1UU)xu-&?9cOGgPon$sbqREP%g% zc{el+p4xj$u!69!^l*7$LJO7IQ5i;Do)tS>oJ@I7>rLxjanG1J-kd;`)mymw&%|C? zK*PB2>F@n^S>HAx2zTPE&*s8vKg^1*6Kj6zHIv)8o{0Mi2d|o8S?w9m%Z9gS)aOo zwPcJ{Q4Ge_+bZzf`!}&7}XBit8D5o9`7J zz$XePLe6M5ZGE7~7|gZNA16W}~Xhsl)TKD+!$!;aQNmM_Zob)fTq(3a;4% zR~}|LA^YCSx?IxsH`7FS+PvQUEMh;jAKW3a9`*j%@W}8=vN&2e>a^Z@&$>^9y?!!$ zjqdKVTrVR%f}jzQPx;#wN~W&iYt#|+aLUf@+4KFHt)wgUT#lodcf_&e=|qMaoKqyW z;08LFzIOe~$`b+&E+6S%`~hKyou@UTSNe`g5vd~(rJDLIPR-JF`pRVJe1ipQ8W3+i z6Q#D}>HmNNNR8I2sej8Z4v^rfNbdQ_CM9l#ZH3tx`!LU3$FKFM^CVy^_t>^r#8``k z9$I|GP%}4t4nFi*Jy?kn-&x8#_VjO#?yS;!i}mvL32;rR=>5yWS9WOr>wU_G<9jED zwTY_UT8H06G1UAF_h;8g&!5HCo0JAKZABcS_^+13y+on|@PvrF%J#;5G}#IFuR)!; zyXsBue|j=33c3br&X(YJ$cP$emfF-i#Knq2dl7Wm4kUS6cxDaG_U;q}_K>B*hwdu7 zJXzX(<*x;O(puQ!_vQg#_Y`f|6ijO$;ax52B53>w1%7 zNw%tgs2d=!P7I>z5?D^6PKn!I^-t(rClK{o7A;+_WVKYWy0U?f#dsy0!&KEWa9MZk z(`2``rC)yXzbIY`@`%!_&RE!dR+WV`54;C82vK)Zl%!p}Njx0@Ub!4bVHM1Qk5`LL zSK2pAd@llfepW|=1i=N|c+eoWmjY)HIw9Js5T@U!-)hKJe>BeGOfI(rto4z# z1730GXUthReA5D74AdO4F+k}EgTBk<>5x3t!=uri;Ci+YqZY0arhlfS zT;%i-TQoOmgmVfab#X*ep*yd%sqBvQEWjo11{W_1qFQAn3)@BnVZ!7PO;Ne68pZMx zTVtF*uw~6T&0l4aQ?Gra74pHme@%%Oxb}2uL5T7hLlZpFFo?*6srD_XSS>wnYz- zF4sS_so#Dh^<0U1J8if51f}lv0Jcv8U7b*TTDmeAY;l9($!Gh13DQ{xecR8k&5WO^ zB)NzqegynF-?(6_q~L&kCYq_PJ)SiS)n}tUE6j{>!}qy9Uh8CxWMF^|IPvK6 z)}sgEgYsqm zq|Y%eVa8jLib#9AaZF(_MxdAD9RlztcTUV!g=O|Yi3`P?^XO@V=4ioi+bq|-VMh`6-Y@dR9uLdBN@bDUED0X3Vtzo zYpg}V7 zq9VOFQ?(e382@4GRH;9ts`ua%7NjGGfP;qQOc)g+wp5(*k6mw3KFj&K@SJpRAS=-( zQ9i<>H2$`P-oYF`Qv7w0&#bO2u|Cgy<+PKDVM)wUzRVc(^t)ux&S28+>e^RrOYew` zJ$|8J{nzKVrE6ZVkN`Mif_`S97I$qUZ7pT|WztH7abAan!4>^6Qf>|9Gk21ITFKVX zzZf5W!1t3^>HL{n%DYWJnFmAX&$M~wZyUW%$=-YzQ?^#gcaT$p7vL{vB8=%9geRy} zbtXR#BP?27(ey97XEMr%P_KR7eFmK*yLA7g^y7|E;k_k67z332e-aZ|DX>2xeL!p| zC>X`+!zw)dM{IPrQa_Q7}MlS-!TI;2R~@O}^R00T^Qg+d7N@7qZQlC(Ftt zelGINj{H!;_arsT=%i`%xaMG~=EQK|C;iz_OSWGlZl!zkE#{SuC?76^!z|R)1aUy2 z-wy*%kII={=?Jk$fh!S9M#7C=0#1Hj=v}-hV)V6=)!PQfJz8})s2La@hL!Odt z^{onBeR`csumo@8K!pDlIB4;7;I%}q%-`i;qF&hZ5wx6%cA5o=^@R^3un!yrd0*IX zJ+(rfhX79Z`>)ggy}TaNSF%l+Cj$th9)sk(hGOfxJik15IyripvJuhdyQOkzWT31_+Nb?_EVI;gF>eZH75C2`%p z>2xFRVsp`nnSjNzNnFf<8QZJDJN#Jkgz)ZOiSG-;0C^OW;naQP+%G4?%x|aefOz

VlkW>)T{)NnMP2Z#{yQN!|7iGPpn&;r4 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 literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Developerguide/figures/\346\226\207\346\241\243.png" "b/content/zh/docs/Developerguide/figures/\346\226\207\346\241\243.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e36e524b43f5e2af65a54395c97b6a24aedf566 GIT binary patch literal 24624 zcmd432UJs8!|#n_L8U23lcpk|QX-)AfQo`jwb2Pe=tUsZkN`G7q(nfP1Q1a{>Ae_; z(n60&uc0RN00EK^$`@=i&%E=@UF&}LE39QXOG!BA?6dc8|4Tykbv0QIA3w~%z`%0j z`qkSE4EuxVf3H7yfc`sEcQQNuk3Al@HLoz_w)4->5BAwz*162UP=H|CwA@cWKIC@Y z*n@$AwRZQ{9*k?IH3Nf1{f(=a@A`rklEd656qqlSNpVm5nd!W$uv*`D^W_(|>tEkg z8LW?fUe=Jf z@km%-&28T-A&XM6L!}XP<#G=|(V~+A4AqHwv$y6A_x!R z9oS}7XvEmY8$7K;0haJG3}>LWWUMjE$SkD-kTO>zw!wT8O*Yo9f5N|*=6FGNx-#J`6hz$GQ3mx7emv2=8w+E|X$;J@XCbbgdR|739>oI)sF|N_9_5HPK&#?}( zjFD~))qbD=9O`v|3QCQ*a%IiMPPOX*RILU&7lL}S9|nFHxF2}c1kw0@%<7Hb-^b7HFFd(*kdPy^!pb!tv1gle^~^)*VAdcTF#EPVX`vEF#2$*@ zBr$AMZt39P@~f7plA8~OxhUC|iOiM{uS=7KE~@sMUz|MnDI0^s=tOkN49O|GZObx+ zO3Ew>3Cvzoj;1u1)Me?a8|KNWR4lFNjn9v*neEdxP_xsJ*ra~Tz4R6BkwOjea?`Nf$~y<OY|Xtv z#41hi1QDQx^bx8m>8MR28{`ezX!p@r)JJ-q&J%SN_0U$~ou~$^U3LZd1$pgwD@~(? zY!}#D*oh*Ru5Sd_k~1X7os_DN5XOC77*I^E*wywhkPxj>FgCo1;Lr*1+1W!0*bJ$; zO}P=3$5B?ASt@U&rPX0o^HxF(tQVLQV1O-5?LcfW;}M zgp8ei6^UwD+p8&Px#Q&<8X3JVGBvUrb2d-g!!Ts&M%vL0$hqa%&2u;~yx0{AZ=|ia zHK1ERVaOO45_m8pSI9=%XO$&z$rrxL%Ud?2lc!)s9qceD8DPge@CiJ%xwPNx6B!2DiLC3WV3cJ?S73fb1NJiD=Z;sfxI z%{cYA&K+HwKe$eVi&@u7G$TimOBneZul&p&)6bHGU<;ZP?OrskoUBflLsl%2niOCP zabaSqt4?ukc9zS%(|jfIiO8*hcX2Kz(s5YP)$V;-saP_VesaZ-^|Ns5Y|m^%SuY|S z>KeH2cABV3iX}f1>*hYM9xvLY_2euq^}&cpX$8<2#lgEFyH?UkmX=WtHcF|2jBvvt z1B%5HMZ;pmL3z2n9hOfbjP0WuONu|KQ~L_8unna{3mWKFnr*uHPdZ$my%ya-rXJLt1E)5?`3+8 zGGU?2$zc}&f;h|xVvQEmVyQWF!jWks!X8J&%YQWK==MriiB?|eO zDx48Sam-4h%pI=J@E&T{Vxsth$$Hz=OXAF}QdcQ7{}$sYGqb?qvVi2BP;Dt#tJ2wS z!k7?ad>#q^HBR{0&YV56OU5z=b}Mds;{*1k@Ug;gMsM4)Ts;uq;ugLYULk3z#jEAt z3HK287Efh7)CQQvL|2wbzYLSx5p5TYoEi^b^Uy7<5X`-BAO(8z0!{B8!t4Xm z*uVRp8W1Pe-swS-Bw2xSxC*x|x29pVwc9(d+B#5W6C7Z8;G{n)r)d2T(PA3*W`_kR zGeW8zB@Y`Gjz8-1%|gwEOj!&;h0IMUPRABSWTD()G#;pH3)O67uv)VY?~gmO@$|TC zKF*#7D!P{I$M4Ud!}5^)jhHwB9ZPC?6*!!J6F3+fK1Zpiv2LDX-69=bGF2#bKNQxS z#irg+V7AHEZcn0Fg3OXhtxS$yqPRq#x&6$xmq*mDEtEYC3hcx*DjVg?2NUrYi(AvT z7;yVTYVzHjCu$zmXt$S#T2Gihfx3IO%K|dH6XD>IdQs5l5hm!)!IdOqjiPaVg&Oz{ zYjuGfL(1l-Dk0$E(Lwr(%^I~$^5l-w>5%Q-Q6IcH>yg{&l_z6a zWNExIL-^86$_>OHlm`mOw)e#b)|Q}rdDWQR>9|1=G>XqV^kW%k81-~J!~B~9+)gSS z+Xa#zU*$*m5AXeTz+iTeHE7T8BdL8MHNOuSxF4%q{yuuh^d;@Q#O7wzP6c2mC=ko* zae0g3<#|Bv_xId-^};9rwHyP(C_nw3nVik4LuB!fH};&NUq+6V0G&qK#goMQmt7bb zJ}c5sm#eQF&SuxTe{HXR4XRvplK$;Kh+%+%;i1P7)*zuWwZNUt4`yYWJg3jUha^K= z0}<%50m4}2mj7lMt8%ghQwE<$gPFcsxTUsYFx0(Gn*JhS`rBY$_%s-SGg%tW2TOU9S#lO5=Hnn1Bi$uWUXxQ~F8wwS+ z<6*H43*Qke6A36oBX&yp4ycjUPPUI#0!u&j`+IRx`&NoUrK$*^P*Hyy(#&^hV}#%# zw-?EXuczO)-lr%F4mw439r)}(Auf{};6Xm$vJ2Mzmdn?$PAXs%3Tx04j^0?sxWPAJ>SNODaH#?p?zhv%4ZM4{ zE8?+SCh4rdj|71I~5|k}* zzAAn$z#_%pCa-_R|7lEpJ`FVbGKO#xv@GC2u!nP1R`L^NOd7V4-z@royrHn%iEfXa z!HMN>LjZjHsY~b#^k%^E+zcR4u^Z0SEN8M-wETgx@A&##s@a-Yfl-4hhG&@_+O9z8 za-6?mS9Jt^u0Urg++kGhSY-VP3*uod#=5b$53Y=+fUjKPcycXxpR|*&@iHd___XGF zn2ltn%yhKdjV>)eT`Wq+W$r}*koVl_lG1|7;-2ChB$O41dq6ruf{cCPNL6KY$*q%U z$0RqK#SP6@y*)}c^k>Fy89}sCTSiL1#T9K>u4_}30um?*GkMfhTvqtmab^zcyjig8 zquo17e=L=a__HHMstw&1=58uK-6@F}$}!%M*^{bf;GvV_`WDrhExq(R)e(4{F(iQJ&t z!}-_m&YdO6s>F~bfwt${A7wu{^(F7b95s6yK!}H@Y#5C5f=S!zV?l%}8@K_Fcp^va zscg}LCtf_K4}JX-AUb&wNXTfN$TE@+yr!9w5nC86C~unUf{h^$s??z9W3?^=dpRj4 zr7&uhAZ1l;*a^TidaH9EgoqFt1!YirLL+uc{zOPS&*6(|7?;Q{7YicxxnA8@ z5t(tyRgj`;*H<}%z%5-9zk!N;E9K@>VhH!w(ZZbQ@hZrPb{)ki{7_C`>9XtiM1k0r zpBTwQAf~AktTB%2$SRmDi{P8^v(rwI<`PmkW&kcmaK6 zzpkyO74IDGyQcEI-^fbU^Fhw0vr%D9-EBozPP7AJoI{S57|+CpS>R+HFl)URm4UZ( zk|OGCIH)Jok|}&sdHr##kIX~fOBp)e=>=Qp%89>=>uZc`!uaP6xJB!Q+y7DgCP}ye~yF)u(RsY{HfQ~4ex>cQItT_ z5j_}jsOaEExRMt-UBL2^u9cpu(1G!xmmCglWmf|<;EOTK%Y7Wx*|yLx8e4#8+F1?Wz*8+q(?s9_`qh{Sw9n;S-S2J!H~?8_pE*&QdCc-+sHBPaIqFH@ z#H!G?_|H<~w_4RTLa8f>Jsei9`v;mWUc`*J3OM`yem2IOSc6PSSjG5sz?|y=fLxO- zV9FY1aBI8Nec0{;!mg9tc$E7#j%i0&(xS`m1Iu#|(o%+zupfEs_fqBlS`JAA;pn45 zv(OMeAt0@tdO}WCXWqX)5>w#) z`nHUsoR(Q(U*e9uvuwMrVl1^Z6;m>aA*k{SA%J5oH@9p9W~E^+cdd@vH&Ab6HK3kS zygZ=|MyM(Ma;_py!f98|G`@~|YD?_KIZbNs3G(Ojr~@J4Z-fyp{Vz}TJU01+Ywk}| zAG;xkkOpuIR^#=J>WiK2PvKHpq}9geFdkzE1DA-F7nToPMuUn=#oJtl?OYIgx*OUt z2E;Xqo5KpVW~$2ZW2Ps5Pw<+K>M09Em_MzuQb1Di9)IOW;xWPgL%O(6NZH^ky?PnQ z*vf^uE#u`-qsn6`3eZXItD7YwxTK2n{=6kPdDXg+We~4@UB6@oRFIIFifF)C>aDNo zPUtI8PC#-<`wW43GC9Xd-%?=Wy8~bK80f`k0v7WSW2B>a40J@%_-H87ARqM2!%ssj zLuc-V^s$eu4@9s>@937uIVY#6W6K6r>gbO=<#3WX@ZE88c0a+xI3;Rl_>A1}CQK*} z(6Uw6&|F@}mWP~*EF%>At(1Q;}lN0;UyLQp=j}JT<>9fE8a;`;e&0+K23a zqhmyR`0%*Y}{yRwvQ$8lu2)9BW zZyXa6(p(g`c5WmzvcZlz@Gk2(1|?_RJ_){y6izZ+HeMz& ziD*1;LX2%wP@a0}p-{z+gZOh|s+MQg_Q|Rq4*^2W=ag=G2s&A1X-Q^r5{_HKCrDCO z>h-vNSe~S1+%Z+Y*kG>b&1cG;WGpBCh*1DbWePoH|2wiM8?i0o+a;qE7hdqbu1Px{ zLuwrX2>CT!psa<|jAd}Z9$G(&(^%O!yFq*!(L#3Hg-QmI)-bw)^^>P1GFcw_oUl{w zWOHNN5f!@>viBmMN>BxYO*Xf2e4>$6!u};G=*BfbClVFq2#dG{~+mqp|^j7 zMW=wpF~H@Kz)~WhmX3F+v=tn9lU!c0{Tz=q-|B7~1b<2zHZ+VvNb1em%#r#?(n-Uu zP1m^XnEm06wh!-o`5SF3ueZf>W5t9~Fo##u(| zcaP>S4|#<1zg~#6Hy<1uoZ!M#k2*j2r1Vwm;KYMK*Dxv8AWR>rqOR2Z#Tz?byL}V_ zNY!+xMeOeO)?-WxVnC&iQ7&rilF`gT+zww-s)wmmR6)HmNX8;&@BDl-zUWigF+gsvA0s#L=iz|7or4X3SFkUhkgMc*=O9hO6RDz63;1m3>MdRDJ|q)H>)ui^|2 z*h?v9WpwhyS#pjIjc0`4%WvZ#u-wtTI-AZ3*W7|%P-TUETzg67P5Dq2HrF?s=R?)l zVlp1S`q<)f56QU0q8&h0S<9)DZNP7Z)G%RTEtKr@1~Ovjt{LfAG0x@dvA=$@rQPV{ z*RGd{F)Uy+!gx(WP0l(^yBAHBvciRlWzeV43Z691T2)OK@5#Gs$-o9EV0MkmQ0UHt zZ1l(r74)qcQ{WY%Lvx}vqQxhHsi5l5J>&Rwm&T%^^*3J15{hfU^~dUlfqHXaW?=Ci z4f>f>#Rnd5AJF^)*J+VyTGn;Tp(qGEGtDJ?dn37cwb;Y5-uvY>UBQVZ$dY zkV%kJZ55^kE)%#q3|MbtO&3p45{=2ggx5jS4Z%&WeDV!z?FlMi301c<*$wuJlBbuH z6b9c3nFluOSG;ivP39eld_6a#?y$p|ALe_ksGtr$J!C@d&$kW=eFqsi7eM<=ZW41| zmj!Tx=2Izt^dC@$=s6K_UCKnU*JI!cBD8|V8ra-iP@2UfCIgxiX!A?4LBK~y0;1~9 zKPIH_n{5SszM}PjN0kDFDa=5KhFPUS1wN(cNiSJYEYgxBam}sS_`@KmSs%4o z-TC!itf7z)YiS&LW<;4R@mMuoH>u)lz%H$k{Gs1@wFj;>X;=3fP!?VX!hr{k*52`JF^Rpf7j6TFc9i>kQkN;fCGb290(3JvB zAd{J_#e$$H|M#c*JN@Vz*oiu6=ahE`=_|N~fNq3d-7S)2l`G|UgXXn zBV6c6DJ)M|8UNv4tI~1gWX>s1;mX+%|5I5PshHKx1Ne&;v?B(dlLeAVx9d#woyew& z%ARLbn()&2sW+jm(%^t_Sq$Fmvds9POXU-}gq5q2!}9AUjVXa8hYXznQCkOKl?6`~ zTNAn6s>r~*L`}H=m1psu{AMQONJQCmgbSg&=v{5smy=ItZ~(*D*#71 z0`t$TG`}~<=kDF&kb+U1C8RIA_r>^Ebt)WVRed&uDNwhJg06;V0?7uuqZ)n&b>a~= z6|o0V@CtGUb%eG0+bMR%ocmR839I3{x=B4JozL7A7`mAv{2uA((x+s)e)Z=>b`*c< z{RH}5f7JsTf09Vg3YsZG;=zqp5&5bSc89fsukzpQo>$+3R%dcDj>(^aD06MyV5Z;G z6#>ze?Fwex!Cmd@$Iv$7>s$}uR9+#3`&$-byr&@x4)Q%dQBxlm?f~i2nkDo8fM z0XmLq2($;F?Ps3zxZj*R|aQjwp>`lNtC4~%ma1%=Ka=|vQG5H4URX~ zHyjUJ{Z_DIRb6Xa5EhUzF$eB-BDI~(K-SL0QsU;a6c!`&^28FBI~3-d=1h8TZME9{ z{}09DHf8A&v$SNuj_Y4^&CjgAmCU88yE~HD&GDUs!GMP*K^$})^M8}R{!=!+s779j zKS5L*B*%{th+9~HDp7hHHe?ofjYP=Zp2aT|47V+2Wi?{rGS&*$p!3v(wg>phH(Kl5 zw-DW%ARUc5xy}5~WB+qoa(C30GlexJ8b8SicQAu#1?hIgFwK2=ipo9!yt4A5_n0;(FW#~ z2xvpOb8dJOvBJ|OAs|#+Pl|sX4qzm#d{*lFn0i920^P0v zgzJEIVWP6+O~pY}qZNQZz;(dBn)_fh&EUR3$#MrpVg5tUO}w4&`!&`JJcLUI@=>FP zFV^4&tMMM1s(Su3Zq$yx?-fXckgOTJnAXoP_>5HnuGb~Lc zzS!!iD^2H|ZVlRw@fM917)MA?%(r>90I1nXVL`b-T zHD4PhIOSw9l32xpe(2A;@&*yF7OVO9_FG>KjFLKuoSfJQ>Qg)GD`6zkysEWLK6g7P#Eo8RB?( z%WwXQP`$INw2)GnL4cfuvE|AKWSMBxFLf?V5Ua2aONxPJBzatg9QDXIyVkyjEd2_$ zda&0RQ3%OiIM)yw-s`8?Nxp?P@pX=q)|^0%t&10kXT3`STC{zErqLoRSC)JT?N`d| z{5&flx5&n;sp3AG3JE?6XMZl3`g~2*XVmjZ^$Hz{L=L)exBIa9%$Q7RD6WIj9{m79 zC|A@Bedv5ALS~HEx9>y<*v9=J!dtK0d*p;HFSWlUzu%9AJ%Uq-r5qxS3vvvWochhH!{23i_^5}atC~h6m`RC z>SL_B4VXv%ot;F1_^ffg3@K~ca3#^Mb>lM5b_y-l{ysOw;`qCw*LGM#4>!=X-{2WS z!zCo=Sjb0{7n%T%%CYIuoz~d`PhVuto9GvsCq7WoS#9n`Ewd`;C!vcjez?1$-4L z%$|&xqq4L*Rj;4So^Ax2%H=*QdEK*E2Jxm}kLWgVYfJqR19eYnIw^MSl49#`QaoaV zMGv&rdiWh3&aH}k<^5pWui>Czl8!N-uDLn-f@CrfR{iSBt5)~yCn*YsG*dxC?5nwd zd6+t)@6@NYl;EbvSF2hS!Dl?TJa-34^++mb>a%xRW1%sc?ew#eTi`Egqf2}xMX5N4 zy04NM6-1w|2F;0yd@&kb+?M4Pro&{2`+@O~-S=!S>g_EiblXvu(v}{d77J7r6=~=s zJ)XThX&odAF}WOg13SZ;{8=tXy-$BhsXSIiQ(LinAm6KWJ`^>KKZ&2JIo0~8jc&U+O34R(;bgZOp2PLq;+S6^hnCVZ zjp;d@lZvKS$l@%UDNDY*kA^t%EwHD>QeChi*K9w@^XKcI_@x1^TN~-r{Z#`z6!upQ z@P=S5IKn=<&64#!i`xCEb7nIX1J^?e8%8IDdNT#KItH@%3mPXel#F#XmtNp`5cGo_ z#@AW!S3siWgf*Dj{cl3JD$ z1zB-Ff@2cjsWj8>$8t3`w;rHggbuO)g{1Y$54Io7yo_07Of_7trmyuay;A1g3iy(f z9-=~b`qdwJb5=8djUYA5+WE~W_?`t9Q)BDjm87~he5J!^Dji09K1Q&(!u?3Y;fMxH zJy21l#y2EpV9-&w#j(CZg9k@Jh4tw#lWW6w-Y@lMUMSZ0)wl)XkSqCbp6|#PzjDmb zW8!7Ul_{ayjmA?iEhJPL^5~$i_N8yHBvbK)=)l0^JLdWBRKfNHrdh_H)Z}0 z`SJO9g5b8vZ-Gwbo3Sk_?F1KLQkoNHtAfsp1vsYGC%mVEndb$|lDvy3B0IIpcugln3}0Q#IqEpf>>D*$f%{JE*&3 zK|dwMk2F9I?$=~UH-wq7pyHo;BIl=1#Mm(dwcvX~lZsxlDxH2}D-HUcE8>lQs^S|h z$Y#O^SCJHHw*w=AXHZM1vT&>@?WTc#|J9=(IX*t|>Jy8(%)RXaLH%S++Cwk1-$x(K5{yjC?bJ_~k)Yp`cbQX_8SW{<9Xjh-lkegPwn-$9H8 zR~oiQ+#{M}PE8vx-g7!pbf=&}Hq6JWXlq_k!D{DoQ4YMxE@k6G*Mko3E|TrmB#w!* zADvXxD~b9!xkYvbt0+4GOv-AbJ*@qSiw@>LwU>Xjg=hV^1|jIZN)M`edR7uKZr|PC z16Di^^?Iu!XqO=#ZpVs8cFb_KUk0$uA2tm*-npqRomSxrE{%K@JbTM!%P_U>8Ga zU27B<#uf;3=2BU2f?*$WNfP~Y`N7{m6K+{%9Ue5}fTn6)3aFh{9d z^Pd#RdH#bpsi3%j;Z2Fh)hZSPwoG=+EpRF85`IkiNGLzu@C$I6_q!UGh;0?zi{+sN zH0*pebNWN#`kq-jSXO=Yyj<2O`dmL*|GOic_CglMkpy@&tgrFEV9WZ=SE=`lUd41* zeLXNwzy;Oxeft zozw}?9gB_?9&xefl{xj(SqkR?L)GM!clOv?NuVJ-$O!#<}X#Djw^o?MsoI0I)H zft)eR!qJW4JnhG&L&xbH*(X+*eM5$xU;J(j=hLm>1qe1%#OZR*upA@kRbH*bL2&a0U$|=>Rr%=fqjAa*&Ea4sZDu0~jJGGi>SYg9r?Lqh1~i^- zOhwcS&3QMcEnQJ4zAjeW=)k%7JtBi2RC>yyqs~|sO?Y-T!-TK2Jq{SPyI;5CzB1<9 zhW&+)j||v7nsoBYuA2ButVXORzHz;q0&uLqOksIG6nSlDDJ=yfI6<{z&QXyflL^Pc z!Ha-YYcKBkSalt*I}NDPTeJg_{r%*sqa>5$RY%pV;Wq%!IXcgUpi};G`ixHC0Z_4( z=JwFrHGgY8K6ukQTzNM}b3XV=!A`ULuZ=tZMc2Bs@5D4!E#@+K#l+sLv8N6h6j)$d zIcm>~u4&?*8zd4``mEd744L@?SWbA~!`&p&^IyXRqSmfO1t(<+e{R1}DFkmMdQ&>@sl)hxu+FEK)_XzM2dlYr~1R%dpY zpH_0yoO!V$2^U9tJeCtTkOOj1nGEgn3?ud6R6V3A5AF@3w7l-4-G^n_8yXD<_14pks(qcpJ>UAoa)zV0YX2`VTHXD=(BLSb1ahDO9M}< zBsk=x&WHYU9uf6q?TFXn5PM=LYa;rYdO#De36Xn51w49eb3=V>DJHwh$cAnY*XUii z{ogZ-zKoDk*)0b0l52OsS;ozq+cO;W$xDF|y(9mZaOM4w-*HL`=;KbVW5DuY7z2aw zpP0zN@P8+&*@gvfc7OYOm(Y3OX>#?Y!Te&QvE-d&;`kmH!W;Y<7*P-^r)Y)=Pzft z{)3lGh%3UBpLS&rp)_l6)zkBf>*Uhuaed!#V5*k$ppM3>#6&p5&QOb87!10%6>YK9 zN4k|1La7sllt%VW0STpMr@&!8DC=rbwSA4b&Z?haTJARM1f>$emK5&enzQI(7zF(Q zp?Q>q=RveFjw1&<*IHu2_Q0xR_L8(QcBGP0)@lO-+mYz>}r!X}Meby@(co}#+H7Hj~ zJb286@GP!CEn}72Tkmydcm0cT?bkTx?wg6ZD<-o9V0>^syWn@axoXBBOGz-2a(5wy(ABo2?Sxy1Kxj1FQ)LR+Z;Z9O7MQr}5VPdA(b$5x zQ^;}4{ni#uhh>wruXug)%4eln*GxApBQNF6D5}{ATGXrF7wC;5IK0bF!?eXY4U#6e zEFuC&KTQBIu1&xfVouU zvZQU1RTU4YBB@>;1z$@DNxaYQu@IH|o|7KeNe)w_CJTX;W)+zh33}rlw3k6&8&fANgNEdRe26I<+I63FGV z9wjfj9r!u$8ZQ$uMuEejh$B|ktvTk1Mj4OT{=M;bn`~_*qD_yFeE=~}4usv}_78KG zIn;flch^Bq1%QI+VZR4T=?Nik*hy2eIbwAqhl^v;C&a37O3#3FOSNTJDzbXkj3mi^ zv3-aB;T_jsnO=}QDsGs=Kg-ipeijH0HNS;D7nf*p4IPbD0r#+N$cgU&-Q~R2Hou)o z-oGoBJt4i35o@WCK4N!`lJ=2n@`v_Jnp!;g7x9^q9)kiL9|=?HvB7REe!F*jUf$2w zpXff$BZs}cF9XR*e=r)v#xtpLBguO`Fi-mKD;JE1>#ZeU%(?@#-N}&8Hu0|4Y*KvK zbvC5t$gU!o(_n~1!@u$Ei{(Gz+q*E% zvZ?B5$;y_5w^%>A*Wz7Qk=H`#)fMMvg;jHlv+91V(#77fK-Rj>OiG(siz&{}nz&89 zvAQFUMn^w^hQ$1|sh*TbyZlsx)#IJe1xMjgLe_RL#6ye^n;6|*m`6kCs_=0y1xeMT znr(c4n#~`AC@F&{OJ{t2$2l6_mNu(=^`4?KFBduDI8zN+H=mi8R2=H93p~Rw+N`uE z)llhB&DD-nzH3!_!CQX1<&#AV)ci(ga&VZub`OCRr&AHgNa$~JyRgg!4WGDo$jU@G zxLsFWVpgJeqJU56E&(`AhN%KlyuG|akLXE# zq~1-n2*$3uQGUb^?n|f1MJ`?g{#X$XTa=OcUTp!dGIjn~HYG;fNj_Q`NKZ8i>VG=U z&4Q4ktRSy=Y0~ zcBdgaBz6Oy7D>P8EOJBO{FL2`sZzRrBFrz5zEF&d)oJq z#(z{AcK6;)j&wJ={Si^0vWsX+OE>cfj}6sMh_em#JSiveC|-gMmAcdW7uVP5{fn*I zPmhPZ=SIc#l;R>4clxmVsgxBbSlF44k;UY=hXU0d!y+r&=_;Oi|J zi>C!O{m}rdMiN~j@-&9XnEFkY2Dd!75a*6+Pl)do6{xk0#7?~jM#Ag;Ds3VcA!Y8} za0$b0eqYL6wh-d?IM43BAibolV4cAaJKkTUxXvzRPS1hd`Wf(}-OJ!7S14K(VYPB>AFs? zZU-ndE|?UZ(kbhDXHe;WY#-~zwYNQTaY($3iK3GbC3n|=P$fNAqV-g!h2R!JR5X__};3v((JDCXsQHuj@rv+F`E&AXg~J%j*E z25!ywSHeQ~BXW&tX9(4~Exh3JufustQ`r}0-Av%8f~BI43f!EunGmmhZp84})OROs zsfIKnqnb1?eoFJAh{Nr~7lyAMd-cT&DFiiCA41!bq+d~(`WUk(lvY%7US3=+?}s1+ z4r2>TJBAnVI7!&q75frtep|( z8pyRmHu4Y!I*8W7$uvNvNww<*LJ-F1%e$-;*ACpPuzQXbk;kMB>If=exmQk|4cA>~ z?jSl3n(y9FXMJ~*9VlN*>4e-~Y1FSIlRn=_m5#Ko=Q>&GN}=7{q6pV+NbgqU*{q-+ zBAE|*_GQuSvZ|M9Jdt{D)3VOxse(4qlEhBTh|Zq-PnXp$^g5nml8M@l*o`Q7-m$;s zuwnCL{%hf#CMheqM3eHLm6cunC4Y&oGB3<+ zqrncqD_EZ=OHYbk-I5eCubia{7PyF!y(|%-V%#axd~GF7pTpC_s2&yh8A*8=ENR%S zy5%?*l1sH<-O|sV)%YbBU$UG`?x(yDgHiLmyMs4AH+szf^ zXYR2MZb`}YZ$1#Zrb?6?jO=Ir>>9JMXBO7+vkrluPe)e!DB3Xx<)+ee zg;Dsa;I=3Em$R_^N%f*sTu^Ijt|8uq-D5ee*Ys45swkxJM{e%fhbJi9KHfks^O?3> z;+VYjigcKeZ~?P|r{v=nc$sx+W|uiThn^ID^Rr?^V6OjKUjQ8|%t!*X1b5IzL;idS zvsths?+Y2vkl*ZP>{MWCA-Pfhcb7zPL=7aZQi={dUkCI2eoZuyujI#HLfjS^KA+!K zw@j@2hKdnS&WAlg#7obp%XUoMRllh^n8Fs;>g`I|54?aPknoSAslCn(=*TB+@(6d- zxy#y4bzl39&;Qv|P%S%Bxe1YO!k=gCY`gK#DLAWJ2y`8Us(RRKLn^7A1|$QE(g~k5 z4eteS4Bbe~SiSk)^851g#_lfuqj<17e-gJj%#Ru!c<#z@n3LUc+C^6bRgl^dv`p&U z*pkkV-5tFP$UhwBx9*%$m8xk-89*Zj$TlUwx+dzFdHGq3#U-s+@|*H+c2 z=Vcgaptv4Rjku}K)TZTA+EV*|ogT0Lr@jFL1M-Ol9ryyGOLkuBaM=gU-mPhv`j`KV z+e!LM=Qh9gcRCFYz@wM5c1=Tuhe!WUI);uj|KJ!_?>dIhs{YwAELKQwV<7wwd5D4V z+2_nAZi1Ktc~%UIgf=UK7Ycp11=D*SeijRuBRASN zl?<7Sq|0plB^nexw_;4T80ck29tpYwc(-EohOCyO>}i^!=)T)xN{ug0*s=hQ-j13( zdHT%oe0Hb=w?jYw4R#B9;YrllOm1Z_Q$(G&{hRM~&+igYOG@LQi=Y)qYG_j{>6(u= z$V$`Pwy_&w=~|CCk0Xs|uEsw#QDLpiv?I;MAI8SLg zUJ9&2v^jGq_M4oo0z{dAC@6oh=sWxMNjj_fa=(4smr*;=#G9R|S6F(7G286!{242J zQ@m!pumw7GFEpM9hM#HR?frslv0DMnd)T0kPk;c0NN$MbDMm;2@)eWO<>A_0Hc29a zewC%@+Q`)qc4$B4dG0B$qWb~n9swfY9t!6e>{jofCtz$YahU&M7);cYh`qy z$?el~mIiu{P;&fU(`gnV)s%fNw@q+H{;es>cS%a6>DsM9mUKdCjaTRPS66u96Y3s* zkDd5jdyVSQ^Tnc#ej#A;&=J!HL((b8fPaoCw=KOcxH5D$V8>+iM~J3tlfO*ycA0;b znz-sw_4vkT6CBVfioW`w(bk%o?FNWU6)5?#sU%oS;OTIn%ypE!p1Tw1Z}7WQ@MuhI zXofBk#q10u_!r)dE=ylHSec?4uJa6c#b2iSG4%6sQksX;lwEB!r)WwuG$H%IZ;c4G zc_(SjOdIca-abrON{ zAu3dyL@wPq+gy0r+rIz9Bq1g%pUU1PHX)wC82&#*qOMhb-|8QEqI&uMp<KHUCcoUq z@)0Gfm4M&%O$a6fC%-zxE${_@6R|{>O^YCweNmJ3F#tO1%&kT2h4vOZUh?#utyo7* zuH$l^pp*3`{o5i^o;0bvv;%tN#Cs$#J3Ts&;`*r_5k8H+{9BdOH(^$plr@?J=4r?# zsLrW4VOj3OEVAc>4%K3Zc8aw1kdGHm=O9s=ugR1BWek#{1PCGc#}1< z*OYXs%SX!fcFyY7N|vj_EDQrn1Clf~lPatVPna%y!W%o1aijg$+Mr2AN4 zez}lTQ39B&f8){@*#jtg4?GgZHr0|D^>Dfwf1|*_AO*0Ip3Vv^-<)m0$TN~Is!>jd zxM-vjWls`iA-9Tz1KVQ&AyON`Zs&Eh%6Ikk49c6~3n7iX%4ql7{^+$NgOVol{aj~zvIL)0 z<(8b+X(1og<*HqT`!pB$`AhdA{;ZIeZW%&8>{@@UM_QOV$tev`+TY>$a(^ z^J+FR`!_bls3gmY75YaVaCfm?I`lVj2wfz4Q?(%eR_=@?*ash(^W3~F&j$okc>}T<+6eiHt!)z5d6Snab z@Fc^6`(VTGIG3Am>_5~BhDk=({^H@C)NAh9r0u8M$tBQdY|f_yr1>Yj{=MAE>&)Ll zHZ_o_lnc6`5xYIP+`^%rVL>0P@3yA<&0=qbrfSC9kfquuXr_PbeWF10w%c_qc_l-j zXY;6azH-k2-fw1ImtS2#UcG)TH{@&ix4o4m zUt+_GC9ZrM+HIrbT^vmrv)KpJ_MiSx5+RaN5pK{vz*sHrT1G!})P3fLe5`bmjV^xu z7}?RiZP5!B7LL#r#r|J~oO?Xe?f=L5xluQ9>omgL5&Gtol$zV25>tv>-8IC9iJG$< zXPZ({F;Z#dl$Ipfm_s>7a@HEj9OpFW49hl$=Jy%h-Sz$5J%0ax{<$8X>v3K0>-BoR zUTz%NQe>@qykovP=Qk5t<^G_l$X7A$&)St#q`*~s^g-OnmC3QbLdfZfg}@!9zsl{? zPi_Y@vfAUMSIqy3eqHZQ%!B^A4D0ehK}vcvjP7Pw)P#AN-fa+KH2iJ4g|au^ROs*o_|gP1S49p}+$v+IPYta$OiYFJ2kH-mgKAd7DSINmk@MTZgTZVz%XbHIsAVvghQE`>g zWcx!%XqLVAo&4VB;q1@b7AEICj$qHl4IbrJI4vbKQf(+LkkME>DB-An-3^O4R{LC! zWYxxRO$&g$tTrA0u_6aU;yC};`bdH09zN66il)(;LAU3)5$I`6NEBysS(awk1(E!g%wyx3<4{_Dl^R5RpuDUjQ{4C(iWHf_`zdRywgvK8%e=i?V0cM@`2* zHc=y0H8d^uj5*8bO*fU(J9=K^RQz94{-~a^jNAJ&ui_~ zxrRz@EYfw3+sbuuW+-uki?C0^;#>g})y9oNXsHVh^cqf(1Xfz3XnL)dAgNU*tIio+ z9xIi;n`|W2$I}FkP~B*Uc;q6BRwTpej4tmF+bfiE4^W3-`yX$;v?ITy)`Mj>|Dq#t ze}Y(=!rqXz;V23TIA{ZJZxly_?%tz|Fm6X5oz6Xceo?}|Z8`TE9q^P2JOz)7lVV7^ zdqgYB>fBiAZ7)jb?T|3b+NQG_QB8GwXMCw4by~IItM1$9L$rZl_P(J$3Icl$pRsoY zropmG4m^2qvZ6B6L-mExT(twKo;&f`EAqQAAHZ8~;aH$o_|}pN-71h3gF+Ct$%lnc zeTBUEe%`G4fnVR3%Y9M1q|zJ&tDGuxq$_p0jM0kNE-S(VTLmMJcj3E8|H7-{$6#L` zS-RTceby!(;!A0e85G>ZOtZ24IP@3LhLJRu$L?Ee!`M#Lod!ad3-90G^vPmL_Bb_d zfdnz=$oob*x{9k4B@{b!Kinf*=Ln~Gq8(QB(cW*e&eyp?=Z{hEbo}L&HU(jL2E8rBnqwVLX zxNrD|TQXdz2FLmBK{T2+AWq2%kn9fyx0ID0HCsYeI3j z7~fu6{N`o7R_rIG{%s@w0t9gl&&hm8hd11#99YFwBdJg?@X(fI3tEO(OO+DyO6%gv zNm5peyR}ShjlQf8=QjlY)*q(m9HEGwHn;E0n)J27!@sx8!_UlJCx8QI{cagdlZ5f znJqBu&V7#%NGV5JrQ=K;X*JUUv-xAS$2`A0oLRQ*kdsyjJee;|6782QZS?94vc+A( zp2K`?qoC-%%#_|btWX*t$;CVyn^zEi9V%df)RYmdO)nf~U4>7ey)Q;kbu+5R#bjMA zF54t;zI5o;o!bu58Gf0`sXt5{Ql2QiuX2#^ag-Ob@sc(%q2MdpSniPc*C>IGRhrWq zywbXve9>}qS!v6i93_>y1bWnB+OjDbMG2~`?`g8L z&P)*{K_^@I%Yw0f!Ko2fkIc`N$AU8JhDu9@vrVOA4FcY}6Ay@AOAp0I^9dft(VsM4 zE%cN+;5IRv->VK2TSmG(F)&yQ;yKdj_d~MOIN#q{{j%OEeu^s<7&X>gV_02|?#zO6 zbLdWxn*Sqx(u1c)Kw+v+&1B&p%osvE>^Dj1VEUDY zq$l3(06v=sJTZ=HJs0SWKIFtc>_bb3 zU4CF#b-ESmbM4v4G!^DrcCovhXPc1C9tMJkd3G}($UB!oIT84t1JiW`u6N}Vu~N21 zj;a|2?6$DA!Q+ih6nH6cJlgv31bG49Q9oT`dVq{vR`&iRb7Sk+D)f@^A$-OoW0O_`Ue4mleh-$Kpa%m5KW0@%?ii`jl=@(Py~wF7 z&`Ha;{=IT^s&bM^QOLH^sr-VG#1i0yt-oo7ObZLpYH+tH=I;=~N&k(7x6x~?H?|A1 zhqZY?_HfTBFX)=(^=cG&bXZjUAO&sTmB7xsDVNCEZR}i-9$Erqfbx4NUHir?2_pJa zC5bIvRz5Pz>|1-N8tFA>+1Z>IYWLcolfkEwi&%h87SZlT?UhSHymx6UAAjFMc%Xvl z9EJItn09&s2)XN2W=y`PTmma-7f&MGh1%e^s<@CiTI~7$(H3D z_%5nF{`i?o1I);0rp;EWCgF3Mo|V7oXcum4F}3+WMPapIgRN;71SNX9$5cr;wXWV6 z#$#eb*wcdf6@#h*KNKH&m;ZQVmwb`4fqrxvoH!RF122TE_~xoG^u$mKiJ<;+*j{!f zYFBls&UlIPFnVevI&ggFT(e?2j`997BH$OGo~nj=9Y>$C`D1jcl0Aq}(nezgAHDAm&j$S2S?3?S&Uevs;#bbhJ}`AIqZ!CI-N#3-xoDa>bL#=a z&+7rhvR*w@qkRhM`!))f>mO6b^%_Ubed6hpt=8q6lksEGOXCX!t2lPs%dRa4-8~ic zVN-@-?*uYQ5~$KWYW~8gO+ZJOlL!3z(mUp<=LwaFN?yp4`5>`&$cD4Q1Ug?i*e}wx zepn2`Ea5Q1T^+tosQsx_U@Poxd}p2_*a^7)^xzERRTV4wr{(9brf)2&w*L*?i<*p{ zGj!lS4sHWC&St1)-G;)nvo?zpNU5MzKeqiInq0`Ny+NEIUmzc`489U zV*Vi`ae3^wny_};C(352Of(R{qPv+W*#@vnFt6y+-My1qUG9GTEF;$mrTO#HsFcdb zVHX(3$$Q^DkM`}*KfbM8zY`7T*gb*NT`KULpW!-KJv<1QEdCg6F6vDJ`Qu7k;nLA_ z$R%PR7CzFN_=kMI!T#allxqizUWPOg%C#6(y&wcNY{DA7fVTTwQ0aC72Vr-#ZyWEh zwI-~vswd%Ocbxi*Yn>zbPzJ9lSi|?VeI9&|n2)VQkP^{EUU1c7+y7@@)o183ID3bD z$$b;SOTi8~gq;uuJ6_F&w@`%#4({bA*SHhgWZxXkC>v)&US;37_3wfX0L@gd<@^rx zgg@7o*l#kp=jZB=;A7V6PY@xT$+|yBbrE_c_5&gmSrxu2&U`E#by6)WTrid$H?ulM II_ebhzr|j?ng9R* literal 0 HcmV?d00001 -- Gitee From 2e52fb396416d010ddafe084437a3e4471667ebc Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:52:54 +0800 Subject: [PATCH 29/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntent/zh/docs/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/zh/docs/.keep diff --git a/content/zh/docs/.keep b/content/zh/docs/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 1fde0f9ef13b52be902306080f69204163f429db Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:53:14 +0800 Subject: [PATCH 30/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntent/zh/docs/Compilationguide/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Compilationguide/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/zh/docs/Compilationguide/.keep diff --git a/content/zh/docs/Compilationguide/.keep b/content/zh/docs/Compilationguide/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 0fe3d119620adaf52eacff64169d2ff0371bbe41 Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 17:53:27 +0800 Subject: [PATCH 31/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntent/zh/docs/Compilationguide/public=5Fsys-resources/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/Compilationguide/public_sys-resources/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/zh/docs/Compilationguide/public_sys-resources/.keep diff --git a/content/zh/docs/Compilationguide/public_sys-resources/.keep b/content/zh/docs/Compilationguide/public_sys-resources/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 639da11171e5bbc11d5957f1cc4f02cbeace775d Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 18:08:31 +0800 Subject: [PATCH 32/35] =?UTF-8?q?=E4=B8=8A=E4=BC=A0opengauss=E8=B5=84?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/menu/Index.md | 917 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 917 insertions(+) create mode 100644 content/zh/menu/Index.md diff --git a/content/zh/menu/Index.md b/content/zh/menu/Index.md new file mode 100644 index 000000000..50f11cc0e --- /dev/null +++ b/content/zh/menu/Index.md @@ -0,0 +1,917 @@ + +- [产品描述]({{< relref "./docs/Description/Description.md >}}) + - [产品定位]({{< relref "./docs/Description/产品定位.md >}}) + - [系统架构]({{< relref "./docs/Description/系统架构.md >}}) + - [应用场景]({{< relref "./docs/Description/应用场景.md >}}) + - [运行环境]({{< relref "./docs/Description/运行环境.md >}}) + - [技术指标]({{< relref "./docs/Description/技术指标.md >}}) + - [基本功能和特性]({{< relref "./docs/Description/基本功能和特性.md >}}) + - [企业级增强特性]({{< relref "./docs/Description/企业级增强特性.md >}}) + - [数据分区]({{< relref "./docs/Description/数据分区.md >}}) + - [向量化执行和行列混合引擎]({{< relref "./docs/Description/向量化执行和行列混合引擎.md >}}) + - [高可靠事务处理]({{< relref "./docs/Description/高可靠事务处理.md >}}) + - [高并发&高性能]({{< relref "./docs/Description/高并发 -高性能.md >}}) + - [SQL自诊断]({{< relref "./docs/Description/SQL自诊断.md >}}) + - [内存表]({{< relref "./docs/Description/内存表.md >}}) + - [主备双机]({{< relref "./docs/Description/主备双机.md >}}) + +- [编译指导书]({{< relref "./docs/Compilationguide/Compilation.md >}}) + - [简介]({{< relref "./docs/Compilationguide/简介.md >}}) + - [目的]({{< relref "./docs/Compilationguide/目的.md >}}) + - [概述]({{< relref "./docs/Compilationguide/概述.md >}}) + - [搭建编译环境]({{< relref "./docs/Compilationguide/搭建编译环境.md >}}) + - [硬件要求]({{< relref "./docs/Compilationguide/硬件要求.md >}}) + - [软件要求]({{< relref "./docs/Compilationguide/软件要求.md >}}) + - [操作系统要求]({{< relref "./docs/Compilationguide/操作系统要求.md >}}) + - [软件依赖要求]({{< relref "./docs/Compilationguide/软件依赖要求.md >}}) + - [环境变量配置]({{< relref "./docs/Compilationguide/环境变量配置.md >}}) + - [版本编译]({{< relref "./docs/Compilationguide/版本编译.md >}}) + - [编译前准备]({{< relref "./docs/Compilationguide/编译前准备.md >}}) + - [代码下载]({{< relref "./docs/Compilationguide/代码下载.md >}}) + - [软件安装编译]({{< relref "./docs/Compilationguide/软件安装编译.md >}}) + - [产品安装包编译]({{< relref "./docs/Compilationguide/产品安装包编译.md >}}) + - [FAQ]({{< relref "./docs/Compilationguide/FAQ.md >}}) + - [如何清除编译过程中生成的临时文件]({{< relref "./docs/Compilationguide/如何清除编译过程中生成的临时文件.md >}}) + - [如何解决“Configure error: Ccompiler cannot create executables”报错]({{< relref "./docs/Compilationguide/如何解决 -Configure -error -Ccompiler -cannot -create -executables -报错.md >}}) + +- [快速入门]({{< relref "./docs/Quickstart/Quickstart.md >}}) + - [了解产品]({{< relref "./docs/Quickstart/了解产品.md >}}) + - [产品特点]({{< relref "./docs/Quickstart/产品特点.md >}}) + - [软件架构]({{< relref "./docs/Quickstart/软件架构.md >}}) + - [典型组网]({{< relref "./docs/Quickstart/典型组网.md >}}) + - [安装准备]({{< relref "./docs/Quickstart/安装准备.md >}}) + - [了解安装流程]({{< relref "./docs/Quickstart/了解安装流程.md >}}) + - [获取并校验安装包]({{< relref "./docs/Quickstart/获取并校验安装包.md >}}) + - [准备软硬件安装环境]({{< relref "./docs/Quickstart/准备软硬件安装环境.md >}}) + - [软硬件环境要求]({{< relref "./docs/Quickstart/软硬件环境要求.md >}}) + - [修改操作系统配置]({{< relref "./docs/Quickstart/修改操作系统配置.md >}}) + - [关闭操作系统防火墙]({{< relref "./docs/Quickstart/关闭操作系统防火墙.md >}}) + - [设置字符集参数]({{< relref "./docs/Quickstart/设置字符集参数.md >}}) + - [设置时区和时间]({{< relref "./docs/Quickstart/设置时区和时间.md >}}) + - [关闭swap交换内存]({{< relref "./docs/Quickstart/关闭swap交换内存.md >}}) + - [设置网卡MTU值]({{< relref "./docs/Quickstart/设置网卡MTU值.md >}}) + - [设置root用户远程登录]({{< relref "./docs/Quickstart/设置root用户远程登录.md >}}) + - [了解安装用户及用户组]({{< relref "./docs/Quickstart/了解安装用户及用户组.md >}}) + - [安装openGauss]({{< relref "./docs/Quickstart/安装openGauss.md >}}) + - [创建XML配置文件]({{< relref "./docs/Quickstart/创建XML配置文件.md >}}) + - [配置数据库名称及各项目录]({{< relref "./docs/Quickstart/配置数据库名称及各项目录.md >}}) + - [配置Host基本信息]({{< relref "./docs/Quickstart/配置Host基本信息.md >}}) + - [配置数据库主节点信息]({{< relref "./docs/Quickstart/配置数据库主节点信息.md >}}) + - [示例]({{< relref "./docs/Quickstart/示例.md >}}) + - [单节点配置文件]({{< relref "./docs/Quickstart/单节点配置文件.md >}}) + - [一主一备配置文件]({{< relref "./docs/Quickstart/一主一备配置文件.md >}}) + - [初始化安装环境]({{< relref "./docs/Quickstart/初始化安装环境.md >}}) + - [准备安装用户及环境]({{< relref "./docs/Quickstart/准备安装用户及环境.md >}}) + - [手工建立互信]({{< relref "./docs/Quickstart/手工建立互信.md >}}) + - [配置操作系统参数]({{< relref "./docs/Quickstart/配置操作系统参数.md >}}) + - [执行安装]({{< relref "./docs/Quickstart/执行安装.md >}}) + - [(可选)设置备机可读]({{< relref "./docs/Quickstart/(可选)设置备机可读.md >}}) + - [开始使用产品]({{< relref "./docs/Quickstart/开始使用产品.md >}}) + - [设置openGauss参数]({{< relref "./docs/Quickstart/设置openGauss参数.md >}}) + - [设置客户端认证策略]({{< relref "./docs/Quickstart/设置客户端认证策略.md >}}) + - [设置配置文件参数]({{< relref "./docs/Quickstart/设置配置文件参数.md >}}) + - [gsql客户端连接openGauss]({{< relref "./docs/Quickstart/gsql客户端连接openGauss.md >}}) + - [确认连接信息]({{< relref "./docs/Quickstart/确认连接信息.md >}}) + - [使用gsql本地连接]({{< relref "./docs/Quickstart/使用gsql本地连接.md >}}) + - [使用gsql远程连接]({{< relref "./docs/Quickstart/使用gsql远程连接.md >}}) + - [通过gs\_guc配置白名单]({{< relref "./docs/Quickstart/通过gs_guc配置白名单.md >}}) + - [安装gsql客户端并连接数据库]({{< relref "./docs/Quickstart/安装gsql客户端并连接数据库.md >}}) + - [简单数据管理]({{< relref "./docs/Quickstart/简单数据管理.md >}}) + - [创建数据库]({{< relref "./docs/Quickstart/创建数据库.md >}}) + - [创建表]({{< relref "./docs/Quickstart/创建表.md >}}) + - [查看对象]({{< relref "./docs/Quickstart/查看对象.md >}}) + - [简单权限管理]({{< relref "./docs/Quickstart/简单权限管理.md >}}) + - [创建角色]({{< relref "./docs/Quickstart/创建角色.md >}}) + - [创建用户]({{< relref "./docs/Quickstart/创建用户.md >}}) + - [权限赋予]({{< relref "./docs/Quickstart/权限赋予.md >}}) + - [通过客户端工具执行SQL]({{< relref "./docs/Quickstart/通过客户端工具执行SQL.md >}}) + - [执行单条SQL]({{< relref "./docs/Quickstart/执行单条SQL.md >}}) + - [执行批量文件]({{< relref "./docs/Quickstart/执行批量文件.md >}}) + - [通过JDBC执行SQL]({{< relref "./docs/Quickstart/通过JDBC执行SQL.md >}}) + - [JDBC包与驱动类]({{< relref "./docs/Quickstart/JDBC包与驱动类.md >}}) + - [加载驱动]({{< relref "./docs/Quickstart/加载驱动.md >}}) + - [连接数据库]({{< relref "./docs/Quickstart/连接数据库.md >}}) + - [示例]({{< relref "./docs/Quickstart/示例 -0.md >}}) + - [配置运行参数]({{< relref "./docs/Quickstart/配置运行参数.md >}}) + - [查看参数当前取值]({{< relref "./docs/Quickstart/查看参数当前取值.md >}}) + - [重设参数]({{< relref "./docs/Quickstart/重设参数.md >}}) + - [GUC参数说明]({{< relref "./docs/Quickstart/GUC参数说明.md >}}) + - [GUC使用说明]({{< relref "./docs/Quickstart/GUC使用说明.md >}}) + - [文件位置]({{< relref "./docs/Quickstart/文件位置.md >}}) + - [连接和认证]({{< relref "./docs/Quickstart/连接和认证.md >}}) + - [连接设置]({{< relref "./docs/Quickstart/连接设置.md >}}) + - [安全和认证(postgresql.conf)]({{< relref "./docs/Quickstart/安全和认证(postgresql -conf).md >}}) + - [通信库参数]({{< relref "./docs/Quickstart/通信库参数.md >}}) + - [资源消耗]({{< relref "./docs/Quickstart/资源消耗.md >}}) + - [内存]({{< relref "./docs/Quickstart/内存.md >}}) + - [磁盘空间]({{< relref "./docs/Quickstart/磁盘空间.md >}}) + - [内核资源使用]({{< relref "./docs/Quickstart/内核资源使用.md >}}) + - [基于开销的清理延迟]({{< relref "./docs/Quickstart/基于开销的清理延迟.md >}}) + - [后端写进程]({{< relref "./docs/Quickstart/后端写进程.md >}}) + - [异步IO]({{< relref "./docs/Quickstart/异步IO.md >}}) + - [并行导入]({{< relref "./docs/Quickstart/并行导入.md >}}) + - [预写式日志]({{< relref "./docs/Quickstart/预写式日志.md >}}) + - [设置]({{< relref "./docs/Quickstart/设置.md >}}) + - [检查点]({{< relref "./docs/Quickstart/检查点.md >}}) + - [日志回放]({{< relref "./docs/Quickstart/日志回放.md >}}) + - [归档]({{< relref "./docs/Quickstart/归档.md >}}) + - [双机复制]({{< relref "./docs/Quickstart/双机复制.md >}}) + - [发送端服务器]({{< relref "./docs/Quickstart/发送端服务器.md >}}) + - [主服务器]({{< relref "./docs/Quickstart/主服务器.md >}}) + - [备服务器]({{< relref "./docs/Quickstart/备服务器.md >}}) + - [查询规划]({{< relref "./docs/Quickstart/查询规划.md >}}) + - [优化器方法配置]({{< relref "./docs/Quickstart/优化器方法配置.md >}}) + - [优化器开销常量]({{< relref "./docs/Quickstart/优化器开销常量.md >}}) + - [基因查询优化器]({{< relref "./docs/Quickstart/基因查询优化器.md >}}) + - [其他优化器选项]({{< relref "./docs/Quickstart/其他优化器选项.md >}}) + - [错误报告和日志]({{< relref "./docs/Quickstart/错误报告和日志.md >}}) + - [记录日志的位置]({{< relref "./docs/Quickstart/记录日志的位置.md >}}) + - [记录日志的时间]({{< relref "./docs/Quickstart/记录日志的时间.md >}}) + - [记录日志的内容]({{< relref "./docs/Quickstart/记录日志的内容.md >}}) + - [使用CSV格式写日志]({{< relref "./docs/Quickstart/使用CSV格式写日志.md >}}) + - [告警检测]({{< relref "./docs/Quickstart/告警检测.md >}}) + - [运行时统计]({{< relref "./docs/Quickstart/运行时统计.md >}}) + - [查询和索引统计收集器]({{< relref "./docs/Quickstart/查询和索引统计收集器.md >}}) + - [性能统计]({{< relref "./docs/Quickstart/性能统计.md >}}) + - [负载管理]({{< relref "./docs/Quickstart/负载管理.md >}}) + - [自动清理]({{< relref "./docs/Quickstart/自动清理.md >}}) + - [客户端连接缺省设置]({{< relref "./docs/Quickstart/客户端连接缺省设置.md >}}) + - [语句行为]({{< relref "./docs/Quickstart/语句行为.md >}}) + - [区域和格式化]({{< relref "./docs/Quickstart/区域和格式化.md >}}) + - [其他缺省]({{< relref "./docs/Quickstart/其他缺省.md >}}) + - [锁管理]({{< relref "./docs/Quickstart/锁管理.md >}}) + - [版本和平台兼容性]({{< relref "./docs/Quickstart/版本和平台兼容性.md >}}) + - [历史版本兼容性]({{< relref "./docs/Quickstart/历史版本兼容性.md >}}) + - [平台和客户端兼容性]({{< relref "./docs/Quickstart/平台和客户端兼容性.md >}}) + - [容错性]({{< relref "./docs/Quickstart/容错性.md >}}) + - [openGauss事务]({{< relref "./docs/Quickstart/openGauss事务.md >}}) + - [开发人员选项]({{< relref "./docs/Quickstart/开发人员选项.md >}}) + - [审计]({{< relref "./docs/Quickstart/审计.md >}}) + - [审计开关]({{< relref "./docs/Quickstart/审计开关.md >}}) + - [用户和权限审计]({{< relref "./docs/Quickstart/用户和权限审计.md >}}) + - [操作审计]({{< relref "./docs/Quickstart/操作审计.md >}}) + - [事务监控]({{< relref "./docs/Quickstart/事务监控.md >}}) + - [升级参数]({{< relref "./docs/Quickstart/升级参数.md >}}) + - [其它选项]({{< relref "./docs/Quickstart/其它选项.md >}}) + - [等待事件]({{< relref "./docs/Quickstart/等待事件.md >}}) + - [Query]({{< relref "./docs/Quickstart/Query.md >}}) + - [系统性能快照]({{< relref "./docs/Quickstart/系统性能快照.md >}}) + - [FAQ]({{< relref "./docs/Quickstart/FAQ.md >}}) + - [用户在openGauss节点间的互信丢失]({{< relref "./docs/Quickstart/用户在openGauss节点间的互信丢失.md >}}) + + +- [安装指南]({{< relref "./docs/Installation/Installation.md >}}) + - [安装概述]({{< relref "./docs/Installation/安装概述.md >}}) + - [安装准备]({{< relref "./docs/Installation/安装准备.md >}}) + - [了解安装流程]({{< relref "./docs/Installation/了解安装流程.md >}}) + - [获取并校验安装包]({{< relref "./docs/Installation/获取并校验安装包.md >}}) + - [准备软硬件安装环境]({{< relref "./docs/Installation/准备软硬件安装环境.md >}}) + - [软硬件环境要求]({{< relref "./docs/Installation/软硬件环境要求.md >}}) + - [修改操作系统配置]({{< relref "./docs/Installation/修改操作系统配置.md >}}) + - [关闭操作系统防火墙]({{< relref "./docs/Installation/关闭操作系统防火墙.md >}}) + - [设置字符集参数]({{< relref "./docs/Installation/设置字符集参数.md >}}) + - [设置时区和时间]({{< relref "./docs/Installation/设置时区和时间.md >}}) + - [关闭swap交换内存]({{< relref "./docs/Installation/关闭swap交换内存.md >}}) + - [设置网卡MTU值]({{< relref "./docs/Installation/设置网卡MTU值.md >}}) + - [设置root用户远程登录]({{< relref "./docs/Installation/设置root用户远程登录.md >}}) + - [了解安装用户及用户组]({{< relref "./docs/Installation/了解安装用户及用户组.md >}}) + - [安装openGauss]({{< relref "./docs/Installation/安装openGauss.md >}}) + - [创建XML配置文件]({{< relref "./docs/Installation/创建XML配置文件.md >}}) + - [配置数据库名称及各项目录]({{< relref "./docs/Installation/配置数据库名称及各项目录.md >}}) + - [配置Host基本信息]({{< relref "./docs/Installation/配置Host基本信息.md >}}) + - [配置数据库主节点信息]({{< relref "./docs/Installation/配置数据库主节点信息.md >}}) + - [示例]({{< relref "./docs/Installation/示例.md >}}) + - [单节点配置文件]({{< relref "./docs/Installation/单节点配置文件.md >}}) + - [一主一备配置文件]({{< relref "./docs/Installation/一主一备配置文件.md >}}) + - [初始化安装环境]({{< relref "./docs/Installation/初始化安装环境.md >}}) + - [准备安装用户及环境]({{< relref "./docs/Installation/准备安装用户及环境.md >}}) + - [手工建立互信]({{< relref "./docs/Installation/手工建立互信.md >}}) + - [配置操作系统参数]({{< relref "./docs/Installation/配置操作系统参数.md >}}) + - [执行安装]({{< relref "./docs/Installation/执行安装.md >}}) + - [(可选)设置备机可读]({{< relref "./docs/Installation/(可选)设置备机可读.md >}}) + - [安装验证]({{< relref "./docs/Installation/安装验证.md >}}) + - [检查openGauss健康状态]({{< relref "./docs/Installation/检查openGauss健康状态.md >}}) + - [初始配置]({{< relref "./docs/Installation/初始配置.md >}}) + - [配置区域和字符集]({{< relref "./docs/Installation/配置区域和字符集.md >}}) + - [卸载openGauss]({{< relref "./docs/Installation/卸载openGauss.md >}}) + - [执行卸载]({{< relref "./docs/Installation/执行卸载.md >}}) + - [一键式环境清理]({{< relref "./docs/Installation/一键式环境清理.md >}}) + +- [开发者指南]({{< relref "./docs/Developerguide/Developerguide.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述.md >}}) + - [数据库逻辑结构图]({{< relref "./docs/Developerguide/数据库逻辑结构图.md >}}) + - [数据查询请求处理过程]({{< relref "./docs/Developerguide/数据查询请求处理过程.md >}}) + - [管理事务]({{< relref "./docs/Developerguide/管理事务.md >}}) + - [相关概念]({{< relref "./docs/Developerguide/相关概念.md >}}) + - [数据库使用]({{< relref "./docs/Developerguide/数据库使用.md >}}) + - [从这里开始]({{< relref "./docs/Developerguide/从这里开始.md >}}) + - [连接数据库]({{< relref "./docs/Developerguide/连接数据库.md >}}) + - [确认连接信息]({{< relref "./docs/Developerguide/确认连接信息.md >}}) + - [配置服务端远程连接]({{< relref "./docs/Developerguide/配置服务端远程连接.md >}}) + - [使用gsql连接]({{< relref "./docs/Developerguide/使用gsql连接.md >}}) + - [应用程序接口]({{< relref "./docs/Developerguide/应用程序接口.md >}}) + - [创建和管理数据库]({{< relref "./docs/Developerguide/创建和管理数据库.md >}}) + - [规划存储模型]({{< relref "./docs/Developerguide/规划存储模型.md >}}) + - [创建和管理表空间]({{< relref "./docs/Developerguide/创建和管理表空间.md >}}) + - [创建和管理表]({{< relref "./docs/Developerguide/创建和管理表.md >}}) + - [创建表]({{< relref "./docs/Developerguide/创建表.md >}}) + - [向表中插入数据]({{< relref "./docs/Developerguide/向表中插入数据.md >}}) + - [更新表中数据]({{< relref "./docs/Developerguide/更新表中数据.md >}}) + - [查看数据]({{< relref "./docs/Developerguide/查看数据.md >}}) + - [删除表中数据]({{< relref "./docs/Developerguide/删除表中数据.md >}}) + - [查看系统表]({{< relref "./docs/Developerguide/查看系统表.md >}}) + - [其他操作]({{< relref "./docs/Developerguide/其他操作.md >}}) + - [创建和管理schema]({{< relref "./docs/Developerguide/创建和管理schema.md >}}) + - [创建和管理分区表]({{< relref "./docs/Developerguide/创建和管理分区表.md >}}) + - [创建和管理索引]({{< relref "./docs/Developerguide/创建和管理索引.md >}}) + - [创建和管理视图]({{< relref "./docs/Developerguide/创建和管理视图.md >}}) + - [创建和管理序列]({{< relref "./docs/Developerguide/创建和管理序列.md >}}) + - [附录]({{< relref "./docs/Developerguide/附录.md >}}) + - [客户端接入认证]({{< relref "./docs/Developerguide/客户端接入认证.md >}}) + - [配置客户端接入认证]({{< relref "./docs/Developerguide/配置客户端接入认证.md >}}) + - [配置文件参考]({{< relref "./docs/Developerguide/配置文件参考.md >}}) + - [用SSL进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSL进行安全的TCP -IP连接.md >}}) + - [用SSH隧道进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSH隧道进行安全的TCP -IP连接.md >}}) + - [查看数据库连接数]({{< relref "./docs/Developerguide/查看数据库连接数.md >}}) + - [SSL证书管理]({{< relref "./docs/Developerguide/SSL证书管理.md >}}) + - [证书生成]({{< relref "./docs/Developerguide/证书生成.md >}}) + - [证书替换]({{< relref "./docs/Developerguide/证书替换.md >}}) + - [设置文件权限安全策略]({{< relref "./docs/Developerguide/设置文件权限安全策略.md >}}) + - [管理数据库安全]({{< relref "./docs/Developerguide/管理数据库安全.md >}}) + - [客户端接入认证]({{< relref "./docs/Developerguide/客户端接入认证 -0.md >}}) + - [配置客户端接入认证]({{< relref "./docs/Developerguide/配置客户端接入认证 -1.md >}}) + - [配置文件参考]({{< relref "./docs/Developerguide/配置文件参考 -2.md >}}) + - [用SSL进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSL进行安全的TCP -IP连接 -3.md >}}) + - [用SSH隧道进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSH隧道进行安全的TCP -IP连接 -4.md >}}) + - [查看数据库连接数]({{< relref "./docs/Developerguide/查看数据库连接数 -5.md >}}) + - [SSL证书管理]({{< relref "./docs/Developerguide/SSL证书管理 -6.md >}}) + - [证书生成]({{< relref "./docs/Developerguide/证书生成 -7.md >}}) + - [证书替换]({{< relref "./docs/Developerguide/证书替换 -8.md >}}) + - [管理用户及权限]({{< relref "./docs/Developerguide/管理用户及权限.md >}}) + - [默认权限机制]({{< relref "./docs/Developerguide/默认权限机制.md >}}) + - [管理员]({{< relref "./docs/Developerguide/管理员.md >}}) + - [三权分立]({{< relref "./docs/Developerguide/三权分立.md >}}) + - [用户]({{< relref "./docs/Developerguide/用户.md >}}) + - [角色]({{< relref "./docs/Developerguide/角色.md >}}) + - [Schema]({{< relref "./docs/Developerguide/Schema.md >}}) + - [用户权限设置]({{< relref "./docs/Developerguide/用户权限设置.md >}}) + - [行级访问控制]({{< relref "./docs/Developerguide/行级访问控制.md >}}) + - [设置安全策略]({{< relref "./docs/Developerguide/设置安全策略.md >}}) + - [设置帐户安全策略]({{< relref "./docs/Developerguide/设置帐户安全策略.md >}}) + - [设置帐号有效期]({{< relref "./docs/Developerguide/设置帐号有效期.md >}}) + - [设置密码安全策略]({{< relref "./docs/Developerguide/设置密码安全策略.md >}}) + - [设置数据库审计]({{< relref "./docs/Developerguide/设置数据库审计.md >}}) + - [审计概述]({{< relref "./docs/Developerguide/审计概述.md >}}) + - [查看审计结果]({{< relref "./docs/Developerguide/查看审计结果.md >}}) + - [维护审计日志]({{< relref "./docs/Developerguide/维护审计日志.md >}}) + - [设置文件权限安全策略]({{< relref "./docs/Developerguide/设置文件权限安全策略 -9.md >}}) + - [接口参考]({{< relref "./docs/Developerguide/接口参考.md >}}) + - [JDBC]({{< relref "./docs/Developerguide/JDBC.md >}}) + - [java.sql.Connection]({{< relref "./docs/Developerguide/java -sql -Connection.md >}}) + - [java.sql.CallableStatement]({{< relref "./docs/Developerguide/java -sql -CallableStatement.md >}}) + - [java.sql.DatabaseMetaData]({{< relref "./docs/Developerguide/java -sql -DatabaseMetaData.md >}}) + - [java.sql.Driver]({{< relref "./docs/Developerguide/java -sql -Driver.md >}}) + - [java.sql.PreparedStatement]({{< relref "./docs/Developerguide/java -sql -PreparedStatement.md >}}) + - [java.sql.ResultSet]({{< relref "./docs/Developerguide/java -sql -ResultSet.md >}}) + - [java.sql.ResultSetMetaData]({{< relref "./docs/Developerguide/java -sql -ResultSetMetaData.md >}}) + - [java.sql.Statement]({{< relref "./docs/Developerguide/java -sql -Statement.md >}}) + - [javax.sql.ConnectionPoolDataSource]({{< relref "./docs/Developerguide/javax -sql -ConnectionPoolDataSource.md >}}) + - [javax.sql.DataSource]({{< relref "./docs/Developerguide/javax -sql -DataSource.md >}}) + - [javax.sql.PooledConnection]({{< relref "./docs/Developerguide/javax -sql -PooledConnection.md >}}) + - [javax.naming.Context]({{< relref "./docs/Developerguide/javax -naming -Context.md >}}) + - [javax.naming.spi.InitialContextFactory]({{< relref "./docs/Developerguide/javax -naming -spi -InitialContextFactory.md >}}) + - [CopyManager]({{< relref "./docs/Developerguide/CopyManager.md >}}) + - [ODBC]({{< relref "./docs/Developerguide/ODBC.md >}}) + - [SQLAllocEnv]({{< relref "./docs/Developerguide/SQLAllocEnv.md >}}) + - [SQLAllocConnect]({{< relref "./docs/Developerguide/SQLAllocConnect.md >}}) + - [SQLAllocHandle]({{< relref "./docs/Developerguide/SQLAllocHandle.md >}}) + - [SQLAllocStmt]({{< relref "./docs/Developerguide/SQLAllocStmt.md >}}) + - [SQLBindCol]({{< relref "./docs/Developerguide/SQLBindCol.md >}}) + - [SQLBindParameter]({{< relref "./docs/Developerguide/SQLBindParameter.md >}}) + - [SQLColAttribute]({{< relref "./docs/Developerguide/SQLColAttribute.md >}}) + - [SQLConnect]({{< relref "./docs/Developerguide/SQLConnect.md >}}) + - [SQLDisconnect]({{< relref "./docs/Developerguide/SQLDisconnect.md >}}) + - [SQLExecDirect]({{< relref "./docs/Developerguide/SQLExecDirect.md >}}) + - [SQLExecute]({{< relref "./docs/Developerguide/SQLExecute.md >}}) + - [SQLFetch]({{< relref "./docs/Developerguide/SQLFetch.md >}}) + - [SQLFreeStmt]({{< relref "./docs/Developerguide/SQLFreeStmt.md >}}) + - [SQLFreeConnect]({{< relref "./docs/Developerguide/SQLFreeConnect.md >}}) + - [SQLFreeHandle]({{< relref "./docs/Developerguide/SQLFreeHandle.md >}}) + - [SQLFreeEnv]({{< relref "./docs/Developerguide/SQLFreeEnv.md >}}) + - [SQLPrepare]({{< relref "./docs/Developerguide/SQLPrepare.md >}}) + - [SQLGetData]({{< relref "./docs/Developerguide/SQLGetData.md >}}) + - [SQLGetDiagRec]({{< relref "./docs/Developerguide/SQLGetDiagRec.md >}}) + - [SQLSetConnectAttr]({{< relref "./docs/Developerguide/SQLSetConnectAttr.md >}}) + - [SQLSetEnvAttr]({{< relref "./docs/Developerguide/SQLSetEnvAttr.md >}}) + - [SQLSetStmtAttr]({{< relref "./docs/Developerguide/SQLSetStmtAttr.md >}}) + - [示例]({{< relref "./docs/Developerguide/示例.md >}}) + - [libpq]({{< relref "./docs/Developerguide/libpq.md >}}) + - [数据库连接控制函数]({{< relref "./docs/Developerguide/数据库连接控制函数.md >}}) + - [PQconnectdbParams]({{< relref "./docs/Developerguide/PQconnectdbParams.md >}}) + - [PQconnectdb]({{< relref "./docs/Developerguide/PQconnectdb.md >}}) + - [PQconninfoParse]({{< relref "./docs/Developerguide/PQconninfoParse.md >}}) + - [PQconnectStart]({{< relref "./docs/Developerguide/PQconnectStart.md >}}) + - [PQerrorMessage]({{< relref "./docs/Developerguide/PQerrorMessage.md >}}) + - [PQsetdbLogin]({{< relref "./docs/Developerguide/PQsetdbLogin.md >}}) + - [PQfinish]({{< relref "./docs/Developerguide/PQfinish.md >}}) + - [PQreset]({{< relref "./docs/Developerguide/PQreset.md >}}) + - [PQstatus]({{< relref "./docs/Developerguide/PQstatus.md >}}) + - [数据库执行语句函数]({{< relref "./docs/Developerguide/数据库执行语句函数.md >}}) + - [PQclear]({{< relref "./docs/Developerguide/PQclear.md >}}) + - [PQexec]({{< relref "./docs/Developerguide/PQexec.md >}}) + - [PQexecParams]({{< relref "./docs/Developerguide/PQexecParams.md >}}) + - [PQexecParamsBatch]({{< relref "./docs/Developerguide/PQexecParamsBatch.md >}}) + - [PQexecPrepared]({{< relref "./docs/Developerguide/PQexecPrepared.md >}}) + - [PQexecPreparedBatch]({{< relref "./docs/Developerguide/PQexecPreparedBatch.md >}}) + - [PQfname]({{< relref "./docs/Developerguide/PQfname.md >}}) + - [PQgetvalue]({{< relref "./docs/Developerguide/PQgetvalue.md >}}) + - [PQnfields]({{< relref "./docs/Developerguide/PQnfields.md >}}) + - [PQntuples]({{< relref "./docs/Developerguide/PQntuples.md >}}) + - [PQprepare]({{< relref "./docs/Developerguide/PQprepare.md >}}) + - [PQresultStatus]({{< relref "./docs/Developerguide/PQresultStatus.md >}}) + - [异步命令处理]({{< relref "./docs/Developerguide/异步命令处理.md >}}) + - [PQsendQuery]({{< relref "./docs/Developerguide/PQsendQuery.md >}}) + - [PQsendQueryParams]({{< relref "./docs/Developerguide/PQsendQueryParams.md >}}) + - [PQsendPrepare]({{< relref "./docs/Developerguide/PQsendPrepare.md >}}) + - [PQsendQueryPrepared]({{< relref "./docs/Developerguide/PQsendQueryPrepared.md >}}) + - [PQflush]({{< relref "./docs/Developerguide/PQflush.md >}}) + - [取消正在处理的查询]({{< relref "./docs/Developerguide/取消正在处理的查询.md >}}) + - [PQgetCancel]({{< relref "./docs/Developerguide/PQgetCancel.md >}}) + - [PQfreeCancel]({{< relref "./docs/Developerguide/PQfreeCancel.md >}}) + - [PQcancel]({{< relref "./docs/Developerguide/PQcancel.md >}}) + - [示例]({{< relref "./docs/Developerguide/示例 -10.md >}}) + - [链接字符]({{< relref "./docs/Developerguide/链接字符.md >}}) + - [导入数据]({{< relref "./docs/Developerguide/导入数据.md >}}) + - [通过INSERT语句直接写入数据]({{< relref "./docs/Developerguide/通过INSERT语句直接写入数据.md >}}) + - [使用COPY FROM STDIN导入数据]({{< relref "./docs/Developerguide/使用COPY -FROM -STDIN导入数据.md >}}) + - [关于COPY FROM STDIN导入数据]({{< relref "./docs/Developerguide/关于COPY -FROM -STDIN导入数据.md >}}) + - [CopyManager类简介]({{< relref "./docs/Developerguide/CopyManager类简介.md >}}) + - [示例1:通过本地文件导入导出数据]({{< relref "./docs/Developerguide/示例1 -通过本地文件导入导出数据.md >}}) + - [示例2:从MySQL向openGauss进行数据迁移]({{< relref "./docs/Developerguide/示例2 -从MySQL向openGauss进行数据迁移.md >}}) + - [使用gsql元命令导入数据]({{< relref "./docs/Developerguide/使用gsql元命令导入数据.md >}}) + - [使用gs\_restore命令导入数据]({{< relref "./docs/Developerguide/使用gs_restore命令导入数据.md >}}) + - [更新表中数据]({{< relref "./docs/Developerguide/更新表中数据 -11.md >}}) + - [使用DML命令更新表]({{< relref "./docs/Developerguide/使用DML命令更新表.md >}}) + - [使用合并方式更新和插入数据]({{< relref "./docs/Developerguide/使用合并方式更新和插入数据.md >}}) + - [深层复制]({{< relref "./docs/Developerguide/深层复制.md >}}) + - [使用CREATE TABLE执行深层复制]({{< relref "./docs/Developerguide/使用CREATE -TABLE执行深层复制.md >}}) + - [使用CREATE TABLE LIKE执行深层复制]({{< relref "./docs/Developerguide/使用CREATE -TABLE -LIKE执行深层复制.md >}}) + - [通过创建临时表并截断原始表来执行深层复制]({{< relref "./docs/Developerguide/通过创建临时表并截断原始表来执行深层复制.md >}}) + - [分析表]({{< relref "./docs/Developerguide/分析表.md >}}) + - [对表执行VACUUM]({{< relref "./docs/Developerguide/对表执行VACUUM.md >}}) + - [管理并发写入操作]({{< relref "./docs/Developerguide/管理并发写入操作.md >}}) + - [事务隔离说明]({{< relref "./docs/Developerguide/事务隔离说明.md >}}) + - [写入和读写操作]({{< relref "./docs/Developerguide/写入和读写操作.md >}}) + - [并发写入事务的潜在死锁情况]({{< relref "./docs/Developerguide/并发写入事务的潜在死锁情况.md >}}) + - [并发写入示例]({{< relref "./docs/Developerguide/并发写入示例.md >}}) + - [相同表的INSERT和DELETE并发]({{< relref "./docs/Developerguide/相同表的INSERT和DELETE并发.md >}}) + - [相同表的并发INSERT]({{< relref "./docs/Developerguide/相同表的并发INSERT.md >}}) + - [相同表的并发UPDATE]({{< relref "./docs/Developerguide/相同表的并发UPDATE.md >}}) + - [数据导入和查询的并发]({{< relref "./docs/Developerguide/数据导入和查询的并发.md >}}) + - [导出数据]({{< relref "./docs/Developerguide/导出数据.md >}}) + - [使用gs\_dump和gs\_dumpall命令导出数据]({{< relref "./docs/Developerguide/使用gs_dump和gs_dumpall命令导出数据.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述 -12.md >}}) + - [导出单个数据库]({{< relref "./docs/Developerguide/导出单个数据库.md >}}) + - [导出数据库]({{< relref "./docs/Developerguide/导出数据库.md >}}) + - [导出模式]({{< relref "./docs/Developerguide/导出模式.md >}}) + - [导出表]({{< relref "./docs/Developerguide/导出表.md >}}) + - [导出所有数据库]({{< relref "./docs/Developerguide/导出所有数据库.md >}}) + - [导出所有数据库]({{< relref "./docs/Developerguide/导出所有数据库 -13.md >}}) + - [导出全局对象]({{< relref "./docs/Developerguide/导出全局对象.md >}}) + - [无权限角色导出数据]({{< relref "./docs/Developerguide/无权限角色导出数据.md >}}) + - [AI特性]({{< relref "./docs/Developerguide/AI特性.md >}}) + - [SQL执行时间预测特性]({{< relref "./docs/Developerguide/SQL执行时间预测特性.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述 -14.md >}}) + - [使用指南]({{< relref "./docs/Developerguide/使用指南.md >}}) + - [最佳实践]({{< relref "./docs/Developerguide/最佳实践.md >}}) + - [常见问题处理]({{< relref "./docs/Developerguide/常见问题处理.md >}}) + - [配置运行参数]({{< relref "./docs/Developerguide/配置运行参数.md >}}) + - [查看参数当前取值]({{< relref "./docs/Developerguide/查看参数当前取值.md >}}) + - [重设参数]({{< relref "./docs/Developerguide/重设参数.md >}}) + - [SQL参考]({{< relref "./docs/Developerguide/SQL参考.md >}}) + - [openGauss SQL]({{< relref "./docs/Developerguide/openGauss -SQL.md >}}) + - [关键字]({{< relref "./docs/Developerguide/关键字.md >}}) + - [数据类型]({{< relref "./docs/Developerguide/数据类型.md >}}) + - [数值类型]({{< relref "./docs/Developerguide/数值类型.md >}}) + - [货币类型]({{< relref "./docs/Developerguide/货币类型.md >}}) + - [布尔类型]({{< relref "./docs/Developerguide/布尔类型.md >}}) + - [字符类型]({{< relref "./docs/Developerguide/字符类型.md >}}) + - [二进制类型]({{< relref "./docs/Developerguide/二进制类型.md >}}) + - [日期/时间类型]({{< relref "./docs/Developerguide/日期 -时间类型.md >}}) + - [几何类型]({{< relref "./docs/Developerguide/几何类型.md >}}) + - [网络地址类型]({{< relref "./docs/Developerguide/网络地址类型.md >}}) + - [位串类型]({{< relref "./docs/Developerguide/位串类型.md >}}) + - [文本搜索类型]({{< relref "./docs/Developerguide/文本搜索类型.md >}}) + - [UUID类型]({{< relref "./docs/Developerguide/UUID类型.md >}}) + - [JSON类型]({{< relref "./docs/Developerguide/JSON类型.md >}}) + - [对象标识符类型]({{< relref "./docs/Developerguide/对象标识符类型.md >}}) + - [伪类型]({{< relref "./docs/Developerguide/伪类型.md >}}) + - [列存表支持的数据类型]({{< relref "./docs/Developerguide/列存表支持的数据类型.md >}}) + - [常量与宏]({{< relref "./docs/Developerguide/常量与宏.md >}}) + - [函数和操作符]({{< relref "./docs/Developerguide/函数和操作符.md >}}) + - [逻辑操作符]({{< relref "./docs/Developerguide/逻辑操作符.md >}}) + - [比较操作符]({{< relref "./docs/Developerguide/比较操作符.md >}}) + - [字符处理函数和操作符]({{< relref "./docs/Developerguide/字符处理函数和操作符.md >}}) + - [二进制字符串函数和操作符]({{< relref "./docs/Developerguide/二进制字符串函数和操作符.md >}}) + - [位串函数和操作符]({{< relref "./docs/Developerguide/位串函数和操作符.md >}}) + - [模式匹配操作符]({{< relref "./docs/Developerguide/模式匹配操作符.md >}}) + - [数字操作函数和操作符]({{< relref "./docs/Developerguide/数字操作函数和操作符.md >}}) + - [时间和日期处理函数和操作符]({{< relref "./docs/Developerguide/时间和日期处理函数和操作符.md >}}) + - [类型转换函数]({{< relref "./docs/Developerguide/类型转换函数.md >}}) + - [几何函数和操作符]({{< relref "./docs/Developerguide/几何函数和操作符.md >}}) + - [网络地址函数和操作符]({{< relref "./docs/Developerguide/网络地址函数和操作符.md >}}) + - [文本检索函数和操作符]({{< relref "./docs/Developerguide/文本检索函数和操作符.md >}}) + - [JSON函数]({{< relref "./docs/Developerguide/JSON函数.md >}}) + - [SEQUENCE函数]({{< relref "./docs/Developerguide/SEQUENCE函数.md >}}) + - [数组函数和操作符]({{< relref "./docs/Developerguide/数组函数和操作符.md >}}) + - [范围函数和操作符]({{< relref "./docs/Developerguide/范围函数和操作符.md >}}) + - [聚集函数]({{< relref "./docs/Developerguide/聚集函数.md >}}) + - [窗口函数]({{< relref "./docs/Developerguide/窗口函数.md >}}) + - [安全函数]({{< relref "./docs/Developerguide/安全函数.md >}}) + - [返回集合的函数]({{< relref "./docs/Developerguide/返回集合的函数.md >}}) + - [条件表达式函数]({{< relref "./docs/Developerguide/条件表达式函数.md >}}) + - [系统信息函数]({{< relref "./docs/Developerguide/系统信息函数.md >}}) + - [系统管理函数]({{< relref "./docs/Developerguide/系统管理函数.md >}}) + - [配置设置函数]({{< relref "./docs/Developerguide/配置设置函数.md >}}) + - [通用文件访问函数]({{< relref "./docs/Developerguide/通用文件访问函数.md >}}) + - [服务器信号函数]({{< relref "./docs/Developerguide/服务器信号函数.md >}}) + - [备份恢复控制函数]({{< relref "./docs/Developerguide/备份恢复控制函数.md >}}) + - [快照同步函数]({{< relref "./docs/Developerguide/快照同步函数.md >}}) + - [数据库对象函数]({{< relref "./docs/Developerguide/数据库对象函数.md >}}) + - [咨询锁函数]({{< relref "./docs/Developerguide/咨询锁函数.md >}}) + - [逻辑复制函数]({{< relref "./docs/Developerguide/逻辑复制函数.md >}}) + - [其它函数]({{< relref "./docs/Developerguide/其它函数.md >}}) + - [统计信息函数]({{< relref "./docs/Developerguide/统计信息函数.md >}}) + - [触发器函数]({{< relref "./docs/Developerguide/触发器函数.md >}}) + - [内部接口函数]({{< relref "./docs/Developerguide/内部接口函数.md >}}) + - [表达式]({{< relref "./docs/Developerguide/表达式.md >}}) + - [简单表达式]({{< relref "./docs/Developerguide/简单表达式.md >}}) + - [条件表达式]({{< relref "./docs/Developerguide/条件表达式.md >}}) + - [子查询表达式]({{< relref "./docs/Developerguide/子查询表达式.md >}}) + - [数组表达式]({{< relref "./docs/Developerguide/数组表达式.md >}}) + - [行表达式]({{< relref "./docs/Developerguide/行表达式.md >}}) + - [类型转换]({{< relref "./docs/Developerguide/类型转换.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述 -15.md >}}) + - [操作符]({{< relref "./docs/Developerguide/操作符.md >}}) + - [函数]({{< relref "./docs/Developerguide/函数.md >}}) + - [值存储]({{< relref "./docs/Developerguide/值存储.md >}}) + - [UNION,CASE和相关构造]({{< relref "./docs/Developerguide/UNION -CASE和相关构造.md >}}) + - [全文检索]({{< relref "./docs/Developerguide/全文检索.md >}}) + - [介绍]({{< relref "./docs/Developerguide/介绍.md >}}) + - [全文检索概述]({{< relref "./docs/Developerguide/全文检索概述.md >}}) + - [文档概念]({{< relref "./docs/Developerguide/文档概念.md >}}) + - [基本文本匹配]({{< relref "./docs/Developerguide/基本文本匹配.md >}}) + - [分词器]({{< relref "./docs/Developerguide/分词器.md >}}) + - [表和索引]({{< relref "./docs/Developerguide/表和索引.md >}}) + - [搜索表]({{< relref "./docs/Developerguide/搜索表.md >}}) + - [创建索引]({{< relref "./docs/Developerguide/创建索引.md >}}) + - [索引使用约束]({{< relref "./docs/Developerguide/索引使用约束.md >}}) + - [控制文本搜索]({{< relref "./docs/Developerguide/控制文本搜索.md >}}) + - [解析文档]({{< relref "./docs/Developerguide/解析文档.md >}}) + - [解析查询]({{< relref "./docs/Developerguide/解析查询.md >}}) + - [排序查询结果]({{< relref "./docs/Developerguide/排序查询结果.md >}}) + - [高亮搜索结果]({{< relref "./docs/Developerguide/高亮搜索结果.md >}}) + - [附加功能]({{< relref "./docs/Developerguide/附加功能.md >}}) + - [处理tsvector]({{< relref "./docs/Developerguide/处理tsvector.md >}}) + - [处理查询]({{< relref "./docs/Developerguide/处理查询.md >}}) + - [查询重写]({{< relref "./docs/Developerguide/查询重写.md >}}) + - [收集文献统计]({{< relref "./docs/Developerguide/收集文献统计.md >}}) + - [解析器]({{< relref "./docs/Developerguide/解析器.md >}}) + - [词典]({{< relref "./docs/Developerguide/词典.md >}}) + - [词典概述]({{< relref "./docs/Developerguide/词典概述.md >}}) + - [停用词]({{< relref "./docs/Developerguide/停用词.md >}}) + - [Simple词典]({{< relref "./docs/Developerguide/Simple词典.md >}}) + - [Synonym词典]({{< relref "./docs/Developerguide/Synonym词典.md >}}) + - [Thesaurus词典]({{< relref "./docs/Developerguide/Thesaurus词典.md >}}) + - [Ispell词典]({{< relref "./docs/Developerguide/Ispell词典.md >}}) + - [Snowball词典]({{< relref "./docs/Developerguide/Snowball词典.md >}}) + - [配置示例]({{< relref "./docs/Developerguide/配置示例.md >}}) + - [测试和调试文本搜索]({{< relref "./docs/Developerguide/测试和调试文本搜索.md >}}) + - [分词器测试]({{< relref "./docs/Developerguide/分词器测试.md >}}) + - [解析器测试]({{< relref "./docs/Developerguide/解析器测试.md >}}) + - [词典测试]({{< relref "./docs/Developerguide/词典测试.md >}}) + - [限制约束]({{< relref "./docs/Developerguide/限制约束.md >}}) + - [系统操作]({{< relref "./docs/Developerguide/系统操作.md >}}) + - [事务控制]({{< relref "./docs/Developerguide/事务控制.md >}}) + - [DDL语法一览表]({{< relref "./docs/Developerguide/DDL语法一览表.md >}}) + - [DML语法一览表]({{< relref "./docs/Developerguide/DML语法一览表.md >}}) + - [DCL语法一览表]({{< relref "./docs/Developerguide/DCL语法一览表.md >}}) + - [SQL语法]({{< relref "./docs/Developerguide/SQL语法.md >}}) + - [ABORT]({{< relref "./docs/Developerguide/ABORT.md >}}) + - [ALTER DATABASE]({{< relref "./docs/Developerguide/ALTER -DATABASE.md >}}) + - [ALTER DATA SOURCE]({{< relref "./docs/Developerguide/ALTER -DATA -SOURCE.md >}}) + - [ALTER DEFAULT PRIVILEGES]({{< relref "./docs/Developerguide/ALTER -DEFAULT -PRIVILEGES.md >}}) + - [ALTER DIRECTORY]({{< relref "./docs/Developerguide/ALTER -DIRECTORY.md >}}) + - [ALTER FUNCTION]({{< relref "./docs/Developerguide/ALTER -FUNCTION.md >}}) + - [ALTER GROUP]({{< relref "./docs/Developerguide/ALTER -GROUP.md >}}) + - [ALTER INDEX]({{< relref "./docs/Developerguide/ALTER -INDEX.md >}}) + - [ALTER LARGE OBJECT]({{< relref "./docs/Developerguide/ALTER -LARGE -OBJECT.md >}}) + - [ALTER ROLE]({{< relref "./docs/Developerguide/ALTER -ROLE.md >}}) + - [ALTER ROW LEVEL SECURITY POLICY]({{< relref "./docs/Developerguide/ALTER -ROW -LEVEL -SECURITY -POLICY.md >}}) + - [ALTER SCHEMA]({{< relref "./docs/Developerguide/ALTER -SCHEMA.md >}}) + - [ALTER SEQUENCE]({{< relref "./docs/Developerguide/ALTER -SEQUENCE.md >}}) + - [ALTER SESSION]({{< relref "./docs/Developerguide/ALTER -SESSION.md >}}) + - [ALTER SYSTEM KILL SESSION]({{< relref "./docs/Developerguide/ALTER -SYSTEM -KILL -SESSION.md >}}) + - [ALTER TABLE]({{< relref "./docs/Developerguide/ALTER -TABLE.md >}}) + - [ALTER TABLE PARTITION]({{< relref "./docs/Developerguide/ALTER -TABLE -PARTITION.md >}}) + - [ALTER TABLESPACE]({{< relref "./docs/Developerguide/ALTER -TABLESPACE.md >}}) + - [ALTER TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/ALTER -TEXT -SEARCH -CONFIGURATION.md >}}) + - [ALTER TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/ALTER -TEXT -SEARCH -DICTIONARY.md >}}) + - [ALTER TRIGGER]({{< relref "./docs/Developerguide/ALTER -TRIGGER.md >}}) + - [ALTER TYPE]({{< relref "./docs/Developerguide/ALTER -TYPE.md >}}) + - [ALTER USER]({{< relref "./docs/Developerguide/ALTER -USER.md >}}) + - [ALTER VIEW]({{< relref "./docs/Developerguide/ALTER -VIEW.md >}}) + - [ANALYZE | ANALYSE]({{< relref "./docs/Developerguide/ANALYZE -ANALYSE.md >}}) + - [BEGIN]({{< relref "./docs/Developerguide/BEGIN.md >}}) + - [CALL]({{< relref "./docs/Developerguide/CALL.md >}}) + - [CHECKPOINT]({{< relref "./docs/Developerguide/CHECKPOINT.md >}}) + - [CLOSE]({{< relref "./docs/Developerguide/CLOSE.md >}}) + - [CLUSTER]({{< relref "./docs/Developerguide/CLUSTER.md >}}) + - [COMMENT]({{< relref "./docs/Developerguide/COMMENT.md >}}) + - [COMMIT | END]({{< relref "./docs/Developerguide/COMMIT -END.md >}}) + - [COMMIT PREPARED]({{< relref "./docs/Developerguide/COMMIT -PREPARED.md >}}) + - [COPY]({{< relref "./docs/Developerguide/COPY.md >}}) + - [CREATE DATABASE]({{< relref "./docs/Developerguide/CREATE -DATABASE.md >}}) + - [CREATE DATA SOURCE]({{< relref "./docs/Developerguide/CREATE -DATA -SOURCE.md >}}) + - [CREATE DIRECTORY]({{< relref "./docs/Developerguide/CREATE -DIRECTORY.md >}}) + - [CREATE FUNCTION]({{< relref "./docs/Developerguide/CREATE -FUNCTION.md >}}) + - [CREATE GROUP]({{< relref "./docs/Developerguide/CREATE -GROUP.md >}}) + - [CREATE INDEX]({{< relref "./docs/Developerguide/CREATE -INDEX.md >}}) + - [CREATE ROW LEVLEL SECURITY POLICY]({{< relref "./docs/Developerguide/CREATE -ROW -LEVLEL -SECURITY -POLICY.md >}}) + - [CREATE PROCEDURE]({{< relref "./docs/Developerguide/CREATE -PROCEDURE.md >}}) + - [CREATE ROLE]({{< relref "./docs/Developerguide/CREATE -ROLE.md >}}) + - [CREATE SCHEMA]({{< relref "./docs/Developerguide/CREATE -SCHEMA.md >}}) + - [CREATE SEQUENCE]({{< relref "./docs/Developerguide/CREATE -SEQUENCE.md >}}) + - [CREATE TABLE]({{< relref "./docs/Developerguide/CREATE -TABLE.md >}}) + - [CREATE TABLE AS]({{< relref "./docs/Developerguide/CREATE -TABLE -AS.md >}}) + - [CREATE TABLE PARTITION]({{< relref "./docs/Developerguide/CREATE -TABLE -PARTITION.md >}}) + - [CREATE TABLESPACE]({{< relref "./docs/Developerguide/CREATE -TABLESPACE.md >}}) + - [CREATE TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/CREATE -TEXT -SEARCH -CONFIGURATION.md >}}) + - [CREATE TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/CREATE -TEXT -SEARCH -DICTIONARY.md >}}) + - [CREATE TRIGGER]({{< relref "./docs/Developerguide/CREATE -TRIGGER.md >}}) + - [CREATE TYPE]({{< relref "./docs/Developerguide/CREATE -TYPE.md >}}) + - [CREATE USER]({{< relref "./docs/Developerguide/CREATE -USER.md >}}) + - [CREATE VIEW]({{< relref "./docs/Developerguide/CREATE -VIEW.md >}}) + - [CURSOR]({{< relref "./docs/Developerguide/CURSOR.md >}}) + - [DEALLOCATE]({{< relref "./docs/Developerguide/DEALLOCATE.md >}}) + - [DECLARE]({{< relref "./docs/Developerguide/DECLARE.md >}}) + - [DELETE]({{< relref "./docs/Developerguide/DELETE.md >}}) + - [DO]({{< relref "./docs/Developerguide/DO.md >}}) + - [DROP DATABASE]({{< relref "./docs/Developerguide/DROP -DATABASE.md >}}) + - [DROP DATA SOURCE]({{< relref "./docs/Developerguide/DROP -DATA -SOURCE.md >}}) + - [DROP DIRECTORY]({{< relref "./docs/Developerguide/DROP -DIRECTORY.md >}}) + - [DROP FUNCTION]({{< relref "./docs/Developerguide/DROP -FUNCTION.md >}}) + - [DROP GROUP]({{< relref "./docs/Developerguide/DROP -GROUP.md >}}) + - [DROP INDEX]({{< relref "./docs/Developerguide/DROP -INDEX.md >}}) + - [DROP OWNED]({{< relref "./docs/Developerguide/DROP -OWNED.md >}}) + - [DROP ROW LEVEL SECURITY POLICY]({{< relref "./docs/Developerguide/DROP -ROW -LEVEL -SECURITY -POLICY.md >}}) + - [DROP PROCEDURE]({{< relref "./docs/Developerguide/DROP -PROCEDURE.md >}}) + - [DROP ROLE]({{< relref "./docs/Developerguide/DROP -ROLE.md >}}) + - [DROP SCHEMA]({{< relref "./docs/Developerguide/DROP -SCHEMA.md >}}) + - [DROP SEQUENCE]({{< relref "./docs/Developerguide/DROP -SEQUENCE.md >}}) + - [DROP TABLE]({{< relref "./docs/Developerguide/DROP -TABLE.md >}}) + - [DROP TABLESPACE]({{< relref "./docs/Developerguide/DROP -TABLESPACE.md >}}) + - [DROP TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/DROP -TEXT -SEARCH -CONFIGURATION.md >}}) + - [DROP TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/DROP -TEXT -SEARCH -DICTIONARY.md >}}) + - [DROP TRIGGER]({{< relref "./docs/Developerguide/DROP -TRIGGER.md >}}) + - [DROP TYPE]({{< relref "./docs/Developerguide/DROP -TYPE.md >}}) + - [DROP USER]({{< relref "./docs/Developerguide/DROP -USER.md >}}) + - [DROP VIEW]({{< relref "./docs/Developerguide/DROP -VIEW.md >}}) + - [EXECUTE]({{< relref "./docs/Developerguide/EXECUTE.md >}}) + - [EXPLAIN]({{< relref "./docs/Developerguide/EXPLAIN.md >}}) + - [EXPLAIN PLAN]({{< relref "./docs/Developerguide/EXPLAIN -PLAN.md >}}) + - [FETCH]({{< relref "./docs/Developerguide/FETCH.md >}}) + - [GRANT]({{< relref "./docs/Developerguide/GRANT.md >}}) + - [INSERT]({{< relref "./docs/Developerguide/INSERT.md >}}) + - [LOCK]({{< relref "./docs/Developerguide/LOCK.md >}}) + - [MOVE]({{< relref "./docs/Developerguide/MOVE.md >}}) + - [MERGE INTO]({{< relref "./docs/Developerguide/MERGE -INTO.md >}}) + - [PREPARE]({{< relref "./docs/Developerguide/PREPARE.md >}}) + - [PREPARE TRANSACTION]({{< relref "./docs/Developerguide/PREPARE -TRANSACTION.md >}}) + - [REASSIGN OWNED]({{< relref "./docs/Developerguide/REASSIGN -OWNED.md >}}) + - [REINDEX]({{< relref "./docs/Developerguide/REINDEX.md >}}) + - [RELEASE SAVEPOINT]({{< relref "./docs/Developerguide/RELEASE -SAVEPOINT.md >}}) + - [RESET]({{< relref "./docs/Developerguide/RESET.md >}}) + - [REVOKE]({{< relref "./docs/Developerguide/REVOKE.md >}}) + - [ROLLBACK]({{< relref "./docs/Developerguide/ROLLBACK.md >}}) + - [ROLLBACK PREPARED]({{< relref "./docs/Developerguide/ROLLBACK -PREPARED.md >}}) + - [ROLLBACK TO SAVEPOINT]({{< relref "./docs/Developerguide/ROLLBACK -TO -SAVEPOINT.md >}}) + - [SAVEPOINT]({{< relref "./docs/Developerguide/SAVEPOINT.md >}}) + - [SELECT]({{< relref "./docs/Developerguide/SELECT.md >}}) + - [SELECT INTO]({{< relref "./docs/Developerguide/SELECT -INTO.md >}}) + - [SET]({{< relref "./docs/Developerguide/SET.md >}}) + - [SET CONSTRAINTS]({{< relref "./docs/Developerguide/SET -CONSTRAINTS.md >}}) + - [SET ROLE]({{< relref "./docs/Developerguide/SET -ROLE.md >}}) + - [SET SESSION AUTHORIZATION]({{< relref "./docs/Developerguide/SET -SESSION -AUTHORIZATION.md >}}) + - [SET TRANSACTION]({{< relref "./docs/Developerguide/SET -TRANSACTION.md >}}) + - [SHOW]({{< relref "./docs/Developerguide/SHOW.md >}}) + - [START TRANSACTION]({{< relref "./docs/Developerguide/START -TRANSACTION.md >}}) + - [TRUNCATE]({{< relref "./docs/Developerguide/TRUNCATE.md >}}) + - [UPDATE]({{< relref "./docs/Developerguide/UPDATE.md >}}) + - [VACUUM]({{< relref "./docs/Developerguide/VACUUM.md >}}) + - [VALUES]({{< relref "./docs/Developerguide/VALUES.md >}}) + - [附录]({{< relref "./docs/Developerguide/附录 -16.md >}}) + - [GIN索引]({{< relref "./docs/Developerguide/GIN索引.md >}}) + - [介绍]({{< relref "./docs/Developerguide/介绍 -17.md >}}) + - [扩展性]({{< relref "./docs/Developerguide/扩展性.md >}}) + - [实现]({{< relref "./docs/Developerguide/实现.md >}}) + - [GIN提示与技巧]({{< relref "./docs/Developerguide/GIN提示与技巧.md >}}) + - [扩展函数]({{< relref "./docs/Developerguide/扩展函数.md >}}) + - [扩展语法]({{< relref "./docs/Developerguide/扩展语法.md >}}) + - [系统表和系统视图]({{< relref "./docs/Developerguide/系统表和系统视图.md >}}) + - [系统表和系统视图概述]({{< relref "./docs/Developerguide/系统表和系统视图概述.md >}}) + - [系统表]({{< relref "./docs/Developerguide/系统表.md >}}) + - [GS\_OPT\_MODEL]({{< relref "./docs/Developerguide/GS_OPT_MODEL.md >}}) + - [GS\_WLM\_INSTANCE\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md >}}) + - [GS\_WLM\_OPERATOR\_INFO]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_INFO.md >}}) + - [GS\_WLM\_PLAN\_ENCODING\_TABLE]({{< relref "./docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md >}}) + - [GS\_WLM\_PLAN\_OPERATOR\_INFO]({{< relref "./docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md >}}) + - [GS\_WLM\_SESSION\_QUERY\_INFO\_ALL]({{< relref "./docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md >}}) + - [GS\_WLM\_USER\_RESOURCE\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md >}}) + - [PG\_AGGREGATE]({{< relref "./docs/Developerguide/PG_AGGREGATE.md >}}) + - [PG\_AM]({{< relref "./docs/Developerguide/PG_AM.md >}}) + - [PG\_AMOP]({{< relref "./docs/Developerguide/PG_AMOP.md >}}) + - [PG\_AMPROC]({{< relref "./docs/Developerguide/PG_AMPROC.md >}}) + - [PG\_APP\_WORKLOADGROUP\_MAPPING]({{< relref "./docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md >}}) + - [PG\_ATTRDEF]({{< relref "./docs/Developerguide/PG_ATTRDEF.md >}}) + - [PG\_ATTRIBUTE]({{< relref "./docs/Developerguide/PG_ATTRIBUTE.md >}}) + - [PG\_AUTHID]({{< relref "./docs/Developerguide/PG_AUTHID.md >}}) + - [PG\_AUTH\_HISTORY]({{< relref "./docs/Developerguide/PG_AUTH_HISTORY.md >}}) + - [PG\_AUTH\_MEMBERS]({{< relref "./docs/Developerguide/PG_AUTH_MEMBERS.md >}}) + - [PG\_CAST]({{< relref "./docs/Developerguide/PG_CAST.md >}}) + - [PG\_CLASS]({{< relref "./docs/Developerguide/PG_CLASS.md >}}) + - [PG\_COLLATION]({{< relref "./docs/Developerguide/PG_COLLATION.md >}}) + - [PG\_CONSTRAINT]({{< relref "./docs/Developerguide/PG_CONSTRAINT.md >}}) + - [PG\_CONVERSION]({{< relref "./docs/Developerguide/PG_CONVERSION.md >}}) + - [PG\_DATABASE]({{< relref "./docs/Developerguide/PG_DATABASE.md >}}) + - [PG\_DB\_ROLE\_SETTING]({{< relref "./docs/Developerguide/PG_DB_ROLE_SETTING.md >}}) + - [PG\_DEFAULT\_ACL]({{< relref "./docs/Developerguide/PG_DEFAULT_ACL.md >}}) + - [PG\_DEPEND]({{< relref "./docs/Developerguide/PG_DEPEND.md >}}) + - [PG\_DESCRIPTION]({{< relref "./docs/Developerguide/PG_DESCRIPTION.md >}}) + - [PG\_DIRECTORY]({{< relref "./docs/Developerguide/PG_DIRECTORY.md >}}) + - [PG\_ENUM]({{< relref "./docs/Developerguide/PG_ENUM.md >}}) + - [PG\_EXTENSION]({{< relref "./docs/Developerguide/PG_EXTENSION.md >}}) + - [PG\_EXTENSION\_DATA\_SOURCE]({{< relref "./docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md >}}) + - [PG\_FOREIGN\_DATA\_WRAPPER]({{< relref "./docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md >}}) + - [PG\_FOREIGN\_SERVER]({{< relref "./docs/Developerguide/PG_FOREIGN_SERVER.md >}}) + - [PG\_FOREIGN\_TABLE]({{< relref "./docs/Developerguide/PG_FOREIGN_TABLE.md >}}) + - [PG\_INDEX]({{< relref "./docs/Developerguide/PG_INDEX.md >}}) + - [PG\_INHERITS]({{< relref "./docs/Developerguide/PG_INHERITS.md >}}) + - [PG\_JOB]({{< relref "./docs/Developerguide/PG_JOB.md >}}) + - [PG\_JOB\_PROC]({{< relref "./docs/Developerguide/PG_JOB_PROC.md >}}) + - [PG\_LANGUAGE]({{< relref "./docs/Developerguide/PG_LANGUAGE.md >}}) + - [PG\_LARGEOBJECT]({{< relref "./docs/Developerguide/PG_LARGEOBJECT.md >}}) + - [PG\_LARGEOBJECT\_METADATA]({{< relref "./docs/Developerguide/PG_LARGEOBJECT_METADATA.md >}}) + - [PG\_NAMESPACE]({{< relref "./docs/Developerguide/PG_NAMESPACE.md >}}) + - [PG\_OBJECT]({{< relref "./docs/Developerguide/PG_OBJECT.md >}}) + - [PG\_OPCLASS]({{< relref "./docs/Developerguide/PG_OPCLASS.md >}}) + - [PG\_OPERATOR]({{< relref "./docs/Developerguide/PG_OPERATOR.md >}}) + - [PG\_OPFAMILY]({{< relref "./docs/Developerguide/PG_OPFAMILY.md >}}) + - [PG\_PARTITION]({{< relref "./docs/Developerguide/PG_PARTITION.md >}}) + - [PG\_PLTEMPLATE]({{< relref "./docs/Developerguide/PG_PLTEMPLATE.md >}}) + - [PG\_PROC]({{< relref "./docs/Developerguide/PG_PROC.md >}}) + - [PG\_RANGE]({{< relref "./docs/Developerguide/PG_RANGE.md >}}) + - [PG\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/PG_RESOURCE_POOL.md >}}) + - [PG\_REWRITE]({{< relref "./docs/Developerguide/PG_REWRITE.md >}}) + - [PG\_RLSPOLICY]({{< relref "./docs/Developerguide/PG_RLSPOLICY.md >}}) + - [PG\_SECLABEL]({{< relref "./docs/Developerguide/PG_SECLABEL.md >}}) + - [PG\_SHDEPEND]({{< relref "./docs/Developerguide/PG_SHDEPEND.md >}}) + - [PG\_SHDESCRIPTION]({{< relref "./docs/Developerguide/PG_SHDESCRIPTION.md >}}) + - [PG\_SHSECLABEL]({{< relref "./docs/Developerguide/PG_SHSECLABEL.md >}}) + - [PG\_STATISTIC]({{< relref "./docs/Developerguide/PG_STATISTIC.md >}}) + - [PG\_STATISTIC\_EXT]({{< relref "./docs/Developerguide/PG_STATISTIC_EXT.md >}}) + - [PG\_TABLESPACE]({{< relref "./docs/Developerguide/PG_TABLESPACE.md >}}) + - [PG\_TRIGGER]({{< relref "./docs/Developerguide/PG_TRIGGER.md >}}) + - [PG\_TS\_CONFIG]({{< relref "./docs/Developerguide/PG_TS_CONFIG.md >}}) + - [PG\_TS\_CONFIG\_MAP]({{< relref "./docs/Developerguide/PG_TS_CONFIG_MAP.md >}}) + - [PG\_TS\_DICT]({{< relref "./docs/Developerguide/PG_TS_DICT.md >}}) + - [PG\_TS\_PARSER]({{< relref "./docs/Developerguide/PG_TS_PARSER.md >}}) + - [PG\_TS\_TEMPLATE]({{< relref "./docs/Developerguide/PG_TS_TEMPLATE.md >}}) + - [PG\_TYPE]({{< relref "./docs/Developerguide/PG_TYPE.md >}}) + - [PG\_USER\_MAPPING]({{< relref "./docs/Developerguide/PG_USER_MAPPING.md >}}) + - [PG\_USER\_STATUS]({{< relref "./docs/Developerguide/PG_USER_STATUS.md >}}) + - [PG\_WORKLOAD\_GROUP]({{< relref "./docs/Developerguide/PG_WORKLOAD_GROUP.md >}}) + - [PLAN\_TABLE\_DATA]({{< relref "./docs/Developerguide/PLAN_TABLE_DATA.md >}}) + - [系统视图]({{< relref "./docs/Developerguide/系统视图.md >}}) + - [GET\_GTM\_LITE\_STATUS]({{< relref "./docs/Developerguide/GET_GTM_LITE_STATUS.md >}}) + - [GS\_SESSION\_CPU\_STATISTICS]({{< relref "./docs/Developerguide/GS_SESSION_CPU_STATISTICS.md >}}) + - [GS\_SESSION\_MEMORY\_STATISTICS]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md >}}) + - [GS\_SQL\_COUNT]({{< relref "./docs/Developerguide/GS_SQL_COUNT.md >}}) + - [GS\_WLM\_OPERATOR\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md >}}) + - [GS\_WLM\_OPERATOR\_STATISTICS]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md >}}) + - [GS\_WLM\_PLAN\_OPERATOR\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md >}}) + - [GS\_WLM\_REBUILD\_USER\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md >}}) + - [GS\_WLM\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/GS_WLM_RESOURCE_POOL.md >}}) + - [GS\_WLM\_SESSION\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_SESSION_HISTORY.md >}}) + - [GS\_WLM\_SESSION\_INFO\_ALL]({{< relref "./docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md >}}) + - [GS\_WLM\_USER\_INFO]({{< relref "./docs/Developerguide/GS_WLM_USER_INFO.md >}}) + - [GS\_WLM\_SESSION\_STATISTICS]({{< relref "./docs/Developerguide/GS_WLM_SESSION_STATISTICS.md >}}) + - [GS\_STAT\_DB\_CU]({{< relref "./docs/Developerguide/GS_STAT_DB_CU.md >}}) + - [GS\_STAT\_SESSION\_CU]({{< relref "./docs/Developerguide/GS_STAT_SESSION_CU.md >}}) + - [MPP\_TABLES]({{< relref "./docs/Developerguide/MPP_TABLES.md >}}) + - [PG\_AVAILABLE\_EXTENSION\_VERSIONS]({{< relref "./docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md >}}) + - [PG\_AVAILABLE\_EXTENSIONS]({{< relref "./docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md >}}) + - [PG\_CURSORS]({{< relref "./docs/Developerguide/PG_CURSORS.md >}}) + - [PG\_EXT\_STATS]({{< relref "./docs/Developerguide/PG_EXT_STATS.md >}}) + - [PG\_GET\_INVALID\_BACKENDS]({{< relref "./docs/Developerguide/PG_GET_INVALID_BACKENDS.md >}}) + - [PG\_GET\_SENDERS\_CATCHUP\_TIME]({{< relref "./docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md >}}) + - [PG\_GROUP]({{< relref "./docs/Developerguide/PG_GROUP.md >}}) + - [PG\_INDEXES]({{< relref "./docs/Developerguide/PG_INDEXES.md >}}) + - [PG\_LOCKS]({{< relref "./docs/Developerguide/PG_LOCKS.md >}}) + - [PG\_NODE\_ENV]({{< relref "./docs/Developerguide/PG_NODE_ENV.md >}}) + - [PG\_OS\_THREADS]({{< relref "./docs/Developerguide/PG_OS_THREADS.md >}}) + - [PG\_PREPARED\_STATEMENTS]({{< relref "./docs/Developerguide/PG_PREPARED_STATEMENTS.md >}}) + - [PG\_PREPARED\_XACTS]({{< relref "./docs/Developerguide/PG_PREPARED_XACTS.md >}}) + - [PG\_REPLICATION\_SLOTS]({{< relref "./docs/Developerguide/PG_REPLICATION_SLOTS.md >}}) + - [PG\_RLSPOLICIES]({{< relref "./docs/Developerguide/PG_RLSPOLICIES.md >}}) + - [PG\_ROLES]({{< relref "./docs/Developerguide/PG_ROLES.md >}}) + - [PG\_RULES]({{< relref "./docs/Developerguide/PG_RULES.md >}}) + - [PG\_RUNNING\_XACTS]({{< relref "./docs/Developerguide/PG_RUNNING_XACTS.md >}}) + - [PG\_SECLABELS]({{< relref "./docs/Developerguide/PG_SECLABELS.md >}}) + - [PG\_SESSION\_WLMSTAT]({{< relref "./docs/Developerguide/PG_SESSION_WLMSTAT.md >}}) + - [PG\_SESSION\_IOSTAT]({{< relref "./docs/Developerguide/PG_SESSION_IOSTAT.md >}}) + - [PG\_SETTINGS]({{< relref "./docs/Developerguide/PG_SETTINGS.md >}}) + - [PG\_SHADOW]({{< relref "./docs/Developerguide/PG_SHADOW.md >}}) + - [PG\_STATS]({{< relref "./docs/Developerguide/PG_STATS.md >}}) + - [PG\_STAT\_ACTIVITY]({{< relref "./docs/Developerguide/PG_STAT_ACTIVITY.md >}}) + - [PG\_STAT\_ALL\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_ALL_INDEXES.md >}}) + - [PG\_STAT\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_ALL_TABLES.md >}}) + - [PG\_STAT\_BAD\_BLOCK]({{< relref "./docs/Developerguide/PG_STAT_BAD_BLOCK.md >}}) + - [PG\_STAT\_BGWRITER]({{< relref "./docs/Developerguide/PG_STAT_BGWRITER.md >}}) + - [PG\_STAT\_DATABASE]({{< relref "./docs/Developerguide/PG_STAT_DATABASE.md >}}) + - [PG\_STAT\_DATABASE\_CONFLICTS]({{< relref "./docs/Developerguide/PG_STAT_DATABASE_CONFLICTS.md >}}) + - [PG\_STAT\_USER\_FUNCTIONS]({{< relref "./docs/Developerguide/PG_STAT_USER_FUNCTIONS.md >}}) + - [PG\_STAT\_USER\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_USER_INDEXES.md >}}) + - [PG\_STAT\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_USER_TABLES.md >}}) + - [PG\_STAT\_REPLICATION]({{< relref "./docs/Developerguide/PG_STAT_REPLICATION.md >}}) + - [PG\_STAT\_SYS\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_SYS_INDEXES.md >}}) + - [PG\_STAT\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_SYS_TABLES.md >}}) + - [PG\_STAT\_XACT\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md >}}) + - [PG\_STAT\_XACT\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md >}}) + - [PG\_STAT\_XACT\_USER\_FUNCTIONS]({{< relref "./docs/Developerguide/PG_STAT_XACT_USER_FUNCTIONS.md >}}) + - [PG\_STAT\_XACT\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_USER_TABLES.md >}}) + - [PG\_STATIO\_ALL\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_INDEXES.md >}}) + - [PG\_STATIO\_ALL\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_SEQUENCES.md >}}) + - [PG\_STATIO\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_TABLES.md >}}) + - [PG\_STATIO\_SYS\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_INDEXES.md >}}) + - [PG\_STATIO\_SYS\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_SEQUENCES.md >}}) + - [PG\_STATIO\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_TABLES.md >}}) + - [PG\_STATIO\_USER\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_USER_INDEXES.md >}}) + - [PG\_STATIO\_USER\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_USER_SEQUENCES.md >}}) + - [PG\_STATIO\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_USER_TABLES.md >}}) + - [PG\_THREAD\_WAIT\_STATUS]({{< relref "./docs/Developerguide/PG_THREAD_WAIT_STATUS.md >}}) + - [PG\_TABLES]({{< relref "./docs/Developerguide/PG_TABLES.md >}}) + - [PG\_TDE\_INFO]({{< relref "./docs/Developerguide/PG_TDE_INFO.md >}}) + - [PG\_TIMEZONE\_NAMES]({{< relref "./docs/Developerguide/PG_TIMEZONE_NAMES.md >}}) + - [PG\_TOTAL\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md >}}) + - [PG\_TOTAL\_USER\_RESOURCE\_INFO]({{< relref "./docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md >}}) + - [PG\_USER]({{< relref "./docs/Developerguide/PG_USER.md >}}) + - [PG\_USER\_MAPPINGS]({{< relref "./docs/Developerguide/PG_USER_MAPPINGS.md >}}) + - [PG\_VIEWS]({{< relref "./docs/Developerguide/PG_VIEWS.md >}}) + - [PG\_WLM\_STATISTICS]({{< relref "./docs/Developerguide/PG_WLM_STATISTICS.md >}}) + - [PLAN\_TABLE]({{< relref "./docs/Developerguide/PLAN_TABLE.md >}}) + - [GS\_FILE\_STAT]({{< relref "./docs/Developerguide/GS_FILE_STAT.md >}}) + - [GS\_OS\_RUN\_INFO]({{< relref "./docs/Developerguide/GS_OS_RUN_INFO.md >}}) + - [GS\_REDO\_STAT]({{< relref "./docs/Developerguide/GS_REDO_STAT.md >}}) + - [GS\_SESSION\_MEMORY]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY.md >}}) + - [GS\_SESSION\_MEMORY\_CONTEXT]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md >}}) + - [GS\_SESSION\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_DETAIL.md >}}) + - [GS\_SESSION\_STAT]({{< relref "./docs/Developerguide/GS_SESSION_STAT.md >}}) + - [GS\_SESSION\_TIME]({{< relref "./docs/Developerguide/GS_SESSION_TIME.md >}}) + - [GS\_THREAD\_MEMORY\_CONTEXT]({{< relref "./docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md >}}) + - [GS\_TOTAL\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md >}}) + - [PG\_TIMEZONE\_ABBREVS]({{< relref "./docs/Developerguide/PG_TIMEZONE_ABBREVS.md >}}) + - [PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID]({{< relref "./docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md >}}) + - [PG\_VARIABLE\_INFO]({{< relref "./docs/Developerguide/PG_VARIABLE_INFO.md >}}) + - [GS\_INSTANCE\_TIME]({{< relref "./docs/Developerguide/GS_INSTANCE_TIME.md >}}) + - [GUC参数说明]({{< relref "./docs/Developerguide/GUC参数说明.md >}}) + - [GUC使用说明]({{< relref "./docs/Developerguide/GUC使用说明.md >}}) + - [文件位置]({{< relref "./docs/Developerguide/文件位置.md >}}) + - [连接和认证]({{< relref "./docs/Developerguide/连接和认证.md >}}) + - [连接设置]({{< relref "./docs/Developerguide/连接设置.md >}}) + - [安全和认证(postgresql.conf)]({{< relref "./docs/Developerguide/安全和认证(postgresql -conf).md >}}) + - [通信库参数]({{< relref "./docs/Developerguide/通信库参数.md >}}) + - [资源消耗]({{< relref "./docs/Developerguide/资源消耗.md >}}) + - [内存]({{< relref "./docs/Developerguide/内存.md >}}) + - [磁盘空间]({{< relref "./docs/Developerguide/磁盘空间.md >}}) + - [内核资源使用]({{< relref "./docs/Developerguide/内核资源使用.md >}}) + - [基于开销的清理延迟]({{< relref "./docs/Developerguide/基于开销的清理延迟.md >}}) + - [后端写进程]({{< relref "./docs/Developerguide/后端写进程.md >}}) + - [异步IO]({{< relref "./docs/Developerguide/异步IO.md >}}) + - [并行导入]({{< relref "./docs/Developerguide/并行导入.md >}}) + - [预写式日志]({{< relref "./docs/Developerguide/预写式日志.md >}}) + - [设置]({{< relref "./docs/Developerguide/设置.md >}}) + - [检查点]({{< relref "./docs/Developerguide/检查点.md >}}) + - [日志回放]({{< relref "./docs/Developerguide/日志回放.md >}}) + - [归档]({{< relref "./docs/Developerguide/归档.md >}}) + - [双机复制]({{< relref "./docs/Developerguide/双机复制.md >}}) + - [发送端服务器]({{< relref "./docs/Developerguide/发送端服务器.md >}}) + - [主服务器]({{< relref "./docs/Developerguide/主服务器.md >}}) + - [备服务器]({{< relref "./docs/Developerguide/备服务器.md >}}) + - [内存表]({{< relref "./docs/Developerguide/内存表.md >}}) + - [查询规划]({{< relref "./docs/Developerguide/查询规划.md >}}) + - [优化器方法配置]({{< relref "./docs/Developerguide/优化器方法配置.md >}}) + - [优化器开销常量]({{< relref "./docs/Developerguide/优化器开销常量.md >}}) + - [基因查询优化器]({{< relref "./docs/Developerguide/基因查询优化器.md >}}) + - [其他优化器选项]({{< relref "./docs/Developerguide/其他优化器选项.md >}}) + - [错误报告和日志]({{< relref "./docs/Developerguide/错误报告和日志.md >}}) + - [记录日志的位置]({{< relref "./docs/Developerguide/记录日志的位置.md >}}) + - [记录日志的时间]({{< relref "./docs/Developerguide/记录日志的时间.md >}}) + - [记录日志的内容]({{< relref "./docs/Developerguide/记录日志的内容.md >}}) + - [使用CSV格式写日志]({{< relref "./docs/Developerguide/使用CSV格式写日志.md >}}) + - [告警检测]({{< relref "./docs/Developerguide/告警检测.md >}}) + - [运行时统计]({{< relref "./docs/Developerguide/运行时统计.md >}}) + - [查询和索引统计收集器]({{< relref "./docs/Developerguide/查询和索引统计收集器.md >}}) + - [性能统计]({{< relref "./docs/Developerguide/性能统计.md >}}) + - [负载管理]({{< relref "./docs/Developerguide/负载管理.md >}}) + - [自动清理]({{< relref "./docs/Developerguide/自动清理.md >}}) + - [客户端连接缺省设置]({{< relref "./docs/Developerguide/客户端连接缺省设置.md >}}) + - [语句行为]({{< relref "./docs/Developerguide/语句行为.md >}}) + - [区域和格式化]({{< relref "./docs/Developerguide/区域和格式化.md >}}) + - [其他缺省]({{< relref "./docs/Developerguide/其他缺省.md >}}) + - [锁管理]({{< relref "./docs/Developerguide/锁管理.md >}}) + - [版本和平台兼容性]({{< relref "./docs/Developerguide/版本和平台兼容性.md >}}) + - [历史版本兼容性]({{< relref "./docs/Developerguide/历史版本兼容性.md >}}) + - [平台和客户端兼容性]({{< relref "./docs/Developerguide/平台和客户端兼容性.md >}}) + - [容错性]({{< relref "./docs/Developerguide/容错性.md >}}) + - [连接池参数]({{< relref "./docs/Developerguide/连接池参数.md >}}) + - [openGauss事务]({{< relref "./docs/Developerguide/openGauss事务.md >}}) + - [开发人员选项]({{< relref "./docs/Developerguide/开发人员选项.md >}}) + - [审计]({{< relref "./docs/Developerguide/审计.md >}}) + - [审计开关]({{< relref "./docs/Developerguide/审计开关.md >}}) + - [用户和权限审计]({{< relref "./docs/Developerguide/用户和权限审计.md >}}) + - [操作审计]({{< relref "./docs/Developerguide/操作审计.md >}}) + - [事务监控]({{< relref "./docs/Developerguide/事务监控.md >}}) + - [升级参数]({{< relref "./docs/Developerguide/升级参数.md >}}) + - [其它选项]({{< relref "./docs/Developerguide/其它选项.md >}}) + - [等待事件]({{< relref "./docs/Developerguide/等待事件.md >}}) + - [Query]({{< relref "./docs/Developerguide/Query.md >}}) + - [系统性能快照]({{< relref "./docs/Developerguide/系统性能快照.md >}}) + - [常见故障定位指南]({{< relref "./docs/Developerguide/常见故障定位指南.md >}}) + - [core问题定位]({{< relref "./docs/Developerguide/core问题定位.md >}}) + - [磁盘满故障引起的core问题]({{< relref "./docs/Developerguide/磁盘满故障引起的core问题.md >}}) + - [GUC参数log\_directory设置不正确引起的core问题]({{< relref "./docs/Developerguide/GUC参数log_directory设置不正确引起的core问题.md >}}) + +- [工具参考]({{< relref "./docs/Toolreference/Toolreference.md >}}) + - [工具一览表]({{< relref "./docs/Toolreference/工具一览表.md >}}) + - [客户端工具]({{< relref "./docs/Toolreference/客户端工具.md >}}) + - [gsql]({{< relref "./docs/Toolreference/gsql.md >}}) + - [gsql概述]({{< relref "./docs/Toolreference/gsql概述.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导.md >}}) + - [获取帮助]({{< relref "./docs/Toolreference/获取帮助.md >}}) + - [命令参考]({{< relref "./docs/Toolreference/命令参考.md >}}) + - [元命令参考]({{< relref "./docs/Toolreference/元命令参考.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理.md >}}) + - [X -Tuner]({{< relref "./docs/Toolreference/X -Tuner.md >}}) + - [概述]({{< relref "./docs/Toolreference/概述.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导 -0.md >}}) + - [获取帮助]({{< relref "./docs/Toolreference/获取帮助 -1.md >}}) + - [命令参考]({{< relref "./docs/Toolreference/命令参考 -2.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -3.md >}}) + - [Sqldiag]({{< relref "./docs/Toolreference/Sqldiag.md >}}) + - [概述]({{< relref "./docs/Toolreference/概述 -4.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导 -5.md >}}) + - [获取帮助]({{< relref "./docs/Toolreference/获取帮助 -6.md >}}) + - [命令参考]({{< relref "./docs/Toolreference/命令参考 -7.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -8.md >}}) + - [Predictor]({{< relref "./docs/Toolreference/Predictor.md >}}) + - [概述]({{< relref "./docs/Toolreference/概述 -9.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导 -10.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -11.md >}}) + - [服务端工具]({{< relref "./docs/Toolreference/服务端工具.md >}}) + - [gs\_check]({{< relref "./docs/Toolreference/gs_check.md >}}) + - [gs\_checkos]({{< relref "./docs/Toolreference/gs_checkos.md >}}) + - [gs\_checkperf]({{< relref "./docs/Toolreference/gs_checkperf.md >}}) + - [gs\_collector]({{< relref "./docs/Toolreference/gs_collector.md >}}) + - [gs\_dump]({{< relref "./docs/Toolreference/gs_dump.md >}}) + - [gs\_dumpall]({{< relref "./docs/Toolreference/gs_dumpall.md >}}) + - [gs\_guc]({{< relref "./docs/Toolreference/gs_guc.md >}}) + - [gs\_om]({{< relref "./docs/Toolreference/gs_om.md >}}) + - [gs\_restore]({{< relref "./docs/Toolreference/gs_restore.md >}}) + - [gs\_ssh]({{< relref "./docs/Toolreference/gs_ssh.md >}}) + - [系统内部使用的工具]({{< relref "./docs/Toolreference/系统内部使用的工具.md >}}) + - [gaussdb]({{< relref "./docs/Toolreference/gaussdb.md >}}) + - [gs\_backup]({{< relref "./docs/Toolreference/gs_backup.md >}}) + - [gs\_basebackup]({{< relref "./docs/Toolreference/gs_basebackup.md >}}) + - [gs\_ctl]({{< relref "./docs/Toolreference/gs_ctl.md >}}) + - [gs\_install]({{< relref "./docs/Toolreference/gs_install.md >}}) + - [gs\_postuninstall]({{< relref "./docs/Toolreference/gs_postuninstall.md >}}) + - [gs\_preinstall]({{< relref "./docs/Toolreference/gs_preinstall.md >}}) + - [gs\_sshexkey]({{< relref "./docs/Toolreference/gs_sshexkey.md >}}) + - [gs\_uninstall]({{< relref "./docs/Toolreference/gs_uninstall.md >}}) + - [gs\_upgradectl]({{< relref "./docs/Toolreference/gs_upgradectl.md >}}) + - [gstrace]({{< relref "./docs/Toolreference/gstrace.md >}}) + - [kdb5\_util]({{< relref "./docs/Toolreference/kdb5_util.md >}}) + - [kadmin.local]({{< relref "./docs/Toolreference/kadmin -local.md >}}) + - [kinit]({{< relref "./docs/Toolreference/kinit.md >}}) + - [klist]({{< relref "./docs/Toolreference/klist.md >}}) + - [krb5kdc]({{< relref "./docs/Toolreference/krb5kdc.md >}}) + - [kdestroy]({{< relref "./docs/Toolreference/kdestroy.md >}}) + - [pg\_config]({{< relref "./docs/Toolreference/pg_config.md >}}) + - [pg\_controldata]({{< relref "./docs/Toolreference/pg_controldata.md >}}) + - [pg\_resetxlog]({{< relref "./docs/Toolreference/pg_resetxlog.md >}}) + - [FAQ]({{< relref "./docs/Toolreference/FAQ.md >}}) + - [执行命令报错“Failed to obtain the GPHOME”]({{< relref "./docs/Toolreference/执行命令报错 -Failed -to -obtain -the -GPHOME.md >}}) + - [gs\_collector工具支持收集的系统表和视图列表]({{< relref "./docs/Toolreference/gs_collector工具支持收集的系统表和视图列表.md >}}) + + -- Gitee From e48831adabc58703577d5ccef65a0f4b3d7841fe Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Thu, 28 May 2020 18:08:41 +0800 Subject: [PATCH 33/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntent/zh/menu/index.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/menu/index.md | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 content/zh/menu/index.md diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md deleted file mode 100644 index 6ce6f728d..000000000 --- a/content/zh/menu/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -headless: true ---- -- [安装指南]({{< relref "./docs/installation/installation.md" >}}) - - [开始安装]({{< relref "./docs/installation/starting-installation.md" >}}) - - [配置安装]({{< relref "./docs/installation/configurations-during-installation.md" >}}) - - [完成安装]({{< relref "./docs/installation/completing-the-installation.md" >}}) -- Gitee From 9469b8df97db6d28e145fe24c2c21fd44d9b01fd Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Fri, 29 May 2020 11:27:47 +0800 Subject: [PATCH 34/35] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0openGauss=E8=B5=84=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/menu/index.md | 914 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 914 insertions(+) create mode 100644 content/zh/menu/index.md diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md new file mode 100644 index 000000000..bf6170ef3 --- /dev/null +++ b/content/zh/menu/index.md @@ -0,0 +1,914 @@ + +- [产品描述]({{< relref "./docs/Description/Description.md >}}) + - [产品定位]({{< relref "./docs/Description/产品定位.md >}}) + - [系统架构]({{< relref "./docs/Description/系统架构.md >}}) + - [应用场景]({{< relref "./docs/Description/应用场景.md >}}) + - [运行环境]({{< relref "./docs/Description/运行环境.md >}}) + - [技术指标]({{< relref "./docs/Description/技术指标.md >}}) + - [基本功能和特性]({{< relref "./docs/Description/基本功能和特性.md >}}) + - [企业级增强特性]({{< relref "./docs/Description/企业级增强特性.md >}}) + - [数据分区]({{< relref "./docs/Description/数据分区.md >}}) + - [向量化执行和行列混合引擎]({{< relref "./docs/Description/向量化执行和行列混合引擎.md >}}) + - [高可靠事务处理]({{< relref "./docs/Description/高可靠事务处理.md >}}) + - [高并发&高性能]({{< relref "./docs/Description/高并发 -高性能.md >}}) + - [SQL自诊断]({{< relref "./docs/Description/SQL自诊断.md >}}) + - [内存表]({{< relref "./docs/Description/内存表.md >}}) + - [主备双机]({{< relref "./docs/Description/主备双机.md >}}) + +- [编译指导书]({{< relref "./docs/Compilationguide/Compilation.md >}}) + - [搭建编译环境]({{< relref "./docs/Compilationguide/搭建编译环境.md >}}) + - [硬件要求]({{< relref "./docs/Compilationguide/硬件要求.md >}}) + - [软件要求]({{< relref "./docs/Compilationguide/软件要求.md >}}) + - [操作系统要求]({{< relref "./docs/Compilationguide/操作系统要求.md >}}) + - [软件依赖要求]({{< relref "./docs/Compilationguide/软件依赖要求.md >}}) + - [环境变量配置]({{< relref "./docs/Compilationguide/环境变量配置.md >}}) + - [版本编译]({{< relref "./docs/Compilationguide/版本编译.md >}}) + - [编译前准备]({{< relref "./docs/Compilationguide/编译前准备.md >}}) + - [代码下载]({{< relref "./docs/Compilationguide/代码下载.md >}}) + - [软件安装编译]({{< relref "./docs/Compilationguide/软件安装编译.md >}}) + - [产品安装包编译]({{< relref "./docs/Compilationguide/产品安装包编译.md >}}) + - [FAQ]({{< relref "./docs/Compilationguide/FAQ.md >}}) + - [如何清除编译过程中生成的临时文件]({{< relref "./docs/Compilationguide/如何清除编译过程中生成的临时文件.md >}}) + - [如何解决“Configure error: Ccompiler cannot create executables”报错]({{< relref "./docs/Compilationguide/如何解决 -Configure -error -Ccompiler -cannot -create -executables -报错.md >}}) + +- [快速入门]({{< relref "./docs/Quickstart/Quickstart.md >}}) + - [了解产品]({{< relref "./docs/Quickstart/了解产品.md >}}) + - [产品特点]({{< relref "./docs/Quickstart/产品特点.md >}}) + - [软件架构]({{< relref "./docs/Quickstart/软件架构.md >}}) + - [典型组网]({{< relref "./docs/Quickstart/典型组网.md >}}) + - [安装准备]({{< relref "./docs/Quickstart/安装准备.md >}}) + - [了解安装流程]({{< relref "./docs/Quickstart/了解安装流程.md >}}) + - [获取并校验安装包]({{< relref "./docs/Quickstart/获取并校验安装包.md >}}) + - [准备软硬件安装环境]({{< relref "./docs/Quickstart/准备软硬件安装环境.md >}}) + - [软硬件环境要求]({{< relref "./docs/Quickstart/软硬件环境要求.md >}}) + - [修改操作系统配置]({{< relref "./docs/Quickstart/修改操作系统配置.md >}}) + - [关闭操作系统防火墙]({{< relref "./docs/Quickstart/关闭操作系统防火墙.md >}}) + - [设置字符集参数]({{< relref "./docs/Quickstart/设置字符集参数.md >}}) + - [设置时区和时间]({{< relref "./docs/Quickstart/设置时区和时间.md >}}) + - [关闭swap交换内存]({{< relref "./docs/Quickstart/关闭swap交换内存.md >}}) + - [设置网卡MTU值]({{< relref "./docs/Quickstart/设置网卡MTU值.md >}}) + - [设置root用户远程登录]({{< relref "./docs/Quickstart/设置root用户远程登录.md >}}) + - [了解安装用户及用户组]({{< relref "./docs/Quickstart/了解安装用户及用户组.md >}}) + - [安装openGauss]({{< relref "./docs/Quickstart/安装openGauss.md >}}) + - [创建XML配置文件]({{< relref "./docs/Quickstart/创建XML配置文件.md >}}) + - [配置数据库名称及各项目录]({{< relref "./docs/Quickstart/配置数据库名称及各项目录.md >}}) + - [配置Host基本信息]({{< relref "./docs/Quickstart/配置Host基本信息.md >}}) + - [配置数据库主节点信息]({{< relref "./docs/Quickstart/配置数据库主节点信息.md >}}) + - [示例]({{< relref "./docs/Quickstart/示例.md >}}) + - [单节点配置文件]({{< relref "./docs/Quickstart/单节点配置文件.md >}}) + - [一主一备配置文件]({{< relref "./docs/Quickstart/一主一备配置文件.md >}}) + - [初始化安装环境]({{< relref "./docs/Quickstart/初始化安装环境.md >}}) + - [准备安装用户及环境]({{< relref "./docs/Quickstart/准备安装用户及环境.md >}}) + - [手工建立互信]({{< relref "./docs/Quickstart/手工建立互信.md >}}) + - [配置操作系统参数]({{< relref "./docs/Quickstart/配置操作系统参数.md >}}) + - [执行安装]({{< relref "./docs/Quickstart/执行安装.md >}}) + - [(可选)设置备机可读]({{< relref "./docs/Quickstart/(可选)设置备机可读.md >}}) + - [开始使用产品]({{< relref "./docs/Quickstart/开始使用产品.md >}}) + - [设置openGauss参数]({{< relref "./docs/Quickstart/设置openGauss参数.md >}}) + - [设置客户端认证策略]({{< relref "./docs/Quickstart/设置客户端认证策略.md >}}) + - [设置配置文件参数]({{< relref "./docs/Quickstart/设置配置文件参数.md >}}) + - [gsql客户端连接openGauss]({{< relref "./docs/Quickstart/gsql客户端连接openGauss.md >}}) + - [确认连接信息]({{< relref "./docs/Quickstart/确认连接信息.md >}}) + - [使用gsql本地连接]({{< relref "./docs/Quickstart/使用gsql本地连接.md >}}) + - [使用gsql远程连接]({{< relref "./docs/Quickstart/使用gsql远程连接.md >}}) + - [通过gs\_guc配置白名单]({{< relref "./docs/Quickstart/通过gs_guc配置白名单.md >}}) + - [安装gsql客户端并连接数据库]({{< relref "./docs/Quickstart/安装gsql客户端并连接数据库.md >}}) + - [简单数据管理]({{< relref "./docs/Quickstart/简单数据管理.md >}}) + - [创建数据库]({{< relref "./docs/Quickstart/创建数据库.md >}}) + - [创建表]({{< relref "./docs/Quickstart/创建表.md >}}) + - [查看对象]({{< relref "./docs/Quickstart/查看对象.md >}}) + - [简单权限管理]({{< relref "./docs/Quickstart/简单权限管理.md >}}) + - [创建角色]({{< relref "./docs/Quickstart/创建角色.md >}}) + - [创建用户]({{< relref "./docs/Quickstart/创建用户.md >}}) + - [权限赋予]({{< relref "./docs/Quickstart/权限赋予.md >}}) + - [通过客户端工具执行SQL]({{< relref "./docs/Quickstart/通过客户端工具执行SQL.md >}}) + - [执行单条SQL]({{< relref "./docs/Quickstart/执行单条SQL.md >}}) + - [执行批量文件]({{< relref "./docs/Quickstart/执行批量文件.md >}}) + - [通过JDBC执行SQL]({{< relref "./docs/Quickstart/通过JDBC执行SQL.md >}}) + - [JDBC包与驱动类]({{< relref "./docs/Quickstart/JDBC包与驱动类.md >}}) + - [加载驱动]({{< relref "./docs/Quickstart/加载驱动.md >}}) + - [连接数据库]({{< relref "./docs/Quickstart/连接数据库.md >}}) + - [示例]({{< relref "./docs/Quickstart/示例 -0.md >}}) + - [配置运行参数]({{< relref "./docs/Quickstart/配置运行参数.md >}}) + - [查看参数当前取值]({{< relref "./docs/Quickstart/查看参数当前取值.md >}}) + - [重设参数]({{< relref "./docs/Quickstart/重设参数.md >}}) + - [GUC参数说明]({{< relref "./docs/Quickstart/GUC参数说明.md >}}) + - [GUC使用说明]({{< relref "./docs/Quickstart/GUC使用说明.md >}}) + - [文件位置]({{< relref "./docs/Quickstart/文件位置.md >}}) + - [连接和认证]({{< relref "./docs/Quickstart/连接和认证.md >}}) + - [连接设置]({{< relref "./docs/Quickstart/连接设置.md >}}) + - [安全和认证(postgresql.conf)]({{< relref "./docs/Quickstart/安全和认证(postgresql -conf).md >}}) + - [通信库参数]({{< relref "./docs/Quickstart/通信库参数.md >}}) + - [资源消耗]({{< relref "./docs/Quickstart/资源消耗.md >}}) + - [内存]({{< relref "./docs/Quickstart/内存.md >}}) + - [磁盘空间]({{< relref "./docs/Quickstart/磁盘空间.md >}}) + - [内核资源使用]({{< relref "./docs/Quickstart/内核资源使用.md >}}) + - [基于开销的清理延迟]({{< relref "./docs/Quickstart/基于开销的清理延迟.md >}}) + - [后端写进程]({{< relref "./docs/Quickstart/后端写进程.md >}}) + - [异步IO]({{< relref "./docs/Quickstart/异步IO.md >}}) + - [并行导入]({{< relref "./docs/Quickstart/并行导入.md >}}) + - [预写式日志]({{< relref "./docs/Quickstart/预写式日志.md >}}) + - [设置]({{< relref "./docs/Quickstart/设置.md >}}) + - [检查点]({{< relref "./docs/Quickstart/检查点.md >}}) + - [日志回放]({{< relref "./docs/Quickstart/日志回放.md >}}) + - [归档]({{< relref "./docs/Quickstart/归档.md >}}) + - [双机复制]({{< relref "./docs/Quickstart/双机复制.md >}}) + - [发送端服务器]({{< relref "./docs/Quickstart/发送端服务器.md >}}) + - [主服务器]({{< relref "./docs/Quickstart/主服务器.md >}}) + - [备服务器]({{< relref "./docs/Quickstart/备服务器.md >}}) + - [查询规划]({{< relref "./docs/Quickstart/查询规划.md >}}) + - [优化器方法配置]({{< relref "./docs/Quickstart/优化器方法配置.md >}}) + - [优化器开销常量]({{< relref "./docs/Quickstart/优化器开销常量.md >}}) + - [基因查询优化器]({{< relref "./docs/Quickstart/基因查询优化器.md >}}) + - [其他优化器选项]({{< relref "./docs/Quickstart/其他优化器选项.md >}}) + - [错误报告和日志]({{< relref "./docs/Quickstart/错误报告和日志.md >}}) + - [记录日志的位置]({{< relref "./docs/Quickstart/记录日志的位置.md >}}) + - [记录日志的时间]({{< relref "./docs/Quickstart/记录日志的时间.md >}}) + - [记录日志的内容]({{< relref "./docs/Quickstart/记录日志的内容.md >}}) + - [使用CSV格式写日志]({{< relref "./docs/Quickstart/使用CSV格式写日志.md >}}) + - [告警检测]({{< relref "./docs/Quickstart/告警检测.md >}}) + - [运行时统计]({{< relref "./docs/Quickstart/运行时统计.md >}}) + - [查询和索引统计收集器]({{< relref "./docs/Quickstart/查询和索引统计收集器.md >}}) + - [性能统计]({{< relref "./docs/Quickstart/性能统计.md >}}) + - [负载管理]({{< relref "./docs/Quickstart/负载管理.md >}}) + - [自动清理]({{< relref "./docs/Quickstart/自动清理.md >}}) + - [客户端连接缺省设置]({{< relref "./docs/Quickstart/客户端连接缺省设置.md >}}) + - [语句行为]({{< relref "./docs/Quickstart/语句行为.md >}}) + - [区域和格式化]({{< relref "./docs/Quickstart/区域和格式化.md >}}) + - [其他缺省]({{< relref "./docs/Quickstart/其他缺省.md >}}) + - [锁管理]({{< relref "./docs/Quickstart/锁管理.md >}}) + - [版本和平台兼容性]({{< relref "./docs/Quickstart/版本和平台兼容性.md >}}) + - [历史版本兼容性]({{< relref "./docs/Quickstart/历史版本兼容性.md >}}) + - [平台和客户端兼容性]({{< relref "./docs/Quickstart/平台和客户端兼容性.md >}}) + - [容错性]({{< relref "./docs/Quickstart/容错性.md >}}) + - [openGauss事务]({{< relref "./docs/Quickstart/openGauss事务.md >}}) + - [开发人员选项]({{< relref "./docs/Quickstart/开发人员选项.md >}}) + - [审计]({{< relref "./docs/Quickstart/审计.md >}}) + - [审计开关]({{< relref "./docs/Quickstart/审计开关.md >}}) + - [用户和权限审计]({{< relref "./docs/Quickstart/用户和权限审计.md >}}) + - [操作审计]({{< relref "./docs/Quickstart/操作审计.md >}}) + - [事务监控]({{< relref "./docs/Quickstart/事务监控.md >}}) + - [升级参数]({{< relref "./docs/Quickstart/升级参数.md >}}) + - [其它选项]({{< relref "./docs/Quickstart/其它选项.md >}}) + - [等待事件]({{< relref "./docs/Quickstart/等待事件.md >}}) + - [Query]({{< relref "./docs/Quickstart/Query.md >}}) + - [系统性能快照]({{< relref "./docs/Quickstart/系统性能快照.md >}}) + - [FAQ]({{< relref "./docs/Quickstart/FAQ.md >}}) + - [用户在openGauss节点间的互信丢失]({{< relref "./docs/Quickstart/用户在openGauss节点间的互信丢失.md >}}) + + +- [安装指南]({{< relref "./docs/Installation/Installation.md >}}) + - [安装概述]({{< relref "./docs/Installation/安装概述.md >}}) + - [安装准备]({{< relref "./docs/Installation/安装准备.md >}}) + - [了解安装流程]({{< relref "./docs/Installation/了解安装流程.md >}}) + - [获取并校验安装包]({{< relref "./docs/Installation/获取并校验安装包.md >}}) + - [准备软硬件安装环境]({{< relref "./docs/Installation/准备软硬件安装环境.md >}}) + - [软硬件环境要求]({{< relref "./docs/Installation/软硬件环境要求.md >}}) + - [修改操作系统配置]({{< relref "./docs/Installation/修改操作系统配置.md >}}) + - [关闭操作系统防火墙]({{< relref "./docs/Installation/关闭操作系统防火墙.md >}}) + - [设置字符集参数]({{< relref "./docs/Installation/设置字符集参数.md >}}) + - [设置时区和时间]({{< relref "./docs/Installation/设置时区和时间.md >}}) + - [关闭swap交换内存]({{< relref "./docs/Installation/关闭swap交换内存.md >}}) + - [设置网卡MTU值]({{< relref "./docs/Installation/设置网卡MTU值.md >}}) + - [设置root用户远程登录]({{< relref "./docs/Installation/设置root用户远程登录.md >}}) + - [了解安装用户及用户组]({{< relref "./docs/Installation/了解安装用户及用户组.md >}}) + - [安装openGauss]({{< relref "./docs/Installation/安装openGauss.md >}}) + - [创建XML配置文件]({{< relref "./docs/Installation/创建XML配置文件.md >}}) + - [配置数据库名称及各项目录]({{< relref "./docs/Installation/配置数据库名称及各项目录.md >}}) + - [配置Host基本信息]({{< relref "./docs/Installation/配置Host基本信息.md >}}) + - [配置数据库主节点信息]({{< relref "./docs/Installation/配置数据库主节点信息.md >}}) + - [示例]({{< relref "./docs/Installation/示例.md >}}) + - [单节点配置文件]({{< relref "./docs/Installation/单节点配置文件.md >}}) + - [一主一备配置文件]({{< relref "./docs/Installation/一主一备配置文件.md >}}) + - [初始化安装环境]({{< relref "./docs/Installation/初始化安装环境.md >}}) + - [准备安装用户及环境]({{< relref "./docs/Installation/准备安装用户及环境.md >}}) + - [手工建立互信]({{< relref "./docs/Installation/手工建立互信.md >}}) + - [配置操作系统参数]({{< relref "./docs/Installation/配置操作系统参数.md >}}) + - [执行安装]({{< relref "./docs/Installation/执行安装.md >}}) + - [(可选)设置备机可读]({{< relref "./docs/Installation/(可选)设置备机可读.md >}}) + - [安装验证]({{< relref "./docs/Installation/安装验证.md >}}) + - [检查openGauss健康状态]({{< relref "./docs/Installation/检查openGauss健康状态.md >}}) + - [初始配置]({{< relref "./docs/Installation/初始配置.md >}}) + - [配置区域和字符集]({{< relref "./docs/Installation/配置区域和字符集.md >}}) + - [卸载openGauss]({{< relref "./docs/Installation/卸载openGauss.md >}}) + - [执行卸载]({{< relref "./docs/Installation/执行卸载.md >}}) + - [一键式环境清理]({{< relref "./docs/Installation/一键式环境清理.md >}}) + +- [开发者指南]({{< relref "./docs/Developerguide/Developerguide.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述.md >}}) + - [数据库逻辑结构图]({{< relref "./docs/Developerguide/数据库逻辑结构图.md >}}) + - [数据查询请求处理过程]({{< relref "./docs/Developerguide/数据查询请求处理过程.md >}}) + - [管理事务]({{< relref "./docs/Developerguide/管理事务.md >}}) + - [相关概念]({{< relref "./docs/Developerguide/相关概念.md >}}) + - [数据库使用]({{< relref "./docs/Developerguide/数据库使用.md >}}) + - [从这里开始]({{< relref "./docs/Developerguide/从这里开始.md >}}) + - [连接数据库]({{< relref "./docs/Developerguide/连接数据库.md >}}) + - [确认连接信息]({{< relref "./docs/Developerguide/确认连接信息.md >}}) + - [配置服务端远程连接]({{< relref "./docs/Developerguide/配置服务端远程连接.md >}}) + - [使用gsql连接]({{< relref "./docs/Developerguide/使用gsql连接.md >}}) + - [应用程序接口]({{< relref "./docs/Developerguide/应用程序接口.md >}}) + - [创建和管理数据库]({{< relref "./docs/Developerguide/创建和管理数据库.md >}}) + - [规划存储模型]({{< relref "./docs/Developerguide/规划存储模型.md >}}) + - [创建和管理表空间]({{< relref "./docs/Developerguide/创建和管理表空间.md >}}) + - [创建和管理表]({{< relref "./docs/Developerguide/创建和管理表.md >}}) + - [创建表]({{< relref "./docs/Developerguide/创建表.md >}}) + - [向表中插入数据]({{< relref "./docs/Developerguide/向表中插入数据.md >}}) + - [更新表中数据]({{< relref "./docs/Developerguide/更新表中数据.md >}}) + - [查看数据]({{< relref "./docs/Developerguide/查看数据.md >}}) + - [删除表中数据]({{< relref "./docs/Developerguide/删除表中数据.md >}}) + - [查看系统表]({{< relref "./docs/Developerguide/查看系统表.md >}}) + - [其他操作]({{< relref "./docs/Developerguide/其他操作.md >}}) + - [创建和管理schema]({{< relref "./docs/Developerguide/创建和管理schema.md >}}) + - [创建和管理分区表]({{< relref "./docs/Developerguide/创建和管理分区表.md >}}) + - [创建和管理索引]({{< relref "./docs/Developerguide/创建和管理索引.md >}}) + - [创建和管理视图]({{< relref "./docs/Developerguide/创建和管理视图.md >}}) + - [创建和管理序列]({{< relref "./docs/Developerguide/创建和管理序列.md >}}) + - [附录]({{< relref "./docs/Developerguide/附录.md >}}) + - [客户端接入认证]({{< relref "./docs/Developerguide/客户端接入认证.md >}}) + - [配置客户端接入认证]({{< relref "./docs/Developerguide/配置客户端接入认证.md >}}) + - [配置文件参考]({{< relref "./docs/Developerguide/配置文件参考.md >}}) + - [用SSL进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSL进行安全的TCP -IP连接.md >}}) + - [用SSH隧道进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSH隧道进行安全的TCP -IP连接.md >}}) + - [查看数据库连接数]({{< relref "./docs/Developerguide/查看数据库连接数.md >}}) + - [SSL证书管理]({{< relref "./docs/Developerguide/SSL证书管理.md >}}) + - [证书生成]({{< relref "./docs/Developerguide/证书生成.md >}}) + - [证书替换]({{< relref "./docs/Developerguide/证书替换.md >}}) + - [设置文件权限安全策略]({{< relref "./docs/Developerguide/设置文件权限安全策略.md >}}) + - [管理数据库安全]({{< relref "./docs/Developerguide/管理数据库安全.md >}}) + - [客户端接入认证]({{< relref "./docs/Developerguide/客户端接入认证 -0.md >}}) + - [配置客户端接入认证]({{< relref "./docs/Developerguide/配置客户端接入认证 -1.md >}}) + - [配置文件参考]({{< relref "./docs/Developerguide/配置文件参考 -2.md >}}) + - [用SSL进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSL进行安全的TCP -IP连接 -3.md >}}) + - [用SSH隧道进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSH隧道进行安全的TCP -IP连接 -4.md >}}) + - [查看数据库连接数]({{< relref "./docs/Developerguide/查看数据库连接数 -5.md >}}) + - [SSL证书管理]({{< relref "./docs/Developerguide/SSL证书管理 -6.md >}}) + - [证书生成]({{< relref "./docs/Developerguide/证书生成 -7.md >}}) + - [证书替换]({{< relref "./docs/Developerguide/证书替换 -8.md >}}) + - [管理用户及权限]({{< relref "./docs/Developerguide/管理用户及权限.md >}}) + - [默认权限机制]({{< relref "./docs/Developerguide/默认权限机制.md >}}) + - [管理员]({{< relref "./docs/Developerguide/管理员.md >}}) + - [三权分立]({{< relref "./docs/Developerguide/三权分立.md >}}) + - [用户]({{< relref "./docs/Developerguide/用户.md >}}) + - [角色]({{< relref "./docs/Developerguide/角色.md >}}) + - [Schema]({{< relref "./docs/Developerguide/Schema.md >}}) + - [用户权限设置]({{< relref "./docs/Developerguide/用户权限设置.md >}}) + - [行级访问控制]({{< relref "./docs/Developerguide/行级访问控制.md >}}) + - [设置安全策略]({{< relref "./docs/Developerguide/设置安全策略.md >}}) + - [设置帐户安全策略]({{< relref "./docs/Developerguide/设置帐户安全策略.md >}}) + - [设置帐号有效期]({{< relref "./docs/Developerguide/设置帐号有效期.md >}}) + - [设置密码安全策略]({{< relref "./docs/Developerguide/设置密码安全策略.md >}}) + - [设置数据库审计]({{< relref "./docs/Developerguide/设置数据库审计.md >}}) + - [审计概述]({{< relref "./docs/Developerguide/审计概述.md >}}) + - [查看审计结果]({{< relref "./docs/Developerguide/查看审计结果.md >}}) + - [维护审计日志]({{< relref "./docs/Developerguide/维护审计日志.md >}}) + - [设置文件权限安全策略]({{< relref "./docs/Developerguide/设置文件权限安全策略 -9.md >}}) + - [接口参考]({{< relref "./docs/Developerguide/接口参考.md >}}) + - [JDBC]({{< relref "./docs/Developerguide/JDBC.md >}}) + - [java.sql.Connection]({{< relref "./docs/Developerguide/java -sql -Connection.md >}}) + - [java.sql.CallableStatement]({{< relref "./docs/Developerguide/java -sql -CallableStatement.md >}}) + - [java.sql.DatabaseMetaData]({{< relref "./docs/Developerguide/java -sql -DatabaseMetaData.md >}}) + - [java.sql.Driver]({{< relref "./docs/Developerguide/java -sql -Driver.md >}}) + - [java.sql.PreparedStatement]({{< relref "./docs/Developerguide/java -sql -PreparedStatement.md >}}) + - [java.sql.ResultSet]({{< relref "./docs/Developerguide/java -sql -ResultSet.md >}}) + - [java.sql.ResultSetMetaData]({{< relref "./docs/Developerguide/java -sql -ResultSetMetaData.md >}}) + - [java.sql.Statement]({{< relref "./docs/Developerguide/java -sql -Statement.md >}}) + - [javax.sql.ConnectionPoolDataSource]({{< relref "./docs/Developerguide/javax -sql -ConnectionPoolDataSource.md >}}) + - [javax.sql.DataSource]({{< relref "./docs/Developerguide/javax -sql -DataSource.md >}}) + - [javax.sql.PooledConnection]({{< relref "./docs/Developerguide/javax -sql -PooledConnection.md >}}) + - [javax.naming.Context]({{< relref "./docs/Developerguide/javax -naming -Context.md >}}) + - [javax.naming.spi.InitialContextFactory]({{< relref "./docs/Developerguide/javax -naming -spi -InitialContextFactory.md >}}) + - [CopyManager]({{< relref "./docs/Developerguide/CopyManager.md >}}) + - [ODBC]({{< relref "./docs/Developerguide/ODBC.md >}}) + - [SQLAllocEnv]({{< relref "./docs/Developerguide/SQLAllocEnv.md >}}) + - [SQLAllocConnect]({{< relref "./docs/Developerguide/SQLAllocConnect.md >}}) + - [SQLAllocHandle]({{< relref "./docs/Developerguide/SQLAllocHandle.md >}}) + - [SQLAllocStmt]({{< relref "./docs/Developerguide/SQLAllocStmt.md >}}) + - [SQLBindCol]({{< relref "./docs/Developerguide/SQLBindCol.md >}}) + - [SQLBindParameter]({{< relref "./docs/Developerguide/SQLBindParameter.md >}}) + - [SQLColAttribute]({{< relref "./docs/Developerguide/SQLColAttribute.md >}}) + - [SQLConnect]({{< relref "./docs/Developerguide/SQLConnect.md >}}) + - [SQLDisconnect]({{< relref "./docs/Developerguide/SQLDisconnect.md >}}) + - [SQLExecDirect]({{< relref "./docs/Developerguide/SQLExecDirect.md >}}) + - [SQLExecute]({{< relref "./docs/Developerguide/SQLExecute.md >}}) + - [SQLFetch]({{< relref "./docs/Developerguide/SQLFetch.md >}}) + - [SQLFreeStmt]({{< relref "./docs/Developerguide/SQLFreeStmt.md >}}) + - [SQLFreeConnect]({{< relref "./docs/Developerguide/SQLFreeConnect.md >}}) + - [SQLFreeHandle]({{< relref "./docs/Developerguide/SQLFreeHandle.md >}}) + - [SQLFreeEnv]({{< relref "./docs/Developerguide/SQLFreeEnv.md >}}) + - [SQLPrepare]({{< relref "./docs/Developerguide/SQLPrepare.md >}}) + - [SQLGetData]({{< relref "./docs/Developerguide/SQLGetData.md >}}) + - [SQLGetDiagRec]({{< relref "./docs/Developerguide/SQLGetDiagRec.md >}}) + - [SQLSetConnectAttr]({{< relref "./docs/Developerguide/SQLSetConnectAttr.md >}}) + - [SQLSetEnvAttr]({{< relref "./docs/Developerguide/SQLSetEnvAttr.md >}}) + - [SQLSetStmtAttr]({{< relref "./docs/Developerguide/SQLSetStmtAttr.md >}}) + - [示例]({{< relref "./docs/Developerguide/示例.md >}}) + - [libpq]({{< relref "./docs/Developerguide/libpq.md >}}) + - [数据库连接控制函数]({{< relref "./docs/Developerguide/数据库连接控制函数.md >}}) + - [PQconnectdbParams]({{< relref "./docs/Developerguide/PQconnectdbParams.md >}}) + - [PQconnectdb]({{< relref "./docs/Developerguide/PQconnectdb.md >}}) + - [PQconninfoParse]({{< relref "./docs/Developerguide/PQconninfoParse.md >}}) + - [PQconnectStart]({{< relref "./docs/Developerguide/PQconnectStart.md >}}) + - [PQerrorMessage]({{< relref "./docs/Developerguide/PQerrorMessage.md >}}) + - [PQsetdbLogin]({{< relref "./docs/Developerguide/PQsetdbLogin.md >}}) + - [PQfinish]({{< relref "./docs/Developerguide/PQfinish.md >}}) + - [PQreset]({{< relref "./docs/Developerguide/PQreset.md >}}) + - [PQstatus]({{< relref "./docs/Developerguide/PQstatus.md >}}) + - [数据库执行语句函数]({{< relref "./docs/Developerguide/数据库执行语句函数.md >}}) + - [PQclear]({{< relref "./docs/Developerguide/PQclear.md >}}) + - [PQexec]({{< relref "./docs/Developerguide/PQexec.md >}}) + - [PQexecParams]({{< relref "./docs/Developerguide/PQexecParams.md >}}) + - [PQexecParamsBatch]({{< relref "./docs/Developerguide/PQexecParamsBatch.md >}}) + - [PQexecPrepared]({{< relref "./docs/Developerguide/PQexecPrepared.md >}}) + - [PQexecPreparedBatch]({{< relref "./docs/Developerguide/PQexecPreparedBatch.md >}}) + - [PQfname]({{< relref "./docs/Developerguide/PQfname.md >}}) + - [PQgetvalue]({{< relref "./docs/Developerguide/PQgetvalue.md >}}) + - [PQnfields]({{< relref "./docs/Developerguide/PQnfields.md >}}) + - [PQntuples]({{< relref "./docs/Developerguide/PQntuples.md >}}) + - [PQprepare]({{< relref "./docs/Developerguide/PQprepare.md >}}) + - [PQresultStatus]({{< relref "./docs/Developerguide/PQresultStatus.md >}}) + - [异步命令处理]({{< relref "./docs/Developerguide/异步命令处理.md >}}) + - [PQsendQuery]({{< relref "./docs/Developerguide/PQsendQuery.md >}}) + - [PQsendQueryParams]({{< relref "./docs/Developerguide/PQsendQueryParams.md >}}) + - [PQsendPrepare]({{< relref "./docs/Developerguide/PQsendPrepare.md >}}) + - [PQsendQueryPrepared]({{< relref "./docs/Developerguide/PQsendQueryPrepared.md >}}) + - [PQflush]({{< relref "./docs/Developerguide/PQflush.md >}}) + - [取消正在处理的查询]({{< relref "./docs/Developerguide/取消正在处理的查询.md >}}) + - [PQgetCancel]({{< relref "./docs/Developerguide/PQgetCancel.md >}}) + - [PQfreeCancel]({{< relref "./docs/Developerguide/PQfreeCancel.md >}}) + - [PQcancel]({{< relref "./docs/Developerguide/PQcancel.md >}}) + - [示例]({{< relref "./docs/Developerguide/示例 -10.md >}}) + - [链接字符]({{< relref "./docs/Developerguide/链接字符.md >}}) + - [导入数据]({{< relref "./docs/Developerguide/导入数据.md >}}) + - [通过INSERT语句直接写入数据]({{< relref "./docs/Developerguide/通过INSERT语句直接写入数据.md >}}) + - [使用COPY FROM STDIN导入数据]({{< relref "./docs/Developerguide/使用COPY -FROM -STDIN导入数据.md >}}) + - [关于COPY FROM STDIN导入数据]({{< relref "./docs/Developerguide/关于COPY -FROM -STDIN导入数据.md >}}) + - [CopyManager类简介]({{< relref "./docs/Developerguide/CopyManager类简介.md >}}) + - [示例1:通过本地文件导入导出数据]({{< relref "./docs/Developerguide/示例1 -通过本地文件导入导出数据.md >}}) + - [示例2:从MySQL向openGauss进行数据迁移]({{< relref "./docs/Developerguide/示例2 -从MySQL向openGauss进行数据迁移.md >}}) + - [使用gsql元命令导入数据]({{< relref "./docs/Developerguide/使用gsql元命令导入数据.md >}}) + - [使用gs\_restore命令导入数据]({{< relref "./docs/Developerguide/使用gs_restore命令导入数据.md >}}) + - [更新表中数据]({{< relref "./docs/Developerguide/更新表中数据 -11.md >}}) + - [使用DML命令更新表]({{< relref "./docs/Developerguide/使用DML命令更新表.md >}}) + - [使用合并方式更新和插入数据]({{< relref "./docs/Developerguide/使用合并方式更新和插入数据.md >}}) + - [深层复制]({{< relref "./docs/Developerguide/深层复制.md >}}) + - [使用CREATE TABLE执行深层复制]({{< relref "./docs/Developerguide/使用CREATE -TABLE执行深层复制.md >}}) + - [使用CREATE TABLE LIKE执行深层复制]({{< relref "./docs/Developerguide/使用CREATE -TABLE -LIKE执行深层复制.md >}}) + - [通过创建临时表并截断原始表来执行深层复制]({{< relref "./docs/Developerguide/通过创建临时表并截断原始表来执行深层复制.md >}}) + - [分析表]({{< relref "./docs/Developerguide/分析表.md >}}) + - [对表执行VACUUM]({{< relref "./docs/Developerguide/对表执行VACUUM.md >}}) + - [管理并发写入操作]({{< relref "./docs/Developerguide/管理并发写入操作.md >}}) + - [事务隔离说明]({{< relref "./docs/Developerguide/事务隔离说明.md >}}) + - [写入和读写操作]({{< relref "./docs/Developerguide/写入和读写操作.md >}}) + - [并发写入事务的潜在死锁情况]({{< relref "./docs/Developerguide/并发写入事务的潜在死锁情况.md >}}) + - [并发写入示例]({{< relref "./docs/Developerguide/并发写入示例.md >}}) + - [相同表的INSERT和DELETE并发]({{< relref "./docs/Developerguide/相同表的INSERT和DELETE并发.md >}}) + - [相同表的并发INSERT]({{< relref "./docs/Developerguide/相同表的并发INSERT.md >}}) + - [相同表的并发UPDATE]({{< relref "./docs/Developerguide/相同表的并发UPDATE.md >}}) + - [数据导入和查询的并发]({{< relref "./docs/Developerguide/数据导入和查询的并发.md >}}) + - [导出数据]({{< relref "./docs/Developerguide/导出数据.md >}}) + - [使用gs\_dump和gs\_dumpall命令导出数据]({{< relref "./docs/Developerguide/使用gs_dump和gs_dumpall命令导出数据.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述 -12.md >}}) + - [导出单个数据库]({{< relref "./docs/Developerguide/导出单个数据库.md >}}) + - [导出数据库]({{< relref "./docs/Developerguide/导出数据库.md >}}) + - [导出模式]({{< relref "./docs/Developerguide/导出模式.md >}}) + - [导出表]({{< relref "./docs/Developerguide/导出表.md >}}) + - [导出所有数据库]({{< relref "./docs/Developerguide/导出所有数据库.md >}}) + - [导出所有数据库]({{< relref "./docs/Developerguide/导出所有数据库 -13.md >}}) + - [导出全局对象]({{< relref "./docs/Developerguide/导出全局对象.md >}}) + - [无权限角色导出数据]({{< relref "./docs/Developerguide/无权限角色导出数据.md >}}) + - [AI特性]({{< relref "./docs/Developerguide/AI特性.md >}}) + - [SQL执行时间预测特性]({{< relref "./docs/Developerguide/SQL执行时间预测特性.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述 -14.md >}}) + - [使用指南]({{< relref "./docs/Developerguide/使用指南.md >}}) + - [最佳实践]({{< relref "./docs/Developerguide/最佳实践.md >}}) + - [常见问题处理]({{< relref "./docs/Developerguide/常见问题处理.md >}}) + - [配置运行参数]({{< relref "./docs/Developerguide/配置运行参数.md >}}) + - [查看参数当前取值]({{< relref "./docs/Developerguide/查看参数当前取值.md >}}) + - [重设参数]({{< relref "./docs/Developerguide/重设参数.md >}}) + - [SQL参考]({{< relref "./docs/Developerguide/SQL参考.md >}}) + - [openGauss SQL]({{< relref "./docs/Developerguide/openGauss -SQL.md >}}) + - [关键字]({{< relref "./docs/Developerguide/关键字.md >}}) + - [数据类型]({{< relref "./docs/Developerguide/数据类型.md >}}) + - [数值类型]({{< relref "./docs/Developerguide/数值类型.md >}}) + - [货币类型]({{< relref "./docs/Developerguide/货币类型.md >}}) + - [布尔类型]({{< relref "./docs/Developerguide/布尔类型.md >}}) + - [字符类型]({{< relref "./docs/Developerguide/字符类型.md >}}) + - [二进制类型]({{< relref "./docs/Developerguide/二进制类型.md >}}) + - [日期/时间类型]({{< relref "./docs/Developerguide/日期 -时间类型.md >}}) + - [几何类型]({{< relref "./docs/Developerguide/几何类型.md >}}) + - [网络地址类型]({{< relref "./docs/Developerguide/网络地址类型.md >}}) + - [位串类型]({{< relref "./docs/Developerguide/位串类型.md >}}) + - [文本搜索类型]({{< relref "./docs/Developerguide/文本搜索类型.md >}}) + - [UUID类型]({{< relref "./docs/Developerguide/UUID类型.md >}}) + - [JSON类型]({{< relref "./docs/Developerguide/JSON类型.md >}}) + - [对象标识符类型]({{< relref "./docs/Developerguide/对象标识符类型.md >}}) + - [伪类型]({{< relref "./docs/Developerguide/伪类型.md >}}) + - [列存表支持的数据类型]({{< relref "./docs/Developerguide/列存表支持的数据类型.md >}}) + - [常量与宏]({{< relref "./docs/Developerguide/常量与宏.md >}}) + - [函数和操作符]({{< relref "./docs/Developerguide/函数和操作符.md >}}) + - [逻辑操作符]({{< relref "./docs/Developerguide/逻辑操作符.md >}}) + - [比较操作符]({{< relref "./docs/Developerguide/比较操作符.md >}}) + - [字符处理函数和操作符]({{< relref "./docs/Developerguide/字符处理函数和操作符.md >}}) + - [二进制字符串函数和操作符]({{< relref "./docs/Developerguide/二进制字符串函数和操作符.md >}}) + - [位串函数和操作符]({{< relref "./docs/Developerguide/位串函数和操作符.md >}}) + - [模式匹配操作符]({{< relref "./docs/Developerguide/模式匹配操作符.md >}}) + - [数字操作函数和操作符]({{< relref "./docs/Developerguide/数字操作函数和操作符.md >}}) + - [时间和日期处理函数和操作符]({{< relref "./docs/Developerguide/时间和日期处理函数和操作符.md >}}) + - [类型转换函数]({{< relref "./docs/Developerguide/类型转换函数.md >}}) + - [几何函数和操作符]({{< relref "./docs/Developerguide/几何函数和操作符.md >}}) + - [网络地址函数和操作符]({{< relref "./docs/Developerguide/网络地址函数和操作符.md >}}) + - [文本检索函数和操作符]({{< relref "./docs/Developerguide/文本检索函数和操作符.md >}}) + - [JSON函数]({{< relref "./docs/Developerguide/JSON函数.md >}}) + - [SEQUENCE函数]({{< relref "./docs/Developerguide/SEQUENCE函数.md >}}) + - [数组函数和操作符]({{< relref "./docs/Developerguide/数组函数和操作符.md >}}) + - [范围函数和操作符]({{< relref "./docs/Developerguide/范围函数和操作符.md >}}) + - [聚集函数]({{< relref "./docs/Developerguide/聚集函数.md >}}) + - [窗口函数]({{< relref "./docs/Developerguide/窗口函数.md >}}) + - [安全函数]({{< relref "./docs/Developerguide/安全函数.md >}}) + - [返回集合的函数]({{< relref "./docs/Developerguide/返回集合的函数.md >}}) + - [条件表达式函数]({{< relref "./docs/Developerguide/条件表达式函数.md >}}) + - [系统信息函数]({{< relref "./docs/Developerguide/系统信息函数.md >}}) + - [系统管理函数]({{< relref "./docs/Developerguide/系统管理函数.md >}}) + - [配置设置函数]({{< relref "./docs/Developerguide/配置设置函数.md >}}) + - [通用文件访问函数]({{< relref "./docs/Developerguide/通用文件访问函数.md >}}) + - [服务器信号函数]({{< relref "./docs/Developerguide/服务器信号函数.md >}}) + - [备份恢复控制函数]({{< relref "./docs/Developerguide/备份恢复控制函数.md >}}) + - [快照同步函数]({{< relref "./docs/Developerguide/快照同步函数.md >}}) + - [数据库对象函数]({{< relref "./docs/Developerguide/数据库对象函数.md >}}) + - [咨询锁函数]({{< relref "./docs/Developerguide/咨询锁函数.md >}}) + - [逻辑复制函数]({{< relref "./docs/Developerguide/逻辑复制函数.md >}}) + - [其它函数]({{< relref "./docs/Developerguide/其它函数.md >}}) + - [统计信息函数]({{< relref "./docs/Developerguide/统计信息函数.md >}}) + - [触发器函数]({{< relref "./docs/Developerguide/触发器函数.md >}}) + - [内部接口函数]({{< relref "./docs/Developerguide/内部接口函数.md >}}) + - [表达式]({{< relref "./docs/Developerguide/表达式.md >}}) + - [简单表达式]({{< relref "./docs/Developerguide/简单表达式.md >}}) + - [条件表达式]({{< relref "./docs/Developerguide/条件表达式.md >}}) + - [子查询表达式]({{< relref "./docs/Developerguide/子查询表达式.md >}}) + - [数组表达式]({{< relref "./docs/Developerguide/数组表达式.md >}}) + - [行表达式]({{< relref "./docs/Developerguide/行表达式.md >}}) + - [类型转换]({{< relref "./docs/Developerguide/类型转换.md >}}) + - [概述]({{< relref "./docs/Developerguide/概述 -15.md >}}) + - [操作符]({{< relref "./docs/Developerguide/操作符.md >}}) + - [函数]({{< relref "./docs/Developerguide/函数.md >}}) + - [值存储]({{< relref "./docs/Developerguide/值存储.md >}}) + - [UNION,CASE和相关构造]({{< relref "./docs/Developerguide/UNION -CASE和相关构造.md >}}) + - [全文检索]({{< relref "./docs/Developerguide/全文检索.md >}}) + - [介绍]({{< relref "./docs/Developerguide/介绍.md >}}) + - [全文检索概述]({{< relref "./docs/Developerguide/全文检索概述.md >}}) + - [文档概念]({{< relref "./docs/Developerguide/文档概念.md >}}) + - [基本文本匹配]({{< relref "./docs/Developerguide/基本文本匹配.md >}}) + - [分词器]({{< relref "./docs/Developerguide/分词器.md >}}) + - [表和索引]({{< relref "./docs/Developerguide/表和索引.md >}}) + - [搜索表]({{< relref "./docs/Developerguide/搜索表.md >}}) + - [创建索引]({{< relref "./docs/Developerguide/创建索引.md >}}) + - [索引使用约束]({{< relref "./docs/Developerguide/索引使用约束.md >}}) + - [控制文本搜索]({{< relref "./docs/Developerguide/控制文本搜索.md >}}) + - [解析文档]({{< relref "./docs/Developerguide/解析文档.md >}}) + - [解析查询]({{< relref "./docs/Developerguide/解析查询.md >}}) + - [排序查询结果]({{< relref "./docs/Developerguide/排序查询结果.md >}}) + - [高亮搜索结果]({{< relref "./docs/Developerguide/高亮搜索结果.md >}}) + - [附加功能]({{< relref "./docs/Developerguide/附加功能.md >}}) + - [处理tsvector]({{< relref "./docs/Developerguide/处理tsvector.md >}}) + - [处理查询]({{< relref "./docs/Developerguide/处理查询.md >}}) + - [查询重写]({{< relref "./docs/Developerguide/查询重写.md >}}) + - [收集文献统计]({{< relref "./docs/Developerguide/收集文献统计.md >}}) + - [解析器]({{< relref "./docs/Developerguide/解析器.md >}}) + - [词典]({{< relref "./docs/Developerguide/词典.md >}}) + - [词典概述]({{< relref "./docs/Developerguide/词典概述.md >}}) + - [停用词]({{< relref "./docs/Developerguide/停用词.md >}}) + - [Simple词典]({{< relref "./docs/Developerguide/Simple词典.md >}}) + - [Synonym词典]({{< relref "./docs/Developerguide/Synonym词典.md >}}) + - [Thesaurus词典]({{< relref "./docs/Developerguide/Thesaurus词典.md >}}) + - [Ispell词典]({{< relref "./docs/Developerguide/Ispell词典.md >}}) + - [Snowball词典]({{< relref "./docs/Developerguide/Snowball词典.md >}}) + - [配置示例]({{< relref "./docs/Developerguide/配置示例.md >}}) + - [测试和调试文本搜索]({{< relref "./docs/Developerguide/测试和调试文本搜索.md >}}) + - [分词器测试]({{< relref "./docs/Developerguide/分词器测试.md >}}) + - [解析器测试]({{< relref "./docs/Developerguide/解析器测试.md >}}) + - [词典测试]({{< relref "./docs/Developerguide/词典测试.md >}}) + - [限制约束]({{< relref "./docs/Developerguide/限制约束.md >}}) + - [系统操作]({{< relref "./docs/Developerguide/系统操作.md >}}) + - [事务控制]({{< relref "./docs/Developerguide/事务控制.md >}}) + - [DDL语法一览表]({{< relref "./docs/Developerguide/DDL语法一览表.md >}}) + - [DML语法一览表]({{< relref "./docs/Developerguide/DML语法一览表.md >}}) + - [DCL语法一览表]({{< relref "./docs/Developerguide/DCL语法一览表.md >}}) + - [SQL语法]({{< relref "./docs/Developerguide/SQL语法.md >}}) + - [ABORT]({{< relref "./docs/Developerguide/ABORT.md >}}) + - [ALTER DATABASE]({{< relref "./docs/Developerguide/ALTER -DATABASE.md >}}) + - [ALTER DATA SOURCE]({{< relref "./docs/Developerguide/ALTER -DATA -SOURCE.md >}}) + - [ALTER DEFAULT PRIVILEGES]({{< relref "./docs/Developerguide/ALTER -DEFAULT -PRIVILEGES.md >}}) + - [ALTER DIRECTORY]({{< relref "./docs/Developerguide/ALTER -DIRECTORY.md >}}) + - [ALTER FUNCTION]({{< relref "./docs/Developerguide/ALTER -FUNCTION.md >}}) + - [ALTER GROUP]({{< relref "./docs/Developerguide/ALTER -GROUP.md >}}) + - [ALTER INDEX]({{< relref "./docs/Developerguide/ALTER -INDEX.md >}}) + - [ALTER LARGE OBJECT]({{< relref "./docs/Developerguide/ALTER -LARGE -OBJECT.md >}}) + - [ALTER ROLE]({{< relref "./docs/Developerguide/ALTER -ROLE.md >}}) + - [ALTER ROW LEVEL SECURITY POLICY]({{< relref "./docs/Developerguide/ALTER -ROW -LEVEL -SECURITY -POLICY.md >}}) + - [ALTER SCHEMA]({{< relref "./docs/Developerguide/ALTER -SCHEMA.md >}}) + - [ALTER SEQUENCE]({{< relref "./docs/Developerguide/ALTER -SEQUENCE.md >}}) + - [ALTER SESSION]({{< relref "./docs/Developerguide/ALTER -SESSION.md >}}) + - [ALTER SYSTEM KILL SESSION]({{< relref "./docs/Developerguide/ALTER -SYSTEM -KILL -SESSION.md >}}) + - [ALTER TABLE]({{< relref "./docs/Developerguide/ALTER -TABLE.md >}}) + - [ALTER TABLE PARTITION]({{< relref "./docs/Developerguide/ALTER -TABLE -PARTITION.md >}}) + - [ALTER TABLESPACE]({{< relref "./docs/Developerguide/ALTER -TABLESPACE.md >}}) + - [ALTER TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/ALTER -TEXT -SEARCH -CONFIGURATION.md >}}) + - [ALTER TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/ALTER -TEXT -SEARCH -DICTIONARY.md >}}) + - [ALTER TRIGGER]({{< relref "./docs/Developerguide/ALTER -TRIGGER.md >}}) + - [ALTER TYPE]({{< relref "./docs/Developerguide/ALTER -TYPE.md >}}) + - [ALTER USER]({{< relref "./docs/Developerguide/ALTER -USER.md >}}) + - [ALTER VIEW]({{< relref "./docs/Developerguide/ALTER -VIEW.md >}}) + - [ANALYZE | ANALYSE]({{< relref "./docs/Developerguide/ANALYZE -ANALYSE.md >}}) + - [BEGIN]({{< relref "./docs/Developerguide/BEGIN.md >}}) + - [CALL]({{< relref "./docs/Developerguide/CALL.md >}}) + - [CHECKPOINT]({{< relref "./docs/Developerguide/CHECKPOINT.md >}}) + - [CLOSE]({{< relref "./docs/Developerguide/CLOSE.md >}}) + - [CLUSTER]({{< relref "./docs/Developerguide/CLUSTER.md >}}) + - [COMMENT]({{< relref "./docs/Developerguide/COMMENT.md >}}) + - [COMMIT | END]({{< relref "./docs/Developerguide/COMMIT -END.md >}}) + - [COMMIT PREPARED]({{< relref "./docs/Developerguide/COMMIT -PREPARED.md >}}) + - [COPY]({{< relref "./docs/Developerguide/COPY.md >}}) + - [CREATE DATABASE]({{< relref "./docs/Developerguide/CREATE -DATABASE.md >}}) + - [CREATE DATA SOURCE]({{< relref "./docs/Developerguide/CREATE -DATA -SOURCE.md >}}) + - [CREATE DIRECTORY]({{< relref "./docs/Developerguide/CREATE -DIRECTORY.md >}}) + - [CREATE FUNCTION]({{< relref "./docs/Developerguide/CREATE -FUNCTION.md >}}) + - [CREATE GROUP]({{< relref "./docs/Developerguide/CREATE -GROUP.md >}}) + - [CREATE INDEX]({{< relref "./docs/Developerguide/CREATE -INDEX.md >}}) + - [CREATE ROW LEVLEL SECURITY POLICY]({{< relref "./docs/Developerguide/CREATE -ROW -LEVLEL -SECURITY -POLICY.md >}}) + - [CREATE PROCEDURE]({{< relref "./docs/Developerguide/CREATE -PROCEDURE.md >}}) + - [CREATE ROLE]({{< relref "./docs/Developerguide/CREATE -ROLE.md >}}) + - [CREATE SCHEMA]({{< relref "./docs/Developerguide/CREATE -SCHEMA.md >}}) + - [CREATE SEQUENCE]({{< relref "./docs/Developerguide/CREATE -SEQUENCE.md >}}) + - [CREATE TABLE]({{< relref "./docs/Developerguide/CREATE -TABLE.md >}}) + - [CREATE TABLE AS]({{< relref "./docs/Developerguide/CREATE -TABLE -AS.md >}}) + - [CREATE TABLE PARTITION]({{< relref "./docs/Developerguide/CREATE -TABLE -PARTITION.md >}}) + - [CREATE TABLESPACE]({{< relref "./docs/Developerguide/CREATE -TABLESPACE.md >}}) + - [CREATE TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/CREATE -TEXT -SEARCH -CONFIGURATION.md >}}) + - [CREATE TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/CREATE -TEXT -SEARCH -DICTIONARY.md >}}) + - [CREATE TRIGGER]({{< relref "./docs/Developerguide/CREATE -TRIGGER.md >}}) + - [CREATE TYPE]({{< relref "./docs/Developerguide/CREATE -TYPE.md >}}) + - [CREATE USER]({{< relref "./docs/Developerguide/CREATE -USER.md >}}) + - [CREATE VIEW]({{< relref "./docs/Developerguide/CREATE -VIEW.md >}}) + - [CURSOR]({{< relref "./docs/Developerguide/CURSOR.md >}}) + - [DEALLOCATE]({{< relref "./docs/Developerguide/DEALLOCATE.md >}}) + - [DECLARE]({{< relref "./docs/Developerguide/DECLARE.md >}}) + - [DELETE]({{< relref "./docs/Developerguide/DELETE.md >}}) + - [DO]({{< relref "./docs/Developerguide/DO.md >}}) + - [DROP DATABASE]({{< relref "./docs/Developerguide/DROP -DATABASE.md >}}) + - [DROP DATA SOURCE]({{< relref "./docs/Developerguide/DROP -DATA -SOURCE.md >}}) + - [DROP DIRECTORY]({{< relref "./docs/Developerguide/DROP -DIRECTORY.md >}}) + - [DROP FUNCTION]({{< relref "./docs/Developerguide/DROP -FUNCTION.md >}}) + - [DROP GROUP]({{< relref "./docs/Developerguide/DROP -GROUP.md >}}) + - [DROP INDEX]({{< relref "./docs/Developerguide/DROP -INDEX.md >}}) + - [DROP OWNED]({{< relref "./docs/Developerguide/DROP -OWNED.md >}}) + - [DROP ROW LEVEL SECURITY POLICY]({{< relref "./docs/Developerguide/DROP -ROW -LEVEL -SECURITY -POLICY.md >}}) + - [DROP PROCEDURE]({{< relref "./docs/Developerguide/DROP -PROCEDURE.md >}}) + - [DROP ROLE]({{< relref "./docs/Developerguide/DROP -ROLE.md >}}) + - [DROP SCHEMA]({{< relref "./docs/Developerguide/DROP -SCHEMA.md >}}) + - [DROP SEQUENCE]({{< relref "./docs/Developerguide/DROP -SEQUENCE.md >}}) + - [DROP TABLE]({{< relref "./docs/Developerguide/DROP -TABLE.md >}}) + - [DROP TABLESPACE]({{< relref "./docs/Developerguide/DROP -TABLESPACE.md >}}) + - [DROP TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/DROP -TEXT -SEARCH -CONFIGURATION.md >}}) + - [DROP TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/DROP -TEXT -SEARCH -DICTIONARY.md >}}) + - [DROP TRIGGER]({{< relref "./docs/Developerguide/DROP -TRIGGER.md >}}) + - [DROP TYPE]({{< relref "./docs/Developerguide/DROP -TYPE.md >}}) + - [DROP USER]({{< relref "./docs/Developerguide/DROP -USER.md >}}) + - [DROP VIEW]({{< relref "./docs/Developerguide/DROP -VIEW.md >}}) + - [EXECUTE]({{< relref "./docs/Developerguide/EXECUTE.md >}}) + - [EXPLAIN]({{< relref "./docs/Developerguide/EXPLAIN.md >}}) + - [EXPLAIN PLAN]({{< relref "./docs/Developerguide/EXPLAIN -PLAN.md >}}) + - [FETCH]({{< relref "./docs/Developerguide/FETCH.md >}}) + - [GRANT]({{< relref "./docs/Developerguide/GRANT.md >}}) + - [INSERT]({{< relref "./docs/Developerguide/INSERT.md >}}) + - [LOCK]({{< relref "./docs/Developerguide/LOCK.md >}}) + - [MOVE]({{< relref "./docs/Developerguide/MOVE.md >}}) + - [MERGE INTO]({{< relref "./docs/Developerguide/MERGE -INTO.md >}}) + - [PREPARE]({{< relref "./docs/Developerguide/PREPARE.md >}}) + - [PREPARE TRANSACTION]({{< relref "./docs/Developerguide/PREPARE -TRANSACTION.md >}}) + - [REASSIGN OWNED]({{< relref "./docs/Developerguide/REASSIGN -OWNED.md >}}) + - [REINDEX]({{< relref "./docs/Developerguide/REINDEX.md >}}) + - [RELEASE SAVEPOINT]({{< relref "./docs/Developerguide/RELEASE -SAVEPOINT.md >}}) + - [RESET]({{< relref "./docs/Developerguide/RESET.md >}}) + - [REVOKE]({{< relref "./docs/Developerguide/REVOKE.md >}}) + - [ROLLBACK]({{< relref "./docs/Developerguide/ROLLBACK.md >}}) + - [ROLLBACK PREPARED]({{< relref "./docs/Developerguide/ROLLBACK -PREPARED.md >}}) + - [ROLLBACK TO SAVEPOINT]({{< relref "./docs/Developerguide/ROLLBACK -TO -SAVEPOINT.md >}}) + - [SAVEPOINT]({{< relref "./docs/Developerguide/SAVEPOINT.md >}}) + - [SELECT]({{< relref "./docs/Developerguide/SELECT.md >}}) + - [SELECT INTO]({{< relref "./docs/Developerguide/SELECT -INTO.md >}}) + - [SET]({{< relref "./docs/Developerguide/SET.md >}}) + - [SET CONSTRAINTS]({{< relref "./docs/Developerguide/SET -CONSTRAINTS.md >}}) + - [SET ROLE]({{< relref "./docs/Developerguide/SET -ROLE.md >}}) + - [SET SESSION AUTHORIZATION]({{< relref "./docs/Developerguide/SET -SESSION -AUTHORIZATION.md >}}) + - [SET TRANSACTION]({{< relref "./docs/Developerguide/SET -TRANSACTION.md >}}) + - [SHOW]({{< relref "./docs/Developerguide/SHOW.md >}}) + - [START TRANSACTION]({{< relref "./docs/Developerguide/START -TRANSACTION.md >}}) + - [TRUNCATE]({{< relref "./docs/Developerguide/TRUNCATE.md >}}) + - [UPDATE]({{< relref "./docs/Developerguide/UPDATE.md >}}) + - [VACUUM]({{< relref "./docs/Developerguide/VACUUM.md >}}) + - [VALUES]({{< relref "./docs/Developerguide/VALUES.md >}}) + - [附录]({{< relref "./docs/Developerguide/附录 -16.md >}}) + - [GIN索引]({{< relref "./docs/Developerguide/GIN索引.md >}}) + - [介绍]({{< relref "./docs/Developerguide/介绍 -17.md >}}) + - [扩展性]({{< relref "./docs/Developerguide/扩展性.md >}}) + - [实现]({{< relref "./docs/Developerguide/实现.md >}}) + - [GIN提示与技巧]({{< relref "./docs/Developerguide/GIN提示与技巧.md >}}) + - [扩展函数]({{< relref "./docs/Developerguide/扩展函数.md >}}) + - [扩展语法]({{< relref "./docs/Developerguide/扩展语法.md >}}) + - [系统表和系统视图]({{< relref "./docs/Developerguide/系统表和系统视图.md >}}) + - [系统表和系统视图概述]({{< relref "./docs/Developerguide/系统表和系统视图概述.md >}}) + - [系统表]({{< relref "./docs/Developerguide/系统表.md >}}) + - [GS\_OPT\_MODEL]({{< relref "./docs/Developerguide/GS_OPT_MODEL.md >}}) + - [GS\_WLM\_INSTANCE\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md >}}) + - [GS\_WLM\_OPERATOR\_INFO]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_INFO.md >}}) + - [GS\_WLM\_PLAN\_ENCODING\_TABLE]({{< relref "./docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md >}}) + - [GS\_WLM\_PLAN\_OPERATOR\_INFO]({{< relref "./docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md >}}) + - [GS\_WLM\_SESSION\_QUERY\_INFO\_ALL]({{< relref "./docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md >}}) + - [GS\_WLM\_USER\_RESOURCE\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md >}}) + - [PG\_AGGREGATE]({{< relref "./docs/Developerguide/PG_AGGREGATE.md >}}) + - [PG\_AM]({{< relref "./docs/Developerguide/PG_AM.md >}}) + - [PG\_AMOP]({{< relref "./docs/Developerguide/PG_AMOP.md >}}) + - [PG\_AMPROC]({{< relref "./docs/Developerguide/PG_AMPROC.md >}}) + - [PG\_APP\_WORKLOADGROUP\_MAPPING]({{< relref "./docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md >}}) + - [PG\_ATTRDEF]({{< relref "./docs/Developerguide/PG_ATTRDEF.md >}}) + - [PG\_ATTRIBUTE]({{< relref "./docs/Developerguide/PG_ATTRIBUTE.md >}}) + - [PG\_AUTHID]({{< relref "./docs/Developerguide/PG_AUTHID.md >}}) + - [PG\_AUTH\_HISTORY]({{< relref "./docs/Developerguide/PG_AUTH_HISTORY.md >}}) + - [PG\_AUTH\_MEMBERS]({{< relref "./docs/Developerguide/PG_AUTH_MEMBERS.md >}}) + - [PG\_CAST]({{< relref "./docs/Developerguide/PG_CAST.md >}}) + - [PG\_CLASS]({{< relref "./docs/Developerguide/PG_CLASS.md >}}) + - [PG\_COLLATION]({{< relref "./docs/Developerguide/PG_COLLATION.md >}}) + - [PG\_CONSTRAINT]({{< relref "./docs/Developerguide/PG_CONSTRAINT.md >}}) + - [PG\_CONVERSION]({{< relref "./docs/Developerguide/PG_CONVERSION.md >}}) + - [PG\_DATABASE]({{< relref "./docs/Developerguide/PG_DATABASE.md >}}) + - [PG\_DB\_ROLE\_SETTING]({{< relref "./docs/Developerguide/PG_DB_ROLE_SETTING.md >}}) + - [PG\_DEFAULT\_ACL]({{< relref "./docs/Developerguide/PG_DEFAULT_ACL.md >}}) + - [PG\_DEPEND]({{< relref "./docs/Developerguide/PG_DEPEND.md >}}) + - [PG\_DESCRIPTION]({{< relref "./docs/Developerguide/PG_DESCRIPTION.md >}}) + - [PG\_DIRECTORY]({{< relref "./docs/Developerguide/PG_DIRECTORY.md >}}) + - [PG\_ENUM]({{< relref "./docs/Developerguide/PG_ENUM.md >}}) + - [PG\_EXTENSION]({{< relref "./docs/Developerguide/PG_EXTENSION.md >}}) + - [PG\_EXTENSION\_DATA\_SOURCE]({{< relref "./docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md >}}) + - [PG\_FOREIGN\_DATA\_WRAPPER]({{< relref "./docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md >}}) + - [PG\_FOREIGN\_SERVER]({{< relref "./docs/Developerguide/PG_FOREIGN_SERVER.md >}}) + - [PG\_FOREIGN\_TABLE]({{< relref "./docs/Developerguide/PG_FOREIGN_TABLE.md >}}) + - [PG\_INDEX]({{< relref "./docs/Developerguide/PG_INDEX.md >}}) + - [PG\_INHERITS]({{< relref "./docs/Developerguide/PG_INHERITS.md >}}) + - [PG\_JOB]({{< relref "./docs/Developerguide/PG_JOB.md >}}) + - [PG\_JOB\_PROC]({{< relref "./docs/Developerguide/PG_JOB_PROC.md >}}) + - [PG\_LANGUAGE]({{< relref "./docs/Developerguide/PG_LANGUAGE.md >}}) + - [PG\_LARGEOBJECT]({{< relref "./docs/Developerguide/PG_LARGEOBJECT.md >}}) + - [PG\_LARGEOBJECT\_METADATA]({{< relref "./docs/Developerguide/PG_LARGEOBJECT_METADATA.md >}}) + - [PG\_NAMESPACE]({{< relref "./docs/Developerguide/PG_NAMESPACE.md >}}) + - [PG\_OBJECT]({{< relref "./docs/Developerguide/PG_OBJECT.md >}}) + - [PG\_OPCLASS]({{< relref "./docs/Developerguide/PG_OPCLASS.md >}}) + - [PG\_OPERATOR]({{< relref "./docs/Developerguide/PG_OPERATOR.md >}}) + - [PG\_OPFAMILY]({{< relref "./docs/Developerguide/PG_OPFAMILY.md >}}) + - [PG\_PARTITION]({{< relref "./docs/Developerguide/PG_PARTITION.md >}}) + - [PG\_PLTEMPLATE]({{< relref "./docs/Developerguide/PG_PLTEMPLATE.md >}}) + - [PG\_PROC]({{< relref "./docs/Developerguide/PG_PROC.md >}}) + - [PG\_RANGE]({{< relref "./docs/Developerguide/PG_RANGE.md >}}) + - [PG\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/PG_RESOURCE_POOL.md >}}) + - [PG\_REWRITE]({{< relref "./docs/Developerguide/PG_REWRITE.md >}}) + - [PG\_RLSPOLICY]({{< relref "./docs/Developerguide/PG_RLSPOLICY.md >}}) + - [PG\_SECLABEL]({{< relref "./docs/Developerguide/PG_SECLABEL.md >}}) + - [PG\_SHDEPEND]({{< relref "./docs/Developerguide/PG_SHDEPEND.md >}}) + - [PG\_SHDESCRIPTION]({{< relref "./docs/Developerguide/PG_SHDESCRIPTION.md >}}) + - [PG\_SHSECLABEL]({{< relref "./docs/Developerguide/PG_SHSECLABEL.md >}}) + - [PG\_STATISTIC]({{< relref "./docs/Developerguide/PG_STATISTIC.md >}}) + - [PG\_STATISTIC\_EXT]({{< relref "./docs/Developerguide/PG_STATISTIC_EXT.md >}}) + - [PG\_TABLESPACE]({{< relref "./docs/Developerguide/PG_TABLESPACE.md >}}) + - [PG\_TRIGGER]({{< relref "./docs/Developerguide/PG_TRIGGER.md >}}) + - [PG\_TS\_CONFIG]({{< relref "./docs/Developerguide/PG_TS_CONFIG.md >}}) + - [PG\_TS\_CONFIG\_MAP]({{< relref "./docs/Developerguide/PG_TS_CONFIG_MAP.md >}}) + - [PG\_TS\_DICT]({{< relref "./docs/Developerguide/PG_TS_DICT.md >}}) + - [PG\_TS\_PARSER]({{< relref "./docs/Developerguide/PG_TS_PARSER.md >}}) + - [PG\_TS\_TEMPLATE]({{< relref "./docs/Developerguide/PG_TS_TEMPLATE.md >}}) + - [PG\_TYPE]({{< relref "./docs/Developerguide/PG_TYPE.md >}}) + - [PG\_USER\_MAPPING]({{< relref "./docs/Developerguide/PG_USER_MAPPING.md >}}) + - [PG\_USER\_STATUS]({{< relref "./docs/Developerguide/PG_USER_STATUS.md >}}) + - [PG\_WORKLOAD\_GROUP]({{< relref "./docs/Developerguide/PG_WORKLOAD_GROUP.md >}}) + - [PLAN\_TABLE\_DATA]({{< relref "./docs/Developerguide/PLAN_TABLE_DATA.md >}}) + - [系统视图]({{< relref "./docs/Developerguide/系统视图.md >}}) + - [GET\_GTM\_LITE\_STATUS]({{< relref "./docs/Developerguide/GET_GTM_LITE_STATUS.md >}}) + - [GS\_SESSION\_CPU\_STATISTICS]({{< relref "./docs/Developerguide/GS_SESSION_CPU_STATISTICS.md >}}) + - [GS\_SESSION\_MEMORY\_STATISTICS]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md >}}) + - [GS\_SQL\_COUNT]({{< relref "./docs/Developerguide/GS_SQL_COUNT.md >}}) + - [GS\_WLM\_OPERATOR\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md >}}) + - [GS\_WLM\_OPERATOR\_STATISTICS]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md >}}) + - [GS\_WLM\_PLAN\_OPERATOR\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md >}}) + - [GS\_WLM\_REBUILD\_USER\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md >}}) + - [GS\_WLM\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/GS_WLM_RESOURCE_POOL.md >}}) + - [GS\_WLM\_SESSION\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_SESSION_HISTORY.md >}}) + - [GS\_WLM\_SESSION\_INFO\_ALL]({{< relref "./docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md >}}) + - [GS\_WLM\_USER\_INFO]({{< relref "./docs/Developerguide/GS_WLM_USER_INFO.md >}}) + - [GS\_WLM\_SESSION\_STATISTICS]({{< relref "./docs/Developerguide/GS_WLM_SESSION_STATISTICS.md >}}) + - [GS\_STAT\_DB\_CU]({{< relref "./docs/Developerguide/GS_STAT_DB_CU.md >}}) + - [GS\_STAT\_SESSION\_CU]({{< relref "./docs/Developerguide/GS_STAT_SESSION_CU.md >}}) + - [MPP\_TABLES]({{< relref "./docs/Developerguide/MPP_TABLES.md >}}) + - [PG\_AVAILABLE\_EXTENSION\_VERSIONS]({{< relref "./docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md >}}) + - [PG\_AVAILABLE\_EXTENSIONS]({{< relref "./docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md >}}) + - [PG\_CURSORS]({{< relref "./docs/Developerguide/PG_CURSORS.md >}}) + - [PG\_EXT\_STATS]({{< relref "./docs/Developerguide/PG_EXT_STATS.md >}}) + - [PG\_GET\_INVALID\_BACKENDS]({{< relref "./docs/Developerguide/PG_GET_INVALID_BACKENDS.md >}}) + - [PG\_GET\_SENDERS\_CATCHUP\_TIME]({{< relref "./docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md >}}) + - [PG\_GROUP]({{< relref "./docs/Developerguide/PG_GROUP.md >}}) + - [PG\_INDEXES]({{< relref "./docs/Developerguide/PG_INDEXES.md >}}) + - [PG\_LOCKS]({{< relref "./docs/Developerguide/PG_LOCKS.md >}}) + - [PG\_NODE\_ENV]({{< relref "./docs/Developerguide/PG_NODE_ENV.md >}}) + - [PG\_OS\_THREADS]({{< relref "./docs/Developerguide/PG_OS_THREADS.md >}}) + - [PG\_PREPARED\_STATEMENTS]({{< relref "./docs/Developerguide/PG_PREPARED_STATEMENTS.md >}}) + - [PG\_PREPARED\_XACTS]({{< relref "./docs/Developerguide/PG_PREPARED_XACTS.md >}}) + - [PG\_REPLICATION\_SLOTS]({{< relref "./docs/Developerguide/PG_REPLICATION_SLOTS.md >}}) + - [PG\_RLSPOLICIES]({{< relref "./docs/Developerguide/PG_RLSPOLICIES.md >}}) + - [PG\_ROLES]({{< relref "./docs/Developerguide/PG_ROLES.md >}}) + - [PG\_RULES]({{< relref "./docs/Developerguide/PG_RULES.md >}}) + - [PG\_RUNNING\_XACTS]({{< relref "./docs/Developerguide/PG_RUNNING_XACTS.md >}}) + - [PG\_SECLABELS]({{< relref "./docs/Developerguide/PG_SECLABELS.md >}}) + - [PG\_SESSION\_WLMSTAT]({{< relref "./docs/Developerguide/PG_SESSION_WLMSTAT.md >}}) + - [PG\_SESSION\_IOSTAT]({{< relref "./docs/Developerguide/PG_SESSION_IOSTAT.md >}}) + - [PG\_SETTINGS]({{< relref "./docs/Developerguide/PG_SETTINGS.md >}}) + - [PG\_SHADOW]({{< relref "./docs/Developerguide/PG_SHADOW.md >}}) + - [PG\_STATS]({{< relref "./docs/Developerguide/PG_STATS.md >}}) + - [PG\_STAT\_ACTIVITY]({{< relref "./docs/Developerguide/PG_STAT_ACTIVITY.md >}}) + - [PG\_STAT\_ALL\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_ALL_INDEXES.md >}}) + - [PG\_STAT\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_ALL_TABLES.md >}}) + - [PG\_STAT\_BAD\_BLOCK]({{< relref "./docs/Developerguide/PG_STAT_BAD_BLOCK.md >}}) + - [PG\_STAT\_BGWRITER]({{< relref "./docs/Developerguide/PG_STAT_BGWRITER.md >}}) + - [PG\_STAT\_DATABASE]({{< relref "./docs/Developerguide/PG_STAT_DATABASE.md >}}) + - [PG\_STAT\_DATABASE\_CONFLICTS]({{< relref "./docs/Developerguide/PG_STAT_DATABASE_CONFLICTS.md >}}) + - [PG\_STAT\_USER\_FUNCTIONS]({{< relref "./docs/Developerguide/PG_STAT_USER_FUNCTIONS.md >}}) + - [PG\_STAT\_USER\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_USER_INDEXES.md >}}) + - [PG\_STAT\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_USER_TABLES.md >}}) + - [PG\_STAT\_REPLICATION]({{< relref "./docs/Developerguide/PG_STAT_REPLICATION.md >}}) + - [PG\_STAT\_SYS\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_SYS_INDEXES.md >}}) + - [PG\_STAT\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_SYS_TABLES.md >}}) + - [PG\_STAT\_XACT\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md >}}) + - [PG\_STAT\_XACT\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md >}}) + - [PG\_STAT\_XACT\_USER\_FUNCTIONS]({{< relref "./docs/Developerguide/PG_STAT_XACT_USER_FUNCTIONS.md >}}) + - [PG\_STAT\_XACT\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_USER_TABLES.md >}}) + - [PG\_STATIO\_ALL\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_INDEXES.md >}}) + - [PG\_STATIO\_ALL\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_SEQUENCES.md >}}) + - [PG\_STATIO\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_TABLES.md >}}) + - [PG\_STATIO\_SYS\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_INDEXES.md >}}) + - [PG\_STATIO\_SYS\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_SEQUENCES.md >}}) + - [PG\_STATIO\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_TABLES.md >}}) + - [PG\_STATIO\_USER\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_USER_INDEXES.md >}}) + - [PG\_STATIO\_USER\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_USER_SEQUENCES.md >}}) + - [PG\_STATIO\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_USER_TABLES.md >}}) + - [PG\_THREAD\_WAIT\_STATUS]({{< relref "./docs/Developerguide/PG_THREAD_WAIT_STATUS.md >}}) + - [PG\_TABLES]({{< relref "./docs/Developerguide/PG_TABLES.md >}}) + - [PG\_TDE\_INFO]({{< relref "./docs/Developerguide/PG_TDE_INFO.md >}}) + - [PG\_TIMEZONE\_NAMES]({{< relref "./docs/Developerguide/PG_TIMEZONE_NAMES.md >}}) + - [PG\_TOTAL\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md >}}) + - [PG\_TOTAL\_USER\_RESOURCE\_INFO]({{< relref "./docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md >}}) + - [PG\_USER]({{< relref "./docs/Developerguide/PG_USER.md >}}) + - [PG\_USER\_MAPPINGS]({{< relref "./docs/Developerguide/PG_USER_MAPPINGS.md >}}) + - [PG\_VIEWS]({{< relref "./docs/Developerguide/PG_VIEWS.md >}}) + - [PG\_WLM\_STATISTICS]({{< relref "./docs/Developerguide/PG_WLM_STATISTICS.md >}}) + - [PLAN\_TABLE]({{< relref "./docs/Developerguide/PLAN_TABLE.md >}}) + - [GS\_FILE\_STAT]({{< relref "./docs/Developerguide/GS_FILE_STAT.md >}}) + - [GS\_OS\_RUN\_INFO]({{< relref "./docs/Developerguide/GS_OS_RUN_INFO.md >}}) + - [GS\_REDO\_STAT]({{< relref "./docs/Developerguide/GS_REDO_STAT.md >}}) + - [GS\_SESSION\_MEMORY]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY.md >}}) + - [GS\_SESSION\_MEMORY\_CONTEXT]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md >}}) + - [GS\_SESSION\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_DETAIL.md >}}) + - [GS\_SESSION\_STAT]({{< relref "./docs/Developerguide/GS_SESSION_STAT.md >}}) + - [GS\_SESSION\_TIME]({{< relref "./docs/Developerguide/GS_SESSION_TIME.md >}}) + - [GS\_THREAD\_MEMORY\_CONTEXT]({{< relref "./docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md >}}) + - [GS\_TOTAL\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md >}}) + - [PG\_TIMEZONE\_ABBREVS]({{< relref "./docs/Developerguide/PG_TIMEZONE_ABBREVS.md >}}) + - [PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID]({{< relref "./docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md >}}) + - [PG\_VARIABLE\_INFO]({{< relref "./docs/Developerguide/PG_VARIABLE_INFO.md >}}) + - [GS\_INSTANCE\_TIME]({{< relref "./docs/Developerguide/GS_INSTANCE_TIME.md >}}) + - [GUC参数说明]({{< relref "./docs/Developerguide/GUC参数说明.md >}}) + - [GUC使用说明]({{< relref "./docs/Developerguide/GUC使用说明.md >}}) + - [文件位置]({{< relref "./docs/Developerguide/文件位置.md >}}) + - [连接和认证]({{< relref "./docs/Developerguide/连接和认证.md >}}) + - [连接设置]({{< relref "./docs/Developerguide/连接设置.md >}}) + - [安全和认证(postgresql.conf)]({{< relref "./docs/Developerguide/安全和认证(postgresql -conf).md >}}) + - [通信库参数]({{< relref "./docs/Developerguide/通信库参数.md >}}) + - [资源消耗]({{< relref "./docs/Developerguide/资源消耗.md >}}) + - [内存]({{< relref "./docs/Developerguide/内存.md >}}) + - [磁盘空间]({{< relref "./docs/Developerguide/磁盘空间.md >}}) + - [内核资源使用]({{< relref "./docs/Developerguide/内核资源使用.md >}}) + - [基于开销的清理延迟]({{< relref "./docs/Developerguide/基于开销的清理延迟.md >}}) + - [后端写进程]({{< relref "./docs/Developerguide/后端写进程.md >}}) + - [异步IO]({{< relref "./docs/Developerguide/异步IO.md >}}) + - [并行导入]({{< relref "./docs/Developerguide/并行导入.md >}}) + - [预写式日志]({{< relref "./docs/Developerguide/预写式日志.md >}}) + - [设置]({{< relref "./docs/Developerguide/设置.md >}}) + - [检查点]({{< relref "./docs/Developerguide/检查点.md >}}) + - [日志回放]({{< relref "./docs/Developerguide/日志回放.md >}}) + - [归档]({{< relref "./docs/Developerguide/归档.md >}}) + - [双机复制]({{< relref "./docs/Developerguide/双机复制.md >}}) + - [发送端服务器]({{< relref "./docs/Developerguide/发送端服务器.md >}}) + - [主服务器]({{< relref "./docs/Developerguide/主服务器.md >}}) + - [备服务器]({{< relref "./docs/Developerguide/备服务器.md >}}) + - [内存表]({{< relref "./docs/Developerguide/内存表.md >}}) + - [查询规划]({{< relref "./docs/Developerguide/查询规划.md >}}) + - [优化器方法配置]({{< relref "./docs/Developerguide/优化器方法配置.md >}}) + - [优化器开销常量]({{< relref "./docs/Developerguide/优化器开销常量.md >}}) + - [基因查询优化器]({{< relref "./docs/Developerguide/基因查询优化器.md >}}) + - [其他优化器选项]({{< relref "./docs/Developerguide/其他优化器选项.md >}}) + - [错误报告和日志]({{< relref "./docs/Developerguide/错误报告和日志.md >}}) + - [记录日志的位置]({{< relref "./docs/Developerguide/记录日志的位置.md >}}) + - [记录日志的时间]({{< relref "./docs/Developerguide/记录日志的时间.md >}}) + - [记录日志的内容]({{< relref "./docs/Developerguide/记录日志的内容.md >}}) + - [使用CSV格式写日志]({{< relref "./docs/Developerguide/使用CSV格式写日志.md >}}) + - [告警检测]({{< relref "./docs/Developerguide/告警检测.md >}}) + - [运行时统计]({{< relref "./docs/Developerguide/运行时统计.md >}}) + - [查询和索引统计收集器]({{< relref "./docs/Developerguide/查询和索引统计收集器.md >}}) + - [性能统计]({{< relref "./docs/Developerguide/性能统计.md >}}) + - [负载管理]({{< relref "./docs/Developerguide/负载管理.md >}}) + - [自动清理]({{< relref "./docs/Developerguide/自动清理.md >}}) + - [客户端连接缺省设置]({{< relref "./docs/Developerguide/客户端连接缺省设置.md >}}) + - [语句行为]({{< relref "./docs/Developerguide/语句行为.md >}}) + - [区域和格式化]({{< relref "./docs/Developerguide/区域和格式化.md >}}) + - [其他缺省]({{< relref "./docs/Developerguide/其他缺省.md >}}) + - [锁管理]({{< relref "./docs/Developerguide/锁管理.md >}}) + - [版本和平台兼容性]({{< relref "./docs/Developerguide/版本和平台兼容性.md >}}) + - [历史版本兼容性]({{< relref "./docs/Developerguide/历史版本兼容性.md >}}) + - [平台和客户端兼容性]({{< relref "./docs/Developerguide/平台和客户端兼容性.md >}}) + - [容错性]({{< relref "./docs/Developerguide/容错性.md >}}) + - [连接池参数]({{< relref "./docs/Developerguide/连接池参数.md >}}) + - [openGauss事务]({{< relref "./docs/Developerguide/openGauss事务.md >}}) + - [开发人员选项]({{< relref "./docs/Developerguide/开发人员选项.md >}}) + - [审计]({{< relref "./docs/Developerguide/审计.md >}}) + - [审计开关]({{< relref "./docs/Developerguide/审计开关.md >}}) + - [用户和权限审计]({{< relref "./docs/Developerguide/用户和权限审计.md >}}) + - [操作审计]({{< relref "./docs/Developerguide/操作审计.md >}}) + - [事务监控]({{< relref "./docs/Developerguide/事务监控.md >}}) + - [升级参数]({{< relref "./docs/Developerguide/升级参数.md >}}) + - [其它选项]({{< relref "./docs/Developerguide/其它选项.md >}}) + - [等待事件]({{< relref "./docs/Developerguide/等待事件.md >}}) + - [Query]({{< relref "./docs/Developerguide/Query.md >}}) + - [系统性能快照]({{< relref "./docs/Developerguide/系统性能快照.md >}}) + - [常见故障定位指南]({{< relref "./docs/Developerguide/常见故障定位指南.md >}}) + - [core问题定位]({{< relref "./docs/Developerguide/core问题定位.md >}}) + - [磁盘满故障引起的core问题]({{< relref "./docs/Developerguide/磁盘满故障引起的core问题.md >}}) + - [GUC参数log\_directory设置不正确引起的core问题]({{< relref "./docs/Developerguide/GUC参数log_directory设置不正确引起的core问题.md >}}) + +- [工具参考]({{< relref "./docs/Toolreference/Toolreference.md >}}) + - [工具一览表]({{< relref "./docs/Toolreference/工具一览表.md >}}) + - [客户端工具]({{< relref "./docs/Toolreference/客户端工具.md >}}) + - [gsql]({{< relref "./docs/Toolreference/gsql.md >}}) + - [gsql概述]({{< relref "./docs/Toolreference/gsql概述.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导.md >}}) + - [获取帮助]({{< relref "./docs/Toolreference/获取帮助.md >}}) + - [命令参考]({{< relref "./docs/Toolreference/命令参考.md >}}) + - [元命令参考]({{< relref "./docs/Toolreference/元命令参考.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理.md >}}) + - [X -Tuner]({{< relref "./docs/Toolreference/X -Tuner.md >}}) + - [概述]({{< relref "./docs/Toolreference/概述.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导 -0.md >}}) + - [获取帮助]({{< relref "./docs/Toolreference/获取帮助 -1.md >}}) + - [命令参考]({{< relref "./docs/Toolreference/命令参考 -2.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -3.md >}}) + - [Sqldiag]({{< relref "./docs/Toolreference/Sqldiag.md >}}) + - [概述]({{< relref "./docs/Toolreference/概述 -4.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导 -5.md >}}) + - [获取帮助]({{< relref "./docs/Toolreference/获取帮助 -6.md >}}) + - [命令参考]({{< relref "./docs/Toolreference/命令参考 -7.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -8.md >}}) + - [Predictor]({{< relref "./docs/Toolreference/Predictor.md >}}) + - [概述]({{< relref "./docs/Toolreference/概述 -9.md >}}) + - [使用指导]({{< relref "./docs/Toolreference/使用指导 -10.md >}}) + - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -11.md >}}) + - [服务端工具]({{< relref "./docs/Toolreference/服务端工具.md >}}) + - [gs\_check]({{< relref "./docs/Toolreference/gs_check.md >}}) + - [gs\_checkos]({{< relref "./docs/Toolreference/gs_checkos.md >}}) + - [gs\_checkperf]({{< relref "./docs/Toolreference/gs_checkperf.md >}}) + - [gs\_collector]({{< relref "./docs/Toolreference/gs_collector.md >}}) + - [gs\_dump]({{< relref "./docs/Toolreference/gs_dump.md >}}) + - [gs\_dumpall]({{< relref "./docs/Toolreference/gs_dumpall.md >}}) + - [gs\_guc]({{< relref "./docs/Toolreference/gs_guc.md >}}) + - [gs\_om]({{< relref "./docs/Toolreference/gs_om.md >}}) + - [gs\_restore]({{< relref "./docs/Toolreference/gs_restore.md >}}) + - [gs\_ssh]({{< relref "./docs/Toolreference/gs_ssh.md >}}) + - [系统内部使用的工具]({{< relref "./docs/Toolreference/系统内部使用的工具.md >}}) + - [gaussdb]({{< relref "./docs/Toolreference/gaussdb.md >}}) + - [gs\_backup]({{< relref "./docs/Toolreference/gs_backup.md >}}) + - [gs\_basebackup]({{< relref "./docs/Toolreference/gs_basebackup.md >}}) + - [gs\_ctl]({{< relref "./docs/Toolreference/gs_ctl.md >}}) + - [gs\_install]({{< relref "./docs/Toolreference/gs_install.md >}}) + - [gs\_postuninstall]({{< relref "./docs/Toolreference/gs_postuninstall.md >}}) + - [gs\_preinstall]({{< relref "./docs/Toolreference/gs_preinstall.md >}}) + - [gs\_sshexkey]({{< relref "./docs/Toolreference/gs_sshexkey.md >}}) + - [gs\_uninstall]({{< relref "./docs/Toolreference/gs_uninstall.md >}}) + - [gs\_upgradectl]({{< relref "./docs/Toolreference/gs_upgradectl.md >}}) + - [gstrace]({{< relref "./docs/Toolreference/gstrace.md >}}) + - [kdb5\_util]({{< relref "./docs/Toolreference/kdb5_util.md >}}) + - [kadmin.local]({{< relref "./docs/Toolreference/kadmin -local.md >}}) + - [kinit]({{< relref "./docs/Toolreference/kinit.md >}}) + - [klist]({{< relref "./docs/Toolreference/klist.md >}}) + - [krb5kdc]({{< relref "./docs/Toolreference/krb5kdc.md >}}) + - [kdestroy]({{< relref "./docs/Toolreference/kdestroy.md >}}) + - [pg\_config]({{< relref "./docs/Toolreference/pg_config.md >}}) + - [pg\_controldata]({{< relref "./docs/Toolreference/pg_controldata.md >}}) + - [pg\_resetxlog]({{< relref "./docs/Toolreference/pg_resetxlog.md >}}) + - [FAQ]({{< relref "./docs/Toolreference/FAQ.md >}}) + - [执行命令报错“Failed to obtain the GPHOME”]({{< relref "./docs/Toolreference/执行命令报错 -Failed -to -obtain -the -GPHOME.md >}}) + - [gs\_collector工具支持收集的系统表和视图列表]({{< relref "./docs/Toolreference/gs_collector工具支持收集的系统表和视图列表.md >}}) + + -- Gitee From f11d1c2d9c12a870cc76a4ea2c93d4396122bc9f Mon Sep 17 00:00:00 2001 From: liyang <554903772@qq.com> Date: Fri, 29 May 2020 11:28:01 +0800 Subject: [PATCH 35/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntent/zh/menu/Index.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/menu/Index.md | 917 --------------------------------------- 1 file changed, 917 deletions(-) delete mode 100644 content/zh/menu/Index.md diff --git a/content/zh/menu/Index.md b/content/zh/menu/Index.md deleted file mode 100644 index 50f11cc0e..000000000 --- a/content/zh/menu/Index.md +++ /dev/null @@ -1,917 +0,0 @@ - -- [产品描述]({{< relref "./docs/Description/Description.md >}}) - - [产品定位]({{< relref "./docs/Description/产品定位.md >}}) - - [系统架构]({{< relref "./docs/Description/系统架构.md >}}) - - [应用场景]({{< relref "./docs/Description/应用场景.md >}}) - - [运行环境]({{< relref "./docs/Description/运行环境.md >}}) - - [技术指标]({{< relref "./docs/Description/技术指标.md >}}) - - [基本功能和特性]({{< relref "./docs/Description/基本功能和特性.md >}}) - - [企业级增强特性]({{< relref "./docs/Description/企业级增强特性.md >}}) - - [数据分区]({{< relref "./docs/Description/数据分区.md >}}) - - [向量化执行和行列混合引擎]({{< relref "./docs/Description/向量化执行和行列混合引擎.md >}}) - - [高可靠事务处理]({{< relref "./docs/Description/高可靠事务处理.md >}}) - - [高并发&高性能]({{< relref "./docs/Description/高并发 -高性能.md >}}) - - [SQL自诊断]({{< relref "./docs/Description/SQL自诊断.md >}}) - - [内存表]({{< relref "./docs/Description/内存表.md >}}) - - [主备双机]({{< relref "./docs/Description/主备双机.md >}}) - -- [编译指导书]({{< relref "./docs/Compilationguide/Compilation.md >}}) - - [简介]({{< relref "./docs/Compilationguide/简介.md >}}) - - [目的]({{< relref "./docs/Compilationguide/目的.md >}}) - - [概述]({{< relref "./docs/Compilationguide/概述.md >}}) - - [搭建编译环境]({{< relref "./docs/Compilationguide/搭建编译环境.md >}}) - - [硬件要求]({{< relref "./docs/Compilationguide/硬件要求.md >}}) - - [软件要求]({{< relref "./docs/Compilationguide/软件要求.md >}}) - - [操作系统要求]({{< relref "./docs/Compilationguide/操作系统要求.md >}}) - - [软件依赖要求]({{< relref "./docs/Compilationguide/软件依赖要求.md >}}) - - [环境变量配置]({{< relref "./docs/Compilationguide/环境变量配置.md >}}) - - [版本编译]({{< relref "./docs/Compilationguide/版本编译.md >}}) - - [编译前准备]({{< relref "./docs/Compilationguide/编译前准备.md >}}) - - [代码下载]({{< relref "./docs/Compilationguide/代码下载.md >}}) - - [软件安装编译]({{< relref "./docs/Compilationguide/软件安装编译.md >}}) - - [产品安装包编译]({{< relref "./docs/Compilationguide/产品安装包编译.md >}}) - - [FAQ]({{< relref "./docs/Compilationguide/FAQ.md >}}) - - [如何清除编译过程中生成的临时文件]({{< relref "./docs/Compilationguide/如何清除编译过程中生成的临时文件.md >}}) - - [如何解决“Configure error: Ccompiler cannot create executables”报错]({{< relref "./docs/Compilationguide/如何解决 -Configure -error -Ccompiler -cannot -create -executables -报错.md >}}) - -- [快速入门]({{< relref "./docs/Quickstart/Quickstart.md >}}) - - [了解产品]({{< relref "./docs/Quickstart/了解产品.md >}}) - - [产品特点]({{< relref "./docs/Quickstart/产品特点.md >}}) - - [软件架构]({{< relref "./docs/Quickstart/软件架构.md >}}) - - [典型组网]({{< relref "./docs/Quickstart/典型组网.md >}}) - - [安装准备]({{< relref "./docs/Quickstart/安装准备.md >}}) - - [了解安装流程]({{< relref "./docs/Quickstart/了解安装流程.md >}}) - - [获取并校验安装包]({{< relref "./docs/Quickstart/获取并校验安装包.md >}}) - - [准备软硬件安装环境]({{< relref "./docs/Quickstart/准备软硬件安装环境.md >}}) - - [软硬件环境要求]({{< relref "./docs/Quickstart/软硬件环境要求.md >}}) - - [修改操作系统配置]({{< relref "./docs/Quickstart/修改操作系统配置.md >}}) - - [关闭操作系统防火墙]({{< relref "./docs/Quickstart/关闭操作系统防火墙.md >}}) - - [设置字符集参数]({{< relref "./docs/Quickstart/设置字符集参数.md >}}) - - [设置时区和时间]({{< relref "./docs/Quickstart/设置时区和时间.md >}}) - - [关闭swap交换内存]({{< relref "./docs/Quickstart/关闭swap交换内存.md >}}) - - [设置网卡MTU值]({{< relref "./docs/Quickstart/设置网卡MTU值.md >}}) - - [设置root用户远程登录]({{< relref "./docs/Quickstart/设置root用户远程登录.md >}}) - - [了解安装用户及用户组]({{< relref "./docs/Quickstart/了解安装用户及用户组.md >}}) - - [安装openGauss]({{< relref "./docs/Quickstart/安装openGauss.md >}}) - - [创建XML配置文件]({{< relref "./docs/Quickstart/创建XML配置文件.md >}}) - - [配置数据库名称及各项目录]({{< relref "./docs/Quickstart/配置数据库名称及各项目录.md >}}) - - [配置Host基本信息]({{< relref "./docs/Quickstart/配置Host基本信息.md >}}) - - [配置数据库主节点信息]({{< relref "./docs/Quickstart/配置数据库主节点信息.md >}}) - - [示例]({{< relref "./docs/Quickstart/示例.md >}}) - - [单节点配置文件]({{< relref "./docs/Quickstart/单节点配置文件.md >}}) - - [一主一备配置文件]({{< relref "./docs/Quickstart/一主一备配置文件.md >}}) - - [初始化安装环境]({{< relref "./docs/Quickstart/初始化安装环境.md >}}) - - [准备安装用户及环境]({{< relref "./docs/Quickstart/准备安装用户及环境.md >}}) - - [手工建立互信]({{< relref "./docs/Quickstart/手工建立互信.md >}}) - - [配置操作系统参数]({{< relref "./docs/Quickstart/配置操作系统参数.md >}}) - - [执行安装]({{< relref "./docs/Quickstart/执行安装.md >}}) - - [(可选)设置备机可读]({{< relref "./docs/Quickstart/(可选)设置备机可读.md >}}) - - [开始使用产品]({{< relref "./docs/Quickstart/开始使用产品.md >}}) - - [设置openGauss参数]({{< relref "./docs/Quickstart/设置openGauss参数.md >}}) - - [设置客户端认证策略]({{< relref "./docs/Quickstart/设置客户端认证策略.md >}}) - - [设置配置文件参数]({{< relref "./docs/Quickstart/设置配置文件参数.md >}}) - - [gsql客户端连接openGauss]({{< relref "./docs/Quickstart/gsql客户端连接openGauss.md >}}) - - [确认连接信息]({{< relref "./docs/Quickstart/确认连接信息.md >}}) - - [使用gsql本地连接]({{< relref "./docs/Quickstart/使用gsql本地连接.md >}}) - - [使用gsql远程连接]({{< relref "./docs/Quickstart/使用gsql远程连接.md >}}) - - [通过gs\_guc配置白名单]({{< relref "./docs/Quickstart/通过gs_guc配置白名单.md >}}) - - [安装gsql客户端并连接数据库]({{< relref "./docs/Quickstart/安装gsql客户端并连接数据库.md >}}) - - [简单数据管理]({{< relref "./docs/Quickstart/简单数据管理.md >}}) - - [创建数据库]({{< relref "./docs/Quickstart/创建数据库.md >}}) - - [创建表]({{< relref "./docs/Quickstart/创建表.md >}}) - - [查看对象]({{< relref "./docs/Quickstart/查看对象.md >}}) - - [简单权限管理]({{< relref "./docs/Quickstart/简单权限管理.md >}}) - - [创建角色]({{< relref "./docs/Quickstart/创建角色.md >}}) - - [创建用户]({{< relref "./docs/Quickstart/创建用户.md >}}) - - [权限赋予]({{< relref "./docs/Quickstart/权限赋予.md >}}) - - [通过客户端工具执行SQL]({{< relref "./docs/Quickstart/通过客户端工具执行SQL.md >}}) - - [执行单条SQL]({{< relref "./docs/Quickstart/执行单条SQL.md >}}) - - [执行批量文件]({{< relref "./docs/Quickstart/执行批量文件.md >}}) - - [通过JDBC执行SQL]({{< relref "./docs/Quickstart/通过JDBC执行SQL.md >}}) - - [JDBC包与驱动类]({{< relref "./docs/Quickstart/JDBC包与驱动类.md >}}) - - [加载驱动]({{< relref "./docs/Quickstart/加载驱动.md >}}) - - [连接数据库]({{< relref "./docs/Quickstart/连接数据库.md >}}) - - [示例]({{< relref "./docs/Quickstart/示例 -0.md >}}) - - [配置运行参数]({{< relref "./docs/Quickstart/配置运行参数.md >}}) - - [查看参数当前取值]({{< relref "./docs/Quickstart/查看参数当前取值.md >}}) - - [重设参数]({{< relref "./docs/Quickstart/重设参数.md >}}) - - [GUC参数说明]({{< relref "./docs/Quickstart/GUC参数说明.md >}}) - - [GUC使用说明]({{< relref "./docs/Quickstart/GUC使用说明.md >}}) - - [文件位置]({{< relref "./docs/Quickstart/文件位置.md >}}) - - [连接和认证]({{< relref "./docs/Quickstart/连接和认证.md >}}) - - [连接设置]({{< relref "./docs/Quickstart/连接设置.md >}}) - - [安全和认证(postgresql.conf)]({{< relref "./docs/Quickstart/安全和认证(postgresql -conf).md >}}) - - [通信库参数]({{< relref "./docs/Quickstart/通信库参数.md >}}) - - [资源消耗]({{< relref "./docs/Quickstart/资源消耗.md >}}) - - [内存]({{< relref "./docs/Quickstart/内存.md >}}) - - [磁盘空间]({{< relref "./docs/Quickstart/磁盘空间.md >}}) - - [内核资源使用]({{< relref "./docs/Quickstart/内核资源使用.md >}}) - - [基于开销的清理延迟]({{< relref "./docs/Quickstart/基于开销的清理延迟.md >}}) - - [后端写进程]({{< relref "./docs/Quickstart/后端写进程.md >}}) - - [异步IO]({{< relref "./docs/Quickstart/异步IO.md >}}) - - [并行导入]({{< relref "./docs/Quickstart/并行导入.md >}}) - - [预写式日志]({{< relref "./docs/Quickstart/预写式日志.md >}}) - - [设置]({{< relref "./docs/Quickstart/设置.md >}}) - - [检查点]({{< relref "./docs/Quickstart/检查点.md >}}) - - [日志回放]({{< relref "./docs/Quickstart/日志回放.md >}}) - - [归档]({{< relref "./docs/Quickstart/归档.md >}}) - - [双机复制]({{< relref "./docs/Quickstart/双机复制.md >}}) - - [发送端服务器]({{< relref "./docs/Quickstart/发送端服务器.md >}}) - - [主服务器]({{< relref "./docs/Quickstart/主服务器.md >}}) - - [备服务器]({{< relref "./docs/Quickstart/备服务器.md >}}) - - [查询规划]({{< relref "./docs/Quickstart/查询规划.md >}}) - - [优化器方法配置]({{< relref "./docs/Quickstart/优化器方法配置.md >}}) - - [优化器开销常量]({{< relref "./docs/Quickstart/优化器开销常量.md >}}) - - [基因查询优化器]({{< relref "./docs/Quickstart/基因查询优化器.md >}}) - - [其他优化器选项]({{< relref "./docs/Quickstart/其他优化器选项.md >}}) - - [错误报告和日志]({{< relref "./docs/Quickstart/错误报告和日志.md >}}) - - [记录日志的位置]({{< relref "./docs/Quickstart/记录日志的位置.md >}}) - - [记录日志的时间]({{< relref "./docs/Quickstart/记录日志的时间.md >}}) - - [记录日志的内容]({{< relref "./docs/Quickstart/记录日志的内容.md >}}) - - [使用CSV格式写日志]({{< relref "./docs/Quickstart/使用CSV格式写日志.md >}}) - - [告警检测]({{< relref "./docs/Quickstart/告警检测.md >}}) - - [运行时统计]({{< relref "./docs/Quickstart/运行时统计.md >}}) - - [查询和索引统计收集器]({{< relref "./docs/Quickstart/查询和索引统计收集器.md >}}) - - [性能统计]({{< relref "./docs/Quickstart/性能统计.md >}}) - - [负载管理]({{< relref "./docs/Quickstart/负载管理.md >}}) - - [自动清理]({{< relref "./docs/Quickstart/自动清理.md >}}) - - [客户端连接缺省设置]({{< relref "./docs/Quickstart/客户端连接缺省设置.md >}}) - - [语句行为]({{< relref "./docs/Quickstart/语句行为.md >}}) - - [区域和格式化]({{< relref "./docs/Quickstart/区域和格式化.md >}}) - - [其他缺省]({{< relref "./docs/Quickstart/其他缺省.md >}}) - - [锁管理]({{< relref "./docs/Quickstart/锁管理.md >}}) - - [版本和平台兼容性]({{< relref "./docs/Quickstart/版本和平台兼容性.md >}}) - - [历史版本兼容性]({{< relref "./docs/Quickstart/历史版本兼容性.md >}}) - - [平台和客户端兼容性]({{< relref "./docs/Quickstart/平台和客户端兼容性.md >}}) - - [容错性]({{< relref "./docs/Quickstart/容错性.md >}}) - - [openGauss事务]({{< relref "./docs/Quickstart/openGauss事务.md >}}) - - [开发人员选项]({{< relref "./docs/Quickstart/开发人员选项.md >}}) - - [审计]({{< relref "./docs/Quickstart/审计.md >}}) - - [审计开关]({{< relref "./docs/Quickstart/审计开关.md >}}) - - [用户和权限审计]({{< relref "./docs/Quickstart/用户和权限审计.md >}}) - - [操作审计]({{< relref "./docs/Quickstart/操作审计.md >}}) - - [事务监控]({{< relref "./docs/Quickstart/事务监控.md >}}) - - [升级参数]({{< relref "./docs/Quickstart/升级参数.md >}}) - - [其它选项]({{< relref "./docs/Quickstart/其它选项.md >}}) - - [等待事件]({{< relref "./docs/Quickstart/等待事件.md >}}) - - [Query]({{< relref "./docs/Quickstart/Query.md >}}) - - [系统性能快照]({{< relref "./docs/Quickstart/系统性能快照.md >}}) - - [FAQ]({{< relref "./docs/Quickstart/FAQ.md >}}) - - [用户在openGauss节点间的互信丢失]({{< relref "./docs/Quickstart/用户在openGauss节点间的互信丢失.md >}}) - - -- [安装指南]({{< relref "./docs/Installation/Installation.md >}}) - - [安装概述]({{< relref "./docs/Installation/安装概述.md >}}) - - [安装准备]({{< relref "./docs/Installation/安装准备.md >}}) - - [了解安装流程]({{< relref "./docs/Installation/了解安装流程.md >}}) - - [获取并校验安装包]({{< relref "./docs/Installation/获取并校验安装包.md >}}) - - [准备软硬件安装环境]({{< relref "./docs/Installation/准备软硬件安装环境.md >}}) - - [软硬件环境要求]({{< relref "./docs/Installation/软硬件环境要求.md >}}) - - [修改操作系统配置]({{< relref "./docs/Installation/修改操作系统配置.md >}}) - - [关闭操作系统防火墙]({{< relref "./docs/Installation/关闭操作系统防火墙.md >}}) - - [设置字符集参数]({{< relref "./docs/Installation/设置字符集参数.md >}}) - - [设置时区和时间]({{< relref "./docs/Installation/设置时区和时间.md >}}) - - [关闭swap交换内存]({{< relref "./docs/Installation/关闭swap交换内存.md >}}) - - [设置网卡MTU值]({{< relref "./docs/Installation/设置网卡MTU值.md >}}) - - [设置root用户远程登录]({{< relref "./docs/Installation/设置root用户远程登录.md >}}) - - [了解安装用户及用户组]({{< relref "./docs/Installation/了解安装用户及用户组.md >}}) - - [安装openGauss]({{< relref "./docs/Installation/安装openGauss.md >}}) - - [创建XML配置文件]({{< relref "./docs/Installation/创建XML配置文件.md >}}) - - [配置数据库名称及各项目录]({{< relref "./docs/Installation/配置数据库名称及各项目录.md >}}) - - [配置Host基本信息]({{< relref "./docs/Installation/配置Host基本信息.md >}}) - - [配置数据库主节点信息]({{< relref "./docs/Installation/配置数据库主节点信息.md >}}) - - [示例]({{< relref "./docs/Installation/示例.md >}}) - - [单节点配置文件]({{< relref "./docs/Installation/单节点配置文件.md >}}) - - [一主一备配置文件]({{< relref "./docs/Installation/一主一备配置文件.md >}}) - - [初始化安装环境]({{< relref "./docs/Installation/初始化安装环境.md >}}) - - [准备安装用户及环境]({{< relref "./docs/Installation/准备安装用户及环境.md >}}) - - [手工建立互信]({{< relref "./docs/Installation/手工建立互信.md >}}) - - [配置操作系统参数]({{< relref "./docs/Installation/配置操作系统参数.md >}}) - - [执行安装]({{< relref "./docs/Installation/执行安装.md >}}) - - [(可选)设置备机可读]({{< relref "./docs/Installation/(可选)设置备机可读.md >}}) - - [安装验证]({{< relref "./docs/Installation/安装验证.md >}}) - - [检查openGauss健康状态]({{< relref "./docs/Installation/检查openGauss健康状态.md >}}) - - [初始配置]({{< relref "./docs/Installation/初始配置.md >}}) - - [配置区域和字符集]({{< relref "./docs/Installation/配置区域和字符集.md >}}) - - [卸载openGauss]({{< relref "./docs/Installation/卸载openGauss.md >}}) - - [执行卸载]({{< relref "./docs/Installation/执行卸载.md >}}) - - [一键式环境清理]({{< relref "./docs/Installation/一键式环境清理.md >}}) - -- [开发者指南]({{< relref "./docs/Developerguide/Developerguide.md >}}) - - [概述]({{< relref "./docs/Developerguide/概述.md >}}) - - [数据库逻辑结构图]({{< relref "./docs/Developerguide/数据库逻辑结构图.md >}}) - - [数据查询请求处理过程]({{< relref "./docs/Developerguide/数据查询请求处理过程.md >}}) - - [管理事务]({{< relref "./docs/Developerguide/管理事务.md >}}) - - [相关概念]({{< relref "./docs/Developerguide/相关概念.md >}}) - - [数据库使用]({{< relref "./docs/Developerguide/数据库使用.md >}}) - - [从这里开始]({{< relref "./docs/Developerguide/从这里开始.md >}}) - - [连接数据库]({{< relref "./docs/Developerguide/连接数据库.md >}}) - - [确认连接信息]({{< relref "./docs/Developerguide/确认连接信息.md >}}) - - [配置服务端远程连接]({{< relref "./docs/Developerguide/配置服务端远程连接.md >}}) - - [使用gsql连接]({{< relref "./docs/Developerguide/使用gsql连接.md >}}) - - [应用程序接口]({{< relref "./docs/Developerguide/应用程序接口.md >}}) - - [创建和管理数据库]({{< relref "./docs/Developerguide/创建和管理数据库.md >}}) - - [规划存储模型]({{< relref "./docs/Developerguide/规划存储模型.md >}}) - - [创建和管理表空间]({{< relref "./docs/Developerguide/创建和管理表空间.md >}}) - - [创建和管理表]({{< relref "./docs/Developerguide/创建和管理表.md >}}) - - [创建表]({{< relref "./docs/Developerguide/创建表.md >}}) - - [向表中插入数据]({{< relref "./docs/Developerguide/向表中插入数据.md >}}) - - [更新表中数据]({{< relref "./docs/Developerguide/更新表中数据.md >}}) - - [查看数据]({{< relref "./docs/Developerguide/查看数据.md >}}) - - [删除表中数据]({{< relref "./docs/Developerguide/删除表中数据.md >}}) - - [查看系统表]({{< relref "./docs/Developerguide/查看系统表.md >}}) - - [其他操作]({{< relref "./docs/Developerguide/其他操作.md >}}) - - [创建和管理schema]({{< relref "./docs/Developerguide/创建和管理schema.md >}}) - - [创建和管理分区表]({{< relref "./docs/Developerguide/创建和管理分区表.md >}}) - - [创建和管理索引]({{< relref "./docs/Developerguide/创建和管理索引.md >}}) - - [创建和管理视图]({{< relref "./docs/Developerguide/创建和管理视图.md >}}) - - [创建和管理序列]({{< relref "./docs/Developerguide/创建和管理序列.md >}}) - - [附录]({{< relref "./docs/Developerguide/附录.md >}}) - - [客户端接入认证]({{< relref "./docs/Developerguide/客户端接入认证.md >}}) - - [配置客户端接入认证]({{< relref "./docs/Developerguide/配置客户端接入认证.md >}}) - - [配置文件参考]({{< relref "./docs/Developerguide/配置文件参考.md >}}) - - [用SSL进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSL进行安全的TCP -IP连接.md >}}) - - [用SSH隧道进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSH隧道进行安全的TCP -IP连接.md >}}) - - [查看数据库连接数]({{< relref "./docs/Developerguide/查看数据库连接数.md >}}) - - [SSL证书管理]({{< relref "./docs/Developerguide/SSL证书管理.md >}}) - - [证书生成]({{< relref "./docs/Developerguide/证书生成.md >}}) - - [证书替换]({{< relref "./docs/Developerguide/证书替换.md >}}) - - [设置文件权限安全策略]({{< relref "./docs/Developerguide/设置文件权限安全策略.md >}}) - - [管理数据库安全]({{< relref "./docs/Developerguide/管理数据库安全.md >}}) - - [客户端接入认证]({{< relref "./docs/Developerguide/客户端接入认证 -0.md >}}) - - [配置客户端接入认证]({{< relref "./docs/Developerguide/配置客户端接入认证 -1.md >}}) - - [配置文件参考]({{< relref "./docs/Developerguide/配置文件参考 -2.md >}}) - - [用SSL进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSL进行安全的TCP -IP连接 -3.md >}}) - - [用SSH隧道进行安全的TCP/IP连接]({{< relref "./docs/Developerguide/用SSH隧道进行安全的TCP -IP连接 -4.md >}}) - - [查看数据库连接数]({{< relref "./docs/Developerguide/查看数据库连接数 -5.md >}}) - - [SSL证书管理]({{< relref "./docs/Developerguide/SSL证书管理 -6.md >}}) - - [证书生成]({{< relref "./docs/Developerguide/证书生成 -7.md >}}) - - [证书替换]({{< relref "./docs/Developerguide/证书替换 -8.md >}}) - - [管理用户及权限]({{< relref "./docs/Developerguide/管理用户及权限.md >}}) - - [默认权限机制]({{< relref "./docs/Developerguide/默认权限机制.md >}}) - - [管理员]({{< relref "./docs/Developerguide/管理员.md >}}) - - [三权分立]({{< relref "./docs/Developerguide/三权分立.md >}}) - - [用户]({{< relref "./docs/Developerguide/用户.md >}}) - - [角色]({{< relref "./docs/Developerguide/角色.md >}}) - - [Schema]({{< relref "./docs/Developerguide/Schema.md >}}) - - [用户权限设置]({{< relref "./docs/Developerguide/用户权限设置.md >}}) - - [行级访问控制]({{< relref "./docs/Developerguide/行级访问控制.md >}}) - - [设置安全策略]({{< relref "./docs/Developerguide/设置安全策略.md >}}) - - [设置帐户安全策略]({{< relref "./docs/Developerguide/设置帐户安全策略.md >}}) - - [设置帐号有效期]({{< relref "./docs/Developerguide/设置帐号有效期.md >}}) - - [设置密码安全策略]({{< relref "./docs/Developerguide/设置密码安全策略.md >}}) - - [设置数据库审计]({{< relref "./docs/Developerguide/设置数据库审计.md >}}) - - [审计概述]({{< relref "./docs/Developerguide/审计概述.md >}}) - - [查看审计结果]({{< relref "./docs/Developerguide/查看审计结果.md >}}) - - [维护审计日志]({{< relref "./docs/Developerguide/维护审计日志.md >}}) - - [设置文件权限安全策略]({{< relref "./docs/Developerguide/设置文件权限安全策略 -9.md >}}) - - [接口参考]({{< relref "./docs/Developerguide/接口参考.md >}}) - - [JDBC]({{< relref "./docs/Developerguide/JDBC.md >}}) - - [java.sql.Connection]({{< relref "./docs/Developerguide/java -sql -Connection.md >}}) - - [java.sql.CallableStatement]({{< relref "./docs/Developerguide/java -sql -CallableStatement.md >}}) - - [java.sql.DatabaseMetaData]({{< relref "./docs/Developerguide/java -sql -DatabaseMetaData.md >}}) - - [java.sql.Driver]({{< relref "./docs/Developerguide/java -sql -Driver.md >}}) - - [java.sql.PreparedStatement]({{< relref "./docs/Developerguide/java -sql -PreparedStatement.md >}}) - - [java.sql.ResultSet]({{< relref "./docs/Developerguide/java -sql -ResultSet.md >}}) - - [java.sql.ResultSetMetaData]({{< relref "./docs/Developerguide/java -sql -ResultSetMetaData.md >}}) - - [java.sql.Statement]({{< relref "./docs/Developerguide/java -sql -Statement.md >}}) - - [javax.sql.ConnectionPoolDataSource]({{< relref "./docs/Developerguide/javax -sql -ConnectionPoolDataSource.md >}}) - - [javax.sql.DataSource]({{< relref "./docs/Developerguide/javax -sql -DataSource.md >}}) - - [javax.sql.PooledConnection]({{< relref "./docs/Developerguide/javax -sql -PooledConnection.md >}}) - - [javax.naming.Context]({{< relref "./docs/Developerguide/javax -naming -Context.md >}}) - - [javax.naming.spi.InitialContextFactory]({{< relref "./docs/Developerguide/javax -naming -spi -InitialContextFactory.md >}}) - - [CopyManager]({{< relref "./docs/Developerguide/CopyManager.md >}}) - - [ODBC]({{< relref "./docs/Developerguide/ODBC.md >}}) - - [SQLAllocEnv]({{< relref "./docs/Developerguide/SQLAllocEnv.md >}}) - - [SQLAllocConnect]({{< relref "./docs/Developerguide/SQLAllocConnect.md >}}) - - [SQLAllocHandle]({{< relref "./docs/Developerguide/SQLAllocHandle.md >}}) - - [SQLAllocStmt]({{< relref "./docs/Developerguide/SQLAllocStmt.md >}}) - - [SQLBindCol]({{< relref "./docs/Developerguide/SQLBindCol.md >}}) - - [SQLBindParameter]({{< relref "./docs/Developerguide/SQLBindParameter.md >}}) - - [SQLColAttribute]({{< relref "./docs/Developerguide/SQLColAttribute.md >}}) - - [SQLConnect]({{< relref "./docs/Developerguide/SQLConnect.md >}}) - - [SQLDisconnect]({{< relref "./docs/Developerguide/SQLDisconnect.md >}}) - - [SQLExecDirect]({{< relref "./docs/Developerguide/SQLExecDirect.md >}}) - - [SQLExecute]({{< relref "./docs/Developerguide/SQLExecute.md >}}) - - [SQLFetch]({{< relref "./docs/Developerguide/SQLFetch.md >}}) - - [SQLFreeStmt]({{< relref "./docs/Developerguide/SQLFreeStmt.md >}}) - - [SQLFreeConnect]({{< relref "./docs/Developerguide/SQLFreeConnect.md >}}) - - [SQLFreeHandle]({{< relref "./docs/Developerguide/SQLFreeHandle.md >}}) - - [SQLFreeEnv]({{< relref "./docs/Developerguide/SQLFreeEnv.md >}}) - - [SQLPrepare]({{< relref "./docs/Developerguide/SQLPrepare.md >}}) - - [SQLGetData]({{< relref "./docs/Developerguide/SQLGetData.md >}}) - - [SQLGetDiagRec]({{< relref "./docs/Developerguide/SQLGetDiagRec.md >}}) - - [SQLSetConnectAttr]({{< relref "./docs/Developerguide/SQLSetConnectAttr.md >}}) - - [SQLSetEnvAttr]({{< relref "./docs/Developerguide/SQLSetEnvAttr.md >}}) - - [SQLSetStmtAttr]({{< relref "./docs/Developerguide/SQLSetStmtAttr.md >}}) - - [示例]({{< relref "./docs/Developerguide/示例.md >}}) - - [libpq]({{< relref "./docs/Developerguide/libpq.md >}}) - - [数据库连接控制函数]({{< relref "./docs/Developerguide/数据库连接控制函数.md >}}) - - [PQconnectdbParams]({{< relref "./docs/Developerguide/PQconnectdbParams.md >}}) - - [PQconnectdb]({{< relref "./docs/Developerguide/PQconnectdb.md >}}) - - [PQconninfoParse]({{< relref "./docs/Developerguide/PQconninfoParse.md >}}) - - [PQconnectStart]({{< relref "./docs/Developerguide/PQconnectStart.md >}}) - - [PQerrorMessage]({{< relref "./docs/Developerguide/PQerrorMessage.md >}}) - - [PQsetdbLogin]({{< relref "./docs/Developerguide/PQsetdbLogin.md >}}) - - [PQfinish]({{< relref "./docs/Developerguide/PQfinish.md >}}) - - [PQreset]({{< relref "./docs/Developerguide/PQreset.md >}}) - - [PQstatus]({{< relref "./docs/Developerguide/PQstatus.md >}}) - - [数据库执行语句函数]({{< relref "./docs/Developerguide/数据库执行语句函数.md >}}) - - [PQclear]({{< relref "./docs/Developerguide/PQclear.md >}}) - - [PQexec]({{< relref "./docs/Developerguide/PQexec.md >}}) - - [PQexecParams]({{< relref "./docs/Developerguide/PQexecParams.md >}}) - - [PQexecParamsBatch]({{< relref "./docs/Developerguide/PQexecParamsBatch.md >}}) - - [PQexecPrepared]({{< relref "./docs/Developerguide/PQexecPrepared.md >}}) - - [PQexecPreparedBatch]({{< relref "./docs/Developerguide/PQexecPreparedBatch.md >}}) - - [PQfname]({{< relref "./docs/Developerguide/PQfname.md >}}) - - [PQgetvalue]({{< relref "./docs/Developerguide/PQgetvalue.md >}}) - - [PQnfields]({{< relref "./docs/Developerguide/PQnfields.md >}}) - - [PQntuples]({{< relref "./docs/Developerguide/PQntuples.md >}}) - - [PQprepare]({{< relref "./docs/Developerguide/PQprepare.md >}}) - - [PQresultStatus]({{< relref "./docs/Developerguide/PQresultStatus.md >}}) - - [异步命令处理]({{< relref "./docs/Developerguide/异步命令处理.md >}}) - - [PQsendQuery]({{< relref "./docs/Developerguide/PQsendQuery.md >}}) - - [PQsendQueryParams]({{< relref "./docs/Developerguide/PQsendQueryParams.md >}}) - - [PQsendPrepare]({{< relref "./docs/Developerguide/PQsendPrepare.md >}}) - - [PQsendQueryPrepared]({{< relref "./docs/Developerguide/PQsendQueryPrepared.md >}}) - - [PQflush]({{< relref "./docs/Developerguide/PQflush.md >}}) - - [取消正在处理的查询]({{< relref "./docs/Developerguide/取消正在处理的查询.md >}}) - - [PQgetCancel]({{< relref "./docs/Developerguide/PQgetCancel.md >}}) - - [PQfreeCancel]({{< relref "./docs/Developerguide/PQfreeCancel.md >}}) - - [PQcancel]({{< relref "./docs/Developerguide/PQcancel.md >}}) - - [示例]({{< relref "./docs/Developerguide/示例 -10.md >}}) - - [链接字符]({{< relref "./docs/Developerguide/链接字符.md >}}) - - [导入数据]({{< relref "./docs/Developerguide/导入数据.md >}}) - - [通过INSERT语句直接写入数据]({{< relref "./docs/Developerguide/通过INSERT语句直接写入数据.md >}}) - - [使用COPY FROM STDIN导入数据]({{< relref "./docs/Developerguide/使用COPY -FROM -STDIN导入数据.md >}}) - - [关于COPY FROM STDIN导入数据]({{< relref "./docs/Developerguide/关于COPY -FROM -STDIN导入数据.md >}}) - - [CopyManager类简介]({{< relref "./docs/Developerguide/CopyManager类简介.md >}}) - - [示例1:通过本地文件导入导出数据]({{< relref "./docs/Developerguide/示例1 -通过本地文件导入导出数据.md >}}) - - [示例2:从MySQL向openGauss进行数据迁移]({{< relref "./docs/Developerguide/示例2 -从MySQL向openGauss进行数据迁移.md >}}) - - [使用gsql元命令导入数据]({{< relref "./docs/Developerguide/使用gsql元命令导入数据.md >}}) - - [使用gs\_restore命令导入数据]({{< relref "./docs/Developerguide/使用gs_restore命令导入数据.md >}}) - - [更新表中数据]({{< relref "./docs/Developerguide/更新表中数据 -11.md >}}) - - [使用DML命令更新表]({{< relref "./docs/Developerguide/使用DML命令更新表.md >}}) - - [使用合并方式更新和插入数据]({{< relref "./docs/Developerguide/使用合并方式更新和插入数据.md >}}) - - [深层复制]({{< relref "./docs/Developerguide/深层复制.md >}}) - - [使用CREATE TABLE执行深层复制]({{< relref "./docs/Developerguide/使用CREATE -TABLE执行深层复制.md >}}) - - [使用CREATE TABLE LIKE执行深层复制]({{< relref "./docs/Developerguide/使用CREATE -TABLE -LIKE执行深层复制.md >}}) - - [通过创建临时表并截断原始表来执行深层复制]({{< relref "./docs/Developerguide/通过创建临时表并截断原始表来执行深层复制.md >}}) - - [分析表]({{< relref "./docs/Developerguide/分析表.md >}}) - - [对表执行VACUUM]({{< relref "./docs/Developerguide/对表执行VACUUM.md >}}) - - [管理并发写入操作]({{< relref "./docs/Developerguide/管理并发写入操作.md >}}) - - [事务隔离说明]({{< relref "./docs/Developerguide/事务隔离说明.md >}}) - - [写入和读写操作]({{< relref "./docs/Developerguide/写入和读写操作.md >}}) - - [并发写入事务的潜在死锁情况]({{< relref "./docs/Developerguide/并发写入事务的潜在死锁情况.md >}}) - - [并发写入示例]({{< relref "./docs/Developerguide/并发写入示例.md >}}) - - [相同表的INSERT和DELETE并发]({{< relref "./docs/Developerguide/相同表的INSERT和DELETE并发.md >}}) - - [相同表的并发INSERT]({{< relref "./docs/Developerguide/相同表的并发INSERT.md >}}) - - [相同表的并发UPDATE]({{< relref "./docs/Developerguide/相同表的并发UPDATE.md >}}) - - [数据导入和查询的并发]({{< relref "./docs/Developerguide/数据导入和查询的并发.md >}}) - - [导出数据]({{< relref "./docs/Developerguide/导出数据.md >}}) - - [使用gs\_dump和gs\_dumpall命令导出数据]({{< relref "./docs/Developerguide/使用gs_dump和gs_dumpall命令导出数据.md >}}) - - [概述]({{< relref "./docs/Developerguide/概述 -12.md >}}) - - [导出单个数据库]({{< relref "./docs/Developerguide/导出单个数据库.md >}}) - - [导出数据库]({{< relref "./docs/Developerguide/导出数据库.md >}}) - - [导出模式]({{< relref "./docs/Developerguide/导出模式.md >}}) - - [导出表]({{< relref "./docs/Developerguide/导出表.md >}}) - - [导出所有数据库]({{< relref "./docs/Developerguide/导出所有数据库.md >}}) - - [导出所有数据库]({{< relref "./docs/Developerguide/导出所有数据库 -13.md >}}) - - [导出全局对象]({{< relref "./docs/Developerguide/导出全局对象.md >}}) - - [无权限角色导出数据]({{< relref "./docs/Developerguide/无权限角色导出数据.md >}}) - - [AI特性]({{< relref "./docs/Developerguide/AI特性.md >}}) - - [SQL执行时间预测特性]({{< relref "./docs/Developerguide/SQL执行时间预测特性.md >}}) - - [概述]({{< relref "./docs/Developerguide/概述 -14.md >}}) - - [使用指南]({{< relref "./docs/Developerguide/使用指南.md >}}) - - [最佳实践]({{< relref "./docs/Developerguide/最佳实践.md >}}) - - [常见问题处理]({{< relref "./docs/Developerguide/常见问题处理.md >}}) - - [配置运行参数]({{< relref "./docs/Developerguide/配置运行参数.md >}}) - - [查看参数当前取值]({{< relref "./docs/Developerguide/查看参数当前取值.md >}}) - - [重设参数]({{< relref "./docs/Developerguide/重设参数.md >}}) - - [SQL参考]({{< relref "./docs/Developerguide/SQL参考.md >}}) - - [openGauss SQL]({{< relref "./docs/Developerguide/openGauss -SQL.md >}}) - - [关键字]({{< relref "./docs/Developerguide/关键字.md >}}) - - [数据类型]({{< relref "./docs/Developerguide/数据类型.md >}}) - - [数值类型]({{< relref "./docs/Developerguide/数值类型.md >}}) - - [货币类型]({{< relref "./docs/Developerguide/货币类型.md >}}) - - [布尔类型]({{< relref "./docs/Developerguide/布尔类型.md >}}) - - [字符类型]({{< relref "./docs/Developerguide/字符类型.md >}}) - - [二进制类型]({{< relref "./docs/Developerguide/二进制类型.md >}}) - - [日期/时间类型]({{< relref "./docs/Developerguide/日期 -时间类型.md >}}) - - [几何类型]({{< relref "./docs/Developerguide/几何类型.md >}}) - - [网络地址类型]({{< relref "./docs/Developerguide/网络地址类型.md >}}) - - [位串类型]({{< relref "./docs/Developerguide/位串类型.md >}}) - - [文本搜索类型]({{< relref "./docs/Developerguide/文本搜索类型.md >}}) - - [UUID类型]({{< relref "./docs/Developerguide/UUID类型.md >}}) - - [JSON类型]({{< relref "./docs/Developerguide/JSON类型.md >}}) - - [对象标识符类型]({{< relref "./docs/Developerguide/对象标识符类型.md >}}) - - [伪类型]({{< relref "./docs/Developerguide/伪类型.md >}}) - - [列存表支持的数据类型]({{< relref "./docs/Developerguide/列存表支持的数据类型.md >}}) - - [常量与宏]({{< relref "./docs/Developerguide/常量与宏.md >}}) - - [函数和操作符]({{< relref "./docs/Developerguide/函数和操作符.md >}}) - - [逻辑操作符]({{< relref "./docs/Developerguide/逻辑操作符.md >}}) - - [比较操作符]({{< relref "./docs/Developerguide/比较操作符.md >}}) - - [字符处理函数和操作符]({{< relref "./docs/Developerguide/字符处理函数和操作符.md >}}) - - [二进制字符串函数和操作符]({{< relref "./docs/Developerguide/二进制字符串函数和操作符.md >}}) - - [位串函数和操作符]({{< relref "./docs/Developerguide/位串函数和操作符.md >}}) - - [模式匹配操作符]({{< relref "./docs/Developerguide/模式匹配操作符.md >}}) - - [数字操作函数和操作符]({{< relref "./docs/Developerguide/数字操作函数和操作符.md >}}) - - [时间和日期处理函数和操作符]({{< relref "./docs/Developerguide/时间和日期处理函数和操作符.md >}}) - - [类型转换函数]({{< relref "./docs/Developerguide/类型转换函数.md >}}) - - [几何函数和操作符]({{< relref "./docs/Developerguide/几何函数和操作符.md >}}) - - [网络地址函数和操作符]({{< relref "./docs/Developerguide/网络地址函数和操作符.md >}}) - - [文本检索函数和操作符]({{< relref "./docs/Developerguide/文本检索函数和操作符.md >}}) - - [JSON函数]({{< relref "./docs/Developerguide/JSON函数.md >}}) - - [SEQUENCE函数]({{< relref "./docs/Developerguide/SEQUENCE函数.md >}}) - - [数组函数和操作符]({{< relref "./docs/Developerguide/数组函数和操作符.md >}}) - - [范围函数和操作符]({{< relref "./docs/Developerguide/范围函数和操作符.md >}}) - - [聚集函数]({{< relref "./docs/Developerguide/聚集函数.md >}}) - - [窗口函数]({{< relref "./docs/Developerguide/窗口函数.md >}}) - - [安全函数]({{< relref "./docs/Developerguide/安全函数.md >}}) - - [返回集合的函数]({{< relref "./docs/Developerguide/返回集合的函数.md >}}) - - [条件表达式函数]({{< relref "./docs/Developerguide/条件表达式函数.md >}}) - - [系统信息函数]({{< relref "./docs/Developerguide/系统信息函数.md >}}) - - [系统管理函数]({{< relref "./docs/Developerguide/系统管理函数.md >}}) - - [配置设置函数]({{< relref "./docs/Developerguide/配置设置函数.md >}}) - - [通用文件访问函数]({{< relref "./docs/Developerguide/通用文件访问函数.md >}}) - - [服务器信号函数]({{< relref "./docs/Developerguide/服务器信号函数.md >}}) - - [备份恢复控制函数]({{< relref "./docs/Developerguide/备份恢复控制函数.md >}}) - - [快照同步函数]({{< relref "./docs/Developerguide/快照同步函数.md >}}) - - [数据库对象函数]({{< relref "./docs/Developerguide/数据库对象函数.md >}}) - - [咨询锁函数]({{< relref "./docs/Developerguide/咨询锁函数.md >}}) - - [逻辑复制函数]({{< relref "./docs/Developerguide/逻辑复制函数.md >}}) - - [其它函数]({{< relref "./docs/Developerguide/其它函数.md >}}) - - [统计信息函数]({{< relref "./docs/Developerguide/统计信息函数.md >}}) - - [触发器函数]({{< relref "./docs/Developerguide/触发器函数.md >}}) - - [内部接口函数]({{< relref "./docs/Developerguide/内部接口函数.md >}}) - - [表达式]({{< relref "./docs/Developerguide/表达式.md >}}) - - [简单表达式]({{< relref "./docs/Developerguide/简单表达式.md >}}) - - [条件表达式]({{< relref "./docs/Developerguide/条件表达式.md >}}) - - [子查询表达式]({{< relref "./docs/Developerguide/子查询表达式.md >}}) - - [数组表达式]({{< relref "./docs/Developerguide/数组表达式.md >}}) - - [行表达式]({{< relref "./docs/Developerguide/行表达式.md >}}) - - [类型转换]({{< relref "./docs/Developerguide/类型转换.md >}}) - - [概述]({{< relref "./docs/Developerguide/概述 -15.md >}}) - - [操作符]({{< relref "./docs/Developerguide/操作符.md >}}) - - [函数]({{< relref "./docs/Developerguide/函数.md >}}) - - [值存储]({{< relref "./docs/Developerguide/值存储.md >}}) - - [UNION,CASE和相关构造]({{< relref "./docs/Developerguide/UNION -CASE和相关构造.md >}}) - - [全文检索]({{< relref "./docs/Developerguide/全文检索.md >}}) - - [介绍]({{< relref "./docs/Developerguide/介绍.md >}}) - - [全文检索概述]({{< relref "./docs/Developerguide/全文检索概述.md >}}) - - [文档概念]({{< relref "./docs/Developerguide/文档概念.md >}}) - - [基本文本匹配]({{< relref "./docs/Developerguide/基本文本匹配.md >}}) - - [分词器]({{< relref "./docs/Developerguide/分词器.md >}}) - - [表和索引]({{< relref "./docs/Developerguide/表和索引.md >}}) - - [搜索表]({{< relref "./docs/Developerguide/搜索表.md >}}) - - [创建索引]({{< relref "./docs/Developerguide/创建索引.md >}}) - - [索引使用约束]({{< relref "./docs/Developerguide/索引使用约束.md >}}) - - [控制文本搜索]({{< relref "./docs/Developerguide/控制文本搜索.md >}}) - - [解析文档]({{< relref "./docs/Developerguide/解析文档.md >}}) - - [解析查询]({{< relref "./docs/Developerguide/解析查询.md >}}) - - [排序查询结果]({{< relref "./docs/Developerguide/排序查询结果.md >}}) - - [高亮搜索结果]({{< relref "./docs/Developerguide/高亮搜索结果.md >}}) - - [附加功能]({{< relref "./docs/Developerguide/附加功能.md >}}) - - [处理tsvector]({{< relref "./docs/Developerguide/处理tsvector.md >}}) - - [处理查询]({{< relref "./docs/Developerguide/处理查询.md >}}) - - [查询重写]({{< relref "./docs/Developerguide/查询重写.md >}}) - - [收集文献统计]({{< relref "./docs/Developerguide/收集文献统计.md >}}) - - [解析器]({{< relref "./docs/Developerguide/解析器.md >}}) - - [词典]({{< relref "./docs/Developerguide/词典.md >}}) - - [词典概述]({{< relref "./docs/Developerguide/词典概述.md >}}) - - [停用词]({{< relref "./docs/Developerguide/停用词.md >}}) - - [Simple词典]({{< relref "./docs/Developerguide/Simple词典.md >}}) - - [Synonym词典]({{< relref "./docs/Developerguide/Synonym词典.md >}}) - - [Thesaurus词典]({{< relref "./docs/Developerguide/Thesaurus词典.md >}}) - - [Ispell词典]({{< relref "./docs/Developerguide/Ispell词典.md >}}) - - [Snowball词典]({{< relref "./docs/Developerguide/Snowball词典.md >}}) - - [配置示例]({{< relref "./docs/Developerguide/配置示例.md >}}) - - [测试和调试文本搜索]({{< relref "./docs/Developerguide/测试和调试文本搜索.md >}}) - - [分词器测试]({{< relref "./docs/Developerguide/分词器测试.md >}}) - - [解析器测试]({{< relref "./docs/Developerguide/解析器测试.md >}}) - - [词典测试]({{< relref "./docs/Developerguide/词典测试.md >}}) - - [限制约束]({{< relref "./docs/Developerguide/限制约束.md >}}) - - [系统操作]({{< relref "./docs/Developerguide/系统操作.md >}}) - - [事务控制]({{< relref "./docs/Developerguide/事务控制.md >}}) - - [DDL语法一览表]({{< relref "./docs/Developerguide/DDL语法一览表.md >}}) - - [DML语法一览表]({{< relref "./docs/Developerguide/DML语法一览表.md >}}) - - [DCL语法一览表]({{< relref "./docs/Developerguide/DCL语法一览表.md >}}) - - [SQL语法]({{< relref "./docs/Developerguide/SQL语法.md >}}) - - [ABORT]({{< relref "./docs/Developerguide/ABORT.md >}}) - - [ALTER DATABASE]({{< relref "./docs/Developerguide/ALTER -DATABASE.md >}}) - - [ALTER DATA SOURCE]({{< relref "./docs/Developerguide/ALTER -DATA -SOURCE.md >}}) - - [ALTER DEFAULT PRIVILEGES]({{< relref "./docs/Developerguide/ALTER -DEFAULT -PRIVILEGES.md >}}) - - [ALTER DIRECTORY]({{< relref "./docs/Developerguide/ALTER -DIRECTORY.md >}}) - - [ALTER FUNCTION]({{< relref "./docs/Developerguide/ALTER -FUNCTION.md >}}) - - [ALTER GROUP]({{< relref "./docs/Developerguide/ALTER -GROUP.md >}}) - - [ALTER INDEX]({{< relref "./docs/Developerguide/ALTER -INDEX.md >}}) - - [ALTER LARGE OBJECT]({{< relref "./docs/Developerguide/ALTER -LARGE -OBJECT.md >}}) - - [ALTER ROLE]({{< relref "./docs/Developerguide/ALTER -ROLE.md >}}) - - [ALTER ROW LEVEL SECURITY POLICY]({{< relref "./docs/Developerguide/ALTER -ROW -LEVEL -SECURITY -POLICY.md >}}) - - [ALTER SCHEMA]({{< relref "./docs/Developerguide/ALTER -SCHEMA.md >}}) - - [ALTER SEQUENCE]({{< relref "./docs/Developerguide/ALTER -SEQUENCE.md >}}) - - [ALTER SESSION]({{< relref "./docs/Developerguide/ALTER -SESSION.md >}}) - - [ALTER SYSTEM KILL SESSION]({{< relref "./docs/Developerguide/ALTER -SYSTEM -KILL -SESSION.md >}}) - - [ALTER TABLE]({{< relref "./docs/Developerguide/ALTER -TABLE.md >}}) - - [ALTER TABLE PARTITION]({{< relref "./docs/Developerguide/ALTER -TABLE -PARTITION.md >}}) - - [ALTER TABLESPACE]({{< relref "./docs/Developerguide/ALTER -TABLESPACE.md >}}) - - [ALTER TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/ALTER -TEXT -SEARCH -CONFIGURATION.md >}}) - - [ALTER TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/ALTER -TEXT -SEARCH -DICTIONARY.md >}}) - - [ALTER TRIGGER]({{< relref "./docs/Developerguide/ALTER -TRIGGER.md >}}) - - [ALTER TYPE]({{< relref "./docs/Developerguide/ALTER -TYPE.md >}}) - - [ALTER USER]({{< relref "./docs/Developerguide/ALTER -USER.md >}}) - - [ALTER VIEW]({{< relref "./docs/Developerguide/ALTER -VIEW.md >}}) - - [ANALYZE | ANALYSE]({{< relref "./docs/Developerguide/ANALYZE -ANALYSE.md >}}) - - [BEGIN]({{< relref "./docs/Developerguide/BEGIN.md >}}) - - [CALL]({{< relref "./docs/Developerguide/CALL.md >}}) - - [CHECKPOINT]({{< relref "./docs/Developerguide/CHECKPOINT.md >}}) - - [CLOSE]({{< relref "./docs/Developerguide/CLOSE.md >}}) - - [CLUSTER]({{< relref "./docs/Developerguide/CLUSTER.md >}}) - - [COMMENT]({{< relref "./docs/Developerguide/COMMENT.md >}}) - - [COMMIT | END]({{< relref "./docs/Developerguide/COMMIT -END.md >}}) - - [COMMIT PREPARED]({{< relref "./docs/Developerguide/COMMIT -PREPARED.md >}}) - - [COPY]({{< relref "./docs/Developerguide/COPY.md >}}) - - [CREATE DATABASE]({{< relref "./docs/Developerguide/CREATE -DATABASE.md >}}) - - [CREATE DATA SOURCE]({{< relref "./docs/Developerguide/CREATE -DATA -SOURCE.md >}}) - - [CREATE DIRECTORY]({{< relref "./docs/Developerguide/CREATE -DIRECTORY.md >}}) - - [CREATE FUNCTION]({{< relref "./docs/Developerguide/CREATE -FUNCTION.md >}}) - - [CREATE GROUP]({{< relref "./docs/Developerguide/CREATE -GROUP.md >}}) - - [CREATE INDEX]({{< relref "./docs/Developerguide/CREATE -INDEX.md >}}) - - [CREATE ROW LEVLEL SECURITY POLICY]({{< relref "./docs/Developerguide/CREATE -ROW -LEVLEL -SECURITY -POLICY.md >}}) - - [CREATE PROCEDURE]({{< relref "./docs/Developerguide/CREATE -PROCEDURE.md >}}) - - [CREATE ROLE]({{< relref "./docs/Developerguide/CREATE -ROLE.md >}}) - - [CREATE SCHEMA]({{< relref "./docs/Developerguide/CREATE -SCHEMA.md >}}) - - [CREATE SEQUENCE]({{< relref "./docs/Developerguide/CREATE -SEQUENCE.md >}}) - - [CREATE TABLE]({{< relref "./docs/Developerguide/CREATE -TABLE.md >}}) - - [CREATE TABLE AS]({{< relref "./docs/Developerguide/CREATE -TABLE -AS.md >}}) - - [CREATE TABLE PARTITION]({{< relref "./docs/Developerguide/CREATE -TABLE -PARTITION.md >}}) - - [CREATE TABLESPACE]({{< relref "./docs/Developerguide/CREATE -TABLESPACE.md >}}) - - [CREATE TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/CREATE -TEXT -SEARCH -CONFIGURATION.md >}}) - - [CREATE TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/CREATE -TEXT -SEARCH -DICTIONARY.md >}}) - - [CREATE TRIGGER]({{< relref "./docs/Developerguide/CREATE -TRIGGER.md >}}) - - [CREATE TYPE]({{< relref "./docs/Developerguide/CREATE -TYPE.md >}}) - - [CREATE USER]({{< relref "./docs/Developerguide/CREATE -USER.md >}}) - - [CREATE VIEW]({{< relref "./docs/Developerguide/CREATE -VIEW.md >}}) - - [CURSOR]({{< relref "./docs/Developerguide/CURSOR.md >}}) - - [DEALLOCATE]({{< relref "./docs/Developerguide/DEALLOCATE.md >}}) - - [DECLARE]({{< relref "./docs/Developerguide/DECLARE.md >}}) - - [DELETE]({{< relref "./docs/Developerguide/DELETE.md >}}) - - [DO]({{< relref "./docs/Developerguide/DO.md >}}) - - [DROP DATABASE]({{< relref "./docs/Developerguide/DROP -DATABASE.md >}}) - - [DROP DATA SOURCE]({{< relref "./docs/Developerguide/DROP -DATA -SOURCE.md >}}) - - [DROP DIRECTORY]({{< relref "./docs/Developerguide/DROP -DIRECTORY.md >}}) - - [DROP FUNCTION]({{< relref "./docs/Developerguide/DROP -FUNCTION.md >}}) - - [DROP GROUP]({{< relref "./docs/Developerguide/DROP -GROUP.md >}}) - - [DROP INDEX]({{< relref "./docs/Developerguide/DROP -INDEX.md >}}) - - [DROP OWNED]({{< relref "./docs/Developerguide/DROP -OWNED.md >}}) - - [DROP ROW LEVEL SECURITY POLICY]({{< relref "./docs/Developerguide/DROP -ROW -LEVEL -SECURITY -POLICY.md >}}) - - [DROP PROCEDURE]({{< relref "./docs/Developerguide/DROP -PROCEDURE.md >}}) - - [DROP ROLE]({{< relref "./docs/Developerguide/DROP -ROLE.md >}}) - - [DROP SCHEMA]({{< relref "./docs/Developerguide/DROP -SCHEMA.md >}}) - - [DROP SEQUENCE]({{< relref "./docs/Developerguide/DROP -SEQUENCE.md >}}) - - [DROP TABLE]({{< relref "./docs/Developerguide/DROP -TABLE.md >}}) - - [DROP TABLESPACE]({{< relref "./docs/Developerguide/DROP -TABLESPACE.md >}}) - - [DROP TEXT SEARCH CONFIGURATION]({{< relref "./docs/Developerguide/DROP -TEXT -SEARCH -CONFIGURATION.md >}}) - - [DROP TEXT SEARCH DICTIONARY]({{< relref "./docs/Developerguide/DROP -TEXT -SEARCH -DICTIONARY.md >}}) - - [DROP TRIGGER]({{< relref "./docs/Developerguide/DROP -TRIGGER.md >}}) - - [DROP TYPE]({{< relref "./docs/Developerguide/DROP -TYPE.md >}}) - - [DROP USER]({{< relref "./docs/Developerguide/DROP -USER.md >}}) - - [DROP VIEW]({{< relref "./docs/Developerguide/DROP -VIEW.md >}}) - - [EXECUTE]({{< relref "./docs/Developerguide/EXECUTE.md >}}) - - [EXPLAIN]({{< relref "./docs/Developerguide/EXPLAIN.md >}}) - - [EXPLAIN PLAN]({{< relref "./docs/Developerguide/EXPLAIN -PLAN.md >}}) - - [FETCH]({{< relref "./docs/Developerguide/FETCH.md >}}) - - [GRANT]({{< relref "./docs/Developerguide/GRANT.md >}}) - - [INSERT]({{< relref "./docs/Developerguide/INSERT.md >}}) - - [LOCK]({{< relref "./docs/Developerguide/LOCK.md >}}) - - [MOVE]({{< relref "./docs/Developerguide/MOVE.md >}}) - - [MERGE INTO]({{< relref "./docs/Developerguide/MERGE -INTO.md >}}) - - [PREPARE]({{< relref "./docs/Developerguide/PREPARE.md >}}) - - [PREPARE TRANSACTION]({{< relref "./docs/Developerguide/PREPARE -TRANSACTION.md >}}) - - [REASSIGN OWNED]({{< relref "./docs/Developerguide/REASSIGN -OWNED.md >}}) - - [REINDEX]({{< relref "./docs/Developerguide/REINDEX.md >}}) - - [RELEASE SAVEPOINT]({{< relref "./docs/Developerguide/RELEASE -SAVEPOINT.md >}}) - - [RESET]({{< relref "./docs/Developerguide/RESET.md >}}) - - [REVOKE]({{< relref "./docs/Developerguide/REVOKE.md >}}) - - [ROLLBACK]({{< relref "./docs/Developerguide/ROLLBACK.md >}}) - - [ROLLBACK PREPARED]({{< relref "./docs/Developerguide/ROLLBACK -PREPARED.md >}}) - - [ROLLBACK TO SAVEPOINT]({{< relref "./docs/Developerguide/ROLLBACK -TO -SAVEPOINT.md >}}) - - [SAVEPOINT]({{< relref "./docs/Developerguide/SAVEPOINT.md >}}) - - [SELECT]({{< relref "./docs/Developerguide/SELECT.md >}}) - - [SELECT INTO]({{< relref "./docs/Developerguide/SELECT -INTO.md >}}) - - [SET]({{< relref "./docs/Developerguide/SET.md >}}) - - [SET CONSTRAINTS]({{< relref "./docs/Developerguide/SET -CONSTRAINTS.md >}}) - - [SET ROLE]({{< relref "./docs/Developerguide/SET -ROLE.md >}}) - - [SET SESSION AUTHORIZATION]({{< relref "./docs/Developerguide/SET -SESSION -AUTHORIZATION.md >}}) - - [SET TRANSACTION]({{< relref "./docs/Developerguide/SET -TRANSACTION.md >}}) - - [SHOW]({{< relref "./docs/Developerguide/SHOW.md >}}) - - [START TRANSACTION]({{< relref "./docs/Developerguide/START -TRANSACTION.md >}}) - - [TRUNCATE]({{< relref "./docs/Developerguide/TRUNCATE.md >}}) - - [UPDATE]({{< relref "./docs/Developerguide/UPDATE.md >}}) - - [VACUUM]({{< relref "./docs/Developerguide/VACUUM.md >}}) - - [VALUES]({{< relref "./docs/Developerguide/VALUES.md >}}) - - [附录]({{< relref "./docs/Developerguide/附录 -16.md >}}) - - [GIN索引]({{< relref "./docs/Developerguide/GIN索引.md >}}) - - [介绍]({{< relref "./docs/Developerguide/介绍 -17.md >}}) - - [扩展性]({{< relref "./docs/Developerguide/扩展性.md >}}) - - [实现]({{< relref "./docs/Developerguide/实现.md >}}) - - [GIN提示与技巧]({{< relref "./docs/Developerguide/GIN提示与技巧.md >}}) - - [扩展函数]({{< relref "./docs/Developerguide/扩展函数.md >}}) - - [扩展语法]({{< relref "./docs/Developerguide/扩展语法.md >}}) - - [系统表和系统视图]({{< relref "./docs/Developerguide/系统表和系统视图.md >}}) - - [系统表和系统视图概述]({{< relref "./docs/Developerguide/系统表和系统视图概述.md >}}) - - [系统表]({{< relref "./docs/Developerguide/系统表.md >}}) - - [GS\_OPT\_MODEL]({{< relref "./docs/Developerguide/GS_OPT_MODEL.md >}}) - - [GS\_WLM\_INSTANCE\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_INSTANCE_HISTORY.md >}}) - - [GS\_WLM\_OPERATOR\_INFO]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_INFO.md >}}) - - [GS\_WLM\_PLAN\_ENCODING\_TABLE]({{< relref "./docs/Developerguide/GS_WLM_PLAN_ENCODING_TABLE.md >}}) - - [GS\_WLM\_PLAN\_OPERATOR\_INFO]({{< relref "./docs/Developerguide/GS_WLM_PLAN_OPERATOR_INFO.md >}}) - - [GS\_WLM\_SESSION\_QUERY\_INFO\_ALL]({{< relref "./docs/Developerguide/GS_WLM_SESSION_QUERY_INFO_ALL.md >}}) - - [GS\_WLM\_USER\_RESOURCE\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_USER_RESOURCE_HISTORY.md >}}) - - [PG\_AGGREGATE]({{< relref "./docs/Developerguide/PG_AGGREGATE.md >}}) - - [PG\_AM]({{< relref "./docs/Developerguide/PG_AM.md >}}) - - [PG\_AMOP]({{< relref "./docs/Developerguide/PG_AMOP.md >}}) - - [PG\_AMPROC]({{< relref "./docs/Developerguide/PG_AMPROC.md >}}) - - [PG\_APP\_WORKLOADGROUP\_MAPPING]({{< relref "./docs/Developerguide/PG_APP_WORKLOADGROUP_MAPPING.md >}}) - - [PG\_ATTRDEF]({{< relref "./docs/Developerguide/PG_ATTRDEF.md >}}) - - [PG\_ATTRIBUTE]({{< relref "./docs/Developerguide/PG_ATTRIBUTE.md >}}) - - [PG\_AUTHID]({{< relref "./docs/Developerguide/PG_AUTHID.md >}}) - - [PG\_AUTH\_HISTORY]({{< relref "./docs/Developerguide/PG_AUTH_HISTORY.md >}}) - - [PG\_AUTH\_MEMBERS]({{< relref "./docs/Developerguide/PG_AUTH_MEMBERS.md >}}) - - [PG\_CAST]({{< relref "./docs/Developerguide/PG_CAST.md >}}) - - [PG\_CLASS]({{< relref "./docs/Developerguide/PG_CLASS.md >}}) - - [PG\_COLLATION]({{< relref "./docs/Developerguide/PG_COLLATION.md >}}) - - [PG\_CONSTRAINT]({{< relref "./docs/Developerguide/PG_CONSTRAINT.md >}}) - - [PG\_CONVERSION]({{< relref "./docs/Developerguide/PG_CONVERSION.md >}}) - - [PG\_DATABASE]({{< relref "./docs/Developerguide/PG_DATABASE.md >}}) - - [PG\_DB\_ROLE\_SETTING]({{< relref "./docs/Developerguide/PG_DB_ROLE_SETTING.md >}}) - - [PG\_DEFAULT\_ACL]({{< relref "./docs/Developerguide/PG_DEFAULT_ACL.md >}}) - - [PG\_DEPEND]({{< relref "./docs/Developerguide/PG_DEPEND.md >}}) - - [PG\_DESCRIPTION]({{< relref "./docs/Developerguide/PG_DESCRIPTION.md >}}) - - [PG\_DIRECTORY]({{< relref "./docs/Developerguide/PG_DIRECTORY.md >}}) - - [PG\_ENUM]({{< relref "./docs/Developerguide/PG_ENUM.md >}}) - - [PG\_EXTENSION]({{< relref "./docs/Developerguide/PG_EXTENSION.md >}}) - - [PG\_EXTENSION\_DATA\_SOURCE]({{< relref "./docs/Developerguide/PG_EXTENSION_DATA_SOURCE.md >}}) - - [PG\_FOREIGN\_DATA\_WRAPPER]({{< relref "./docs/Developerguide/PG_FOREIGN_DATA_WRAPPER.md >}}) - - [PG\_FOREIGN\_SERVER]({{< relref "./docs/Developerguide/PG_FOREIGN_SERVER.md >}}) - - [PG\_FOREIGN\_TABLE]({{< relref "./docs/Developerguide/PG_FOREIGN_TABLE.md >}}) - - [PG\_INDEX]({{< relref "./docs/Developerguide/PG_INDEX.md >}}) - - [PG\_INHERITS]({{< relref "./docs/Developerguide/PG_INHERITS.md >}}) - - [PG\_JOB]({{< relref "./docs/Developerguide/PG_JOB.md >}}) - - [PG\_JOB\_PROC]({{< relref "./docs/Developerguide/PG_JOB_PROC.md >}}) - - [PG\_LANGUAGE]({{< relref "./docs/Developerguide/PG_LANGUAGE.md >}}) - - [PG\_LARGEOBJECT]({{< relref "./docs/Developerguide/PG_LARGEOBJECT.md >}}) - - [PG\_LARGEOBJECT\_METADATA]({{< relref "./docs/Developerguide/PG_LARGEOBJECT_METADATA.md >}}) - - [PG\_NAMESPACE]({{< relref "./docs/Developerguide/PG_NAMESPACE.md >}}) - - [PG\_OBJECT]({{< relref "./docs/Developerguide/PG_OBJECT.md >}}) - - [PG\_OPCLASS]({{< relref "./docs/Developerguide/PG_OPCLASS.md >}}) - - [PG\_OPERATOR]({{< relref "./docs/Developerguide/PG_OPERATOR.md >}}) - - [PG\_OPFAMILY]({{< relref "./docs/Developerguide/PG_OPFAMILY.md >}}) - - [PG\_PARTITION]({{< relref "./docs/Developerguide/PG_PARTITION.md >}}) - - [PG\_PLTEMPLATE]({{< relref "./docs/Developerguide/PG_PLTEMPLATE.md >}}) - - [PG\_PROC]({{< relref "./docs/Developerguide/PG_PROC.md >}}) - - [PG\_RANGE]({{< relref "./docs/Developerguide/PG_RANGE.md >}}) - - [PG\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/PG_RESOURCE_POOL.md >}}) - - [PG\_REWRITE]({{< relref "./docs/Developerguide/PG_REWRITE.md >}}) - - [PG\_RLSPOLICY]({{< relref "./docs/Developerguide/PG_RLSPOLICY.md >}}) - - [PG\_SECLABEL]({{< relref "./docs/Developerguide/PG_SECLABEL.md >}}) - - [PG\_SHDEPEND]({{< relref "./docs/Developerguide/PG_SHDEPEND.md >}}) - - [PG\_SHDESCRIPTION]({{< relref "./docs/Developerguide/PG_SHDESCRIPTION.md >}}) - - [PG\_SHSECLABEL]({{< relref "./docs/Developerguide/PG_SHSECLABEL.md >}}) - - [PG\_STATISTIC]({{< relref "./docs/Developerguide/PG_STATISTIC.md >}}) - - [PG\_STATISTIC\_EXT]({{< relref "./docs/Developerguide/PG_STATISTIC_EXT.md >}}) - - [PG\_TABLESPACE]({{< relref "./docs/Developerguide/PG_TABLESPACE.md >}}) - - [PG\_TRIGGER]({{< relref "./docs/Developerguide/PG_TRIGGER.md >}}) - - [PG\_TS\_CONFIG]({{< relref "./docs/Developerguide/PG_TS_CONFIG.md >}}) - - [PG\_TS\_CONFIG\_MAP]({{< relref "./docs/Developerguide/PG_TS_CONFIG_MAP.md >}}) - - [PG\_TS\_DICT]({{< relref "./docs/Developerguide/PG_TS_DICT.md >}}) - - [PG\_TS\_PARSER]({{< relref "./docs/Developerguide/PG_TS_PARSER.md >}}) - - [PG\_TS\_TEMPLATE]({{< relref "./docs/Developerguide/PG_TS_TEMPLATE.md >}}) - - [PG\_TYPE]({{< relref "./docs/Developerguide/PG_TYPE.md >}}) - - [PG\_USER\_MAPPING]({{< relref "./docs/Developerguide/PG_USER_MAPPING.md >}}) - - [PG\_USER\_STATUS]({{< relref "./docs/Developerguide/PG_USER_STATUS.md >}}) - - [PG\_WORKLOAD\_GROUP]({{< relref "./docs/Developerguide/PG_WORKLOAD_GROUP.md >}}) - - [PLAN\_TABLE\_DATA]({{< relref "./docs/Developerguide/PLAN_TABLE_DATA.md >}}) - - [系统视图]({{< relref "./docs/Developerguide/系统视图.md >}}) - - [GET\_GTM\_LITE\_STATUS]({{< relref "./docs/Developerguide/GET_GTM_LITE_STATUS.md >}}) - - [GS\_SESSION\_CPU\_STATISTICS]({{< relref "./docs/Developerguide/GS_SESSION_CPU_STATISTICS.md >}}) - - [GS\_SESSION\_MEMORY\_STATISTICS]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_STATISTICS.md >}}) - - [GS\_SQL\_COUNT]({{< relref "./docs/Developerguide/GS_SQL_COUNT.md >}}) - - [GS\_WLM\_OPERATOR\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_HISTORY.md >}}) - - [GS\_WLM\_OPERATOR\_STATISTICS]({{< relref "./docs/Developerguide/GS_WLM_OPERATOR_STATISTICS.md >}}) - - [GS\_WLM\_PLAN\_OPERATOR\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_PLAN_OPERATOR_HISTORY.md >}}) - - [GS\_WLM\_REBUILD\_USER\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/GS_WLM_REBUILD_USER_RESOURCE_POOL.md >}}) - - [GS\_WLM\_RESOURCE\_POOL]({{< relref "./docs/Developerguide/GS_WLM_RESOURCE_POOL.md >}}) - - [GS\_WLM\_SESSION\_HISTORY]({{< relref "./docs/Developerguide/GS_WLM_SESSION_HISTORY.md >}}) - - [GS\_WLM\_SESSION\_INFO\_ALL]({{< relref "./docs/Developerguide/GS_WLM_SESSION_INFO_ALL.md >}}) - - [GS\_WLM\_USER\_INFO]({{< relref "./docs/Developerguide/GS_WLM_USER_INFO.md >}}) - - [GS\_WLM\_SESSION\_STATISTICS]({{< relref "./docs/Developerguide/GS_WLM_SESSION_STATISTICS.md >}}) - - [GS\_STAT\_DB\_CU]({{< relref "./docs/Developerguide/GS_STAT_DB_CU.md >}}) - - [GS\_STAT\_SESSION\_CU]({{< relref "./docs/Developerguide/GS_STAT_SESSION_CU.md >}}) - - [MPP\_TABLES]({{< relref "./docs/Developerguide/MPP_TABLES.md >}}) - - [PG\_AVAILABLE\_EXTENSION\_VERSIONS]({{< relref "./docs/Developerguide/PG_AVAILABLE_EXTENSION_VERSIONS.md >}}) - - [PG\_AVAILABLE\_EXTENSIONS]({{< relref "./docs/Developerguide/PG_AVAILABLE_EXTENSIONS.md >}}) - - [PG\_CURSORS]({{< relref "./docs/Developerguide/PG_CURSORS.md >}}) - - [PG\_EXT\_STATS]({{< relref "./docs/Developerguide/PG_EXT_STATS.md >}}) - - [PG\_GET\_INVALID\_BACKENDS]({{< relref "./docs/Developerguide/PG_GET_INVALID_BACKENDS.md >}}) - - [PG\_GET\_SENDERS\_CATCHUP\_TIME]({{< relref "./docs/Developerguide/PG_GET_SENDERS_CATCHUP_TIME.md >}}) - - [PG\_GROUP]({{< relref "./docs/Developerguide/PG_GROUP.md >}}) - - [PG\_INDEXES]({{< relref "./docs/Developerguide/PG_INDEXES.md >}}) - - [PG\_LOCKS]({{< relref "./docs/Developerguide/PG_LOCKS.md >}}) - - [PG\_NODE\_ENV]({{< relref "./docs/Developerguide/PG_NODE_ENV.md >}}) - - [PG\_OS\_THREADS]({{< relref "./docs/Developerguide/PG_OS_THREADS.md >}}) - - [PG\_PREPARED\_STATEMENTS]({{< relref "./docs/Developerguide/PG_PREPARED_STATEMENTS.md >}}) - - [PG\_PREPARED\_XACTS]({{< relref "./docs/Developerguide/PG_PREPARED_XACTS.md >}}) - - [PG\_REPLICATION\_SLOTS]({{< relref "./docs/Developerguide/PG_REPLICATION_SLOTS.md >}}) - - [PG\_RLSPOLICIES]({{< relref "./docs/Developerguide/PG_RLSPOLICIES.md >}}) - - [PG\_ROLES]({{< relref "./docs/Developerguide/PG_ROLES.md >}}) - - [PG\_RULES]({{< relref "./docs/Developerguide/PG_RULES.md >}}) - - [PG\_RUNNING\_XACTS]({{< relref "./docs/Developerguide/PG_RUNNING_XACTS.md >}}) - - [PG\_SECLABELS]({{< relref "./docs/Developerguide/PG_SECLABELS.md >}}) - - [PG\_SESSION\_WLMSTAT]({{< relref "./docs/Developerguide/PG_SESSION_WLMSTAT.md >}}) - - [PG\_SESSION\_IOSTAT]({{< relref "./docs/Developerguide/PG_SESSION_IOSTAT.md >}}) - - [PG\_SETTINGS]({{< relref "./docs/Developerguide/PG_SETTINGS.md >}}) - - [PG\_SHADOW]({{< relref "./docs/Developerguide/PG_SHADOW.md >}}) - - [PG\_STATS]({{< relref "./docs/Developerguide/PG_STATS.md >}}) - - [PG\_STAT\_ACTIVITY]({{< relref "./docs/Developerguide/PG_STAT_ACTIVITY.md >}}) - - [PG\_STAT\_ALL\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_ALL_INDEXES.md >}}) - - [PG\_STAT\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_ALL_TABLES.md >}}) - - [PG\_STAT\_BAD\_BLOCK]({{< relref "./docs/Developerguide/PG_STAT_BAD_BLOCK.md >}}) - - [PG\_STAT\_BGWRITER]({{< relref "./docs/Developerguide/PG_STAT_BGWRITER.md >}}) - - [PG\_STAT\_DATABASE]({{< relref "./docs/Developerguide/PG_STAT_DATABASE.md >}}) - - [PG\_STAT\_DATABASE\_CONFLICTS]({{< relref "./docs/Developerguide/PG_STAT_DATABASE_CONFLICTS.md >}}) - - [PG\_STAT\_USER\_FUNCTIONS]({{< relref "./docs/Developerguide/PG_STAT_USER_FUNCTIONS.md >}}) - - [PG\_STAT\_USER\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_USER_INDEXES.md >}}) - - [PG\_STAT\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_USER_TABLES.md >}}) - - [PG\_STAT\_REPLICATION]({{< relref "./docs/Developerguide/PG_STAT_REPLICATION.md >}}) - - [PG\_STAT\_SYS\_INDEXES]({{< relref "./docs/Developerguide/PG_STAT_SYS_INDEXES.md >}}) - - [PG\_STAT\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_SYS_TABLES.md >}}) - - [PG\_STAT\_XACT\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_ALL_TABLES.md >}}) - - [PG\_STAT\_XACT\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_SYS_TABLES.md >}}) - - [PG\_STAT\_XACT\_USER\_FUNCTIONS]({{< relref "./docs/Developerguide/PG_STAT_XACT_USER_FUNCTIONS.md >}}) - - [PG\_STAT\_XACT\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STAT_XACT_USER_TABLES.md >}}) - - [PG\_STATIO\_ALL\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_INDEXES.md >}}) - - [PG\_STATIO\_ALL\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_SEQUENCES.md >}}) - - [PG\_STATIO\_ALL\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_ALL_TABLES.md >}}) - - [PG\_STATIO\_SYS\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_INDEXES.md >}}) - - [PG\_STATIO\_SYS\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_SEQUENCES.md >}}) - - [PG\_STATIO\_SYS\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_SYS_TABLES.md >}}) - - [PG\_STATIO\_USER\_INDEXES]({{< relref "./docs/Developerguide/PG_STATIO_USER_INDEXES.md >}}) - - [PG\_STATIO\_USER\_SEQUENCES]({{< relref "./docs/Developerguide/PG_STATIO_USER_SEQUENCES.md >}}) - - [PG\_STATIO\_USER\_TABLES]({{< relref "./docs/Developerguide/PG_STATIO_USER_TABLES.md >}}) - - [PG\_THREAD\_WAIT\_STATUS]({{< relref "./docs/Developerguide/PG_THREAD_WAIT_STATUS.md >}}) - - [PG\_TABLES]({{< relref "./docs/Developerguide/PG_TABLES.md >}}) - - [PG\_TDE\_INFO]({{< relref "./docs/Developerguide/PG_TDE_INFO.md >}}) - - [PG\_TIMEZONE\_NAMES]({{< relref "./docs/Developerguide/PG_TIMEZONE_NAMES.md >}}) - - [PG\_TOTAL\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/PG_TOTAL_MEMORY_DETAIL.md >}}) - - [PG\_TOTAL\_USER\_RESOURCE\_INFO]({{< relref "./docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO.md >}}) - - [PG\_USER]({{< relref "./docs/Developerguide/PG_USER.md >}}) - - [PG\_USER\_MAPPINGS]({{< relref "./docs/Developerguide/PG_USER_MAPPINGS.md >}}) - - [PG\_VIEWS]({{< relref "./docs/Developerguide/PG_VIEWS.md >}}) - - [PG\_WLM\_STATISTICS]({{< relref "./docs/Developerguide/PG_WLM_STATISTICS.md >}}) - - [PLAN\_TABLE]({{< relref "./docs/Developerguide/PLAN_TABLE.md >}}) - - [GS\_FILE\_STAT]({{< relref "./docs/Developerguide/GS_FILE_STAT.md >}}) - - [GS\_OS\_RUN\_INFO]({{< relref "./docs/Developerguide/GS_OS_RUN_INFO.md >}}) - - [GS\_REDO\_STAT]({{< relref "./docs/Developerguide/GS_REDO_STAT.md >}}) - - [GS\_SESSION\_MEMORY]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY.md >}}) - - [GS\_SESSION\_MEMORY\_CONTEXT]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_CONTEXT.md >}}) - - [GS\_SESSION\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/GS_SESSION_MEMORY_DETAIL.md >}}) - - [GS\_SESSION\_STAT]({{< relref "./docs/Developerguide/GS_SESSION_STAT.md >}}) - - [GS\_SESSION\_TIME]({{< relref "./docs/Developerguide/GS_SESSION_TIME.md >}}) - - [GS\_THREAD\_MEMORY\_CONTEXT]({{< relref "./docs/Developerguide/GS_THREAD_MEMORY_CONTEXT.md >}}) - - [GS\_TOTAL\_MEMORY\_DETAIL]({{< relref "./docs/Developerguide/GS_TOTAL_MEMORY_DETAIL.md >}}) - - [PG\_TIMEZONE\_ABBREVS]({{< relref "./docs/Developerguide/PG_TIMEZONE_ABBREVS.md >}}) - - [PG\_TOTAL\_USER\_RESOURCE\_INFO\_OID]({{< relref "./docs/Developerguide/PG_TOTAL_USER_RESOURCE_INFO_OID.md >}}) - - [PG\_VARIABLE\_INFO]({{< relref "./docs/Developerguide/PG_VARIABLE_INFO.md >}}) - - [GS\_INSTANCE\_TIME]({{< relref "./docs/Developerguide/GS_INSTANCE_TIME.md >}}) - - [GUC参数说明]({{< relref "./docs/Developerguide/GUC参数说明.md >}}) - - [GUC使用说明]({{< relref "./docs/Developerguide/GUC使用说明.md >}}) - - [文件位置]({{< relref "./docs/Developerguide/文件位置.md >}}) - - [连接和认证]({{< relref "./docs/Developerguide/连接和认证.md >}}) - - [连接设置]({{< relref "./docs/Developerguide/连接设置.md >}}) - - [安全和认证(postgresql.conf)]({{< relref "./docs/Developerguide/安全和认证(postgresql -conf).md >}}) - - [通信库参数]({{< relref "./docs/Developerguide/通信库参数.md >}}) - - [资源消耗]({{< relref "./docs/Developerguide/资源消耗.md >}}) - - [内存]({{< relref "./docs/Developerguide/内存.md >}}) - - [磁盘空间]({{< relref "./docs/Developerguide/磁盘空间.md >}}) - - [内核资源使用]({{< relref "./docs/Developerguide/内核资源使用.md >}}) - - [基于开销的清理延迟]({{< relref "./docs/Developerguide/基于开销的清理延迟.md >}}) - - [后端写进程]({{< relref "./docs/Developerguide/后端写进程.md >}}) - - [异步IO]({{< relref "./docs/Developerguide/异步IO.md >}}) - - [并行导入]({{< relref "./docs/Developerguide/并行导入.md >}}) - - [预写式日志]({{< relref "./docs/Developerguide/预写式日志.md >}}) - - [设置]({{< relref "./docs/Developerguide/设置.md >}}) - - [检查点]({{< relref "./docs/Developerguide/检查点.md >}}) - - [日志回放]({{< relref "./docs/Developerguide/日志回放.md >}}) - - [归档]({{< relref "./docs/Developerguide/归档.md >}}) - - [双机复制]({{< relref "./docs/Developerguide/双机复制.md >}}) - - [发送端服务器]({{< relref "./docs/Developerguide/发送端服务器.md >}}) - - [主服务器]({{< relref "./docs/Developerguide/主服务器.md >}}) - - [备服务器]({{< relref "./docs/Developerguide/备服务器.md >}}) - - [内存表]({{< relref "./docs/Developerguide/内存表.md >}}) - - [查询规划]({{< relref "./docs/Developerguide/查询规划.md >}}) - - [优化器方法配置]({{< relref "./docs/Developerguide/优化器方法配置.md >}}) - - [优化器开销常量]({{< relref "./docs/Developerguide/优化器开销常量.md >}}) - - [基因查询优化器]({{< relref "./docs/Developerguide/基因查询优化器.md >}}) - - [其他优化器选项]({{< relref "./docs/Developerguide/其他优化器选项.md >}}) - - [错误报告和日志]({{< relref "./docs/Developerguide/错误报告和日志.md >}}) - - [记录日志的位置]({{< relref "./docs/Developerguide/记录日志的位置.md >}}) - - [记录日志的时间]({{< relref "./docs/Developerguide/记录日志的时间.md >}}) - - [记录日志的内容]({{< relref "./docs/Developerguide/记录日志的内容.md >}}) - - [使用CSV格式写日志]({{< relref "./docs/Developerguide/使用CSV格式写日志.md >}}) - - [告警检测]({{< relref "./docs/Developerguide/告警检测.md >}}) - - [运行时统计]({{< relref "./docs/Developerguide/运行时统计.md >}}) - - [查询和索引统计收集器]({{< relref "./docs/Developerguide/查询和索引统计收集器.md >}}) - - [性能统计]({{< relref "./docs/Developerguide/性能统计.md >}}) - - [负载管理]({{< relref "./docs/Developerguide/负载管理.md >}}) - - [自动清理]({{< relref "./docs/Developerguide/自动清理.md >}}) - - [客户端连接缺省设置]({{< relref "./docs/Developerguide/客户端连接缺省设置.md >}}) - - [语句行为]({{< relref "./docs/Developerguide/语句行为.md >}}) - - [区域和格式化]({{< relref "./docs/Developerguide/区域和格式化.md >}}) - - [其他缺省]({{< relref "./docs/Developerguide/其他缺省.md >}}) - - [锁管理]({{< relref "./docs/Developerguide/锁管理.md >}}) - - [版本和平台兼容性]({{< relref "./docs/Developerguide/版本和平台兼容性.md >}}) - - [历史版本兼容性]({{< relref "./docs/Developerguide/历史版本兼容性.md >}}) - - [平台和客户端兼容性]({{< relref "./docs/Developerguide/平台和客户端兼容性.md >}}) - - [容错性]({{< relref "./docs/Developerguide/容错性.md >}}) - - [连接池参数]({{< relref "./docs/Developerguide/连接池参数.md >}}) - - [openGauss事务]({{< relref "./docs/Developerguide/openGauss事务.md >}}) - - [开发人员选项]({{< relref "./docs/Developerguide/开发人员选项.md >}}) - - [审计]({{< relref "./docs/Developerguide/审计.md >}}) - - [审计开关]({{< relref "./docs/Developerguide/审计开关.md >}}) - - [用户和权限审计]({{< relref "./docs/Developerguide/用户和权限审计.md >}}) - - [操作审计]({{< relref "./docs/Developerguide/操作审计.md >}}) - - [事务监控]({{< relref "./docs/Developerguide/事务监控.md >}}) - - [升级参数]({{< relref "./docs/Developerguide/升级参数.md >}}) - - [其它选项]({{< relref "./docs/Developerguide/其它选项.md >}}) - - [等待事件]({{< relref "./docs/Developerguide/等待事件.md >}}) - - [Query]({{< relref "./docs/Developerguide/Query.md >}}) - - [系统性能快照]({{< relref "./docs/Developerguide/系统性能快照.md >}}) - - [常见故障定位指南]({{< relref "./docs/Developerguide/常见故障定位指南.md >}}) - - [core问题定位]({{< relref "./docs/Developerguide/core问题定位.md >}}) - - [磁盘满故障引起的core问题]({{< relref "./docs/Developerguide/磁盘满故障引起的core问题.md >}}) - - [GUC参数log\_directory设置不正确引起的core问题]({{< relref "./docs/Developerguide/GUC参数log_directory设置不正确引起的core问题.md >}}) - -- [工具参考]({{< relref "./docs/Toolreference/Toolreference.md >}}) - - [工具一览表]({{< relref "./docs/Toolreference/工具一览表.md >}}) - - [客户端工具]({{< relref "./docs/Toolreference/客户端工具.md >}}) - - [gsql]({{< relref "./docs/Toolreference/gsql.md >}}) - - [gsql概述]({{< relref "./docs/Toolreference/gsql概述.md >}}) - - [使用指导]({{< relref "./docs/Toolreference/使用指导.md >}}) - - [获取帮助]({{< relref "./docs/Toolreference/获取帮助.md >}}) - - [命令参考]({{< relref "./docs/Toolreference/命令参考.md >}}) - - [元命令参考]({{< relref "./docs/Toolreference/元命令参考.md >}}) - - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理.md >}}) - - [X -Tuner]({{< relref "./docs/Toolreference/X -Tuner.md >}}) - - [概述]({{< relref "./docs/Toolreference/概述.md >}}) - - [使用指导]({{< relref "./docs/Toolreference/使用指导 -0.md >}}) - - [获取帮助]({{< relref "./docs/Toolreference/获取帮助 -1.md >}}) - - [命令参考]({{< relref "./docs/Toolreference/命令参考 -2.md >}}) - - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -3.md >}}) - - [Sqldiag]({{< relref "./docs/Toolreference/Sqldiag.md >}}) - - [概述]({{< relref "./docs/Toolreference/概述 -4.md >}}) - - [使用指导]({{< relref "./docs/Toolreference/使用指导 -5.md >}}) - - [获取帮助]({{< relref "./docs/Toolreference/获取帮助 -6.md >}}) - - [命令参考]({{< relref "./docs/Toolreference/命令参考 -7.md >}}) - - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -8.md >}}) - - [Predictor]({{< relref "./docs/Toolreference/Predictor.md >}}) - - [概述]({{< relref "./docs/Toolreference/概述 -9.md >}}) - - [使用指导]({{< relref "./docs/Toolreference/使用指导 -10.md >}}) - - [常见问题处理]({{< relref "./docs/Toolreference/常见问题处理 -11.md >}}) - - [服务端工具]({{< relref "./docs/Toolreference/服务端工具.md >}}) - - [gs\_check]({{< relref "./docs/Toolreference/gs_check.md >}}) - - [gs\_checkos]({{< relref "./docs/Toolreference/gs_checkos.md >}}) - - [gs\_checkperf]({{< relref "./docs/Toolreference/gs_checkperf.md >}}) - - [gs\_collector]({{< relref "./docs/Toolreference/gs_collector.md >}}) - - [gs\_dump]({{< relref "./docs/Toolreference/gs_dump.md >}}) - - [gs\_dumpall]({{< relref "./docs/Toolreference/gs_dumpall.md >}}) - - [gs\_guc]({{< relref "./docs/Toolreference/gs_guc.md >}}) - - [gs\_om]({{< relref "./docs/Toolreference/gs_om.md >}}) - - [gs\_restore]({{< relref "./docs/Toolreference/gs_restore.md >}}) - - [gs\_ssh]({{< relref "./docs/Toolreference/gs_ssh.md >}}) - - [系统内部使用的工具]({{< relref "./docs/Toolreference/系统内部使用的工具.md >}}) - - [gaussdb]({{< relref "./docs/Toolreference/gaussdb.md >}}) - - [gs\_backup]({{< relref "./docs/Toolreference/gs_backup.md >}}) - - [gs\_basebackup]({{< relref "./docs/Toolreference/gs_basebackup.md >}}) - - [gs\_ctl]({{< relref "./docs/Toolreference/gs_ctl.md >}}) - - [gs\_install]({{< relref "./docs/Toolreference/gs_install.md >}}) - - [gs\_postuninstall]({{< relref "./docs/Toolreference/gs_postuninstall.md >}}) - - [gs\_preinstall]({{< relref "./docs/Toolreference/gs_preinstall.md >}}) - - [gs\_sshexkey]({{< relref "./docs/Toolreference/gs_sshexkey.md >}}) - - [gs\_uninstall]({{< relref "./docs/Toolreference/gs_uninstall.md >}}) - - [gs\_upgradectl]({{< relref "./docs/Toolreference/gs_upgradectl.md >}}) - - [gstrace]({{< relref "./docs/Toolreference/gstrace.md >}}) - - [kdb5\_util]({{< relref "./docs/Toolreference/kdb5_util.md >}}) - - [kadmin.local]({{< relref "./docs/Toolreference/kadmin -local.md >}}) - - [kinit]({{< relref "./docs/Toolreference/kinit.md >}}) - - [klist]({{< relref "./docs/Toolreference/klist.md >}}) - - [krb5kdc]({{< relref "./docs/Toolreference/krb5kdc.md >}}) - - [kdestroy]({{< relref "./docs/Toolreference/kdestroy.md >}}) - - [pg\_config]({{< relref "./docs/Toolreference/pg_config.md >}}) - - [pg\_controldata]({{< relref "./docs/Toolreference/pg_controldata.md >}}) - - [pg\_resetxlog]({{< relref "./docs/Toolreference/pg_resetxlog.md >}}) - - [FAQ]({{< relref "./docs/Toolreference/FAQ.md >}}) - - [执行命令报错“Failed to obtain the GPHOME”]({{< relref "./docs/Toolreference/执行命令报错 -Failed -to -obtain -the -GPHOME.md >}}) - - [gs\_collector工具支持收集的系统表和视图列表]({{< relref "./docs/Toolreference/gs_collector工具支持收集的系统表和视图列表.md >}}) - - -- Gitee