还原后的 SQL Server 2012 标识列

Posted

技术标签:

【中文标题】还原后的 SQL Server 2012 标识列【英文标题】:SQL Server 2012 Identity column after a restore 【发布时间】: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 年的! 【参考方案1】:

是的,这是正常行为。

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

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

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

【讨论】:

谢谢马克!这很好地解释了正在发生的事情:)

以上是关于还原后的 SQL Server 2012 标识列的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2012的备份怎么还原到sql server 2008

在 SQL Server 2012 上还原 SQL Server 2000 备份

sql server 2012无法还原数据库,具体错误如下

如何设置将SQL SERVER2012数据库备份还原到SQL SERVER2008上

sql server 2008 怎么还原数据库

尝试将 SQL Server 2012 Express 还原到 2014