限制数据库大小

时间:2016-06-14 21:12:59

标签: postgresql

我很惊讶我没有在SO上找到这个Q.然而,谷歌搜索它会带来非常旧的页面。可能我找不到正确的关键字。将此Q发布到数据库管理员会使其无人接听。

致Q本身:

我非常确定我已经阅读了postgres中的一项功能来限制数据库大小。但我今天在手册中找不到它。

我是否记错了?如何限制数据库的大小?

1 个答案:

答案 0 :(得分:2)

Postgres中没有内置的配额系统,所以我猜你听错了。

但是,您可以通过以下两种方式实现:

  1. 为每个用户创建表空间。如果您在文件系统上有配额,则可以安排它们匹配。您当然会冒着数据库完整性的风险。我不会尝试。

  2. 编写一个禁用帐户INSERT的脚本。您可以使用pg_database_size查询数据库上的磁盘利用率。我会编写一个shell脚本来检查和撤销/授予访问权限并使用cron定期运行。

  3. E.g:

    evlaopt=# select pg_database_size('evlaopt');
     pg_database_size
    ------------------
           9240136352
    (1 row)
    
    evlaopt=# select pg_size_pretty(pg_database_size('evlaopt'));
     pg_size_pretty
    ----------------
     8812 MB
    (1 row)
    

    evlaopt是我机器上的数据库。)

    假设您拥有名称匹配的用户和数据库,并且它们都具有相同的配额(比方说)100 MB。你可以这样做:

    # grant access to databases below the limit
    for DB in $(psql -At -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND pg_database_size(datname) < 1024 * 1024 * 100'); do
        psql -At -c "GRANT INSERT ON ALL TABLES IN SCHEMA public TO $DB" $DB
    done
    
    # revoke access to databases at or above the limit
    for DB in $(psql -At -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND pg_database_size(datname) >= 1024 * 1024 * 100'); do
        psql -At -c "REVOKE INSERT ON ALL TABLES IN SCHEMA public FROM $DB" $DB
    done