SqlServer2000中利用備份檔案建立資料庫

2021-04-01 09:20:17 字數 4095 閱讀 4521

最近在寫乙個類是財務系統中套帳的系統。每年或者每月的的資料儲存在不同的資料庫中,以方便備份,也防止了歷史資料膨脹。雖然儲存的資料不同但格式都是一樣。資料庫中的物件都是相同的。下面就是該系統中的乙個儲存過程。此過程中對錯誤處理不夠詳細,望有看法有想法的朋友給予指出。

我所理解的資料庫恢復,其實就是使用備份檔案重新建立資料庫的過程。

/***********功能:使用備份檔案建立資料******************************/

create  procedure p_createdb

@bakfilepath varchar(200)= null,--例如d:/***/的格式

@bakfilename varchar(30)=null,--備份檔案的名字

@dbname varchar(20)=null,---要建立資料庫的名字

@dbpath varchar(200)=null--例如:d:/test/

asdeclare @sql varchar(1000),@bakfilefullpath varchar(250),@ip varchar(20)

declare @basedbpath varchar(100),@i int --儲存基本資料庫中反向的'/'的位置

set concat_null_yields_null off

-------------------獲得新資料的路徑-------------------

if (@dbpath is null)  

begin

if exists(select * from master..sysdatabases where name='schlbasicdb') --獲取基本資料庫的路徑

select @basedbpath=filename from master..sysdatabases where name='schlbasicdb'

else

select @basedbpath=filename from master..sysdatabases where name='master'

set @i=charindex('/',reverse(@basedbpath))-1

set @basedbpath=substring(@basedbpath,1,len(@basedbpath)-@i) --獲取基本資料庫的路徑

endelse

set @basedbpath=@dbpath

------------------獲取備份檔案的完整網路路徑(路徑+檔名)當然伺服器要有操作備份檔案所在機器的許可權----------------

set @ip=host_name()  

set @bakfilepath=replace(@bakfilepath,':','$');

set @bakfilepath='//'+@ip+'/'+@bakfilepath;

set @bakfilefullpath=@bakfilepath+@bakfilename;

------------------建立臨時表儲存備份檔案的檔案列表資訊--------------------------------------

-----載至http://dev.csdn.***/article/28/28463.shtm ---------------------------------------

-----sql server2000資料庫備份和恢復儲存過程(加強版本)--選擇自 aierong 的 blog ---------------

create table #tmp(

fileid int identity(1,1),/*自增型,將來用來作為檔名的一部分*/

logicalname nvarchar(128), /*檔案的邏輯名稱*/

physicalname nvarchar(260) , /*檔案的物理名稱或作業系統名稱*/

type char(1),  /*資料檔案 (d) 或日誌檔案 (l)*/

filegroupname nvarchar(128), /*包含檔案的檔案組名稱*/

[size] numeric(20,0),  /*當前大小(以位元組為單位)*/

[maxsize] numeric(20,0)  /*允許的最大大小(以位元組為單位)*/

)insert into #tmp(logicalname,physicalname,type,filegroupname,[size],[maxsize])

exec('restore filelistonly  from disk='''+@bakfilefullpath+'''')

-------從tmp中獲取自己所要的資料

select fileid,logicalname,type into #tmp2 from #tmp

------------宣告游標,對獲取的資料作迴圈處理----------------------------

declare @logicalname sysname,@type varchar(10),@fileid  varchar(10)

declare cur_bakupfile cursor

forselect fileid,logicalname,type from #tmp2 

---------此時用@i來儲存要還原的資料庫的資料檔案的個數,如過是第乙個檔案即*.mdf,----------------------

---------因為主檔案是乙個資料庫的起點所以最好不要亂字尾改名-----------------------------------------

set @i=0

set @sql=' use master restore database '+@dbname+' from disk ='''+@bakfilefullpath+''''+' with '

---------開啟游標--------------------

open cur_bakupfile

fetch next from cur_bakupfile into @fileid,@logicalname,@type

while (@@fetch_status=0)

begin

if (upper(@type)='d')

begin

if (@i=0)

begin

set @sql=@sql+' move '''+@logicalname+''' to '''+@basedbpath+@dbname+'.mdf'',';

set @i=@i+1;

endelse

begin

set @sql=@sql+' move '''+@logicalname+''' to '''+@basedbpath+@dbname+@fileid+'_data.ndf'','            

endend

else if(upper(@type)='l')

begin

set @sql=@sql+' move '''+@logicalname+''' to '''+@basedbpath+@dbname+@fileid+'_log.ldf'','

end;

fetch next from cur_bakupfile into @fileid,@logicalname,@type

end 

deallocate cur_bakupfile

------replace,強制替換資料庫檔案,具體看sql幫助了----------------------------------

set @sql=@sql+' replace'    

set concat_null_yields_null on

--print @sql

exec(@sql)

if (@@error=0)

return 100

else

return -100

----以下是測試,各位朋友注意檔案路徑中不要少了'/',例如:將'e:/test/' 寫成'e:/test'了,

---其實不難為大家,只是拋磚引玉而已

p_createdb 'e:/','testtest2.bak','test','e:/test/'

言語不準確之處,望各位網友指出,謝謝!

SQLSERVER2000技術規格

sqlserver2000技術規格 系統技術規格 每個伺服器最多可以允許16個sqlserver例項 每個例項可擁有 2147483467 個鎖 資料庫技術規格 sqlserver的資料庫大小1048516tb 每個資料庫可擁有的檔案組數32767 每個資料庫可擁有的檔案組數256 檔案大小 資料檔...

SQLSERVER2000啟動失敗

服務管理器中啟動sqlserver服務 彈出視窗的錯誤資訊是 本地計算機上的mssqlserver服務啟動後又停止了。一些服務自動停止,如果它們沒有什麼可做的,例如 效能日誌和警報 服務 1 解決方法 調整系統時間到你上一次能夠正常啟動的時間,啟動sqlserver服務,成功後,然後再把時間調回來。...

SQLSERVER2000技術規格

quote 系統技術規格 每個伺服器最多可以允許16個sqlserver例項 每個例項可擁有 2147483467 個鎖 資料庫技術規格 sqlserver的資料庫大小1048516tb 每個資料庫可擁有的檔案組數32767 每個資料庫可擁有的檔案組數256 檔案大小 資料檔案 32tb 夠大了吧,...