【问题标题】:SQL Server 2012 Identity column after a restore还原后的 SQL Server 2012 标识列
【发布时间】:2014-09-23 05:31:28
【问题描述】:

我只是在我的 SQL Server 2012 上做一些测试来练习备份和恢复。

我创建了一个包含几列的简单表,其中一个是 ID (int),标记为 identity 列。

我添加了 3 条记录,ID 自动设置为 1 然后 2 然后 3... ok

我备份了数据库,然后进行了完全恢复。

还原后我尝试添加新记录,但奇怪的是,新 ID 是 1003(而不是 4),再次添加新记录 ID 是 1004(好吧,它又比前一个增加了)。

所以我再次尝试备份数据库,然后恢复它。

尝试添加新记录并猜测...新 ID 是 2004(而不是 1005),然后是 2005、2006 等之后的记录。

似乎每次还原后,身份列都被搞砸了。

这是正常行为吗?

【问题讨论】:

  • 您确定您正在与 2008 服务器通话吗?因为这是 2012 年的众所周知的行为。此外,如果您关心分配的数字,您可能会错误地使用它们。您应该将标识值视为发生以适合数字列的不透明 blob。
  • 是的,这是正常行为。 IDENTITY 将保留一定的值块并缓存这些值 - 如果您的服务器出现故障,或者您进行备份/恢复,则该保留块中的剩余值将丢失并且不会回来。这不是问题! IDENTITY 系统只是确保它为您提供正确的升序值 - 它从不保证“没有间隙” - 并且间隙不是问题,真的!
  • @Rahul - 我没有说 bug,我说的是 behaviour。尝试搜索SQL Server 2012 identity jump,您应该会找到大量参考资料。
  • @Damien_The_Unbeliever,啊!!误读了你的评论。删除了我的。
  • 对不起,你是对的,这是 2012 年的!

标签: sql-server-2012


【解决方案1】:

是的,这是正常行为。

IDENTITY 将保留一定大小的值块并缓存这些值。如果您的服务器出现故障,或者您进行了备份/恢复,则该保留块中尚未使用的缓存值将丢失并且不会回来。

不是问题! IDENTITY 系统只是确保它为您提供正确的升序值 - 它从不保证“没有间隙” - 并且间隙不是问题,真的!

请参阅 Aaron Bertrand 的博文 Bad Habits To Kick: Making Assumptions about IDENTITY,了解更多关于 IDENTITY 以及 IDENTITY 的除外(以及期望)的内容

【讨论】:

  • 谢谢马克!这很好地解释了正在发生的事情:)
猜你喜欢
  • 2014-12-11
  • 2013-03-25
  • 2014-01-23
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多