如何恢复数据库

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

在本机操作,Debug的时候,一切似乎都在掌控之中。可是提交到服务器之后,一切显地都无比陌生。因为不熟悉SQL,准确来说就只会点Select,Update,Delete,Insert而已。昨天不小心误删了一张数据不多但是不在人工处理范围内的一张表内的数据。

因为知道SQL Server是有日志这种东西的,事后我表现地无比淡定,在事发一个小时以内。一个小时之后,我发现我无法掌控这一事件了。

上网查找了恢复数据的办法。有必要啰嗦一下。

 

问题1:

无论是远程端还是服务器端,都无法对数据库(假设数据库叫Test)进行除‘增删查改’的其它操作,譬如分离,脱机,还原...错误提示是

e.g.1 “无法分离 Test 数据库 因为它当前正在使用。”

e.g.2 “因为数据库正在使用,未获得对数据的排他访问权,操作异常终止”

反正嘛,就是说你丫不能阻止别人的访问。可我们就是要这样做的...只好跟它说拜拜了。

 

说拜拜的方法就是关掉所有访问数据库Test的进程。

createproc  killspid (@dbnamevarchar(20))
   as
   begin
   declare@sqlnvarchar(500)
   declare@spidint
   set@sql='declare  getspid  cursor  for  select  spid  from  sysprocesses  where  dbid=db_id('''+@dbname+''')'
   exec(@sql)
   open  getspid
   fetchnextfrom  getspid  into@spid
   while@@fetch_status<>-1
   begin
   exec('kill  '+@spid)
   fetchnextfrom  getspid  into@spid
   end
   close  getspid
   deallocate  getspid
   end      
   
   --用法      
   use  master      
   exec  killspid  '数据库名'

PS:

代码我是这样理解的,定义一段杀死访问数据库进程的存储过程。写一段获取进程ID的代码,循环杀死每一个进程。最后调用存储过程。

虽然不了解存储过程,但是意思就是这样的吧。

问题2:

没有备份数据库,那该如何恢复数据呢

有个软件叫做Log Explorer 这个东西可以根据数据库的日志回到过去的任何一个时刻。

View Code

Log Explorer for SQL Server 是个好东西,但是这根本无法解决我的问题。数据库在服务器端,学校根本不会让我安装一个软件在服务器上面。而且我证实过,这个软件必须要在服务器端装服务器端软件的。所以,这个对于我来说,是泡汤的。但是不代表这不是一个利器。

 

最后我用了一个很蛋疼的方法解决了。

1.分离数据库,备份一个Test;

2.将数据库附加回去,用自带的恢复方式恢复到一个很久以前的状态;

3.将需要的那张表复制到备份的那个数据库;

4.将备份的那个数据库挂回去,原数据库删了。

 

这是一个很蛋疼而且碰巧那张表没被改的方法。

头一次知道DBA的重要性。

我的方法是一个很偶然的东西,希望大家分享一下真正能解决恢复问题的办法。当然,每隔一段时间备份是绝对没有错的。

 

方法

  另外发现一个比较有技术性的可行的方法

  1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进进行一次日志备份

  (如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了)

   backup log dbName to disk='fileName'

----注意:是日志备份!

 2,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢复
   
restore database dbName from disk='fileName' with norecovery


  3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻
   
restore log dbName from disk='fileName'
    with stopat='date_time'

 

完整代码

View Code

  经过验证,这才叫有技术性!我那纯属“邓艾的屯‘田’”小孩子过家家。。。

 

参考的资料:

http://blog.163.com/liushui19860112@126/blog/static/132373046201052841232492/

http://blog.csdn.net/voyage_mh1987/article/details/4133798

http://kenwu.blog.hexun.com/32603385_d.html


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8月前
|
数据库
数据库视频(一)
数据库视频(一)
53 0
|
2月前
|
存储 数据管理 数据库
数据库三部分
数据库:用于存储数据的地方 数据库管理系统(DataBase Management System,DBMS):用于管理数据库的软件。是用户创建,管理和维护数据库时所使用的软件,位于用户和操作系统之间,对数据库进行统一管理。DBMS能定义数据存储结构,提供数据的操作机制,维护数据库的安全性,完整性和可靠性。 数据库应用程序:为了提高数据库系统的处理能力所使用的的管理数据库的软件补充。大多情况下,DBMS无法满足对数据管理的要求。数据库应用程序的使用可以满足对数据管理的更高要求,还可以使数据管理过程更加直观和友好。数据库应用程序负责与DBMS进行通信,访问和管理DBMS中存
|
3月前
|
存储 SQL NoSQL
什么是数据库
【10月更文挑战第8天】
37 1
ly~
|
3月前
|
存储 安全 搜索推荐
数据库的应用
数据库在众多领域中发挥着关键作用。在企业管理与运营方面,它支持客户关系管理和企业资源规划,帮助企业了解客户需求、优化资源配置;在金融领域,银行系统和证券交易依赖数据库保障安全性和准确性,进行风险评估;在医疗保健行业,电子病历管理和医疗资源管理通过数据库提高诊断准确性和资源利用率;在教育领域,学生信息管理和在线教育平台利用数据库优化教学管理,提供个性化学习体验;在电子商务中,商品管理和订单管理则确保了信息的准确性和高效处理。
ly~
70 1
|
8月前
|
存储 数据库 数据安全/隐私保护
数据库特点
数据库特点
99 9
|
8月前
|
关系型数据库 MySQL 数据库
数据库(三)
数据完整性是数据库管理中的关键概念,确保数据的准确和一致。主要包括: 1. 实体完整性:通过主键(唯一且非空)来标识表中的每条记录,如创建`test2`表时设置`n1`为主键。 2. 创建表`test3`时,`n1`和`n2`组合成为主键,确保多字段的唯一性。 3. 唯一约束:用于保证列值的唯一性,如在`test1`中添加对`n2`的唯一约束,或创建`test4`时`n1`和`n2`的组合值唯一。 4. 引用完整性:通过外键约束实现,如`emp`表的`dept_id`引用`dept`表的`id`,确保数据间的关联合法性。外键可以有级联操作,如`on delete cascade`和`o
34 0
|
8月前
|
存储 数据挖掘 数据库
数据库是什么?为什么要使用它么?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。它通常与数据库管理系统(DBMS)一起使用,用于创建、查询、更新和管理数据库中的数据。
312 0
|
存储 SQL 安全
一、如何快速掌握数据库
一、如何快速掌握数据库
128 0
|
SQL 数据库
数据库知识与技巧日常汇总
数据库知识与技巧日常汇总
110 0
|
数据库
选择数据库
选择数据库
55 0