加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

误删表数据,如何恢复过来

发布时间:2020-12-12 14:12:03 所属栏目:MsSql教程 来源:网络整理
导读:? /*? ????真实案例:在执行语句的时候错误的把系统中的一个表的数据全部删除? ????在删除之前,我做过一次完整的数据库备份,再删除之后,我第一时? ????间做了尾日志备份? ????也就是说??我手上现在有一份最新的完整备份??和删除数据之后的尾? ????日志备份

?

 
 
  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. (?
  42. ????Id?int?identity(1,1),?
  43. ????StuId?varchar(25),?
  44. ????StuName?nvarchar(25),?
  45. ????StuSex?varchar(25),?
  46. ????Others?nvarchar(255)?
  47. )?
  48. GO?
  49. insert?StuInfo(StuId,StuName,StuSex,Others)?
  50. select?'200911076','test01','男','2009年入学,目前在四川成都实习'?union?all?
  51. select?'200911077','test02',目前在上海实习'?union?all?
  52. select?'200911078','test03','女',留校考研'?union?all?
  53. select?'200911079','test04',目前在四川成都实习'?union?all?
  54. select?'200911080','test05',留校考研'?union?all?
  55. select?'200911081','test06',目前在广东深圳实习'?
  56. GO?
  57. ?
  58. --现在我对数据库做一次完整的备份:?
  59. BACKUP?DATABASE?[TestDb]??
  60. TO??DISK?=?N'E:MSSQL2008MSSQL10.MSSQLSERVERMSSQLBackupTestDb.bak'?WITH?NOFORMAT,?NOINIT,???
  61. NAME?=?N'TestDb-完整?数据库?备份',?SKIP,?NOREWIND,?NOUNLOAD,??STATS?=?10?
  62. GO?
  63. ?
  64. ?
  65. --现在我查看表里的数据???都存在?
  66. SELECT?*?FROM?StuInfo?
  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?StuInfo(StuId,Others)?
  80. select?'200911082','test07',目前在四川成都实习'?union?all?
  81. select?'200911083','test08',目前在上海实习'?
  82. select?getdate()--2013-01-11?09:10:07.500?
  83. ?
  84. ?
  85. --此时表StuInfo里面有8条数据??我原本想删除掉id为3,5的数据?但我错误的把表里的数据?
  86. --全部删除了?
  87. --错误的执行了以下命令?
  88. delete?from?StuInfo?
  89. select?getdate()--2013-01-11?09:11:15.207?
  90. ?
  91. --再次查看数据:?
  92. select?*?from?StuInfo?
  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:MSSQL2008MSSQL10.MSSQLSERVERMSSQLBackupTestDb.bak'?WITH??NO_TRUNCATE?,?NOFORMAT,???
  109. NAME?=?N'TestDb-事务日志??备份',??NORECOVERY?,???
  110. STATS?=?10,?CHECKSUM?
  111. GO?
  112. declare?@backupSetId?as?int?
  113. select?@backupSetId?=?position??
  114. from?msdb..backupset??
  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:MSSQL2008MSSQL10.MSSQLSERVERMSSQLBackupTestDb.bak'?WITH??FILE?=?@backupSetId,??NOUNLOAD,??NOREWIND?
  123. GO?
  124. ?
  125. ?
  126. ?
  127. --现在我们来还原数据库,由于我错误的删除了数据????
  128. ?
  129. ?
  130. --首先我根据完整备份进行一次还原,也就是说把数据库还原到?
  131. RESTORE?DATABASE?[TestDb]??
  132. FROM??DISK?=?N'E:MSSQL2008MSSQL10.MSSQLSERVERMSSQLBackupTestDb.bak'?WITH??FILE?=?1,???
  133. NORECOVERY,??STATS?=?10?
  134. GO?
  135. ?
  136. --接下来根据日志备份来恢复数据库:?
  137. ?
  138. RESTORE?LOG?[TestDb]?FROM??DISK?=?N'E:MSSQL2008MSSQL10.MSSQLSERVERMSSQLBackupTestDb.bak'?WITH??FILE?=?2,???
  139. STATS?=?10,??STOPAT?=?N'2013-01-11T09:10:08'--这个时间是我在误删数据之前的时间?
  140. GO?
  141. ?
  142. --接下来我们来验证数据是否恢复:?
  143. use?[TestDb]?
  144. go?
  145. select?*?from?StuInfo?
  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?NORECOVERY)?
  173. 3,如果存在差异备份????则还原差异备份,而不做事务恢复(WITH?NORECOVERY)?
  174. 4,从备份后创建的第一个事务日志开始,使用NORECOVERY一次还原事务日志?
  175. 5,恢复数据库到某个时间点(WITH??STOPAT?=?N'某个时间点')?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读