SQL语句备份及还原

本文提供了SQL Server数据库的备份和还原的SQL脚本。包括创建存储过程sp_BackupDB用于备份数据库,以及sp_RestoreDB用于还原数据库。在备份过程中,可以指定保存路径和数据库名称;在还原时,可以选择新的数据库名称,并处理还原前后连接的关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   /* 备份 设置备份路径*/
   backup database Test to disk='D:/Test.bak'
  /*******************************************************
      备份数据库
 *******************************************************/
  if exists(select 1 from sys.procedures where name='sp_BackupDB')
      drop procedure sp_BackupDB
  go
  create procedure sp_BackupDB
      @savePath nvarchar(4000) -- 备份数据库保存位置(目录)   
      ,@dbName nvarchar(4000) -- 需要进行备份的数据库
     ,@bakName nvarchar(4000) -- 备份文件的名称(不含扩展名)
 as begin
     declare @sql nvarchar(4000)
     /* 验证路径 */
     if(charindex('/',reverse(@savePath))!=1) begin
         set @savePath=@savePath+'/'
     end
     /* 拼SQL并执行 */
     set @sql='backup database '+@dbName+' to disk='''+@savePath+@bakName+'.bak'''
     exec sp_executesql @sql
     
     /* 返回执行结果(1=成功,0=失败) */
     if(@@error=0) begin
         return 1
     end
     return 0

 end

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  /* 还原 *设置备份路径/
  restore database Test from disk='D:/Test.bak' 
  /*******************************************************
      还原数据库
  *******************************************************/
  if exists(select 1 from sys.procedures where name='sp_RestoreDB')
      drop procedure sp_RestoreDB
  go
  create procedure sp_RestoreDB
      /* 数据库还原后的保存位置(目录)(使用系统默认保存位置:-1) */
      @savePath nvarchar(4000)
     ,@backFile nvarchar(4000) -- 需要还原的数据库备份文件
     ,@defaultName nvarchar(4000) -- 数据库原始名称(备份的原数据库名称)不包含扩展名
     /* 为数据库重命名(使用数据库默认名称:-1)不包含扩展名
         如果目录已存在该名称的数据库,将会被覆盖 */
     ,@dbName nvarchar(4000)
 as begin
     declare @newName nvarchar(4000),@sql nvarchar(4000)
     /* 获取数据库名称 */
     if(@dbName='-1') begin
         set @newName=@defaultName
     end else begin
         set @newName=@dbName
     end
     /* 结束所有对当前数据库的连接 */
     if exists(select 1 from sys.sysprocesses where dbid=db_id(@defaultName)) begin
         declare #cs_spid cursor -- 声明游标
         for
         select #cs_spid=convert(varchar,spid) from sys.sysprocesses where dbid=db_id(@defaultName)
         open #cs_spid
             declare @spid varchar(20)
             fetch next from #cs_spid into @spid -- 赋值并前进到下一条
             while(@@fetch_status=0) begin -- 在fetch失败前执行
                 exec ('kill '+@spid) -- 结束对操作库的连接(exec执行SQL语句1)
                 fetch next from #cs_spid into @spid
             end
         close #cs_spid
         deallocate #cs_spid -- 释放游标
     end
     /* 创建执行语句   */
     set @sql='restore database '+@newName+' from disk='''+@backFile+''' with replace'
     if(@savePath!='-1') begin
         -- 验证路径
         if(charindex('/',reverse(@savePath))!=1) begin
             set @savePath=@savePath+'/'
         end
         set @sql=@sql+', move '''+@defaultName+''' to '''+@savePath+@newName+'.mdf'''
         set @sql=@sql+', move '''+@defaultName+'_log'' to '''+@savePath+@newName+'_log.ldf'''
     end
     /* 执行操作 */
     exec sp_executesql @sql -- (exec执行SQL语句2)
     /* 返回执行结果(1=成功,0=失败) */
     if(@@error=0) begin
         return 1
     end
     return 0
 end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值