分类

链接

2016 年 8 月
1234567
891011121314
15161718192021
22232425262728
293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > SQL Server > 正文
共享办公室出租
如何恢复误删数据(二)
SQL Server 暂无评论 阅读(1,303)
[sql] view plain copy

print?

  1. --误删表数据,如何恢复过来
  2. /*
  3.     真实案例:在执行语句的时候错误的把系统中的一个表的数据全部删除
  4.     在删除之前,我做过一次完整的数据库备份,再删除之后,我第一时
  5.     间做了尾日志备份
  6.     也就是说  我手上现在有一份最新的完整备份  和删除数据之后的尾
  7.     日志备份
  8. */
[sql] view plain copy

print?

  1. /*
[sql] view plain copy

print?

  1. 版本信息:
[sql] view plain copy

print?

  1. Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
  2. Jul  9 2008 14:43:34   Copyright (c) 1988-2008
  3. Microsoft Corporation  Developer Edition on Windows NT 6.1 <X86>
  4. (Build 7601: Service Pack 1)
[sql] view plain copy

print?

  1. */
  2. -->>TravyLee生成测试数据:
  3. USE MASTER
  4. GO
  5. IF OBJECT_ID('TestDb'IS NOT NULL
  6. DROP DATABASE TestDb
  7. GO
  8. CREATE DATABASE TestDb;
  9. GO
  10. --设置数据库为完整恢复模式
  11. ALTER DATABASE TestDb SET RECOVERY FULL WITH NO_WAIT
  12. GO
  13. --查看系统表中TestDb数据库的恢复级别
  14. SELECT
  15.     recovery_model,
  16.     recovery_model_desc
  17. FROM
  18.     sys.databases
  19. WHERE
  20.     name ='TestDb'
  21. /*
  22. recovery_model  recovery_model_desc
  23. -------------------------------------------
  24. 1   FULL
  25. */
  26. --接下来使用TestDb数据库来测试
  27. USE TestDb
  28. GO
  29. IF OBJECT_ID('StuInfo'IS NOT NULL
  30. DROP TABLE StuInfo
  31. CREATE TABLE StuInfo
  32. (
  33.     Id int identity(1,1),
  34.     StuId varchar(25),
  35.     StuName nvarchar(25),
  36.     StuSex varchar(25),
  37.     Others nvarchar(255)
  38. )
  39. GO
  40. insert StuInfo(StuId,StuName,StuSex,Others)
  41. select '200911076','test01','男','2009年入学,目前在四川成都实习' union all
  42. select '200911077','test02','男','2009年入学,目前在上海实习' union all
  43. select '200911078','test03','女','2009年入学,留校考研' union all
  44. select '200911079','test04','男','2009年入学,目前在四川成都实习' union all
  45. select '200911080','test05','女','2009年入学,留校考研' union all
  46. select '200911081','test06','男','2009年入学,目前在广东深圳实习'
  47. GO
  48. --现在我对数据库做一次完整的备份:
  49. BACKUP DATABASE [TestDb]
  50. TO  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH NOFORMAT, NOINIT,
  51. NAME = N'TestDb-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
  52. GO
  53. --现在我查看表里的数据   都存在
  54. SELECT * FROM StuInfo
  55. /*
  56. Id  StuId   StuName StuSex  Others
  57. ---------------------------------------------------------------------------------
  58. 1   200911076   test01  男   2009年入学,目前在四川成都实习
  59. 2   200911077   test02  男   2009年入学,目前在上海实习
  60. 3   200911078   test03  女   2009年入学,留校考研
  61. 4   200911079   test04  男   2009年入学,目前在四川成都实习
  62. 5   200911080   test05  女   2009年入学,留校考研
  63. 6   200911081   test06  男   2009年入学,目前在广东深圳实习
  64. */
  65. --现在我来对数据进行一些插入操作:
  66. insert StuInfo(StuId,StuName,StuSex,Others)
  67. select '200911082','test07','男','2009年入学,目前在四川成都实习' union all
  68. select '200911083','test08','女','2009年入学,目前在上海实习'
  69. select getdate()--2013-01-11 09:10:07.500
  70. --此时表StuInfo里面有8条数据  我原本想删除掉id为3,5的数据 但我错误的把表里的数据
  71. --全部删除了
  72. --错误的执行了以下命令
  73. delete from StuInfo
  74. select getdate()--2013-01-11 09:11:15.207
  75. --再次查看数据:
  76. select * from StuInfo
  77. --无结果:
  78. /*
  79. 此时我发现自己犯的这个错误,为了弥补,
  80. 我需要把数据恢复到刚刚插入数据之后的
  81. 这个时间点,于是我做了一下操作
  82. */
  83. --这时由于我误删数据,我需要将数据恢复到我插入数据之前的状态
  84. --也就是2013-01-11 09:11:15.207这个时间点之前
  85. --在误删数据之前,我做过一次完整的数据库备份
  86. --这个时候我首先要冷静下来,对事务日志进行一次备份:
  87. USE [master]
  88. BACKUP LOG [TestDb]
  89. TO  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  NO_TRUNCATE , NOFORMAT, NOINIT,
  90. NAME = N'TestDb-事务日志  备份', SKIP, NOREWIND, NOUNLOAD,  NORECOVERY ,
  91. STATS = 10, CHECKSUM
  92. GO
  93. declare @backupSetId as int
  94. select @backupSetId = position
  95. from msdb..backupset
  96. where database_name=N'TestDb'
  97. and backup_set_id=(select max(backup_set_id)
  98. from msdb..backupset where database_name=N'TestDb' )
  99. if @backupSetId is null
  100. begin
  101. raiserror(N'验证失败。找不到数据库“TestDb”的备份信息。', 16, 1)
  102. end
  103. RESTORE VERIFYONLY FROM  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND
  104. GO
  105. --现在我们来还原数据库,由于我错误的删除了数据   
  106. --首先我根据完整备份进行一次还原,也就是说把数据库还原到
  107. RESTORE DATABASE [TestDb]
  108. FROM  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  FILE = 1,
  109. NORECOVERY,  NOUNLOAD,  STATS = 10
  110. GO
  111. --接下来根据日志备份来恢复数据库:
  112. RESTORE LOG [TestDb] FROM  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  FILE = 2,  NOUNLOAD,
  113. STATS = 10,  STOPAT = N'2013-01-11T09:10:08'--这个时间是我在误删数据之前的时间
  114. GO
  115. --接下来我们来验证数据是否恢复:
  116. use [TestDb]
  117. go
  118. select * from StuInfo
  119. /*
  120. Id  StuId   StuName StuSex  Others
  121. ----------------------------------------------------------------
  122. 1   200911076   test01  男   2009年入学,目前在四川成都实习
  123. 2   200911077   test02  男   2009年入学,目前在上海实习
  124. 3   200911078   test03  女   2009年入学,留校考研
  125. 4   200911079   test04  男   2009年入学,目前在四川成都实习
  126. 5   200911080   test05  女   2009年入学,留校考研
  127. 6   200911081   test06  男   2009年入学,目前在广东深圳实习
  128. 7   200911082   test07  男   2009年入学,目前在四川成都实习
  129. 8   200911083   test08  女   2009年入学,目前在上海实习
  130. */
  131. 总结:
  132. 为了能够在错误操作或者灾难发生后使数据尽快恢复,数据库就必须要满足一下前提:
  133. 1,数据库的恢复模式必须是完整恢复模式
  134. 2,灾难发生前或者错误删除数据之前必须做过一个完整数据库备份
  135. 3,在上次数据库完整备份之后,如果做过任何日志备份,这些备份现在都能找到
  136. 满足这些要求后,数据库就可以恢复到任何一个时间点了。
  137. 恢复的具体步骤:
  138. 1,灾难发生后备份活动事务日志(也称尾日志)
  139. 2,还原最新完整数据库备份,而不做事务恢复(WITH NORECOVERY)
  140. 3,如果存在差异备份    则还原差异备份,而不做事务恢复(WITH NORECOVERY)
  141. 4,从备份后创建的第一个事务日志开始,使用NORECOVERY一次还原事务日志
  142. 5,恢复数据库到某个时间点(WITH  STOPAT = N'某个时间点'

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:如何恢复误删数据(二) | Bruce's Blog

发表评论

留言无头像?