我很惊讶我没有在SO上找到这个Q.然而,谷歌搜索它会带来非常旧的页面。可能我找不到正确的关键字。将此Q发布到数据库管理员会使其无人接听。
致Q本身:
我非常确定我已经阅读了postgres中的一项功能来限制数据库大小。但我今天在手册中找不到它。
我是否记错了?如何限制数据库的大小?
答案 0 :(得分:2)
Postgres中没有内置的配额系统,所以我猜你听错了。
但是,您可以通过以下两种方式实现:
为每个用户创建表空间。如果您在文件系统上有配额,则可以安排它们匹配。您当然会冒着数据库完整性的风险。我不会尝试。
编写一个禁用帐户INSERT
的脚本。您可以使用pg_database_size
查询数据库上的磁盘利用率。我会编写一个shell脚本来检查和撤销/授予访问权限并使用cron定期运行。
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