SQLServer 2000 数据库备份还原存储过程

SQLServer 2000 数据库备份还原存储过程:

 

-- 这个存储过程是在网上找到的,并非原创。

if   exists ( select   *   from  sysobjects  where  type = ' p '   and  name = ' usp_backup ' )
 
drop   proc  usp_backup
go
create   proc  usp_backup
 
@flag   int  out,
 
@backup_db_name   varchar ( 128 ),    
 
@filename   varchar ( 1000 /*路径+文件名字*/
as
 
declare   @sql   nvarchar ( 4000 ), @par   nvarchar ( 1000 )
 
if   not   exists select   *   from  master..sysdatabases  where  name = @backup_db_name )
 
begin
  
set   @flag = 0     /*数据库不存在*/
  
return
 
end
 
else
 
begin
  
if   right ( @filename , 1 ) <> ' '   and   charindex ( ' ' , @filename ) <> 0
  
begin
   
set   @par = ' @filename varchar(1000) '
   
set   @sql = ' BACKUP DATABASE  ' + @backup_db_name + '  to disk=@filename with init '
   
execute  sp_executesql  @sql , @par , @filename
   
set   @flag = 1
   
return
  
end
  
else
  
begin
   
set   @flag = 0    /*参数@filename输入格式错误*/
   
return
  
end
 
end
go

if   exists ( select   *   from  sysobjects  where  type = ' fn '   and  name = ' fn_GetFilePath ' )
 
drop   function  fn_GetFilePath
go
create   function  fn_GetFilePath( @filename   nvarchar ( 260 ))
 
returns   nvarchar ( 260
as
begin
 
declare   @file_path   nvarchar ( 260 ), @filename_reverse   nvarchar ( 260 )
 
set   @filename_reverse = reverse ( @filename )
 
set   @file_path = substring ( @filename , 1 , len ( @filename ) + 1 - charindex ( ' ' , @filename_reverse ))
 
return   @file_path
end
go

if   exists ( select   *   from  sysobjects  where  type = ' p '   and  name = ' usp_restore ' )
 
drop   proc  usp_restore
go
CREATE    proc  usp_restore
 
@flag   int  out,  /*过程运行的状态标志,是输入参数*/
 
@restore_db_name   nvarchar ( 128 ),   /*要恢复的数据名字*/
 
@filename   nvarchar ( 260 /*备份文件存放的路径+备份文件名字*/
as
 
declare   @proc_result   tinyint /*返回系统存储过程xp_cmdshell运行结果*/
   
@loop_time   smallint /*循环次数*/
   
@max_ids   smallint /*@tem表的ids列最大数*/
   
@file_bak_path   nvarchar ( 260 ),  /*原数据库存放路径*/
   
@flag_file   bit /*文件存放标志*/
   
@master_path   nvarchar ( 260 ),  /*数据库master文件路径*/
   
@sql   nvarchar ( 4000 ),
   
@par   nvarchar ( 1000 ),
   
@sql_sub   nvarchar ( 4000 ),
   
@sql_cmd   nvarchar ( 100 ),
   
@sql_kill   nvarchar ( 100 )
 
/*判断参数@filename文件格式合法性,以防止用户输入类似d: 或者 c:a 等非法文件名参数@filename里面必须有''并且不以''结尾*/
 
if   right ( @filename , 1 ) <> ' '   and   charindex ( ' ' , @filename ) <> 0
 
begin
  
set   @sql_cmd = ' dir  ' + @filename
  
EXEC   @proc_result   =  master..xp_cmdshell  @sql_cmd ,no_output
  
IF  ( @proc_result <> 0 /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
  
begin
   
set   @flag = 0     /*备份文件不存在*/
   
return   /*退出过程*/
  
end
  
create   table  #tem   /*创建临时表,保存由备份集内包含的数据库和日志文件列表组成的结果集*/
  (
   LogicalName 
nvarchar ( 128 ),  /*文件的逻辑名称*/  
   PhysicalName 
nvarchar ( 260 ),  /*文件的物理名称或操作系统名称*/
   Type 
char ( 1 ),  /*数据文件 (D) 或日志文件 (L)*/
   FileGroupName 
nvarchar ( 128 ),  /*包含文件的文件组名称*/
   
[ Size ]  numeric( 20 , 0 ),  /*当前大小(以字节为单位)*/
   
[ MaxSize ]  numeric( 20 , 0 /*允许的最大大小(以字节为单位)*/
  )
  
/*创建表变量,表结构与临时表基本一样就是多了两列,列ids(自增编号列),列file_path,存放文件的路径*/
  
declare   @tem   table
  (
   ids 
smallint   identity /*自增编号列*/
   LogicalName 
nvarchar ( 128 ),
   PhysicalName 
nvarchar ( 260 ),
   File_path 
nvarchar ( 260 ),
   Type 
char ( 1 ),
   FileGroupName 
nvarchar ( 128 )
  )
  
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
  
set   @loop_time = 1
  
select   @max_ids = max (ids)  from   @tem   /*@tem表的ids列最大数*/
  
while   @loop_time <= @max_ids
  
begin
   
select   @file_bak_path = file_path  from   @tem   where  ids = @loop_time
   
set   @sql_cmd = ' dir  ' + @file_bak_path
   
EXEC   @proc_result   =  master..xp_cmdshell  @sql_cmd ,no_output
   
IF  ( @proc_result <> 0 /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
    
set   @loop_time = @loop_time + 1   
   
else
    
BREAK   /*没有找到备份前数据文件原有存放路径,退出循环*/
  
end
  
set   @master_path = ''
  
if   @loop_time > @max_ids  
   
set   @flag_file = 1     /*备份前数据文件原有存放路径存在*/
  
else
  
begin
   
set   @flag_file = 0    /*备份前数据文件原有存放路径不存在*/
   
select   @master_path = dbo.fn_GetFilePath(filename)  from  master..sysdatabases  where  name = ' master '
  
end
  
/*@flag_file=1时新的数据库文件还是存放在原来路径,否则存放路径和master数据库路径一样*/
  
set   @sql_sub = ''
  
select   @sql_sub = @sql_sub + ' move  ''' + LogicalName + '''  to  '''  
  
+ case  type   /*type='d'是数据文件,type='l'是日志文件 */
   
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
    
+ ' _DATA '
    
+ convert (sysname,ids)  /*给文件编号*/  
    
+ ' . '
    
+ right (PhysicalName, 3 )   /*给文件加入后缀名,mdf or ndf*/  
    
+ ''' , '   
   
when   ' l '   then   @restore_db_name
    
+ ' _LOG '
    
+ convert (sysname,ids)   
    
+ ' . '
    
+ right (PhysicalName, 3 )  
    
+ ''' , '   
  
end
  
from   @tem
  
set   @sql = ' RESTORE DATABASE @db_name  ' + ' FROM DISK=@filename with  '
  
set   @sql = @sql + @sql_sub + ' replace '
  
set   @par = ' @db_name nvarchar(128),@filename nvarchar(260) '
  
/*关闭相关进程,把相应进程状况导入临时表中*/
  
select   identity ( int , 1 , 1 ) ids, spid  into  # temp   from  master..sysprocesses  where  dbid = db_id ( @restore_db_name )
  
if   @@rowcount > 0    /*找到相应进程*/
  
begin    
   
select   @max_ids = max (ids)  from  # temp
   
set   @loop_time = 1
   
while   @loop_time <= @max_ids
   
begin
    
select   @sql_kill = ' kill  ' + convert ( nvarchar ( 20 ),spid)  from  # temp   where  ids = @loop_time
    
execute  sp_executesql  @sql_kill
    
set   @loop_time = @loop_time + 1  
   
end
  
end  
  
drop   table  # temp
  
execute  sp_executesql  @sql , @par , @db_name = @restore_db_name , @filename = @filename
  
set   @flag = 1    /*操作成功*/
 
end
 
else
 
begin
 
set   @flag = 0    /*参数@filename输入格式错误*/
 
end
GO

 

再加上一个远程备份的:

CREATE   procedure   usp_copy   
  
as    
  begin   
      declare   @filename     nvarchar(
200 )   
      declare   @eloname     nvarchar(
200 )   
      declare   @data   datetime   
      declare   @lastday   varchar(
100 )   
      
-- 建立映射   
      exec   master..xp_cmdshell 
' net   use   z:   /192.168.1.2   "*"   /user:192.168.1.2administrator '    
      
-- 设备异地文件夹路径   
      
set        @filename = ' Z:esysdb ' + convert( char ( 8 ),getdate(), 112 ) +    convert(varchar( 2 ),getdate(), 108 ) + ' .bak '    
      print   
' esys备份完成 '    
      
set        @eloname = ' Z:elogisdb ' + convert( char ( 8 ),getdate(), 112 ) +    convert(varchar( 2 ),getdate(), 108 ) + ' .bak '    
        print   
' elogisdb备份完成 '      
      select   @filename   
      
-- 备份开始   
      BACKUP       DATABASE       [sanshu_pf]       TO       DISK       
=        @filename       WITH       NOINIT       ,       NOUNLOAD       ,       NAME        =        N ' addin       备份 ' ,       NOSKIP       ,       STATS        =         10 ,       NOFORMAT       
      BACKUP       DATABASE       [sanshu_pf]       TO       DISK       
=        @eloname       WITH       NOINIT       ,       NOUNLOAD       ,       NAME        =        N ' addin       备份 ' ,       NOSKIP       ,       STATS        =         10 ,       NOFORMAT           
  
-- 删除前六天备份数据库   
      
set    @lastday    =     ' del     z:* ' +    convert( char ( 8 ),getdate() - 6 , 112 ) + ' *.*     /f '    
      exec   master..xp_cmdshell     @lastday   
        
-- 删除映射       
      exec   master..xp_cmdshell   
' net   use   z:   /delete '    
    
  end   
    
    
  GO   

下面是DOS命令NET USE的帮助:

/*

NET USE
[devicename | *] [//computername/sharename[/volume] [password | *]]
        [/USER:[domainname/]username]
        [/USER:[dotted domain name/]username]
        [/USER:[username@dotted domain name]
        [/SMARTCARD]
        [/SAVECRED]
        [[/DELETE] | [/PERSISTENT:{YES | NO}]]


  DeviceName:指派名称以便连接到资源或指定断开的设备。有两种类型的设备名: 磁盘驱动器号(即 D: 到 Z:} 和打印机(即 LPT1:到 LPT3:}。如果键入星号而不是特定设备名,则系统会指派下一个可用的设备名。这个名称以后可以作为访问共享资源的名称进行引用。

  //computername:指控制共享资源的计算机的名字。如果计算机名中包含有空字符,就要将双反斜线 (//) 和计算机名一起用引号 (" ")括起来。计算机名可以有1 到 15 个 字符。/volume :指定一个服务器上的NetWare卷。用户必须安装 Netware 的客户服务 (Windows 工作站) 或者 Netware 的网关服务(Windows 服务器) 并使之与 NetWare 服务器相连。

  Password:指定访问共享资源所需的密码。输入星号 (*) 产生一个密码提示在密码提示行处键入密码时不显示密码。

  /user:在其后指定建立连接时使用的不同于目前登录用户的用户名。

  DomainName:指定不同于目前登录域的其他域。如果省略则net use使用当前登录的域。

  注意,/user:后的登录用户和域可以有三种不同的表示形式,分别为domainname/username,dotted domain name/username和username@dotted domain name,其中dotted domain name提指域名的全称,如office.yesky.com,也即域名加域后缀的完全形式。

  /SAVECRED:指定保留用户名和密码。除非命令提示输入用户名和密码。否则此开关被忽略,

  /SMARTCARD:指定连接使用在智能卡上的凭据。

  /delete:取消指定的网络连接。如果使用星号 (*) 指定连接,则所有网络连接均将取消。

  /persistent:{yes | no}:控制持久网络连接的使用。默认值为最后一次使用的设置。非设备连接不会持久。Yes 将按其建立时的原样保存所有连接,并在下次登录时还原它们。No 则不保存已建立的连接或后续连接。现存的连接在下一次登录时还原。使用 /delete 删除持久连接。

  Net use命令还有另两种使用格式,分别如下:

  NET USE {devicename | *} [password | *] /HOME

  NET USE [/PERSISTENT:{YES | NO}]

  其中第一种命令格式将用户连到其域的主目录并将主目录映射为设备名DeviceName。后一种格式用来修改持久连接的使用。

  下面是两个例子:

  要连接用户标识符 Dan 就好像是通过 Accounts 域创建的连接:

  net use d://server/share /user:Accounts/Dan

  要断开 //Financial/Public 目录:

  net use f://financial/public /delete

*/
   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值