删除数据库后释放磁盘空间

Jmo*_*y38 14 postgresql disk-space

我正在开发一个开发系统,我一直在恢复到一个数据库,比如“foo”,我用于开发目的。当我解决这些问题时,我一直在运行 DROP DATABASE foo。但是,我很快意识到我已经吃光了磁盘上的所有空间。废话。

来自不同逻辑数据库的 VACUUM FULL 是否从我之前删除的数据库中释放空间 (foo)?我从不同的逻辑数据库尝试了这个,并且回收了可用空间,但我认为这不足以解释我所做的所有 CREATE DATABASE/DROP DATABASE 调用。它可能只是对我运行的逻辑数据库进行了 VACUUM 处理。

必须有一种方法可以在不执行整个数据库初始化的情况下回收该空间?

编辑

所以我从备份中重新初始化了数据库,大致遵循这些步骤。恢复后,我在磁盘上回收了大量空间!这暂时有效,但有关如何清理删除的数据库的任何帮助仍然有用。

编辑 2

所以我设法收集了一些关于这个问题的更多信息......这是我想出的一个例子:

Initial partition size:
                       Size   Used  Avail Use% Mounted on
                        25G   8.1G    16G  35% /apps1

After creating my new database and populating it:
                        25G    18G   6.4G  73% /apps1

After Dropping the database using "DROP database mydb" from a separate logical DB:
                        25G    13G    11G  56% /apps1
Run Code Online (Sandbox Code Playgroud)

所以在我看来,新数据库在磁盘上占用了大约 9.6 GB。但是,删除后,回收的磁盘空间仅增加了约 4.6G。所以,大约有 5 GB 的空间让我想知道发生了什么!?

当我重新创建、填充和再次删除时,它会继续这个循环。

有没有人知道发出“DROP DATABASE”命令后有什么东西挥之不去?

cha*_*rli 6

尝试sudo lsof| grep deleted检查是否出现任何 PostgreSQL 进程。此命令查找已删除但其文件描述符仍被任何进程打开的文件。另一个副作用是,df -hdu -sh /不同。这是因为du查看文件系统并总结所有文件的大小,然后df查看物理设备。

我刚刚遇到了一个数据库问题,该数据库在经过一段时间后没有释放任何空间 DROP table,这就是原因。

我知道的唯一解决方案是重新启动数据库。也许您可以尝试发送重新加载(SIGHUP)。

  • `lsof | grep删除的提示是一个很好的提示;除此之外,您只需要确定哪些 postgresql 会话仍然处于活动状态,并杀死它们,以释放文件。就我而言,在 500 多个活动连接中,几乎全部处于 IDLE 或 COMMIT 状态,杀死一个,使用“SELECT * FROM pg_stat_activity”发现并卡在 ANALYZE 中,足以释放已删除的文件。!00 GB 已释放。 (2认同)

gsi*_*ems 5

我的理解是,当您删除数据库时,它及其文件都消失了。

除非您使用表空间,否则每个数据库都应该在 $PGDATA/base 下它自己的子目录中拥有它的数据。以我的一台服务器为例(作为 postgres 用户):

-bash-3.2$ cd $PGDATA/base

-bash-3.2$ ls | wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp
Run Code Online (Sandbox Code Playgroud)

现在,如果我们创建一个新数据库,那么 $PGDATA/base 下应该还有一个子目录:

-bash-3.2$ createdb foo

-bash-3.2$ ls | wc -l
10

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
6.9M    83637
8.0K    pgsql_tmp
Run Code Online (Sandbox Code Playgroud)

这就是我们看到的($PGDATA/base/83637 是新数据库的子目录)。

删除该数据库也应该删除数据文件:

-bash-3.2$ dropdb foo

-bash-3.2$ ls wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp
Run Code Online (Sandbox Code Playgroud)

这正是我们所期望的——$PGDATA/base/83637 目录消失了,应该没有什么可以清理的了。

您确定没有其他东西占用您的磁盘空间吗?您的其他数据库之一?日志文件?

您可以尝试的方法是:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes
Run Code Online (Sandbox Code Playgroud)

执行各种数据库操作,创建、删除等,然后:

-bash-3.2$ du -sh `ls` > ../post_sizes
Run Code Online (Sandbox Code Playgroud)

了解磁盘空间的去向。