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


转载于:https://blog.51cto.com/812792011/1117966