2012-02-22 15 views
12

मुझे प्रोग्राम करने की आवश्यकता है (टी-एसक्यूएल) SQL सर्वर 2008 में डेटाबेस बैकअप को पुनर्स्थापित करें। यह बैकअप एक अलग सर्वर से आता है और मूल डेटाबेस नाम भी भिन्न हो सकता है। (असल में, मैं किसी सर्वर से किसी अन्य सर्वर पर किसी डेटाबेस से डेटाबेस की प्रतिलिपि बना रहा हूं।)गंतव्य पथ या फ़ाइल नाम जानने के बिना SQL सर्वर डेटाबेस बैकअप को पुनर्स्थापित कैसे करें?

जाहिर है, मुझे RESTORE DATABASE ... WITH MOVE का उपयोग करना है, जो काम करता है, लेकिन मुझे यह जानना होगा कि फ़ाइलों को कहां बहाल किया जाना चाहिए और उन्हें कैसे नामित किया जाना चाहिए। खोज के बावजूद, मुझे नहीं मिला कि सबसे बुनियादी कार्य क्या प्रतीत होता है: केवल डिफ़ॉल्ट पथ और फ़ाइल नामों का उपयोग करें, यानी, जब आप CREATE DATABASE जारी करते हैं तो SQL सर्वर जो भी करता है - आपको पथ निर्दिष्ट करने की आवश्यकता नहीं है वह आदेश, तो RESTORE के लिए इसकी आवश्यकता क्यों है?

क्या मैंने कुछ मामूली समाधान को अनदेखा किया है, या क्या मुझे वास्तव में फ़ाइलों को सूचीबद्ध करना होगा, किसी भी तरह से SQL सर्वर कॉन्फ़िगरेशन से डेटाबेस निर्देशिका ढूंढनी होगी, और उस जानकारी का उपयोग RESTORE कमांड बनाने के लिए करें? धन्यवाद।

(पोस्टग्रेएसक्यूएल के साथ तुलना करना, जहां pg_restore का उपयोग करते समय, आप पहले से बनाए गए गंतव्य डेटाबेस को निर्दिष्ट करते हैं; और जब आप इसे बना रहे थे तो आपके पास विकल्प था - अनिवार्य नहीं - एक गैर-डिफ़ॉल्ट टेबलस्पेस निर्दिष्ट करने के लिए, लेकिन यदि आपने नहीं किया टी, आप बस परवाह नहीं करते कि फाइलें भौतिक रूप से संग्रहीत हैं।)

उत्तर

0

यदि आप प्रबंधन स्टूडियो के नए डेटाबेस विकल्प का उपयोग करना चाहते हैं, तो यह कुछ मान डिफ़ॉल्ट करता है। लेकिन डेटा डाटाबेस के लिए टी-एसक्यूएल अभी भी पथ की आवश्यकता है। आप इसे प्रबंधन स्टूडियो पर जाकर देख सकते हैं, नया डेटाबेस चुनें, नया नाम दर्ज करें, और स्क्रिप्ट बटन पर क्लिक करें। यह बटन आपको टी-एसक्यूएल प्रदान करेगा जो SQL सर्वर चलाएगा। यह प्रक्रिया वास्तव में नहीं चलती है, इसलिए आप नए डेटाबेस विज़ार्ड से रद्द कर सकते हैं।

जब आप पुनर्स्थापित करते हैं तो एक समान बटन भी होता है। इसलिए यदि आपके पास पहले से ही सभी जानकारी है और केवल टी-एसक्यूएल की आवश्यकता है, तो पुनर्स्थापना करने के लिए प्रबंधन स्टूडियो के माध्यम से जाएं, लेकिन प्रक्रिया को चलाने के लिए ठीक क्लिक करने के बजाय, स्क्रिप्ट बटन पर क्लिक करें जो आपको डिफ़ॉल्ट रूप से टी-एसक्यूएल उत्पन्न करेगा मान।

उम्मीद है कि इससे मदद मिलती है।

2

आप रजिस्टर पढ़ने के लिए, की तरह

DECLARE @Result NVARCHAR(4000) 
EXECUTE [master].[dbo].xp_instance_regread 
N'HKEY_LOCAL_MACHINE', 
N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory', 
@Result OUTPUT, 
'NO_OUTPUT' 
SELECT @Result 
+0

स्टैक ओवरव्लो में आपका स्वागत है: यदि आप कोड, एक्सएमएल या डेटा नमूने पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड नमूने" बटन ('{}') पर क्लिक करें प्रारूप और वाक्यविन्यास इसे हाइलाइट करें! –

1

मैंने कुछ समय पहले जो आप के लिए यह करता है एक समारोह लिखा है। यह SQL सर्वर के सभी संस्करणों का समर्थन करता है जिसमें डिफ़ॉल्ट उदाहरण और नामित इंस्टेंस के साथ इंस्टॉलेशन शामिल हैं। See here for the code and an example

पुनर्स्थापित करने के लिए आप नीचे दिखाए गए फ़ंक्शन को कॉल करेंगे।

declare @sql nvarchar(2000), 
     @data varchar(260), 
     @log varchar(260); 

select @data = dbo.fn_get_default_path(0), 
     @log = dbo.fn_get_default_path(1) 

SELECT @sql= 'RESTORE DATABASE DefaultLocationDB 
FROM DISK = N''c:\backups\DemoDB.bak'' WITH FILE = 1, 
MOVE N''demo_data_device'' TO N''' + @data + '\DemoDb.ldf'', 
MOVE N''demo_log_device'' TO N''' + @log + '\DemoDb.ldf'', 
NOUNLOAD, REPLACE' 

exec (@sql) 
+0

कोड का लिंक समाप्त हो गया है – gvee

+0

मैंने लिंक तय किया है। –

4

डेटाबेस आदेश डिफ़ॉल्ट पथ के साथ डेटाबेस पैदा करेगा बनाएं, ताकि आप तो एक डेटाबेस बना सकते हैं की जगह वाक्य रचना (sqlcmd मोड) का उपयोग करते हुए इस पर बहाल:

:setvar DatabaseName MyDatabase 
declare @fileName varchar(255) 
set @fileName = 'c:\backup\mybackup.bak' 

if db_id('$(DatabaseName)') is null 
      CREATE DATABASE [$(DatabaseName)] 

RESTORE DATABASE [$(DatabaseName)] 
FROM DISK = @fileName 
WITH REPLACE 
+2

तो मैं इसे sqlcmd या SQL क्वेरी में प्राप्त करने का प्रयास करता हूं: 'फ़ाइल' MyDBnameHere 'को' M: \ myOLDserverPath \ MyDBnameHere.mdf 'पर पुनर्स्थापित नहीं किया जा सकता है। फ़ाइल के लिए एक वैध स्थान की पहचान करने के लिए MOVE के साथ उपयोग करें। – Tilo

+0

यह मेरे लिए काम नहीं करता है। –

5

भविष्य Googlers के लिए; एसक्यूएल सर्वर से 2012 बाद आप का उपयोग कर सकते हैं:

SELECT ServerProperty(N'InstanceDefaultDataPath') AS default_file 
    , ServerProperty(N'InstanceDefaultLogPath') AS default_log 
; 

यह फ़ोल्डर पथ कि सर्वर गुण> डाटाबेस सेटिंग्स> डेटाबेस डिफ़ॉल्ट स्थान

Server Properties > Database Settings

0

जैसा कि बताया जा के तहत दिखाई पढ़ता है, CREATE DATABASE डिफ़ॉल्ट स्थान पर फ़ाइलों को बनाता है। तो फिर तुम उन फ़ाइलों के रास्ते खोजने के लिए और RESTORE भाग में उन का उपयोग कर सकते

-- Database will be created in default location 
CREATE DATABASE [MyRestoredDatabase] 

DECLARE @mdfFile VARCHAR(MAX) 
DECLARE @ldfFile VARCHAR(MAX) 

SELECT @mdfFile = physical_name 
FROM sys.master_files 
WHERE database_id = DB_ID('MyRestoredDatabase') 
AND file_id = 1 

SELECT @ldfFile = physical_name 
FROM sys.master_files 
WHERE database_id = DB_ID('MyRestoredDatabase') 
AND file_id = 2 

-- Overwrite known files of the new database from restore 
RESTORE DATABASE [MyRestoredDatabase] 
FROM DISK='C:\Path\To\OriginalDatabase.bak' 
WITH REPLACE, 
    MOVE 'OriginalDatabase' TO @mdfFile, 
    MOVE 'OriginalDatabase_Log' TO @ldfFile 

आप तार्किक नाम पता लगाना है, तो निम्न एसक्यूएल उपयोग की जरूरत है

RESTORE FILELISTONLY 
FROM DISK='C:\Path\To\MyRestoredDatabase.bak' 

पूरी तरह से स्वचालित स्क्रिप्ट पाया जा सकता है here

1

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

DECLARE @Source nvarchar(max) = 'C:\backup.bak' 
DECLARE @RestoreDestination nvarchar(max) = 'NewDatabaseName' 

--https://stackoverflow.com/a/27893494/5734516 
--https://stackoverflow.com/a/4018782/5734516 
DECLARE @fileListTable TABLE (
    [LogicalName]   NVARCHAR(128), 
    [PhysicalName]   NVARCHAR(260), 
    [Type]     CHAR(1), 
    [FileGroupName]   NVARCHAR(128), 
    [Size]     NUMERIC(20,0), 
    [MaxSize]    NUMERIC(20,0), 
    [FileID]    BIGINT, 
    [CreateLSN]    NUMERIC(25,0), 
    [DropLSN]    NUMERIC(25,0), 
    [UniqueID]    UNIQUEIDENTIFIER, 
    [ReadOnlyLSN]   NUMERIC(25,0), 
    [ReadWriteLSN]   NUMERIC(25,0), 
    [BackupSizeInBytes]  BIGINT, 
    [SourceBlockSize]  INT, 
    [FileGroupID]   INT, 
    [LogGroupGUID]   UNIQUEIDENTIFIER, 
    [DifferentialBaseLSN] NUMERIC(25,0), 
    [DifferentialBaseGUID] UNIQUEIDENTIFIER, 
    [IsReadOnly]   BIT, 
    [IsPresent]    BIT, 
    [TDEThumbprint]   VARBINARY(32) -- remove this column if using SQL 2005 
) 

DECLARE @QueryCommand nvarchar(max) = 
'RESTORE FILELISTONLY FROM DISK = N''' + REPLACE(@Source, '''', '''''') + ''' WITH NOUNLOAD' 

INSERT INTO @fileListTable 
EXEC(@QueryCommand) 


--https://stackoverflow.com/a/2014673/5734516 
DECLARE @filepath NVARCHAR(260) 
EXEC master.dbo.xp_instance_regread 
     N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', 
     N'DefaultData', 
     @filepath output, 'no_output' 


DECLARE @Command nvarchar(max) 
SET @Command = 'RESTORE DATABASE ' + QUOTENAME(@RestoreDestination) + ' ' 
       + ' FROM DISK=N''' + REPLACE(@Source, '''', '''''') + ''' ' 
       + 'WITH FILE=1 ' 
SELECT 
    @Command = @Command + ',MOVE N''' + REPLACE(LogicalName, '''', '''''') + '''' 
    + ' TO N''' 
     + REPLACE(@filepath + '\' + @RestoreDestination + case when FileID = 1 then '.mdf' when Type = 'L' then '_' + CAST(FileID as varchar(max)) + '.ldf' else '_' + CAST(FileID as varchar(max)) + '.ndf' end, '''', '''''') 
    + '''' 
FROM @fileListTable 

SELECT @Command 
EXEC(@Command) 

नोट: मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन हालांकि यह आगे बढ़ने वाले किसी के लिए उपयोगी हो सकती है।

संबंधित मुद्दे