更新时间:2022-07-29 GMT+08:00

Schema空间管控

背景信息

GaussDB(DWS)存储资源管理上提供了Schema级别的空间管控能力,一方面可以实现单实例上的空间管控,避免数据库只读和磁盘满的情况出现;另一方面将空间管控和用户、队列解耦,实现了空间管控和权限的分离,降低用户使用空间管控的难度。

通过创建Schema时指定存储空间的大小实现对存储资源的管理,仅限制永久表存储空间(PREM SPACE)。Schema存储空间管理支持对表数据的存储空间管理,当一个Schema存在空间限制时,在业务执行过程中,如果该Schema下的表数据之和超过空间限制,则会导致业务出错。

前提条件

  • 存储空间控制功能enable_perm_space已设置为“on”。
  • 负载管理控制功能use_workload_manager已设置为“on”。

操作步骤

  1. 创建Schema“schema1”,设置其永久表空间限额为100G。

    1
    CREATE SCHEMA schema1 WITH PERM SPACE '100G';
    

  2. 修改Schema“schema1”永久表空间限额不受限制。

    1
    ALTER SCHEMA schema1 WITH PERM SPACE 'unlimited';
    

  3. 查看Schema“schema1”永久表空间限额是否已经设置。

    1
    2
    3
    4
    5
    SELECT * FROM PG_NAMESPACE WHERE NSPNAME = 'schema1';
     nspname | nspowner | nsptimeline | nspacl | permspace | usedspace
    ---------+----------+-------------+--------+-----------+-----------
     schema1 |       10 |           0 |        |        -1 |         0
    (1 row)
    

  • Schema空间信息是单实例的存储空间信息,CN/DN实例各自单独计算,相互不影响,可以更加有效的防止作业倾斜场景。
  • 执行作业使用空间超过Schema空间限额时,会对所执行的作业执行cancel操作,并会在pg_log目录下的日志文件中记录如下信息:"out of schema's perm space limit"。
  • unlogged table比较特殊,在max_query_retry_times大于0,即sql出错重试功能打开时,被认为是普通表,使用的空间记录在Schema永久表空间(PERM SPACE)下;在max_query_retry_times等于0,即sql出错重试功能关闭时,被认为是临时表,使用的空间不记录在Schema永久表空间(PEMP SPACE)下。如果使用unlogged table期间,切换了max_query_retry_times,按照上述判断,会导致切换前后unlogged table被判断为临时表和普通表的结果不一致,对应表在增删数据的情况下,对应schema上的永久数据空间变化也会出现异常情况,与实际物理空间有偏差。如果在unlogged table使用过程中,发生主备切换,unlogged table数据会丢失,导致对应schema上空间与实际物理空间存在丢失数据量的偏差。
  • PG_TOTAL_SCHEMA_INFO视图中统计的Schema使用空间与磁盘实际使用空间可能存在一定的误差(±5%左右),用户可通过执行select pgxc_wlm_readjust_schema_space() 函数来进行修正。修正函数不可重入,重入会导致修正结果不准确,在执行该修正函数过程中,如果在表插入数据,可能会出现统计不够准确的情况。
  • 列存表的CUDESC、CUDESC_INDEX、DELTA、CUDESC_PART、CUDESC_PART_INDEX都是辅助表,这些辅助表的空间会被记录到CSTORE Schema空间中;列存表的CBTREE索引存储空间大小能正常记录到主表队里的Schema上,但PSORT索引比较特殊,其存储空间大小仍然会被记录到CSTORE Schema空间中。而TOAST表和TOAST索引,其空间会被记录到PG_TOAST Schema空间中。
  • 表空间Tablespace中的表,其存储空间会被记录到该表所在的Schema上。
  • Schema空间管控将会忽略template0和template1两个模板库,对这两个模板库中Schema不会进行管控。
  • 扩容缩容场景下,数据重分布之后,Schema空间统计值会有偏差,需要调用校准函数来重新校准。
  • 修改表的分布列场景下,Schema空间统计值会有偏差,需要调用校准函数来重新校准。
  • VACUUM FULL/REINDEX表的过程中,如果主DN故障发生主备切换,Schema空间统计值会有偏差,需要调用校准函数来重新校准。
  • 创建临时表时,会同步创建临时Schema,这些临时Schema的名称类似于pg_temp_*和pg_toast_temp_*,临时Schema的空间不会被管控所限制,并且临时Schema信息不在PG_TOTAL_SCHEMA_INFO视图中展示。
  • GaussDB(DWS) 8.1.0.3之前版本升级到8.1.0.3及之后版本,PG_TOTAL_SCHEMA_INFO中统计的PERM SPACE信息未计算升级前已使用的空间大小,升级完成后,可通过执行select pgxc_wlm_readjust_schema_space() 函数来进行空间统计。
  • GaussDB(DWS)提供了查询集群Schema空间信息的视图PGXC_TOTAL_SCHEMA_INFO与PGXC_TOTAL_SCHEMA_INFO_ANALYZE,其中,PGXC_TOTAL_SCHEMA_INFO视图提供了集群所有实例上对应Schema的空间信息,PGXC_TOTAL_SCHEMA_INFO_ANALYZE视图对集群所有实例的Schema空间信息做了汇总分析,提供了集群总值、平均值、倾斜率、最大值、最小值以及最大最小实例名等信息。逻辑集群下,上述两个视图将会提供所有逻辑集群下的Schema空间信息和分析结果,如果只关注个别逻辑集群,可以使用GaussDB(DWS)提供的函数PGXC_WLM_GET_SCHEMA_SPACE('lccluster1')和PGXC_WLM_ANALYZE_SCHEMA_SPACE('lccluster1')来获取逻辑集群lccluster1下的Schema空间信息。

查看Schema的空间信息

select * from pg_namespace;
 nspname            | nspowner | nsptimeline |         nspacl          | permspace | usedspace
--------------------+----------+-------------+-------------------------+-----------+-----------
 public             |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 dbms_redact        |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 schema1            |       10 |           0 |                         |        -1 |         0
 dbms_random        |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 pg_toast           |       10 |           0 |                         |        -1 |   2326528
 testt              |    28726 |           0 |                         |        -1 |      8192
 dbms_om            |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 dbms_job           |       10 |           0 | {lys1=UC/lys1,=UC/lys1} |        -1 |         0
 sys                |       10 |           0 |                         |        -1 |         0
 information_schema |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |    294912
 utl_file           |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 utl_raw            |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 dbms_output        |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 dbms_sql           |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 dbms_lob           |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |         0
 cstore             |       10 |           0 |                         |        -1 |    696320
 user1              |    16390 |           0 |                         |  22405120 |      8192
 pg_catalog         |       10 |           0 | {lys1=UC/lys1,=U/lys1}  |        -1 |  24903680
(18 rows)

select * from pg_total_schema_info;
 schemaid |     schemaname     | databaseid | databasename | usedspace | permspace
----------+--------------------+------------+--------------+-----------+-----------
       11 | pg_catalog         |      16389 | test         |         0 |        -1
       99 | pg_toast           |      16389 | test         |         0 |        -1
      100 | cstore             |      16389 | test         |         0 |        -1
     2200 | public             |      15095 | gaussdb     |         0 |        -1
     2200 | public             |      16389 | test         |         0 |        -1
     4230 | dbms_redact        |      15095 | gaussdb     |         0 |        -1
     3987 | dbms_om            |      15095 | gaussdb     |         0 |        -1
     3988 | dbms_job           |      15095 | gaussdb     |         0 |        -1
     3987 | dbms_om            |      16389 | test         |         0 |        -1
     3988 | dbms_job           |      16389 | test         |         0 |        -1
     4230 | dbms_redact        |      16389 | test         |         0 |        -1
    11693 | sys                |      15095 | gaussdb     |         0 |        -1
    28714 | test1              |      15095 | gaussdb     |         0 |        -1
    28715 | test3              |      15095 | gaussdb     |         0 |        -1
    28728 | redisuser          |      15095 | gaussdb     |         0 |        -1
    28730 | testt              |      15095 | gaussdb     |      8192 |        -1
    28766 | redisuser1         |      15095 | gaussdb     |         0 |        -1
    28798 | schema1            |      15095 | gaussdb     |         0 |        -1
    11693 | sys                |      16389 | test         |         0 |        -1
    14147 | information_schema |      15095 | gaussdb     |    294912 |        -1
    14490 | utl_file           |      15095 | gaussdb     |         0 |        -1
    14515 | utl_raw            |      15095 | gaussdb     |         0 |        -1
    14508 | dbms_output        |      15095 | gaussdb     |         0 |        -1
    14512 | dbms_random        |      15095 | gaussdb     |         0 |        -1
    14520 | dbms_sql           |      15095 | gaussdb     |         0 |        -1
    14547 | dbms_lob           |      15095 | gaussdb     |         0 |        -1
    14147 | information_schema |      16389 | test         |         0 |        -1
    14490 | utl_file           |      16389 | test         |         0 |        -1
    14508 | dbms_output        |      16389 | test         |         0 |        -1
    14515 | utl_raw            |      16389 | test         |         0 |        -1
    14512 | dbms_random        |      16389 | test         |         0 |        -1
    14520 | dbms_sql           |      16389 | test         |         0 |        -1
    14547 | dbms_lob           |      16389 | test         |         0 |        -1
       11 | pg_catalog         |      15095 | gaussdb     |  22405120 |  22405120
       99 | pg_toast           |      15095 | gaussdb     |   2326528 |        -1
      100 | cstore             |      15095 | gaussdb     |    696320 |        -1
    16392 | user1              |      15095 | gaussdb     |      8192 |        -1
(37 rows)

select * from  pgxc_total_schema_info;
     schemaname     | schemaid | databasename | databaseid |   nodename   |  nodegroup   | usedspace | permspace
--------------------+----------+--------------+------------+--------------+--------------+-----------+-----------
 pg_catalog         |       11 | test1        |      16384 | datanode1    | installation |   9469952 |        -1
 public             |     2200 | gaussdb     |      15253 | datanode1    | installation |  25280512 |        -1
 pg_toast           |       99 | test1        |      16384 | datanode1    | installation |   1859584 |        -1
 cstore             |      100 | test1        |      16384 | datanode1    | installation |         0 |        -1
 data_redis         |    18106 | gaussdb     |      15253 | datanode1    | installation |    655360 |        -1
 data_redis         |    18116 | test1        |      16384 | datanode1    | installation |         0 |        -1
 public             |     2200 | test1        |      16384 | datanode1    | installation |     16384 |        -1
 dbms_om            |     3987 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 dbms_job           |     3988 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 dbms_om            |     3987 | test1        |      16384 | datanode1    | installation |         0 |        -1
 dbms_job           |     3988 | test1        |      16384 | datanode1    | installation |         0 |        -1
 sys                |    11693 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 sys                |    11693 | test1        |      16384 | datanode1    | installation |         0 |        -1
 utl_file           |    14644 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 utl_raw            |    14669 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 dbms_sql           |    14674 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 dbms_output        |    14662 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 dbms_random        |    14666 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 dbms_lob           |    14701 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
 information_schema |    14300 | gaussdb     |      15253 | datanode1    | installation |    294912 |        -1
 information_schema |    14300 | test1        |      16384 | datanode1    | installation |    294912 |        -1
 utl_file           |    14644 | test1        |      16384 | datanode1    | installation |         0 |        -1
 dbms_output        |    14662 | test1        |      16384 | datanode1    | installation |         0 |        -1
 dbms_random        |    14666 | test1        |      16384 | datanode1    | installation |         0 |        -1
 utl_raw            |    14669 | test1        |      16384 | datanode1    | installation |         0 |        -1
 dbms_sql           |    14674 | test1        |      16384 | datanode1    | installation |         0 |        -1
 dbms_lob           |    14701 | test1        |      16384 | datanode1    | installation |         0 |        -1
 pg_catalog         |       11 | gaussdb     |      15253 | datanode1    | installation |  13017088 |        -1
 redisuser          |    16387 | gaussdb     |      15253 | datanode1    | installation |    630784 |        -1
 pg_toast           |       99 | gaussdb     |      15253 | datanode1    | installation |   3080192 |        -1
 cstore             |      100 | gaussdb     |      15253 | datanode1    | installation |   2408448 |        -1
 pg_catalog         |       11 | test1        |      16384 | datanode2    | installation |   9469952 |        -1
 public             |     2200 | gaussdb     |      15253 | datanode2    | installation |  25214976 |        -1
 pg_toast           |       99 | test1        |      16384 | datanode2    | installation |   1859584 |        -1
 cstore             |      100 | test1        |      16384 | datanode2    | installation |         0 |        -1
 data_redis         |    18106 | gaussdb     |      15253 | datanode2    | installation |    655360 |        -1
 data_redis         |    18116 | test1        |      16384 | datanode2    | installation |         0 |        -1
 public             |     2200 | test1        |      16384 | datanode2    | installation |     16384 |        -1
 dbms_om            |     3987 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 dbms_job           |     3988 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 dbms_om            |     3987 | test1        |      16384 | datanode2    | installation |         0 |        -1
 dbms_job           |     3988 | test1        |      16384 | datanode2    | installation |         0 |        -1
 sys                |    11693 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 sys                |    11693 | test1        |      16384 | datanode2    | installation |         0 |        -1
 utl_file           |    14644 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 utl_raw            |    14669 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 dbms_sql           |    14674 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 dbms_output        |    14662 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 dbms_random        |    14666 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 dbms_lob           |    14701 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
 information_schema |    14300 | gaussdb     |      15253 | datanode2    | installation |    294912 |        -1
 information_schema |    14300 | test1        |      16384 | datanode2    | installation |    294912 |        -1
 utl_file           |    14644 | test1        |      16384 | datanode2    | installation |         0 |        -1
 dbms_output        |    14662 | test1        |      16384 | datanode2    | installation |         0 |        -1
 dbms_random        |    14666 | test1        |      16384 | datanode2    | installation |         0 |        -1

select * from  pgxc_total_schema_info_analyze;
     schemaname     | databasename |  nodegroup   | total_value | avg_value | skew_percent |                  extend_info
--------------------+--------------+--------------+-------------+-----------+--------------+-----------------------------------------------
 pg_catalog         | test1        | installation |    56819712 |   9469952 |            0 | min:9469952 datanode1,max:9469952 datanode1
 public             | gaussdb     | installation |   150495232 |  25082538 |            0 | min:24903680 datanode6,max:25280512 datanode1
 pg_toast           | test1        | installation |    11157504 |   1859584 |            0 | min:1859584 datanode1,max:1859584 datanode1
 cstore             | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 data_redis         | gaussdb     | installation |     1966080 |    327680 |           50 | min:0 datanode4,max:655360 datanode1
 data_redis         | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 public             | test1        | installation |       98304 |     16384 |            0 | min:16384 datanode1,max:16384 datanode1
 dbms_om            | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_job           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_om            | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_job           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 sys                | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 sys                | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 utl_file           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 utl_raw            | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_sql           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_output        | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_random        | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_lob           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 information_schema | gaussdb     | installation |     1769472 |    294912 |            0 | min:294912 datanode1,max:294912 datanode1
 information_schema | test1        | installation |     1769472 |    294912 |            0 | min:294912 datanode1,max:294912 datanode1
 utl_file           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_output        | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_random        | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 utl_raw            | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_sql           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 dbms_lob           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
 pg_catalog         | gaussdb     | installation |    75210752 |  12535125 |            3 | min:12091392 datanode4,max:13017088 datanode1
 redisuser          | gaussdb     | installation |     1884160 |    314026 |           50 | min:16384 datanode4,max:630784 datanode1
 pg_toast           | gaussdb     | installation |    17154048 |   2859008 |            7 | min:2637824 datanode4,max:3080192 datanode1
 cstore             | gaussdb     | installation |    15294464 |   2549077 |            5 | min:2408448 datanode1,max:2703360 datanode6
(31 rows)