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


12

我正在开发一个dev系统,并且一直在还原到我用于开发目的的数据库“ foo”。在处理这些问题时,我刚刚运行了DROP DATABASE foo。但是,我很快意识到我已经吃光了磁盘上的所有空间。废话

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

必须有一种无需执行整个数据库初始化就可以回收该空间的方法吗?

编辑

因此,我大致按照以下步骤从备份重新初始化了数据库。还原后,我已经收回了磁盘上的大量空间!现在可以使用,但是有关如何清除删除的数据库的任何帮助仍然有用。

编辑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

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

当我重新创建,填充并再次放置时,它将继续这个循环。

有人在发出“ DROP DATABASE”命令后有什么想法吗?


也许还值得注意的是我已打开存档。看来WAL归档文件的写入位置相当大。我还没有密切监视它。也许我会尝试上面列出的相同过程,并在该目录上运行“ du”以查看是否回收了所有空间。我会报告。
Jmoney12年

我认为真空无济于事吗?
rogerdpack

Answers:


6

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

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

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


2
lsof | grep deleted小费是一个不错的小费。除此之外,您只需要确定哪些postgresql会话仍处于活动状态并杀死它们即可释放文件。在我的情况下,在500多个活动连接中,几乎所有处于IDLE或COMMIT状态的连接都被杀死,杀死了一个SELECT * FROM pg_stat_activity并被卡在ANALYZE中的连接足以释放已删除的文件。!00 GB已释放。
亚历克斯·

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

现在,如果我们创建一个新数据库,则在$ 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

我们看到的是($ 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

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

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

您可以尝试执行以下操作:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes

做各种数据库工作,创建,删除等,然后:

-bash-3.2$ du -sh `ls` > ../post_sizes

了解磁盘空间的去向。


我确实看到了与您相同的结果-即,当我添加表时,新数据库出现在基本目录中,而当我删除它时,它就消失了。但是,该目录似乎并没有包含大小的全部差异(即〜9.6GB)
Jmoney38 2012年

@ Jmoney38-这就是为什么我建议ls在执行数据库添加/删除之前和之后在$ PGDATA目录上执行“ du -sh ”,因为这应该标记出其他目录正在不断发展。
gsiems 2012年

@ Jmoney38-如果不得不猜测的话,可以在$ PGDATA / pg_log和/或$ PGDATA / pg_xlog目录中找到区别。日志文件用于集群,并且在删除数据库时不会被截断。
gsiems 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.