SQL Server 2008无备份情况下误操作数据恢复(2)

SQL Server 2008无备份情况下误操作数据恢复。
解决方法:
本文提到的方法——日志尾部备份。
步骤:
(1)、检查数据库的恢复模式,如图:
在这里插入图片描述
在这里插入图片描述
或者使用脚本检查:

SELECT recovery_model,recovery_model_desc
FROM sys.databases
WHERE name ='AdventureWorks'

结果如下:
在这里插入图片描述
确保数据库的恢复模式最起码不能为【简单】。

切记,对于任何重要环境,不仅仅是客户正式环境(俗称生产环境),都强烈建议使用【完整恢复模式】,虽然对于另外两种(大容量日志(BULK_LOGGED)、简单(SIMPLE))来说,完整恢复模式产生的日志会大,但是在出现问题的时候,就会觉得这些都不算什么了。

(2)这里其实隐含另外一步,曾经做过最少一次的完整备份。因为所有类型的备份都基于完整备份,如果没有最少一次完整备份,其他类型的备份都是多余的。在创建完一个新数据库之后,强烈建议甚至强制做一次完整备份。

SELECT  database_name,recovery_model,name 
FROM msdb.dbo.backupset

使用上面的语句粗略可以看到有那些数据库做过备份,由于测试,所以做了几次备份,可以看到我这个时间点已经做了备份了。
在这里插入图片描述
(3)、确保别人不再连接数据库,然后做一次日志尾部备份:
首先先创建一点数据:

/*
这里使用微软的示例数据库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命令,让它在某个时间发生,这样恢复的时候就有准确性:

USE AdventureWorks
GO
WAITFOR TIME '21:45'
DELETE FROM dbo.testRestore

现在来看看数据:

USE AdventureWorks
GO
SELECT * FROM dbo.testRestore

在这里插入图片描述
到这一步,灾难出现了。但是切记要冷静。
下面就是本文的重点开始,做一次日志备份,最重要是选择【备份日志尾部】
在这里插入图片描述
然后在【选项】页选择:除【事务日志】除,其他红框包裹的地方为强烈建议勾选的地方。并且保证数据库不要有别人在连接,因为备份日志尾部会使数据库处于还原状态,拒绝其他会话的连接,如果不断开其他连接,是备份不了的。
在这里插入图片描述
然后按确定,当然,可以使用上方的【脚本】来生成语句:

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杀掉:

SELECT  * FROM sys.sysprocesses WHERE dbid=DB_ID('AdventureWorks')

执行结果:
在这里插入图片描述
然后kill掉。
接着继续备份。
然后进行还原,如图:
先要还原完整备份,选择最近的那次,由于日志备份的特性(以后其他文章再说),只认最后一次备份,所以要选择最新的那次,否则还原不了。
在这里插入图片描述
这里又有一个注意事项,记得选择:
在这里插入图片描述
接着还原日志文件,这是最最重要的一步:
在这里插入图片描述
然后:
在这里插入图片描述
由于实验的时候出了点问题,后面重做了,所以时间选择到22:19分,是在22:20分删除数据的。这里不用太在意,只要把时间点指定到你误删除的时间之前即可。而由于日志尾部备份都是最后一个备份文件,所以这里选则红框部分即可:
在这里插入图片描述
现在再检查一下:
在这里插入图片描述
可以看到,数据已经还原成功。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值