还原后的 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 备份