मैं SQL Server 2008 एक्सप्रेस में उसी सर्वर पर SQL सर्वर डेटाबेस को कैसे क्लोन कर सकता हूं?


271

मेरे पास एक MS SQL Server 2008 एक्सप्रेस सिस्टम है जिसमें एक डेटाबेस है जिसे मैं 'कॉपी और रीनेम' (परीक्षण प्रयोजनों के लिए) करना चाहता हूं लेकिन मैं इसे प्राप्त करने के लिए एक सरल तरीके से अनजान हूं।

मुझे लगता है कि SQL सर्वर के R2 संस्करण में एक कॉपी डेटाबेस विज़ार्ड है, लेकिन दुख की बात है कि मैं अपग्रेड नहीं कर सकता।

प्रश्न में डेटाबेस एक टमटम के आसपास है। मैंने उस डेटाबेस का बैकअप पुनर्स्थापित करने का प्रयास किया जिसे मैं एक नए डेटाबेस में कॉपी करना चाहता हूं, लेकिन बिना किसी भाग्य के।


2
बैकअप को पुनर्स्थापित करना चाहिए। क्या आप इस बारे में अधिक विवरण प्रदान कर सकते हैं कि कैसे विफल रहे?
एड हार्पर

7
मुझे एहसास हुआ कि मैंने बैकअप से पुनर्स्थापित करते समय एक गलती की थी। मैंने पहले एक नया खाली डीबी बनाया और वहां से बैकअप को बहाल करने का प्रयास किया। मुझे जो करना चाहिए था, वह रीस्टोर डायलॉग लाया और पहले बनाने के बजाय नए डेटाबेस का नाम टाइप किया। ऐसा करने से डेटाबेस अच्छी तरह से क्लोन हो गया!
सर्जियो

जवाबों:


372
  1. Microsoft SQL प्रबंधन स्टूडियो स्थापित करें, जिसे आप Microsoft की वेबसाइट से मुफ्त में डाउनलोड कर सकते हैं:

    संस्करण 2008

    Microsoft SQL प्रबंधन स्टूडियो 2008 का हिस्सा है उन्नत सेवाओं के साथ SQL Server 2008 एक्सप्रेस

    संस्करण 2012

    डाउनलोड बटन पर क्लिक करें और जांचेंENU\x64\SQLManagementStudio_x64_ENU.exe

    संस्करण 2014

    डाउनलोड बटन पर क्लिक करें और MgmtStudio की जाँच करें64BIT\SQLManagementStudio_x64_ENU.exe

  2. Microsoft SQL प्रबंधन स्टूडियो खोलें

  3. बैकअप मूल डेटाबेस से .BAK फ़ाइल (db -> कार्य -> ​​बैकअप)।
  4. नए नाम (क्लोन) के साथ खाली डेटाबेस बनाएं। नीचे टिप्पणी नोट करें क्योंकि यह वैकल्पिक है।
  5. डेटाबेस को क्लोन करें और पुनर्स्थापना संवाद खोलें (छवि देखें) संवाद बहाल करें
  6. डिवाइस का चयन करें और चरण 3 से बैकअप फ़ाइल जोड़ें। बैकअप फ़ाइल जोड़ें
  7. डेटाबेस का परीक्षण करने के लिए गंतव्य बदलें गंतव्य बदलें
  8. डेटाबेस फ़ाइलों का स्थान बदलें, यह मूल से अलग होना चाहिए। आप सीधे टेक्स्ट बॉक्स में टाइप कर सकते हैं, बस पोस्टफिक्स जोड़ सकते हैं। (नोट: आदेश महत्वपूर्ण है। चेकबॉक्स का चयन करें, फिर फ़ाइल नाम बदलें।) स्थान बदलें
  9. REPLACE और KEEP_REPLICATION के साथ जांचें जगह के साथ

84
1. एक खाली डेटाबेस न बनाएं और उस पर .bak फ़ाइल को पुनर्स्थापित करें। 2. SQL सर्वर प्रबंधन स्टूडियो की "डेटाबेस" शाखा पर राइट क्लिक करके पहुंच योग्य 'पुनर्स्थापना डेटाबेस' विकल्प का उपयोग करें और पुनर्स्थापित करने के लिए स्रोत प्रदान करते समय डेटाबेस का नाम प्रदान करें। रेफरी: stackoverflow.com/questions/10204480/…
taynguyen

1
Microsoft SQL प्रबंधन स्टूडियो - यह मुफ़्त है
टॉमस क्यूब्स

4
काम नहीं करता है - "अनन्य पहुँच प्राप्त नहीं की जा सकती क्योंकि डेटाबेस उपयोग में है"।
इमानुएल सिरियाची

5
मुझे "पुनर्स्थापित करने से पहले टेल-लॉग बैकअप लेना" भी अनचेक करना पड़ा। यह डिफ़ॉल्ट रूप से जांचा गया था और परिणामस्वरूप "अनन्य एक्सेस प्राप्त नहीं किया जा सका क्योंकि डेटाबेस उपयोग में है" त्रुटि।
शलजम

2
मेरा मूल डेटाबेस "पुनर्स्थापना" पर अटक गया
Divi perdomo

113

डेटाबेस को क्लोन करने के लिए राइट-क्लिक करें Tasks, क्लिक करें , क्लिक करें Copy Database...। विज़ार्ड का पालन करें और आप कर रहे हैं।


मुझे लगता है कि यह केवल SQL सर्वर के R2 रिलीज में दुख की बात है :-(
सर्जियो

7
यहां बताया गया है कि यह एक्सप्रेस में कैसे काम करता है: stackoverflow.com/questions/4269450/…
Th 00 mÄ s

2
यदि आप अपने डेटाबेस में वस्तुओं को एन्क्रिप्ट करते हैं तो यह काम नहीं करता है।
cjbarth

1
मैं कहूंगा, कि मुख्य बिंदु वास्तव में यह कहाँ करना है? आपने जो वर्णन किया है वह बहुत सहज है। मैंने ठीक कोशिश की है कि पहले कुछ टूल (0xDBE, Visual Studio SQL Server Object Explorer) में था, लेकिन वहां ऐसी सुविधा नहीं मिली।
डेविड फेरेंस्की रोगोजान

3
संभव नहीं! कार्य -> प्रतिलिपि डेटाबेस के लिए कोई मेनू आइटम
raiserle

95

आप डेटाबेस को अलग करने की कोशिश कर सकते हैं, कमांड प्रॉम्प्ट पर नए नामों की फाइल कॉपी कर सकते हैं, फिर दोनों डीबी संलग्न कर सकते हैं।

SQL में:

USE master;
GO 
EXEC sp_detach_db
    @dbname = N'OriginalDB';
GO

कमांड प्रॉम्प्ट पर (मैंने इस उदाहरण के लिए फ़ाइल पथ को सरल बनाया है):

copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf

SQL में फिर से:

USE master;
GO
CREATE DATABASE OriginalDB
    ON (FILENAME = 'C:\OriginalDB.mdf'),
       (FILENAME = 'C:\OriginalDB.ldf')
    FOR ATTACH;
GO
CREATE DATABASE NewDB
    ON (FILENAME = 'C:\NewDB.mdf'),
       (FILENAME = 'C:\NewDB.ldf')
    FOR ATTACH;
GO

1
उत्तम! यह अनूठा समाधान है जो मेरे लिए काम करता है! आपका बहुत बहुत धन्यवाद!
थियागोह

9
select * from OriginalDB.sys.sysfilesडीबी की फ़ाइलों का स्थान खोजने के लिए।
JohnLBevan

हाँ, मुझे भी यह समाधान सबसे अधिक पसंद है, क्योंकि इसके लिए किसी विशेष उपकरण की आवश्यकता नहीं है। लेकिन मैं एक NewDB बनाने में सक्षम नहीं था, यह फ़ाइल Permission deniedपर कहता है .mdf। मुझे अब इसकी आवश्यकता नहीं है, मुझे बस मूल DB के बैकअप की आवश्यकता है, इसलिए मैं मूल DB को बाद में इसके साथ अधिलेखित कर सकता हूं, मैं बस उत्सुक हूं कि मुझे ऐसी त्रुटि क्यों मिल रही है।
डेविड फेरेंस्की रोगोजान

2
आपको मूल डेटाबेस को अलग करने की ज़रूरत नहीं है यदि आप sql सेवा को रोक सकते हैं, mdf और ldf फ़ाइल को कॉपी कर सकते हैं, अपने नए डेटाबेस के लिए उनका नाम बदल सकते हैं, फिर से sql सेवा शुरू कर सकते हैं और बस मास्टर के तहत अंतिम क्रिएट डेटाबेस कमांड चला सकते हैं: USE master ; GOATATAT DATABASE NewDB ON (FILENAME = 'C: \ NewDB.mdf'), (FILENAME = 'C: \ NewDB.ldf') ATTACH के लिए; गो
दानपॉप

1
सबसे तेज़ रास्ते के लिए +1। @JohnLBevan उत्कृष्ट टिप्पणी के अलावा, आप भी उपयोग कर सकते हैंexec sp_helpdb @dbname='TEMPDB';
जीन

30

यह पता चला है कि मैंने एक बैकअप से गलत तरीके से पुनर्स्थापित करने का प्रयास किया था।

प्रारंभ में मैंने एक नया डेटाबेस बनाया और फिर यहां बैकअप को पुनर्स्थापित करने का प्रयास किया। मुझे क्या करना चाहिए था, और अंत में क्या काम किया था, बहाल करने वाले संवाद को लाने और गंतव्य क्षेत्र में नए डेटाबेस का नाम टाइप करना था।

तो, संक्षेप में, एक बैकअप से बहाल करना चाल है।

सभी प्रतिक्रिया और सुझावों के लिए धन्यवाद दोस्तों


जब मैं ऐसा करता हूं, तो संवाद मुझे बताता है कि फाइलें उसी स्थान पर हैं जिस डेटाबेस से मैं मूल रूप से बैकअप लेता हूं। इसलिए मुझे लगता है कि फ़ाइलें अधिलेखित हो जाएगा, डर है कि बहाल करने की हिम्मत नहीं है।
नील्स ब्रिंच

2
नील, फ़ाइलें समान हैं, डिफ़ॉल्ट रूप से, आपके द्वारा लिए गए स्नैपशॉट में। आप नए नाम वाले डेटाबेस के लिए नई फाइलें बनाने के लिए उनमें से नाम बदल सकते हैं।
कॉलिन डेब्रिट्ज़

PS: इस विधि के लिए SQL एजेंट सेवा की आवश्यकता है, सुनिश्चित करें कि यह db कॉपी ऑपरेशन शुरू करने से पहले चल रहा है।
डीवीएमएन

आपने अब इस उत्तर के साथ तीन बार मेरी मदद की है। मैं इसे बनाने के बजाय इसे टाइप करने के बारे में भूलता रहता हूं। + बीयर
कुला

यह और .mdf और .log फ़ाइलों का नाम बदलकर 'फ़ाइलें' विंडो में मेरे लिए काम किया।
वूलन

17

यह मेरे द्वारा इस्तेमाल की जाने वाली स्क्रिप्ट है। थोड़ा मुश्किल है लेकिन यह काम करता है। SQL सर्वर 2012 पर परीक्षण किया गया।

DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);

SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\tmp\' + sourceDb + '.bak' --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'

BACKUP DATABASE @sourceDb TO DISK = @backupPath

RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDb     TO @destMdf,
   MOVE @sourceDb_log TO @destLdf

2
मेरे वातावरण में, फ़ाइल नाम db नाम से मेल नहीं खाते ( एक और पुनर्स्थापना से आते हैं ) इसलिए मुझे जरूरत थी SET @sourceDb_log = (SELECT files.name FROM sys.databases dbs INNER JOIN sys.master_files files ON dbs.database_id=files.database_id WHERE dbs.name=@sourceDb AND files.type=1)और एक समान क्वेरी (प्रतिस्थापन files.type=0) के साथ @sourceDb_data के लिए एक अलग चर । HTH!
डैन केस्ले

11

यहां वर्णित किसी भी समाधान ने मेरे लिए काम नहीं किया - मैं SQL सर्वर प्रबंधन स्टूडियो 2014 का उपयोग कर रहा हूं।

इसके बजाय मुझे "विकल्प" स्क्रीन में "चेकबॉक्स को पुनर्स्थापित करने से पहले" टेल-लॉग बैकअप को अनचेक करना था: मेरे संस्करण में यह डिफ़ॉल्ट रूप से जांचा जाता है और पुनर्स्थापना ऑपरेशन को पूरा करने से रोकता है। इसे अनचेक करने के बाद, पुनर्स्थापना कार्रवाई समस्याओं के बिना आगे बढ़ी।

यहां छवि विवरण दर्ज करें


2
इस जवाब ने मेरा दिन बचा लिया।
दिलन जयतिलके

2
मेरा दिन भी
बच गया

1
SQL सर्वर 2017 के साथ ऐसा नहीं करने पर, मूल डेटाबेस "रिस्टोरिंग ..." में बना रहा। आपके समाधान ने चाल चली - धन्यवाद!
मू .88

9

MS SQL सर्वर 2012 का उपयोग करते हुए, आपको 3 मूल चरण करने होंगे:

  1. सबसे पहले, .sqlस्रोत DB की केवल संरचना वाली फाइल जनरेट करें

    • स्रोत DB पर राइट क्लिक करें और फिर कार्य फिर जनरेट लिपियों
    • विज़ार्ड का पालन करें और .sqlफ़ाइल को स्थानीय रूप से सहेजें
  2. दूसरा, स्रोत डीबी को गंतव्य एक के साथ बदलें .sql फ़ाइल

    • गंतव्य फ़ाइल पर राइट क्लिक करें, नया क्वेरी चुनें और Ctrl-H( संपादित करें - खोजें और बदलें - त्वरित बदलें )
  3. अंत में, डेटा के साथ आबाद करें

    • गंतव्य DB पर राइट क्लिक करें, फिर कार्य और आयात डेटा चुनें
    • डेटा स्रोत ड्रॉप डाउन सेट " SQL सर्वर के लिए .net फ्रेमवर्क डेटा प्रदाता " + डेटा स्ट्रिंग के तहत कनेक्शन स्ट्रिंग पाठ क्षेत्र सेट करें:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • गंतव्य के साथ भी ऐसा ही करें
    • उन सभी की जांच करने के लिए "स्रोत: ..." के अलावा आप जिस तालिका को स्थानांतरित या चेक करना चाहते हैं, उस तालिका को देखें

आप कर चुके हैं।


वैसे, मुझे लगता है कि इम्पोर्ट डेटा टेबल बना सकता है अगर डेस्टिनेशन टेबल में मौजूद न हो .. सिंपल सॉल्यूशन +1
खुर्रम इशाक

6

SQL Server 2008 R2 में डेटाबेस को फ़ाइल के रूप में बैक-अप फ़ोल्डर में। फिर "डेटाबेस" फ़ोल्डर में दिखाई देने वाले पुनर्स्थापना विकल्प को चुना। विज़ार्ड में वह नया नाम दर्ज करें जिसे आप लक्ष्य डेटाबेस में चाहते हैं। और रिस्टोर फ्रॉम फाइल को चुनें और आपके द्वारा बनाई गई फाइल का उपयोग करें। मैंने jsut किया और यह बहुत तेज़ था (मेरा DB छोटा था, लेकिन फिर भी) पाब्लो।


4

यदि डेटाबेस बहुत बड़ा नहीं है, तो आप SQL सर्वर प्रबंधन स्टूडियो एक्सप्रेस में 'स्क्रिप्ट डेटाबेस' कमांड को देख सकते हैं, जो डेटाबेस आइटम में ही एक संदर्भ मेनू में हैं।

आप चुन सकते हैं कि स्क्रिप्ट को सभी क्या कहते हैं; आप निश्चित रूप से वस्तुओं और डेटा चाहते हैं। फिर आप पूरी स्क्रिप्ट को एक ही फाइल में सेव करेंगे। फिर आप डेटाबेस को फिर से बनाने के लिए उस फ़ाइल का उपयोग कर सकते हैं; बस सुनिश्चित करें कि USEशीर्ष पर स्थित कमांड उचित डेटाबेस पर सेट है।


1
धन्यवाद, डेटाबेस हालांकि काफी बड़ा है, (एक टमटम के चारों ओर) तो मुझे लगता है कि बुरी चीजें हो सकती हैं :-)
सर्जियो

2
सही; यह सबसे अच्छा तरीका नहीं है। इसके बजाय, आप नए डेटाबेस में केवल संरचना बनाने के लिए स्क्रिप्ट डेटाबेस का उपयोग कर सकते हैं, और फिर डेटा को स्थानांतरित करने के लिए आयात / निर्यात कर सकते हैं। बस सुनिश्चित करें कि आप पहले स्क्रिप्ट डेटाबेस करते हैं; यदि वे मौजूद नहीं हैं, तो आयात / निर्यात तालिकाओं का निर्माण करेगा, और आप इसे पसंद नहीं करेंगे।
एंड्रयू बार्बर

4

समाधान, इस टिप्पणी के आधार पर: https://stackoverflow.com/a/22409447/2399045 । बस सेटिंग्स सेट करें: DB नाम, अस्थायी फ़ोल्डर, डीबी फ़ाइलें फ़ोल्डर। और चलाने के बाद आपके पास "sourceDBName_yyyy-mm-dd" प्रारूप में नाम के साथ DB की प्रतिलिपि होगी।

-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'

--  Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'

SET @sourceDbFile = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 0)

SET @sourceDbFileLog = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 1)

BACKUP DATABASE @sourceDbName TO DISK = @backupPath

RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDbFile     TO @destMdf,
   MOVE @sourceDbFileLog  TO @destLdf

3

पटकथा जो उत्तर पर आधारित है ( फाइल को कॉपी करें, दोनों को संलग्न करें )।

  1. व्यवस्थापक खाते के रूप में प्रबंधन स्टूडियो चलाएँ।

यह आवश्यक नहीं है, लेकिन शायद निष्पादन पर त्रुटि से इनकार किया गया है।

  1. Xp_cmdshel निष्पादित करने के लिए SQL सर्वर कॉन्फ़िगर करें
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. स्क्रिप्ट चलाएँ, लेकिन पहले @dbNameऔर @copyDBNameचर में अपना db नाम लिखें ।
USE master;
GO 

DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'

-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
    INSERT INTO ##DBFileNames([FileName])
    SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')

-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')

EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')

-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')

-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE 
    @oldAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @dbName + ' ON ', 
    @newAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @copyDBName + ' ON '

DECLARE curs CURSOR FOR 
SELECT [filename] FROM ##DBFileNames
OPEN curs  
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0  
BEGIN
    SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
    SET @ext = RIGHT(@filename,4)
    SET @copyFileName = @path + @copyDBName + @ext

    SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
    PRINT @command
    EXEC(@command);

    SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
    SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'

    FETCH NEXT FROM curs INTO @filename
END
CLOSE curs 
DEALLOCATE curs

-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'

-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)

-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)

DROP TABLE ##DBFileNames

3

आप बस एक नया डेटाबेस बना सकते हैं और फिर कार्यों के लिए जा सकते हैं, डेटा आयात कर सकते हैं, और उस डेटाबेस से सभी डेटा आयात कर सकते हैं जिसे आप अभी बनाए गए डेटाबेस में डुप्लिकेट करना चाहते हैं।


2

दूसरा तरीका जो आयात / निर्यात विज़ार्ड का उपयोग करके ट्रिक करता है , पहले एक खाली डेटाबेस बनाएँ, फिर वह स्रोत चुनें जो स्रोत डेटाबेस के साथ आपका सर्वर है, और फिर गंतव्य में गंतव्य डेटाबेस के साथ एक ही सर्वर चुनें (रिक्त डेटाबेस का उपयोग करके) आपने पहले बनाया), फिर हिट खत्म

यह सभी तालिकाएँ बनाएगा और सभी डेटा को नए डेटाबेस में स्थानांतरित करेगा,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.