[转]MS SQL数据库备份和恢复存储过程

使用了以下部分代码和启示实现了自己的需求,特此记下这段代码:

if exists(
 select * from sysobjects
  where name=‘pr_backup_db‘ and xtype=‘p‘
 )
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 ‘[email protected]_db_name+‘ to [email protected] with init‘
execute sp_executesql @sql,@par,@filename
select @flag=‘ok‘
go

if exists(
 select * from sysobjects
  where name=‘fn_GetFilePath‘ and xtype=‘fn‘
 )
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‘
 )
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 ‘[email protected]
 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(
     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=‘‘‘[email protected]+‘‘‘‘)
 /*将临时表导入表变量中,并且计算出相应得路径*/
 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<[email protected]_ids
 begin
  select @file_bak_path=file_path
   from @tem where [email protected]_time
  select @sql_cmd=‘dir ‘[email protected]_bak_path
  EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
  /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
  IF (@proc_result<>0)
   select @[email protected]_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 @[email protected]_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 [email protected] with ‘
 select @[email protected][email protected]_sub+‘replace‘
 select @par=‘@db_name nvarchar(128),@filename nvarchar(260)‘
 print @sql
 execute sp_executesql @sql,@par,@[email protected]_db_name,@[email protected]
 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

时间: 2024-10-04 09:56:46

[转]MS SQL数据库备份和恢复存储过程的相关文章

SQL 数据库备份和恢复 镜像配置(证书方式)

最近公司在进行数据库容灾和备份上的工作,记录关于镜像配置的总结 步骤一:备份和恢复数据库 -- 以完整和事务日志备份主数据库 -- 从服务器上先后还原完整备份和事务日志备份,注意选择不对数据库执行任何操作(WITH NORECOVERY) 步骤二:主服务器A配置证书 -- 创建主密钥 CREATE master KEY ENCRYPTION BY password = 'PASSWORDA' ; GO -- 创建证书 CREATE CERTIFICATE Cert_A WITH subject

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及版 [数据库版本]:MS SQL server 2000  [数据库大小]:1GB X 6  (3个账套 总共6个年度). [问题描述]:由于服务器中毒或卡顿,客户将服务器电脑送到 装机店 重做操作系统.未详细告知电脑用途,导致整个硬盘被维修店技术员 全盘格式化重新分区,并且重新做好了新的操作系统,

使用exp&amp;imp工具进行数据库备份及恢复

使用exp&imp工具进行数据库备份及恢复1.exp/imp使用方法介绍exp/imp为一种数据库备份恢复工具,也可以作为不同数据库之间传递数据的工具,两个数据库所在的操作系统可以不同.exp可以将数据库数据导出为二进制文件,imp可以将导出的数据文件再导入到相同的数据库或不同的数据库.数据库导出有四种模式:full(全库导出).owner(用户导出).table(表导出).tablespace(表空间导出).full(全库导出):导出除ORDSYS.MDSYS.CTXSYS.ORDPLUGIN

Oracle基础 数据库备份和恢复

原文:Oracle基础 数据库备份和恢复 一.为什么需要数据备份 造成数据丢失的主要原因: 1.介质故障. 2.用户的错误操作. 3.服务器的彻底崩溃. 4.计算机病毒. 5.不可预料的因素. Oracle中故障类型分为以下4种. 1.语句故障: 执行SQL语句过程发生的逻辑故障可导致语句故障.如果用户编写的SQL语句无效,就会发生语句故障.Oracle可自我修复语句故障,撤销语句产生的而印象,并将控制权交给应用程序. 2.用户进程故障 当用户程序出错而无法访问Oracle数据库时,就会发生用户

304444数据库备份和恢复

第13章  数据库备份与恢复 •    13.1 备份和恢复 •    13.2 完整数据库备份与恢复 •    13.3差异数据库备份与恢复 •    13.4 事务日志备份与恢复 •    13.5 一种备份案例 13.1.1 备份和恢复的概念 Ø 前面两章分别介绍了通过数据的完整性控制和安全性控制来保证数据的安全,但这种安全是相对的.不但数据库管理系统软件本身可能会出现问题,而且作为硬件支撑的计算机也有可能出现不可修复的故障,还有自然灾害等不可抗拒的客观因素,这些都有可能造成数据的损坏或丢

MySQL数据库备份和恢复

目录 MySQL数据库备份和恢复 备份恢复概述 为什么要备份 备份注意要点 还原要点 备份类型: 备份时需要考虑的因素 备份什么 备份工具 冷备份 cp tar mysqldump备份工具 模拟数据库崩溃,最大限度还原数据 mysqldump的分库备份 mysqldump的MyISAM存储引擎相关的备份选项: mysqldump的InnoDB存储引擎相关的备份选项: 生产环境实战备份策略 将误删除了的某个表进行还原 MySQL数据库备份和恢复 备份恢复概述 为什么要备份 灾难恢复:硬件故障.软件

案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表

Oracle数据库在没有备份情况下在对表中的某数据表进行truncate删除后,通过oracle dul进行非常规恢复 1.准备oracle dul测试环境 SQL> select count(*) from t_xifenfei; COUNT(*) ---------- 67854 SQL> desc t_xifenfei Name Null? Type ----------------------------------------- -------- ------------------

c#、sql数据库备份还原

1.在项目中添加SQLDmo dll文件引用(SQLDMO(SQL Distributed Management Objects,SQL分布式管理对象)) 2在相应页面加using SQLDMO引用 3.下面是用C#语言书写的用于Microsoft SQL Server数据库备份和恢复的类:using System; namespace DbService { /// <summary> /// DbOper类,主要实现对Microsoft SQL Server数据库的备份和恢复 /// &l

Oracle数据库备份和恢复的基本命令

Oracle数据库备份与恢复基本命令 1. 获取帮助 $ exp help=y $ imp help=y 2.三种工作方式 (1)交互式方式 $ exp 然后按提示输入所需要的参数 (2)命令行方式 $ exp user/[email protected] file=/oracle/test.dmp full=y 命令行中输入所需的参数 (3)Oracle数据库备份与恢复中我们要走涉及到参数文件方式 $ exp parfile=username.par 在参数文件中输入所需的参数 参数文件 us