2011-05-23 29 views
11

में किसी विशिष्ट डेटाबेस के लिए सबसे हालिया पूर्ण बैकअप फ़ाइल प्राप्त करने के लिए एसक्यूएल मुझे एक एसक्यूएल कमांड (डीबीसीसी या विस्तारित संग्रहीत प्रक्रिया?) की आवश्यकता है या कुछ ऐसा जो एसक्यूएल सर्वर संग्रहीत प्रक्रिया से सबसे हालिया पूर्ण बैकअप प्राप्त करने के लिए कहा जा सकता है एक विशिष्ट डेटाबेस के लिए फ़ाइल उपलब्ध है। बैकअप फ़ाइल का नाम एक वर्चर वेरिएबल में रखा जाएगा जिसे मैं संग्रहित प्रक्रिया में रीस्टोर डेटाबेस कमांड के साथ उपयोग कर सकता हूं। इस प्रक्रिया का उपयोग उत्पादन डेटाबेस से सैंडबॉक्स/प्रशिक्षण डेटाबेस में बहाल करने के लिए किया जाएगा, इसलिए पुनर्स्थापना पूर्ण होने के बाद मुझे चलना जारी रखने की प्रक्रिया की आवश्यकता है ताकि मैं डीबी में कुछ संशोधन कर सकूं।एसक्यूएल एसक्यूएल सर्वर

+0

प्रोड सर्वर पर चलाएं? – gbn

उत्तर

11

"स्रोत" prod सर्वर पर बस क्वेरी msdb..backupset (MSDN)

और एक working example (SQL Rockstar) भी

संपादित करें, 2018

SELECT 
    bs.database_name, 
    bs.backup_start_date, 
    bmf.physical_device_name 
FROM 
    msdb.dbo.backupmediafamily bmf 
    JOIN 
    msdb.dbo.backupset bs ON bs.media_set_id = bmf.media_set_id 
WHERE 
    bs.database_name = 'MyDB' 
ORDER BY 
    bmf.media_set_id DESC; 
+1

मीठे, मुझे इस क्वेरी से जो चाहिए वह प्राप्त करने में सक्षम होना चाहिए: 'msdb..backupset से शीर्ष 1 नाम का चयन करें जहां नाम' tmsePrd_b% 'और टाइप =' डी 'ऑर्डर नाम से' –

+0

ग्रेट अंतर्दृष्टि - धन्यवाद! –

10

मैं एक आसान स्क्रिप्ट है कि मैं का उपयोग करें जब मैं हाल ही में बहाल है निर्देशिका से उस डेटाबेस तक बैकअप जिसे आप पुनर्स्थापित करना चाहते हैं। रात्रि नौकरी का उपयोग करके देव या टेस्ट बॉक्स को ताज़ा करने के लिए यह बहुत अच्छा है!

/****************************************************** 
Script: looks at the backup directory and restores the 
    most recent backup (bak) file 
    You will have to modify the code 
    to match your database names and paths. 
    DO NOT USE IN PRODUCTION. It kicks all users off! 

Created By: 
    Michael F. Berry 
Create Date: 
    1/15/2014 
******************************************************/ 


--get the last backup file name and path 

Declare @FileName varChar(255) 
Declare @cmdText varChar(255) 
Declare @BKFolder varchar(255) 

set @FileName = null 
set @cmdText = null 
set @BKFolder = '\\MyBackupStorageShare\server\FULL\' 


create table #FileList (
FileName varchar(255), 
DepthFlag int, 
FileFlag int 
) 


--get all the files and folders in the backup folder and put them in temporary table 
insert into #FileList exec xp_dirtree @BKFolder,0,1 
--select * from #filelist 

--get the latest backup file name 
select top 1 @FileName = @BKFolder + FileName from #FileList where Filename like '%.bak' order by filename desc 
select @filename 


--kick off current users/processes 
ALTER DATABASE DBName 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 


--execute the restore 
exec(' 
RESTORE DATABASE [DBNAME] FROM DISK = ''' + @filename + ''' 
WITH MOVE N''DBName_Data'' TO N''E:\SQLData\DBName.mdf'', MOVE N''DBName_Log'' TO N''E:\SQLLogs\DBName_log.ldf'', NOUNLOAD, REPLACE, STATS = 10') 


--Let people/processes back in! 
ALTER DATABASE DBName 
SET MULTI_USER WITH ROLLBACK IMMEDIATE; 
go 
1
declare @backupfile as Varchar(255) 

SELECT TOP 1 @backupfile=mf.physical_device_name from msdb..backupset bk  
join msdb..backupmediafamily mf on bk.media_set_id = mf.media_set_id 
where database_name=N'sourcedatabasename' and bk.type='D' order by 
backup_set_id desc 

ALTER DATABASE [databasename] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

RESTORE DATABASE databasename 
FROM DISK = @backupfile 
WITH MOVE 'datafile' TO 'databasefilepath', 
MOVE 'logfilename' TO 'logfilepath', REPLACE 

ALTER DATABASE [databasename] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
0

बस user2378139 से उत्कृष्ट जवाब देने के लिए एक अतिरिक्त देना चाहता था। मुझे अक्सर 1 फ़ोल्डर से एकाधिक डेटाबेस पुनर्स्थापित करने की आवश्यकता होती है, और उस फ़ोल्डर में प्रत्येक डेटाबेस के लिए कई बैकअप प्रतियां होंगी। मुझे सबसे हालिया प्राप्त करने की आवश्यकता है, और इसे निर्धारित समय पर चलाएं। ऐसा करने के लिए नीचे मेरा संपादन/अपडेट है। मुझे पसंद करने की तुलना में अधिक अस्थायी टेबल हैं, लेकिन अभी तक इसे करने का बेहतर तरीका नहीं मिला है:

IF OBJECT_ID('tempdb..#TemperedFileList') IS NOT NULL DROP TABLE #TemperedFileList 
GO 
Declare @FileName varChar(255) 
Declare @cmdText varChar(255) 
Declare @BKFolder varchar(255) 
Declare @DBFolder varchar(255) 

set @FileName = null 
set @BKFolder = 'E:\SQLBackupFolder\' 
set @DBFolder = 'C:\Program Files\Microsoft SQL Server\MSSQL13.COBRASERVER\MSSQL\DATA\' 

declare @FileList table (FileName varchar(255), DepthFlag int, FileFlag int) 
--get all the files and folders in the backup folder and put them in temporary table 
insert into @FileList exec xp_dirtree @BKFolder,0,1 

create table #TemperedFileList (FileName varchar(255),DBName varchar(255)) 
insert into #TemperedFileList (FileName,DBName) select FileName, SUBSTRING(FileName,0,CHARINDEX('_',FileName)) from @FileList WHERE Filename like '%.bak' 

declare @RowCnt int 
declare @MaxRows int 
declare @tmpFileName varchar(255) 
declare @tmpDBName varchar(255) 
declare @sql nvarchar(3000) 

select @RowCnt = 1 

declare @Import table (rownum int IDENTITY (1, 1) Primary key NOT NULL , FileName varchar(255),DBName varchar(255)) 
insert into @Import (FileName,DBName) SELECT FileName,DBName FROM (SELECT FileName,DBName,rank() over (partition by DBName order by FileName desc) r FROM #TemperedFileList) ilv where r=1 

select @MaxRows=count(*) from @Import 
while @RowCnt <= @MaxRows 
begin 
    select @tmpFileName=FileName from @Import where rownum = @RowCnt 
    select @tmpDBName=DBName from @Import where rownum = @RowCnt 

    set @sql ='ALTER DATABASE ' + @tmpDBName + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE' 
    print @sql 
    exec(@sql) 

    set @sql ='RESTORE DATABASE [' + @tmpDBName + '] FROM DISK=''' + @BKFolder + @tmpFileName + ''' with FILE=1, MOVE N''' + @tmpDBName + ''' TO N''' + @DBFolder + @tmpDBName + '.mdf'', MOVE N''' + @tmpDBName + '_Log'' TO N''' + @DBFolder + @tmpDBName + '_log.ldf'', NOUNLOAD, REPLACE, STATS = 10' 
    print @sql 
    exec(@sql) 

    set @sql ='ALTER DATABASE ' + @tmpDBName + ' SET MULTI_USER WITH ROLLBACK IMMEDIATE' 
    print @sql 
    exec(@sql) 

    Set @RowCnt = @RowCnt + 1 
end 
संबंधित मुद्दे