当前位置:Gxlcms >
数据库问题 >
sql service ---- update和delete 误操作数据 ---- 恢复数据
sql service ---- update和delete 误操作数据 ---- 恢复数据
时间:2021-07-01 10:21:17
帮助过:40人阅读
- SELECT recovery_model,recovery_model_desc
- FROM sys.databases
- WHERE name =‘AdventureWorks‘
结果如下:
确保数据库的恢复模式最起码不能为【简单】。至于如何修改成完整模式,我觉得这些应该没必要多说了。
切记,对于任何重要环境,不仅仅是客户正式环境(俗称生产环境),都强烈建议使用【完整恢复模式】,虽然对于另外两种(大容量日志(BULK_LOGGED)、简单(SIMPLE))来说,完整恢复模式产生的日志会大,但是在出现问题的时候,就会觉得这些都不算什么了。并且我也想不到任何理由对于正式环境不使用完整恢复模式。只要管理得当,完整恢复模式的日志也不会太变态。
(2)、这里其实隐含另外一步,曾经做过最少一次的完整备份。因为所有类型的备份都基于完整备份,如果没有最少一次完整备份,其他类型的备份都是多余的,所以在这里强调一下,在创建完一个新数据库之后,强烈建议甚至强制做一次完整备份。
[sql] view plain copy print?
- SELECT database_name,recovery_model,name
- FROM msdb.dbo.backupset
使用上面的语句粗略可以看到有那些数据库做过备份,由于测试,所以做了几次备份,可以看到我这个时间点已经做了备份了。
(3)、确保别人不再连接数据库,然后做一次日志尾部备份:
首先先创建一点数据:
[sql] view plain copy print?
- /*
- 由于tempdb永远为简单恢复模式,所以不适合做案例。
- 这里使用微软的示例数据库AdventureWorks
- */
- USE AdventureWorks
- GO
- IF OBJECT_ID(‘testRestore‘) IS NOT NULL
- DROP TABLE testRestore
- GO
- CREATE TABLE testRestore
- (
- id INT IDENTITY(1, 1) ,
- NAME VARCHAR(50)
- );
- INSERT INTO testRestore(Name)
- SELECT ‘test1‘
- UNION ALL
- SELECT ‘test2‘
- UNION ALL
- SELECT ‘test3‘
- UNION ALL
- SELECT ‘test4‘
- UNION ALL
- SELECT ‘test5‘
- UNION ALL
- SELECT ‘test6‘
- UNION ALL
- SELECT ‘test7‘
- UNION ALL
- SELECT ‘test8‘
- SELECT * FROM testRestore
检查一下结果:
然后来做个删除操作,为了定位是啥时候发生的,我加了一个waitfor命令,让它在某个时间发生,这样恢复的时候就有准确性:
[sql] view plain copy print?
- USE AdventureWorks
- GO
- WAITFOR TIME ‘21:45‘
- DELETE FROM dbo.testRestore
现在来看看数据:
[sql] view plain copy print?
- USE AdventureWorks
- GO
- SELECT * FROM dbo.testRestore
到这一步,灾难出现了。但是切记要冷静。
下面就是本文的重点开始,做一次日志备份,最重要是选择【备份日志尾部】
然后在【选项】页选择:除【事务日志】除,其他红框包裹的地方为强烈建议勾选的地方。并且保证数据库不要有别人在连接,因为备份日志尾部会使数据库处于还原状态,拒绝其他会话的连接,如果不断开其他连接,是备份不了的。
然后按确定,当然,可以使用上方的【脚本】来生成语句:
[sql] view plain copy print?
- USE Master
- GO
- BACKUP LOG [AdventureWorks] TO DISK = N‘E:\AdventureWorks.bak‘ WITH NO_TRUNCATE , NOFORMAT, NOINIT, NAME = N‘AdventureWorks-事务日志 备份‘, SKIP, NOREWIND, NOUNLOAD, NORECOVERY , COMPRESSION, STATS = 10, CHECKSUM
- GO
- declare @backupSetId as int
- select @backupSetId = position from msdb..backupset where database_name=N‘AdventureWorks‘ and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N‘AdventureWorks‘ )
- if @backupSetId is null begin raiserror(N‘验证失败。找不到数据库“AdventureWorks”的备份信息。‘, 16, 1) end
- RESTORE VERIFYONLY FROM DISK = N‘E:\AdventureWorks.bak‘ WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
- GO
此时,数据库会处于【正在还原】的状态
如果发现备份不了可以用下面语句查看,并把spid杀掉:
[sql] view plain copy print?
- SELECT * FROM sys.sysprocesses WHERE dbid=DB_ID(‘AdventureWorks‘)
执行结果:
然后kill掉。
接着继续备份。
然后进行还原,如图:
先要还原完整备份,选择最近的那次,由于日志备份的特性(以后其他文章再说),只认最后一次备份,所以要选择最新的那次,否则还原不了。
这里又有一个注意事项,记得选择:
接着还原日志文件,这是最最重要的一步:
然后:
由于实验的时候出了点问题,后面重做了,所以时间选择到22:19分,我是在22:20分删除数据的。这里不用太在意,只要把时间点指定到你误删除的时间之前即可。而由于日志尾部备份都是最后一个备份文件,所以这里选则红框部分即可:
现在再检查一下:
可以看到,数据已经还原成功。
sql service ---- update和delete 误操作数据 ---- 恢复数据
标签:key load set 这一 连接数 erro 点数据 mysq 验证