MS SQL 数据库备份后恢复不成功,请帮忙

say 2008-09-26 07:59:03
MS SQL 数据库备份后恢复不成功,备份文件若34G。恢复过程中总提示RESTORE...致命错误,但备份过程是很成功的。有什么办法可以报备份文件解压为.mdf和ldf?或者有什么恢复的办法?
...全文
118 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuchaofu 2008-09-27
  • 打赏
  • 举报
回复
一个比较简单的方法,先在所有任务中选择压缩数据库,然后将.mdf和.ldf文件拷贝到另一个地方,附加就可以了!
注意把数据库模式改为"简单",自动压缩选上,一般在一千万数据内不会有几十G那么大
骑龙戏水 2008-09-26
  • 打赏
  • 举报
回复
,好,我也响应一下二楼,这是一个vbs脚本,是我早期的,屡试不爽:
' VBScript source code
'Programmed by Forest,Hichina,2004
'This program is used to restore SQLServer database automatically.
'Usage:cscript DbRestore.vbs OldUsrName Bakfilename NewUsrName Password
'Example:cscript DbRestore.vbs cw01001 cw01001_db_bka cw03002 x2d3d4s4

'备份文件就在用户根目录下
'还需要加入杀死当前进程的过程

Set oArgs=wscript.arguments
CRLF = Chr(13) & Chr(10)

If oArgs.Count <>4 Then
ReadMe="============================================================================="

& CRLF
ReadMe=ReadMe & "This program is used to restore SQLServer database automatically." &

CRLF
ReadMe=ReadMe & "Usage:cscript DbRestore.vbs OldUsrName Bakfilename NewUsrName

Password" & CRLF
ReadMe=ReadMe & "Example:cscript DbRestore.vbs cw01001 cw01001_db_bka cw03002

x2d3d4s4" & CRLF
ReadMe=ReadMe &

"=============================================================================" & CRLF
ReadMe=ReadMe & "Programmed by Forest,Hichina,2004" & CRLF

Wscript.Echo ReadMe
WScript.Quit(1)
Else
OldUsrName=oArgs.item(0)
Bakfilename=oArgs.item(1)
NewUsrName = oArgs.item(2)
'Password= oArgs.item(3)
End If


'服务器用户数据根目录
BakRoot="e:\RestoreDB"
'SQLServer安装根目录
SQLDataRoot="E:\sqldata"

DbName=NewUsrName & "_db"
LogName = DbName & "_log"
LogPath = "E:\sqllog\" & LogName & ".ldf"
DataPath = SQLDataRoot & "\" & DbName & "_Data" & ".mdf"
BakFile = BakRoot & "\" & Bakfilename
Login = NewUsrName


'检查指定的备份文件是否存在
Set objFso = CreateObject("Scripting.FileSystemObject")
If Not objFso.FileExists(BakFile) Then
Wscript.Echo "Error BakFile: " & BakFile & " not found."
WScript.Quit(1)
End If

Dim conn,rs,sqlstr
dim BackString,renameData,renameLog
Set conn = CreateObject("ADODB.Connection")
conn.connectionstring ="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security

Info=False;Data Source=localhost;Initial Catalog=master" '& DbName
'conn.connectionstring = "PROVIDER=sqloledb;DRIVER={SQL Server};SERVER=

(local);Integrated Security=SSPI;Initial Catalog=" & DbName
conn.Open

GetIDsql= "select spid=cast(spid as varchar(20)) from master..sysprocesses

where dbid=db_id('"& NewUsrName &"') "
set id=conn.Execute(GetIDsql)
if not id.eof then
killSql=" kill "& id(0).Value
conn.Execute(GetIDsql)
end if

BackString="RESTORE DATABASE ["& DbName &"] FROM DISK = N'"& BakFile &"' WITH FILE =

1, MOVE N'"& OldUsrName &"_db_data ' TO N'"& DataPath &"', MOVE N'"& OldUsrName &"_db_log'

TO N'"& LogPath &"', NOUNLOAD, REPLACE, STATS = 10"
renameData="ALTER DATABASE ["& DbName &"] MODIFY FILE (NAME=N'"& OldUsrName &"_db_Data',

NEWNAME=N'"& DbName &"_Data')"
renameLog="ALTER DATABASE ["& DbName &"] MODIFY FILE (NAME=N'"& OldUsrName &"_db_log',

NEWNAME=N'"& DbName &"_log')"

'回复数据库信息
conn.Execute(BackString)
'将文件名改为当前的数据库名称相关
conn.Execute(renameData)

conn.Execute(renamelog)
conn.close
conn.connectionstring ="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security

Info=False;Data Source=localhost;Initial Catalog=" & DbName
conn.Open

'取得shema和数据对象信息
sqlstr="select ob.name,sch.name from sys.all_objects ob ,sys.schemas sch where

ob.schema_id=sch.schema_id and ob.is_ms_shipped=0 and sch.name='"& OldUsrName &"' and type

in ('P','U','V')"
set rs=conn.Execute(sqlstr)

'循环变更权限
while not rs.eof
sqlstr="ALTER SCHEMA dbo TRANSFER " & rs(1).Value & "." & rs(0).Value
conn.Execute (sqlstr)
rs.movenext
wend

conn.Execute("drop schema " & OldUsrName )
conn.Execute("drop user " & OldUsrName)
conn.Execute("EXEC dbo.sp_changedbowner @loginame = N'" + NewUsrName + "', @map = false")



Set rs = nothing
conn.close
Set conn = nothing


Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.open "POST", "http://" & GetComputerName & ".hichina.com:887/dbadmin.asp", False
' objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.send "action=restoretrans&db=" & DbName
res=bytes2BSTR(objHTTP.responsebody)
if res="200:ok" then
wscript.echo "1"
else
wscript.echo res
end if
Set objHTTP = Nothing


Function GetComputerName
Set objShell = CreateObject("Wscript.Shell")
GetComputerName = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
Set objShell = Nothing
End Function


Function bytes2BSTR(vIn)
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function
dawugui 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 say 的帖子:]
MS SQL 数据库备份后恢复不成功,备份文件若34G。恢复过程中总提示RESTORE...致命错误,但备份过程是很成功的。有什么办法可以报备份文件解压为.mdf和ldf?或者有什么恢复的办法?
[/Quote]
直接拷贝MDF,LDF文件到另外一个服务器,然后附加.
附加可使用企业管理器中的菜单,也可用如下的语句.

示例
下面的示例将 pubs 中的两个文件附加到当前服务器。

EXEC sp_attach_db @dbname = N'pubs',
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
@filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'



另:使用DBCC CHECKDB
检查指定数据库中的所有对象的分配和结构完整性。

语法
DBCC CHECKDB
( 'database_name'
[ , NOINDEX
| { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
} ]
) [ WITH { [ ALL_ERRORMSGS ]
[ , [ NO_INFOMSGS ] ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
[ , [ PHYSICAL_ONLY ] ]
}
]

参数
'database_name'

是要对其中的所有对象分配和结构完整性进行检查的数据库。如果未指定,则默认为当前数据库。数据库名称必须符合标识符的规则。有关更多信息,请参见使用标识符。

NOINDEX

指定不检查非系统表的非聚集索引。NOINDEX 减少执行总时间,因为它不对用户定义的表的非聚集索引进行检查。NOINDEX 对系统表没有影响,因为 DBCC CHECKDB 总是对所有系统表索引进行检查。

REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD

指定 DBCC CHECKDB 修复发现的错误。给定的 database_name 必须在单用户模式下以使用修复选项,它可以是下列值之一。

值 描述
REPAIR_ALLOW_DATA_LOSS 执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。
REPAIR_FAST 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。
REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。


WITH

指定有关下列内容的选项:返回错误信息的数量、获得的锁或估计的 tempdb 要求。

ALL_ERRORMSGS

显示每个对象不受限制的错误数。如果没有指定 ALL_ERRORMSGS,每个对象至多显示 200 个错误信息。按对象 ID 对错误信息进行排序(从 tempdb 中生成的消息除外)。

NO_INFOMSGS

禁止显示所有信息性消息(严重级别 10)和关于所用空间的报告。

TABLOCK

导致 DBCC CHECKDB 获得共享表锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。

ESTIMATE ONLY

显示估计的 tempdb 空间大小,要运行带有所有其它指定选项的 DBCC CHECKDB 则需要该空间。不执行该检查。

PHYSICAL_ONLY

仅限于检查页和记录标题物理结构的完整性,以及页对象 ID 和索引 ID 与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性,同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGS,并且不能与任何修复选项一起使用。

注释
DBCC CHECKDB 对索引视图执行物理一致性检查。只用于向后兼容的 NOINDEX 选项也适用于索引视图上的任何辅助索引。

DBCC CHECKDB 是最安全的修复语句,因为它对最多的可能出现的各种错误进行标识和修复。如果只报告数据库中有分配错误,请执行带修复选项的 DBCC CHECKALLOC 以对这些错误进行修复。然而,若要确保正确修复所有错误(包括分配错误),请执行带修复选项的 DBCC CHECKDB,而不要执行带修复选项的 DBCC CHECKALLOC。

DBCC CHECKDB 对数据库中所有内容的完整性进行验证。如果当前正在执行或最近已执行 DBCC CHECKDB,则不需要运行 DBCC CHECKALLOC 或 DBCC CHECKTABLE。

DBCC CHECKDB 执行同样的检查,仿佛是对数据库中的每个表执行 DBCC CHECKALLOC 语句和 DBCC CHECKTABLE 语句。

默认情况下,DBCC CHECKDB 不获取表锁。但它获取架构锁,该锁防止对元数据进行更改,但允许更改数据。获取的架构锁将防止用户得到排它表锁,在生成聚集索引、除去任何索引或截断表时需要排它表锁。

DBCC 语句收集信息,然后扫描日志以查找所做的任何其它更改,并在扫描的结尾将两组信息合并在一起以产生数据的一致视图。

如果指定 TABLOCK 选项,DBCC CHECKDB 将获取共享表锁。这样可允许某些类别的错误有更详细的错误信息,并通过避免使用事务日志数据而将所要求的 tempdb 空间大小降为最低。TABLOCK 选项不阻止日志截断并使命令可以更快地运行。

DBCC CHECKDB 对数据库中每个表的 text、ntext 和 image 页的链接和大小及数据库中所有页的分配进行检查。

对于数据库中每个表,DBCC CHECKDB 检查其:

索引和数据页是否已正确链接。


索引是否按照正确的顺序排列。


各指针是否一致。


每页上的数据是否均合理。


页面偏移量是否合理。
错误表示数据库中的潜在问题,应该立即改正。

默认情况下,DBCC CHECKDB 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。使用 sp_configure 系统存储过程限制可用于 DBCC 检查的最大处理器数。有关更多信息,请参见 max degree of parallelism 选项。

使用跟踪标记 2528 可禁用并行检查。有关更多信息,请参见跟踪标记。

结果集
不管是否指定任何选项(NO_INFOMSGS 或 NOINDEX 选项除外),如果未指定数据库,DBCC CHECKDB 返回当前数据库的以下结果集(值可能会变化):

DBCC results for 'master'.
DBCC results for 'sysobjects'.
There are 862 rows in 13 pages for object 'sysobjects'.
DBCC results for 'sysindexes'.
There are 80 rows in 3 pages for object 'sysindexes'.
'...'
DBCC results for 'spt_provider_types'.
There are 23 rows in 1 pages for object 'spt_provider_types'.
CHECKDB found 0 allocation errors and 0 consistency errors in database 'master'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 NO_INFOMSGS 选项,DBCC CHECKDB 将返回以下结果集(消息):

The command(s) completed successfully.

如果指定 ESTIMATEONLY 选项,DBCC CHECKDB 将返回以下结果集。

Estimated TEMPDB space needed for CHECKALLOC (KB)
-------------------------------------------------
13

(1 row(s) affected)

Estimated TEMPDB space needed for CHECKTABLES (KB)
--------------------------------------------------
57

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

权限
DBCC CHECKDB 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例
A. 检查当前数据库和 pubs 数据库
下例对当前数据库和 pubs 数据库执行 DBCC CHECKDB。

-- Check the current database.
DBCC CHECKDB
GO
-- Check the pubs database without nonclustered indexes.
DBCC CHECKDB ('pubs', NOINDEX)
GO

B. 检查当前数据库,禁止显示信息性消息
下例检查当前数据库,并禁止显示所有信息性消息。

DBCC CHECKDB WITH NO_INFOMSGS
GO

水族杰纶 2008-09-26
  • 打赏
  • 举报
回复
2、从备份中还原
-------------------------------------------------------------------------
restore headeronly from bak1
restore database d1 from bak1 with file=2 --从完全备份中恢复
----------------------------------------------------------------------
restore headeronly from bak2 --从差异备份中恢复
restore database d2 from bak2 with file=1,norecovery
restore database d2 from bak2 with file=5,recovery
----------------------------------------------------------------------
restore headeronly from bak3 --从日志备份中恢复
restore database d3 from bak3 with file=1,norecovery
restore log d3 from bak3 with file=2,norecovery
restore log d3 from bak3 with file=3,norecovery
restore log d3 from bak3 with file=4,norecovery
restore log d3 from bak3 with file=5,recovery
----------------------------------------------------------------------
restore database d3 from bak3 with file=1,norecovery --恢复到指定时间
restore log d3 from bak3 with file=2,norecovery
restore log d3 from bak3 with file=3,norecovery
restore log d3 from bak3 with file=4,recovery,stopat='2003-08-15 11:29:00.000'
----------------------------------------------------------------------
restore database d5 filegroup='FG2' from bak5 with file=4,norecovery --还原文件组备份
restore log d5 from bak5 with file=5,norecovery
restore log d5 from bak5 with file=7,recovery
----------------------------------------------------------------------
restore headeronly from bak6 --还原文件备份
restore database d5 file='d5_data3' from bak6 with file=6,norecovery
restore log d5 from bak6 with file=7,norecovery
restore log d5 from bak6 with file=9,recovery
----------------------------------------------------------------------
restore database d5 from bak6 with replace --删除现有数据库,从备份中重建数据库
----------------------------------------------------------------------
create database d6 --move to将数据库文件移动到新位置
on primary
(name=d6_data,
filename='E:\Program Files\Microsoft SQL Server\MSSQL\data\d6_Data.MDF',
size=2MB)
log on
(name=d6_log,
filename='E:\Program Files\Microsoft SQL Server\MSSQL\data\d6_log.ldf',
size=2MB)
go
backupdatabase d6 to bak6 with init
drop database d6
restore database d6 from bak6
with move 'd6_data' to 'e:\data\d6\d6_data.mdf',
move 'd6_log'to 'e:\data\d6\d6_log.ldf'
sp_helpdb d6
----------------------------------------------------------------------
3、分离与重连接数据库
--------------------------------------
sp_detach_db 'd6'
sp_attach_db 'd6','e:\data\d6\d6_data.mdf','e:\data\d6\d6_log.ldf'
--------------------------------------
sp_detach_db d6
go
create database d6
on primary
(filename='e:\data\d6\d6_data.mdf')
for attach
go
----------------------------------------------------------------------
4、恢复损坏的系统数据库
----------------------------------------------------------------------
1)先备份MASTER、MSDB
2)停止SQL服务,将MASTER数据库文件删除或者重命名。这样,SQL服务将不能启动。
3)系统数据库的还原
-----------------------------------------------
(1)如果SQL服务还能启动,则从备份中恢复系统数据库。
(2)如果SQL服务不能启动,则需要重建系统数据库。
使用SQL文件夹TOOLS\BINN目录下的Rebuildm.exe重建master数据库。
(3)创建备份设备,指向以前的备份设备。
(4)以单用户模式启动SQL
cd programe files\microsoft sql server\mssql\binn
sqlservr.exe -c -m
(5)进查询分析器,从备份中恢复master数据库。
restore database master from masterbak
restore database msdb from disk='e:\bak\msdb.bak'
MASTER还原后,SQL中用户数据库的信息也会恢复。
(6)如果MASTER没有备份,则需要用sp_attach_db命令将用户数据库附加到新的MASTER数据库中。
qinhl99 2008-09-26
  • 打赏
  • 举报
回复
学习

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧