【问题标题】:Steps to free up storage space in postgres database after deleting rows?删除行后释放postgres数据库中存储空间的步骤?
【发布时间】:2023-03-30 10:30:01
【问题描述】:

我已经超过了 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 将删除 plots 表中的所有行,但是否足以释放 db 占用这些记录的磁盘空间?

我尝试过的

我还没有尝试过,但可以尝试

  • 我可能会编辑应用程序代码以删除整个模型,然后是 rake db:migrate 等,这应该会完全删除不必要的表格。

【问题讨论】:

    标签: ruby-on-rails heroku


    【解决方案1】:

    运行 VACUUM FULL 将数据库磁盘大小从 36GB 减少到 16GB。

    方法如下

    1. 将您的应用放入maintenance mode
    heroku maintenance:on
    
    1. 重新启动您的应用程序(这可能没有必要,但我还是这样做了)
    heroku restart
    
    1. 使用
    2. 打开 postgress 控制台
    heroku pg:psql
    
    1. 运行这个(注意每个 SQL 语句末尾的 ;):
    VACUUM FULL;
    

    ...等等...

    1. 完成后,关闭维护模式
    heroku maintenance:off
    

    重要提示

    • 这个过程可能需要几个小时(我花了大约 1 小时)

    • 此过程将增加数据库的大小,然后再减小!那是因为它创建了数据的副本。 36GB db 至少上升到 44GB,可能要高得多(根据一些相关测试,我怀疑大约是原始大小的两倍),然后才下降到 16GB。

    • 延伸阅读herehere

      • 注意:

      FULL 选项不推荐用于日常使用,但在特殊情况下可能有用。例如,当您删除或更新了表中的大部分行并希望表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描时。 VACUUM FULL 通常会比普通的VACUUM 缩小表格。

    可能有用的额外信息

    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)
    
    • These 非常有用的 postgres 查询可用于显示每个表及其消耗的磁盘空间! (强烈建议从这里开始,它可以显示数据库中每个表大小的细分)。

    • VACUUM FULL; 将处理数据库中的所有表。使用VACUUM FULL plots; 只做绘图表(用你的表名替换'plots')。它可能会快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多