1.引言
SQLSERVER作为为当今流行的数据库之一,以其优异的性能、方便的管理、相对低廉的价格赢得越来越多的企业客户和个人客户。当我们使用数据库时,数据的可靠、安全、正确总是我们最关注的问题,有时由于数据库服务器的硬件故障、系统故障、软件故障等等原因我们的数据总是受到威胁,甚至数据库被破坏进而使我们的数据库中的数据完全或者是部分的丢失。但这种情况发生时我们就需要将数据库重建并恢复原有的数据,这个处理过程就称为数据库的恢复。
2.造成数据库数据丢失的原因
2.1数据的丢失主要有以下几个原因:
1)存储设备故障:数据服务器端的硬盘,SAN家构或者是磁盘阵列柜。
2)文件系统故障:由于病毒侵害,意外掉电或者是操作系统等原因造成文件系统损坏。
3)由于后台进程故障和意外掉电等原因造成实例的故障进而造成数据丢失。
2.2基于上述原因我们可以看出数据的丢失可以分为以下两类
2.2.1实例故障,当数据库操作系统运行过程中意外中止时出现的故障,这是我们对数据的恢复只能恢复到故障之前的事物一致状态。
2.2.2介质故障或文件错误的不一致恢复,在这种状态下的数据库都是不一致的,遇到这种故障时我们需要数据库管理员的手工干预来进行数据的恢复,而这种恢复的形式决定于数据库运行的恢复模式。在数据库的恢复模式中我们可以将其分为三种类型:FULL、BULK_LOGGED和SIMPLE
1)FULL恢复模型向你提供了最大的恢复灵活性。新数据库默认使用的就是这种恢复模型。利用这种模型,你可以恢复数据库的一部分或者完全恢复。假设交易记录(transactionslog)还没有被破坏,你还可以在失败之前恢复出最后一次的已提交(committed)交易。在所有的恢复模型中,这种模型使用了最多的交易记录空间,并轻微影响了SQLServer的性能。
2)BULK_LOGGED恢复模型比FULL模型少了一些恢复选项,但是进行批操作(bulkoperation)时它不会严重影响性能。在进行某些批操作时,由于它只需记录操作的结果,因此它使用了较少的记录空间。然而,用这种模型,你不能恢复数据库中的特定标记,也不能仅仅恢复数据库的一部分。
3)SIMPLE恢复模型是这三种模型中最容易实施的,它所占用的存储空间也最小。然而,你只能恢复出备份结束时刻的数据库。
3.SqlServer数据库恢复的几个特种技术
案例一:当数据库服务器受到病毒攻击或者操作系统因为意外原因无法启动整个系统崩溃以后,这时候我们可以将原有服务器中的去据库文件导出,主要是ProgramFiles目录下面的MicrosoftSQLServer目录中全部文件拷贝出来,在新操作系统安装完成后我们可以将新的数据库按原有的安装条件安装到操作系统中,计算机在系统重新启动后,我们先将数据库服务停止,并将MicrosoftSQLServer下的数据拷贝到新安装的数据库服务器的ProgramFiles\MicrosoftSQLServer目录中,这时重新启动数据库服务,我们就可以看到原有的数据库实例重新运行了起来,并且数据库中的作业项和安全箱中的全部数据都没有丢失。
案例二:数据库文件系统中只能找到相关的MDF和LDF的数据库文件,对于这样的数据我们可以按照以下步骤恢复数据1)在安装完新的操作系统之后安装数据库操作系统,数据库操作系统版本最好与原数据库版本相同或更高一个版本,早运行更高版本时,数据库操作系统会对现有数据文件进行升级。
2)启动数据库的EnterpriseManager并运行查询分析器,在恢复数据库之前我们先要获取原有数据库的名称,如果不能确定数据库名称我们可以参照导出的数据库文件来确定比如数据库文件的名称为pubs.mdf,那么数据库的名称就是pubs,查询分析器所对应的数据库设置为master数据库.上述两个文件拷贝到数据库操作系统的安装目录中,并将文件目录拷贝下来,切换到查询分析器,现在我们需要使用到sp_attch_db存储过程,以数据库名称为"pubs",文件目录为"c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\"具体使用命令如下:
EXECsp_attach_db@dbname=N'数据库名称',@filename1=N'c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\pubs.mdf',@filename2=N'c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\pubs_log.ldf'
点击运行键,数据库恢复完毕。
案例三:针对第二种恢复方法还有一种现象就是我们只有MDF库表文件,我们可以按照以下步骤来恢复数据。
1)我们使用默认方式建立一个供恢复使用的数据库(如pubs)。可以在SQLServerEnterpriseManager里面建立。
2)停掉数据库服务器。
3)将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
4)启动数据库服务器。此时会看到数据库test的状态为"置疑"。这时候不能对此数据库进行任何操作。
5)设置数据库允许直接操作系统表。此操作可以在SQLServerEnterpriseManager里面选择数据库服务器,按右键,选择"属性",在"服务器设置"页面中将"允许对系统目录直接修改"一项选中。也可以使用如下语句来实现。
usemaster
go
sp_configure'allowupdates',1
go
reconfigurewithoverridego
6)设置test为紧急修复模式updatesysdatabasessetstatus=-32768wheredbid=DB_ID('test')此时可以在SQLServerEnterpriseManager里面看到该数据库处于"只读\置疑\脱机\紧急模式"可以看到数据库里面的表,但是仅仅有系统表
7)下面执行真正的恢复操作,重建数据库日志文件dbccrebuild_log('pubs','C:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\pubs_log.ldf')
执行过程中,如果遇到下列提示信息:
服务器:消息5030,级别16,状态1,行1
未能排它地锁定数据库以执行该操作。
DBCC执行完毕
4.结束语
任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备……仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,无法承受这样昂贵的硬件投资。所以做好日常的数据备份工作是保护数据的最好方法。我们在本文里介绍了三种情况下的数据库恢复方法,这三种方法在日常的数据库恢复中有一定的代表性,为没有完整备份的数据库恢复数据提供了非常实用的手段。