【问题标题】:Gap in auto-increment IDs on Heroku PostgresHeroku Postgres 上自动增量 ID 的差距
【发布时间】:2016-06-05 09:55:57
【问题描述】:

我有一个在 Heroku 上运行的 Ruby Web 应用程序和 Postgres 数据库。我注意到在 Postgres 数据库由 Heroku“维护”期间,自动递增的 ID 之间存在差距。

间隙是一次性的,然后 ID 再次增加 1。像这样:

ID   |                 Created at |
2959 | 2016-02-14 21:07:05.149797 |
2960 | 2016-02-14 21:15:05.03284  |
2961 | 2016-02-14 22:59:19.634962 |
2994 | 2016-02-15 09:25:30.969881 |
2995 | 2016-02-15 09:44:38.49678  |
2996 | 2016-02-15 09:51:00.282624 |

Heroku 的维护发生在正在创建的两条记录(29612994)之间,位于 2016-02-15 04:00:00

我看到了一个解释,即失败的事务将导致在下一次成功提交时跳过一个 ID,但我在应用程序日志中看不到任何内容表明当时正在创建任何记录。

【问题讨论】:

  • 一个失败的事务可以做到这一点,但其他一些无害的事情也可以做到。您是否担心数据已丢失,或者只是想知道为什么会出现空白?
  • @David 我认为没有任何数据丢失(由于当时很少/没有流量),但只是想知道是什么导致了这种行为
  • 不确定这是否有帮助,但我自己刚刚遇到了这个问题,在研究中,发现了另一个类似的SO question。有趣的是,我们似乎都在使用 Heroku 和 PostgreSQL AND,我们各自的间隔计数是 正好 33。我从171204。不幸的是,除此之外我没有任何答案。

标签: ruby-on-rails ruby postgresql heroku


【解决方案1】:

请参阅 heroku here 的回答以及更多关于为什么会发生这种情况 here

【讨论】:

    【解决方案2】:

    如果您的问题是在此期间是否丢失了记录,则需要进行代码和日志审核才能确定 1. 这可能如何发生以及 2. 它是否确实发生了。

    如果您的问题是为什么会发生这种情况,或者是否应该发生这种情况……这取决于 PostgreSQL 和 Heroku 的实施。

    【讨论】:

    • 是的,这似乎是 Heroku 在维护完成后如何从“追随者”数据库转换回原始数据库的一些实现细节。或者可能与 Postgres 本身有关。无论哪种方式,Heroku 支持都向我保证这不是问题(和预期的行为),所以我只是好奇为什么它没有在序列中找到它离开的位置..
    • 这当然很烦人,但它也是一个很好的提醒,“自动增量”ID 不是专门用于自动增量,而是作为上下文中唯一的标识符,不'不需要用户的干预来生成。作为一个可能有用的相关附注,对于需要更可靠唯一性的项目,PostgreSQL 的 contrib 包提供 uuid-ossp,除其他外,它允许您指定 UUID 生成作为字段的默认值,包括主键。跨度>
    猜你喜欢
    • 2011-04-10
    • 2015-08-03
    • 2021-03-27
    • 2012-06-20
    • 2012-12-14
    • 2021-08-25
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多