1. 程式人生 > 其它 >SQL語句備份和還原資料庫

SQL語句備份和還原資料庫

1.使用SQL最簡單備份,還原資料庫

/* 備份 */
backup database Test to disk='D:/Test.bak'
/* 還原 */
restore database Test from disk='D:/Test.bak'

2.為了方便以後的使用,開始對語句進行簡單的封裝->儲存過程

/*******************************************************
     備份資料庫
 *******************************************************/
 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
/*******************************************************
     還原資料庫
*******************************************************/
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