![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
数据库备份和恢复存储过程(和大家交流一下)
if
exists(
select
*
from sysobjects
where name
=
'
pr_backup_db
'
and xtype
=
'
p
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
)
begin
drop
proc pr_backup_db
end
go
/**/
/*备份数据库*/
create
proc pr_backup_db
@flag
varchar(
10) out,
@backup_db_name
varchar(
128),
@filename
varchar(
1000)
--
路径+文件名字
as
declare
@sql
nvarchar(
4000),
@par
nvarchar(
1000)
select
@par
=
'
@filename varchar(1000)
'
select
@sql
=
'
BACKUP DATABASE
'
+
@backup_db_name
+
'
to disk=@filename with init
'
execute sp_executesql
@sql,
@par,
@filename
select
@flag
=
'
ok
'
go
if
exists(
select
*
from sysobjects
where name
=
'
fn_GetFilePath
'
and xtype
=
'
fn
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
)
begin
drop
function fn_GetFilePath
end
go
/**/
/*创建函数,得到文件得路径*/
create
function fn_GetFilePath(
@filename
nvarchar(
260))
returns
nvarchar(
260)
as
begin
declare
@file_path
nvarchar(
260)
declare
@filename_reverse
nvarchar(
260)
select
@filename_reverse
=
reverse(
@filename)
select
@file_path
=
substring(
@filename,
1,
len(
@filename)
+
1
-
charindex(
'
\
',
@filename_reverse))
return
@file_path
end
go
if
exists(
select
*
from sysobjects
where name
=
'
pr_restore_db
'
and xtype
=
'
p
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
)
begin
drop
proc pr_restore_db
end
go
create
proc pr_restore_db
/**/
/*恢复数据库*/
@flag
varchar(
20) out,
/**/
/*过程运行的状态标志,是输入参数*/
@restore_db_name
nvarchar(
128),
/**/
/*要恢复的数据名字*/
@filename
nvarchar(
260)
/**/
/*备份文件存放的路径+备份文件名字*/
as
declare
@proc_result
tinyint
/**/
/*返回系统存储过程xp_cmdshell运行结果*/
declare
@loop_time
smallint
/**/
/*循环次数*/
declare
@max_ids
smallint
/**/
/*@tem表的ids列最大数*/
declare
@file_bak_path
nvarchar(
260)
/**/
/*原数据库存放路径*/
declare
@flag_file
bit
/**/
/*文件存放标志*/
declare
@master_path
nvarchar(
260)
/**/
/*数据库master文件路径*/
declare
@sql
nvarchar(
4000),
@par
nvarchar(
1000)
declare
@sql_sub
nvarchar(
4000)
declare
@sql_cmd
nvarchar(
4000)
/**/
/*
判断参数@filename文件格式合法性,以防止用户输入类似d: 或者 c:\a\ 等非法文件名
参数@filename里面必须有'\'并且不以'\'结尾
*/
if
right(
@filename,
1)
<>
'
\
'
and
charindex(
'
\
',
@filename)
<>
0
begin
select
@sql_cmd
=
'
dir
'
+
@filename
EXEC
@proc_result
= master..xp_cmdshell
@sql_cmd,no_output
IF (
@proc_result
<>
0)
/**/
/*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
begin
select
@flag
=
'
not exist
'
/**/
/*备份文件不存在*/
return
/**/
/*退出过程*/
end
/**/
/*创建临时表,保存由备份集内包含的数据库和日志文件列表组成的结果集*/
create
table #tem(
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
LogicalName
nvarchar(
128),
/**/
/*文件的逻辑名称*/
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
PhysicalName
nvarchar(
260) ,
/**/
/*文件的物理名称或操作系统名称*/
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Type
char(
1),
/**/
/*数据文件 (D) 或日志文件 (L)*/
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
FileGroupName
nvarchar(
128),
/**/
/*包含文件的文件组名称*/
[
Size
] numeric(
20,
0),
/**/
/*当前大小(以字节为单位)*/
[
MaxSize
] numeric(
20,
0)
/**/
/*允许的最大大小(以字节为单位)*/
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
)
/**/
/*
创建表变量,表结构与临时表基本一样
就是多了两列,
列ids(自增编号列),
列file_path,存放文件的路径
*/
declare
@tem
table(
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
ids
smallint
identity,
/**/
/*自增编号列*/
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
LogicalName
nvarchar(
128),
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
PhysicalName
nvarchar(
260),
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
File_path
nvarchar(
260),
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Type
char(
1),
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FileGroupName
nvarchar(
128)
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
)
insert
into #tem
execute(
'
restore filelistonly from disk=
'''
+
@filename
+
'''')
/**/
/*将临时表导入表变量中,并且计算出相应得路径*/
insert
into
@tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
from #tem
if
@@rowcount
>
0
begin
drop
table #tem
end
select
@loop_time
=
1
select
@max_ids
=
max(ids)
/**/
/*@tem表的ids列最大数*/
from
@tem
while
@loop_time
<=
@max_ids
begin
select
@file_bak_path
=file_path
from
@tem
where ids
=
@loop_time
select
@sql_cmd
=
'
dir
'
+
@file_bak_path
EXEC
@proc_result
= master..xp_cmdshell
@sql_cmd,no_output
/**/
/*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
IF (
@proc_result
<>
0)
select
@loop_time
=
@loop_time
+
1
else
BREAK
/**/
/*没有找到备份前数据文件原有存放路径,退出循环*/
end
select
@master_path
=
''
if
@loop_time
>
@max_ids
select
@flag_file
=
1
/**/
/*备份前数据文件原有存放路径存在*/
else
begin
select
@flag_file
=
0
/**/
/*备份前数据文件原有存放路径不存在*/
select
@master_path
=dbo.fn_GetFilePath(filename)
from master..sysdatabases
where name
=
'
master
'
end
select
@sql_sub
=
''
/**/
/*type='d'是数据文件,type='l'是日志文件 */
/**/
/*@flag_file=1时新的数据库文件还是存放在原来路径,否则存放路径和master数据库路径一样*/
select
@sql_sub
=
@sql_sub
+
'
move
'''
+LogicalName
+
'''
to
'''
+
case type
when
'
d
'
then
case
@flag_file
when
1
then File_path
else
@master_path
end
when
'
l
'
then
case
@flag_file
when
1
then File_path
else
@master_path
end
end
+
case type
when
'
d
'
then
@restore_db_name
+
'
_
'
+LogicalName
+
'
_data.mdf
''
,
'
when
'
l
'
then
@restore_db_name
+
'
_
'
+LogicalName
+
'
_log.ldf
''
,
'
end
from
@tem
select
@sql
=
'
RESTORE DATABASE @db_name FROM DISK=@filename with
'
select
@sql
=
@sql
+
@sql_sub
+
'
replace
'
select
@par
=
'
@db_name nvarchar(128),@filename nvarchar(260)
'
print
@sql
execute sp_executesql
@sql,
@par,
@db_name
=
@restore_db_name,
@filename
=
@filename
select
@flag
=
'
ok
'
/**/
/*操作成功*/
end
else
begin
SELECT
@flag
=
'
file type error
'
/**/
/*参数@filename输入格式错误*/
end
--
备份数据库test_database
declare
@fl
varchar(
10)
execute pr_backup_db
@fl out,
'
test_database
',
'
c:\test_database.bak
'
select
@fl
--
恢复数据库,输入的参数错误
declare
@fl
varchar(
20)
exec pr_restore_db
@fl out,
'
sa
',
'
c:\
'
select
@fl
--
恢复数据库,即创建数据库test_database的复本test_db
declare
@fl
varchar(
20)
exec pr_restore_db
@fl out,
'
test_db
',
'
c:\test_database.bak
'
select
@fl
fang fa 2
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sql数据库修复技术
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式。下面将主要讨论一下后者的备份与恢复。本文假定您能熟练使用SQL Server Enterprise Manager(SQL Server企业管理器)和SQL Server Quwey Analyser(SQL Server查询分析器)
1、正常的备份、sql数据库修复方式
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
卸下数据库的命令:Sp_detach_db 数据库名
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
连接数据库的命令:Sp_attach_db或者sp_attach_single_file_db
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
s_attach_db
[
@dbname =
] ′dbname′,
[
@filename1 =
] ′filename_n′
[
,
16
]
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_attach_single_file_db
[
@dbname =
] ′dbname′,
[
@physname =
] ′physical_name′
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
使用此方法可以正确恢复SQL Sever7.0和SQL Server 2000的数据库文件,要点是备份的时候一定要将mdf和ldf两个文件都备份下来,mdf文件是数据库数据文件,ldf是数据库日志文件。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
例子:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
数据库修复包括:sql数据库修复 sql数据库恢复sql server修复 文件修复 raid数据恢复 sql数据库修复 raid磁盘阵列 sql恢复 sql server恢复 假设数据库为test,其数据文件为test_data.mdf,日志文件为test_log.ldf。下面我们讨论一下如何备份、恢复该数据库。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
卸下数据库:sp_detach_db
'
test
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
连接数据库:sp_attach_db
'
test
',
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf
',
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_attach_single_file_db
'
test
',
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf
'
2、只有mdf文件的恢复技术
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,但是会出现类似下面的提示信息
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
设备激活错误。物理文件名
'
C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF
' 可能有误。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
已创建名为
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF
' 的新日志文件。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
服务器: 消息
1813,级别
16,状态
2,行
1
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
未能打开新数据库
'
test
'。
CREATE
DATABASE 将终止。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
设备激活错误。物理文件名
'
d:\test_log.LDF
' 可能有误。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
怎么办呢?别着急,下面我们举例说明恢复办法。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager里面建立。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
B.停掉数据库服务器。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
use master
go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_configure
'
allow updates
',
1
go
reconfigure
with override
go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
F.设置test为紧急修复模式
update sysdatabases
set status
=-
32768
where dbid
=
DB_ID(
'
test
')
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
G.下面执行真正的恢复操作,重建数据库日志文件
dbcc rebuild_log(
'
test
',
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf
')
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
执行过程中,如果遇到下列提示信息:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
服务器: 消息
5030,级别
16,状态
1,行
1
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
未能排它地锁定数据库以执行该操作。
DBCC 执行完毕。如果
DBCC 输出了错误信息,请与系统管理员联系。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
正确执行完成的提示应该类似于:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
警告: 数据库
'
test
' 的日志已重建。已失去事务的一致性。应运行
DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。数据恢复 sql数据库修复 密码恢复 sql数据库恢复 硬盘异响 坏道修复 文件恢复 sql server修复 文件修复 raid数据恢复 sql数据库修复 raid磁盘阵列 sql恢复 sql server恢复 硬盘数据恢复 硬盘坏道修复 硬盘数据修复 数据修复
DBCC 执行完毕。如果
DBCC 输出了错误信息,请与系统管理员联系。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
H.验证数据库一致性(可省略)
dbcc checkdb(
'
test
')
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
一般执行结果如下:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CHECKDB 发现了
0 个分配错误和
0 个一致性错误(在数据库
'
test
' 中)。
DBCC 执行完毕。如果
DBCC 输出了错误信息,请与系统管理员联系。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
I.设置数据库为正常状态
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_dboption
'
test
',
'
dbo use only
',
'
false
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_configure
'
allow updates
',
0
go
reconfigure
with override
go
3.另外一种方法【置疑数据】
1.新建一个同名的数据库
2.再停掉sql server
3.用suspect数据库的文件覆盖掉这个新建的同名数据库
4.再重启sql server
5.此时打开企业管理器时新建的同名数据库会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
USE MASTER
GO
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SP_CONFIGURE
'
ALLOW UPDATES
',
1
RECONFIGURE
WITH OVERRIDE
GO
UPDATE SYSDATABASES
SET STATUS
=
32768
WHERE NAME
=
'
his222
'
Go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_dboption
'
test
',
'
single user
',
'
true
'
Go
DBCC CHECKDB(
'
test
')
Go
update sysdatabases
set status
=
28
where name
=
'
test
'
Go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_configure
'
allow updates
',
0
reconfigure
with override
Go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_dboption
'
test
',
'
single user
',
'
false
'
Go
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
数据库的脚本创建一个新的数据库,并将数据导进去就行了.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果这样改不加数据库状态,你就把数据库导成一个新库来代替旧库吧
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
企业管理器
--
右键你的数据库--所有任务--导出数据
--
目标标数据库选择新建
--
选择"在两个sql数据库之间复制对象和数据"
--
把"包含扩展属性"选上,其他的根据需要选择
--
最后完成
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,但是会出现类似下面的提示信息
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
设备激活错误。物理文件名
'
C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF
' 可能有误。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
已创建名为
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF
' 的新日志文件。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
服务器: 消息
1813,级别
16,状态
2,行
1
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
未能打开新数据库
'
test
'。
CREATE
DATABASE 将终止。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
设备激活错误。物理文件名
'
d:\test_log.LDF
' 可能有误。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
怎么办呢?别着急,下面我们举例说明恢复办法。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager里面建立。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
B.停掉数据库服务器。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
use master
go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_configure
'
allow updates
',
1
go
reconfigure
with override
go
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
F.设置test为紧急修复模式
update sysdatabases
set status
=-
32768
where dbid
=
DB_ID(
'
test
')
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
G.下面执行真正的恢复操作,重建数据库日志文件
dbcc rebuild_log(
'
test
',
'
C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf
')
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
执行过程中,如果遇到下列提示信息:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
服务器: 消息
5030,级别
16,状态
1,行
1
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
未能排它地锁定数据库以执行该操作。
DBCC 执行完毕。如果
DBCC 输出了错误信息,请与系统管理员联系。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
正确执行完成的提示应该类似于:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
警告: 数据库
'
test
' 的日志已重建。已失去事务的一致性。应运行
DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC 执行完毕。如果
DBCC 输出了错误信息,请与系统管理员联系。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
H.验证数据库一致性(可省略)
dbcc checkdb(
'
test
')
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
一般执行结果如下:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CHECKDB 发现了
0 个分配错误和
0 个一致性错误(在数据库
'
test
' 中)。
DBCC 执行完毕。如果
DBCC 输出了错误信息,请与系统管理员联系。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
I.设置数据库为正常状态
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_dboption
'
test
',
'
dbo use only
',
'
false
'
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
sp_configure
'
allow updates
',
0
go
reconfigure
with override
go
本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2005/10/24/260759.html,如需转载请自行联系原作者