限制数据库大小

Ami*_*wad 2 postgresql

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

对于 Q 本身:

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

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

Dan*_*ons 8

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

但是,您可以通过以下几种方式做到这一点:

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

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

例如:

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)