若相依 发表于 2015-1-16 22:26:12

MSSQL教程之当SQL Server数据库溃散时怎样恢复?

先说DDL的分类。有一类DDL,是不需要重建表的,比如加非聚簇索引。这类操作其实不会丢数据,也是在原表上直接操作,对于我们“以恢复数据为目的”的闪回,是可以先忽略的。另外一类,则是会影响到表数据的操作。server|恢复|数据|数据库事情告一段落,明天下战书有空,写篇文章,大概会对人人有匡助:)
任何数据库体系都没法制止溃散的情况,即便你利用了Clustered,双机热备……仍旧没法完整肃除体系中的单点妨碍,况且关于年夜部分用户来讲,没法接受如许高贵的硬件投资。以是,在体系溃散的时分,怎样恢回复有的可贵数据就成为一个极为主要的成绩了。
在恢复的时分,最幻想的情形就是你的数据文件和日记文件都无缺无损了,如许只必要sp_attach_db,把数据文件附加到新的数据库上便可,大概在停机的时分把一切数据文件(必定要有master等)都copy到原有路径下也行,不外一样平常不保举如许的做法,sp_attach_db对照好,固然贫苦很多。
可是呢,一样平常数据库溃散的时分体系是一定能偶然间把未完成的事件和脏页等写进磁盘的,如许的情形sp_attach_db就会失利。那末,寄希冀于DBA制订了一个优秀的劫难恢复企图吧。依照你的恢复企图,复原最新的完整备份,增量备份大概事件日记备份,然后假如你的举动事件日记还能读得出来的话,祝贺你!你能够复原到溃散前的形态。
一样平常的单元都是没有专职的DBA的,假如没有可用的备份,更多是比来一次备份的工夫过于长远而招致不成承受的数据丧失,并且你的举动事件日记也处于不成用的形态,那就是最贫苦的情形了。
不幸的很的是,一样平常数据库溃散都是因为存储子体系引发的,而如许的情形是几近不成能有可用的日记用于恢复的。
那末就只好试一下这些计划了。固然,是请求最少你的数据文件是存在的,如果数据文件、日记文件和备份都没有了的话,别找我,你能够到楼顶上往唱“神啊,救救我吧”。
起首,你能够试一下sp_attach_single_file_db,试着恢复一下你的数据文件,固然能恢复的大概性不年夜,不外假设这个数据库恰好实行了一个checkpoint的话,仍是有大概乐成的。
假如你没有好到有摸彩票的手气,最主要的数据库没有像你期盼的那样attach上往,不要泄气,仍是有其余计划的。
我们能够试侧重新创建一个log,先把数据库设置为emergencymode,sysdatabases的status为32768就暗示数据库处于此形态。
不外体系表是不克不及任意改的,设置一下先
UseMaster
Go
sp_configureallowupdates,1
reconfigurewithoverride
Go
然后
updatesysdatabasessetstatus=32768wherename=<db_name>
如今,乞求满天神佛的保佑吧,从头创建一个log文件。乐成的时机仍是相称年夜的,体系一样平常城市承认你新创建的日记。假如没有呈报甚么毛病,如今就能够松一口吻了。
固然数据是恢复了,但是别觉得事变就算完成了,正在举行的事件一定是丧失了,本来的数据也大概遭到一些破坏。
先把SQLServer从头启动一下,然后反省你的数据库吧。
先设置成单用户形式,然后做dbcc
sp_dboption<db_name>,singleuser,true
DBCCCHECKDB(<db_name>)
假如没有甚么年夜成绩就能够把数据库形态改归去了,记得别忘了把体系表的修正选项关失落。
updatesysdatabasessetstatus=28wherename=<db_name>--固然你的数据库形态大概不是这个,本人改成符合的值吧。也能够用sp_resetstatus
go
sp_configureallowupdates,0
reconfigurewithoverride
Go
checkdb的时分大概呈报有一些毛病,这些毛病的数据你大概就只好抛弃了。
checkdb有几种修复选项,本人看着用吧,不外最初你大概仍是得用REPAIR_ALLOW_DATA_LOSS,完成一切修复。
chekcdb其实不能完成一切的修复,我们必要更进一步的修复,用DBCCCHECKTABLE对每个表做反省吧。
表的列表能够用sysobjects内里失掉,把OBJECTPROPERTY是IsTable的全体找出来反省一下吧,如许可以基础上办理成绩了,假如还呈报毛病,试着把数据selectinto到另外一张表反省一下。
这些都做完了以后,把一切索引、视图、存储历程、触发器等从头创建一下。DBCCDBREINDEX大概能够帮你一些忙。
然后,就能够向boss吹捧一下你的丰功伟业,特地小小的提一下加薪的请求,假如(很有大概)不未遂的话,也只好回家睡觉往:(
记得下次别忘了做好备份哦~

下面提到的命令、工具在BooksOnline中均有具体申明,请注重参看。
Thankyouforyourreading.

我们只需要把binlog文件反向执行,每个操作都执行逆操作即可。当然也不是所有的event都反转。Table_mapevent必须还是在Rows_log_event每个操作之前。

分手快乐 发表于 2015-1-18 08:45:19

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

小妖女 发表于 2015-1-21 14:52:58

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

兰色精灵 发表于 2015-1-30 20:08:22

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。

简单生活 发表于 2015-2-6 15:50:22

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书

只想知道 发表于 2015-2-16 23:13:07

原来公司用过MYSQL自己也只是建个表写个SQL

愤怒的大鸟 发表于 2015-3-5 11:39:29

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

变相怪杰 发表于 2015-3-12 05:07:21

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

山那边是海 发表于 2015-3-19 18:10:09

是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
页: [1]
查看完整版本: MSSQL教程之当SQL Server数据库溃散时怎样恢复?