Diskquota 可以对云原生数据仓库 AnalyticDB PostgreSQL (简称 ADB PG) 的磁盘配额进行管理,ADB PG数据库可以允许超级用户为 schema 和 role 设置磁盘使用配额。本文将介绍 Diskquota 如何在云原生数据仓库 AnalyticDB PostgreSQL版中创建和使用。

启用和关闭Diskquota

  1. 创建Diskquota数据库,Diskquota模块使用此数据库存储启用该模块的数据库列表。
    $ createdb diskquota;
  2. 提交工单联系ADB PG后台技术人员,将Diskquota加入shared_preload_libraries并重启ADB PG 实例。
  3. 启用Diskquota。
    =# CREATE EXTENSION diskquota;
    CREATE EXTENSION
  4. 关闭Diskquota。
    =# drop extension diskquota;
    DROP EXTENSION
说明 如果在已经包含数据的数据库中使用Diskquota,则必须初始化Diskquota 表。文件比较多时,需要耗费一定时间。
SELECT diskquota.init_table_size_table();

设置 schema 或 role 的磁盘配额大小

  • 设置 schema 的磁盘配额。
    =# SELECT diskquota.set_schema_quota('adbpg1', '1MB');     
     set_schema_quota
    ------------------
    
    (1 row)
  • 设置 role 的磁盘配额。
    =# select diskquota.set_role_quota('u1', '250 MB');
     set_role_quota
    ----------------
    
    (1 row)
说明 磁盘配额以 MB、GB、TB、PB 为单位。 当设置为-1时,代表取消磁盘配额限制。Diskquota 在查询前与磁盘配额和黑名单比较,当超过配额时自动加入黑名单或本身在黑名单中便取消执行,属于软限制。

示例 对 schema 进行磁盘配额管理

  1. 创建数据库与 schema 。
    $createdb myadbpg    
    $psql myadbpg
    
    =# CREATE EXTENSION diskquota;        #启动diskquota 
    CREATE EXTENSION                            
    
    =# CREATE SCHEMA adbpg1;
    CREATE SCHEMA
  2. 设置 schema 磁盘配额。
    =# SELECT diskquota.set_schema_quota('adbpg1', '1MB');     
     set_schema_quota
    ------------------
    
    (1 row)
  3. 创建表并插入数据。
    =# SET search_path TO adbpg1;
    SET
    
    =# CREATE TABLE a(i int);    
    
    =# INSERT INTO a SELECT generate_series(1,100);
    INSERT 0 100
    
    =# INSERT INTO a SELECT generate_series(1,10000000);
    INSERT 0 10000000
  4. 超出配额时发生错误,并禁止插入。
    =# INSERT INTO a SELECT generate_series(1,100);
    ERROR:  schema's disk space quota exceeded with name:adbpg1
  5. 通过将配额设置为-1 取消 adbpg1 的磁盘配额限制,然后再次插入少量数据。

    INSERT命令之前的5秒钟睡眠可确保在运行命令之前更新磁盘配额表大小数据。

    =# SELECT diskquota.set_schema_quota('adbpg1', '-1');
     set_schema_quota
    ------------------
    
    (1 row)
    =#  SELECT pg_sleep(5);
     pg_sleep
    ----------
    
    (1 row)
    
    =# INSERT INTO a SELECT generate_series(1,100);
    INSERT 0 100

查看磁盘使用情况

  • 查看 schema 的磁盘使用情况。
     =#  SELECT * FROM diskquota.show_fast_schema_quota_view;
     schema_name | schema_oid | quota_in_mb | nspsize_in_bytes
    -------------+------------+-------------+------------------
     adbpg1      |      16806 |        2000 |        721321984
    (1 row)
  • 查看 role 的磁盘使用情况。
    =# SELECT * FROM diskquota.show_fast_role_quota_view;
     role_name | role_oid | quota_in_mb | rolsize_in_bytes
    -----------+----------+-------------+------------------
     u1        |    16810 |         250 |                0
    (1 row)
说明 启用 Diskquota 后经 ADB PG官方测试 ,有低于 2%-3%的性能损失。