我在heroku上的postgres数据库上超过了GB限制。
我发现了一个(非常大的(不推荐使用的表,并运行了Plot.delete_all
。现在17k行表中有0行
我现在可以看到行号的差异,但GB没有差异。以下是之前的数据大小(37.73 GB(
heroku pg:info
=== HEROKU_POSTGRESQL_ONYX_URL, DATABASE_URL
Plan: Hobby-basic
Connections: 2/20
PG Version: 11.14
Created: 2019-03-09 12:13 UTC
Data Size: 37.73 GB/10.00 GB (Write access revoked; Database deletion imminent)
Tables: 6
Rows: 2649450/10000000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-spherical-39745
以及之后(仍然是37.73 GB,尽管行数减少了16610(:
heroku pg:info
=== HEROKU_POSTGRESQL_ONYX_URL, DATABASE_URL
Plan: Hobby-basic
Connections: 3/20
PG Version: 11.14
Created: 2019-03-09 12:13 UTC
Data Size: 37.73 GB/10.00 GB (Write access revoked; Database deletion imminent)
Tables: 6
Rows: 2649450/10000000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-spherical-39745
这个Plot.delete_all
将删除绘图表中的所有行,但它是否足以释放数据库占用这些记录的磁盘空间?
我尝试过的
heorku restart
无明显差异- 我等了(60分钟(,但由于heroku的后台工作人员通常每5-10分钟更新一次这些统计数据,我认为读数是准确的,膨胀仍然存在
- 我运行了postgress
CLUSTER
命令,但我认为它只对以前集群过的表执行操作,所以它完成得很快,似乎什么都没做,也不影响磁盘空间( - 我尝试了
VACCUM
,但它很快就完成了,似乎没有影响磁盘空间 - 我尝试了
VACCUM FULL
——这花了大约1-2个小时,并且奏效了!请在此处查看结果
我还没有尝试过的东西,但可能会尝试
- 我可以编辑应用程序代码以删除整个模型,然后删除
rake db:migrate
等,这应该会完全删除不必要的表
运行VACUUM FULL
将数据库磁盘大小从36GB减少到16GB。
方法如下
- 将您的应用程序置于维护模式:
heroku maintenance:on
- 重新启动你的应用程序(这可能没有必要,但我还是做了(
heroku restart
- 使用打开postgress控制台
heroku pg:psql
- 运行此操作(注意每个SQL语句末尾的
;
(:
VACUUM FULL;
等待
- 完成后,关闭维护模式
heroku maintenance:off
重要注意事项
这个过程可能需要几个小时(对我来说大约需要1个小时(
此过程将在减小数据库大小之前增加数据库大小!这是因为它创建了数据的副本。36GB的数据库在下降到16GB之前,至少上升到了44GB,可能要高得多(根据一些相关测试,我怀疑大约是原来的两倍(。
进一步阅读此处和此处
- 注意:
FULL
选项不建议用于常规使用,但在特殊情况下可能有用。例如,当您删除或更新了表中的大多数行,并希望表进行物理收缩以占用更少的磁盘空间并允许更快的表扫描时。CCD_ 11通常会比普通CCD_。
可能有用的额外信息
heroku pg:vacuum-stats
可能有用:
heroku pg:vacuum-stats
schema | table | last_vacuum | last_autovacuum | rowcount | dead_rowcount | autovacuum_threshold | expect_autovacuum
--------+----------------------+------------------+------------------+----------------+----------------+----------------------+-------------------
public | listings | 2022-01-27 01:31 | 2022-01-26 06:59 | 2,975,055 | 0 | 595,061 |
public | ar_internal_metadata | 2022-01-27 01:31 | | 1 | 0 | 50 |
public | metrics | 2022-01-27 01:31 | | 17,016 | 0 | 3,453 |
public | plots | 2022-01-27 01:31 | 2022-01-27 00:46 | 0 | 0 | 50 |
public | schema_migrations | 2022-01-27 01:31 | | 7 | 0 | 51 |
public | packages | 2022-01-27 01:31 | | 18,798 | 0 | 3,810 |
(6 rows)
这些非常有用的postgres查询可以用来显示每个表以及它消耗了多少磁盘空间!(强烈建议从这里开始,因为它可以显示数据库中每个表大小的细分(。
VACUUM FULL;
将处理数据库中的所有表。使用VACUUM FULL plots;
只执行绘图表(将"绘图"替换为表名(。它可能会快得多。