SQL 数据库备份与还原

备份数据库:

      BACKUP DATABASE Northwind  TO DISK = 'c:\XXXXX.bak'

还原数据库:

     --返回由备份集内包含的数据库和日志文件列表组成的结果集
   RESTORE FILELISTONLY
   FROM DISK = 'c:\XXXX.bak'

--还原由BACKUP备份的数据库
   RESTORE DATABASE Northwind
   FROM DISK = 'c:\XXXX.bak'

--指定还原后的数据库物理文件名称及路径
RESTORE DATABASE TestDB
   FROM DISK = 'c:\XXXX.bak'
   WITH
   MOVE 'Northwind' TO 'c:\test\testdb.mdf',
   MOVE 'Northwind_log' TO 'c:\test\testdb.ldf'

   MOVE 'logical_file_name' TO 'operating_system_file_name'
指定应将给定的 logical_file_name 移到 operating_system_file_name。
默认情况下,logical_file_name 将还原到其原始位置。如果使用 RESTORE
语句将数据库复制到相同或不同的服务器上,则可能需要使用 MOVE 选项重
新定位数据库文件以避免与现有文件冲突。可以在不同的 MOVE 语句中指定
数据库内的每个逻辑文件。

--强制还原,加上REPLACE参数,则在现有数据库基础上强制还原。
   RESTORE DATABASE TestDB
   FROM DISK = 'c:\Northwind.bak'
   WITH REPLACE,
   MOVE 'Northwind' TO 'c:\test\testdb.mdf',
   MOVE 'Northwind_log' TO 'c:\test\testdb.ldf'

对于还原数据库过程中 出现失败 主要是由于还原数据库前没有关闭掉该数据库的工作线程。

--再master数据库中 创建一个 kill存储过程 用来kill 需要还原数据库的工作线程
use   master 
go
create proc p_killspid
@dbname sysname --要关闭进程的数据库名
as
declare @s nvarchar(1000)
declare tb cursor local for
select s='kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)

open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
go

还原数据库 首先要再 其他库上 use master
在master库上 运行存储过程 p_killspid 来kill掉 需要还原的数据库 的工作线程
然后最后进行还原RESTORE DATABASE

--还原数据库最后整理版
use   master 
go
if   exists(select 1   from   sysobjects   where   id=object_id('p_killspid')   and   xtype='P')  

begin  
     exec('drop   procedure   p_killspid')  
end  
go
  
create proc p_killspid
 @dbname sysname
 as
 declare @s nvarchar(1000)
 declare tb cursor local for
 select s='kill '+cast(spid as varchar)
 from master..sysprocesses
 where dbid=db_id(@dbname)
 
 open tb
 fetch next from tb into @s
 while @@fetch_status=0
 begin
 exec(@s)
 fetch next from tb into @s
 end
 close tb
 deallocate tb
go

use   master
go
 
exec p_killspid 'DBServer'

RESTORE DATABASE DBServer
   FROM DISK = 'c:\DBServer.bak'
go

再实际应用的vc++或其他平台里面 还原数据库 注意两方面:
1 在还原前 连接的数据库 应该是 master   
   use master语句  是无效的 必须用自己写的OnInitADOConn() 来连接数据库
   一般函数里面 都在连接某个数据库的基础上OnInitADOConn() 执行SQL函数语句
   所以还应该创建一个OnInitADOConnMaster() 连接数据库函数 来专门用来给还原数据库时候使用
2 并且 不能在 string 里面不能含有 go 语句
  可以分开 执行多次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值