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”命令后有什么东西挥之不去?
尝试sudo lsof| grep deleted
检查是否出现任何 PostgreSQL 进程。此命令查找已删除但其文件描述符仍被任何进程打开的文件。另一个副作用是,df -h
与du -sh /
不同。这是因为du
查看文件系统并总结所有文件的大小,然后df
查看物理设备。
我刚刚遇到了一个数据库问题,该数据库在经过一段时间后没有释放任何空间 DROP table
,这就是原因。
我知道的唯一解决方案是重新启动数据库。也许您可以尝试发送重新加载(SIGHUP)。
我的理解是,当您删除数据库时,它及其文件都消失了。
除非您使用表空间,否则每个数据库都应该在 $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)
了解磁盘空间的去向。