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