openGauss Administration

Stone大约 252 分钟

openGauss Administration

注意:

此文档对应的 openGauss 版本为 6.1。

概述

openGaussopen in new window 是由华为公司推出的企业级开源关系型数据库管理系统,基于 PostgreSQLopen in new window 9.2.4 内核深度优化,并结合华为在数据库领域多年的技术积累和企业级场景需求开发而成。自 2020 年 6 月开源以来,其凭借高性能、高可用、高安全等特性,迅速成为国产数据库领域的核心开源项目之一,并在金融、政府、电信等关键行业实现规模应用。

与 PostgreSQL 相比,openGauss 在多个方面进行了改进和增强,这些变化旨在提高数据库的性能、可靠性和易用性。以下是几个主要的改进点:

  1. 最大可用模式: PostgreSQL 在主从同步模式下存在一个问题,即如果备库宕机,主库会夯住,同步模式不能自动降级。而 openGauss 支持了最大可用模式,在开启该参数后,在主从连接正常的情况下处于同步模式,如果备机断连则立刻切为异步模式,如果备机再次启动会自动连接并切回同步模式。

  2. XID 不可能耗尽: 在 PostgreSQL 中,事务 ID(XID)是一个 32 位整型,长期运行可能导致 XID 耗尽的问题。openGauss 将 XID 由 32 位改为 64 位,因此正常情况下 XID 不可能会耗尽,虽然针对 XID 冻结处理的逻辑仍然存在,但不再需要担心 XID 耗尽的风险。

  3. 流复制环境自动创建物理复制槽: openGauss 中搭建主从流复制环境后会默认自动创建一个 slot_name 为对端 nodename 的物理复制槽,以防止备库需要的 XLOG 被主库删除或清理。

  4. 增量检查点: PostgreSQL 每次执行检查点时会将所有 Buffer 中的脏页刷到磁盘,这可能对性能产生一定影响。openGauss 支持增量检查点的功能,通过小批量分阶段滚筒式进行脏页刷盘,同时更新 LSN 信息,回收不需要的 XLOG 日志。

  5. 双写功能: 为了防止因操作系统数据块大小差异导致的数据库块损坏问题,PostgreSQL 采用了全页写(Full Page Write),但这会导致写放大的问题。openGauss 实现了类似 MySQL 的双写功能,在写块的时候把脏页写到共享表空间中,如果发生问题可以从双写表空间找到完整的数据页进行恢复。

  6. 客户端密码认证增强: PostgreSQL 默认的密码加密算法是 MD5,而 openGauss 增强了密码认证机制,使用 SHA256 加密算法,并且需要配合客户端改造才能兼容。

  7. XLOG 预分配: PostgreSQL 中的 XLOG 日志是在写满后才会分配下一个日志,这样可能会导致并发写测试时性能有抖动。openGauss 实现了 XLOG 的预分配,在 XLOG 未写满时就分配下一个或几个 XLOG,经压测性能较为稳定。

  8. 性能监控模式: openGauss 在每个库下面增加了一个 dbe_perf 性能监控 Schema,类似于 MySQL 的 performance_schema,里面有几百个性能视图,方便查看和管理。

  9. 主备库模式: PostgreSQL 的备库模式是拉模式,即备库主动到主库上拉 WAL 日志;而 openGauss 改成了推模式,主库主动把 WAL 日志推送到备库。这种改变使得主备库之间的数据传输更加高效,但也带来了配置上的不便,例如需要在主库上修改参数 replconninfoN 来添加新的备库。

  10. 线程模式代替进程模式: openGauss 最大的变化之一就是把 PostgreSQL 的进程模式改成了线程模式,从而提升了短连接下的并发处理能力。然而,线程模式也有其缺点,比如内存共享可能导致潜在的数据损坏风险。

  11. 列存表支持: openGauss 不仅支持传统的行存表,还引入了列存表的概念,通过 cstore_buffers 控制列存缓冲区大小,并优化了列存表的并发插入性能,解决了插入时一行数据占一个 CU 造成空间急剧膨胀的问题。

综上所述,openGauss 相对于 PostgreSQL 做了许多重要的改进,特别是在提升系统稳定性和简化运维方面表现突出。

华为有针对 openGauss 的职业认证,可以基于以下认证进行学习:

部署

openGauss 是关系型数据库,采用客户端/服务器,单进程多线程架构,支持单机和一主多备部署方式,备机可读,支持双机高可用和读扩展。

配置

openGauss 支持多种操作系统,这里选择 CentOS 7.9open in new window,虚拟机配置为 2 核 4G,安装好操作系统后进行以下配置。

修改主机名:

[root@localhost ~]# hostnamectl set-hostname opengauss

关闭防火墙:

[root@opengauss ~]# systemctl stop firewalld
[root@opengauss ~]# systemctl disable firewalld

关闭 SELinux:

[root@opengauss ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
[root@opengauss ~]# init 6

关闭 NetworkManager:

[root@opengauss ~]# systemctl stop NetworkManager
[root@opengauss ~]# systemctl disable NetworkManager

配置地址映射:

[root@opengauss ~]# echo "192.168.92.129   opengauss" >> /etc/hosts
[root@opengauss ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.92.129    opengauss
[root@opengauss ~]# ping opengauss

安装依赖包:

[root@opengauss ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@opengauss ~]# yum makecache
[root@opengauss ~]# yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core readline-devel openssl-devel sqlite-devel bash-completion libnsl bzip2 net-tools python3 chrony sysstat pciutils

启动时间同步服务:

[root@opengauss ~]# systemctl start chronyd
[root@opengauss ~]# systemctl enable chronyd
[root@opengauss ~]# chronyc sourcestats

初始化

官方网站open in new window下载对应版本的安装包open in new window,解压:

[root@opengauss ~]# mkdir -p /opt/software/openGauss
[root@opengauss ~]# cd /opt/software/openGauss
[root@opengauss openGauss]# ll
total 149832
-rw-r--r-- 1 root root 153426791 Feb 25 11:27 openGauss-All-6.0.1-CentOS7-x86_64.tar.gz
[root@opengauss openGauss]# tar -xvzf openGauss-All-6.0.1-CentOS7-x86_64.tar.gz 
[root@opengauss openGauss]# tar -jxf openGauss-Server-6.0.1-CentOS7-x86_64.tar.bz2
[root@opengauss openGauss]# tar -xzf openGauss-CM-6.0.1-CentOS7-x86_64.tar.gz
[root@opengauss openGauss]# tar -xzf openGauss-OM-6.0.1-CentOS7-x86_64.tar.gz

创建单节点 XML 配置文件:

[root@opengauss openGauss]# vi /opt/software/openGauss/cluster_config.xml
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <!-- openGauss整体信息 -->
    <CLUSTER>
        <!-- 数据库名称 -->
        <PARAM name="clusterName" value="dbCluster" />
        <!-- 数据库节点名称(hostname) -->
        <PARAM name="nodeNames" value="opengauss" />
        <!-- 数据库安装目录-->
        <PARAM name="gaussdbAppPath" value="/opt/huawei/install/app" />
        <!-- 日志目录-->
        <PARAM name="gaussdbLogPath" value="/var/log/omm" />
        <!-- 临时文件目录-->
        <PARAM name="tmpMppdbPath" value="/opt/huawei/tmp" />
        <!-- 数据库工具目录-->
        <PARAM name="gaussdbToolPath" value="/opt/huawei/install/om" />
        <!-- 数据库core文件目录-->
        <PARAM name="corePath" value="/opt/huawei/corefile" />
        <!-- 节点IP,与数据库节点名称列表一一对应 -->
        <!-- 如果用ipv6 替换ipv4地址即可 如:<PARAM name="backIp1s" value="2407:xxxx:xxxx:xxxx:xxxx:xxxx:caa:2335"/> -->
        <PARAM name="backIp1s" value="192.168.92.129"/> 
    </CLUSTER>
    <!-- 每台服务器上的节点部署信息 -->
    <DEVICELIST>
        <!-- 节点1上的部署信息 -->
        <DEVICE sn="node1_hostname">
            <!-- 节点1的主机名称 -->
            <PARAM name="name" value="opengauss"/>
            <!-- 节点1所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点1的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <!-- 用ipv6安装部署时 换上ipv6地址即可,后面xml文件示例也是同样操作 -->
            <PARAM name="backIp1" value="192.168.92.129"/>
            <PARAM name="sshIp1" value="192.168.92.129"/>
               
            <!--dbnode-->
            <PARAM name="dataNum" value="1"/>
            <PARAM name="dataPortBase" value="15400"/>
            <PARAM name="dataNode1" value="/opt/huawei/install/data/dn"/>
            <PARAM name="dataNode1_syncNum" value="0"/>
        </DEVICE>
    </DEVICELIST>
</ROOT>

执行初始化脚本:

[root@opengauss openGauss]# ./script/gs_preinstall -U omm -G dbgrp -X cluster_config.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 host ip env
Successfully set host ip env.
Are you sure you want to create the user[omm] (yes/no)? yes
Please enter password for cluster user.
Password: Abcd1234
Please enter password for cluster user again.
Password: Abcd1234
Generate cluster user password files successfully.
Successfully created [omm] user on all nodes.
Preparing SSH service.
Successfully prepared SSH service.
Checking OS software.
Successfully check OS software.
Checking OS version.
Successfully checked OS version.
Checking cpu instructions.
Successfully checked cpu instructions.
Creating cluster's path.
Successfully created cluster's path.
Set and check OS parameter.
Setting OS parameters.
Successfully set OS parameters.
Warning: Installation environment contains some warning messages.
Please get more details by "/opt/software/openGauss/script/gs_checkos -i A -h opengauss -X /opt/software/openGauss/cluster_config.xml --detail".
Set and check OS parameter completed.
Preparing CRON service.
Successfully prepared CRON service.
Setting user environmental variables.
Successfully set user environmental variables.
Setting the dynamic link library.
Successfully set the dynamic link library.
Setting Core file
Successfully set core path.
Setting pssh path
Successfully set pssh path.
Setting Cgroup.
Successfully set Cgroup.
Set ARM Optimization.
No need to set ARM Optimization.
Fixing server package owner.
Setting finish flag.
Successfully set finish flag.
Preinstallation succeeded.

根据输出提示,执行以下命令查看系统设置情况:

[root@opengauss ~]# /opt/software/openGauss/script/gs_checkos -i A -h opengauss -X /opt/software/openGauss/cluster_config.xml --detail
Checking items:
    A1. [ OS version status ]                                   : Normal     
        [opengauss]
        centos_7.9.2009_64bit
         
    A2. [ Kernel version status ]                               : Normal     
        The names about all kernel versions are same. The value is "3.10.0-1160.el7.x86_64".
    A3. [ Unicode status ]                                      : Normal     
        The values of all unicode are same. The value is "LANG=en_US.UTF-8".
    A4. [ Time zone status ]                                    : Normal     
        The informations about all timezones are same. The value is "+0800".
    A5. [ Swap memory status ]                                  : Normal     
        The value about swap memory is correct.            
    A6. [ System control parameters status ]                    : Normal     
        All values about system control  parameters are correct.
    A7. [ File system configuration status ]                    : Warning    
        [opengauss]
        Warning reason: variable 'open files' RealValue '1024' ExpectedValue '1000000'
        Warning reason: variable 'max user processes' RealValue '14988' ExpectedValue 'unlimited'

    A8. [ Disk configuration status ]                           : Normal     
        The value about XFS mount parameters is correct.   
    A9. [ Pre-read block size status ]                          : Normal     
        The value about Logical block size is correct.     
    A10.[ IO scheduler status ]                                 : Normal     
        The value of IO scheduler is correct.              
    A11.[ Network card configuration status ]                   : Warning    
        [opengauss]
BondMode Null
        Warning reason: network 'ens33' 'mtu' RealValue '1500' ExpectedValue '8192'

    A12.[ Time consistency status ]                             : Normal     
        The ntpd or chronyd service is started, local time is "2025-02-25 16:24:32".
    A13.[ Firewall service status ]                             : Normal     
        The firewall service is stopped.                   
    A14.[ THP service status ]                                  : Normal     
        The THP service is stopped.                        
Total numbers:14. Abnormal numbers:0. Warning numbers:2.

使用脚本进行修复:

[root@opengauss ~]# /opt/software/openGauss/script/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
    B7. [ Set RemoveIPC value ]                                 : Normal
    B8. [ Set Session Process ]                                 : Normal
NOTICE: MTU value and some warning items can NOT be set. Please do it manually.
Total numbers:8. Abnormal numbers:0. Warning numbers:0.

重新打开一个终端窗口,再次检查:

[root@opengauss ~]# /opt/software/openGauss/script/gs_checkos -i A -h opengauss -X /opt/software/openGauss/cluster_config.xml --detail
Checking items:
    A1. [ OS version status ]                                   : Normal     
        [opengauss]
        centos_7.9.2009_64bit
         
    A2. [ Kernel version status ]                               : Normal     
        The names about all kernel versions are same. The value is "3.10.0-1160.el7.x86_64".
    A3. [ Unicode status ]                                      : Normal     
        The values of all unicode are same. The value is "LANG=en_US.UTF-8".
    A4. [ Time zone status ]                                    : Normal     
        The informations about all timezones are same. The value is "+0800".
    A5. [ Swap memory status ]                                  : Normal     
        The value about swap memory is correct.            
    A6. [ System control parameters status ]                    : Normal     
        All values about system control  parameters are correct.
    A7. [ File system configuration status ]                    : Normal     
        Both soft nofile and hard nofile are correct.      
    A8. [ Disk configuration status ]                           : Normal     
        The value about XFS mount parameters is correct.   
    A9. [ Pre-read block size status ]                          : Normal     
        The value about Logical block size is correct.     
    A10.[ IO scheduler status ]                                 : Normal     
        The value of IO scheduler is correct.              
    A11.[ Network card configuration status ]                   : Warning    
        [opengauss]
BondMode Null
        Warning reason: network 'ens33' 'mtu' RealValue '1500' ExpectedValue '8192'

    A12.[ Time consistency status ]                             : Normal     
        The ntpd or chronyd service is started, local time is "2025-03-20 16:42:59".
    A13.[ Firewall service status ]                             : Normal     
        The firewall service is stopped.                   
    A14.[ THP service status ]                                  : Normal     
        The THP service is stopped.                        
Total numbers:14. Abnormal numbers:0. Warning numbers:1.

其中只有网卡的 MTU 值有告警提示,对于 X86 系统推荐保持默认值 1500,对于 ARM 系统推荐修改为 8192。

[root@opengauss ~]# ifconfig ens33 mtu 8192

安装

切换到 omm 用户进行安装 openGauss:

[root@opengauss ~]# su - omm
[omm@opengauss ~]$ cd /opt/software/openGauss/
[omm@opengauss openGauss]$ ./script/gs_install -X cluster_config.xml 
Parsing the configuration file.
Successfully checked gs_uninstall on every node.
Check preinstall on every node.
Successfully checked preinstall on every node.
Creating the backup directory.
Successfully created the backup directory.
begin deploy..
Installing the cluster.
begin prepare Install Cluster..
Checking the installation environment on all nodes.
begin install Cluster..
Installing applications on all nodes.
Successfully installed APP.
begin init Instance..
encrypt cipher and rand files for database.
Please enter password for database:Abcd1234
Please repeat for database:Abcd1234
begin to create CA cert files
The sslcert will be generated in /opt/huawei/install/app/share/sslcert/om
NO cm_server instance, no need to create CA for CM.
Non-dss_ssl_enable, no need to create CA for DSS
Cluster installation is completed.
Configuring.
Deleting instances from all nodes.
Successfully deleted instances from all nodes.
Checking node configuration on all nodes.
Initializing instances on all nodes.
Updating instance configuration on all nodes.
Check consistence of memCheck and coresCheck on database nodes.
Configuring pg_hba on all nodes.
Configuration is completed.
The cluster status is Normal.
Successfully started cluster.
Successfully installed application.
end deploy..

验证

查看数据库状态:

[root@opengauss ~]# su - omm
[omm@opengauss ~]$ gs_om -t status
-----------------------------------------------------------------------

cluster_name    : dbCluster
cluster_state   : Normal
redistributing  : No

-----------------------------------------------------------------------
[omm@opengauss ~]$ gs_om -t status --detail
[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
current_az      : AZ_ALL

[  Datanode State   ]

    node     node_ip         port      instance                            state
------------------------------------------------------------------------------------------------
1  opengauss 192.168.92.129  15400      6001 /opt/huawei/install/data/dn   P Primary Normal

连接到默认创建的 postgres 数据库:

[omm@opengauss ~]$ gsql -d postgres -p 15400
gsql ((openGauss 6.0.1 build 84c20a90) compiled at 2025-01-17 17:29:32 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# SELECT version();
                                                                        version                                                    
                    
-----------------------------------------------------------------------------------------------------------------------------------
--------------------
 (openGauss 6.0.1 build 84c20a90) compiled at 2025-01-17 17:29:32 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (
GCC) 10.3.0, 64-bit
(1 row)

关闭 openGauss:

[omm@opengauss ~]$ gs_om -t stop

Stopping cluster.
=========================================
Successfully stopped cluster.
=========================================
End stop cluster.

启动 openGauss:

[omm@opengauss ~]$ gs_om -t start

Starting cluster.
=========================================
[SUCCESS] opengauss
2025-02-25 17:02:24.371 67bd8720.1 [unknown] 140620569184704 [unknown] 0 dn_6001 01000  0 [BACKEND] WARNING:  could not create any HA TCP/IP sockets
2025-02-25 17:02:24.371 67bd8720.1 [unknown] 140620569184704 [unknown] 0 dn_6001 01000  0 [BACKEND] WARNING:  could not create any HA TCP/IP sockets
2025-02-25 17:02:24.373 67bd8720.1 [unknown] 140620569184704 [unknown] 0 dn_6001 01000  0 [BACKEND] WARNING:  Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (3542 Mbytes) is larger.
=========================================
Successfully started.

配置

修改参数

安装完成后,需要根据实际环境配置参数。与 PostgreSQL 一样,openGauss 的参数也存放在文件 $PGDATA/postgresql.conf 中。openGauss 提供了 gs_guc 命令来修改参数,无需手动修改参数文件。

修改监听地址参数 listen_addresses,使服务端监听所有 IP :

[omm@opengauss ~]$ gs_guc reload -c "listen_addresses = '*'"
The gs_guc run with the following arguments: [gs_guc -c listen_addresses = '*' reload ].
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc reload: listen_addresses='*': [/opt/huawei/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

修改会话超时参数 session_timeout,测试环境可以设置为 0,表示永不超时:

[omm@opengauss ~]$ gs_guc reload -c "session_timeout = 0"
The gs_guc run with the following arguments: [gs_guc -c session_timeout = 0 reload ].
NOTICE: GaussDB Kernel gsql client has an automatic reconnection mechanism, when the timeout, the gsql will be reconnection after disconnection.
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc reload: session_timeout=0: [/opt/huawei/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

修改参数 enable_default_ustore_tableon,指定用户创建表时默认使用 USTORE 存储引擎,USTORE 存储引擎的核心目标是解决传统 Append Update 引擎(如 ASTORE)因频繁更新导致的存储空间膨胀和 VACUUM 性能瓶颈问题(用户无需手动或自动执行 VACUUM 操作):

[omm@opengauss ~]$ gs_guc reload -c "enable_default_ustore_table = on"
The gs_guc run with the following arguments: [gs_guc -c enable_default_ustore_table = on reload ].
NOTICE: Enable to create ustore table by default
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc reload: enable_default_ustore_table=on: [/opt/huawei/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

修改参数 undo_retention_time 以设置 UNDO 日志保留时间(以秒为单位):

[omm@opengauss ~]$ gs_guc reload -c "undo_retention_time = 86400"
The gs_guc run with the following arguments: [gs_guc -c undo_retention_time = 86400 reload ].
NOTICE: Sets the maximum retention time of undo
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc reload: undo_retention_time=86400: [/opt/huawei/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

修改参数 enable_wdr_snapshot 以开启数据库监控快照功能:

[omm@opengauss ~]$ gs_guc reload -c "enable_wdr_snapshot = on"
The gs_guc run with the following arguments: [gs_guc -c enable_wdr_snapshot = on reload ].
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc reload: enable_wdr_snapshot=on: [/opt/huawei/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

修改参数 password_effect_time0 让用户密码永不过期:

[omm@opengauss ~]$ gs_guc reload -c "password_effect_time = 0"
The gs_guc run with the following arguments: [gs_guc -c password_effect_time = 0 reload ].
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc reload: password_effect_time=0: [/opt/huawei/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

接入认证

安装完成后,默认只能从服务器访问数据库,需要修改认证配置文件。与 PostgreSQLopen in new window 一样,openGauss 也使用认证配置文件 $PGDATA/pg_hba.conf 来进行访问控制,进行客户端认证。openGauss 提供了 gs_guc 命令来设置访问规则,无需手动修改配置文件。

设置允许任意用户(初始化时创建的 omm 用户默认禁止远程连接)从任意地址访问数据库的规则:

[omm@opengauss ~]$ gs_guc reload -h "host all all 0.0.0.0/0 sha256"
The gs_guc run with the following arguments: [gs_guc -h host all all 0.0.0.0/0 sha256 reload ].
expected instance path: [/opt/huawei/install/data/dn/pg_hba.conf]
Notice: the above configuration uses cluster internal communication, your configuration may affect the cluster internal communication.
gs_guc reloadhba: host all all 0.0.0.0/0 sha256: [/opt/huawei/install/data/dn/pg_hba.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

注意:

由于密码加密类型参数 password_encryption_type 默认值为 2,表示默认使用 SHA256 加密,故这里需要指定加密方式为 sha256,如果要使用 MD5 方式,则需要修改该参数为 1 或者 0。

查看认证配置文件 $PGDATA/pg_hba.conf 就可以在 IPV4 本地连接组里面看到新增加的访问规则。

创建用户

安装 openGauss 时创建的 omm 用户只能用于本地访问,要远程访问数据库,需要创建新的用户并授权:

[omm@opengauss ~]$ gsql

openGauss=# CREATE USER stone IDENTIFIED BY 'Abcd1234';
CREATE ROLE

openGauss=# GRANT ALL ON DATABASE postgres TO stone;
GRANT

openGauss=# \q 

修改 gsql 中的提示符,显示当前登录的用户以及连接的数据库:

openGauss=# \set PROMPT1 '%n@%/%R%# '
omm@postgres=# 

要使该设置永久生效,需要将设置命令写入 .gsqlrc 文件,每次启动自动加载:

[omm@opengauss ~]$ echo "\\set PROMPT1 '%n@%/%R%# '" >> ~/.gsqlrc
[omm@opengauss ~]$ echo "\\set PROMPT2 ''" >> ~/.gsqlrc

连接

使用客户端工具 DBeaver 连接 openGauss,由于 DBeaver 默认没有 openGauss 的驱动,故需要现在官方网站下载对应版本的驱动open in new window

然后在驱动管理器点击 “新建”:

image-20250226135619495

在 “库” 标签页,点击 “添加文件”,添加下载的驱动文件 postgresql.jar,点击 “找到类”,会在驱动类中出现 org.postgresql.Driver:

image-20250226152019172

然后在 ”设置“ 标签页,进行如下设置:

  • 驱动名称:openGauss
  • 类名:org.postgresql.Driver
  • URL 模板:jdbc:postgresql://{host}:{port}/{database}
  • 默认端口:15400
  • Default Database:postgres
  • Default User:stone

image-20250226152323419

然后点击 ”确定“。现在就可以在创建新连接页面找到 openGauss 连接类型,点击 ”下一步“:

image-20250226152734412

在连接设置页面输入主机地址和密码:

image-20250226152828319

点击 ”测试链接“,如下表示连接成功。

image-20250226153034305

工具

客户端工具有:

服务器端工具有:

  • gs_check:帮助用户在 openGauss 运行过程中,全量的检查 openGauss 运行环境、操作系统环境、网络环境及数据库执行环境,也有助于在 openGauss 重大操作之前对各类环境进行全面检查,有效保证操作执行成功。
  • gs_checkos:用来帮助检查操作系统、控制参数、磁盘配置等内容,并对系统控制参数、I/O 配置、网络配置和 THP 服务等信息进行配置。
  • gs_checkperf:帮助对 openGauss 级别(主机 CPU 占用率、Gauss CPU 占用率、I/O 使用情况等)、节点级别(CPU 使用情况、内存使用情况、I/O 使用情况)、会话/进程级别(CPU 使用情况、内存使用情况、I/O 使用情况)、SSD 性能(写入、读取性能)进行定期检查,让用户了解 openGauss 的负载情况,采取对应的改进措施。其中检查 SSD 性能要用 root 用户执行,检查 openGauss 性能要用 openGauss 安装用户执行。
  • gs_collector:当 openGauss 发生故障时,使用此工具收集 OS 信息、日志信息以及配置文件等信息,来定位问题。
  • gs_dump:是 openGauss 用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等),回收站对象除外。
  • gs_dumpall:是 openGauss 用于导出所有数据库相关信息工具,它可以导出 openGauss 数据库的所有数据,包括默认数据库 postgres 的数据、自定义数据库的数据以及 openGauss 所有数据库公共的全局对象。
  • gs_guc:用于设置 openGauss 配置文件(postgresql.confpg_hba.conf)中的参数。
  • gs_om:用于对 openGauss 进行维护,包括启动 openGauss、停止 openGauss、查询 openGauss 状态、查询静态配置、生成静态配置文件、查询 openGauss 状态详细信息、生成动态配置文件、SSL 证书替换、显示帮助信息和显示版本号信息等功能。
  • gs_restore:是 openGauss 提供的针对 gs_dump 导出数据的导入工具。通过此工具可将由 gs_dump 生成的导出文件进行导入。
  • gs_ssh:帮助用户在 openGauss 各节点上执行相同的命令。

系统内部命令有:

  • gs_preinstall:帮助完成 openGauss 的环境配置,以保证 openGauss 安装的正常进行。

  • gs_install:帮助完成 openGauss 的安装和部署。

  • gs_uninstall:卸载 openGauss。

  • gs_postuninstall:帮助清理准备 openGauss 环境阶段所做配置,使得卸载后的环境得到清理。

架构

openGauss 的架构与 PostgreSQLopen in new window 有所不同,可分为:

  • 实例(Instance):
    • 内存结构
    • 单进程多线程架构
  • 数据库(Database):存储结构

整体架构图如下:

image-20250227162407578

内存结构

内存包括:

  • 共享内存(Shared Memory):由实例所有进程使用。
  • 本地内存(Local Memory):每个后端进程分配给自己使用。

image-20250227162549395

共享内存

共享内存(Shared Memory)包括:

  • 行存共享缓冲区(Share Buffer)
  • 列存共享缓冲区(Cstore Buffer)
  • 日志缓冲区(WAL Buffers)
  • 内存优化表(MOT)
行存共享缓冲区

行存共享缓冲区(Share Buffer)类似于 Oracle 的数据库缓冲区缓存open in new window(Database Buffer Cache)和共享池open in new window(Shared Pool),用于存放从数据文件中读取的数据块,到内存页中。

使用参数 shared_buffers 指定行存共享缓冲区大小。建议设置为内存的 25%,不超过内存的 40%。如果设置了较大的 shared_buffers,则需要相应增大 max_wal_size

omm@postgres=# show shared_buffers;
 shared_buffers 
----------------
 716MB
(1 row)
列存共享缓冲区

列存所使用的共享缓冲区(Cstore Buffer)。在列存表为主的场景中,几乎不用 share buffer。在此场景中,应减少 shared_buffers,增加 cstore_buffers

omm@postgres=# show cstore_buffers;
 cstore_buffers 
----------------
 1GB
(1 row)
日志缓冲区

日志缓冲区(WAL Buffers)类似于 Oracle 的重做日志缓冲区open in new window(Redo Log Buffer),用于存放数据库修改信息。是一个环形区域,循环写入。

使用参数 wal_buffers 指定日志缓冲区大小,默认为 -1 表示自动设置为 shared_buffers 的 1/32,通常为 16 MB。如果自动设置的值太大或者太小,建议根据实际业务情况进行调整。

omm@postgres=# show wal_buffers;
 wal_buffers 
-------------
 16MB
(1 row)
内存优化表

内存优化表(Memory-Optimized Table),所有数据和索引都在内存中。MOT 在高性能(查询和事务延迟)、高可扩展性(吞吐量和并发量)甚至在某些情况下成本(高资源利用率)这些方面拥有显著优势。需要在 $PGDATA/mot.conf 文件中配置相关参数。

本地内存

本地内存(Local Memory)包括:

  • 工作区(Work Memory)
  • 维护工作区(Maintenance Work Memory)
  • 临时缓冲区(Temporary Buffers)

image-20250227163556237

工作区

工作区(Work Memory)用于单个会话的 ORDER BYDISTINCTMERGE JOINHASH JOIN 等操作。

使用参数 work_mem 指定单个会话的工作区大小,默认为 64 MB,当内存使用量超过这个值时,会写入到磁盘临时文件。对于需要大量排序或哈希操作的查询,建议增大该参数。

omm@postgres=# show work_mem;
 work_mem 
----------
 64MB
(1 row)
维护工作区

维护工作区(Maintenance Work Memory)用于维护操作(如 VACUUMCREATE INDEXALTER TABLE ADD FOREIGN KEY)。

使用参数 maintenance_work_mem 指定单个会话的维护工作区大小,默认为 128 MB。较大的值可以提高 VACUUM 和还原数据的性能。

omm@postgres=# show maintenance_work_mem;
 maintenance_work_mem 
----------------------
 128MB
(1 row)
临时缓冲区

临时缓冲区(Temporary Buffers)仅用于访问临时表。

使用参数 temp_buffers 指定单个会话的临时缓冲区大小,默认为 1 MB。当需要访问较大的临时表时,合理地设置 temp_buffers 可以显著提升性能。

omm@postgres=# show temp_buffers;
 temp_buffers 
--------------
 1MB
(1 row)

线程结构

启动 openGauss 会启动 gaussdb 进程:

[omm@opengauss ~]$ ps -ef | grep gaussdb
omm        2304      1 42 09:46 ?        00:00:16 /opt/huawei/install/app/bin/gaussdb -D /opt/huawei/install/data/dn

gaussdb 进程包括以下线程:

  • gaussdb:openGauss 的管理线程,用于数据库启停、消息转发等管理工作。
  • pagewriter:负责将脏页数据拷贝至双写(Double-Writer)区域并落盘。
  • walwriter:负责将内存中的预写日志(WAL)页数据刷新到预写日志文件中,确保已提交的事务都被永久记录,不会丢失。
  • checkpointer:周期性触发,每次触发会将全部脏页面刷到磁盘中。
  • jemalloc_bg_thd:管理并实现内存的动态分配。
  • StatCollector:负责统计 openGauss 数据库的信息,包括:物理硬件资源使用信息、对象属性及使用信息、SQL 运行信息、会话信息、锁信息、线程信息等,并且将这些收集到的统计信息保存在 pg_stat.stat 文件中。
  • Auditor:审计线程。使用重定向的方式从管理线程、后台线程以及其他子线程获取审计数据,并保存在审计文件中。
  • LWLockMonitor:轻量锁监控线程。负责检测轻量级锁(LWLock)产生的死锁,轻量级锁主要提供对共享内存的互斥访问控制,比如 Clog Buffer(事务提交状态缓存)、Shared Buffers(数据页缓存)、Substran Buffer(子事务缓存)等。
  • sysLogger:系统日志线程。使用重定向的方式捕获管理线程、后台线程以及其他子线程的 stderr 输出,并写入日志文件中。
  • Jobworker:JOB 线程分为调度线程和工作线程。调度线程(JobScheduler)会根据 pg_job 表里面定义的 JOB 周期,对已经过期的 JOB 进行调用,由工作线程(Jobworker)执行实际的 JOB 任务。
  • snapshotworker:收集 Snapshot 信息,openGauss 数据库的 WDR 报告依赖于 Snapshot。
  • WalSender:运行在 openGauss 主备环境中主节点,发送预写日志给备节点。
  • WalReceiver:运行在 openGauss 主备环境中备节点,接收预写日志记录。
  • ashworker:统计历史活动会话相关信息。
  • AlarmChecker:告警检测线程。openGauss 的告警检测线程。
  • PercentileJob:百分比统计线程。根据 percentile 参数设置的值计算 SQL 响应时间的百分比信息,目前 percentile 参数仅支持 80 和 95。
  • pagewriter: 负责将脏页数据拷贝至双写(double-writer)区域并落盘,然后将脏页转发给bgwriter子线程进行数据下盘操作,如果发生数据页“折断”的问题,就会从双写空间里找到完整的数据页进行恢复。

查看 gaussdb 进程的所有线程:

[root@opengauss ~]# ps -T -p `pgrep gaussdb`
   PID   SPID TTY          TIME CMD
  2304   2304 ?        00:00:05 gaussdb
  2304   2305 ?        00:00:00 jemalloc_bg_thd
  2304   2314 ?        00:00:00 gaussdb
  2304   2315 ?        00:00:00 syslogger
  2304   2316 ?        00:00:00 auditor
  2304   2317 ?        00:00:00 jemalloc_bg_thd
  2304   2318 ?        00:00:00 alarm
  2304   2319 ?        00:00:00 jemalloc_bg_thd
  2304   2320 ?        00:00:00 reaper
  2304   2321 ?        00:00:00 jemalloc_bg_thd
  2304   2345 ?        00:00:00 gaussdb
  2304   2346 ?        00:00:00 gaussdb
  2304   2347 ?        00:00:00 gaussdb
  2304   2349 ?        00:00:00 checkpointer
  2304   2350 ?        00:00:00 Spbgwriter
  2304   2351 ?        00:00:01 pagewriter
  2304   2352 ?        00:00:00 pagewriter
  2304   2353 ?        00:00:00 pagewriter
  2304   2354 ?        00:00:00 pagewriter
  2304   2355 ?        00:00:00 pagewriter
  2304   2356 ?        00:00:00 WALwriter
  2304   2357 ?        00:00:00 WALwriteraux
  2304   2358 ?        00:00:00 AVClauncher
  2304   2359 ?        00:00:00 Jobscheduler
  2304   2360 ?        00:00:00 asyncundolaunch
  2304   2361 ?        00:00:00 globalstats
  2304   2362 ?        00:00:00 applylauncher
  2304   2363 ?        00:00:00 statscollector
  2304   2364 ?        00:00:00 CfsShrinker
  2304   2365 ?        00:00:01 percentworker
  2304   2366 ?        00:00:12 ashworker
  2304   2367 ?        00:00:02 TrackStmtWorker
  2304   2368 ?        00:00:00 2pccleaner
  2304   2369 ?        00:00:00 faultmonitor
  2304   2371 ?        00:00:00 undorecycler

存储结构

openGauss 的数据库节点负责存储数据,其存储介质也是磁盘。在安装 openGauss 时,在磁盘上初始化的数据库存储区域,称之为数据库集群(Database Cluster 或者 Catalog Cluster),是在一个数据库服务器上由单个实例管理的多个数据库(Database)集合。初始化时会默认创建 template1template0 这两个模板数据库以及 postgres 这个可供应用程序使用的数据库。postgres 默认有一个名称为 public模式(Schema),可以在模式下创建(Table),索引(Index)等数据库对象。同时为了更好的管理各个数据库中的对象,通过使用表空间(Tablespace)在文件系统中指定数据库对象对应文件的存储目录,初始化时会创建 template1template0 数据库的默认表空间 pg_default 以及用于共享系统目录(Shared System Catalogs)的 pg_global 表空间,分别对应 $PGDATA/base 目录和 $PGDATA/global 目录。

数据库集群包括:

  • Tablespace:表空间,是一个目录,可以存在多个,里面存储的是它所包含的数据库的各种物理文件。每个表空间可以对应多个 Database
  • Database:数据库,用于管理各类数据对象,各数据库间相互隔离。数据库管理的对象可分布在多个 Tablespace 上。
  • Datafile Segment:数据文件段,通常每张表只对应一个数据文件。如果某张表的数据大于 1GB,则会分为多个数据文件存储。
  • Table:表,每张表只能属于一个数据库,也只能对应到一个 Tablespace。每张表对应的数据文件必须在同一个 Tablespace 中。
  • Block:数据块,是数据库管理的基本单位,默认大小为 8KB。

默认情况下,openGauss 的所有文件都存放在 $PGDATA 目录下:

[omm@opengauss ~]$ ll $PGDATA
total 4988
drwx------ 6 omm dbgrp      58 Feb 25 16:41 base
-rw------- 1 omm dbgrp    4399 Feb 25 16:40 cacert.pem
-rw------- 1 omm dbgrp      72 Feb 28 09:46 gaussdb.state
drwx------ 3 omm dbgrp    4096 Feb 28 09:46 global
-rw------- 1 omm dbgrp     354 Feb 25 16:40 gs_gazelle.conf
-rw------- 1 omm dbgrp 4915200 Feb 25 16:41 gswlm_userinfo.cfg
-rw------- 1 omm dbgrp   21016 Feb 25 16:40 mot.conf
drwx------ 2 omm dbgrp      26 Feb 25 16:40 pg_clog
drwx------ 2 omm dbgrp      26 Feb 25 16:40 pg_csnlog
-rw------- 1 omm dbgrp       0 Feb 28 09:46 pg_ctl.lock
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_errorinfo
-rw------- 1 omm dbgrp    4615 Feb 26 13:20 pg_hba.conf
-rw------- 1 omm dbgrp    4615 Feb 26 13:20 pg_hba.conf.bak
-rw------- 1 omm dbgrp    1024 Feb 25 16:41 pg_hba.conf.lock
-rw------- 1 omm dbgrp    1636 Feb 25 16:40 pg_ident.conf
drwx------ 4 omm dbgrp      39 Feb 25 16:40 pg_llog
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_location
drwx------ 2 omm dbgrp      35 Feb 28 10:44 pg_logical
drwx------ 4 omm dbgrp      36 Feb 25 16:40 pg_multixact
drwx------ 2 omm dbgrp      26 Feb 28 09:46 pg_notify
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_replslot
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_serial
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_snapshots
drwx------ 2 omm dbgrp      25 Feb 28 10:44 pg_stat_tmp
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_tblspc
drwx------ 2 omm dbgrp       6 Feb 25 16:40 pg_twophase
-rw------- 1 omm dbgrp       4 Feb 25 16:40 PG_VERSION
drwx------ 3 omm dbgrp      92 Feb 25 16:41 pg_xlog
-rw------- 1 omm dbgrp   38409 Feb 26 11:51 postgresql.conf
-rw------- 1 omm dbgrp   38409 Feb 26 11:51 postgresql.conf.guc.bak
-rw------- 1 omm dbgrp    1024 Feb 25 16:40 postgresql.conf.lock
-rw------- 1 omm dbgrp      71 Feb 28 09:46 postmaster.opts
-rw------- 1 omm dbgrp      88 Feb 28 09:46 postmaster.pid
-rw------- 1 omm dbgrp       0 Feb 25 16:40 postmaster.pid.lock
-rw------- 1 omm dbgrp    4402 Feb 25 16:40 server.crt
-rw------- 1 omm dbgrp    1766 Feb 25 16:40 server.key
-rw------- 1 omm dbgrp      56 Feb 25 16:40 server.key.cipher
-rw------- 1 omm dbgrp      24 Feb 25 16:40 server.key.rand
drwx------ 5 omm dbgrp      67 Feb 25 16:41 undo

在该目录下包含多个子目录和配置文件,主要有:

目录名称描述
baseopenGauss 数据库对象默认存储在该目录,如默认的数据库 postgres、用户创建的数据库及关联的表等对象。
global存储 openGauss 共享的系统表或者说是共享的数据字典表。
pg_tblspc即是 openGauss 的表空间目录,里面存储 openGauss 定义的表空间的目录软链接,这些软链接指向 openGauss 数据库表空间文件的实际存储目录。
pg_xlog存储 openGauss 数据库的 WAL 日志文件。
pg_clog存储 openGauss 数据库事务提交状态信息。
pg_csnlog存储 openGauss 数据库的快照信息,openGauss 事务启动时会创建一个 CSN 快照,在 MVCC 机制下,CSN 作为 openGauss 的逻辑时间戳,模拟数据库内部的时序,用来判断其他事务对于当前事务是否可见。
pg_twophase存储两阶段事务提交信息,用来确保数据一致性。
pg_serial存储已提交的可序列化事务信息。
pg_multixact存储多事务状态信息,一般用于共享行级锁(shared row locks)。
postgresql.confopenGauss 的配置文件,在 gaussdb 线程启动时会读取该文件,获取监听地址、服务端口、内存分配、功能设置等配置信息,并且根据该文件,在 openGauss 启动时创建共享内存和信号量池等。
pg_hba.conf基于主机的接入认证配置文件,主要保存鉴权信息(如:允许访问的数据库、用户、IP段、加密方式等)。
pg_ident.conf客户端认证的配置文件,主要保存用户映射信息,将主机操作系统的用户与 openGauss 数据库用户做映射。
gaussdb.state主要保存数据库当前的状态信息(如:主备 HA 的角色、Rebuild 进度及原因、Sync 状态、LSN 信息等)。
Archived WALopenGauss 数据库 WAL 日志的归档目录,保存 openGauss 的历史 WAL 日志。
pg_audit存储 openGauss 数据库的审计日志文件。
pg_replslot存储 openGauss 数据库的复制事务槽数据。
pg_llog保存逻辑复制时的状态数据。

数据库

类似于 Oracle 的 CDB/PDB,一个 openGauss 数据库集群包含多个数据库。各个数据库在逻辑和物理上都是独立的,一个数据库对应文件系统上的一个目录。相关数据库对象存储在各个数据库的不同模式中。但是有一些集群级别的对象,例如角色,数据库和表空间名称存储在 pg_global 表空间。

客户端访问 openGauss 时,必须在连接请求中指定数据库名称,且一个连接只能访问一个数据库。因为只能连接到数据库后才能进行创建数据库等操作(先有鸡还是先有蛋问题),故在安装时会默认创建 postgres 这个可供客户端连接的数据库。

直接使用 gsql 命令时默认连接到 postgres 数据库,也可以在连接时使用 -d 选项指定要连接的数据库。

[omm@opengauss ~]$ gsql 
gsql ((openGauss 6.0.1 build 84c20a90) compiled at 2025-01-17 17:29:32 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

omm@postgres=# \conninfo
You are connected to database "postgres" as user "omm" via socket in "/opt/huawei/tmp" at port "15400".

[omm@opengauss ~]$ gsql -d postgres
gsql ((openGauss 6.0.1 build 84c20a90) compiled at 2025-01-17 17:29:32 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

omm@postgres=# 

除了 postgres 数据库外,在数据库集群初始化期间还会创建 template1template0 这两个模板数据库。创建新的数据库时会默认基于 template0 进行克隆。请避免使用客户端或其他手段连接及操作两个模板数据库。

gsql 中使用 \l 命令查看集群中的数据库:

omm@postgres=# \l+
                                                           List of databases
   Name    | Owner | Encoding  | Collate | Ctype | Access privileges | Size  | Tablespace |                Description                 
-----------+-------+-----------+---------+-------+-------------------+-------+------------+--------------------------------------------
 postgres  | omm   | SQL_ASCII | C       | C     | =Tc/omm          +| 13 MB | pg_default | default administrative connection database
           |       |           |         |       | omm=CTc/omm      +|       |            | 
           |       |           |         |       | stone=CTc/omm    +|       |            | 
           |       |           |         |       | stone=APm/omm     |       |            | 
 template0 | omm   | SQL_ASCII | C       | C     | =c/omm           +| 13 MB | pg_default | default template for new databases
           |       |           |         |       | omm=CTc/omm       |       |            | 
 template1 | omm   | SQL_ASCII | C       | C     | =c/omm           +| 13 MB | pg_default | unmodifiable empty database
           |       |           |         |       | omm=CTc/omm       |       |            | 
(3 rows)

还可以查询 pg_database 表查看集群中的数据库:

omm@postgres=# select oid,datname,datistemplate,datallowconn from pg_database;
  oid  |  datname  | datistemplate | datallowconn 
-------+-----------+---------------+--------------
     1 | template1 | t             | t
 15741 | postgres  | f             | t
 15736 | template0 | t             | f
(3 rows)

其中:

  • oid:对象标识符,对应文件系统的目录。
  • datistemplate:是否为模板数据库,如果为 t,则任何具有 CREATEDB 权限的用户都可以克隆此数据库,否则只有超级用户和数据库所有者才能克隆。
  • datallowconn:是否允许连接,如果为 f,则不允许与该数据库建立连接。

建议:

  • 在实际业务中,根据需要创建新的数据库,不建议直接使用数据库实例默认的 postgres 数据库。

  • 一个数据库实例内,用户自定义的数据库数量建议不超过 3 个。

  • 为了适应全球化的需求,使数据库编码能够存储与表示绝大多数的字符,建议创建数据库的时候使用 UTF8 编码。

创建数据库

使用 CREATE DATABASE 创建数据库。

  • 保证数据对象的名称不超过限定长度。
  • 指定数据库的默认存储编码集为 UTF8 编码集。
  • 不要使用多字节字符做为对象名。
  • 创建的数据库总数目不得超过 128 个。
  • 如果出现因为误操作导致在多字节字符的中间截断而无法删除数据库对象的现象,请使用截断前的数据库对象名进行删除操作,或将该对象从各个数据库节点的相应系统表中依次删掉。
  • 创建数据库时,需要重点关注字符集编码(ENCODING)和兼容性(DBCOMPATIBILITY)两个配置项。

语法:

CREATE DATABASE [ IF NOT EXISTS ] 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 ]}[...] ];

其中:

  • OWNER [ = ] user_name:数据库所有者。缺省为当前用户。数据库的所有者默认拥有该数据库下所有对象的所有权限,包括删除权限。
  • TEMPLATE [=] template:默认且只能为 template0
  • ENCODING [ = ] encoding:字符编码,不指定则默认使用模板数据库的编码,建议指定为 UTF8。
  • DBCOMPATIBILITY [ = ] compatibility_type:指定兼容的数据库的类型,默认兼容 O。取值范围:A、B、C、PG。分别表示兼容 O、MY、TD 和 POSTGRES。
  • TABLESPACE [ = ] tablespace_name:指定数据库对应的表空间,不指定默认位于 pg_default 表空间。
  • CONNECTION LIMIT [ = ] connlimit:数据库可以接受的并发连接数。系统管理员不受此参数的限制。

例子:创建数据库

omm@postgres=# CREATE DATABASE testdb WITH ENCODING 'UTF8';
CREATE DATABASE

omm@postgres=# \l
                          List of databases
   Name    | Owner | Encoding  | Collate | Ctype | Access privileges 
-----------+-------+-----------+---------+-------+-------------------
 postgres  | omm   | SQL_ASCII | C       | C     | =Tc/omm          +
           |       |           |         |       | omm=CTc/omm      +
           |       |           |         |       | stone=CTc/omm    +
           |       |           |         |       | stone=APm/omm
 template0 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 template1 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 testdb    | omm   | UTF8      | C       | C     | 
(4 rows)

omm@postgres=# select oid,datname,datistemplate,datallowconn from pg_database;
  oid  |  datname  | datistemplate | datallowconn 
-------+-----------+---------------+--------------
     1 | template1 | t             | t
 15741 | postgres  | f             | t
 16388 | testdb    | f             | t
 15736 | template0 | t             | f
(4 rows)

默认会在 $PGDATA/base 目录下面创建 16388 文件夹:

[omm@opengauss ~]$ ll $PGDATA/base
total 84
drwx------ 2 omm dbgrp 20480 Feb 25 16:41 1
drwx------ 2 omm dbgrp 12288 Feb 25 16:41 15736
drwx------ 2 omm dbgrp 12288 Feb 25 16:41 15741
drwx------ 2 omm dbgrp 12288 Feb 28 11:29 16388
drwx------ 2 omm dbgrp     6 Feb 25 16:41 pgsql_tmp

openGauss 仅允许使用预定义的模板数据库 template0 创建新库,而禁止直接使用用户自定义数据库(如 testdb)作为模板。这与 PostgreSQL 允许使用 template1 或其他自定义模板的行为不同,属于 openGauss 的安全设计特性。

omm@postgres=# CREATE DATABASE newtestdb TEMPLATE testdb;
ERROR:  testdb is not supported for using here, just support template0

修改数据库

使用 ALTER DATABASE 修改数据库。

语法:

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;

其中:

  • 第一个命令修改数据库的设置。
  • 第二个命令修改数据库的名称。
  • 第三个命令修改数据库的所有者。
  • 第四个命令修改数据库的默认表空间。
  • 其余命令修改数据库的参数。

例子:修改数据库名称

omm@postgres=# CREATE DATABASE newtestdb;
CREATE DATABASE

omm@postgres=# ALTER DATABASE newtestdb RENAME TO newdb;
ALTER DATABASE

omm@postgres=# \l
                          List of databases
   Name    | Owner | Encoding  | Collate | Ctype | Access privileges 
-----------+-------+-----------+---------+-------+-------------------
 newdb     | omm   | SQL_ASCII | C       | C     | 
 postgres  | omm   | SQL_ASCII | C       | C     | =Tc/omm          +
           |       |           |         |       | omm=CTc/omm      +
           |       |           |         |       | stone=CTc/omm    +
           |       |           |         |       | stone=APm/omm
 template0 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 template1 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 testdb    | omm   | UTF8      | C       | C     | 
(5 rows)

使用 ALTER DATABASE 可以修改针对数据库的参数,对后续连接的会话生效,只有超级用户或者数据库所有者才能修改。

例子:关闭数据库 newdb 中的索引扫描

omm@postgres=# ALTER DATABASE newdb SET enable_indexscan TO off;
ALTER DATABASE

omm@postgres=# \c newdb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "newdb" as user "omm".

omm@newdb=# show enable_indexscan;
 enable_indexscan 
------------------
 off
(1 row)

例子:将修改的配置还原为默认值

omm@newdb=# ALTER DATABASE newdb RESET enable_indexscan;
ALTER DATABASE

omm@newdb=# \c
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "newdb" as user "omm".

omm@newdb=# show enable_indexscan;
 enable_indexscan 
------------------
 on
(1 row)

删除数据库

使用 DROP DATABASE 删除数据库。

语法:

DROP DATABASE [ IF EXISTS ] database_name;
  • 只有超级用户或者数据库所有者才能删除数据库。
  • 删除数据库将删除数据库中包含的所有对象以及文件系统中的数据目录。
  • 当连接到要删除的数据库时,无法执行删除操作。需要连接到 postgres 或者其他数据库执行删除。
  • 如果数据库上存在用户连接,则无法执行删除操作,可以使用 FORCE 选项尝试终止与数据库的连接,但不能终止与复制和订阅相关连接。
  • 数据库的删除无法撤消。

例子:删除数据库

omm@postgres=# DROP DATABASE newdb;
DROP DATABASE

omm@postgres=# \l
                          List of databases
   Name    | Owner | Encoding  | Collate | Ctype | Access privileges 
-----------+-------+-----------+---------+-------+-------------------
 postgres  | omm   | SQL_ASCII | C       | C     | =Tc/omm          +
           |       |           |         |       | omm=CTc/omm      +
           |       |           |         |       | stone=CTc/omm    +
           |       |           |         |       | stone=APm/omm
 template0 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 template1 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 testdb    | omm   | UTF8      | C       | C     | 
(4 rows)

模式

模式又称作 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_temppg_catalog 始终会作为搜索路径顺序中的前两位,无论二者是否出现在 search_path 中,或者出现在 search_path 中的任何位置。search_path(搜索路径)是一个 SCHEMA 名列表,在其中找到的第一个表就是目标表,如果没有找到则报错。(某个表即使存在,如果它的 SCHEMA 不在 search_path 中,依然会查找失败)在搜索路径中的第一个 SCHEMA 叫做 “当前 SCHEMA”。它是搜索时查询的第一个 SCHEMA,同时在没有声明 SCHEMA 名时,新创建的数据库对象会默认存放在该 SCHEMA 下。
  • 每个数据库都包含一个 pg_catalog SCHEMA,它包含系统表和所有内置数据类型、函数、操作符。pg_catalog 是搜索路径中的一部分,始终在临时表所属的模式后面,并在 search_path 中所有模式的前面,即具有第二搜索优先级。这样确保可以搜索到数据库内置对象。如果用户需要使用和系统内置对象重名的自定义对象时,可以在操作自定义对象时带上自己的模式。

gsql 中使用 \dn 命令查看当前数据库的所有模式:

omm@postgres=# \dn
     List of schemas
      Name       | Owner 
-----------------+-------
 blockchain      | omm
 coverage        | omm
 cstore          | omm
 db4ai           | omm
 dbe_perf        | omm
 dbe_pldebugger  | omm
 dbe_pldeveloper | omm
 dbe_sql_util    | omm
 pkg_service     | omm
 public          | omm
 snapshot        | omm
 sqladvisor      | omm
 stone           | stone
(13 rows)

注意:

  • 如果该用户不具有 SYSADMIN 权限或者不是该 SCHEMA 的所有者,要访问该 SCHEMA 下的对象,需要同时给用户赋予该 SCHEMA 的 USAGE 权限和对象的相应权限。
  • 如果要在 SCHEMA 下创建对象,需要授予操作用户该 SCHEMA 的 CREATE 权限。
  • SCHEMA 的所有者默认拥有该 SCHEMA 下对象的所有权限,包括删除权限。

创建模式

与 PostgreSQL 需要单独创建模式不同,openGauss 与 Oracle 类似,会在创建用户时创建一个与之同名的模式。故如果只需要一个与用户同名的模式,则不需要额外创建。

使用 CREATE SCHEMA 创建单独的模式。

  • 只要用户对当前数据库有 CREATE 权限,就可以创建模式。
  • 系统管理员在普通用户同名 SCHEMA 下创建的对象,所有者为 SCHEMA 的同名用户(非系统管理员)。

语法:

CREATE SCHEMA [ IF NOT EXISTS ] schema_name
    [ AUTHORIZATION user_name ] [WITH BLOCKCHAIN] [ schema_element [ ... ] ];
CREATE SCHEMA schema_name
    [ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ];
NOTICE: '[ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ]' is only available in CENTRALIZED mode and B-format database!

注意:

模式名称不能以 pg_ 开头。

例子:创建一个名称为 test 的用户,会自动创建名称为 test 的模式

omm@postgres=# CREATE USER test IDENTIFIED BY 'Abcd1234';
CREATE ROLE

omm@postgres=# \dn test
List of schemas
 Name | Owner 
------+-------
 test | test
(1 row)

例子:创建单独的模式并指定其所有者

omm@postgres=# CREATE SCHEMA hr AUTHORIZATION stone;
CREATE SCHEMA

omm@postgres=# \dn hr
List of schemas
 Name | Owner 
------+-------
 hr   | stone
(1 row)

修改模式

使用 ALTER SCHEMA 修改模式。

语法:

ALTER SCHEMA schema_name
    RENAME TO new_name;
ALTER SCHEMA schema_name
    OWNER TO new_owner;
ALTER SCHEMA schema_name {WITH | WITHOUT} BLOCKCHAIN;
ALTER SCHEMA schema_name
    [ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ];
NOTICE: '[ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ]' is only available in CENTRALIZED mode and B-format database!

例子:修改模式的所有者

omm@postgres=# ALTER SCHEMA hr OWNER TO test;
ALTER SCHEMA

omm@postgres=# \dn hr
List of schemas
 Name | Owner 
------+-------
 hr   | test
(1 row)

删除模式

使用 DROP SCHEMA 修改模式。

语法:

DROP SCHEMA [ IF EXISTS ] schema_name [, ...] [ CASCADE | RESTRICT ];

其中:

  • RESTRICT:默认选项,拒绝删除包含对象的模式。适用于不包含对象的模式。
  • CASCADE:级联删除模式,模式包含的对象以及依赖这些对象的所有对象。

只有超级用户或者模式所有者才能删除模式。

例子:级联删除模式

omm@postgres=# DROP SCHEMA hr CASCADE;
DROP SCHEMA

omm@postgres=# \dn hr
List of schemas
 Name | Owner 
------+-------
(0 rows)

搜索路径

在 Oracle 中,当使用某个用户连接到数据库时,直接访问某个对象,那么肯定就是访问该用户对应模式下的对象,如果要访问指定模式下的对象,则需要在对象名称前面增加模式名称前缀。而在 openGauss 中,通过使用搜索路径,可以避免在对象名称前面增加模式名称前缀,从而简化访问指定模式下的对象。

一般使用指定用户登录后,默认就处于与该用户同名的模式下。omm 用户由于没有对应的 omm 模式,故登录后默认处于 public 模式下。

使用 stone 用户登录,查看当前搜索路径及当前所处的模式:

[omm@opengauss ~]$ gsql -U stone -W Abcd1234
gsql ((openGauss 6.0.1 build 84c20a90) compiled at 2025-01-17 17:29:32 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

stone@postgres=> SHOW search_path;
  search_path   
----------------
 "$user",public
(1 row)

stone@postgres=> SELECT current_schema();
 current_schema 
----------------
 stone
(1 row)

搜索路径默认包含 2 个模式,以逗号分隔,其中:

  • "$user":表示与当前用户同名的模式。
  • public:表示 public 模式。

当查找对象时,openGauss 会依次在这些模式中进行查找,返回第一个匹配的对象;当创建对象时,如果没有指定模式名称,会在第一个存在的模式中创建。

可以根据实际使用情况来调整 search_path,但最佳实践是使用默认的与用户同名的模式,这样对象就会被创建在对应的模式中,而不会都创建在 public 模式中。

除了 public 和用户创建的模式之外,每个数据库还有很多其他模式,用于 openGauss 的其他功能。

表空间

在 openGauss 中,使用表空间为数据库对象(数据库,表以及索引)指定文件系统上的存储目录,在该目录下存放数据库对象对应的数据文件。也就是说表空间是与文件系统上的目录一一对应,以提供更灵活和可扩展的数据存储管理。

  • 表空间允许管理员根据数据库对象的使用模式安排数据位置,从而提高性能。一个频繁使用的索引可以放在性能稳定且运算速度较快的磁盘上,比如一种固态设备。一个存储归档的数据,很少使用的或者对性能要求不高的表可以存储在一个运算速度较慢的磁盘上。
  • 管理员通过表空间可以设置占用的磁盘空间。用以在和其他数据共用分区的时候,防止表空间占用相同分区上的其他空间。
  • 表空间可以控制数据库占用的磁盘空间,当表空间所在磁盘的使用率达到 90% 时,数据库将被设置为只读模式,当磁盘使用率降到 90% 以下时,数据库将恢复到读写模式。
  • 表空间对应于一个文件系统目录,用户需要对该目录拥有读写权限。
  • 使用表空间配额管理会使性能有 30% 左右的影响,MAXSIZE 指定每个数据库节点的配额大小,误差范围在 500MB 以内。请根据实际的情况确认是否需要设置表空间的最大值。

openGauss 自带了两个表空间:pg_defaultpg_global

  • 默认表空间 pg_default:用来存储非共享系统表、用户表、用户索引、临时表、临时索引、内部临时表的默认表空间。对应存储目录为实例数据目录下的 base 目录。
  • 共享表空间 pg_global:用来存放共享系统表的表空间。对应存储目录为实例数据目录下的 global 目录。

gsql 中使用 \db 命令查看表空间:

omm@postgres=# \db
      List of tablespaces
    Name    | Owner | Location 
------------+-------+----------
 pg_default | omm   | 
 pg_global  | omm   | 
(2 rows)

对应的文件系统目录为:

[omm@opengauss ~]$ ll -d $PGDATA/base
drwx------ 7 omm dbgrp 71 Feb 28 13:55 /opt/huawei/install/data/dn/base
[omm@opengauss ~]$ ll -d $PGDATA/global
drwx------ 3 omm dbgrp 4096 Feb 28 09:46 /opt/huawei/install/data/dn/global

如果创建数据库时使用 template1(默认)或者 template0 作为模板数据库,则 pg_default 也是新建数据库的默认表空间。此后,连接到该数据库创建表或者索引时,如果不指定表空间,将使用数据库的默认表空间。

可以在创建数据库,表或者索引时指定表空间:

CREATE TABLE foo(i int) TABLESPACE space1;

也可以设置 default_tablespace 参数为后续语句指定默认表空间:

SET default_tablespace = space1;
CREATE TABLE foo(i int);

创建表空间

使用 CREATE TABLESPACE 创建表空间。

  • 系统管理员或者继承了内置角色 gs_roles_tablespace 权限的用户可以创建表空间。
  • 相比 PostgreSQL,无需先创建目录,可以直接创建表空间,会自动创建对应目录。
  • 可以设置的表空间参数有 seq_page_costrandom_page_cost
  • 由于创建的表空间与文件系统目录之间通过符号链接关联,故只能在支持符号链接的系统上创建表空间。
  • 执行 CREATE TABLESPACE 失败,如果内部创建目录(文件)操作成功了就会产生残留的目录(文件),重新创建时需要用户手动清理表空间指定的目录下残留的内容。如果在创建过程中涉及到数据目录下的表空间软连接残留,需要先将软连接的残留文件删除,再重新执行 OM 相关操作。
  • CREATE TABLESPACE 不支持两阶段事务,如果部分节点执行失败,不支持回滚。
  • 不能在事务块中执行 CREATE TABLESPACE 语句。

语法:

CREATE TABLESPACE tablespace_name
    {[ OWNER user_name ]  [ RELATIVE ]  LOCATION 'directory' [ MAXSIZE 'space_size' ]
    [with_option_clause]} |
    {[LOGGING | NOLOGGING] DATAFILE 'directory' [SIZE space_size space_size_unit] [REUSE]
    [AUTOEXTEND ON [NEXT next_size next_size_unit] [MAXSIZE 'autoextend_size'] | AUTOEXTEND OFF]} |
    {DATAFILE 'directory' [SIZE space_size space_size_unit] [REUSE]
    [AUTOEXTEND ON [NEXT next_size next_size_unit] [MAXSIZE 'autoextend_size'] | AUTOEXTEND OFF] {LOGGING | NOLOGGING}};

where option_clause can be:
WITH ({filesystem = {'general' | "general" | general} |
    address = {'ip:port[,...]'} |
    cfgpath = {'path'} |
    storepath = {'rootpath'} |
    random_page_cost = {'value' | value} |
    seq_page_cost = {'value' | value}}[,...])

其中:

  • tablespace_name:表空间名称,不能以 pg_ 开头。
  • OWNER user_name:指定该表空间的所有者。缺省时,新表空间的所有者是当前用户。只有系统管理员可以创建表空间,但是可以通过 OWNER 子句把表空间的所有权赋给其他非系统管理员。
  • RELATIVE:表示使用相对路径,LOCATION 目录是相对于各个数据库节点数据目录下的。位于 $PGDATA/pg_location 目录下。相对路径最多指定两层。若没有指定该参数,表示使用绝对表空间路径,LOCATION 目录需要使用绝对路径。
  • LOCATION directory:用于表空间的目录。当创建绝对表空间路径时,对于目录有如下要求:
    • openGauss 系统用户必须对该目录拥有读写权限,并且目录为空。如果该目录不存在,将由系统自动创建。
    • 目录必须是绝对路径,目录中不得含有特殊字符(如$、> 等)。
    • 目录不允许指定在数据库数据目录下。
    • 目录需为本地路径。
  • MAXSIZE 'space_size':指定表空间在单个数据库节点上的最大值。取值范围:字符串格式为正整数+单位,单位当前支持 K/M/G/T/P。解析后的数值以 K 为单位,且范围不能够超过 64 比特表示的有符号整数,即 1KB~9007199254740991KB。

例子:创建表空间

omm@postgres=# CREATE TABLESPACE app_tbs RELATIVE LOCATION 'tablespace/app';
CREATE TABLESPACE

omm@postgres=# \db
         List of tablespaces
    Name    | Owner |    Location    
------------+-------+----------------
 app_tbs    | omm   | tablespace/app
 pg_default | omm   | 
 pg_global  | omm   | 
(3 rows)

omm@postgres=# select * from pg_tablespace;
  spcname   | spcowner | spcacl | spcoptions | spcmaxsize | relative 
------------+----------+--------+------------+------------+----------
 pg_default |       10 |        |            |            | f
 pg_global  |       10 |        |            |            | f
 app_tbs    |       10 |        |            |            | t
(3 rows)

在表空间 app_tbs 对应的目录下 /opt/huawei/install/data/dn/pg_location/tablespace/app 创建了一个目录 PG_9.2_201611171_dn_6001(以 PostgreSQL 版本命名):

[omm@opengauss ~]$ ll /opt/huawei/install/data/dn/pg_location/tablespace/app
total 0
drwx------ 3 omm dbgrp 23 Feb 28 15:36 PG_9.2_201611171_dn_6001

与此同时,在 $PGDATA/pg_tblspc 目录下创建一个名称为表空间 oid 的符号链接,指向表空间对应的目录:

[omm@opengauss ~]$ ll $PGDATA/pg_tblspc
total 0
lrwxrwxrwx 1 omm dbgrp 54 Feb 28 15:36 16397 -> /opt/huawei/install/data/dn/pg_location/tablespace/app

默认情况下,执行 CREATE TABLESPACE 语句的用户为该表空间的所有者,也可以使用 OWNER 选项指定所有者。为方便管理,建议统一使用 postgres 超级用户创建表空间。

对于普通用户,需要授予表空间上的对象创建权限才能使用该表空间。为用户 stone 授予表空间 app_tbs 上的使用权限:

omm@postgres=# GRANT CREATE ON TABLESPACE app_tbs TO stone;
GRANT

omm@postgres=# \db+
                          List of tablespaces
    Name    | Owner |    Location    | Access privileges | Description 
------------+-------+----------------+-------------------+-------------
 app_tbs    | omm   | tablespace/app | omm=C/omm        +| 
            |       |                | stone=C/omm       | 
 pg_default | omm   |                |                   | 
 pg_global  | omm   |                |                   | 
(3 rows)

使用用户 omm 创建数据库 appdb 并指定默认表空间为 app_tbs,然后连接该数据库,创建用户 hr

omm@postgres=# CREATE DATABASE appdb TABLESPACE app_tbs ENCODING 'UTF8';
CREATE DATABASE

omm@postgres=# \l+
                                                           List of databases
   Name    | Owner | Encoding  | Collate | Ctype | Access privileges | Size  | Tablespace |                Description                 
-----------+-------+-----------+---------+-------+-------------------+-------+------------+--------------------------------------------
 appdb     | omm   | UTF8      | C       | C     |                   | 13 MB | app_tbs    | 
 postgres  | omm   | SQL_ASCII | C       | C     | =Tc/omm          +| 16 MB | pg_default | default administrative connection database
           |       |           |         |       | omm=CTc/omm      +|       |            | 
           |       |           |         |       | stone=CTc/omm    +|       |            | 
           |       |           |         |       | stone=APm/omm    +|       |            | 
           |       |           |         |       | joe=C*c*/omm      |       |            | 
 template0 | omm   | SQL_ASCII | C       | C     | =c/omm           +| 13 MB | pg_default | default template for new databases
           |       |           |         |       | omm=CTc/omm       |       |            | 
 template1 | omm   | SQL_ASCII | C       | C     | =c/omm           +| 13 MB | pg_default | unmodifiable empty database
           |       |           |         |       | omm=CTc/omm       |       |            | 
 testdb    | omm   | UTF8      | C       | C     |                   | 13 MB | pg_default | 
(5 rows)

omm@postgres=# select oid,datname,datistemplate,datallowconn,dattablespace from pg_database;
  oid  |  datname  | datistemplate | datallowconn | dattablespace 
-------+-----------+---------------+--------------+---------------
     1 | template1 | t             | t            |          1663
 15741 | postgres  | f             | t            |          1663
 16388 | testdb    | f             | t            |          1663
 15736 | template0 | t             | f            |          1663
 16398 | appdb     | f             | t            |         16397
(5 rows)

omm@postgres=# \c appdb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "appdb" as user "omm".

omm@appdb=# CREATE USER hr IDENTIFIED BY 'Abcd1234';
CREATE ROLE

omm@appdb=# \dn hr
List of schemas
 Name | Owner 
------+-------
 hr   | hr
(1 row)

使用用户 hr 连接到 appdb,就会默认将表创建在 hr 模式下以及 app_tbs 表空间中:

omm@appdb=# \c - hr
Password for user hr: 
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "appdb" as user "hr".

hr@appdb=> CREATE TABLE t1(id int);
CREATE TABLE

hr@appdb=> \d
                        List of relations
 Schema | Name | Type  | Owner |             Storage              
--------+------+-------+-------+----------------------------------
 hr     | t1   | table | hr    | {orientation=row,compression=no}
(1 row)

hr@appdb=> SELECT schemaname,tablename,tableowner,tablespace,tablecreator FROM pg_tables WHERE tablename='t1';
 schemaname | tablename | tableowner | tablespace | tablecreator 
------------+-----------+------------+------------+--------------
 hr         | t1        | hr         |            | hr
(1 row)

这里使用了数据库的默认表空间 app_tbs,故 tablespace 显示为空。

可以使用函数 PG_TABLESPACE_SIZE 获取表空间大小,单位为字节:

hr@appdb=> SELECT PG_TABLESPACE_SIZE('app_tbs')/1024/1204 AS MB;
        mb        
------------------
 10.9202738917151
(1 row)

修改表空间

使用 ALTER TABLESPACE 创建表空间。

语法:

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' };

其中:

  • 使用 RENAME 重命名表空间。
  • 使用 OWNER TO 修改表空间所有者。
  • 使用 SET 修改表空间参数 seq_page_costrandom_page_cost
  • 使用 RESET 重置表空间参数为默认值。

例子:创建目录,创建表空间后再修改表空间

[omm@opengauss ~]$ mkdir /opt/huawei/tablespace

omm@postgres=# CREATE TABLESPACE test_tbs LOCATION '/opt/huawei/tablespace/test_tbs1';
CREATE TABLESPACE

[omm@opengauss ~]$ ll /opt/huawei/tablespace/test_tbs1/
total 0
drwx------ 3 omm dbgrp 23 Mar  3 10:02 PG_9.2_201611171_dn_6001

omm@postgres=# ALTER TABLESPACE test_tbs RENAME TO test_tbs1;
ALTER TABLESPACE

omm@postgres=# \db
                  List of tablespaces
    Name    | Owner |             Location             
------------+-------+----------------------------------
 app_tbs    | omm   | tablespace/app
 pg_default | omm   | 
 pg_global  | omm   | 
 test_tbs1  | omm   | /opt/huawei/tablespace/test_tbs1
(4 rows)

删除表空间

使用 DROP TABLESPACE 删除表空间。

语法:

DROP TABLESPACE [ IF EXISTS ] tablespace_name;
  • 表空间只能由其所有者或超级用户删除。
  • 必须删除表空间中所有数据库对象,然后才能删除表空间。
  • 删除表空间时,同时会删除文件系统中对应的表空间子目录。

例子:删除表空间

omm@postgres=# DROP TABLESPACE test_tbs1;
DROP TABLESPACE
omm@postgres=# \db
         List of tablespaces
    Name    | Owner |    Location    
------------+-------+----------------
 app_tbs    | omm   | tablespace/app
 pg_default | omm   | 
 pg_global  | omm   | 
(3 rows)

用户角色

在 openGauss 中,用户和角色是进行权限管理和访问控制的重要概念。

  • 用户:是数据库中可以登录并使用数据库资源的实体,拥有自己的认证信息(如用户名和密码),可以对数据库执行各种操作。
  • 角色:是一组权限的集合,可以将角色授予用户或其他角色。角色本身不具备登录能力,但可以包含各种权限,方便进行权限的集中管理和分配。从某种意义上说,用户是特殊的角色,具有登录权限的角色就可以视为用户。
  • 用户默认拥有 LOGIN 权限,角色默认没有;用户与角色本质上共享同一系统表(pg_authid),通过属性区分功能。pg_userpg_roles 视图也可以查询用户,角色信息。

初始化数据库集群时会自动创建与操作系统用户同名的超级用户 omm,必须先使用 omm 超级用户这个初始角色来创建更多的角色。

gsql 中使用 \du 命令查看用户和角色:

omm@postgres=# \du
                                                              List of roles
 Role name |                                                    Attributes                                                    | Member of 
-----------+------------------------------------------------------------------------------------------------------------------+-----------
 hr        |                                                                                                                  | {}
 omm       | Sysadmin, Create role, Create DB, Replication, Administer audit, Monitoradmin, Operatoradmin, Policyadmin, UseFT | {}
 stone     |                                                                                                                  | {}
 test      |                                                                                                                  | {}

还可以查询 pg_roles 系统表查看用户和角色:

omm@postgres=# select rolname,rolsuper,rolinherit,rolcreaterole,rolcreatedb,rolcanlogin,rolreplication,rolconnlimit from pg_roles;
         rolname          | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit 
--------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------
 gs_role_copy_files       | f        | t          | f             | f           | f           | f              |           -1
 gs_role_signal_backend   | f        | t          | f             | f           | f           | f              |           -1
 gs_role_tablespace       | f        | t          | f             | f           | f           | f              |           -1
 gs_role_replication      | f        | t          | f             | f           | f           | f              |           -1
 gs_role_account_lock     | f        | t          | f             | f           | f           | f              |           -1
 gs_role_pldebugger       | f        | t          | f             | f           | f           | f              |           -1
 gs_role_directory_create | f        | t          | f             | f           | f           | f              |           -1
 gs_role_directory_drop   | f        | t          | f             | f           | f           | f              |           -1
 omm                      | t        | t          | t             | t           | t           | t              |           -1
 stone                    | f        | t          | f             | f           | t           | f              |           -1
 test                     | f        | t          | f             | f           | t           | f              |           -1
 hr                       | f        | t          | f             | f           | t           | f              |           -1
(12 rows)

其中以 gs_role_ 开头的角色为内置角色,它们允许执行某些需要高权限的操作。具体如下:

角色权限描述
gs_role_copy_files具有执行 copy … to/from filename 的权限,但需要先打开 GUC 参数enable_copy_server_files
gs_role_signal_backend具有调用函数 pg_cancel_backendpg_terminate_backendpg_terminate_session 来取消或终止其他会话的权限,但不能操作属于初始用户和 PERSISTENCE 用户的会话。
gs_role_tablespace具有创建表空间的权限。
gs_role_replication具有调用逻辑复制相关函数的权限,例如 kill_snapshotpg_create_logical_replication_slotpg_create_physical_replication_slotpg_drop_replication_slotpg_replication_slot_advancepg_create_physical_replication_slot_externpg_logical_slot_get_changespg_logical_slot_peek_changespg_logical_slot_get_binary_changespg_logical_slot_peek_binary_changes
gs_role_account_lock具有加解锁用户的权限,但不能加解锁初始用户和 PERSISTENCE 用户。
gs_role_pldebugger具有执行 dbe_pldebugger 下调试函数的权限。
gs_role_directory_create具有执行创建 directory 对象的权限,但需要先打开 GUC 参数 enable_access_server_directory
gs_role_directory_drop具有执行删除 directory 对象的权限,但需要先打开 GUC 参数 enable_access_server_directory

关于内置角色的管理有如下约束:

  • gs_role_ 开头的角色名作为数据库的内置角色保留名,禁止新建以 gs_role_ 开头的用户/角色,也禁止将已有的用户/角色重命名为以 gs_role_开头。
  • 禁止对内置角色执行 ALTER 和 DROP 操作。
  • 内置角色默认没有 LOGIN 权限,不设预置密码。
  • gsql 元命令 \du\dg 不显示内置角色的相关信息,但若显示指定了 pattern 为特定内置角色则会显示。

创建用户

使用 CREATE USER 创建用户。

  • 通过 CREATE USER 创建的用户,默认具有 LOGIN 权限。

  • 通过 CREATE USER 创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的 SCHEMA。其他数据库中,则不自动创建同名的 SCHEMA。

  • 系统管理员在普通用户同名 SCHEMA 下创建的对象,所有者为 SCHEMA 的同名用户(非系统管理员)。

  • 用户可使用 CREATE SCHEMA 命令,分别在其他数据库中,为该用户创建同名 SCHEMA。

语法:

CREATE USER [IF NOT EXISTS] user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [ EXPIRED ] | DISABLE };

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}
    | {PERSISTENCE | NOPERSISTENCE}
    | 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

其中:

  • IF NOT EXISTS:如果已经存在相同名称的用户,不会报出错误,而会发出通知,告知通知此用户已存在。

  • PASSWORD | IDENTIFIED BY:为用户指定密码,密码规则如下:

    • 密码默认不少于 8 个字符。
    • 不能与用户名及用户名倒序相同。
    • 至少包含大写字母(A-Z)、小写字母(a-z)、数字(0-9)、非字母数字字符(限定为 ~!@#$%^&*()-_=+\|[{}];:,<.>/?)四类字符中的三类字符。
    • 密码也可以是符合格式要求的密文字符串,这种情况主要用于用户数据导入场景,不推荐用户直接使用。如果直接使用密文密码,用户需要知道密文密码对应的明文,并且保证明文密码复杂度,数据库不会校验密文密码复杂度,直接使用密文密码的安全性由用户保证。
    • 创建用户时,应当使用双引号或单引号将用户密码括起来。

选项包括:

  • SYSADMIN | NOSYSADMIN:指定用户是否为系统管理员,默认值为 NOSYSADMIN。系统管理员是指具有 SYSADMIN 属性的帐户,默认安装情况下具有与对象所有者相同的权限,但不包括 dbe_perf 模式的对象权限。要创建新的系统管理员,请以初始用户或者系统管理员用户身份连接数据库,并使用带 SYSADMIN 选项的 CREATE USER 语句或 ALTER USER 语句进行设置。

  • MONADMIN | NOMONADMIN:定义用户是否具有监控管理员权限,默认值为 NOMONADMIN。监控管理员是指具有 MONADMIN 属性的帐户,具有查看 dbe_perf 模式下视图和函数的权限,亦可以对 dbe_perf 模式的对象权限进行授予或收回。要创建新的监控管理员,请以系统管理员身份连接数据库,并使用带MONADMIN选项的 CREATE USER 语句或 ALTER USER 语句进行设置。

  • OPRADMIN | NOOPRADMIN:定义用户是否具有运维管理员权限,默认值为 NOOPRADMIN。运维管理员是指具有 OPRADMIN 属性的帐户。要创建新的运维管理员,请以初始用户身份连接数据库,并使用带 OPRADMIN 选项的 CREATE USER 语句或 ALTER USER 语句进行设置。

  • POLADMIN | NOPOLADMIN:定义用户是否具有安全策略管理员权限,默认值为 NOPOLADMIN。安全策略管理员是指具有 POLADMIN 属性的帐户,具有创建资源标签、脱敏策略和统一审计策略的权限。要创建新的安全策略管理员,请以系统管理员用户身份连接数据库,并使用带 POLADMIN 选项的 CREATE USER 语句或 ALTER USER 语句进行设置。

  • AUDITADMIN | NOAUDITADMIN:定义用户是否具有审计管理员权限,默认值为 NOAUDITADMIN。审计管理员是指具有 AUDITADMIN 属性的账户,具有查看和删除审计日志的权限。 要创建新的审计管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库,三权分立打开时,请以安全管理员身份连接数据库,并使用带 AUDITADMIN 选项的 CREATE USER 语句或 ALTER USER 语句进行设置。

  • CREATEDB | NOCREATEDB:用户是否可以创建数据库,默认为 NOCREATEDB

  • CREATEROLE | NOCREATEROLE:用户是否可以管理其他角色(包括创建,修改,删除,授权,回收权限等),默认为 NOCREATEROLE

  • INHERIT | NOINHERIT:用户是否可以继承它所在组的角色的权限。不推荐使用。

  • LOGIN | NOLOGIN:使用 CREATE USER 创建的用户登录选项默认为 LOGIN

  • REPLICATION | NOREPLICATION:用户是否为复制角色,默认为 NOREPLICATION

  • INDEPENDENT | NOINDEPENDENT:定义私有、独立的角色。具有 INDEPENDENT 属性的角色,管理员对其进行的控制、访问的权限被分离,具体规则如下:

    • 未经 INDEPENDENT 角色授权,系统管理员只能进行控制操作(DROP,ALTER,TRUNCATE),无权对其表对象进行增、删、查、改、拷贝、授权操作。
    • 若将私有用户表的相关权限授予其他非私有用户,系统管理员也会获得同样的权限。
    • 未经 INDEPENDENT 角色授权,系统管理员和拥有 CREATEROLE 属性的安全管理员无权修改 INDEPENDENT 角色的继承关系。
    • 系统管理员无权修改 INDEPENDENT 角色的表对象的属主。
    • 系统管理员和拥有 CREATEROLE 属性的安全管理员无权去除 INDEPENDENT 角色的 INDEPENDENT 属性。
    • 系统管理员和拥有 CREATEROLE 属性的安全管理员无权修改 INDEPENDENT 角色的数据库口令,INDEPENDENT 角色需管理好自身口令,口令丢失无法重置。
    • 管理员属性用户不允许定义修改为 INDEPENDENT 属性。
  • PERSISTENCE | NOPERSISTENCE:定义永久用户。仅允许初始用户创建、修改和删除具有 PERSISTENCE 属性的永久用户。永久用户通常用于需要长期存在且不受常规管理流程影响的账户,如系统内置服务账户和关键业务账户。

  • CONNECTION LIMIT connlimit:用户最大并发连接数,默认为 -1 表示无限制。对系统管理员不生效。建议根据业务需求限制不同用户的最大连接数,可避免连接被某个用户全部占用。

  • VALID BEGIN:设置用户生效的时间戳。如果省略了该子句,用户无有效开始时间限制。

  • VALID UNTIL:设置用户失效的时间戳。如果省略了该子句,用户无有效结束时间限制。

  • RESOURCE POOL:设置角色使用的 RESOURCE POOL 名称,该名称属于系统表 pg_resource_pool

  • PERM SPACE:设置用户使用空间的大小。

  • TEMP SPACE:设置用户临时表存储空间限额。

  • SPILL SPACE:设置用户算子落盘空间限额。

  • DEFAULT TABLESPACE:该子句将被忽略,无实际意义。

例子:使用超级用户 omm 登录后创建用户

omm@postgres=# CREATE USER jim IDENTIFIED BY 'Abcd1234';
CREATE ROLE

omm@postgres=# \du jim
           List of roles
 Role name | Attributes | Member of 
-----------+------------+-----------
 jim       |            | {}
 
omm@postgres=# \dn jim
List of schemas
 Name | Owner 
------+-------
 jim  | jim
(1 row)
 
omm@postgres=# select usename,usesysid,usecreatedb,usesuper from pg_user;
 usename | usesysid | usecreatedb | usesuper 
---------+----------+-------------+----------
 omm     |       10 | t           | t
 stone   |    16384 | f           | f
 test    |    16390 | f           | f
 hr      |    16399 | f           | f
 jim     |    16420 | f           | f
(5 rows)

例子:创建有“创建数据库”权限的用户

omm@postgres=# CREATE USER dim CREATEDB IDENTIFIED BY 'Abcd1234';
CREATE ROLE

omm@postgres=# \du dim
           List of roles
 Role name | Attributes | Member of 
-----------+------------+-----------
 dim       | Create DB  | {}
 
omm@postgres=# select usename,usesysid,usecreatedb,usesuper from pg_user; 
 usename | usesysid | usecreatedb | usesuper 
---------+----------+-------------+----------
 omm     |       10 | t           | t
 stone   |    16384 | f           | f
 test    |    16390 | f           | f
 hr      |    16399 | f           | f
 jim     |    16420 | f           | f
 dim     |    16424 | t           | f
(6 rows)

修改用户

使用 ALTER USER 修改用户。

语法:

ALTER USER [ IF EXISTS ] user_name [ [ WITH ] option [ ... ] ];
ALTER USER user_name
    RENAME TO new_name;
ALTER USER user_name [ IN DATABASE database_name ]
    SET configuration_parameter {{ TO | = } { value | DEFAULT }|FROM CURRENT};
ALTER USER user_name
    [ IN DATABASE database_name ] RESET {configuration_parameter|ALL};

where option can be:
{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}
    | {PERSISTENCE | NOPERSISTENCE}
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' [ EXPIRED ] | DISABLE | EXPIRED }
    | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' | EXPIRED ] | DISABLE }
    | 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
    | ACCOUNT { LOCK | UNLOCK }
    | PGUSER

其中:

  • 第一个命令修改角色的属性,系统管理员可以修改任何用户的属性,普通用户只能修改自己的密码。
  • 第二个命令修改用户的名称,超级用户可以修改任何角色的名称。
  • 第三个命令修改与用户关联的指定会话参数值。可以用于所有数据库,也可以使用 IN DATABASE 指定数据库。
  • 第四个命令重置与用户关联的指定会话参数值。

CREATE USER 不同的选项有:

  • ACCOUNT { LOCK | UNLOCK }:锁定账户及解锁账户。

例子:为用户增加 CREATEROLE 权限

omm@postgres=# ALTER USER jim CREATEROLE;
ALTER ROLE

omm@postgres=# \du jim
            List of roles
 Role name | Attributes  | Member of 
-----------+-------------+-----------
 jim       | Create role | {}

例子:修改 jim 用户登录密码

omm@postgres=# ALTER USER jim IDENTIFIED BY 'Abcd@1234';
ALTER ROLE

例子:锁定 jim 账户

omm@postgres=# ALTER USER jim ACCOUNT LOCK;
ALTER ROLE

例子:解锁 jim 账户

omm@postgres=# ALTER USER jim ACCOUNT UNLOCK;
ALTER ROLE

例子:修改用户参数

omm@postgres=# ALTER user jim SET maintenance_work_mem = '1GB';
ALTER ROLE

删除用户

使用 DROP USER 修改角色。

语法:

DROP USER [ IF EXISTS ] user_name [, ...] [ CASCADE | RESTRICT ];
  • 删除用户,同时会删除同名的 SCHEMA。

  • 须使用 CASCADE 级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的进程被杀死。

  • 在 openGauss 中,存在一个配置参数 enable_kill_query,此参数在配置文件 postgresql.conf 中。此参数影响级联删除用户对象的行为:

    • 当参数 enable_kill_queryon,且使用 CASCADE 模式删除用户时,会自动杀掉锁定用户级联对象的进程,并删除用户。
    • 当参数 enable_kill_queryoff,且使用 CASCADE 模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。
  • 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即 DROP USER 不支持跨数据库进行级联删除。

  • 如果该用户被 DATA SOURCE 对象依赖时,无法直接级联删除该用户,需要手动删除对应的 DATA SOURCE 对象之后再删除该用户。

例子:删除用户

omm@postgres=# DROP USER jim CASCADE;
DROP ROLE

用户安全

自动锁定和解锁帐户

  • 为了保证帐户安全,如果用户输入密码次数超过一定次数(failed_login_attempts),系统将自动锁定该帐户,默认值为 10。次数设置越小越安全,但是在使用过程中会带来不便。
  • 当帐户被锁定时间超过设定值(password_lock_time),则当前帐户自动解锁,默认值为 1 天。时间设置越长越安全,但是在使用过程中会带来不便。

说明:

  • 参数 password_lock_time 的整数部分表示天数,小数部分可以换算成时、分、秒。
  • failed_login_attempts 设置为 0 时,表示不限制密码错误次数。当 password_lock_time 设置为 0 时,表示即使超过密码错误次数限制导致帐户锁定,也会在短时间内自动解锁。因此,只有两个配置参数都为正数时,才可以进行常规的密码失败检查、帐户锁定和解锁操作。
  • 这两个参数的默认值都符合安全标准,用户可以根据需要重新设置参数,提高安全等级。建议用户使用默认值。

手动锁定和解锁帐户

若管理员发现某帐户被盗、非法访问等异常情况,可手动锁定该帐户。

当管理员认为帐户恢复正常后,可手动解锁该帐户。

以手动锁定和解锁用户 joe 为例,命令格式如下:

  • 手动锁定

    openGauss=# ALTER USER joe ACCOUNT LOCK;
    ALTER ROLE
    
  • 手动解锁

    openGauss=# ALTER USER joe ACCOUNT UNLOCK;
    ALTER ROLE
    

设置密码安全策略

密码加密

用户密码存储在系统表 pg_authid 中,为防止用户密码泄露,openGauss 对用户密码进行加密存储,所采用的加密算法由配置参数 password_encryption_type 决定。

  • 当参数 password_encryption_type 设置为 0 时,表示采用 MD5 方式对密码加密。MD5 加密算法安全性低,存在安全风险,不建议使用。
  • 当参数 password_encryption_type 设置为 1 时,表示采用 SHA256 和 MD5 方式对密码加密。MD5 加密算法安全性低,存在安全风险,不建议使用。
  • 当参数 password_encryption_type 设置为 2 时,表示采用 SHA256 方式对密码加密,为默认配置。
  • 当参数 password_encryption_type 设置为 3 时,表示采用 SM3 方式对密码加密。
omm@postgres=# SELECT * FROM pg_settings WHERE NAME='password_encryption_type';
-[ RECORD 1 ]----------------------------------------------------------------------------------------
name       | password_encryption_type
setting    | 2
unit       | 
category   | Connections and Authentication / Security and Authentication
short_desc | The encryption method of password.
extra_desc | This controls the encryption type of the password. A value of 2 uses the system default.
context    | sighup
vartype    | integer
source     | default
min_val    | 0
max_val    | 3
enumvals   | 
boot_val   | 2
reset_val  | 2
sourcefile | 
sourceline |
密码复杂度

初始化数据库、创建用户、修改用户时需要指定密码。密码必须要符合复杂度 password_policy 的要求,否则会提示用户重新输入密码。

  • 参数 password_policy 设置为 1 时表示采用密码复杂度校验,默认值。
  • 参数 password_policy 设置为 0 时表示不采用密码复杂度校验,但需满足密码不能为空并且只包含有效字符,有效字符范围为大写字母(A-Z)、小写字母(a-z)、数字(0-9)及特殊字符详。设置为 0 会存在安全风险,不建议设置为 0,即使需要设置也要将所有 openGauss 节点中的 password_policy 都设置为 0 才能生效。
omm@postgres=# SELECT * FROM pg_settings WHERE NAME='password_policy';
-[ RECORD 1 ]---------------------------------------------------------------------------------------------
name       | password_policy
setting    | 1
unit       | 
category   | Connections and Authentication / Security and Authentication
short_desc | The password complexity-policy of the database system.
extra_desc | This controls the complexity-policy of database system. A value of 1 uses the system default.
context    | sighup
vartype    | integer
source     | default
min_val    | 0
max_val    | 1
enumvals   | 
boot_val   | 1
reset_val  | 1
sourcefile | 
sourceline | 

说明:

帐户密码的复杂度要求如下:

  • 包含大写字母(A-Z)的最少个数(password_min_uppercase
  • 包含小写字母(a-z)的最少个数(password_min_lowercase
  • 包含数字(0-9)的最少个数(password_min_digital
  • 包含特殊字符的最少个数(password_min_special
  • 密码的最小长度(password_min_length
  • 密码的最大长度(password_max_length
  • 至少包含上述四类字符中的三类。
  • 不能和用户名、用户名倒写相同,本要求为非大小写敏感。
  • 不能和当前密码、当前密码的倒写相同。
  • 不能是弱口令。
  • 弱口令指的是强度较低,容易被破解的密码,对于不同的用户或群体,弱口令的定义可能会有所区别,用户需自己添加定制化的弱口令。
  • 弱口令字典中的口令存放在 gs_global_config 系统表中,当创建用户、修改用户需要设置密码时,系统将会把用户设置口令和弱口令字典中存放的口令进行对比,如果符合,则会提示用户该口令为弱口令,设置密码失败。
  • 弱口令字典默认为空,用户通过以下语法可以对弱口令字典进行增加和删除,示例如下:
openGauss=# CREATE WEAK PASSWORD DICTIONARY WITH VALUES ('password1'), ('password2');
openGauss=# DROP WEAK PASSWORD DICTIONARY;
密码重用

用户修改密码时,只有超过不可重用天数 password_reuse_time 或不可重用次数 password_reuse_max 的密码才可以使用。

不可重用天数默认值为 60 天,不可重用次数默认值是 0。这两个参数值越大越安全,但是在使用过程中会带来不便,其默认值符合安全标准,用户可以根据需要重新设置参数,提高安全等级。

密码有效期

数据库用户的密码都有密码有效期 password_effect_time(默认为 90 天),当达到密码到期提醒天数 password_notify_time (默认为 7 天)时,系统会在用户登录数据库时提示用户修改密码。

考虑到数据库使用特殊性及业务连续性,密码过期后用户还可以登录数据库,但是每次登录都会提示修改密码,直至修改为止。

密码失效

具有 CREATEROLE 权限的用户在创建用户时可以强制用户密码失效,新用户首次登陆数据库后需要修改密码才允许执行其他查询操作,命令格式如下:

openGauss=# CREATE USER joe PASSWORD "abc@1234" EXPIRED;
CREATE ROLE

具有 CREATEROLE 权限的用户可以强制用户密码失效或者强制修改密码且失效,命令格式如下:

openGauss=# ALTER USER joe PASSWORD EXPIRED;
ALTER ROLE
openGauss=# ALTER USER joe PASSWORD "abc@2345" EXPIRED;
ALTER ROLE

说明:

  • 密码失效的用户登录数据库后,当执行简单查询或者扩展查询时,会提示用户修改密码。修改密码后可以正常执行语句。
  • 只有初始用户、系统管理员(SYSAD)或拥有创建用户(CREATEROLE)权限的用户才可以设置用户密码失效,其中系统管理员也可以设置自己或其他系统管理员密码失效。不允许设置初始用户密码失效。

管理角色

使用 CREATE ROLE 创建角色。

  • 在数据库中添加一个新角色,角色无登录权限。
  • 创建角色的用户必须具备 CREATE ROLE 的权限或者是系统管理员。

创建角色的语法与创建用户的语法类似,只是默认为 NOLOGIN,不能登录。

使用 ALTER ROLE 修改角色,语法与修改用户的语法类似。

使用 DROP ROLE 删除角色,语法与删除用户的语法类似。

例子:创建一个角色并指定密码

omm@postgres=# CREATE ROLE manager IDENTIFIED BY 'Abcd1234';
CREATE ROLE

omm@postgres=# \du manager
            List of roles
 Role name |  Attributes  | Member of 
-----------+--------------+-----------
 manager   | Cannot login | {}

例子:创建一个角色,可以登录,并指定生效和失效日期

omm@postgres=# CREATE ROLE miriam WITH LOGIN IDENTIFIED BY 'Abcd1234' VALID BEGIN '2025-01-01' VALID UNTIL '2026-01-01';
CREATE ROLE

omm@postgres=# \du miriam
                          List of roles
 Role name |               Attributes                | Member of 
-----------+-----------------------------------------+-----------
 miriam    | Role valid begin 2025-01-01 00:00:00+08+| {}
           | Role valid until 2026-01-01 00:00:00+08 | 

例子:修改角色的密码

omm@postgres=# ALTER ROLE manager IDENTIFIED BY 'Abcd@1234';
ALTER ROLE

例子:修改角色为系统管理员。

omm@postgres=# ALTER ROLE manager SYSADMIN;
ALTER ROLE

omm@postgres=# \du manager
                 List of roles
 Role name |       Attributes       | Member of 
-----------+------------------------+-----------
 manager   | Cannot login, Sysadmin | {}

omm@postgres=# select rolname,rolsuper,rolcreaterole,rolcreatedb,rolcanlogin,rolsystemadmin from pg_roles where rolname in ('manager','miriam');
 rolname | rolsuper | rolcreaterole | rolcreatedb | rolcanlogin | rolsystemadmin 
---------+----------+---------------+-------------+-------------+----------------
 manager | f        | f             | f           | f           | t
 miriam  | f        | f             | f           | t           | f
(2 rows)

例子:删除角色

omm@postgres=# DROP ROLE manager;
DROP ROLE

权限

数据库对象创建后,进行对象创建的用户就是该对象的所有者。openGauss 安装后的默认情况下,未开启三权分立,数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和销毁对象,以及通过 GRANTopen in new window 将对象的权限授予其他用户。

为使其他用户能够使用对象,必须向用户或包含该用户的角色授予必要的权限。

openGauss 支持以下的权限:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、CREATE、CONNECT、EXECUTE、ALTER、DROP、COMMENT、INDEX、VACUUM 和 USAGE 等。

  • SELECT:允许对指定的表、视图、序列执行 SELECT 命令,UPDATE 或 DELETE 时也需要对应字段上的 SELECT 权限。
  • INSERT:允许对指定的表执行 INSERT 命令。
  • UPDATE:允许对声明的表中任意字段执行 UPDATE 命令。通常,UPDATE 命令也需要 SELECT 权限来查询出哪些行需要更新。SELECT… FOR UPDATESELECT… FOR SHARE 除了需要 SELECT 权限外,还需要 UPDATE 权限。
  • DELETE:允许执行 DELETE 命令删除指定表中的数据。通常,DELETE 命令也需要 SELECT 权限来查询出哪些行需要删除。
  • TRUNCATE:允许执行 TRUNCATE 语句删除指定表中的所有记录。
  • REFERENCES:允许创建一个外键约束,必须拥有参考表和被参考表的 REFERENCES 权限。
  • TRIGGER:允许创建触发器。
  • CREATE:
    • 对于数据库,允许在数据库里创建新的模式。
    • 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的 CREATE 权限。
    • 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。
  • CONNECT:允许用户连接到指定的数据库。
  • TEMPORARY:允许在指定的数据库中创建临时表。
  • EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符。
  • USAGE:
    • 对于过程语言,允许用户在创建函数的时候指定过程语言。
    • 对于模式,USAGE 允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。
    • 对于序列,USAGE 允许使用 nextval 函数。
    • 对于 Data Source 对象,USAGE 是指访问权限,也是可赋予的所有权限,即 USAGE 与 ALL PRIVILEGES 等价。
  • ALTER:允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。
  • DROP:允许用户删除指定的对象。
  • COMMENT:允许用户定义或修改指定对象的注释。
  • INDEX:允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行 REINDEX 和 CLUSTER 操作。
  • VACUUM:允许用户对指定的表执行 ANALYZE 和 VACUUM 操作。
  • ALL PRIVILEGES:一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行 GRANT ALL PRIVILEGES。

不同的权限与不同的对象类型关联。

要撤消已经授予的权限,可以使用 REVOKEopen in new window。对象所有者的权限(例如 ALTER、DROP、COMMENT、INDEX、VACUUM、GRANT 和 REVOKE)是隐式的,无法授予或撤消。即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤消自己的普通权限,例如,使表对自己以及其他人只读,系统管理员用户除外。

系统表和系统视图要么只对系统管理员可见,要么对所有用户可见。标识了需要系统管理员权限的系统表和视图只有系统管理员可以查询。

数据库提供对象隔离的特性,对象隔离特性开启时,用户只能查看有权限访问的对象(表、视图、字段、函数),系统管理员不受影响。

不建议用户修改系统表和系统视图的权限。

权限及其缩写和适用的对象如下表:

权限缩写对象类型
SELECTrTABLE, table column, SEQUENCE
INSERTaTABLE, table column
UPDATEwTABLE, table column, SEQUENCE
DELETEdTABLE
TRUNCATEDTABLE
REFERENCESxTABLE, table column
TRIGGERtTABLE
CREATECDATABASE, SCHEMA, TABLESPACE
CONNECTcDATABASE
TEMPORARYTDATABASE
EXECUTEXFUNCTION, PROCEDURE, PACKAGE
USAGEUSEQUENCE, DOMAIN, CLIENT_MASTER_KEY, COLUMN_ENCRYPTION_KEY, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, DATA SOURCE
ALTERATABLE, SEQUENCE, DATABASE, FOREIGN SERVER, FUNCTION, PROCEDURE, SCHEMA, TABLESPACE, DIRECTORY, PACKAGE
DROPPTABLE, SEQUENCE, DATABASE, CLIENT_MASTER_KEY, COLUMN_ENCRYPTION_KEY, FOREIGN SERVER, FUNCTION, PROCEDURE, SCHEMA, TABLESPACE, TYPE, DIRECTORY, PACKAGE
COMMENTmTABLE, table column, SEQUENCE, DATABASE, FOREIGN SERVER, FUNCTION, PROCEDURE, SCHEMA, TABLESPACE, PACKAGE
INDEXiTABLE
VACUUMvTABLE

对象可用权限及检查权限的 psql 命令:

对象类型所有权限默认 PUBLIC 权限gsql 命令
TABLEarwdDxtAPmivnone\dp
table columnarwxmnone\dp
SEQUENCErwUAPmnone\dp
DATABASECTcAPmTc\l
CLIENT_MASTER_KEYUPnone
COLUMN_ENCRYPTION_KEYUPnone
FOREIGN DATA WRAPPERUnone\dew+
FOREIGN SERVERUAPmnone\des+
FUNCTIONXAPmX\df+
PROCEDUREXAPmX\df+
LANGUAGEUU\dL+
SCHEMAUCAPmnone\dn+
TABLESPACECAPmnone\dp

其中:

  • 默认将数据库的 CONNECTTEMPORARY 权限授予给 PUBLIC
  • 默认将函数和存储过程的 EXECUTE 权限授予给 PUBLIC
  • 默认将语言的 USAGE 权限授予给 PUBLIC
  • 对于其他对象,默认没有权限授予给 PUBLIC
  • 可以使用 ALTER DEFAULT PRIVILEGES 命令覆盖这些默认权限设置。

psql 中使用 \dp 查看权限:

omm@postgres=# \c appdb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "appdb" as user "omm".

omm@appdb=# \dn hr
List of schemas
 Name | Owner 
------+-------
 hr   | hr
(1 row)

omm@appdb=# \c - hr
Password for user hr: 
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "appdb" as user "hr".

hr@appdb=> \d
                        List of relations
 Schema | Name | Type  | Owner |             Storage              
--------+------+-------+-------+----------------------------------
 hr     | t1   | table | hr    | {orientation=row,compression=no}
(1 row)

hr@appdb=> \dp
                          Access privileges
 Schema | Name | Type  | Access privileges | Column access privileges 
--------+------+-------+-------------------+--------------------------
 hr     | t1   | table |                   | 
(1 row)

最开始 Access privileges 字段为空,表示对象有默认权限,包括所有者的所有权限及与对象相关的 PUBLIC 权限。

授予权限

使用 GRANT 为用户和角色授予权限。

使用 GRANT 命令进行用户授权包括以下几种场景:

  1. 将系统权限授权给角色或用户
  • 系统权限又称为用户属性,包括 SYSADMINCREATEDBCREATEROLEAUDITADMINMONADMINOPRADMINPOLADMININHERITREPLICATIONVCADMINLOGIN 等。

  • 系统权限一般通过 CREATE/ALTER ROLE 语法来指定。其中,SYSADMIN 权限可以通过 GRANT/REVOKE ALL PRIVILEGE 授予或撤销。但系统权限无法通过 ROLEUSER 的权限被继承,也无法授予 PUBLIC

  • 有关系统权限的详细信息,请参见 CREATE ROLE


  1. 将数据库对象授权给角色或用户
  • 将数据库对象(表和视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户。

  • GRANT 命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。

  • 关键字 PUBLIC 表示将该角色所拥有的权限授予给所有角色,包括后续创建的角色,数据库中所创建的角色都会继承 PUBLIC 组角色的权限。故任何特定角色的权限包括直接授予的权限,授予其包含角色的权限以及授予给 PUBLIC 的权限。

  • 如果声明了 WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予 PUBLIC,这是 openGauss 特有的属性。

  • openGauss 会将某些类型的对象上的权限授予 PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予 PUBLIC,而以下这些对象的权限会授予 PUBLIC:数据库的 CONNECT 权限和 CREATE TEMP TABLE 权限、函数的 EXECUTE 特权、语言和数据类型(包括域)的 USAGE 特权。当然,对象拥有者可以撤销默认授予 PUBLIC 的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。另外可参考安全加固指南的权限控制章节,对 PUBLIC 用户组的权限进行限制。这些初始的默认权限可以使用 ALTER DEFAULT PRIVILEGES 命令修改。

  • 对象的所有者缺省具有该对象上的所有权限,出于安全考虑所有者可以舍弃部分权限,但 ALTERDROPCOMMENTINDEXVACUUM 以及对象的可再授予权限属于所有者固有的权限,隐式拥有。


  1. 将角色或用户的权限授权给其他角色或用户
  • 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。

  • 当声明了 WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。

  • 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有 CREATEROLE 权限的角色可以赋予或者撤销任何非系统管理员角色的权限。


  1. 将 ANY 权限授予给角色或用户
  • 将 ANY 权限授予特定的角色和用户,ANY 权限的取值范围参见语法格式。当声明了 WITH ADMIN OPTION,被授权的用户可以将该 ANY 权限再次授予其他角色/用户,或从其他角色/用户处回收该 ANY 权限。ANY 权限可以通过角色被继承,但不能赋予 PUBLIC。初始用户和三权分立关闭时的系统管理员用户可以给任何角色/用户授予或撤销 ANY 权限。
  • 目前支持以下 ANY 权限:
    • CREATE ANY TABLE
    • ALTER ANY TABLE
    • DROP ANY TABLE
    • SELECT ANY TABLE
    • INSERT ANY TABLE
    • UPDATE ANY TABLE
    • DELETE ANY TABLE
    • CREATE ANY SEQUENCE
    • CREATE ANY INDEX
    • CREATE ANY FUNCTION
    • EXECUTE ANY FUNCTION
    • CREATE ANY PACKAGE
    • EXECUTE ANY PACKAGE
    • CREATE ANY TYPE
    • ALTER ANY TYPE
    • DROP ANY TYPE
    • ALTER ANY SEQUENCE
    • DROP ANY SEQUENCE
    • SELECT ANY SEQUENCE
    • ALTER ANY INDEX
    • DROP ANY INDEX
    • CREATE ANY SYNONYM
    • DROP ANY SYNONYM
    • CREATE ANY TRIGGER
    • ALTER ANY TRIGGER
    • DROP ANY TRIGGER
  • 不允许将 ANY 权限授予 PUBLIC,也不允许从 PUBLIC 回收 ANY 权限。
  • ANY 权限属于数据库内的权限,只对授予该权限的数据库内的对象有效,例如 SELECT ANY TABLE 只允许用户查看当前数据库内的所有用户表数据,对其他数据库内的用户表无查看权限。
  • 即使用户被授予 ANY 权限,也不能对私有用户下的对象进行访问操作(INSERTDELETEUPDATESELECT)。
  • ANY 权限与原有的权限相互无影响。
  • 如果用户被授予 CREATE ANY TABLE 权限,在同名模式下创建表的属主是该模式的属主,用户对表进行其他操作时,需要授予相应的操作权限。与此类似的还有 CREATE ANY FUNCTIONCREATE ANY PACKAGECREATE ANY TYPECREATE ANY SEQUENCECREATE ANY INDEX,在同名模式下创建的对象的属主是同名模式的属主;而对于 CREATE ANY TRIGGERCREATE ANY SYNONYM,在同名模式下创建的对象的属主为创建者。
  • 需要谨慎授予用户 CREATE ANY FUNCTIONCREATE ANY PACKAGE 的权限,以免其他用户利用 DEFINER 类型的函数或 PACKAGE 进行权限提升。

  1. 模式权限控制
  • 默认情况下,用户只能访问属于自己模式中的数据库对象。如果需要访问其他模式的对象,则该模式的所有者应该赋予其他模式的 USAGE 权限。
  • 通过将模式的 CREATE 权限授予某用户,被授权用户就可以在此模式中创建对象。注意默认情况下,所有角色都拥有在 public 模式上的 USAGE 权限,但是普通用户没有在 public 模式上的 CREATE 权限。普通用户能够连接到一个指定数据库并在它的 public 模式中创建对象是不安全的,如果普通用户具有在 public 模式上的 CREATE 权限,则建议通过如下语句撤销该权限。
omm@postgres=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
omm@postgres=# select current_schema();
 current_schema 
----------------
 public
(1 row)

注意事项:

  • 系统管理员可以访问所有对象,但尽可能使用对象所有者执行授予和回收权限命令。
  • 如果使用系统管理员执行授予和回收权限命令,实际上是由对象所有者执行的。
  • PUBLIC 角色属于任何用户,为了保障数据库数据的安全,此角色应该拥有尽可能少的权限,所以应该控制 PUBLIC 角色的权限。
    • 关键字 PUBLIC 表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC 可以看做是一个隐含定义好的组,它总是包括所有角色。
    • 任何角色或用户都将拥有通过 GRANT 直接赋予的权限和所属的权限,再加上 PUBLIC 的权限。
    • 默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予 PUBLIC。
    • 以下这些对象的权限会授予 PUBLIC:数据库的 CONNECT 权限和 CREATE TEMP TABLE 权限、函数的 EXECUTE 特权、语言和数据类型(包括域)的 USAGE 特权。
  • 回收 PUBLIC 角色拥有的对象权限。
omm@postgres=# REVOKE ALL ON <OBJECT_NAME> FROM PUBLIC;
  • 检查方法:
omm@postgres=# SELECT relname,relacl FROM pg_class WHERE CAST(relacl AS TEXT) LIKE '%,=,%' OR CAST(relacl AS TEXT) LIKE '{=,%}';

语法:

  • 将表或视图的访问权限赋予指定的用户或角色。
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] 
      | 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 | COMMENT } ( column_name [, ...] )} [, ...] 
      | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将序列的访问权限赋予指定的用户或角色,LARGE 字段属性可选,赋权语句不区分序列是否为 LARGE
GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] 
      | ALL [ PRIVILEGES ] }
    ON { [ [ LARGE ] SEQUENCE ] sequence_name [, ...]
       | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] 
    [ WITH GRANT OPTION ];
  • 将数据库的访问权限赋予指定的用户或角色。
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]
      | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将客户端加密主密钥 CMK 的访问权限赋予指定的用户或角色
GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEY client_master_key [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] 
    [ WITH GRANT OPTION ];
  • 将列加密密钥 CEK 的访问权限赋予指定的用户或角色。
GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEY column_encryption_key [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] 
    [ WITH GRANT OPTION ];
  • 将外部数据源的访问权限赋予给指定的用户或角色。
GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将外部服务器的访问权限赋予给指定的用户或角色。
GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将函数的访问权限赋予给指定的用户或角色。
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | 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 { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
	ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]}
	TO { [ GROUP ] role_name | PUBLIC } [, ...]
	[ WITH GRANT OPTION ];
  • 将过程语言的访问权限赋予给指定的用户或角色。
GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将大对象的访问权限赋予指定的用户或角色。
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将模式的访问权限赋予指定的用户或角色。
GRANT { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];

说明:

将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的 USAGE 权限同时授予该用户,若没有该权限,则只能看到这些对象的名称,并不能实际进行对象访问。 同名模式下创建表的权限无法通过此语法赋予,可以通过将角色的权限赋予其他用户或角色的语法,赋予同名模式下创建表的权限。

  • 将表空间的访问权限赋予指定的用户或角色。
GRANT { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];
  • 将 Data Source 对象的权限赋予指定的角色。
GRANT { USAGE | ALL [PRIVILEGES]}
   ON DATA SOURCE src_name [, ...]
   TO { [GROUP] role_name | PUBLIC } [, ...]
   [WITH GRANT OPTION];
  • 将 Directory 对象的权限赋予指定的角色。
GRANT { { READ | WRITE | ALTER | DROP } [, ...] | ALL [PRIVILEGES] }
   ON DIRECTORY directory_name [, ...]
   TO { [GROUP] role_name | PUBLIC } [, ...]
   [WITH GRANT OPTION];
  • 将 Package 对象的权限赋予指定的角色。
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] }
   ON PACKAGE package_name [, ...]
   TO { [GROUP] role_name | PUBLIC } [, ...]
   [WITH GRANT OPTION];
  • 将角色的权限赋予其他用户或角色的语法。
GRANT role_name [, ...]
   TO role_name [, ...]
   [ WITH ADMIN OPTION ];
  • 将 SYSADMIN 权限赋予指定的角色。
GRANT ALL { PRIVILEGES | PRIVILEGE }
   TO role_name;
  • 将 ANY 权限赋予其他用户或角色的语法。
GRANT { CREATE ANY TABLE | ALTER ANY TABLE | DROP ANY TABLE | SELECT ANY TABLE | INSERT ANY TABLE | UPDATE ANY TABLE |
  DELETE ANY TABLE | CREATE ANY SEQUENCE | CREATE ANY INDEX | CREATE ANY FUNCTION | EXECUTE ANY FUNCTION |
  CREATE ANY PACKAGE | EXECUTE ANY PACKAGE | CREATE ANY TYPE | ALTER ANY TYPE | DROP ANY TYPE | ALTER ANY SEQUENCE | DROP ANY SEQUENCE |
  SELECT ANY SEQUENCE | ALTER ANY INDEX | DROP ANY INDEX | CREATE ANY SYNONYM | DROP ANY SYNONYM | CREATE ANY TRIGGER | ALTER ANY TRIGGER | DROP ANY TRIGGER
 } [, ...]
  TO [ GROUP ] role_name [, ...]
  [ WITH ADMIN OPTION ];

GRANT 的权限分类如下:

  • SELECT:允许对指定的表、视图、序列执行 SELECT 命令。在执行 UPDATEDELETE 操作时,也需要对应字段上的 SELECT 权限。

  • INSERT :允许对指定的表执行 INSERT 命令。

  • UPDATE:允许对声明的表中任意字段执行 UPDATE 命令。通常,UPDATE 命令还需要 SELECT 权限来查询出需要更新的行。SELECT … FOR UPDATESELECT … FOR NO KEY UPDATESELECT … FOR SHARESELECT … FOR KEY SHARE 除了需要 SELECT 权限外,还需要 UPDATE 权限。

  • DELETE:允许执行 DELETE 命令删除指定表中的数据。通常,DELETE 命令还需要 SELECT 权限来查询出需要删除的行。

  • TRUNCATE:允许执行 TRUNCATE 语句删除指定表中的所有记录。

  • REFERENCES:允许创建一个外键约束,必须拥有参考表和被参考表的 REFERENCES 权限。

  • TRIGGER:允许在指定的表、视图等上创建触发器。

  • CREATE

    • 对于数据库,允许在数据库里创建新的模式。
    • 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的 CREATE 权限。
    • 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。
  • CONNECT:允许用户连接到指定的数据库。

  • TEMPORARY:允许在指定的数据库中创建临时表。

  • TEMPTEMPORARY 的缩略拼写。

  • EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符。

  • USAGE

    • 对于过程语言,允许用户在创建函数的时候指定过程语言。
    • 对于模式,USAGE 允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。
    • 对于序列,USAGE 允许使用 nextval 函数。
    • 对于 Data Source 对象,USAGE 是指访问权限,也是可赋予的所有权限,即 USAGEALL PRIVILEGES 等价。
  • ALTER:允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。

  • DROP:允许用户删除指定的对象。

  • COMMENT:允许用户定义或修改指定对象的注释。

  • INDEX:允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行 REINDEXCLUSTER 操作。

  • VACUUM:允许用户对指定的表执行 ANALYZEVACUUM 操作。

  • ALL PRIVILEGES:一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行 GRANT ALL PRIVILEGES

例子:创建用户并授予系统管理员权限

omm@postgres=# CREATE USER joe IDENTIFIED BY 'Abcd1234';
CREATE ROLE

omm@postgres=# ALTER USER joe WITH SYSADMIN;
ALTER ROLE

omm@postgres=# \du joe
           List of roles
 Role name | Attributes | Member of 
-----------+------------+-----------
 joe       | Sysadmin   | {}                                                                                                                | {}

例子:撤销用户的系统管理员权限

omm@postgres=# ALTER USER joe WITH NOSYSADMIN;
ALTER ROLE

omm@postgres=# \du joe
           List of roles
 Role name | Attributes | Member of 
-----------+------------+-----------
 joe       |            | {}                                                                                                            | {}

例子:创建模式并在该模式下创建表

omm@postgres=# CREATE SCHEMA tpcds;
CREATE SCHEMA

omm@postgres=# \dn
List of schemas
 Name  | Owner 
-------+-------
 tpcds | omm
(1 row)

omm@postgres=# CREATE TABLE tpcds.reason 
(
  r_reason_sk    INTEGER      NOT NULL,
  r_reason_id    CHAR(16)     NOT NULL,
  r_reason_desc  VARCHAR(20)
);
CREATE TABLE

omm@postgres=# \dt tpcds.*
                         List of relations
 Schema |  Name  | Type  | Owner |             Storage              
--------+--------+-------+-------+----------------------------------
 tpcds  | reason | table | omm   | {orientation=row,compression=no}
(1 row)

omm@postgres=# \dp tpcds.*
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table |                   | 
(1 row)

最开始 Access privileges 字段为空,表示对象有默认权限,包括所有者的所有权限及与对象相关的 PUBLIC 权限。

例子:将模式 tpcds 的使用权限和表 tpcds.reason 的所有权限授予给用户 joe

omm@postgres=# GRANT USAGE ON SCHEMA tpcds TO joe;
GRANT

omm@postgres=# \dn+ tpcds
                           List of schemas
 Name  | Owner |  Access privileges   | Description | WithBlockChain 
-------+-------+----------------------+-------------+----------------
 tpcds | omm   | omm=UC/omm          +|             | f
       |       | joe=U/omm           +|             | 
(1 row)

omm@postgres=# GRANT ALL PRIVILEGES ON tpcds.reason TO joe;
GRANT

omm@postgres=# \dp tpcds.*
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| 
        |        |       | joe=arwdDxt/omm  +| 
        |        |       | joe=APmiv/omm     | 
(1 row)

对数据库对象执行第一个 GRANTREVOKE 语句将实例化默认权限(joe=arwdDxt/omm),然后根据语句进行修改。Column access privileges 字段只显示非默认权限。

例子:将表 tpcds.reason 中的 r_reason_skr_reason_idr_reason_desc 列的查询权限以及 r_reason_desc 列的更新权限授予给 joe

omm@postgres=# GRANT SELECT(r_reason_sk,r_reason_id,r_reason_desc),UPDATE(r_reason_desc) ON tpcds.reason TO joe;
GRANT

omm@postgres=# \dp tpcds.*
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| r_reason_sk:            +
        |        |       | joe=arwdDxt/omm  +|   joe=r/omm             +
        |        |       | joe=APmiv/omm     | r_reason_id:            +
        |        |       |                   |   joe=r/omm             +
        |        |       |                   | r_reason_desc:          +
        |        |       |                   |   joe=rw/omm
(1 row)

例子:将数据库 postgres 的连接权限授予给用户 joe,并授予其在 postgres 中创建 SCHEMA 的权限,且允许 joe 将此权限授予给其他用户

omm@postgres=# grant connect,create on database postgres to joe with grant option;
GRANT

omm@postgres=# \l
                          List of databases
   Name    | Owner | Encoding  | Collate | Ctype | Access privileges 
-----------+-------+-----------+---------+-------+-------------------
 appdb     | omm   | SQL_ASCII | C       | C     | 
 postgres  | omm   | SQL_ASCII | C       | C     | =Tc/omm          +
           |       |           |         |       | omm=CTc/omm      +
           |       |           |         |       | stone=CTc/omm    +
           |       |           |         |       | stone=APm/omm    +
           |       |           |         |       | joe=C*c*/omm
 template0 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 template1 | omm   | SQL_ASCII | C       | C     | =c/omm           +
           |       |           |         |       | omm=CTc/omm
 testdb    | omm   | SQL_ASCII | C       | C     | 
(5 rows)

其中 * 表示带有 WITH GRANT OPTION

例子:创建角色 tpcds_manager,将模式 tpcds 的访问权限授予给角色 tpcds_manager,并授予该角色在 tpcds 下创建对象的权限

omm@postgres=# create role tpcds_manager identified by 'Abcd1234';
CREATE ROLE

omm@postgres=# grant usage,create on schema tpcds to tpcds_manager;
GRANT

omm@postgres=# \dn+ tpcds
                           List of schemas
 Name  | Owner |  Access privileges   | Description | WithBlockChain 
-------+-------+----------------------+-------------+----------------
 tpcds | omm   | omm=UC/omm          +|             | f
       |       | joe=U/omm           +|             | 
       |       | tpcds_manager=UC/omm |             | 
(1 row)

例子:创建角色 manager,将 joe 的权限授予给 manager,并允许该角色将权限授予给其他人

omm@postgres=# create role manager identified by 'Abcd1234';
CREATE ROLE

omm@postgres=# grant joe to manager with admin option;
GRANT ROLE

omm@postgres=# \du manager
            List of roles
 Role name |  Attributes  | Member of 
-----------+--------------+-----------
 manager   | Cannot login | {joe}

例子:创建用户 senior_manager,将角色 manager 的权限授予该用户

omm@postgres=# create user senior_manager identified by 'Abcd1234';
CREATE ROLE

omm@postgres=# grant manager to senior_manager;
GRANT ROLE

omm@postgres=# \du senior_manager
              List of roles
   Role name    | Attributes | Member of 
----------------+------------+-----------
 senior_manager |            | {manager}

例子:将模式 tpcds 下所有表的查询权限授予给 jim,包括后续新创建的表

omm@postgres=# \dp tpcds.*
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| r_reason_sk:            +
        |        |       | joe=arwdDxt/omm  +|   joe=r/omm             +
        |        |       | joe=APmiv/omm     | r_reason_id:            +
        |        |       |                   |   joe=r/omm             +
        |        |       |                   | r_reason_desc:          +
        |        |       |                   |   joe=rw/omm
(1 row)

--授予模式的使用权限给用户
omm@postgres=# grant usage on schema tpcds to jim;
GRANT

omm@postgres=# \dn+ tpcds
                           List of schemas
 Name  | Owner |  Access privileges   | Description | WithBlockChain 
-------+-------+----------------------+-------------+----------------
 tpcds | omm   | omm=UC/omm          +|             | f
       |       | joe=U/omm           +|             | 
       |       | tpcds_manager=UC/omm+|             | 
       |       | jim=U/omm            |             | 
(1 row)

--授予模式中所有表的查询权限给用户
omm@postgres=# grant select on all tables in schema tpcds to jim;
GRANT

omm@postgres=# \dp tpcds.*
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| r_reason_sk:            +
        |        |       | joe=arwdDxt/omm  +|   joe=r/omm             +
        |        |       | joe=APmiv/omm    +| r_reason_id:            +
        |        |       | jim=r/omm         |   joe=r/omm             +
        |        |       |                   | r_reason_desc:          +
        |        |       |                   |   joe=rw/omm
(1 row)

--修改模式中的默认权限,将新建表的查询权限授予给用户
omm@postgres=# alter default privileges in schema tpcds grant select on tables to jim;
ALTER DEFAULT PRIVILEGES

omm@postgres=# \ddp
         Default access privileges
 Owner | Schema | Type  | Access privileges 
-------+--------+-------+-------------------
 omm   | tpcds  | table | jim=r/omm
(1 row)

omm@postgres=# create table tpcds.t1(id integer);
CREATE TABLE

omm@postgres=# \dp tpcds.*
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| r_reason_sk:            +
        |        |       | joe=arwdDxt/omm  +|   joe=r/omm             +
        |        |       | joe=APmiv/omm    +| r_reason_id:            +
        |        |       | jim=r/omm         |   joe=r/omm             +
        |        |       |                   | r_reason_desc:          +
        |        |       |                   |   joe=rw/omm
 tpcds  | t1     | table | omm=arwdDxt/omm  +| 
        |        |       | jim=r/omm         | 
(2 rows)

回收权限

使用 REVOKE 回收权限。

非对象所有者试图在对象上 REVOKE 权限,命令按照以下规则执行:

  • 如果授权用户没有该对象上的权限,则命令立即失败。
  • 如果授权用户有部分权限,则只撤销那些有授权选项的权限。
  • 如果授权用户没有授权选项,REVOKE ALL PRIVILEGES 形式将发出一个错误信息,而对于其他形式的命令而言,如果是命令中指定名称的权限没有相应的授权选项,该命令将发出一个警告。

语法:

  • 回收指定表或视图上权限。
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...] 
    | 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 | COMMENT } ( column_name [, ...] )}[, ...] 
    | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定序列上权限,LARGE 字段属性可选,回收语句不区分序列是否为 LARGE
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE | ALTER | DROP | COMMENT }[, ...] 
    | ALL [ PRIVILEGES ] }
     ON { [ [ LARGE ] SEQUENCE ] sequence_name [, ...]
       | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定数据库上权限。
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] 
    | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定域上权限。
REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定客户端加密主密钥上的权限。
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [PRIVILEGES] }
    ON CLIENT_MASTER_KEYS client_master_keys_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定列加密密钥上的权限。
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [PRIVILEGES]}
    ON COLUMN_ENCRYPTION_KEYS column_encryption_keys_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定目录上权限。
REVOKE [ GRANT OPTION FOR ]
    { { READ | WRITE | ALTER |DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON DIRECTORY directory_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定外部数据源上权限。
REVOKE [ GRANT OPTION FOR ]
   { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定外部服务器上权限。
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定函数上权限。
REVOKE [ GRANT OPTION FOR ]
    { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | 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 ]
    { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
       | ALL PROCEDURE IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定过程语言上权限。
REVOKE [ GRANT OPTION FOR ]
   { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_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 | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定表空间上权限。
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收指定类型上权限。
REVOKE [ GRANT OPTION FOR ]
   { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];
  • 回收 Data Source 对象上的权限。
REVOKE [ GRANT OPTION FOR ]
   { USAGE | ALL [PRIVILEGES] }
    ON DATA SOURCE src_name [, ...]
    FROM {[GROUP] role_name | PUBLIC} [, ...]
   [ CASCADE | RESTRICT ];
  • 回收 Package 对象的权限。
REVOKE [ GRANT OPTION FOR ]
   { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] }
   ON PACKAGE package_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;
  • 回收 ANY 权限。
REVOKE [ ADMIN OPTION FOR ]
  { CREATE ANY TABLE | ALTER ANY TABLE | DROP ANY TABLE | SELECT ANY TABLE | INSERT ANY TABLE | UPDATE ANY TABLE |
  DELETE ANY TABLE | CREATE ANY SEQUENCE | CREATE ANY INDEX | CREATE ANY FUNCTION | EXECUTE ANY FUNCTION |
  CREATE ANY PACKAGE | EXECUTE ANY PACKAGE | CREATE ANY TYPE | ALTER ANY TYPE | DROP ANY TYPE | ALTER ANY SEQUENCE | DROP ANY SEQUENCE |
  SELECT ANY SEQUENCE | ALTER ANY INDEX | DROP ANY INDEX | CREATE ANY SYNONYM | DROP ANY SYNONYM | CREATE ANY TRIGGER | ALTER ANY TRIGGER |  DROP ANY TRIGGER 
} [, ...]
  FROM [ GROUP ] role_name [, ...];

参数说明:

  • 关键字 PUBLIC 表示一个隐式定义的拥有所有角色的组。
  • 权限类别和参数说明,请参见 GRANT 的参数说明。
  • 任何特定角色拥有的权限包括直接授予该角色的权限、从该角色作为其成员的角色中得到的权限以及授予给 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,否则可能导致删除了不想删除的权限,或者是任何权限都没有删除。

例子:回收权限

omm@postgres=# \dp tpcds.reason
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| r_reason_sk:            +
        |        |       | joe=arwdDxt/omm  +|   joe=r/omm             +
        |        |       | joe=APmiv/omm    +| r_reason_id:            +
        |        |       | jim=r/omm         |   joe=r/omm             +
        |        |       |                   | r_reason_desc:          +
        |        |       |                   |   joe=rw/omm
(1 row)

omm@postgres=# revoke all privileges on tpcds.reason from joe;
REVOKE

omm@postgres=# \dp tpcds.reason
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 tpcds  | reason | table | omm=arwdDxt/omm  +| 
        |        |       | jim=r/omm         | 
(1 row)

omm@postgres=# \dn+ tpcds
                           List of schemas
 Name  | Owner |  Access privileges   | Description | WithBlockChain 
-------+-------+----------------------+-------------+----------------
 tpcds | omm   | omm=UC/omm          +|             | f
       |       | joe=U/omm           +|             | 
       |       | tpcds_manager=UC/omm+|             | 
       |       | jim=U/omm            |             | 
(1 row)

omm@postgres=# revoke all privileges on schema tpcds from joe;
REVOKE

omm@postgres=# \dn+ tpcds
                           List of schemas
 Name  | Owner |  Access privileges   | Description | WithBlockChain 
-------+-------+----------------------+-------------+----------------
 tpcds | omm   | omm=UC/omm          +|             | f
       |       | tpcds_manager=UC/omm+|             | 
       |       | jim=U/omm            |             | 
(1 row)

omm@postgres=# revoke usage,create on schema tpcds from tpcds_manager;
REVOKE

omm@postgres=# \dn+ tpcds 
                         List of schemas
 Name  | Owner | Access privileges | Description | WithBlockChain 
-------+-------+-------------------+-------------+----------------
 tpcds | omm   | omm=UC/omm       +|             | f
       |       | jim=U/omm         |             | 
(1 row)

例子:回收角色

omm@postgres=# \du manager
            List of roles
 Role name |  Attributes  | Member of 
-----------+--------------+-----------
 manager   | Cannot login | {joe}

omm@postgres=# revoke joe from manager;
REVOKE ROLE

omm@postgres=# \du manager
            List of roles
 Role name |  Attributes  | Member of 
-----------+--------------+-----------
 manager   | Cannot login | {}
 
 omm@postgres=# \du senior_manager
              List of roles
   Role name    | Attributes | Member of 
----------------+------------+-----------
 senior_manager |            | {manager}

omm@postgres=# revoke manager from senior_manager;
REVOKE ROLE

omm@postgres=# \du senior_manager;
              List of roles
   Role name    | Attributes | Member of 
----------------+------------+-----------
 senior_manager |            | {}

默认权限

使用 ALTER DEFAULT PRIVILEGES 修改默认权限,表示应用于将来创建的对象的权限。

语法:

ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke;

where abbreviated_grant_or_revoke can be:
grant_on_tables_clause
  | grant_on_sequences_clause
  | grant_on_functions_clause
  | grant_on_types_clause
  | grant_on_client_master_keys_clause
  | grant_on_column_encryption_keys_clause
  | revoke_on_tables_clause
  | revoke_on_sequences_clause
  | revoke_on_functions_clause
  | revoke_on_types_clause
  | revoke_on_client_master_keys_clause
  | revoke_on_column_encryption_keys_clause
where grant_on_tables_clause can be:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES |
    ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]
where grant_on_sequences_clause can be:
GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]
where grant_on_functions_clause can be:
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FUNCTIONS
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]
where grant_on_types_clause can be:
GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPES
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]
where grant_on_client_master_keys_clause can be:
GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEYS
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]
where grant_on_column_encryption_keys_clause can be:
GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEYS
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]
where revoke_on_tables_clause can be:
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES |
    ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
where revoke_on_sequences_clause can be:
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
where revoke_on_functions_clause can be:
REVOKE [ GRANT OPTION FOR ]
    { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FUNCTIONS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
where revoke_on_types_clause can be:
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
where revoke_on_client_master_keys_clause can be:
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEYS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
where revoke_on_column_encryption_keys_clause can be:
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEYS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

使用 ALTER DEFAULT PRIVILEGES 为将来创建的对象设置权限,不会影响现有的对象。目前只支持表(包括视图)、序列、函数、类型、密态数据库客户端主密钥和列加密密钥的权限更改。

例子:使用 ALTER DEFAULT PRIVILEGES 将某个模式下表的查询权限授予给某个只读用户,即使后续在该模式下增加表,也不需要再次进行授权了。

例子:授予默认权限及回收默认权限

omm@postgres=# \ddp
         Default access privileges
 Owner | Schema | Type  | Access privileges 
-------+--------+-------+-------------------
 omm   | tpcds  | table | jim=r/omm
(1 row)

omm@postgres=# alter default privileges in schema stone grant select on tables to jim;
ALTER DEFAULT PRIVILEGES

omm@postgres=# \ddp
         Default access privileges
 Owner | Schema | Type  | Access privileges 
-------+--------+-------+-------------------
 omm   | stone  | table | jim=r/omm
 omm   | tpcds  | table | jim=r/omm
(2 rows)

omm@postgres=# alter default privileges in schema stone revoke select on tables from jim;
ALTER DEFAULT PRIVILEGES

omm@postgres=# \ddp
         Default access privileges
 Owner | Schema | Type  | Access privileges 
-------+--------+-------+-------------------
 omm   | tpcds  | table | jim=r/omm
(1 row)

权限函数

通过使用权限函数可以查询用户是否具有某对象上的某种对象权限。

权限函数有:

函数名称描述返回类型
has_any_column_privilege(user, table, privilege)指定用户是否有访问表任何列的权限。Boolean
has_any_column_privilege(table, privilege)当前用户是否有访问表任何列的权限。Boolean
has_column_privilege(user, table, column, privilege)指定用户是否有访问列的权限。Boolean
has_column_privilege(table, column, privilege)当前用户是否有访问列的权限。Boolean
has_cek_privilege(user, cek, privilege)指定用户是否有访问列加密密钥 CEK 的权限。权限范围:USAGE、DROPBoolean
has_cmk_privilege(user, cmk, privilege)指定用户是否有访问客户端加密主密钥 CMK 的权限。权限:USAGE、DROPBoolean
has_database_privilege(user, database, privilege)指定用户是否有访问数据库的权限。Boolean
has_database_privilege(database, privilege)当前用户是否有访问数据库的权限。Boolean
has_database_privilege(database, privilege)指定用户是否有访问 Directory 的权限。Boolean
has_foreign_data_wrapper_privilege(fdw, privilege)当前用户是否有访问外部数据封装器的权限。权限类型必须是 USAGE。Boolean
has_function_privilege(user, function, privilege)指定用户是否有访问函数的权限。Boolean
has_function_privilege(function, privilege)当前用户是否有访问函数的权限。Boolean
has_language_privilege(user, language, privilege)指定用户是否有访问语言的权限。Boolean
has_language_privilege(language, privilege)当前用户是否有访问语言的权限。Boolean
has_nodegroup_privilege(user, nodegroup, privilege)检查用户是否有数据库节点访问权限。Boolean
has_nodegroup_privilege(nodegroup, privilege)当前用户是否有数据库节点访问权限。访问权限类型必须是 USAGE、CREATE、COMPUTE、ALTER 或 DROP。Boolean
has_schema_privilege(user, schema, privilege)指定用户是否有访问模式的权限。Boolean
has_schema_privilege(schema, privilege)当前用户是否有访问模式的权限。Boolean
has_server_privilege(user, server, privilege)指定用户是否有访问外部服务的权限。Boolean
has_server_privilege(server, privilege)当前用户是否有访问外部服务的权限。Boolean
has_table_privilege(user, table, privilege)指定用户是否有访问表的权限。Boolean
has_tablespace_privilege(user, tablespace, privilege)指定用户是否有访问表空间的权限。Boolean
has_tablespace_privilege(tablespace, privilege)当前用户是否有访问表空间的权限。Boolean
pg_has_role(user, role, privilege)指定用户是否有角色的权限。Boolean
pg_has_role(role, privilege)当前用户是否有角色的权限。权限类型必须是 MEMBER 或 USAGE 的一些组合。Boolean
has_any_privilege(user, privilege)指定用户是否有某项 ANY 权限,若同时查询多个,只要有其中一个则返回 TRUE。Boolean

注意:

  • has_any_column_privilege 检查用户是否以特定方式访问表的任何列。其参数可能与 has_table_privilege 类似,除了访问权限类型必须是 SELECTINSERTUPDATECOMMENTREFERENCES 的一些组合。

  • 拥有表的表级别权限则隐含的拥有该表每列的列级权限,因此如果与 has_table_privilege 参数相同,has_any_column_privilege 总是返回 true。但是如果授予至少一列的列级权限也返回成功。

  • has_column_privilege 检查用户是否以特定方式访问一列。其参数类似于 has_table_privilege,可以通过列名或属性号添加列。想要的访问权限类型必须是 SELECTINSERTUPDATECOMMENTREFERENCES 的一些组合。

  • has_database_privilege 检查用户是否能以特定方式访问数据库。其参数类似 has_table_privilege。访问权限类型必须是 CREATECONNECTTEMPORARYALTERDROPCOMMENTTEMP(等价于 TEMPORARY)的一些组合。

  • has_function_privilege 检查一个用户是否能以指定方式访问一个函数。访问权限类型必须是 EXECUTEALTERDROPCOMMENT

  • has_language_privilege 检查用户是否能以特定方式访问一个过程语言。访问权限类型必须是 USAGE

  • has_schema_privilege 检查用户是否能以特定方式访问模式。类似 has_table_privilege。权限类型必须是 CREATEUSAGEALTERDROPCOMMENT 的一些组合。

  • has_server_privilege 检查用户是否能以指定方式访问一个外部服务器。类似 has_table_privilege。权限类型必须是 USAGEALTERDROPCOMMENT 之一的值。

  • has_tablespace_privilege 检查用户是否能以特定方式访问一个表空间。类似 has_table_privilege。权限类型必须是 CREATEALTERDROPCOMMENT 之一的值。

例子:查看用户是否有访问表的权限

omm@postgres=# select has_table_privilege('tpcds.reason','select');
 has_table_privilege 
---------------------
 t
(1 row)

omm@postgres=# select has_table_privilege('omm','tpcds.reason','select,insert with grant option');
 has_table_privilege 
---------------------
 t
(1 row)
  • 用户可以通过名称或 OID(pg_authid.oid)来指定,public 表明 PUBLIC 伪角色,或如果缺省该参数,则使用 current_user
  • 该表可以通过名称或者 OID 声明。如果用名称声明,则在必要时可以用模式进行修饰。如果使用文本字符串来声明所希望的权限类型,这个文本字符串必须是 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERALTERDROPCOMMENTINDEXVACUUM之一的值。
  • 可以给权限类型添加 WITH GRANT OPTION,用来测试权限是否拥有授权选项。也可以用逗号分隔列出的多个权限类型,如果拥有任何所列出的权限,则结果便为 true

数据字典

系统表和视图

  • 系统表是 openGauss 存放结构元数据的地方,它是 openGauss 数据库系统运行控制信息的来源,是数据库系统的核心组成部分。
  • 系统视图提供了查询系统表和访问数据库内部状态的方法。
  • 系统表和系统视图要么只对管理员可见,要么对所有用户可见。
  • 用户可以删除后重新创建这些表、增加列、插入和更新数值,但是用户修改系统表会导致系统信息的不一致,从而导致系统控制紊乱。正常情况下不应该由用户手工修改系统表或系统视图,或者手工重命名系统表或系统视图所在的模式,而是由 SQL 语句关联的系统表操作自动维护系统表信息。
    • 不建议用户修改系统表和系统视图的权限。
    • 用户应该禁止对系统表进行增删改等操作,人为对系统表的修改或破坏可能会导致系统各种异常情况甚至 openGauss 不可用。
  • 继承自 PG 的系统表和视图,这类系统表和视图具有 PG 前缀。
  • openGauss 新增的系统表和视图,这类系统表和视图具有 GS 前缀。

例子:通过元命令查看以 pg_ 开头和以 gs_ 开头的系统表

omm@postgres=# \dt pg_*
                          List of relations
   Schema   |             Name             | Type  | Owner | Storage 
------------+------------------------------+-------+-------+---------
 pg_catalog | pg_aggregate                 | table | omm   | 
 pg_catalog | pg_am                        | table | omm   | 
 pg_catalog | pg_amop                      | table | omm   | 
 pg_catalog | pg_amproc                    | table | omm   | 
 pg_catalog | pg_app_workloadgroup_mapping | table | omm   | 
 pg_catalog | pg_attrdef                   | table | omm   | 
 pg_catalog | pg_attribute                 | table | omm   | 
 pg_catalog | pg_auth_history              | table | omm   | 
 pg_catalog | pg_auth_members              | table | omm   | 
 pg_catalog | pg_authid                    | table | omm   | 
 pg_catalog | pg_cast                      | table | omm   | 
 pg_catalog | pg_class                     | table | omm   | 
 pg_catalog | pg_collation                 | table | omm   | 
 pg_catalog | pg_constraint                | table | omm   | 
 pg_catalog | pg_conversion                | table | omm   | 
 pg_catalog | pg_database                  | table | omm   | 
 pg_catalog | pg_db_role_setting           | table | omm   | 
 pg_catalog | pg_default_acl               | table | omm   | 
 pg_catalog | pg_depend                    | table | omm   | 
 pg_catalog | pg_description               | table | omm   | 
 pg_catalog | pg_directory                 | table | omm   | 
 pg_catalog | pg_enum                      | table | omm   | 
 pg_catalog | pg_event_trigger             | table | omm   | 
 pg_catalog | pg_extension                 | table | omm   | 
 pg_catalog | pg_extension_data_source     | table | omm   | 
 pg_catalog | pg_foreign_data_wrapper      | table | omm   | 
 pg_catalog | pg_foreign_server            | table | omm   | 
 pg_catalog | pg_foreign_table             | table | omm   | 
 pg_catalog | pg_hashbucket                | table | omm   | 
 pg_catalog | pg_index                     | table | omm   | 
 pg_catalog | pg_inherits                  | table | omm   | 
 pg_catalog | pg_job                       | table | omm   | 
 pg_catalog | pg_job_proc                  | table | omm   | 
 pg_catalog | pg_language                  | table | omm   | 
 pg_catalog | pg_largeobject               | table | omm   | 
 pg_catalog | pg_largeobject_metadata      | table | omm   | 
 pg_catalog | pg_namespace                 | table | omm   | 
 pg_catalog | pg_object                    | table | omm   | 
 pg_catalog | pg_obsscaninfo               | table | omm   | 
 pg_catalog | pg_opclass                   | table | omm   | 
 pg_catalog | pg_operator                  | table | omm   | 
 pg_catalog | pg_opfamily                  | table | omm   | 
 pg_catalog | pg_partition                 | table | omm   | 
 pg_catalog | pg_pltemplate                | table | omm   | 
 pg_catalog | pg_proc                      | table | omm   | 
 pg_catalog | pg_proc_ext                  | table | omm   | 
 pg_catalog | pg_publication               | table | omm   | 
 pg_catalog | pg_publication_rel           | table | omm   | 
 pg_catalog | pg_range                     | table | omm   | 
 pg_catalog | pg_replication_origin        | table | omm   | 
 pg_catalog | pg_resource_pool             | table | omm   | 
 pg_catalog | pg_rewrite                   | table | omm   | 
 pg_catalog | pg_rlspolicy                 | table | omm   | 
 pg_catalog | pg_seclabel                  | table | omm   | 
 pg_catalog | pg_set                       | table | omm   | 
 pg_catalog | pg_shdepend                  | table | omm   | 
 pg_catalog | pg_shdescription             | table | omm   | 
 pg_catalog | pg_shseclabel                | table | omm   | 
 pg_catalog | pg_statistic                 | table | omm   | 
 pg_catalog | pg_statistic_ext             | table | omm   | 
 pg_catalog | pg_subscription              | table | omm   | 
 pg_catalog | pg_subscription_rel          | table | omm   | 
 pg_catalog | pg_synonym                   | table | omm   | 
 pg_catalog | pg_tablespace                | table | omm   | 
 pg_catalog | pg_trigger                   | table | omm   | 
 pg_catalog | pg_ts_config                 | table | omm   | 
 pg_catalog | pg_ts_config_map             | table | omm   | 
 pg_catalog | pg_ts_dict                   | table | omm   | 
 pg_catalog | pg_ts_parser                 | table | omm   | 
 pg_catalog | pg_ts_template               | table | omm   | 
 pg_catalog | pg_type                      | table | omm   | 
 pg_catalog | pg_user_mapping              | table | omm   | 
 pg_catalog | pg_user_status               | table | omm   | 
 pg_catalog | pg_workload_group            | table | omm   | 
(74 rows)

omm@postgres=# \dt gs_*
                                       List of relations
   Schema   |             Name              | Type  | Owner |             Storage              
------------+-------------------------------+-------+-------+----------------------------------
 pg_catalog | gs_asp                        | table | omm   | 
 pg_catalog | gs_auditing_policy            | table | omm   | 
 pg_catalog | gs_auditing_policy_access     | table | omm   | 
 pg_catalog | gs_auditing_policy_filters    | table | omm   | 
 pg_catalog | gs_auditing_policy_privileges | table | omm   | 
 pg_catalog | gs_client_global_keys         | table | omm   | 
 pg_catalog | gs_client_global_keys_args    | table | omm   | 
 pg_catalog | gs_column_keys                | table | omm   | 
 pg_catalog | gs_column_keys_args           | table | omm   | 
 pg_catalog | gs_db_privilege               | table | omm   | 
 pg_catalog | gs_dependencies               | table | omm   | 
 pg_catalog | gs_dependencies_obj           | table | omm   | 
 pg_catalog | gs_encrypted_columns          | table | omm   | 
 pg_catalog | gs_encrypted_proc             | table | omm   | 
 pg_catalog | gs_global_chain               | table | omm   | 
 pg_catalog | gs_global_config              | table | omm   | 
 pg_catalog | gs_job_argument               | table | omm   | 
 pg_catalog | gs_job_attribute              | table | omm   | 
 pg_catalog | gs_masking_policy             | table | omm   | 
 pg_catalog | gs_masking_policy_actions     | table | omm   | 
 pg_catalog | gs_masking_policy_filters     | table | omm   | 
 pg_catalog | gs_matview                    | table | omm   | 
 pg_catalog | gs_matview_dependency         | table | omm   | 
 pg_catalog | gs_model_warehouse            | table | omm   | 
 pg_catalog | gs_obsscaninfo                | table | omm   | 
 pg_catalog | gs_opt_model                  | table | omm   | 
 pg_catalog | gs_package                    | table | omm   | 
 pg_catalog | gs_policy_label               | table | omm   | 
 pg_catalog | gs_recyclebin                 | table | omm   | 
 pg_catalog | gs_sql_patch                  | table | omm   | 
 pg_catalog | gs_txn_snapshot               | table | omm   | 
 pg_catalog | gs_uid                        | table | omm   | 
 pg_catalog | gs_wlm_ec_operator_info       | table | omm   | {orientation=row,compression=no}
 pg_catalog | gs_wlm_instance_history       | table | omm   | {orientation=row,compression=no}
 pg_catalog | gs_wlm_operator_info          | table | omm   | {orientation=row,compression=no}
 pg_catalog | gs_wlm_plan_encoding_table    | table | omm   | {orientation=row,compression=no}
 pg_catalog | gs_wlm_plan_operator_info     | table | omm   | {orientation=row,compression=no}
 pg_catalog | gs_wlm_session_query_info_all | table | omm   | {orientation=row,compression=no}
 pg_catalog | gs_wlm_user_resource_history  | table | omm   | {orientation=row,compression=no}
(39 rows)

例子:通过元命令查看以 pg_ 开头和以 gs_ 开头的系统视图

omm@postgres=# \dv pg_*
                                   List of relations
   Schema   |              Name               | Type | Owner |         Storage         
------------+---------------------------------+------+-------+-------------------------
 pg_catalog | pg_available_extension_versions | view | omm   | 
 pg_catalog | pg_available_extensions         | view | omm   | 
 pg_catalog | pg_comm_delay                   | view | omm   | 
 pg_catalog | pg_comm_recv_stream             | view | omm   | 
 pg_catalog | pg_comm_send_stream             | view | omm   | 
 pg_catalog | pg_comm_status                  | view | omm   | 
 pg_catalog | pg_control_group_config         | view | omm   | 
 pg_catalog | pg_cursors                      | view | omm   | 
 pg_catalog | pg_ext_stats                    | view | omm   | 
 pg_catalog | pg_get_invalid_backends         | view | omm   | 
 pg_catalog | pg_get_senders_catchup_time     | view | omm   | 
 pg_catalog | pg_group                        | view | omm   | 
 pg_catalog | pg_gtt_attached_pids            | view | omm   | {security_barrier=true}
 pg_catalog | pg_gtt_relstats                 | view | omm   | {security_barrier=true}
 pg_catalog | pg_gtt_stats                    | view | omm   | {security_barrier=true}
 pg_catalog | pg_indexes                      | view | omm   | 
 pg_catalog | pg_locks                        | view | omm   | 
 pg_catalog | pg_node_env                     | view | omm   | 
 pg_catalog | pg_os_threads                   | view | omm   | 
 pg_catalog | pg_prepared_statements          | view | omm   | 
 pg_catalog | pg_prepared_xacts               | view | omm   | 
 pg_catalog | pg_publication_tables           | view | omm   | 
 pg_catalog | pg_replication_origin_status    | view | omm   | 
 pg_catalog | pg_replication_slots            | view | omm   | 
 pg_catalog | pg_rlspolicies                  | view | omm   | 
 pg_catalog | pg_roles                        | view | omm   | 
 pg_catalog | pg_rules                        | view | omm   | 
 pg_catalog | pg_running_xacts                | view | omm   | 
 pg_catalog | pg_seclabels                    | view | omm   | 
 pg_catalog | pg_session_iostat               | view | omm   | 
 pg_catalog | pg_session_wlmstat              | view | omm   | 
 pg_catalog | pg_settings                     | view | omm   | 
 pg_catalog | pg_shadow                       | view | omm   | 
 pg_catalog | pg_stat_activity                | view | omm   | 
 pg_catalog | pg_stat_activity_ng             | view | omm   | 
 pg_catalog | pg_stat_all_indexes             | view | omm   | 
 pg_catalog | pg_stat_all_tables              | view | omm   | 
 pg_catalog | pg_stat_bad_block               | view | omm   | 
 pg_catalog | pg_stat_bgwriter                | view | omm   | 
 pg_catalog | pg_stat_database                | view | omm   | 
 pg_catalog | pg_stat_database_conflicts      | view | omm   | 
 pg_catalog | pg_stat_replication             | view | omm   | 
 pg_catalog | pg_stat_subscription            | view | omm   | 
 pg_catalog | pg_stat_sys_indexes             | view | omm   | 
 pg_catalog | pg_stat_sys_tables              | view | omm   | 
 pg_catalog | pg_stat_user_functions          | view | omm   | 
 pg_catalog | pg_stat_user_indexes            | view | omm   | 
 pg_catalog | pg_stat_user_tables             | view | omm   | 
 pg_catalog | pg_stat_xact_all_tables         | view | omm   | 
 pg_catalog | pg_stat_xact_sys_tables         | view | omm   | 
 pg_catalog | pg_stat_xact_user_functions     | view | omm   | 
 pg_catalog | pg_stat_xact_user_tables        | view | omm   | 
 pg_catalog | pg_statio_all_indexes           | view | omm   | 
 pg_catalog | pg_statio_all_sequences         | view | omm   | 
 pg_catalog | pg_statio_all_tables            | view | omm   | 
 pg_catalog | pg_statio_sys_indexes           | view | omm   | 
 pg_catalog | pg_statio_sys_sequences         | view | omm   | 
 pg_catalog | pg_statio_sys_tables            | view | omm   | 
 pg_catalog | pg_statio_user_indexes          | view | omm   | 
 pg_catalog | pg_statio_user_sequences        | view | omm   | 
 pg_catalog | pg_statio_user_tables           | view | omm   | 
 pg_catalog | pg_stats                        | view | omm   | 
 pg_catalog | pg_tables                       | view | omm   | 
 pg_catalog | pg_tde_info                     | view | omm   | 
 pg_catalog | pg_thread_wait_status           | view | omm   | 
 pg_catalog | pg_timezone_abbrevs             | view | omm   | 
 pg_catalog | pg_timezone_names               | view | omm   | 
 pg_catalog | pg_total_memory_detail          | view | omm   | 
 pg_catalog | pg_total_user_resource_info     | view | omm   | 
 pg_catalog | pg_total_user_resource_info_oid | view | omm   | 
 pg_catalog | pg_user                         | view | omm   | 
 pg_catalog | pg_user_mappings                | view | omm   | 
 pg_catalog | pg_variable_info                | view | omm   | 
 pg_catalog | pg_views                        | view | omm   | 
 pg_catalog | pg_wlm_statistics               | view | omm   | 
(75 rows)

omm@postgres=# \dv gs_*
                            List of relations
   Schema   |               Name                | Type | Owner | Storage 
------------+-----------------------------------+------+-------+---------
 pg_catalog | gs_all_control_group_info         | view | omm   | 
 pg_catalog | gs_auditing                       | view | omm   | 
 pg_catalog | gs_auditing_access                | view | omm   | 
 pg_catalog | gs_auditing_privilege             | view | omm   | 
 pg_catalog | gs_cluster_resource_info          | view | omm   | 
 pg_catalog | gs_comm_proxy_thread_status       | view | omm   | 
 pg_catalog | gs_db_privileges                  | view | omm   | 
 pg_catalog | gs_file_stat                      | view | omm   | 
 pg_catalog | gs_get_control_group_info         | view | omm   | 
 pg_catalog | gs_gsc_memory_detail              | view | omm   | 
 pg_catalog | gs_instance_time                  | view | omm   | 
 pg_catalog | gs_labels                         | view | omm   | 
 pg_catalog | gs_lsc_memory_detail              | view | omm   | 
 pg_catalog | gs_masking                        | view | omm   | 
 pg_catalog | gs_matviews                       | view | omm   | 
 pg_catalog | gs_os_run_info                    | view | omm   | 
 pg_catalog | gs_redo_stat                      | view | omm   | 
 pg_catalog | gs_session_cpu_statistics         | view | omm   | 
 pg_catalog | gs_session_memory                 | view | omm   | 
 pg_catalog | gs_session_memory_context         | view | omm   | 
 pg_catalog | gs_session_memory_detail          | view | omm   | 
 pg_catalog | gs_session_memory_statistics      | view | omm   | 
 pg_catalog | gs_session_stat                   | view | omm   | 
 pg_catalog | gs_session_time                   | view | omm   | 
 pg_catalog | gs_shared_memory_detail           | view | omm   | 
 pg_catalog | gs_sql_count                      | view | omm   | 
 pg_catalog | gs_stat_session_cu                | view | omm   | 
 pg_catalog | gs_thread_memory_context          | view | omm   | 
 pg_catalog | gs_total_memory_detail            | view | omm   | 
 pg_catalog | gs_total_nodegroup_memory_detail  | view | omm   | 
 pg_catalog | gs_wlm_cgroup_info                | view | omm   | 
 pg_catalog | gs_wlm_ec_operator_history        | view | omm   | 
 pg_catalog | gs_wlm_ec_operator_statistics     | view | omm   | 
 pg_catalog | gs_wlm_operator_history           | view | omm   | 
 pg_catalog | gs_wlm_operator_statistics        | view | omm   | 
 pg_catalog | gs_wlm_plan_operator_history      | view | omm   | 
 pg_catalog | gs_wlm_rebuild_user_resource_pool | view | omm   | 
 pg_catalog | gs_wlm_resource_pool              | view | omm   | 
 pg_catalog | gs_wlm_session_history            | view | omm   | 
 pg_catalog | gs_wlm_session_info               | view | omm   | 
 pg_catalog | gs_wlm_session_info_all           | view | omm   | 
 pg_catalog | gs_wlm_session_statistics         | view | omm   | 
 pg_catalog | gs_wlm_user_info                  | view | omm   | 
 pg_catalog | gs_wlm_workload_records           | view | omm   | 
(44 rows)

常用系统表和系统视图说明:

系统表名简述
GS_WLM_USER_RESOURCE_HISTORY存储与用户使用资源相关的信息,仅在 CN 上有效。该系统表的每条记录都是对应时间点某用户的资源使用情况,包括:内存、CPU 核数、存储空间、临时空间、算子落盘空间、逻辑 IO 流量、逻辑 IO 次数和逻辑 IO 速率信息。其中,内存、CPU、IO 相关监控项仅记录用户复杂作业的资源使用情况。对于 IO 相关监控项,当参数 enable_logical_io_statisticson 时才有效;当参数 enable_user_metric_persistenton 时,才会开启用户监控数据保存功能。
PG_AM存储有关索引访问方法的信息。系统支持的每种索引访问方法都有一行。
PG_ATTRIBUTE存储关于表字段的信息。
PG_AUTHID存储有关数据库认证标识符(角色)的信息。角色把“用户”的概念包含在内。一个用户实际上就是一个 rolcanlogin 标志被设置的角色。任何角色(不管 rolcanlogin 设置与否)都能够把其他角色作为成员。在一个集群中只有一份 PG_AUTHID,不是每个数据库有一份。需要有系统管理员权限才可以访问此系统表。
PG_CLASS存储数据库对象信息及其之间的关系。
PG_CONSTRAINT存储表上的检查约束、主键、唯一约束和外键约束。
PG_DEPEND记录数据库对象之间的依赖关系。这个信息允许 DROP 命令找出哪些其它对象必须由 DROP CASCADE 删除,或者是在 DROP RESTRICT 的情况下避免删除。
PG_DATABASE存储关于可用数据库的信息。
PG_FOREIGN_TABLE存储外部表的辅助信息。
PG_INDEX存储索引的一部分信息,其他的信息大多数在 PG_CLASS 中。
PG_JOB存储用户创建的定时任务的任务详细信息,定时任务线程定时轮询 PG_JOB 系统表中的时间,当任务到期会触发任务的执行,并更新 PG_JOB 表中的任务状态。该系统表属于 Shared Relation,所有创建的 JOB 记录对所有数据库可见。
PG_LARGEOBJECT保存那些标记着“大对象”的数据。一个大对象是使用其创建时分配的 OID 标识的。每个大对象都分解成足够小的小段或者“页面”以便以行的形式存储在 PG_LARGEOBJECT 里。每页的数据定义为 LOBLKSIZE。需要有系统管理员权限才可以访问此系统表。
PG_LARGEOBJECT_METADATA存储与大数据相关的元数据。实际的大对象数据存储在 PG_LARGEOBJECT 里。
PG_NAMESPACE存储名字空间,即存储 SCHEMA 相关的信息。
PG_PARTITION存储数据库内所有分区表(Partitioned Table)、分区(Table Partition)、分区上 TOAST 表和分区索引(Index Partition)四类对象的信息。分区表索引(Partitioned Index)的信息不在 PG_PARTITION 系统表中保存。
PG_PROC存储函数或过程的信息。
GS_AUDITING显示对数据库相关操作的所有审计信息。需要有系统管理员或安全策略管理员权限才可以访问视图。
GS_FILE_STAT通过对数据文件 IO 的统计,反映数据的 IO 性能,用以发现 IO 操作异常等性能问题。
GS_CLUSTER_RESOURCE_INFO显示所有 DN 资源的汇总信息。该视图需要设置 enable_dynamic_workload=on 才能查询,并且该视图不支持在 DN 执行。查询该视图需要 SYSADMIN 权限。
GS_LABELS显示所有已配置的资源标签信息。需要有系统管理员或安全策略管理员权限才可以访问此视图。
GS_MASKING显示所有已配置的动态脱敏策略信息。需要有系统管理员或安全策略管理员权限才可以访问视图。
GS_MATVIEWS提供了关于数据库中每一个物化视图的信息。
GS_SQL_COUNT显示数据库当前节点当前时刻执行的五类语句(SELECT、INSERT、UPDATE、DELETE、MERGE INTO)统计信息。
GS_SESSION_TIME用于统计会话线程的运行时间信息,及各执行阶段所消耗时间。
GS_SESSION_MEMORY统计 Session 级别的内存使用情况,包含执行作业在数据节点上 Postgres 线程和 Stream 线程分配的所有内存。
GS_WLM_PLAN_OPERATOR_HISTORY显示的是当前用户数据库主节点上执行作业结束后的执行计划算子级的相关记录。
PG_LOCKS存储各打开事务所持有的锁信息。
PG_ROLES提供访问数据库角色的相关信息,初始化用户和具有 SYSADMIN 属性或 CREATEROLE 属性的用户可以查看全部角色的信息,其他用户只能查看自己的信息。
PG_RULES提供对查询重写规则的有用信息访问的接口。
PG_TOTAL_USER_RESOURCE_INFO_OID显示所有用户资源使用情况,需要使用管理员用户进行查询。此视图在参数 use_workload_manageron 时才有效。
PG_SETTINGS显示数据库运行时参数的相关信息。
PG_STATS提供对存储在 PG_STATISTIC 表里面的单列统计信息的访问。
PG_STAT_ACTIVITY显示和当前用户查询相关的信息。
PG_STAT_ALL_TABLES将包含当前数据库中每个表的一行(包括 TOAST 表),显示访问特定表的统计信息。
PG_TABLES提供了对数据库中每个表访问的有用信息。
PG_TOTAL_USER_RESOURCE_INFO显示所有用户资源使用情况,需要使用管理员用户进行查询。此视图在参数 use_workload_manageron 时才有效。
PG_USER提供了访问数据库用户的信息,默认只有初始化用户和具有 SYSADMIN 属性的用户可以查看,其余用户需要赋权后才可以查看。
PG_VIEWS提供访问数据库中每个视图的有用信息。
PLAN_TABLE显示用户通过执行 EXPLAIN PLAN 收集到的计划信息。计划信息的生命周期是 SESSION 级别,SESSION 退出后相应的数据将被清除。同时不同 SESSION 和不同 USER 间的数据是相互隔离的。

例子:在 pg_tables 系统视图中查看 public 模式中包含的所有表

omm@postgres=# select distinct(tablename) from pg_tables where schemaname='public';
 tablename 
-----------
(0 rows)

例子:在 pg_user 系统视图中查看数据库的用户

omm@postgres=# select usename,usecreatedb,usesuper from pg_user;
    usename     | usecreatedb | usesuper 
----------------+-------------+----------
 omm            | t           | t
 stone          | f           | f
 test           | f           | f
 hr             | f           | f
 joe            | f           | f
 dim            | t           | f
 jim            | f           | f
 miriam         | f           | f
 senior_manager | f           | f
(9 rows)

例子:通过视图 PG_STAT_ACTIVITY 可以查看正在运行的查询语句。需要先设置参数 track_activitieson,数据库系统才会收集当前活动查询的运行信息。

omm@postgres=# set track_activities=on;
SET

查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的 PID。如果 state 字段显示为 idle,则表明此连接处于空闲,等待用户输入命令。

omm@postgres=# select datname,pid,sessionid,usename,application_name,client_addr,client_hostname,state from pg_stat_activity;
 datname  |       pid       |    sessionid    | usename |    application_name    | client_addr | client_hostname | state  
----------+-----------------+-----------------+---------+------------------------+-------------+-----------------+--------
 postgres | 139697799886592 | 139697799886592 | omm     | gsql                   |             |                 | idle
 postgres | 139698188908288 | 139698188908288 | omm     | Asp                    |             |                 | active
 postgres | 139697967724288 | 139697967724288 | omm     | gsql                   |             |                 | active
 postgres | 139698457011968 | 139698457011968 | omm     | JobScheduler           |             |                 | active
 postgres | 139698249787136 | 139698249787136 | omm     | CfsShrinker            |             |                 | idle
 postgres | 139698172126976 | 139698172126976 | omm     | statement flush thread |             |                 | idle
 postgres | 139698233005824 | 139698233005824 | omm     | PercentileJob          |             |                 | active
 postgres | 139698302281472 | 139698302281472 | omm     | ApplyLauncher          |             |                 | idle
(8 rows)

若需要取消运行时间过长的查询,通过 PG_TERMINATE_BACKEND 函数,根据线程 ID 结束会话。

omm@postgres=# select pg_terminate_backend(139697799886592);
 pg_terminate_backend 
----------------------
 t
(1 row)

例子:查询对象信息

omm@postgres=# select relname,relnamespace,relowner,reltablespace from pg_class where relname='reason';
 relname | relnamespace | relowner | reltablespace 
---------+--------------+----------+---------------
 reason  |        16440 |       10 |             0
(1 row)

例子:查询数据库信息

omm@postgres=# select datname,datdba,datistemplate,datconnlimit,dattablespace from pg_database;
  datname  | datdba | datistemplate | datconnlimit | dattablespace 
-----------+--------+---------------+--------------+---------------
 template1 |     10 | t             |           -1 |          1663
 testdb    |     10 | f             |           -1 |          1663
 template0 |     10 | t             |           -1 |          1663
 appdb     |     10 | f             |           -1 |         16397
 postgres  |     10 | f             |           -1 |          1663
(5 rows)

例子:查询表信息

omm@postgres=# select schemaname,tablename,tableowner,tablespace,hasindexes,created,last_ddl_time from pg_tables where tablename='reason';
 schemaname | tablename | tableowner | tablespace | hasindexes |            created            |         last_ddl_time         
------------+-----------+------------+------------+------------+-------------------------------+-------------------------------
 tpcds      | reason    | omm        |            | f          | 2025-03-04 11:05:49.232288+08 | 2025-03-04 16:57:23.456905+08
(1 row)

例子:查询字段信息

omm@postgres=# select table_catalog,table_schema,table_name,column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length from information_schema.columns where table_name='reason';
 table_catalog | table_schema | table_name |  column_name  | ordinal_position | column_default | is_nullable |     data_type     | character_maximum_length 
---------------+--------------+------------+---------------+------------------+----------------+-------------+-------------------+--------------------------
 postgres      | tpcds        | reason     | r_reason_sk   |                1 |                | NO          | integer           |                         
 postgres      | tpcds        | reason     | r_reason_desc |                3 |                | YES         | character varying |                       20
 postgres      | tpcds        | reason     | r_reason_id   |                2 |                | NO          | character         |                       16
(3 rows)

例子:查询约束信息

omm@postgres=# select conname,connamespace,contype from pg_constraint;
           conname            | connamespace | contype 
------------------------------+--------------+---------
 cardinal_number_domain_check |        14723 | c
 yes_or_no_check              |        14723 | c
 snapshot_pkey                |         4991 | p
 snapshot_id_key              |         4991 | u
(4 rows)

例子:查询模式信息

omm@postgres=# select nspname,nspowner,nspacl from pg_namespace where nspname='tpcds';
 nspname | nspowner |         nspacl         
---------+----------+------------------------
 tpcds   |       10 | {omm=UC/omm,jim=U/omm}
(1 row)

例子:查询角色信息

omm@postgres=# select rolname,rolsuper,rolcreaterole,rolcreatedb,rolconnlimit from pg_roles where rolname in ('omm','hr');
 rolname | rolsuper | rolcreaterole | rolcreatedb | rolconnlimit 
---------+----------+---------------+-------------+--------------
 omm     | t        | t             | t           |           -1
 hr      | f        | f             | f           |           -1
(2 rows)

例子:查询用户信息

omm@postgres=# select usename,usesysid,usecreatedb,usesuper from pg_user where usename in ('omm','hr');
 usename | usesysid | usecreatedb | usesuper 
---------+----------+-------------+----------
 omm     |       10 | t           | t
 hr      |    16399 | f           | f
(2 rows)

例子:查询视图信息

omm@postgres=# select schemaname,viewname,viewowner from pg_views where viewname='tables';
     schemaname     | viewname | viewowner 
--------------------+----------+-----------
 information_schema | tables   | omm

会话信息函数

会话信息函数有:

名称描述示例
current_catalog当前数据库的名称。SELECT current_catalog;
current_database()当前数据库的名称。SELECT current_database();
current_query()由客户端提交的当前执行语句。SELECT current_query();
current_schema[()]当前模式的名称。current_schema 返回在搜索路径中第一个顺位有效的模式名。SELECT current_schema();
current_schemas(Boolean)current_schemas(Boolean)返回搜索路径中所有模式名称的数组。布尔选项决定像 pg_catalog 这样隐含包含的系统模式是否包含在返回的搜索路径中。SELECT current_schemas(true);
current_user当前执行环境下的用户名。current_user 是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过 SET ROLE 改变他。在函数执行的过程中随着属性 SECURITY DEFINER 的改变,其值也会改变。与 definer_current_user() 同义。SELECT current_user;
pg_current_sessionid()pg_current_sessionid() 是用于获取当前执行环境下的会话 ID。其组成结构为:时间戳.会话 ID,当线程池模式开启(enable_thread_pool=on)时,会话 ID 为 SessionID;而线程池模式关闭时,会话 ID 为 ThreadID。SELECT pg_current_sessionid();
pg_current_sessid在线程池模式下获得当前会话的会话 ID,非线程池模式下获得当前会话对应的后台线程 ID。select pg_current_sessid();
pg_current_userid当前用户 ID。SELECT pg_current_userid();
working_version_num()版本序号信息。返回一个系统兼容性有关的版本序号SELECT working_version_num();
tablespace_oid_name()根据表空间 OID,查找表空间名称。select tablespace_oid_name(1663);
inet_client_addr()连接的远端地址。返回当前客户端的 IP 地址。只有在远程连接模式下有效。SELECT inet_client_addr();
inet_client_port()连接的远端端口。返回当前客户端的端口号。只有在远程连接模式下有效。SELECT inet_client_port();
inet_server_addr()连接的本地地址。返回服务器接收当前连接用的 IP 地址。只在远程连接模式下有效。SELECT inet_server_addr();
inet_server_port()连接的本地端口。返回接收当前连接的端口号。如果是通过 Unix-domain Socket 连接的,则所有这些函数都返回 NULL。只有在远程连接模式下有效。SELECT inet_server_port();
pg_backend_pid()当前会话连接的服务进程的进程 ID。SELECT pg_backend_pid();
pg_conf_load_time()配置加载时间。pg_conf_load_time 返回最后加载服务器配置文件的时间戳。SELECT pg_conf_load_time();
pg_my_temp_schema()返回当前会话中临时模式的 OID,如果不存在(没有创建临时表)的话则返回 0。如果给定的 OID 是其它会话中临时模式的 OID,pg_is_other_temp_schema 则返回 True。SELECT pg_my_temp_schema();
pg_is_other_temp_schema(oid)是否为另一个会话的临时模式。SELECT pg_is_other_temp_schema(25356);
pg_postmaster_start_time()服务器启动时间。pg_postmaster_start_time 返回服务器启动时的 timestamp with time zone。SELECT pg_postmaster_start_time();
pg_get_ruledef(rule_oid)获取规则的 CREATE RULE 命令。select * from pg_get_ruledef(24828);
pg_trigger_depth()触发器的嵌套层次。SELECT pg_trigger_depth();
session_user会话用户名。session_user 通常是连接当前数据库的初始用户,不过系统管理员可以用 SET SESSION AUTHORIZATION 修改这个设置。等价于 userSELECT session_user;
getpgusername()获取数据库用户名。select getpgusername();
getdatabaseencoding()获取数据库编码方式。select getdatabaseencoding();
version()版本信息,返回一个描述服务器版本信息的字符串。select version();
opengauss_version()openGauss 版本信息。select opengauss_version();
gs_deployment()当前系统的部署形态信息。select gs_deployment();
get_hostname()返回当前节点的 Hostname。SELECT get_hostname();
get_nodename()返回当前节点的名字。SELECT get_nodename();
get_schema_oid(cstring)返回查询模式的 OID。SELECT get_schema_oid('public');

系统表信息函数

系统表信息函数有:

名称描述
getdistributekey(table_name)获取一个 Hash 表的分布列。单机环境下不支持分布,该函数返回为空。
pg_get_constraintdef(constraint_oid)获取约束的定义。返回类型:text
pg_get_functiondef(func_oid)获取函数的定义。返回类型:text
pg_get_indexdef(index_oid)获取索引的定义。返回类型:text。
pg_get_userbyid(role_oid)获取给定 OID 的角色名。返回类型:name。
pg_get_tabledef(table_name)根据 table_name 获取表定义。例:select * from pg_get_tabledef('t1');
pg_get_tabledef(table_oid)根据 table_oid 获取表定义。
pg_get_viewdef(view_oid)获取视图的定义。返回类型:text。
pg_check_authid(role_id)通过 role_id 检查用户是否存在。
pg_tablespace_databases(tablespace_oid)获取在指定的表空间中有对象的数据库 OID 集合。返回类型:setof oid。
pg_tablespace_databases 允许检查表空间的状况,返回在该表空间中保存了对象的数据库 OID 集合。如果这个函数返回数据行,则该表空间就是非空的,因此不能删除。要显示该表空间中的特定对象,用户需要连接 pg_tablespace_databases 标识的数据库与查询 pg_class 系统表。
pg_get_serial_sequence(tablename, colname)获取对应表名和列名上的序列。返回类型:text
pg_sequence_parameters(sequence_oid)获取指定序列的参数,包含起始值,最小值和最大值,递增值等。

数据库对象函数

数据库对象尺寸函数计算数据库对象使用的实际磁盘空间。包括:

名称描述
pg_column_size(any)存储一个指定的数值需要的字节数(可能压缩过)。显示用于存储某个独立数据值的空间。SELECT pg_column_size(1);
pg_database_size(oid)指定 OID 代表的数据库使用的磁盘空间。
pg_database_size(name)指定名称的数据库使用的磁盘空间。接受一个数据库的 OID 或者名称,然后返回该对象使用的全部磁盘空间。SELECT pg_database_size('postgres');
pg_relation_size(oid)指定 OID 代表的表或者索引所使用的磁盘空间。
get_db_source_datasize()估算当前数据库非压缩态的数据总容量。(1)调用该函数前需要做 analyze;(2)通过估算列存的压缩率计算非压缩态的数据总容量。analyze; select get_db_source_datasize();
pg_relation_size(text)指定名称的表或者索引使用的磁盘空间。表名称可以用模式名修饰。
pg_partition_size(oid,oid)指定 OID 代表的分区使用的磁盘空间。其中,第一个参数为表的 OID,第二个参数为分区的 OID。
pg_partition_size(text, text)指定名称的分区使用的磁盘空间。其中,第一个参数为表名,第二个参数为分区名。
pg_partition_indexes_size(oid,oid)指定 OID 代表的分区的索引使用的磁盘空间。其中,第一个参数为表的 OID,第二个参数为分区的 OID。
pg_partition_indexes_size(text,text)指定名称的分区的索引使用的磁盘空间。其中,第一个参数为表名,第二个参数为分区名。
pg_indexes_size(regclass)附加到指定表的索引使用的总磁盘空间。
pg_size_pretty(bigint)将以 64 位整数表示的字节值转换为具有单位的易读格式。
pg_size_pretty(numeric)将以数值表示的字节值转换为具有单位的易读格式。用于把其他函数的结果格式化成一种易读的格式,可以根据情况使用 KB 、MB 、GB 、TB。
pg_table_size(regclass)指定的表使用的磁盘空间,不计索引(但是包含 TOAST,自由空间映射和可见性映射)。
pg_tablespace_size(oid)指定 OID 代表的表空间使用的磁盘空间。
pg_tablespace_size(name)指定名称的表空间使用的磁盘空间。接受一个数据库的 OID 或者名称,然后返回该对象使用的全部磁盘空间。
pg_total_relation_size(oid)指定 OID 代表的表使用的磁盘空间,包括索引和压缩数据。
pg_total_relation_size(regclass)指定的表使用的总磁盘空间,包括所有的索引和 TOAST 数据。
pg_total_relation_size(text)指定名称的表所使用的全部磁盘空间,包括索引和压缩数据。表名称可以用模式名修饰。接受一个表或者一个压缩表的 OID 或者名称,然后返回以字节计的数据和所有相关的索引和压缩表的尺寸。
datalength(any)计算一个指定的数据需要的字节数(不考虑数据的管理空间和数据压缩、数据类型转换等情况)。用于计算某个独立数据值的空间。SELECT datalength(1);

数据库对象位置函数

  • 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)。
  • pg_filenode_relation(tablespace oid, filenode oid) 获取对应的tablespace和relfilenode所对应的表名。返回类型:regclass
  • pg_partition_filenode(partition_oid) ,描述:获取到指定分区表的 OID 锁对应的 filenode。返回类型:oid
  • pg_partition_filepath(partition_oid),描述:指定分区的文件路径名。返回值类型:text
  • gs_is_recycle_object(classid, objid, objname),描述:判断是否为回收站对象。返回值类型:boolean

参数

与 PostgreSQL 一样,openGauss 的参数也是位于 $PGDATA/postgresql.conf 配置文件中。不建议手动修改该配置文件。

查看参数

使用 gsql 登录到数据库后,可以使用 show 命令查看参数:

omm@postgres=# show session_timeout;
 session_timeout 
-----------------
 0
(1 row)

可以使用 show all; 查看所有参数:

omm@postgres=# show all;

还可以使用 pg_settings 视图查看参数:

omm@postgres=# SELECT * FROM pg_settings WHERE NAME='session_timeout';
-[ RECORD 1 ]-------------------------------------------------------
name       | session_timeout
setting    | 0
unit       | s
category   | Client Connection Defaults / Statement Behavior
short_desc | Set the maximum allowed duration of any unused session.
extra_desc | A value of 0 turns off the timeout.
context    | user
vartype    | integer
source     | configuration file
min_val    | 0
max_val    | 86400
enumvals   | 
boot_val   | 600
reset_val  | 0
sourcefile | /opt/huawei/install/data/dn/postgresql.conf
sourceline | 87

设置参数

openGauss提供了多种修改参数的方法,用户可以方便的针对数据库、用户、会话进行设置。

  • 参数名称不区分大小写。
  • 参数取值有整型、浮点型、字符串、布尔型和枚举型五类。
    • 布尔值可以是(onoff)、(truefalse)、(yesno)或者(10),且不区分大小写。
    • 枚举类型的取值是在系统表 pg_settingsenumvals 字段取值定义的。
  • 对于有单位的参数,在设置时请指定单位,否则将使用默认的单位。
    • 参数的默认单位在系统表 pg_settingsunit 字段定义的。
    • 内存单位有:KB(千字节)、MB(兆字节)和 GB(吉字节)。
    • 时间单位:ms(毫秒)、s(秒)、min(分钟)、h(小时)和 d(天)。

视图 pg_settings 中的 context 字段表示参数类型,包括以下六类:

参数类型说明设置方式
INTERNAL固定参数,在创建数据库的时候确定,用户无法修改,只能通过 show 语法或者 pg_settings 视图进行查看。
POSTMASTER数据库服务端参数,在数据库启动时确定,可以通过配置文件指定。支持下面的方式一、方式四。
SIGHUP数据库全局参数,可在数据库启动时设置或者在数据库启动后,发送指令重新加载。支持下面的方式一、方式二、方式四。
BACKEND会话连接参数。在创建会话连接时指定,连接建立后无法修改。连接断掉后参数失效。内部使用参数,不推荐用户设置。支持下面的方式一、方式二、方式四。说明:设置该参数后,下一次建立会话连接时生效。
SUPERUSER数据库管理员参数。可在数据库启动时、数据库启动后或者数据库管理员通过SQL进行设置。支持下面的方式一、方式二或由数据库管理员通过方式三设置。
USER普通用户参数。可被任何用户在任何时刻设置。支持下面的方式一、方式二或方式三设置。

openGauss 提供了四种方式来修改参数:

方式一:

  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"
    

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

    gs_guc set -Z cmagent -c "paraname=value"
    gs_guc set -Z cmagent -N all -I all -c "paraname=value" 
    

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

    gs_guc set -Z cmserver -c "paraname=value"
    gs_guc set -Z cmserver -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"

方式三:

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

  • 设置数据库级别的参数,在下次会话中生效。

    openGauss=# ALTER DATABASE dbname SET paraname TO value;
    
  • 设置用户级别的参数,在下次会话中生效。

    openGauss=# ALTER USER username SET paraname TO value;
    
  • 设置会话级别的参数,修改本次会话中的取值。退出会话后,设置将失效。

    openGauss=# SET paraname TO value;
    

    说明:SET 设置的会话级参数优先级最高,其次是 ALTER 设置的,其中 ALTER DATABASE 设置的参数值优先级高于 ALTER USER 设置,这三种设置方式设置的优先级都高于 gs_guc 设置方式。

方式四:

使用 ALTER SYSTEM SETopen in new window 设置 POSTMASTER、SIGHUP、BACKEND 级别的参数,此命令会将参数写入配置文件,不同级别生效方式有所不同。

  • 设置 POSTMASERT 级别的参数,重启后生效。

    openGauss=# ALTER SYSTEM SET paraname TO value;
    
  • 设置 SIGHUP 级别的参数,立刻生效(实际等待线程重新加载参数略有延迟)。

    openGauss=# ALTER SYSTEM SET paraname TO value;
    
  • 设置 BACKEND 级别的参数,在下次会话中生效。

    openGauss=# ALTER SYSTEM SET paraname TO value;
    

注意:

使用方式一和方式二设置参数时,若所设参数不属于当前环境,数据库会提示参数不在支持范围内的相关信息。

接入认证

认证文件

如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。认证配置文件(默认名称为 pg_hba.conf)存放在数据库的数据目录里,其中 hba(Host-Based Authentication)表示是基于主机的认证。

openGauss 支持如下三种认证方式,这三种方式都需要配置 pg_hba.conf 文件。

  • 基于主机的认证:服务器端根据客户端的 IP 地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。
  • 口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。
  • SSL 加密:使用 OpenSSL(开源安全通信库)提供服务器端和客户端安全连接的环境。

pg_hba.conf 文件中的每条记录可以是下面四种格式之一:

# TYPE    DATABASE USER ADDRESS METHOD
local     DATABASE USER METHOD [OPTIONS]
host      DATABASE USER ADDRESS METHOD [OPTIONS]
hostssl   DATABASE USER ADDRESS METHOD [OPTIONS]
hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]

每条记录对应一条规则(忽略注释和空行),每条规则包括:

  • TYPE:连接类型,包括:
    • local:使用 Unix 域套接字的连接。
    • host:使用 TCP/IP 的连接。
    • hostssl:使用 SSL 加密的 TCP/IP 连接。
    • hostnossl:只匹配没有使用 SSL 加密的 TCP/IP 连接。
  • DATABASE:匹配的数据库,可以是:
    • all:匹配所有数据库。
    • sameuser:匹配与请求用户同名的数据库。
    • samerole:匹配与请求用户所拥有角色同名的数据库。
    • 特定的数据库名称或者用逗号分隔的数据库列表。
    • replication:匹配物理复制连接而不是逻辑复制连接。
    • @filename:匹配指定文件中的数据库名。
  • USER:指定可访问数据库的用户名,可以是:
    • all:匹配所有用户。
    • +用户角色:表示匹配任何直接或者间接属于这个角色的成员。
    • 特定的数据库用户名或者用逗号分隔的用户列表。
    • @filename:匹配指定文件中的用户名。
  • ADDRESS:指定与记录匹配且允许访问的 IP 地址范围。支持 IPv4 和 IPv6,可以使用如下两种形式来表示:
    • IP 地址/掩码长度。例如,10.10.0.0/24
    • IP 地址子网掩码。例如,10.10.0.0 255.255.255.0
    • 0.0.0.0/0:匹配所有 IPv4 地址。
    • ::0/0:匹配所有 IPv6 地址。
  • METHOD:指定当连接与此记录匹配时要使用的身份验证方法,包括:
    • trust:无条件允许连接,无需密码或其他身份验证。采用这种认证模式时,只完全信任从服务器本机使用 gsql 且不指定 -U 参数的连接,此时不需要口令。不允许远程连接使用 trust 认证方法。
    • reject:无条件拒绝连接。
    • md5:使用 MD5 验证用户的密码,不推荐使用,默认不支持,可通过 password_encryption_type 参数配置。
    • sha256:默认使用 SHA256 验证用户的密码。

openGauss 会按照从上到下的顺序进行连接匹配。通常应该将较小的访问范围和较弱的身份验证方法放在前面,将较大的访问范围和较强的身份验证方法放在后面。

注意:

  • 一个用户要想成功连接到特定的数据库,不仅需要通过 pg_hba.conf 中的规则检查,还必须要有该数据库上的 CONNECT 权限。如果希望控制某些用户只能连接到指定数据库,赋予/撤销 CONNECT 权限通常比在 pg_hba.conf 中设置规则更为简单。
  • 对应 openGauss 外部客户端连接,trust 为不安全的认证方式,请将认证方式设置为 sha256

配置文件 pg_hba.conf 的一些示例:

TYPE  DATABASE        USER            ADDRESS                 METHOD

"local" is for Unix domain socket connections only
#表示只允许以安装时 -U 参数指定的用户从服务器本机进行连接。
local   all             all                                     trust
IPv4 local connections:
#表示允许 jack 用户从 10.10.0.50 主机上连接到任意数据库,使用 sha256 算法对密码进行加密。
host    all           jack             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.1/32 网段的主机上连接到任意数据库。 
host    all             all             10.10.0.1/32            reject

配置认证

使用 gs_guc 命令来配置认证。例如配置允许用户 stone 从 IP 地址为 10.10.0.30 的客户端访问本机:

[omm@opengauss ~]$ gs_guc reload -N all -I all -h "host all stone 10.10.0.30/32 sha256"
The gs_guc run with the following arguments: [gs_guc -N all -I all -h host all stone 10.10.0.30/32 sha256 reload ].
Begin to perform the total nodes: 1.
Popen count is 1, Popen success count is 1, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 1, Command success count is 1, Command failure count is 0.

Total instances: 1. Failed instances: 0.
ALL: Success to perform gs_guc!

[omm@opengauss ~]$ grep stone $PGDATA/pg_hba.conf
host all stone 10.10.0.30/32 sha256 

其中:

  • -N all 表示 openGauss 的所有主机。
  • -I all 表示主机的所有实例。
  • -h 表示指定需要在 pg_hba.conf 增加的一条规则。
  • all 表示允许客户端连接到任意的数据库。
  • stone 表示连接数据库的用户。
  • 10.10.0.30/32 表示只允许 IP 地址为 10.10.0.30 的主机连接。此处的 IP 地址不能为 openGauss 内的 IP,在使用过程中,请根据用户的网络进行配置修改。32 表示子网掩码为 1 的位数,即255.255.255.255。
  • sha256 表示连接时用户的密码使用 SHA256 算法加密。

异常处理

用户认证失败有很多原因,通过服务器返回给客户端的提示信息,可以看到用户认证失败的原因。常见的错误提示如下:

  • 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 配置文件加入用户的信息。
  • failed to connect 10.10.0.1:12000. :说明无法连接到指定 IP 和端口的服务器,请联系数据库管理员检查 pg_hba.conf 配置文件里是否有配置对应 IP 白名单。
  • @ can't be allowed in username:说明客户端在连接数据库时使用了包含 @ 的用户名,这是不允许的。

连接管理

当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。

  • 全局最大并发会话连接数:由运行参数 max_connections 指定。其默认值:
    • 200:编译安装数据库或极简安装数据库的情况下。
    • 5000:使用 om 安装数据库的情况下。
  • 数据库主节点中此参数建议保持默认值。
  • 某用户的连接数:在创建用户时由 CREATE ROLE 命令的 CONNECTION LIMIT connlimit 子句直接设定,也可以在设定以后用 ALTER ROLECONNECTION LIMIT connlimit 子句修改。
  • 某数据库的连接数:在创建数据库时,由 CREATE DATABASECONNECTION LIMIT connlimit 参数指定。

查看全局最大并发会话连接数:

omm@postgres=# SHOW max_connections;
 max_connections 
-----------------
 5000
(1 row)

查看指定用户的会话连接数上限:

omm@postgres=# SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='omm';
 rolname | rolconnlimit 
---------+--------------
 omm     |           -1
(1 row)

其中 -1 表示没有对用户 omm 设置连接数的限制。

查看指定用户已使用的会话连接数:

omm@postgres=# SELECT COUNT(*) FROM (
SELECT
sa.sessionid AS SID,
0::integer AS SERIAL#,
sa.usesysid AS USER#,
ad.rolname AS USERNAME
FROM pg_stat_get_activity(NULL) AS sa
LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid)
WHERE sa.application_name <> 'JobScheduler'
) t WHERE t.USERNAME='omm';
 count 
-------
     6
(1 row)

查看指定数据库的会话连接数上限:

omm@postgres=# SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='postgres';
 datname  | datconnlimit 
----------+--------------
 postgres |           -1
(1 row)

其中 -1 表示没有对数据库 postgres 设置连接数的限制。

查看指定数据库已使用的会话连接数:

omm@postgres=# SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='postgres';
 count 
-------
     7
(1 row)

查看所有用户已使用会话连接数:

omm@postgres=# SELECT COUNT(*) FROM (
SELECT
sa.sessionid AS SID,
0::integer AS SERIAL#,
sa.usesysid AS USER#,
ad.rolname AS USERNAME
FROM pg_stat_get_activity(NULL) AS sa
LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid)
WHERE sa.application_name <> 'JobScheduler');
 count 
-------
    18
(1 row)

或者:

omm@postgres=# SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
 count 
-------
    19
(1 row)

如果显示的连接数接近数据库的最大连接数 max_connections,则需要考虑清理现有连接数或者增加新的连接数。

执行如下 SQL 语句,查看 state 字段等于 idle,且 state_change 字段长时间没有更新过的连接信息:

omm@postgres=# select datname,pid,sessionid,usename,application_name,client_addr,client_hostname,state from pg_stat_activity where state='idle' order by state_change;
 datname  |       pid       |    sessionid    | usename |    application_name    | client_addr | client_hostname | state 
----------+-----------------+-----------------+---------+------------------------+-------------+-----------------+-------
 postgres | 140252718946048 | 140252718946048 | omm     | statement flush thread |             |                 | idle
 postgres | 140252798711552 | 140252798711552 | omm     | CfsShrinker            |             |                 | idle
 postgres | 140252877408000 | 140252877408000 | omm     | ApplyLauncher          |             |                 | idle
 postgres | 140252305749760 | 140252305749760 | omm     | gsql                   |             |                 | idle
(4 rows)

查看每个连接,并与此连接的使用者确认是否可以断开连接,或执行如下 SQL 语句释放连接:

omm@postgres=# SELECT pg_terminate_backend(140252305749760);
 pg_terminate_backend 
----------------------
 t
(1 row)

如果没有可释放的连接,则需要修改参数 max_connections,增加最大连接数。先查看参数:

omm@postgres=# \x auto
Expanded display is used automatically.

omm@postgres=# SELECT * FROM pg_settings WHERE NAME='max_connections';
-[ RECORD 1 ]--------------------------------------------------------------
name       | max_connections
setting    | 5000
unit       | 
category   | Connections and Authentication / Connection Settings
short_desc | Sets the maximum number of concurrent connections for clients.
extra_desc | 
context    | postmaster
vartype    | integer
source     | configuration file
min_val    | 10
max_val    | 262143
enumvals   | 
boot_val   | 200
reset_val  | 5000
sourcefile | /opt/huawei/install/data/dn/postgresql.conf
sourceline | 74

当前参数值为 5000,修改为 6000:

[omm@opengauss ~]$ gs_guc set -c "max_connections= 6000"
The gs_guc run with the following arguments: [gs_guc -c max_connections= 6000 set ].
expected instance path: [/opt/huawei/install/data/dn/postgresql.conf]
gs_guc set: max_connections=6000: [/opt/huawei/install/data/dn/postgresql.conf]

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

由于参数类型为 postmaster,修改后需要重启才能生效:

[omm@opengauss ~]$ gs_om -t stop && gs_om -t start

重启 openGauss 操作会导致业务中断,请在操作之前规划好合适的时间窗口。最好是为类型为 postmaster 的参数在部署数据库时就根据业务需求,设置为合适的值,避免因为参数不合适导致业务中断。

日志

在数据库运行过程中,会出现大量日志,既有保证数据库安全可靠的 WAL 日志(预写式日志,也称为 Xlog),也有用于数据库日常维护的运行和操作日志等。在数据库发生故障时,可以参考这些日志进行问题定位和数据库恢复的操作。

日志类型如下表:

类型说明
系统日志数据库系统进程运行时产生的日志,记录系统进程的异常信息。
操作日志通过客户端工具(例如 gs_guc )操作数据库时产生的日志。
Trace 日志打开数据库的调试开关后,会记录大量的 Trace 日志。这些日志可以用来分析数据库的异常信息。
黑匣子日志数据库系统崩溃的时候,通过故障现场堆、栈信息可以分析出故障发生时的进程上下文,方便故障定位。黑匣子具有在系统崩溃时,DUMP 出进程和线程的堆、栈、寄存器信息的功能。
审计日志开启数据库审计功能后,将数据库用户的某些操作记录在日志中,这些日志称为审计日志。
WAL 日志又称为 REDO 日志,在数据库异常损坏时,可以利用 WAL 日志进行恢复。由于 WAL 日志的重要性,所以需要经常备份这些日志。
性能日志数据库系统在运行时检测物理资源的运行状态的日志,在对外部资源进行访问时的性能日志,例如:磁盘、OBS 等。

系统日志

openGauss 安装部署以及运行时产生的日志统称为系统日志。如果 openGauss 在运行时发生故障,可以通过这些系统日志及时定位故障发生的原因,根据日志内容制定恢复 openGauss 的方法。

日志文件路径:

  • 安装卸载时产生的日志放在 $GAUSSLOG/om 目录下。
  • 数据库节点的运行日志放在 $GAUSSLOG/pg_log 中各自对应的目录下。日志文件命名规则为 postgresql-YYYY-MM-DD_HHMISS.log。默认情况下,每日 0 点或者日志文件大于 16MB 或者数据库实例(数据库节点)重新启动后,会生成新的日志文件。

日志文件格式:日期 + 时间 + 时区 + 用户名称 + 数据库名称 + 会话 ID + 日志级别 + 日志内容

[omm@opengauss ~]$ ll $GAUSSLOG/pg_log/dn_6001
total 6096
-rw------- 1 omm dbgrp  52283 Feb 25 17:02 postgresql-2025-02-25_164117.log
-rw------- 1 omm dbgrp  29574 Feb 25 17:05 postgresql-2025-02-25_170225.log
-rw------- 1 omm dbgrp  36237 Feb 25 17:14 postgresql-2025-02-25_170638.log

操作日志

操作日志是指数据库管理员使用工具操作数据库时以及工具被 openGauss 调用时产生的日志。如果 openGauss 发生故障,可以通过这些日志信息跟踪用户对数据库进行了哪些操作,重现故障场景。

日志文件路径:默认在 $GAUSSLOG/bin 目录下,如果环境变量 $GAUSSLOG 不存在或者变量值为空,则操作日志信息不会记录到对应的日志文件中,只会打印到屏幕上。

日志文件命名规则:

  • 工具名-YYYY-MM-DD_HHMISS.log,历史日志文件。
  • 工具名-YYYY-MM-DD_HHMISS-current.log,当前日志文件。

如果日志大小超过 16MB,在下一次调用该工具时,会重命名当前日志文件为历史日志文件,并以当前时间生成新的当前日志文件。

[omm@opengauss ~]$ ll $GAUSSLOG/bin/gs_guc
total 12
-rw------- 1 omm dbgrp 9947 Mar  7 14:38 gs_guc-2025-02-25_164114-current.log
-rw------- 1 omm dbgrp    0 Mar  7 14:38 gs_guc.lock

预写式日志

预写式日志 WAL(Write Ahead Log,也称为 Xlog)是实现事务日志的标准方法,对数据文件(表和索引的载体)持久化修改之前必须先持久化相应的日志。如果要修改数据文件,必须是在这些修改操作已经记录到日志文件之后才能进行修改,即在描述这些变化的日志记录刷新到永久存储器之后。在系统崩溃时,可以使用 WAL 日志对 openGauss 进行恢复操作。

日志文件路径:默认在 $PGDATA/pg_xlog 目录下。

日志文件命名规则:日志文件以段文件的形式存储的,每个段为 16MB,并分割成若干页,每页 8KB。对 WAL 日志的命名说明如下:一个段文件的名称由 24 个十六进制组成,分为三个部分,每个部分由 8 个十六进制字符组成。第一部分表示时间线,第二部分表示日志文件标号,第三部分表示日志文件的段标号。时间线由 1 开始,日志文件标号和日志文件的段标号由 0 开始。

[omm@opengauss ~]$ ll $PGDATA/pg_xlog
total 212992
-rw------- 1 omm dbgrp 16777216 Feb 25 16:41 000000010000000000000001
-rw------- 1 omm dbgrp 16777216 Mar 10 15:34 000000010000000000000002
-rw------- 1 omm dbgrp 16777216 Mar 10 17:08 000000010000000000000003

WAL 日志的内容取决于记录事务的类型,在系统崩溃时可以利用 WAL 日志进行恢复。

默认配置下,openGauss 每次启动时会先读取 WAL 日志进行恢复。

WAL 日志对数据库异常恢复有重要的作用,建议定期对 WAL 日志进行备份。

性能日志

性能日志主要关注外部资源的访问性能问题。性能日志指的是数据库系统在运行时检测物理资源的运行状态的日志,在对外部资源进行访问时的性能检测,包括磁盘等外部资源的访问检测信息。在出现性能问题时,可以借助性能日志及时的定位问题发生的原因,能极大地提升问题解决效率。

日志文件路径:数据库节点的性能日志目录在 $GAUSSLOG/gs_profile 中各自对应的目录下。

日志文件命名规则:postgresql-YYYY-MM-DD_HHMISS.prf。默认情况下,每日 0 点或者日志文件大于 20MB 或者数据库实例(数据库节点)重新启动后,会生成新的日志文件。

日志文件格式:主机名称 + 日期 + 时间 + 实例名称 + 线程号 + 日志内容。

[omm@opengauss ~]$ ll $GAUSSLOG/gs_profile/dn_6001
total 64
-rw------- 1 omm dbgrp 11 Feb 25 16:41 postgresql-2025-02-25_164117.prf
-rw------- 1 omm dbgrp 11 Feb 25 17:02 postgresql-2025-02-25_170225.prf
-rw------- 1 omm dbgrp 11 Feb 25 17:06 postgresql-2025-02-25_170638.prf

收集日志

使用 gs_collector 命令收集日志。

语法:

gs_collector --begin-time="BEGINTIME" --end-time="ENDTIME" [-h HOSTNAME | -f HOSTFILE] 
              [--keyword=KEYWORD] [--speed-limit=SPEED] [-o OUTPUT] [-l LOGFILE] [-C CONFIGFILE] [--timeout=TIMEOUT]

其中:

  • --begin-time:起始时间,格式为 yyyymmdd hh:mm
  • --end-time:结束时间,格式为 yyyymmdd hh:mm
  • -h:指定主机,多个主机以逗号分隔
  • -f:主机清单文件
  • --keyword:收集包含关键字的日志,例如 --keyword="os"
  • -o:指定输出目录,默认为 GAUSSLOG
  • -l:指定执行命令时的日志文件,必须以 .log 为后缀名
  • -C:配置文件,指定需要收集的信息清单

例子:收集指定时间段的所有日志

[omm@opengauss ~]$ gs_collector --begin-time="20250327 15:00" --end-time="20250327 16:00"
Successfully parsed the configuration file.
create Dir.
Successfully create dir.
do System check 0:1
Collecting OS information.
Successfully collected OS information.
do Database check 0:1
Collecting catalog statistics.
Successfully collected catalog statistics.
do not enable dss, cannot collect dss config files
do not enable dss, cannot collect dss disk info
do Log check 0:1
Collecting Log files.
Successfully collected Log files.
do Config check 0:1
Collecting Config files.
Successfully collected Config files.
Collecting files.
Successfully collected files.
All results are stored in /var/log/omm/omm/collector_20250327_160748.tar.gz.

维护

启停

以操作系统用户 omm 登录数据库主节点,使用以下命令启动 openGauss:

[omm@opengauss ~]$ gs_om -t start

以操作系统用户 omm 登录数据库主节点,使用以下命令停止 openGauss:

[omm@opengauss ~]$ gs_om -t stop

如果是超时导致启动失败,可以执行如下命令,设置启动超时时间,默认超时时间为 300 秒:

[omm@opengauss ~]$ gs_om -t start --time-out=300

状态

以操作系统用户 omm 登录数据库主节点,使用以下命令查询 openGauss 状态:

[omm@opengauss ~]$ gs_om -t status --detail
[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
current_az      : AZ_ALL

[  Datanode State   ]

    node     node_ip         port      instance                            state
------------------------------------------------------------------------------------------------
1  opengauss 192.168.92.129  15400      6001 /opt/huawei/install/data/dn   P Primary Normal

各字段含义如下表:

字段字段含义字段值
cluster_stateopenGauss 状态。显示整个 openGauss 是否运行正常。Normal:表示 openGauss 可用,且数据有冗余备份。所有进程都在运行,主备关系正常。
Unavailable:表示 openGauss 不可用。
Degraded:表示 openGauss 可用,但存在故障的节点。
node主机名称表示该实例所在的主机名称。多 AZ 时会显示 AZ 编号。
node_ip主机 IP表示该实例所在的主机 IP。
instance实例 ID表示该实例的 ID。
state实例角色Normal:表示单主机实例。
Primary:表示实例为主实例。
Standby:表示实例为备实例。
Cascade Standby:表示实例为级联备实例。
Pending:表示该实例在仲裁阶段。
Unknown:表示实例状态未知。
Down:表示实例处于宕机状态。
Abnormal:表示节点处于异常状态。
Manually stopped:表示节点已经被手动停止。

使用 -h 选项查询某主机的实例状态:

[omm@opengauss ~]$ gs_om -t status -h opengauss
-----------------------------------------------------------------------

cluster_state             : Normal
redistributing            : No

-----------------------------------------------------------------------

node                      : 1
node_name                 : opengauss
instance_id               : 6001
node_ip                   : 192.168.92.129
data_path                 : /opt/huawei/install/data/dn
instance_port             : 15400
type                      : Datanode
instance_state            : Normal
az_name                   : AZ1
instance_role             : Normal

-----------------------------------------------------------------------

结果中的 instance_state 表示实例状态,可能是:

状态字段含义
Normal表示节点启动正常
Need repair当前节点需要修复
Starting节点正在启动中
Wait promoting节点正等待升级中,例如备机向主机发送升级请求后,正在等待主机回应时的状态
Promoting备节点正在升级为主节点的状态
Demoting节点正在降级中,如主机正在降为备机中
Building备机启动失败,需要重建
Catchup备节点正在追赶主节点
Coredump节点程序崩溃
Unknown节点状态未知

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

状态字段含义
Normal表示节点启动正常
WAL segment removed主机 WAL 日志不存在,或者备机日志比主机日志新
Disconnect备机不能连接主机
Version not matched主备二进制版本不一致
Mode not matched主备角色不匹配,例如两个备机互联
System id not matched主备数据库系统 ID 不一致,主备双机要求 System ID 必须一致
Timeline not matched日志时间线不一致
Unknown其他原因

检查

gs_checkos

使用 gs_checkos 检查操作系统状态,检查前需确保:

  • 当前的硬件和网络环境正常。
  • 各主机间 root 互信状态正常。
  • 使用 root 或普通用户执行 gs_checkos 命令。
  • 使用普通用户执行 gs_checkos 命令时,只会校验参数,不会设置参数。
  • 若为环境变量分离的模式安装的数据库,root 和普通用户在使用该工具前都需要 source 环境变量分离文件 ENVFILE。 若为环境变量不分离的模式安装的数据库,root 在使用该工具时需要 source 安装用户的 .bashrc 文件

语法:

gs_checkos -i ITEM [-f HOSTFILE] [-h HOSTNAME] [-X XMLFILE] [--detail] [-o OUTPUT] [-l LOGFILE]

其中:

  • -i ITEM:指定项目编号,ITEM 可以是 A,B,A1 至 A14,B1 至 B8。
    • A1 至 A14 表示只检查操作系统参数,并不设置。
    • B1 至 B8 表示将参数系统参数设置为期望值。
    • A 和 B 不能同时输入。
    • root 可以检查 A1 至 A14 所有检查项;普通用户只能检查 A1,A2,A3,A4,A5,A8,A12,A13 这些检查项。
    • root 可以设置 B1 至 B8 所有检查项,普通用户不能设置。
    • 要检查所有项目,使用 -i A,要设置所有参数,使用 -i B
  • -h HOSTNAME:指定需要检查的主机名称,可以同时指定多个主机,主机之间使用 , 分割。如果不指定主机,则检查当前主机。
  • --detail:显示检查结果详情。

操作系统检查项如下表:

编号检查项检查项详细说明
A1操作系统版本(OS version status)操作系统版本检查:保证主机平台是支持的 openEuler 和 CentOS 平台中的一种。同时保证 openGauss 各个主机的平台是属于同一混编范围的。
A2内核版本(Kernel version status)内核版本检查。
A3Unicode状态(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。
A10IO调度状态(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 各个主机的系统时间误差不超过 60 秒,在资源池化场景下不超过 6 秒。
A13防火墙状态(Firewall service status)防火墙检查: 确认防火墙的状态为关闭状态。
A14THP服务(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 服务启动,将该服务关闭。
B7设置欧拉系统属性(Set RemoveIPC value)欧拉系统属性检查:检查设置欧拉系统文件 /usr/lib/systemd/system/systemd-logind.service/etc/systemd/logind.conf中配置项 RemoveIPC 属性值是否为 no,当不为 no 时,对其进行修改设置。
B8设置 SSHD 服务应用 PAM 模块(Set Session Process)远程设备继承系统默认资源:修改 /etc/pam.d/sshd 服务文件,添加配置项 session required pam_limits.so,来控制用户使用的资源。

说明:

  • A6 选项检查标准来自配置文件 $GPHOME/script/gspylib/etc/conf/check_list.conf[/etc/sysctl.conf][SUGGEST:/etc/sysctl.conf] 域: 若 [/etc/sysctl.conf] 下参数值与系统实际参数值不同,A6 检查提示 Abnormal,可以使用 B1 参数进行设置。 若 [SUGGEST:/etc/sysctl.conf] 下参数值与系统实际参数值不同,A6 检查提示 Warning,B1 参数不会进行设置,需根据实际情况进行手动设置。
  • A7 选项检查系统文件句柄标准来自配置文件 $GPHOME/script/gspylib/etc/conf/check_list.conf[/etc/security/limits.conf]open files 参数,可以使用 B2 参数进行设置。
  • A11 选项检查万兆网卡参数 MTU、RX、TX 标准来自配置文件 $GPHOME/script/gspylib/etc/conf/check_list.conf[/sbin/ifconfig] 域,可以使用 B5 参数对 RX、TX 进行设置,MTU 需用户手动设置。
  • 使用 gs_checkos 设置的内核参数值和文件句柄参数值,需重启新会话生效。

操作系统内核参数:

参数名称参数说明推荐取值
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_retriesTCP 协议 SYN 报文最大重试次数。5
net.ipv4.tcp_synack_retriesTCP 协议 SYN 应答报文最大重试次数。5
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.ipv4.tcp_rmemTCP 协议接收端缓冲区的可用内存大小。分无压力、有压力、和压力大三个区间,单位为页面。8192 250000 16777216
net.ipv4.tcp_wmemTCP 协议发送端缓冲区的可用内存大小。分无压力、有压力、和压力大三个区间,单位为页面。8192 250000 16777216
net.core.wmem_maxSocket 发送端缓冲区大小的最大值。21299200
net.core.rmem_maxSocket 接收端缓冲区大小的最大值。21299200
net.core.wmem_defaultSocket 发送端缓冲区大小的默认值。21299200
net.core.rmem_defaultSocket 接收端缓冲区大小的默认值。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.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_timestampsTCP 时间戳(会在 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
MTU节点网卡最大传输单元。OS 默认值为 1500,调整为 8192 可以提升 SCTP 协议数据收发的性能。8192

文件系统参数:

参数名称参数说明推荐取值
soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。1000000
hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。1000000
stack size线程堆栈大小。3072

例子:检查所有项目

[root@opengauss ~]# source /home/omm/.bashrc
[root@opengauss ~]# gs_checkos -i A --detail
Checking items:
    A1. [ OS version status ]                                   : Normal     
        [opengauss]
        centos_7.9.2009_64bit
         
    A2. [ Kernel version status ]                               : Normal     
        The names about all kernel versions are same. The value is "3.10.0-1160.el7.x86_64".
    A3. [ Unicode status ]                                      : Normal     
        The values of all unicode are same. The value is "LANG=en_US.UTF-8".
    A4. [ Time zone status ]                                    : Normal     
        The informations about all timezones are same. The value is "+0800".
    A5. [ Swap memory status ]                                  : Normal     
        The value about swap memory is correct.            
    A6. [ System control parameters status ]                    : Normal     
        All values about system control  parameters are correct.
    A7. [ File system configuration status ]                    : Normal     
        Both soft nofile and hard nofile are correct.      
    A8. [ Disk configuration status ]                           : Normal     
        The value about XFS mount parameters is correct.   
    A9. [ Pre-read block size status ]                          : Normal     
        The value about Logical block size is correct.     
    A10.[ IO scheduler status ]                                 : Normal     
        The value of IO scheduler is correct.              
    A11.[ Network card configuration status ]                   : Warning    
        [opengauss]
BondMode Null
        Warning reason: network 'ens33' 'mtu' RealValue '1500' ExpectedValue '8192'

    A12.[ Time consistency status ]                             : Normal     
        The ntpd or chronyd service is started, local time is "2025-03-11 14:33:15".
    A13.[ Firewall service status ]                             : Normal     
        The firewall service is stopped.                   
    A14.[ THP service status ]                                  : Normal     
        The THP service is stopped.                        
Total numbers:14. Abnormal numbers:0. Warning numbers:1.

其中 Abnormal 为必须处理项,影响 openGauss 安装。Warning 可以不处理,不会影响 openGauss 安装。

  • 如果操作系统版本(A1)检查项检查结果为 Abnormal,需要将不属于混编范围的操作系统版本替换为混编范围内的操作系统版本。
  • 如果内核版本(A2)检查项检查结果为 Warning,则表示 openGauss 集群内操作系统平台的内核版本不一致。
  • 如果 Unicode 状态(A3)检查项检查结果为 Abnormal,需要将各主机的字符集设置为相同的字符集,可以在 /etc/profile 文件中添加 export LANG=en_US.UTF-8(XXX 为 Unicode 编码)。
  • 如果时区状态(A4)检查项检查结果为 Abnormal,需要将各主机的时区设置为相同时区,可以将 /usr/share/zoneinfo/ 目录下的时区文件(例如 /usr/share/zoneinfo/Asia/Shanghai )拷贝为 /etc/localtime 文件。
  • 如果交换内存状态(A5)检查项检查结果为 Abnormal,可能是因为 Swap 空间大于 Mem 空间,可减小 Swap 或者增大 Mem 空间。
  • 如果系统控制参数(A6)检查项检查结果为 Abnormal,可以使用以下两种方法进行设置:
    • 可以使用命令 gs_checkos -i B1 进行设置。
    • 根据错误提示信息,在 /etc/sysctl.conf 文件中进行设置。然后执行 sysctl -p 使其生效。
  • 如果文件系统配置状态(A7)检查项检查结果为 Abnormal,可以命令 gs_checkos -i B2 进行设置。
  • 如果磁盘配置状态(A8)检查项检查结果为 Abnormal,需在 /etc/fstab 文件中修改 XFS 磁盘挂载选项为 rw,noatime,inode64,allocsize=16m
  • 如果预读块大小(A9)检查项检查结果为 Abnormal,可以使用命令 gs_checkos -i B3 进行设置。
  • 如果 IO 调度状态(A10)检查项检查结果为 Abnormal,可以使用命令 gs_checkos -i B4 进行设置。
  • 如果网卡配置状态(A11)检查项检查结果为 Warning,可以使用命令 gs_checkos -i B5 进行设置。
  • 如果时间一致性(A12)检查项检查结果为 Abnormal,需检查是否安装 NTP 服务以及 NTP 服务是否启动,并与 NTP 时钟源同步。
  • 如果防火墙状态(A13)检查项检查结果为 Abnormal,需关闭防火墙服务。
  • 如果 THP 服务(A14)检查项检查结果为 Abnormal,可以使用命令 gs_checkos -i B6 进行设置。

例子:详细检查某一项

[root@opengauss ~]# /home/omm/gauss_om/script/gs_checkos -i A11 --detail
Checking items
    A11.[ Network card configuration status ]                   : Warning    
        [opengauss]
BondMode Null
        Warning reason: network 'ens33' 'mtu' RealValue '1500' ExpectedValue '8192'

Total numbers:1. Abnormal numbers:0. Warning numbers:1.

例子:设置所有参数

[root@opengauss ~]# 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
    B7. [ Set RemoveIPC value ]                                 : Normal
    B8. [ Set Session Process ]                                 : Normal
NOTICE: MTU value and some warning items can NOT be set. Please do it manually.
Total numbers:8. Abnormal numbers:0. Warning numbers:0.

gs_check

使用 gs_check 检查 openGauss 状态。包括全量的检查 openGauss 运行环境、操作系统环境、网络环境及数据库执行环境,也有助于在 openGauss 重大操作之前对各类环境进行全面检查,有效保证操作执行成功。

  • 扩容新节点检查只能在 root 用户下执行,其他场景都必须在 omm 用户下执行。
  • 必须指定 -i-e 参数,-i 会检查指定的单项,-e 会检查对应场景配置中的多项。
  • 如果 -i 参数中不包含 root 类检查项或 -e 场景配置列表中没有 root 类检查项,则不需要交互输入 root 权限的用户及其密码。
  • 可使用 --skip-root-items 跳过检查项中包含的 root 类检查,以免需要输入 root 权限用户及密码。
  • 检查扩容新节点与现有节点之间的一致性,在现有节点执行 gs_check 命令指定 --hosts 参数进行检查,其中 hosts 文件中需要写入新节点 IP。
  • 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] [--skip-root-items] [--time-out=SECS][--set][--routing][--skip-items]

其中:

  • -i ITEM:指定检查项,注意区分大小写。例如 -i CheckClusterState。检查项见下表,用户可以根据需求自己编写新检查项。
  • -e SCENE_NAME:指定场景名,注意区分大小写。例如 -e inspect。默认的场景包括:inspect(例行巡检)、upgrade(升级前巡检)、install(安装)、binary_upgrade(升级前巡检)、health(健康检查巡检)、slow_node(节点)、longtime(耗时长巡检),用户可以根据需求自己编写场景。
  • --skip-root-items:跳过需要 root 权限执行的检查项。
  • --skip-items:跳过指定的检查项。
  • --set:修复支持设置的 Abnormal 项。

检查项如下表:

巡检项检查内容是否支持--set
CheckCPU(检查 CPU 使用率)检查主机 CPU 占用率,如果 IDLE 大于 30% 并且 IOWAIT 小于 30%。则检查项通过,否则检查项不通过。
CheckFirewall(检查防火墙状态)检查主机防火墙状态,如果防火墙关闭则检查项通过,否则检查项不通过。
CheckTimeZone(检查时区一致性)检查 openGauss 内各节点时区,如果时区一致则检查通过,否则检查项不通过。
CheckSysParams(检查系统参数)检查各节点操作系统参数,判断是否等于预期值。检查项不满足 Warning 域则报 Warning,不满足 NG 域则检查项不通过,并打印不满足项。
详见上面的操作系统参数。
CheckOSVer(检查操作系统版本)检查 openGauss 内各个节点的操作系统版本信息,如果满足版本兼容列表且 openGauss 在同一混搭列表中则检查通过,否则检查不通过。
CheckNTPD(检查 NTPD 服务)检查系统 NTPD 服务,如果服务开启且各节点时间误差在 5 分钟以内则检查项通过,否则检查项不通过。
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(检查进程是否有残留)检查是否残留 gaussdbomm 进程,若未残留则检查项通过,否则检查项不通过。
CheckStack(栈深度检查)检查栈深度,若各个节点不一致则报 Warning ,若大于等于 3072 则检查项通过,否则不通过。
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 信息不相同检查项不通过。
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(检查内核版本)检查各节点系统内核版本信息,如果版本信息一致则检查项通过,否则不通过。
CheckEncoding(检查编码格式)检查 openGauss 内各个节点的系统编码,如果编码一致则检查项通过,否则检查项不通过。
CheckBootItems(检查启动项)检查是否有手动添加的启动项,如果没有则检查通过,否则检查不通过。
CheckFilehandle(检查文件句柄)此检查项检查以下两项,两项都通过为通过,否则为不通过:
检查每个 gaussdb 进程打开的进程数是否超过 80 万,不超过则检查通过,否则检查不通过。
检查是否有 slave 进程使用的句柄数超过 master 进程,如果没有则检查通过,否则检查不通过。
CheckKeyProAdj(检查关键进程 omm_adj 的值)检查所有关键进程,如果所有关键进程的 omm_adj 值不小于 0,则通过,否则不通过。
CheckMaxProcMemory(检查 max_process_memory 参数设置是否合理)检查数据库节点的 max_process_memory 值,判断该参数的值是否大于 1G,若不大于则检查项通过,否则检查项不通过。
CheckSwapMemory(检查交换内存)检查交换内存和总内存大小,若检查结果为 0 则检查项通过,否则检查项报 Warning,大于总内存时检查项不通过。
CheckLogicalBlock(检查磁盘逻辑块)检查磁盘逻辑块大小,若为 512 则检查项通过,否则检查项不通过。
CheckIOrequestqueue(检查 IO 请求)检查 IO 值,如果该值为 32768 则检查项通过,否则检查项不通过。
CheckMaxAsyIOrequests(检查最大异步 IO 请求)获取当前异步 IO 请求值,当前异步 IO 请求值大于当前节点数据库实例数*1048576 和 104857600 则检查项通过,否则检查项不通过。
CheckIOConfigure(检查 IO 配置)检查 IO 配置,如果是 deadline 则检查项通过,否则检查项不通过。
CheckBlockdev(检查磁盘预读块)检查磁盘预读块大小,如果预读块大小为 16384 则检查项通过,否则检查项不通过。
CheckDiskFormat(检查磁盘格式参数)检查磁盘 XFS 格式信息,如果配置为 inode64 则检查项通过,否则报 Warning;如果节点上无 XFS 格式硬盘,检查时提示相应信息。
CheckInodeUsage(检查磁盘 Inode 使用率)openGauss 路径(GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp 及实例目录)
检查以上指定目录使用率,如果使用率超过 Warning 阈值(默认为 60%) 报 Warning,超过 NG 阈值(默认为 80%)则检查项不通过,否则通过。
CheckSpaceUsage(检查磁盘使用率)openGauss 路径(GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp 及实例目录)
检查以上指定目录(目录列表)使用率,如果使用率超过 Warning 阈值(默认为 70%) 报 Warning,超过 NG 阈值(默认为 90%)则检查项不通过。
openGauss 路径下检查 GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp/data 路径的剩余空间,不满足阈值则检查项不通过,否则通过。
CheckDiskConfig(检查磁盘空间大小一致性)检查磁盘名大小挂载点是否一致,若一致则检查项通过,否则报 Warning。
CheckXid(检查 CheckXid 数值)查询 Xid 的数值,如果大于 10 亿报 Warning,大于 18 亿则检查项不通过。
CheckSysTabSize(检查每个实例的系统表容量)如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。
CheckClusterState(检查 openGauss 状态)检查 fencedUDF 状态,如果 fencedUDF 状态为 Down 则报 Warning;检查 openGauss 状态,如果 openGauss 状态为 Normal 则检查项通过,否则检查项不通过。
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(检查环境变量)检查节点环境变量(GAUSSHOMEGAUSSHOME、LD_LIBRARY_PATH、$PATH),检查 CMS/CMA/数据库节点进程的环境变量。如果环境变量存在并配置正确,进程的环境变量存在则检查项通过,否则检查项不通过。
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 进程属主)检查 gaussdb 进程属主,若不存在 omm 以外的属主则检查项通过,否则检查项不通过。
CheckSpecialFile(特殊文件检查)检查 tmp 目录(PGHOST)、OM 目录(GPHOME)、日志目录(GAUSSLOG)、data 目录、程序目录(GAUSSHOME)下文件是否存在特殊字符以及非 omm 用户的文件,若不存在则检查项通过,否则检查项不通过。
CheckCollector(检查 openGauss 的信息收集)output 目录下查看信息收集是否成功,若收集成功则检查项通过,否则检查项不通过。
CheckLargeFile(检查数据目录大文件)检查各个数据库节点目录是否存在超过 4G 的文件。任一数据库节点目录及其子目录有超过 4G 的单个文件,则检查不通过,否则检查通过。
CheckProStartTime(关键进程启动时间检测)检查关键进程启动时间是否间隔超过 5 分钟,超过则检查不通过,否则检查通过。
CheckDilateSysTab(检查系统表膨胀)检查系统表是否膨胀,若膨胀则不通过,否则检查通过。
CheckMpprcFile(检测环境变量分离文件改动)检查是否存在对环境变量分离文件的改动,若存在则检查不通过,否则检查通过。
CheckLockNum(检查锁数量)检查数据库锁数量,查询成功检查项通过。
CheckArchiveParameter(检查归档参数)检查数据库归档参数,如果未打开或打开且在数据库节点下则检查项通过, 打开且不在数据库主节点目录下则检查项不通过。
CheckCurConnCount(检查当前连接数)检查数据库连接数,如果连接数大于 0 并且小于最大连接数的 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 则检查项通过,否则检查项不通过。
CheckGUCConsistent(检查 GUC 参数一致性)检查数据库节点实例 GUC 参数的值是否一致,一致则检查项通过,否则检查项不通过。
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 数据库中 orcdate 类型列检查)检查 TD 模式数据库下的 orc 表中是否包含 date 类型的列,若包含检查不通过,否则检查通过。
CheckDropColumn(Drop Column检查)如果存在 Drop Column的表,则检查不通过,否则检查通过。
CheckDiskFailure(检查磁盘故障)对 openGauss 中的所有数据做全量查询,若存在查询错误则检查不通过,否则检查通过。
CheckPing(检查网络通畅)检查 openGauss 内所有节点的互通性,如果各节点所有 IP 均可 PING 通则检查项通过,否则检查项不通过。
CheckRXTX(检查网卡 RXTX 值)检查节点 backIP 的 RX/TX 值,如果该值为 4096 则检查项通过,否则检查项不通过。
CheckMTU(检查网卡 MTU 值)检查节点 backIP 对应的网卡 MTU 值( Bond 后的物理网卡要确保一致),如果该值不是 8192 或 1500 报 Warning,若 openGauss MTU值一致则检查项通过,否则检查项不通过。
CheckNetWorkDrop(检查网络掉包率)检查各 IP 1分钟内网络掉包率,如果不超过 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% 通过。
CheckNICModel(网卡型号和驱动版本一致性检查)检查各个节点的网卡型号以及驱动版本是否一致,一致则通过,否则报 Warning。
CheckRouting(本地路由表检查)检查各节点在业务 IP 网段的 IP 个数,超过 1 个则报 Warning,否则检查通过。
CheckNetSpeed(检查网卡接收带宽,Ping 值,丢包率)网络满载时,检查网卡平均接收带宽大于 600MB 通过;
网络满载时,检查网络 Ping 值,小于 1 秒通过;
网络满载时,检查网卡丢包率,小于 1% 通过。
CheckDataDiskUsage(检查数据库节点磁盘空间使用率)检查磁盘数据库节点目录使用率,如果使用率低于 90% 则检查项通过,否则检查项不通过。

例子:检查数据库状态

[omm@opengauss ~]$ gs_check -i CheckClusterState
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:1


Checking...               [                         ] 0/1
Checking...               [=========================] 1/1
Start to analysis the check result
CheckClusterState...........................OK
The item run on 1 nodes.  success: 1 

Analysis the check result successfully
Success.        All check items run completed. Total:1   Success:1    
For more information please refer to /opt/huawei/install/om/script/gspylib/inspection/output/CheckReport_20250317533383298.tar.gz

例子:对 openGauss 进行例行巡检并修复异常项

[omm@opengauss ~]$ gs_check -e inspect --set
Parsing the check items config file successfully
The below items require root privileges to execute:[CheckDirPermissions CheckBlockdev CheckSwapMemory CheckLogicalBlock CheckIOrequestqueue CheckIOrequestqueue CheckMaxAsyIOrequests CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckMaxHandle CheckSysParams CheckTHP CheckSshdService CheckSshdConfig CheckCrondService CheckStack CheckSysPortRange 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:57 Nodes:1


Checking...               [                         ] 0/57
Checking...               [                         ] 1/57
Checking...               [                         ] 3/57
Checking...               [                         ] 4/57
Checking...               [                         ] 7/57
Checking...               [                         ] 8/57
Checking...               [                         ] 9/57
Checking...               [                         ] 18/57
Checking...               [                         ] 19/57
Checking...               [                         ] 20/57
Checking...               [                         ] 29/57
Checking...               [                         ] 32/57
Checking...               [                         ] 39/57
Checking...               [                         ] 40/57
Checking...               [                         ] 41/57
Checking...               [                         ] 42/57
Checking...               [                         ] 43/57
Checking...               [                         ] 45/57
Checking...               [                         ] 46/57
Checking...               [                         ] 47/57
Checking...               [                         ] 48/57
Checking...               [                         ] 49/57
Checking...               [                         ] 55/57
Checking...               [=========================] 57/57
Start to analysis the check result
CheckClusterState...........................OK
The item run on 1 nodes.  success: 1 

CheckDBParams...............................OK
The item run on 1 nodes.  success: 1 

CheckDebugSwitch............................OK
The item run on 1 nodes.  success: 1 

CheckDirPermissions.........................OK
The item run on 1 nodes.  success: 1 

CheckReadonlyMode...........................OK
The item run on 1 nodes.  success: 1 

CheckEnvProfile.............................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
GAUSSHOME        /opt/huawei/install/app
LD_LIBRARY_PATH  /opt/huawei/install/app/lib
PATH             /opt/huawei/install/app/bin


CheckBlockdev...............................OK
The item run on 1 nodes.  success: 1 

CheckCurConnCount...........................OK
The item run on 1 nodes.  success: 1 

CheckCursorNum..............................OK
The item run on 1 nodes.  success: 1 

CheckPgxcgroup..............................OK
The item run on 1 nodes.  success: 1 

CheckDiskFormat.............................OK
The item run on 1 nodes.  success: 1 

CheckSpaceUsage.............................OK
The item run on 1 nodes.  success: 1 

CheckInodeUsage.............................OK
The item run on 1 nodes.  success: 1 

CheckSwapMemory.............................OK
The item run on 1 nodes.  success: 1 

CheckLogicalBlock...........................OK
The item run on 1 nodes.  success: 1 

CheckIOrequestqueue.........................OK
The item run on 1 nodes.  success: 1 

CheckMaxAsyIOrequests.......................OK
The item run on 1 nodes.  success: 1 

CheckIOConfigure............................OK
The item run on 1 nodes.  success: 1 

CheckMTU....................................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
1500

CheckPing...................................OK
The item run on 1 nodes.  success: 1 

CheckRXTX...................................OK
The item run on 1 nodes.  success: 1 

CheckNetWorkDrop.........................ERROR
The item run on 1 nodes.  error: 1 
The error[opengauss] value:
[GAUSS-53041]: ERROR: Execute Shell command faild: su - omm -c "source /etc/profile 2>/dev/null; export LC_ALL=C; pssh -s -P -H  192.168.92.129 \"/sbin/ifconfig\"|
grep -B 5 \"192.168.92.129\"|grep \"RUNNING\" " , the exception is:

CheckMultiQueue.............................OK
The item run on 1 nodes.  success: 1 

CheckEncoding...............................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
LANG=en_US.UTF-8

CheckFirewall...............................OK
The item run on 1 nodes.  success: 1 

CheckKernelVer..............................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
3.10.0-1160.el7.x86_64

CheckMaxHandle..............................OK
The item run on 1 nodes.  success: 1 

CheckNTPD...................................NG
opengauss: NTPD service is not running, 2025-03-17 15:13:15

CheckOSVer..................................OK
opengauss: The current OS is centos 7.9 64bit.


CheckSysParams..............................OK
The item run on 1 nodes.  success: 1 

CheckTHP....................................OK
The item run on 1 nodes.  success: 1 

CheckTimeZone...............................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
+0800

CheckCPU....................................OK
The item run on 1 nodes.  success: 1 

CheckSshdService............................OK
The item run on 1 nodes.  success: 1 

CheckSshdConfig.........................WARNING
The item run on 1 nodes.  warning: 1 
The warning[opengauss] value:

Warning reason: UseDNS parameter is not set; expected: no

CheckCrondService...........................OK
The item run on 1 nodes.  success: 1 

CheckStack..................................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
8192

CheckSysPortRange...........................OK
The item run on 1 nodes.  success: 1 

CheckMemInfo................................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
totalMem: 3.682422637939453G

CheckHyperThread............................NG
The item run on 1 nodes.  ng: 1 
The ng[opengauss] value:
Hyper-threading is down.

CheckTableSpace.............................OK
The item run on 1 nodes.  success: 1 

CheckSysadminUser...........................OK
The item run on 1 nodes.  success: 1 

CheckGUCConsistent..........................OK
All DN instance guc value is consistent.

CheckMaxProcMemory..........................NG
The item run on 1 nodes.  ng: 1 
The ng[opengauss] value:
parameter max_process_memory setting should not be bigger than recommended(kb):1544520:
RecommendedMaxMem is 1544520
DN_6001 : 2097152


CheckBootItems..............................OK
The item run on 1 nodes.  success: 1 

CheckHashIndex..............................OK
The item run on 1 nodes.  success: 1 

CheckPgxcRedistb............................OK
The item run on 1 nodes.  success: 1 

CheckNodeGroupName..........................OK
The item run on 1 nodes.  success: 1 

CheckTDDate.................................OK
The item run on 1 nodes.  success: 1 

CheckDilateSysTab...........................OK
The item run on 1 nodes.  success: 1 

CheckKeyProAdj..............................OK
The item run on 1 nodes.  success: 1 

CheckProStartTime...........................OK
Basically ,all the gaussdb process start at the same time

CheckFilehandle.............................OK
The item run on 1 nodes.  success: 1 

CheckRouting................................OK
The item run on 1 nodes.  success: 1 

CheckNICModel...............................OK
The item run on 1 nodes.  success: 1  (consistent) 
The success on all nodes value:
version: 7.3.21-k8-NAPI
model: Intel Corporation 82545EM Gigabit Ethernet Controller


CheckDropCache..........................WARNING
The item run on 1 nodes.  warning: 1 
The warning[opengauss] value:
No DropCache process is running

CheckMpprcFile..............................NG
The item run on 1 nodes.  ng: 1 
The ng[opengauss] value:
There is no mpprc file

Analysis the check result successfully
Failed. All check items run completed. Total:57   Success:50   Warning:2   NG:4   Error:1 
For more information please refer to /opt/huawei/install/om/script/gspylib/inspection/output/CheckReport_inspect_202503175477019415.tar.gz

无法自动修复的异常项,参考以下内容进行修复:

检查项异常状态处理方法
CheckClusterState(检查 openGauss 状态)openGauss 未启动或 openGauss 实例未启动使用以下命令启动openGauss及实例。
gs_om -t start
CheckClusterState(检查 openGauss 状态)openGauss 状态异常或 openGauss 实例异常检查各主机、实例状态,根据状态信息进行排查。
gs_check -i CheckClusterState
CheckDBParams(检查数据库参数)数据库参数错误通过 gs_guc 工具修改数据库参数为指定值。
CheckDebugSwitch(检查调试日志)日志级别不正确使用 gs_guc 工具将 log_min_messages 改为指定内容。
CheckDirPermissions(检查目录权限)路径权限错误修改对应目录权限为指定数值(750/700)。
chmod 700 DIR
CheckReadonlyMode(检查只读模式)只读模式被打开确认数据库节点所在磁盘使用率未超阈值(默认 85%)且未在执行其他运维操作。
gs_check -i CheckDataDiskUsage
ps ux
使用 gs_guc 工具关闭 openGauss 只读模式。
gs_guc reload -N all -I all -c 'default_transaction_read_only = off'
CheckEnvProfile(检查环境变量)环境变量不一致重新执行前置更新环境变量信息。
CheckBlockdev(检查磁盘预读块)磁盘预读块大小不为 16384使用 gs_checkos 设置预读块大小为 16384KB,并写入自启动文件。
gs_checkos -i B3
CheckCursorNum(检查游标数)检查游标数失败检查数据库能否正常连接,openGauss 状态是否正常。
CheckPgxcgroup(检查重分布状态)有未完成重分布的 pgxc_group继续完成扩容或缩容的数据重分布操作。
gs_expandgs_shrink
CheckDiskFormat(检查磁盘配置)各节点磁盘配置不一致将各节点的磁盘规格改为相同。
CheckSpaceUsage(检查磁盘空间使用率)磁盘可用空间不足清理或扩展对应目录所在的磁盘。
CheckInodeUsage(检查磁盘索引使用率)磁盘可用索引不足清理或扩展对应目录所在的磁盘。
CheckSwapMemory(检查交换内存)交换内存大于物理内存将交换内存调小或关闭。
CheckLogicalBlock(检查磁盘逻辑块)磁盘逻辑块大小不为512使用 gs_checkos 修改磁盘逻辑块大小为 512KB,并写入开机自启动文件。
gs_checkos -i B4
CheckIOrequestqueue(检查 IO 请求)IO 请求值不为 32768使用 gs_checkos 设置 IO 请求值为 32768,并写入开机自启动文件。
gs_checkos -i B4
CheckCurConnCount(检查当前连接数)当前连接数超过最大连接数的 90%断开未使用的数据库主节点连接。
CheckMaxAsyIOrequests(检查最大异步请求)最大异步请求值小于 104857600 或当前节点数据库实例数乘以 1048576使用 gs_checkos 设置最大异步请求值为 104857600 和当前节点数据库实例数乘以 1048576 中的最大值。
gs_checkos -i B4
CheckMTU(检查 MTU 值)MTU 值不一致设置各节点的 MTU 一致为 1500 或 8192。
ifconfig eth* MTU 1500
CheckIOConfigure(检查 IO 配置)IO 配置不是 deadline使用 gs_checkos 设置 IO 配置为 deadline,并写入开机自启动文件。
gs_checkos -i B4
CheckRXTX(检查 RXTX 值)网卡 RX/TX 值不是 4096使用 gs_checkos 设置 openGauss 使用的物理网卡 RX/TX 值为 4096。
gs_checkos -i B5
CheckPing(检查网络通畅)存在 openGauss IP 无法 ping检查异常 IP 间网络设置和状态、防火墙状态。
CheckNetWorkDrop(检查网络丢包率)网络通信丢包率高于1%检查对应 IP 间网络负载、状态。
CheckMultiQueue(检查网卡多队列)未开启网卡多队列并未将网卡中断绑定到不同 CPU 核心开启网卡多队列并将网卡队列中断绑定到不同的 CPU 核心。
CheckEncoding(检查编码格式)各节点编码格式不一致/etc/profile 中写入一致的编码信息。
echo "export LANG=XXX" >> /etc/profile
CheckFirewall(检查防火墙)防火墙未关闭关闭防火墙服务。
systemctl disable firewalld.service
systemctl stop firewalld.service
CheckMaxHandle(检查最大文件句柄数)最大文件句柄数小于 1000000设置 /etc/security/limits.d/90-nofile.conf 最大文件句柄数软硬限制为 1000000。
gs_checkos -i B2
CheckNTPD(检查时间同步服务)NTPD 服务未开启或时间误差超过一分钟开启 NTPD 服务并设置时钟一致。
CheckSysParams(检查操作系统参数)操作系统参数设置不满足要求使用 gs_checkos 进行参数设置或手动设置。
gs_checkos -i B1
vim /etc/sysctl.conf
CheckTHP(检查 THP 服务)THP 服务未开启使用 gs_checkos 设置 THP 服务。
gs_checkos -i B6
CheckTimeZone(检查时区)时区不一致设置各节点为同一时区。
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
CheckCPU(检查 CPU)CPU 占用过高或 IO 等待过高进行 CPU 配置升级或磁盘性能升级。
CheckSshdService(检查 SSHD 服务)未开启 SSHD 服务启动 SSHD 服务并配置开机自启动。
systemctl start sshd
systemctl enable sshd
CheckSshdConfig(检查 SSHD 配置)SSHD 服务配置错误设置 SSHD 服务:
PasswordAuthentication=no;
MaxStartups=1000;
UseDNS=yes;
ClientAliveInterval=10800/ClientAliveInterval=0
并重启服务:
启动 SSHD 服务并配置开机自启动。
systemctl restart sshd
CheckCrondService(检查 Crond 服务)Crond 服务未启动安装 Crond 服务并启用。
CheckStack(检查堆栈大小)堆栈大小小于 3072使用 gs_checkos 设置为 3072 并重启堆栈值过小进程。
gs_checkos -i B2
CheckSysPortRange(检查系统端口设置)系统 IP 端口不在预期范围内或 openGauss 端口在系统 IP 端口内设置系统 IP 端口范围参数到 26000-65535 之中;设置 openGauss 端口在系统 IP 端口范围外。
vim /etc/sysctl.conf
CheckMemInfo(检查内存信息)各节点内存大小不一致使用相同规格的物理内存。
CheckHyperThread(检查超线程)未开启 CPU 超线程开启 CPU 超线程。
CheckTableSpace(检查表空间)表空间路径和 openGauss 路径存在嵌套或表空间路径相互存在嵌套将表空间数据迁移到路径合法的表空间中。

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;

语法:

gs_checkperf [-U USER] [-o OUTPUT] [-i ITEM] [--detail] [-l LOGFILE]

其中:

  • -i ITEM:指定检查项。检查项如下:
    • PMK:Platter Magnetic Disk 表示机械硬盘。只有 omm 用户才能检查 PMK 选项。如果不指定该参数,以 omm 用户身份默认检查 PMK。
    • SSD:Solid State Drive 表示固态硬盘。只有 root 用户才能检查 SSD 选项。如果不指定该参数,以 root 用户身份默认检查SSD。
  • --detail:显示 PMK 检查结果详情。

例子:以简要格式在屏幕上显示性能统计结果

[omm@opengauss ~]$ gs_checkperf 
Cluster statistics information:
    Host CPU busy time ratio                     :    3.33       %
    MPPDB CPU time % in busy time                :    92.82      %
    Shared Buffer Hit ratio                      :    98.81      %
    In-memory sort ratio                         :    0
    Physical Reads                               :    1142
    Physical Writes                              :    112
    DB size                                      :    68         MB
    Total Physical writes                        :    112
    Active SQL count                             :    4
    Session count                                :    7

例子:以详细格式在屏幕上显示性能统计结果

[omm@opengauss ~]$ gs_checkperf --detail
Cluster statistics information:
Host CPU usage rate:
    Host total CPU time                          :    20622540.000 Jiffies
    Host CPU busy time                           :    702360.000 Jiffies
    Host CPU iowait time                         :    11280.000  Jiffies
    Host CPU busy time ratio                     :    3.41       %
    Host CPU iowait time ratio                   :    .05        %
MPPDB CPU usage rate:
    MPPDB CPU time % in busy time                :    93.05      %
    MPPDB CPU time % in total time               :    3.17       %
Shared buffer hit rate:
    Shared Buffer Reads                          :    10464
    Shared Buffer Hits                           :    881411
    Shared Buffer Hit ratio                      :    98.83      %
In memory sort rate:
    In-memory sort count                         :    0
    In-disk sort count                           :    0
    In-memory sort ratio                         :    0
I/O usage:
    Number of files                              :    107
    Physical Reads                               :    1274
    Physical Writes                              :    264
    Read Time                                    :    425620     ms
    Write Time                                   :    3651       ms
Disk usage:
    DB size                                      :    69         MB
    Total Physical writes                        :    264
    Average Physical write                       :    72308.96
    Maximum Physical write                       :    264
Activity statistics:
    Active SQL count                             :    4
    Session count                                :    7
Node statistics information:
dn_6001:
    MPPDB CPU Time                               :    653540     Jiffies
    Host CPU Busy Time                           :    702360     Jiffies
    Host CPU Total Time                          :    20622540   Jiffies
    MPPDB CPU Time % in Busy Time                :    93.05      %
    MPPDB CPU Time % in Total Time               :    3.17       %
    Physical memory                              :    3953971200 Bytes
    DB Memory usage                              :    6675652608 Bytes
    Shared buffer size                           :    750780416  Bytes
    Shared buffer hit ratio                      :    98.83      %
    Sorts in memory                              :    0
    Sorts in disk                                :    0
    In-memory sort ratio                         :    0
    Number of files                              :    107
    Physical Reads                               :    1274
    Physical Writes                              :    264
    Read Time                                    :    425620
    Write Time                                   :    3651
Session statistics information(Top 10):
Session CPU statistics:
1 dn_6001-postgres-omm:
    Session CPU time                             :    3
    Database CPU time                            :    653610
    Session CPU time %                           :    0.00       %
2 dn_6001-postgres-omm:
    Session CPU time                             :    0
    Database CPU time                            :    653610
    Session CPU time %                           :    0.00       %
3 dn_6001-postgres-omm:
    Session CPU time                             :    0
    Database CPU time                            :    653610
    Session CPU time %                           :    0.00       %
4 dn_6001-postgres-omm:
    Session CPU time                             :    0
    Database CPU time                            :    653610
    Session CPU time %                           :    0.00       %

Session Memory statistics:
1 dn_6001-postgres-omm:
    Buffer Reads                                 :    607
    Shared Buffer Hit ratio                      :    84.66
    In Memory sorts                              :    0
    In Disk sorts                                :    0
    In Memory sorts ratio                        :    0
    Total Memory Size                            :    9423264
    Used Memory Size                             :    7379136
2 dn_6001-postgres-omm:
    Buffer Reads                                 :    241
    Shared Buffer Hit ratio                      :    100.00
    In Memory sorts                              :    0
    In Disk sorts                                :    0
    In Memory sorts ratio                        :    0
    Total Memory Size                            :    9278872
    Used Memory Size                             :    7348616
3 dn_6001-postgres-omm:
    Buffer Reads                                 :    219
    Shared Buffer Hit ratio                      :    99.55
    In Memory sorts                              :    0
    In Disk sorts                                :    0
    In Memory sorts ratio                        :    0
    Total Memory Size                            :    9254296
    Used Memory Size                             :    7341408
4 dn_6001-postgres-omm:
    Buffer Reads                                 :    370
    Shared Buffer Hit ratio                      :    100.00
    In Memory sorts                              :    1
    In Disk sorts                                :    0
    In Memory sorts ratio                        :    100.00
    Total Memory Size                            :    15418840
    Used Memory Size                             :    12132632

Session IO statistics:
1 dn_6001-postgres-omm:
    Physical Reads                               :    110
    Read Time                                    :    69121
2 dn_6001-postgres-omm:
    Physical Reads                               :    1
    Read Time                                    :    1808
3 dn_6001-postgres-omm:
    Physical Reads                               :    0
    Read Time                                    :    0
4 dn_6001-postgres-omm:
    Physical Reads                               :    0
    Read Time                                    :    0

如果检查结果发现异常,可以根据以下内容进行修复:

异常状态处理方法
CPU 使用率过高1. 更换和增加高性能的CPU。
2. 使用 top 命令查看系统哪些进程的 CPU 占有率高,然后使用 kill 命令关闭没有使用的进程。
3. 使用 gs_expand 工具扩容,增加新的主机均衡 CPU 占有率。
I/O 使用率过高1. 更换高性能的磁盘。
2. 调整数据布局,尽量将 I/O 请求较合理的分配到所有物理磁盘中。
3. 全库进行 VACUUM FULL 操作。
4. 降低并发数。
内存使用率过高扩大内存或清理占用大量内存的进程。

审计

数据库安全对数据库系统来说至关重要。openGauss 将用户对数据库的所有操作写入审计日志。数据库安全管理员可以利用这些日志信息,重现导致数据库现状的一系列事件,找出非法操作的用户、时间和内容等。

关于审计功能,用户需要了解以下几点内容:

  • 审计总开关 audit_enabled 支持动态加载。在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。默认值为 on,表示开启审计功能。
  • 除了审计总开关,各个审计项也有对应的开关。只有开关开启,对应的审计功能才能生效。
  • 各审计项的开关支持动态加载。在数据库运行期间修改审计开关的值,不需要重启数据库便可生效。

目前,openGauss 支持以下审计项:

配置项描述
用户登录、注销审计参数:audit_login_logout
默认值为 7,表示开启用户登录、退出的审计功能。设置为 0 表示关闭用户登录、退出的审计功能。不推荐设置除 07 之外的值。
数据库启动、停止、恢复和切换审计参数:audit_database_process
默认值为 1,表示开启数据库启动、停止、恢复和切换的审计功能。
用户锁定和解锁审计参数:audit_user_locked
默认值为 1,表示开启审计用户锁定和解锁功能。
用户访问越权审计参数:audit_user_violation
默认值为 0,表示关闭用户越权操作审计功能。
授权和回收权限审计参数:audit_grant_revoke
默认值为 1,表示开启审计用户权限授予和回收功能。
对用户操作进行全量审计参数:full_audit_users
默认值为空字符串,表示采用默认配置,未配置全量审计用户。
不需要审计的客户端名称及 IP 地址参数:no_audit_client
默认值为空字符串,表示采用默认配置,未将客户端及 IP 加入审计黑名单。
数据库对象的 CREATE,ALTER,DROP 操作审计参数:audit_system_object
默认值为 67121159,表示只对 DATABASE、SCHEMA、USER、DATA SOURCE、SQL PATCH 这五类数据库对象的 CREATE、ALTER、DROP 操作进行审计。
具体表的 INSERT、UPDATE 和 DELETE 操作审计参数:audit_dml_state
默认值为 0,表示关闭具体表的 DML 操作(SELECT 除外)审计功能。
SELECT 操作审计参数:audit_dml_state_select
默认值为 0,表示关闭 SELECT 操作审计功能。
COPY 审计参数:audit_copy_exec
默认值为 1,表示开启 COPY 操作审计功能。
存储过程和自定义函数的执行审计参数:audit_function_exec
默认值为 0,表示不记录存储过程和自定义函数的执行审计日志。
执行白名单内的系统函数审计参数:audit_system_function_exec
默认值为 0,表示不记录执行系统函数的审计日志。
SET 审计参数:audit_set_parameter
默认值为 0,表示关闭 SET 审计功能。
事务 ID 记录参数:audit_xid_info
默认值为 0,表示关闭审计日志记录事务 ID 功能。

查看审计结果

前提条件:

  • 审计功能总开关已开启。
  • 需要审计的审计项开关已开启。
  • 数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。
  • 数据库各个节点审计日志单独记录。

只有拥有 AUDITADMIN 属性的用户才可以查看审计记录。

语法:

select * from pg_query_audit(timestamptz startime,timestamptz endtime,audit_log);

其中:

  • startime:审计记录的开始时间
  • endtime:审计记录的结束时间
  • audit_log:所查看的审计日志信息所在的物理文件路径,当不指定时,默认查看连接当前实例的审计日志信息

例子:查询某个用户在某个时间段的登录情况

omm@postgres=# select time,type,result,username,database,client_conninfo from pg_query_audit('2025-04-30 14:00:00','2025-04-30 14:15:00') where username ='stone';
          time          |     type      | result | username | database | client_conninfo 
------------------------+---------------+--------+----------+----------+-----------------
 2025-04-30 14:13:46+08 | login_failed  | failed | stone    | postgres | dn_6001@[local]
 2025-04-30 14:13:46+08 | login_success | ok     | stone    | postgres | gsql@[local]
 2025-04-30 14:14:54+08 | user_logout   | ok     | stone    | postgres | gsql@[local]
(3 rows)

维护审计日志

审计日志相关配置参数:

配置项含义默认值
audit_directory审计文件的存储目录。/var/log/omm/omm/pg_audit/dn_6001
audit_resource_policy审计日志的保存策略。on(表示使用空间配置策略)
audit_space_limit审计文件占用的磁盘空间总量。1GB
audit_file_remain_time审计日志文件的最小保存时间。90
audit_file_remain_threshold审计目录下审计文件的最大数量。1048576

审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计文件,并记录审计文件删除信息到审计日志中。

使用函数 pg_delete_audit 手动删除审计日志,语法:

SELECT pg_delete_audit(timestamp startime,timestamp endtime)

例子:删除某个时间段的审计日志

omm@postgres=# SELECT pg_delete_audit('2025-04-20 00:00:00','2025-04-25 23:59:59');
 pg_delete_audit 
-----------------
 
(1 row)

安全加固

openGauss 安全加固的主要目的是提高数据库系统的安全性,确保数据的保密性、完整性和可用性。通过实施一系列的安全加固措施,可以减少系统面临的潜在安全风险,如未经授权的访问、数据泄露、恶意攻击等,从而保护用户数据的安全和业务的正常运行。

用户可以通过手动修改 openGauss 的配置文件(如 postgresql.confpg_hba.conf 等),以调整数据库的安全设置,如密码策略、访问控制、加密通信等。

用户还可以调整数据库的角色和权限设置,确保只有授权的用户能够访问和操作数据库。

加固内容主要分为以下10个部分:

  • 连接配置
  • 文件目录安全
  • 安全认证配置
  • 账号口令管理
  • 权限管理
  • 数据库审计
  • 错误报告和日志配置
  • WAL归档配置
  • 运行环境配置
  • 其它配置

加固影响说明如下表:

加固项建议加固易用性影响openGauss 默认是否设置了该加固项
确保对外服务端口使用非默认端口号参数 port 为数据库服务侦听的 TCP 端口号。采用默认端口号容易被恶意攻击者获取并攻击,需将对外服务端口号配置为非默认端口号。默认端口号请参考产品相关文档说明。参数 port 由安装时的配置文件指定,请勿轻易修改,否则修改后会影响数据库正常通信。
确保数据库实例的最大连接数配置正确参数 max_connections 控制数据库 DN 实例的最大连接数。参数设置过大可能引起数据库请求更多的 System V 共享内存或者信号量,导致超出操作系统默认配置允许的值。用户需要根据业务规格确定参数值的大小或咨询技术支持。此参数会影响数据库的并发能力。
确保数据库的最大连接数配置正确为了控制访问数据库的会话数量,推荐配置会话数量限制在 1024 个以内。若设置参数 datconnlimit-1,表示不限制连接数据库的会话数量。参数 datconnlimit 设置过小会影响数据库最大并发连接数,设置过大或不限制可能会由于会话数量超出系统负载能力,影响数据库的可用性。
确保用户的最大连接数配置正确在 openGauss 数据库中,不应该允许用户无限制数量的连接。如果用户参数 rolconnlimit 设置为 -1,表示允许无限制数量的并发连接。根据业务需求限制不同用户的最大连接数,可避免连接被某个用户全部占用。当前用户实际连接数超过用户的最大连接数限制后无法创建新连接。
确保没有 host 条目的用户指定为 allhost 条目配置 userall 表示允许所有用户连接到数据库。推荐 host 条目的 user 取值仅为需要连接数据库的用户。如果用户需要连接数据库,但 pg_hba.conf 中没有添加对该用户的配置会导致连接失败。
确保客户端认证超时时间配置正确参数 authentication_timeout 控制完成客户端认证的时间上限,默认为一分钟。如果一个客户端没有在参数设定时间内完成与服务器端的认证,则服务器自动中断与客户端的连接,这样就避免了出问题的客户端无限制地占用连接数。参数值设置过小可能因超时导致认证失败。
确保认证加密迭代次数配置正确通过 auth_iteration_count 参数配置对认证凭据进行单向哈希时的迭代次数。迭代次数设置过小会降低口令存储的安全性,设置过大会导致创建用户和认证等涉及口令加密的场景性能劣化。请根据实际硬件条件合理设置迭代次数,迭代次数最低应设置为 10000 次。参数值设置过大会导致创建用户和认证等涉及口令加密的场景性能劣化,推荐采用默认迭代次数。
确保账户登录失败尝试次数配置正确通过参数 failed_login_attempts 配置帐户登录失败尝试次数可以防止口令被暴力破解。参数 failed_login_attempts 默认值为 10,表示连续认证失败次数超过 10 次后,帐户将被自动锁定。配置参数 failed_login_attempts 为非 0 时,当连续认证失败次数超过此参数值后,帐户将被自动锁定。
确保首次登陆时修改初始用户的密码初始用户是权限最高、id10 的系统管理员。如果在安装数据库时未指定初始用户的密码,则默认密码为空。安装完成后首次登陆时需要修改初始用户的密码。如果初始用户密码为空并且没有被及时修改,容易引起低成本的攻击事件,也容易引起外界质疑,带来安全风险。初始用户的密码需要妥善保管,如果忘记数据库初始用户密码则无法找回。
确保配置用户的有效期限创建用户或角色时,使用 VALID BEGIN 关键字设置用户的有效开始时间,VALID UNTIL 关键字设置用户的有效结束时间。如果忽略这两个关键字,则用户或角色将长期有效。数据库服务端各节点的用户过期时间以各节点操作系统的时钟为依据。为确保服务端各节点的时间一致性,建议在安装部署数据库时使用 NTP(网络时间协议)。若忽略这一配置,可能存在各节点登录帐户过期时间不一致的风险。因此,建议根据业务需要合理地配置用户或角色的有效期,并及时清理无用的过期用户或角色。配置用户有效期后,当用户不在有效期限范围内时,将无法与数据库建立连接。
确保配置密码的有效期限通过 password_effect_time 参数可以配置用户登录密码的有效期,而 password_notify_time 参数则用于配置密码到期前多少天进行提醒。一旦密码达到过期提醒的时间,系统会在用户登录数据库时提示用户修改密码。建议用户定期更新密码,提升密码使用的安全性。考虑到数据库使用的特殊性及业务连续性,密码过期后用户仍然可以登录数据库,但每次登录时系统都会提示用户修改密码,直至密码被修改为止。
禁止 PUBLIC 角色在 public 模式下拥有 CREATE 权限如果 PUBLIC 角色在 public 模式下拥有 CREATE 权限,则任何用户都可以在 public 模式下创建表或者其他数据库对象,这可能导致安全风险,因为其他用户也可以查看和修改这些表和数据库对象。此外,为了解决 CVE-2018-1058 漏洞问题,应禁止 PUBLIC 角色在 public 模式下拥有 CREATE 权限。配置后 PUBLIC 角色在 public 模式下无 CREATE 权限。
禁止 PUBLIC 角色执行 SECURITY DEFINER 类型的函数在创建函数时声明 SECURITY DEFINER 表示函数以创建它的用户权限执行,如果使用不当会导致函数执行者借助创建者的权限执行越权操作,所以一定确保这样的函数不被滥用。为了安全考虑,禁止 PUBLIC 角色执行 SECURITY DEFINER 类型的函数。另外需要说明的是,SECURITY DEFINER 和 AUTHID DEFINER 的功能相同。禁止 PUBLIC 角色执行 SECURITY DEFINER 类型的函数后,如果其他用户需要执行此函数需要单独授予相应权限,否则会因权限不足导致执行失败。
确保开启三权分立配置设置参数 enableSeparationOfDutyon会 开启三权分立配置,限制系统管理员的权限,系统管理员不再拥有创建用户或更改用户配置权限,并且不再拥有查看和维护数据库审计日志的权限。当开启三权分立时,建议用户关闭 GUC 参数 enable_copy_server_files 来控制系统管理员的 COPY 权限,防止系统管理员通过 COPY 命令读取或者修改用户配置文件。三权分立特性的详细说明请 参见相关产品文档。如需使用三权分立权限管理模型,应在数据库初始化阶段指定,不建议来回切换权限管理模型。特别的,如需从非三权分立切换至三权分立权限管理模型,应重新审视已有用户的权限集合是否合理。
确保取消系统管理员服务端文件 COPY 权限参数 enable_copy_server_files 允许系统管理员用户执行服务端文件的 COPY 操作,但远程 COPY 操作存在越权查看或修改敏感文件的风险。在生产环境下的数据库中,通常不建议打开该配置。该参数的默认值为 off,表示只允许初始用户执行 COPY FROM FILENAMECOPY TO FILENAME 语句。取消系统管理员的服务端文件 COPY 权限后,系统管理员将无法进行服务端文件的 COPY 操作。这一配置对初始用户无影响。
确保开启数据库审计功能审计日志记录是安全事件中事后追溯、定位问题原因及划分事故责任的重要手段。推荐开启数据库审计功能,将参数 audit_enabled 设置为 on审计日志以二进制形式存储于 pg_audit 目录,开启审计功能后会增加磁盘空间占用,并对性能有一定影响。
确保开启数据库对象的查询审计参数 audit_dml_state_select 决定是否对数据库对象的 SELECT 操作进行审计,默认值为 0 表示不开启。开启此选项可以追溯用户对数据库的查询操作,但通常数据库查询操作使用相对频繁,开启此选项后会影响查询性能,并且会导致审计日志记录增加、占用更多磁盘空间。用户可根据业务需要决定是否开启。
确保审计优先策略配置正确控制审计日志的保存策略,以空间还是时间限制为优先策略。空间策略可以保证审计日志磁盘占用的上限,但是不保证历史审计日志存留;时间限制策略保证特定时间段审计日志的保留,可能日志占用空间会变大。
确保单个审计文件的最长记录时间配置正确参数 audit_rotation_interval 设置单个审计日志文件的最长记录时间。如果超过这个时间,将自动创建一个新的审计日志文件。参数值设置过小会导致频繁产生审计日志文件。设置过大会导致单个文件记录日志过多、文件占用空间较大,不利于审计日志文件管理。请勿随意调整此参数,否则可能导致 audit_resource_policy 参数无法生效。
确保单个审计日志文件的最大容量配置正确参数 audit_rotation_size 设置单个审计日志文件最大的容量。当审计日志文件达到最大容量时,将自动创建一个新的日志文件。参数值设置过小会导致频繁产生审计日志文件。设置过大会导致单个文件记录日志过多、文件占用空间较大,不利于审计日志文件管理。请不要随意调整此参数,否则可能会导致 audit_resource_policy 参数无法生效。
确保所有审计日志文件占用的最大磁盘空间配置正确参数 audit_space_limit 设置审计文件所占的最大磁盘空间。当审计文件总量超过最大值时,系统将在数据库日志文件中写入警告信息,并删除最早的审计文件,同时记录审计文件删除信息到审计日志中。设置参数值过大会增加磁盘空间占用。参数值过小则审计日志留存时间变短,可能导致重要日志信息丢失。
确保审计日志文件最大数目配置正确参数 audit_file_remain_threshold 设置审计日志文件的最大保留数量。当审计文件总数超过指定值时,系统将向数据库日志文件中写入警告信息,并删除最早的审计文件,同时记录审计文件删除信息到审计日志中。设置参数值过大会增加磁盘空间占用。参数值过小则审计日志可记录周期变短,可能导致重要日志信息丢失。随意调整此参数可能会影响 audit_resource_policy 参数的效果。
确保开启日志收集器参数 logging_collector 控制开启后端日志收集进程 logger 进行日志收集。该进程捕获发送到 stderrcsvlog 的日志消息并写入日志文件。这种记录日志的方法比将日志记录到 syslog 更加有效,因为某些类型的消息在 syslog 的输出中无法显示。将服务器日志发送到 stderr 时可以不使用 logging_collector 参数,此时日志消息会被发送到服务器的 stderr 指向的空间。这种方法的缺点是日志回滚困难,只适用于较小的日志容量。
确保单个日志文件最大记录时间配置正确参数 log_rotation_age 用于设置单个日志文件最大的日志记录时间。当日志记录时间超过该参数设置的最大值时,服务器将自动创建新的日志文件。正确的配置有助于避免日志文件过于频繁地产生,同时避免单个日志文件过大导致管理不便。如果 log_rotation_age 参数值设置过小,将导致日志文件频繁产生,增加管理难度。如果参数值设置过大,单个日志文件将记录过多的日志,可能导致文件占用空间过大,同样不利于日志文件管理。
确保单个日志文件最大容量配置正确参数 log_rotation_size 用于设置单个日志文件的最大容量。当日志文件达到该最大容量时,服务器将自动创建新的日志文件,以避免日志文件过大导致管理困难。如果 log_rotation_size 参数值设置过小,会导致日志文件频繁产生,增加管理难度。如果参数值设置过大,单个日志文件将记录过多的日志,可能导致文件占用空间过大,不利于日志文件管理。
确保客户端日志等级配置正确参数 client_min_messages 控制按设置的等级将消息发送到客户端。有效的值包括 debugdebug5debug4debug3debug2debug1infolognoticewarningerrorfatalpanic,其中 debugdebug2 等效。每个等级都包括排在他后面的所有级别中的日志。在实际设置过程中,如果设置的级别大于 error,例如为 fatalpanic,系统会默认将级别转为 error日志级别 debug1~debug5 主要用于调试,生产环境不建议使用,否则发送给客户端的日志会增多。建议保持默认值 notice
确保服务器日志等级配置正确参数 log_min_messages 控制按的等级将消息写入到服务器日志。有效的值包括 debugdebug5debug4debug3debug2debug1infolognoticewarningerrorfatalpanic。其中 debugdebug2 等效,每个级别都包含排在他后面的所有级别中的信息。日志级别 debug1~debug5 主要用于调试,生产环境不建议使用,否则写入服务器的日志会增多。建议保持默认值 warning
确保开启用户登录时日志记录功能参数 log_connections 用于记录每次尝试连接到服务器的日志,以及成功完成客户端连接认证的日志。开启 log_connections 可以记录所有用户登录尝试的日志,帮助管理员分析潜在的恶意连接或连接问题。但同时,由于会记录所有的连接尝试,可能会导致日志文件增长迅速,增加磁盘存储压力。
确保开启用户注销时日志记录功能参数 log_disconnections 用于设置是否记录客户端结束连接的信息,包括在会话结束时在服务器日志中输出一行,并包含会话的持续时间。开启 log_disconnections 参数有助于分析客户端连接的断开情况,包括断开原因和会话持续时间。同时,开启此参数可能会增加日志记录量,需要考虑到磁盘存储和日志管理的成本。
确保开启归档模式参数 archive_mode 用于设置是否开启归档模式,该参数通常只建议当 wal_level 参数设置为 archive 时使用。当 wal_level 参数设置为 minimal 时,archive_mode 参数无法使用。如果设置 archive_mode 参数为 on,需要同时设置 archive_command 参数以指定归档 WAL 日志的命令。开启归档模式后需要规划归档日志占用的磁盘空间。在日志归档过程中可能会对数据库性能产生影响。
确保文件权限掩码配置正确在 Linux 运行环境中,创建文件的默认权限可通过文件权限掩码 umask 配置。为防止数据库文件被其他用户访问或篡改,应确保 umask 配置为 0077,以确保只有数据库运行用户具有访问权限。umask 值一般在 /etc/bashrc/etc/profile$HOME/.bash_profile$HOME/.bashrc 中设置。umask 如果设置不合理,可能导致新建文件权限过小或过大,从而影响业务正常运行或导致安全风险。

连接配置

禁止侦听主机上所有 IP 地址

参数 listen_addresses 指定服务器在哪些 TCP/IP 地址上侦听客户端连接。侦听地址配置参数 listen_addresses 不允许包含表示所有 IP 地址的 *0.0.0.0:: 字符串。对于包含多个网卡的主机,侦听所有 IP 地址将无法做到网络隔离,通过禁止侦听主机上所有 IP 地址可以阻止来自其他网络的恶意连接请求。

执行如下 SQL 语句检查参数 listen_addresses 配置,如果返回不为空则表示失败。

omm@postgres=# SELECT name,setting FROM pg_settings WHERE name = 'listen_addresses' AND
(position('*' in setting) OR position('0.0.0.0' in setting) OR position('::' in setting));
       name       | setting 
------------------+---------
 listen_addresses | *
(1 row)

避免侦听主机上所有网卡地址,设置参数 listen_addresseslocalhost 或需要接收业务请求的网卡 IP 地址,多个地址用逗号隔开,然后重启数据库。侦听地址以 localhost192.168.1.1 为例命令如下:

gs_guc set -Z datanode -N all -I all -c "listen_addresses='localhost,192.168.1.1'"
gs_om -t stop && gs_om -t start

确保对外服务端口使用非默认端口号

参数 port 为数据库服务侦听的 TCP 端口号。采用默认端口号容易被恶意攻击者获取并攻击,需将对外服务端口号配置为非默认端口号。默认端口号请参考产品相关文档说明。

以端口号 5432 为例,如果 port 参数值为默认端口号则失败。

omm@postgres=# SELECT name,setting FROM pg_settings WHERE name = 'port' AND setting = '5432';
 name | setting 
------+---------
(0 rows)

用户需在安装数据库时通过配置文件指定各个实例的端口号。

确保数据库实例的最大连接数配置正确

参数 max_connections 控制数据库 DN 实例的最大连接数。参数设置过大可能引起数据库请求更多的 System V 共享内存或者信号量,导致超出操作系统默认配置允许的值。用户需要根据业务规格确定参数值的大小或咨询技术支持。

检查 max_connections 参数配置,用户需要根据业务规格确定配置多大并发连接数目。

omm@postgres=# show max_connections;
 max_connections 
-----------------
 6000
(1 row)

以配置最大连接数为 5000 为例,通过如下命令修改参数 max_connections的值,然后重启数据库。

gs_guc set -Z datanode -N all -I all -c "max_connections=5000"
gs_om -t stop && gs_om -t start

确保数据库的最大连接数配置正确

为了控制访问数据库的会话数量,推荐配置会话数量限制在 1024 个以内。若设置参数 datconnlimit-1,表示不限制连接数据库的会话数量。

执行如下 SQL 语句检查是否存在不限制连接数的数据库:

omm@postgres=# SELECT datname FROM pg_database WHERE datistemplate = false AND (datconnlimit = -1 OR datconnlimit > 1024);
 datname  
----------
 postgres
 stonedb
 backupdb
(3 rows)

修复方法:

UPDATE pg_database SET datconnlimit=<CONN_LIMIT_VALUE> WHERE datname=<DATABASE_NAME>;

其中 <CONN_LIMIT_VALUE> 表示设置的数据库允许的最大会话连接数,<DATABASE_NAME> 为数据库名称。

确保系统管理员使用的连接数配置正确

参数 sysadmin_reserved_connections 表示预留给数据库系统管理员的最少连接数,为系统管理员预留连接通道,避免连接被普通用户或恶意用户占用导致管理员无法连接。此参数值必须小于 max_connections 的值。

omm@postgres=# show sysadmin_reserved_connections;
 sysadmin_reserved_connections 
-------------------------------
 3
(1 row)

如果小于 3,修改参数 sysadmin_reserved_connections3,然后重启数据库。

gs_guc set -Z datanode -N all -I all -c "sysadmin_reserved_connections=3"
gs_om -t stop && gs_om -t start

确保用户的最大连接数配置正确

在 openGauss 数据库中,不应该允许用户无限制数量的连接。如果用户参数 rolconnlimit 设置为 -1,表示允许无限制数量的并发连接。根据业务需求限制不同用户的最大连接数,可避免连接被某个用户全部占用。

执行以下 SQL 语句检查是否存在不限制连接数的用户,其中以 gs_role 开头的为内置角色不允许连接、无需检查。

omm@postgres=# SELECT rolname, rolconnlimit FROM pg_roles WHERE rolname NOT LIKE 'gs_role%' AND rolconnlimit = -1;
 rolname | rolconnlimit 
---------+--------------
 omm     |           -1
 stone   |           -1
 hr      |           -1
(3 rows)

修复方法:

ALTER ROLE <role_name> CONNECTION LIMIT <connection_num>;

其中 <role_name> 表示用户名,<connection_num> 表示配置的最大连接数。

确保 UNIX 域套接字的访问权限配置正确

参数 unix_socket_permissions 用于设置 UNIX 域套接字的访问权限。推荐配置是 0700(只有当前连接数据库的用户自己可以访问,同组或者其他人都没有权限),满足文件权限最小化要求,避免文件被其他用户访问或篡改而影响套接字通信功能。

检查 unix_socket_permissions 参数配置值是否为 0700,如果不是则失败。

omm@postgres=# show unix_socket_permissions;
 unix_socket_permissions 
-------------------------
 0700
(1 row)

如果权限配置不正确,修改 unix_socket_permissions 参数值为 0700,然后重启数据库。

gs_guc set -Z datanode -N all -I all -c "unix_socket_permissions=0700"
gs_om -t stop && gs_om -t start

确保除服务端节点外无 HOST 条目使用 TRUST 认证

服务端节点部署在安全内网环境中,仅允许初始用户在服务端使用 trust 认证方式通讯。应配置 pg_hba.conf 除服务端节点外没有 host 条目使用 trust 认证方法。trust 认证即无需认证即可允许连接。目前仅允许与运行数据库的 OS 用户同名的初始用户在服务端本地连接使用 trust 认证,其他远程连接或非初始用户连接等场景都需要经过服务端认证。用户在 pg_hba.conf 配置文件中增加客户端 host 条目时应避免使用 trust 认证方法,否则会导致与服务端连接失败。

通过如下 Shell 命令检查 pg_hba.conf 配置中是否存在 trust 认证条目,其中 ${PGDATA} 为 DN 的数据目录。此检查需要人工确认哪些是服务端节点 IP 和本地环回 IP,其中 127.0.0.1::1 为本地环回 IP,需确保除服务端节点 IP 和本地环回 IP 外无 host 条目使用 trust 认证。

[omm@opengauss ~]$ grep -P '^[^#]*host(ssl|nossl)?\s+.+[Tt][Rr][Uu][Ss][Tt]\s*$' ${PGDATA}/pg_hba.conf
host    all    omm    192.168.92.129/32    trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust

除了初始用户连接服务端节点外,文件 pg_hba.conf 中其他 host 项配置为非 trust 认证方法。

确保没有 HOST 条目使用 MD5 认证

MD5 认证方式存在安全风险,可能导致密码被破解,应采用更安全的 SHA256 认证或证书认证方式。保留 MD5 认证方式是为了兼容开源社区工具,但在生产环境中禁止使用 MD5 认证。

通过如下 Shell 命令检查 pg_hba.conf 配置中是否存在 MD5 认证条目,其中 ${PGDATA} 为 DN 的数据目录。

[omm@opengauss ~]$ grep -P '^[^#]*host(ssl|nossl)?\s+.+[Mm][Dd][5]\s*$' ${PGDATA}/pg_hba.conf

为客户端 host 项配置认证方式为 SHA256。例如,配置用户 user1 通过IP为 192.168.0.1 的客户端连接数据库 db1,认证方式为 SHA256,配置命令如下。

gs_guc reload -Z datanode -N all -I all -h "host db1 user1 192.168.0.1/32 sha256"

确保没有 HOSTNOSSL 条目

hostnossl 条目指定不使用 SSL 加密连接,而 host 条目允许 SSL 和非 SSL 连接,hostssl 则只能使用 SSL 连接。从安全角度考虑,推荐使用 SSL 加密连接对传输数据加密,避免信息泄露。

通过如下 Shell 命令检查 pg_hba.conf 配置中是否存在 hostnossl 条目,其中 ${PGDATA} 为 DN 的数据目录。

[omm@opengauss ~]$ grep -P '^[^#]*hostnossl' ${PGDATA}/pg_hba.conf

修复方法:

将配置文件 pg_hba.conf 中所有 hostnossl 条目改为 hosthostssl

确保没有 HOST 条目的数据库指定为 ALL

host 连接条目若指定数据库为 all,则允许用户连接到任何一个数据库。在满足业务需求的前提下,建议为不同的用户或客户端 IP 指定所需连接的数据库,避免不同业务之间相互影响。

通过如下 Shell 命令检查 pg_hba.conf 配置中是否存在数据库指定为 all 的条目,其中 ${PGDATA} 为 DN 的数据目录。此检查需要人工确认哪些是服务端节点 IP 和本地环回 IP(如 127.0.0.1::1),确保除服务端节点 IP 和本地环回 IP 外无 host 条目的数据库指定为 all

[omm@opengauss ~]$ grep -P '^[^#]*host(ssl|nossl)?\s+[Aa][Ll][Ll]' ${PGDATA}/pg_hba.conf
host    all    omm    192.168.92.129/32    trust
host    all             all             127.0.0.1/32            trust
host    all    all    192.168.92.129/32    sha256
host all all 0.0.0.0/0 sha256
host    all             all             ::1/128                 trust

修复方法:

除服务端内部连接外,根据业务需要将配置文件 pg_hba.confhosthostssl 条目中的数据库为 all 的条目修改为需要连接的数据库。

确保没有 HOST 条目的用户指定为 ALL

host 条目配置 userall 表示允许所有用户连接到数据库。推荐 host 条目的 user 取值仅为需要连接数据库的用户。

通过如下 Shell 命令检查 pg_hba.conf 配置中是否存在用户指定为 all 的条目,其中 ${PGDATA} 为 DN 的数据目录。此检查需要人工确认哪些是服务端节点 IP 和本地环回 IP(如 127.0.0.1::1),需确保除服务端节点 IP 和本地环回 IP 外无 host 条目的用户指定为 all

[omm@opengauss ~]$ grep -P '^[^#]*host(ssl|nossl)?\s+\S+\s+[Aa][Ll][Ll]' ${PGDATA}/pg_hba.conf
host    all             all             127.0.0.1/32            trust
host    all    all    192.168.92.129/32    sha256
host all all 0.0.0.0/0 sha256
host    all             all             ::1/128                 trust

修复方法:

除服务端内部连接外,根据业务需要将配置文件 pg_hba.confhosthostssl 对应用户为 all 的条目修改为需要连接数据库的用户。

确保没有 HOST 条目的源地址指定为任意 IP

host 条目配置源地址为 0.0.0.0/0 意味着允许任意 IP 连接到数据库,这可能导致数据库被恶意用户进行网络攻击,影响数据库的安全性。推荐 host 条目配置的源地址仅为需要连接数据库的 IP。

通过如下 Shell 命令检查 pg_hba.conf 配置中是否存在源地址指定为 0.0.0.0/0 的条目,其中 ${PGDATA} 为 DN 的数据目录。

[omm@opengauss ~]$ grep '0.0.0.0/0' ${PGDATA}/pg_hba.conf
host all all 0.0.0.0/0 sha256

在配置文件 pg_hba.conf 中删除所有 hosthostssl 源地址为 0.0.0.0/0 的条目,或将地址改为需要连接数据库的客户端 IP 地址。

确保服务端使能 SSL 连接

SSL 协议是为网络通信提供安全及数据完整性的一种安全协议。在使用数据库过程中应使用 SSL 协议进行 TCP/IP 连接以确保数据传输安全。参数 ssl 用于控制服务端是否使能 SSL 连接,参数为 on 表示使能 SSL,此时服务端允许客户端通过 SSL 连接或非 SSL 连接,如果设置为 off 则只能通过非 SSL 连接。有关创建服务器私钥和证书的细节信息,可以参考 openGauss 的产品文档。

检查参数 ssl 的配置是否为 on,如果不为 on 则失败。

omm@postgres=# show ssl;                                      
 ssl 
-----
 on
(1 row)

如果不为 on,配置参数 ssl 参数为 on,然后重启数据库。

gs_guc set -Z datanode -N all -I all -c "ssl=on"
gs_om -t stop && gs_om -t start

文件目录安全

确保数据库安装目录权限最小化

${GAUSSHOME} 是 openGauss 的安装目录,为了防止安装目录下的文件被恶意篡改或破坏,此目录应该受到保护,不允许非数据库安装用户访问。正确的权限设置能确保数据库系统的安全性。

执行如下 Shell 命令,如果返回 ${GAUSSHOME} 目录下的任何文件或目录,则表示权限设置失败。

find -L ${GAUSSHOME} -prune \( ! -user ${GAUSSUSER} -o ! -group ${GAUSSGROUP} -o -perm /g=rwx,o=rwx \)

环境变量 ${GAUSSUSER}${GAUSSGROUP} 需要配置为数据库的安装用户和用户组。例如:

find -L ${GAUSSHOME} -prune \( ! -user omm -o ! -group dbgrp -o -perm /g=rwx,o=rwx \)

修复方法:

使用 chmod 命令来修改 ${GAUSSHOME} 目录的权限,确保只有数据库安装用户(所属用户)可以读写和执行目录内的文件,而其他用户和组没有写入权限。

chmod 0700 ${GAUSSHOME}

确保共享目录权限最小化

${GAUSSHOME}/share 目录包含了 openGauss 的共享组件,其中 ${GAUSSHOME} 为数据库安装目录。为了防止共享组件被恶意篡改或破坏,此目录应该受到保护,不允许非数据库安装用户访问。

执行如下 Shell 命令,如果返回 ${GAUSSHOME}/share 目录则失败。

find ${GAUSSHOME}/share -prune -perm /g=rwx,o=rwx

修复方法:

chmod  0700 ${GAUSSHOME}/share

确保二进制文件目录权限最小化

${GAUSSHOME}/bin 目录包含了数据库的二进制文件,其中 ${GAUSSHOME} 为数据库安装目录。为了防止二进制文件被恶意篡改或破坏给客户信息安全造成威胁,此目录应该受到保护,不允许非数据库安装用户访问。

执行如下 Shell 命令,如果返回 ${GAUSSHOME}/bin 目录则失败。

find ${GAUSSHOME}/bin -prune -perm /g=rwx,o=rwx

修复方法:

chmod  0700 ${GAUSSHOME}/bin

确保数据目录权限最小化

数据目录包含了用户数据文件,为了防止数据文件被恶意篡改或破坏给客户的数据信息安全造成威胁,此目录应该受到保护,不允许非数据库安装用户访问。

执行如下 Shell 命令,如果返回数据目录则失败。

find ${PGDATA} -prune \( ! -user ${GAUSSUSER} -o ! -group ${GAUSSGROUP} -o -perm /g=rwx,o=rwx \)

其中 ${PGDATA} 为 DN 的数据目录,用户可通过 GUC 参数 data_directory 查询 DN 的数据目录。环境变量 ${GAUSSUSER}${GAUSSGROUP} 需要配置为数据库的安装用户和用户组。例如:

find ${PGDATA} -prune \( ! -user omm -o ! -group dbgrp -o -perm /g=rwx,o=rwx \)

修复方法:

chmod 0700 ${PGDATA}

确保日志归档目录权限最小化

${GAUSSHOME}/archive 目录为日志归档目录,其中 ${GAUSSHOME} 为数据库安装目录。当 wal_level 参数配置为 archive 时,该目录权限应该设置为 0700 以确保只允许数据库的安装运行用户访问。

执行如下 Shell 命令,如果返回 ${GAUSSHOME}/archive 目录则失败。如果 ${GAUSSHOME}/archive 目录不存在则无需进行检查。

find ${GAUSSHOME}/archive -prune \( ! -user ${GAUSSUSER} -o ! -group ${GAUSSGROUP} -o -perm /g=rwx,o=rwx \)

环境变量 ${GAUSSUSER}${GAUSSGROUP} 需要配置为数据库的安装用户和用户组。例如:

find ${GAUSSHOME}/archive -prune \( ! -user omm -o ! -group dbgrp -o -perm /g=rwx,o=rwx \)

修复方法:

chmod 0700 ${GAUSSHOME}/archive

确保参数配置文件权限最小化

配置文件 postgresql.conf 包含数据库运行的配置参数,为了防止配置文件被恶意篡改,此文件应该受到保护,不允许非数据库安装用户访问。

执行如下 Shell 命令,如果返回 postgresql.conf 文件路径则失败。

find ${PGDATA}/postgresql.conf \( ! -user ${GAUSSUSER} -o ! -group ${GAUSSGROUP} -o -perm /u=x,g=rwx,o=rwx \)

其中 ${PGDATA} 为 DN 的数据目录,用户可通过 GUC 参数 data_directory 查询 DN 的数据目录。环境变量 ${GAUSSUSER}${GAUSSGROUP} 需要配置为数据库的安装用户和用户组。例如:

find ${PGDATA}/postgresql.conf \( ! -user omm -o ! -group dbgrp -o -perm /u=x,g=rwx,o=rwx \)

修复方法:

chmod 0600 ${PGDATA}/postgresql.conf

确保认证配置文件权限最小化

配置文件 pg_hba.conf 包含了连接数据库的配置信息,如客户端认证方法等。为了防止配置文件被恶意篡改,此文件应该受到保护,仅允许数据库的安装用户访问。

执行如下 Shell 命令,如果返回 pg_hba.conf 文件路径则失败。

find ${PGDATA}/pg_hba.conf \( ! -user ${GAUSSUSER} -o ! -group ${GAUSSGROUP} -o -perm /u=x,g=rwx,o=rwx \)

其中 ${PGDATA} 为 DN 的数据目录,用户可通过 GUC 参数 data_directory 查询 DN 的数据目录。环境变量 ${GAUSSUSER}${GAUSSGROUP} 需要配置为数据库的安装用户和用户组。例如:

find ${PGDATA}/pg_hba.conf \( ! -user omm -o ! -group dbgrp -o -perm /u=x,g=rwx,o=rwx \)

修复方法:

chmod 0600 ${PGDATA}/pg_hba.conf

确保日志目录权限最小化

${GAUSSLOG} 为数据库日志目录,目录下日志文件中包含很多运行信息,为了防止日志文件被恶意篡改或破坏给客户的数据信息安全造成威胁,此目录应该受到保护,不允许非数据库安装用户访问。

执行如下 Shell 命令,如果返回 ${GAUSSLOG} 目录则失败。

find ${GAUSSLOG} -prune \( ! -user ${GAUSSUSER} -o ! -group ${GAUSSGROUP} -o -perm /g=rwx,o=rwx \)

环境变量 ${GAUSSUSER}${GAUSSGROUP} 需要配置为数据库的安装用户和用户组。例如:

find ${GAUSSLOG} -prune \( ! -user omm -o ! -group dbgrp -o -perm /g=rwx,o=rwx \)

修复方法:

chmod 0700 ${GAUSSLOG}

安全认证配置

确保客户端认证超时时间配置正确

参数 authentication_timeout 控制完成客户端认证的时间上限,默认为一分钟。如果一个客户端没有在参数设定时间内完成与服务器端的认证,则服务器自动中断与客户端的连接,这样就避免了出问题的客户端无限制地占用连接数。

检查 authentication_timeout 参数设置,建议设置为 1min。

omm@postgres=# show authentication_timeout;
 authentication_timeout 
------------------------
 1min
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "authentication_timeout=1min"

确保认证加密迭代次数配置正确

通过 auth_iteration_count 参数配置对认证凭据进行单向哈希时的迭代次数。迭代次数设置过小会降低口令存储的安全性,设置过大会导致创建用户和认证等涉及口令加密的场景性能劣化。请根据实际硬件条件合理设置迭代次数,迭代次数最低应设置为 10000 次。

检查 auth_iteration_count 参数配置,如果小于 10000 则失败。

omm@postgres=# show auth_iteration_count;
 auth_iteration_count 
----------------------
 10000
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "auth_iteration_count=10000"

确保账户登录失败尝试次数配置正确

通过参数 failed_login_attempts 配置帐户登录失败尝试次数可以防止口令被暴力破解。参数 failed_login_attempts 默认值为 10,表示连续认证失败次数超过 10 次后,帐户将被自动锁定。

检查 failed_login_attempts 参数值配置,如果参数为 0 则配置失败。

omm@postgres=# show failed_login_attempts;
 failed_login_attempts 
-----------------------
 10
(1 row)

修复方法:配置 failed_login_attempts 为大于 0 小于或等于 1000 的整数值,建议保持默认值 10

gs_guc reload -Z datanode -N all -I all -c "failed_login_attempts=10"

账号口令管理

确保开启密码复杂度校验

为了保证数据库的使用安全,确保开启密码复杂度校验,在创建用户或者修改密码时校验密码复杂度。密码复杂度过低容易被猜解或暴力破解,为了密码安全性考虑,请开启密码复杂度校验。

检查 password_policy 参数值是否为 1,如果不为 1 则失败。

omm@postgres=# show password_policy;
 password_policy 
-----------------
 1
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "password_policy=1"

确保密码加密方式配置正确

参数 password_encryption_type 用于配置数据库采用何种加密方式对用户密码进行加密存储。参数支持 3 种配置方式:

  • 0:采用 MD5 方式对密码加密
  • 1:采用 SHA256 和 MD5 两种方式分别对密码加密
  • 2:采用 SHA256 方式对密码加密

MD5 方式已经证明不安全,不应该配置,保留仅为兼容开源第三方工具。应该配置为 SHA256 方式(默认配置)。

检查 password_encryption_type 参数配置,如果为 01 则失败。

omm@postgres=# show password_encryption_type;
 password_encryption_type 
--------------------------
 2
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "password_encryption_type=2"

确保密码不可重用天数配置正确

在使用 ALTER USER 或者 ALTER ROLE 修改用户密码时,参数 password_reuse_time 指定是否对新密码进行可重用天数检查。配置此参数后,密码只有超过此设置的时间后才允许被重用。在数据库使用过程中,推荐配置用户密码不可重用天数,以避免用户反复使用相同的密码导致密码被破解。

检查 password_reuse_time 参数配置,如果值为 0 则失败。

omm@postgres=# show password_reuse_time;
 password_reuse_time 
---------------------
 60
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "password_reuse_time=60"

确保账户自动解锁时间配置正确

参数 password_lock_time 用于指定帐户被锁定后自动解锁的时间。参数单位为天,支持浮点数据类型,整数部分表示天数,小数部分可以换算成时、分、秒。参数值为 0 表示密码验证失败时,自动锁定功能不生效。为防止口令被尝试暴力破解,要求此参数设置为非 0 值。

检查 password_lock_time 参数配置,如果值为 0 则失败。

omm@postgres=# show password_lock_time;
 password_lock_time 
--------------------
 1d
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "password_lock_time=1"

确保首次登陆时修改初始用户的密码

初始用户是权限最高、id10 的系统管理员。如果在安装数据库时未指定初始用户的密码,则默认密码为空。安装完成后首次登陆时需要修改初始用户的密码。如果初始用户密码为空并且没有被及时修改,容易引起低成本的攻击事件,也容易引起外界质疑,带来安全风险。

执行如下 SQL 语句,如果显示 rolpassword 字段为空则表明检查失败。

SELECT rolpassword FROM pg_authid WHERE rolsuper=true;

修复方法:执行如下 SQL 语句修改初始用户的密码。

ALTER ROLE 'rolename' PASSWORD 'xxxxxxxx';

确保配置用户的有效期限

创建用户或角色时,使用 VALID BEGIN 关键字设置用户的有效开始时间,VALID UNTIL 关键字设置用户的有效结束时间。如果忽略这两个关键字,则用户或角色将长期有效。数据库服务端各节点的用户过期时间以各节点操作系统的时钟为依据。为确保服务端各节点的时间一致性,建议在安装部署数据库时使用 NTP(网络时间协议)。若忽略这一配置,可能存在各节点登录帐户过期时间不一致的风险。因此,建议根据业务需要合理地配置用户或角色的有效期,并及时清理无用的过期用户或角色。

通过如下 SQL 语句检查是否存在未配置有效期的用户,其中,WHERE 条件中 rolsuper=true 时表示初始用户,无需配置有效期限;以 gs_role 开头的为数据库内置角色,也无需配置有效期限。

SELECT rolname, rolvalidbegin, rolvaliduntil 
FROM pg_roles 
WHERE rolsuper=false 
AND rolname NOT LIKE 'gs_role%' 
AND (rolvalidbegin IS NULL OR rolvaliduntil IS NULL);

修复方法:

ALTER ROLE <role_name> VALID BEGIN 'yyyy-mm-dd' VALID UNTIL 'yyyy-mm-dd';

确保配置密码的有效期限

通过 password_effect_time 参数可以配置用户登录密码的有效期,而 password_notify_time 参数则用于配置密码到期前多少天进行提醒。一旦密码达到过期提醒的时间,系统会在用户登录数据库时提示用户修改密码。建议用户定期更新密码,提升密码使用的安全性。

检查 password_effect_time 参数配置,如果值为 0(表示不开启有效期限制功能)则失败。

omm@postgres=# show password_effect_time;
 password_effect_time 
----------------------
 90
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "password_effect_time=90"

权限管理

禁止 PUBLIC 角色拥有 PG_AUTHID 系统表的权限

pg_catalog 模式下的 pg_authid 系统表中包含了数据库中所有的角色信息。由于所有用户会继承 PUBLIC 角色的权限,为了防止敏感信息泄露或被更改,PUBLIC 角色不允许拥有 pg_authid 系统表的任何权限。

执行如下 SQL 语句,如果查询结果显示不为空则失败。

SELECT relname,relacl FROM pg_class WHERE relname = 'pg_authid' AND CAST(relacl AS TEXT) LIKE '%,=%}';

修复方法:

REVOKE ALL ON pg_authid FROM PUBLIC;

禁止 PUBLIC 角色在 PUBLIC 模式下拥有 CREATE 权限

如果 PUBLIC 角色在 PUBLIC 模式下拥有 CREATE 权限,则任何用户都可以在 PUBLIC 模式下创建表或者其他数据库对象,这可能导致安全风险,因为其他用户也可以查看和修改这些表和数据库对象。此外,为了解决 CVE-2018-1058 漏洞问题,应禁止 PUBLIC 角色在 PUBLIC 模式下拥有 CREATE 权限。

通过如下语句检查 PUBLIC 角色在 PUBLIC 模式下是否拥有 CREATE 权限,如果返回 true 则表示配置失败。

omm@postgres=# SELECT CAST(has_schema_privilege('public','public','CREATE') AS TEXT);
 has_schema_privilege 
----------------------
 false
(1 row)

修复方法:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

禁止将对象的所有权限授予 PUBLIC 角色

PUBLIC 角色属于任何用户,如果将对象的所有权限授予 PUBLIC 角色,则任意用户都会继承此对象的所有权限,违背权限最小化原则。为了保障数据库数据的安全,此角色应该拥有尽可能少的权限,应禁止将对象的所有权限授予 PUBLIC 角色。

通过如下语句检查表或视图的所有权限是否授予 PUBLIC 角色,如果结果不为空则失败。

SELECT relname,relacl FROM pg_class 
WHERE (CAST(relacl AS TEXT) LIKE '%,=arwdDxt/%}' OR CAST(relacl AS TEXT) LIKE '{=arwdDxt/%}') 
AND (CAST(relacl AS TEXT) LIKE '%,=APmiv/%}' OR CAST(relacl AS TEXT) LIKE '{=APmiv/%}');

通过如下语句检查模式的所有权限是否授予 PUBLIC 角色,如果结果不为空则失败。

SELECT nspname,nspacl FROM pg_namespace 
WHERE (CAST(nspacl AS TEXT) LIKE '%,=UC/%}' OR CAST(nspacl AS TEXT) LIKE '{=UC/%}') 
AND (CAST(nspacl AS TEXT) LIKE '%,=APm/%}' OR CAST(nspacl AS TEXT) LIKE '{=APm/%}');

通过如下语句检查函数的所有权限是否授予 PUBLIC 角色,如果结果不为空则失败。

SELECT proname,proacl FROM pg_proc 
WHERE (CAST(proacl AS TEXT) LIKE '%,=X/%}' OR CAST(proacl AS TEXT) LIKE '{=X/%}') 
AND (CAST(proacl AS TEXT) LIKE '%,=APm/%}' OR CAST(proacl AS TEXT) LIKE '{=APm/%}');

其他数据库对象的权限检查可以参考上述命令进行排查。ACL 权限参数说明如下表所示。

参数参数说明
rSELECT
wUPDATE
aINSERT
dDELETE
DTRUNCATE
xREFERENCES
tTRIGGER
XEXECUTE
UUSAGE
CCREATE
cCONNECT
TTEMPORARY
AALTER
PDROP
mCOMMENT
iINDEX
vVACUUM
*给前面权限的授权选项

修复方法:

撤销 PUBLIC 角色拥有的表或视图的所有权限:

REVOKE ALL ON <OBJECT_NAME> FROM PUBLIC;

撤销 PUBLIC 角色拥有的模式的所有权限:

REVOKE ALL ON SCHEMA <OBJECT_NAME> FROM PUBLIC;

撤销 PUBLIC 角色拥有的函数的所有权限(注意函数对象名称需要包含参数):

REVOKE ALL ON FUNCTION function_name([arg_type][, ...]) FROM PUBLIC;

禁止将初始用户用于执行普通业务操作

数据库初始用户具有数据库的最高权限,并且具有所有的系统权限和对象权限。应仅将初始用户作为 DBA 管理用途,禁止用于执行普通业务操作。使用初始用户执行普通业务操作,违背权限最小化原则,同时可能带来安全风险。

通过如下语句查询初始用户当前的作业,排查是否存在非系统自动触发的普通业务操作。

SELECT s.* 
FROM pg_stat_activity as s, pg_roles as t 
WHERE s.usename = t.rolname and t.rolsuper = true;

修复方法:

检查初始用户是否用于执行普通业务操作。业务用户权限最小化,禁止使用初始用户执行普通业务操作。

确保使用非系统管理员执行普通业务操作

数据库系统管理员拥有较高的数据库权限,使用系统管理员执行普通业务操作,违背权限最小化原则,同时可能带来安全风险。不要使用系统管理员执行普通业务操作。

通过如下语句查询系统管理员当前的作业,排查是否存在非系统自动触发的普通业务操作。

SELECT s.* 
FROM pg_stat_activity as s, pg_roles as t 
WHERE s.usename = t.rolname 
AND t.rolsystemadmin = true;

修复方法:

业务用户权限最小化,创建非管理员用户并用于执行普通业务操作。

确保撤销普通用户非必须的管理权限

普通用户指用于执行普通业务操作的非管理员用户。作为普通用户,不应该拥有超出其正常权限范围的管理权限,例如创建角色权限(CREATEROLE)、创建数据库权限(CREATEDB)、审计权限(AUDITADMIN)、监控权限(MONADMIN)、运维权限(OPRADMIN)、安全策略权限(POLADMIN)等。在满足正常业务需求的前提下,为了确保普通用户权限最小化,应撤销普通用户非必须的管理权限。

以下列举的是常用的管理权限,其他管理权限的检查方法类似,请根据需要进行排查。

检查拥有 CREATEROLE 权限的普通用户:

SELECT rolname FROM pg_roles WHERE rolcreaterole = true AND rolsuper = false;

检查拥有 CREATEDB 权限的普通用户:

SELECT rolname FROM pg_roles WHERE rolcreatedb = true AND rolsuper = false;

检查拥有 AUDITADMIN 权限的普通用户:

SELECT rolname FROM pg_roles WHERE rolauditadmin = true AND rolsuper = false;

检查拥有 MONADMIN 权限的普通用户:

SELECT rolname FROM pg_roles WHERE rolmonitoradmin = true AND rolsuper = false;

检查拥有 OPRADMIN 权限的普通用户:

SELECT rolname FROM pg_roles WHERE roloperatoradmin = true AND rolsuper = false;

检查拥有 POLADMIN 权限的普通用户:

SELECT rolname FROM pg_roles WHERE rolpolicyadmin = true AND rolsuper = false;

修复方法:

撤销 CREATEROLE 权限:

ALTER ROLE <role_name> NOCREATEROLE;

撤销 CREATEDB 权限:

ALTER ROLE <role_name> NOCREATEDB;

撤销 AUDITADMIN 权限:

ALTER ROLE <role_name> NOAUDITADMIN;

撤销 MONADMIN 权限:

ALTER ROLE <role_name> NOMONADMIN;

撤销 OPRADMIN 权限:

ALTER ROLE <role_name> NOOPRADMIN;

撤销 POLADMIN 权限:

ALTER ROLE <role_name> NOPOLADMIN;

禁止 PUBLIC 角色执行 SECURITY DEFINER 类型的函数

在创建函数时声明 SECURITY DEFINER 表示函数以创建它的用户权限执行,如果使用不当会导致函数执行者借助创建者的权限执行越权操作,所以一定确保这样的函数不被滥用。为了安全考虑,禁止 PUBLIC 角色执行 SECURITY DEFINER 类型的函数。另外需要说明的是,SECURITY DEFINERAUTHID DEFINER 的功能相同。

执行如下 SQL 语句,查询非在 pg_catalog 模式下定位为 SECURITY DEFINER 类型的函数。

SELECT a.proname, b.nspname 
FROM pg_proc a, pg_namespace b 
WHERE a.pronamespace=b.oid 
AND b.nspname <> 'pg_catalog' 
AND a.prosecdef='t';

如果上述语句返回非空,则执行下面的 SQL 语句检查 PUBLIC 角色是否拥有此函数的执行权限,其中函数需要明确参数类型,必要时还需要在函数名前添加所在模式名前缀。如果返回 true 表示 PUBLIC 角色拥有此函数的执行权限,则检查结果失败。

SELECT CAST(has_function_privilege('public', 'function_name([arg_type][, ...])', 'EXECUTE') AS TEXT);

修复方法:

执行如下 SQL 语句撤销 PUBLIC 角色执行函数的权限,其中函数需要明确参数类型,必要时还需要在函数名前添加所在模式名前缀。

REVOKE EXECUTE ON FUNCTION function_name([arg_type][, ...]) FROM PUBLIC;

确保 SECURITY INVOKER 类型的函数定义符合预期

SECURITY INVOKER 函数是以调用它的用户的权限来执行,使用不当会导致函数创建者借助执行者的权限执行越权操作,所以在调用非自身创建的这类函数时,一定要先检查函数执行内容,避免造成函数创建者借助执行者的权限执行了越权的操作。

  1. 检查普通用户或管理员执行非自身创建的 SECURITY INVOKER 函数,其中 function_name 为被检查函数名称。
SELECT prosrc FROM pg_proc WHERE proname = 'function_name' AND prosecdef = false;
  1. 检查普通用户或管理员对非自身创建的含有触发器的表执行 INSERT/UPDATE/DELETE/TRUNCATE 操作,其中 table_name 为被检查表名。
SELECT a.prosrc 
FROM pg_proc a 
INNER JOIN PG_TRIGGER c ON a.oid = c.tgfoid 
INNER JOIN PG_CLASS b ON b.oid = c.tgrelid AND b.relname = 'table_name' 
WHERE a.prosecdef = false;

修复方法:

执行函数前,检查函数执行内容,避免造成函数创建者借助执行者的权限执行了越权的操作。

确保开启三权分立配置

设置参数 enableSeparationOfDutyon 会开启三权分立配置,限制系统管理员的权限,系统管理员不再拥有创建用户或更改用户配置权限,并且不再拥有查看和维护数据库审计日志的权限。当开启三权分立时,建议用户关闭 GUC 参数 enable_copy_server_files 来控制系统管理员的 copy 权限,防止系统管理员通过 copy 命令读取或者修改用户配置文件。

检查 enableSeparationOfDuty 参数值是否为 on,如果不为 on 则失败。

omm@postgres=# show enableSeparationOfDuty;
 enableSeparationOfDuty 
------------------------
 off
(1 row)

修复方法:

修改参数 enableSeparationOfDutyon,然后重启数据库。修改命令如下:

gs_guc set -Z datanode -N all -I all -c "enableSeparationOfDuty = on"
gs_om -t stop && gs_om -t start

确保取消系统管理员服务端文件 COPY 权限

参数 enable_copy_server_files 允许系统管理员用户执行服务端文件的 COPY 操作,但远程 COPY 操作存在越权查看或修改敏感文件的风险。在生产环境下的数据库中,通常不建议打开该配置。该参数的默认值为 off,表示只允许初始用户执行 COPY FROM FILENAMECOPY TO FILENAME 语句。

检查 enable_copy_server_files 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show enable_copy_server_files;
 enable_copy_server_files 
--------------------------
 off
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "enable_copy_server_files=off"

数据库审计

确保开启数据库审计功能

审计日志记录是安全事件中事后追溯、定位问题原因及划分事故责任的重要手段。推荐开启数据库审计功能,将参数 audit_enabled 设置为 on

检查 audit_enabled 参数值是否为 on,不为 on 则失败。

omm@postgres=# show audit_enabled;
 audit_enabled 
---------------
 on
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "audit_enabled = on"

确保开启用户登录和注销审计

参数 audit_login_logout 决定是否对用户登录(包括登录成功和登录失败)和注销操作记录审计日志。如果开启此选项可以追溯有哪些用户曾经登录数据库,何时注销登录,否则无法对用户登录和注销情况进行审计。

检查 audit_login_logout 参数值是否为 7,不为 7 则失败。

omm@postgres=# show audit_login_logout;
 audit_login_logout 
--------------------
 7
(1 row)

修复方法:

修改参数值为 7,表示用户登录成功、失败和注销均记录审计日志。

gs_guc reload -Z datanode -N all -I all -c "audit_login_logout = 7"

确保开启数据库启动、停止、恢复和切换审计

参数 audit_database_process 决定是否对数据库的启动、停止、切换和恢复操作记录审计日志。开启此选项可以追溯数据库的运行状态变化。

检查 audit_database_process 参数值是否为 1,如果不为 1 则失败。

omm@postgres=# show audit_database_process;
 audit_database_process 
------------------------
 1
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "audit_database_process = 1"

确保开启用户锁定和解锁审计

参数 audit_user_locked 决定是否对数据库用户的锁定和解锁操作记录审计日志。

检查 audit_user_locked 参数值是否为 1,如果不为 1 则失败。

omm@postgres=# show audit_user_locked;
 audit_user_locked 
-------------------
 1
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "audit_user_locked = 1"

确保开启权限授予和回收审计

参数 audit_grant_revoke 决定是否对数据库用户权限授予和回收的操作记录审计日志。

检查 audit_grant_revoke 参数值是否为 1,如果不为 1 则失败。

omm@postgres=# show audit_grant_revoke;
 audit_grant_revoke 
--------------------
 1
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "audit_grant_revoke = 1"

确保开启数据库对象的添加、删除、修改审计

参数 audit_system_object 决定是否对数据库对象的 CREATE、DROP、ALTER 操作记录审计日志。这些数据库对象包括 DATABASE、USER、SCHEMA、TABLE 等。该参数的值由 28 个二进制位的组合求出,这 28 个二进制位分别代表 openGauss 的 26 类数据库对象(包含两个保留位)。如果对应的二进制位取值为 0,表示不审计对应的数据库对象的 CREATE、DROP、ALTER 操作;取值为 1,表示审计对应的数据库对象的 CREATE、DROP、ALTER 操作。这 26 个二进制位代表的具体审计内容请参见 openGauss 的官方文档中对 audit_system_object 参数的说明。

检查 audit_system_object 参数值配置,如果参数值小于默认值 67121159 则失败。

omm@postgres=# show audit_system_object;
 audit_system_object 
---------------------
 67121159
(1 row)

修复方法:

参数 audit_system_object 参数值设置为 67121159,表示只对 DATABASE、SCHEMA、USER、DATA SOURCE、SQL PATCH 这五类数据库对象的 CREATE、ALTER、DROP 操作进行审计。用户可根据业务需要开启对更多数据库对象 DDL 操作的审计。

gs_guc reload -Z datanode -N all -I all -c "audit_system_object = 67121159"

确保开启数据库对象的查询审计

参数 audit_dml_state_select 决定是否对数据库对象的 SELECT 操作进行审计,默认值为 0 表示不开启。

检查 audit_dml_state_select 参数值是否为 1,如果不为 1 则失败。

omm@postgres=# show audit_dml_state_select;
 audit_dml_state_select 
------------------------
 0
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "audit_dml_state_select = 1"

确保审计优先策略配置正确

控制审计日志的保存策略,以空间还是时间限制为优先策略。

检查 audit_resource_policy 参数值是否为 on,如果不为 on 则失败。

omm@postgres=# show audit_resource_policy;
 audit_resource_policy 
-----------------------
 on
(1 row)

修复方法:

修改参数 audit_resource_policyon(空间优先)。

gs_guc reload -Z datanode -N all -I all -c "audit_resource_policy = on"

确保单个审计文件的最长记录时间配置正确

检查 audit_rotation_interval 参数值配置,建议配置最长记录时间为 1 天。

omm@postgres=# show audit_rotation_interval;
 audit_rotation_interval 
-------------------------
 1d
(1 row)

修复方法:

参数 audit_rotation_interval 的单位为分钟(min),修改参数值为 1440,即为 1 天(1d)。

gs_guc reload -Z datanode -N all -I all -c "audit_rotation_interval = 1440"

确保单个审计日志文件的最大容量配置正确

参数 audit_rotation_size 设置单个审计日志文件最大的容量。当审计日志文件达到最大容量时,将自动创建一个新的日志文件。

检查 audit_rotation_size 参数值配置,建议配置为 10 MB。

openGauss=# show audit_rotation_size;
audit_rotation_size
---------------------
10MB
(1 row)

修复方法:

修改 audit_rotation_size 参数值 10 MB。

gs_guc reload -Z datanode -N all -I all -c "audit_rotation_size = 10MB"

确保所有审计日志文件占用的最大磁盘空间配置正确

参数 audit_space_limit 设置审计文件所占的最大磁盘空间。当审计文件总量超过最大值时,系统将在数据库日志文件中写入警告信息,并删除最早的审计文件,同时记录审计文件删除信息到审计日志中。

检查 audit_space_limit 参数值配置。

omm@postgres=# show audit_space_limit;
 audit_space_limit 
-------------------
 1GB
(1 row)

修复方法:

根据实际需要配置参数 audit_space_limit 大小,建议配置不小于 1 GB。

gs_guc reload -Z datanode -N all -I all -c "audit_space_limit = 1GB"

确保审计日志文件最大数目配置正确

参数 audit_file_remain_threshold 设置审计日志文件的最大保留数量。当审计文件总数超过指定值时,系统将向数据库日志文件中写入警告信息,并删除最早的审计文件,同时记录审计文件删除信息到审计日志中。

检查 audit_file_remain_threshold 参数值配置,通常建议配置为默认值 1048576

omm@postgres=# show audit_file_remain_threshold;
 audit_file_remain_threshold 
-----------------------------
 1048576
(1 row)

修复方法:

修改 audit_file_remain_threshold 参数值为 1048576

gs_guc reload -Z datanode -N all -I all -c "audit_file_remain_threshold = 1048576"

错误报告和日志配置

确保开启日志收集器

参数 logging_collector 控制开启后端日志收集进程 logger 进行日志收集。该进程捕获发送到 stderrcsvlog 的日志消息并写入日志文件。这种记录日志的方法比将日志记录到 syslog 更加有效,因为某些类型的消息在 syslog 的输出中无法显示。

检查 logging_collector 参数值是否为 on,如果不为 on 则失败。

omm@postgres=# show logging_collector;
 logging_collector 
-------------------
 on
(1 row)

修复方法:

postgresql.conf 配置文件中修改参数 logging_collectoron,然后重启数据库。

gs_guc set -Z datanode -N all -I all -c "logging_collector=on"
gs_om -t stop && gs_om -t start

确保日志名称配置正确

参数 log_filename 设置服务器运行日志文件的名称。建议使用 % 转义字符定义日志文件名称,以便能够自动包含日期和时间信息,从而方便对日志文件进行有效的管理。

检查 log_filename 参数配置,建议保持默认配置,即使用包含日期和时间信息的格式。

omm@postgres=# show log_filename;
          log_filename          
--------------------------------
 postgresql-%Y-%m-%d_%H%M%S.log
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'"

确保日志文件权限配置正确

当开启参数 logging_collector 时,可以使用参数 log_file_mode 设置服务器日志文件的权限。因为日志文件中可能含有用户数据,所以日志文件访问必须受到限制,以防止日志信息泄露或被篡改。

检查 log_file_mode 参数值是否为 0600,如果不是则失败。

omm@postgres=# show log_file_mode;
 log_file_mode 
---------------
 0600
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "log_file_mode=0600"

禁止覆盖写入同名日志文件

参数 log_truncate_on_rotation 设置日志消息的写入方式。当设置为 on 时,数据库会以覆盖写入的方式写入服务器日志消息,这意味着当日志文件被轮转时,新的日志消息会覆盖旧的日志消息。当设置为 off 时,新的日志消息会被附加到同名的现有日志文件上,而不会覆盖旧的日志。为确保日志保留更长时间,需要将此参数设置为 off,禁止覆盖写入同名日志文件。

检查 log_truncate_on_rotation 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show log_truncate_on_rotation;
 log_truncate_on_rotation 
--------------------------
 off
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "log_truncate_on_rotation=off"

确保单个日志文件最大记录时间配置正确

参数 log_rotation_age 用于设置单个日志文件最大的日志记录时间。当日志记录时间超过该参数设置的最大值时,服务器将自动创建新的日志文件。正确的配置有助于避免日志文件过于频繁地产生,同时避免单个日志文件过大导致管理不便。

检查 log_rotation_age 参数配置,建议配置为默认值 1d(即一天)。

omm@postgres=# show log_rotation_age;
 log_rotation_age 
------------------
 1d
(1 row)

修复方法:

参数 log_rotation_age 单位为 min,默认值为 1d,即 1440min

gs_guc reload -Z datanode -N all -I all -c "log_rotation_age=1d"

确保单个日志文件最大容量配置正确

参数 log_rotation_size 用于设置单个日志文件的最大容量。当日志文件达到该最大容量时,服务器将自动创建新的日志文件,以避免日志文件过大导致管理困难。

检查 log_rotation_size 参数配置,建议配置为默认值 20MB

omm@postgres=# show log_rotation_size;
 log_rotation_size 
-------------------
 20MB
(1 row)

修复方法:

参数 log_rotation_size 单位为 KB,默认值为 20MB

gs_guc reload -Z datanode -N all -I all -c "log_rotation_size=20MB"

确保客户端日志等级配置正确

参数 client_min_messages 控制按设置的等级将消息发送到客户端。有效的值包括 debugdebug5debug4debug3debug2debug1infonoticewarningerrorlogfatalpanic,其中 debugdebug2 等效。每个等级都包括排在他后面的所有级别中的日志。在实际设置过程中,如果设置的级别大于 error,例如为 fatalpanic,系统会默认将级别转为 error

检查 client_min_messages 参数值,如果为 debugdebug1~debug5 则配置可能不正确。

omm@postgres=# show client_min_messages;
 client_min_messages 
---------------------
 notice
(1 row)

修复方法:

gs_guc reload -Z datanode -N all -I all -c "client_min_messages=notice"

确保服务器日志等级配置正确

参数 log_min_messages 控制按的等级将消息写入到服务器日志。有效的值包括 debugdebug5debug4debug3debug2debug1infonoticewarningerrorlogfatalpanic。其中 debugdebug2 等效,每个级别都包含排在他后面的所有级别中的信息。

检查 log_min_messages 参数值,如果为 debugdebug1~debug5 则配置可能不正确。

omm@postgres=# show log_min_messages;
 log_min_messages 
------------------
 warning
(1 row)

修复方法:

设置参数 log_min_messageswarning

gs_guc reload -Z datanode -N all -I all -c "log_min_messages=warning"

确保记录产生错误的SQL语句日志级别配置正确

参数 log_min_error_statement 控制是否在服务器日志中记录产生错误的SQL语句。有效值包括 debugdebug5debug4debug3debug2debug1infonoticewarningerrorlogfatalpanic。设置为 error 时,表示产生 errorfatalpanic 级别错误的语句都将被记录。设置为 panic 时,表示关闭此特性。由于有的 SQL 语句中包含用户个人信息,如果不需要记录出错的 SQL 语句,可以将参数设置为 panic

检查 log_min_error_statement 参数值是否为 error,如果不为 error 则配置可能不正确。

omm@postgres=# show log_min_error_statement;
 log_min_error_statement 
-------------------------
 error
(1 row)

修复方法:

设置参数 log_min_error_statementerror

gs_guc reload -Z datanode -N all -I all -c "log_min_error_statement=error"

确保开启用户登录时日志记录功能

参数 log_connections 用于记录每次尝试连接到服务器的日志,以及成功完成客户端连接认证的日志。

通过执行以下 SQL 命令来检查 log_connections 参数值是否为 on,如果不为 on 则失败。

omm@postgres=# show log_connections;
 log_connections 
-----------------
 off
(1 row)

修复方法:

设置参数 log_connectionson

gs_guc reload -Z datanode -N all -I all -c "log_connections=on"

确保开启用户注销时日志记录功能

参数 log_disconnections 用于设置是否记录客户端结束连接的信息,包括在会话结束时在服务器日志中输出一行,并包含会话的持续时间。

检查 log_disconnections 参数的值是否为 on,如果不为 on 则失败。

omm@postgres=# show log_disconnections;
 log_disconnections 
--------------------
 off
(1 row)

修复方法:

设置参数 log_disconnectionson

gs_guc reload -Z datanode -N all -I all -c "log_disconnections=on"

确保写入服务器日志的详细度配置正确

参数 log_error_verbosity 用于控制写入服务器日志的详细度。有效值包括 TERSEDEFAULTVERBOSE

检查 log_error_verbosity 参数值是否为 default,如果不为 default 则失败。

omm@postgres=# show log_error_verbosity;
 log_error_verbosity 
---------------------
 default
(1 row)

修复方法:

设置参数 log_error_verbositydefault

gs_guc reload -Z datanode -N all -I all -c "log_error_verbosity=default"

确保日志不记录主机名

参数 log_hostname 控制连接日志消息中是否记录主机名。当 log_hostname 设置为 on 时,连接日志消息会同时显示连接主机的 IP 地址和主机名。由于解析主机名需要一定的时间,这可能会带来额外的性能开销。因此,建议将 log_hostname 设置为 off,这样连接日志中只记录 IP 地址而不记录主机名。

检查 log_hostname 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show log_hostname;
 log_hostname 
--------------
 off
(1 row)

修复方法:

设置 log_hostname 参数为 off

gs_guc reload -Z datanode -N all -I all -c "log_hostname=off"

确保关闭解析树调试打印开关

参数 debug_print_parse 用于控制是否打印查询的解析树结果。当该参数设置为 on 时,查询的解析树结果将被打印到日志中,这可能会占用较多的日志空间,并对查询性能产生负面影响。在生产环境中,建议将 debug_print_parse 参数设置为 off,以禁止将查询的解析树结果打印到日志中。

检查方法:

检查 debug_print_parse 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show debug_print_parse;
 debug_print_parse 
-------------------
 off
(1 row)

修复方法:

设置参数 debug_print_parseoff

gs_guc reload -Z datanode -N all -I all -c "debug_print_parse=off"

确保关闭执行计划调试打印开关

参数 debug_print_plan 用于控制是否打印查询的执行计划到日志中。默认情况下,该参数设置为 off,表示不打印执行计划。但是,如果将其设置为 on,则会将查询的执行计划打印到日志中,这可能会占用大量的日志空间,并对查询性能产生负面影响。因此,在生产环境中,建议将 debug_print_plan 参数设置为 off,以禁止将查询的执行计划打印到日志中。

检查方法:

检查 debug_print_plan 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show debug_print_plan;
 debug_print_plan 
------------------
 off
(1 row)

修复方法:

debug_print_plan 参数设置为 off

gs_guc reload -Z datanode -N all -I all -c "debug_print_plan=off"

确保关闭查询重写调试打印开关

参数 debug_print_rewritten 用于控制是否打印查询重写的结果到日志中。默认情况下,该参数设置为 off,表示不打印查询重写结果。但是,如果将其设置为 on,则会将查询重写的结果打印到日志中,这可能会占用大量的日志空间,并对查询性能产生负面影响。因此,在生产环境中,建议将 debug_print_rewritten 参数设置为 off,以禁止将查询重写结果打印到日志中。

检查方法:

检查 debug_print_rewritten 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show debug_print_rewritten;
 debug_print_rewritten 
-----------------------
 off
(1 row)

修复方法:

debug_print_rewritten 参数设置为 off

gs_guc reload -Z datanode -N all -I all -c "debug_print_rewritten=off"

WAL 归档配置

确保 WAL 信息记录级别配置正确

WAL(Write Ahead Log)即预写式日志,是数据库用于恢复事务持久性的一种机制。wal_level 决定了写入 WAL 的信息量。为了在备机上开启只读查询,wal_level 需要在主机上设置成 hot_standby,并且备机设置 hot_standby 参数为 on

检查 wal_level 参数是否为默认值 hot_standby,如果不是则失败。

omm@postgres=# show wal_level;
  wal_level  
-------------
 hot_standby
(1 row)

修复方法:

设置参数 wal_level 值为 hot_standby,并重启数据库使设置生效。

gs_guc set -Z datanode -N all -I all -c "wal_level=hot_standby"
gs_om -t stop && gs_om -t start

确保开启归档模式

参数 archive_mode 用于设置是否开启归档模式,该参数通常只建议当 wal_level 参数设置为 archive 时使用。当 wal_level 参数设置为 minimal 时,archive_mode 参数无法使用。如果设置 archive_mode 参数为 on,需要同时设置 archive_command 参数以指定归档 WAL 日志的命令。

检查方法:

  1. 先检查 wal_level 参数是否为 archive
  2. 如果 wal_levelarchive,则检查 archive_mode 参数值是否为 on
  3. 如果 wal_level 配置为 hot_standby,则无需检查 archive_mode
omm@postgres=# show wal_level;
  wal_level  
-------------
 hot_standby
(1 row)

omm@postgres=# show archive_mode;
 archive_mode 
--------------
 off
(1 row)

修复方法:

wal_level 参数为 archive 时,设置参数 archive_modeon,同时设置 archive_command 为归档 WAL 日志的命令,archive_command 参数的值仅供参考,其中 --remove-destination 选项作用为拷贝前如果目标文件已存在,会先删除已存在的目标文件,然后执行拷贝操作。

gs_guc reload -Z datanode -N all -I all -c "archive_mode=on"
gs_guc reload -Z datanode -N all -I all -c "archive_command='cp --remove-destination %p /mnt/server/archive/%f'"

运行环境配置

确保文件权限掩码配置正确

在 Linux 运行环境中,创建文件的默认权限可通过文件权限掩码 umask 配置。为防止数据库文件被其他用户访问或篡改,应确保 umask 配置为 0077,以确保只有数据库运行用户具有访问权限。umask 值一般在 /etc/bashrc/etc/profile$HOME/.bash_profile$HOME/.bashrc 中设置。

执行 umask 命令,查询设置值。

[omm@opengauss ~]$ umask 
0077

修复方法:

步骤1:以 $HOME/.bashrc 文件为例,通过 vi 命令编辑文件,配置 umask0077

umask 0077

步骤2:执行 source $HOME/.bashrc使环境变量生效。

source $HOME/.bashrc

确保对其他用户隐藏进程信息

为防止非数据库运行用户通过 pstop 等操作系统命令收集数据库运行时的相关进程信息,建议使用 hidepid 选项对其他用户隐藏进程。这样可以确保只有 root 用户可以查看所有进程,而普通用户只能看到自己的进程。这样可以避免用户进程信息泄露,提升数据库运行环境的安全性。

通过如下命令检查 /proc 是否配置了 hidepid 选项,如果配置 hidepid=2 则成功,否则失败。

[root@opengauss ~]# mount | grep "proc on /proc" | grep hidepid

修复方法:

使用 root 用户执行如下 mount 命令,为 /proc 增加 hidepid=2 选项。

# mount -o remount,rw,nosuid,nodev,noexec,relatime,hidepid=2 /proc

编辑 /etc/fstab 文件,增加或修改配置如下,以便在服务器启动时自动启用保护。

proc /proc proc defaults,nosuid,nodev,noexec,relatime,hidepid=2 0 0

确保开启 NTP 时钟同步

NTP(Network Time Protocol,网络时间协议)是同步网络中的各个计算机时间的一种协议。配置 NTP 可以使计算机的时钟同步到国际标准时间 UTC(Universal Time Coordinated,世界协调时),保证数据库服务端的各主机上的系统时间同步。服务端系统时间不同步或时间差异较大可能导致数据库无法正常运行。

执行如下 Shell 命令,检查 chronyd 服务是否启动。Active 字段返回 active (running) 表示已经启动,返回 inactive (dead) 表示未启动。

[root@opengauss ~]# systemctl status chronyd 2>&1 | grep Active
   Active: active (running) since Tue 2025-04-29 11:57:48 CST; 2h 25min ago

修复方法:

/etc/chrony.conf 文件中配置合适的 NTP 服务器,然后执行如下命令重启 chronyd 服务:

[root@opengauss ~]# systemctl restart chronyd

其它配置

确保服务器拒绝带反斜杠转义的引号的查询

参数 backslash_quote 控制字符串中是否允许使用 \' 来替代引号。“'” 的写法可能引发安全风险,如 SQL 注入攻击。为了避免这种风险,建议配置服务器拒绝带反斜杠转义的引号的查询。推荐使用 SQL 标准方法,使用一个引号写两遍('')的方法。

检查 backslash_quote 参数值,如果不为 safe_encodingoff 则失败。

omm@postgres=# show backslash_quote;
 backslash_quote 
-----------------
 safe_encoding
(1 row)

修复方法:

修改参数 backslash_quotesafe_encodingoff

gs_guc reload -Z datanode -N all -I all -c "backslash_quote=safe_encoding"

禁止修改系统表结构

参数 allow_system_table_mods 控制是否允许修改系统表的结构。虽然在某些极端情况下,此参数可以帮助恢复受损的数据库,但在生产环境中,修改系统表结构可能会带来严重的安全风险,包括数据丢失和系统不稳定。因此,在生产环境中,应将 allow_system_table_mods 参数设置为 off

检查 allow_system_table_mods 参数值是否为 off,如果不为 off 则失败。

omm@postgres=# show allow_system_table_mods;
 allow_system_table_mods 
-------------------------
 off
(1 row)

修复方法:

设置参数 allow_system_table_modsoff,然后重启数据库。设置命令如下:

gs_guc set -Z datanode -N all -I all -c "allow_system_table_mods=off"
gs_om -t stop && gs_om -t start
上次编辑于:
贡献者: stonebox