磁盘配额管理

更新时间:

Diskquota可以对AnalyticDB PostgreSQL版的磁盘配额进行管理,可以允许超级用户为Schema和Role设置磁盘使用配额。本文将介绍如何在AnalyticDB PostgreSQL版中创建和使用Diskquota。

说明

磁盘配额管理功能仅支持存储弹性模式的AnalyticDB PostgreSQL版实例。

启用和关闭Diskquota

  1. 创建Diskquota数据库,Diskquota模块使用此数据库存储启用该模块的数据库列表。

    createdb diskquota;
  2. 提交工单联系技术支持将Diskquota加入shared_preload_libraries并重启AnalyticDB PostgreSQL版实例。

  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后经AnalyticDB PostgreSQL版官方测试 ,有低于2%-3%的性能损失。